.h8300s .data ; zacatek datove sekce INT: .word 0x8000 ; vstupni cislo TEXT: .space 8 ; vystupni text .space 100 ; 100 bytu pro zasobnik STCK: .text ; zacatek kodové sekce .global _start ; _start je globalni navesti DELENI: ; deleni 10, zbytek se ulozi do zasobniku, vysledek do R0L pop.l ER3 ; nacteme adresu navratu ze zasobniku mov.w #0x0A, R1 ; budeme delit deseti, ulozime si do zasobniku hodnotu 10 DIVXU.w R1, ER2 ; provedeme deleni, v hornich 16 bytech je zbytek, ve spodnich 16 je quocient push.w E2 ; ulozime zbytek do zasobniku mov.w #0x0, E2 ; vynulujeme horni cast ER2 registru, kde byl zbytek po deleni push.l ER3 ; ulozime adresu navratu zas zpet do zasobniku rts ; vratime se zpet do hl programu _start: mov.l #STCK, ER7 ; hodnota STCK do SP mov.w @INT, R2 ; narveme vstupni cislo do registru ; nejprve zjistime znamenko mov.b R2H, R1L ; hodime vstupni cislo do pracovniho registru and.b #0x80, R1L ; provedeme 0xYY & 0x80, cimz zjistime, estli je nastaven posledni bit mov.b #0x00, R4L ; vynulujeme ulozny prostor pro znamenko cmp.b #0x00, R1L ; zjistime, estli neni nastaven posledni bit beq BEZZN ; pokud neni, skocime na BEZZN mov.b #0x01, R4L ; ulozime si pamatovak na znamenko neg.w R2 BEZZN: mov.w #0x00, E2 jsr DELENI ; 5 cislo jsr DELENI ; 4 cislo jsr DELENI ; 3 cislo jsr DELENI ; 2 cislo push.w R2 ; ulozime 1. cislo do zasobniku ;jsr DELENI ; predelani na text mov.l #TEXT, ER3 ; ulozime pozici promene v pameti ; nejprve znamenko cmp.b #0x00, R4L beq BTEXTZN mov.b #'-',R1L ; ulozeni znamenka "-" mov.b R1L,@ER3 ; do vystupniho retezce inc.l #1, ER3 ; posuneme se na dalsi pozici v textu BTEXTZN: ; bez textoveho znamenka ; projistotu ulozime znak '0', pokud by bylo vstupni cislo nulove mov.b #'0', R1L mov.b R1L, @ER3 ; projedeme vsech 5 cisel mov.b #0x00, R1L ; vynulujem incrementator mov.r #0x00, R4L ; vynulujem indikator, ktery udava, ze se jiz se naslo nenulove cislo DALSIC: inc.b R1L ; pricetem inkrementator cmp.b #0x06, R1L ; porovname pocet vyberu ze zasobniku beq KON ; pokud by jsme jiz nacitali 6. cislo, skocime na konec pop.w R0 ; nacteme cislo cmp.b #0x00, R4L ; pokud jsme jeste nenasli enulove cislo, provedeme nasledujici porovnani bne NESKAKEJ cmp.b #0x00, R0L ; jeli nulove, nacteme dalsi beq DALSIC NESKAKEJ: add.b #'0', R0L ; pricteme k nemu asci hodnotu znaku '0' mov.b R0L, @ER3 ; ulozime do textu znak inc.l #0x1, ER3 ; posuneme se na dalsi pozici v textu mov.b #0x1, R4L ; nastavime si indikator, ze se vyskytlo nenulove cislo jmp DALSIC ; skocime na dalsi cislo (DALSIC) KON: bra KON ; nekonecna smycka na konci .end