📄 slfprg-abasaz.asm
字号:
BSR GETADDR
JSR EETEST ; go'n'check EEPROM address area
BCS EEERASE
LDHX #ERASE_ALG ; LOAD ERASE ALGORITHM TO RAM
STHX SOURCE
MOV #ERASE_ALG_END-ERASE_ALG,STAT
BRA CPYPRNGORAM ; prepare FLCR & FLBPR address in RAM and JUMP to PRG then!
EEERASE:
LDA #%00010110 ; block erase, EELAT & AUTO bit
LDHX REECR
STA ,X ; EEPROM block erase
LDHX ADRS
STA ,X ; latch address
LDA #%00010111 ; EEPGM on now
LDHX REECR
STA ,X ; EEPROM block erase
WAUTOE:
LDA ,X ; fetch EECR
AND #%00000001 ; mask EEPGM bit
BNE WAUTOE
; A zeroed
STA ,X ; EECTL off completely
JMP SUCC
;*******************************************************************************************
WR_DATA_COM:
BSR GETADDR
BSR READ
STA LEN
STA STAT
LDHX #DAT
WR_DATA_L1:
BSR READ
STA ,X
AIX #1
DBNZ STAT,WR_DATA_L1
; START OF SELF-PROGRAMMING
JSR EETEST ; go'n'check EEPROM address area
BCS WREEP
TSX
STHX STACK ; copy stack for later re-call
WR_BUF:
LDHX #WR_ALG ; LOAD WRITE ALGORITHM TO RAM
STHX SOURCE
MOV #WR_ALG_END-WR_ALG,STAT
BRA CPYPRNGORAM ; copyprepare FLCR & FLBPR address in RAM and JUMP to PRG then!, or do EEPROM pgming!
WREEP:
LDHX #DAT ; prepare addrs'
MOV LEN,POM
EWR_ALG_L1:
LDA ,X
BSR EEWRITE
AIX #1
DBNZ POM,EWR_ALG_L1 ; copy desired block of data
JMP SUCC
RETWR: LDHX STACK
TXS ; restore stack
JMP SUCC
;*******************************************************************************************
CPYPRNGORAM:
TSX
STHX STACKCPY ; copy stack for later re-call
LDHX SOURCE ; LOAD WRITE ALGORITHM TO RAM
TXS
LDHX #PRG
CPY_PRG_L1:
PULA
STA ,X
AIX #1
DBNZ STAT,CPY_PRG_L1
LDHX STACKCPY
TXS ; restore stack
LDHX #$8000
CPHX ADRS ; FLASH1/FLASH2 boundary at $8000
BHI FL2SEL ; if 8000 < ADRS (ie. FLASH1, hi)
LDHX #FL1CR ; ADRS >= $8000
STHX RFLCR
LDHX #FL1BPR
BRA GORAM
FL2SEL:
LDHX #FL2CR ; ADRS < $8000
STHX RFLCR
LDHX #FL2BPR
GORAM: STHX RFLBPR
JMP PRG ; jump to RAM program
;*******************************************************************************************
EETEST:
LDHX ADRS
CPHX #$0600
BLO FLASH ; not eeprom
; ADRS >= $600
CPHX #$0A00
BHS FLASH ; right in the middle
; ADRS < $A00
CPHX #$0800
BLO EE2SEL
LDHX #EE1CR ; ADRS < $800
BRA GORAM2
EE2SEL: LDHX #EE2CR
GORAM2: STHX REECR ; prepare EECR addr into RAM
SEC
RTS ; set carry to indicate EEPROM
FLASH: CLC
RTS ; carry clear for Flash
;*******************************************************************************************
EEWRITE:
PSHH
PSHX
PSHA
LDA #%00000110 ; byte write, EELAT
LDHX REECR
STA ,X ; EEPROM block erase
LDHX ADRS
PULA
STA ,X ; latch address & store data into EEPROM
AIX #1
STHX ADRS
LDA #%00000111 ; EEPGM on now
LDHX REECR
STA ,X ; EEPROM block erase
WAUTOW:
LDA ,X ; fetch EECR
AND #%00000001 ; mask EEPGM bit
BNE WAUTOW
; A zeroed
STA ,X ; EECTL off completely
PULX
PULH
RTS
;*******************************************************************************************
ERASE_ALG:
LDA #%00000010
LDHX RFLCR
STA ,X ; PGM bit on
LDHX RFLBPR
LDA ,X ; dummy read FLBPR
LDHX ADRS ; write anything
STA ,X ; to desired range
D_US #T10US ; wait 10us (tNVS)
LDA #%00001010
LDHX RFLCR
STA ,X ; PGM bit on
D_MS #T1MS ; wait 1ms (tERASE), modifies X!
LDA #%00001000
LDHX RFLCR
STA ,X ; PGM bit on
D_US #T5US ; wait 5us (tNVH)
CLRA
STA ,X ; PGM bit on
D_US #T1US ; wait 1us (tRCV)
JMP SUCC ; finish with ACK
ERASE_ALG_END:
;*******************************************************************************************
WR_ALG:
LDA #%00000001
LDHX RFLCR
STA ,X ; PGM bit on
LDHX RFLBPR
LDA ,X ; dummy read FLBPR
LDHX ADRS ; prepare addrs'
STA ,X ; and write to desired range
D_US #T10US ; wait 10us (tNVS)
LDA #%00001001
LDHX RFLCR
STA ,X ; PGM bit on
D_US #T5US ; wait 5us (tPGS)
LDHX #DAT ; prepare addrs'
TXS
LDHX ADRS
MOV LEN,POM
WR_ALG_L1:
PULA
STA ,X
AIX #1
D_US #T30US ; wait 30us (tPROG)
DBNZ POM,WR_ALG_L1 ; copy desired block of data
LDA #%00001000
LDHX RFLCR
STA ,X ; PGM bit on
D_US #T5US ; wait 5us (tNVH)
CLRA
STA ,X ; PGM bit on
D_US #T1US ; wait 1us (tRCV)
JMP RETWR ; finish with ACK (& restore STACK before)
WR_ALG_END:
;*******************************************************************************************
; SIZE = 60 END /all FLBPR, FLCR and EECR registers are stored in RAM (according to memory bank used)/
;*******************************************************************************************
ELSE IF SIZE = 32
;*******************************************************************************************
ERASE_COM:
BSR GETADDR
LDHX ADRS
CPHX #$0A00
BLO EEERASE
LDHX #ERASE_ALG ; LOAD ERASE ALGORITHM TO RAM
STHX SOURCE
MOV #ERASE_ALG_END-ERASE_ALG,STAT
BRA CPYPRNGORAM ; prepare FLCR & FLBPR address in RAM and JUMP to PRG then!
EEERASE:
LDA #%00010110 ; block erase, EELAT & AUTO!
STA EE1CR ; EEPROM block erase
LDHX ADRS
STA ,X ; latch address
LDA #%00010111 ; EEPGM on now
STA EE1CR ; EEPROM block erase
WAUTOE: LDA EE1CR
AND #%00000001 ; mask EEPGM bit
BNE WAUTOE
; A is zero now
STA EE1CR ; EECTL off completely
JMP SUCC
;*******************************************************************************************
WR_DATA_COM:
BSR GETADDR
BSR READ
STA LEN
STA STAT
LDHX #DAT
WR_DATA_L1:
BSR READ
STA ,X
AIX #1
DBNZ STAT,WR_DATA_L1
; START OF SELF-PROGRAMMING
LDHX ADRS
CPHX #$0A00
BLO WREEP
TSX
STHX STACK ; copy stack for later re-call
WR_BUF:
LDHX #WR_ALG ; LOAD WRITE ALGORITHM TO RAM
STHX SOURCE
MOV #WR_ALG_END-WR_ALG,STAT
BRA CPYPRNGORAM ; prepare FLCR & FLBPR address in RAM and JUMP to PRG then!
WREEP:
LDHX #DAT ; prepare addrs'
MOV LEN,POM
EWR_ALG_L1:
LDA ,X
BSR EEWRITE
AIX #1
DBNZ POM,EWR_ALG_L1 ; copy desired block of data
JMP SUCC
RETWR: LDHX STACK
TXS ; restore stack
JMP SUCC
;*******************************************************************************************
CPYPRNGORAM:
TSX
STHX STACKCPY ; copy stack for later re-call
LDHX SOURCE ; LOAD WRITE ALGORITHM TO RAM
TXS
LDHX #PRG
CPY_PRG_L1:
PULA
STA ,X
AIX #1
DBNZ STAT,CPY_PRG_L1
LDHX STACKCPY
TXS ; restore stack
JMP PRG ; jump to RAM program
;*******************************************************************************************
EEWRITE:
PSHH
PSHX
PSHA
LDA #%00000110 ; byte write, EELAT & AUTO
STA EE1CR ; EEPROM block erase
LDHX ADRS
PULA
STA ,X ; latch address & store data into EEPROM
AIX #1
STHX ADRS
LDA #%00000111 ; EEPGM on now
STA EE1CR ; EEPROM block erase
WAUTOW: LDA EE1CR
AND #%00000001 ; mask EEPGM bit
BNE WAUTOW
; A is zero now
STA EE1CR ; EECTL off completely
PULX
PULH
RTS
;*******************************************************************************************
ERASE_ALG:
LDA #%00000010
STA FL1CR ; ERASE bit on
LDA FL1BPR ; dummy read FLBPR
LDHX ADRS ; write anything
STA ,X ; to desired range
D_US #T10US ; wait 10us (tNVS)
LDA #%00001010
STA FL1CR ; ERASE bit on, HVEN bit on
D_MS #T1MS ; wait 1ms (tERASE), modifies X!
LDA #%00001000
STA FL1CR ; ERASE bit on, HVEN bit off
D_US #T5US ; wait 5us (tNVH), A zero on exit
STA FL1CR ; ERASE bit off
D_US #T1US ; wait 1us (tRCV)
JMP SUCC ; finish with ACK
ERASE_ALG_END:
;*******************************************************************************************
WR_ALG:
LDA #%00000001
STA FL1CR ; PGM bit on
LDA FL1BPR ; dummy read FLBPR
LDHX ADRS ; prepare addrs'
STA ,X ; and write to desired range
D_US #T10US ; wait 10us (tNVS)
LDA #%00001001
STA FL1CR ; PGM bit on, HVEN bit on
D_US #T5US ; wait 5us (tPGS)
LDHX #DAT ; prepare addrs'
TXS
LDHX ADRS
MOV LEN,POM
WR_ALG_L1:
PULA
STA ,X
AIX #1
D_US #T30US ; wait 30us (tPROG)
DBNZ POM,WR_ALG_L1 ; copy desired block of data
LDA #%00001000
STA FL1CR ; PGM bit on, HVEN bit off
D_US #T5US ; wait 5us (tNVH), A zero on exit
STA FL1CR ; PGM bit off
D_US #T1US ; wait 1us (tRCV)
JMP RETWR ; finish with ACK (& restore STACK before)
WR_ALG_END:
;*******************************************************************************************
; SIZE = 32 END /all FLBPR, FLCR and EECR registers are fixed to FLASH-1 or EEPROM-1/
;*******************************************************************************************
ENDIF
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -