	list	p=16f84
	#include p16f84.inc

RAMA	equ	0x0c	;　時間造りのときに割り当て番地に0CH,0DHを使用します。
RAMB	equ	0x0d	; 番地と同じ意味（ＥＱＵ）、判りやすくしています.

	ORG	0	; 0番地から始めます.
	GOTO	INISET	;STARTへ飛ぶ

INISET
 	BSF	STATUS,RP0	;レジスタSTATUSを１にする（ﾍﾟｰｼﾞ1）/裏舞台の1ページに設定します。
	MOVLW	B'11100000'	;11100000BをレジスタWに入れる, 0が出力, 1が入力を意味する
	MOVWF	TRISA	;TRISAにレジスタWのデータ-を移動/A ポートの設定
	MOVLW	B'11110011'	;11110011BをレジスタWに入れる, 0が出力, 1が入力を意味する
	MOVWF	TRISB		;TRISBにレジスタWのデータ-を移動/Bポートの設定
	BCF	OPTION_REG,7	;入力をプルアップ（目玉の部分）
	BCF	STATUS, RP0	;レジスタSUTATUSを0にすなわちﾍﾟｰｼﾞを表舞台の0ページに戻しておく
	
	MOVLW	B'00011111'
	MOVWF	PORTA		;　停止スタンバイ
	MOVLW	B'11110011'
	MOVWF	PORTB
	GOTO	START

START
	CALL	DTIME_1		;　時間稼ぎ
	GOTO	MAIN		;MAINへ行こう

MAIN
;	MOVLW	B'00000110'	; forward
	movlw	B'00001010'	; rotate
	MOVWF	PORTA		;いざ前進（1、４ビット目0で右,左前L／,2,3ビット目右後,左後Hn
	CALL	DTIME_1		;　時間稼ぎ

	MOVLW	B'00001111'
	MOVWF	PORTA		;　　停止（1から4ビット全てHで動作せず）上の回路を眺めながら理解
	CALL	DTIME_1		;　　時間稼ぎ

	GOTO	MAIN

DTIME_1			; call delay routine
	call	TIME_1	;	0.1[s] x 5
	call	TIME_1
	call	TIME_1
	call	TIME_1
	call	TIME_1
		;　0.1秒の遅延時間の作成。10Mhzクロックの計算、これが厄介ですが、
TIME_1
	MOVLW	0x44		;　１６＊４＋４＝６８　16進数
	MOVWF	RAMA		;　RAMA　にいれる（０CH番地に）。
TIME_11
	CLRF	RAMB		;　（２５６＊３＊６８＋６８＊４）＊０．４＝20.998ms
TIME_12		;　このﾁｯﾌﾟが8ビットなのでmax256回まで（4hzで0.4usが1語命令）
	DECFSZ	RAMB,1		;（MOVLW、MOVWF,CLRFが1命令計3命令/DECFSZ,が1命令
	GOTO	TIME_12		;GOTOが2命令、RETURNが2命令です。）後は考えてみてください。
	DECFSZ	RAMA,1
	GOTO	TIME_11
TIME_13
	MOVLW	0X00
	MOVWF	RAMA
TIME_14
	CLRF	RAMB	;　（256＊３＊256＋256＊４）＊０．４＝79.053ms
TIME_15
	DECFSZ	RAMB,1
	GOTO	TIME_15
	DECFSZ	RAMA,1
	GOTO	TIME_14

	RETURN		;　20.998＋79.053＝100.51ms　　　　すなわち約0.1秒が出来ました。
	end
