; **************************************** ; knihovna procedur pro převod ; binárního čísla na tvar BCD ; - b16bcd = plný převod 16bit ; - b15bcd = omezený převod 16bit ; - b8bcd = plný převod 8bit ; - b7bcd = omezený převod 8bit ; - b7bcdf = zrychlený omezený převod 8bit ; **************************************** ; CPU: 8080A ; datum: 13.7.2017 ; **************************************** prtout .equ 8500h ; tisk ASCII znaku ; (funkce BIOSu PMD 85) .org 0 ; adresa překladu ; ************************************ ; ukázka použití jednotlivých procedur ; ************************************ lxi h,8000h ; test 8000h >> 32768 call b16bcd ; převod 000000..065535 call print5 ; tisk C:D:E lxi h,1000h ; test 1000h >> 4096 call b15bcd ; převod 0000..9999 call print4 ; tisk D:E mvi h,0bdh ; test BDh >> 189 call b8bcd ; převod 0000..0255 call print3 ; tisk D:E mvi h,62h ; test 62h >> 98 call b7bcd ; převod 00..99 call print2 ; tisk A mvi h,55h ; test 55h >> 85 call b7bcdf ; převod 00..99 jmp print2 ; tisk A ; ***************************************** ; omezený převod 8-bitového binárního čísla ; z reg. H na BCD číslo v reg. A (00..99) ; ***************************************** ; vstup: H = binární číslo (00h..63h) ; výstup: A = BCD hodnota (00..99) ; mění: PSW,B,H,L ; délka: 11bajtů / 285T ; ***************************************** b7bcd: mvi b,8 ; převádím 8-bitové číslo xra a ; příprava akumulátoru výsledku cykl7: dad h ; posun H vlevo, CY = H[7] adc a ; A := 2 x A + CY daa ; dekadická korekce dcr b jnz cykl7 ; NEXT bit ret ; ***************************************** ; omezený převod 8-bitového binárního čísla ; z reg. H na BCD číslo v reg. A (00..99) ; (zrychlená varianta procedury b7bcd) ; ***************************************** ; vstup: H = binární číslo (00h..63h) ; výstup: A = BCD hodnota (00..99) ; mění: PSW,H,L ; délka: 26bajtů / 158T ; ***************************************** b7bcdf: xra a ; příprava akumulátoru výsledku dad h ; posun H vlevo, CY = H[7] adc a ; A := 2 x A + CY daa ; dekadická korekce dad h ; totéž pro H[6].. adc a daa dad h ; totéž pro H[5].. adc a daa dad h ; totéž pro H[4].. adc a daa dad h ; totéž pro H[3].. adc a daa dad h ; totéž pro H[2].. adc a daa dad h ; totéž pro H[1].. adc a daa dad h ; totéž pro H[0].. adc a daa ret ; *********************************************** ; plný převod 8-bitového binárního čísla z reg. H ; na BCD číslo v registrech D:E (0000..0255) ; *********************************************** ; vstup: H = binární číslo (00h..FFh) ; výstup: D:E = BCD hodnota (0000..0255) ; mění: PSW,B,D,E,H,L ; délka: 19bajtů / 515T ; *********************************************** b8bcd: mvi b,8 ; převádím 8-bitové číslo lxi d,0 ; příprava akumulátoru výsledku cykl8: dad h ; posun H vlevo, CY = H[7] mov a,e ; DE := 2 x DE + CY adc a daa ; (včetně dekadické korekce) mov e,a mov a,d adc a daa mov d,a dcr b jnz cykl8 ; NEXT bit ret ; *********************************************** ; omezený převod 16-bitového binárního čísla v HL ; na BCD číslo v registrech D:E (0000..9999) ; *********************************************** ; vstup: H:L = binární číslo (0000h..270Fh) ; výstup: D:E = BCD hodnota (0000..9999) ; mění: PSW,B,D,E,H,L ; délka: 19bajtů / 1003T ; *********************************************** b15bcd: mvi b,16 ; převádím 16-bitové číslo lxi d,0 ; příprava akumulátoru výsledku cykl15: dad h ; posun HL vlevo, CY = H[7] mov a,e ; DE := 2 x DE + CY adc a daa ; (včetně dekadické korekce) mov e,a mov a,d adc a daa mov d,a dcr b jnz cykl15 ; NEXT bit ret ; ************************************************ ; plný převod 16-bitového binárního čísla v HL ; na BCD číslo v registrech C:D:E (000000..065535) ; ************************************************ ; vstup: H:L = binární číslo (0000h..FFFFh) ; výstup: C:D:E = BCD hodnota (000000..065535) ; mění: PSW,B,C,D,E,H,L ; délka: 24bajtů / 1294T ; ************************************************ b16bcd: lxi b,1000h ; převádím 16-bitové číslo ; B = 16 (tj. 10h) ; C = 0 (součást akumulátoru DE) lxi d,0 ; příprava akumulátoru výsledku cykl16: dad h ; posun HL vlevo, CY = H[7] mov a,e ; CDE := 2 x CDE + CY adc a daa ; (včetně dekadické korekce) mov e,a mov a,d adc a daa mov d,a mov a,c adc a daa mov c,a dcr b jnz cykl16 ; NEXT bit ret ; **************************** ; tisk pětimístného BCD čísla ; uloženého v registrech C:D:E ; **************************** print5: mov a,c ; z registru C call prt_lo ; tisknu cifru ve spodních 4 bitech ; *************************** ; tisk čtyřmístného BCD čísla ; uloženého v registrech D:E ; *************************** print4: mov a,d ; z registru D call prt_hi ; tisknu cifru v horních 4 bitech ; ************************** ; tisk třímístného BCD čísla ; uloženého v registrech D:E ; ************************** print3: mov a,d ; z registru D call prt_lo ; tisknu cifru ve spodních 4 bitech mov a,e ; příprava na tisk registru E ; *************************** ; tisk dvoumístného BCD čísla ; uloženého v registru A ; *************************** print2: push psw ; uschovám obsah registru A call prt_hi ; vytisknu cifru z horních 4 bitů pop psw ; obnovím obsah registru A call prt_lo ; vytisknu cifru z dolních 4 bitů mvi a,' ' ; za každým číslem vytisknu mezeru jmp prtout ; ***************************** ; tisk ASCII znaku (cifry 0..9) ; dle hodnoty A[7:4] ; ***************************** prt_hi: rrc ; obsah registru A posunu o 4 bity rrc ; doprava a tím dostanu cifru rrc ; z horních 4 bitů do dolních 4 bitů rrc ; ***************************** ; tisk ASCII znaku (cifry 0..9) ; dle hodnoty A[3:0] ; ***************************** prt_lo: ani 0fh ; izoluji obsah dolních 4 bitů adi '0' ; a připočtu ASCII kód cifry '0' jmp prtout ; ASCII znak vytisknu .end