Renesas H8/300 GAS D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s page 1 1 ;Antonín Neumann A11B0439P 2 3 .h8300s 4 .equ syscall,0x1FF00 ; simulated IO area 5 .equ PUTS,0x0114 ; kod PUTS 6 .equ GETS,0x0113 ; kod GETS 7 8 ;*** PODPROGRAMY *** 9 ; --- NASOBENI START 10 nasobeni: 11 ;E2 - 1. operand 12 ;R2 - 2. operand 13 ;ER3 - 1. operand na 32 bitu 14 ;ER2 - 2. operand na 32 bitu 15 ;ER1 - ridici "promenna" cyklu 16 ;ER0 - vysledek 17 0000 7A010000 mov.l #1,ER1 ;zvednu hodnotu reg. ER1 o 1 aby cyklus probehl spravne 17 0001 18 0006 0DA3 mov.w E2,R3 ;presunu 1. operand aby byl na 32 bitu 19 0008 790A0000 mov.w #0,E2 ;nuluvi hornich 16bitu aby 2. operand byl na 32 bitu 20 000c 7A230000 cmp.l #0,ER3 ;zkontroluji jestli 1. operand neni 0, pokud ano rovnou skoncim 20 0000 21 0012 5470 rts 22 cyklus: 23 0014 7A110000 add.l #1,ER1 ;inkrementace ridici "promenne" 23 0001 24 001a 0AB0 add.l ER3,ER0 ;pricte hodnotu 1. citatele k vysledku 25 001c 1FA1 cmp.l ER2,ER1 ;test ukoncovaci podminky 26 001e 4300 bls cyklus ;opakovani cyklu 27 0020 5470 rts ;"return" 28 ; --- NASOBENI KONEC 29 30 31 ; --- NULOVANI REGISTRU START 32 vynuluj: 33 0022 01F06500 xor.l ER0,ER0 34 0026 01F06511 xor.l ER1,ER1 35 002a 01F06522 xor.l ER2,ER2 36 002e 01F06533 xor.l ER3,ER3 37 0032 01F06544 xor.l ER4,ER4 38 0036 01F06555 xor.l ER5,ER5 39 003a 01F06566 xor.l ER6,ER6 40 003e 5470 rts ;"return" 41 ; --- NULOVANI REGISTRU START 42 43 44 ; --- VSTUP Z ASCII DO HEXADECIMAL START (osetreni vstupu a prevod ASCII na HEX) 45 input: 46 0040 6C2B mov.b @ER2+,R3L ;vezme prvni ASCII znak z bufferu a presune do R3L 47 0042 AB30 cmp.b #0x30,R3L ;porovnani s hodnotou 0x30 = 0 48 0044 4D00 blt err ;pokud je mensi skoc na chybu => neni HEXA cislo 49 0046 AB46 cmp.b #0x46,R3L ;porovnani s hodnotou 0x46 = F 50 0048 4E00 bgt err ;pokud je vetsi skoc na chybu => neni HEXA cislo 51 004a 79330030 sub.w #0x30,R3 ;odecteni 0x30 = 0 52 004e AB09 cmp.b #0x9,R3L ;porovnani s hodnotou 0x9 = 9 53 0050 4E00 bgt between ;pokud je vesti 54 Renesas H8/300 GAS D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s page 2 55 shift: ;prevod z ASCII na HEX 56 0052 14BC or.b R3L,R4L ;"presun" poslednich 4 bitu z R3L do R4L 57 0054 682B mov.b @ER2,R3L ;presunu dalsi znak z pameti 58 0056 AB0A cmp.b #0x0A,R3L ;porovnam s 0x0A = LF = \n = konec radku 59 60 ;pokud je to nulovy znak (LF), tak uz jsem vse zpracoval a ulozim to do pameti 61 0058 4700 beq save_input 62 63 005a AE03 cmp.b #0x3,R6L ;porovnavam pomocny regist pro pocet znaku 64 005c 4700 beq err ;pokud je na vstupu vic jak 4 HEXA cisla skok na chybu 65 005e 1054 shll.w #2, R4 ;provedu bitovy posun o 4 pozice doleva(v HEXa posunu 66 0060 1054 shll.w #2, R4 ;cislo o 1 pozici) 67 0062 0A0E inc.b R6L ;inkrementace pomocneho registru pro pocet znaku 68 0064 4000 bra input ;skok na zacatek cyklu 69 70 between: ;zjisteni jestli vstup neni v rozmezi 0x3A - 0x40 v ASCII 71 0066 79330007 sub.w #0x7,R3 ;odectu 7 od registru aby se zjistilo rozmezi 72 006a AB0A cmp.b #0xA,R3L ;porovnam s 0xA 73 006c 4D00 blt err ;pokud je mensi skoc na chybu => neni HEXA cislo 74 006e AB0F cmp.b #0xF,R3L ;porovnam s 0xF 75 0070 4E00 bgt err ;pokud je vetsi skoc na chybu => neni HEXA cislo 76 0072 4000 bra shift ;skacu na na provedeni bitoveho posunu 77 78 save_input: ;zapis vysledneho 16b cisla do pameti 79 0074 69D4 mov.w R4,@ER5 ;presun cisla na adresu v pameti 80 0076 5470 rts ;"return" 81 82 err: ;vypis chybove hlasky pro spatny vstup 83 0078 79000114 mov.w #PUTS,R0 ;presun adresy konzole pro vypis do R0 84 007c 7A010000 mov.l #par4,ER1 ;presun adresy par4 do ER1 84 0000 85 0082 5E000000 jsr @syscall ;volani podprogramu pro konzoli 86 0086 5A000000 jmp _start ;skok na zacatek programu pro nove zadani vstupu 87 88 ; --- VSTUP Z ASCII DO HEXADECIMAL KONEC 89 90 91 ; --- VYSTUP DO ASCII START 92 output: 93 008a AC08 cmp.b #8, R4L ;porovnani poctu cifer(iteraci) 94 008c 4700 beq konec ;pokud je to 8 iterace tak skoc na konec 95 008e 0FA3 mov.l ER2,ER3 ;presun obsah registru ER2 do ER3 96 0090 1172 shlr.l #2,ER2 ;provedu bitovy posun o 4 pozice doprava (v HEXa posunu 97 0092 1172 shlr.l #2,ER2 ;cislo o 1 pozici) 98 0094 0A0C inc.b R4L ;inkrementuji ridici "promenne" 99 0096 7A630000 and.l #0xF, ER3 ;"vytazeni" poslednich 4 bitu 99 000F 100 009c 7A230000 cmp.l #0x9, ER3 ;porovnani hodnoty s 0x9 (9) 100 0009 101 00a2 4E00 bgt pricti ;pokud je vetsi nez 0x9 skoc na pricteni 102 00a4 7A130000 add.l #0x30,ER3 ;jinak pricti 0x30 (0) a pokracuj 102 0030 103 104 write: ;zapsani prevedene hodnoty do pameti 105 00aa 68EB mov.b R3L, @ER6 ;presunuti ASCII hodnoty z registru do pameti 106 00ac 1B76 dec.l #1, ER6 ;snizeni adresy pameti o 1 107 00ae 4000 bra output ;skok na zacatek cyklu Renesas H8/300 GAS D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s page 3 108 109 pricti: 110 00b0 79130037 add.w #0x37,R3 ;pricteni 0x37 pro prevedeni na A-F 111 00b4 4000 bra write ;skok na zapis do pameti 112 113 konec: 114 00b6 5470 rts ;"return" 115 ; --- VYSTUP DO ASCII KONEC 116 117 118 ; --- ZAPIS KONCE RADKY 0x0A = LS = \n DO VYSTUPU START 119 zapis_LF: 120 00b8 7A160000 add.l #8,ER6 120 0008 121 00be FA0A mov.b #0x0A,R2L 122 00c0 68EA mov.b R2L,@ER6 123 00c2 1B76 dec.l #1,ER6 124 00c4 5470 rts ;"return" 125 ; --- ZAPIS KONCE RADKY 0x0A = LS = \n DO VYSTUPU KONEC 126 127 128 ;*** DATOVA CAST *** 129 .data 130 131 0000 312E206F operand1_txt: .asciz "1. operand:\n" ;text pro zadani 1. operandu 131 70657261 131 6E643A0A 131 00 132 000d 322E206F operand2_txt: .asciz "2. operand:\n" ;text pro zadani 2. operandu 132 70657261 132 6E643A0A 132 00 133 001a 536F7563 soucin_txt: .asciz "Soucin:\n" ;text pro vypsani vysledku 133 696E3A0A 133 00 134 0023 4E454E49 error: .asciz "NENI HEXA CISLO!\n" 134 20484558 134 41204349 134 534C4F21 134 0A00 135 0035 00000000 vystup_txt: .space 9 ;prostor pro vypsani hodnoty vysledku 135 00000000 135 00 136 003e 00000000 buffer: .space 10 ;vstupni buffer pro konzoli 136 00000000 136 0000 137 138 0048 00000000 par1: .long operand1_txt ;parametricky blok pro 1. operandu 139 004c 00000000 par2: .long buffer ;parametricky blok pro buffer 140 0050 00000000 par3: .long operand2_txt ;parametricky blok pro 2. operandu 141 0054 00000000 par4: .long error ;parametricky blok pro chybu 142 0058 00000000 par5: .long soucin_txt ;parametricky blok pro vysledek 143 005c 00000000 par6: .long vystup_txt ;parametricky blok pro vystup 144 145 .align 4 ;zarovnani adresy 146 0060 0000 citatel1: .space 2 ;prostor pro ulozeni hodnoty 1. operandu 147 0062 0000 citatel2: .space 2 ;prostor pro ulozeni hodnoty 2. operandu Renesas H8/300 GAS D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s page 4 148 0064 00000000 vysledek: .space 4 ;prostor pro ulozeni hodnoty vysledku 149 150 0068 00000000 .space 64 ;prostor pro zasobnik 150 00000000 150 00000000 150 00000000 150 00000000 151 stack: ;delarace zasobniku 152 153 154 ;*** KODOVA CAST *** 155 00a8 00000000 .text 155 00000000 156 .global _start 157 _start: 158 00c6 7A070000 mov.l #stack, ER7 ;inicializace zasobniku 158 0000 159 00cc 5E000000 jsr @vynuluj ;volani podprogramu pro nulovani registru 160 161 00d0 79000114 mov.w #PUTS,R0 ;presun adresy konzole pro vypis do R0 162 00d4 7A010000 mov.l #par1,ER1 ;presun adresy par1 do ER1 (1. operand) 162 0000 163 00da 5E000000 jsr @syscall ;volani podprogramu pro konzoli 164 165 00de 79000113 mov.w #GETS,R0 ;presun adresy konzole pro nacteni do R0 166 00e2 7A010000 mov.l #par2,ER1 ;presun adresy par2 do ER1 (buffer) 166 0000 167 00e8 5E000000 jsr @syscall ;volani podprogramu pro konzoli 168 169 00ec 7A020000 mov.l #buffer, ER2 ;presun adresy bufferu do ER2 169 0000 170 00f2 7A050000 mov.l #citatel1, ER5 ;presun adresy 1. operandu do ER5 170 0000 171 00f8 5E000000 jsr @input ;volani podprogramu pro overeni a prevod vstupu z ASCII 172 173 00fc 5E000000 jsr @vynuluj ;volani podprogramu pro nulovani registru 174 175 0100 79000114 mov.w #PUTS,R0 ;presun adresy konzole pro vypis do R0 176 0104 7A010000 mov.l #par3,ER1 ;presun adresy par1 do ER1 (2. operand) 176 0000 177 010a 5E000000 jsr @syscall ;volani podprogramu pro konzoli 178 179 010e 79000113 mov.w #GETS,R0 ;presun adresy konzole pro nacteni do R0 180 0112 7A010000 mov.l #par2,ER1 ;presun adresy par2 do ER1 (buffer) 180 0000 181 0118 5E000000 jsr @syscall ;volani podprogramu pro konzoli 182 183 011c 7A020000 mov.l #buffer, ER2 ;presun adresy bufferu do ER2 183 0000 184 0122 7A050000 mov.l #citatel2, ER5 ;presun adresy 2. operandu do ER5 184 0000 185 0128 5E000000 jsr @input ;volani podprogramu pro overeni a prevod vstupu z ASCII 186 187 012c 5E000000 jsr @vynuluj ;volani podprogramu pro nulovani registru 188 189 0130 7A040000 mov.l #citatel1, ER4 ;presun adresy 1. operand do ER4 189 0000 Renesas H8/300 GAS D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s page 5 190 0136 7A050000 mov.l #citatel2, ER5 ;presun adresy 2. operand do ER5 190 0000 191 013c 694A mov.w @ER4, E2 ;presun 1. operandu do E2 192 013e 6952 mov.w @ER5, R2 ;presun 2. operandu do R2 193 0140 5E000000 jsr @nasobeni 194 195 196 0144 7A050000 mov.l #vysledek, ER5 ;presun adresy vysledku do ER4 196 0000 197 014a 010069D0 mov.l ER0, @ER5 ;presun vysledku do pameti 198 199 014e 5E000000 jsr @vynuluj ;volani podprogramu pro nulovani 200 201 0152 7A050000 mov.l #vysledek, ER5 ;presun adresy vysledku do ER5 201 0000 202 0158 7A060000 mov.l #vystup_txt, ER6 ;presun adresy vystupu do ER6 202 0000 203 015e 5E000000 jsr @zapis_LF ;volani podprogramu pro zapis 0x0A (\n) 204 ;na posledni pozici | navratova adresa 0x054E | 205 206 0162 01006952 mov.l @ER5,ER2 ;presun vysledku z pameti do ER2 207 0166 5E000000 jsr @output ;volani podprogramu pro prevod vystupu na ASCII 208 ;| navratova adresa 0x0554 | 209 210 016a 79000114 mov.w #PUTS,R0 ;presun adresy konzole pro vypis do R0 211 016e 7A010000 mov.l #par5,ER1 ;presun adresy par5 do ER1, vypise "Soucin:" 211 0000 212 0174 5E000000 jsr @syscall ;volani podprogramu pro konzoli 213 214 0178 7A010000 mov.l #par6,ER1 ;presun adresy par6 do ER1 (vystupni text) 214 0000 215 017e 5E000000 jsr @syscall ;volani podprogramu pro konzoli 216 217 end: 218 ;bra end ;konec programu(zacykleni na miste) 219 0182 5A000000 jmp _start ;zacykleni pro neustaly beh programu 220 221 .end Renesas H8/300 GAS D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s page 6 DEFINED SYMBOLS D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:4 *ABS*:0001ff00 syscall D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:5 *ABS*:00000114 PUTS D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:6 *ABS*:00000113 GETS D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:10 .text:00000000 nasobeni D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:17 .text:00000000 .L0 D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:22 .text:00000014 cyklus D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:32 .text:00000022 vynuluj D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:45 .text:00000040 input D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:82 .text:00000078 err D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:70 .text:00000066 between D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:55 .text:00000052 shift D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:78 .text:00000074 save_input D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:141 .data:00000054 par4 D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:157 .text:000000c6 _start D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:92 .text:0000008a output D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:113 .text:000000b6 konec D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:109 .text:000000b0 pricti D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:104 .text:000000aa write D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:119 .text:000000b8 zapis_LF D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:131 .data:00000000 operand1_txt D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:132 .data:0000000d operand2_txt D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:133 .data:0000001a soucin_txt D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:134 .data:00000023 error D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:135 .data:00000035 vystup_txt D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:136 .data:0000003e buffer D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:138 .data:00000048 par1 D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:139 .data:0000004c par2 D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:140 .data:00000050 par3 D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:142 .data:00000058 par5 D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:143 .data:0000005c par6 D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:146 .data:00000060 citatel1 D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:147 .data:00000062 citatel2 D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:148 .data:00000064 vysledek D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:151 .data:000000a8 stack D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:217 .text:00000182 end .text:00000000 .L0 D:\zèu\KIV.POT\semestralka\Neumann_A11B0439P\Simulated_IO\main.s:221 .text:00000186 .L0 NO UNDEFINED SYMBOLS