;U W E  R E I S E R Leipzig september 1999
;rc5-sleep-timer

;register file deklaration
RTCC         equ     01h          ;rtcc-file
OPTION       equ     01h          ;option-file
STATUS       equ     03h          ;status-file

;i/o-register (ports)
PORTA        equ     05h          ;outputs
PORTB        equ     06h          ;inputs

;general purpose register
COUNT1       equ     10h          ;hi-counter + ledon-conter
COUNT2       equ     11h          ;hi-counter + ledon-counter
COUNT3       equ     12h          ;lo-counter + db-counter
COUNT4       equ     13h          ;lo-counter + db-counter
COUNT5       equ     14h          ;sequenz-counter + flash-counter
COUNT6       equ     15h          ;bounche-time-counter
SECCOUNT     equ     16h          ;second-counter
MINCOUNT     equ     17h          ;minute-counter
HALFHOUR     equ     18h          ;half-hour-counter
SCALE        equ     19h          ;led position for scale
SCALEVAL     equ     1Ah          ;value for scale
SCALEON      equ     1Bh          ;scale-on-time-counter
SCALEOFF     equ     1Ch          ;scale-off-time-counter
DOWNTIME     equ     1Dh          ;down-time-counter

;variablen
C            equ     00h          ;carry-flag
Z            equ     02h          ;zero-flag
RP0          equ     05h          ;bank0/bank1
IRLED        equ     00h          ;ir-led d5 (RA0)
VCR          equ     00h          ;jumper 1 (RB0)
SAT          equ     03h          ;jumper 2 (RB3)
DVD          equ     02h          ;jumper 3 (RB2)
CD           equ     01h          ;jumper 4 (RB1)
COMB         equ     04h          ;jumper 5 (RB4)
OF           equ     07h          ;off-switch (RB7)
TEST         equ     06h          ;test-switch (RB6)
DOW          equ     05h          ;down-switch (RB5)

;p r o g r a m
;initialisation
             CLRW                 ;clear w-register
             MOVLW   1Eh          ;clear
             MOVWF   PORTA        ;port a
             BSF     STATUS,RP0   ;select bank 1
             MOVLW   00h          ;RA<4:0>
             MOVWF   PORTA        ;as outputs
             MOVLW   0FFh         ;RB<7:0>
             MOVWF   PORTB        ;as inputs
             MOVLW   17h          ;rtcc with prescaler
             MOVWF   OPTION       ;1:256, pull-up enabled
             BCF     STATUS,RP0   ;select bank 0

;power on self test
             MOVLW   1Ah          ;d1
             MOVWF   PORTA        ;on
             CALL    LEDON        ;on time
             MOVLW   16h          ;d2
             MOVWF   PORTA        ;on
             CALL    LEDON        ;on time
             MOVLW   0Eh          ;d3
             MOVWF   PORTA        ;on
             CALL    LEDON        ;on time
             MOVLW   1Ch          ;d4 on
             MOVWF   PORTA        ;and
             MOVWF   SCALE        ;scale 2 hours

;set-start-values for first run
             MOVLW   14h          ;set 1 sec scale-on-time
             MOVWF   SCALEON      ;after device on
             MOVLW   0B4h         ;set 9 sec
             MOVWF   SCALEOFF     ;scale-off-time
             MOVLW   05h          ;set down-time
             MOVWF   DOWNTIME     ;0,75 sec
             MOVLW   80h          ;set scale-value
             MOVWF   SCALEVAL     ;2 hours
             MOVLW   1Eh          ;set (30 x 1 min)
             MOVWF   HALFHOUR     ;half-hour-counter
             MOVLW   3Ch          ;set (60 x 1 sec)
             MOVWF   MINCOUNT     ;minute-counter
             MOVLW   14h          ;set (20 x 50 ms)
             MOVWF   SECCOUNT     ;second-counter

;start mainprogram
START:       MOVLW   1Eh          ;1E = 25093 µs
             MOVWF   RTCC         ;for rtcc-overflow
M1:          BTFSS   RTCC,7
             GOTO    M1
START1:      MOVLW   1Eh          ;down-
             MOVWF   RTCC         ;switch-
             BTFSS   PORTB,DOW    ;service
             GOTO    DOWN
             MOVLW   05h          ;set down-time
             MOVWF   DOWNTIME     ;0,75 sec
M2:          BTFSS   RTCC,7
             GOTO    M2
             MOVLW   1Eh          ;time-
             MOVWF   RTCC         ;service
             CALL    TIMING
M3:          BTFSS   RTCC,7
             GOTO    M3

             MOVLW   1Eh          ;test-
             MOVWF   RTCC         ;switch-
             BTFSS   PORTB,TEST   ;service
             CALL    TRANS
M4:          BTFSS   RTCC,7
             GOTO    M4

             MOVLW   1Eh          ;time-
             MOVWF   RTCC         ;sevice
             CALL    TIMING
M5:          BTFSS   RTCC,7
             GOTO    M5

             MOVLW   1Eh          ;off-
             MOVWF   RTCC         ;switch-
             BTFSS   PORTB,OF     ;service
             GOTO    OFF
M6:          BTFSS   RTCC,7
             GOTO    M6

             MOVLW   1Eh          ;time-
             MOVWF   RTCC         ;service
             CALL    TIMING
M7:          BTFSS   RTCC,7
             GOTO    M7

             GOTO    START1       ;end mainprogram


;subroutine down
DOWN:        CALL    BT           ;bounche-time
             BTFSC   PORTB,DOW    ;test down-switch
             GOTO    DOWN1        ;switch-error
             CALL    SCALEPOS     ;new position
             MOVF    SCALE,0      ;scale
             MOVWF   PORTA        ;on
             MOVLW   28h          ;set scale-on-time 2 sec
             MOVWF   SCALEON      ;after down-switch
             MOVLW   0B4h         ;set scale-off-time 9 sec
             MOVWF   SCALEOFF     ;after down-switch
                                  ;downtime > 0,75 sec
             DECFSZ  DOWNTIME     ;dec downtime, zero ?
             GOTO    DOWN2        ;no, not zero
             BCF     STATUS,C     ;yes, clear carry-flag
             RRF     SCALEVAL,1   ;next scale-value
             CALL    SCALEPOS     ;new scaleposition
                                  ;set new values
             MOVLW   1Eh          ;for next
             MOVWF   HALFHOUR     ;half-hour-count
             MOVLW   3Ch          ;for next
             MOVWF   MINCOUNT     ;minute-count
             MOVLW   14h          ;for next
             MOVWF   SECCOUNT     ;second-count
DOWN1:       MOVLW   05h          ;set down-time 0,75 sec
             MOVWF   DOWNTIME     ;for next down-time
DOWN2:       GOTO    M2

;subroutine led-value assign to led-position
SCALEPOS:    BTFSC   SCALEVAL,7
             GOTO    SC1          ;d4 on
             BTFSC   SCALEVAL,6
             GOTO    SC2          ;d3 on
             BTFSC   SCALEVAL,5
             GOTO    SC3          ;d2 on
             BTFSC   SCALEVAL,4
             GOTO    SC4          ;d1 on
             BTFSC   SCALEVAL,3
             GOTO    SC5          ;new scale-value
                                  ;and d1 on
SC1:         MOVLW   1Ch          ;assign 
             MOVWF   SCALE        ;led-positon
             RETURN               ;for port a
SC2:         MOVLW   0Eh
             MOVWF   SCALE
             RETURN
SC3:         MOVLW   16h
             MOVWF   SCALE
             RETURN
SC4:         MOVLW   1Ah
             MOVWF   SCALE
             RETURN
SC5:         MOVLW   80h
             MOVWF   SCALEVAL
             GOTO    SC1

;subroutine test-switch
TRANS:       CALL    BT           ;bounche-time
             BTFSC   PORTB,TEST   ;test test-switch
             RETURN               ;switch-error
             CALL    SELECT       ;select devices
             CALL    KEYSOFF      ;one transmit
             RETURN               ;per touch

;subrouinte off-switch
OFF:         CALL    BT           ;bounche-time
             BTFSC   PORTB,OF     ;test off-switch
             GOTO    M6           ;no switch
             MOVF    SCALE,0
             MOVWF   PORTA        ;scale
             CALL    LEDON        ;on
OFFA:        BCF     STATUS,C
             RRF     SCALEVAL,1   ;light
             BTFSC   SCALEVAL,3
             GOTO    OFFB         ;effect
             CALL    SCALEPOS
             MOVF    SCALE,0      ;device
             MOVWF   PORTA
             CALL    LEDON        ;off
             GOTO    OFFA
OFFB:        MOVLW   1Eh          ;clear
             MOVWF   PORTA        ;port a
             MOVLW   0Ah
             MOVWF   COUNT5       ;ten flashes
OFFC:        MOVLW   1Ah          ;led 1
             MOVWF   PORTA        ;on
             CALL    DB           ;on time
             MOVLW   1Eh          ;led 1
             MOVWF   PORTA        ;off
             CALL    DB           ;off time
             DECFSZ  COUNT5,1
             GOTO    OFFC
             SLEEP                ;standbye sleep-timer

;subroutine for timing
TIMING:      DECFSZ  SCALEON,1    ;dec scale-on-time
             GOTO    T1           ;no, not zero
             MOVLW   1Eh          ;yes,
             MOVWF   PORTA        ;scale off
             MOVLW   0B4h         ;and set 9 sec
             MOVWF   SCALEOFF     ;auto-off-time
T1:          DECFSZ  SCALEOFF,1   ;dec scale-off-time
             GOTO    T2           ;no, not zero
             CALL    SCALEPOS     ;update scaleposition
             MOVF    SCALE,0      ;load scale-value
             MOVWF   PORTA        ;scale on
             MOVLW   14h          ;and set 1 sec
             MOVWF   SCALEON      ;auto-on-time
T2:          DECFSZ  SECCOUNT     ;second-count
             RETURN               ;not new second
             MOVLW   14h          ;for next
             MOVWF   SECCOUNT     ;second-count
             DECFSZ  MINCOUNT     ;minute-count
             RETURN               ;not new minute
             MOVLW   3Ch          ;for next
             MOVWF   MINCOUNT     ;minute-count
             DECFSZ  HALFHOUR     ;half-hour-count
             RETURN               ;not new half-hour
             MOVLW   1Eh          ;for next
             MOVWF   HALFHOUR     ;half-hour-count
             MOVLW   3Ch          ;for next
             MOVWF   MINCOUNT     ;minute-count
             MOVLW   14h          ;for next
             MOVWF   SECCOUNT     ;second-count
                                  ;end of half-hour
             BCF     STATUS,C     ;clear carry-flag
             RRF     SCALEVAL,1   ;decrement scale-value
                                  
             BTFSC   SCALEVAL,3   ;test fulltime-end
             GOTO    TIMEEND      ;yes, ir and sleep
             RETURN               ;no, not yet

TIMEEND:     CALL    SELECT       ;yes, transmit ir
             GOTO    OFFB	  ;end (sleep)


;subroutine device(s) select for transmit
SELECT:      CALL    TV1          ;tv 1
             BTFSS   PORTB,VCR
             CALL    VCR1         ;vcr 1
             BTFSS   PORTB,SAT
             CALL    SAT1         ;sat 1
             BTFSS   PORTB,DVD
             CALL    DVD1         ;dvd
             BTFSS   PORTB,CD
             CALL    CD1          ;cd
             BTFSS   PORTB,COMB
             CALL    COMBI        ;combi
             RETURN

TV1:         CALL    LO           ;bit 13 start-bit "1"
             CALL    HI
             CALL    LO           ;bit 12 start-bit "1"
             CALL    HI
             CALL    LO           ;bit 11 control-bit "1"
             CALL    HI           ;          ____________
             CALL    HI           ;bit 10 "0"
             CALL    LO
             CALL    HI           ;bit  9 "0"
             CALL    LO
             CALL    HI           ;bit  8 "0"
             CALL    LO           ;            tv1 = 0
             CALL    HI           ;bit  7 "0"
             CALL    LO
             CALL    HI           ;bit  6 "0"
             CALL    LO           ;          ____________
             CALL    HI           ;bit  5 "0"
             CALL    LO
             CALL    HI           ;bit  4 "0"
             CALL    LO
             CALL    LO           ;bit  3 "1"  standby
             CALL    HI
             CALL    LO           ;bit  2 "1"  = 12
             CALL    HI
             CALL    HI           ;bit  1 "0"
             CALL    LO
             CALL    HI           ;bit  0 "0"
             CALL    LO           ;          ____________
             CALL    DB           ;data-break
             RETURN

VCR1:        CALL    LO           ;bit 13 start-bit "1"
             CALL    HI
             CALL    LO           ;bit 12 start-bit "1"
             CALL    HI
             CALL    LO           ;bit 11 control-bit "1"
             CALL    HI           ;          ____________
             CALL    HI           ;bit 10 "0"
             CALL    LO
             CALL    HI           ;bit  9 "0"
             CALL    LO
             CALL    LO           ;bit  8 "1"
             CALL    HI           ;            vcr1 = 5
             CALL    HI           ;bit  7 "0"
             CALL    LO
             CALL    LO           ;bit  6 "1"
             CALL    HI           ;          ____________
             CALL    HI           ;bit  5 "0"
             CALL    LO
             CALL    HI           ;bit  4 "0"
             CALL    LO 
             CALL    LO           ;bit  3 "1"  standby
             CALL    HI
             CALL    LO           ;bit  2 "1"  = 12
             CALL    HI
             CALL    HI           ;bit  1 "0"
             CALL    LO
             CALL    HI           ;bit  0 "0"
             CALL    LO           ;          ____________
             CALL    DB           ;data-break
             RETURN

SAT1:        CALL    LO           ;bit 13 start-bit "1"
             CALL    HI
             CALL    LO           ;bit 12 start-bit "1"
             CALL    HI
             CALL    LO           ;bit 11 control-bit "1"
             CALL    HI           ;          ____________
             CALL    HI           ;bit 10 "0"
             CALL    LO
             CALL    LO           ;bit  9 "1"
             CALL    HI
             CALL    HI           ;bit  8 "0"
             CALL    LO           ;            sat = 8
             CALL    HI           ;bit  7 "0"
             CALL    LO
             CALL    HI           ;bit  6 "0"
             CALL    LO           ;          ____________
             CALL    HI           ;bit  5 "0"
             CALL    LO
             CALL    HI           ;bit  4 "0"
             CALL    LO
             CALL    LO           ;bit  3 "1"  standby
             CALL    HI
             CALL    LO           ;bit  2 "1"  = 12
             CALL    HI
             CALL    HI           ;bit  1 "0"
             CALL    LO
             CALL    HI           ;bit  0 "0"
             CALL    LO           ;          ____________
             CALL    DB           ;data-break
             RETURN

DVD1:        CALL    LO           ;bit 13 start-bit "1"
             CALL    HI
             CALL    LO           ;bit 12 start-bit "1"
             CALL    HI
             CALL    LO           ;bit 11 control-bit "1"
             CALL    HI           ;          ____________
             CALL    HI           ;bit 10 "0"
             CALL    LO
             CALL    LO           ;bit  9 "1"
             CALL    HI
             CALL    LO           ;bit  8 "1"
             CALL    HI           ;            dvd = 12
             CALL    HI           ;bit  7 "0"
             CALL    LO
             CALL    HI           ;bit  6 "0"
             CALL    LO           ;          ____________
             CALL    HI           ;bit  5 "0"
             CALL    LO
             CALL    HI           ;bit  4 "0"
             CALL    LO
             CALL    LO           ;bit  3 "1"  standby
             CALL    HI
             CALL    LO           ;bit  2 "1"  = 12
             CALL    HI
             CALL    HI           ;bit  1 "0"
             CALL    LO
             CALL    HI           ;bit  0 "0"
             CALL    LO           ;          ____________
             CALL    DB           ;data-break
             RETURN

CD1:         CALL    LO           ;bit 13 start-bit "1"
             CALL    HI
             CALL    LO           ;bit 12 start-bit "1"
             CALL    HI
             CALL    HI           ;bit 11 control-bit "0"
             CALL    LO           ;          ____________
             CALL    LO           ;bit 10 "1"
             CALL    HI
             CALL    HI           ;bit  9 "0"
             CALL    LO
             CALL    LO           ;bit  8 "1"
             CALL    HI           ;            cd = 20
             CALL    HI           ;bit  7 "0"
             CALL    LO
             CALL    HI           ;bit  6 "0"
             CALL    LO           ;          ____________
             CALL    HI           ;bit  5 "0"
             CALL    LO
             CALL    HI           ;bit  4 "0"
             CALL    LO
             CALL    LO           ;bit  3 "1"  standby
             CALL    HI
             CALL    LO           ;bit  2 "1"  = 12
             CALL    HI
             CALL    HI           ;bit  1 "0"
             CALL    LO
             CALL    HI           ;bit  0 "0"
             CALL    LO           ;          ____________
             CALL    DB           ;data-break
             RETURN

COMBI:       CALL    LO           ;bit 13 start-bit "1"
             CALL    HI
             CALL    LO           ;bit 12 start-bit "1"
             CALL    HI
             CALL    HI           ;bit 11 control-bit "0"
             CALL    LO           ;          ____________
             CALL    LO           ;bit 10 "1"
             CALL    HI
             CALL    HI           ;bit  9 "0"
             CALL    LO
             CALL    LO           ;bit  8 "1"
             CALL    HI           ;            combi = 21
             CALL    HI           ;bit  7 "0"
             CALL    LO
             CALL    LO           ;bit  6 "1"
             CALL    HI           ;          ____________
             CALL    HI           ;bit  5 "0"
             CALL    LO
             CALL    HI           ;bit  4 "0"
             CALL    LO
             CALL    LO           ;bit  3 "1"  standby
             CALL    HI
             CALL    LO           ;bit  2 "1"  = 12
             CALL    HI
             CALL    HI           ;bit  1 "0"
             CALL    LO
             CALL    HI           ;bit  0 "0"
             CALL    LO           ;          ____________
             CALL    DB           ;data-break
             RETURN

;high for data with 36 khz modulation - 896 µs
HI:          MOVLW   20h          ;-----------
             MOVWF   COUNT2       ;          |
LOOP2:       BSF     PORTA,IRLED  ;-----     |
             NOP                  ;    |     |
             NOP                  ;    |     |
             NOP                  ;7 µs on   |
             NOP                  ;    |     |
             NOP                  ;    |    32 x 28 µs
             NOP                  ;-----     |
             BCF     PORTA,IRLED  ;-----    for high-time
             NOP                  ;    |     |
             MOVLW   05h          ;    |     |
             MOVWF   COUNT1       ;21 µs off |
LOOP1:       DECFSZ  COUNT1,1     ;    |     |
             GOTO    LOOP1        ;-----     |
             DECFSZ  COUNT2,1     ;          |
             GOTO    LOOP2        ;-----------
             RETURN

;low for data - 896 µs
LO:          BCF     PORTA,IRLED
             MOVLW   02h
             MOVWF   COUNT4
LOOP6:       MOVLW   93h          ;93 = 891 µs
             MOVWF   COUNT3       ;96 = 909 µs
LOOP5:       DECFSZ  COUNT3,1     ;je + 2 µs call
             GOTO    LOOP5        ;and + 2 µs return
             DECFSZ  COUNT4,1
             GOTO    LOOP6
             RETURN

;data-break 89,600 ms and on/off flash
DB:          BCF     PORTA,IRLED
             MOVLW   77h
             MOVWF   COUNT4
LOOP4:       MOVLW   0FAh         ;F9 = 89370 µs
             MOVWF   COUNT3       ;FA = 89727 µs
LOOP3:       DECFSZ  COUNT3,1     ;je + 2 µs call
             GOTO    LOOP3        ;and + 2 µs return
             DECFSZ  COUNT4,1
             GOTO    LOOP4
             RETURN

;led-time for post 500 ms
LEDON:       MOVLW   08Ah         ;8A
             MOVWF   COUNT1       ;      773 µs
             MOVWF   COUNT2       ;    = 303,034 ms
             MOVLW   02h          ;02
             MOVWF   COUNT3
LEDONA:      DECFSZ  COUNT1,1
             GOTO    LEDONA
             DECFSZ  COUNT2,1
             GOTO    LEDONA
             DECFSZ  COUNT3,1
             GOTO    LEDONA
             RETURN

;subroutine test keysoff for test-switch
KEYSOFF:     BTFSS   PORTB,OF
             GOTO    KEYSOFF
             BTFSS   PORTB,TEST
             GOTO    KEYSOFF
             BTFSS   PORTB,DOW
             GOTO    KEYSOFF
             RETURN

;subroutine bounche-time
BT:          MOVLW   8Fh          ;430 µs
             MOVWF   COUNT6
BTA:         DECFSZ  COUNT6,1
             GOTO    BTA
             RETURN


             END