************************************************
* 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
