You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

339 lines
5.3 KiB

;:::::::::::::::::::::::::::::::::::::::*****************************
; 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 ==============================