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