************************************************ * Wed Jul 26 13:00:33 CDT 1989 * ************************************************ * BOOT * * BOOTLOADER FIRMWARE FOR 68HC711D3 * * REVISION A - * FIX BUG IN "PROGRAM" ROUTINE WHICH THE FIRST BYTE * PROGRAMMED INTO THE EPROM WAS NOT TRANSMITTED FOR * VERIFY. * ALSO, ADDED TO "PROGRAM" ROUTINE A SKIP OF BYTES * WHICH ARE ALREADY PROGRAMMED TO THE VALUE DESIRED. * * THIS NEW VERSION ALLOWS VARIABLE LENGTH DOWNLOAD * BY QUITTING RECEPTION OF CHARACTERS WHEN AN IDLE * OF AT LEAST FOUR WORD TIMES OCCURS * * EQUATES (INDEX OFFSET NOT NEEDED) * * PORTD EQU $08 DDRD EQU $09 TCNT EQU $0E TOC1 EQU $16 TFLG1 EQU $23 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 * * BIT EQUATES FOR TFLG1 OC1F EQU $80 * * BIT EQUATES FOR PPROG LAT EQU $20 EPGM EQU $01 * * MORE EQUATES * EPRMSTR EQU $F000 START OF EPROM EPRMEND EQU $FFFF END OF EPROM * RAMSTR EQU $0040 RAMEND EQU $00FF * DELAYS EQU 3504 DELAY AT SLOW BAUD DELAYF EQU 539 DELAY AT FAST BAUD * PROGDEL EQU 8400 4 mSEC PROGRAMMING DELAY * AT 2.1MHz * ******** * THIS BOOTSTRAP PROGRAM ALLOWS THE USER TO * DOWNLOAD A PROGRAM OF 0 - 192 BYTES. * THE PROGRAM MUST START AT $0040. * EACH BYTE OF THE PROGRAM IS RECEIVED BY THE SCI. * THE FIRST BYTE ESTABLISHES BAUD RATE. * THEN THE PROGRAM IS DOWNLOADED STARTING WITH * THE $0040 BYTE AND WORKING UP TOWARD THE $00FF * A DELAY OF FOUR WORD TIMES (AT EITHER BAUD RATE) * CAUSES THE RECEPTION OF CHARACTERS TO STOP AND * A JUMP TO $0040. * * THE TRANSMITTER WILL BE USED FOR THE PURPOSE * OF COMMUNICATION TO THE OUTSIDE WORLD. * ************************************************ * TWO USER ROUTINES ARE FOUND AT THE BEGINNING * OF THE BOOTLOADER. THESE ARE NOT USED BY THE * MAIN BOOTLOADER PROGRAM, BUT CAN BE JUMPED INTO * BY THE PROGRAM THE USER DOWNLOADS. * * A VERIFY ROUTINE STARTS AT THE ADDRESS IN INDEX * Y AND TRANSMITS THE VALUE AT EACH ADDRESS UNTIL * THE END OF EPROM. THE START ADDRESS OF EPROM * IS LOADED INTO Y AS THE DEFAULT. THE ENTRY POINT * FOR THIS PROGRAM IS ADDRESS $BF03. * * ALSO FOUND HERE IS A PROGRAMMING ROUTINE WHICH IS * AVAILABLE TO THE USER. THIS CODE IS USED BY FIRST * BOOTLOADING A PROGRAM WHICH WILL JUMP TO $BF00. * REMEMBER AN IDLE LINE OF AT LEAST FOUR WORD TIMES IS * NEEDED TO END THE DOWNLOAD. A $FF IS TRANSMITTED * WHEN THIS PORTION OF THE PROGRAM IS REACHED. * * THIS ROUTINE IS DESIGNED TO PROGRAM ON A CONTINUOUS * BASIS, SO THAT THE PROGRAMMING TIME IS THE LIMITING * FACTOR NOT THE BAUD RATE. EACH BYTE IS TRANSMITTED * BACK AFTER IT IS PROGRAMMED SO THAT IT MAY BE VERIFED. * * IN ORDER TO KEEP THE PROGRAMMING PIPE FULL, THE * DOWNLOADING SIDE SHOULD SEND THE FIRST BYTE TO BE * PROGRAMMED, THEN IMMEDIATELY SEND THE SECOND BYTE. * WHEN THE FIRST BYTE IS PROGRAMMED IT WILL BE * TRANSMITTED BACK FOR VERIFICATION. THE SECOND * BYTE WILL BEGIN PROGRAMMING. THE THIRD BYTE SHOULD * BE SENT AFTER THE FIRST HAS BEEN RECEIVED BY THE * DOWNLOADING PROGRAM. THE DOWNLOADING PROGRAM SHOULD * REMAIN EXACTLY TWO BYTES AHEAD AT ALL TIMES TO KEEP * THE PIPE FULL AND KEEP FROM OVERRUNNING THE MCU. * HERE IS WHAT IT LOOKS LIKE GRAPHICALLY: * * 'HC711 __________________ ___ _______ ___ _______ ___ __ * XMTR | 1 | | 2 | | 3 | * (VERIFY) |___| |___| |___| * * 'HC711 ___ __________________ ___ _______ ___ _________ * RCVR | 1 | 2 | | 3 | | 4 | * (FROM |___|___| |___| |___| * DOWNLOADER) * ___________ ___________ ___________ _______ * BYTE BEING | 1 | 2 | 3 | 4 * PROGRAMMED |___________|___________|___________|_______ * * * * * PROGRAMMING IS TIME SET UP FOR 4 mSEC AT 2.1 MHz BUS * SPEED. IF THE USER IS RUNNING AT 1 MHz BUS THEN * A PROGRAMMING TIME OF 4000 (DECIMAL) OR $0FA0 ($=HEX) * SHOULD BE PUT INTO INDEX X BEFORE JUMPING TO * $BF00. THIS VALUE IS USED WITH A TIMER OUTPUT * COMPARE AND MAY BE DETERMINED FOR ANY BUS RATE * BY MULTIPLYING THE BUS FREQUENCY IN MHz BY 4000 uSEC * GIVING THE TIME IN CYCLES. * * THE FIRST ADDRESS TO BE PROGRAMMED IS SET UP IN * INDEX Y. THIS IS INITIALIZED TO $F000, THE START * OF THE EPROM. IF THE USER WISHES TO START AT A * DIFFERENT ADDRESS, THEN THAT ADDRESS SHOULD BE * PLACED IN INDEX Y BEFORE JUMPING TO $BF00. * * A USER'S PROGRAM MIGHT LOOK LIKE THIS: * * ORG $0000 * LDX #3000 RUNNING AT .750 MHz BUS * LDY #$F700 STARTING ADDRESS TO BE PROGRAMMED * JMP $BF00 BOOT PROGRAM ADDRESS * * *************************************************** * CODE STARTS HERE * * THIS IS THE EPROM PROGRAMMING SECTION OF THE BOOTLOADER * UPON ENTRY TO THIS SECTION X CONTAINS THE PROGRAMMING * DELAY TIME, Y CONTAINS THE FIRST ADDRESS TO BE PROGRAMMED * AND THE STACK HAS BEEN ESTABLISHED IN RAM * * THERE ARE TWO ROUTINES IN THIS SECTION: A PROGRAMMING * ROUTINE WHICH HAS AN ENTRY POINT AT $BF00 AND A VERIFY * ROUTINE WHICH HAS IT'S ENTRY POINT AT $BF03. * ORG $BF00 PROGRAM JMP PRGROUT * VERIFY EQU * * READ BYTE AT INDEX Y, TRANSMIT IT AND REPEAT UNTIL * RESET. NOTE THAT THIS ROUTINE COULD BE USED TO READ * OUT ANY OTHER PART OF MEMORY AS WELL AS THE EPROM. * VERLOOP LDAA 0,Y READ BYTE BRCLR SCSR $80 * WAIT FOR TDRE STAA SCDAT SEND IT INY BRA VERLOOP NEXT.... * **************************************************** PRGROUT EQU * * X CONTAINS PROGRAMMING DELAY * Y CONTAINS THE FIRST BYTE TO BE PROGRAMMED * SEND A $FF TO INDICATE THAT WE'RE READY TO RECEIVE * THE BYTES TO BE PROGRAMMED BRCLR SCSR $80 * WAIT FOR TDRE LDAA #$FF STAA SCDAT * WAIT FOR A BYTE WAIT1 EQU * BRCLR SCSR $20 * WAIT FOR RDRF * READ THE BYTE TO BE PROGRAMMED LDAB SCDAT CMPB $0,Y IF IT'S ALREADY EQUAL... BEQ DONEIT ...DON'T DO IT AGAIN * BEGIN PROGRAMMING IMMEDIATELY LDAA #LAT STAA PPROG STAB 0,Y LATCH THE BYTE LDAA #LAT+EPGM STAA PPROG * GET THE PROGRAM DELAY TIME AND SAVE IT AS WELL PSHX XGDX PULX * ADD TO IT THE TIMER COUNT VALUE ADDD TCNT * THIS IS NOW THE OUTPUT COMPARE VALUE STD TOC1 * CLEAR THE OLD OUTPUT COMPARE FLAG LDAA #OC1F STAA TFLG1 * * WAIT FOR PROGRAM COMPLETE BRCLR TFLG1 OC1F * * TIME IS UP CLR PPROG STOP PROGRAMMING * DONEIT EQU * BRCLR SCSR $80 * WAIT FOR TDRE LDAA $0,Y READ THE BYTE FOR VERIFY STAA SCDAT XMIT THE BYTE FOR VERIFY INY POINT TO NEXT LOCATION * RETURN TO WAITING FOR A NEW BYTE BRA WAIT1 * **************************************************** **************************************************** **************************************************** * HERE IS THE MAIN BOOTLOADER ROUTINE * THIS IS WHERE WE START OUT OF RESET IN BOOT MODE * BEGIN EQU * * INIT STACK LDS #RAMEND ******** * PUT PORT D IN WIRE OR MODE BSET SPCR $20 * INIT SCI AND RESTART BAUD DIVIDER CHAIN LDD #$A20C DIV BY 16 STAA BAUD * RECEIVER & TRANSMITTER ENABLED STAB SCCR2 ******** * SET UP DELAY FOR FASTEST BAUD RATE LDD #DELAYF STD TOC1 ******** * SEND BREAK TO SIGNAL START OF DOWNLOAD BSET SCCR2 $01 * CLEAR BREAK AS SOON AS START BIT IS DETECTED BRSET PORTD $01 * BCLR SCCR2 $01 CLEAR BREAK * WAIT FOR FIRST CHARACTER (USERS SEND $FF) BRCLR SCSR $20 * WAIT FOR RDRF LDAA SCDAT READ DATA * IF DATA = $00 (BREAK OR $00), THEN JUMP TO EEPROM BNE NOTZERO JMP EPRMSTR NOTZERO EQU * * IF DATA = $FF, THEN /16 IS CORRECT BAUD CMPA #$FF BEQ BAUDOK * ELSE CHANGE TO /104 (/13 & /8) 1200 @ 2MHZ BSET BAUD $33 * SET UP DELAY FOR SLOWER BAUD RATE LDD #DELAYS STD TOC1 * BAUDOK EQU * LDY #RAMSTR POINTER TO START OF RAM * * TIME EACH BYTE WAIT LDX TOC1 PUT DELAY TIME IN INX * WTLOOP BRSET SCSR $20 NEWONE DEX DECREMENT DELAY NOP KILL... NOP ...SEVEN CYCLES..... BRN *+2 ..TO MATCH ORIGINAL PROGRAM BNE WTLOOP BRA STAR * DID NOT TIME OUT NEWONE EQU * * READ IN BYTE AND PUT INTO RAM LDAA SCDAT STAA $00,Y STAA SCDAT HANDSHAKE INY CPY #RAMEND+1 BNE WAIT ************************************************ * ALL START USER'S PROGRAM * STAR EQU * LDX #PROGDEL INIT X WITH PROGRAMMING DELAY LDY #EPRMSTR INIT Y WITH EPROM START ADDR JMP RAMSTR ************************************************ * FILL UNUSED BYTES WITH ZERO * BSZ $BFD1-* * ************************************************ * REVISION LEVEL IN ASCII * (ORG $BFD1) FCC "A" ************************************************ * MASK I.D. ($0000 FOR EPROM PARTS) * (ORG $BFD2) FDB $0000 ************************************************ * 711D3 I.D. ORG $BFD4 FDB $71D3 ************************************************ * VECTORS * * 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