        DEVICE  PIC16C84,RC_OSC,WDT_OFF,PROTECT_OFF
;
_F      EQU     1
_W      EQU     0
_IRP    EQU     7
_RP1    EQU     6
_RP0    EQU     5
_TO     EQU     4
_PD     EQU     3
_Z      EQU     2
_DC     EQU     1
_C      EQU     0
_GIE    EQU     7
_ADIE   EQU     6
_RTIE   EQU     5
_INTE   EQU     4
_RBIE   EQU     3
_RTIF   EQU     2
_INTF   EQU     1
_RBIF   EQU     0
_GODONE EQU     2
_RD     EQU     0
_WR     EQU     1
_WREN   EQU     2
_WRERR  EQU     3
_EEIF   EQU     4
;
;
;
CK2     EQU     4
CK1     EQU     3
REN     EQU     2
SEL     EQU     1
CLR     EQU     0
RPN     EQU     5
CR2     EQU     1
CR1     EQU     0
FK2     EQU     3
FK1     EQU     2
;
CNT1    EQU     20h
CNT2    EQU     21h
KS1     EQU     22h
KS2     EQU     23h
BKI     EQU     24h
TMP     EQU     25h
PPB     EQU     26h
;
        ORG     0h
        GOTO    MAIN
;
        ORG     04h
        GOTO    INTR
;

MAIN    BCF        STATUS,_RP0        ;PAGE0 SET
        BCF        INTCON,_GIE        ;INTR DISABLE
        BSF        STATUS,_RP0        ;PAGE1 SET
        MOVLW      01000100b          ;PULLUP ENABLE
        OPTION
;
        MOVLW      00000000b          ;PORT A I/O SET
        MOVWF      TRISA
        MOVLW      00011111b          ;PORT B I/O SET
        MOVWF      TRISB
;
        BCF        STATUS,_RP0        ;PAGE0 SET
        CLRF       CNT1
        CLRF       CNT2
        CLRF       KS1
        CLRF       KS2
        MOVLW      00001111b
        MOVWF      BKI
;
        
LOOP
        MOVF       PORTB,_W
        MOVWF      TMP
        BTFSC      TMP,REN            ;REN=1?
        GOTO       DOUT
        BTFSC      TMP,CLR
        GOTO       CTCLR
        CALL       CHECK2
        CALL       CHECK1
        GOTO       LOOP
;
DOUT    BTFSC      TMP,SEL
        GOTO       DOUT2
;
DOUT1   MOVF       CNT1,_W
        MOVWF      PORTA
        GOTO       LOOP
;
DOUT2   MOVF       CNT2,_W
        MOVWF      PORTA
        GOTO       LOOP
;
CTCLR   CLRF       CNT1
        CLRF       CNT2
        GOTO       LOOP
;
CHECK2  BTFSC      TMP,CK2
        GOTO       CT2H
CT2L    BTFSS      BKI,CR2            ;LOの時、前回はLOか？
        GOTO       CI2L                
        CLRF       KS2                ;前回はHIなのでKS2=0
        BCF        BKI,CR2            ;BKIをLOにセット
        RETURN
CI2L    INCF       KS2                ;LOの時、前回もLOだからKS2++
        MOVLW      RPN
        SUBWF      KS2,_W             ;LOがRPN回続いたら
        BTFSS      STATUS,_Z
        RETURN
        CLRF       KS2
        BTFSC      BKI,FK2            ;2のLO状態確定するわけだが、その時
        INCF       CNT2               ;前回の確定がHIであればカウントＵＰ
        BCF        BKI,FK2            ;2の状態確定をLOに更新
        RETURN
CT2H    BTFSC      BKI,CR2            ;HIの時、前回はHIか？
        GOTO       CI2H
        CLRF       KS2                ;前回がLOなのでKS2=0
        BSF        BKI,CR2            ;BKIをHIにセット
        RETURN
CI2H    INCF       KS2                ;HIの時、前回もHIだからKS2++
        MOVLW      RPN
        SUBWF      KS2,_W             ;HIがRPN回続いたら
        BTFSS      STATUS,_Z
        RETURN
        CLRF       KS2
        BSF        BKI,FK2            ;2のHI状態確定するわけ
        RETURN
;
CHECK1  BTFSC      TMP,CK1
        GOTO       CT1H      
CT1L    BTFSS      BKI,CR1            ;LOの時、前回はLOか？
        GOTO       CI1L                
        CLRF       KS1                ;前回はHIなのでKS1=0
        BCF        BKI,CR1            ;BKIをLOにセット
        RETURN
CI1L    INCF       KS1                ;LOの時、前回もLOだからKS1++
        MOVLW      RPN
        SUBWF      KS1,_W             ;LOがRPN回続いたら
        BTFSS      STATUS,_Z
        RETURN
        CLRF       KS1
        BTFSC      BKI,FK1            ;1のLO状態確定するわけだが、その時
        INCF       CNT1               ;前回の確定がHIであればカウントＵＰ
        BCF        BKI,FK1            ;1の状態確定をLOに更新
        RETURN
CT1H    BTFSC      BKI,CR1            ;HIの時、前回はHIか？
        GOTO       CI1H
        CLRF       KS1                ;前回がLOなのでKS1=0
        BSF        BKI,CR1            ;BKIをHIにセット
        RETURN
CI1H    INCF       KS1                ;HIの時、前回もHIだからKS1++
        MOVLW      RPN
        SUBWF      KS1,_W             ;HIがRPN回続いたら
        BTFSS      STATUS,_Z
        RETURN
        CLRF       KS1
        BSF        BKI,FK1            ;1のHI状態確定するわけ
        RETURN
;
INTR        
        RETFIE
;
;
        END
