;										Ｐ		Ｐ
;										Ｉ		Ｉ
;										Ｃ		Ｃ
;										変		変
;										換		換
;										チ		元
;										ェ		開
;										ッ		始
;										ク		位
;								　		置
;								↓		↓
;トランジスタ技術　１９９７年　５月号				;		;　　ＰＩＣ１６Ｃ８４で作るビデオゲーム
;瀬戸口　豊氏　発表のソフトを					;		;　　　　ワンチップ　ブレークアウト
;ＡＶＲに移植							;		;
;２００２．０９．１１ 小椋					;		;　　　　’９６／０２／２１
;２００３．１２　kunio.h　ATtiny26用				;		;	   　Ｂｙ　Ｓ．Ｍａｇｉｃｉａｎ
;								;		;
;AVR Studio 4.05 でアッセンブル					;		;		'MPALC' でアッセンブル
;								;		;
.NOLIST								;
.include	"TN26DEF.INC"					;				INCLUDE 'PICREG.EQU'	;MPALC の標準的定義
.LIST								;
								;		;
								;				LIST	P=16C84
								;				LIST	R=DEC
								;		;
								;		============================================================
								;		;		入出力ピンの定義
								;		;
;		ポートB						;		;		ポートＡ
.EQU	AUD 	=PB0						;		AUD 	EQU 	0		;PA0　効果音出力
								;		AUDB	EQU 	1		;PA0　2^AUD
.EQU	PDIN	=PB3						;		PDIN	EQU 	1		;PA1　パドル入力
.EQU	SYNC	=PB1						;		SYNC	EQU 	2		;PA2　同期信号出力
								;		SYNCB	EQU 	4		;PA2　2^SYNC
.EQU	PDOUT	=PB2						;		PDOUT	EQU 	3		;PA3　パドル入力の充放電
;.EQU	SW2 	=PA4	;追加					;		;
;		ポートA	
.EQU	VD	=PA7						;		VD		EQU 	7		;PB7　輝度信号
								;		;
								;		;		レジスタの割付
.DEF	LPM_	=R0	;LPM	R0	,Z	;暗黙的		;		;
.DEF	TLC 	=R1 						;		TLC 	EQU 	00DH	;総ラスタカウンタ
.DEF	LCNT	=R2 						;		LCNT	EQU 	00EH	;１行のラスタカウンタ
.DEF	XCNT	=R3 						;		XCNT	EQU 	00FH	;走査中の行
								;		;
.DEF	WRKF	=R4 						;		WRKF	EQU 	010H	;作業用フラグ
.EQU	VSF 	=0						;		VSF 	EQU 	  0 	;　V_SYNC フラグ
.EQU	HSF 	=1						;		HSF 	EQU 	  1 	;　H_SYNC フラグ
.EQU	HMF 	=2						;		HMF 	EQU 	  2 	;　ボールの水平移動
.EQU	T_ON	=3						;		T_ON	EQU 	  3 	;　効果音 ON/OFF Control
.EQU	MISSF	=4						;		MISSF	EQU 	  4 	;　パドルでミス
.EQU	MISSF2	=5						;		MISSF2	EQU 	  5 	;
.EQU	GOVF	=6						;		GOVF	EQU 	  6 	;　ゲームオーバー
								;		;
.DEF	W_SAVE	=R5 						;		W_SAVE	EQU 	011H	;割り込み時の保存用
.DEF	S_SAVE	=R6 						;		S_SAVE	EQU 	012H
								;		;
.DEF	BX	=R7 						;		BX		EQU 	013H	;ボールのＸ座標
.DEF	BY	=R8 						;		BY		EQU 	014H	;		 Ｙ座標
.DEF	BDX 	=R9 						;		BDX 	EQU 	015H	;		 移動速度 dx
.DEF	BDY 	=R10 						;		BDY 	EQU 	016H	;				  dy
.DEF	CBX 	=R11						;		CBX 	EQU 	017H	;		 Ｘ座標計算用
.DEF	CBY 	=R12						;		CBY 	EQU 	018H	;		 Ｙ
.DEF	BN	=R13						;		BN		EQU 	019H	;ボールの残り数
.DEF	PY	=R14						;		PY		EQU 	01AH	;パドルの位置
								;		;
.DEF	SCRH	=R15						;		SCRH	EQU 	01BH	;スコア
.DEF	SCRL	=R16						;		SCRL	EQU 	01CH	;
.DEF	BLKCNT	=R17						;		BLKCNT	EQU 	01DH	;ブロックの残り数
.DEF	SCRCNT	=R18						;		SCRCNT	EQU 	01EH	;クリヤ面の数
								;		;
.DEF	SC1 	=R19						;		SC1 	EQU 	01FH	;SCRATCH1
.DEF	SC2 	=R20						;		SC2 	EQU 	020H	;SCRATCH2

								;		;
.DSEG		;ﾃﾞｰﾀ ｾｸﾞﾒﾝﾄの開始			 	;
VR0:	.BYTE	5						;		VR0 	EQU 	021H	;ブロック用 VRAM 5bytes
								;		;						 021H - 025H
CVR0:	.BYTE	10						;		CVR0	EQU 	026H	;得点表示用 VRAM 2bytes x 5 LINES
								;		;						 026H - 02FH
								;		;
								;		;				！！　ご注意　！！
								;		;		レジスタ 08Hと09H はデータ EEPROM用です。
								;		;		効果音用のレジスタが足らなくなったので流用しています。
								;		;
.DEF	TONE	=R21						;		TONE	EQU 	008H	;効果音の周波数　15.75KHz / TONE
.DEF	TONE2	=R22	;効果音発生カウンター			;		TONE2	EQU 	009H	;
.DEF	W_REG	=R23 	;Ｗレジスタ				;
.DEF	TMP	=R24 	;テンポラリ				;
.DEF	AUDB	=R25	;音声					;
.DEF	SYNCB	=R26	;同期信号				;
								;
.EQU	SREG_C	=0	 	;ｷｬﾘｰ ﾌﾗｸﾞ 			;
.EQU	SREG_Z	=1	 	;ｾﾞﾛ ﾌﾗｸﾞ 			;
.EQU	SREG_N	=2	 	;負ﾌﾗｸﾞ 			;
.EQU	SREG_V	=3	 	;2の補数ｵｰﾊﾞｰﾌﾛｰ ﾌﾗｸﾞ		;
.EQU	SREG_S	=4	 	;符号ﾌﾗｸﾞ 			;
.EQU	SREG_H	=5	 	;ﾊｰﾌｷｬﾘｰ ﾌﾗｸﾞ 			;
.EQU	SREG_T	=6	 	;ﾃﾝﾎﾟﾗﾘ ﾋﾞｯﾄ 			;
.EQU	SREG_I	=7	 	;全割り込み許可ﾌﾗｸﾞ 		;
								;		;
								;		;============================================================
								;		;		家庭用テレビ受像機に同期するための定数定義
								;		;
								;		;		水平同期周波数=15.75KHz 垂直同期周波数=60Hz
								;		;		PIC16C84のクロックは10MHz で計算する
								;		;
.EQU	TM0PRE	=14 						;		TM0PRE	SET 	105 	;TIMER0 のプリセット値は
;256-(4MHz/15.75KHz)+4    +2   +6 => 14.03			;		;						 256-(10MHz/4/15.75KHz)+8 => 105
;			TOV0  RJMP HINST			;		;
.EQU	TLS 	=254						;		TLS 	SET 	254 	;総ラスタ数は 15.75KHz/60Hz => 262
								;								;V_sync期間をのぞくと 262-8 => 254
								;		;
								;		;============================================================
								;		;		プログラム コード本体
								;		;
.CSEG				;ｺｰﾄﾞ ｾｸﾞﾒﾝﾄの開始 		;
 	rjmp	INIT	 ;各種ﾘｾｯﾄ
 	reti	;RJMP	 EXT_INT0	 ;外部割り込み要求0
 	reti	;RJMP	 PIN_CHG	 ;I/Oﾋﾟﾝ ﾚﾍﾞﾙ変化
	reti	;RJMP	 TIM1_COMPA	 ;ﾀｲﾏ/ｶｳﾝﾀ1 比較A一致
 	reti	;RJMP	 TIM1_COMPB	 ;ﾀｲﾏ/ｶｳﾝﾀ1 比較B一致
 	reti	;RJMP	 TIM_OVF1	 ;ﾀｲﾏ/ｶｳﾝﾀ1 ｵｰﾊﾞｰﾌﾛｰ
	rjmp	HSINT	 ;TIM_OVF0	 ;ﾀｲﾏ/ｶｳﾝﾀ0 ｵｰﾊﾞｰﾌﾛｰ	;		;		TIMER0のオーバフローで割り込み発生
								;		;		同期信号と効果音発生
 	reti	;RJMP	 USI_STRT	 ;多用途ｼﾘｱﾙ ｲﾝﾀｰﾌｪｰｽ 開始条件検出
 	reti	;RJMP	 USI_OVF	 ;多用途ｼﾘｱﾙ ｲﾝﾀｰﾌｪｰｽ ｶｳﾝﾀ ｵｰﾊﾞｰﾌﾛｰ
 	reti	;RJMP	 EE_RDY	 ;EEPROM 操作可
 	reti	;RJMP	 ANA_COMP	 ;ｱﾅﾛｸﾞ ｺﾝﾊﾟﾚｰﾀ 出力遷移
 	reti	;RJMP	 ADC	 ;A/D変換完了

								;		;
HSINT:	MOV	W_SAVE	,W_REG	;1				;		HSINT	MOVWF	W_SAVE			;割り込み時にWとSTATUSを保存
	IN	S_SAVE	,SREG	;1				;				MOVF	STATUS,W		;　気休め程度
								;				MOVWF	S_SAVE
								;		;
								;		;		水平同期
								;		;
H_SYNC:	CBI	PORTA	,VD	;2				;		H_SYNC	BCF 	PORTA,VD
HS2:	LDI	W_REG	,TM0PRE	;1				;		HS2 	MOVLW	TM0PRE			;水平同期周波数にそって
	OUT	TCNT0	,W_REG	;1				;				MOVWF	TMR0			;TIMER0 をプリセット
	DEC		TLC					;				DECF	TLC
	BRBC	SREG_Z	,SKIP1	;1	2			;				BTFSC	STATUS,Z		;総ラスタカウンタが 0 になれば
;RCALL	VSYNC			;				;				CALL	VSYNC			;  垂直同期発生へ
;*******サブルーチンを直接組込****************************************************************************************
VSYNC:	CBI 	PORTA	,VD		;2	2		;		VSYNC	BCF 	PORTA,VD
	SBRC	WRKF	,VSF;SKIP4	;1	2		;				BTFSC	WRKF,VSF
	RJMP	VSING			;2			;				GOTO	VSING
SKIP4:	LDI	W_REG	,8		;	1		;				MOVLW	8				;8 Times HV_Complex SYNC
	MOV	TLC,W_REG		;	1		;				MOVWF	TLC
	SET				;	1		;
	BLD	WRKF,VSF		;	1		;				BSF 	WRKF,VSF
	CBI	PORTB,SYNC		;	2		;				BCF 	PORTA,SYNC		;V_SYNC Going
	RJMP	SKIP1			;	2		;				RETURN
					;	=12		;		;
VSING:	LDI	W_REG	,TLS		;1			;		VSING	MOVLW	TLS
	MOV	TLC,W_REG		;1			;				MOVWF	TLC 			;総ラスタ数をプリセット
	CLT				;1			;
	BLD 	WRKF,VSF		;1			;				BCF 	WRKF,VSF
	NOP				;1			;	
	SBI 	PORTB,SYNC		;2			;				BSF 	PORTA,SYNC		;End of V_SYNC
						;=12		;		;
;********************************************************************************************************************
SKIP1:	IN	W_REG,PORTB					;				MOVLW	SYNCB
	EOR	W_REG	,SYNCB					;				XORWF	PORTA			;水平同期発生
	OUT	PORTB	,W_REG					;
	RCALL	DLY6		;10				;				CALL	DLY6			;　|
	RCALL	DLY4		;7				;				CALL	DLY4			;  | 12マシンサイクルで 4.8uS.
	EOR	W_REG	,SYNCB	;1				;				MOVLW	SYNCB			;  |
	OUT	PORTB	,W_REG	;2				;				XORWF	PORTA			;  |
								;		;
								;		;		T_ON フラグがセットされている時
								;		;		15.75KHz / TONE /2 の周波数で効果音を発生
								;		;
	DEC	TONE2						;				DECFSZ	TONE2			;TONE DIV CNT
	BREQ	SKIP2		;1	2			;
	RJMP	TN1		;2	0			;				GOTO	TN1
SKIP2:								;				MOVLW	AUDB
	IN	W_REG	,PORTB	;	1			;
	EOR	W_REG	,AUDB	;	1			;
	SBRC	WRKF	,T_ON	;	1	2  SKIP3	;				BTFSC	WRKF,T_ON
	OUT	PORTB	,W_REG	;	1	0		;				XORWF	PORTA
SKIP3:	MOV	TONE2	,TONE	;	1			;				MOVF	TONE,W
								;				MOVWF	TONE2
	RJMP	TN2		;	2			;				GOTO	TN2
TN1: 	NOP			;1	=9			;		TN1 	CALL	DLY6
	NOP			;1				;
	NOP			;1				;
	NOP			;1				;
	NOP			;1				;
	NOP			;1				;
				;=9				;
								;		;
								;		;		割り込みから戻る
								;		;
TN2: 								;		TN2 	BCF 	INTCON,2		;CLR TIMER0 OVERFLOW FLAG
								;				MOVF	S_SAVE,W		;RESTORE W & STATUS
								;				MOVWF	STATUS
	MOV	W_REG	,W_SAVE					;				MOVF	W_SAVE,W
								;
								;				BCF 	WRKF,HSF		;H_SYNC WAIT CLR
	OUT	SREG	,S_SAVE					;
	SEH							;HSF		;
	RETI							;				RETFIE					;RETURN & GIE
								;		;
								;		;		垂直同期
								;		;
								;		;　８水平同期期間の複合同期信号
						;3	3	;		;
;VSYNC:	CBI 	PORTA	,VD			;2	2	;		VSYNC	BCF 	PORTA,VD
;		SBRC	WRKF	,VSF;SKIP4	;1	2	;				BTFSC	WRKF,VSF
;		RJMP	VSING		;2			;				GOTO	VSING
;SKIP4:	LDI		W_REG	,8	;	1		;				MOVLW	8				;8 Times HV_Complex SYNC
;		MOV		TLC		,W_REG		;	1		;				MOVWF	TLC
;		SET						;	1		;
;		BLD		WRKF	,VSF	;	1	;				BSF 	WRKF,VSF
;		CBI		PORTB	,SYNC	;	2	;				BCF 	PORTA,SYNC		;V_SYNC Going
;		RET						;	4		;				RETURN
;								;	=17		;		;
;VSING:	LDI		W_REG	,TLS		;1		;		VSING	MOVLW	TLS
;		MOV		TLC,W_REG	;1		;				MOVWF	TLC 			;総ラスタ数をプリセット
;		CLT				;1		;
;		BLD 	WRKF	,VSF		;1		;				BCF 	WRKF,VSF
;		SBI 	PORTB	,SYNC		;2		;				BSF 	PORTA,SYNC		;End of V_SYNC
;		RET				;4		;				RETURN
						;=18		;		;
								;		;============================================================
								;		;		水平同期発生を待つ
								;		;
;*****	この割込待ちは失敗	********************		;
;HSGL:								;
;		LDI		TMP		,(1<<SE)	; ｽﾘｰﾌﾟ許可ｺｰﾄﾞをR取得
;		ANDI	TMP		,(0<<SM)		; ﾊﾟﾜｰﾀﾞｳﾝﾓｰﾄﾞ off
;		OUT		MCUCR	,TMP			; ｽﾘｰﾌﾟ許可(MCUCRのSEﾋﾞｯﾄ=1)
;		SLEEP						; ｽﾘｰﾌﾟ動作開始
;		RJMP	HSR					; ウェイクアップ
;***********************************************		;
								;
;*****	この割込待ちは成功	********************		;
HSGL:	LDI	TMP		,250				;		HSGL	MOVF	TMR0,W
	CLH							;HSF		;
HSGL1:	IN	W_REG	,TCNT0		;1			;
	SUB	W_REG	,TMP		;1			;				SUBLW	248 			;TIMER0がオーバフローする直前？
	BRBS	SREG_C	,HSGL1		;1	2		;				BTFSC	STATUS,C
					;	IN	TCNT0	;
	BRHS	HSR	;	253				;
	BRHS	HSR	;	252	248	244	240	;
	BRHS	HSR	;	251	247	243	239	;	
	BRHS	HSR	;	250	246	242	238	;
	BRHS	HSR	;	249	245	241	237	;
	BRHS	HSR	;１ステップ命令にて割込待ち		;
;***********************************************		;
								;
;*****	この割込待ちは失敗	********************		;				GOTO	HSGL
;HSG: 	SBRS	WRKF	,HSF	;SKIP5				;		HSG 	BTFSS	WRKF,HSF		;-----------------------------
;		RJMP	HSR					;				GOTO	HSR 			;
;SKIP5:	SBRS	WRKF	,HSF	;SKIP6				;				BTFSS	WRKF,HSF		;　この間に割り込みが発生し
;		RJMP	HSR					;				GOTO	HSR 			;　HSFフラグがクリアされる
;SKIP6:	SBRS	WRKF	,HSF	;SKIP7				;				BTFSS	WRKF,HSF		;
;		RJMP	HSR					;				GOTO	HSR 			;-----------------------------
;SKIP7:	SBRS	WRKF	,HSF	;SKIP8				;
;		RJMP	HSR					;
;SKIP8:	RJMP	HSG						;				GOTO	HSG
;***********************************************		;
								;		;
HSR: 	RCALL	DLY4	;左側シフト				;		HSR 	BSF 	WRKF,HSF
	RET							;				RETURN
								;		;
								;		;============================================================
								;		;		種々のディレイルーチン
				;3	 3			;		;
DLYC:	MOV	SC1	,W_REG	;1	 1			;		DLYC	MOVWF	SC1 			;Wx3+3 マシンサイクルのディレイ
	SUBI	W_REG	,3	;1	 1			;				SUBLW	2				;W <= 2 の時　7MC
	BRPL	SKIP9		;1	 2			;				BTFSC	STATUS,C		;W=1 7MC,  W=2 7MC
	RET			;4				;				RETURN					;W=3 12MC, W=4 15MC,W=5 18MC
SKIP9:	DEC	SC1		;	 1			;				DECF	SC1
	DEC	SC1		;	 1			;				DECF	SC1
	NOP			;	 1	10		;
DC1: 	NOP			;	 1			;
	NOP			;	 1			;
	DEC	SC1		;	 1			;		DC1 	DECFSZ	SC1
	BRNE	DC1		;	 1	2		;
	RET			;	 4			;				GOTO	DC1
					;=11 =Wx4+3		;		;
;SKIP10:							;
DLY4:				;3				;		DLY4	RETURN					;４マシンサイクル (CALL & RETURN)
	RET			;4		1.75usec	;		;                                1.6usec
								;
DLY6:				;3				;			GOTO DLY4				;６マシンサイクル (GOTO & DLY4)
	NOP			;1				;
	RJMP	DLY4		;2		2.5usec		;		;                                2.4usec
								;		;============================================================
								;		;		スコア表示用　フォント TABLE
								;		;
STT:								;		STT 	ADDWF	PCL 			;相対ジャンプ
								;		;                               ;下記のテーブルから RETLW=$34kk
								;		;		ハイスコア表示用
HIST:								;		HIST	;		  Hi
	.DW		$34A8					;				DATA	34A8H
	.DW		$34A0					;				DATA	34A0H
	.DW		$34E8					;				DATA	34E8H
	.DW		$34A8					;				DATA	34A8H
	.DW		$34A8					;				DATA	34A8H
								;		;
								;		;		プレイヤスコア表示用
P_ST:								;		P_ST	;		  P.
	.DW		$34E0					;				DATA	34E0H
	.DW		$34A0					;				DATA	34A0H
	.DW		$34E0					;				DATA	34E0H
	.DW		$3480					;				DATA	3480H
	.DW		$3488					;				DATA	3488H
								;		;
								;		;		数字表示用
NBT:								;		NBT 	;		 ﾗｽﾀ1　ﾗｽﾀ2　ﾗｽﾀ3　ﾗｽﾀ4　ﾗｽﾀ5
	.DW		$340E,$340A,$340A,$340A,$340E		;				DATA	340EH,340AH,340AH,340AH,340EH	;0
	.DW		$3404,$3404,$3404,$3404,$3404		;				DATA	3404H,3404H,3404H,3404H,3404H	;1
	.DW		$340E,$3402,$340E,$3408,$340E		;				DATA	340EH,3402H,340EH,3408H,340EH	;2
	.DW		$340E,$3402,$340E,$3402,$340E		;				DATA	340EH,3402H,340EH,3402H,340EH	;3
	.DW		$3408,$340A,$340A,$340E,$3402		;				DATA	3408H,340AH,340AH,340EH,3402H	;4
	.DW		$340E,$3408,$340E,$3402,$340E		;				DATA	340EH,3408H,340EH,3402H,340EH	;5
	.DW		$340E,$3408,$340E,$340A,$340E		;				DATA	340EH,3408H,340EH,340AH,340EH	;6
	.DW		$340E,$3402,$3402,$3402,$3402		;				DATA	340EH,3402H,3402H,3402H,3402H	;7
	.DW		$340E,$340A,$340E,$340A,$340E		;				DATA	340EH,340AH,340EH,340AH,340EH	;8
	.DW		$340E,$340A,$340E,$3402,$3402		;				DATA	340EH,340AH,340EH,3402H,3402H	;9
	.DW		$3404,$340A,$340E,$340A,$340A		;				DATA	3404H,340AH,340EH,340AH,340AH	;A
	.DW		$3408,$3408,$340E,$340A,$340E		;				DATA	3408H,3408H,340EH,340AH,340EH	;b
	.DW		$340E,$3408,$3408,$3408,$340E		;				DATA	340EH,3408H,3408H,3408H,340EH	;C
	.DW		$3402,$3402,$340E,$340A,$340E		;				DATA	3402H,3402H,340EH,340AH,340EH	;d
	.DW		$340E,$3408,$340E,$3408,$340E		;				DATA	340EH,3408H,340EH,3408H,340EH	;E
	.DW		$340E,$3408,$340C,$3408,$3408		;				DATA	340EH,3408H,340CH,3408H,3408H	;F
								;		;
								;		;============================================================
								;		;		初期化１　リセットから
								;		;
INIT:								;
        LDI     TMP     ,RAMEND ;スタックポインターアドレス	;
	OUT	SP,TMP	;ＳＰ				;
	LDI	YH	,0					;
	LDI	AUDB	,1<<AUD					;
	LDI	SYNCB	,1<<SYNC				;
	ldi	tmp,0xA8	;
	out	OSCCAL,tmp	;

ADC_int:
	ldi	tmp,0b00101001		;基準電圧VCC、結果左揃え、Ch9選択
	out	ADMUX,tmp
	ldi	tmp,0b11100100		;ADC on,free_run,ADCck=4M/16=250k
	out	ADCSR,tmp
;	LDI	tmp	,1 << ISC11 ;INT0立ち上がりパルス指定	;
;	ORI	tmp	,0 << ISC10 ;INT0立ち上がりパルス指定	;
;	OUT	MCUCR	,tmp	    ;外部割込み条件		;
;	LDI     tmp	,1 << INT0  ;GIMSK: 外部割込み1許可ﾋﾞｯﾄ	;
;	OUT	GIMSK	,tmp					;
								;
	LDI	TMP	,0b11111111	;no out			;		INIT	BSF 	STATUS,RP0		;PAGE 1
	OUT	DDRA	,TMP					;				MOVLW	B'00000010' 	;PA1 を入力に設定
								;				MOVWF	TRISA
	LDI	TMP	,0b00000111	;no out,no pullup	;				CLRF	TRISB			;ポートＢはすべて出力
	OUT	DDRB	,TMP					;							;
								;				MOVLW	B'11001111' 	;TIMER0 プリスケーラなし
	LDI	TMP	,0x1	;CK1				;				MOVWF	OPT
	OUT	TCCR0	,TMP					;		;		;


;loop:
;	cbi	PORTB,0
;	nop
;	nop		;2 clocks
;	sbi	PORTB,0
;	rjmp	loop	;2 clocks

								;				BCF 	STATUS,RP0		;PAGE 0
	CLR	WRKF						;				CLRF	WRKF
	SET							;
	BLD	WRKF	,GOVF
	RCALL	READHI						;				CALL	READHI			;EEPROM からハイスコアを読み出す
	
INIT0:
	CLR	SCRL						;				CLRF	SCRL			;得点クリア
	CLR	SCRH						;				CLRF	SCRH
	CLR	SCRCNT						;				CLRF	SCRCNT
	LDI	TMP	,0b00111111				;				MOVLW	B'00111111' 	;ボール数は６個
	MOV	BN	,TMP					;				MOVWF	BN
								;		;
								;		;		初期化２　１面クリアの時
								;		;
INIT2:	LDI	W_REG	,0xFF					;		INIT2	MOVLW	0FFH
	STS	VR0	,W_REG					;				MOVWF	VR0 			;ブロックをセット
	STS	VR0+1	,W_REG					;				MOVWF	VR0+1
	STS	VR0+2	,W_REG					;				MOVWF	VR0+2
	STS	VR0+3	,W_REG					;				MOVWF	VR0+3
	STS	VR0+4	,W_REG					;				MOVWF	VR0+4
								;				MOVLW	40
	LDI	BLKCNT	,40					;				MOVWF	BLKCNT
								;		;
								;		;		初期化３　新しいボール
								;		;
INIT3:	

	LDI	W_REG	,9					;				MOVLW	9				;ボールの位置をセットする
	MOV	BX	,W_REG					;				MOVWF	BX
	MOV	BY	,W_REG					;				MOVWF	BY
	LDI	W_REG	,72					;				MOVLW	72				;移動計算用位置　( x8 )
	MOV	CBX		,W_REG				;				MOVWF	CBX
	MOV	CBY	,W_REG					;				MOVWF	CBY
	IN      TMP     ,TIMSK					;		;		;
	SET							;
	BLD	TMP	,TOIE0					;				MOVLW	B'10100000' 	;TIMER0 割り込み許可
	OUT	TIMSK	,TMP					;				MOVWF	INTCON
	SEI	;割り込み許可					;
								;		;
								;		;============================================================
								;		;		画面表示のメインルーチン
								;		;		（ＣＲＴＣの仕事をする）
								;		;
MAIN:	LDI	W_REG	,TLS-24					;		MAIN	MOVF	TLC,W			;垂直同期から２４ラスタ待つ
	MOV	TMP	,TLC					;
	SUB	W_REG	,TMP					;				SUBLW	TLS-24
	BRBS	SREG_Z	,SKIP11					;				BTFSS	STATUS,Z
	RJMP	MAIN						;				GOTO	MAIN
SKIP11:								;				CLRWDT
								;		;
								;		;		行単位で画面要素を表示するルーチンを呼び出す
								;		;
	RCALL	LIN0						;				CALL	LIN0			;空白行表示
	RCALL	LINSCR						;				CALL	LINSCR			;得点表示行
	CLR	XCNT						;				CLRF	XCNT			;XCNT は走査中の行を示す
								;		;
L0:	RCALL	LINTOP						;		L0		CALL	LINTOP			;上辺の行
	RCALL	LINLR						;				CALL	LINLR			;ブロックより上
	RCALL	LINLR						;				CALL	LINLR
	RCALL	LINLR						;				CALL	LINLR
L4:	RCALL	LINBLK						;		L4		CALL	LINBLK			;ブロックの行
	RCALL	LINBLK						;				CALL	LINBLK
	RCALL	LINBLK						;				CALL	LINBLK
	RCALL	LINBLK						;				CALL	LINBLK
	RCALL	LINBLK						;				CALL	LINBLK
	RCALL	LINLR						;				CALL	LINLR			;ブロックより下
L10: 	RCALL	LINLR						;		L10 	CALL	LINLR
	RCALL	LINLR						;				CALL	LINLR
	RCALL	LINLR						;				CALL	LINLR
	RCALL	LINLR						;				CALL	LINLR
	RCALL	LINLR						;				CALL	LINLR
	RCALL	LINLR						;				CALL	LINLR
	RCALL	LINLR						;				CALL	LINLR
	RCALL	LINLR						;				CALL	LINLR
	RCALL	LINLR						;				CALL	LINLR
L20:	RCALL	LINLR						;		L20 	CALL	LINLR
	RCALL	LINLR						;				CALL	LINLR
	RCALL	LINLR						;				CALL	LINLR
	RCALL	LINLR						;				CALL	LINLR
								;		;
L24: 	RCALL	LINPDL						;		L24 	CALL	LINPDL			;パドルの行表示
								;		;
								;		;		ここまでが画面表示ルーチン
								;		;============================================================
								;		;		以下がゲームの動きに関するプログラム
								;		;
								;		;
	RCALL	PDL						;				CALL	PDL 			;パドル位置入力
								;		;
	RCALL	SCORE						;				CALL	SCORE			;表示スコアの更新
								;		;
	BST	WRKF	,GOVF					;				BTFSC	WRKF,GOVF
	BRTC	SKIP12						;
	RJMP	GOV2						;				GOTO	GOV2			;=> ゲームオーバ中
								;		;
SKIP12:	BST	WRKF	,MISSF2					;				BTFSC	WRKF,MISSF2
	BRTC	SKIP13						;
	RJMP	PDLM2						;				GOTO	PDLM2			;=> 受け損ない中
SKIP13:	CLT							;		;
	BLD	WRKF	,T_ON					;				BCF 	WRKF,T_ON		;TONE OFF
								;		;
	RCALL	BALL						;				CALL	BALL			;ボールの移動と衝突判定
								;		;
	BST	WRKF	,MISSF					;				BTFSC	WRKF,MISSF
	BRTC	SKIP14						;
	RJMP	PDLMIS						;				GOTO	PDLMIS			;=> 受け損なった
								;		;
SKIP14:	TST	BLKCNT						;				MOVF	BLKCNT,W		;ブロックが残っている
	BREQ	SKIP15						;				BTFSS	STATUS,Z
	RJMP	MAIN						;				GOTO	MAIN			;次のフィールド表示へ
								;		;
SKIP15:	INC	SCRCNT						;				INCF	SCRCNT

	LDI	W_REG	,2					;		INIT3	MOVLW	2				;ボールの速度をセットする
	MOV	BDX	,W_REG					;				MOVWF	BDX 			;BALL dx = 2 :DOWN 2
	LDI	W_REG	,1					;				MOVLW	1				;BALL dy = 1 :RIGHT 1
	MOV	BDY	,W_REG					;				MOVWF	BDY

	RJMP	INIT2						;				GOTO	INIT2			;１面クリア、次の面へ
								;		;
								;		;============================================================
								;		;		受け損なった時の処理
								;		;
PDLMIS:	;CLC							;		PDLMIS	BCF 	STATUS,C
	LSR 	BN						;				RRF 	BN				;残りボールを減らす
	MOV	W_REG	,BN					;				MOVF	BN,W
	BRBC	SREG_Z	,SKIP16					;				BTFSC	STATUS,Z
	RJMP	GAMEOVER					;				GOTO	GAMEOVER
SKIP16:	LDI	TONE	,180					;				MOVLW	180
								;				MOVWF	TONE			;”ブー”
	LDI	W_REG	,60					;				MOVLW	60				;1.0 sec.
	MOV	BY	,W_REG					;				MOVWF	BY				;BY is used as Buzzer TIMER
	SET							;
	BLD	WRKF	,T_ON					;				BSF 	WRKF,T_ON
	CLT							;
	BLD 	WRKF	,MISSF					;				BCF 	WRKF,MISSF
	SET							;
	BLD 	WRKF	,MISSF2					;				BSF 	WRKF,MISSF2
	RJMP	MAIN						;				GOTO	MAIN
								;		;
PDLM2:	DEC	BY						;		PDLM2	DECFSZ	BY
	BREQ	SKIP17						;
	RJMP	MAIN						;				GOTO	MAIN
SKIP17:	CLT							;
	BLD 	WRKF	,MISSF2					;				BCF 	WRKF,MISSF2
	CBI 	PORTB	,AUD					;				BCF 	PORTA,AUD
	RJMP	INIT3						;				GOTO	INIT3
								;		;
								;		;============================================================
								;		;		ゲームオーバーの表示
								;		;
GAMEOVER:							;		GAMEOVER
	CLR	TONE						;				CLRF	TONE			;”低いブー”
	CLR	CBY						;				CLRF	CBY
	LDI	W_REG	,90					;				MOVLW	90				;1.5 sec.
	MOV	BY	,W_REG					;				MOVWF	BY
GOV1:	SET							;
	BLD 	WRKF	,T_ON					;		GOV1	BSF 	WRKF,T_ON
	RCALL	HSGL						;				CALL	HSGL			;画面を暗転
	DEC	CBY						;				DECFSZ	CBY
	BREQ	SKIP18						;
	RJMP	GOV1						;				GOTO	GOV1
SKIP18:	DEC	BY						;				DECFSZ	BY
	BREQ	SKIP19						;
	RJMP	GOV1						;				GOTO	GOV1
SKIP19:	SET							;
	BLD	WRKF	,GOVF					;				BSF 	WRKF,GOVF
	LDI	W_REG	,17					;				MOVLW	17
	MOV	BY	,W_REG					;				MOVWF	BY
	LDI	W_REG	,15					;				MOVLW	15				;スリープまでの表示
	MOV	BX	,W_REG					;				MOVWF	BX
	RCALL	READHI						;				CALL	READHI			;EEPROM からハイスコアを読み出す
	MOV	W_REG	,SCRH					;				MOVF	BDX,W
	SUB	W_REG	,BDX					;				SUBWF	SCRH,W
	BRBC	SREG_C	,SKIP20					;				BTFSS	STATUS,C		;SKIP IF SCRH>=HISCRH
	RJMP	MAIN						;				GOTO	MAIN
SKIP20:	BRBS	SREG_Z	,SKIP21					;				BTFSS	STATUS,Z
	RJMP	NEWREC						;				GOTO	NEWREC
SKIP21:	MOV	W_REG	,SCRL					;				MOVF	BDY,W
	SUB	W_REG	,BDY					;				SUBWF	SCRL,W
	BRBS	SREG_C	,SKIP22					;				BTFSC	STATUS,C		;SKIP IF SCRL<HISCRL
NEWREC:	RCALL	WRITHI						;		NEWREC	CALL	WRITHI			;EEPROM のハイスコアの更新
SKIP22:	RJMP	MAIN						;				GOTO	MAIN
								;		;
								;		;		ゲームオーバー中は
								;		;		ハイスコアとプレイヤの得点を交互に表示
								;		;
GOV2:	CLT							;
	BLD 	WRKF	,T_ON					;		GOV2	BCF 	WRKF,T_ON
	DEC	CBY						;				DECFSZ	CBY
	BREQ	SKIP23						;
	RJMP	MAIN						;				GOTO	MAIN
SKIP23:

	MOV	CBX	,SCRH					;				MOVF	SCRH,W			;SWAP SCRHL <=>BDXY
								;				MOVWF	CBX
	MOV	SCRH,BDX					;				MOVF	BDX,W
								;				MOVWF	SCRH
	MOV	BDX	,CBX					;				MOVF	CBX,W
								;				MOVWF	BDX
	MOV	CBX	,SCRL					;				MOVF	SCRL,W
								;				MOVWF	CBX
	MOV	SCRL	,BDY					;				MOVF	BDY,W
								;				MOVWF	SCRL
	MOV	BDY	,CBX					;				MOVF	CBX,W
								;				MOVWF	BDY
	DEC	BY						;				DECF	BY
	DEC	BX						;				DECFSZ	BX				;4sec. x 15 WAIT
	BREQ	SKIP24						;
	RJMP	MAIN						;				GOTO	MAIN
SKIP24:								;			;
	LDI	W_REG	,17		
	MOV	BY	,W_REG		
	LDI	W_REG	,14		
	MOV	BX	,W_REG		

	RJMP	MAIN


								;		;============================================================
								;		;		スリープに入る前にI/Oピンを出力Ｌにする
								;		;
PWRDWN:								;		PWRDWN	BSF 	STATUS,RP0
								;				CLRF	TRISA			;ポートを出力に変更
	CLR	W_REG						;				BCF 	STATUS,RP0
	OUT	PORTB	,W_REG					;				CLRF	PORTA			;出力をＬにする
	OUT	PORTA	,W_REG					;				CLRF	PORTA
								;				CLRF	EEADR			;EEADRをＬにすると電力が減る？
	LDI	TMP	,(1<<SE); ｽﾘｰﾌﾟ許可ｺｰﾄﾞをR取得		;
	ORI	TMP,(1<<SM1); ﾊﾟﾜｰﾀﾞｳﾝﾓｰﾄﾞ			;
	OUT	MCUCR	,TMP	; ｽﾘｰﾌﾟ許可(MCUCRのSEﾋﾞｯﾄ=1)	;
	SLEEP			; ｽﾘｰﾌﾟ動作開始			;
								;				SLEEP
	RJMP	INIT						;				GOTO	INIT			;Wake upすることはないはず
								;		;
								;		;============================================================
								;		;		ＥＥＰＲＯＭの読書き
								;		;
								;		READHI			;READ HISCORE TO BDX,BDY
								;				BCF 	INTCON,GIE		;INHIBIT GI
								;				BCF 	STATUS,RP0
								;				CLRF	EEADR
								;				BSF 	STATUS,RP0
								;				BSF 	EECON1,RD
								;				BCF 	STATUS,RP0
								;				MOVF	EEDATA,W
								;				MOVWF	BDX
								;				INCF	EEADR
								;				BSF 	STATUS,RP0
								;				BSF 	EECON1,RD
								;				BCF 	STATUS,RP0
								;				MOVF	EEDATA,W
								;				MOVWF	BDY
								;				RETFIE					;ENBLE GI
;**********************************
;* ＥＥＰＲＯＭ初期値
;**********************************
.ESEG							;EEPROMｾｸﾞﾒﾝﾄ開始  
.ORG	$10						;番地
.DB		$05,$00				;HISCORE	BCD 千位 百位 , 十位 一位
.CSEG							;ｺｰﾄﾞ ｾｸﾞﾒﾝﾄの開始 
;
;   * EERR : EEPROMﾗﾝﾀﾞﾑ読み出し *
;ｱｸｾｽ可能になるまで待機し、EEPROMのｱﾄﾞﾚｽEE_AH:EE_ALの内容をEE_DTに取得。
;ﾌﾟﾛｸﾞﾗﾑ ﾜｰﾄﾞ数 : 6 + Return
;実行ｸﾛｯｸｻｲｸﾙ数 : 9 + Return (待機なし時)
READHI:	SBIC	EECR	,EEWE	;EEPROM書き込み動作中以外でｽｷｯﾌﾟ
		RJMP    READHI			;書き込み許可(EEWE)ﾋﾞｯﾄ=0まで待機
;
	LDI	TMP	,$10
	OUT     EEAR   ,TMP	;EEPROMｱﾄﾞﾚｽ ﾚｼﾞｽﾀ下位ﾊﾞｲﾄ設定
	SBI	EECR	,EERE	;読み出し許可(EERE)ﾋﾞｯﾄ設定(読み出し開始)
	IN	BDX	,EEDR	;対応EEPROM内容を取得

	LDI	TMP	,$11
	OUT     EEAR   ,TMP	;EEPROMｱﾄﾞﾚｽ ﾚｼﾞｽﾀ下位ﾊﾞｲﾄ設定
	SBI	EECR	,EERE	;読み出し許可(EERE)ﾋﾞｯﾄ設定(読み出し開始)
	IN	BDY	,EEDR	;対応EEPROM内容を取得

	RET			;呼び出し元へ復帰
;
								;		;
								;		;
								;		WRITHI	;WRITE HISCORE FROM SCRH,SCRL
								;				BCF 	INTCON,GIE
								;				BCF 	STATUS,RP0
								;				CLRF	EEADR
								;				MOVF	SCRH,W
								;				MOVWF	EEDATA
								;				CALL	WRS
								;				INCF	EEADR
								;				MOVF	SCRL,W
								;				MOVWF	EEDATA
								;				CALL	WRS
								;				RETFIE					;ENABLE GI
								;		WRS 	BSF 	STATUS,RP0
								;				BSF 	EECON1,WREN
								;				MOVLW	055H
								;				MOVWF	EECON2
								;				MOVLW	0AAH
								;				MOVWF	EECON2
								;				BSF 	EECON1,WR
								;		WRC 	BTFSS	EECON1,EEIF
								;				GOTO	WRC
								;				BCF 	EECON1,EEIF
								;				BCF 	EECON1,WREN
								;				BCF 	STATUS,RP0
								;				RETURN

;   * 試験ﾌﾟﾛｸﾞﾗﾑ開始 *
WRITHI:
	LDI	TMP	,$10	;書き込みｱﾄﾞﾚｽ下位を取得
	MOV	W_REG	,SCRH	;EEPROM書き込み値を取得
	RCALL	EERW		;EEPROMｱﾄﾞﾚｽ$0010に$AAを書き込み。
	LDI	TMP	,$11	;書き込みｱﾄﾞﾚｽ下位を取得
	MOV	W_REG	,SCRL	;EEPROM書き込み値を取得
	RCALL	EERW		;EEPROMｱﾄﾞﾚｽ$0010に$AAを書き込み。
	MOV	BDX,SCRH
	MOV	BDY,SCRL
	RET
;
;   * EERW : EEPROMﾗﾝﾀﾞﾑ書き込み *
;ｱｸｾｽ可能になるまで待機し、EEPROMのｱﾄﾞﾚｽEE_AH:EE_ALへEE_DTの内容を書き込み。
;ﾌﾟﾛｸﾞﾗﾑ ﾜｰﾄﾞ数 : 7 + Return
;実行ｸﾛｯｸｻｲｸﾙ数 : 11 + Return (待機なし時)
EERW:	SBIC	EECR	,EEWE	;EEPROM書き込み動作中以外でｽｷｯﾌﾟ
	RJMP	EERW		;書き込み許可(EEWE)ﾋﾞｯﾄ=0まで待機
;
	OUT	EEAR,TMP	;EEPROMｱﾄﾞﾚｽ ﾚｼﾞｽﾀ下位ﾊﾞｲﾄ設定
	OUT	EEDR	,W_REG	;EEPROMﾃﾞｰﾀ ﾚｼﾞｽﾀ設定
	CLI			;全割り込み禁止
	SBI	EECR	,EEMWE	;ﾏｽﾀ書き込み許可(EEMWE)ﾋﾞｯﾄ設定 D
	SBI	EECR	,EEWE	;書き込み許可(EEWE)ﾋﾞｯﾄ設定(書き込み開始)
	SEI			;全割り込み許可
	RET			;呼び出し元へ復帰
;
								;		;
								;		;============================================================
								;		;		ＢＣＤ４桁をフォントに展開
								;		;
SCORE:	CLR	SC2						;		SCORE	CLRF	SC2
	MOV	SC1	,SCRH					;
	SWAP	SC1						;				SWAPF	SCRH,W
	ANDI	SC1	,0x0F					;				ANDLW	0FH
								;				MOVWF	SC1
	RCALL	SETNC						;				CALL	SETNC			;４桁目
								;				MOVLW	1
	LDI	SC2	,1					;				MOVWF	SC2
	MOV	SC1	,SCRH					;				MOVF	SCRH,W
	ANDI	SC1	,0x0F					;				ANDLW	0FH
								;				MOVWF	SC1
	RCALL	SETNC						;				CALL	SETNC			;３桁目
								;				MOVLW	2
	LDI	SC2	,2					;				MOVWF	SC2
	MOV	SC1	,SCRL					;
	SWAP	SC1						;				SWAPF	SCRL,W
	ANDI	SC1	,0x0F					;				ANDLW	0FH
								;				MOVWF	SC1
	RCALL	SETNC						;				CALL	SETNC			;２桁目
								;				MOVLW	3
	LDI	SC2	,3					;				MOVWF	SC2
	MOV	SC1	,SCRL					;				MOVF	SCRL,W
	ANDI	SC1	,0x0F					;				ANDLW	0FH
								;				MOVWF	SC1
	RJMP	SETNC						;				GOTO	SETNC			;１桁目
								;		;
								;		;
								;		;		ＳＣ１の数値をフォントにする
								;		;		SC1 is Num (0-F)
								;		;		SC2 is CHR_colum (0-3)
								;		;
SETNC:	LDI	W_REG	,5					;		SETNC	MOVLW	5
	MOV	LCNT	,W_REG					;				MOVWF	LCNT			;5 lusters / CHR
	MOV	W_REG	,SC1					;				MOVF	SC1,W			;W <=NUM
	;CLC							;				BCF 	STATUS,C
	LSL	SC1						;				RLF 	SC1
	LSL	SC1						;				RLF 	SC1 			;SC1 <=NUM x 4
	ADD	SC1	,W_REG					;				ADDWF	SC1 			;SC1 = NUM x 5
	LDI	W_REG	,NBT & 0xFF				;				MOVLW	NBT-STT-1		;Number_Table offset
	ADD	SC1	,W_REG					;				ADDWF	SC1 			;SC1 <= NBTofst + Num
	MOV	W_REG	,SC2					;
	ROR	W_REG						;				RRF 	SC2,W
	LDI	TMP	,CVR0					;
	ADD	W_REG	,TMP					;				ADDLW	CVR0
	MOV	YL	,W_REG					;				MOVWF	FSR 			;FSR <= CVR0+ CHR_C / 2
SNC1:	BST	SC2	,0					;		SNC1	BTFSS	SC2,0
	BRTS	SKIP25			;十位,千位		;
	LD	TMP	,Y		;壱位,百位		;
	SWAP	TMP						;				SWAPF	IND 			;SWAP NIBLE
	ST	Y	,TMP					;
SKIP25:	LD	TMP	,Y					;				MOVLW	0F0H
	ANDI	TMP	,0xF0					;				ANDWF	IND 			;CLR Lo_NIBLE
	ST	Y	,TMP					;
	MOV	ZL	,SC1					;				MOVF	SC1,W
								;				CALL	STT 			;Num_Table CALL
	LDI	ZH	,STT >> 8				;
	LSL	ZL						;
	ROL	ZH						;
	LPM	;R0	,Z	;暗黙的オペランド無		;
	OR	TMP	,R0					;				IORWF	IND 			;SET data to Lo_NIBLE
	ST	Y	,TMP					;
	BST	SC2	,0					;				BTFSS	SC2,0
	BRTS	SKIP26		;1	3			;
	SWAP	TMP						;				SWAPF	IND
	ST	Y	,TMP					;
SKIP26:	INC	SC1						;				INCF	SC1
	INC	YL						;				INCF	FSR 			;STEP2
	INC	YL						;				INCF	FSR
	DEC	LCNT						;				DECFSZ	LCNT
	BREQ	SKIP27						;
	RJMP	SNC1						;				GOTO	SNC1
SKIP27:	RET							;				RETURN
								;		;
								;		;============================================================
								;		;		得点表示の行を表示する
								;		;
LINSCR:	SBRS	WRKF	,GOVF		;SKIP28			;		LINSCR	BTFSS	WRKF,GOVF
	RJMP	LPS						;				GOTO	LPS
SKIP28:								;
LPH: 	SBRS	BX	,0		;SKIP29			;		LPH 	BTFSS	BX,0
	RJMP	LHS						;				GOTO	LHS
SKIP29:								;
LPS: 	LDI	W_REG	,P_ST & 0xFF				;		LPS 	MOVLW	P_ST-STT-1		;「Ｐ．」のフォントテーブル
	RJMP	LSCR1						;				GOTO	LSCR1
LHS: 	LDI	W_REG	,HIST & 0xFF				;		LHS 	MOVLW	HIST-STT-1		;「Ｈｉ」
LSCR1:	MOV	SC1	,W_REG					;		LSCR1	MOVWF	SC1 			;SC1 <= フォントアドレス
	LDI		YL		,CVR0			;				MOVLW	CVR0			;フォントが展開されたVRAM
								;				MOVWF	FSR
	LDI	W_REG	,10					;				MOVLW	10				;１０ラスタで１行
	MOV	LCNT	,W_REG					;				MOVWF	LCNT
LC1: 	SBRS	LCNT	,0		;SKIP30			;		LC1 	BTFSS	LCNT,0
	RJMP	EVEN						;				GOTO	EVEN
SKIP30:								;
	LDI	W_REG	,2					;				MOVLW	2				;奇数ラスタは同じデータを
	SUB	YL	,W_REG					;				SUBWF	FSR 			;表示するためFSRを戻す
	DEC	SC1						;				DECF	SC1
EVEN:	RCALL	HSGL						;		EVEN	CALL	HSGL
	RCALL	DLY6						;				CALL	DLY6
	RCALL	DLY6						;
	MOV	ZL	,SC1					;				MOVF	SC1,W
								;				CALL	STT 			;フォントデータ
	LDI	ZH	,STT >> 8				;
	LSL	ZL						;
	ROL	ZH						;
	LPM	;R0	,Z	;暗黙的				;
	OUT	PORTA	,R0					;				MOVWF	PORTA			;[P.]または[Hi]を表示
	NOP							;				NOP
	LSL	R0						;				RLF 	PORTA
	OUT	PORTA	,R0					;
	NOP							;				NOP
	LSL	R0						;				RLF 	PORTA
	OUT	PORTA	,R0					;
	NOP							;				NOP
	LSL	R0						;				RLF 	PORTA
	OUT	PORTA	,R0					;
	NOP							;				NOP
	LSL	R0						;				RLF 	PORTA
	OUT	PORTA	,R0					;
	NOP							;				NOP
	LSL	R0						;				RLF 	PORTA
	OUT	PORTA	,R0					;
	NOP							;				NOP
	LSL	R0						;				RLF 	PORTA
	OUT	PORTA	,R0					;
	INC	SC1						;				INCF	SC1 			;For next DATA
	LSL	R0						;				RLF 	PORTA
	OUT	PORTA	,R0					;
LC2: 	LD	W_REG	,Y					;		LC2 	MOVF	IND,W			;展開された得点フォントを
	OUT	PORTA	,W_REG					;				MOVWF	PORTA			;ポートＢでシフトして表示
	NOP							;				NOP
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	INC	YL						;				INCF	FSR 			;次の２桁数字を示す
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	LD	W_REG	,Y					;				MOVF	IND,W			;　フォントを取得
	OUT	PORTA	,W_REG					;				MOVWF	PORTA			;　表示開始
	NOP							;				NOP
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	LDI	TMP	,5					;				MOVF	LCNT,W
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	INC	YL						;				INCF	FSR
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD
	SUB	TMP	,LCNT					;				SUBLW	5				;残りボールを小さい四角で表示
	BRBC	SREG_C	,SKIP31					;				BTFSS	STATUS,C
	RJMP	LC3						;				GOTO	LC3
SKIP31:	MOV	W_REG	,BN					;				MOVF	BN,W			;残りボール数を取得
	OUT	PORTA	,W_REG					;				MOVWF	PORTA
	NOP							;				NOP
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD
	LSL	W_REG						;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	NOP							;				NOP
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD
LC3: 	DEC	LCNT						;		LC3 	DECFSZ	LCNT
	BREQ	SKIP32						;
	RJMP	LC1						;				GOTO	LC1
SKIP32:	RCALL	HSGL						;				CALL	HSGL			;２ラスタ開ける
	RCALL	HSGL						;				CALL	HSGL
	RET							;				RETURN
								;		;
								;		;============================================================
								;		;		上の枠線を表示
								;		;
LINTOP:	LDI	W_REG	,7					;		LINTOP	MOVLW	7
	MOV	LCNT	,W_REG					;				MOVWF	LCNT
LT1: 	RCALL	HSGL						;		LT1 	CALL	HSGL	
	RCALL	DLY6						;				CALL	DLY6
	RCALL	DLY4						;				CALL	DLY4
	SBI 	PORTA	,VD					;				BSF 	PORTA,VD		;0 から 26 まで水平線
	LDI	W_REG	,26					;				MOVLW	26
	RCALL	DLYC						;				CALL	DLYC
	NOP							;
	NOP							;
	NOP							;
	NOP							;
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD
	DEC	LCNT						;				DECFSZ	LCNT
	BREQ	SKIP33						;
	RJMP	LT1						;				GOTO	LT1
SKIP33:	INC	XCNT						;				INCF	XCNT
	RET							;				RETURN
								;		;
								;		;============================================================
								;		;		ブロックのある行を表示
								;		;
LINBLK:	MOV	W_REG	,XCNT					;		LINBLK	MOVF	BX,W			;この行にボールがあれば
	SUB		W_REG	,BX				;				SUBWF	XCNT,W			;ボール表示ルーチンへ
	BRBC	SREG_Z	,SKIP34					;				BTFSC	STATUS,Z
	RJMP	BLIN						;				GOTO	BLIN
SKIP34:	LDI	W_REG	,6					;				MOVLW	6
	MOV	LCNT	,W_REG					;				MOVWF	LCNT
LV1: 	RCALL	HSGL						;		LV1 	CALL	HSGL	
	MOV	W_REG	,XCNT					;				MOVF	XCNT,W
	LDI	TMP	,VR0-4					;
	ADD	W_REG	,TMP					;				ADDLW	VR0-4
	MOV	YL	,W_REG					;				MOVWF	FSR
	RCALL	DLY4						;				CALL	DLY4
	NOP							;				NOP
	NOP							;
	NOP							;
	SEC							;				BSF 	STATUS,C
	LD	W_REG	,Y					;
	ROR 	W_REG						;				RRF 	IND,W	
	OUT	PORTA	,W_REG					;				MOVWF	PORTA			;左の枠線
	RCALL	DLY4						;				CALL	DLY4
	ROL 	W_REG						;				BCF 	PORTA,VD
	CBI	PORTA	,VD					;				RLF 	PORTA			;VRAM のBIT がブロック
	OUT	PORTA	,W_REG					;
	RCALL	DLY6						;				CALL	DLY6			; ↓　８回繰り返し
	NOP							;				NOP
	ROL 	W_REG						;				BCF 	PORTA,VD
	CBI	PORTA	,VD					;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	RCALL	DLY6						;				CALL	DLY6
	NOP							;				NOP
	ROL 	W_REG						;				BCF 	PORTA,VD
	CBI	PORTA	,VD					;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	RCALL	DLY6						;				CALL	DLY6
	NOP							;				NOP
	ROL 	W_REG						;				BCF 	PORTA,VD
	CBI	PORTA	,VD					;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	RCALL	DLY6						;				CALL	DLY6
	NOP							;				NOP
	ROL 	W_REG						;				BCF 	PORTA,VD
	CBI	PORTA	,VD					;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	RCALL	DLY6						;				CALL	DLY6
	NOP							;				NOP
	ROL 	W_REG						;				BCF 	PORTA,VD
	CBI	PORTA	,VD					;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	RCALL	DLY6						;				CALL	DLY6
	NOP							;				NOP
	ROL 	W_REG						;				BCF 	PORTA,VD
	CBI	PORTA	,VD					;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	RCALL	DLY6						;				CALL	DLY6
	NOP							;				NOP
	ROL 	W_REG						;				BCF 	PORTA,VD
	CBI	PORTA	,VD					;				RLF 	PORTA
	OUT	PORTA	,W_REG					;
	RCALL	DLY6						;				CALL	DLY6
	ROL 	W_REG						;				NOP
	CBI	PORTA	,VD					;				BCF 	PORTA,VD
								;		;
	OUT	PORTA	,W_REG					;				BSF 	PORTA,VD		;右側枠線
	RCALL	DLY4						;				CALL	DLY4
	NOP							;
	CBI	PORTA	,VD					;				BCF 	PORTA,VD
	DEC	LCNT						;				DECFSZ	LCNT
	BREQ	SKIP35						;
	RJMP	LV1						;				GOTO	LV1
SKIP35:	LDI	W_REG	,1					;				MOVLW	1				;最後の１ラスタは隙間
	INC	LCNT						;				INCF	LCNT
	RJMP	LR1						;				GOTO	LR1 			;USE LINLR routine
								;		;
								;		;============================================================
								;		;		左右の縦枠部分を表示
								;		;
LINLR:	MOV	W_REG	,XCNT					;		LINLR	MOVF	BX,W
	SUB	W_REG	,BX					;				SUBWF	XCNT,W			;この行にボールがあれば
	BRBC	SREG_Z	,SKIP36					;				BTFSC	STATUS,Z
	RJMP	BLIN						;				GOTO	BLIN			;ボール表示ルーチンへ
SKIP36:	LDI	W_REG	,7					;				MOVLW	7				;L R Edge LINE
	MOV	LCNT	,W_REG					;				MOVWF	LCNT
LR1: 	RCALL	HSGL						;		LR1 	CALL	HSGL	
	RCALL	DLY6						;				CALL	DLY6
	RCALL	DLY4						;				CALL	DLY4
	SBI 	PORTA	,VD					;				BSF 	PORTA,VD		;左の枠
	RCALL	DLY4						;				CALL	DLY4
	NOP							;
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD
	LDI	W_REG	,22					;				MOVLW	22				;22個の空白
	RCALL	DLYC						;				CALL	DLYC
	NOP							;				NOP
	NOP							;				NOP
	NOP							;
	NOP							;
	SBI 	PORTA	,VD					;				BSF 	PORTA,VD		;右の枠
	RCALL	DLY4						;				CALL	DLY4
	NOP							;
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD
	DEC	LCNT						;				DECFSZ	LCNT
	BREQ	SKIP37						;
	RJMP	LR1						;				GOTO	LR1
SKIP37:	INC	XCNT						;				INCF	XCNT
	RET							;				RETURN
								;		;
								;		;		ボールの表示
								;		;
BLIN:	LDI	W_REG	,7					;		BLIN	MOVLW	7
	MOV	LCNT	,W_REG					;				MOVWF	LCNT			;BALL DSP LINE
B1:	RCALL	HSGL						;		B1		CALL	HSGL	
	NOP							;				NOP
	NOP							;				NOP
	NOP							;
	NOP							;
	NOP							;
	NOP							;
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD		;'BY' TIMES SPACE
	MOV	W_REG	,BY					;				MOVF	BY,W
	RCALL	DLYC						;				CALL	DLYC
	SBI 	PORTA	,VD					;				BSF 	PORTA,VD		;BALL
	NOP							;				NOP
	NOP							;				NOP
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD		;3M cycle
	DEC	LCNT						;				DECFSZ	LCNT
	BREQ	SKIP38						;
	RJMP	B1						;				GOTO	B1
SKIP38:	INC	XCNT						;				INCF	XCNT
	RET							;				RETURN
								;		;					
								;		;		空白の行
								;		;
LIN0:	LDI	W_REG	,7					;		LIN0	MOVLW	7
	MOV	LCNT	,W_REG					;				MOVWF	LCNT
L01: 	RCALL	HSGL						;		L01 	CALL	HSGL	
	DEC	LCNT						;				DECFSZ	LCNT
	BREQ	SKIP39						;
	RJMP	L01						;				GOTO	L01
SKIP39:	INC	XCNT						;				INCF	XCNT
	RET							;				RETURN
								;		;
								;		;		パドルの行を表示
								;		;
LINPDL:	LDI	W_REG	,4					;		LINPDL	MOVLW	4
	MOV	LCNT	,W_REG					;				MOVWF	LCNT
LP1: 	;RCALL	DLY4						;		LP1 	CALL	DLY4
	RCALL	HSGL						;				CALL	HSGL
	NOP							;				NOP
	;NOP							;				NOP
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD
	MOV	W_REG	,PY					;				MOVF	PY,W			;SET PDL POS AT PY
	RCALL	DLYC						;				CALL	DLYC
	nop
	nop
	nop
	nop
	nop	;4cyc
	SBI 	PORTA	,VD					;				BSF 	PORTA,VD		;PDL START
	RCALL	DLY4						;				CALL	DLY6			;PDL_LEN = 12M cycles
	RCALL	DLY4						;				CALL	DLY4
;	NOP							;				NOP
	CBI 	PORTA	,VD					;				BCF 	PORTA,VD
	DEC	LCNT						;				DECFSZ	LCNT
	BREQ	SKIP40						;
	RJMP	LP1						;				GOTO	LP1
SKIP40:	INC	XCNT						;				INCF	XCNT
	RET							;				RETURN
								;		;
								;		;============================================================
								;		;		パドル位置の入力
								;		;
PDL:; 	CLR	PY						;		PDL 	CLRF	PY
	RCALL	HSGL						;				CALL	HSGL			;As prevent INT disturb
	CBI 	PORTB	,PDOUT					;				BCF 	PORTA,PDOUT 	;TRIGER CR timer
PDIN1:;	INC		PY					;		PDIN1	INCF	PY
;	NOP				;角度調整		;
;	NOP				;角度調整		;
	in	PY,ADCL	;読み捨て
	in	PY,ADCH	;PY=AD/4
	TST	PY
	BRNE	SKIP40_1
	BST	WRKF	,GOVF					;				BTFSC	WRKF,GOVF
	BRTC	SKIP40_1
	RJMP	GAME_START
SKIP40_1:	
;	BRBC	SREG_Z	,SKIP41					;				BTFSC	STATUS,Z
;	RJMP	PDRS			;OVER			;				GOTO	PDRS
;SKIP41:	SBIC	PINB	,PDIN	;SKIP42			;				BTFSC	PORTA,PDIN		;Cheack PD_input Going Low
;	RJMP	PDIN1						;				GOTO	PDIN1
;SKIP42:	CLC						;				BCF 	STATUS,C
	lsr	PY		;AD/8				;				RRF 	PY				;Sensiblity 1/2
	mov	W_REG,PY	;w=AD/8
	lsr	PY		;AD/16
	add	PY,W_REG	;PY=AD/8+AD/16=3*AD/16
	lsr	PY		;3*AD/32
	lsr	PY		;PY=3*AD/64 --> ADmax=1024*3/64 --> PY:48 <--> 0
	ldi	W_REG,12	
	sub	PY,	W_REG	;PY:36 <--> -12   use 24 <--> 3
	brcs	SKIP44	
	LDI	W_REG	,23					;				MOVF	PY,W
	SUB	W_REG	,PY					;				SUBLW	23
	BRBS	SREG_C	,SKIP43					;				BTFSC	STATUS,C		;23 < PY C is CLR
	RJMP	PDLC						;				GOTO	PDLC
SKIP43:								;
PDRS:	LDI	W_REG	,24					;		PDRS	MOVLW	24
	MOV	PY	,W_REG					;				MOVWF	PY
	RJMP	PDLRET						;				GOTO	PDLRET
PDLC:	LDI	W_REG	,2					;		PDLC	MOVF	PY,W
	SUB	W_REG	,PY					;				SUBLW	2
	BRBC	SREG_C	,SKIP44					;				BTFSS	STATUS,C		;2 >= PY  C is SET LEFTSIDE
	RJMP	PDLRET						;				GOTO	PDLRET
SKIP44:	LDI	W_REG	,3					;				MOVLW	3
	MOV	PY	,W_REG					;				MOVWF	PY				;3 =< PY =< 23
PDLRET:	SBI 	PORTB	,PDOUT					;		PDLRET	BSF 	PORTA,PDOUT 	;SET PDOUT for next TRIGER
	RET							;				RETURN
								;		;
								;		;============================================================
								;		;		ボールの移動、枠線への衝突と跳ね返り
								;		;
BALL:	RCALL	PHC						;		BALL	CALL	PHC 			;PDL HIT Cheack
	RCALL	BVM						;				CALL	BVM 			;VERTICAL MOVE
	CLT							;
	BLD 	WRKF	,HMF					;				BCF 	WRKF,HMF		;CLR H_MOVE FLAG
	RCALL	BHC						;				CALL	BHC 			;BLK HIT Cheack
	RCALL	BHM						;				CALL	BHM 			;Ball Horizont MOVE
	SET							;
	BLD 	WRKF	,HMF					;				BSF 	WRKF,HMF		;SET H_MOVE
	RJMP	BHC						;				GOTO	BHC 			;BLK HIT CHK & RETURN
								;
BVM: 	MOV	W_REG	,BDX					;		BVM 	MOVF	BDX,W			;Vertical MOVE
	ADD	CBX	,W_REG					;				ADDWF	CBX
	;CLC							;				BCF 	STATUS,C
	MOV 	W_REG	,CBX					;				RRF 	CBX,W
	LSR	W_REG						;
	MOV	BX	,W_REG					;				MOVWF	BX
	;CLC							;				BCF 	STATUS,C
	LSR 	BX						;				RRF 	BX
	;CLC							;				BCF 	STATUS,C
	LSR 	BX						;				RRF 	BX				;BX <= CBX/8
	LDI	W_REG	,0					;				MOVF	BX,W
	SUB	W_REG	,BX					;				SUBLW	0
	BRBC	SREG_C	,SKIP45					;				BTFSS	STATUS,C		;0 >= BX  C is SET,TOP	
	RET							;				RETURN
SKIP45:								;
TOP: 	COM	BDX						;		TOP 	COMF	BDX 			;REVERSE & INC BDX
	INC	BDX						;				INCF	BDX
	INC	BDX						;				INCF	BDX
	LDI	W_REG	,8					;				MOVF	BDX,W
	SUB	W_REG	,BDX					;				SUBLW	8				;BDX > 8 ,C is CLR
	BRBC	SREG_C	,SKIP46					;				BTFSS	STATUS,C
	RJMP	XLIMIT						;				GOTO	XLIMIT
SKIP46:	MOV	W_REG	,BDX					;				MOVF	SCRCNT,W
	LDI	TMP	,3					;				ADDLW	3
	ADD	TMP	,SCRCNT					;
	SUB	W_REG	,TMP					;				SUBWF	BDX,W			;BDX < SCRCNT+3,C is CLR
	BRBS	SREG_C	,SKIP47					;				BTFSC	STATUS,C
XLIMIT:	DEC	BDX						;		XLIMIT	DECF	BDX 			;BDX =< 8
SKIP47:	RET							;				RETURN
								;		;
BHM: 	MOV	W_REG	,BDY					;		BHM 	MOVF	BDY,W			;Horizontal MOVE
	ADD	CBY	,W_REG					;				ADDWF	CBY
	;CLC							;				BCF 	STATUS,C
	MOV	W_REG	,CBY					;
	LSR 	W_REG						;				RRF 	CBY,W
	MOV	BY	,W_REG					;				MOVWF	BY
	;CLC							;				BCF 	STATUS,C
	LSR 	BY						;				RRF 	BY
	;CLC							;				BCF 	STATUS,C
	LSR 	BY						;				RRF 	BY				;BY <= CBY/8
	LDI	W_REG	,2					;				MOVF	BY,W
	SUB	W_REG	,BY					;				SUBLW	2
	BRBS	SREG_C	,SKIP48					;				BTFSC	STATUS,C		;2 >= BY  C is SET ,LEFT
	RJMP	RDY						;				GOTO	RDY
SKIP48:								;
BRC: 	LDI	W_REG	,26					;		BRC 	MOVF	BY,W
	SUB	W_REG	,BY					;				SUBLW	26				;26 < BY  C is CLR,RIGHT
	BRBS	SREG_C	,SKIP49					;				BTFSC	STATUS,C
	RET							;				RETURN					;3=< BY =<26
SKIP49:	LDI	W_REG	,0xF8					;				MOVLW	0F8H			;Trimed 
	AND	CBX	,W_REG					;				ANDWF	CBX
	LDI	W_REG	,0xF8					;				MOVLW	0F8H
	AND	CBY	,W_REG					;				ANDWF	CBY
RDY: 	COM	BDY						;		RDY 	COMF	BDY
	INC	BDY						;				INCF	BDY
BMRET:	RET							;		BMRET	RETURN
								;		;
								;		;============================================================
								;		;		パドルで打ち返す
								;		;
PHC: 	LDI	W_REG	,23					;		PHC 	MOVF	BX,W
	SUB	W_REG	,BX					;				SUBLW	23				;PDL LINE is 24
	BRBS	SREG_Z	,SKIP50					;				BTFSS	STATUS,Z		;ON PDL_LINE
	RET							;				RETURN
SKIP50:
	mov	W_REG	,PY
	cpi	W_REG	,3
	brne	SKIP50_1		
	cp	BY,W_REG
	brcc	SKIP50_1
	ldi	W_REG,1
	mov	BDY,W_REG
	rjmp	SKIP56
SKIP50_1:
	MOV	W_REG	,BY					;				MOVF	PY,W
	SUB	W_REG	,PY					;				SUBWF	BY,W			;BY < PY,C is clr
	BRBC	SREG_C	,SKIP51					;				BTFSS	STATUS,C
	RJMP	MISS			;BY > PY		;				GOTO	MISS
SKIP51:	BRBC	SREG_Z	,SKIP52					;				BTFSC	STATUS,Z		;BY = PY
	DEC	BDY			;BY = PY		;				DECF	BDY 			;HIT at PDL_LEFT
SKIP52:	LDI	TMP	,3					;				SUBLW	3				;3-(BY-PY)= PY-BY+3
	SUB	TMP	,W_REG					;
	BRBC	SREG_Z	,SKIP53					;				BTFSC	STATUS,Z
	INC	BDY			;(BY-PY)=3		;				INCF	BDY 			;HIT at PDL_RIGHT
SKIP53:	BRBC	SREG_C	,SKIP54					;				BTFSS	STATUS,C		;PY-BY+3 <0 C is CLR
	RJMP	MISS			;(BY-PY)>3		;				GOTO	MISS
SKIP54:	COM	BDX						;				COMF	BDX
	INC	BDX						;				INCF	BDX 			;BOUND BX
	LDI	W_REG	,0xF8					;				MOVLW	0F8H			;BX,BY are trimed	
	AND	CBX	,W_REG					;				ANDWF	CBX
	LDI	W_REG	,0xF8					;				MOVLW	0F8H
	AND	CBY	,W_REG					;				ANDWF	CBY
	LDI	W_REG	,5					;				MOVF	BDY,W
	SUB	W_REG	,BDY					;				SUBLW	5				;BDY = 5,Z is SET
	BRBC	SREG_Z	,SKIP55					;				BTFSC	STATUS,Z
	DEC	BDY						;				DECF	BDY 			;BDY=< 4
SKIP55:	MOV	W_REG	,BDY					;				MOVF	BDY,W
	LDI	TMP	,5					;
	ADD	W_REG	,TMP					;				ADDLW	5				;BDY = -5,Z is SET
	BRBC	SREG_Z	,SKIP56					;				BTFSC	STATUS,Z
	INC	BDY						;				INCF	BDY 			;-4=<BDY=<4
SKIP56:	LDI	W_REG	,20					;				MOVLW	20
	MOV	TONE	,W_REG					;				MOVWF	TONE			;For PDL HIT SOUND
	SET							;
	BLD 	WRKF	,T_ON					;				BSF 	WRKF,T_ON
	RET							;				RETURN
								;		;
MISS:	SET							;
	BLD 	WRKF,MISSF					;		MISS	BSF 	WRKF,MISSF
	RET							;				RETURN
								;		;
								;		;============================================================
								;		;		ブロックへの衝突、得点計算
								;		;
BHC: 	LDI	W_REG	,3					;		BHC 	MOVF	BX,W
	SUB	W_REG	,BX					;				SUBLW	3				;3 >= BX, C is SET, BM
	BRBS	SREG_C	,SKIP57					;				BTFSC	STATUS,C
	RET							;				RETURN
SKIP57:	LDI	W_REG	,8					;				MOVF	BX,W
	SUB	W_REG	,BX					;				SUBLW	8				;8 >= BX, C is SET,BLK LINE
	BRBC	SREG_C	,SKIP58					;				BTFSS	STATUS,C
	RET							;				RETURN
SKIP58:	LDI	W_REG	,VR0-4					;				MOVLW	VR0-4			;Adress of VR(BX-4)
	ADD	W_REG	,BX					;				ADDWF	BX,W
	MOV	YL	,W_REG					;				MOVWF	FSR 			;(IND) = VR(BX-4)
	MOV	W_REG	,BY					;				MOVF	BY,W			;3 =< BY =<26
	MOV	SC1	,W_REG					;				MOVWF	SC1
	DEC	SC1						;				DECF	SC1
	DEC	SC1						;				DECF	SC1
	DEC	SC1						;				DECF	SC1 			;0 =< SC1 =<23
	;CLC						??	;				BCF 	STATUS,C
	LDI	W_REG	,0b10000000				;				MOVLW	B'10000000'
	MOV	SC2	,W_REG					;				MOVWF	SC2
	RJMP	BB2						;				GOTO	BB2
BBIT:	;CLC							;		BBIT	BCF 	STATUS,C
	LSR 	SC2						;				RRF 	SC2
BB2: 	LDI	W_REG	,3					;		BB2 	MOVLW	3				;SC1 div 3
	SUB	SC1	,W_REG					;				SUBWF	SC1
	BRBS	SREG_C	,SKIP59					;				BTFSC	STATUS,C
	RJMP	BBIT						;				GOTO	BBIT
SKIP59:	LD	W_REG	,Y					;				MOVF	SC2,W			;SC2<bit> = BY / 3
	AND	W_REG	,SC2					;				ANDWF	IND,W
	BRBC	SREG_Z	,SKIP60					;				BTFSC	STATUS,Z		;BLK exist ?
	RET							;				RETURN					;Not
SKIP60:								;
HIT:	MOV	W_REG	,SC2					; 	
	COM	W_REG						;		HIT 	COMF	SC2,W
	LD	TMP	,Y					;
	AND	TMP	,W_REG					;				ANDWF	IND 			;BREAK BLOCK
	ST	Y	,TMP					;
	SBRC	WRKF	,HMF		;SKIP61			;				BTFSC	WRKF,HMF
	RJMP	HMH						;				GOTO	HMH
SKIP61:	COM	BDX						;				COMF	BDX
	INC	BDX						;				INCF	BDX 			;BOUND VERT
	RJMP	SS						;				GOTO	SS
HMH: 	COM	BDY						;		HMH 	COMF	BDY 			;BOUND HORI
	INC	BDY						;				INCF	BDY
SS:	LDI	W_REG	,0xF8					;		SS		MOVLW	0F8H			;BX,BY are trimed	
	AND	CBX	,W_REG					;				ANDWF	CBX
	LDI	W_REG	,0xF8					;				MOVLW	0F8H
	AND	CBY	,W_REG					;				ANDWF	CBY
	DEC	BLKCNT						;				DECF	BLKCNT
	MOV	W_REG	,BX					;				MOVF	BX,W
	MOV	TONE	,W_REG					;				MOVWF	TONE			;For SOUND
	SET							;
	BLD 	WRKF	,T_ON					;				BSF 	WRKF,T_ON
	LDI	TMP	,9					;
	SUB	TMP	,W_REG					;				SUBLW	9				;BX=4,5,6,7,8 =>5,4,3,2,1
	MOV	W_REG	,TMP					;
	ADD	SCRL	,W_REG					;				ADDWF	SCRL			;SCR UP
	MOV	W_REG	,SCRL					;				MOVF	SCRL,W
	ANDI	W_REG	,0x0F					;				ANDLW	0FH
	SUBI	W_REG	,0x0A					;				SUBLW	9				;9 < W, C is CLR
	BRBC	SREG_C	,SKIP62					;				BTFSC	STATUS,C
	RET							;				RETURN					;NO Overflow
SKIP62:	LDI	W_REG	,6		;１位桁上り		;				MOVLW	6
	ADD	SCRL	,W_REG					;				ADDWF	SCRL
	MOV	W_REG	,SCRL					;				SWAPF	SCRL,W
	ANDI	W_REG	,0xF0					;				ANDLW	0FH
	SUBI	W_REG	,0xA0					;				SUBLW	9				;9 < W, C is CLR
	BRBC	SREG_C	,SKIP63					;				BTFSC	STATUS,C
	RET							;				RETURN
SKIP63:	LDI	W_REG	,0x60		;十位桁上り		;				MOVLW	060H
	ADD	SCRL	,W_REG					;				ADDWF	SCRL
	INC	SCRH						;				INCF	SCRH
	MOV	W_REG	,SCRH					;				MOVF	SCRH,W
	ANDI	W_REG	,0x0F					;				ANDLW	0FH
	SUBI	W_REG	,0x0A					;				SUBLW	9				;9 < W, C is CLR
	BRBC	SREG_C	,SKIP64					;				BTFSC	STATUS,C
	RET							;				RETURN
SKIP64:	LDI	W_REG	,6		;百位桁上り		;				MOVLW	6
	ADD	SCRH	,W_REG					;				ADDWF	SCRH
	MOV	W_REG	,SCRH					;				SWAPF	SCRH,W
	ANDI	W_REG	,0xF0					;				ANDLW	0FH
	SUBI	W_REG	,0xA0					;				SUBLW	9				;9 < W, C is CLR
	BRBC	SREG_C	,SKIP65					;				BTFSC	STATUS,C
	RET							;				RETURN
SKIP65:	LDI	W_REG	,0x60		;千位桁上り		;				MOVLW	060H
	ADD	SCRH	,W_REG					;				ADDWF	SCRH
	RET							;				RETURN
								;		;
								;*******************************************
								;		EEPROM Data Byte
								;		ORG		H'2100'
								;		DE		0	,	0
								;*******************************************
;EX_INT1:		;ボール追加　ウェイクアップ		;
;	IN	S_SAVE	,SREG					;
;	MOV	W_SAVE	,W_REG					;
;	LDI	W_REG	,0b00111111		;ボール６個	;
;	MOV	BN	,W_REG					;
;	MOV	W_REG	,W_SAVE					;
;	OUT	SREG	,S_SAVE					;
;	RETI

GAME_START:
	CLI
	LDI     TMP     ,RAMEND ;スタックポインターアドレス	;
	OUT	SP,TMP	;ＳＰ
	CLR	WRKF

	LDI	W_REG	,2					;		INIT3	MOVLW	2				;ボールの速度をセットする
	MOV	BDX	,W_REG					;				MOVWF	BDX 			;BALL dx = 2 :DOWN 2
	LDI	W_REG	,1					;				MOVLW	1				;BALL dy = 1 :RIGHT 1
	MOV	BDY	,W_REG					;				MOVWF	BDY

	RJMP	INIT0						;
.EXIT	; ｱｾﾝﾌﾞﾙ終了						;				END
