
;---;  numbers.r  ;------------------------------------------------------------
*
*	****	NUMBER IN & OUTPUT ROUTINES    ****
*
*	Author		Stefan Walter
*	Version		1.01
*	Last Revision	25.06.93
*	Identifier	nio_defined
*	Prefix		nio_	(number in out)
*				 ¯      ¯  ¯
*	Macros		GetHexNumber_, GetDecNumber_
*
;------------------------------------------------------------------------------

;------------------
	ifnd	nio_defined
nio_defined	=1

;------------------
nio_oldbase	equ __base
	base	nio_base
nio_base:

;------------------

;------------------------------------------------------------------------------
*
* GetHexNumber_		Try to get a hexadecimal number. "$" and C-style "0x"
*			introducers supported
*
* INPUT:	a0	String to interprete.
*
* RESULT:	d0	Result.
*		d1	0 if error, -1 if okay.
*		ccr	On d1.
*
;------------------------------------------------------------------------------

;------------------
; Macro
;
GetHexNumber_	macro
	ifd	nio_GetHexNumber
		bsr	nio_GetHexNumber
	else
		pea	.nio_end1(pc)

;------------------
; Remove spaces first
;
nio_GetHexNumber	=	*
	move.l	d2,-(sp)

.sloop:	cmp.b	#" ",(a0)+
	beq.s	.sloop
	tst.b	-(a0)
	beq.s	.error
	cmp.b	#$a,(a0)
	beq.s	.error
	cmp.b	#"0",(a0)+
	bne.s	.dol
	move.b	(a0)+,d0
	and.b	#$df,d0
	cmp.b	#"X",d0
	beq.s	.nowcomesnumber
	subq.l	#1,a0
.dol:	cmp.b	#"$",-(a0)
	bne.s	.nowcomesnumber
	addq.l	#1,a0

.nowcomesnumber:
	moveq	#0,d0
.numberloop:
	move.b	(a0)+,d2
	move.b	d2,d1
	beq.s	.done
	cmp.b	#" ",d2
	beq.s	.done
	cmp.b	#$a,d2
	beq.s	.done
	sub.b	#"0",d2
	blt.s	.error
	cmp.b	#10,d2
	blt.s	.okay
	move.b	d1,d2
	and.b	#$df,d2
	sub.b	#"A",d2
	blt.s	.error
	cmp.b	#5,d2
	bhi.s	.error
	add.b	#10,d2

.okay:	lsl.l	#4,d0
	or.b	d2,d0
	bra.s	.numberloop

.error:	move.l	(sp)+,d2
	moveq	#0,d1
	rts

.done:	move.l	(sp)+,d2
	moveq	#-1,d1
	rts


;------------------
; End of macro.
;
.nio_end1:
	endif
	endm

;------------------

;------------------------------------------------------------------------------
*
* GetDecNumber_		Try to get a decimal number.
*
* INPUT:	a0	String to interprete.
*
* RESULT:	d0	Result.
*		d1	0 if error, -1 if okay.
*		ccr	On d1.
*
;------------------------------------------------------------------------------

;------------------
; Macro
;
GetDecNumber_	macro
	ifd	nio_GetDecNumber
		bsr	nio_GetDecNumber
	else
		pea	.nio_end2(pc)

;------------------
; Remove spaces first
;
nio_GetDecNumber	=	*
	movem.l	d2/d3,-(sp)

.sloopd:	cmp.b	#" ",(a0)+
	beq.s	.sloopd
	tst.b	-(a0)
	beq.s	.errord
	cmp.b	#$a,(a0)
	beq.s	.errord

.nowcomesnumberd:
	moveq	#0,d0
.numberloopd:
	moveq	#0,d2
	move.b	(a0)+,d2
	move.b	d2,d1
	beq.s	.doned
	cmp.b	#" ",d2
	beq.s	.doned
	cmp.b	#$a,d2
	beq.s	.doned

	move.l	d0,d3
	lsl.l	#3,d0			;
	add.l	d3,d0			;
	add.l	d3,d0			; d0*10
	sub.b	#"0",d2
	blt.s	.errord
	cmp.b	#10,d2
	bhs.s	.errord
	add.l	d2,d0
	bra.s	.numberloopd

.errord:moveq	#0,d1
.exitd:	movem.l	(sp)+,d2/d3
	rts

.doned:	moveq	#-1,d1
	bra.s	.exitd


;------------------
; End of macro.
;
.nio_end2:
	endif
	endm

;------------------

;--------------------------------------------------------------------

;------------------
	base	nio_oldbase

;------------------
	endif

	end

