Initial revision
This commit is contained in:
280
mach/z80/int/atof.s
Normal file
280
mach/z80/int/atof.s
Normal file
@@ -0,0 +1,280 @@
|
||||
.data
|
||||
! Set of variables
|
||||
|
||||
big: .byte 0
|
||||
.byte 0
|
||||
.byte 0x40
|
||||
.byte 24 ! 2^23
|
||||
negfrac:.space 1
|
||||
negexp: .space 1
|
||||
begzero:
|
||||
nd: .space 2
|
||||
fl: .space 6
|
||||
exp=fl+4
|
||||
eexp: .space 2
|
||||
flexp: .space 4
|
||||
exp5: .space 4
|
||||
endzero:
|
||||
ten: .byte 0
|
||||
.byte 0
|
||||
.byte 0x50
|
||||
.byte 4 ! 10
|
||||
dig: .byte 0
|
||||
.byte 0
|
||||
fildig: .byte 0 ! here a number from 0 to 31 will be converted flt.
|
||||
.byte 7
|
||||
bexp: .space 2
|
||||
|
||||
.text
|
||||
atof: ! entry with stringpointer in hl
|
||||
! exit with pointer to float in hl
|
||||
push ix
|
||||
push iy
|
||||
push bc
|
||||
push de
|
||||
push af
|
||||
ld b,1
|
||||
1:
|
||||
ld a,(hl)
|
||||
inc hl
|
||||
cp ' '
|
||||
jr z,1b
|
||||
cp '-'
|
||||
jr nz,1f
|
||||
ld b,-1
|
||||
jr 2f
|
||||
1: cp '+'
|
||||
jr z,2f
|
||||
dec hl
|
||||
2: ld a,b
|
||||
ld (negfrac),a
|
||||
xor a
|
||||
ld de,begzero
|
||||
ld b,endzero-begzero
|
||||
1: ld (de),a
|
||||
inc de
|
||||
djnz 1b
|
||||
1: ld a,(hl)
|
||||
inc hl
|
||||
sub '0'
|
||||
jr c,1f
|
||||
cp 10
|
||||
jr nc,1f
|
||||
ld (fildig),a
|
||||
call cmpbigfl
|
||||
jr z,2f
|
||||
call mulandadd
|
||||
jr 3f
|
||||
2: ld de,(exp)
|
||||
inc de
|
||||
ld (exp),de
|
||||
3: ld de,(nd)
|
||||
inc de
|
||||
ld (nd),de
|
||||
jr 1b
|
||||
1: cp '.'-'0'
|
||||
jr nz,4f
|
||||
1: ld a,(hl)
|
||||
inc hl
|
||||
sub '0'
|
||||
jr c,4f
|
||||
cp 10
|
||||
jr nc,4f
|
||||
ld (fildig),a
|
||||
call cmpbigfl
|
||||
jr z,2f
|
||||
call mulandadd
|
||||
ld de,(exp)
|
||||
dec de
|
||||
ld (exp),de
|
||||
2: ld de,(nd)
|
||||
inc de
|
||||
ld (nd),de
|
||||
jr 1b
|
||||
4:
|
||||
ld b,1
|
||||
cp 'E'-'0'
|
||||
jr z,1f
|
||||
cp 'e'-'0'
|
||||
jr nz,5f
|
||||
1: ld a,(hl)
|
||||
inc hl
|
||||
cp '+'
|
||||
jr z,1f
|
||||
cp '-'
|
||||
jr nz,2f
|
||||
ld b,-1
|
||||
jr 1f
|
||||
2: dec hl
|
||||
1: ld a,b
|
||||
ld (negexp),a
|
||||
exx
|
||||
xor a
|
||||
ld h,a
|
||||
ld l,a
|
||||
ld b,a
|
||||
ld d,a
|
||||
ld e,a
|
||||
exx
|
||||
1: ld a,(hl)
|
||||
inc hl
|
||||
sub '0'
|
||||
jr c,1f
|
||||
cp 10
|
||||
jr nc,1f
|
||||
exx
|
||||
ld c,a
|
||||
add hl,hl
|
||||
add hl,hl
|
||||
add hl,de
|
||||
add hl,hl
|
||||
add hl,bc
|
||||
ld d,h
|
||||
ld e,l
|
||||
exx
|
||||
jr 1b
|
||||
1: exx
|
||||
ld hl,negexp
|
||||
or a
|
||||
bit 7,(hl)
|
||||
ld hl,(exp)
|
||||
jr z,1f
|
||||
sbc hl,de
|
||||
jr 2f
|
||||
1: add hl,de
|
||||
2: ld (exp),hl
|
||||
exx
|
||||
5: ld a,1
|
||||
ld de,(exp)
|
||||
push de
|
||||
bit 7,d
|
||||
jr z,1f
|
||||
neg
|
||||
ld hl,0
|
||||
or a
|
||||
sbc hl,de
|
||||
ex de,hl
|
||||
1: ld (negexp),a
|
||||
ld (exp),de
|
||||
pop de
|
||||
ld hl,(nd)
|
||||
add hl,de
|
||||
ld de,-33 ! -LOGHUGE ?
|
||||
xor a
|
||||
sbc hl,de
|
||||
jp p,1f
|
||||
ld hl,fl
|
||||
ld b,6
|
||||
2: ld (hl),a
|
||||
inc hl
|
||||
djnz 2b
|
||||
1: ld hl,0x0140 ! 1.0
|
||||
ld (flexp+2),hl
|
||||
ld hl,0x0350 ! 5.0
|
||||
ld (exp5+2),hl
|
||||
ld hl,(exp)
|
||||
ld (bexp),hl
|
||||
1: bit 0,l
|
||||
jr z,2f
|
||||
call xflt
|
||||
.word flexp,exp5,fpmult,4,flexp
|
||||
2: sra h
|
||||
rr l
|
||||
ld a,h
|
||||
or l
|
||||
jr z,3f
|
||||
call xflt
|
||||
.word exp5,exp5,fpmult,4,exp5
|
||||
jr 1b
|
||||
3: ld hl,negexp
|
||||
ld a,(bexp)
|
||||
bit 7,(hl)
|
||||
jr z,1f
|
||||
call xflt
|
||||
.word flexp,fl,fpdiv,4,fl
|
||||
neg
|
||||
jr 2f
|
||||
1: call xflt
|
||||
.word flexp,fl,fpmult,4,fl
|
||||
2: ld b,a
|
||||
ld a,(fl+3)
|
||||
add a,b
|
||||
ld (fl+3),a
|
||||
ld a,(negfrac)
|
||||
bit 7,a
|
||||
jr z,1f
|
||||
call xflt
|
||||
.word fl,fl,fpcomp,4,fl
|
||||
1: call xflt
|
||||
.word fl,fl,fpnorm,4,fl
|
||||
ld hl,fl
|
||||
pop af
|
||||
pop de
|
||||
pop bc
|
||||
pop iy
|
||||
pop ix
|
||||
ret
|
||||
|
||||
cmpbigfl:
|
||||
call xflt
|
||||
.word big,fl,fpcmf,0
|
||||
ld a,(fpac+1)
|
||||
bit 7,a
|
||||
ret
|
||||
mulandadd:
|
||||
call xflt
|
||||
.word fl,ten,fpmult,4,fl
|
||||
ld a,7
|
||||
ld (fildig+1),a
|
||||
call xflt
|
||||
.word dig,dig,fpnorm,4,dig
|
||||
call xflt
|
||||
.word fl,dig,fpadd,4,fl
|
||||
ret
|
||||
|
||||
xflt:
|
||||
ex (sp),iy
|
||||
push af
|
||||
push bc
|
||||
push de
|
||||
push hl
|
||||
ld h,(iy+1)
|
||||
ld l,(iy+0)
|
||||
ld de,fpac
|
||||
ld bc,4
|
||||
ldir
|
||||
ld h,(iy+3)
|
||||
ld l,(iy+2)
|
||||
ld de,fpop
|
||||
ld bc,4
|
||||
ldir
|
||||
push iy
|
||||
ld hl,1f
|
||||
push hl
|
||||
ld h,(iy+5)
|
||||
ld l,(iy+4)
|
||||
jp (hl)
|
||||
1: pop iy
|
||||
ld b,(iy+7)
|
||||
ld c,(iy+6)
|
||||
ld a,b
|
||||
or c
|
||||
jr z,1f
|
||||
inc iy
|
||||
inc iy
|
||||
ld hl,fpac
|
||||
ld d,(iy+7)
|
||||
ld e,(iy+6)
|
||||
ldir
|
||||
1: push iy
|
||||
pop hl
|
||||
ld de,8
|
||||
add hl,de
|
||||
push hl
|
||||
pop iy
|
||||
pop hl
|
||||
pop de
|
||||
pop bc
|
||||
pop af
|
||||
ex (sp),iy
|
||||
ret
|
||||
Reference in New Issue
Block a user