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
 |