**************************************************************
***	BIG Z MONITOR (1K VERSION 2.0) 9/10/79 AB
**************************************************************
;	ASSUMPTIONS
;	SERIAL PORT ON BIGZ IS SET TO 10 AND 11H
;	NO MEMORY SIZE IS ASSUMED
;
; CONDITIONAL ASSEMBLY PARAMETERS
;	DEFINE VALUES OF TRUE/FALSE
TRUE	EQU	0FFFFH
;
;
; SYSTEM EQUATES
;
MON	ORG	0E000H
;
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
;
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	'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
;
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		; AND ENDING WITH A ^C
	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
