Browse code

Display brush size

neauoire authored on 19/03/2021 03:53:47
Showing 4 changed files
... ...
@@ -46,9 +46,9 @@ Program p;
46 46
 
47 47
 char ops[][4] = {
48 48
 	"BRK", "NOP", "LIT", "LDR", "STR", "---", "JMP", "JSR", 
49
-	"EQU", "NEQ", "GTH", "LTH", "AND", "XOR", "SHL", "SHR",
49
+	"EQU", "NEQ", "GTH", "LTH", "AND", "ORA", "SHL", "SHR",
50 50
 	"POP", "DUP", "SWP", "OVR", "ROT", "---", "CLN", "STH",
51
-	"ADD", "SUB", "MUL", "DIV", "---", "---", "---", "---"
51
+	"ADD", "SUB", "MUL", "DIV", "---", "---", "---", "XOR"
52 52
 };
53 53
 
54 54
 int   scin(char *s, char c) { int i = 0; while(s[i]) if(s[i++] == c) return i - 1; return -1; } /* string char index */
... ...
@@ -154,17 +154,16 @@ BRK
154 154
 			~tileview.addr ADD2 =addr ( addr offset )
155 155
 			~MOUS.x ~tileview.x SUB2 ~MOUS.x ~tileview.x SUB2 #0040 DIV2 #0040 MUL2 SUB2 =pos.x
156 156
 			~MOUS.y ~tileview.y SUB2 ~MOUS.y ~tileview.y SUB2 #0040 DIV2 #0040 MUL2 SUB2 =pos.y
157
-			,no-fill-mode ~bankview.mode #01 NEQ JMP2?
158
-				( fill row ) #ff ~addr ~pos.y 8/ ADD2 STR
159
-				,redraw JSR2 ,click-end JMP2
160
-			@no-fill-mode
161 157
 			,no-erase-mode ~bankview.mode #02 NEQ JMP2?
162
-				( erase row ) #00 ~addr ~pos.y 8/ ADD2 STR
158
+				( load ) ~addr ~pos.y 8/ ADD2 LDR
159
+				( mask ) #01 #07 ~pos.x 8/ SWP POP SUB SHL 
160
+				#ff XOR AND
161
+				( save ) ~addr ~pos.y 8/ ADD2 STR
163 162
 				,redraw JSR2 ,click-end JMP2
164 163
 			@no-erase-mode
165 164
 			( load ) ~addr ~pos.y 8/ ADD2 LDR
166 165
 			( mask ) #01 #07 ~pos.x 8/ SWP POP SUB SHL 
167
-			XOR
166
+			ORA
168 167
 			( save ) ~addr ~pos.y 8/ ADD2 STR
169 168
 			,redraw JSR2 ,click-end JMP2
170 169
 
... ...
@@ -7,6 +7,11 @@
7 7
 		- Only draw-canvas when mouse has changed
8 8
 		- Only draw-canvas target tile
9 9
 		- Resize buttons
10
+		- Zoom
11
+		- Erase
12
+		- Toggle guides
13
+		- Set eye option
14
+		- Complete save/load
10 15
 )
11 16
 
12 17
 %RTN   { JMP2r }
... ...
@@ -19,7 +24,7 @@
19 24
 
20 25
 ;center { x 2 y 2 }
21 26
 ;toolbar { x1 2 y1 2 x2 2 y2 2 }
22
-;cursor { x 2 y 2 x0 2 y0 2 size 1 patt 1 drag 1 }
27
+;cursor { x 2 y 2 x0 2 y0 2 size 1 patt 1 drag 1 view 1 }
23 28
 ;rect { x1 2 y1 2 x2 2 y2 2 }
24 29
 ;color { byte 1 }
25 30
 ;pos { x 2 y 2 }
... ...
@@ -35,20 +40,20 @@
35 40
 	( find screen center )
36 41
 	~Screen.width #0002 DIV2 =center.x
37 42
 	~Screen.height #0002 DIV2 =center.y
43
+	#0010 =toolbar.x1 #0010 =toolbar.y1
38 44
 
39 45
 	( default brush )
40 46
 	#04 =cursor.size
41 47
 
42
-	#0010 =canvas.x1 #0016 =canvas.y1 
43 48
 	#0026 =canvas.w #001a =canvas.h ( 380x260 )
44
-	#0010 =toolbar.x1 #0010 =toolbar.y1
45 49
 
46
-	,draw-background JSR2
50
+	( center canvas )
51
+	~center.x ~canvas.w 8* 2/ SUB2 =canvas.x1 
52
+	~center.y ~canvas.h 8* 2/ SUB2 =canvas.y1
47 53
 
54
+	,draw-background JSR2
48 55
 	,fit-canvas JSR2
49
-
50 56
 	,draw-titlebar JSR2
51
-
52 57
 	,fit-toolbar JSR2
53 58
 
54 59
 BRK
... ...
@@ -102,9 +107,32 @@ BRK
102 107
 		,$no-touch-canvas ~Mouse.x CLN2r ~canvas.x1 GTH2 STH2r ~canvas.x2 LTH2 #0101 NEQ2 JMP2?
103 108
 		,$no-touch-canvas ~Mouse.y CLN2r ~canvas.y1 GTH2 STH2r ~canvas.y2 LTH2 #0101 NEQ2 JMP2?
104 109
 			~Mouse.x ~canvas.x1 SUB2 ~Mouse.y ~canvas.y1 SUB2 ,paint JSR2
105
-			,$touch-end JMP2
106 110
 		$no-touch-canvas
107 111
 
112
+		( background interface )
113
+		~Mouse.x ~Screen.width #0020 SUB2 SUB2 8/ 
114
+		DUP2 
115
+		#0000 NEQ2 ,$no-toggle-guides ROT JMP2?
116
+			~cursor.view #00 EQU =cursor.view
117
+			( release ) #00 =Mouse.state
118
+			~cursor.view =Console.byte
119
+			~Screen.width #0020 SUB2 =Sprite.x
120
+			~Screen.height #0010 SUB2 =Sprite.y
121
+			,mode_guidesoff #00 ~cursor.view #0008 MUL2 ADD2 =Sprite.addr
122
+			#01 =Sprite.color
123
+		$no-toggle-guides
124
+		DUP2 
125
+		#0001 NEQ2 ,$no-load-button ROT JMP2?
126
+			( release ) #00 =Mouse.state
127
+			#bb =Console.byte
128
+		$no-load-button
129
+		DUP2 
130
+		#0002 NEQ2 ,$no-save-button ROT JMP2?
131
+			( release ) #00 =Mouse.state
132
+			#cc =Console.byte
133
+		$no-save-button
134
+		POP2
135
+
108 136
 		$touch-end
109 137
 
110 138
 	$no-touch
... ...
@@ -121,8 +149,10 @@ BRK
121 149
 RTN
122 150
 
123 151
 @paint ( x y )
152
+	
153
+	,erase ~Mouse.state #10 EQU JMP2?
124 154
 
125
-	#0004 SUB2 =pos.y #0004 SUB2 =pos.x ( cursor offset )
155
+	#0003 SUB2 =pos.y #0003 SUB2 =pos.x ( cursor offset )
126 156
 
127 157
 	#00 =px.x #00 =px.y 
128 158
 	$ver
... ...
@@ -130,12 +160,10 @@ RTN
130 160
 		$hor
131 161
 			( addr ) ,size_icn #00 ~cursor.size 8* ADD2
132 162
 			( byte ) #00 ~px.y ADD2 LDR #07 ~px.x SUB SHR #01 AND 
133
-			
134 163
 			#00 EQU ,$no-pixel ROT JMP2?
135 164
 				,$no-pixel ,patternize JSR2 #00 EQU JMP2?
136 165
 				~pos.x #00 ~px.x ADD2 ~pos.y #00 ~px.y ADD2 ,add-pixel JSR2
137 166
 			$no-pixel
138
-
139 167
 			( incr ) ~px.x #01 ADD =px.x
140 168
 			,$hor ~px.x #08 LTH JMP2?
141 169
 		( incr ) ~px.y #01 ADD =px.y
... ...
@@ -146,6 +174,29 @@ RTN
146 174
 
147 175
 RTN
148 176
 
177
+@erase ( x y )
178
+
179
+	#0003 SUB2 =pos.y #0003 SUB2 =pos.x ( cursor offset )
180
+
181
+	#00 =px.x #00 =px.y 
182
+	$ver
183
+		#00 =px.x
184
+		$hor
185
+			( addr ) ,size_icn #00 ~cursor.size 8* ADD2
186
+			( byte ) #00 ~px.y ADD2 LDR #07 ~px.x SUB SHR #01 AND 
187
+			#00 EQU ,$no-pixel ROT JMP2?
188
+				,$no-pixel ,patternize JSR2 #00 EQU JMP2?
189
+				~pos.x #00 ~px.x ADD2 ~pos.y #00 ~px.y ADD2 ,remove-pixel JSR2
190
+			$no-pixel
191
+			( incr ) ~px.x #01 ADD =px.x
192
+			,$hor ~px.x #08 LTH JMP2?
193
+		( incr ) ~px.y #01 ADD =px.y
194
+		,$ver ~px.y #08 LTH JMP2?
195
+	,draw-canvas JSR2
196
+	,draw-toolbar JSR2
197
+
198
+RTN
199
+
149 200
 @patternize
150 201
 
151 202
 	,$noplain ~cursor.patt #00 NEQ JMP2?
... ...
@@ -198,11 +249,19 @@ RTN
198 249
 @add-pixel ( x y )
199 250
 
200 251
 	=pix.y =pix.x
201
-
202 252
 	( get tile addr ) ,data ~pix.x 8/ ~pix.y 8/ ~canvas.w MUL2 ADD2 8* ~pix.y MOD8 ADD2 ADD2 
253
+	( load ) DUP2 LDR
254
+	( mask ) #01 #07 ~pix.x MOD8 SWP POP SUB SHL ORA
255
+	( save ) ROT ROT STR
256
+
257
+RTN
203 258
 
259
+@remove-pixel ( x y )
260
+
261
+	=pix.y =pix.x
262
+	( get tile addr ) ,data ~pix.x 8/ ~pix.y 8/ ~canvas.w MUL2 ADD2 8* ~pix.y MOD8 ADD2 ADD2 
204 263
 	( load ) DUP2 LDR
205
-	( mask ) #01 #07 ~pix.x MOD8 SWP POP SUB SHL XOR
264
+	( mask ) #01 #07 ~pix.x MOD8 SWP POP SUB SHL #ff XOR AND
206 265
 	( save ) ROT ROT STR
207 266
 
208 267
 RTN
... ...
@@ -217,9 +276,9 @@ RTN
217 276
 			( draw ) #09 =Sprite.color
218 277
 			( incr ) ~Sprite.x 8+ =Sprite.x
219 278
 			( incr ) ~Sprite.addr 8+ =Sprite.addr
220
-		,$hor ~Sprite.x ~canvas.x2 LTH2 JMP2?
279
+		,$hor ~Sprite.x ~canvas.x2 NEQ2 JMP2?
221 280
 		( incr ) ~Sprite.y 8+ =Sprite.y
222
-	,$ver ~Sprite.y ~canvas.y2 LTH2 JMP2?
281
+	,$ver ~Sprite.y ~canvas.y2 NEQ2 JMP2?
223 282
 
224 283
 RTN
225 284
 
... ...
@@ -230,13 +289,13 @@ RTN
230 289
 		( incr ) ~Screen.x ++ =Screen.x
231 290
 		( draw ) ~rect.y1 =Screen.y ~color =Screen.color
232 291
 		( draw ) ~rect.y2 =Screen.y ~color =Screen.color
233
-		,$hor ~Screen.x ~rect.x2 LTH2 JMP2?
292
+		,$hor ~Screen.x ~rect.x2 NEQ2 JMP2?
234 293
 	~rect.y1 =Screen.y
235 294
 	$ver
236 295
 		( draw ) ~rect.x1 =Screen.x ~color =Screen.color
237 296
 		( draw ) ~rect.x2 =Screen.x ~color =Screen.color
238 297
 		( incr ) ~Screen.y ++ =Screen.y
239
-		,$ver ~Screen.y ~rect.y2 ++ LTH2 JMP2?
298
+		,$ver ~Screen.y ~rect.y2 ++ NEQ2 JMP2?
240 299
 
241 300
 RTN
242 301
 
... ...
@@ -248,9 +307,9 @@ RTN
248 307
 		$hor
249 308
 			( draw ) ~color =Screen.color
250 309
 			( incr ) ~Screen.x ++ =Screen.x
251
-			,$hor ~Screen.x ~rect.x2 LTH2 JMP2?
310
+			,$hor ~Screen.x ~rect.x2 NEQ2 JMP2?
252 311
 		( incr ) ~Screen.y ++ =Screen.y
253
-		,$ver ~Screen.y ~rect.y2 LTH2 JMP2?
312
+		,$ver ~Screen.y ~rect.y2 NEQ2 JMP2?
254 313
 
255 314
 RTN
256 315
 
... ...
@@ -261,6 +320,10 @@ RTN
261 320
 
262 321
 	#0000 EQU2 ~Mouse.state #00 NEQ #0101 EQU2 RTN? ( Return if unchanged )
263 322
 
323
+	~cursor.x #0003 SUB2 =Sprite.x
324
+	~cursor.y #0003 SUB2 =Sprite.y
325
+	#10 =Sprite.color
326
+
264 327
 	( clear last cursor )
265 328
 	~cursor.x =Sprite.x
266 329
 	~cursor.y =Sprite.y
... ...
@@ -272,10 +335,20 @@ RTN
272 335
 	~Mouse.y =cursor.y
273 336
 
274 337
 	( draw new cursor )
338
+
339
+	,$outside-canvas ~Mouse.x CLN2r ~canvas.x1 GTH2 STH2r ~canvas.x2 LTH2 #0101 NEQ2 JMP2?
340
+	,$outside-canvas ~Mouse.y CLN2r ~canvas.y1 GTH2 STH2r ~canvas.y2 LTH2 #0101 NEQ2 JMP2?		
341
+		~cursor.x #0003 SUB2 =Sprite.x
342
+		~cursor.y #0003 SUB2 =Sprite.y
343
+		,brush_view #00 ~cursor.size #0008 MUL2 ADD2 =Sprite.addr
344
+		#11 ~Mouse.state ADD =Sprite.color
345
+	$outside-canvas
346
+
275 347
 	~cursor.x =Sprite.x
276 348
 	~cursor.y =Sprite.y
349
+
277 350
 	,brush_pointer #00 ~Controller #02 EQU #0008 MUL2 ADD2 =Sprite.addr
278
-	#13 =Sprite.color
351
+	#1f =Sprite.color
279 352
 
280 353
 RTN
281 354
 
... ...
@@ -304,7 +377,7 @@ RTN
304 377
 
305 378
 @fit-toolbar
306 379
 
307
-	~toolbar.x1 #0018 ADD2 =toolbar.x2
380
+	~toolbar.x1 #0010 ADD2 =toolbar.x2
308 381
 	~toolbar.y1 #0040 ADD2 =toolbar.y2
309 382
 	,draw-toolbar JSR2
310 383
 
... ...
@@ -313,7 +386,7 @@ RTN
313 386
 @draw-toolbar
314 387
 	
315 388
 	~toolbar.x1 -- ~toolbar.y1 -- ~toolbar.x2 ~toolbar.y2 #02 ,line-rect JSR2
316
-	~toolbar.x1 #0002 SUB2 ~toolbar.y1 #0002 SUB2 ~toolbar.x2 ++ ~toolbar.y2 ++ #01 ,line-rect JSR2
389
+	~toolbar.x1 #0002 SUB2 ~toolbar.y1 #0002 SUB2 ~toolbar.x2 ~toolbar.y2 #01 ,line-rect JSR2
317 390
 
318 391
 	~toolbar.x1 =Sprite.x
319 392
 	~toolbar.y1 =Sprite.y
... ...
@@ -339,17 +412,6 @@ RTN
339 412
 		( incr ) ~Sprite.addr 8+ =Sprite.addr
340 413
 		,$patterns ~Sprite.y ~toolbar.y1 #0040 ADD2 LTH2 JMP2?
341 414
 
342
-	( draw brush tools )
343
-
344
-	~toolbar.x1 #0010 ADD2 =Sprite.x
345
-	~toolbar.y1 =Sprite.y
346
-
347
-	$brushes
348
-		( draw ) #09 =Sprite.color
349
-		( incr ) ~Sprite.y 8+ =Sprite.y
350
-		( incr ) ~Sprite.addr 8+ =Sprite.addr
351
-		,$brushes ~Sprite.y ~toolbar.y1 #0040 ADD2 LTH2 JMP2?
352
-
353 415
 RTN
354 416
 
355 417
 @draw-background
... ...
@@ -372,7 +434,7 @@ RTN
372 434
 		OVR2 OVR2 LTH2 ^$draw-ver SWP JMP?
373 435
 	POP2 POP2
374 436
 
375
-	( draw save/load icons )
437
+	( draw save/load/guides icons )
376 438
 	~Screen.width #0018 SUB2 =Sprite.x
377 439
 	~Screen.height #0010 SUB2 =Sprite.y
378 440
 	,load_icn =Sprite.addr
... ...
@@ -380,9 +442,12 @@ RTN
380 442
 	~Screen.width #0010 SUB2 =Sprite.x
381 443
 	,save_icn =Sprite.addr
382 444
 	#01 =Sprite.color
445
+	~Screen.width #0020 SUB2 =Sprite.x
446
+	,mode_guidesoff =Sprite.addr
447
+	#01 =Sprite.color
383 448
 
384 449
 	( draw width )
385
-	~Screen.width #0040 SUB2 =Sprite.x
450
+	~Screen.width #0048 SUB2 =Sprite.x
386 451
 	,font_hex ~canvas.w #f0 AND #04 SHR #08 MUL ADD2 =Sprite.addr
387 452
 	( draw ) #02 =Sprite.color
388 453
 	~Sprite.x 8+ =Sprite.x
... ...
@@ -418,17 +483,29 @@ RTN
418 483
 	[ feaa aaaa aaaa fe00 ]	
419 484
 	[ fe82 fe82 fe82 fe00 ]
420 485
 
486
+@brush_view 
487
+	[ 0000 0010 0000 0000 ]
488
+	[ 0000 1028 1000 0000 ]
489
+	[ 0000 3828 3800 0000 ]
490
+	[ 0010 2844 2810 0000 ]
491
+	[ 0038 4444 4438 0000 ]
492
+	[ 1028 4482 4428 1000 ]
493
+	[ 3844 8282 8244 3800 ]
494
+	[ 7c82 8282 8282 7c00 ]
495
+    [ 7cfe fefe fefe 7c00 ]
496
+
421 497
 @brush_pointer  [ 80c0 e0f0 f8e0 1000 ]
422 498
 @brush_hand     [ 4040 4070 f8f8 f870 ]
423 499
 @brush_eraser   [ 2050 b87c 3e1c 0800 ]
424 500
 
425 501
 @mode_guidesoff [ 0038 4492 2810 0000 ]
502
+@mode_guideson  [ 0000 0082 4438 0000 ]
426 503
 @mode_zoomout   [ 3048 8484 4834 0200 ]
504
+
427 505
 [ 0000 0000 0000 0000 ]
428 506
 [ 0000 0000 0000 0000 ]
429 507
 [ 0000 0000 0000 0000 ]
430 508
 
431
-@mode_guideson  [ 0000 0082 4438 0000 ]
432 509
 @mode_zoomin    [ 3245 8284 4834 0200 ]
433 510
 @load_icn       [ feaa d6aa d4aa f400 ]
434 511
 @save_icn       [ fe82 8282 848a f400 ]
... ...
@@ -39,7 +39,8 @@ void op_ldr(Uxn *u) { Uint16 a = pop16(u->src); push8(u->src, mempeek8(u, a)); }
39 39
 void op_str(Uxn *u) { Uint16 a = pop16(u->src); Uint8 b = pop8(u->src); mempoke8(u, a, b); }
40 40
 /* Logic */
41 41
 void op_and(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, b & a); }
42
-void op_xor(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, b | a); }
42
+void op_ora(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, b | a); }
43
+void op_xor(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, b ^ a); }
43 44
 void op_shl(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, b << (a % 8)); }
44 45
 void op_shr(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, b >> (a % 8)); }
45 46
 /* Stack */
... ...
@@ -67,6 +68,7 @@ void op_jsr16(Uxn *u) { push16(u->dst, u->ram.ptr); u->ram.ptr = pop16(u->src);
67 68
 void op_ldr16(Uxn *u) { Uint16 a = pop16(u->src); push16(u->src, mempeek16(u, a)); }
68 69
 void op_str16(Uxn *u) { Uint16 a = pop16(u->src); Uint16 b = pop16(u->src); mempoke16(u, a, b); }
69 70
 void op_and16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push16(u->src, b & a); }
71
+void op_ora16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push16(u->src, b | a); }
70 72
 void op_xor16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push16(u->src, b ^ a); }
71 73
 void op_shl16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push16(u->src, b << (a % 16)); }
72 74
 void op_shr16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push16(u->src, b >> (a % 16)); }
... ...
@@ -90,14 +92,14 @@ void op_lth16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push8(u->sr
90 92
 
91 93
 void (*ops[])(Uxn *u) = {
92 94
 	op_brk, op_nop, op_lit, op_ldr, op_str, op_nop, op_jmp, op_jsr, 
93
-	op_equ, op_neq, op_gth, op_lth, op_and, op_xor, op_shl, op_shr, 
95
+	op_equ, op_neq, op_gth, op_lth, op_and, op_ora, op_shl, op_shr, 
94 96
 	op_pop, op_dup, op_swp, op_ovr, op_rot, op_nop, op_cln, op_sth, 
95
-	op_add, op_sub, op_mul, op_div, op_nop, op_nop, op_nop, op_nop,
97
+	op_add, op_sub, op_mul, op_div, op_nop, op_nop, op_nop, op_xor,
96 98
 	/* 16-bit */
97 99
 	op_brk,   op_nop16, op_lit16, op_ldr16, op_str16, op_nop,   op_jmp16, op_jsr16, 
98
-	op_equ16, op_neq16, op_gth16, op_lth16, op_and16, op_xor16, op_shl16, op_shr16, 
100
+	op_equ16, op_neq16, op_gth16, op_lth16, op_and16, op_ora16, op_shl16, op_shr16, 
99 101
 	op_pop16, op_dup16, op_swp16, op_ovr16, op_rot16, op_nop,   op_cln16, op_sth16, 
100
-	op_add16, op_sub16, op_mul16, op_div16, op_nop,   op_nop,   op_nop,   op_nop
102
+	op_add16, op_sub16, op_mul16, op_div16, op_nop,   op_nop,   op_nop,   op_xor16
101 103
 };
102 104
 
103 105
 Uint8 opr[][4] = { /* wstack-/+ rstack-/+ */