;
; EVAL --
; On input, HL points to a string of ASCII binary, octal, decimal,
; or hexadecimal characters to convert to binary; this string may take
; any of the following forms --
;
; bbbbbbbbbbbbbbbbB -- b=0 or b=1; binary string
; ttttt or tttttD -- 0<= t <= 9; decimal string
; hhhhH or hhhhX -- 0<= h <= F; hexadecimal string
; oooooooO or oooooooQ -- 0<= o <=7; octal string
;
; On return, DE = value, HL points to next byte after
; string, A=E; BC is not affected.
; On return, CARRY Set means error, and HL pts to byte after error
;
EXT CAPS ; CAPITALIZATION ROUTINE
EXT EVAL16 ; CONVERT HEX STRING
EXT EVAL10 ; CONVERT DEC STRING
EXT EVAL8 ; CONVERT OCT STRING
EXT EVAL2 ; CONVERT BIN STRING
EVAL::
PUSH B ; SAVE BC
PUSH H ; SAVE PTR TO 1ST CHAR
XRA A ; A=0
STA CFLAG ; SET CHARACTER FOUND FLAG TO NULL
; Find end of string
FEND:
MOV A,M ; GET BYTE
CALL CAPS ; CAPITALIZE
SUI '0' ; ASSUME HEX
JC FEDONE ; DONE
CPI 10 ; 0-9?
JC FECONT ; CONTINUE
SUI 7
CPI 16 ; A-F?
JNC FEDONE
; Digit found -- set flag and point to next
FECONT:
MVI A,1 ; GET A 1
STA CFLAG ; SET FLAG
INX H ; PT TO NEXT
JMP FEND
; Found end of string
FEDONE:
MOV A,M ; GET OFFENDING CHAR
CALL CAPS ; CAPITALIZE
MOV C,A
DCX H ; GET PREVIOUS CHAR (POSSIBLY BINARY OR DEC)
MOV A,M ; GET IT
CALL CAPS ; CAPITALIZE
MOV B,A
POP H ; RESTORE POINTER TO 1ST CHAR IN STRING
LXI D,0 ; SET ZERO VALUE (ERROR EXIT)
LDA CFLAG ; ANY CHARS?
JZ DONE ; DONE IF NONE
; Determine type of string (H,X=hex; O,Q=oct; B=bin; D,other=dec)
MOV A,C ; GET TERMINATING CHAR
CPI 'H' ; HEX
JZ EHEX
CPI 'X'
JZ EHEX
CPI 'O' ; OCTAL
JZ EOCT
CPI 'Q'
JZ EOCT
MOV A,B ; GET PREVIOUS CHAR FOR BINARY CHECK
CPI 'B' ; BINARY?
JZ EBIN
; Evaluate string as decimal
CALL EVAL10 ; EVALUATE AS DECIMAL
MOV A,M ; MAY PT TO D
CALL CAPS
CPI 'D' ; INCR HL IF SO
JNZ DONE
INX H ; PT TO NEXT
JMP DONE
; Evaluate string as hexadecimal
EHEX:
CALL EVAL16 ; EVAUATE AS HEXADECIMAL
MOV A,M ; MUST PT TO H OR X
CALL CAPS
INX H ; PT TO NEXT
CPI 'H'
JZ DONE
CPI 'X'
JZ DONE
; String Error -- set flag
ERROR:
MOV A,E ; LOW-ORDER IN A
STC ; SET CARRY FLAG FOR ERROR
POP B ; RESTORE BC
RET
; Evaluate string as octal
EOCT:
CALL EVAL8 ; EVALUATE AS OCTAL
MOV A,M ; MUST PT TO O OR Q
CALL CAPS
INX H ; PT TO NEXT
CPI 'O'
JZ DONE
CPI 'Q'
JZ DONE
JMP ERROR ; ERROR OTHERWISE
; Flag buffer
CFLAG: DS 1 ; 0 IF NO CHARS IN STRING, 1 OTHERWISE
; Evaluate string as binary
EBIN:
CALL EVAL2 ; EVALUATE AS BINARY
MOV A,M ; MUST PT TO B
CALL CAPS
INX H ; PT TO NEXT
CPI 'B'
JNZ ERROR
; Done with evaluation -- no error
DONE:
MOV A,E ; LOW-ORDER IN A
ORA A ; CLEAR CARRY FLAG
POP B ; RESTORE BC
RET