.h8300s .equ syscall,0x1FF00 ; simulated IO area .equ PUTS,0x0114 ; kod PUTS .equ GETS,0x0113 ; kod GETS ;=========================== podprogramy ============================== ;------------------------- podprogram deleni -------------------------- deleni: cmp.w E2, R2 ;porovnani delenec delitel bhi deleni_konec ;pokud je delitel > delenec, skoc na konec_deleni sub.w R2, E2 ;odecti delitele od delence inc.w #1,R3 ;pricti k vysledku 1 bra deleni ;pokracuj v cyklu deleni deleni_konec: mov.w E2, E3 ;presunuti zbytku do registu pro "zbytek" rts ;vyskoceni z podprogramu ;--------------------- konec podprogramu deleni ------------------------ nasobeni: ;MOV.W @A,E2 ;MOV.W @B,R2 ;MOV.W E2,R3 ; hodnotu A presune do vysledku MOV.W #1,E3 for: ADD.W #1,E3 ; inkrementace registu pro vyskakovaci podmink ADD.W E2,R3 ; pricte hodnotu A k vysledku CMP.W R2,E3 ; testovani registru pro ukonceni cyklu BLS for ; skok na navesti rts ;------------------- podprogram nulovani registru ---------------------- nulovani: xor.l ER0,ER0 ;nulovani registru ER0 xor.l ER1,ER1 ;nulovani registru ER1 xor.l ER2,ER2 ;nulovani registru ER2 xor.l ER3,ER3 ;nulovani registru ER3 xor.l ER4,ER4 ;nulovani registru ER4 xor.l ER5,ER5 ;nulovani registru ER5 xor.l ER6,ER6 ;nulovani registru ER6 rts ;vyskoceni z podprogramu nulovani ;---------------- konec podprogramu nulovani registru ------------------ ;---------- podprogram osetreni vstupu a prevod ASCII na HEX ----------- vstup: mov.b @ER2+,R3L ;vezme prvni ASCII znak z bufferu a presune do R3L cmp.b #0x30,R3L ;porovnani s 0x30 (0) blt chyba ;pokud je mensi skoc na chybu cmp.b #0x46,R3L ;porovnani s 0x46 (F) bgt chyba ;pokud je vetsi skoc na chybu sub.w #0x30,R3 ;odecteni 0x30 (0) cmp.b #0x9,R3L ;porovnani s 0x9 (9) bgt vstup_vetsi ;pokud je vesti posun: ;prevod z ASCII na HEX or.b R3L,R4L ;"presun" poslednich 4 bitu z R3L do R4L mov.b @ER2,R3L ;presunu dalsi znak z pameti cmp.b #0x0A,R3L ;porovnam s LF (\n) beq zapis_vstup ;pokud je to nulovy znak skacu na zapis do pameti cmp.b #0x3,R6L ;porovnavam pomocny regist pro pocet znaku beq chyba ;pokud je na vstupu vic jak 4 HEXa cisla skok na chybu shll.w #2, R4 ;provedu bitovy posun o 4 pozice doleva(v HEXa posunu shll.w #2, R4 ;cislo o 1 pozici) inc.b R6L ;inkrementuju pomocny registr pro pocet znaku bra vstup ;skacu na zacatek cyklu vstup_vetsi: ;zjisteni jestli vstup neni v rozmezi 0x3A - 0x40 v ASCII sub.w #0x7,R3 ;odectu 7 od registru aby se zjistilo rozmezi cmp.b #0xA,R3L ;porovnam s 0xA blt chyba ;pokud je mensi skacu na chybu cmp.b #0xF,R3L ;porovnam s 0xF bgt chyba ;pokud je vetsi skacu na chybu bra posun ;skacu na na provedeni bitoveho posunu zapis_vstup: ;zapis vysledneho 16b cisla do pameti mov.w R4,@ER5 ;presun cisla na adresu v pameti rts ;navrat z podprogramu pro vstup chyba: ;vypis chybove hlasky pro spatny vstup mov.w #PUTS,R0 ;presun adresy konzole pro vypis do R0 mov.l #par4,ER1 ;presun adresy par4 do ER1 jsr @syscall ;volani podprogramu pro konzoli jmp _start ;skok na zacatek programu pro nove zadani vstupu ;------ konec podprogramu osetreni vstupu a prevodu ASCII na HEX ------- ;-------------- podprogram pro prevedeni vystupu na ASCII -------------- vystup: cmp.b #4, R4L ;porovnani poctu cifer(iteraci) beq konec ;pokud je 4 iterace tak skoc na konec mov.w R2,R3 ;presun obsah registru R2 do R3 shlr.w #2,R2 ;provedu bitovy posun o 4 pozice doprava (v HEXa posunu shlr.w #2,R2 ;cislo o 1 pozici) inc.b R4L ;inkrementuji pomocny registr pro pocet iteraci and.w #0xF, R3 ;"vytazeni" poslednich 4 bitu cmp.w #0x9, R3 ;porovnani hodnoty s 0x9 (9) bgt pricti ;pokud je vetsi nez 0x9 skoc na pricteni add.w #0x30,R3 ;jinak pricti 0x30 (0) a pokracuj zapis_vystup: ;zapsani prevedene hodnoty do pameti mov.b R3L, @ER6 ;presunuti ASCII hodnoty z registru do pameti dec.l #1, ER6 ;snizeni adresy pameti o 1 bra vystup ;skok na zacatek cyklu pricti: add.w #0x37,R3 ;pricteni 0x37 pro prevedeni na A-F bra zapis_vystup ;skok na zapis do pameti konec: rts ;vyskoceni z podprogramu ;---------- konec podprogramu pro prevedeni vystupu na ASCII ----------- ;-------- podprogram pro zapis 0x0A (\n) do vystupniho retezce --------- zapis_LF: add.l #4,ER6 mov.b #0x0A,R2L mov.b R2L,@ER6 dec.l #1,ER6 rts ;----- konec podprogramu pro zapis 0x0A (\n) do vystupniho retezce ----- ;========================= konec podprogramu =========================== ;============================ datova cast ============================== .data delenec_text: .asciz "Delenec:\n" ;text pro vyzvu zadani delence delitel_text: .asciz "Delitel:\n" ;text pro vyzvu zadani delitele vysledek_text: .asciz "Vysledek:\n" ;text pro vypsani vysledku zbytek_text: .asciz "Zbytek:\n" ;text pro vypsani zbytku chybka: .asciz "Spatny vstup!\n" ;hlasky pro spatne zadany vstup vystup_text: .space 5 ;prostor pro vypsani vysledne hodnoty buffer: .space 10 ;vstupni buffer pro konzoli .align 4 ;zarovnani adresy par1: .long delenec_text ;parametricky blok pro delence par2: .long buffer ;parametricky blok pro buffer par3: .long delitel_text ;parametricky blok pro delitele par4: .long chybka ;parametricky blok pro chybu par5: .long vysledek_text ;parametricky blok pro vysledek par6: .long zbytek_text ;parametricky blok pro zbytek par7: .long vystup_text ;parametricky blok pro vystup .align 4 ;zrovnani adresy delenec: .space 2 ;prostor pro ulozeni hodnoty delence delitel: .space 2 ;prostor pro ulozeni hodnoty delitele vysledek: .space 2 ;prostor pro ulozeni hodnoty vysledku zbytek: .space 2 ;prostor pro ulozeni hodnoty zbytku .space 64 ;prostor pro zasobnik stack: ;delarace zasobniku ;========================= konec datove casti ========================== ;============================ kodova cast ============================== .text .global _start _start: mov.l #stack, ER7 ;inicializace zasobniku jsr @nulovani ;volani podprogramu pro nulovani registru ;| navratoá adresa 0x04B6 | mov.w #PUTS,R0 ;presun adresy konzole pro vypis do R0 mov.l #par1,ER1 ;presun adresy par1 do ER1 ("Delenec:") jsr @syscall ;volani podprogramu pro konzoli mov.w #GETS,R0 ;presun adresy konzole pro nacteni do R0 mov.l #par2,ER1 ;presun adresy par2 do ER1 (buffer) jsr @syscall ;volani podprogramu pro konzoli mov.l #buffer, ER2 ;presun adresy bufferu do ER2 mov.l #delenec, ER5 ;presun adresy delence do ER5 jsr @vstup ;volani podprogramu pro overeni a prevod vstupu ;z ASCII | navratova adresa 0x04E2 | jsr @nulovani ;volani podprogramu pro nulovani registru ;| navratova adresa 0x04E6 | mov.w #PUTS,R0 ;presun adresy konzole pro vypis do R0 mov.l #par3,ER1 ;presun adresy par1 do ER1 ("Delitel:") jsr @syscall ;volani podprogramu pro konzoli mov.w #GETS,R0 ;presun adresy konzole pro nacteni do R0 mov.l #par2,ER1 ;presun adresy par2 do ER1 (buffer) jsr @syscall ;volani podprogramu pro konzoli mov.l #buffer, ER2 ;presun adresy bufferu do ER2 mov.l #delitel, ER5 ;presun adresy delitele do ER5 jsr @vstup ;volani podprogramu pro overeni a prevod vstupu ;z ASCII | navratova adresa 0x0512 | jsr @nulovani ;volani podprogramu pro nulovani registru ;| navratova adresa 0x0516 | ; chapeme mov.l #delenec, ER4 ;presun adresy delence do ER4 mov.l #delitel, ER5 ;presun adresy delitele do ER5 mov.w @ER4, E2 ;presun delence do E2 mov.w @ER5, R2 ;presun delitele do R2 ;jsr @deleni ;volani podprogramu pro deleni ;| navratova adresa 0x052A | jsr @nasobeni mov.l #vysledek, ER4 ;presun adresy vysledku do ER4 mov.l #zbytek, ER5 ;presun adresy zbytku do ER5 mov.w R3, @ER4 ;presun vysledku do pameti mov.w E3, @ER5 ;presun zbytku do pameti jsr @nulovani ;volani podprogramu pro nulovani ;| navratova adresa 0x053E | mov.l #vysledek, ER5 ;presun adresy vysledku do ER5 mov.l #vystup_text, ER6 ;presun adresy vystupu do ER6 jsr @zapis_LF ;volani podprogramu pro zapis 0x0A (\n) ;na posledni pozici | navratova adresa 0x054E | mov.w @ER5,R2 ;presun vysledku z pameti do R2 jsr @vystup ;volani podprogramu pro prevod vystupu na ASCII ;| navratova adresa 0x0554 | mov.w #PUTS,R0 ;presun adresy konzole pro vypis do R0 mov.l #par5,ER1 ;presun adresy par5 do ER1 ("Vysledek:") jsr @syscall ;volani podprogramu pro konzoli mov.l #par7,ER1 ;presun adresy par7 do ER1 (vystupni text) jsr @syscall ;volani podprogramu pro konzoli end: bra end ;konec programu(zacykleni na miste) ;jmp _start ;zacykleni pro neustaly beh programu .end ;========================= konec kodove casti ==========================