i should mention that the code this thing uses is a port of my routine for reprogramming the CCM (which also stores stuff in the on-chip eeprom)
it has a variable run time length depending on how much you are actually changing, and does bit level comparison to avoid unnecessary erasing.
i'm pretty happy with how well it worked for my own test suite it but it is totally possible it has insane bugs that i haven't anticipated. i have a bit of experience modifying existing 6811 assembly code but this is something i wrote from the ground up which is why i don't really want everyone using it until it's proven it works.
Code:
TO RUN THE PROGRAM:
7E $program_routine_address [BLK_SIZE] [OFFSET_16] [DATA...]
; ALDL_REPLY(START)
18 CE F4 9D ; LDY 0xF49D
C6 01 ; LDAB 0x01
ce ff b0 ; LDX loc_FFB0
ad 00 ; JSR,x+00
39 ; RTS
; ALDL_REPLY(END)
; PROGRAM_BLOCK(START)
; INPUT MUST GO AT 61C3 OR MUST REALIGN ALL 61E VALUES.
; INPUT: [BLK_SIZE] [OFFSET_16] [DATA....]
CE 61C6 ; LDX address of data
F6 61C3 ; LDAB block size
5A ; DECB block size--
2B EB ; BMI if b<0 goto ALDL_REPLY (operation finsihed)
F7 61C3 ; STAB block size
3A ; ABX - add blk size to address of data
A6 00 ; LDAA,x - A = data at address of data
FE 61C4 ; LDX write offset
3A ; ABX - add blk size to write offset
8D 02 ; BSR PROGRAM_BYTE
20 E9 ; BRA PROGRAM_BLOCK (loop)
; PROGRAM_BLOCK(END)
; SUBROUTINE PROGRAM_BYTE(START) - A=VALUE X=ADDRESS
; CONFIGURE:
C6 03 ; LDAB 03
37 ; PSHB - push max retry count onto stack
; RETRY LIMIT:
33 ; PULB - pull retry counter
5A ; DEC B (B--) - decrement counter
37 ; PSHB - push retry counter
27 06 ; BEQ COMPLETE
; VERIFY:
A1 00 ; CMPA,X - compare target value with existing value
27 02 ; BEQ COMPLETE - if value is already correct.
20 02 ; BRA ERASE - if value not yet programmed
; COMPLETE:
33 ; PULB - remove retry counter from stack
39 ; RTS
; DIFF:
; SEE IF ANY BITS ARE ACTUALLY GOING TO BE SET HIGH.
; IF NOT, WE DO NOT HAVE TO ERASE (AVOID 10MS DELAY)
36 ; PSHA
43 ; COMA - NOT A
A4 00 ; ANDA - AND A WITH MEMORY AT X
32 ; PULA
26 04 ; BNE SKIP FF (SKIP ERASE)
; ERASE:
C6 16 ; LDAB 0x16 - program mode ELAT/BYTE/ERASE
8D 0A ; BSR EEPROM_PROG - call program subroutine
; SKIP 0xFF:
; IF WE ARE JUST "PROGRAMMING" AN FF, WE DO NOT NEED TO DO ANYTHING
; AFTER ERASE (AVOID 10MS DELAY)
81 FF ; CMPA 0xFF - see if A = 0xFF
27 04 ; BEQ VERIFY - skip programming if FF
; PROGRAM:
C6 02 ; LDAB 0x02 - program mode ELAT
8D 02 ; BSR EEPROM_PROG - call program subroutine
20 DE ; BRA RETRY LIMIT (VERIFY AGAIN)
; PROGRAM_BYTE(END)
; SUBROUTINE EEPROM_PROG(START) - ACCUMULATOR B = PROGRAMMING MODE.
; LATCH AND SET BYTE
F7 103B ; STAB 0x103B - set eeprom control register from B
A7 00 ; STAA,x - store A (value) at X (location) (write byte)
; SET EPGM (PROGRAM VOLTAGE)
CA 01 ; ORA 0x01 - set EPGM (bit 1) in B
F7 103B ; STAB 0x103B - set eeprom control register from B
; DELAY
3C ; PSHX - save X register
CE 0D06 ; LDX 0xD06 - loop total exec time approx 10ms @ 2mhz clock (6 cycles in loop)
09 ; DEX - x--
26 FD ; BNE REL-3 IF > 0
38 ; PULX - restore X register
; RESET COP (for every 10ms delay)
C6 55 ; LDAB 0x55 ; ARM COP.
F7 103A ; STAB 0x103A (COPRST)
C6 AA ; LDAB 0xAA ; RESET COP
F7 103A ; STAB 0x103A (COPRST)
; COMPLETE
7F 103B ; CLR eeprom control register
39 ; RTS return
; EEPROM_PROG (END)
Bookmarks