aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/msp430/drivers/flash/words/flerase.asm
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-08-19 12:15:28 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-08-19 12:15:28 +0200
commit67d25d837ac55f28a366c0a3b262e439a6e75fc3 (patch)
treedf7715c7724c5935ab87c807f3b8b4ef529315e3 /amforth-6.5/msp430/drivers/flash/words/flerase.asm
parente0d6784e89dba33226c0edb815bb974486fa7c48 (diff)
Add AmForth
Diffstat (limited to 'amforth-6.5/msp430/drivers/flash/words/flerase.asm')
-rw-r--r--amforth-6.5/msp430/drivers/flash/words/flerase.asm39
1 files changed, 39 insertions, 0 deletions
diff --git a/amforth-6.5/msp430/drivers/flash/words/flerase.asm b/amforth-6.5/msp430/drivers/flash/words/flerase.asm
new file mode 100644
index 0000000..e8cf97e
--- /dev/null
+++ b/amforth-6.5/msp430/drivers/flash/words/flerase.asm
@@ -0,0 +1,39 @@
+;Z FLERASE a-addr n --
+ CODEHEADER(XT_FLERASE,7,"flerase")
+ MOV @PSP+,W ; get address in W
+ ADD W,TOS ; TOS=end adrs (first unerased adrs)
+FLE_1:
+ CMP TOS,W ; adr-end
+ JC FLE_X ; if no borrow, adr>=end, do not erase
+ ; is it within Main flash?
+ CMP #FLASHSTART,W
+ JNC FLE_INFO ; if borrow, adr<start, check if Info
+ CMP #FLASHEND+1,W
+ JNC FLE_OK ; if no borrow, adr>end, check if Info
+FLE_INFO: ; is it within Info flash?
+ CMP #INFOSTART,W
+ JNC FLE_X ; if borrow, adr<start, do not erase
+ CMP #INFOEND+1,W
+ JC FLE_X ; if no borrow, adr>end, do not erase
+FLE_OK: ; Address is either in Main flash, or in Info flash.
+ ; Segment Erase from flash.
+ ; Assumes ACCVIE = NMIIE = OFIE = 0, watchdog disabled.
+ ; Per section 5.3.2 of MSP430 Family User's Guide
+ DINT ; Disable interrupts
+ MOV #FWKEY,&FCTL3 ; Clear LOCK
+ MOV #FWKEY+ERASE,&FCTL1 ; Enable segment erase
+ MOV #-1,0(W) ; Dummy write in segment to erase
+ MOV #FWKEY,&FCTL1 ; Done. Clear erase command.
+ MOV #FWKEY+LOCK,&FCTL3 ; Done, set LOCK
+ EINT ; Enable interrupts
+ ; Advance flash pointer by 512 bytes or 128 bytes
+ ; is it within Main flash?
+ CMP #FLASHSTART,W
+ JNC FL_INFO ; if borrow, adr<start, must be Info
+ CMP #FLASHEND+1,W
+ JC FL_INFO ; if no borrow, adr>end, must be Info
+ ADD #(MAINSEG-INFOSEG),W
+FL_INFO: ADD #INFOSEG,W
+ JMP FLE_1 ; continue till past end or outside limits
+FLE_X: MOV @PSP+,TOS
+ NEXT