DEMO.DESIGN
Frequently Asked Questions
 
оглавление | demo party в ex-СССР | infused bytes e-mag | новости от ib/news | другие проекты | письмо | win koi lat

следующий фpагмент (2)
; ; Simple floatint point library for z80 ; ; originally by Borland Intl. ; reconstructed by MAXWOLF Corp. ; ; 1989,90 ; ?fver equ 2 ; ; public ?loadf,?savef public ?itof,?atof,?ftoa public ?round,?trunc public ?add,?sub,?mult,?div public ?int,?sqrt,?cos,?sin public ?ln,?exp,?arctan ; ; ;load rr<-addr(hl) ; ?loadf: ld e,(hl) inc hl ld d,(hl) inc hl push de ld e,(hl) inc hl ld d,(hl) inc hl ld c,(hl) inc hl ld b,(hl) pop hl ret ; ;save addr(hl)<-rr' ; ?savef: push hl exx ex de,hl ex (sp),hl ld (hl),e inc hl ld (hl),d inc hl pop de ld (hl),e inc hl ld (hl),d inc hl ld (hl),c inc hl ld (hl),b ret ; ;convert int (hl) to real (rr) ; ?itof: ld a,h or l jp z,setz bit 7,h ex af,af' bit 7,h jr z,itof1 ld a,h cpl ld h,a ld a,l cpl ld l,a inc hl itof1: ld a,90h bit 7,h jr nz,itof3 itof2: add hl,hl dec a bit 7,h jr z,itof2 itof3: ld b,h ld c,l ld de,0 ld h,d ld l,a ex af,af' ret nz res 7,b ret ; ;rr=0 ; setz: xor a ld l,a ld h,a ld e,a ld d,a ld c,a ld b,a ret ; ;shift rr to right ; shftrc: or a shftr: rr b rr c rr d rr e rr h ret ; shftlc: or a shftl: rl h rl e rl d rl c rl b ret ; ;addition rr=rr+rr' ; fadd: ld a,h exx add a,h exx ld h,a ld a,e exx adc a,e exx ld e,a ld a,d exx adc a,d exx ld d,a ld a,c exx adc a,c exx ld c,a ld a,b exx adc a,b exx ld b,a ret ; ;substitution rr=rr-rr' ; fsub: ld a,h exx sub h exx ld h,a ld a,e exx sbc a,e exx ld e,a ld a,d exx sbc a,d exx ld d,a ld a,c exx sbc a,c exx ld c,a ld a,b exx sbc a,b exx ld b,a ret ; ;compare rr & rr' ; fcomp: ld a,b exx cp b exx ret nz ld a,c exx cp c exx ret nz ld a,d exx cp d exx ret nz ld a,e exx cp e exx ret nz ld a,h exx cp h exx ret ; ;set param. to fmult & fdiv ; setprm: jr c,sprm2 add a,80h jr c,sprm3 sprm1: pop hl ret c jp setz sprm2: add a,80h jr c,sprm1 sprm3: ld l,a ex (sp),ix exx push hl push bc ld a,b set 7,b exx xor b and 80h push af set 7,b push ix ld ix,0 ret ; ;multiply rr=rr*rr' ; fmult: exx ld a,l or a exx jp z,setz ld a,l or a ret z exx add a,l exx call setprm push bc push de push hl add ix,sp call setz exx ld l,5 exx mlt1: ld a,8 inc ix ld l,(ix) mlt2: ex af,af' rr l jr nc,mlt3 call fadd mlt3: call shftr ex af,af' dec a jr nz,mlt2 exx dec l exx jr nz,mlt1 ld l,(ix+0FBh) bit 7,b jr nz,mlt4 ex af,af' call shftl inc l dec l jr z,mlt4 dec l mlt4: pop af pop af pop af mext1: or a mext2: ex af,af' pop af exx pop bc pop hl exx pop ix res 7,b or b ld b,a inc l dec l call z,setz ex af,af' ret ; ;division rr=rr/rr' ; fdiv: ld a,l or a ret z exx sub l exx ccf call setprm push hl push hl push hl add ix,sp exx ld l,5 exx ld a,8 dv1: ex af,af' call fcomp jr c,dv2 call fsub dv2: ccf rl l ex af,af' dec a jr nz,dv3 ld (ix+5),l dec ix exx dec l exx jr z,dv4 ld a,8 dv3: call shftlc jr nc,dv1 ex af,af' call fsub or a jr dv2 dv4: call shftlc jr c,dv5 call fcomp ccf dv5: pop hl pop de pop bc bit 7,b jr nz,dv6 call shftl jr mext1 dv6: inc l jr nz,mext1 scf jr mext2 ; ;mult or div at 10^((A)*4) ; shfdec: push af or a jp p,shd1 neg shd1: push af srl a srl a inc a ld hl,0FFFAh ld de,6 shd2: add hl,de dec a jr nz,shd2 ex de,hl ld hl,decbuf add hl,de call ?loadf pop af and 3 jr z,shd4 shd3: push af call decmlt pop af dec a jr nz,shd3 shd4: pop af or a jp p,fmult exx jp fdiv ; .radix 16 decbuf: db 81,0,0,0,0,0 db 8E,0,0,0,40,1C db 9B,0,0,20,0BC,3E db 0A8,0,10,0A5,0D4,68 db 0B6,4,0BF,0C9,1B,0E db 0C3,0AC,0C5,0EB,78,2D db 0D0,0CD,0CE,1B,0C2,53 db 0DE,0F9,78,39,3F,1 db 0EB,2B,0A8,0AD,0C5,1D db 0F8,0C9,7B,0CE,97,40 .radix 10 ; ;multiply rr=rr*10 ; decmlt: ld a,l or a ret z set 7,b push bc push de ld a,h call shftrc call shftrc add a,h ld h,a ex (sp),hl adc hl,de ex de,hl pop hl ex (sp),hl adc hl,bc ld b,h ld c,l pop hl jr nc,dcm1 call shftr inc l scf ret z dcm1: ld a,l add a,3 ld l,a res 7,b ret ; upcase: cp 61h ret c cp 7Bh ret nc sub 20h ret ; btonum: ld a,(ix) tonum: sub 30h ccf ret nc cp 0Ah ret ; ;get number in text and set to rr ; ?atof: xor a ex af,af' atof2: ld a,(ix) cp '+' jr z,atof1 cp '-' jr nz,atof3 ex af,af' cpl ex af,af' atof1: inc ix jr atof2 atof3: ex af,af' push af call atof4 jr c,atof5 pop af and a ret z set 7,b ret ; atof5: pop af scf ret ; atof4: exx ld bc,0 exx call setz atf1: ld a,(ix) call upcase cp '.' jr nz,atf3 exx bit 6,b scf ret nz set 6,b exx atf2: inc ix jr atf1 atf3: cp 'E' jr z,atf5 call tonum jr nc,atf10 ex af,af' call decmlt ret c ex af,af' exx push bc ld l,a ld h,0 call ?itof call ?add exx pop bc ret c bit 6,b jr z,atf4 dec c atf4: exx jr atf2 atf5: call atf10 ret c exx set 4,b inc ix ld a,(ix) cp '+' jr z,atf6 cp '-' jr nz,atf7 set 5,b atf6: inc ix atf7: call btonum ccf ret c ld c,a inc ix call btonum jr nc,atf8 inc ix ld d,a ld a,c add a,a add a,a add a,c add a,a add a,d ld c,a atf8: bit 5,b jr z,atf9 ld a,c neg ld c,a atf9: exx atf10: exx ld a,c add a,80h cp 'Z' ret c cp 0A6h ccf ret c push bc push ix ld a,c call shfdec pop ix exx pop bc exx ret ; form: xor a scf bit 7,h ret nz ld a,h or a ld a,l ret z ld a,0FFh ret ; intrbuf:ds 15 ; mult16: ld c,e ld b,d ex de,hl ld hl,0 ld a,d or a ld a,16 jr nz,mlt16_1 ld d,e ld a,8 mlt16_1:add hl,hl ex de,hl add hl,hl ex de,hl jr nc,mlt16_2 add hl,bc mlt16_2:dec a jr nz,mlt16_1 ret ; setnum: push iy inc l dec l jr nz,snum2 ld b,12 snum1: ld (iy),'0' inc iy djnz snum1 xor a jp snum8 snum2: push bc res 7,b ld a,l exx sub 80h ld l,a sbc a,a ld h,a ld de,04Dh call mult16 ld de,5 add hl,de ld a,h cp 0D9h jr nz,snum3 inc a snum3: ld (iy),a neg call shfdec ld a,l cp 81h jr nc,snum4 call decmlt dec (iy) snum4: set 7,b ld a,84h sub l ld l,0 jr z,snum6 snum5: call shftrc rr l dec a jr nz,snum5 snum6: ld a,(iy) push af ld a,12 snum7: ex af,af' ld a,b rra rra rra rra and 0Fh add a,30h ld (iy),a inc iy ld a,b and 0Fh ld b,a push bc push de push hl sla l call shftl sla l call shftl ex de,hl ex (sp),hl add hl,de pop de ex (sp),hl adc hl,de ex de,hl pop hl ex (sp),hl adc hl,bc ld b,h ld c,l pop hl sla l call shftl ex af,af' dec a jr nz,snum7 pop af pop bc snum8: pop iy ret ; corr: push iy pop hl ld e,a ld d,0 add hl,de ld a,(hl) ld (hl),0 cp '5' ret c corr1: dec e jp m,corr2 dec hl ld a,(hl) inc a ld (hl),a cp 3Ah ret c ld (hl),0 jr corr1 corr2: ld (hl),'1' inc hl ld (hl),0 inc c ret ; ;get real in rr' & put to txt (ix) ;(de) number of position ;(hl) position atfer colon ; ?ftoa: call form ex de,hl ld e,0 jr c,fta1 cp 25 jr c,fta5 fta1: dec e call form exx bit 7,b exx ld d,7 jr z,fta2 inc d fta2: sub d jr nc,fta3 xor a fta3: cp 9 jr c,fta4 ld a,9 fta4: inc a fta5: ld d,a push de exx ld iy,intrbuf push ix call setnum pop ix pop de ld c,a ld a,d inc a bit 7,e jr nz,fta7 add a,c jp p,fta6 ld (iy),0 jr fta8 fta6: cp 12 jr c,fta7 ld a,11 fta7: push de call corr pop de fta8: bit 7,b jr z,fta9 ld a,'-' call fta20 fta9: bit 7,e jr z,fta10 ld h,c ld c,0 fta10: bit 7,c jr z,fta11 call fta19 jr fta12 fta11: call fta18 dec c jp p,fta11 fta12: ld a,d or a jr z,fta15 ld a,'.' call fta20 fta13: inc c jr z,fta14 call fta19 dec d jr nz,fta13 fta14: dec d jp m,fta15 call fta18 jr fta14 fta15: bit 7,e ret z ld a,'E' call fta20 ld a,'+' bit 7,h jr z,fta16 ld a,h neg ld h,a ld a,'-' fta16: call fta20 ld a,h ld b,2Fh fta17: inc b sub 10 jr nc,fta17 add a,3Ah ld (ix),b inc ix jr fta20 fta18: ld a,(iy) inc iy or a jr nz,fta20 dec iy fta19: ld a,'0' fta20: ld (ix),a inc ix ret ; add1: exx bit 7,b exx jp nz,?subext ?addext:exx ld a,l or a exx ret z exx push bc push de push hl exx ld a,l or a jr nz,add2 exx res 7,b jr add12 add2: push bc set 7,b xor a ex af,af' exx set 7,b ld a,l exx sub l jr z,add4 jr nc,add3 neg ex af,af' dec a ex af,af' exx add3: call shftrc inc l dec a jr nz,add3 ex af,af' jr z,add4 exx add4: pop af and 80h jr nz,add5 call fadd jr nc,add10 call shftr or a inc l jr nz,add10 scf jr add12 add5: call fcomp ccf push af jr z,add8 jr c,add6 exx add6: call fsub add7: bit 7,b jr nz,add9 call shftlc dec l jr nz,add7 add8: call setz add9: pop af add10: jr c,add11 res 7,b add11: or a add12: exx pop hl pop de pop bc exx ret ; sub1: exx bit 7,b exx jp nz,?addext ?subext:call sub2 call ?addext ret c sub2: inc l dec l ret z ld a,b xor 80h ld b,a ret ; ?add: call add1 ld a,0 return: ret nc ld a,1 reterr: scf ret ; ?sub: call sub1 jr return ; ?mult: call fmult jr return ; ?div: exx ld a,l or a exx ld a,2 jr z,reterr call fdiv jr return ; ?int: ld a,l sub 81h jp c,setz inc a cp 28h jr nc,int2 exx push bc push de push hl ex af,af' call setz ex af,af' int1: scf call shftr dec a jr nz,int1 exx ld a,h exx and h exx ld h,a ld a,e exx and e exx ld e,a ld a,d exx and d exx ld d,a ld a,c exx and c exx ld c,a ld a,b exx and b exx ld b,a xor a jp add12 int2: ld a,5 scf ret ; copy: push bc push de push hl exx pop hl pop de pop bc ret ; ?sqrt: ld a,l or a ret z bit 7,b ld a,3 jp nz,reterr call copy ld a,l add a,80h sra a add a,80h ld l,a sub 014h push af exx sqrt1: push bc push de push hl call fdiv call add1 dec l push bc push de push hl call sub1 ld a,l pop hl pop de pop bc exx pop hl pop de pop bc ex (sp),hl cp h ex (sp),hl jr nc,sqrt1 pop af exx ret ; ?comp: exx ld a,b exx xor b jp p,comp1 ld a,b rla ret comp1: bit 7,b jr z,comp3 call comp3 ret z ccf ret comp3: ld a,l exx cp l exx ret nz or a ret z jp fcomp ; un_int: exx push bc push de push hl exx call copy exx call ?int exx call sub1 jp add12 ; loadpi: ld bc,0490Fh ld de,0DAA2h ld hl,02182h ret ; set1: ld hl,81h ld b,h ld c,h ld d,h ld e,h ret ; ldix: ld de,6 add ix,de ldix1: ld l,(ix) ld h,(ix+1) ld e,(ix+2) ld d,(ix+3) ld c,(ix+4) ld b,(ix+5) ret ; cmlt: push bc push de push hl push af call copy call fmult pop af call cmlt1 exx pop hl pop de pop bc jp fmult ; cmlt1: push af exx call ldix jr cmlt3 cmlt2: push af exx push bc push de push hl call ldix call add1 exx pop hl pop de pop bc exx cmlt3: call fmult pop af dec a jr nz,cmlt2 exx call set1 jp add1 ; ?cos: exx call loadpi dec l call sub1 ?sin: exx call loadpi inc l exx ld a,l cp 6Ch ret c push bc res 7,b call ?comp pop bc jr c,sin1 call fdiv call un_int call fmult sin1: bit 7,b jr z,sin2 call add1 sin2: exx dec l exx call ?comp push af jr c,sin3 call sub1 sin3: exx dec l exx call ?comp jr c,sin4 exx inc l call sub1 sin4: ld a,l cp 6Ch jr c,sin5 exx ld bc,02AAAh ld de,0AAAAh ld hl,0AA7Fh call fmult push ix ld ix,sinbuf-6 ld a,5 call cmlt pop ix call copy call fmult call fmult push bc push de push hl exx call copy dec l dec l exx dec l call add1 exx pop hl pop de pop bc exx call sub1 inc l inc l sin5: pop af inc l dec l ret z ret c ld a,b xor 080h ld b,a ret ; .radix 16 sinbuf: db 67,0AA,03F,2B,32,0D7 db 6E,0B6,2A,1D,0EF,38 db 74,0D,0D0,0,0D,0D0 db 7A,88,88,88,88,08,7E db 0AB,0AA,0AA,0AA,0AA .radix 10 ; ldnum1: ld bc,03504h ld de,0F333h ld hl,0FA81h ret ; ldnum2: ld bc,03172h ld de,017F7h ld hl,0D280h ret ; ?ln: inc l dec l ld a,04 jp z,reterr bit 7,b jp nz,reterr exx call ldnum1 exx ld a,l ld l,81h sub l push af call fdiv exx call set1 exx call sub1 push bc push de push hl exx inc l call add1 exx pop hl pop de pop bc call fdiv push ix ld ix,lnbuf-6 ld a,6 call cmlt pop ix inc l exx call ldnum2 dec l exx call add1 pop af push bc push de push hl ld l,a ld h,0 jr nc,ln1 dec h ln1: call ?itof exx inc l call fmult exx pop hl pop de pop bc call add1 ld a,l cp 67h jp c,setz ret ; .radix 16 lnbuf: db 7D,8A,9D,0D8,89,1D db 7D,0E9,0A2,8B,2E,3A db 7D,8E,0E3,38,8E,63 db 7E,49,92,24,49,12 db 7E,0CD,0CC,0CC,0CC,4C db 7F,0AB,0AA,0AA,0AA,2A .radix 10 ; ?round: bit 7,b exx call set1 jr z,round1 set 7,b round1: dec l call add1 ?trunc: or a bit 7,l jr z,trc3 bit 7,b ex af,af' set 7,b trc1: ld a,08Fh cp l jr c,trc4 jr z,trc2 call shftrc inc l jr trc1 trc2: call shftrc ex af,af' ld h,b ld l,c ret z ld a,h cpl ld h,a ld a,l cpl ld l,a inc hl ret trc3: ld hl,0 ret trc4: ld a,5 jp reterr ; ; ?exp: exx call ldnum2 exx or a bit 7,b push af res 7,b call fdiv ld a,l cp 88h jr nc,exp3 push bc push de push hl inc l call ?round push hl srl h rr l ld a,l pop hl push af call ?itof inc l dec l jr z,exp1 dec l exp1: exx pop af pop hl pop de pop bc push af call sub1 push ix ld ix,expbuf-6 ld a,8 call cmlt1 pop ix pop af jr nc,exp2 push af exx call ldnum1 exx call fmult pop af exp2: add a,l ld l,a jr c,exp3 pop af ret z exx call set1 jp fdiv exp3: pop hl ld a,1 jp reterr ; .radix 16 expbuf: db 6D,2E,1D,11,60,31 db 70,46,2C,0FE,0E5,7F db 74,36,7C,89,84,21 db 77,53,3C,0FF,0C3,02E db 7A,0D2,7D,5B,95,1D db 7C,25,0B8,46,58,63 db 7E,16,0FC,0EF,0FD,75 db 80,0D2,0F7,17,72,31 .radix 10 ; acmlt: ld ix,atnbuf2-6 ld a,5 jp cmlt ; ?arctan:ld a,l or a ret z ld (savsp),sp push ix exx call set1 exx xor a bit 7,b jr z,atn1 inc a res 7,b atn1: push af call ?comp jp c,atn2 exx call fdiv jp c,atn_er pop af set 7,a push af atn2: exx ld bc,006CFh ld de,0E98Eh ld hl,04A7Eh exx call ?comp jr nc,atn3 call acmlt jr atn6 atn3: ld ix,atnbuf1-12h ld a,2 atn4: ex af,af' exx ld de,12h add ix,de call ldix1 exx call ?comp jr c,atn5 ex af,af' dec a jr nz,atn4 exx ld de,0Ch add ix,de exx atn5: exx call ldix set 7,b call add1 push bc push de push hl call ldix1 call fmult jr c,atn_er exx call set1 call add1 exx pop hl pop de pop bc call fdiv jr c,atn_er push ix call acmlt pop ix exx call ldix call add1 atn6: pop af rla jr nc,atn8 atn7: push af exx call loadpi dec l call sub1 pop af atn8: pop ix bit 1,a ret z set 7,b ret ; savsp: dw 0 ; atn_er: ld sp,(savsp) ld a,7 scf ret ; .radix 16 atnbuf1:db 7F,0E7,0CF,0CC,13,54 db 7F,0F6,0F4,0A2,30,9 db 7F,6A,0C1,91,0A,6 db 80,0B5,9E,8A,6F,44 db 80,82,2C,3A,0CD,13 db 80,6A,0C1,91,0A,6 db 81,0,0,0,0,0 db 80,21,0A2,0DA,0F,49 ; atnbuf2:db 7D,0E8,0A2,8B,2E,0BA db 7D,8E,0E3,38,8E,63 db 7E,49,92,24,49,92 db 7E,0CD,0CC,0CC,0CC,4C db 7F,0AB,0AA,0AA,0AA,0AA .radix 10 ; ; end -----------------------------------------------------------------

Всего 1 фpагмент(а/ов) |пpедыдущий фpагмент (1)

Если вы хотите дополнить FAQ - пожалуйста пишите.

design/collection/some content by Frog,
DEMO DESIGN FAQ (C) Realm Of Illusion 1994-2000,
При перепечатке материалов этой страницы пожалуйста ссылайтесь на источник: "DEMO.DESIGN FAQ, http://www.enlight.ru/demo/faq".