1 .define fpac, fpadd, fpcdf, fpcfd, fpcfi, fpcif, fpcmf, fpcomp
2 .define fpdiv, fpfef, fpfif, fpmult, fpop, fpsub, fpnorm
8 ! floating point pakket voor Z80
9 ! geimplementeerd zoals beschreven in
10 ! Electronica top internationaal.
12 ! Auteur: Hr. R. Beverdam, Zuidbroekweg 9,7642 NW Wierden
28 call fpcomp ! inverteer fpacc
30 ld de,(fam) ! d fax,e fam
31 ld bc,(fom) ! b fox,c fom
34 jr z,movop ! ja: som=fpop dus verplaats
37 ret z ! som is dus fpacc, klaar
40 ld l,a ! bewaar verschil exponenten
41 jp p,skpneg ! maak positief
44 cp 0x18 ! verschil meer dan 23?
46 jp m,lineup ! spring indien binnen bereik
47 and a ! getallen te groot tov elkaar
48 ret m ! klaar als fpacc het grootst
50 ld hl,fol ! verplaats fpop naar fpacc
51 ld de,fal ! want fpop is het antwoord
56 and a ! kijk welke groter is
57 jp m,shifto ! spring als fpop>fpac
59 ld b,a ! save sa in b register
61 push af ! bewaar so op stapel
62 jr shacop ! gr schuiven
66 inc a ! so 1+(fox-fax)
67 push af ! bewaar so op stapel
70 ld hl,(fal) ! l fal,h fan
77 inc d ! update voor fax
78 djnz moracc ! herhaal sa keer
79 ld (xa),a ! berg alles
81 ld (fam),de ! fpacc en xa
82 pop af ! haal so terug van stapel
83 ld b,a ! en zet in b register
85 ld hl,(fol) ! l fol,h fon
91 djnz morop ! herhaal so keer
94 ld (fom),bc ! berg alles weg in fpop en xo
100 ld a,(de) ! haal een byte
101 adc a,(hl) ! tel er een bij op
102 ld (de),a ! en berg de som weer op
105 djnz addmor ! herhaal dit 4 keer
113 add a,(hl) ! bereken exponent produkt
114 ld (hl),a ! fax exponent produkt
117 ex de,hl ! gebruik de als wijzer
120 ld l,a ! hoogste 16 bits van pp worden nul
123 ld de,(fam) ! haal mc in registers
124 ld d,a ! d:=0 tbv 16-bit add
126 ld l,a ! middelste 16 bits van pp worden nul
127 ld ix,0 ! laagste 16 bits ook
131 ld a,(de) ! haal een byte van mr
133 ld b,8 ! bits in a byte
135 rla ! schuif vooste bit in carry
137 jr nc,noadd ! vooste bit is 0, dan niet optellen
138 add ix,bc ! pp:=pp+mc
139 adc hl,de ! continued
144 adc hl,hl ! dit schoof het hele partiele produkt <
145 djnz shift ! herhaal voor alle 8 bits
147 jr nz,mult ! herhaal voor 3 bytes
156 ld (fan),a ! rond getal in pp af en berg resultaat op
169 ld (hl),a ! berg exponent quotient op
176 jr z,fperr ! fout, deling door nul
189 sbc a,b ! probeer de aftrekking
190 jp m,nogo ! gaat niet
194 ex af,af2 ! quotient in tweede accumulator
201 rla ! volgende bit in quotient
203 add ix,ix ! schuif eventueel vernieuwde
207 ld a,c ! zet nieuwe dd in rekenregisters
209 djnz mordiv ! herhaal 8 keer
211 ld (hl),a ! zet een byte van het quotient in het geheugen
215 jr nz,divide ! herhaal 3 keer
217 ld hl,(fam) ! haal quotient terug in cpu
219 jp z,exmldv ! als niet te groot tekenherstellen
220 ld a,1 ! wel te groot
221 add a,c ! eerst getal afronden
230 inc h ! nu getal naar rechts schuiven
236 jr nz,shft ! door afronding weer te groot
239 jr exmldv ! inspecteer teken
241 ld a,(fom) ! ******** setsgn ************
245 rrc c ! ja, dus teken:=teken*(-1)
246 ld hl,fol ! en inverteer fpop
252 rrc c ! ja dus teken:=teken*(-1)
255 ld hl,xa ! initialiseer nog een paar registers
265 ld de,(fpac) ! integer to convert
279 jp m,fpzero ! really integer zero here
281 jp p,fperr ! overflow
450 call m,fpcomp ! ja -- inverteer
456 jr z,fpzero ! als hele facc 0 is
459 bit 6,a ! test meest significante bit
460 jr nz,catch ! stop als bit is 1
461 add hl,hl ! schuif links zolang bit = 0
463 dec d ! pas fax ook aan
466 ld e,a ! herstel nu fpacc in geheugen
470 bit 7,c ! test op teken
471 ret z ! positief, geen actie
475 ld b,3 ! inverteer alleen mantisse