2021-11-03 13:56:19 -06:00
|
|
|
;;; 80 characters wide please ;;;;;;;;;;;;;;;;;;;;;;;;;; 8-space tabs please ;;;
|
|
|
|
|
|
|
|
|
|
|
|
;
|
|
|
|
;;;
|
|
|
|
;;;;; TashTwenty: Single-Chip DCD Interface
|
|
|
|
;;;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
;;; License ;;;
|
|
|
|
|
|
|
|
; This program is free software: you can redistribute it and/or modify
|
|
|
|
; it under the terms of the GNU General Public License as published by
|
|
|
|
; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
; (at your option) any later version.
|
|
|
|
;
|
|
|
|
; This program is distributed in the hope that it will be useful,
|
|
|
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
; GNU General Public License for more details.
|
|
|
|
;
|
|
|
|
; You should have received a copy of the GNU General Public License
|
|
|
|
; along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
|
|
;;; Connections ;;;
|
|
|
|
|
|
|
|
;;; ;;;
|
|
|
|
; .--------. ;
|
|
|
|
; Supply -|01 \/ 14|- Ground ;
|
|
|
|
; !ENBL ---> RA5 -|02 13|- RA0 ---> Always 0 ;
|
|
|
|
; PH3 ---> RA4 -|03 12|- RA1 <--- PH0 ;
|
|
|
|
; PH2 ---> RA3 -|04 11|- RA2 <--- PH1 ;
|
|
|
|
; WR ---> RC5 -|05 10|- RC0 ---> MMC SCK ;
|
|
|
|
; RD <--- RC4 -|06 09|- RC1 <--- MMC MISO ;
|
|
|
|
; MMC !CS <--- RC3 -|07 08|- RC2 ---> MMC MOSI ;
|
|
|
|
; '--------' ;
|
|
|
|
;;; ;;;
|
|
|
|
|
|
|
|
|
|
|
|
;;; Assembler Directives ;;;
|
|
|
|
|
|
|
|
list P=PIC16F1825, F=INHX32, ST=OFF, MM=OFF, R=DEC, X=ON
|
|
|
|
#include P16F1825.inc
|
|
|
|
__config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
|
|
|
|
;_FOSC_INTOSC Internal oscillator, I/O on RA5
|
|
|
|
;_WDTE_OFF Watchdog timer disabled
|
|
|
|
;_PWRTE_ON Keep in reset for 64 ms on start
|
|
|
|
;_MCLRE_OFF RA3/!MCLR is RA3
|
|
|
|
;_CP_OFF Code protection off
|
|
|
|
;_CPD_OFF Data memory protection off
|
|
|
|
;_BOREN_OFF Brownout reset off
|
|
|
|
;_CLKOUTEN_OFF CLKOUT disabled, I/O on RA4
|
|
|
|
;_IESO_OFF Internal/External switch not needed
|
|
|
|
;_FCMEN_OFF Fail-safe clock monitor not needed
|
|
|
|
__config _CONFIG2, _WRT_OFF & _PLLEN_ON & _STVREN_ON & _LVP_OFF
|
|
|
|
;_WRT_OFF Write protection off
|
|
|
|
;_PLLEN_ON 4x PLL on
|
|
|
|
;_STVREN_ON Stack over/underflow causes reset
|
|
|
|
;_LVP_OFF High-voltage on Vpp to program
|
|
|
|
|
|
|
|
|
|
|
|
;;; Macros ;;;
|
|
|
|
|
|
|
|
DELAY macro value ;Delay 3*W cycles, set W to 0
|
|
|
|
movlw value
|
|
|
|
decfsz WREG,F
|
|
|
|
bra $-1
|
|
|
|
endm
|
|
|
|
|
|
|
|
DNOP macro
|
|
|
|
bra $+1
|
|
|
|
endm
|
|
|
|
|
|
|
|
|
|
|
|
;;; Constants ;;;
|
|
|
|
|
|
|
|
TXNOTRC equ 7 ;Set if a transmit is ongoing, clear if a receive is
|
|
|
|
|
|
|
|
M_FAIL equ 7 ;Set when there's been a failure on the MMC interface
|
|
|
|
M_CMDLR equ 6 ;Set when R3 or R7 is expected (5 bytes), not R1
|
2021-11-06 11:36:59 -06:00
|
|
|
M_CMDRB equ 5 ;Set when an R1b is expected (busy signal after reply)
|
|
|
|
M_MBRD equ 4 ;Set when a multiblock read is in progress
|
|
|
|
M_MBWR equ 3 ;Set when a multiblock write is in progress
|
2021-11-03 13:56:19 -06:00
|
|
|
|
|
|
|
|
|
|
|
;;; Variable Storage ;;;
|
|
|
|
|
|
|
|
cblock 0x70 ;Bank-common registers
|
|
|
|
|
|
|
|
FLAGS ;You've got to have flags
|
|
|
|
GROUPS ;Count of groups to transmit, count of groups received
|
|
|
|
M_FLAGS ;MMC flags
|
|
|
|
M_BUF1 ;The command to be sent, later the R1 response byte
|
|
|
|
M_BUF2 ;First (high) byte of the address, first byte of R3/R7 response
|
|
|
|
M_BUF3 ;Second byte of the address, second byte of R3/R7 response
|
|
|
|
M_BUF4 ;Third byte of the address, third byte of R3/R7 response
|
|
|
|
M_BUF5 ;Fourth (low) byte of the address, last byte of R3/R7 response
|
|
|
|
M_BUF6 ;CRC byte of the command to be sent
|
|
|
|
TEMP ;Various purposes
|
|
|
|
TEMP2 ;Various purposes
|
|
|
|
TEMP3 ;Various purposes
|
|
|
|
D3
|
|
|
|
D2
|
|
|
|
D1
|
|
|
|
D0
|
|
|
|
|
|
|
|
endc
|
|
|
|
|
|
|
|
cblock 0x20 ;Bank 0 registers (receive shorthand)
|
|
|
|
|
|
|
|
RC_SYNC ;Sync byte
|
|
|
|
RC_CMDG ;Command groups + 0x80
|
|
|
|
RC_RSPG ;Response groups + 0x80
|
|
|
|
RC_CMDN ;Command number
|
|
|
|
RC_BLKS ;Block count
|
|
|
|
RC_ADRH ;Block address high
|
|
|
|
RC_ADRM ;Block address middle
|
|
|
|
RC_ADRL ;Block address low
|
|
|
|
|
|
|
|
endc
|
|
|
|
|
|
|
|
cblock 0x20 ;Bank 0 registers (transmit shorthand)
|
|
|
|
|
|
|
|
TX_CMDN ;Command number
|
|
|
|
TX_BLKS ;Block count
|
|
|
|
TX_STAT ;Status
|
|
|
|
TX_PAD1 ;Pad byte
|
|
|
|
TX_PAD2 ;Pad byte
|
|
|
|
TX_PAD3 ;Pad byte
|
|
|
|
TX_CSUM ;Checksum, if reply is only one group long
|
|
|
|
|
|
|
|
endc
|
|
|
|
|
|
|
|
|
|
|
|
;;; Vectors ;;;
|
|
|
|
|
|
|
|
org 0x0 ;Reset vector
|
|
|
|
bra Init
|
|
|
|
|
|
|
|
org 0x4 ;Interrupt vector
|
|
|
|
|
|
|
|
|
|
|
|
;;; Interrupt Handler ;;;
|
|
|
|
|
|
|
|
;BSR must always be at 0 when interrupts are on
|
|
|
|
|
|
|
|
Interrupt
|
|
|
|
lslf PORTA,W ;32 entries in the jump table, each has four
|
|
|
|
brw ; instructions; jump to the one matching state
|
|
|
|
|
|
|
|
IntEn0 bra IntSuspend ;Mac wants to suspend communication and is
|
|
|
|
nop ; waiting for us to drive RD high to deassert
|
|
|
|
nop ; !HSHK; handle it
|
|
|
|
nop ; "
|
|
|
|
IntEn1 movlb 7 ;This is the communication state, so we should
|
|
|
|
clrf IOCAF ; never get here unless it's a blip on one of
|
|
|
|
retfie ; the state lines - if it is, clear and return
|
|
|
|
nop ; and just hope timing isn't too badly wrecked
|
|
|
|
IntEn2 bsf PORTC,RC4 ;This state (idle) is two states away from the
|
|
|
|
bra IntAbort ; communication state, which is strange, but
|
|
|
|
nop ; assume that it means mac wants to abort the
|
|
|
|
nop ; operation in progress
|
|
|
|
IntEn3 btfss FLAGS,TXNOTRC ;In a receive, this means mac is done and is
|
|
|
|
bra IntDoneReceive ; waiting !HSHK to be deasserted; normally
|
|
|
|
bra IntAbort ; transmit will handle this state in mainline,
|
|
|
|
nop ; so if we're here it's bad, treat as an abort
|
|
|
|
IntEn4 bsf PORTC,RC4 ;This state (reset) is two states away from the
|
|
|
|
bra IntAbort ; communication state, which is strange, but
|
|
|
|
nop ; assume that it means mac wants to abort the
|
|
|
|
nop ; operation in progress
|
|
|
|
IntEn5 bcf PORTC,RC4 ;Now this is really weird; why would mac go to
|
|
|
|
bra Interrupt ; this state (drive RD low) in the middle of
|
|
|
|
nop ; communication? Whatever, drive RD low and
|
|
|
|
nop ; immediately circle back until state changes
|
|
|
|
IntEn6 bsf PORTC,RC4 ;Now this is really weird; why would mac go to
|
|
|
|
bra Interrupt ; this state (drive RD high) in the middle of
|
|
|
|
nop ; communication? Whatever, drive RD high and
|
|
|
|
nop ; immediately circle back until state changes
|
|
|
|
IntEn7 bsf PORTC,RC4 ;Now this is really weird; why would mac go to
|
|
|
|
bra Interrupt ; this state (drive RD high) in the middle of
|
|
|
|
nop ; communication? Whatever, drive RD high and
|
|
|
|
nop ; immediately circle back until state changes
|
|
|
|
IntEnNx bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to talk to the next device in mid-
|
|
|
|
nop ; communication? Whatever, drive RD high and
|
|
|
|
nop ; force an unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to talk to the next device in mid-
|
|
|
|
nop ; communication? Whatever, drive RD high and
|
|
|
|
nop ; force an unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to talk to the next device in mid-
|
|
|
|
nop ; communication? Whatever, drive RD high and
|
|
|
|
nop ; force an unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to talk to the next device in mid-
|
|
|
|
nop ; communication? Whatever, drive RD high and
|
|
|
|
nop ; force an unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to talk to the next device in mid-
|
|
|
|
nop ; communication? Whatever, drive RD high and
|
|
|
|
nop ; force an unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to talk to the next device in mid-
|
|
|
|
nop ; communication? Whatever, drive RD high and
|
|
|
|
nop ; force an unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to talk to the next device in mid-
|
|
|
|
nop ; communication? Whatever, drive RD high and
|
|
|
|
nop ; force an unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to talk to the next device in mid-
|
|
|
|
nop ; communication? Whatever, drive RD high and
|
|
|
|
nop ; force an unexplained return to the idle state
|
|
|
|
IntNEn bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
bsf PORTC,RC4 ;Now this is really REALLY weird; why would mac
|
|
|
|
bra IntAbort ; decide to deassert !ENBL mid-communication?
|
|
|
|
nop ; Whatever, drive RD high and force an
|
|
|
|
nop ; unexplained return to the idle state
|
|
|
|
|
|
|
|
IntSuspend
|
|
|
|
movlp high DecodeRecv ;If we were interrupted doing a receive, decode
|
|
|
|
btfss FLAGS,TXNOTRC ; the data we've received so far
|
|
|
|
call DecodeRecv ; "
|
|
|
|
bsf PORTC,RC4 ;Signal that we acknowledge the suspension
|
|
|
|
IntSTr1 movf PORTA,W ;Check the current state
|
|
|
|
btfsc STATUS,Z ;If it's 0 (holdoff), mac is still asking us to
|
|
|
|
bra IntSTr1 ; hold off, so loop again
|
|
|
|
xorlw B'00000100' ;If it's 2 (idle), mac wants to abort the
|
|
|
|
btfsc STATUS,Z ; command in progress
|
|
|
|
bra IntAbort ; "
|
|
|
|
xorlw B'00000110' ;If it's 1 (communication), mac is probably
|
|
|
|
btfsc STATUS,Z ; moving through it to state 3 (request send)
|
|
|
|
bra IntSTr1 ; so loop until it gets there
|
|
|
|
xorlw B'00000100' ;If it's anything else but 3 (request send),
|
|
|
|
btfss STATUS,Z ; something weird's going on so abort
|
|
|
|
bra IntAbort ; "
|
|
|
|
bcf PORTC,RC4 ;Signal that we're ready to resume
|
|
|
|
IntSTr2 movf PORTA,W ;Check the current state
|
|
|
|
xorlw B'00000110' ;If it's still 3 (request send), mac hasn't
|
|
|
|
btfsc STATUS,Z ; acknowledged that we're ready yet, so loop
|
|
|
|
bra IntSTr2 ; again
|
|
|
|
xorlw B'00000100' ;If it's anything else but 1 (communication),
|
|
|
|
btfss STATUS,Z ; something weird's going on, so abort
|
|
|
|
bra IntAbort ; "
|
|
|
|
movlb 7 ;Clear the interrupt that got us here and any
|
|
|
|
clrf IOCAF ; we received after that
|
|
|
|
movlb 31 ;Don't return to where we left off in the
|
|
|
|
movlw high Transmitter; transmitter or receiver loop, return to the
|
|
|
|
btfss FLAGS,TXNOTRC ; beginning of it; note that both transmitter
|
|
|
|
movlw high Receiver ; and receiver will take care of setting BSR
|
|
|
|
movwf TOSH ; and enabling interrupts - we use return here
|
|
|
|
movlw low Transmitter ; instead of retfie so that the FSRs don't get
|
|
|
|
btfss FLAGS,TXNOTRC ; overwritten
|
|
|
|
movlw low Receiver ; "
|
|
|
|
movwf TOSL ; "
|
|
|
|
return
|
|
|
|
|
|
|
|
IntDoneReceive
|
|
|
|
bsf PORTC,RC4 ;Deassert !HSHK to acknowledge receive is done
|
|
|
|
IntDRc0 movf PORTA,W ;Check the current state
|
|
|
|
xorlw B'00000110' ;If it's still 3, mac hasn't acknowledged our
|
|
|
|
btfsc STATUS,Z ; acknowledgment of the end of received data
|
|
|
|
bra IntDRc0 ; yet, so loop again
|
|
|
|
xorlw B'00000010' ;If it's anything else but 2 (idle), something
|
|
|
|
btfss STATUS,Z ; weird's going on, so abort
|
|
|
|
bra IntAbort ; "
|
|
|
|
movlp high DecodeRecv ;Decode the data we've received since the start
|
|
|
|
call DecodeRecv ; or since the last interruption
|
|
|
|
movlb 7 ;Clear the interrupt that got us here and any
|
|
|
|
clrf IOCAF ; we received after that
|
|
|
|
movlb 31 ;Swallow the interrupt return address and
|
|
|
|
decf STKPTR,F ; instead return to who called receiver
|
|
|
|
movlb 0 ; without reenabling interrupts
|
|
|
|
return ; "
|
|
|
|
|
|
|
|
IntAbort
|
|
|
|
movlb 7 ;Clear the interrupt that got us here and any
|
|
|
|
clrf IOCAF ; we received after that
|
|
|
|
movlb 31 ;Swallow the return address where the PC was
|
|
|
|
decf STKPTR,F ; when the interrupt happened
|
|
|
|
movlw high IdleJump ;Overwrite the return address from which
|
|
|
|
movwf TOSH ; receiver or transmitter was called with the
|
|
|
|
movlw low IdleJump ; address of the idle jump table so that a
|
|
|
|
movwf TOSL ; return from interrupt dumps us back there
|
|
|
|
movlb 0 ; to handle the current state
|
|
|
|
return ;Return to idle without reenabling interrupts
|
|
|
|
|
|
|
|
|
|
|
|
;;; Init ;;;
|
|
|
|
|
|
|
|
Init
|
|
|
|
banksel OSCCON ;32 MHz (w/PLL) high-freq internal oscillator
|
|
|
|
movlw B'11110000'
|
|
|
|
movwf OSCCON
|
|
|
|
|
|
|
|
banksel IOCAP ;When interrupts are on, any change on !ENBL or
|
|
|
|
movlw B'00111110' ; the phase pins triggers one
|
|
|
|
movwf IOCAP
|
|
|
|
movwf IOCAN
|
|
|
|
|
|
|
|
banksel SSPCON1 ;SSP SPI master mode, clock set by baud rate
|
|
|
|
movlw B'00101010' ; generator to 400 kHz, clock idles low, data
|
|
|
|
movwf SSPCON1 ; lines change on falling edge, data sampled on
|
|
|
|
movlw B'01000000' ; rising edge (CKP=0, CKE=1, SMP=0)
|
|
|
|
movwf SSP1STAT
|
|
|
|
movlw 19
|
|
|
|
movwf SSP1ADD
|
|
|
|
|
|
|
|
banksel ANSELA ;All pins digital, not analog
|
|
|
|
clrf ANSELA
|
|
|
|
clrf ANSELC
|
|
|
|
|
|
|
|
banksel LATA ;RA0 always off, RD and !CS high to start
|
|
|
|
movlw B'00111110'
|
|
|
|
movwf LATA
|
|
|
|
movlw B'00111111'
|
|
|
|
movwf LATC
|
|
|
|
|
|
|
|
banksel TRISA ;State pins inputs, RA0 output, WR input, RD
|
|
|
|
movlw B'00111110' ; tristated to start, MISO input, !CS, MOSI,
|
|
|
|
movwf TRISA ; and SCK output
|
|
|
|
movlw B'00110010'
|
|
|
|
movwf TRISC
|
|
|
|
|
|
|
|
movlw 0x20 ;Start pointers at top of linear memory
|
|
|
|
movwf FSR0H
|
|
|
|
movwf FSR1H
|
|
|
|
clrf FSR0L
|
|
|
|
clrf FSR1L
|
|
|
|
|
|
|
|
movlw B'00001000' ;Interrupt on PORTA pin change enabled, but
|
|
|
|
movwf INTCON ; interrupt subsystem off for now
|
|
|
|
|
|
|
|
movlb 0 ;Start BSR at 0
|
|
|
|
|
|
|
|
movlw 11 ;Delay approximately 1 ms to allow the MMC card
|
|
|
|
movwf TEMP ; to come up - do not call MmcInit before this
|
|
|
|
DelayMs DELAY 242 ; has been done
|
|
|
|
decfsz TEMP,F ; "
|
|
|
|
bra DelayMs ; "
|
|
|
|
call MmcInit ;Initialize!
|
|
|
|
movlb 4 ;Now that we're initialized, crank the speed
|
|
|
|
movlw B'00100001' ; of the SPI interface up to 2 MHz
|
|
|
|
movwf SSPCON1 ; "
|
|
|
|
movlb 0 ; "
|
|
|
|
|
|
|
|
|
|
|
|
;;; Mainline Code ;;;
|
|
|
|
|
|
|
|
WaitNoEnbl
|
|
|
|
btfss PORTA,RA5 ;Spin until !ENBL goes high
|
|
|
|
bra $-1 ; "
|
|
|
|
|
|
|
|
WaitEnbl
|
|
|
|
movlw B'00110010' ;Tristate RD
|
|
|
|
tris 7 ; "
|
|
|
|
bsf PORTC,RC4 ;Latch a 1 on RD for when we drive it
|
|
|
|
btfsc PORTA,RA5 ;Spin until !ENBL goes low
|
|
|
|
bra $-1 ; "
|
|
|
|
movlw B'00100010' ;Drive the RD pin, high at first
|
|
|
|
tris 7 ; "
|
|
|
|
|
|
|
|
IdleJump
|
|
|
|
movf PORTA,W ;32 entries in the jump table, each has two
|
|
|
|
brw ; instructions; jump to the one matching state
|
|
|
|
IdleEn0 bsf PORTC,RC4 ;HOFF is asserted but there's nothing to hold
|
|
|
|
bra IdleJump ; off from, so drive RD high to deassert !HSHK
|
|
|
|
IdleEn1 bsf PORTC,RC4 ;Mac wants to exchange data for some reason, so
|
|
|
|
bra IdleJump ; drive RD high because what else can we do
|
|
|
|
IdleEn2 bsf PORTC,RC4 ;Mac wants us to idle, cool, we're already
|
|
|
|
bra IdleJump ; idling, so drive RD high to deassert !HSHK
|
|
|
|
IdleEn3 bsf PORTC,RC4 ;Mac wants to send a command, drive RD high to
|
|
|
|
bra GetCommand ; deassert !HSHK and prepare to receive
|
|
|
|
IdleEn4 bsf PORTC,RC4 ;Mac wants us to reset, this is sorta reset, so
|
|
|
|
bra IdleJump ; drive RD high to deassert !HSHK
|
|
|
|
IdleEn5 bcf PORTC,RC4 ;Mac wants us to drive RD low, so drive RD low
|
|
|
|
bra IdleJump ; "
|
|
|
|
IdleEn6 bsf PORTC,RC4 ;Mac wants us to drive RD high, so drive RD
|
|
|
|
bra IdleJump ; high
|
|
|
|
IdleEn7 bsf PORTC,RC4 ;Mac wants us to drive RD high, so drive RD
|
|
|
|
bra IdleJump ; high
|
|
|
|
IdleENx bsf PORTC,RC4 ;Mac wants to talk to next device, none exists,
|
|
|
|
bra WaitNoEnbl ; so drive RD high and await !ENBL deasserted
|
|
|
|
bsf PORTC,RC4 ;Mac wants to talk to next device, none exists,
|
|
|
|
bra WaitNoEnbl ; so drive RD high and await !ENBL deasserted
|
|
|
|
bsf PORTC,RC4 ;Mac wants to talk to next device, none exists,
|
|
|
|
bra WaitNoEnbl ; so drive RD high and await !ENBL deasserted
|
|
|
|
bsf PORTC,RC4 ;Mac wants to talk to next device, none exists,
|
|
|
|
bra WaitNoEnbl ; so drive RD high and await !ENBL deasserted
|
|
|
|
bsf PORTC,RC4 ;Mac wants to talk to next device, none exists,
|
|
|
|
bra WaitNoEnbl ; so drive RD high and await !ENBL deasserted
|
|
|
|
bsf PORTC,RC4 ;Mac wants to talk to next device, none exists,
|
|
|
|
bra WaitNoEnbl ; so drive RD high and await !ENBL deasserted
|
|
|
|
bsf PORTC,RC4 ;Mac wants to talk to next device, none exists,
|
|
|
|
bra WaitNoEnbl ; so drive RD high and await !ENBL deasserted
|
|
|
|
bsf PORTC,RC4 ;Mac wants to talk to next device, none exists,
|
|
|
|
bra WaitNoEnbl ; so drive RD high and await !ENBL deasserted
|
|
|
|
IdleNEn bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
bra WaitEnbl ;!ENBL has been deasserted, so get off the bus
|
|
|
|
nop ; and wait for it to be asserted again
|
|
|
|
|
|
|
|
GetCommand
|
|
|
|
movlp high Receive ;Initiate receive
|
|
|
|
call Receive ; "
|
|
|
|
movlp 0 ; "
|
|
|
|
call CheckChecksum ;Calculate the checksum of the received block
|
|
|
|
btfss STATUS,Z ;If the checksum was bad, send a NAK
|
|
|
|
bra NakCommand ; "
|
|
|
|
movf RC_CMDN,W ;If the command number is 0x00, do a read
|
|
|
|
btfsc STATUS,Z ; "
|
|
|
|
bra CmdRead ; "
|
|
|
|
addlw -1 ;If the command number is 0x01, do a write
|
|
|
|
btfsc STATUS,Z ; "
|
|
|
|
bra CmdWrite ; "
|
|
|
|
addlw -2 ;If the command number is 0x03, get controller
|
|
|
|
btfsc STATUS,Z ; status (identify device)
|
|
|
|
bra CmdStatus ; "
|
|
|
|
addlw -62 ;If the command number is 0x41, do a continued
|
|
|
|
btfsc STATUS,Z ; write
|
|
|
|
bra CmdWriteCont ; "
|
|
|
|
bra CmdUnknown ;If none of the above, fake a response
|
|
|
|
|
|
|
|
CmdUnknown
|
|
|
|
movf RC_CMDN,W ;Save the unknown command's number since it's
|
|
|
|
movwf TEMP2 ; about to be overwritten
|
2021-11-06 11:36:59 -06:00
|
|
|
;TODO log unknown commands and expected response lengths somehow
|
2021-11-03 13:56:19 -06:00
|
|
|
call ClearResponse ;Clear the buffer according to expectations
|
|
|
|
movf TEMP2,W ;Our reply is going to be the command number
|
|
|
|
movwf TX_CMDN ; with its MSB set, by convention, but data
|
|
|
|
bsf TX_CMDN,7 ; will be all zeroes
|
|
|
|
call CalcChecksum ;Calculate the checksum of this placeholder
|
|
|
|
movlp high Transmit ;Initiate transmission
|
|
|
|
call Transmit ; "
|
|
|
|
movlp 0 ; "
|
|
|
|
goto IdleJump ;Done, hope the host doesn't mind
|
|
|
|
|
|
|
|
NakCommand
|
|
|
|
movlw 1 ;A NAK is a blank one-group command buffer with
|
|
|
|
movwf GROUPS ; a command number of 0x7F
|
|
|
|
movlw 0x7F ; "
|
|
|
|
movwf TX_CMDN ; "
|
|
|
|
clrf TX_BLKS ; "
|
|
|
|
clrf TX_STAT ; "
|
|
|
|
clrf TX_PAD1 ; "
|
|
|
|
clrf TX_PAD2 ; "
|
|
|
|
clrf TX_PAD3 ; "
|
|
|
|
movlw 0x81 ;We know what the checksum will be, so just
|
|
|
|
movwf TX_CSUM ; hardcode it
|
|
|
|
movlp high Transmit ;Initiate transmission
|
|
|
|
call Transmit ; "
|
|
|
|
movlp 0 ; "
|
|
|
|
goto IdleJump ;Done
|
|
|
|
|
|
|
|
CmdRead
|
2021-11-06 11:36:59 -06:00
|
|
|
call MmcStopOngoing ;Stop any multiblock read or write
|
2021-11-03 13:56:19 -06:00
|
|
|
clrf M_BUF5 ;Shift the block address left by 9 (multiply it
|
|
|
|
lslf RC_ADRL,W ; by 512) to transform it into the byte address
|
|
|
|
movwf M_BUF4 ; used by the MMC card
|
|
|
|
rlf RC_ADRM,W ; "
|
|
|
|
movwf M_BUF3 ; "
|
|
|
|
rlf RC_ADRH,W ; "
|
|
|
|
movwf M_BUF2 ; "
|
|
|
|
movf RC_BLKS,W ;Move the block count from receiver position to
|
|
|
|
movwf TX_BLKS ; transmitter position
|
|
|
|
movlw 0x80 ;Command number is the read command with the
|
|
|
|
movwf TX_CMDN ; MSB set
|
|
|
|
clrf TX_STAT ;A zero status means all is well
|
|
|
|
clrf TX_PAD1 ;Clear the padding bytes
|
|
|
|
clrf TX_PAD2 ; "
|
|
|
|
clrf TX_PAD3 ; "
|
|
|
|
;TODO clear 20 tag bytes too?
|
|
|
|
CmdRea0 movlw 0x02 ;Increment the read address by 512 - we do this
|
|
|
|
addwf M_BUF4,F ; on the first loop iteration because the first
|
|
|
|
movlw 0 ; sector on the MMC card is the controller
|
|
|
|
addwfc M_BUF3,F ; status block, conveniently
|
|
|
|
addwfc M_BUF2,F ; "
|
2021-11-06 11:36:59 -06:00
|
|
|
movlw 0x51 ;Set up a read command for the MMC card (R1-
|
|
|
|
movwf M_BUF1 ; type response)
|
|
|
|
bcf M_FLAGS,M_CMDLR ; "
|
|
|
|
bcf M_FLAGS,M_CMDRB ; "
|
2021-11-03 13:56:19 -06:00
|
|
|
bcf PORTC,RC3 ;Assert !CS
|
|
|
|
btfss M_FLAGS,M_FAIL ;If there haven't been any previous failures,
|
|
|
|
call MmcCmd ; send the MMC command
|
|
|
|
btfsc M_FLAGS,M_FAIL ;If the operation failed, set the MSB of the
|
|
|
|
bsf TX_STAT,7 ; status returned by the drive to indicate so
|
|
|
|
movlw 0x20 ;Point FSR0 past the six header bytes and the
|
|
|
|
movwf FSR0H ; 20 'tag' bytes to where the real data starts
|
|
|
|
movlw 0x1A ; "
|
|
|
|
movwf FSR0L ; "
|
|
|
|
btfss M_FLAGS,M_FAIL ;If the operation didn't fail, read data from
|
|
|
|
call MmcReadData ; the MMC card
|
|
|
|
bsf PORTC,RC3 ;Deassert !CS
|
|
|
|
btfsc M_FLAGS,M_FAIL ;If the operation failed, set the MSB of the
|
|
|
|
bsf TX_STAT,7 ; status returned by the drive to indicate so
|
|
|
|
movlw 0x20 ;Point FSR0 at the top of linear memory, where
|
|
|
|
movwf FSR0H ; we want transmission to start from
|
|
|
|
clrf FSR0L ; "
|
|
|
|
movlw 77 ;Set the group count to 77 (512 bytes of data,
|
|
|
|
btfsc M_FLAGS,M_FAIL ; 20 'tag' bytes, 6 byte header, checksum byte)
|
|
|
|
movlw 1 ; unless there was a failure, in which case set
|
|
|
|
movwf GROUPS ; it to 1 to carry the bad status back to mac
|
|
|
|
call CalcChecksum ;Calculate the checksum on our response
|
|
|
|
movlp high Transmit ;Initiate transmission
|
|
|
|
call Transmit ; "
|
|
|
|
movlp 0 ; "
|
|
|
|
decfsz TX_BLKS,F ;Decrement the block count; if it hits zero,
|
|
|
|
bra CmdRea0 ; that's all the reading we were requested to
|
|
|
|
goto IdleJump ; do, so call it done
|
|
|
|
|
|
|
|
CmdWrite
|
2021-11-06 11:36:59 -06:00
|
|
|
call MmcStopOngoing ;Stop any multiblock read or write
|
2021-11-03 13:56:19 -06:00
|
|
|
clrf M_BUF5 ;Shift the block address left by 9 (multiply it
|
|
|
|
lslf RC_ADRL,W ; by 512) to transform it into the byte address
|
|
|
|
movwf M_BUF4 ; used by the MMC card
|
|
|
|
rlf RC_ADRM,W ; "
|
|
|
|
movwf M_BUF3 ; "
|
|
|
|
rlf RC_ADRH,W ; "
|
|
|
|
movwf M_BUF2 ; "
|
|
|
|
movlw 0x02 ;Increment the read address by 512 - we do this
|
|
|
|
addwf M_BUF4,F ; at the start of a write because the first
|
|
|
|
movlw 0 ; sector on the MMC card is the controller
|
|
|
|
addwfc M_BUF3,F ; status block
|
|
|
|
addwfc M_BUF2,F ; "
|
2021-11-06 11:36:59 -06:00
|
|
|
movlw 0x59 ;Set up a write command for the MMC card (R1-
|
|
|
|
movwf M_BUF1 ; type reply)
|
|
|
|
bcf M_FLAGS,M_CMDLR ; "
|
|
|
|
bcf M_FLAGS,M_CMDRB ; "
|
|
|
|
bsf M_FLAGS,M_MBWR ;Set the flag for an ongoing multiblock write
|
2021-11-03 13:56:19 -06:00
|
|
|
bcf PORTC,RC3 ;Assert !CS
|
|
|
|
btfss M_FLAGS,M_FAIL ;If there haven't been any previous failures,
|
|
|
|
call MmcCmd ; send the MMC command
|
2021-11-06 11:36:59 -06:00
|
|
|
CmdWriteCont
|
|
|
|
btfss M_FLAGS,M_MBWR ;If for some reason we got here without there
|
|
|
|
bra NakCommand ; being a multiblock write going on, NAK
|
2021-11-03 13:56:19 -06:00
|
|
|
movlw 0x20 ;Point FSR0 past the sync, length, header, and
|
|
|
|
movwf FSR0H ; tag bytes, and to the data we'll be writing
|
|
|
|
movlw 0x1D ; "
|
|
|
|
movwf FSR0L ; "
|
|
|
|
btfss M_FLAGS,M_FAIL ;If the operation didn't fail, write data to
|
|
|
|
call MmcWriteData ; the MMC card
|
2021-11-06 11:36:59 -06:00
|
|
|
decf RC_BLKS,W ;If the blocks-remaining counter is at one,
|
|
|
|
btfsc STATUS,Z ; stop the multiblock write here before sending
|
|
|
|
call MmcStopOngoing ; our response to the mac
|
2021-11-03 13:56:19 -06:00
|
|
|
movf RC_BLKS,W ;Move the block count from receiver position to
|
|
|
|
movwf TX_BLKS ; transmitter position
|
|
|
|
movlw 0x81 ;Command number is the write command with the
|
|
|
|
movwf TX_CMDN ; MSB set
|
|
|
|
clrf TX_STAT ;A zero status means all is well, so if there
|
|
|
|
btfsc M_FLAGS,M_FAIL ; have been failures talking to the MMC card,
|
|
|
|
bsf TX_STAT,7 ; set MSB to indicate so
|
|
|
|
clrf TX_PAD1 ;Clear the padding bytes
|
|
|
|
clrf TX_PAD2 ; "
|
|
|
|
clrf TX_PAD3 ; "
|
|
|
|
movlw 0x20 ;Point FSR0 at the top of linear memory, where
|
|
|
|
movwf FSR0H ; we want transmission to start from
|
|
|
|
clrf FSR0L ; "
|
|
|
|
movlw 1 ;Success or failure, we're transmitting one
|
|
|
|
movwf GROUPS ; group in response
|
|
|
|
call CalcChecksum ;Calculate the checksum on our response
|
|
|
|
movlp high Transmit ;Initiate transmission
|
|
|
|
call Transmit ; "
|
|
|
|
movlp 0 ; "
|
|
|
|
goto IdleJump ;Done
|
|
|
|
|
|
|
|
CmdStatus
|
2021-11-06 11:36:59 -06:00
|
|
|
call MmcStopOngoing ;Stop any multiblock read or write
|
2021-11-03 13:56:19 -06:00
|
|
|
clrf M_BUF5 ;Set the address to read the first sector of
|
|
|
|
clrf M_BUF4 ; the MMC card
|
|
|
|
clrf M_BUF3 ; "
|
|
|
|
clrf M_BUF2 ; "
|
2021-11-06 11:36:59 -06:00
|
|
|
movlw 0x51 ;Set up a read command for the MMC card (R1-
|
|
|
|
movwf M_BUF1 ; type reply)
|
|
|
|
bcf M_FLAGS,M_CMDLR ; "
|
|
|
|
bcf M_FLAGS,M_CMDRB ; "
|
2021-11-03 13:56:19 -06:00
|
|
|
movlw 0x83 ;Command number is the status command with the
|
|
|
|
movwf TX_CMDN ; MSB set
|
|
|
|
clrf TX_BLKS ;Block count is a pad byte in status command
|
|
|
|
clrf TX_STAT ;A zero status means all is well
|
|
|
|
clrf TX_PAD1 ;Clear the padding bytes
|
|
|
|
clrf TX_PAD2 ; "
|
|
|
|
clrf TX_PAD3 ; "
|
|
|
|
bcf PORTC,RC3 ;Assert !CS
|
|
|
|
btfss M_FLAGS,M_FAIL ;If there haven't been any previous failures,
|
|
|
|
call MmcCmd ; send the MMC command
|
|
|
|
btfsc M_FLAGS,M_FAIL ;If the operation failed, set the MSB of the
|
|
|
|
bsf TX_STAT,7 ; status returned by the drive to indicate so
|
|
|
|
movlw 0x20 ;Point FSR0 past the six header bytes to where
|
|
|
|
movwf FSR0H ; the real data starts
|
|
|
|
movlw 0x06 ; "
|
|
|
|
movwf FSR0L ; "
|
|
|
|
btfss M_FLAGS,M_FAIL ;If the operation didn't fail, read data from
|
|
|
|
call MmcReadData ; the MMC card
|
|
|
|
bsf PORTC,RC3 ;Deassert !CS
|
|
|
|
btfsc M_FLAGS,M_FAIL ;If the operation failed, set the MSB of the
|
|
|
|
bsf TX_STAT,7 ; status returned by the drive to indicate so
|
|
|
|
movlw 0x20 ;Point FSR0 at the top of linear memory, where
|
|
|
|
movwf FSR0H ; we want transmission to start from
|
|
|
|
clrf FSR0L ; "
|
|
|
|
movlw 49 ;Set the group count to 49 (336 bytes of data,
|
|
|
|
btfsc M_FLAGS,M_FAIL ; 6 byte header, checksum byte) unless there
|
|
|
|
movlw 1 ; was a failure, in which case set it to 1 to
|
|
|
|
movwf GROUPS ; carry the bad status back to mac
|
|
|
|
call CalcChecksum ;Calculate the checksum on our response
|
|
|
|
movlp high Transmit ;Initiate transmission
|
|
|
|
call Transmit ; "
|
|
|
|
movlp 0 ; "
|
|
|
|
goto IdleJump ;Done
|
|
|
|
|
|
|
|
|
|
|
|
;;; Subprograms ;;;
|
|
|
|
|
|
|
|
;Calculate the checksum of the block about to be transmitted, pointed to by
|
|
|
|
; FSR0 and containing GROUPS * 7 bytes. Trashes TEMP, TEMP2, and FSR1.
|
|
|
|
CalcChecksum
|
|
|
|
movf FSR0H,W ;Copy FSR0 into FSR1
|
|
|
|
movwf FSR1H ; "
|
|
|
|
movf FSR0L,W ; "
|
|
|
|
movwf FSR1L ; "
|
|
|
|
movf GROUPS,W ;Copy the group count into TEMP
|
|
|
|
movwf TEMP ; "
|
|
|
|
clrf TEMP2 ;Zero the running sum (mod 256)
|
|
|
|
bra CalcCh1 ;Jump the first add so we sum one less than the
|
|
|
|
CalcCh0 moviw FSR1++ ; total bytes in the block and can write the
|
|
|
|
addwf TEMP2,F ; checksum to the very last byte position
|
|
|
|
CalcCh1 moviw FSR1++ ;Add the bytes in this group to the running sum
|
|
|
|
addwf TEMP2,F ; "
|
|
|
|
moviw FSR1++ ; "
|
|
|
|
addwf TEMP2,F ; "
|
|
|
|
moviw FSR1++ ; "
|
|
|
|
addwf TEMP2,F ; "
|
|
|
|
moviw FSR1++ ; "
|
|
|
|
addwf TEMP2,F ; "
|
|
|
|
moviw FSR1++ ; "
|
|
|
|
addwf TEMP2,F ; "
|
|
|
|
moviw FSR1++ ; "
|
|
|
|
addwf TEMP2,F ; "
|
|
|
|
decfsz TEMP,F ;Loop until we've summed the last group
|
|
|
|
bra CalcCh0 ; "
|
|
|
|
comf TEMP2,W ;Two's complement the sum so the whole block
|
|
|
|
addlw 1 ; adds up to zero and write it to the block's
|
|
|
|
movwi FSR1++ ; last byte
|
|
|
|
return
|
|
|
|
|
|
|
|
;Calculate the checksum of the block just received, starting at the third byte
|
|
|
|
; of linear memory and containing GROUPS * 7 bytes. Trashes TEMP, TEMP2, and
|
|
|
|
; FSR1.
|
|
|
|
CheckChecksum
|
|
|
|
movlw 0x20 ;Point FSR1 to the third byte of linear memory
|
|
|
|
movwf FSR1H ; "
|
|
|
|
movlw 0x03 ; "
|
|
|
|
movwf FSR1L ; "
|
|
|
|
movf GROUPS,W ;Copy the group count into TEMP
|
|
|
|
movwf TEMP ; "
|
|
|
|
clrf TEMP2 ;Zero the running sum (mod 256)
|
|
|
|
CheckC0 moviw FSR1++ ;Add the next seven bytes to the running sum
|
|
|
|
addwf TEMP2,F ; "
|
|
|
|
moviw FSR1++ ; "
|
|
|
|
addwf TEMP2,F ; "
|
|
|
|
moviw FSR1++ ; "
|
|
|
|
addwf TEMP2,F ; "
|
|
|
|
moviw FSR1++ ; "
|
|
|
|
addwf TEMP2,F ; "
|
|
|
|
moviw FSR1++ ; "
|
|
|
|
addwf TEMP2,F ; "
|
|
|
|
moviw FSR1++ ; "
|
|
|
|
addwf TEMP2,F ; "
|
|
|
|
moviw FSR1++ ; "
|
|
|
|
addwf TEMP2,F ; "
|
|
|
|
decfsz TEMP,F ;Loop until we've summed the last group
|
|
|
|
bra CheckC0 ; "
|
|
|
|
movf TEMP2,F ;Set Z if block sum is 0 and checksum is good
|
|
|
|
return
|
|
|
|
|
|
|
|
;Clear linear memory for the response to a command according to the expected
|
|
|
|
; response length according to mac, pointing FSR0 to the beginning of it and
|
|
|
|
; setting GROUPS to the number of groups to be sent. Trashes TEMP.
|
|
|
|
ClearResponse
|
|
|
|
movlw 0x20 ;Point FSR0 to the top of linear memory
|
|
|
|
movwf FSR0H ; "
|
|
|
|
clrf FSR0L ; "
|
|
|
|
movf RC_RSPG,W ;Snuff the top bit of the number of groups in
|
|
|
|
andlw B'01111111' ; the expected response and copy this into
|
|
|
|
movwf GROUPS ; the group count as well as a temporary
|
|
|
|
movwf TEMP ; counter
|
|
|
|
movlw 0 ;Zero is what we're setting the buffer to
|
|
|
|
ClearR0 movwi FSR0++ ;Write seven zeroes to the buffer
|
|
|
|
movwi FSR0++ ; "
|
|
|
|
movwi FSR0++ ; "
|
|
|
|
movwi FSR0++ ; "
|
|
|
|
movwi FSR0++ ; "
|
|
|
|
movwi FSR0++ ; "
|
|
|
|
movwi FSR0++ ; "
|
|
|
|
decfsz TEMP,F ;Loop until we've zeroed the last group
|
|
|
|
bra ClearR0 ; "
|
|
|
|
movlw 0x20 ;Point FSR0 to the top of linear memory again
|
|
|
|
movwf FSR0H ; "
|
|
|
|
clrf FSR0L ; "
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
;;; MMC Subprograms ;;;
|
|
|
|
|
|
|
|
;Initialize MMC card. Sets M_FAIL on fail. Trashes TEMP.
|
|
|
|
MmcInit
|
2021-11-06 11:36:59 -06:00
|
|
|
clrf M_FLAGS ;Make sure flags are all clear to begin with
|
2021-11-03 13:56:19 -06:00
|
|
|
movlb 4 ;This is where all the SSP registers are
|
|
|
|
movlw 10 ;Send 80 clocks on SPI interface to ensure MMC
|
|
|
|
movwf TEMP ; card is started up and in native command mode
|
|
|
|
MmcIni0 movlw 0xFF ; "
|
|
|
|
movwf SSP1BUF ; "
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
decfsz TEMP,F ; "
|
|
|
|
bra MmcIni0 ; "
|
|
|
|
movlb 0 ;Assert !CS
|
|
|
|
bcf PORTC,RC3 ; "
|
|
|
|
movlw 0x40 ;Send command 0 (expect R1-type response)
|
|
|
|
movwf M_BUF1 ; which, with !CS asserted, signals to the card
|
|
|
|
clrf M_BUF2 ; that we want to enter SPI mode
|
|
|
|
clrf M_BUF3 ; "
|
|
|
|
clrf M_BUF4 ; "
|
|
|
|
clrf M_BUF5 ; "
|
|
|
|
movlw 0x95 ; "
|
|
|
|
movwf M_BUF6 ; "
|
|
|
|
bcf M_FLAGS,M_CMDLR ; "
|
2021-11-06 11:36:59 -06:00
|
|
|
bcf M_FLAGS,M_CMDRB ; "
|
2021-11-03 13:56:19 -06:00
|
|
|
call MmcCmd ; "
|
|
|
|
btfsc M_FLAGS,M_FAIL ;If this command failed, unrecognized or
|
|
|
|
return ; missing MMC card, fail the init operation
|
|
|
|
movf M_BUF1,W ;If this command returned any response other
|
|
|
|
xorlw 0x01 ; than 0x01 ('in idle state'), unrecognized MMC
|
|
|
|
btfss STATUS,Z ; card, fail the init operation
|
|
|
|
bsf M_FLAGS,M_FAIL ; "
|
|
|
|
btfss STATUS,Z ; "
|
|
|
|
return ; "
|
|
|
|
MmcIni1 movlw 0x41 ;Send command 1 (expect R1-type response),
|
|
|
|
movwf M_BUF1 ; which tells the card to initialize
|
|
|
|
clrf M_BUF2 ; "
|
|
|
|
clrf M_BUF3 ; "
|
|
|
|
clrf M_BUF4 ; "
|
|
|
|
clrf M_BUF5 ; "
|
|
|
|
clrf M_BUF6 ; "
|
|
|
|
bcf M_FLAGS,M_CMDLR ; "
|
2021-11-06 11:36:59 -06:00
|
|
|
bcf M_FLAGS,M_CMDRB ; "
|
2021-11-03 13:56:19 -06:00
|
|
|
call MmcCmd ; "
|
|
|
|
btfsc M_FLAGS,M_FAIL ;If this command failed, unrecognized MMC card,
|
|
|
|
return ; fail the init operation
|
|
|
|
movf M_BUF1,W ;If it returned an 0x00 status, initialization
|
|
|
|
btfsc STATUS,Z ; is finished
|
|
|
|
bra MmcIni2 ; "
|
|
|
|
decf M_BUF1,W ;If it returned an 0x01 status, initialization
|
|
|
|
btfsc STATUS,Z ; is still proceeding, so try again
|
|
|
|
bra MmcIni1 ; "
|
|
|
|
bsf M_FLAGS,M_FAIL ;If it returned anything else, something is
|
|
|
|
return ; awry, fail the init operation
|
|
|
|
MmcIni2 movlw 0x50 ;Send command 16 (expect R1-type response) to
|
|
|
|
movwf M_BUF1 ; tell the card we want to deal in 512-byte
|
|
|
|
clrf M_BUF2 ; sectors
|
|
|
|
clrf M_BUF3 ; "
|
|
|
|
movlw 0x02 ; "
|
|
|
|
movwf M_BUF4 ; "
|
|
|
|
clrf M_BUF5 ; "
|
|
|
|
clrf M_BUF6 ; "
|
|
|
|
bcf M_FLAGS,M_CMDLR ; "
|
2021-11-06 11:36:59 -06:00
|
|
|
bcf M_FLAGS,M_CMDRB ; "
|
2021-11-03 13:56:19 -06:00
|
|
|
call MmcCmd ; "
|
|
|
|
btfsc M_FLAGS,M_FAIL ;If this command failed, something is wrong,
|
|
|
|
return ; fail the init operation
|
|
|
|
movf M_BUF1,W ;If this command returned any response other
|
|
|
|
btfss STATUS,Z ; than 0x00, something is wrong, fail the init
|
|
|
|
bsf M_FLAGS,M_FAIL ; operation
|
|
|
|
bsf PORTC,RC3 ;Deassert !CS
|
|
|
|
return ;Regardless, we're done here
|
|
|
|
|
|
|
|
;Read 512 bytes of data from MMC card into buffer pointed to by FSR0. Sets
|
|
|
|
; M_FAIL on fail. Trashes TEMP and FSR0.
|
|
|
|
MmcReadData
|
|
|
|
movlb 4 ;Switch to the bank with the SSP registers
|
|
|
|
clrf TEMP ;Try 256 times to get the data token
|
|
|
|
MmcRea1 movlw 0xFF ;Clock a byte out of the MMC card while keeping
|
|
|
|
movwf SSP1BUF ; MOSI high
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
movf SSP1BUF,W ;If we've received the data token, skip ahead
|
|
|
|
xorlw 0xFE ; "
|
|
|
|
btfsc STATUS,Z ; "
|
|
|
|
bra MmcRea2 ; "
|
|
|
|
DELAY 0 ;If not, delay 768 cycles, decrement the retry
|
|
|
|
decfsz TEMP,F ; count, and try again
|
|
|
|
bra MmcRea1 ; "
|
|
|
|
bsf M_FLAGS,M_FAIL ;If we didn't get the data token after 256
|
|
|
|
movlb 0 ; tries, give up and fail the operation
|
|
|
|
return ; "
|
|
|
|
MmcRea2 clrf TEMP ;Read 256 pairs of bytes
|
|
|
|
MmcRea3 movlw 0xFF ;Clock the next data byte out of the MMC card
|
|
|
|
movwf SSP1BUF ; while keeping MOSI high
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
movf SSP1BUF,W ;Move the byte we clocked out to the buffer and
|
|
|
|
movwi FSR0++ ; increment the pointer
|
|
|
|
movlw 0xFF ;Clock the next data byte out of the MMC card
|
|
|
|
movwf SSP1BUF ; while keeping MOSI high
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
movf SSP1BUF,W ;Move the byte we clocked out to the buffer and
|
|
|
|
movwi FSR0++ ; increment the pointer
|
|
|
|
decfsz TEMP,F ;Decrement the counter and go back to read the
|
|
|
|
bra MmcRea3 ; next byte pair, unless we're done
|
|
|
|
movlw 0xFF ;Clock the first CRC byte out of the MMC card
|
|
|
|
movwf SSP1BUF ; while keeping MOSI high
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
movlw 0xFF ;Clock the second CRC byte out of the MMC card
|
|
|
|
movwf SSP1BUF ; while keeping MOSI high
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
movlb 0 ;Return to the default bank
|
|
|
|
return
|
|
|
|
|
|
|
|
;Write 512 bytes of data to MMC card from buffer pointed to by FSR0. Sets
|
2021-11-06 11:36:59 -06:00
|
|
|
; M_FAIL on fail. Trashes TEMP, TEMP2, and FSR0.
|
2021-11-03 13:56:19 -06:00
|
|
|
MmcWriteData
|
|
|
|
movlb 4 ;Switch to the bank with the SSP registers
|
|
|
|
movlw 0xFF ;Clock a dummy byte while keeping MOSI high
|
|
|
|
movwf SSP1BUF ; "
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
2021-11-06 11:36:59 -06:00
|
|
|
movlw 0xFE ;Clock the data token into the MMC card (note
|
|
|
|
btfsc M_FLAGS,M_MBWR ; that CMD25, multi-block write, requires a
|
|
|
|
movlw 0xFC ; different token than CMD24, single-block
|
|
|
|
movwf SSP1BUF ; write, so we differentiate based on the flag
|
|
|
|
btfss SSP1STAT,BF ; for ongoing multi-block write)
|
2021-11-03 13:56:19 -06:00
|
|
|
bra $-1 ; "
|
|
|
|
clrf TEMP ;Send 256 pairs of bytes
|
|
|
|
MmcWri0 moviw FSR0++ ;Clock the next data byte into the MMC card
|
|
|
|
movwf SSP1BUF ; "
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
moviw FSR0++ ;Clock the next data byte into the MMC card
|
|
|
|
movwf SSP1BUF ; "
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
decfsz TEMP,F ;Decrement the counter and go back to write the
|
|
|
|
bra MmcWri0 ; next byte pair, unless we're done
|
|
|
|
clrf SSP1BUF ;Clock a blank CRC byte into the MMC card
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
clrf SSP1BUF ;Clock a blank CRC byte into the MMC card
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
movlw 0xFF ;Clock data response byte out of the MMC card
|
|
|
|
movwf SSP1BUF ; while keeping MOSI high
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
movf SSP1BUF,W ;If the status byte indicates that the write
|
|
|
|
andlw B'00011111' ; was rejected for any reason, fail the write
|
|
|
|
xorlw B'00000101' ; operation
|
|
|
|
btfss STATUS,Z ; "
|
2021-11-06 11:36:59 -06:00
|
|
|
bsf M_FLAGS,M_FAIL ; "
|
|
|
|
btfss M_FLAGS,M_FAIL ;If we didn't fail, wait for the card not to be
|
|
|
|
call MmcWaitBusy ; busy anymore
|
|
|
|
movlb 0 ;Return to the default bank
|
|
|
|
return
|
|
|
|
|
|
|
|
;Stop a multiblock read or write, if one is ongoing, and deassert !CS. Sets
|
|
|
|
; M_FAIL on fail. Trashes TEMP and TEMP2.
|
|
|
|
MmcStopOngoing
|
|
|
|
btfsc M_FLAGS,M_FAIL ;If there's a fail on the MMC card, return
|
|
|
|
return ; immediately
|
|
|
|
btfsc M_FLAGS,M_MBWR ;If there's an ongoing write operation, make it
|
|
|
|
bra MmcSto0 ; stop
|
|
|
|
btfss M_FLAGS,M_MBRD ;If there's not an ongoing read operation, this
|
|
|
|
return ; function was called needlessly, return
|
|
|
|
movlw 0x4C ;Send a CMD12 to stop the ongoing read, R1b
|
|
|
|
movwf M_BUF1 ; reply type
|
|
|
|
clrf M_BUF2 ; "
|
|
|
|
clrf M_BUF3 ; "
|
|
|
|
clrf M_BUF4 ; "
|
|
|
|
clrf M_BUF5 ; "
|
|
|
|
bcf M_FLAGS,M_CMDLR ; "
|
|
|
|
bsf M_FLAGS,M_CMDRB ; "
|
|
|
|
call MmcCmd ; "
|
|
|
|
bcf M_FLAGS,M_MBRD ;Clear the ongoing multiblock read flag
|
|
|
|
bsf PORTC,RC3 ;Deassert !CS
|
|
|
|
return
|
|
|
|
MmcSto0 movlb 4 ;Switch to the bank with the SSP registers
|
|
|
|
movlw 0xFD ;Clock the end-of-data token into the MMC card
|
|
|
|
movwf SSP1BUF ; "
|
2021-11-03 13:56:19 -06:00
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
2021-11-06 11:36:59 -06:00
|
|
|
movlw 0xFF ;Clock a dummy byte while keeping MOSI high
|
|
|
|
movwf SSP1BUF ; "
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
call MmcWaitBusy ;Wait for the card to not be busy anymore
|
|
|
|
movlb 0 ;Return to the default bank
|
|
|
|
bcf M_FLAGS,M_MBWR ;Clear the ongoing multiblock write flag
|
|
|
|
bsf PORTC,RC3 ;Deassert !CS
|
2021-11-03 13:56:19 -06:00
|
|
|
return
|
|
|
|
|
|
|
|
;Send the command contained in M_BUF1-6 to MMC card. Sets M_FAIL on fail.
|
|
|
|
; Trashes TEMP.
|
|
|
|
MmcCmd
|
|
|
|
bcf M_FLAGS,M_FAIL ;Start out optimistic and say this didn't fail
|
|
|
|
movlb 4 ;Switch to the bank with the SSP registers
|
|
|
|
movf M_BUF1,W ;Clock out all six MMC buffer bytes as command
|
|
|
|
movwf SSP1BUF ; "
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
movf M_BUF2,W ; "
|
|
|
|
movwf SSP1BUF ; "
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
movf M_BUF3,W ; "
|
|
|
|
movwf SSP1BUF ; "
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
movf M_BUF4,W ; "
|
|
|
|
movwf SSP1BUF ; "
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
movf M_BUF5,W ; "
|
|
|
|
movwf SSP1BUF ; "
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
movf M_BUF6,W ; "
|
|
|
|
movwf SSP1BUF ; "
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
movlw 8 ;Try to get status as many as eight times
|
|
|
|
movwf TEMP ; "
|
|
|
|
MmcCmd1 movlw 0xFF ;Clock a byte out of the MMC card while keeping
|
|
|
|
movwf SSP1BUF ; MOSI high
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
incf SSP1BUF,W ;If we read back anything but 0xFF, skip ahead
|
|
|
|
btfss STATUS,Z ; "
|
|
|
|
bra MmcCmd2 ; "
|
|
|
|
decfsz TEMP,F ;Decrement the attempt counter until we've
|
|
|
|
bra MmcCmd1 ; tried eight times; if we haven't gotten a
|
|
|
|
bsf M_FLAGS,M_FAIL ; reply by the eighth attempt, signal failure
|
|
|
|
movlb 0 ; and return
|
|
|
|
return ; "
|
|
|
|
MmcCmd2 decf WREG,W ;Store the byte we received as R1-type status
|
|
|
|
movwf M_BUF1 ; in the buffer
|
|
|
|
btfss M_FLAGS,M_CMDLR ;If we aren't expecting a long (R3/R7-type)
|
|
|
|
bra MmcCmd3 ; reply, we're done
|
|
|
|
movlw 0xFF ;Clock first extended reply byte out of the
|
|
|
|
movwf SSP1BUF ; MMC card while keeping MOSI high and store it
|
|
|
|
btfss SSP1STAT,BF ; in the buffer
|
|
|
|
bra $-1 ; "
|
|
|
|
movf SSP1BUF,W ; "
|
|
|
|
movwf M_BUF2 ; "
|
|
|
|
movlw 0xFF ;Clock second extended reply byte out of the
|
|
|
|
movwf SSP1BUF ; MMC card while keeping MOSI high and store it
|
|
|
|
btfss SSP1STAT,BF ; in the buffer
|
|
|
|
bra $-1 ; "
|
|
|
|
movf SSP1BUF,W ; "
|
|
|
|
movwf M_BUF3 ; "
|
|
|
|
movlw 0xFF ;Clock third extended reply byte out of the
|
|
|
|
movwf SSP1BUF ; MMC card while keeping MOSI high and store it
|
|
|
|
btfss SSP1STAT,BF ; in the buffer
|
|
|
|
bra $-1 ; "
|
|
|
|
movf SSP1BUF,W ; "
|
|
|
|
movwf M_BUF4 ; "
|
|
|
|
movlw 0xFF ;Clock fourth extended reply byte out of the
|
|
|
|
movwf SSP1BUF ; MMC card while keeping MOSI high and store it
|
|
|
|
btfss SSP1STAT,BF ; in the buffer
|
|
|
|
bra $-1 ; "
|
|
|
|
movf SSP1BUF,W ; "
|
|
|
|
movwf M_BUF5 ; "
|
2021-11-06 11:36:59 -06:00
|
|
|
MmcCmd3 btfsc M_FLAGS,M_CMDRB ;If we're expecting an R1b reply, wait for the
|
|
|
|
call MmcWaitBusy ; card not to be busy anymore before returning
|
|
|
|
movlb 0 ;Restore BSR to 0
|
|
|
|
return
|
|
|
|
|
|
|
|
;Waits for the card not to be busy anymore. Sets M_FAIL on fail. Trashes TEMP
|
|
|
|
; and TEMP2. Expects BSR to be 4 and does not set or reset this.
|
|
|
|
MmcWaitBusy
|
|
|
|
clrf TEMP ;Check 65536 times to see if the card is busy
|
|
|
|
clrf TEMP2 ; "
|
|
|
|
MmcWai0 movlw 0xFF ;Clock a byte out of the MMC card while keeping
|
|
|
|
movwf SSP1BUF ; MOSI high
|
|
|
|
btfss SSP1STAT,BF ; "
|
|
|
|
bra $-1 ; "
|
|
|
|
movf SSP1BUF,W ;Check if MISO is still low, if it's not, the
|
|
|
|
btfss STATUS,Z ; card is no longer busy and we can return
|
|
|
|
return ; "
|
|
|
|
decfsz TEMP,F ;If it's not done, try again
|
|
|
|
bra MmcWai0 ; "
|
|
|
|
decfsz TEMP2,F ; "
|
|
|
|
bra MmcWai0 ; "
|
|
|
|
bsf M_FLAGS,M_FAIL ;If out of tries, fail the operation
|
2021-11-03 13:56:19 -06:00
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
;;; Interrupt Subprograms ;;;
|
|
|
|
|
|
|
|
;In receive mode, interrupt handler calls this code to decode 7-to-8 bytes
|
|
|
|
DecodeRecv
|
|
|
|
movf FSR1H,W ;If FSR1 == 0x2000, this is the first received
|
|
|
|
andlw B'00011111' ; stream and must be handled differently so the
|
|
|
|
iorwf FSR1L,W ; first 3 bytes from the IWM are preserved
|
|
|
|
btfss STATUS,Z ; "
|
|
|
|
bra Decode1 ; "
|
|
|
|
moviw FSR0-- ;If this was the first received stream, reckon
|
|
|
|
moviw FSR0-- ; the group count as (FSR0-3)//8 and position
|
|
|
|
moviw FSR0-- ; both pointers right after the initial 3 bytes
|
|
|
|
lsrf FSR0H,F ; received from the IWM (the sync byte, the
|
|
|
|
rrf FSR0L,F ; length of the message plus 0x81, and the
|
|
|
|
lsrf FSR0H,F ; expected length of the response plus 0x81)
|
|
|
|
rrf FSR0L,F ; "
|
|
|
|
lsrf FSR0H,F ; "
|
|
|
|
rrf FSR0L,W ; "
|
|
|
|
movwf TEMP2 ; "
|
|
|
|
movlw 0x20 ; "
|
|
|
|
movwf FSR0H ; "
|
|
|
|
movwf FSR1H ; "
|
|
|
|
movlw 0x03 ; "
|
|
|
|
movwf FSR0L ; "
|
|
|
|
movwf FSR1L ; "
|
|
|
|
bra Decode2 ; "
|
|
|
|
Decode1 moviw FSR0-- ;If this was not the first received stream,
|
|
|
|
movf FSR1L,W ; reckon the group count as (FSR0-FSR1-1)//8
|
|
|
|
subwf FSR0L,W ; and position FSR0 one byte ahead of FSR1 so
|
|
|
|
movwf TEMP2 ; that the repeated sync byte is overwritten
|
|
|
|
movf FSR1H,W ; "
|
|
|
|
subwfb FSR0H,W ; "
|
|
|
|
lsrf WREG,W ; "
|
|
|
|
rrf TEMP2,F ; "
|
|
|
|
lsrf WREG,W ; "
|
|
|
|
rrf TEMP2,F ; "
|
|
|
|
lsrf WREG,W ; "
|
|
|
|
rrf TEMP2,F ; "
|
|
|
|
movf FSR1H,W ; "
|
|
|
|
movwf FSR0H ; "
|
|
|
|
movf FSR1L,W ; "
|
|
|
|
movwf FSR0L ; "
|
|
|
|
moviw FSR0++ ; "
|
|
|
|
Decode2 movf TEMP2,W ;Add the count of groups received in this
|
|
|
|
addwf GROUPS,F ; stream to the total groups received count
|
|
|
|
movf TEMP2,F ;If the group count is 0, don't do the next
|
|
|
|
btfsc STATUS,Z ; loop at all
|
|
|
|
bra Decode4 ; "
|
|
|
|
Decode3 moviw FSR0++ ;Pick up the byte with the LSBs of the next
|
|
|
|
movwf TEMP ; seven
|
|
|
|
lsrf TEMP,F ;Rotate the LSB of the first byte of the group
|
|
|
|
rlf INDF0,W ; into place
|
|
|
|
movwi FSR1++ ;Write the restored byte to memory
|
|
|
|
moviw FSR0++ ;Advance the input pointer
|
|
|
|
lsrf TEMP,F ;Rotate the LSB of the second byte of the group
|
|
|
|
rlf INDF0,W ; into place
|
|
|
|
movwi FSR1++ ;Write the restored byte to memory
|
|
|
|
moviw FSR0++ ;Advance the input pointer
|
|
|
|
lsrf TEMP,F ;Rotate the LSB of the third byte of the group
|
|
|
|
rlf INDF0,W ; into place
|
|
|
|
movwi FSR1++ ;Write the restored byte to memory
|
|
|
|
moviw FSR0++ ;Advance the input pointer
|
|
|
|
lsrf TEMP,F ;Rotate the LSB of the fourth byte of the group
|
|
|
|
rlf INDF0,W ; into place
|
|
|
|
movwi FSR1++ ;Write the restored byte to memory
|
|
|
|
moviw FSR0++ ;Advance the input pointer
|
|
|
|
lsrf TEMP,F ;Rotate the LSB of the fifth byte of the group
|
|
|
|
rlf INDF0,W ; into place
|
|
|
|
movwi FSR1++ ;Write the restored byte to memory
|
|
|
|
moviw FSR0++ ;Advance the input pointer
|
|
|
|
lsrf TEMP,F ;Rotate the LSB of the sixth byte of the group
|
|
|
|
rlf INDF0,W ; into place
|
|
|
|
movwi FSR1++ ;Write the restored byte to memory
|
|
|
|
moviw FSR0++ ;Advance the input pointer
|
|
|
|
lsrf TEMP,F ;Rotate the LSB of the last byte of the group
|
|
|
|
rlf INDF0,W ; into place
|
|
|
|
movwi FSR1++ ;Write the restored byte to memory
|
|
|
|
moviw FSR0++ ;Advance the input pointer
|
|
|
|
decfsz TEMP2,F ;Decrement the group count and loop if it's not
|
|
|
|
bra Decode3 ; yet zero
|
|
|
|
Decode4 movf FSR1H,W ;FSR1 now points to one past the end of final
|
|
|
|
movwf FSR0H ; data, copy it to FSR0 so future received data
|
|
|
|
movf FSR1L,W ; is written there too
|
|
|
|
movwf FSR0L ; "
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
;;; Transmitter Code ;;;
|
|
|
|
|
|
|
|
org 0x17FE
|
|
|
|
|
|
|
|
XmitIdleJump
|
|
|
|
movlb 31 ;We're in a state we don't know how to handle,
|
|
|
|
movlw high IdleJump ; so warp into the idle jump table
|
|
|
|
movwf TOSH ; "
|
|
|
|
movlw low IdleJump ; "
|
|
|
|
movwf TOSL ; "
|
|
|
|
movlb 0 ; "
|
|
|
|
return ; "
|
|
|
|
|
|
|
|
;Transmits GROUPS 7-byte groups of non-encoded data starting at FSR0. Returns
|
|
|
|
; to the caller only if all is well. Trashes FSR0, TEMP, TEMP2, and GROUPS.
|
|
|
|
Transmit
|
|
|
|
bsf FLAGS,TXNOTRC ;Set flags for a transmit
|
|
|
|
movf PORTA,W ;Check the current state
|
|
|
|
xorlw B'00000100' ;If it's 2, then mac is ready for us to request
|
|
|
|
btfss STATUS,Z ; to send; if it's anything else, we can't
|
|
|
|
bra XmitIdleJump ; handle it so return to the idle jump table
|
|
|
|
bcf PORTC,RC4 ;Assert !HSHK to request to send
|
|
|
|
Transm0 movf PORTA,W ;Check the current state
|
|
|
|
xorlw B'00000100' ;If we're still in state 2, keep checking
|
|
|
|
btfsc STATUS,Z ; "
|
|
|
|
bra Transm0 ; "
|
|
|
|
xorlw B'00000010' ;If we're in state 3, most likely mac is about
|
|
|
|
btfsc STATUS,Z ; to change to state 1, so keep checking
|
|
|
|
bra Transm0 ; "
|
|
|
|
xorlw B'00000100' ;If we're in state 1, get ready to send; if
|
|
|
|
btfss STATUS,Z ; we're in any other state, we can't handle it
|
|
|
|
bra XmitIdleJump ; here so return to the idle jump table
|
|
|
|
movlb 7 ;Clear any IOC flags that have been set up to
|
|
|
|
clrf IOCAF ; now
|
|
|
|
;fall through
|
|
|
|
|
|
|
|
Transmitter
|
|
|
|
movlb 0 ;Point BSR to 0 so we can access PORTC
|
|
|
|
bsf INTCON,GIE ;Enable interrupts
|
|
|
|
movlw 128 ;Set up fractional delay counter (see below)
|
|
|
|
movwf TEMP ; "
|
|
|
|
movlw 30 ;First send 30 groups of eight ones and two
|
|
|
|
movwf TEMP2 ; zeroes to make sure IWM is synced with us
|
|
|
|
XSyncLp bcf PORTC,RC4 ; 0 IWM listens to falling edges only
|
|
|
|
movlw 87 ;+1 Reckon the delay to slow this from a 2 us
|
|
|
|
addwf TEMP,F ;+2 data cell to a 96/47 us data cell as 16
|
|
|
|
btfsc STATUS,C ;+3 cycles plus 16/47 of a cycle, approximated
|
|
|
|
bra $+1 ;+4 here as 87/256 of a cycle
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
nop ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
nop ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
nop ;-4
|
|
|
|
decfsz TEMP2,F ;-3
|
|
|
|
bra XSyncLp ;-2 -1
|
|
|
|
nop ;-1
|
|
|
|
XSync bcf PORTC,RC4 ; 0 Start of 0xAA sync byte
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
nop ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
nop ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
nop ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
nop ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
nop ;-2
|
|
|
|
XDataLp bsf INTCON,GIE ;-1 Reenable interrupts if they were disabled
|
|
|
|
bcf PORTC,RC4 ; 0 Start 7-to-8-encoded group; MSB always set
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 0[FSR0] ;-2
|
|
|
|
btfsc WREG,7 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 0[FSR0] ;-2
|
|
|
|
btfsc WREG,6 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 0[FSR0] ;-2
|
|
|
|
btfsc WREG,5 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 0[FSR0] ;-2
|
|
|
|
btfsc WREG,4 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 0[FSR0] ;-2
|
|
|
|
btfsc WREG,3 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 0[FSR0] ;-2
|
|
|
|
btfsc WREG,2 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 0[FSR0] ;-2
|
|
|
|
btfsc WREG,1 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 1[FSR0] ;-2
|
|
|
|
btfsc WREG,7 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 1[FSR0] ;-2
|
|
|
|
btfsc WREG,6 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 1[FSR0] ;-2
|
|
|
|
btfsc WREG,5 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 1[FSR0] ;-2
|
|
|
|
btfsc WREG,4 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 1[FSR0] ;-2
|
|
|
|
btfsc WREG,3 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 1[FSR0] ;-2
|
|
|
|
btfsc WREG,2 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 1[FSR0] ;-2
|
|
|
|
btfsc WREG,1 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 2[FSR0] ;-2
|
|
|
|
btfsc WREG,7 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 2[FSR0] ;-2
|
|
|
|
btfsc WREG,6 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 2[FSR0] ;-2
|
|
|
|
btfsc WREG,5 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 2[FSR0] ;-2
|
|
|
|
btfsc WREG,4 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 2[FSR0] ;-2
|
|
|
|
btfsc WREG,3 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 2[FSR0] ;-2
|
|
|
|
btfsc WREG,2 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 2[FSR0] ;-2
|
|
|
|
btfsc WREG,1 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 3[FSR0] ;-2
|
|
|
|
btfsc WREG,7 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 3[FSR0] ;-2
|
|
|
|
btfsc WREG,6 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 3[FSR0] ;-2
|
|
|
|
btfsc WREG,5 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 3[FSR0] ;-2
|
|
|
|
btfsc WREG,4 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 3[FSR0] ;-2
|
|
|
|
btfsc WREG,3 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 3[FSR0] ;-2
|
|
|
|
btfsc WREG,2 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 3[FSR0] ;-2
|
|
|
|
btfsc WREG,1 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 4[FSR0] ;-2
|
|
|
|
btfsc WREG,7 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 4[FSR0] ;-2
|
|
|
|
btfsc WREG,6 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 4[FSR0] ;-2
|
|
|
|
btfsc WREG,5 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 4[FSR0] ;-2
|
|
|
|
btfsc WREG,4 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 4[FSR0] ;-2
|
|
|
|
btfsc WREG,3 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 4[FSR0] ;-2
|
|
|
|
btfsc WREG,2 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 4[FSR0] ;-2
|
|
|
|
btfsc WREG,1 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 5[FSR0] ;-2
|
|
|
|
btfsc WREG,7 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 5[FSR0] ;-2
|
|
|
|
btfsc WREG,6 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 5[FSR0] ;-2
|
|
|
|
btfsc WREG,5 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 5[FSR0] ;-2
|
|
|
|
btfsc WREG,4 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 5[FSR0] ;-2
|
|
|
|
btfsc WREG,3 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 5[FSR0] ;-2
|
|
|
|
btfsc WREG,2 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 5[FSR0] ;-2
|
|
|
|
btfsc WREG,1 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 6[FSR0] ;-2
|
|
|
|
btfsc WREG,7 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 6[FSR0] ;-2
|
|
|
|
btfsc WREG,6 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 6[FSR0] ;-2
|
|
|
|
btfsc WREG,5 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 6[FSR0] ;-2
|
|
|
|
btfsc WREG,4 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 6[FSR0] ;-2
|
|
|
|
btfsc WREG,3 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 6[FSR0] ;-2
|
|
|
|
btfsc WREG,2 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 6[FSR0] ;-2
|
|
|
|
btfsc WREG,1 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
DNOP ;-2 -1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 6[FSR0] ;-2
|
|
|
|
btfsc WREG,0 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 5[FSR0] ;-2
|
|
|
|
btfsc WREG,0 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 4[FSR0] ;-2
|
|
|
|
btfsc WREG,0 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 3[FSR0] ;-2
|
|
|
|
btfsc WREG,0 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 2[FSR0] ;-2
|
|
|
|
btfsc WREG,0 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 1[FSR0] ;-2
|
|
|
|
btfsc WREG,0 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
DNOP ;+6 +7
|
|
|
|
DNOP ;-8 -7
|
|
|
|
DNOP ;-6 -5
|
|
|
|
DNOP ;-4 -3
|
|
|
|
moviw 0[FSR0] ;-2
|
|
|
|
btfsc WREG,0 ;-1
|
|
|
|
bcf PORTC,RC4 ; 0
|
|
|
|
movlw 87 ;+1
|
|
|
|
addwf TEMP,F ;+2
|
|
|
|
btfsc STATUS,C ;+3
|
|
|
|
bra $+1 ;+4
|
|
|
|
bsf PORTC,RC4 ;+5
|
|
|
|
nop ;+6
|
|
|
|
bcf INTCON,GIE ;+7 Disable interrupts while we increment the
|
|
|
|
movlw 7 ;-8 read pointer by 7 and decrement the group
|
|
|
|
addwf FSR0L,F ;-7 count by 1 so the changes are all or
|
|
|
|
movlw 0 ;-6 nothing; if group count has not yet hit
|
|
|
|
addwfc FSR0H,F ;-5 zero, loop around to transmit the next
|
|
|
|
decfsz GROUPS,F ;-4 group of seven bytes (sent as eight)
|
|
|
|
goto XDataLp ;-3 -2 "
|
|
|
|
XFiniLp movf PORTA,W ;Check the current state
|
|
|
|
xorlw B'00000010' ;If it's still 1 (communication), mac hasn't
|
|
|
|
btfsc STATUS,Z ; realized we're done transmitting yet, so loop
|
|
|
|
bra XFiniLp ; "
|
|
|
|
xorlw B'00000100' ;If it's 3 (request send), mac is probably
|
|
|
|
btfsc STATUS,Z ; transitioning through on its way to 2, so
|
|
|
|
bra XFiniLp ; loop
|
|
|
|
xorlw B'00000010' ;If it's anything but 2 (idle), give it to the
|
|
|
|
btfss STATUS,Z ; interrupt handler to deal with because
|
|
|
|
bsf INTCON,GIE ; something weird's going on
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
;;; Receiver Code ;;;
|
|
|
|
|
|
|
|
RecvIdleJump
|
|
|
|
movlb 31 ;We're in a state we don't know how to handle,
|
|
|
|
movlw high IdleJump ; so warp into the idle jump table
|
|
|
|
movwf TOSH ; "
|
|
|
|
movlw low IdleJump ; "
|
|
|
|
movwf TOSL ; "
|
|
|
|
movlb 0 ; "
|
|
|
|
return ; "
|
|
|
|
|
|
|
|
;Receives data from the mac. Returns to the caller only if all is well.
|
|
|
|
; Overwrites linear memory with received data in the following way: first byte
|
|
|
|
; is sync byte, second byte is 0x80 + number of groups in command according to
|
|
|
|
; mac, third byte is 0x80 + number of groups in anticipated response, followed
|
|
|
|
; by a string of GROUPS seven-byte decoded groups. Trashes FSR0, FSR1, TEMP,
|
|
|
|
; and TEMP2.
|
|
|
|
Receive
|
|
|
|
movlw 0x20 ;Reset both pointers to the top of linear
|
|
|
|
movwf FSR0H ; memory
|
|
|
|
movwf FSR1H ; "
|
|
|
|
clrf FSR0L ; "
|
|
|
|
clrf FSR1L ; "
|
|
|
|
bcf FLAGS,TXNOTRC ;Set flags for a receive
|
|
|
|
clrf GROUPS ;Clear counter of total received groups
|
|
|
|
Receiv0 movf PORTA,W ;Check the current state
|
|
|
|
xorlw B'00000100' ;If it's 2, then mac hasn't said it's ready to
|
|
|
|
btfsc STATUS,Z ; send yet, keep waiting
|
|
|
|
bra Receiv0 ; "
|
|
|
|
xorlw B'00000010' ;If it's 3, mac has said it's ready to send,
|
|
|
|
btfss STATUS,Z ; if it's anything else, we can't handle it
|
|
|
|
bra RecvIdleJump ; here so return to the idle jump table
|
|
|
|
bcf PORTC,RC4 ;Assert !HSHK to say we're ready to receive
|
|
|
|
Receiv1 movf PORTA,W ;If we're still in state 3, keep checking
|
|
|
|
xorlw B'00000110' ; "
|
|
|
|
btfsc STATUS,Z ; "
|
|
|
|
bra Receiv1 ; "
|
|
|
|
xorlw B'00000100' ;If we're in state 1, get ready to receive; if
|
|
|
|
btfss STATUS,Z ; we're in any other state, we can't handle it
|
|
|
|
bra RecvIdleJump ; here so return to the idle jump table
|
|
|
|
movlb 7 ;Clear any IOC flags that have been set up to
|
|
|
|
clrf IOCAF ; now
|
|
|
|
;fall through
|
|
|
|
|
|
|
|
Receiver
|
|
|
|
movlb 0 ;Point BSR to 0 so we can access PORTC
|
|
|
|
bsf INTCON,GIE ;Enable interrupts
|
|
|
|
StZero btfss PORTC,RC5 ;Signal starts at zero, wait until transition
|
|
|
|
bra $-1 ; to one, this is MSB (always 1) of first byte
|
|
|
|
movlw B'10000000' ;003 cycles, 0.18 bit times
|
|
|
|
movwf INDF0 ;004 cycles, 0.24 bit times
|
|
|
|
DNOP ;005-006 cycles, 0.31-0.37 bit times
|
|
|
|
DNOP ;007-008 cycles, 0.43-0.49 bit times
|
|
|
|
btfss PORTC,RC5 ;009 cycles, 0.55 bit times
|
|
|
|
goto ToZero6 ;010 cycles, 0.61 bit times
|
|
|
|
btfss PORTC,RC5 ;011 cycles, 0.67 bit times
|
|
|
|
goto ToZero6 ;012 cycles, 0.73 bit times
|
|
|
|
btfss PORTC,RC5 ;013 cycles, 0.80 bit times
|
|
|
|
goto ToZero6 ;014 cycles, 0.86 bit times
|
|
|
|
btfss PORTC,RC5 ;015 cycles, 0.92 bit times
|
|
|
|
goto ToZero6 ;016 cycles, 0.98 bit times
|
|
|
|
btfss PORTC,RC5 ;017 cycles, 1.04 bit times
|
|
|
|
goto ToZero6 ;018 cycles, 1.10 bit times
|
|
|
|
btfss PORTC,RC5 ;019 cycles, 1.16 bit times
|
|
|
|
goto ToZero6 ;020 cycles, 1.22 bit times
|
|
|
|
btfss PORTC,RC5 ;021 cycles, 1.29 bit times
|
|
|
|
goto ToZero6 ;022 cycles, 1.35 bit times
|
|
|
|
btfss PORTC,RC5 ;023 cycles, 1.41 bit times
|
|
|
|
goto ToZero6 ;024 cycles, 1.47 bit times
|
|
|
|
btfss PORTC,RC5 ;025 cycles, 1.53 bit times
|
|
|
|
goto ToZero5 ;026 cycles, 1.59 bit times
|
|
|
|
btfss PORTC,RC5 ;027 cycles, 1.65 bit times
|
|
|
|
goto ToZero5 ;028 cycles, 1.71 bit times
|
|
|
|
btfss PORTC,RC5 ;029 cycles, 1.77 bit times
|
|
|
|
goto ToZero5 ;030 cycles, 1.84 bit times
|
|
|
|
btfss PORTC,RC5 ;031 cycles, 1.90 bit times
|
|
|
|
goto ToZero5 ;032 cycles, 1.96 bit times
|
|
|
|
btfss PORTC,RC5 ;033 cycles, 2.02 bit times
|
|
|
|
goto ToZero5 ;034 cycles, 2.08 bit times
|
|
|
|
btfss PORTC,RC5 ;035 cycles, 2.14 bit times
|
|
|
|
goto ToZero5 ;036 cycles, 2.20 bit times
|
|
|
|
btfss PORTC,RC5 ;037 cycles, 2.26 bit times
|
|
|
|
goto ToZero5 ;038 cycles, 2.33 bit times
|
|
|
|
btfss PORTC,RC5 ;039 cycles, 2.39 bit times
|
|
|
|
goto ToZero5 ;040 cycles, 2.45 bit times
|
|
|
|
btfss PORTC,RC5 ;041 cycles, 2.51 bit times
|
|
|
|
goto ToZero4 ;042 cycles, 2.57 bit times
|
|
|
|
btfss PORTC,RC5 ;043 cycles, 2.63 bit times
|
|
|
|
goto ToZero4 ;044 cycles, 2.69 bit times
|
|
|
|
btfss PORTC,RC5 ;045 cycles, 2.75 bit times
|
|
|
|
goto ToZero4 ;046 cycles, 2.82 bit times
|
|
|
|
btfss PORTC,RC5 ;047 cycles, 2.88 bit times
|
|
|
|
goto ToZero4 ;048 cycles, 2.94 bit times
|
|
|
|
btfss PORTC,RC5 ;049 cycles, 3.00 bit times
|
|
|
|
goto ToZero4 ;050 cycles, 3.06 bit times
|
|
|
|
btfss PORTC,RC5 ;051 cycles, 3.12 bit times
|
|
|
|
goto ToZero4 ;052 cycles, 3.18 bit times
|
|
|
|
btfss PORTC,RC5 ;053 cycles, 3.24 bit times
|
|
|
|
goto ToZero4 ;054 cycles, 3.30 bit times
|
|
|
|
btfss PORTC,RC5 ;055 cycles, 3.37 bit times
|
|
|
|
goto ToZero4 ;056 cycles, 3.43 bit times
|
|
|
|
btfss PORTC,RC5 ;057 cycles, 3.49 bit times
|
|
|
|
goto ToZero4 ;058 cycles, 3.55 bit times
|
|
|
|
btfss PORTC,RC5 ;059 cycles, 3.61 bit times
|
|
|
|
goto ToZero3 ;060 cycles, 3.67 bit times
|
|
|
|
btfss PORTC,RC5 ;061 cycles, 3.73 bit times
|
|
|
|
goto ToZero3 ;062 cycles, 3.79 bit times
|
|
|
|
btfss PORTC,RC5 ;063 cycles, 3.86 bit times
|
|
|
|
goto ToZero3 ;064 cycles, 3.92 bit times
|
|
|
|
btfss PORTC,RC5 ;065 cycles, 3.98 bit times
|
|
|
|
goto ToZero3 ;066 cycles, 4.04 bit times
|
|
|
|
btfss PORTC,RC5 ;067 cycles, 4.10 bit times
|
|
|
|
goto ToZero3 ;068 cycles, 4.16 bit times
|
|
|
|
btfss PORTC,RC5 ;069 cycles, 4.22 bit times
|
|
|
|
goto ToZero3 ;070 cycles, 4.28 bit times
|
|
|
|
btfss PORTC,RC5 ;071 cycles, 4.35 bit times
|
|
|
|
goto ToZero3 ;072 cycles, 4.41 bit times
|
|
|
|
btfss PORTC,RC5 ;073 cycles, 4.47 bit times
|
|
|
|
goto ToZero3 ;074 cycles, 4.53 bit times
|
|
|
|
btfss PORTC,RC5 ;075 cycles, 4.59 bit times
|
|
|
|
goto ToZero2 ;076 cycles, 4.65 bit times
|
|
|
|
btfss PORTC,RC5 ;077 cycles, 4.71 bit times
|
|
|
|
goto ToZero2 ;078 cycles, 4.77 bit times
|
|
|
|
btfss PORTC,RC5 ;079 cycles, 4.83 bit times
|
|
|
|
goto ToZero2 ;080 cycles, 4.90 bit times
|
|
|
|
btfss PORTC,RC5 ;081 cycles, 4.96 bit times
|
|
|
|
goto ToZero2 ;082 cycles, 5.02 bit times
|
|
|
|
btfss PORTC,RC5 ;083 cycles, 5.08 bit times
|
|
|
|
goto ToZero2 ;084 cycles, 5.14 bit times
|
|
|
|
btfss PORTC,RC5 ;085 cycles, 5.20 bit times
|
|
|
|
goto ToZero2 ;086 cycles, 5.26 bit times
|
|
|
|
btfss PORTC,RC5 ;087 cycles, 5.32 bit times
|
|
|
|
goto ToZero2 ;088 cycles, 5.39 bit times
|
|
|
|
btfss PORTC,RC5 ;089 cycles, 5.45 bit times
|
|
|
|
goto ToZero2 ;090 cycles, 5.51 bit times
|
|
|
|
btfss PORTC,RC5 ;091 cycles, 5.57 bit times
|
|
|
|
goto ToZero1 ;092 cycles, 5.63 bit times
|
|
|
|
btfss PORTC,RC5 ;093 cycles, 5.69 bit times
|
|
|
|
goto ToZero1 ;094 cycles, 5.75 bit times
|
|
|
|
btfss PORTC,RC5 ;095 cycles, 5.81 bit times
|
|
|
|
goto ToZero1 ;096 cycles, 5.88 bit times
|
|
|
|
btfss PORTC,RC5 ;097 cycles, 5.94 bit times
|
|
|
|
goto ToZero1 ;098 cycles, 6.00 bit times
|
|
|
|
btfss PORTC,RC5 ;099 cycles, 6.06 bit times
|
|
|
|
goto ToZero1 ;100 cycles, 6.12 bit times
|
|
|
|
btfss PORTC,RC5 ;101 cycles, 6.18 bit times
|
|
|
|
goto ToZero1 ;102 cycles, 6.24 bit times
|
|
|
|
btfss PORTC,RC5 ;103 cycles, 6.30 bit times
|
|
|
|
goto ToZero1 ;104 cycles, 6.36 bit times
|
|
|
|
btfss PORTC,RC5 ;105 cycles, 6.43 bit times
|
|
|
|
goto ToZero1 ;106 cycles, 6.49 bit times
|
|
|
|
btfss PORTC,RC5 ;107 cycles, 6.55 bit times
|
|
|
|
goto ToZero0 ;108 cycles, 6.61 bit times
|
|
|
|
btfss PORTC,RC5 ;109 cycles, 6.67 bit times
|
|
|
|
goto ToZero0 ;110 cycles, 6.73 bit times
|
|
|
|
btfss PORTC,RC5 ;111 cycles, 6.79 bit times
|
|
|
|
goto ToZero0 ;112 cycles, 6.85 bit times
|
|
|
|
btfss PORTC,RC5 ;113 cycles, 6.92 bit times
|
|
|
|
goto ToZero0 ;114 cycles, 6.98 bit times
|
|
|
|
btfss PORTC,RC5 ;115 cycles, 7.04 bit times
|
|
|
|
goto ToZero0 ;116 cycles, 7.10 bit times
|
|
|
|
btfss PORTC,RC5 ;117 cycles, 7.16 bit times
|
|
|
|
goto ToZero0 ;118 cycles, 7.22 bit times
|
|
|
|
btfss PORTC,RC5 ;119 cycles, 7.28 bit times
|
|
|
|
goto ToZero0 ;120 cycles, 7.34 bit times
|
|
|
|
btfss PORTC,RC5 ;121 cycles, 7.40 bit times
|
|
|
|
goto ToZero0 ;122 cycles, 7.47 bit times
|
|
|
|
moviw FSR0++ ;123 cycles, 7.53 bit times
|
|
|
|
goto StOne ;124 cycles, 7.59 bit times
|
|
|
|
|
|
|
|
ToOne6 movlw B'01000000' ;003 cycles, 0.18 bit times
|
|
|
|
iorwf INDF0,F ;004 cycles, 0.24 bit times
|
|
|
|
DNOP ;005-006 cycles, 0.31-0.37 bit times
|
|
|
|
DNOP ;007-008 cycles, 0.43-0.49 bit times
|
|
|
|
btfss PORTC,RC5 ;009 cycles, 0.55 bit times
|
|
|
|
goto ToZero5 ;010 cycles, 0.61 bit times
|
|
|
|
btfss PORTC,RC5 ;011 cycles, 0.67 bit times
|
|
|
|
goto ToZero5 ;012 cycles, 0.73 bit times
|
|
|
|
btfss PORTC,RC5 ;013 cycles, 0.80 bit times
|
|
|
|
goto ToZero5 ;014 cycles, 0.86 bit times
|
|
|
|
btfss PORTC,RC5 ;015 cycles, 0.92 bit times
|
|
|
|
goto ToZero5 ;016 cycles, 0.98 bit times
|
|
|
|
btfss PORTC,RC5 ;017 cycles, 1.04 bit times
|
|
|
|
goto ToZero5 ;018 cycles, 1.10 bit times
|
|
|
|
btfss PORTC,RC5 ;019 cycles, 1.16 bit times
|
|
|
|
goto ToZero5 ;020 cycles, 1.22 bit times
|
|
|
|
btfss PORTC,RC5 ;021 cycles, 1.29 bit times
|
|
|
|
goto ToZero5 ;022 cycles, 1.35 bit times
|
|
|
|
btfss PORTC,RC5 ;023 cycles, 1.41 bit times
|
|
|
|
goto ToZero5 ;024 cycles, 1.47 bit times
|
|
|
|
btfss PORTC,RC5 ;025 cycles, 1.53 bit times
|
|
|
|
goto ToZero4 ;026 cycles, 1.59 bit times
|
|
|
|
btfss PORTC,RC5 ;027 cycles, 1.65 bit times
|
|
|
|
goto ToZero4 ;028 cycles, 1.71 bit times
|
|
|
|
btfss PORTC,RC5 ;029 cycles, 1.77 bit times
|
|
|
|
goto ToZero4 ;030 cycles, 1.84 bit times
|
|
|
|
btfss PORTC,RC5 ;031 cycles, 1.90 bit times
|
|
|
|
goto ToZero4 ;032 cycles, 1.96 bit times
|
|
|
|
btfss PORTC,RC5 ;033 cycles, 2.02 bit times
|
|
|
|
goto ToZero4 ;034 cycles, 2.08 bit times
|
|
|
|
btfss PORTC,RC5 ;035 cycles, 2.14 bit times
|
|
|
|
goto ToZero4 ;036 cycles, 2.20 bit times
|
|
|
|
btfss PORTC,RC5 ;037 cycles, 2.26 bit times
|
|
|
|
goto ToZero4 ;038 cycles, 2.33 bit times
|
|
|
|
btfss PORTC,RC5 ;039 cycles, 2.39 bit times
|
|
|
|
goto ToZero4 ;040 cycles, 2.45 bit times
|
|
|
|
btfss PORTC,RC5 ;041 cycles, 2.51 bit times
|
|
|
|
goto ToZero3 ;042 cycles, 2.57 bit times
|
|
|
|
btfss PORTC,RC5 ;043 cycles, 2.63 bit times
|
|
|
|
goto ToZero3 ;044 cycles, 2.69 bit times
|
|
|
|
btfss PORTC,RC5 ;045 cycles, 2.75 bit times
|
|
|
|
goto ToZero3 ;046 cycles, 2.82 bit times
|
|
|
|
btfss PORTC,RC5 ;047 cycles, 2.88 bit times
|
|
|
|
goto ToZero3 ;048 cycles, 2.94 bit times
|
|
|
|
btfss PORTC,RC5 ;049 cycles, 3.00 bit times
|
|
|
|
goto ToZero3 ;050 cycles, 3.06 bit times
|
|
|
|
btfss PORTC,RC5 ;051 cycles, 3.12 bit times
|
|
|
|
goto ToZero3 ;052 cycles, 3.18 bit times
|
|
|
|
btfss PORTC,RC5 ;053 cycles, 3.24 bit times
|
|
|
|
goto ToZero3 ;054 cycles, 3.30 bit times
|
|
|
|
btfss PORTC,RC5 ;055 cycles, 3.37 bit times
|
|
|
|
goto ToZero3 ;056 cycles, 3.43 bit times
|
|
|
|
btfss PORTC,RC5 ;057 cycles, 3.49 bit times
|
|
|
|
goto ToZero3 ;058 cycles, 3.55 bit times
|
|
|
|
btfss PORTC,RC5 ;059 cycles, 3.61 bit times
|
|
|
|
goto ToZero2 ;060 cycles, 3.67 bit times
|
|
|
|
btfss PORTC,RC5 ;061 cycles, 3.73 bit times
|
|
|
|
goto ToZero2 ;062 cycles, 3.79 bit times
|
|
|
|
btfss PORTC,RC5 ;063 cycles, 3.86 bit times
|
|
|
|
goto ToZero2 ;064 cycles, 3.92 bit times
|
|
|
|
btfss PORTC,RC5 ;065 cycles, 3.98 bit times
|
|
|
|
goto ToZero2 ;066 cycles, 4.04 bit times
|
|
|
|
btfss PORTC,RC5 ;067 cycles, 4.10 bit times
|
|
|
|
goto ToZero2 ;068 cycles, 4.16 bit times
|
|
|
|
btfss PORTC,RC5 ;069 cycles, 4.22 bit times
|
|
|
|
goto ToZero2 ;070 cycles, 4.28 bit times
|
|
|
|
btfss PORTC,RC5 ;071 cycles, 4.35 bit times
|
|
|
|
goto ToZero2 ;072 cycles, 4.41 bit times
|
|
|
|
btfss PORTC,RC5 ;073 cycles, 4.47 bit times
|
|
|
|
goto ToZero2 ;074 cycles, 4.53 bit times
|
|
|
|
btfss PORTC,RC5 ;075 cycles, 4.59 bit times
|
|
|
|
goto ToZero1 ;076 cycles, 4.65 bit times
|
|
|
|
btfss PORTC,RC5 ;077 cycles, 4.71 bit times
|
|
|
|
goto ToZero1 ;078 cycles, 4.77 bit times
|
|
|
|
btfss PORTC,RC5 ;079 cycles, 4.83 bit times
|
|
|
|
goto ToZero1 ;080 cycles, 4.90 bit times
|
|
|
|
btfss PORTC,RC5 ;081 cycles, 4.96 bit times
|
|
|
|
goto ToZero1 ;082 cycles, 5.02 bit times
|
|
|
|
btfss PORTC,RC5 ;083 cycles, 5.08 bit times
|
|
|
|
goto ToZero1 ;084 cycles, 5.14 bit times
|
|
|
|
btfss PORTC,RC5 ;085 cycles, 5.20 bit times
|
|
|
|
goto ToZero1 ;086 cycles, 5.26 bit times
|
|
|
|
btfss PORTC,RC5 ;087 cycles, 5.32 bit times
|
|
|
|
goto ToZero1 ;088 cycles, 5.39 bit times
|
|
|
|
btfss PORTC,RC5 ;089 cycles, 5.45 bit times
|
|
|
|
goto ToZero1 ;090 cycles, 5.51 bit times
|
|
|
|
btfss PORTC,RC5 ;091 cycles, 5.57 bit times
|
|
|
|
goto ToZero0 ;092 cycles, 5.63 bit times
|
|
|
|
btfss PORTC,RC5 ;093 cycles, 5.69 bit times
|
|
|
|
goto ToZero0 ;094 cycles, 5.75 bit times
|
|
|
|
btfss PORTC,RC5 ;095 cycles, 5.81 bit times
|
|
|
|
goto ToZero0 ;096 cycles, 5.88 bit times
|
|
|
|
btfss PORTC,RC5 ;097 cycles, 5.94 bit times
|
|
|
|
goto ToZero0 ;098 cycles, 6.00 bit times
|
|
|
|
btfss PORTC,RC5 ;099 cycles, 6.06 bit times
|
|
|
|
goto ToZero0 ;100 cycles, 6.12 bit times
|
|
|
|
btfss PORTC,RC5 ;101 cycles, 6.18 bit times
|
|
|
|
goto ToZero0 ;102 cycles, 6.24 bit times
|
|
|
|
btfss PORTC,RC5 ;103 cycles, 6.30 bit times
|
|
|
|
goto ToZero0 ;104 cycles, 6.36 bit times
|
|
|
|
btfss PORTC,RC5 ;105 cycles, 6.43 bit times
|
|
|
|
goto ToZero0 ;106 cycles, 6.49 bit times
|
|
|
|
moviw FSR0++ ;107 cycles, 6.55 bit times
|
|
|
|
goto StOne ;108 cycles, 6.61 bit times
|
|
|
|
|
|
|
|
ToOne5 movlw B'00100000' ;003 cycles, 0.18 bit times
|
|
|
|
iorwf INDF0,F ;004 cycles, 0.24 bit times
|
|
|
|
DNOP ;005-006 cycles, 0.31-0.37 bit times
|
|
|
|
DNOP ;007-008 cycles, 0.43-0.49 bit times
|
|
|
|
btfss PORTC,RC5 ;009 cycles, 0.55 bit times
|
|
|
|
goto ToZero4 ;010 cycles, 0.61 bit times
|
|
|
|
btfss PORTC,RC5 ;011 cycles, 0.67 bit times
|
|
|
|
goto ToZero4 ;012 cycles, 0.73 bit times
|
|
|
|
btfss PORTC,RC5 ;013 cycles, 0.80 bit times
|
|
|
|
goto ToZero4 ;014 cycles, 0.86 bit times
|
|
|
|
btfss PORTC,RC5 ;015 cycles, 0.92 bit times
|
|
|
|
goto ToZero4 ;016 cycles, 0.98 bit times
|
|
|
|
btfss PORTC,RC5 ;017 cycles, 1.04 bit times
|
|
|
|
goto ToZero4 ;018 cycles, 1.10 bit times
|
|
|
|
btfss PORTC,RC5 ;019 cycles, 1.16 bit times
|
|
|
|
goto ToZero4 ;020 cycles, 1.22 bit times
|
|
|
|
btfss PORTC,RC5 ;021 cycles, 1.29 bit times
|
|
|
|
goto ToZero4 ;022 cycles, 1.35 bit times
|
|
|
|
btfss PORTC,RC5 ;023 cycles, 1.41 bit times
|
|
|
|
goto ToZero4 ;024 cycles, 1.47 bit times
|
|
|
|
btfss PORTC,RC5 ;025 cycles, 1.53 bit times
|
|
|
|
goto ToZero3 ;026 cycles, 1.59 bit times
|
|
|
|
btfss PORTC,RC5 ;027 cycles, 1.65 bit times
|
|
|
|
goto ToZero3 ;028 cycles, 1.71 bit times
|
|
|
|
btfss PORTC,RC5 ;029 cycles, 1.77 bit times
|
|
|
|
goto ToZero3 ;030 cycles, 1.84 bit times
|
|
|
|
btfss PORTC,RC5 ;031 cycles, 1.90 bit times
|
|
|
|
goto ToZero3 ;032 cycles, 1.96 bit times
|
|
|
|
btfss PORTC,RC5 ;033 cycles, 2.02 bit times
|
|
|
|
goto ToZero3 ;034 cycles, 2.08 bit times
|
|
|
|
btfss PORTC,RC5 ;035 cycles, 2.14 bit times
|
|
|
|
goto ToZero3 ;036 cycles, 2.20 bit times
|
|
|
|
btfss PORTC,RC5 ;037 cycles, 2.26 bit times
|
|
|
|
goto ToZero3 ;038 cycles, 2.33 bit times
|
|
|
|
btfss PORTC,RC5 ;039 cycles, 2.39 bit times
|
|
|
|
goto ToZero3 ;040 cycles, 2.45 bit times
|
|
|
|
btfss PORTC,RC5 ;041 cycles, 2.51 bit times
|
|
|
|
goto ToZero2 ;042 cycles, 2.57 bit times
|
|
|
|
btfss PORTC,RC5 ;043 cycles, 2.63 bit times
|
|
|
|
goto ToZero2 ;044 cycles, 2.69 bit times
|
|
|
|
btfss PORTC,RC5 ;045 cycles, 2.75 bit times
|
|
|
|
goto ToZero2 ;046 cycles, 2.82 bit times
|
|
|
|
btfss PORTC,RC5 ;047 cycles, 2.88 bit times
|
|
|
|
goto ToZero2 ;048 cycles, 2.94 bit times
|
|
|
|
btfss PORTC,RC5 ;049 cycles, 3.00 bit times
|
|
|
|
goto ToZero2 ;050 cycles, 3.06 bit times
|
|
|
|
btfss PORTC,RC5 ;051 cycles, 3.12 bit times
|
|
|
|
goto ToZero2 ;052 cycles, 3.18 bit times
|
|
|
|
btfss PORTC,RC5 ;053 cycles, 3.24 bit times
|
|
|
|
goto ToZero2 ;054 cycles, 3.30 bit times
|
|
|
|
btfss PORTC,RC5 ;055 cycles, 3.37 bit times
|
|
|
|
goto ToZero2 ;056 cycles, 3.43 bit times
|
|
|
|
btfss PORTC,RC5 ;057 cycles, 3.49 bit times
|
|
|
|
goto ToZero2 ;058 cycles, 3.55 bit times
|
|
|
|
btfss PORTC,RC5 ;059 cycles, 3.61 bit times
|
|
|
|
goto ToZero1 ;060 cycles, 3.67 bit times
|
|
|
|
btfss PORTC,RC5 ;061 cycles, 3.73 bit times
|
|
|
|
goto ToZero1 ;062 cycles, 3.79 bit times
|
|
|
|
btfss PORTC,RC5 ;063 cycles, 3.86 bit times
|
|
|
|
goto ToZero1 ;064 cycles, 3.92 bit times
|
|
|
|
btfss PORTC,RC5 ;065 cycles, 3.98 bit times
|
|
|
|
goto ToZero1 ;066 cycles, 4.04 bit times
|
|
|
|
btfss PORTC,RC5 ;067 cycles, 4.10 bit times
|
|
|
|
goto ToZero1 ;068 cycles, 4.16 bit times
|
|
|
|
btfss PORTC,RC5 ;069 cycles, 4.22 bit times
|
|
|
|
goto ToZero1 ;070 cycles, 4.28 bit times
|
|
|
|
btfss PORTC,RC5 ;071 cycles, 4.35 bit times
|
|
|
|
goto ToZero1 ;072 cycles, 4.41 bit times
|
|
|
|
btfss PORTC,RC5 ;073 cycles, 4.47 bit times
|
|
|
|
goto ToZero1 ;074 cycles, 4.53 bit times
|
|
|
|
btfss PORTC,RC5 ;075 cycles, 4.59 bit times
|
|
|
|
goto ToZero0 ;076 cycles, 4.65 bit times
|
|
|
|
btfss PORTC,RC5 ;077 cycles, 4.71 bit times
|
|
|
|
goto ToZero0 ;078 cycles, 4.77 bit times
|
|
|
|
btfss PORTC,RC5 ;079 cycles, 4.83 bit times
|
|
|
|
goto ToZero0 ;080 cycles, 4.90 bit times
|
|
|
|
btfss PORTC,RC5 ;081 cycles, 4.96 bit times
|
|
|
|
goto ToZero0 ;082 cycles, 5.02 bit times
|
|
|
|
btfss PORTC,RC5 ;083 cycles, 5.08 bit times
|
|
|
|
goto ToZero0 ;084 cycles, 5.14 bit times
|
|
|
|
btfss PORTC,RC5 ;085 cycles, 5.20 bit times
|
|
|
|
goto ToZero0 ;086 cycles, 5.26 bit times
|
|
|
|
btfss PORTC,RC5 ;087 cycles, 5.32 bit times
|
|
|
|
goto ToZero0 ;088 cycles, 5.39 bit times
|
|
|
|
btfss PORTC,RC5 ;089 cycles, 5.45 bit times
|
|
|
|
goto ToZero0 ;090 cycles, 5.51 bit times
|
|
|
|
moviw FSR0++ ;091 cycles, 5.57 bit times
|
|
|
|
goto StOne ;092 cycles, 5.63 bit times
|
|
|
|
|
|
|
|
ToOne4 movlw B'00010000' ;003 cycles, 0.18 bit times
|
|
|
|
iorwf INDF0,F ;004 cycles, 0.24 bit times
|
|
|
|
DNOP ;005-006 cycles, 0.31-0.37 bit times
|
|
|
|
DNOP ;007-008 cycles, 0.43-0.49 bit times
|
|
|
|
btfss PORTC,RC5 ;009 cycles, 0.55 bit times
|
|
|
|
goto ToZero3 ;010 cycles, 0.61 bit times
|
|
|
|
btfss PORTC,RC5 ;011 cycles, 0.67 bit times
|
|
|
|
goto ToZero3 ;012 cycles, 0.73 bit times
|
|
|
|
btfss PORTC,RC5 ;013 cycles, 0.80 bit times
|
|
|
|
goto ToZero3 ;014 cycles, 0.86 bit times
|
|
|
|
btfss PORTC,RC5 ;015 cycles, 0.92 bit times
|
|
|
|
goto ToZero3 ;016 cycles, 0.98 bit times
|
|
|
|
btfss PORTC,RC5 ;017 cycles, 1.04 bit times
|
|
|
|
goto ToZero3 ;018 cycles, 1.10 bit times
|
|
|
|
btfss PORTC,RC5 ;019 cycles, 1.16 bit times
|
|
|
|
goto ToZero3 ;020 cycles, 1.22 bit times
|
|
|
|
btfss PORTC,RC5 ;021 cycles, 1.29 bit times
|
|
|
|
goto ToZero3 ;022 cycles, 1.35 bit times
|
|
|
|
btfss PORTC,RC5 ;023 cycles, 1.41 bit times
|
|
|
|
goto ToZero3 ;024 cycles, 1.47 bit times
|
|
|
|
btfss PORTC,RC5 ;025 cycles, 1.53 bit times
|
|
|
|
goto ToZero2 ;026 cycles, 1.59 bit times
|
|
|
|
btfss PORTC,RC5 ;027 cycles, 1.65 bit times
|
|
|
|
goto ToZero2 ;028 cycles, 1.71 bit times
|
|
|
|
btfss PORTC,RC5 ;029 cycles, 1.77 bit times
|
|
|
|
goto ToZero2 ;030 cycles, 1.84 bit times
|
|
|
|
btfss PORTC,RC5 ;031 cycles, 1.90 bit times
|
|
|
|
goto ToZero2 ;032 cycles, 1.96 bit times
|
|
|
|
btfss PORTC,RC5 ;033 cycles, 2.02 bit times
|
|
|
|
goto ToZero2 ;034 cycles, 2.08 bit times
|
|
|
|
btfss PORTC,RC5 ;035 cycles, 2.14 bit times
|
|
|
|
goto ToZero2 ;036 cycles, 2.20 bit times
|
|
|
|
btfss PORTC,RC5 ;037 cycles, 2.26 bit times
|
|
|
|
goto ToZero2 ;038 cycles, 2.33 bit times
|
|
|
|
btfss PORTC,RC5 ;039 cycles, 2.39 bit times
|
|
|
|
goto ToZero2 ;040 cycles, 2.45 bit times
|
|
|
|
btfss PORTC,RC5 ;041 cycles, 2.51 bit times
|
|
|
|
goto ToZero1 ;042 cycles, 2.57 bit times
|
|
|
|
btfss PORTC,RC5 ;043 cycles, 2.63 bit times
|
|
|
|
goto ToZero1 ;044 cycles, 2.69 bit times
|
|
|
|
btfss PORTC,RC5 ;045 cycles, 2.75 bit times
|
|
|
|
goto ToZero1 ;046 cycles, 2.82 bit times
|
|
|
|
btfss PORTC,RC5 ;047 cycles, 2.88 bit times
|
|
|
|
goto ToZero1 ;048 cycles, 2.94 bit times
|
|
|
|
btfss PORTC,RC5 ;049 cycles, 3.00 bit times
|
|
|
|
goto ToZero1 ;050 cycles, 3.06 bit times
|
|
|
|
btfss PORTC,RC5 ;051 cycles, 3.12 bit times
|
|
|
|
goto ToZero1 ;052 cycles, 3.18 bit times
|
|
|
|
btfss PORTC,RC5 ;053 cycles, 3.24 bit times
|
|
|
|
goto ToZero1 ;054 cycles, 3.30 bit times
|
|
|
|
btfss PORTC,RC5 ;055 cycles, 3.37 bit times
|
|
|
|
goto ToZero1 ;056 cycles, 3.43 bit times
|
|
|
|
btfss PORTC,RC5 ;057 cycles, 3.49 bit times
|
|
|
|
goto ToZero1 ;058 cycles, 3.55 bit times
|
|
|
|
btfss PORTC,RC5 ;059 cycles, 3.61 bit times
|
|
|
|
goto ToZero0 ;060 cycles, 3.67 bit times
|
|
|
|
btfss PORTC,RC5 ;061 cycles, 3.73 bit times
|
|
|
|
goto ToZero0 ;062 cycles, 3.79 bit times
|
|
|
|
btfss PORTC,RC5 ;063 cycles, 3.86 bit times
|
|
|
|
goto ToZero0 ;064 cycles, 3.92 bit times
|
|
|
|
btfss PORTC,RC5 ;065 cycles, 3.98 bit times
|
|
|
|
goto ToZero0 ;066 cycles, 4.04 bit times
|
|
|
|
btfss PORTC,RC5 ;067 cycles, 4.10 bit times
|
|
|
|
goto ToZero0 ;068 cycles, 4.16 bit times
|
|
|
|
btfss PORTC,RC5 ;069 cycles, 4.22 bit times
|
|
|
|
goto ToZero0 ;070 cycles, 4.28 bit times
|
|
|
|
btfss PORTC,RC5 ;071 cycles, 4.35 bit times
|
|
|
|
goto ToZero0 ;072 cycles, 4.41 bit times
|
|
|
|
btfss PORTC,RC5 ;073 cycles, 4.47 bit times
|
|
|
|
goto ToZero0 ;074 cycles, 4.53 bit times
|
|
|
|
moviw FSR0++ ;075 cycles, 4.59 bit times
|
|
|
|
goto StOne ;076 cycles, 4.65 bit times
|
|
|
|
|
|
|
|
ToOne3 movlw B'00001000' ;003 cycles, 0.18 bit times
|
|
|
|
iorwf INDF0,F ;004 cycles, 0.24 bit times
|
|
|
|
DNOP ;005-006 cycles, 0.31-0.37 bit times
|
|
|
|
DNOP ;007-008 cycles, 0.43-0.49 bit times
|
|
|
|
btfss PORTC,RC5 ;009 cycles, 0.55 bit times
|
|
|
|
goto ToZero2 ;010 cycles, 0.61 bit times
|
|
|
|
btfss PORTC,RC5 ;011 cycles, 0.67 bit times
|
|
|
|
goto ToZero2 ;012 cycles, 0.73 bit times
|
|
|
|
btfss PORTC,RC5 ;013 cycles, 0.80 bit times
|
|
|
|
goto ToZero2 ;014 cycles, 0.86 bit times
|
|
|
|
btfss PORTC,RC5 ;015 cycles, 0.92 bit times
|
|
|
|
goto ToZero2 ;016 cycles, 0.98 bit times
|
|
|
|
btfss PORTC,RC5 ;017 cycles, 1.04 bit times
|
|
|
|
goto ToZero2 ;018 cycles, 1.10 bit times
|
|
|
|
btfss PORTC,RC5 ;019 cycles, 1.16 bit times
|
|
|
|
goto ToZero2 ;020 cycles, 1.22 bit times
|
|
|
|
btfss PORTC,RC5 ;021 cycles, 1.29 bit times
|
|
|
|
goto ToZero2 ;022 cycles, 1.35 bit times
|
|
|
|
btfss PORTC,RC5 ;023 cycles, 1.41 bit times
|
|
|
|
goto ToZero2 ;024 cycles, 1.47 bit times
|
|
|
|
btfss PORTC,RC5 ;025 cycles, 1.53 bit times
|
|
|
|
goto ToZero1 ;026 cycles, 1.59 bit times
|
|
|
|
btfss PORTC,RC5 ;027 cycles, 1.65 bit times
|
|
|
|
goto ToZero1 ;028 cycles, 1.71 bit times
|
|
|
|
btfss PORTC,RC5 ;029 cycles, 1.77 bit times
|
|
|
|
goto ToZero1 ;030 cycles, 1.84 bit times
|
|
|
|
btfss PORTC,RC5 ;031 cycles, 1.90 bit times
|
|
|
|
goto ToZero1 ;032 cycles, 1.96 bit times
|
|
|
|
btfss PORTC,RC5 ;033 cycles, 2.02 bit times
|
|
|
|
goto ToZero1 ;034 cycles, 2.08 bit times
|
|
|
|
btfss PORTC,RC5 ;035 cycles, 2.14 bit times
|
|
|
|
goto ToZero1 ;036 cycles, 2.20 bit times
|
|
|
|
btfss PORTC,RC5 ;037 cycles, 2.26 bit times
|
|
|
|
goto ToZero1 ;038 cycles, 2.33 bit times
|
|
|
|
btfss PORTC,RC5 ;039 cycles, 2.39 bit times
|
|
|
|
goto ToZero1 ;040 cycles, 2.45 bit times
|
|
|
|
btfss PORTC,RC5 ;041 cycles, 2.51 bit times
|
|
|
|
goto ToZero0 ;042 cycles, 2.57 bit times
|
|
|
|
btfss PORTC,RC5 ;043 cycles, 2.63 bit times
|
|
|
|
goto ToZero0 ;044 cycles, 2.69 bit times
|
|
|
|
btfss PORTC,RC5 ;045 cycles, 2.75 bit times
|
|
|
|
goto ToZero0 ;046 cycles, 2.82 bit times
|
|
|
|
btfss PORTC,RC5 ;047 cycles, 2.88 bit times
|
|
|
|
goto ToZero0 ;048 cycles, 2.94 bit times
|
|
|
|
btfss PORTC,RC5 ;049 cycles, 3.00 bit times
|
|
|
|
goto ToZero0 ;050 cycles, 3.06 bit times
|
|
|
|
btfss PORTC,RC5 ;051 cycles, 3.12 bit times
|
|
|
|
goto ToZero0 ;052 cycles, 3.18 bit times
|
|
|
|
btfss PORTC,RC5 ;053 cycles, 3.24 bit times
|
|
|
|
goto ToZero0 ;054 cycles, 3.30 bit times
|
|
|
|
btfss PORTC,RC5 ;055 cycles, 3.37 bit times
|
|
|
|
goto ToZero0 ;056 cycles, 3.43 bit times
|
|
|
|
btfss PORTC,RC5 ;057 cycles, 3.49 bit times
|
|
|
|
goto ToZero0 ;058 cycles, 3.55 bit times
|
|
|
|
moviw FSR0++ ;059 cycles, 3.61 bit times
|
|
|
|
goto StOne ;060 cycles, 3.67 bit times
|
|
|
|
|
|
|
|
ToOne2 movlw B'00000100' ;003 cycles, 0.18 bit times
|
|
|
|
iorwf INDF0,F ;004 cycles, 0.24 bit times
|
|
|
|
DNOP ;005-006 cycles, 0.31-0.37 bit times
|
|
|
|
DNOP ;007-008 cycles, 0.43-0.49 bit times
|
|
|
|
btfss PORTC,RC5 ;009 cycles, 0.55 bit times
|
|
|
|
goto ToZero1 ;010 cycles, 0.61 bit times
|
|
|
|
btfss PORTC,RC5 ;011 cycles, 0.67 bit times
|
|
|
|
goto ToZero1 ;012 cycles, 0.73 bit times
|
|
|
|
btfss PORTC,RC5 ;013 cycles, 0.80 bit times
|
|
|
|
goto ToZero1 ;014 cycles, 0.86 bit times
|
|
|
|
btfss PORTC,RC5 ;015 cycles, 0.92 bit times
|
|
|
|
goto ToZero1 ;016 cycles, 0.98 bit times
|
|
|
|
btfss PORTC,RC5 ;017 cycles, 1.04 bit times
|
|
|
|
goto ToZero1 ;018 cycles, 1.10 bit times
|
|
|
|
btfss PORTC,RC5 ;019 cycles, 1.16 bit times
|
|
|
|
goto ToZero1 ;020 cycles, 1.22 bit times
|
|
|
|
btfss PORTC,RC5 ;021 cycles, 1.29 bit times
|
|
|
|
goto ToZero1 ;022 cycles, 1.35 bit times
|
|
|
|
btfss PORTC,RC5 ;023 cycles, 1.41 bit times
|
|
|
|
goto ToZero1 ;024 cycles, 1.47 bit times
|
|
|
|
btfss PORTC,RC5 ;025 cycles, 1.53 bit times
|
|
|
|
goto ToZero0 ;026 cycles, 1.59 bit times
|
|
|
|
btfss PORTC,RC5 ;027 cycles, 1.65 bit times
|
|
|
|
goto ToZero0 ;028 cycles, 1.71 bit times
|
|
|
|
btfss PORTC,RC5 ;029 cycles, 1.77 bit times
|
|
|
|
goto ToZero0 ;030 cycles, 1.84 bit times
|
|
|
|
btfss PORTC,RC5 ;031 cycles, 1.90 bit times
|
|
|
|
goto ToZero0 ;032 cycles, 1.96 bit times
|
|
|
|
btfss PORTC,RC5 ;033 cycles, 2.02 bit times
|
|
|
|
goto ToZero0 ;034 cycles, 2.08 bit times
|
|
|
|
btfss PORTC,RC5 ;035 cycles, 2.14 bit times
|
|
|
|
goto ToZero0 ;036 cycles, 2.20 bit times
|
|
|
|
btfss PORTC,RC5 ;037 cycles, 2.26 bit times
|
|
|
|
goto ToZero0 ;038 cycles, 2.33 bit times
|
|
|
|
btfss PORTC,RC5 ;039 cycles, 2.39 bit times
|
|
|
|
goto ToZero0 ;040 cycles, 2.45 bit times
|
|
|
|
moviw FSR0++ ;041 cycles, 2.51 bit times
|
|
|
|
goto StOne ;042 cycles, 2.57 bit times
|
|
|
|
|
|
|
|
ToOne1 movlw B'00000010' ;003 cycles, 0.18 bit times
|
|
|
|
iorwf INDF0,F ;004 cycles, 0.24 bit times
|
|
|
|
DNOP ;005-006 cycles, 0.31-0.37 bit times
|
|
|
|
DNOP ;007-008 cycles, 0.43-0.49 bit times
|
|
|
|
btfss PORTC,RC5 ;009 cycles, 0.55 bit times
|
|
|
|
goto ToZero0 ;010 cycles, 0.61 bit times
|
|
|
|
btfss PORTC,RC5 ;011 cycles, 0.67 bit times
|
|
|
|
goto ToZero0 ;012 cycles, 0.73 bit times
|
|
|
|
btfss PORTC,RC5 ;013 cycles, 0.80 bit times
|
|
|
|
goto ToZero0 ;014 cycles, 0.86 bit times
|
|
|
|
btfss PORTC,RC5 ;015 cycles, 0.92 bit times
|
|
|
|
goto ToZero0 ;016 cycles, 0.98 bit times
|
|
|
|
btfss PORTC,RC5 ;017 cycles, 1.04 bit times
|
|
|
|
goto ToZero0 ;018 cycles, 1.10 bit times
|
|
|
|
btfss PORTC,RC5 ;019 cycles, 1.16 bit times
|
|
|
|
goto ToZero0 ;020 cycles, 1.22 bit times
|
|
|
|
btfss PORTC,RC5 ;021 cycles, 1.29 bit times
|
|
|
|
goto ToZero0 ;022 cycles, 1.35 bit times
|
|
|
|
btfss PORTC,RC5 ;023 cycles, 1.41 bit times
|
|
|
|
goto ToZero0 ;024 cycles, 1.47 bit times
|
|
|
|
moviw FSR0++ ;025 cycles, 1.53 bit times
|
|
|
|
goto StOne ;026 cycles, 1.59 bit times
|
|
|
|
|
|
|
|
ToOne0 movlw B'00000001' ;003 cycles, 0.18 bit times
|
|
|
|
iorwf INDF0,F ;004 cycles, 0.24 bit times
|
|
|
|
moviw FSR0++ ;005 cycles, 0.31 bit times
|
|
|
|
;fall through
|
|
|
|
|
|
|
|
StOne btfsc PORTC,RC5 ;Signal starts at one, wait until transition
|
|
|
|
bra $-1 ; to zero, this is MSB (always 1) of first byte
|
|
|
|
movlw B'10000000' ;003 cycles, 0.18 bit times
|
|
|
|
movwf INDF0 ;004 cycles, 0.24 bit times
|
|
|
|
DNOP ;005-006 cycles, 0.31-0.37 bit times
|
|
|
|
DNOP ;007-008 cycles, 0.43-0.49 bit times
|
|
|
|
btfsc PORTC,RC5 ;009 cycles, 0.55 bit times
|
|
|
|
goto ToOne6 ;010 cycles, 0.61 bit times
|
|
|
|
btfsc PORTC,RC5 ;011 cycles, 0.67 bit times
|
|
|
|
goto ToOne6 ;012 cycles, 0.73 bit times
|
|
|
|
btfsc PORTC,RC5 ;013 cycles, 0.80 bit times
|
|
|
|
goto ToOne6 ;014 cycles, 0.86 bit times
|
|
|
|
btfsc PORTC,RC5 ;015 cycles, 0.92 bit times
|
|
|
|
goto ToOne6 ;016 cycles, 0.98 bit times
|
|
|
|
btfsc PORTC,RC5 ;017 cycles, 1.04 bit times
|
|
|
|
goto ToOne6 ;018 cycles, 1.10 bit times
|
|
|
|
btfsc PORTC,RC5 ;019 cycles, 1.16 bit times
|
|
|
|
goto ToOne6 ;020 cycles, 1.22 bit times
|
|
|
|
btfsc PORTC,RC5 ;021 cycles, 1.29 bit times
|
|
|
|
goto ToOne6 ;022 cycles, 1.35 bit times
|
|
|
|
btfsc PORTC,RC5 ;023 cycles, 1.41 bit times
|
|
|
|
goto ToOne6 ;024 cycles, 1.47 bit times
|
|
|
|
btfsc PORTC,RC5 ;025 cycles, 1.53 bit times
|
|
|
|
goto ToOne5 ;026 cycles, 1.59 bit times
|
|
|
|
btfsc PORTC,RC5 ;027 cycles, 1.65 bit times
|
|
|
|
goto ToOne5 ;028 cycles, 1.71 bit times
|
|
|
|
btfsc PORTC,RC5 ;029 cycles, 1.77 bit times
|
|
|
|
goto ToOne5 ;030 cycles, 1.84 bit times
|
|
|
|
btfsc PORTC,RC5 ;031 cycles, 1.90 bit times
|
|
|
|
goto ToOne5 ;032 cycles, 1.96 bit times
|
|
|
|
btfsc PORTC,RC5 ;033 cycles, 2.02 bit times
|
|
|
|
goto ToOne5 ;034 cycles, 2.08 bit times
|
|
|
|
btfsc PORTC,RC5 ;035 cycles, 2.14 bit times
|
|
|
|
goto ToOne5 ;036 cycles, 2.20 bit times
|
|
|
|
btfsc PORTC,RC5 ;037 cycles, 2.26 bit times
|
|
|
|
goto ToOne5 ;038 cycles, 2.33 bit times
|
|
|
|
btfsc PORTC,RC5 ;039 cycles, 2.39 bit times
|
|
|
|
goto ToOne5 ;040 cycles, 2.45 bit times
|
|
|
|
btfsc PORTC,RC5 ;041 cycles, 2.51 bit times
|
|
|
|
goto ToOne4 ;042 cycles, 2.57 bit times
|
|
|
|
btfsc PORTC,RC5 ;043 cycles, 2.63 bit times
|
|
|
|
goto ToOne4 ;044 cycles, 2.69 bit times
|
|
|
|
btfsc PORTC,RC5 ;045 cycles, 2.75 bit times
|
|
|
|
goto ToOne4 ;046 cycles, 2.82 bit times
|
|
|
|
btfsc PORTC,RC5 ;047 cycles, 2.88 bit times
|
|
|
|
goto ToOne4 ;048 cycles, 2.94 bit times
|
|
|
|
btfsc PORTC,RC5 ;049 cycles, 3.00 bit times
|
|
|
|
goto ToOne4 ;050 cycles, 3.06 bit times
|
|
|
|
btfsc PORTC,RC5 ;051 cycles, 3.12 bit times
|
|
|
|
goto ToOne4 ;052 cycles, 3.18 bit times
|
|
|
|
btfsc PORTC,RC5 ;053 cycles, 3.24 bit times
|
|
|
|
goto ToOne4 ;054 cycles, 3.30 bit times
|
|
|
|
btfsc PORTC,RC5 ;055 cycles, 3.37 bit times
|
|
|
|
goto ToOne4 ;056 cycles, 3.43 bit times
|
|
|
|
btfsc PORTC,RC5 ;057 cycles, 3.49 bit times
|
|
|
|
goto ToOne4 ;058 cycles, 3.55 bit times
|
|
|
|
btfsc PORTC,RC5 ;059 cycles, 3.61 bit times
|
|
|
|
goto ToOne3 ;060 cycles, 3.67 bit times
|
|
|
|
btfsc PORTC,RC5 ;061 cycles, 3.73 bit times
|
|
|
|
goto ToOne3 ;062 cycles, 3.79 bit times
|
|
|
|
btfsc PORTC,RC5 ;063 cycles, 3.86 bit times
|
|
|
|
goto ToOne3 ;064 cycles, 3.92 bit times
|
|
|
|
btfsc PORTC,RC5 ;065 cycles, 3.98 bit times
|
|
|
|
goto ToOne3 ;066 cycles, 4.04 bit times
|
|
|
|
btfsc PORTC,RC5 ;067 cycles, 4.10 bit times
|
|
|
|
goto ToOne3 ;068 cycles, 4.16 bit times
|
|
|
|
btfsc PORTC,RC5 ;069 cycles, 4.22 bit times
|
|
|
|
goto ToOne3 ;070 cycles, 4.28 bit times
|
|
|
|
btfsc PORTC,RC5 ;071 cycles, 4.35 bit times
|
|
|
|
goto ToOne3 ;072 cycles, 4.41 bit times
|
|
|
|
btfsc PORTC,RC5 ;073 cycles, 4.47 bit times
|
|
|
|
goto ToOne3 ;074 cycles, 4.53 bit times
|
|
|
|
btfsc PORTC,RC5 ;075 cycles, 4.59 bit times
|
|
|
|
goto ToOne2 ;076 cycles, 4.65 bit times
|
|
|
|
btfsc PORTC,RC5 ;077 cycles, 4.71 bit times
|
|
|
|
goto ToOne2 ;078 cycles, 4.77 bit times
|
|
|
|
btfsc PORTC,RC5 ;079 cycles, 4.83 bit times
|
|
|
|
goto ToOne2 ;080 cycles, 4.90 bit times
|
|
|
|
btfsc PORTC,RC5 ;081 cycles, 4.96 bit times
|
|
|
|
goto ToOne2 ;082 cycles, 5.02 bit times
|
|
|
|
btfsc PORTC,RC5 ;083 cycles, 5.08 bit times
|
|
|
|
goto ToOne2 ;084 cycles, 5.14 bit times
|
|
|
|
btfsc PORTC,RC5 ;085 cycles, 5.20 bit times
|
|
|
|
goto ToOne2 ;086 cycles, 5.26 bit times
|
|
|
|
btfsc PORTC,RC5 ;087 cycles, 5.32 bit times
|
|
|
|
goto ToOne2 ;088 cycles, 5.39 bit times
|
|
|
|
btfsc PORTC,RC5 ;089 cycles, 5.45 bit times
|
|
|
|
goto ToOne2 ;090 cycles, 5.51 bit times
|
|
|
|
btfsc PORTC,RC5 ;091 cycles, 5.57 bit times
|
|
|
|
goto ToOne1 ;092 cycles, 5.63 bit times
|
|
|
|
btfsc PORTC,RC5 ;093 cycles, 5.69 bit times
|
|
|
|
goto ToOne1 ;094 cycles, 5.75 bit times
|
|
|
|
btfsc PORTC,RC5 ;095 cycles, 5.81 bit times
|
|
|
|
goto ToOne1 ;096 cycles, 5.88 bit times
|
|
|
|
btfsc PORTC,RC5 ;097 cycles, 5.94 bit times
|
|
|
|
goto ToOne1 ;098 cycles, 6.00 bit times
|
|
|
|
btfsc PORTC,RC5 ;099 cycles, 6.06 bit times
|
|
|
|
goto ToOne1 ;100 cycles, 6.12 bit times
|
|
|
|
btfsc PORTC,RC5 ;101 cycles, 6.18 bit times
|
|
|
|
goto ToOne1 ;102 cycles, 6.24 bit times
|
|
|
|
btfsc PORTC,RC5 ;103 cycles, 6.30 bit times
|
|
|
|
goto ToOne1 ;104 cycles, 6.36 bit times
|
|
|
|
btfsc PORTC,RC5 ;105 cycles, 6.43 bit times
|
|
|
|
goto ToOne1 ;106 cycles, 6.49 bit times
|
|
|
|
btfsc PORTC,RC5 ;107 cycles, 6.55 bit times
|
|
|
|
goto ToOne0 ;108 cycles, 6.61 bit times
|
|
|
|
btfsc PORTC,RC5 ;109 cycles, 6.67 bit times
|
|
|
|
goto ToOne0 ;110 cycles, 6.73 bit times
|
|
|
|
btfsc PORTC,RC5 ;111 cycles, 6.79 bit times
|
|
|
|
goto ToOne0 ;112 cycles, 6.85 bit times
|
|
|
|
btfsc PORTC,RC5 ;113 cycles, 6.92 bit times
|
|
|
|
goto ToOne0 ;114 cycles, 6.98 bit times
|
|
|
|
btfsc PORTC,RC5 ;115 cycles, 7.04 bit times
|
|
|
|
goto ToOne0 ;116 cycles, 7.10 bit times
|
|
|
|
btfsc PORTC,RC5 ;117 cycles, 7.16 bit times
|
|
|
|
goto ToOne0 ;118 cycles, 7.22 bit times
|
|
|
|
btfsc PORTC,RC5 ;119 cycles, 7.28 bit times
|
|
|
|
goto ToOne0 ;120 cycles, 7.34 bit times
|
|
|
|
btfsc PORTC,RC5 ;121 cycles, 7.40 bit times
|
|
|
|
goto ToOne0 ;122 cycles, 7.47 bit times
|
|
|
|
moviw FSR0++ ;123 cycles, 7.53 bit times
|
|
|
|
goto StZero ;124 cycles, 7.59 bit times
|
|
|
|
|
|
|
|
ToZero6 movlw B'01000000' ;003 cycles, 0.18 bit times
|
|
|
|
iorwf INDF0,F ;004 cycles, 0.24 bit times
|
|
|
|
DNOP ;005-006 cycles, 0.31-0.37 bit times
|
|
|
|
DNOP ;007-008 cycles, 0.43-0.49 bit times
|
|
|
|
btfsc PORTC,RC5 ;009 cycles, 0.55 bit times
|
|
|
|
goto ToOne5 ;010 cycles, 0.61 bit times
|
|
|
|
btfsc PORTC,RC5 ;011 cycles, 0.67 bit times
|
|
|
|
goto ToOne5 ;012 cycles, 0.73 bit times
|
|
|
|
btfsc PORTC,RC5 ;013 cycles, 0.80 bit times
|
|
|
|
goto ToOne5 ;014 cycles, 0.86 bit times
|
|
|
|
btfsc PORTC,RC5 ;015 cycles, 0.92 bit times
|
|
|
|
goto ToOne5 ;016 cycles, 0.98 bit times
|
|
|
|
btfsc PORTC,RC5 ;017 cycles, 1.04 bit times
|
|
|
|
goto ToOne5 ;018 cycles, 1.10 bit times
|
|
|
|
btfsc PORTC,RC5 ;019 cycles, 1.16 bit times
|
|
|
|
goto ToOne5 ;020 cycles, 1.22 bit times
|
|
|
|
btfsc PORTC,RC5 ;021 cycles, 1.29 bit times
|
|
|
|
goto ToOne5 ;022 cycles, 1.35 bit times
|
|
|
|
btfsc PORTC,RC5 ;023 cycles, 1.41 bit times
|
|
|
|
goto ToOne5 ;024 cycles, 1.47 bit times
|
|
|
|
btfsc PORTC,RC5 ;025 cycles, 1.53 bit times
|
|
|
|
goto ToOne4 ;026 cycles, 1.59 bit times
|
|
|
|
btfsc PORTC,RC5 ;027 cycles, 1.65 bit times
|
|
|
|
goto ToOne4 ;028 cycles, 1.71 bit times
|
|
|
|
btfsc PORTC,RC5 ;029 cycles, 1.77 bit times
|
|
|
|
goto ToOne4 ;030 cycles, 1.84 bit times
|
|
|
|
btfsc PORTC,RC5 ;031 cycles, 1.90 bit times
|
|
|
|
goto ToOne4 ;032 cycles, 1.96 bit times
|
|
|
|
btfsc PORTC,RC5 ;033 cycles, 2.02 bit times
|
|
|
|
goto ToOne4 ;034 cycles, 2.08 bit times
|
|
|
|
btfsc PORTC,RC5 ;035 cycles, 2.14 bit times
|
|
|
|
goto ToOne4 ;036 cycles, 2.20 bit times
|
|
|
|
btfsc PORTC,RC5 ;037 cycles, 2.26 bit times
|
|
|
|
goto ToOne4 ;038 cycles, 2.33 bit times
|
|
|
|
btfsc PORTC,RC5 ;039 cycles, 2.39 bit times
|
|
|
|
goto ToOne4 ;040 cycles, 2.45 bit times
|
|
|
|
btfsc PORTC,RC5 ;041 cycles, 2.51 bit times
|
|
|
|
goto ToOne3 ;042 cycles, 2.57 bit times
|
|
|
|
btfsc PORTC,RC5 ;043 cycles, 2.63 bit times
|
|
|
|
goto ToOne3 ;044 cycles, 2.69 bit times
|
|
|
|
btfsc PORTC,RC5 ;045 cycles, 2.75 bit times
|
|
|
|
goto ToOne3 ;046 cycles, 2.82 bit times
|
|
|
|
btfsc PORTC,RC5 ;047 cycles, 2.88 bit times
|
|
|
|
goto ToOne3 ;048 cycles, 2.94 bit times
|
|
|
|
btfsc PORTC,RC5 ;049 cycles, 3.00 bit times
|
|
|
|
goto ToOne3 ;050 cycles, 3.06 bit times
|
|
|
|
btfsc PORTC,RC5 ;051 cycles, 3.12 bit times
|
|
|
|
goto ToOne3 ;052 cycles, 3.18 bit times
|
|
|
|
btfsc PORTC,RC5 ;053 cycles, 3.24 bit times
|
|
|
|
goto ToOne3 ;054 cycles, 3.30 bit times
|
|
|
|
btfsc PORTC,RC5 ;055 cycles, 3.37 bit times
|
|
|
|
goto ToOne3 ;056 cycles, 3.43 bit times
|
|
|
|
btfsc PORTC,RC5 ;057 cycles, 3.49 bit times
|
|
|
|
goto ToOne3 ;058 cycles, 3.55 bit times
|
|
|
|
btfsc PORTC,RC5 ;059 cycles, 3.61 bit times
|
|
|
|
goto ToOne2 ;060 cycles, 3.67 bit times
|
|
|
|
btfsc PORTC,RC5 ;061 cycles, 3.73 bit times
|
|
|
|
goto ToOne2 ;062 cycles, 3.79 bit times
|
|
|
|
btfsc PORTC,RC5 ;063 cycles, 3.86 bit times
|
|
|
|
goto ToOne2 ;064 cycles, 3.92 bit times
|
|
|
|
btfsc PORTC,RC5 ;065 cycles, 3.98 bit times
|
|
|
|
goto ToOne2 ;066 cycles, 4.04 bit times
|
|
|
|
btfsc PORTC,RC5 ;067 cycles, 4.10 bit times
|
|
|
|
goto ToOne2 ;068 cycles, 4.16 bit times
|
|
|
|
btfsc PORTC,RC5 ;069 cycles, 4.22 bit times
|
|
|
|
goto ToOne2 ;070 cycles, 4.28 bit times
|
|
|
|
btfsc PORTC,RC5 ;071 cycles, 4.35 bit times
|
|
|
|
goto ToOne2 ;072 cycles, 4.41 bit times
|
|
|
|
btfsc PORTC,RC5 ;073 cycles, 4.47 bit times
|
|
|
|
goto ToOne2 ;074 cycles, 4.53 bit times
|
|
|
|
btfsc PORTC,RC5 ;075 cycles, 4.59 bit times
|
|
|
|
goto ToOne1 ;076 cycles, 4.65 bit times
|
|
|
|
btfsc PORTC,RC5 ;077 cycles, 4.71 bit times
|
|
|
|
goto ToOne1 ;078 cycles, 4.77 bit times
|
|
|
|
btfsc PORTC,RC5 ;079 cycles, 4.83 bit times
|
|
|
|
goto ToOne1 ;080 cycles, 4.90 bit times
|
|
|
|
btfsc PORTC,RC5 ;081 cycles, 4.96 bit times
|
|
|
|
goto ToOne1 ;082 cycles, 5.02 bit times
|
|
|
|
btfsc PORTC,RC5 ;083 cycles, 5.08 bit times
|
|
|
|
goto ToOne1 ;084 cycles, 5.14 bit times
|
|
|
|
btfsc PORTC,RC5 ;085 cycles, 5.20 bit times
|
|
|
|
goto ToOne1 ;086 cycles, 5.26 bit times
|
|
|
|
btfsc PORTC,RC5 ;087 cycles, 5.32 bit times
|
|
|
|
goto ToOne1 ;088 cycles, 5.39 bit times
|
|
|
|
btfsc PORTC,RC5 ;089 cycles, 5.45 bit times
|
|
|
|
goto ToOne1 ;090 cycles, 5.51 bit times
|
|
|
|
btfsc PORTC,RC5 ;091 cycles, 5.57 bit times
|
|
|
|
goto ToOne0 ;092 cycles, 5.63 bit times
|
|
|
|
btfsc PORTC,RC5 ;093 cycles, 5.69 bit times
|
|
|
|
goto ToOne0 ;094 cycles, 5.75 bit times
|
|
|
|
btfsc PORTC,RC5 ;095 cycles, 5.81 bit times
|
|
|
|
goto ToOne0 ;096 cycles, 5.88 bit times
|
|
|
|
btfsc PORTC,RC5 ;097 cycles, 5.94 bit times
|
|
|
|
goto ToOne0 ;098 cycles, 6.00 bit times
|
|
|
|
btfsc PORTC,RC5 ;099 cycles, 6.06 bit times
|
|
|
|
goto ToOne0 ;100 cycles, 6.12 bit times
|
|
|
|
btfsc PORTC,RC5 ;101 cycles, 6.18 bit times
|
|
|
|
goto ToOne0 ;102 cycles, 6.24 bit times
|
|
|
|
btfsc PORTC,RC5 ;103 cycles, 6.30 bit times
|
|
|
|
goto ToOne0 ;104 cycles, 6.36 bit times
|
|
|
|
btfsc PORTC,RC5 ;105 cycles, 6.43 bit times
|
|
|
|
goto ToOne0 ;106 cycles, 6.49 bit times
|
|
|
|
moviw FSR0++ ;107 cycles, 6.55 bit times
|
|
|
|
goto StZero ;108 cycles, 6.61 bit times
|
|
|
|
|
|
|
|
ToZero5 movlw B'00100000' ;003 cycles, 0.18 bit times
|
|
|
|
iorwf INDF0,F ;004 cycles, 0.24 bit times
|
|
|
|
DNOP ;005-006 cycles, 0.31-0.37 bit times
|
|
|
|
DNOP ;007-008 cycles, 0.43-0.49 bit times
|
|
|
|
btfsc PORTC,RC5 ;009 cycles, 0.55 bit times
|
|
|
|
goto ToOne4 ;010 cycles, 0.61 bit times
|
|
|
|
btfsc PORTC,RC5 ;011 cycles, 0.67 bit times
|
|
|
|
goto ToOne4 ;012 cycles, 0.73 bit times
|
|
|
|
btfsc PORTC,RC5 ;013 cycles, 0.80 bit times
|
|
|
|
goto ToOne4 ;014 cycles, 0.86 bit times
|
|
|
|
btfsc PORTC,RC5 ;015 cycles, 0.92 bit times
|
|
|
|
goto ToOne4 ;016 cycles, 0.98 bit times
|
|
|
|
btfsc PORTC,RC5 ;017 cycles, 1.04 bit times
|
|
|
|
goto ToOne4 ;018 cycles, 1.10 bit times
|
|
|
|
btfsc PORTC,RC5 ;019 cycles, 1.16 bit times
|
|
|
|
goto ToOne4 ;020 cycles, 1.22 bit times
|
|
|
|
btfsc PORTC,RC5 ;021 cycles, 1.29 bit times
|
|
|
|
goto ToOne4 ;022 cycles, 1.35 bit times
|
|
|
|
btfsc PORTC,RC5 ;023 cycles, 1.41 bit times
|
|
|
|
goto ToOne4 ;024 cycles, 1.47 bit times
|
|
|
|
btfsc PORTC,RC5 ;025 cycles, 1.53 bit times
|
|
|
|
goto ToOne3 ;026 cycles, 1.59 bit times
|
|
|
|
btfsc PORTC,RC5 ;027 cycles, 1.65 bit times
|
|
|
|
goto ToOne3 ;028 cycles, 1.71 bit times
|
|
|
|
btfsc PORTC,RC5 ;029 cycles, 1.77 bit times
|
|
|
|
goto ToOne3 ;030 cycles, 1.84 bit times
|
|
|
|
btfsc PORTC,RC5 ;031 cycles, 1.90 bit times
|
|
|
|
goto ToOne3 ;032 cycles, 1.96 bit times
|
|
|
|
btfsc PORTC,RC5 ;033 cycles, 2.02 bit times
|
|
|
|
goto ToOne3 ;034 cycles, 2.08 bit times
|
|
|
|
btfsc PORTC,RC5 ;035 cycles, 2.14 bit times
|
|
|
|
goto ToOne3 ;036 cycles, 2.20 bit times
|
|
|
|
btfsc PORTC,RC5 ;037 cycles, 2.26 bit times
|
|
|
|
goto ToOne3 ;038 cycles, 2.33 bit times
|
|
|
|
btfsc PORTC,RC5 ;039 cycles, 2.39 bit times
|
|
|
|
goto ToOne3 ;040 cycles, 2.45 bit times
|
|
|
|
btfsc PORTC,RC5 ;041 cycles, 2.51 bit times
|
|
|
|
goto ToOne2 ;042 cycles, 2.57 bit times
|
|
|
|
btfsc PORTC,RC5 ;043 cycles, 2.63 bit times
|
|
|
|
goto ToOne2 ;044 cycles, 2.69 bit times
|
|
|
|
btfsc PORTC,RC5 ;045 cycles, 2.75 bit times
|
|
|
|
goto ToOne2 ;046 cycles, 2.82 bit times
|
|
|
|
btfsc PORTC,RC5 ;047 cycles, 2.88 bit times
|
|
|
|
goto ToOne2 ;048 cycles, 2.94 bit times
|
|
|
|
btfsc PORTC,RC5 ;049 cycles, 3.00 bit times
|
|
|
|
goto ToOne2 ;050 cycles, 3.06 bit times
|
|
|
|
btfsc PORTC,RC5 ;051 cycles, 3.12 bit times
|
|
|
|
goto ToOne2 ;052 cycles, 3.18 bit times
|
|
|
|
btfsc PORTC,RC5 ;053 cycles, 3.24 bit times
|
|
|
|
goto ToOne2 ;054 cycles, 3.30 bit times
|
|
|
|
btfsc PORTC,RC5 ;055 cycles, 3.37 bit times
|
|
|
|
goto ToOne2 ;056 cycles, 3.43 bit times
|
|
|
|
btfsc PORTC,RC5 ;057 cycles, 3.49 bit times
|
|
|
|
goto ToOne2 ;058 cycles, 3.55 bit times
|
|
|
|
btfsc PORTC,RC5 ;059 cycles, 3.61 bit times
|
|
|
|
goto ToOne1 ;060 cycles, 3.67 bit times
|
|
|
|
btfsc PORTC,RC5 ;061 cycles, 3.73 bit times
|
|
|
|
goto ToOne1 ;062 cycles, 3.79 bit times
|
|
|
|
btfsc PORTC,RC5 ;063 cycles, 3.86 bit times
|
|
|
|
goto ToOne1 ;064 cycles, 3.92 bit times
|
|
|
|
btfsc PORTC,RC5 ;065 cycles, 3.98 bit times
|
|
|
|
goto ToOne1 ;066 cycles, 4.04 bit times
|
|
|
|
btfsc PORTC,RC5 ;067 cycles, 4.10 bit times
|
|
|
|
goto ToOne1 ;068 cycles, 4.16 bit times
|
|
|
|
btfsc PORTC,RC5 ;069 cycles, 4.22 bit times
|
|
|
|
goto ToOne1 ;070 cycles, 4.28 bit times
|
|
|
|
btfsc PORTC,RC5 ;071 cycles, 4.35 bit times
|
|
|
|
goto ToOne1 ;072 cycles, 4.41 bit times
|
|
|
|
btfsc PORTC,RC5 ;073 cycles, 4.47 bit times
|
|
|
|
goto ToOne1 ;074 cycles, 4.53 bit times
|
|
|
|
btfsc PORTC,RC5 ;075 cycles, 4.59 bit times
|
|
|
|
goto ToOne0 ;076 cycles, 4.65 bit times
|
|
|
|
btfsc PORTC,RC5 ;077 cycles, 4.71 bit times
|
|
|
|
goto ToOne0 ;078 cycles, 4.77 bit times
|
|
|
|
btfsc PORTC,RC5 ;079 cycles, 4.83 bit times
|
|
|
|
goto ToOne0 ;080 cycles, 4.90 bit times
|
|
|
|
btfsc PORTC,RC5 ;081 cycles, 4.96 bit times
|
|
|
|
goto ToOne0 ;082 cycles, 5.02 bit times
|
|
|
|
btfsc PORTC,RC5 ;083 cycles, 5.08 bit times
|
|
|
|
goto ToOne0 ;084 cycles, 5.14 bit times
|
|
|
|
btfsc PORTC,RC5 ;085 cycles, 5.20 bit times
|
|
|
|
goto ToOne0 ;086 cycles, 5.26 bit times
|
|
|
|
btfsc PORTC,RC5 ;087 cycles, 5.32 bit times
|
|
|
|
goto ToOne0 ;088 cycles, 5.39 bit times
|
|
|
|
btfsc PORTC,RC5 ;089 cycles, 5.45 bit times
|
|
|
|
goto ToOne0 ;090 cycles, 5.51 bit times
|
|
|
|
moviw FSR0++ ;091 cycles, 5.57 bit times
|
|
|
|
goto StZero ;092 cycles, 5.63 bit times
|
|
|
|
|
|
|
|
ToZero4 movlw B'00010000' ;003 cycles, 0.18 bit times
|
|
|
|
iorwf INDF0,F ;004 cycles, 0.24 bit times
|
|
|
|
DNOP ;005-006 cycles, 0.31-0.37 bit times
|
|
|
|
DNOP ;007-008 cycles, 0.43-0.49 bit times
|
|
|
|
btfsc PORTC,RC5 ;009 cycles, 0.55 bit times
|
|
|
|
goto ToOne3 ;010 cycles, 0.61 bit times
|
|
|
|
btfsc PORTC,RC5 ;011 cycles, 0.67 bit times
|
|
|
|
goto ToOne3 ;012 cycles, 0.73 bit times
|
|
|
|
btfsc PORTC,RC5 ;013 cycles, 0.80 bit times
|
|
|
|
goto ToOne3 ;014 cycles, 0.86 bit times
|
|
|
|
btfsc PORTC,RC5 ;015 cycles, 0.92 bit times
|
|
|
|
goto ToOne3 ;016 cycles, 0.98 bit times
|
|
|
|
btfsc PORTC,RC5 ;017 cycles, 1.04 bit times
|
|
|
|
goto ToOne3 ;018 cycles, 1.10 bit times
|
|
|
|
btfsc PORTC,RC5 ;019 cycles, 1.16 bit times
|
|
|
|
goto ToOne3 ;020 cycles, 1.22 bit times
|
|
|
|
btfsc PORTC,RC5 ;021 cycles, 1.29 bit times
|
|
|
|
goto ToOne3 ;022 cycles, 1.35 bit times
|
|
|
|
btfsc PORTC,RC5 ;023 cycles, 1.41 bit times
|
|
|
|
goto ToOne3 ;024 cycles, 1.47 bit times
|
|
|
|
btfsc PORTC,RC5 ;025 cycles, 1.53 bit times
|
|
|
|
goto ToOne2 ;026 cycles, 1.59 bit times
|
|
|
|
btfsc PORTC,RC5 ;027 cycles, 1.65 bit times
|
|
|
|
goto ToOne2 ;028 cycles, 1.71 bit times
|
|
|
|
btfsc PORTC,RC5 ;029 cycles, 1.77 bit times
|
|
|
|
goto ToOne2 ;030 cycles, 1.84 bit times
|
|
|
|
btfsc PORTC,RC5 ;031 cycles, 1.90 bit times
|
|
|
|
goto ToOne2 ;032 cycles, 1.96 bit times
|
|
|
|
btfsc PORTC,RC5 ;033 cycles, 2.02 bit times
|
|
|
|
goto ToOne2 ;034 cycles, 2.08 bit times
|
|
|
|
btfsc PORTC,RC5 ;035 cycles, 2.14 bit times
|
|
|
|
goto ToOne2 ;036 cycles, 2.20 bit times
|
|
|
|
btfsc PORTC,RC5 ;037 cycles, 2.26 bit times
|
|
|
|
goto ToOne2 ;038 cycles, 2.33 bit times
|
|
|
|
btfsc PORTC,RC5 ;039 cycles, 2.39 bit times
|
|
|
|
goto ToOne2 ;040 cycles, 2.45 bit times
|
|
|
|
btfsc PORTC,RC5 ;041 cycles, 2.51 bit times
|
|
|
|
goto ToOne1 ;042 cycles, 2.57 bit times
|
|
|
|
btfsc PORTC,RC5 ;043 cycles, 2.63 bit times
|
|
|
|
goto ToOne1 ;044 cycles, 2.69 bit times
|
|
|
|
btfsc PORTC,RC5 ;045 cycles, 2.75 bit times
|
|
|
|
goto ToOne1 ;046 cycles, 2.82 bit times
|
|
|
|
btfsc PORTC,RC5 ;047 cycles, 2.88 bit times
|
|
|
|
goto ToOne1 ;048 cycles, 2.94 bit times
|
|
|
|
btfsc PORTC,RC5 ;049 cycles, 3.00 bit times
|
|
|
|
goto ToOne1 ;050 cycles, 3.06 bit times
|
|
|
|
btfsc PORTC,RC5 ;051 cycles, 3.12 bit times
|
|
|
|
goto ToOne1 ;052 cycles, 3.18 bit times
|
|
|
|
btfsc PORTC,RC5 ;053 cycles, 3.24 bit times
|
|
|
|
goto ToOne1 ;054 cycles, 3.30 bit times
|
|
|
|
btfsc PORTC,RC5 ;055 cycles, 3.37 bit times
|
|
|
|
goto ToOne1 ;056 cycles, 3.43 bit times
|
|
|
|
btfsc PORTC,RC5 ;057 cycles, 3.49 bit times
|
|
|
|
goto ToOne1 ;058 cycles, 3.55 bit times
|
|
|
|
btfsc PORTC,RC5 ;059 cycles, 3.61 bit times
|
|
|
|
goto ToOne0 ;060 cycles, 3.67 bit times
|
|
|
|
btfsc PORTC,RC5 ;061 cycles, 3.73 bit times
|
|
|
|
goto ToOne0 ;062 cycles, 3.79 bit times
|
|
|
|
btfsc PORTC,RC5 ;063 cycles, 3.86 bit times
|
|
|
|
goto ToOne0 ;064 cycles, 3.92 bit times
|
|
|
|
btfsc PORTC,RC5 ;065 cycles, 3.98 bit times
|
|
|
|
goto ToOne0 ;066 cycles, 4.04 bit times
|
|
|
|
btfsc PORTC,RC5 ;067 cycles, 4.10 bit times
|
|
|
|
goto ToOne0 ;068 cycles, 4.16 bit times
|
|
|
|
btfsc PORTC,RC5 ;069 cycles, 4.22 bit times
|
|
|
|
goto ToOne0 ;070 cycles, 4.28 bit times
|
|
|
|
btfsc PORTC,RC5 ;071 cycles, 4.35 bit times
|
|
|
|
goto ToOne0 ;072 cycles, 4.41 bit times
|
|
|
|
btfsc PORTC,RC5 ;073 cycles, 4.47 bit times
|
|
|
|
goto ToOne0 ;074 cycles, 4.53 bit times
|
|
|
|
moviw FSR0++ ;075 cycles, 4.59 bit times
|
|
|
|
goto StZero ;076 cycles, 4.65 bit times
|
|
|
|
|
|
|
|
ToZero3 movlw B'00001000' ;003 cycles, 0.18 bit times
|
|
|
|
iorwf INDF0,F ;004 cycles, 0.24 bit times
|
|
|
|
DNOP ;005-006 cycles, 0.31-0.37 bit times
|
|
|
|
DNOP ;007-008 cycles, 0.43-0.49 bit times
|
|
|
|
btfsc PORTC,RC5 ;009 cycles, 0.55 bit times
|
|
|
|
goto ToOne2 ;010 cycles, 0.61 bit times
|
|
|
|
btfsc PORTC,RC5 ;011 cycles, 0.67 bit times
|
|
|
|
goto ToOne2 ;012 cycles, 0.73 bit times
|
|
|
|
btfsc PORTC,RC5 ;013 cycles, 0.80 bit times
|
|
|
|
goto ToOne2 ;014 cycles, 0.86 bit times
|
|
|
|
btfsc PORTC,RC5 ;015 cycles, 0.92 bit times
|
|
|
|
goto ToOne2 ;016 cycles, 0.98 bit times
|
|
|
|
btfsc PORTC,RC5 ;017 cycles, 1.04 bit times
|
|
|
|
goto ToOne2 ;018 cycles, 1.10 bit times
|
|
|
|
btfsc PORTC,RC5 ;019 cycles, 1.16 bit times
|
|
|
|
goto ToOne2 ;020 cycles, 1.22 bit times
|
|
|
|
btfsc PORTC,RC5 ;021 cycles, 1.29 bit times
|
|
|
|
goto ToOne2 ;022 cycles, 1.35 bit times
|
|
|
|
btfsc PORTC,RC5 ;023 cycles, 1.41 bit times
|
|
|
|
goto ToOne2 ;024 cycles, 1.47 bit times
|
|
|
|
btfsc PORTC,RC5 ;025 cycles, 1.53 bit times
|
|
|
|
goto ToOne1 ;026 cycles, 1.59 bit times
|
|
|
|
btfsc PORTC,RC5 ;027 cycles, 1.65 bit times
|
|
|
|
goto ToOne1 ;028 cycles, 1.71 bit times
|
|
|
|
btfsc PORTC,RC5 ;029 cycles, 1.77 bit times
|
|
|
|
goto ToOne1 ;030 cycles, 1.84 bit times
|
|
|
|
btfsc PORTC,RC5 ;031 cycles, 1.90 bit times
|
|
|
|
goto ToOne1 ;032 cycles, 1.96 bit times
|
|
|
|
btfsc PORTC,RC5 ;033 cycles, 2.02 bit times
|
|
|
|
goto ToOne1 ;034 cycles, 2.08 bit times
|
|
|
|
btfsc PORTC,RC5 ;035 cycles, 2.14 bit times
|
|
|
|
goto ToOne1 ;036 cycles, 2.20 bit times
|
|
|
|
btfsc PORTC,RC5 ;037 cycles, 2.26 bit times
|
|
|
|
goto ToOne1 ;038 cycles, 2.33 bit times
|
|
|
|
btfsc PORTC,RC5 ;039 cycles, 2.39 bit times
|
|
|
|
goto ToOne1 ;040 cycles, 2.45 bit times
|
|
|
|
btfsc PORTC,RC5 ;041 cycles, 2.51 bit times
|
|
|
|
goto ToOne0 ;042 cycles, 2.57 bit times
|
|
|
|
btfsc PORTC,RC5 ;043 cycles, 2.63 bit times
|
|
|
|
goto ToOne0 ;044 cycles, 2.69 bit times
|
|
|
|
btfsc PORTC,RC5 ;045 cycles, 2.75 bit times
|
|
|
|
goto ToOne0 ;046 cycles, 2.82 bit times
|
|
|
|
btfsc PORTC,RC5 ;047 cycles, 2.88 bit times
|
|
|
|
goto ToOne0 ;048 cycles, 2.94 bit times
|
|
|
|
btfsc PORTC,RC5 ;049 cycles, 3.00 bit times
|
|
|
|
goto ToOne0 ;050 cycles, 3.06 bit times
|
|
|
|
btfsc PORTC,RC5 ;051 cycles, 3.12 bit times
|
|
|
|
goto ToOne0 ;052 cycles, 3.18 bit times
|
|
|
|
btfsc PORTC,RC5 ;053 cycles, 3.24 bit times
|
|
|
|
goto ToOne0 ;054 cycles, 3.30 bit times
|
|
|
|
btfsc PORTC,RC5 ;055 cycles, 3.37 bit times
|
|
|
|
goto ToOne0 ;056 cycles, 3.43 bit times
|
|
|
|
btfsc PORTC,RC5 ;057 cycles, 3.49 bit times
|
|
|
|
goto ToOne0 ;058 cycles, 3.55 bit times
|
|
|
|
moviw FSR0++ ;059 cycles, 3.61 bit times
|
|
|
|
goto StZero ;060 cycles, 3.67 bit times
|
|
|
|
|
|
|
|
ToZero2 movlw B'00000100' ;003 cycles, 0.18 bit times
|
|
|
|
iorwf INDF0,F ;004 cycles, 0.24 bit times
|
|
|
|
DNOP ;005-006 cycles, 0.31-0.37 bit times
|
|
|
|
DNOP ;007-008 cycles, 0.43-0.49 bit times
|
|
|
|
btfsc PORTC,RC5 ;009 cycles, 0.55 bit times
|
|
|
|
goto ToOne1 ;010 cycles, 0.61 bit times
|
|
|
|
btfsc PORTC,RC5 ;011 cycles, 0.67 bit times
|
|
|
|
goto ToOne1 ;012 cycles, 0.73 bit times
|
|
|
|
btfsc PORTC,RC5 ;013 cycles, 0.80 bit times
|
|
|
|
goto ToOne1 ;014 cycles, 0.86 bit times
|
|
|
|
btfsc PORTC,RC5 ;015 cycles, 0.92 bit times
|
|
|
|
goto ToOne1 ;016 cycles, 0.98 bit times
|
|
|
|
btfsc PORTC,RC5 ;017 cycles, 1.04 bit times
|
|
|
|
goto ToOne1 ;018 cycles, 1.10 bit times
|
|
|
|
btfsc PORTC,RC5 ;019 cycles, 1.16 bit times
|
|
|
|
goto ToOne1 ;020 cycles, 1.22 bit times
|
|
|
|
btfsc PORTC,RC5 ;021 cycles, 1.29 bit times
|
|
|
|
goto ToOne1 ;022 cycles, 1.35 bit times
|
|
|
|
btfsc PORTC,RC5 ;023 cycles, 1.41 bit times
|
|
|
|
goto ToOne1 ;024 cycles, 1.47 bit times
|
|
|
|
btfsc PORTC,RC5 ;025 cycles, 1.53 bit times
|
|
|
|
goto ToOne0 ;026 cycles, 1.59 bit times
|
|
|
|
btfsc PORTC,RC5 ;027 cycles, 1.65 bit times
|
|
|
|
goto ToOne0 ;028 cycles, 1.71 bit times
|
|
|
|
btfsc PORTC,RC5 ;029 cycles, 1.77 bit times
|
|
|
|
goto ToOne0 ;030 cycles, 1.84 bit times
|
|
|
|
btfsc PORTC,RC5 ;031 cycles, 1.90 bit times
|
|
|
|
goto ToOne0 ;032 cycles, 1.96 bit times
|
|
|
|
btfsc PORTC,RC5 ;033 cycles, 2.02 bit times
|
|
|
|
goto ToOne0 ;034 cycles, 2.08 bit times
|
|
|
|
btfsc PORTC,RC5 ;035 cycles, 2.14 bit times
|
|
|
|
goto ToOne0 ;036 cycles, 2.20 bit times
|
|
|
|
btfsc PORTC,RC5 ;037 cycles, 2.26 bit times
|
|
|
|
goto ToOne0 ;038 cycles, 2.33 bit times
|
|
|
|
btfsc PORTC,RC5 ;039 cycles, 2.39 bit times
|
|
|
|
goto ToOne0 ;040 cycles, 2.45 bit times
|
|
|
|
moviw FSR0++ ;041 cycles, 2.51 bit times
|
|
|
|
goto StZero ;042 cycles, 2.57 bit times
|
|
|
|
|
|
|
|
ToZero1 movlw B'00000010' ;003 cycles, 0.18 bit times
|
|
|
|
iorwf INDF0,F ;004 cycles, 0.24 bit times
|
|
|
|
DNOP ;005-006 cycles, 0.31-0.37 bit times
|
|
|
|
DNOP ;007-008 cycles, 0.43-0.49 bit times
|
|
|
|
btfsc PORTC,RC5 ;009 cycles, 0.55 bit times
|
|
|
|
goto ToOne0 ;010 cycles, 0.61 bit times
|
|
|
|
btfsc PORTC,RC5 ;011 cycles, 0.67 bit times
|
|
|
|
goto ToOne0 ;012 cycles, 0.73 bit times
|
|
|
|
btfsc PORTC,RC5 ;013 cycles, 0.80 bit times
|
|
|
|
goto ToOne0 ;014 cycles, 0.86 bit times
|
|
|
|
btfsc PORTC,RC5 ;015 cycles, 0.92 bit times
|
|
|
|
goto ToOne0 ;016 cycles, 0.98 bit times
|
|
|
|
btfsc PORTC,RC5 ;017 cycles, 1.04 bit times
|
|
|
|
goto ToOne0 ;018 cycles, 1.10 bit times
|
|
|
|
btfsc PORTC,RC5 ;019 cycles, 1.16 bit times
|
|
|
|
goto ToOne0 ;020 cycles, 1.22 bit times
|
|
|
|
btfsc PORTC,RC5 ;021 cycles, 1.29 bit times
|
|
|
|
goto ToOne0 ;022 cycles, 1.35 bit times
|
|
|
|
btfsc PORTC,RC5 ;023 cycles, 1.41 bit times
|
|
|
|
goto ToOne0 ;024 cycles, 1.47 bit times
|
|
|
|
moviw FSR0++ ;025 cycles, 1.53 bit times
|
|
|
|
goto StZero ;026 cycles, 1.59 bit times
|
|
|
|
|
|
|
|
ToZero0 movlw B'00000001' ;003 cycles, 0.18 bit times
|
|
|
|
iorwf INDF0,F ;004 cycles, 0.24 bit times
|
|
|
|
moviw FSR0++ ;005 cycles, 0.31 bit times
|
|
|
|
goto StZero ;006 cycles, 0.37 bit times
|
|
|
|
|
|
|
|
|
|
|
|
;;; End of Program ;;;
|
|
|
|
end
|