@ -7,18 +7,20 @@
;__REFERENCES_________________________________________________________________
; THOMAS SCHERRER BASIC HAR.DWARE TEST ASSEMBLER SOURCES FROM THE Z80 INFO PAGE
; INCLUDING ORIGINAL SCHEMATIC CONCEPT
; HTTP://Z80 INFO/Z80SOURC.TXT
; HTTP://Z80. INFO/Z80SOURC.TXT
; CODE SAMPLES FROM BRUCE JONES PUBLIC DOMAIN ROM MONITOR FOR THE SBC-200C
; HTTP://WWW RETROTECHNOLOGY.COM/HERBS_STUFF/SD_BRUCE_CODE.ZIP
; HTTP://WWW. RETROTECHNOLOGY.COM/HERBS_STUFF/SD_BRUCE_CODE.ZIP
; INSPIRATION FROM JOEL OWENS "Z-80 SPACE-TIME PRODUCTIONS SINGLE BOARD COMPUTER"
; HTTP://WWW JOELOWENS.ORG/Z80/Z80INDEX.HTML
; HTTP://WWW. JOELOWENS.ORG/Z80/Z80INDEX.HTML
; GREAT HELP AND TECHNICAL ADVICE FROM ALLISON AT ALPACA_DESIGNERS
; HTTP://GROUPS YAHOO.COM/GROUP/ALPACA_DESIGNERS
; HTTP://GROUPS. YAHOO.COM/GROUP/ALPACA_DESIGNERS
; INTEL SDK-85 ROM DEBUG MONITOR
;_____________________________________________________________________________
;
# INCLUDE "std.asm"
;
BUFLEN .EQU 40 ; INPUT LINE LENGTH
;
;__MAIN_PROGRAM_______________________________________________________________
;
; ORG 00100h ; FOR DEBUG IN CP/M (AS .COM)
@ -43,7 +45,7 @@ UART_ENTRY:
CALL INITIALIZE ; INITIALIZE SYSTEM
LD HL , TXT_READY ; POINT AT TEXT
CALL PRTSTR ; SHOW WE'RE HERE
CALL PRTSTRH ; SHOW WE'RE HERE
;
;__SERIAL_MONITOR_COMMANDS____________________________________________________
;
@ -63,14 +65,16 @@ UART_ENTRY:
; PROMPT USER FOR COMMANDS, THEN PARSE THEM
;_____________________________________________________________________________
;
SERIALCMDLOOP:
LD SP , MON_STACK ; RESET STACK
LD HL , PROMPT ;
LD HL , TXT_ PROMPT ;
CALL PRTSTR ;
LD HL , KEYBUF ; SET POINTER TO KEYBUF AREA
CALL GETLN ; GET A LINE OF INPUT FROM THE USER
LD HL , KEYBUF ; RESET POINTER TO START OF KEYBUF
LD A , C ; GET LINE LENGTH ENTERED
OR A ; ZERO?
JR Z , SERIALCMDLOOP ; NOTHING ENTERED, LOOP
LD A ,( HL ) ; LOAD FIRST CHAR INTO A (THIS SHOULD BE THE COMMAND)
INC HL ; INC POINTER
@ -97,7 +101,7 @@ SERIALCMDLOOP:
CP 'H' ; IS IT A "H" (Y/N)
JP Z , HELP ; HELP COMMAND
LD HL , TXT_COMMAND ; POINT AT ERROR TEXT
CALL PRTSTR ; PRINT COMMAND LABEL
CALL PRTSTRH ; PRINT COMMAND LABEL
JR SERIALCMDLOOP
;
@ -291,7 +295,7 @@ HXLOADEXIT:
; SYNTAX: O <PORT> <VALUE>
; NOTE: A WORD VALUE IS USED FOR THE PORT NUMBER BECAUSE THE
; Z80 WILL ACTUALLY PLACE 16 BITS ON THE BUS USING
; THE B AND C REGISTERS IN AN "OUT (C),A"
; THE B AND C REGISTERS WITH AN "OUT (C),A" INSTRUCTION
;_____________________________________________________________________________
;
POUT:
@ -310,7 +314,7 @@ POUT:
; SYNTAX: I <PORT>
; NOTE: A WORD VALUE IS USED FOR THE PORT NUMBER BECAUSE THE
; Z80 WILL ACTUALLY PLACE 16 BITS ON THE BUS USING
; THE B AND C REGISTERS IN AN "INC A,(C)"
; THE B AND C REGISTERS WITH AN "IN A,(C)" INSTRUCTION
;_____________________________________________________________________________
;
PIN:
@ -486,7 +490,7 @@ HELP:
;
ERR:
LD HL , TXT_ERR ; POINT AT ERROR TEXT
CALL PRTSTR ; DISPLAY IT
CALL PRTSTRH ; DISPLAY IT
JP SERIALCMDLOOP ; AND BACK TO COMMAND LOOP
;
;__BYTEPARM___________________________________________________________________
@ -520,39 +524,52 @@ WORDPARM:
;
;__GETLN______________________________________________________________________
;
; READ A LINE(80) OF TEXT FROM THE SERIAL PORT, HANDLE <BS>, TERM ON <CR>
; READ A LINE OF TEXT FROM THE SERIAL PORT, HANDLE <BS>, TERM ON <CR>
; EXIT IF TOO MANY CHARS STORE RESULT IN HL. CHAR COUNT IN C.
;_____________________________________________________________________________
;
GETLN:
LD C , 00H ; ZERO CHAR COUNTER
PUSH DE ; STOR E DE
LD C , 0 ; ZERO CHAR COUNTER
PUSH DE ; SAV E DE
GETLNLOP:
; ENTRY LOOP
CALL KIN ; GET A KEY
CP CH R_CR ; IS <CR>?
JR Z , GETLNDONE ; YES, EXIT
CALL COUT ; OUTPUT KEY TO SCREEN
CP CH R_BS ; IS <BS>?
JR NZ , GETLNSTORE ; NO, STORE CHAR
LD A , C ; A=C
CP 0 ;
JR Z , GETLNLOP ; NOTHING TO BACKSPACE, IGNORE & GET NEXT KEY
DEC HL ; PERFORM BACKSPACE
DEC C ; LOWER CHAR COUNTER
LD A , 0 ;
LD ( HL ), A ; STORE NULL IN BUFFER
LD A , 20H ; BLANK OUT CHAR ON TERM
CALL COUT ;
LD A , CH R_BS ;
CALL COUT ;
JR GETLNLOP ; GET NEXT KEY
GETLNSTORE:
JR Z , GETLNBS ; IF SO, HANDLE IT
CP ' ' ; UNEXPECTED CONTROL CHAR?
JR C , GETLNLOP ; IF SO, IGNORE IT AND GET NEXT
LD B , A ; SAVE CHAR IN B FOR NOW
LD A , C ; GET COUNTER
CP BUFLEN - 1 ; MAX OF BUFLEN CHARS LESS SPACE FOR TERM NULL
JR Z , GETLNOVF ; IF AT MAX, HANDLE OVERFLOW
LD A , B ; GET INPUT CHAR BACK
CALL COUT ; OUTPUT KEY TO SCREEN
LD ( HL ), A ; STORE CHAR IN BUFFER
INC HL ; INC POINTER
INC C ; INC CHAR COUNTER
JR GETLNLOP ; GET NEXT CHAR
GETLNOVF:
; OVERFLOW
LD A , CH R_BEL ; BELL CHARACTER
CALL COUT ; SEND IT TO CONSOLE
JR GETLNLOP ; LOOP
GETLNBS:
; BACKSPACE
LD A , C ; A=C
CP 4DH ; OUT OF BUFFER SPACE?
JR NZ , GETLNLOP ; NOPE, GET NEXT CHAR
OR A ; ZERO?
JR Z , GETLNLOP ; IF EMPTY LINE, IGNORE BS & LOOP
DEC HL ; BACKUP BUF PTR 1 CHAR
DEC C ; DECREMENT CHAR COUNTER
LD A , CH R_BS ; BACKSPACE
CALL COUT ; TO CONSOLE
LD A , 20H ; BLANK OUT CHAR ON TERM
CALL COUT ; TO CONSOLE
LD A , CH R_BS ; BACKSPACE
CALL COUT ; TO CONSOLE
JR GETLNLOP ; GET NEXT KEY
; DONE
GETLNDONE:
LD ( HL ), 00H ; STORE NULL IN BUFFER
POP DE ; RESTORE DE
@ -708,7 +725,17 @@ PHL:
CALL PRTHEXBYTE ; DISPLAY IT
LD A , L ; GET LOW BYTE
CALL PRTHEXBYTE ; DISPLAY IT
RET ; DONE
RET ; DONE
;
;__PRTSTRH____________________________________________________________________
;
; PRINT STRING AT HL W/ MINI HELP SUFFIX
;_____________________________________________________________________________
;
PRTSTRH:
CALL PRTSTR
LD HL , TXT_MINIHELP
JP PRTSTR
;
# IF ( PLATFORM = = PLT_UNA )
;
@ -859,57 +886,32 @@ CST:
; RESERVED RAM FOR MONITOR WORKING AREA
;_____________________________________________________________________________
;
KEYBUF: .FILL 80 , ' '
KEYBUF: .FILL BUFLEN , 0
;
;__TEXT_STRINGS_______________________________________________________________
;
; SYSTEM TEXT STRINGS
;_____________________________________________________________________________
;
TCRLF:
.DB CH R_CR , CH R_LF , '$'
PROMPT:
.DB CH R_CR , CH R_LF , '>' , '$'
TXT_READY:
.DB CH R_CR , CH R_LF
.TEXT "MONITOR READY ('H' FOR HELP)"
.DB '$'
TXT_COMMAND:
.DB CH R_CR , CH R_LF
.TEXT "UNKNOWN COMMAND ('H' FOR HELP)"
.DB '$'
TXT_ERR:
.DB CH R_CR , CH R_LF
.TEXT "SYNTAX ERROR ('H' FOR HELP)"
.DB '$'
TXT_CKSUMERR:
.DB CH R_CR , CH R_LF
.TEXT "CHECKSUM ERROR"
.DB '$'
TXT_BADNUM:
.TEXT " *INVALID VALUE*"
.DB '$'
TXT_HELP:
.DB CH R_CR , CH R_LF
.TEXT "MONITOR COMMANDS (ALL VALUES IN HEX):\r\n"
.TEXT "B - BOOT SYSTEM\r\n"
.TEXT "D XXXX YYYY - DUMP MEMORY FROM XXXX TO YYYY\r\n"
.TEXT "F XXXX YYYY ZZ - FILL MEMORY FROM XXXX TO YYYY WITH ZZ\r\n"
.TEXT "I XX - SHOW VALUE AT PORT XX\r\n"
.TEXT "K - ECHO KEYBOARD INPUT\r\n"
.TEXT "L - LOAD INTEL HEX FORMAT DATA\r\n"
.TEXT "M XXXX YYYY ZZZZ - MOVE MEMORY BLOCK XXXX-YYYY TO ZZZZ\r\n"
.TEXT "O XX YY - WRITE VALUE YY TO PORT XX\r\n"
.TEXT "P XXXX - PROGRAM RAM STARTING AT XXXX\r\n"
.TEXT "R XXXX - RUN A PROGRAM AT ADDRESS XXXX"
.DB '$'
TXT_PROMPT .TEXT "\r\n>$"
TXT_READY .TEXT "\r\nMonitor Ready$"
TXT_COMMAND .TEXT "\r\nUnknown Command$"
TXT_ERR .TEXT "\r\nSyntax Error$"
TXT_CKSUMERR .TEXT "\r\nChecksum Error$"
TXT_BADNUM .TEXT " *Invalid Hex Byte Value*$"
TXT_MINIHELP .TEXT " (H for Help)$"
TXT_HELP .TEXT "\r\nMonitor Commands (all values in hex):"
.TEXT "\r\nB - Boot system"
.TEXT "\r\nD xxxx yyyy - Dump memory from xxxx to yyyy"
.TEXT "\r\nF xxxx yyyy zz - Fill memory from xxxx to yyyy with zz"
.TEXT "\r\nI xx - Input from port xx"
.TEXT "\r\nK - Keyboard echo"
.TEXT "\r\nL - Load Intel hex data"
.TEXT "\r\nM xxxx yyyy zzzz - Move memory block xxxx-yyyy to zzzz"
.TEXT "\r\nO xx yy - Output to port xx value yy"
.TEXT "\r\nP xxxx - Program RAM at xxxx"
.TEXT "\r\nR xxxx - Run code at xxxx"
.TEXT "$"
;
# IF DS KYENABLE
;
@ -942,11 +944,12 @@ DSKY_ENTRY:
;_____________________________________________________________________________
;
FRONTPANELLOOP:
LD HL , CPUUP ; SET POINTER TO DATA BUFFER
CALL DS KY_SHOWSEG ; DISPLAY
LD HL , CPUUP ; SET POINTER TO CPU UP MSG
CALL DS KY_SHOWSEG ; DISPLAY UNENCODED
CALL KB_GET ; GET KEY FROM KB
FRONTPANELLOOP1:
CP KY_PR ; IS PORT READ?
JP Z , DOPORTREAD ; YES, JUMP
CP KY_PW ; IS PORT WRITE?
@ -970,7 +973,9 @@ EXIT:
;_____________________________________________________________________________
;
DOBOOT:
JP BOOT
LD HL , MSGBOOT ; SET POINTER TO BOOT MESSAGE
CALL DS KY_SHOWSEG ; DISPLAY UNENCODED
JP BOOT ; DO BOOT
;
;__DOPORTREAD_________________________________________________________________
;
@ -992,10 +997,6 @@ PORTREADLOOP:
CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS
PORTREADGETKEY:
CALL KB_GET ; GET KEY FROM KB
CP KY_CL ; [CL] PRESSED, EXIT
JR Z , FRONTPANELLOOP ;
CP KY_PR ; [PR] PRESSED, PROMPT FOR NEW PORT
JR Z , DOPORTREAD ;
JR PORTREADGETKEY ; NO VALID KEY, LOOP
;
;__DOPORTWRITE________________________________________________________________
@ -1019,10 +1020,6 @@ PORTWRITELOOP:
CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS
PORTWRITEGETKEY:
CALL KB_GET ; GET KEY FROM KB
CP KY_CL ; [CL] PRESSED, EXIT
JR Z , FRONTPANELLOOP ;
CP KY_PW ; [PW] PRESSED, PROMPT FOR NEW PORT
JR Z , DOPORTWRITE ;
JR PORTWRITEGETKEY ; NO VALID KEY, LOOP
;
;__DOGO_______________________________________________________________________
@ -1069,12 +1066,8 @@ EXAMINELOOP:
CALL ENCDISPLAY ; DISPLAY BUFFER ON DISPLAYS
EXAMINEGETKEY:
CALL KB_GET ; GET KEY FROM KB
CP KY_CL ; [CL] PRESSED, EXIT
JP Z , FRONTPANELLOOP ;
CP KY_EN ; [EN] PRESSED, INC ADDRESS AND LOOP
JR Z , EXAMINEFW ;
CP KY_EX ; [EX] PRESSED, PROMPT FOR NEW ADDRESS
JR Z , DOEXAMINE ;
JR EXAMINEGETKEY ; NO VALID KEY, LOOP
EXAMINEFW:
INC HL ; HL++
@ -1106,12 +1099,8 @@ DEPOSITLOOP:
CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS
DEPOSITGETKEY:
CALL KB_GET ; GET KEY FROM KB
CP KY_CL ; [CL] PRESSED, EXIT
JP Z , FRONTPANELLOOP ;
CP KY_EN ; [EN] PRESSED, INC ADDRESS AND LOOP
JR Z , DEPOSITFW ;
CP KY_DE ; [DE] PRESSED, PROMPT FOR NEW ADDRESS
JR Z , DODEPOSIT ;
JR DEPOSITGETKEY ; NO VALID KEY, LOOP
DEPOSITFW:
INC HL ;
@ -1150,8 +1139,6 @@ GETVALWLOOP:
JP M , GETVALWNUM ; NUMBER PRESSED, STORE IT
CP KY_EN ; [EN] PRESSED, DONE
JR Z , GETVALWDONE ;
CP KY_CL ; CLEAR PRESSED, CLEAR
JR Z , GETVALW ;
JR GETVALWLOOP ; INVALID KEY, LOOP
GETVALWNUM:
OR $ 80 ; SET DP
@ -1221,8 +1208,6 @@ GETVALUELOOP:
JP M , GETVALUENUM ; NUMBER PRESSED, STORE IT
CP KY_EN ; [EN] PRESSED, DONE
JR Z , GETVALUEDONE ;
CP KY_CL ; CLEAR PRESSED, CLEAR
JR Z , GETVALUE ;
JR GETVALUELOOP ; INVALID KEY, LOOP
GETVALUENUM:
OR $ 80 ; SET DP
@ -1278,6 +1263,14 @@ KB_GET:
PUSH DE
PUSH HL ; SAVE HL
CALL DS KY_GETKEY ; GET A KEY
CP KY_EN ; ENTER?
JR Z , KB_GET1 ; IF YES, RET TO CALLER
CP $ 10 ; HEX DIGIT?
JR C , KB_GET1 ; IF YES, RET TO CALLER
; NOT A DIGIT OR [EN], BAIL OUT TO MAIN LOOP TO HANDLE IT
LD SP , MON_STACK ; CLEAR STACK
JP FRONTPANELLOOP1 ; RESTART AT MAIN LOOP
KB_GET1:
POP HL ; RESTORE HL
POP DE
POP BC
@ -1343,7 +1336,8 @@ ENCBUF1:
POP HL ; RESTORE HL
RET
;
CPU UP .DB $ 84 , $ CB , $ EE , $ BB , $ 80 , $ BB , $ EE , $ 84 ; "-CPU UP-" (RAW)
CPU UP .DB $ 84 , $ CB , $ EE , $ BB , $ 80 , $ BB , $ EE , $ 84 ; "-CPU UP-" (RAW SEG)
MSGBOOT .DB $ FF , $ 9 D , $ 9 D , $ 8 F , $ 20 , $ 80 , $ 80 , $ 80 ; "Boot! " (RAW SEG)
ADDR .DB $ 17 , $ 18 , $ 19 , $ 10 , $ 00 , $ 00 , $ 00 , $ 00 ; "Adr 0000" (ENCODED)
PORT .DB $ 13 , $ 14 , $ 15 , $ 16 , $ 10 , $ 10 , $ 00 , $ 00 ; "Port 00" (ENCODED)
GOTO .DB $ 1 A , $ 14 , $ 10 , $ 10 , $ 00 , $ 00 , $ 00 , $ 00 ; "Go 0000" (ENCODED)
@ -1364,7 +1358,7 @@ SEGDECODE:
;
; POS $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $1A
; GLYPH ' ' '-' '.' 'P' 'o' 'r' 't' 'A' 'd' 'r' 'G'
.DB $ 00 , $ 04 , $ 00 , $ 6 E , $ 1 D , $ 0 C , $ 14 , $ 7 E , $ 3 D , $ 0 C , $ 5 B
.DB $ 00 , $ 04 , $ 00 , $ 6 E , $ 1 D , $ 0 C , $ 0 F , $ 7 E , $ 3 D , $ 0 C , $ 5 B
;
DISPLAYBUF: .FILL 8 , 0
;