Made a little more progress, also fixed some thing in what I already had. Any questions, comments, or suggestions ask away!
Code:
' *****************************************************************************
' Software License Agreement
'
' The software supplied herewith by PBP forum members
' (the “Company”) for Microchip's PICmicro® Microcontroller's is
' intended and supplied to you, the Company’s customer, for use
' solely and exclusively on Microchip PICmicro Microcontroller
' products. The software is owned by the Company and/or its
' supplier, and is protected under applicable copyright laws. All
' rights are reserved. Any use in violation of the foregoing
' restrictions may subject the user to criminal sanctions under
' applicable laws, as well as to civil liability for the breach of
' the terms and conditions of this license.
'
' THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES,
' WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
' TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
' PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
' IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
' CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
'
'
' This software has been ported from Microchip's AN851 bootloader
' Changes have been made and will be made as the company sees fit.
' This version is for 16F's, there is another version for 18F's
'
'
' Memory Map
' -----------------
' | 0x0000 | Reset vector
' | |
' | 0x0004 | Interrupt vector
' | |
' | |
' |Boot Block | (this program)
' | |
' | 0x0200 | Re-mapped Reset Vector
' | 0x0204 | Re-mapped High Priority Interrupt Vector
' | |
' | |
' | |
' |Code Space | User program space
' | |
' | |
' | |
' | 0x3FFF |
' -----------------
'
' Incomming data format:
'
' {STX}{STX}{DATA}{CHKSUM}{ETX}
' / \
' ________/ \__________________________
' / \
' {COMMAND}{DLEN}{ADDRL}{ADDRH}{ADDRU}{DATA}...
'
' Definitions:
'
' STX - Start of packet indicator
' ETX - End of packet indicator
' LEN - Length of incomming packet
' DATA - General data up to 255 bytes
' CHKSUM - The 8-bit two's compliment sum of LEN & DATA
' COMMAND - Base command
' DLEN - Length of data associated to the command
' ADDR - Address up to 24 bits
' DATA - Data (if any)
'
'
' Commands:
'
' RD_VER 00 Read Version Information
' RD_MEM 01 Read Program Memory
' WR_MEM 02 Write Program Memory
' ER_MEM 03 Erase Program Memory (NOT supported by PIC16)
' RD_EE 04 Read EEDATA Memory
' WR_EE 05 Write EEDATA Memory
' RD_CONFIG 06 Read Config Memory (NOT supported by PIC16)
' WT_CONFIG 07 Write Config Memory (NOT supported by PIC16)
'
' ****************************************************************************
' *****************************************************************************
CHKSUM VAR BYTE ' Checksum accumulator
COUNTER VAR BYTE ' General counter
ABTIME VAR BYTE
RXDATA VAR BYTE
TXDATA VAR BYTE
TEMP VAR BYTE
ARRAYPOINTER VAR BYTE
TEMPFLAG VAR BIT
PCLATH_TEMP VAR BYTE ' Interrupt context
STATUS_TEMP VAR BYTE ' save/restore registers
W_TEMP VAR BYTE
' Frame Format
'
' {STX}{STX}[{COMMAND}{DATALEN}{ADDRL}{ADDRH}{ADDRU}{...DATA...}]{CHKSUM}{ETX}
DATA_BUFF VAR BYTE[50] ' Start of receive buffer SAME ADDRESS AS COMMAND
COMMAND VAR DATA_BUFF[0] ' Data mapped in receive buffer SAME ADDRESS AS DATA_BYTE
DATA_COUNT VAR DATA_BUFF[1]
ADDRESS_L VAR DATA_BUFF[2]
ADDRESS_H VAR DATA_BUFF[3]
ADDRESS_U VAR DATA_BUFF[4]
'PACKET_DATA VAR DATA_BUFF[5-49] 'Maybe we don't need this line?**************
' *****************************************************************************
' This is the remapping section, note the interrupt also saves context
' *****************************************************************************
@ ORG 0x0000 ' Re-map Reset vector **Not sure how to set the address to start at
VReset:
PCLATH = 0
goto Setup
@ ORG 0x0004 'standard interrupt vector **again not sure of the PBP equal for ORG
VInt:
W_TEMP = W 'I am assuming this will be the "W" register
STATUS_TEMP = STATUS 'We may have trouble here. ASM uses SWAP so as not to affect the status
STATUS = 0
PCLATH_TEMP = PCLATH
PCLATH = 0
goto RVInt ' Re-map Interrupt vector
' *****************************************************************************
*****************************************************************************
' Setup the appropriate registers.
Setup:
clrwdt
READ $ff,temp 'get the value of last EEPROM location
IF temp = $ff then goto SRX 'BL startup
goto RVReset ' If not 0xFF then normal reset
SRX:
RCSTA = %10000000 ' Setup rx and tx, CREN disabled
TRISC.6 = 0 ' Setup tx pin
TXSTA = %00100110
STATUS.IRP = 1
' *****************************************************************************
' *****************************************************************************
Autobaud:
'
' ___ __________ ________
' \__/ \__________/
' | |
' |-------- p ----------|
'
' p = The number of instructions between the first and last
' rising edge of the RS232 control sequence 0x0F. Other
' possible control sequences are 0x01, 0x03, 0x07, 0x1F,
' 0x3F, 0x7F.
'
' SPBRG = (p / 32) - 1 BRGH = 1
OPTION_REG = %00000011 'sets tmr0 to 1:16 prescale
STATUS.RP0 = 0
RCSTA.CREN = 0
gosub WaitForRise
TMR0 = 0 ' Start counting
gosub WaitForRise
ABTIME = TMR0 ' Read the timer
TEMPFLAG = ABTIME.0
ABTIME = ABTIME >>1
IF !TEMPFLAG THEN ABTIME.0 = 0 'Rounding
SPBRG = ABTIME
RCSTA.CREN = 1 ' Enable receive
TEMP = RCREG ' To clear the Rx buffer
TEMP = RCREG ' Both of them
OPTION_REG = %11111111 'Return Option Reg to reset state
' *****************************************************************************
' *****************************************************************************
' Read and parse the data.
StartOfLine:
GOSUB RdRS232 ' Look for a start of line
IF RXDATA != STX THEN Autobaud '{STX}{STX}
ARRAYPOINTER = 0 ' Point to the beginning of Array
CHKSUM = 0 ' Reset checksum
GetNextDat:
GOSUB RdRS232 ' Get the data
IF RXDATA = STX THEN StartOfLine ' Check for a STX
' Yes, start over
NoSTX:
IF RXDATA = ETX THEN CheckSum ' Check for a ETX
' Yes, examine checksum
NoETX:
IF RXDATA = DLE THEN GOSUB RdRS232 ' Check for a DLE
' Yes, Get the next byte
NoDLE:
DATA_BUFF[ARRAYPOINTER] = RXDATA ' Store the data
CHKSUM = CHKSUM + RXDATA ' Get sum
ARRAYPOINTER = ARRAYPOINTER + 1
goto GetNextDat
CheckSum:
IF CHKSUM = 0 THEN Autobaud ' Checksum test
' ***********************************************
Bookmarks