;:::::::::::::::::::::::::::::::::::::::***************************** ; UTIL - N8VEM 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 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 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=$" ; ;================================================================================================== ; MEMORY BANK MANAGEMENT ;================================================================================================== ; MPCL_RAM EQU 78H ; BASE IO ADDRESS OF RAM MEMORY PAGER CONFIGURATION LATCH MPCL_ROM EQU 7CH ; BASE IO ADDRESS OF ROM MEMORY PAGER CONFIGURATION LATCH ; ;================================================================================================== ; DATA ;================================================================================================== ; STR_EMPTY DEFB "$" ; ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; ; DSEG ; Put the following areas in Data Segment (uninitialized REAM) ; ;======================= End of UTIL ==============================