mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
339 lines
5.3 KiB
Z80 Assembly
339 lines
5.3 KiB
Z80 Assembly
;:::::::::::::::::::::::::::::::::::::::*****************************
|
||
; UTIL - Retro-Brew Utility Routines ***** Hardware-Specific *****
|
||
; *****************************
|
||
;
|
||
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||
;
|
||
CSEG ; Put the following areas in Code Segment (initialized RAM)
|
||
;
|
||
;==================================================================================================
|
||
; UTILITY FUNCTIONS
|
||
;==================================================================================================
|
||
;
|
||
;
|
||
CHR_CR EQU 0DH
|
||
CHR_LF EQU 0AH
|
||
CHR_BS EQU 08H
|
||
CHR_ESC EQU 1BH
|
||
;
|
||
;__________________________________________________________________________________________________
|
||
;
|
||
; UTILITY PROCS TO PRINT SINGLE CHARACTERS WITHOUT TRASHING ANY REGISTERS
|
||
;
|
||
PC_SPACE:
|
||
PUSH AF
|
||
LD A,' '
|
||
JR PC_PRTCHR
|
||
|
||
PC_PERIOD:
|
||
PUSH AF
|
||
LD A,'.'
|
||
JR PC_PRTCHR
|
||
|
||
PC_COLON:
|
||
PUSH AF
|
||
LD A,':'
|
||
JR PC_PRTCHR
|
||
|
||
PC_COMMA:
|
||
PUSH AF
|
||
LD A,','
|
||
JR PC_PRTCHR
|
||
|
||
PC_LBKT:
|
||
PUSH AF
|
||
LD A,'['
|
||
JR PC_PRTCHR
|
||
|
||
PC_RBKT:
|
||
PUSH AF
|
||
LD A,']'
|
||
JR PC_PRTCHR
|
||
|
||
PC_LT:
|
||
PUSH AF
|
||
LD A,'<'
|
||
JR PC_PRTCHR
|
||
|
||
PC_GT:
|
||
PUSH AF
|
||
LD A,'>'
|
||
JR PC_PRTCHR
|
||
|
||
PC_LPAREN:
|
||
PUSH AF
|
||
LD A,'('
|
||
JR PC_PRTCHR
|
||
|
||
PC_RPAREN:
|
||
PUSH AF
|
||
LD A,')'
|
||
JR PC_PRTCHR
|
||
|
||
PC_ASTERISK:
|
||
PUSH AF
|
||
LD A,'*'
|
||
JR PC_PRTCHR
|
||
|
||
PC_CR:
|
||
PUSH AF
|
||
LD A,CHR_CR
|
||
JR PC_PRTCHR
|
||
|
||
PC_LF:
|
||
PUSH AF
|
||
LD A,CHR_LF
|
||
JR PC_PRTCHR
|
||
|
||
PC_PRTCHR:
|
||
CALL COUT
|
||
POP AF
|
||
RET
|
||
|
||
NEWLINE2:
|
||
CALL NEWLINE
|
||
NEWLINE:
|
||
CALL PC_CR
|
||
CALL PC_LF
|
||
RET
|
||
;
|
||
; PRINT A CHARACTER REFERENCED BY POINTER AT TOP OF STACK
|
||
; USAGE:
|
||
; CALL PRTCH
|
||
; DB 'X'
|
||
;
|
||
PRTCH:
|
||
EX (SP),HL
|
||
PUSH AF
|
||
LD A,(HL)
|
||
CALL COUT
|
||
POP AF
|
||
INC HL
|
||
EX (SP),HL
|
||
RET
|
||
;
|
||
; PRINT A STRING AT ADDRESS SPECIFIED IN HL
|
||
; STRING MUST BE TERMINATED BY '$'
|
||
; USAGE:
|
||
; LD HL,MYSTR
|
||
; CALL PRTSTR
|
||
; ...
|
||
; MYSTR: DB "HELLO$"
|
||
;
|
||
PRTSTR:
|
||
LD A,(HL)
|
||
INC HL
|
||
CP '$'
|
||
RET Z
|
||
CALL COUT
|
||
JR PRTSTR
|
||
;
|
||
; PRINT A STRING DIRECT: REFERENCED BY POINTER AT TOP OF STACK
|
||
; STRING MUST BE TERMINATED BY '$'
|
||
; USAGE:
|
||
; CALL PRTSTR
|
||
; DB "HELLO$"
|
||
; ...
|
||
;
|
||
PRTSTRD:
|
||
EX (SP),HL
|
||
PUSH AF
|
||
CALL PRTSTR
|
||
POP AF
|
||
EX (SP),HL
|
||
RET
|
||
;
|
||
; PRINT A STRING INDIRECT: REFERENCED BY INDIRECT POINTER AT TOP OF STACK
|
||
; STRING MUST BE TERMINATED BY '$'
|
||
; USAGE:
|
||
; CALL PRTSTRI(MYSTRING)
|
||
; MYSTRING DB "HELLO$"
|
||
;
|
||
PRTSTRI:
|
||
EX (SP),HL
|
||
PUSH AF
|
||
LD A,(HL)
|
||
INC HL
|
||
PUSH HL
|
||
LD H,(HL)
|
||
LD L,A
|
||
CALL PRTSTR
|
||
POP HL
|
||
INC HL
|
||
POP AF
|
||
EX (SP),HL
|
||
RET
|
||
;
|
||
; PRINT THE HEX BYTE VALUE IN A
|
||
;
|
||
PRTHEXBYTE:
|
||
PUSH AF
|
||
PUSH DE
|
||
CALL HEXASCII
|
||
LD A,D
|
||
CALL COUT
|
||
LD A,E
|
||
CALL COUT
|
||
POP DE
|
||
POP AF
|
||
RET
|
||
;
|
||
; PRINT THE HEX WORD VALUE IN BC
|
||
;
|
||
PRTHEXWORD:
|
||
PUSH AF
|
||
LD A,B
|
||
CALL PRTHEXBYTE
|
||
LD A,C
|
||
CALL PRTHEXBYTE
|
||
POP AF
|
||
RET
|
||
;
|
||
; CONVERT BINARY VALUE IN A TO ASCII HEX CHARACTERS IN DE
|
||
;
|
||
HEXASCII:
|
||
LD D,A
|
||
CALL HEXCONV
|
||
LD E,A
|
||
LD A,D
|
||
RLCA
|
||
RLCA
|
||
RLCA
|
||
RLCA
|
||
CALL HEXCONV
|
||
LD D,A
|
||
RET
|
||
;
|
||
; CONVERT LOW NIBBLE OF A TO ASCII HEX
|
||
;
|
||
HEXCONV:
|
||
AND 0FH ;LOW NIBBLE ONLY
|
||
ADD A,90H
|
||
DAA
|
||
ADC A,40H
|
||
DAA
|
||
RET
|
||
;
|
||
; PRINT A BYTE BUFFER IN HEX POINTED TO BY DE
|
||
; REGISTER A HAS SIZE OF BUFFER
|
||
;
|
||
PRTHEXBUF:
|
||
CP 0 ; EMPTY BUFFER?
|
||
JP Z,PRTHEXBUF2
|
||
|
||
LD B,A
|
||
PRTHEXBUF1:
|
||
CALL PC_SPACE
|
||
LD A,(DE)
|
||
CALL PRTHEXBYTE
|
||
INC DE
|
||
DJNZ PRTHEXBUF1
|
||
JP PRTHEXBUFX
|
||
|
||
PRTHEXBUF2:
|
||
CALL PC_SPACE
|
||
LD DE,STR_EMPTY
|
||
CALL WRITESTR
|
||
|
||
PRTHEXBUFX:
|
||
RET
|
||
;
|
||
; OUTPUT A '$' TERMINATED STRING
|
||
;
|
||
WRITESTR:
|
||
PUSH AF
|
||
WRITESTR1:
|
||
LD A,(DE)
|
||
CP '$' ; TEST FOR STRING TERMINATOR
|
||
JP Z,WRITESTR2
|
||
CALL COUT
|
||
INC DE
|
||
JP WRITESTR1
|
||
WRITESTR2:
|
||
POP AF
|
||
RET
|
||
;
|
||
; PANIC: TRY TO DUMP MACHINE STATE AND HALT
|
||
;
|
||
PANIC:
|
||
PUSH HL
|
||
PUSH DE
|
||
PUSH BC
|
||
PUSH AF
|
||
LD DE,STR_PANIC
|
||
CALL WRITESTR
|
||
LD DE,STR_AF
|
||
CALL WRITESTR
|
||
POP BC ; AF
|
||
CALL PRTHEXWORD
|
||
LD DE,STR_BC
|
||
CALL WRITESTR
|
||
POP BC ; BC
|
||
CALL PRTHEXWORD
|
||
LD DE,STR_DE
|
||
CALL WRITESTR
|
||
POP BC ; DE
|
||
CALL PRTHEXWORD
|
||
LD DE,STR_HL
|
||
CALL WRITESTR
|
||
POP BC ; HL
|
||
CALL PRTHEXWORD
|
||
LD DE,STR_PC
|
||
CALL WRITESTR
|
||
POP BC ; PC
|
||
CALL PRTHEXWORD
|
||
LD DE,STR_SP
|
||
CALL WRITESTR
|
||
LD HL,0
|
||
ADD HL,SP ; SP
|
||
LD B,H
|
||
LD C,L
|
||
CALL PRTHEXWORD
|
||
|
||
;RST 38
|
||
|
||
HALT
|
||
|
||
JP 0
|
||
;
|
||
;==================================================================================================
|
||
; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED)
|
||
;==================================================================================================
|
||
;
|
||
; OUTPUT CHARACTER FROM A
|
||
COUT:
|
||
PUSH AF
|
||
PUSH BC
|
||
PUSH DE
|
||
PUSH HL
|
||
;LD C,A
|
||
;CALL CONOUT
|
||
LD E,A ; OUTPUT CHAR TO E
|
||
LD BC,0180H
|
||
CALL HBX_INVOKE
|
||
POP HL
|
||
POP DE
|
||
POP BC
|
||
POP AF
|
||
RET
|
||
;
|
||
STR_PANIC DB CR,LF,CR,LF,">>> FATAL ERROR:$"
|
||
STR_AF DB " AF=$"
|
||
STR_BC DB " BC=$"
|
||
STR_DE DB " DE=$"
|
||
STR_HL DB " HL=$"
|
||
STR_PC DB " PC=$"
|
||
STR_SP DB " SP=$"
|
||
;
|
||
;==================================================================================================
|
||
; DATA
|
||
;==================================================================================================
|
||
;
|
||
STR_EMPTY DEFB "<EMPTY>$"
|
||
;
|
||
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||
;
|
||
; DSEG ; Put the following areas in Data Segment (uninitialized REAM)
|
||
;
|
||
;======================= End of UTIL ==============================
|
||
|