... | ... |
@@ -11,7 +11,7 @@ |
11 | 11 |
|0140 ;Keys { key 1 } |
12 | 12 |
|0150 ;Mouse { x 2 y 2 state 1 chord 1 } |
13 | 13 |
|0160 ;File { pad 8 name 2 length 2 load 2 save 2 } |
14 |
-|0180 ;Audio { wave 2 envelope 2 pad 4 volume 1 pitch 1 play 1 value 2 delay 2 finish 1 } |
|
14 |
+|0130 ;Audio { wave 2 envelope 2 pad 4 volume 1 pitch 1 play 1 value 2 delay 2 finish 1 } |
|
15 | 15 |
|01a0 ;DateTime { year 2 month 1 day 1 hour 1 minute 1 second 1 dotw 1 doty 2 isdst 1 refresh 1 } |
16 | 16 |
|01F0 ;System { pad 8 r 2 g 2 b 2 } |
17 | 17 |
|
... | ... |
@@ -33,7 +33,7 @@ |
33 | 33 |
|0150 ;Keys { vector 2 key 1 } |
34 | 34 |
|0160 ;Mouse { vector 2 x 2 y 2 state 1 chord 1 } |
35 | 35 |
|0170 ;File { pad 8 name 2 length 2 load 2 save 2 } |
36 |
-|0180 ;Audio { wave 2 envelope 2 pad 4 volume 1 pitch 1 play 1 value 2 delay 2 finish 1 } |
|
36 |
+|0130 ;Audio { wave 2 envelope 2 pad 4 volume 1 pitch 1 play 1 value 2 delay 2 finish 1 } |
|
37 | 37 |
|
38 | 38 |
( vectors ) |
39 | 39 |
|
... | ... |
@@ -15,6 +15,7 @@ |
15 | 15 |
;label { x 2 y 2 addr 2 } |
16 | 16 |
;slider { x1 2 y 2 x2 2 pos 2 } |
17 | 17 |
;selection { byte 1 } |
18 |
+;addr { short 2 } |
|
18 | 19 |
;theme { |
19 | 20 |
r1 1 r2 1 r3 1 r4 1 |
20 | 21 |
g1 1 g2 1 g3 1 g4 1 |
... | ... |
@@ -32,7 +33,7 @@ |
32 | 33 |
( theme ) #127f =System.r #34e7 =System.g #56c4 =System.b |
33 | 34 |
( vectors ) ,on-mouse =Mouse.vector |
34 | 35 |
|
35 |
- #00a0 =window.w |
|
36 |
+ #00b0 =window.w |
|
36 | 37 |
#0050 =window.h |
37 | 38 |
|
38 | 39 |
( center window ) |
... | ... |
@@ -64,19 +65,19 @@ BRK |
64 | 65 |
~Mouse.y ~window.y1 SUB2 STEP8 |
65 | 66 |
|
66 | 67 |
DUP2 #0010 NEQ2 ^$no-touch-red JNZ |
67 |
- ~Mouse.x ~window.x1 #0050 ADD2 LTH2 ^$no-touch-red JNZ |
|
68 |
- ~Mouse.x ~window.x1 #008c ADD2 GTH2 ^$no-touch-red JNZ |
|
69 |
- ( get new value ) ~Mouse.x ~window.x1 SUB2 #0050 SUB2 #0004 DIV2 S2B ,theme.r1 #00 ~selection ADD2 POK2 |
|
68 |
+ ~Mouse.x ~window.x1 #0060 ADD2 LTH2 ^$no-touch-red JNZ |
|
69 |
+ ~Mouse.x ~window.x1 #009c ADD2 GTH2 ^$no-touch-red JNZ |
|
70 |
+ ( get new value ) ~Mouse.x ~window.x1 SUB2 #0060 SUB2 #0004 DIV2 S2B ,theme.r1 #00 ~selection ADD2 POK2 |
|
70 | 71 |
$no-touch-red |
71 | 72 |
DUP2 #0020 NEQ2 ^$no-touch-green JNZ |
72 |
- ~Mouse.x ~window.x1 #0050 ADD2 LTH2 ^$no-touch-green JNZ |
|
73 |
- ~Mouse.x ~window.x1 #008c ADD2 GTH2 ^$no-touch-green JNZ |
|
74 |
- ( get new value ) ~Mouse.x ~window.x1 SUB2 #0050 SUB2 #0004 DIV2 S2B ,theme.g1 #00 ~selection ADD2 POK2 |
|
73 |
+ ~Mouse.x ~window.x1 #0060 ADD2 LTH2 ^$no-touch-green JNZ |
|
74 |
+ ~Mouse.x ~window.x1 #009c ADD2 GTH2 ^$no-touch-green JNZ |
|
75 |
+ ( get new value ) ~Mouse.x ~window.x1 SUB2 #0060 SUB2 #0004 DIV2 S2B ,theme.g1 #00 ~selection ADD2 POK2 |
|
75 | 76 |
$no-touch-green |
76 | 77 |
DUP2 #0030 NEQ2 ^$no-touch-blue JNZ |
77 |
- ~Mouse.x ~window.x1 #0050 ADD2 LTH2 ^$no-touch-blue JNZ |
|
78 |
- ~Mouse.x ~window.x1 #008c ADD2 GTH2 ^$no-touch-blue JNZ |
|
79 |
- ( get new value ) ~Mouse.x ~window.x1 SUB2 #0050 SUB2 #0004 DIV2 S2B ,theme.b1 #00 ~selection ADD2 POK2 |
|
78 |
+ ~Mouse.x ~window.x1 #0060 ADD2 LTH2 ^$no-touch-blue JNZ |
|
79 |
+ ~Mouse.x ~window.x1 #009c ADD2 GTH2 ^$no-touch-blue JNZ |
|
80 |
+ ( get new value ) ~Mouse.x ~window.x1 SUB2 #0060 SUB2 #0004 DIV2 S2B ,theme.b1 #00 ~selection ADD2 POK2 |
|
80 | 81 |
$no-touch-blue |
81 | 82 |
DUP2 #0040 NEQ2 ^$no-touch-radio JNZ |
82 | 83 |
~Mouse.x ~window.x1 #0050 ADD2 LTH2 ^$no-touch-radio JNZ |
... | ... |
@@ -129,13 +130,54 @@ RTN |
129 | 130 |
POP2 POP2 |
130 | 131 |
|
131 | 132 |
( draw blending modes ) |
132 |
- #0000 =Screen.x #0020 =Screen.y ,icon_icn =Screen.addr |
|
133 |
- #20 #30 |
|
134 |
- $draw-blends |
|
135 |
- ( move ) OVR #00 SWP #0008 MUL2 =Screen.x |
|
133 |
+ ,preview_icn =Screen.addr |
|
134 |
+ #0010 =Screen.y |
|
135 |
+ #00 #08 |
|
136 |
+ $draw-pixel1 |
|
137 |
+ ( move ) OVR #00 SWP #0008 MUL2 #0010 ADD2 =Screen.x |
|
136 | 138 |
( draw ) OVR =Screen.color |
137 | 139 |
( incr ) SWP #01 ADD SWP |
138 |
- DUP2 LTH ^$draw-blends JNZ |
|
140 |
+ DUP2 LTH ^$draw-pixel1 JNZ |
|
141 |
+ POP POP |
|
142 |
+ #0018 =Screen.y |
|
143 |
+ #00 #08 |
|
144 |
+ $draw-pixel2 |
|
145 |
+ ( move ) OVR #00 SWP #0008 MUL2 #0010 ADD2 =Screen.x |
|
146 |
+ ( draw ) OVR #08 ADD =Screen.color |
|
147 |
+ ( incr ) SWP #01 ADD SWP |
|
148 |
+ DUP2 LTH ^$draw-pixel2 JNZ |
|
149 |
+ POP POP |
|
150 |
+ #0020 =Screen.y |
|
151 |
+ #00 #08 |
|
152 |
+ $draw-icn1 |
|
153 |
+ ( move ) OVR #00 SWP #0008 MUL2 #0010 ADD2 =Screen.x |
|
154 |
+ ( draw ) OVR #20 ADD =Screen.color |
|
155 |
+ ( incr ) SWP #01 ADD SWP |
|
156 |
+ DUP2 LTH ^$draw-icn1 JNZ |
|
157 |
+ POP POP |
|
158 |
+ #0028 =Screen.y |
|
159 |
+ #00 #08 |
|
160 |
+ $draw-icn2 |
|
161 |
+ ( move ) OVR #00 SWP #0008 MUL2 #0010 ADD2 =Screen.x |
|
162 |
+ ( draw ) OVR #28 ADD =Screen.color |
|
163 |
+ ( incr ) SWP #01 ADD SWP |
|
164 |
+ DUP2 LTH ^$draw-icn2 JNZ |
|
165 |
+ POP POP |
|
166 |
+ #0030 =Screen.y |
|
167 |
+ #00 #08 |
|
168 |
+ $draw-chr1 |
|
169 |
+ ( move ) OVR #00 SWP #0008 MUL2 #0010 ADD2 =Screen.x |
|
170 |
+ ( draw ) OVR #40 ADD =Screen.color |
|
171 |
+ ( incr ) SWP #01 ADD SWP |
|
172 |
+ DUP2 LTH ^$draw-chr1 JNZ |
|
173 |
+ POP POP |
|
174 |
+ #0038 =Screen.y |
|
175 |
+ #00 #08 |
|
176 |
+ $draw-chr2 |
|
177 |
+ ( move ) OVR #00 SWP #0008 MUL2 #0010 ADD2 =Screen.x |
|
178 |
+ ( draw ) OVR #48 ADD =Screen.color |
|
179 |
+ ( incr ) SWP #01 ADD SWP |
|
180 |
+ DUP2 LTH ^$draw-chr2 JNZ |
|
139 | 181 |
POP POP |
140 | 182 |
|
141 | 183 |
RTN |
... | ... |
@@ -149,12 +191,20 @@ RTN |
149 | 191 |
~window.x1 #0002 SUB2 ~window.y1 #0002 SUB2 ~window.x2 #0002 ADD2 ~window.y2 #0002 ADD2 #01 ,line-rect JSR2 |
150 | 192 |
|
151 | 193 |
~window.x1 #0008 ADD2 ~window.y1 #0010 ADD2 #25 ,red_txt ,draw-label JSR2 |
194 |
+ ~window.x1 #0038 ADD2 ~window.y1 #0010 ADD2 #28 ,System.r ,draw-byte JSR2 |
|
195 |
+ ~window.x1 #0048 ADD2 ~window.y1 #0010 ADD2 #28 ,System.r #0001 ADD2 ,draw-byte JSR2 |
|
196 |
+ |
|
152 | 197 |
~window.x1 #0008 ADD2 ~window.y1 #0020 ADD2 #25 ,green_txt ,draw-label JSR2 |
198 |
+ ~window.x1 #0038 ADD2 ~window.y1 #0020 ADD2 #28 ,System.g ,draw-byte JSR2 |
|
199 |
+ ~window.x1 #0048 ADD2 ~window.y1 #0020 ADD2 #28 ,System.g #0001 ADD2 ,draw-byte JSR2 |
|
200 |
+ |
|
153 | 201 |
~window.x1 #0008 ADD2 ~window.y1 #0030 ADD2 #25 ,blue_txt ,draw-label JSR2 |
202 |
+ ~window.x1 #0038 ADD2 ~window.y1 #0030 ADD2 #28 ,System.b ,draw-byte JSR2 |
|
203 |
+ ~window.x1 #0048 ADD2 ~window.y1 #0030 ADD2 #28 ,System.b #0001 ADD2 ,draw-byte JSR2 |
|
154 | 204 |
|
155 |
- ~window.x1 #0050 ADD2 ~window.y1 #0010 ADD2 ~window.x1 #0080 ADD2 #00 ,theme.r1 ~selection ADD PEK2 #0004 MUL2 #01 ,draw-slider JSR2 |
|
156 |
- ~window.x1 #0050 ADD2 ~window.y1 #0020 ADD2 ~window.x1 #0080 ADD2 #00 ,theme.g1 ~selection ADD PEK2 #0004 MUL2 #01 ,draw-slider JSR2 |
|
157 |
- ~window.x1 #0050 ADD2 ~window.y1 #0030 ADD2 ~window.x1 #0080 ADD2 #00 ,theme.b1 ~selection ADD PEK2 #0004 MUL2 #01 ,draw-slider JSR2 |
|
205 |
+ ~window.x1 #0060 ADD2 ~window.y1 #0010 ADD2 ~window.x1 #0090 ADD2 #00 ,theme.r1 ~selection ADD PEK2 #0004 MUL2 #01 ,draw-slider JSR2 |
|
206 |
+ ~window.x1 #0060 ADD2 ~window.y1 #0020 ADD2 ~window.x1 #0090 ADD2 #00 ,theme.g1 ~selection ADD PEK2 #0004 MUL2 #01 ,draw-slider JSR2 |
|
207 |
+ ~window.x1 #0060 ADD2 ~window.y1 #0030 ADD2 ~window.x1 #0090 ADD2 #00 ,theme.b1 ~selection ADD PEK2 #0004 MUL2 #01 ,draw-slider JSR2 |
|
158 | 208 |
|
159 | 209 |
~window.x1 #0050 ADD2 =Screen.x |
160 | 210 |
~window.y1 #0040 ADD2 =Screen.y |
... | ... |
@@ -178,7 +228,7 @@ RTN |
178 | 228 |
|
179 | 229 |
RTN |
180 | 230 |
|
181 |
-@draw-cursor |
|
231 |
+@draw-cursor ( -- ) |
|
182 | 232 |
|
183 | 233 |
( clear last cursor ) |
184 | 234 |
,clear_icn =Screen.addr |
... | ... |
@@ -193,11 +243,11 @@ RTN |
193 | 243 |
,pointer_icn =Screen.addr |
194 | 244 |
~pointer.x =Screen.x |
195 | 245 |
~pointer.y =Screen.y |
196 |
- #33 =Screen.color |
|
246 |
+ #33 ~Mouse.state #00 NEQ #02 MUL SUB =Screen.color |
|
197 | 247 |
|
198 | 248 |
RTN |
199 | 249 |
|
200 |
-@draw-slider ( x1 y x2 pos color ) |
|
250 |
+@draw-slider ( x1 y x2 pos color -- ) |
|
201 | 251 |
|
202 | 252 |
( load ) =color =slider.pos =slider.x2 =slider.y =slider.x1 |
203 | 253 |
|
... | ... |
@@ -224,7 +274,7 @@ RTN |
224 | 274 |
|
225 | 275 |
RTN |
226 | 276 |
|
227 |
-@fill-rect ( x1 y1 x2 y2 color ) |
|
277 |
+@fill-rect ( x1 y1 x2 y2 color -- ) |
|
228 | 278 |
|
229 | 279 |
( load ) =color =rect.y2 =rect.x2 DUP2 =Screen.y =rect.y1 DUP2 =Screen.x =rect.x1 |
230 | 280 |
$ver |
... | ... |
@@ -238,7 +288,7 @@ RTN |
238 | 288 |
|
239 | 289 |
RTN |
240 | 290 |
|
241 |
-@line-rect ( x1 y1 x2 y2 color ) |
|
291 |
+@line-rect ( x1 y1 x2 y2 color -- ) |
|
242 | 292 |
|
243 | 293 |
( load ) =color =rect.y2 =rect.x2 DUP2 =Screen.y =rect.y1 DUP2 =Screen.x =rect.x1 |
244 | 294 |
$hor |
... | ... |
@@ -255,7 +305,7 @@ RTN |
255 | 305 |
|
256 | 306 |
RTN |
257 | 307 |
|
258 |
-@draw-label ( x y color addr ) |
|
308 |
+@draw-label ( x y color addr -- ) |
|
259 | 309 |
|
260 | 310 |
( load ) =label.addr =color =Screen.y =Screen.x ~label.addr |
261 | 311 |
$loop |
... | ... |
@@ -267,6 +317,19 @@ RTN |
267 | 317 |
|
268 | 318 |
RTN |
269 | 319 |
|
320 |
+@draw-byte ( x y color addr -- ) |
|
321 |
+ |
|
322 |
+ =addr STH |
|
323 |
+ =Screen.y |
|
324 |
+ =Screen.x |
|
325 |
+ ,font_hex #00 ~addr PEK2 #04 SFT #0008 MUL2 ADD2 =Screen.addr |
|
326 |
+ STHr DUP STH =Screen.color |
|
327 |
+ ,font_hex #00 ~addr PEK2 #0f AND #0008 MUL2 ADD2 =Screen.addr |
|
328 |
+ ~Screen.x 8+ =Screen.x |
|
329 |
+ STHr =Screen.color |
|
330 |
+ |
|
331 |
+RTN |
|
332 |
+ |
|
270 | 333 |
@clear_icn [ 0000 0000 0000 0000 ] |
271 | 334 |
@pointer_icn [ 80c0 e0f0 f8e0 1000 ] |
272 | 335 |
@halftone_icn [ aa55 aa55 aa55 aa55 ] |
... | ... |
@@ -274,7 +337,7 @@ RTN |
274 | 337 |
@sliderb_icn [ ffff ffff ffff ffff ] |
275 | 338 |
@sliderc_icn [ fcfe ffff ffff fefc ] |
276 | 339 |
@sliderd_icn [ 003c 7e7e 7e7e 3c00 ] |
277 |
-@icon_icn [ 3c7e e7c3 c3e7 7e3c ] |
|
340 |
+@preview_icn [ 183c 66db db66 3c18 0000 183c 3c18 0000 ] |
|
278 | 341 |
@radio_icns |
279 | 342 |
[ 3c42 8181 8181 423c ] |
280 | 343 |
[ 3c42 99bd bd99 423c ] |
... | ... |
@@ -283,6 +346,18 @@ RTN |
283 | 346 |
@green_txt [ Green 00 ] |
284 | 347 |
@blue_txt [ Blue 00 ] |
285 | 348 |
|
349 |
+@font_hex ( 0-F TODO: should pull from @font instead.. ) |
|
350 |
+[ |
|
351 |
+ 003c 464a 5262 3c00 0018 0808 0808 1c00 |
|
352 |
+ 003c 4202 3c40 7e00 003c 421c 0242 3c00 |
|
353 |
+ 000c 1424 447e 0400 007e 407c 0242 3c00 |
|
354 |
+ 003c 407c 4242 3c00 007e 0204 0810 1000 |
|
355 |
+ 003c 423c 4242 3c00 003c 4242 3e02 3c00 |
|
356 |
+ 003c 4242 7e42 4200 007c 427c 4242 7c00 |
|
357 |
+ 003c 4240 4042 3c00 007c 4242 4242 7c00 |
|
358 |
+ 007e 4078 4040 7e00 007e 4078 4040 4000 |
|
359 |
+] |
|
360 |
+ |
|
286 | 361 |
@font ( spectrum-zx font ) |
287 | 362 |
[ |
288 | 363 |
0000 0000 0000 0000 0000 2400 7e3c 0000 0000 2400 3c42 0000 0000 6c7c 7c38 1000 |
... | ... |
@@ -215,10 +215,11 @@ screen_poke(Uxn *u, Uint16 ptr, Uint8 b0, Uint8 b1) |
215 | 215 |
Uint16 y = mempeek16(u, ptr + 10); |
216 | 216 |
Uint8 *addr = &u->ram.dat[mempeek16(u, ptr + 12)]; |
217 | 217 |
Uint8 *layer = (b1 >> 4 & 0xf) % 2 ? ppu.fg : ppu.bg; |
218 |
- if((b1 >> 4 & 0xf) / 2) |
|
219 |
- putsprite(&ppu, layer, x, y, addr, b1 & 0xf); |
|
220 |
- else |
|
221 |
- putpixel(&ppu, layer, x, y, b1 & 0xf); |
|
218 |
+ switch((b1 >> 4) / 2) { |
|
219 |
+ case 0: putpixel(&ppu, layer, x, y, b1 & 0x3); break; |
|
220 |
+ case 1: puticn(&ppu, layer, x, y, addr, b1 & 0xf); break; |
|
221 |
+ case 2: putchr(&ppu, layer, x, y, addr, b1 & 0xf); break; |
|
222 |
+ } |
|
222 | 223 |
reqdraw = 1; |
223 | 224 |
} |
224 | 225 |
return b1; |
... | ... |
@@ -384,13 +385,12 @@ main(int argc, char **argv) |
384 | 385 |
devsystem = portuxn(&u, 0x00, "system", system_poke); |
385 | 386 |
portuxn(&u, 0x01, "console", console_poke); |
386 | 387 |
devscreen = portuxn(&u, 0x02, "screen", screen_poke); |
387 |
- portuxn(&u, 0x03, "---", ppnil); |
|
388 |
+ devapu = portuxn(&u, 0x03, "audio", audio_poke); |
|
388 | 389 |
devctrl = portuxn(&u, 0x04, "controller", ppnil); |
389 | 390 |
devkey = portuxn(&u, 0x05, "key", ppnil); |
390 | 391 |
devmouse = portuxn(&u, 0x06, "mouse", ppnil); |
391 | 392 |
portuxn(&u, 0x07, "file", file_poke); |
392 |
- devapu = portuxn(&u, 0x08, "audio", audio_poke); |
|
393 |
- apu.channel_addr = devapu->addr + 0xa; |
|
393 |
+ portuxn(&u, 0x03, "---", ppnil); |
|
394 | 394 |
portuxn(&u, 0x09, "midi", ppnil); |
395 | 395 |
portuxn(&u, 0x0a, "datetime", datetime_poke); |
396 | 396 |
portuxn(&u, 0x0b, "---", ppnil); |
... | ... |
@@ -399,6 +399,8 @@ main(int argc, char **argv) |
399 | 399 |
portuxn(&u, 0x0e, "---", ppnil); |
400 | 400 |
portuxn(&u, 0x0f, "---", ppnil); |
401 | 401 |
|
402 |
+ apu.channel_addr = devapu->addr + 0xa; |
|
403 |
+ |
|
402 | 404 |
/* Write screen size to dev/screen */ |
403 | 405 |
mempoke16(&u, devscreen->addr + 2, ppu.hor * 8); |
404 | 406 |
mempoke16(&u, devscreen->addr + 4, ppu.ver * 8); |
... | ... |
@@ -110,7 +110,7 @@ putpixel(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 color) |
110 | 110 |
} |
111 | 111 |
|
112 | 112 |
void |
113 |
-putsprite(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color) |
|
113 |
+puticn(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color) |
|
114 | 114 |
{ |
115 | 115 |
Uint16 v, h; |
116 | 116 |
for(v = 0; v < 8; v++) |
... | ... |
@@ -122,6 +122,18 @@ putsprite(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color) |
122 | 122 |
} |
123 | 123 |
} |
124 | 124 |
|
125 |
+void |
|
126 |
+putchr(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color) |
|
127 |
+{ |
|
128 |
+ Uint16 v, h; |
|
129 |
+ for(v = 0; v < 8; v++) |
|
130 |
+ for(h = 0; h < 8; h++) { |
|
131 |
+ Uint8 ch1 = ((sprite[v] >> (7 - h)) & 0x1) * color; |
|
132 |
+ Uint8 ch2 = ((sprite[v + 8] >> (7 - h)) & 0x1) * color; |
|
133 |
+ putpixel(p, layer, x + h, y + v, (ch1 - ch2 + color / 4) & 0x3); |
|
134 |
+ } |
|
135 |
+} |
|
136 |
+ |
|
125 | 137 |
void |
126 | 138 |
getcolors(Ppu *p, Uint8 *addr) |
127 | 139 |
{ |
... | ... |
@@ -27,4 +27,5 @@ void drawppu(Ppu *p); |
27 | 27 |
void drawdebugger(Ppu *p, Uint8 *stack, Uint8 ptr); |
28 | 28 |
void getcolors(Ppu *p, Uint8 *addr); |
29 | 29 |
void putpixel(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 color); |
30 |
-void putsprite(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color); |
|
31 | 30 |
\ No newline at end of file |
31 |
+void puticn(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color); |
|
32 |
+void putchr(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color); |
|
32 | 33 |
\ No newline at end of file |