281 lines
3.1 KiB
ArmAsm
281 lines
3.1 KiB
ArmAsm
.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
|