aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/avr8/words/store-e.asm
blob: 45fff2a05d3d258edec30804e2eb012ad85bbd3e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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