Renesas H8/300 GAS D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s page 1 1 2 .h8300s 3 .equ syscall,0x1FF00 ; simulated IO area 4 .equ PUTS,0x0114 ; kod PUTS 5 .equ GETS,0x0113 ; kod GETS 6 7 ;=========================== podprogramy ============================== 8 9 ;------------------------- podprogram deleni -------------------------- 10 11 deleni: 12 0000 1DA2 cmp.w E2, R2 ;porovnani delenec delitel 13 0002 4200 bhi deleni_konec ;pokud je delitel > delenec, skoc na konec_deleni 14 0004 192A sub.w R2, E2 ;odecti delitele od delence 15 0006 0B53 inc.w #1,R3 ;pricti k vysledku 1 16 0008 4000 bra deleni ;pokracuj v cyklu deleni 17 18 deleni_konec: 19 000a 0DAB mov.w E2, E3 ;presunuti zbytku do registu pro "zbytek" 20 000c 5470 rts ;vyskoceni z podprogramu 21 22 ;--------------------- konec podprogramu deleni ------------------------ 23 nasobeni: 24 ;MOV.W @A,E2 25 ;MOV.W @B,R2 26 ;MOV.W E2,R3 ; hodnotu A presune do vysledku 27 000e 790B0001 MOV.W #1,E3 28 29 for: 30 0012 791B0001 ADD.W #1,E3 ; inkrementace registu pro vyskakovaci podmink 31 0016 09A3 ADD.W E2,R3 ; pricte hodnotu A k vysledku 32 0018 1D2B CMP.W R2,E3 ; testovani registru pro ukonceni cyklu 33 001a 4300 BLS for ; skok na navesti 34 001c 5470 rts 35 36 37 38 ;------------------- podprogram nulovani registru ---------------------- 39 40 nulovani: 41 001e 01F06500 xor.l ER0,ER0 ;nulovani registru ER0 42 0022 01F06511 xor.l ER1,ER1 ;nulovani registru ER1 43 0026 01F06522 xor.l ER2,ER2 ;nulovani registru ER2 44 002a 01F06533 xor.l ER3,ER3 ;nulovani registru ER3 45 002e 01F06544 xor.l ER4,ER4 ;nulovani registru ER4 46 0032 01F06555 xor.l ER5,ER5 ;nulovani registru ER5 47 0036 01F06566 xor.l ER6,ER6 ;nulovani registru ER6 48 003a 5470 rts ;vyskoceni z podprogramu nulovani 49 50 ;---------------- konec podprogramu nulovani registru ------------------ 51 52 ;---------- podprogram osetreni vstupu a prevod ASCII na HEX ----------- 53 54 vstup: 55 003c 6C2B mov.b @ER2+,R3L ;vezme prvni ASCII znak z bufferu a presune do R3L 56 003e AB30 cmp.b #0x30,R3L ;porovnani s 0x30 (0) 57 0040 4D00 blt chyba ;pokud je mensi skoc na chybu Renesas H8/300 GAS D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s page 2 58 0042 AB46 cmp.b #0x46,R3L ;porovnani s 0x46 (F) 59 0044 4E00 bgt chyba ;pokud je vetsi skoc na chybu 60 0046 79330030 sub.w #0x30,R3 ;odecteni 0x30 (0) 61 004a AB09 cmp.b #0x9,R3L ;porovnani s 0x9 (9) 62 004c 4E00 bgt vstup_vetsi ;pokud je vesti 63 64 posun: ;prevod z ASCII na HEX 65 004e 14BC or.b R3L,R4L ;"presun" poslednich 4 bitu z R3L do R4L 66 0050 682B mov.b @ER2,R3L ;presunu dalsi znak z pameti 67 0052 AB0A cmp.b #0x0A,R3L ;porovnam s LF (\n) 68 0054 4700 beq zapis_vstup ;pokud je to nulovy znak skacu na zapis do pameti 69 0056 AE03 cmp.b #0x3,R6L ;porovnavam pomocny regist pro pocet znaku 70 0058 4700 beq chyba ;pokud je na vstupu vic jak 4 HEXa cisla skok na chybu 71 005a 1054 shll.w #2, R4 ;provedu bitovy posun o 4 pozice doleva(v HEXa posunu 72 005c 1054 shll.w #2, R4 ;cislo o 1 pozici) 73 005e 0A0E inc.b R6L ;inkrementuju pomocny registr pro pocet znaku 74 0060 4000 bra vstup ;skacu na zacatek cyklu 75 76 vstup_vetsi: ;zjisteni jestli vstup neni v rozmezi 0x3A - 0x40 v ASCII 77 0062 79330007 sub.w #0x7,R3 ;odectu 7 od registru aby se zjistilo rozmezi 78 0066 AB0A cmp.b #0xA,R3L ;porovnam s 0xA 79 0068 4D00 blt chyba ;pokud je mensi skacu na chybu 80 006a AB0F cmp.b #0xF,R3L ;porovnam s 0xF 81 006c 4E00 bgt chyba ;pokud je vetsi skacu na chybu 82 006e 4000 bra posun ;skacu na na provedeni bitoveho posunu 83 84 zapis_vstup: ;zapis vysledneho 16b cisla do pameti 85 0070 69D4 mov.w R4,@ER5 ;presun cisla na adresu v pameti 86 0072 5470 rts ;navrat z podprogramu pro vstup 87 88 chyba: ;vypis chybove hlasky pro spatny vstup 89 0074 79000114 mov.w #PUTS,R0 ;presun adresy konzole pro vypis do R0 90 0078 7A010000 mov.l #par4,ER1 ;presun adresy par4 do ER1 90 0000 91 007e 5E000000 jsr @syscall ;volani podprogramu pro konzoli 92 0082 5A000000 jmp _start ;skok na zacatek programu pro nove zadani vstupu 93 94 ;------ konec podprogramu osetreni vstupu a prevodu ASCII na HEX ------- 95 96 ;-------------- podprogram pro prevedeni vystupu na ASCII -------------- 97 98 vystup: 99 0086 AC04 cmp.b #4, R4L ;porovnani poctu cifer(iteraci) 100 0088 4700 beq konec ;pokud je 4 iterace tak skoc na konec 101 008a 0D23 mov.w R2,R3 ;presun obsah registru R2 do R3 102 008c 1152 shlr.w #2,R2 ;provedu bitovy posun o 4 pozice doprava (v HEXa posunu 103 008e 1152 shlr.w #2,R2 ;cislo o 1 pozici) 104 0090 0A0C inc.b R4L ;inkrementuji pomocny registr pro pocet iteraci 105 0092 7963000F and.w #0xF, R3 ;"vytazeni" poslednich 4 bitu 106 0096 79230009 cmp.w #0x9, R3 ;porovnani hodnoty s 0x9 (9) 107 009a 4E00 bgt pricti ;pokud je vetsi nez 0x9 skoc na pricteni 108 009c 79130030 add.w #0x30,R3 ;jinak pricti 0x30 (0) a pokracuj 109 110 zapis_vystup: ;zapsani prevedene hodnoty do pameti 111 00a0 68EB mov.b R3L, @ER6 ;presunuti ASCII hodnoty z registru do pameti 112 00a2 1B76 dec.l #1, ER6 ;snizeni adresy pameti o 1 113 00a4 4000 bra vystup ;skok na zacatek cyklu Renesas H8/300 GAS D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s page 3 114 115 pricti: 116 00a6 79130037 add.w #0x37,R3 ;pricteni 0x37 pro prevedeni na A-F 117 00aa 4000 bra zapis_vystup ;skok na zapis do pameti 118 119 konec: 120 00ac 5470 rts ;vyskoceni z podprogramu 121 122 ;---------- konec podprogramu pro prevedeni vystupu na ASCII ----------- 123 124 ;-------- podprogram pro zapis 0x0A (\n) do vystupniho retezce --------- 125 126 zapis_LF: 127 00ae 7A160000 add.l #4,ER6 127 0004 128 00b4 FA0A mov.b #0x0A,R2L 129 00b6 68EA mov.b R2L,@ER6 130 00b8 1B76 dec.l #1,ER6 131 00ba 5470 rts 132 133 ;----- konec podprogramu pro zapis 0x0A (\n) do vystupniho retezce ----- 134 135 ;========================= konec podprogramu =========================== 136 137 ;============================ datova cast ============================== 138 139 .data 140 141 0000 44656C65 delenec_text: .asciz "Delenec:\n" ;text pro vyzvu zadani delence 141 6E65633A 141 0A00 142 000a 44656C69 delitel_text: .asciz "Delitel:\n" ;text pro vyzvu zadani delitele 142 74656C3A 142 0A00 143 0014 5679736C vysledek_text: .asciz "Vysledek:\n" ;text pro vypsani vysledku 143 6564656B 143 3A0A00 144 001f 5A627974 zbytek_text: .asciz "Zbytek:\n" ;text pro vypsani zbytku 144 656B3A0A 144 00 145 0028 53706174 chybka: .asciz "Spatny vstup!\n" ;hlasky pro spatne zadany vstup 145 6E792076 145 73747570 145 210A00 146 0037 00000000 vystup_text: .space 5 ;prostor pro vypsani vysledne hodnoty 146 00 147 003c 00000000 buffer: .space 10 ;vstupni buffer pro konzoli 147 00000000 147 0000 148 149 0046 00000000 .align 4 ;zarovnani adresy 149 00000000 149 0000 150 0050 00000000 par1: .long delenec_text ;parametricky blok pro delence 151 0054 00000000 par2: .long buffer ;parametricky blok pro buffer 152 0058 00000000 par3: .long delitel_text ;parametricky blok pro delitele 153 005c 00000000 par4: .long chybka ;parametricky blok pro chybu Renesas H8/300 GAS D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s page 4 154 0060 00000000 par5: .long vysledek_text ;parametricky blok pro vysledek 155 0064 00000000 par6: .long zbytek_text ;parametricky blok pro zbytek 156 0068 00000000 par7: .long vystup_text ;parametricky blok pro vystup 157 158 006c 00000000 .align 4 ;zrovnani adresy 159 0070 0000 delenec: .space 2 ;prostor pro ulozeni hodnoty delence 160 0072 0000 delitel: .space 2 ;prostor pro ulozeni hodnoty delitele 161 0074 0000 vysledek: .space 2 ;prostor pro ulozeni hodnoty vysledku 162 0076 0000 zbytek: .space 2 ;prostor pro ulozeni hodnoty zbytku 163 164 0078 00000000 .space 64 ;prostor pro zasobnik 164 00000000 164 00000000 164 00000000 164 00000000 165 stack: ;delarace zasobniku 166 167 ;========================= konec datove casti ========================== 168 169 ;============================ kodova cast ============================== 170 171 00b8 00000000 .text 171 00000000 172 .global _start 173 _start: 174 00bc 7A070000 mov.l #stack, ER7 ;inicializace zasobniku 174 0000 175 00c2 5E000000 jsr @nulovani ;volani podprogramu pro nulovani registru 176 ;| navratoá adresa 0x04B6 | 177 178 00c6 79000114 mov.w #PUTS,R0 ;presun adresy konzole pro vypis do R0 179 00ca 7A010000 mov.l #par1,ER1 ;presun adresy par1 do ER1 ("Delenec:") 179 0000 180 00d0 5E000000 jsr @syscall ;volani podprogramu pro konzoli 181 182 00d4 79000113 mov.w #GETS,R0 ;presun adresy konzole pro nacteni do R0 183 00d8 7A010000 mov.l #par2,ER1 ;presun adresy par2 do ER1 (buffer) 183 0000 184 00de 5E000000 jsr @syscall ;volani podprogramu pro konzoli 185 186 00e2 7A020000 mov.l #buffer, ER2 ;presun adresy bufferu do ER2 186 0000 187 00e8 7A050000 mov.l #delenec, ER5 ;presun adresy delence do ER5 187 0000 188 00ee 5E000000 jsr @vstup ;volani podprogramu pro overeni a prevod vstupu 189 ;z ASCII | navratova adresa 0x04E2 | 190 191 00f2 5E000000 jsr @nulovani ;volani podprogramu pro nulovani registru 192 ;| navratova adresa 0x04E6 | 193 194 00f6 79000114 mov.w #PUTS,R0 ;presun adresy konzole pro vypis do R0 195 00fa 7A010000 mov.l #par3,ER1 ;presun adresy par1 do ER1 ("Delitel:") 195 0000 196 0100 5E000000 jsr @syscall ;volani podprogramu pro konzoli 197 198 0104 79000113 mov.w #GETS,R0 ;presun adresy konzole pro nacteni do R0 199 0108 7A010000 mov.l #par2,ER1 ;presun adresy par2 do ER1 (buffer) Renesas H8/300 GAS D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s page 5 199 0000 200 010e 5E000000 jsr @syscall ;volani podprogramu pro konzoli 201 202 0112 7A020000 mov.l #buffer, ER2 ;presun adresy bufferu do ER2 202 0000 203 0118 7A050000 mov.l #delitel, ER5 ;presun adresy delitele do ER5 203 0000 204 011e 5E000000 jsr @vstup ;volani podprogramu pro overeni a prevod vstupu 205 ;z ASCII | navratova adresa 0x0512 | 206 207 0122 5E000000 jsr @nulovani ;volani podprogramu pro nulovani registru 208 ;| navratova adresa 0x0516 | 209 ; chapeme 210 0126 7A040000 mov.l #delenec, ER4 ;presun adresy delence do ER4 210 0000 211 012c 7A050000 mov.l #delitel, ER5 ;presun adresy delitele do ER5 211 0000 212 0132 694A mov.w @ER4, E2 ;presun delence do E2 213 0134 6952 mov.w @ER5, R2 ;presun delitele do R2 214 ;jsr @deleni ;volani podprogramu pro deleni 215 ;| navratova adresa 0x052A | 216 0136 5E000000 jsr @nasobeni 217 218 219 013a 7A040000 mov.l #vysledek, ER4 ;presun adresy vysledku do ER4 219 0000 220 0140 7A050000 mov.l #zbytek, ER5 ;presun adresy zbytku do ER5 220 0000 221 0146 69C3 mov.w R3, @ER4 ;presun vysledku do pameti 222 0148 69DB mov.w E3, @ER5 ;presun zbytku do pameti 223 224 014a 5E000000 jsr @nulovani ;volani podprogramu pro nulovani 225 ;| navratova adresa 0x053E | 226 227 014e 7A050000 mov.l #vysledek, ER5 ;presun adresy vysledku do ER5 227 0000 228 0154 7A060000 mov.l #vystup_text, ER6 ;presun adresy vystupu do ER6 228 0000 229 015a 5E000000 jsr @zapis_LF ;volani podprogramu pro zapis 0x0A (\n) 230 ;na posledni pozici | navratova adresa 0x054E | 231 232 015e 6952 mov.w @ER5,R2 ;presun vysledku z pameti do R2 233 0160 5E000000 jsr @vystup ;volani podprogramu pro prevod vystupu na ASCII 234 ;| navratova adresa 0x0554 | 235 236 0164 79000114 mov.w #PUTS,R0 ;presun adresy konzole pro vypis do R0 237 0168 7A010000 mov.l #par5,ER1 ;presun adresy par5 do ER1 ("Vysledek:") 237 0000 238 016e 5E000000 jsr @syscall ;volani podprogramu pro konzoli 239 240 0172 7A010000 mov.l #par7,ER1 ;presun adresy par7 do ER1 (vystupni text) 240 0000 241 0178 5E000000 jsr @syscall ;volani podprogramu pro konzoli 242 243 end: 244 017c 4000 bra end ;konec programu(zacykleni na miste) 245 ;jmp _start ;zacykleni pro neustaly beh programu Renesas H8/300 GAS D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s page 6 246 247 .end Renesas H8/300 GAS D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s page 7 DEFINED SYMBOLS D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:3 *ABS*:0001ff00 syscall D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:4 *ABS*:00000114 PUTS D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:5 *ABS*:00000113 GETS D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:11 .text:00000000 deleni D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:12 .text:00000000 .L0 D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:18 .text:0000000a deleni_konec D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:23 .text:0000000e nasobeni D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:29 .text:00000012 for D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:40 .text:0000001e nulovani D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:54 .text:0000003c vstup D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:88 .text:00000074 chyba D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:76 .text:00000062 vstup_vetsi D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:64 .text:0000004e posun D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:84 .text:00000070 zapis_vstup D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:153 .data:0000005c par4 D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:173 .text:000000bc _start D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:98 .text:00000086 vystup D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:119 .text:000000ac konec D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:115 .text:000000a6 pricti D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:110 .text:000000a0 zapis_vystup D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:126 .text:000000ae zapis_LF D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:141 .data:00000000 delenec_text D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:142 .data:0000000a delitel_text D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:143 .data:00000014 vysledek_text D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:144 .data:0000001f zbytek_text D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:145 .data:00000028 chybka D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:146 .data:00000037 vystup_text D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:147 .data:0000003c buffer D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:150 .data:00000050 par1 D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:151 .data:00000054 par2 D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:152 .data:00000058 par3 D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:154 .data:00000060 par5 D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:155 .data:00000064 par6 D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:156 .data:00000068 par7 D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:159 .data:00000070 delenec D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:160 .data:00000072 delitel D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:161 .data:00000074 vysledek D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:162 .data:00000076 zbytek D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:165 .data:000000b8 stack D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:243 .text:0000017c end .text:00000000 .L0 D:\zèu\KIV.POT\semestralka\Hron_A11B0379P\Simulated_IO\main.s:247 .text:0000017e .L0 NO UNDEFINED SYMBOLS