aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/avr8/lib/assembler.frt
blob: d8ed6b56fc4177528597d378300c8613697beab7 (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
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
\ AvrAsm - assembler Atmega chips, Lubos Pekny, www.forth.cz
\ Library for amforth 3.0 mFC 1.0

\ V.1.1v, 29.01.2009, add vocabulary only

\ V.1.1, 15.05.2008, tested on atmega32, amforth 2.7
\ - change reg tosl,tosh in Test AvrAsm (loadtos, savetos)
\ - change <label to <labelr
\ - vector of labels, 20 bytes in RAM, example

\ V.1.0, 07.02.2008, tested on atmega168, amforth 2.6
\ Size 3554B (opcode: 2980B, labels: 158B, constants Rx: 416B)

hex

vocabulary assembler
only forth also assembler definitions  \ vocabulary

  \ Store src to dest thru mask, FF00 0551 0333 mask! u. FD11
: mask! ( dest1 src mask -- dest2 )
    rot over invert and rot rot and or ; \ dest1&!mask src&mask or


  \ Operands Rd,Rr
: Rd,Rr,    ( Rd Rr opcode mask -- xxxz.xxrd.dddd.rrrr )
    >r >r                              \ -- Rd Rr | -- mask opcode 
    1F and dup 5 lshift or 20F and     \ -- Rd r00000rrrr
    swap 4 lshift 1F0 and              \ -- rr 0ddddd0000
    or r> r> mask!                     \ -- ddrr opcode mask mask!
    dup FC07 and 9000 = if EFFF and then , ;  \ if Z or Y then z=0 


  \ Operand Rd
: Rd,       ( Rd opcode mask -- xxxx.xxxd.dddd.xxxx )
    >r >r                              \ -- Rd | -- mask opcode 
    4 lshift 1F0 and                   \ -- 0ddddd0000
    r> r> mask! , ;                    \ dd opcode mask mask! to flash


  \ Operands Rd,constant 8bit
: Rd,k,     ( Rd k8 opcode mask -- xxxx.kkkk.dddd.kkkk )
    >r >r                              \ -- Rd k8 | -- mask opcode
    FF and dup 4 lshift or F0F and     \ -- Rd kkkk0000kkkk
    swap 4 lshift F0 and               \ -- kk dddd0000
    or r> r> mask! , ;                 \ kkdd opcode mask mask! to flash


  \ Operands Rd,Rr,constant 6bit
: Rd,Rr+q,  ( Rd Rr k6 opcode mask -- xxkx.kkxd.dddd.rkkk )
    >r >r                              \ -- Rd Rr k6 | -- mask opcode
    3F and dup 7 lshift                \ -- Rd Rr k6 xkkkkkkxxxxxxx
    dup 1000 and 1 lshift or or 2C07 and  \ -- Rd Rr kxkkxxxxxxxkkk
    rot 4 lshift 1F0 and               \ -- Rr kk ddddd0000
    or swap 8 and                      \ -- kkdd rxxx
    or r> r> mask! , ;              \ kkddrr opcode mask mask! to flash


  \ Operands Rw pair,constant 6bit
: Rw,k,     ( Rw k6 opcode mask -- xxxx.xxxx.kkww.kkkk )
    >r >r                              \ -- Rw k6 | -- mask opcode
    3F and dup 2 lshift C0 and         \ -- Rw k6 kk000000
    swap F and or                      \ -- Rw kk00kkkk
    swap 4 lshift 30 and               \ -- kk ww0000
    or r> r> mask! , ;                 \ kkww opcode mask mask! to flash


  \ Operands P-port,bit
: P,b,      ( P b opcode mask -- xxxx.xxxx.PPPP.Pbbb )
    >r >r                              \ -- P b | -- mask opcode
    7 and swap 3 lshift                \ -- 0bbb PPPPP000
    or r> r> mask! , ;                 \ PPbb opcode mask mask! to flash


  \ Operands Rd,P-port
: Rd,P,     ( Rd P opcode mask -- xxxx.xPPd.dddd.PPPP )
    >r >r                              \ -- Rd P | -- mask opcode 
    3F and dup 5 lshift or 60F and     \ -- Rd PP00000PPPP
    swap 4 lshift 1F0 and              \ -- PP 00ddddd0000
    or r> r> mask! , ;                 \ ddPP opcode mask mask! to flash


  \ Operand k16 k6
: k22,      ( k16 k6 opcode mask -- k16 xxxx.xxxk.kkkk.xxxk )
    >r >r                              \ -- k16 k6 | -- mask opcode 
    dup 1 and swap 3 lshift            \ -- 000k kkkkkk000
    or r> r> mask! ,  , ;              \ k16 kk opcode mask mask! to flash


00 constant Z
01 constant Z+
02 constant -Z
08 constant Y
09 constant Y+
0A constant -Y
0C constant X
0D constant X+
0E constant -X


: movw,   1 rshift swap        \ R0:1,R2:3,R4:5,..R30:31
          1 rshift swap        \ 0 2 movw, R0:1<--R2:3
          0100 FF00  Rd,Rr, ;  ( Rd Rr -- )
: mul,    9C00 FC00  Rd,Rr, ;  \ 2 3 mul,
: muls,   0200 FF00  Rd,Rr, ;
: mulsu,  0300 FF88  Rd,Rr, ;
: fmul,   0308 FF88  Rd,Rr, ;
: fmuls,  0380 FF88  Rd,Rr, ;
: fmulsu, 0388 FF88  Rd,Rr, ;
: cpc,    0400 FC00  Rd,Rr, ;
: sbc,    0800 FC00  Rd,Rr, ;
: add,    0C00 FC00  Rd,Rr, ;
: cpse,   1000 FC00  Rd,Rr, ;
: cp,     1400 FC00  Rd,Rr, ;
: sub,    1800 FC00  Rd,Rr, ;
: adc,    1C00 FC00  Rd,Rr, ;
: and,    2000 FC00  Rd,Rr, ;
: eor,    2400 FC00  Rd,Rr, ;
: or,     2800 FC00  Rd,Rr, ;
: mov,    2C00 FC00  Rd,Rr, ;  \ 2 3 mov,  R2<--R3

: cpi,    3000 F000  Rd,k,  ;  ( Rd k8 -- )
: sbci,   4000 F000  Rd,k,  ;
: subi,   5000 F000  Rd,k,  ;
: ori,    6000 F000  Rd,k,  ;
: sbr,    ori, ;
: andi,   7000 F000  Rd,k,  ;
: cbr,    invert andi, ;
: ldi,    E000 F000  Rd,k,  ;  \ 2 FF ldi,  R2<--#FF 
 
: ldd,    8000 D200  Rd,Rr+q, ; ( Rd Rr q -- ) \ Rr={Z+,Y+}, 2 Y+ 3F ldd,
: std,    rot rot
          8200 D200  Rd,Rr+q, ; ( Rd q Rr -- ) \ Rd={Z+,Y+}, Y+ 3F 2 std,

: ld,     9000 FE00  Rd,Rr, ;  ( Rd Rr -- ) \ Rr={Z+,-Z,Y+,-Y,X+,-X,X,Y,Z}
: lds,    swap
          9000 FE0F  Rd, ,  ;  ( Rd k16 -- )
: lpm_,   9004 FE0E  Rd,Rr, ;  ( Rd Rr -- ) \ Rr={Z,Z+}, 2 Z+ lpm_
: elpm_,  9006 FE0E  Rd,Rr, ;  ( Rd Rr -- ) \ Rr={Z,Z+}
: st,     swap
          9200 FE00  Rd,Rr, ;  ( Rd Rr -- ) \ Rd={Z+,-Z,Y+,-Y,X+,-X,X,Y,Z}
: sts,    9200 FE0F  Rd, ,  ;  ( k16 Rd -- ) \ FFFF 2 sts, adr(FFFF)<--R2

: lsl,    dup add, ;           ( Rd -- )
: rol,    dup adc, ;
: tst,    dup and, ; 
: clr,    dup eor, ;
: ser,    FF  ldi, ;

: pop,    900F FE0F  Rd, ;     ( Rd -- ) \ 2 pop,
: push,   920F FE0F  Rd, ;
: com,    9400 FE0F  Rd, ;
: neg,    9401 FE0F  Rd, ;
: swap,   9402 FE0F  Rd, ;
: inc,    9403 FE0F  Rd, ; 
: asr,    9405 FE0F  Rd, ;
: lsr,    9406 FE0F  Rd, ;
: ror,    9407 FE0F  Rd, ;
: bset,   9408 FF8F  Rd, ;
: bclr,   9488 FF8F  Rd, ;
: dec,    940A FE0F  Rd, ;

: nop,    0000 , ;             ( -- )
: ret,    9508 , ;
: reti,   9518 , ;
: sleep,  9588 , ;
: break,  9598 , ;
: wdr,    95A8 , ;
: lpm,    95C8 , ;
: elpm,   95D8 , ;
: spm,    95E8 , ;
: espm,   95F8 , ;
: ijmp,   9409 , ;
: eijmp,  9419 , ;
: icall,  9509 , ;
: eicall, 9519 , ;

: clc,    9488 , ;
: clh,    94D8 , ;
: cli,    94F8 , ;
: cln,    94A8 , ;
: cls,    94C8 , ;
: clt,    94E8 , ;
: clv,    94B8 , ;
: clz,    9498 , ;
: sec,    9408 , ;
: seh,    9458 , ;
: sei,    9478 , ;
: sen,    9428 , ;
: ses,    9448 , ;
: set,    9468 , ;
: sev,    9438 , ;
: sez,    9418 , ;

: adiw,   9600 FF00  Rw,k, ;   ( Rw k6 -- ) \ 3 3F adiw, ZLH=ZLH+#3F
: sbiw,   9700 FF00  Rw,k, ;
: cbi,    9800 FF00   P,b, ;   ( P b -- )
: sbic,   9900 FF00   P,b, ;
: sbi,    9A00 FF00   P,b, ;
: sbis,   9B00 FF00   P,b, ;

: in,     B000 F800  Rd,P, ;   ( Rd P -- )
: out,    swap
          B800 F800  Rd,P, ;   ( P Rr -- )

: bld,    F800 FE08  Rd,Rr, ;  ( Rd b -- )
: bst,    FA00 FE08  Rd,Rr, ;
: sbrc,   FC00 FE08  Rd,Rr, ;
: sbrs,   FE00 FE08  Rd,Rr, ;

: jmp,    940C FE0E   k22, ;   ( k16 k6 -- ) \ k6=0 for 16b addr
: call,   940E FE0E   k22, ;
: rjmp,   C000 F000  mask! , ; ( k12 -- )
: rcall,  D000 F000  mask! , ;

: brbc,   F400 FC00   P,b, ;   ( k7 b -- )
: brbs,   F000 FC00   P,b, ;
: brcc,   0 brbc, ;            ( k7 )
: brcs,   0 brbs, ;
: brsh,   0 brbc, ;
: brlo,   0 brbs, ;
: brne,   1 brbc, ;
: breq,   1 brbs, ;
: brpl,   2 brbc, ;
: brmi,   2 brbs, ;
: brvc,   3 brbc, ;
: brvs,   3 brbs, ;
: brge,   4 brbc, ;
: brlt,   4 brbs, ;
: brhc,   5 brbc, ;
: brhs,   5 brbs, ;
: brtc,   6 brbc, ;
: brts,   6 brbs, ;
: brid,   7 brbc, ;
: brie,   7 brbs, ;


  \ Relative addr, for jump back, <radr brne
: <radr     ( adr -- k )
    dp 1+ - ;


  \ Label for jump back,     label> ......... <radr brne,
: label>    ( -- adr )     \ label> ......... <radr rjmp,
    dp ;                 \ label> ......... 0 jmp,


  \ Addr, for jump forward, adr> brne, adr> 0 jmp,
: adr>     ( -- adr k )
    dp 0 ;


  \ Label for branch forward,  adr> brne, ......... <labelb
: <labelb   ( adr -- )
    dup 1+ dp swap - 
    7F and 3 lshift            \ -- adr k7
    over @i or                 \ -- adr opcode
    swap !i ;                  \ overwrite branch


  \ Label for jump forward,    adr> rjmp, ......... <labelr
: <labelr   ( adr -- )
    dup 1+ dp swap -
    0FFF and                   \ -- adr k12
    over @i or                 \ -- adr opcode
    swap !i ;                  \ overwrite rjmp, rcall


  \ Label for long jump forward,  adr> 0 jmp, ......... <labell
: <labell   ( adr -- )
    1+ dp swap !i ;          \ overwrite k16


00  constant R0
01  constant R1
02  constant R2
03  constant R3
04  constant R4
05  constant R5
06  constant R6
07  constant R7
08  constant R8
09  constant R9
0A  constant R10
0B  constant R11
0C  constant R12
0D  constant R13
0E  constant R14
0F  constant R15
10  constant R16
11  constant R17
12  constant R18
13  constant R19
14  constant R20
15  constant R21
16  constant R22
17  constant R23
18  constant R24
19  constant R25
1A  constant R26
1B  constant R27
1C  constant R28
1D  constant R29
1E  constant R30
1F  constant R31
1A  constant XL
1B  constant XH
1C  constant YL
1D  constant YH
1E  constant ZL
1F  constant ZH
01  constant XH:XL  \ XH:XL 3F adiw, sbiw,
02  constant YH:YL
03  constant ZH:ZL

variable (lbl) 12 allot  \ RAM for 10 labels

  \ store addr to vector of labels
: >lbl ( addr c -- )  \ index c=0..9
    2* (lbl) + ! ;

  \ read addr from vector of labels
: <lbl ( c -- addr )  \ index c=0..9
    2* (lbl) + @ ;

previous definitions