; *******************
; *    DENGO.ASM    *
; *******************
; 使用アセンブラ: AKI-PIC PA.EXE
;
; 電車でGo! サターン版２ハンドルコントローラを Windows 用に

;---------------------------------------------------------------
	include		16f84.h
	.16f84

	.osc		rc
	.wdt		off
	.pwrt		off
	.protect	off

	id		10001001000101b	;DE
	id		10011101000111b	;NG
	id		10011110000000b	;O_
	id		00000000000001b	;Ver.0001

; レジスタ・ビット定義 -----------------------------------------
	org	0Ch

TMP	ds	1		; 一時用レジスタ

;===============================================================
; 電源オンでここからスタート
;===============================================================
	org	0

RES	clr	intcon		; 割り込みを禁止し，初期設定へ
	goto	INIT

	goto	RES
	goto	RES
; 割込処理 =====================================================
	org	4
	goto	RES
	goto	RES
	goto	RES
	goto	RES
; 初期設定 =====================================================
INIT	setb	rp0		; 設定のため裏レジスタへ切替
	mov	ra,#0E0h	; PA0-4 は出力に設定
	mov	rb,#07Fh	; PB0-6 を入力，PB7 を出力に設定
	mov	W,#10000111b    ; オプションレジスタ設定
;		        ^^^ 関係なし (プリスケーラ分周比 1/256)
;		       ^    関係なし (プリスケーラをタイマに使用)
;		      ^     関係なし (外部タイマの有効エッジ)
;		     ^      関係なし (タイマに内部クロックを使用)
;		    ^       関係なし (INT割込たち下がりエッジ)
;		   ^        PORT Bをプルアップしない
	movwf	option
	clrb	rp0		; 表レジスタへ切替

	clrb	portb.7		; マスコン用ラッチ入力を殺す
	mov	porta, #0Fh	; 15 (非常) を
	call	WAIT
	mov	porta, #1Fh     ; ブレーキ用ラッチにセット
	call	WAIT
	mov	porta, #07h	; ７ (＝マスコン０) を
	call	WAIT
	setb	portb.7		; マスコン用ラッチにセット
	call	WAIT
	clrb	portb.7
	mov	porta, #00h	; PA 初期化
	call	WAIT

; メインルーチン ===============================================
MAIN	mov	TMP, portb	; レバー位置を読み取る

	mov	W, TMP		; ブレーキが０ならマスコン処理へ
	and	W, #0Fh
	jz	MASCON

	mov	porta, W	; そうでなければブレーキ用ラッチへ出力
	call	WAIT
	setb	porta.4
	call	WAIT
	mov	porta, #00h
	call	WAIT

MASCON	and	TMP, #070h	; マスコン入力が０ならもどる
	cje	TMP, #070h, MAIN

	swap	TMP             ; そうでなければ，上４桁を下４桁へ移動し
	mov	W, TMP

	mov	porta, W	; マスコン用ラッチへ出力
	call	WAIT
	setb	portb.7
	call	WAIT
	mov	porta, #00h
	clrb	portb.7
	call	WAIT
	goto	MAIN            ; もどる

	goto	MAIN

;---------------------------------------------------------------
WAIT	clr	W               ; ウェイトルーチン
LOOP	add	W, #01h
	jnz	LOOP
	ret

;---------------------------------------------------------------
END	goto RES
	goto RES
	goto RES
	goto RES
