************************************************
* Tue Jul 14 10:27:43 CDT 1987
*
************************************************
* BOOT
*
* BOOTLOADER FIRMWARE FOR 68HC11E9 - NO SECURITY
*
* EQUATES FOR USE WITH INDEX OFFSET = $1000
*
*
PORTD   EQU     $08
DDRD    EQU     $09
TOC1    EQU     $16     [EXTRA STORAGE (POOR STYLE)]
SPCR    EQU     $28     (FOR DWOM BIT)
BAUD    EQU     $2B
SCCR1   EQU     $2C
SCCR2   EQU     $2D
SCSR    EQU     $2E
SCDAT   EQU     $2F
PPROG   EQU     $3B
TEST1   EQU     $3E
CONFIG  EQU     $3F
*
* MORE EQUATES
*
EEPSTR  EQU     $B600           START OF EEPROM
EEPEND  EQU     $B7FF           END OF EEPROM
*
********
* THIS BOOTSTRAP PROGRAM ALLOWS THE USER TO
* DOWNLOAD A PROGRAM OF 0 - 512 BYTES.
* THE PROGRAM MUST START AT $0000.
* EACH BYTE OF THE PROGRAM IS RECEIVED BY THE SCI.
* THE FIRST BYTE ESTABLISHES BAUD RATE.
* THE SECOND AND THIRD BYTES ARE THE NUMBER OF
* BEING SENT (0 - $200).
* THEN THE PROGRAM IS DOWNLOADED STARTING WITH
* THE $0000 BYTE AND WORKING UP TOWARD THE $01FF
* BYTE FOR THE TOTAL NUMBER OF BYTES SPECIFIED.
*
* THE TRANSMITTER WILL BE USED FOR THE PURPOSE
* OF COMMUNICATION TO THE OUTSIDE WORLD.
*
************************************************
        ORG     $BF40
*
BEGIN   EQU     *
* INIT STACK
        LDS     #$01FF
* INIT X REG FOR INDEXED ACCESS TO REGISTERS
        LDX     #$1000
********
* PUT PORT D IN WIRE OR MODE
        BSET    SPCR,X $20
* INIT SCI AND RESTART BAUD DIVIDER CHAIN
        LDD     #$A20C          DIV BY 16
        STAA    BAUD,X
* RECEIVER & TRANSMITTER ENABLED
        STAB    SCCR2,X
********
* SEND BREAK TO SIGNAL START OF DOWNLOAD
        BSET    SCCR2,X $01
* CLEAR BREAK AS SOON AS START BIT IS DETECTED
        BRSET   PORTD,X $01 *
        BCLR    SCCR2,X $01     CLEAR BREAK
* WAIT FOR FIRST CHARACTER (USERS SEND $FF)
        BRCLR   SCSR,X $20 *    WAIT FOR RDRF
        LDAA    SCDAT,X         READ DATA
* IF DATA = $00 (BREAK OR $00), THEN JUMP TO EEPROM
        BNE     NOTZERO
        JMP     EEPSTR
NOTZERO EQU     *
* IF DATA = $FF, THEN /16 IS CORRECT BAUD
        CMPA    #$FF
        BEQ     BAUDOK
* ELSE CHANGE TO /104 (/13 & /8) 1200 @ 2MHZ
        BSET    BAUD,X $33
BAUDOK  EQU     *
* GET BYTE COUNT
        BRCLR   SCSR,X $20 *    WAIT FOR RDRF
        LDAA    SCDAT,X         LENGTH OF PROG (HI BYTE)
        ANDA    #$03            IN CASE IT'S TOO LONG
        BRCLR   SCSR,X $20 *    WAIT FOR RDRF
        LDAB    SCDAT,X         LENGTH OF PROG (LO BYTE)
        STD     TOC1,X          SAVE LENGTH
* THEN DOWNLOAD PROGRAM
        LDY     #$0000          INIT POINTER
* READ IN PROGRAM AND PUT INTO RAM
BK2     EQU     *
        CPY     TOC1,X          UNTIL LENGTH IS REACHED
        BEQ     STAR
        BRCLR   SCSR,X $20 *    WAIT FOR RDRF
        LDAA    SCDAT,X
        STAA    $00,Y
        STAA    SCDAT,X         HANDSHAKE
        INY
        BRA     BK2
************************************************
* ALL START USER'S PROGRAM
*
STAR    EQU     *
        JMP     $0000
************************************************
* MASK I.D. #
        ORG     $BFD2
        FDB     $0000
************************************************
* VECTORS (FIRST SIX DON'T POINT TO RAM)
*
        ORG     $BFD6           NEEDED IF BOOTROM < MAX
*
        FDB     $100-60         SCI
        FDB     $100-57         SPI
        FDB     $100-54         PULSE ACCUM INPUT EDGE
        FDB     $100-51         PULSE ACCUM OVERFLOW
        FDB     $100-48         TIMER OVERFLOW
        FDB     $100-45         TIMER OUTPUT COMPARE 5
        FDB     $100-42         TIMER OUTPUT COMPARE 4
        FDB     $100-39         TIMER OUTPUT COMPARE 3
        FDB     $100-36         TIMER OUTPUT COMPARE 2
        FDB     $100-33         TIMER OUTPUT COMPARE 1
        FDB     $100-30         TIMER INPUT CAPTURE 3
        FDB     $100-27         TIMER INPUT CAPTURE 2
        FDB     $100-24         TIMER INPUT CAPTURE 1
        FDB     $100-21         REAL TIME INT
        FDB     $100-18         IRQ
        FDB     $100-15         XIRQ
        FDB     $100-12         SWI
        FDB     $100-9          ILLEGAL OP-CODE
        FDB     $100-6          COP FAIL
        FDB     $100-3          CLOCK MONITOR
        FDB     #BEGIN          RESET
        END
