aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/avr8/lib/ram.frt
blob: fb37ab7043949797c25601c7ca9ba092ccf3f1c1 (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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
\ RAM - 512kB sram memory, Lubos Pekny, www.forth.cz
\ Library for amforth 3.0, mFC modification
\ ram_init, ram_addr, ram_addr+, ram_read, ram_write, ram_off
\ ram_c@, ram_c!, ram_c@+, ram_c!+

\ V.1.1, 28.07.2009, asm optimalization, amforth30mFC12.zip
\ V.1.0, 20.03.2009, tested on atmega32, amforth30mFC11.zip
\ - used bitnames.frt
\ - used PA0-7, PB0-2, PC2-7

hex

forth
<bit> definitions  \ into vocabulary <bit>

3B constant PORTA  \ ATmega32
\ 38 constant PORTB
\ 35 constant PORTC


forth
<ram> definitions  \ into vocabulary <ram>

<bit>
PORTC 02 portpin: ram_WRL      \ PC.2 set low 8b addr
PORTC 03 portpin: ram_WRH      \ PC.3 set high 8b addr
PORTC 04 portpin: ram_INC      \ PC.4 increment addr
PORTC 05 portpin: ram_WR       \ PC.5 write to sram
PORTC 06 portpin: ram_OE       \ PC.6 output enable
PORTC 07 portpin: ram_CS       \ PC.7 chip select
PORTA constant ram_DATA        \ PA data 8b, in/out
: ram_PAGE <bit> 07 PORTB ;    \ PB.0-2 out
: ram_CTRL <bit> FC PORTC ;    \ PC.2-7 out

  \ define macros
: ram_din,
    assembler
    R16 0 ldi,
    ram_DATA 1- R16 sts, ;

: ram_dout,
    assembler
    R16 FF ldi,
    ram_DATA 1- R16 sts, ;


  \ data port direction - input
code ram_din ( -- )
    ram_din,
end-code


  \ data port direction - output
code ram_dout ( -- )
    ram_dout,
end-code


  \ set I/O
: ram_init ( -- )
    <bit>
    -jtag                      \ port C i/o
    ram_din                    \ port in
    ram_PAGE pin_output        \ out
    ram_CTRL pin_output        \ out
    ram_PAGE high              \ last page
    ram_CTRL high ;            \ sram disabled


  \ set low 8b addr
code ram_addrl ( c -- )
    ram_DATA TOSL sts,         \ data
    loadtos,                   \ delete c
    <bit>
    ram_WRL low,
    ram_WRL high,              \ set counter
end-code


  \ set high 8b addr
code ram_addrh ( c -- )
    ram_DATA TOSL sts,         \ data
    loadtos,                   \ delete c
    <bit>
    ram_WRH low,
    ram_WRH high,              \ set counter
end-code


  \ set addr, sram off, port input
: ram_addr ( addr page -- )
    <bit>
    ram_CS high                \ sram disabled
    ram_PAGE pin!              \ set page
    ram_dout                   \ port out
    dup ram_addrl              \ addr low
    ><  ram_addrh              \ addr high
    ram_din ;                  \ port in


  \ increment addr
code ram_addr+ ( -- )
    <bit>
    ram_INC low,
    ram_INC high,              \ increment addr
end-code


  \ set pins for read from sram
code ram_read ( -- )
    <bit>
    ram_din,                   \ port in
    ram_OE low,
    ram_CS low,                \ out and chip enabled
end-code


  \ set pins for write to sram
code ram_write ( -- )
    <bit>
    ram_OE high,
    ram_CS low,                \ chip enabled
    ram_dout,                  \ port out
end-code


  \ set pins for disable sram
code ram_off ( -- )
    <bit>
    ram_CS high,
    ram_OE high,               \ sram disabled
    ram_din,                   \ port in
end-code


  \ write pulse
code ram_clk ( -- )
    <bit>
    ram_WR low,
    ram_WR high,               \ write to sram
end-code


  \ read from sram
: ram_c@ ( -- c )
    ram_read                   \ sram enabled, out
    [ ram_DATA 1- 1- ]         \ convert to literal
    literal c@                 \ read byte from sram
    ram_off ;


  \ write to sram
: ram_c! ( c -- )
    ram_write                  \ sram enabled, in
    ram_DATA c!                \ write byte to sram
    ram_clk                    \ write pulse
    ram_off ;


  \ read from sram, increment addr, page 64kB
  \ use ram_read  ram_c@+ ....  ram_off
code ram_c@+ ( -- c )
  \ ram_DATA 1- 1- c@
  savetos,                 \ add item
  TOSL ram_DATA 1- 1- lds, \ port -> tosl
  TOSH 0 ldi,              \ 0 -> tosh

  \ ram_addr+
  ram_INC <bit> ma2pbi     \ mask addr -- port bit
  over over                \ 2dup
  assembler
  cbi, nop, sbi,           \ pulse INC
end-code


  \ write to sram, increment addr, page 64kB
  \ use ram_write  ram_c!+ ....  ram_off
code ram_c!+ ( c -- )
  \ ram_DATA c!
  ram_DATA TOSL sts,       \ c!, tosl -> port
  loadtos,                 \ delete item

  \ ram_clk
  ram_WR <bit> ma2pbi      \ mask addr -- port bit
  over over                \ 2dup
  assembler
  cbi, nop, sbi,           \ pulse WR

  \ ram_addr+
  ram_INC <bit> ma2pbi     \ mask addr -- port bit
  over over                \ 2dup
  assembler
  cbi, nop, sbi,           \ pulse INC 
end-code


\ sptx Stop transmit

\ ----- Test -----
forth
<ram>
ram_init
13 3 0 ram_addr ram_c!  \ 13 write at addr 0003, page 0
14 4 0 ram_addr ram_c!  \ 14 write at addr 0004, page 0

0 0 ram_addr            \ set addr to 0:0000
ram_write               \ mode write
31 ram_c!+
32 ram_c!+
33 ram_c!+              \ write 31,32,33 from addr 0:0000

0 0 ram_addr            \ set addr to 0:0000
ram_read                \ mode read
ram_c@+ .
ram_c@+ .
ram_c@+ .               \ read 31,32,33 from addr 0:0000
ram_c@+ .
ram_c@+ .               \ read 13,14
ram_off

4 0 ram_addr ram_c@ .   \ read 14 at addr 0:0004
2 0 ram_addr ram_c@ .   \ read 33 at addr 0:0002
3 0 ram_addr ram_c@ .   \ read 13 at addr 0:0003

\ end of file