aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/avr8/words/store-e.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/avr8/words/store-e.asm
parente0d6784e89dba33226c0edb815bb974486fa7c48 (diff)
Add AmForth
Diffstat (limited to 'amforth-6.5/avr8/words/store-e.asm')
-rw-r--r--amforth-6.5/avr8/words/store-e.asm66
1 files changed, 66 insertions, 0 deletions
diff --git a/amforth-6.5/avr8/words/store-e.asm b/amforth-6.5/avr8/words/store-e.asm
new file mode 100644
index 0000000..45fff2a
--- /dev/null
+++ b/amforth-6.5/avr8/words/store-e.asm
@@ -0,0 +1,66 @@
+; ( n e-addr -- )
+; Memory
+; write n (2bytes) to eeprom address
+VE_STOREE:
+ .dw $ff02
+ .db "!e"
+ .dw VE_HEAD
+ .set VE_HEAD = VE_STOREE
+XT_STOREE:
+ .dw PFA_STOREE
+PFA_STOREE:
+.if WANT_UNIFIED == 1
+ ldi zh, high(EEPROMEND)
+ ldi zl, low(EEPROMEND)
+ cp tosl, zl
+ cpc tosh, zh
+ brlt PFA_STOREE0
+ brbs 1, PFA_STOREE0
+ rjmp PFA_STOREE_OTHER
+.endif
+PFA_STOREE0:
+ movw zl, tosl
+ loadtos
+ in_ temp2, SREG
+ cli
+ rcall PFA_FETCHE2
+ in_ temp0, EEDR
+ cp temp0,tosl
+ breq PFA_STOREE3
+ rcall PFA_STOREE1
+PFA_STOREE3:
+ adiw zl,1
+ rcall PFA_FETCHE2
+ in_ temp0, EEDR
+ cp temp0,tosh
+ breq PFA_STOREE4
+ mov tosl, tosh
+ rcall PFA_STOREE1
+PFA_STOREE4:
+ out_ SREG, temp2
+ loadtos
+ jmp_ DO_NEXT
+
+PFA_STOREE1:
+ sbic EECR, EEPE
+ rjmp PFA_STOREE1
+
+PFA_STOREE2: ; estore_wait_low_spm:
+ in_ temp0, SPMCSR
+ sbrc temp0,SPMEN
+ rjmp PFA_STOREE2
+
+ out_ EEARH,zh
+ out_ EEARL,zl
+ out_ EEDR, tosl
+ sbi EECR,EEMPE
+ sbi EECR,EEPE
+
+ ret
+.if WANT_UNIFIED == 1
+PFA_STOREE_OTHER:
+ adiw zl, 1
+ sub tosl, zl
+ sbc tosh, zh
+ jmp_ PFA_STOREI
+.endif