; ; ********************* ; * * ; * ARITMETIKA Z80 * ; * * ; ********************* ; ;Aritmetika v pohyblive radove carce, ktera realizuje funkce ;scitani, odcitani, nasobeni, deleni a odmocninu. ;Cislo je vyjadreno v 32 bitovem formatu a muze nabyvat ;hodnot v rozsahu 10**38 az 10**-38. ;Cislo ma nasledujici tvar. ; 1.byte 2.byte 3.byte 4.byte ; ........ ........ ........ ........ ; SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM ; 1 ; ; kde S=znamenko mantisy - (0=kladny,1=zaporny) ; E=8bitu exponentu max 2**128,nejvyssi bit urcuje ; znamenko.Exponent je v ofset kodu +80H ; M=24bitu mantisy pri cemz nejvyssi bit je explicitne 1 ; tzn. ze mantisa muze nabyvat hodnot 1 > M >=0.5 ; ; ;Vstupni operandy jsou X = (DE).4 ; Y = (HL).4 ;a registr A obsahuje kod operace ;Je-li v reg.A bit 7=1 dojde k zmene znamenka u X ;ostatni bity oznacuji operaci: ; 0AH scitani Z=Y+X ; 0BH nasobeni Z=XY ; 0DH deleni Z=Y/X ; 15H odmocninu z abs Y ;jine kody znamenaji prazdnou operaci NOP ; ;Vysledek je umisten v RAM Z = (BC).4 ;v reg.A je informace o prubehu vypoctu ; ; .Z80 cseg ARI4G: ;-------------------------------uschova registru EX DE,HL EXX PUSH HL PUSH DE PUSH BC EXX EX AF,AF' PUSH AF PUSH HL PUSH DE PUSH BC ;-------------------------------natazeni operandu LD C,(HL) INC HL LD A,(HL) PUSH DE INC HL LD D,(HL) INC HL LD E,(HL) POP HL LD B,(HL) PUSH BC PUSH DE ; natazeni X INC HL ; ulozeni Y na (SP+1)(SP) LD B,(HL) INC HL LD D,(HL) INC HL LD E,(HL) EX DE,HL POP DE EX (SP),HL ;----------------------uprava mantisy a znamenka exp. RLCA SCF RRA LD C,A ; [ CDE ]=M(X) RL L ; [ L ]=E(X), [ CY' ]=S(X) JR NZ,hbx LD C,L ;pri E(X)=0 je nastaven M(X)=0 LD D,L LD E,L hbx: LD A,0 ;A' musi prijmout znamenko EX AF,AF' RLCA ;zmena znamenka pro X dana operacnim kodem AND A ;vymaz a nove nastaveni RRA JR NC,ncs ;je-li CY=1,pak zmena znamenka u X EX AF,AF' CCF ;S(X) :=compl S(X) EX AF,AF' ncs: EX AF,AF' RRA ;posun S(X) do reg.A RLC B SCF RR B ;[ B [ SP+1 ][ SP ]] = M(Y) RL H ;[ H ] = E(Y), [ CY ] = S(Y) RRA ;posun S(Y) do A' JR NZ,hby LD B,H ;pri E(Y) = 0 je nastaven M(Y) = 0 EX (SP),HL LD H,B LD L,B EX (SP),HL hby: DEC A ;prozatimni nastaveni S(Z) = S(Y) XOR S(X) CP 80H ;[ CY ] = S(Y) XOR S(X) INC A RRA ;posun S(Z) do reg.A' EX AF,AF' ;-------------vstupni blok je ukoncen s: ; [ A ] =operacni kod s bitem 7,A=0 ; [ A'] = znamenko S(Z),S(Y),S(X),00000 ; [ L ] = E(X) ; [ CDE ] = M(X) ; [ H ] = E(Y) ; [ B [ SP+1 ][ SP ]] = M(Y) ; [ SP ] := [ SP ] - 20H ; ;-------------rozskok podle operacniho kodu ; CP 0AH ;soucet? JR NZ,nadg ;------------blok scitani ; [ A' ] = S(Z)S(Y)S(X)00000 ; [ L ] = E(X) [ CDE ] = M(X) ; [ H ] = E(Y),[ B [ SP+1 ][ SP ]] = M(Y) addg: LD A,H SUB L ; DELE := E(Y) - E(X) EX (SP),HL JR NC,eyx CP 0E8H ; DELE < 0 JR C,zex ; Z := X,dokud je DELE < -23D la1: SRL B RR H ; uprava -srovnani exponentu RR L ; Y := Y/2 a INC A ; DELE := DELE + 1 JR NZ,la1 ;opakuj az DELE = 0 eyx: JR Z,eeq ; E(Z) := E(X) EX (SP),HL ; DELE >= 0 LD L,H ; E(Z) := E(Y) EX (SP),HL CP 17H JR NC,zey ; Z := Y, kdyz DELE > 23 D la2: SRL C RR D ;uprava - srovnani exponentu RR E ; X := X/2 DEC A ; DELE := DELE - 1 JR NZ,la2 eeq: EX AF,AF' ; DELE = 0 RLCA ; [ CY ] = S(Y) XOR S(X), S(Z) := S(Y) JR NC,mad ;pri S(Y) <> S(X) odecteni mantis msu: EX AF,AF' AND A SBC HL,DE LD A,B ; M(Z) := M(Y) - M(X) SBC A,C LD C,A JR NC,nora ;na normalizaci nedoslo-li k prenosu EX AF,AF' ; M(Z) < 0 RLCA ; S(Z) := S(X) EX AF,AF' XOR A EX DE,HL LD H,A LD L,A ; M(Z) := 0 - M(Z) SBC HL,DE SBC A,C LD C,A JR nora ;na normalizaci mad: EX AF,AF' ;secteni mantis pri shodnych znamenkach ADD HL,DE LD A,B ; M(Z) := M(Y) + M(X) ADC A,C LD C,A JR nord ;na normalizaci s prenosem hodnoty zex: EX AF,AF' ;zvlastni pripad scitani RLCA ; S(Y) := S(X) EX AF,AF' EX DE,HL ; M(Y) := M(X) LD B,C zey: LD C,B ; Z := Y EX AF,AF' RLCA ; S(Z) := S(Y) EX AF,AF' ;-------------konec bloku scitani ; bit 7,A = S(Z) ; [ CHL ] = M(Z), [ CY ] = prenos z mantisy ; [[ SP ]] = E(Z) ; nasleduje blok normalizace bez prenosu ; ;-------------blok normalizace bez prenosu ; bit 7,A = S(Z) ; [ CHL ] = M(Z) ; [[ SP ]] = E(Z) nora: POP DE LD A,C OR H OR L JR Z,nul1 ; Z := 0 kdyz M(Z) = 0 lno: ADD HL,HL ;smycka normalizace RL C ; M(Z) := 2M(Z) DEC E ; E(Z) := E(Z) - 1 JR Z,nul1 ; Z := 0 pri podteceni exponentu JR NC,lno ; konec smycky JR nod2 ; skok na normalizaci s prenosem = 1 ; bit 7,A' = S(Z) ; [ CHL ] = M(Z), [ CY ] = 1 = prenos z M(Z) ; [ E ] = E(Z) ; [ SP ] := [ SP ] + 2 ; ;------------------------------- ; nadg: CP 0BH ;nasobeni? JR NZ,nmug ; ;------------------------blok nasobeni ; [ A' ] = S(Z)S(Y)S(X)00000 ; [ L ] = E(X), [ CDE ] = M(X) ; [ H ] = E(Y), [ B [ SP + 1 ][ SP ]] = M(Y) ; mulg: LD A,L AND A JR Z,null ; Z := 0 kdyz X = 0 LD A,H AND A JR Z,null ; Z := 0 kdyz Y = 0 ADD A,L JR NC,enm ADD A,7FH ; E(Z) := E(Y) + E(X) - 1 JR NC,imu JR ovld ;preteceni exponentu enm: SUB 81H JR C,null ;podteceni exponentu imu: LD L,A EX (SP),HL PUSH BC PUSH HL LD HL,0 ; M(Z) := 0 LD B,H EXX LD B,17H ;pocitadlo - 23 pruchodu smyckou POP DE POP AF LD C,A lom: RR C ;smycka nasobeni RR D RR E ;posun M(Y) vpravo EXX JR NC,nam ADD HL,DE LD A,B ADC A,C ; M(Z) := M(Z) + M(X) LD B,A nam: RR B RR H RR L EXX DJNZ lom ;konec smycky nasobeni EXX ADD HL,DE LD A,B ; M(Z) := M(Z) + M(X) jestlize msb M(Y) = 1 ADC A,C LD C,A ;---------------konec bloku nasobeni ; bit 7,A' = S(Z) ; [ CHL ] = M(Z), [ CY ] = prenos od M(Z) ; [[ SP ]] = E(Z) ;----------------- ; ;---------------blok normalizace pri prenosu ; nord: POP DE JR NC,abs nod2: INC E ; prenos od M(Z) = 1 tzn. E(Z) := E(Z) + 1 JR Z,ovd1 ;nepretekl exponent? RR C RR H ; M(Z) := M(Z)/2 RR L abs: LD A,0CH ; priznak pro normalni ukonceni operace ; bit 7,A' = S(Z) ; [ CHL ] = M(Z) ; [ E ] = E(Z) ; [ SP ] := [ SP ] + 2 ;----------------------- absb: EX AF,AF' RLCA LD A,E ;normalizace formatu RRA LD B,A RL C RRC C POP DE PUSH DE EX DE,HL LD (HL),B ;ulozeni vysledku do pameti INC HL LD (HL),C INC HL LD (HL),D INC HL LD (HL),E ; ;----------------obnova registru ; rere: POP BC POP HL POP DE POP AF EXX POP BC POP DE POP HL EXX EX AF,AF' RET ; ;-------------------ZDE JE UKONCEN CELY PODPROGRAM ARITZ80 ; ;-----------------------zvlastni ukonceni null: POP DE nul1: XOR A zea: LD E,A LD C,A LD H,A LD L,A JR absb ;skok na ukoncovaci blok ovld: POP DE ovd1: LD A,0FFH JR zea ; ; bit 7,A' = S(Z), [ SP ] := [ SP ] + 2 ; [ CHL ] = M(Z) = 0 nebo 0FFFFFFH ; [ E ] = E(Z) = 0 nebo 0FFh ;-------------------------- ; nmug: CP 0DH JR NZ,ndig ;-------------------------blok deleni ; [ A' ] = S(Z)S(Y)S(X)00000 ; [ L ] = E(X), [ CDE ] = M(X) ; [ H ] = E(Y), [ B [ SP + 1 ][ SP ]] = M(Y) ; divg: LD A,L ;zamena exponentu a zvlastni prubehy AND A ;preteceni,kdyz se X = 0 JR Z,ovld LD A,H AND A ;je-li Y = 0 pak Z := 0 JR Z,null ; E(Z) := E(Y) - E(X) v offsetkodu SUB L JR C,ned ADD A,80H JR NC,idi JR ovld ;preteceni exponentu ned: ADD A,80H JR NC,null ;podteceni expondentu idi: LD L,A ;deleni mantis EX (SP),HL ;inicializace EXX LD B,19H ;pocitadlo lod: EXX ;smycka deleni AND A SBC HL,DE ; M(Y) := M(Y) - M(X) LD A,B SBC A,C LD B,A JR NC,nad1 EX AF,AF' JR C,nad2 EX AF,AF' ADD HL, DE LD A,B ADC A,C LD B,A nad1: CCF EX AF,AF' nad2: ADD HL,HL RL B EX AF,AF' EXX ADC HL,HL RL C DJNZ lod ; konec smycky nod1: JR nord ;skok na normalizaci s prenosem ; ;bit 7,A = S(Z) ; [ CHL ] = M(Z), [ CY ] = prenos z M(Z) ; [[ SP ]] = E(Z) ;---------------------konec bloku deleni ; ;-----------------ukoncovaci blok ; ; bit 7,A' = S(Z) ; [ CHL ] = M(Z) ; [ E ] = E(Z) ; [ A ] = informace o prubehu aritmeticke operace ; ; ndig: CP 15H ;odmocnina? JR Z,sqrg POP DE JR rere ;-----------blok odmocniny ; [ H ] = E(Y), [ B [ SP+1 ][ SP ]] = M(Y) ; sqrg: LD A,H ;exponent do A AND A JR Z,null ; Z := 0 kdyz Y = 0 POP HL RRA ; E(Y) := E(Y)/2 JR NC,evv INC A ; E(Y) := E(Y)+1 SRL B RR H ; M(Y) := M(Y)/2 RR L evv: ADD A,40H ; E(Y) := E(Y)+40H LD C,A PUSH BC ;ulozeni E(Y) ;------vypocet mantisy - inicializace XOR A EXX LD C,40H ; R := M(Y), CY' = MSB z R LD D, A ; V := 0.01 LD E,A LD H,A ; M(Z) := 0 LD L,A los: ADD HL,DE ;smycka odmocniny ADC A,C ; M(Z) := M(Z) + V PUSH HL EXX POP DE LD C,A SBC HL,DE LD A,B SBC A,C ; R := R - M(Z) LD B,A JR NC,nas1 EX AF,AF' JR C,nas2 EX AF,AF' ADD HL,DE ADC A,C ; R := R + M(Z) LD B,A nas1: CCF EX AF,AF' nas2: ADD HL,HL ; R := 2R RL B EX AF,AF' LD A,C PUSH DE EXX POP HL JR NC,zmv ADD HL,DE ; M(Z) := M(Z) + V ADC A,C JR rrv zmv: SBC HL,DE ; M(Z) := M(Z) - V SBC A,C rrv: SRL C RR D ; V := V/2 RR E JR NC,los LD C,A XOR A ; S(Z) := 0 EX AF,AF' XOR A ;zadny prenos z M(Z) JR nod1 ;skok na normalizaci a ulozeni vysledku ; ; bit 7,A' = S(Z) = 0 ; [ CHL ] = M(Z), [ CY ] = 0 = prenos z M(Z) ; [(SP)] = E(Z) ;------------------konec odmocniny ; ; END