we're all wins here, i got my eeprom block write to work (it does erase a byte if it differs, even if they only set bits low, that's the next step, but the code fits in one ALDL message which is just great)
Code:
0.000: flashhack Version 1.2
1.168: COMM::Sent message: F1580370CA7A
1.184: COMM::Recieved reply: F15703FEB7
1.184: CCM Software unlock: NO
1.260: COMM::Sent message: F15803644B05
1.276: COMM::Recieved reply: F157032293
1.277: CCM Hardware unlock: YES
1.277: Entering programming mode on CCM
1.354: COMM::Sent message: F15605B4
1.368: COMM::Recieved reply: F15705AA09
1.368: DEBUG::Executing prepared program CCM_WRITE_NEW on CCM
1.449: COMM::Sent message: F1B906624018CEF49DC601CEFFB0AD0039CE61E6F661E35A2BEBF761E33AA600FE61E43A8D0220E9C60337335A372706A100270220023339C6168D0A81FF2704C6028D0220E5F7103BA700CA01F7103B3CCE0D060926FD38C655F7103AC6AAF7103A7F103B39D4
1.582: COMM::Recieved reply: F15706AA08
1.584: DEBUG::Executed CCM_WRITE_NEW on CCM
1.584: DEBUG::PROGRAMMINGB600[5A]
1.650: COMM::Sent message: F1B80661E07E624C5AB600012BFF8DFFFFFFFF00000000000000000000012BFF8DFFFFFFFF00000000000000000000012BFF8DFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000050000B3
1.786: COMM::Recieved reply: F15706AA08
1.788: DEBUG::PROGRAMMINGB65A[5A]
1.854: COMM::Sent message: F1B80661E07E624C5AB65A000000000000000000000000000000000000000131FFD6FFFFFFFFFFFFFFFFFFFFFFFFFFFF4A9F44DC02D637482D5B34C70467361E1791494631011DA1482E405E391835AF1213040B0000400101010101010101010101010101ED
1.989: COMM::Recieved reply: F15706AA08
1.991: DEBUG::PROGRAMMINGB6B4[5A]
2.057: COMM::Sent message: F1B80661E07E624C5AB6B40101010101010101010101010101010101FF3A020000FE400010000000800020000801804020100804028000080402010000000020000800FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A
2.192: COMM::Recieved reply: F15706AA08
2.194: DEBUG::PROGRAMMINGB70E[5A]
2.260: COMM::Sent message: F1B80661E07E624C5AB70EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
2.588: COMM::Recieved reply: F15706AA08
2.591: DEBUG::PROGRAMMINGB768[5A]
2.667: COMM::Sent message: F1B80661E07E624C5AB768FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5
2.802: COMM::Recieved reply: F15706AA08
2.805: DEBUG::PROGRAMMINGB7C2[3E]
2.875: COMM::Sent message: F19C0661E07E624C3EB7C2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF314731595932325038533531313838373767
2.975: COMM::Recieved reply: F15706AA08
2.977: EEPROM write complete.
2.997: Resetting CCM...
routine:
Code:
COMMAND 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 61E3 OR MUST REALIGN ALL 61E VALUES.
; INPUT: [BLK_SIZE] [OFFSET_16] [DATA....]
CE 61E6 ; LDX address of data
F6 61E3 ; LDAB block size
5A ; DECB block size--
2B EB ; BMI if b<0 goto ALDL_REPLY (operation finsihed)
F7 61E3 ; STAB block size
3A ; ABX - add blk size to address of data
A6 00 ; LDAA,x - A = data at address of data
FE 61E4 ; 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
; ERASE:
C6 16 ; LDAB 0x16 - program mode ELAT/BYTE/ERASE
8D 0A ; BSR EEPROM_PROG - call program subroutine
; SKIP 0xFF:
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 E5 ; BRA VERIFY - loop back to verify
; 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