**************************************************************
***	BIG Z MONITOR (1K VERSION 2.0) 9/10/79 AB
**************************************************************
;	ASSUMPTIONS
;	SERIAL PORT ON BIGZ IS SET TO 10 AND 11H
;	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
;
; SYSTEM EQUATES
;
MON	ORG	0E000H
;
TAPE	EQU	0
TAPST	EQU	80H
KBDST	EQU	11H
KBDDT	EQU	10H
KBDIN	EQU	02H
KBDOT	EQU	01H
WAIT	EQU	0FCH
SECT	EQU	0FAH
DCOM	EQU	0F8H
DDATA	EQU	0FBH
DSTAT	EQU	0F8H
SBOOT	EQU	007DH
;
;
	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-$
MSG1:	DEFB	'JADE COMPUTER SYSTEMS BIG Z MONITOR 2.0'
	DEFB	0DH
	DEFB	0AH
	DEFB	0DH
	DEFB	0AH
	DEFB	03H
EXEC:	LD	SP,IY
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
	CP	'Y'
	JP	Z,TUNE		; ADJUST CASSETTE ROUTINE
	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:IINC	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,OOAD2-$
	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
	CPMD
	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
;
;
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,76
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-$
;
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 B_TH 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 W]TH 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		; AND ENDING 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
