;*****************************************************************************
; ファイル名		MONITOR.asm
; 対象マイコン 		Z80
; ファイル内容		Z80マイコンボードモニタソフト
;*****************************************************************************
;=============================================================================
;シンボル定義
;=============================================================================
DATA79	.EQU	0x9E	;UPD8279 データアドレス
CMD79	.EQU	0x9F	;UPD8279 コマンドアドレス

USERSP	.EQU	0x9F00	;ユーザースタックポインター
MONSP	.EQU	0x9FBD	;モニタースタックポインター

;=============================================================================
;モニターRAMエリア
;=============================================================================
RST1	.EQU	0x9FBD	;RST1ジャンプテーブル
				   ;BE
				   ;BF
RST2	.EQU	0x9FC0	;RST2ジャンプテーブル
				   ;C1
				   ;C2
RST3	.EQU	0x9FC3	;RST3ジャンプテーブル
				   ;C4
				   ;C5
RST4	.EQU	0x9FC6	;RST4ジャンプテーブル
				   ;C7
				   ;C8
RST5	.EQU	0x9FC9	;RST5ジャンプテーブル
				   ;CA
				   ;CB
RST6	.EQU	0x9FCC	;RST6ジャンプテーブル
				   ;CD
				   ;CE
REGFLAG	.EQU	0x9FCF	;レジスターディスプレイモードフラグ
IOFLAG	.EQU	0x9FD0	;IOモードフラグ
				   ;D1
RSAVE	.EQU	0x9FD2	;Rレジスターセーブエリア
ISAVE	.EQU	0x9FD3	;Iレジスターセーブエリア
HL_SAVE	.EQU	0x9FD4	;HL'レジスターセーブエリア
				   ;D5
DE_SAVE	.EQU	0x9FD6	;DE'レジスターセーブエリア
				   ;D7
BC_SAVE	.EQU	0x9FD8	;BC'レジスターセーブエリア
				   ;D9
AF_SAVE	.EQU	0x9FDA	;AF'レジスターセーブエリア
				   ;DB
IYSAVE	.EQU	0x9FDC	;IYレジスターセーブエリア
				   ;DD
IXSAVE	.EQU	0x9FDE	;IXレジスターセーブエリア
				   ;DF
PCSAVE	.EQU	0x9FE0	;PCレジスターセーブエリア
				   ;E1
SPSAVE	.EQU	0x9FE2	;SPレジスターセーブエリア
				   ;E3
HLSAVE	.EQU	0x9FE4	;HLレジスターセーブエリア
				   ;E5
DESAVE	.EQU	0x9FE6	;DEレジスターセーブエリア
				   ;E7
BCSAVE	.EQU	0x9FE8	;BCレジスターセーブエリア
				   ;E9
AFSAVE	.EQU	0x9FEA	;AFレジスターセーブエリア
				   ;EB
DATAREG	.EQU	0x9FEC	;データレジスターLo
				   ;ED	 データレジスターHi
ADRSREG	.EQU	0x9FEE	;アドレスレジスターLo
				   ;EF	 アドレスレジスターHi
BKADRS	.EQU	0x9FF0	;ブレークポイントアドレス
				   ;F1
BKCOUNT	.EQU	0x9FF2	;ブレークポイントカウンター
				   ;F3
LEDADRS	.EQU	0x9FF4	;LEDディスプレイアドレスHi
				   ;F5   LEDディスプレイアドレスLo
LEDDATA	.EQU	0x9FF6	;LEDディスプレイデータHi
				   ;F7   LEDディスプレイデータLo
LED1BUF	.EQU	0x9FF8	;LED1セグメントバッファー
LED2BUF	.EQU	0x9FF9	;LED2セグメントバッファー
LED3BUF	.EQU	0x9FFA	;LED3セグメントバッファー
LED4BUF	.EQU	0x9FFB	;LED4セグメントバッファー
LED5BUF	.EQU	0x9FFC	;LED5セグメントバッファー
LED6BUF	.EQU	0x9FFD	;LED6セグメントバッファー
LED7BUF	.EQU	0x9FFE	;LED7セグメントバッファー
LED8BUF	.EQU	0x9FFF	;LED8セグメントバッファー

;=============================================================================
;プログラムスタート
;=============================================================================
			;======================================
			;コード領域アドレス指定
			;======================================
			.area	CODE(ABS)
			.org	0x0000

START:		LD		A,0x00			;UPD8279モードセット
			OUT		(CMD79),A
			JP		INIT79			;UPD8279初期化処理へ

			;======================================
			;ジャンプテーブル
			;======================================
			.DB		0xFF
			JP		RST1			;RST1ジャンプテーブルへ
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			JP		RST2			;RST2ジャンプテーブルへ
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			JP		RST3			;RST3ジャンプテーブルへ
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			JP		RST4			;RST4ジャンプテーブルへ
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			JP		RST5			;RST5ジャンプテーブルへ
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			JP		RST6			;RST6ジャンプテーブルへ
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF
			.DB		0xFF

			;======================================
			;ワンステップルーチン
			;======================================
			JP		RST7			;RST7ジャンプテーブルへ

;=============================================================================
;初期化処理
;=============================================================================
INIT79:		LD		A,0xA0			;ディスプレイRAMライトイネーブル
			OUT 	(CMD79),A
			LD		A,0x38			;プログラムクロック設定
			OUT 	(CMD79),A
			LD		A,0x50			;キースイッチ入力RAMイネーブル
			OUT 	(CMD79),A
			LD		HL,REGFLAG		;モニターワークRAMクリア
			XOR		A
CLEAR0:		LD		(HL),A
			INC		L
			JR		NZ,CLEAR0
			LD		HL,USERSP		;ユーザーSPセット
			LD		(SPSAVE),HL

START1:		DI						;モニターリスタート
			LD		SP,MONSP		;ユーザースタックポインタ
			CALL 	DISPAANDD		;ディスプレイアドレス＆データ
			JP		START2

			;======================================
			;コード領域アドレス指定
			;======================================
			.area	CODE(ABS)
			.org	0x0066

NMI:		JP		MON

			.DB		0xFF

START2:		LD		SP,MONSP		;モニターリスタート2
			CALL	KEYIN			;キーインプット
			LD		B,A
			AND		0x10			;0-F ?
			JP		Z,NUMBER		;ナンバープロセス
			LD		A,(REGFLAG)		;チェックREGFLAG
			OR		A
			JP		Z,COMMAND		;コマンドプロセス
			JP		REGMODE			;レジスタモードプロセス

;=============================================================================
;コマンドプロセス
;=============================================================================
COMMAND:	LD		A,B				;B=コマンドキーデータ
			CP		0x10
			JR		Z,WRINC			;ライトインクリメント
			CP		0x11
			JR		Z,RDDEC			;リードデクリメント
			CP		0x12
			JR		Z,RDINC			;リードインクリメント
			CP		0x13
			JR		Z,ADSET			;アドレスセット
			CP		0x14
			JR		Z,REGM			;レジスタディスプレイ
			CP		0x15
			JR		Z,IOMSET		;I/Oモード
			CP		0x16
			JR		Z,RUN			;RUN
			CP		0x17
			JR		Z,CONT			;コンティニュー

			;======================================
			;ライトインクリメント
			;======================================
WRINC:		LD		HL,(ADRSREG)
			LD		A,(DATAREG)
			LD		(HL),A

			;======================================
			;リードインクリメント
			;======================================
RDINC:		LD		HL,(ADRSREG)
			INC		HL
RDINC1:		CALL	DATASET
			LD		(ADRSREG),HL
			CALL	DISPAANDD
			JP		START2

			;======================================
			;リードデクリメント
			;======================================
RDDEC:		LD		HL,(ADRSREG)
			DEC		HL
			JR		RDINC1

			;======================================
			;アドレスセット
			;======================================			
ADSET:		LD		HL,(DATAREG)
			JR		RDINC1

			;======================================
			;アドレスセット
			;======================================	
REGM:		LD		HL,0x0101
			LD		(REGFLAG),HL
			LD		HL,0x5050			;LED1-4ディスプレイ
			LD		(LED1BUF),HL		;LED1-4ディスプレイ==rrrr
			LD		(LED3BUF),HL
			CALL	DISPD
			JP		START2

			;======================================
			;IOモードセット
			;======================================
IOMSET:		LD		A,0x80
			LD		(IOFLAG),A
			JP		START2

			;======================================
			;RUN
			;======================================
RUN:		LD		HL,(ADRSREG)
			LD		(PCSAVE),HL

			;======================================
			;コンティニュー
			;======================================
CONT:		LD		A,(ISAVE)
			LD		I,A
			LD		SP,HL_SAVE
			POP		HL
			POP		DE
			POP		BC
			EXX
			POP		AF
			EX		AF,AF'
			POP		IY
			POP		IX
			LD		SP,DESAVE
			POP		DE
			POP		BC
			POP		AF
			LD		SP,(SPSAVE)
			LD		HL,(PCSAVE)
			PUSH	HL
			LD		HL,(HLSAVE)
			EI
			RET

;=============================================================================
;レジスターモードプロセス
;=============================================================================
REGMODE:	LD		A,B
			CP		0x10
			JR		Z,RWRINC
			CP		0x11
			JR		Z,RRDDEC			
			CP		0x12
			JR		Z,RRDINC
			CP		0x14
			JP		Z,REGM
			JP		START2

			;======================================
			;RWRINC
			;======================================
RWRINC:		LD		HL,(ADRSREG)
			LD		DE,(DATAREG)
			LD		(HL),E
			INC		HL
			LD		(HL),D

			;======================================
			;RRDINC
			;======================================
RRDINC:		LD		A,(REGFLAG)
			INC		A
			INC		A
			CP		0x20
			JR		C,REGNM1
			LD		A,0x02
			JR		REGNM1

			;======================================
			;RRDDEC
			;======================================	
RRDDEC:		LD		A,(REGFLAG)
			DEC		A
			DEC		A
			JR		NZ,REGNM1
			LD		A,0x1E
			JR		REGNM1

REGNMB:		XOR		A
			LD		(IOFLAG),A
			LD		(LED1BUF),A		;LED1-4ディスプレイ
			LD		(LED4BUF),A		;LED1-4ディスプレイ
			LD		A,B
			ADD		A,A
			JR		Z,REGOFF

REGNM1:		LD		(REGFLAG),A
			LD		C,A
			LD		B,0x00
			LD		HL,REGTBL-2
			ADD		HL,BC
			LD		E,(HL)
			INC		HL
			LD		D,(HL)
			EX		DE,HL
			LD		(LED2BUF),HL
			LD		HL,AFSAVE+2
			SBC		HL,BC
			CP		0x1C
			JR		C,REGNM2
			LD		HL,BKADRS
			JR		Z,REGNM2
			LD		HL,BKCOUNT

REGNM2:		LD		(ADRSREG),HL
			LD		E,(HL)
			INC		HL
			LD		D,(HL)
			EX		DE,HL
			LD		(DATAREG),HL
			CALL	DISPD
			JP		START2

REGOFF:		LD		(REGFLAG),A
			LD		HL,(PCSAVE)
			LD		(ADRSREG),HL
			LD		HL,(AFSAVE)
			LD		(DATAREG),HL
			CALL	DISPAANDD
			JP		START2

REGTBL:		.DB		0x77			;"AF"
			.DB		0x71
			.DB		0x7C			;"BC"
			.DB		0x39
			.DB		0x5E			;"DE"
			.DB		0x79
			.DB		0x76			;"HL"
			.DB		0x38
			.DB		0x6D			;"SP"
			.DB		0x73
			.DB		0x73			;"PC"
			.DB		0x39
			.DB		0x06			;"IX"
			.DB		0x76
			.DB		0x06			;"IY"
			.DB		0x6E
			.DB		0xF7			;"A,F,"
			.DB		0xF1
			.DB		0xFC			;"B,C"
			.DB		0xB9
			.DB		0xDE			;"D,E,"
			.DB		0xF9
			.DB		0xF6			;"H,L,"
			.DB		0xB8
			.DB		0x06			;"Ir"
			.DB		0x50
			.DB		0xFC			;"B.A"
			.DB		0x77
			.DB		0xFC			;"B.C"
			.DB		0x58

;=============================================================================
;ナンバーインプットプロセス
;=============================================================================
NUMBER:		LD		A,(IOFLAG)
			OR		A
			JR		Z,SETDATA
			CP		0x80
			JR		Z,IOMODE
			CP		0x01
			JP		Z,REGNMB
			JP		START2

SETDATA:	CALL	DISPKEY
			JP		START2

;=============================================================================
;I/Oモードナンバープロセス
;=============================================================================
IOMODE:		XOR		A
			LD		(IOFLAG),A
			LD		A,B
			CP		0x0E
			JR		Z,INPUT
			CP		0x0F
			JR		Z,OUTPUT
			JP		START2

INPUT:		LD		HL,0x5404
			LD		(LED1BUF),HL
			LD		A,(ADRSREG)
			LD		C,A
			IN		A,(C)
			LD		(DATAREG),A
			CALL	DISPD
			JP		START2

OUTPUT:		LD		HL,0x445C
			LD		(LED1BUF),HL
			LD		A,(ADRSREG)
			LD		C,A
			LD		A,(DATAREG)
			OUT		(C),A
			CALL	DISPD
			JP		START2

;=============================================================================
;ワンステップルーチン
;=============================================================================
RST7:		LD		(HLSAVE),HL
			POP		HL
			LD		(DESAVE),DE
			LD		(BCSAVE),BC
			PUSH	AF
			LD		BC,(BKCOUNT)
			LD		A,C
			OR		B
			JR		Z,RST72
			LD		DE,(BKADRS)
			LD		A,L
			CP		E
			JR		NZ,RST71
			LD		A,H
			CP		D
			JR		NZ,RST71
			DEC		BC
			LD		(BKCOUNT),BC

RST71:		POP		AF
			PUSH	HL
			LD		BC,(BCSAVE)
			LD		DE,(DESAVE)
			LD		HL,(HLSAVE)
			EI
			RET

RST72:		LD		(PCSAVE),HL
			LD		(ADRSREG),HL
			POP		HL
			LD		(AFSAVE),HL
			LD		(DATAREG),HL
			LD		(SPSAVE),SP
			LD		SP,IXSAVE+2
			PUSH	IX
			PUSH	IY
			EX		AF,AF'
			PUSH	AF
			EXX
			PUSH	BC
			PUSH	DE
			PUSH	HL
			LD		A,I
			LD		H,A
			LD		A,R
			LD		L,A
			PUSH	HL
			JP		START1

;=============================================================================
;NMIルーチン
;=============================================================================
MON:		LD		(HLSAVE),HL
			POP		HL
			PUSH	AF
			LD		A,H
			CP		0x20
			JR		NC,MON1
			POP		AF
			PUSH	HL
			LD		HL,(HLSAVE)
			RET

MON1:		LD		(DESAVE),DE
			LD		(BCSAVE),BC
			JR		RST72

;*****************************************************************************
;サブルーチン類
;*****************************************************************************
;=============================================================================
;キーインプット
;=============================================================================
KEYIN:		CALL	KEYON
			AND		A
			JR		Z,KEYIN
			LD		A,B
			RET

KEYON:		IN		A,(CMD79)
			AND		0x0F
			RET		Z
			IN		A,(DATA79)
			AND		0x1F
			LD		B,A
			LD		A,0xFF
			RET

;=============================================================================
;ディスプレイ表示処理
;=============================================================================
DISPAANDD:	LD		HL,ADRSREG+1
			LD		DE,LEDADRS
			LD		B,4

DISP0:		LD		A,(HL)
			LD		(DE),A
			DEC		HL
			INC		DE
			DJNZ	DISP0
			CALL	LEDDISP
			RET

LEDDISP:	LD		HL,LEDADRS
			LD		DE,LED1BUF

DISP1:		LD		BC,SEGMTBL

DISP2:		LD		A,(HL)
			INC		HL
			PUSH	HL
			PUSH	AF
			AND		0xF0
			RRCA
			RRCA
			RRCA
			RRCA
			LD		H,0x00
			LD		L,A
			ADD		HL,BC
			LD		A,(HL)
			LD		(DE),A

			INC		DE
			POP		AF
			AND		0x0F
			LD		H,0x00
			LD		L,A
			ADD		HL,BC
			LD		A,(HL)
			LD		(DE),A
			POP		HL
			INC		E
			JR		NZ,DISP1

;=============================================================================
;ディスプレイデータをUPD8279RAMへ転送
;=============================================================================			
DRIVE:		LD		A,0x90
			OUT		(CMD79),A
			LD		B,0x08
			LD		C,DATA79
			LD		HL,LED1BUF
			OTIR
			RET

;=============================================================================
;7セグデータテーブル
;=============================================================================
SEGMTBL:	.DB		0x3F	;"0"
			.DB		0x06	;"1"
			.DB		0x5B	;"2"
			.DB		0x4F	;"3"
			.DB		0x66	;"4"
			.DB		0x6D	;"5"
			.DB		0x7D	;"6"
			.DB		0x27	;"7"
			.DB		0x7F	;"8"
			.DB		0x6F	;"9"
			.DB		0x77	;"A"
			.DB		0x7C	;"B"
			.DB		0x39	;"C"
			.DB		0x5E	;"D"
			.DB		0x79	;"E"
			.DB		0x71	;"F"

;=============================================================================
;ディスプレイデータレジスター
;=============================================================================
DISPD:		LD		HL,DATAREG+1
			LD		DE,LEDDATA
			LD		B,2

DISP3:		LD		A,(HL)
			LD		(DE),A
			DEC		HL
			INC		DE
			DJNZ	DISP3
			LD		HL,LEDDATA
			LD		DE,LED5BUF
			JR		DISP1

DATASET:	LD		A,(DATAREG)
			LD		(DATAREG+1),A
			LD		A,(HL)
			LD		(DATAREG),A
			RET

DISPKEY:	CALL	DATASFT
			LD		A,(DATAREG)
			OR		B
			LD		(DATAREG),A
			CALL	DISPD
			RET

DATASFT:	LD		HL,(DATAREG)
			ADD		HL,HL
			ADD		HL,HL
			ADD		HL,HL
			ADD		HL,HL
			LD		(DATAREG),HL
			RET

;*****************************************************************************
;END
;*****************************************************************************