Electgpl

PIC - Bootloader F883 AN1310

Feb 17th, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; *****************************************************************************
  2. ; *    BOOTLOADER PARA PIC16F883 BASADO EN AN1310 DE MICROCHIP
  3. ; *    MODIFICACION DE PERFORMANCE DE MEMORIA POR CACCAVALLO SEBASTIAN
  4. ; *    FECHA DE MODIFICACION - 10/02/2016 - Electgpl
  5. ; *****************************************************************************
  6. #include "devices.inc"
  7. #include "bankswitch.inc"
  8. #include "bootconfig.inc"
  9. #if BOOTLOADERSIZE < ERASE_FLASH_BLOCKSIZE
  10.     #define BOOTBLOCKSIZE ERASE_FLASH_BLOCKSIZE
  11.     #ifndef BOOTLOADER_ADDRESS
  12.         #ifdef CONFIG_AS_FLASH
  13.             #define BOOTLOADER_ADDRESS  (END_FLASH - BOOTBLOCKSIZE - ERASE_FLASH_BLOCKSIZE)
  14.         #else
  15.             #define BOOTLOADER_ADDRESS  (END_FLASH - BOOTBLOCKSIZE)
  16.         #endif
  17.     #endif
  18. #else
  19.     #if (BOOTLOADERSIZE % ERASE_FLASH_BLOCKSIZE) == 0
  20.         #define BOOTBLOCKSIZE BOOTLOADERSIZE    
  21.     #else
  22.         #define BOOTBLOCKSIZE (BOOTLOADERSIZE / ERASE_FLASH_BLOCKSIZE + 1) * ERASE_FLASH_BLOCKSIZE
  23.     #endif
  24.     #ifndef BOOTLOADER_ADDRESS
  25.         #define BOOTLOADER_ADDRESS  (END_FLASH - BOOTBLOCKSIZE)
  26.     #endif
  27. #endif
  28. #ifndef AppVector
  29.     #define AppVector (BootloaderStart-.5)
  30. #endif
  31. ; *****************************************************************************
  32. #define STX             0x0F
  33. #define ETX             0x04
  34. #define DLE             0x05
  35. #define NTX             0xFF
  36. ; *****************************************************************************
  37. CRCL                equ 0xA0
  38. CRCH                equ 0xA1
  39. RXDATA              equ 0xA2
  40. TXDATA              equ 0xA3
  41. COMMAND             equ 0x20
  42. ADDRESS_L           equ 0x21
  43. ADDRESS_H           equ 0x22
  44. ADDRESS_U           equ 0x23
  45. ADDRESS_X           equ 0x24
  46. DATA_COUNTL         equ 0x25
  47. PACKET_DATA         equ 0x26
  48. DATA_COUNTH         equ 0x26
  49. #if BOOTLOADER_ADDRESS == 0
  50. #ifndef BSR
  51. PCLATH_TEMP         equ 0x7E   
  52. W_TEMP              equ 0x7F
  53. #endif
  54. #endif
  55. ; *****************************************************************************
  56. #ifdef PORTC
  57.     #define PORTRX  PORTC
  58.     #define RXPIN   7
  59.  
  60.     #define TRISTX  TRISC
  61.     #define TXPIN   6
  62. #else
  63.     #define PORTRX  PORTB
  64.     #define RXPIN   2
  65.  
  66.     #define TRISTX  TRISB
  67.     #define TXPIN   5
  68. #endif
  69.     errorlevel -302
  70. ; *****************************************************************************
  71. #if BOOTLOADER_ADDRESS != 0
  72.     ORG     0
  73.         errorlevel -306
  74.         errorlevel +306
  75.     ORG     BOOTLOADER_ADDRESS
  76. BootloaderStart:
  77.     movlw   high(BootloadMode)
  78.     movwf   PCLATH
  79.     goto    BootloadMode
  80. ; *****************************************************************************
  81. BootloaderBreakCheck:
  82.     movlw   high(AppVector)
  83.     movwf   PCLATH
  84. #ifdef INVERT_UART
  85.     btfss   PORTRX, RXPIN
  86.     goto    AppVector
  87.  
  88.     btfsc   PORTRX, RXPIN
  89.     goto    $-1
  90. #else
  91.     btfsc   PORTRX, RXPIN
  92.     goto    AppVector
  93.  
  94.     btfss   PORTRX, RXPIN
  95.     goto    $-1
  96. #endif
  97. #else
  98.     ORG     0
  99. BootloaderStart:
  100.     nop
  101.     BXtoB0
  102.     goto    BootloaderBreakCheck
  103.  
  104.     ORG     0x0004
  105. InterruptVector:
  106. #ifndef BSR
  107.     movwf   W_TEMP
  108.     swapf   PCLATH, W
  109.     movwf   PCLATH_TEMP
  110. #endif
  111.     movlw   high(AppIntVector)
  112.     movwf   PCLATH              
  113.     goto    AppIntVector        
  114. BootloaderBreakCheck:
  115. #ifdef INVERT_UART
  116.     btfsc   PORTRX, RXPIN        
  117.     goto    WaitForRxIdle        
  118. #else
  119.     btfss   PORTRX, RXPIN        
  120.     goto    WaitForRxIdle        
  121. #endif
  122.     banksel EEADR              
  123.     movlw   low(AppVector)      
  124.     movwf   EEADR              
  125.     movlw   high(AppVector)
  126.     movwf   EEADRH              
  127.     movwf   PCLATH              
  128.     call    ReadFlashWord      
  129.     addlw   .1
  130.     btfss   STATUS, Z          
  131.     goto    AppVector          
  132.  
  133.     movlw   0x3F
  134.     xorwf   FSR, w              
  135.     btfss   STATUS, Z          
  136.     goto    AppVector
  137.  
  138.     movlw   high(BootloadMode)
  139.     movwf   PCLATH              
  140. #ifdef INVERT_UART
  141. WaitForRxIdle:
  142.     btfsc   PORTRX, RXPIN        
  143.     goto    WaitForRxIdle
  144. #else
  145. WaitForRxIdle:
  146.     btfss   PORTRX, RXPIN        
  147.     goto    WaitForRxIdle
  148. #endif
  149. #endif
  150. BootloadMode:
  151. #ifdef BRG16
  152.     movlw   b'00110000'    
  153.     movwf   T1CON          
  154. #endif
  155. #ifdef BSR
  156.     banksel RCSTA
  157.     movlw   b'10010000'    
  158.     movwf   RCSTA          
  159.     movlw   b'00100110'    
  160.     movwf   TXSTA          
  161.     banksel OPTION_REG
  162. #else
  163.     movlw   b'10010000'    
  164.     movwf   RCSTA          
  165.     B0toB1                  
  166.     movlw   b'00100110'    
  167.     movwf   TXSTA          
  168. #endif
  169. #ifndef BRG16
  170.     clrwdt                  
  171.     movlw   b'00000011'    
  172.     movwf   OPTION_REG      
  173. #endif
  174.     B1toB3                  
  175. #ifdef INVERT_UART
  176.     bsf     BAUDCTL, RXDTP  
  177.     bsf     BAUDCTL, TXCKP  
  178. #endif
  179. #ifdef BRG16
  180.     bsf     BAUDCTL, BRG16  
  181. #endif
  182. ; *****************************************************************************
  183. DoAutoBaud:
  184. #ifdef BSR
  185.     banksel RCSTA
  186. #else
  187.     BXtoB0                      
  188. #endif
  189.     bcf     RCSTA, CREN          
  190.     movf    RCREG, W            
  191.     movf    RCREG, W            
  192. #ifdef BSR
  193.     banksel TMR1H
  194. #endif
  195. RetryAutoBaud:
  196. #ifdef BRG16
  197.     clrf    TMR1H                
  198.     clrf    TMR1L                
  199.     bcf     PIR1, TMR1IF        
  200. #else
  201.     bcf     STATUS, C            
  202. #endif
  203.     call    WaitForRise          
  204. #ifdef BRG16
  205.     bsf     T1CON, TMR1ON        
  206. #else
  207.     clrf    TMR0                
  208. #endif
  209.     call    WaitForRise          
  210. #ifdef BRG16
  211.     bcf     T1CON, TMR1ON        
  212.     btfsc   PIR1, TMR1IF        
  213.     goto    RetryAutoBaud        
  214.  
  215.     movf    TMR1L, w              
  216.   #ifdef BSR
  217.     banksel SPBRG
  218.   #else
  219.     B0toB1                        
  220.   #endif
  221.     movwf   SPBRG                
  222.   #ifdef BSR
  223.     banksel TMR1H
  224.   #else
  225.     B1toB0                        
  226.   #endif
  227.     movf    TMR1H, w              
  228.   #ifdef BSR
  229.     banksel SPBRGH
  230.   #else
  231.     B0toB1                        
  232.   #endif
  233.     movwf   SPBRGH                
  234. #else
  235.     movf    TMR0, w
  236.     movwf   FSR
  237.     rrf     FSR, w          
  238.     nop
  239.     nop
  240.     btfss   STATUS, C      
  241.     addlw   0xFF            
  242.  
  243.   #ifdef BSR
  244.     banksel SPBRG
  245.   #else
  246.     B0toB1                  
  247.   #endif
  248.     movwf   SPBRG          
  249. #endif
  250. WaitForHostCommand:        
  251. #ifdef BSR
  252.     banksel RCSTA
  253. #else
  254.     B1toB0                  
  255. #endif
  256.     bsf     RCSTA, CREN    
  257.     lfsr    COMMAND        
  258.     call    ReadHostByte    
  259.     xorlw   STX
  260.     bnz     DoAutoBaud      
  261. ; *****************************************************************************
  262. StartOfLine:
  263.     movlw   STX                  
  264.     call    SendHostByte        
  265. ReceiveDataLoop:
  266.     call    ReadHostByte        
  267.     xorlw   STX                  
  268.     bz      StartOfLine          
  269. NoSTX:
  270.     movf    INDF, W              
  271.     xorlw   ETX                  
  272.     bz      VerifyPacketCRC      
  273. NoETX:
  274.     movf    INDF, W              
  275.     xorlw   DLE                  
  276.     bnz     AppendDataBuffer
  277.     call    ReadHostByte        
  278. AppendDataBuffer:
  279.     incf    FSR, f              
  280.     goto    ReceiveDataLoop
  281. VerifyPacketCRC:
  282.     B0toB1                      
  283.     decf    FSR, w              
  284.     movwf   TXDATA              
  285.     decf    TXDATA, f            
  286.     lfsr    COMMAND              
  287.     clrf    CRCL                
  288.     clrf    CRCH                
  289. VerifyPacketCrcLoop:
  290.     movf    INDF, w              
  291.     call    AddCrcB1            
  292.     incf    FSR, f              
  293.     movf    FSR, w              
  294.     subwf   TXDATA, w            
  295.     bnz     VerifyPacketCrcLoop  
  296.     movf    CRCL, w              
  297.     subwf   INDF, w              
  298.     bnz     DoAutoBaud          
  299.     incf    FSR, f              
  300.     movf    CRCH, w              
  301.     subwf   INDF, w              
  302.     bnz     DoAutoBaud          
  303. ; *****************************************************************************
  304.     clrf    CRCL                    
  305.     clrf    CRCH                    
  306.     B1toB0                          
  307.     movf    ADDRESS_H, W            
  308.     movwf   FSR                    
  309.     movf    ADDRESS_L, W            
  310.     banksel EEADR                  
  311.     movwf   EEADR                  
  312.     movf    FSR, w                  
  313.     movwf   EEADRH                  
  314.     lfsr    PACKET_DATA            
  315.     BXtoB0                          
  316. ; *****************************************************************************
  317. CheckCommand:
  318.     movlw   (JUMPTABLE_END - JUMPTABLE_BEGIN)
  319.     subwf   COMMAND, w              
  320.     bc      DoAutoBaud              
  321.     movf    COMMAND, W              
  322. #if ($ & 0xFF) > (0xFF - .10)
  323.     messg   "Asegurando la tabla para no perder espacio de indexado."
  324.     ORG     $+(0x100 - ($ & 0xFF))
  325. #endif
  326.     addwf   PCL, F                
  327. JUMPTABLE_BEGIN:
  328.     goto    BootloaderInfo        
  329.     goto    ReadFlash              
  330.     goto    VerifyFlash            
  331.     goto    EraseFlash            
  332.     goto    WriteFlash            
  333.     goto    ReadEeprom            
  334.     goto    WriteEeprom            
  335.     goto    SendAcknowledge        
  336.     nop                            
  337.     movlw   high(AppVector)        
  338. JUMPTABLE_END:
  339.     movwf   PCLATH                
  340.     goto    AppVector              
  341. #if (JUMPTABLE_BEGIN & 0xFF) > (JUMPTABLE_END & 0xFF)
  342.     error "La tabla de saltos excede las 256 Bytes de direcciones."
  343. #endif
  344. WaitForRise:                    
  345.     clrwdt
  346. WaitForRiseLoop:                
  347. #ifdef BRG16
  348.     btfsc   PIR1, TMR1IF        
  349.     return                      
  350. #endif
  351.     btfsc   PORTRX, RXPIN        
  352.     goto    WaitForRiseLoop      
  353.  
  354. WtSR:
  355.     btfss   PORTRX, RXPIN        
  356.     goto    WtSR                
  357.     return
  358. AddCrc:                            
  359.     B0toB1                        
  360. AddCrcB1:
  361.     xorwf   CRCH, w                
  362.     movwf   RXDATA                
  363.     movf    CRCL, w                
  364.     movwf   CRCH                  
  365.     movf    RXDATA, w              
  366.     movwf   CRCL                  
  367.     swapf   CRCL, w                
  368.     andlw   0x0F                  
  369.     xorwf   CRCL, f                
  370.     swapf   CRCL, w                
  371.     andlw   0xF0                  
  372.     xorwf   CRCH, f                
  373.     swapf   CRCL, f                
  374.     bcf     STATUS, C              
  375.     rlf     CRCL, w                
  376.     btfsc   STATUS, C              
  377.     addlw   .1
  378.     xorwf   CRCH, f                
  379.     andlw   b'11100000'            
  380.     xorwf   CRCH, f                
  381.     swapf   CRCL, f                
  382.     xorwf   CRCL, f                
  383.     return
  384. ; *****************************************************************************
  385. BootInfoBlock:
  386.     db      high(BOOTBLOCKSIZE), low(BOOTBLOCKSIZE)
  387.     db      MINOR_VERSION, MAJOR_VERSION
  388. #ifdef FREE
  389.     db      0x02, 0x01            
  390. #else
  391.     db      0x02, 0x00            
  392. #endif
  393.     db      high(BootloaderStart), low(BootloaderStart)
  394.     db      0, upper(BootloaderStart)
  395.     db      high(DEVICEID), low(DEVICEID)
  396. BootInfoBlockEnd:
  397. BootloaderInfo:                    
  398.     movlw   (BootInfoBlockEnd - BootInfoBlock)
  399.     movwf   DATA_COUNTL          
  400.     clrf    DATA_COUNTH          
  401.     banksel EEADR
  402.     movlw   low(BootInfoBlock)
  403.     movwf   EEADR                
  404.     movlw   high(BootInfoBlock)  
  405.     movwf   EEADRH                
  406. ReadFlash:                        
  407.     call    ReadFlashWord          
  408.     call    SendEscapeByte        
  409.     call    AddCrcB1              
  410.     movf    FSR, w                
  411.     call    SendEscapeByte        
  412.     call    AddCrcB1              
  413.     banksel EEADR                  
  414.     incf    EEADR, f              
  415.     btfsc   STATUS, Z              
  416.     incf    EEADRH,F              
  417.    
  418.     BXtoB0                        
  419.     movlw   1
  420.     subwf   DATA_COUNTL, f        
  421.     btfss   STATUS, C
  422.     decf    DATA_COUNTH, f        
  423.  
  424.     movf    DATA_COUNTH, w      
  425.     iorwf   DATA_COUNTL, w      
  426.     bnz     ReadFlash            
  427.     goto    SendChecksum        
  428. ReadFlashWord:                  
  429.     banksel EECON1              
  430.     bsf     EECON1, EEPGD        
  431.     bsf     EECON1, RD          
  432.     nop                          
  433.     nop                          
  434.     banksel EEDATA              
  435.     movf    EEDATH, w            
  436.     movwf   FSR                  
  437.     movf    EEDATA, w            
  438.     BXtoB0                      
  439.     return
  440. VerifyFlash:                      
  441.     call    ReadFlashWord          
  442.     call    AddCrc                
  443.     movf    FSR, w                
  444.     call    AddCrcB1              
  445.     banksel EEADR                  
  446.     incf    EEADR, f              
  447.     btfsc   STATUS, Z              
  448.     incf    EEADRH,F              
  449.  
  450.     movf    EEADR, w              
  451.     andlw   (ERASE_FLASH_BLOCKSIZE-1)
  452.     bnz     VerifyFlash          
  453.     call    SendCRCWord          
  454.     BXtoB0                        
  455.     movlw   1
  456.     subwf   DATA_COUNTL, f        
  457.     btfss   STATUS, C            
  458.     decf    DATA_COUNTH, f        
  459.  
  460.     movf    DATA_COUNTH, w        
  461.     iorwf   DATA_COUNTL, w        
  462.     bnz     VerifyFlash          
  463.     goto    SendETX              
  464. #ifdef FREE
  465. #ifdef USE_SOFTBOOTWP
  466.     goto    BootloaderStart      
  467.     goto    BootloaderStart      
  468. #endif
  469. EraseFlash:                      
  470. #ifdef USE_SOFTBOOTWP
  471.   #define ERASE_ADDRESS_MASK  ( (~(ERASE_FLASH_BLOCKSIZE-1)) & (END_FLASH-1) )
  472.     banksel EEADR
  473.   #if high(ERASE_ADDRESS_MASK) != 0xFF
  474.     movlw   high(ERASE_ADDRESS_MASK)  
  475.     andwf   EEADRH, f
  476.   #endif
  477.   #if low(ERASE_ADDRESS_MASK) != 0xFF
  478.     movlw   low(ERASE_ADDRESS_MASK)    
  479.     andwf   EEADR, f
  480.   #endif
  481.   #if BOOTLOADER_ADDRESS != 0
  482.     movlw   high(BOOTLOADER_ADDRESS)
  483.     subwf   EEADRH, w
  484.     movlw   low(BOOTLOADER_ADDRESS)
  485.     btfsc   STATUS, Z
  486.     subwf   EEADR, w
  487.     btfss   STATUS, C
  488.     goto    EraseAddressOkay  
  489.   #endif
  490.     movlw   high(BOOTLOADER_ADDRESS + BOOTBLOCKSIZE)
  491.     subwf   EEADRH, w
  492.     movlw   low(BOOTLOADER_ADDRESS + BOOTBLOCKSIZE)
  493.     btfsc   STATUS, Z
  494.     subwf   EEADR, w
  495.     btfsc   STATUS, C
  496.     goto    EraseAddressOkay  
  497.     banksel EECON1            
  498.     clrf    EECON1            
  499.     goto    NextEraseBlock    
  500.     goto    BootloaderStart    
  501.     goto    BootloaderStart    
  502. #endif
  503. EraseAddressOkay:
  504.     banksel EECON1            
  505.     movlw   b'10010100'        
  506.     movwf   EECON1            
  507.     call    StartWriteB3      
  508. NextEraseBlock:
  509.     banksel EEADR                  
  510. #if ERASE_FLASH_BLOCKSIZE >= .256
  511.     movlw   high(ERASE_FLASH_BLOCKSIZE)
  512.     subwf   EEADRH, F              
  513. #else
  514.     movlw   ERASE_FLASH_BLOCKSIZE
  515.     subwf   EEADR, F              
  516.     btfss   STATUS, C
  517.     decf    EEADRH, f              
  518. #endif
  519.     banksel DATA_COUNTL            
  520.     decfsz  DATA_COUNTL, F        
  521.     goto    EraseFlash    
  522.     goto    SendAcknowledge        
  523. #endif
  524. #ifdef USE_SOFTBOOTWP
  525.     goto    BootloaderStart        
  526.     goto    BootloaderStart        
  527. #endif
  528. WriteFlash:
  529. #ifdef USE_SOFTBOOTWP
  530.   #define WRITE_ADDRESS_MASK  ( (~(WRITE_FLASH_BLOCKSIZE-1)) & (END_FLASH-1) )
  531.     banksel EEADR
  532.   #if high(WRITE_ADDRESS_MASK) != 0xFF
  533.     movlw   high(WRITE_ADDRESS_MASK)  
  534.     andwf   EEADRH, f
  535.   #endif
  536.   #if low(WRITE_ADDRESS_MASK) != 0xFF
  537.     movlw   low(WRITE_ADDRESS_MASK)    
  538.     andwf   EEADR, f
  539.   #endif
  540.   #if BOOTLOADER_ADDRESS != 0
  541.     movlw   high(BOOTLOADER_ADDRESS)
  542.     subwf   EEADRH, w
  543.     movlw   low(BOOTLOADER_ADDRESS)
  544.     btfsc   STATUS, Z
  545.     subwf   EEADR, w
  546.     btfss   STATUS, C
  547.     goto    WriteAddressOkay  
  548.   #endif
  549.     movlw   high(BOOTLOADER_ADDRESS + BOOTBLOCKSIZE)
  550.     subwf   EEADRH, w
  551.     movlw   low(BOOTLOADER_ADDRESS + BOOTBLOCKSIZE)
  552.     btfsc   STATUS, Z
  553.     subwf   EEADR, w
  554.     btfsc   STATUS, C
  555.     goto    WriteAddressOkay    
  556.  
  557.     banksel EECON1              
  558.     clrf    EECON1              
  559.     goto    LoadHoldingRegisters
  560.     goto    BootloaderStart    
  561.     goto    BootloaderStart    
  562. #endif
  563. WriteAddressOkay:
  564.     banksel EECON1              
  565.     movlw   b'10000100'        
  566.     movwf   EECON1              
  567. LoadHoldingRegisters:
  568.     banksel EEDATA              
  569.     movf    INDF, w            
  570.     incf    FSR, f              
  571.     movwf   EEDATA              
  572.     movf    INDF, w              
  573.     incf    FSR, f              
  574.     movwf   EEDATH              
  575.     call    StartWrite          
  576.     banksel EEADR
  577.     incf    EEADR, f            
  578.     btfsc   STATUS, Z            
  579.     incf    EEADRH, f            
  580.  
  581.     movlw   (WRITE_FLASH_BLOCKSIZE-1)
  582.     andwf   EEADR, w              
  583.     bnz     LoadHoldingRegisters  
  584.     B2toB0                        
  585.     decfsz  DATA_COUNTL, F        
  586.     goto    WriteFlash            
  587.     goto    SendAcknowledge        
  588. ReadEeprom:                        
  589.     banksel EECON1                
  590.     clrf    EECON1                
  591. ReadEepromLoop:
  592.     bsf     EECON1, RD            
  593.     btfsc   EECON1, RD
  594.     goto    $-1                    
  595.     banksel EEDATA                
  596.     movf    EEDATA, w              
  597.     banksel EEADR
  598.     incf    EEADR, f              
  599.     btfsc   STATUS, Z              
  600.     incf    EEADRH, f              
  601.  
  602.     call    SendEscapeByte        
  603.     call    AddCrcB1              
  604.     BXtoB0                        
  605.     decfsz  DATA_COUNTL, F        
  606.     goto    ReadEeprom            
  607.     goto    SendChecksum          
  608. WriteEeprom:                      
  609.     incf    FSR, f                
  610.     movf    INDF, w              
  611.     banksel EEDATA                
  612.     movwf   EEDATA                
  613.     B2toB3                        
  614.     movlw   b'00000100'          
  615.     movwf   EECON1                
  616.     call    StartWriteB3          
  617.     btfsc   EECON1, WR            
  618.     goto    $-1
  619.  
  620.     banksel EEADR
  621.     incf    EEADR, F              
  622.     B2toB0                        
  623.     decfsz  DATA_COUNTL, f        
  624.     goto    WriteEeprom          
  625.     goto    SendAcknowledge      
  626. #ifndef FREE
  627. EraseFlash:                      
  628. #endif
  629. SendAcknowledge:                  
  630.     movf    COMMAND, w            
  631.     call    SendEscapeByte        
  632.     call    AddCrcB1              
  633. SendChecksum:                    
  634.     call    SendCRCWord          
  635. SendETX:                          
  636.     BXtoB0                        
  637.     movlw   ETX                  
  638.     call    SendHostByte          
  639.     goto    WaitForHostCommand    
  640. ; *****************************************************************************
  641. SendCRCWord:                      
  642.     banksel CRCL
  643.     movf    CRCL, w              
  644.     call    SendEscapeByte        
  645.     movf    CRCH, w              
  646. SendEscapeByte:                  
  647.     banksel TXDATA
  648.     movwf   TXDATA                
  649.     xorlw   STX                  
  650.     bz      WrDLE                
  651.     movf    TXDATA, W            
  652.     xorlw   ETX                  
  653.     bz      WrDLE                
  654.     movf    TXDATA, W            
  655.     xorlw   DLE                  
  656.     bnz     WrNext                
  657. WrDLE:
  658.     movlw   DLE                  
  659.     call    SendHostByte          
  660. WrNext:
  661.     movf    TXDATA, W            
  662. SendHostByte:                    
  663.     B1toB0                      
  664.     clrwdt
  665.     btfss   PIR1, TXIF          
  666.     goto    $-1
  667.    
  668.     banksel TXREG
  669.     movwf   TXREG                
  670.     B0toB1                      
  671.     return
  672. ; *****************************************************************************
  673. ReadHostByte:                    
  674.     BXtoB0                      
  675.     clrwdt
  676.     btfss   PIR1, RCIF          
  677.     goto    $-1  
  678. #ifdef BSR
  679.     banksel RCREG
  680. #endif
  681.     movf    RCREG, W            
  682. #ifdef BSR
  683.     movlb   .0
  684. #endif
  685.     movwf   INDF                
  686.     return
  687. #ifdef USE_SOFTBOOTWP
  688.     goto    BootloaderStart    
  689.     goto    BootloaderStart    
  690. #endif
  691. StartWrite:                    
  692.     B2toB3                      
  693. StartWriteB3:
  694.     clrwdt                      
  695.     movlw   0x55                
  696.     movwf   EECON2              
  697.     movlw   0xAA                
  698.     movwf   EECON2              
  699.     bsf     EECON1, WR          
  700.     nop                        
  701.     nop                        
  702.     return                      
  703. ; *****************************************************************************
  704.     END
Add Comment
Please, Sign In to add comment