;
; プログラム名	: メッセージ操作パネル
; ファイル名	: carpanel_ope.asm
; 作成日	: H19.11.23
; 

.include "m88def.inc"

;*****************************
; 汎用レジスタ定義
;*****************************

.def	R_TEMP0		=	R2
.def	STACK		=	R16
.def	R_TEMP1		=	R17
.def	R_TEMP2		=	R18
.def	R_TEMP4		=	R19
.def	R_TEMP3		=	R20
.def	R_TEMP5		=	R21		; 7セグLED表示値
.def	R_FLAG1		=	R22		; 割込状態他
.def	R_TMR0		=	R23		; タイマ0カウント領域(10mS単位)

;----------------------------------------
;	EQU定義
;----------------------------------------
;---- R_FLAG1 ----(割込状態他)

.EQU	B_IOVF0		=	0		;タイマ0オーバーフロー

;---- 定数 ----------------------

.EQU	HYOJI_0		=	0b01000000	;表示値0
.EQU	HYOJI_1		=	0b01111001	;表示値1
.EQU	HYOJI_2		=	0b00100100	;表示値2
.EQU	HYOJI_3		=	0b00110000	;表示値3
.EQU	HYOJI_4		=	0b00011001	;表示値4
.EQU	HYOJI_5		=	0b00010010	;表示値5
.EQU	HYOJI_6		=	0b00000010	;表示値6
.EQU	HYOJI_7		=	0b01011000	;表示値7
.EQU	HYOJI_8		=	0b00000000	;表示値8
.EQU	HYOJI_9		=	0b00010000	;表示値9

;----------------------------------------
;	割り込みベクタ定義
;----------------------------------------

.CSEG						;コードセグメント
	RJMP	MAIN				;リセット
.ORG	$0010
	RJMP	IOVF0				;タイマ0

;*******************************************************************************
; 割込みルーチン
;*******************************************************************************
;***************************************
; タイマ0 割り込みルーチン(10mS単位)
;***************************************

IOVF0:
	IN	STACK,SREG			;PUSH SREG

	LDI	R_TEMP1, 0x00			; 内部クロックストップ
	OUT	TCCR0B, R_TEMP1

	DEC	R_TMR0
	BRNE	IOVF0_1

	SBR	R_FLAG1,(1<<B_IOVF0)
	LDS	R_TEMP1,TIMSK0
	CBR	R_TEMP1,(1<<TOIE0)
	STS	TIMSK0,R_TEMP1	

IOVF0_1:
	LDI	R_TEMP1, 0x64			;割込時間10mSを再セット
	OUT	TCNT0, R_TEMP1

	LDI	R_TEMP1, 0x03			; 内部クロックスタート(1/64を指定)
	OUT	TCCR0B, R_TEMP1

IOVF0_9:
	OUT	SREG,STACK			;POP SREG

	RETI

;*******************************************************************************
; サブルーチン
;*******************************************************************************
;*****************************
; タイマ0
;*****************************

STMR0:
	CBR	R_FLAG1,(1<<B_IOVF0)
	LDS	R_TEMP1,TIMSK0			;タイマ割込許可	
	SBR	R_TEMP1,(1<<TOIE0)
	STS	TIMSK0,R_TEMP1

	RET

;*****************************
; メッセージ表示 実行
;*****************************

HYOJI:

;---- メッセージ選択スイッチ読込結果 ----------

	CPI	R_TEMP3,0x0F			;メッセージ番号0
	BREQ	HYOJI10

	CPI	R_TEMP3,0x0E			;メッセージ番号1
	BREQ	HYOJI20

	CPI	R_TEMP3,0x0D			;メッセージ番号2
	BREQ	HYOJI30

	CPI	R_TEMP3,0x0C			;メッセージ番号3
	BREQ	HYOJI40

	CPI	R_TEMP3,0x0B			;メッセージ番号4
	BREQ	HYOJI50

	CPI	R_TEMP3,0x0A			;メッセージ番号5
	BREQ	HYOJI60

	CPI	R_TEMP3,0x09			;メッセージ番号6
	BREQ	HYOJI70

	CPI	R_TEMP3,0x08			;メッセージ番号7
	BREQ	HYOJI80

	CPI	R_TEMP3,0x07			;メッセージ番号8
	BREQ	HYOJI90

	CPI	R_TEMP3,0x06			;メッセージ番号9
	BREQ	HYOJIA0

;---- メッセージを7セグLEDへ ------------

HYOJI01:
	OUT	PORTD,R_TEMP5

	RET

;******** メッセージ番号0 ********

HYOJI10:

	LDI	R_TEMP5,HYOJI_0

	RJMP	HYOJI01

;******** メッセージ番号1 ********

HYOJI20:

	LDI	R_TEMP5,HYOJI_1

	RJMP	HYOJI01

;******** メッセージ番号2 ********

HYOJI30:

	LDI	R_TEMP5,HYOJI_2

	RJMP	HYOJI01

;******** メッセージ番号3 ********

HYOJI40:

	LDI	R_TEMP5,HYOJI_3

	RJMP	HYOJI01

;******** メッセージ番号4 ********

HYOJI50:

	LDI	R_TEMP5,HYOJI_4

	RJMP	HYOJI01

;******** メッセージ番号5 ********

HYOJI60:

	LDI	R_TEMP5,HYOJI_5

	RJMP	HYOJI01

;******** メッセージ番号6 ********

HYOJI70:

	LDI	R_TEMP5,HYOJI_6

	RJMP	HYOJI01

;******** メッセージ番号7 ********

HYOJI80:

	LDI	R_TEMP5,HYOJI_7

	RJMP	HYOJI01

;******** メッセージ番号8 ********

HYOJI90:

	LDI	R_TEMP5,HYOJI_8

	RJMP	HYOJI01

;******** メッセージ番号9 ********

HYOJIA0:

	LDI	R_TEMP5,HYOJI_9

	RJMP	HYOJI01

;*****************************
; メインルーチン(MAIN)
;*****************************

MAIN:

;■■■■ 初期化ルーチン ■■■■

	CLI					;割込み禁止

;---- PORT 設定 ----

	LDI	R_TEMP1,0b11111111
	LDI	R_TEMP2,0b10000000	
	OUT	DDRB,R_TEMP1
	OUT	PORTB,R_TEMP2

	LDI	R_TEMP1,0b11110000
	LDI	R_TEMP2,0b01001111	
	OUT	DDRC,R_TEMP1
	OUT	PORTC,R_TEMP2

	LDI	R_TEMP1,0b11111111
	LDI	R_TEMP2,0b01111111	
	OUT	DDRD,R_TEMP1
	OUT	PORTD,R_TEMP2

;---- タイマ0=10ms(8bit timer) 設定 ----

	; 内部クロック 1/64を指定
	LDI	R_TEMP1, 0x03
	OUT	TCCR0B, R_TEMP1

;---- フラグ 初期化 --------------------

	LDI	R_TEMP4, 0x00

;---- レジスタ 初期化 ------------------

	LDI	R_FLAG1, 0x00

	SEI					;割込み許可

MAIN01:

;---- メッセージ選択スイッチ読込み ----------

	IN	R_TEMP3,PINC
	ANDI	R_TEMP3,0x0F			;不要ビットマスキング

	CP	R_TEMP3,R_TEMP4			;入力値変化
	BREQ	MAIN01				;変化なし

;---- タイマー(0.1S)セット ----

	LDI	R_TEMP1, 0x64			;割込時間10mS
	OUT	TCNT0, R_TEMP1

	LDI	R_TMR0,0x0A			;0.1Sでフラグセット
	RCALL	STMR0

MAIN02:
;---- タイムアウト判定 ----

	SBRS	R_FLAG1,B_IOVF0			;タイマ0カウント完了判定
	RJMP	MAIN02				;カウント中

;---- メッセージ選択スイッチ再読込み --------

	IN	R_TEMP3,PINC
	ANDI	R_TEMP3,0x0F			;不要ビットマスキング

	CP	R_TEMP3,R_TEMP4			;入力値変化
	BREQ	MAIN01				;変化なし

	MOV	R_TEMP4,R_TEMP3

;---- 表示処理 実行 ------------------------

	RCALL	HYOJI

	RJMP	MAIN01