rdos/src/scan.inc

64 lines
1.0 KiB
PHP
Raw Normal View History

2021-12-11 17:46:00 +01:00
; make a char uppercase
; IN al char
; OUT al char
; do nothing if >z
ucase cmp al, 0x7B
jnc .ret
; do nothing if <a
cmp al, 0x61
jc .ret
; do it!
sub al, 0x20
.ret ret
; read integer from ascii string
; default dec but allows 0x for hex
; bogus result if larger than 16 bit
; IN ds:si source string
; cx max number of chars
; OUT ax number
; ds:si first rejected char
; cx chars ignored
lodnum xor di, di
mov bx, 10
cmp cx, 2
jc .loop
; test for 0x prefix
mov ax, [si]
cmp al, 0x30
jne .loop
mov al, ah
call ucase
cmp al, 0x58
jne .loop
; apply 0x prefix
.hex add si, 2
sub cx, 2
mov bx, 0x10
; check if there are chars left
.loop test cx, cx
jnz .do
.ret mov ax, di
ret
.do mov al, [si]
call ucase
; check if in range
sub al, 0x30
jc .ret
cmp al, 0x10
jc .skip
sub al, 7
; must be smaller than base
; necessary to prevent hex digits in decimals
.skip mov ah, 0
cmp ax, bx
jnc .ret
; mark as read
inc si
dec cx
; add digit to number
xchg ax, di
mul bx
add di, ax
jmp .loop