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