-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmemory_utils.asm
More file actions
321 lines (242 loc) · 6.24 KB
/
Copy pathmemory_utils.asm
File metadata and controls
321 lines (242 loc) · 6.24 KB
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
/*
* memory_utils.asm
* All macros and subroutines that modify memory are defined below.
* Author: GROUPE 91
*/
; Macro pour initialiser un bloc mémoire à une valeur spécifiée, valeur de z modifiée
; Usage: INIT_MEMORY(adresse_debut, taille, valeur)
.macro INIT_MEMORY
ldi loop, @1
ldi r17, @2
ldi zl, low(@0)
ldi zh, high(@0)
init_loop:
st Z+, r17
dec loop
brne init_loop
.endm
; Macro pour load un pixel en mémoire à une adresse (z), valeur de z modifiée de 3
; Usage: LOAD_RGB(Green, Red, Blue)
.macro LOAD_RGB
ldi green, @0
st Z+, green
ldi red, @1
st Z+, red
ldi blue, @2
st Z+, blue
.endm
; Macro pour copier un bloc mémoire à un endroit spécifié, valeur de z modifiée
; Usage: COPY_MEMORY(adresse_du_copié, adresse_du_collé, nbr_pix)
.macro COPY_MEMORY
ldi zl, low(@1)
ldi zh, high(@1)
ldi yl, low(@0)
ldi yh, high(@0)
ldi loop, @2
copy_loop:
rcall copy_rgb
dec loop
brne copy_loop
.endm
; Macro pour add deux bloc mémoire
; Usage: ADD_MEMORY(adresse_du_dest, adresse_du_add)
.macro ADD_MEMORY
; Initialiser pointeurs
ldi zl, low(@0)
ldi zh, high(@0)
ldi yl, low(@1)
ldi yh, high(@1)
ldi loop, 64*3
loop_add:
ld r16, Z+
ld r17, Y+
add r16, r17
sbiw zl, 1
st z+, r16
dec loop
brne loop_add
.endm
; Macro pour shift à droit un carré mémoire de 8*9 pixel (1 pixel = 3 octet)
; valeur de z,y modifiée
; Usage: MEMORY_SHIFT_RIGHT(adresse_du_right_shift)
.macro MEMORY_SHIFT_RIGHT
ldi zl, low(@0 + 216)
ldi zh, high(@0 + 216)
ldi yl, low(@0 + 213)
ldi yh, high(@0 + 213)
ldi loop2, 9 ; 9 lignes
memory_shift_right_loop:
ldi loop, 21; copie les 3*7 octet des 7 pixel
octet_loop:
ld r16, -Y
st -Z, r16
dec loop
brne octet_loop
ldi loop, 3; met à 0 le nouveau pixel
zero_loop:
ld r16, -Y ;juste pour dec y
ldi r16, 0x00
st -Z, r16
dec loop
brne zero_loop
dec loop2
brne memory_shift_right_loop
.endm
; Macro pour shift à droit un carré mémoire de 8*9 pixel (1 pixel = 3 octet)
; valeur de z,y modifiée
; Usage: MEMORY_SHIFT_LEFT(adresse_du_left_shift)
.macro MEMORY_SHIFT_LEFT
ldi zl, low(@0)
ldi zh, high(@0)
ldi yl, low(@0 + 3)
ldi yh, high(@0 + 3)
ldi loop2, 9 ; 9 lignes
memory_shift_left_loop:
ldi loop, 21; copie les 3*7 octet des 7 pixel
octet_loop:
ld r16, Y+
st Z+, r16
dec loop
brne octet_loop
ldi loop, 3; met à 0 le nouveau pixel
zero_loop:
ld r16, Y+ ;juste pour inc y
ldi r16, 0x00
st Z+, r16
dec loop
brne zero_loop
dec loop2
brne memory_shift_left_loop
.endm
; Macro pour decendre un carré mémoire de 8*9 pixel (1 pixel = 3 octet) de une ligne
; Usage: MEMORY_SHIFT_DOWN(adresse_du_down_shift,nbr de lingnes(registre))
.macro MEMORY_SHIFT_DOWN
mov c0,loop
mov w, @1
ldi loop,24
mul loop, w
mov loop,r0
;ldi loop, 216
mov r24, loop
ldi xl, low(@0)
ldi xh, high(@0)
ADDX loop; met à l'adresse max
subi loop, 24
mov r23, loop
;ADDI loop, 24
ldi yl, low(@0)
ldi yh, high(@0)
ADDY loop; met à l'adresse de 'avant dernière ligne
shift_down_loop:
ld r16, -Y
st -x, r16
dec loop
brne shift_down_loop
; Mettre les 24 premiers octets à zéro
ldi loop, 24
ldi xl, low(@0)
ldi xh, high(@0)
ldi r16, 0
zero_fill:
st x+, r16
dec loop
brne zero_fill
mov loop, c0
.endm
; Macro pour charger un carré (2*2)pixel dans les deux lignes de 8 pixel à l'adresse donné
; Usage: MEMORY_ADD_SQUARE(adresse_du_carré)
.macro MEMORY_ADD_SQUARE
INIT_MEMORY @0, 8*2*3, 0x00
; LED 4 et 5 de la 1ère ligne
ldi zl, low(@0 + 9)
ldi zh, high(@0 + 9)
ldi loop, 2
call loop_square
; LED 4 et 5 de la 2ème ligne
ldi zl, low(@0 + 33)
ldi zh, high(@0 + 33)
ldi loop, 2
call loop_square; call car la macro peut être très loin
.endm
;boucle pour mettre une barre de 2 du carré
loop_square:
LOAD_RGB 0x01, 0x0F, 0x01
dec loop
brne loop_square
ret
; Macro pour charger un Z horizontal (2*2)pixel dans les deux lignes de 8 pixel à l'adresse donné
; Usage: MEMORY_ADD_Z_H(adresse_du_z)
.macro MEMORY_ADD_Z_H
INIT_MEMORY @0, 8*2*3, 0x00
; LED 4 et 5 de la 1ère ligne
ldi zl, low(@0 + 9)
ldi zh, high(@0 + 9)
ldi loop, 2
call loop_z_h
; LED 3 et 4 de la 2ème ligne
ldi zl, low(@0 + 33)
ldi zh, high(@0 + 33)
ldi loop, 1
call loop_z_h
.endm
;boucle pour mettre une barre de 2 du carré
loop_z_h:
LOAD_RGB 0x0F, 0x01, 0x01
dec loop
brne loop_z_h
ret
; Macro pour charger une barre verticale dans les trois lignes de 8 pixel à l'adresse donné
; Usage: MEMORY_ADD_BARRE(adresse_du_z)
.macro MEMORY_ADD_BARRE
INIT_MEMORY @0, 8*3*3, 0x00
; LED 4 de la 1ère ligne
ldi zl, low(@0 + 9)
ldi zh, high(@0 + 9)
LOAD_RGB 0x01, 0x0F, 0x0F
; LED 4 de la 2ème ligne
ldi zl, low(@0 + 33)
ldi zh, high(@0 + 33)
LOAD_RGB 0x01, 0x0F, 0x0F
; LED 4 de la 3ème ligne
ldi zl, low(@0 + 57)
ldi zh, high(@0 + 57)
LOAD_RGB 0x01, 0x0F, 0x0F
.endm
.macro MEMORY_ADD_T
INIT_MEMORY @0, 8*2*3, 0x00
; LED 4, 5 et 6 de la 1ère ligne
ldi zl, low(@0 + 9)
ldi zh, high(@0 + 9)
ldi loop, 3
call loop_t
; LED 5 de la 2ème ligne
ldi zl, low(@0 + 36)
ldi zh, high(@0 + 36)
LOAD_RGB 0x01, 0x01, 0x0F
.endm
loop_t:
LOAD_RGB 0x01, 0x01, 0x0F
dec loop
brne loop_t
ret
;Sous routine pour copier le RGB pointer par y à l'endroit pointé par z
copy_rgb:
ld green, y+
ld red, y+
ld blue, y+
st z+, green
st z+, red
st z+, blue
ret
; Macro pour set un flag en memoire data
; Usage: SET_COLL_FLAG(adresse_du_flag)
.macro SET_FLAG
ldi r16, 1
sts @0, r16
.endm
; Macro pour clear un flag en memoire data
; Usage: CLR_FLAG(adresse_du_flag)
.macro CLR_FLAG
ldi r16, 0
sts @0, r16
.endm