123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640
;**************************************************************
;*** BIG Z MONITOR (1K VERSION 2.0) 9/10/79 AB
;**************************************************************
; ASSUMPTIONS
; SERIAL PORT ON BIGZ IS SET TO 10 AND 11H
; TARBELL TAPE USING STANDARD TARBELL PORTS
; OR KC STANDARD VIA JADE SERIAL/PARALLEL CARD
; SET TO PORTS 01 & 81 HEX
; NO MEMORY SIZE IS ASSUMED
;
; CONDITIONAL ASSEMBLY PARAMETERS
; DEFINE VALUES OF TRUE/FALSE
TRUE: EQU 0FFFFH
FALSE: EQU 0
;
; SET CONDITIONAL ASSEMBLY VALUES
TARBEL: EQU FALSE
KCTAPE: EQU TRUE
;
; SYSTEM EQUATES
;
MON: ORG 0E000H
;
TAPE: EQU 0
TAPST: EQU 80H
;KBDST: EQU 11H
;KBDDT: EQU 10H
KBDST: EQU 21H
KBDDT: EQU 20H
KBDIN: EQU 02H
KBDOT: EQU 01H
WAIT: EQU 0FCH
SECT: EQU 0FAH
DCOM: EQU 0F8H
DDATA: EQU 0FBH
DSTAT: EQU 0F8H
SBOOT: EQU 007DH
TARBL: EQU 6EH
;
;
JP INIT
JP EXEC
JP CONIN
JP CONOUT
JP HEXIN
JP HEXOUT
JP DHXOT
JP CRLF
JP SPACE
JP TREAD
JP TWRIT
INIT: LD B,1 ; SET THE RAM FLAG
LD A,4EH
OUT (KBDST),A
LD A,37H
OUT (KBDST),A ; INITIALIZE THE ONBOARD UART
LD HL,TRUE ; PRELOAD MEMORY ADDRESS
FTOP: INC HL
LD A,(HL)
CPL
LD (HL),A
CP (HL)
CPL
LD (HL),A
JR NZ,FTOP1
LD B,0
JR FTOP
FTOP1: LD A,B
OR A
JR NZ,FTOP ; FIND TOP OF CONTIGIOUS RAM
DEC HL ; AND SET STACK TO THIS VALUE
DEC HL
LD SP,HL
PUSH HL
POP IY ; SAVE STACK ADDRESS IN IY
; 2 CR/LF'S
CALL CRLF
CALL CRLF
FTOP2: LD HL,MSG1
INIT1: LD A,(HL) ; MESSAGE PRINT ROUTINE
CALL CONOUT ; PRINT MESSAGE AT HL UNTIL
INC HL ; END OF ENTRY IS FOUND (03H)
CP 03H ; THEN GO TO MONITOR MAIN ENTRY
JR NZ,INIT1 ; POINT EXEC
CALL CRLF
LD HL,1
ADD HL,SP
CALL DHXOT
JR EXEC
IF TARBEL
MSG1: DEFM 'JADE COMPUTER SYSTEMS BIG Z MONITOR 2.0B'
ENDIF
IF KCTAPE
MSG1: DEFM 'JADE COMPUTER SYSTEMS BIG Z MONITOR 2.0A'
ENDIF
DEFB 0DH,0AH,0DH,0AH
DEFB 03H
EXEC: LD SP,IY
IF TARBEL
SUB A
OUT (TARBL),A
ENDIF
EXEC3: CALL CRLF
LD A,'#' ; MONITOR PROMPT: # SIGN
CALL CONOUT
CALL SPACE
EXEC4: CALL CONIN
CP 21H
JP M,EXEC4 ; LOOP ON CONTROL CHARACTERS
CP 'A'
JR Z,ALTER ; MODIFY MEMORY ROUTINE
CP 'D'
JR Z,DUMP ; DUMP MEMORY ROUTINE
CP 'G'
JR Z,GO ; JUMP TO ADDRESS AND RUN
CP 'C'
JP Z,COPY ; MOVE MEMORY ROUTINE
CP 'T'
JP Z,TEST ; TEST MEMORY ROUTINE
CP 'F'
JP Z,FILL ; FILL MEMORY ROUTINE
CP 'M'
JP Z,MAP ; MAP RAM AREAS
CP 'L'
JP Z,LOAD ; WRITE DIRECT INTO MEMORY
CP 'S'
JP Z,TSAVE ; SAVE MEMORY ON CASSETTE
CP 'R'
JP Z,TLOAD ; LOAD MEMORY FROM CASSETTE
CP 'V'
JP Z,VERIFY ; VERIFY TAPE WRITE
CP 'X'
JP Z,STRM ; DO A SYNC STREAM OUTPUT
IF KCTAPE
CP 'Y'
JP Z,TUNE ; ADJUST CASSETTE ROUTINE
ENDIF
CP 'B'
JP Z,BOOT ; TARBELL BOOT ROUTINE
CP 'E'
JP Z,0F000H ; SPECIAL VERSAFLOPPY JUMP
; THE ABOVE IS A JUMP TO THE VERSAFLOPPY BIOS ROM
JR EXEC3
GO: CALL SPHIN
JP (HL) ; EXECUTE A PROGRAM
ALTER: CALL SPHIN
ALT1: CALL CRLF
CALL DHXOT
CALL SPACE
LD A,(HL)
CALL HEXOUT
PUSH HL
CALL SPHIN
LD E,L
POP HL
CP 0DH
JP Z,ALT3
CP '/'
JP Z,EXEC
CP '.'
JR NZ,ALT2
LD (HL),E
ALT2: INC HL
JR ALT1
ALT3: DEC HL
JR ALT1
DUMP: CALL DHXIN
DUMP1: CALL CRLF
CALL DHXOT
LD B,16
DUMP2: CALL SPACE
LD A,(HL)
CALL HEXOUT
CALL CMPDH
JP C,EXEC
INC HL
DEC B
JR NZ,DUMP2
JR DUMP1
MAP: LD B,1
LD HL,0
MAP1: LD A,(HL)
CPL
LD (HL),A
CP (HL)
CPL
LD (HL),A
LD A,0
JR Z,MAP2
INC A
MAP2: CP B
LD B,A
JR Z,MAP4
DEC HL
OR A
JR NZ,MAP3
INC HL
CALL CRLF
MAP3: CALL DHXOT
CALL SPACE
JR Z,MAP4
INC HL
MAP4: INC HL
LD A,L
OR H
JR NZ,MAP1
LD A,B
OR A
JP NZ,EXEC
DEC HL
CALL DHXOT
JP EXEC
LOAD: CALL SPACE
LOAD0: CALL LHXIN
JR NZ,LOAD0
LOAD1: CALL LHXIN
CP ' '
JR NZ,LOAD0
EX DE,HL
LOAD2: CALL LHXIN
PUSH AF
LD A,L
LD (DE),A
INC DE
POP AF
JR NZ,LOAD2
JR LOAD1
LHXIN: CALL HEXIN
CP 0AH
JR Z,LHXIN
OR A
JR Z,LHXIN
CP '#'
JP Z,EXEC
CP 0DH
RET
FILL: CALL DHXIN
SUB 0DH
JR Z,FILL0
PUSH HL
CALL HEXIN
LD A,L
POP HL
FILL0: DEC HL
FILL1: INC HL
LD (HL),A
CALL CMPDH
JR NC,FILL1
JP EXEC
COPY: CALL TRPIN
CALL COPY0
JP EXEC
COPY0: DEC DE
DEC BC
COPY1: INC DE
INC BC
LD (DE),A
LD A,(BC)
CALL CMPDH
JR NC,COPY1
RET
TEST: CALL DHXIN
INC DE ; ADD 1 TO ENDING ADDRESS
PUSH HL
POP IY ; SAVE STARTING ADDRESS
LD C,256 ; TOTAL NUMBER OF PASSES
LD B,0 ; STARTING PATTERN
TEST0: PUSH IX
POP HL ; SET PRESERVED START ADDRESS
TEST1: LD A,L
XOR H
XOR B
LD (HL),A
INC HL
LD A,H
CP D
JR NZ,TEST1
PUSH IX
POP HL ; FETCH START ADDRESS FOR READ TEST
TEST2: LD A,L
XOR H
XOR B
CP (HL)
CALL NZ,ERRO ; FOUND AN ERROR, EXIT
INC HL
LD A,H
CP D
JR NZ,TEST2
INC B
LD A,'P'
CALL CONOUT
DEC C
JR NZ,TEST0
JP EXEC
ERRO: PUSH AF
PUSH HL
CALL DHXOT
CALL SPACE
LD A,B
CALL HEXOUT
CALL SPACE
POP AF
CALL HEXOUT
CALL CRLF
POP HL
RET
;
;
IF KCTAPE
TLOAD: CALL DHXIN
CALL TREAD
JP Z,EXEC
CALL SPACE
LD A,'#'
CALL CONOUT
JP EXEC
TREAD: LD A,0B0H
OUT (TAPST),A
TRDA: LD B,4
TRDB: CALL CIN
CP 0FFH
JR NZ,TRDA
DEC BC
JR NZ,TRDB
TRDC: CALL CIN
CP 0FFH
JR Z,TRDA
CP 0E6H
JR NZ,TRDA
LD B,0
LD A,'$'
CALL CONOUT
DEC HL
TRD1: INC HL
CALL CIN
LD (HL),A
ADD A,B
LD B,A
CALL CMPDH
JR NC,TRD1
CALL CIN
CP B
RET
CIN: IN A,(TAPST)
AND 01H
JR Z,CIN
IN A,(TAPE)
RET
TUNE: CALL SPACE
LD A,0B0H
OUT (TAPST),A
TUN0: CALL CRLF
LD H,32
TUN1:
TUN2: CALL CIN
CP 0FFH
JR Z,TUN2
LD L,'+'
CP 0E6H
JR Z,TUN3
LD L,'?'
TUN3: LD A,L
CALL CONOUT
DEC H
JR NZ,TUN1
JR TUN0
TSAVE: CALL DHXIN
CALL TWRIT
JP EXEC
TWRIT: LD A,0B0H
OUT (TAPST),A
LD B,16
TWRT0: LD A,0FFH
CALL COUT
DEC B
JR NZ,TWRT0
LD A,0E6H
CALL COUT
DEC HL
LD B,0
TWRT1: INC HL
LD A,(HL)
CALL COUT
ADD A,B
LD B,A
CALL CMPDH
JR NC,TWRT1
LD A,B
CALL COUT
CALL COUT
JR COUT
COUT: PUSH AF
IN A,(TAPST)
AND 80H
JR Z,COUT+1
POP AF
OUT (TAPE),A
RET
STRM: CALL SPACE
LD A,0B0H
OUT (TAPST),A
STRM1: LD A,0FFH
CALL COUT
LD A,0E6H
CALL COUT
JR STRM1
ENDIF
;
IF TARBEL
TLOAD: CALL DHXIN
CALL TREAD
JP Z,EXEC
LD A,'#'
CALL CONOUT
JP EXEC
TREAD: LD A,1
OUT (TARBL),A
PUSH HL
LD HL,20000
CALL DELAY
POP HL
LD B,0
LD A,11H
OUT (TARBL),A
DEC HL
TRD1: INC HL
CALL CIN
LD (HL),A
ADD A,B
LD B,A
CALL CMPDH
JR NC,TRD1
CALL CIN
CP B
PUSH AF
SUB A
OUT (TARBL),A
POP AF
RET
CIN: IN A,(TARBL)
AND 10H
JR NZ,CIN
IN A,(TARBL+1)
RET
TSAVE: CALL DHXIN
CALL TWRIT
JP EXEC
TWRIT: LD A,2
OUT (TARBL),A
PUSH HL
LD HL,TRUE
CALL DELAY
POP HL
SUB A
LD B,A
CALL COUT
LD A,0E6H
CALL COUT
DEC HL
TWRT1: INC HL
LD A,(HL)
CALL COUT
ADD A,B
LD B,A
CALL CMPDH
JR NC,TWRT1
LD A,B
CALL COUT
CALL COUT
CALL COUT
SUB A
OUT (TARBL),A
RET
COUT: PUSH AF
IN A,(TARBL)
AND 20H
JR NZ,COUT+1
POP AF
OUT (TARBL+1),A
RET
STRM: CALL SPACE
LD A,2
OUT (TARBL),A
STRM1: LD A,0E6H
CALL COUT
JR STRM1
DELAY: EX (SP),HL
EX (SP),HL
DEC HL
LD A,L
OR H
JR NZ,DELAY
RET
ENDIF
;
VERIFY: CALL TRPIN
EX DE,HL
DEC HL
DEC BC
VRFY1: INC HL
INC BC
LD (BC),A
CP (HL)
JR Z,VRFY2
CALL CRLF
CALL DHXOT
CALL SPACE
LD A,(HL)
CALL HEXOUT
CALL SPACE
LD (BC),A
CALL HEXOUT
VRFY2: CALL CMPDH
JR NC,VRFY1
JP EXEC
CMPDH: PUSH AF
LD A,D
CP H
JR NZ,CMP1
LD A,E
CP L
JR NZ,CMP1
POP AF
SCF
RET
CMP1: POP AF
SCF
CCF
RET
DHXIN: CALL SPHIN
PUSH HL
CP 0DH
CALL NZ,HEXIN
EX DE,HL ; LOAD BOTH HL AND DE WITH ADDRESS
POP HL
RET
SPHIN: CALL SPACE
HEXIN: LD HL,0
HXIN1: CALL CONIN ; LOAD HL WITH ONE OR TWO HEX VALUES
CP '0' ; IF MORE THAN TWO ARE ENTERED, KEEP
RET M ; THE LAST TWO. EXIT WITH LAST
CP 'F'+1 ; CHARACTER ENTERED IN THE A REGISTER,
RET P ; AND IF LAST IS CR SET Z FLAG.
CP '9'+1
JP M,HXIN2
CP 'A'
RET M
ADC A,9
HXIN2: AND 0FH
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
OR L
LD L,A
JR HXIN1
TRPIN: CALL SPHIN
EX DE,HL ; LOAD ALL THREE PAIRS WITH HEX
CALL HEXIN ; ENTRIES
PUSH HL
CALL HEXIN
PUSH HL
POP BC
POP HL
RET
DHXOT: LD A,H ; DISPLAY CURRENT HL VALUE
CALL HEXOUT
LD A,L
HEXOUT: PUSH AF
RRCA
RRCA
RRCA
RRCA
CALL HXOT1
POP AF
HXOT1: AND 0FH
ADD A,30H
CP '9'+1
JP M,CONOUT
ADD A,7
JP CONOUT
CRLF: PUSH AF
LD A,0DH
CALL CONOUT
LD A,0AH
CALL CONOUT
POP AF
RET
SPACE: PUSH AF
LD A,20H
CALL CONOUT
POP AF
RET
CONOUT: PUSH AF
IN A,(KBDST)
AND KBDOT
JR Z,CONOUT+1
POP AF
OUT (KBDDT),A
RET
CONIN: IN A,(KBDST)
AND KBDIN
JR Z,CONIN
IN A,(KBDDT)
AND 7FH
CP 61H
JR C,ECHO
CP 7CH
JR NC,ECHO
SUB 20H
ECHO: CP 18H
JP Z,EXEC
JR CONOUT
PTXT: LD A,(HL)
CP 03H ; PRINT A MESSAGE BEGINNING AT
RET Z ; AODENDING WITH A CONTC
CALL CONOUT
INC HL
JR PTXT
BOOT: IN A,(WAIT)
XOR A
LD L,A
LD H,A
INC A
OUT (SECT),A
LD A,8CH
OUT (DCOM),A
RLOOP: IN A,(WAIT)
OR A
JP P,RDONE
IN A,(DDATA)
LD (HL),A
INC HL
JP RLOOP
RDONE: IN A,(DSTAT)
OR A
JP Z,SBOOT
HALT
;
END