Files
Z8C-Homebrew-Computer/OperatingSystem/monitor_v2/include/conversions.s
Dennis Gunia bc1b9a399d Updated
2022-12-16 20:45:34 +01:00

90 lines
2.0 KiB
ArmAsm

; HL Contains Address to string
; E is 0xFF if error
; E is 0x00 if okay
; A returns byte
; A,DE are destroyed
DHEX_TO_BYTE:
PUSH HL ;Backup pointer
; Load First Byte
LD A,(HL) ;Load first char (high)
CALL HEX_TO_BIN ;Conv chart to 4bit
jr C, DHEX_TO_BYTE_FAILED ;If error jmp to DHEX_TO_BYTE_FAILED
SLA A ;shift result to upper 4 bits
SLA A
SLA A
SLA A
LD D,A ;store result in D
INC HL ;next byte
LD A,(HL) ;load 2nd char (lower)
CALL HEX_TO_BIN ;Conv chart to 4bit
jr C, DHEX_TO_BYTE_FAILED ;If error jmp to DHEX_TO_BYTE_FAILED
OR D ;merge D with accumulator
POP HL ;restor original pointer
LD E,0x00 ;set error to 0x00 = no error
RET
DHEX_TO_BYTE_FAILED:
LD E,0xFF ;set error to oxFF
;LD A,0x00
POP HL
RET
; REG A Contains CHAR-Low
; If failed, Carry is set
HEX_TO_BIN:
SUB 48 ; 0 is 0
jp PE, HEX_TO_INVALID_2; to low (SUB overflow)
CP 10 ; Value is between 0 and 9
JR C, HEX_TO_BIN_2
SUB 7
jp PE, HEX_TO_INVALID_2; to low (SUB overflow)
HEX_TO_BIN_2:
CP 16
JR NC, HEX_TO_INVALID_2; if bigger than 15-> fail
AND 0x0F
RET
HEX_TO_INVALID_2:
SCF ;set carry flag
RET
;*****************
; Convert Byte to Hex Char (ASCII)
;*****************
;Description: the StrLength function inline
;
;Inputs: A contains input byte
;
;Outputs: BC contains 2 Bytes of ASCII (HEX)
;
;Destroys: A, BC,
STRCONV_BYTES_TO_HEX:
PUSH AF;Backup A Register
RRA
RRA
RRA
RRA
CALL STRCONV_BYTES_TO_HEX_1
;LD A,D
LD B,A
POP AF ; Reload first Byte
CALL STRCONV_BYTES_TO_HEX_1
;LD A,D
LD C,A
RET
STRCONV_BYTES_TO_HEX_1:
AND 0x0F
ADD 48
CP 58 ; Check if less than 58 (less than ASCII 9)
;JR C, STRCONV_BYTES_TO_HEX_2
RET C
ADD 7 ; A-F
RET
STRCONV_BYTES_TO_HEX_2:
;LD D,A
RET