From 5a4ccc88a4a5d6265aebb13c03da069ee4dc8a6c Mon Sep 17 00:00:00 2001 From: lampmerchant <66847847+lampmerchant@users.noreply.github.com> Date: Wed, 3 Nov 2021 13:56:19 -0600 Subject: [PATCH] 20211103 --- firmware/tashtwenty.asm | 3210 +++++++++++++++++++++++++++++++++++++++ firmware/tashtwenty.mcp | 53 + 2 files changed, 3263 insertions(+) create mode 100644 firmware/tashtwenty.asm create mode 100644 firmware/tashtwenty.mcp diff --git a/firmware/tashtwenty.asm b/firmware/tashtwenty.asm new file mode 100644 index 0000000..a10431b --- /dev/null +++ b/firmware/tashtwenty.asm @@ -0,0 +1,3210 @@ +;;; 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 . + + +;;; 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 + + +;;; 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 + 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 + 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 ; " + movlw 0x51 ;Set up a read command for the MMC card + movwf M_BUF1 ; " + 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 + 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 ; " +CmdWriteCont + movlw 0x58 ;Set up a write command for the MMC card, maybe + movwf M_BUF1 ; with an address set up by a previous command + bcf PORTC,RC3 ;Assert !CS + btfss M_FLAGS,M_FAIL ;If there haven't been any previous failures, + call MmcCmd ; send the MMC command + 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 + bsf PORTC,RC3 ;Deassert !CS + 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 ; " + movlw 0x02 ;Increment the read address by 512 in case more + addwf M_BUF4,F ; blocks are to come (with command number 0x41) + movlw 0 ; because its handler is this one, just jumped + addwfc M_BUF3,F ; into a bit late + addwfc M_BUF2,F ; " + goto IdleJump ;Done + +CmdStatus + clrf M_BUF5 ;Set the address to read the first sector of + clrf M_BUF4 ; the MMC card + clrf M_BUF3 ; " + clrf M_BUF2 ; " + movlw 0x51 ;Set up a read command for the MMC card + movwf M_BUF1 ; " + 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 + 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 ; " + 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 ; " + 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 ; " + 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 +; M_FAIL on fail. Trashes TEMP and FSR0. +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 ; " + movlw 0xFE ;Clock the data token into the MMC card + movwf SSP1BUF ; " + btfss SSP1STAT,BF ; " + 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 ; " + bra MmcWri2 ; " + clrf TEMP ;Check 65536 times to see if the write is done + clrf TEMP2 ; " +MmcWri1 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 ; write is done and we can return + bra MmcWri3 ; " + decfsz TEMP,F ;If it's not done, try again + bra MmcWri1 ; " + decfsz TEMP2,F ; " + bra MmcWri1 ; " +MmcWri2 bsf M_FLAGS,M_FAIL ;If out of tries, fail the write operation +MmcWri3 movlb 0 ;Return to the default bank + 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 ; " +MmcCmd3 ;TODO microchip's code sends another 8 clocks here but I can't find + ; anything in the spec that says we have to do that + movlb 0 + 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 diff --git a/firmware/tashtwenty.mcp b/firmware/tashtwenty.mcp new file mode 100644 index 0000000..870753a --- /dev/null +++ b/firmware/tashtwenty.mcp @@ -0,0 +1,53 @@ +[HEADER] +magic_cookie={66E99B07-E706-4689-9E80-9B2582898A13} +file_version=1.0 +device=PIC16F1825 +[PATH_INFO] +BuildDirPolicy=BuildDirIsProjectDir +dir_src= +dir_bin= +dir_tmp= +dir_sin= +dir_inc= +dir_lib= +dir_lkr= +[CAT_FILTERS] +filter_src=*.asm +filter_inc=*.h;*.inc +filter_obj=*.o +filter_lib=*.lib +filter_lkr=*.lkr +[CAT_SUBFOLDERS] +subfolder_src= +subfolder_inc= +subfolder_obj= +subfolder_lib= +subfolder_lkr= +[FILE_SUBFOLDERS] +file_000=. +file_001=. +[GENERATED_FILES] +file_000=no +file_001=no +[OTHER_FILES] +file_000=no +file_001=no +[FILE_INFO] +file_000=tashtwenty.asm +file_001=C:\Program Files\Microchip\MPASM Suite\p16f1825.inc +[SUITE_INFO] +suite_guid={6B3DAA78-59C1-46DD-B6AA-DBDAE4E06484} +suite_state=generate-absolute-code +[TOOL_SETTINGS] +TS{DD2213A8-6310-47B1-8376-9430CDFC013F}= +TS{BFD27FBA-4A02-4C0E-A5E5-B812F3E7707C}=/o"$(BINDIR_)$(TARGETBASE).cof" /M"$(BINDIR_)$(TARGETBASE).map" /W +TS{ADE93A55-C7C7-4D4D-A4BA-59305F7D0391}= +[INSTRUMENTED_TRACE] +enable=0 +transport=0 +format=0 +[CUSTOM_BUILD] +Pre-Build= +Pre-BuildEnabled=1 +Post-Build= +Post-BuildEnabled=1