;Execute erase
ERASES: MOV.W
MOV.W
#H'0000, R6
; Erase-verify fail counter
; Set erase loop count
; Erase-verify fail counter + 1 → R6
;
#H'd,
#1,
#H'e,
R4,
R5
R6
R4
ERASE:
ADDS
MOV.W
MOV.W
MOV.W
BSET
NOP
@TCSR ; Start watchdog timer
R4 ; Set erase loop counter
@FLMCR:8
R5,
#1,
;
Set E bit
LOOPE:
NOP
NOP
NOP
SUBS
MOV.W
BNE
BCLR
MOV.W
MOV.W
#1,
R4,
LOOPE
#1,
#H'A500, R4
R4
R4
;
;
; Wait loop
@FLMCR:8
;
Clear E bit
;
R4,
@TCSR ; Stop watchdog timer
; Execute erase-verify
MOV.W
R0,
#H'b,
#3,
R3
R4H
@FLMCR:8
; Top address of block to be erased
; Set erase-verify loop counter
MOV.B
BSET
;
Set EV bit
LOOPEV: DEC
BNE
R4H
;
LOOPEV
#H'FF,
R1H,
#H'c,
R4H
LOOPDW
@R3+,
#H'FF,
RERASE
R2,
; Wait loop
;
; Dummy write
; Set erase-verify loop counter
EVR2:
MOV.B
MOV.B
MOV.B
R1H
@R3
R4H
LOOPDW: DEC
BNE
;
; Wait loop
; Read
; Read data = H'FF?
; If read data ≠ H'FF, branch to RERASE
; Last address of block?
MOV.B
CMP.B
BNE
CMP.W
BNE
R1H
R1H
R3
EVR2
BRA
OKEND
RERASE: BCLR
SUBS
#3,
#1,
@FLMCR:8
R3
;
Clear EV bit
; Erase-verify address – 1 → R3
BRER:
MOV.W
CMP.W
BNE
#H'0BB8, R4
;
R4,
R6
; Erase-verify executed 3000 times?
; If erase-verify not executed 3000 times, erase again
; If erase-verify executed 3000 times, branch to ABEND2
ERASE
ABEND2
BRA
OKEND:
BCLR
MOV.B
MOV.B
#3,
#H'00,
R6L,
@FLMCR:8
;
Clear EV bit
R6L
;
@EBR*:8
;
Clear EBR*
One block erased
ABEND2: Erase error
401