Browse code

Fixed stack balance issue

neauoire authored on 19/03/2021 20:41:59
Showing 6 changed files
... ...
@@ -67,7 +67,6 @@ RTN
67 67
 ### OS Boot Disk
68 68
 
69 69
 - Load external disk in disk2
70
-- Build hex editor
71 70
 
72 71
 ### Assembler
73 72
 
... ...
@@ -76,15 +75,10 @@ RTN
76 75
 - Jump helpers
77 76
 - Don't brk when return stack is not zeroed
78 77
 - LDRS should load from the zeropage?
79
-- Keep ref counts in macros
80 78
 - A fast way(2 bytes) to read from the zero page #aa LDR.
81 79
 
82 80
 ## Notes
83 81
 
84
-### Conditional Jumping
85
-
86
-I've considered automatically popping an amount of items from the stack equal to the offset between the opcode's push/pop to make the stack length more predictable, and making the pattern JMP? POP2 unecessary, but that idea would make DUP? unusable. That change was reverted.
87
-
88 82
 ## Palettes
89 83
 
90 84
 - `[ 6a03 4a0d aa0c ]`, purple/cyan
91 85
similarity index 100%
92 86
rename from projects/bigpicture(3f-2c).bit
93 87
rename to projects/bigpicture3f2c.bit
94 88
similarity index 100%
95 89
rename from projects/picture(20-10).bit
96 90
rename to projects/picture2010.bit
... ...
@@ -1,7 +1,11 @@
1 1
 ( 
2 2
 	app/noodle : illustration program
3 3
 	
4
+	right-click - erase
4 5
 	alt-click - drag canvas
6
+	arrows - move zoom
7
+	space - toogle zoom
8
+	backspace - blank canvas
5 9
 
6 10
 	TODO
7 11
 		- Only draw-canvas when mouse has changed
... ...
@@ -11,6 +15,8 @@
11 15
 		- Limit size
12 16
 		- Draw point inbetween
13 17
 		- Pixel cleanup brush
18
+	BUGS
19
+		- If canvas is higher than 0, mouse picking fails
14 20
 )
15 21
 
16 22
 %RTN   { JMP2r }
... ...
@@ -23,13 +29,13 @@
23 29
 
24 30
 ;center { x 2 y 2 }
25 31
 ;toolbar { x1 2 y1 2 x2 2 y2 2 }
26
-;cursor { x 2 y 2 x0 2 y0 2 size 1 patt 1 drag 1 zoom 1 }
27
-;zoom { x 2 y 2 }
32
+;cursor { x 2 y 2 x0 2 y0 2 size 1 patt 1 drag 1 }
33
+;zoom { active 1 x 2 y 2 }
28 34
 ;rect { x1 2 y1 2 x2 2 y2 2 }
29 35
 ;origin { x1 2 y1 2 x2 2 y2 2 }
30 36
 ;color { byte 1 }
31
-;pos { x 2 y 2 }
32
-;pix { x 2 y 2 }
37
+;pt0 { x 2 y 2 }
38
+;pt1 { x 2 y 2 }
33 39
 ;px { x 1 y 1 }
34 40
 
35 41
 |0100 @RESET 
... ...
@@ -122,7 +128,7 @@ BRK
122 128
 		~Mouse.x ~Screen.width #0020 SUB2 SUB2 8/ 
123 129
 		DUP2 
124 130
 		#0000 NEQ2 ,$no-toggle-zoom ROT JMP2?
125
-			~cursor.zoom #00 EQU =cursor.zoom
131
+			~zoom.active #00 EQU =zoom.active
126 132
 			( release ) #00 =Mouse.state
127 133
 			,redraw JSR2
128 134
 		$no-toggle-zoom
... ...
@@ -143,27 +149,20 @@ BRK
143 149
 
144 150
 	$no-touch
145 151
 
146
-	,$no-ctrl ~Controller #00 EQU ~cursor.zoom #00 EQU #0000 NEQ2 JMP2?
147
-
148
-		,$no-ctrl-up ~Controller #10 EQU JMP2?
149
-			~zoom.y ++ =zoom.y
150
-		$no-ctrl-up
151
-		,$no-ctrl-down ~Controller #20 EQU JMP2?
152
-			~zoom.y -- =zoom.y
153
-		$no-ctrl-down
154
-		,$no-ctrl-left ~Controller #40 EQU JMP2?
155
-			~zoom.x ++ =zoom.x
156
-		$no-ctrl-left
157
-		,$no-ctrl-right ~Controller #80 EQU JMP2?
158
-			~zoom.x -- =zoom.x
159
-		$no-ctrl-right
160
-		,draw-canvas JSR2
161
-
162
-	$no-ctrl
163
-
152
+	~Controller.buttons #f0 AND
153
+		DUP #04 SHR #01 AND #01 NEQ ,$no-up ROT JMP2?
154
+			( move ) ~zoom.y -- =zoom.y $no-up
155
+		DUP #05 SHR #01 AND #01 NEQ ,$no-down ROT JMP2?
156
+			( move ) ~zoom.y ++ =zoom.y $no-down
157
+		DUP #06 SHR #01 AND #01 NEQ ,$no-left ROT JMP2?
158
+			( move ) ~zoom.x -- =zoom.x $no-left
159
+		DUP #07 SHR #01 AND #01 NEQ ,$no-right ROT JMP2?
160
+			( move ) ~zoom.x ++ =zoom.x $no-right
161
+	#00 NEQ ,draw-canvas ROT JSR2?
162
+	
164 163
 	,$no-keys ~Keys #00 EQU JMP2?
165 164
 		,$no-keys-toogle-zoom ~Keys #20 NEQ JMP2?
166
-			~cursor.zoom #00 EQU =cursor.zoom
165
+			~zoom.active #00 EQU =zoom.active
167 166
 			,redraw JSR2
168 167
 		$no-keys-toogle-zoom 
169 168
 		( release ) #00 =Keys
... ...
@@ -199,18 +198,18 @@ RTN
199 198
 	
200 199
 	,erase ~Mouse.state #10 EQU JMP2?
201 200
 
202
-	#0003 SUB2 =pos.y #0003 SUB2 =pos.x ( cursor offset )
201
+	#0003 SUB2 =pt0.y #0003 SUB2 =pt0.x ( cursor offset )
203 202
 
204 203
 	( trim if zoomed )
205
-	,$no-zoom ~cursor.zoom #01 NEQ JMP2?
206
-		~pos.x 8/ ~zoom.x ADD2 #0003 SUB2 =pos.x
207
-		~pos.y 8/ ~zoom.y ADD2 #0003 SUB2 =pos.y
204
+	,$no-zoom ~zoom.active #01 NEQ JMP2?
205
+		~pt0.x 8/ ~zoom.x ADD2 #0003 SUB2 =pt0.x
206
+		~pt0.y 8/ ~zoom.y ADD2 #0003 SUB2 =pt0.y
208 207
 	$no-zoom
209 208
 
210 209
 	( center zoom on paint )
211
-	,$no-follow ~cursor.zoom JMP2?
212
-		~pos.x ~canvas.w 2/ SUB2 #0003 ADD2 =zoom.x
213
-		~pos.y ~canvas.h 2/ SUB2 #0003 ADD2 =zoom.y
210
+	,$no-follow ~zoom.active JMP2?
211
+		~pt0.x ~canvas.w 2/ SUB2 #0003 ADD2 =zoom.x
212
+		~pt0.y ~canvas.h 2/ SUB2 #0003 ADD2 =zoom.y
214 213
 	$no-follow
215 214
 
216 215
 	#00 =px.x #00 =px.y 
... ...
@@ -221,7 +220,7 @@ RTN
221 220
 			( byte ) #00 ~px.y ADD2 LDR #07 ~px.x SUB SHR #01 AND 
222 221
 			#00 EQU ,$no-pixel ROT JMP2?
223 222
 				,$no-pixel ,patternize JSR2 #00 EQU JMP2?
224
-				~pos.x #00 ~px.x ADD2 ~pos.y #00 ~px.y ADD2 ,add-pixel JSR2
223
+				~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 ,add-pixel JSR2
225 224
 			$no-pixel
226 225
 			( incr ) ~px.x #01 ADD =px.x
227 226
 			,$hor ~px.x #08 LTH JMP2?
... ...
@@ -235,18 +234,18 @@ RTN
235 234
 
236 235
 @erase ( x y )
237 236
 
238
-	#0003 SUB2 =pos.y #0003 SUB2 =pos.x ( cursor offset )
237
+	#0003 SUB2 =pt0.y #0003 SUB2 =pt0.x ( cursor offset )
239 238
 
240 239
 	( trim if zoomed )
241
-	,$no-zoom ~cursor.zoom #01 NEQ JMP2?
242
-		~pos.x 8/ ~zoom.x ADD2 #0003 SUB2 =pos.x
243
-		~pos.y 8/ ~zoom.y ADD2 #0003 SUB2 =pos.y
240
+	,$no-zoom ~zoom.active #01 NEQ JMP2?
241
+		~pt0.x 8/ ~zoom.x ADD2 #0003 SUB2 =pt0.x
242
+		~pt0.y 8/ ~zoom.y ADD2 #0003 SUB2 =pt0.y
244 243
 	$no-zoom
245 244
 
246 245
 	( center zoom on paint )
247
-	,$no-follow ~cursor.zoom JMP2?
248
-		~pos.x ~canvas.w 2/ SUB2 #0003 ADD2 =zoom.x
249
-		~pos.y ~canvas.h 2/ SUB2 #0003 ADD2 =zoom.y
246
+	,$no-follow ~zoom.active JMP2?
247
+		~pt0.x ~canvas.w 2/ SUB2 #0003 ADD2 =zoom.x
248
+		~pt0.y ~canvas.h 2/ SUB2 #0003 ADD2 =zoom.y
250 249
 	$no-follow
251 250
 
252 251
 	#00 =px.x #00 =px.y 
... ...
@@ -257,7 +256,7 @@ RTN
257 256
 			( byte ) #00 ~px.y ADD2 LDR #07 ~px.x SUB SHR #01 AND 
258 257
 			#00 EQU ,$no-pixel ROT JMP2?
259 258
 				,$no-pixel ,patternize JSR2 #00 EQU JMP2?
260
-				~pos.x #00 ~px.x ADD2 ~pos.y #00 ~px.y ADD2 ,remove-pixel JSR2
259
+				~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 ,remove-pixel JSR2
261 260
 			$no-pixel
262 261
 			( incr ) ~px.x #01 ADD =px.x
263 262
 			,$hor ~px.x #08 LTH JMP2?
... ...
@@ -275,42 +274,42 @@ RTN
275 274
 	$noplain
276 275
 
277 276
 	,$notone1 ~cursor.patt #01 NEQ JMP2?
278
-		~pos.x #00 ~px.x ADD2 ~pos.y #00 ~px.y ADD2 ADD2 #0001 AND2 #0000 EQU2 
279
-		~pos.x #00 ~px.x ADD2 ~pos.y #00 ~px.y ADD2 SUB2 #0001 AND2 #0000 EQU2 
277
+		~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 ADD2 #0001 AND2 #0000 EQU2 
278
+		~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 SUB2 #0001 AND2 #0000 EQU2 
280 279
 		#0101 EQU2
281 280
 		RTN
282 281
 	$notone1
283 282
 
284 283
 	,$notone2 ~cursor.patt #02 NEQ JMP2?
285
-		~pos.x #00 ~px.x ADD2 ~pos.y #00 ~px.y ADD2 ADD2 #0003 AND2 #0000 EQU2 
286
-		~pos.x #00 ~px.x ADD2 ~pos.y #00 ~px.y ADD2 SUB2 #0003 AND2 #0000 EQU2 
284
+		~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 ADD2 #0003 AND2 #0000 EQU2 
285
+		~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 SUB2 #0003 AND2 #0000 EQU2 
287 286
 		#0101 EQU2
288 287
 		RTN
289 288
 	$notone2
290 289
 
291 290
 	,$notone3 ~cursor.patt #03 NEQ JMP2?
292
-		~pos.x #00 ~px.x ADD2 ~pos.y #00 ~px.y ADD2 ADD2 #0005 AND2 #0000 EQU2 
293
-		~pos.x #00 ~px.x ADD2 ~pos.y #00 ~px.y ADD2 SUB2 #0005 AND2 #0000 EQU2 
291
+		~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 ADD2 #0005 AND2 #0000 EQU2 
292
+		~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 SUB2 #0005 AND2 #0000 EQU2 
294 293
 		#0101 EQU2
295 294
 		RTN
296 295
 	$notone3
297 296
 
298 297
 	,$notone4 ~cursor.patt #04 NEQ JMP2?
299
-		~pos.x #00 ~px.x ADD2 ~pos.y #00 ~px.y ADD2 ADD2 #0003 AND2 #0000 EQU2 
298
+		~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 ADD2 #0003 AND2 #0000 EQU2 
300 299
 		RTN
301 300
 	$notone4
302 301
 
303 302
 	,$notone5 ~cursor.patt #05 NEQ JMP2?
304
-		~pos.x #00 ~px.x ADD2 ~pos.y #00 ~px.y ADD2 SUB2 #0003 AND2 #0000 EQU2 
303
+		~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 SUB2 #0003 AND2 #0000 EQU2 
305 304
 		RTN
306 305
 	$notone5
307 306
 
308 307
 	,$notone6 ~cursor.patt #06 NEQ JMP2?
309
-		~pos.x #00 ~px.x ADD2 #0001 AND2 SWP POP RTN
308
+		~pt0.x #00 ~px.x ADD2 #0001 AND2 SWP POP RTN
310 309
 	$notone6
311 310
 
312 311
 	,$notone7 ~cursor.patt #07 NEQ JMP2?
313
-		~pos.y #00 ~px.y ADD2 #0001 AND2 SWP POP RTN
312
+		~pt0.y #00 ~px.y ADD2 #0001 AND2 SWP POP RTN
314 313
 	$notone7
315 314
 
316 315
 	#00
... ...
@@ -321,7 +320,7 @@ RTN
321 320
 
322 321
 	SWP POP #07 AND =px.y
323 322
 	SWP POP #07 AND =px.x
324
-	( get tile ) ~pix.x 8/ ~pix.y 8/ ~canvas.w MUL2 ADD2 8*
323
+	( get tile ) ~pt1.x 8/ ~pt1.y 8/ ~canvas.w MUL2 ADD2 8*
325 324
 	( add addr ) ,data ADD2
326 325
 	#00 ~px.y ADD2 LDR #07 ~px.x SUB SHR #01 AND
327 326
 
... ...
@@ -329,20 +328,20 @@ RTN
329 328
 
330 329
 @add-pixel ( x y )
331 330
 
332
-	=pix.y =pix.x
333
-	( get tile addr ) ,data ~pix.x 8/ ~pix.y 8/ ~canvas.w MUL2 ADD2 8* ~pix.y MOD8 ADD2 ADD2 
331
+	=pt1.y =pt1.x
332
+	( get tile addr ) ,data ~pt1.x 8/ ~pt1.y 8/ ~canvas.w MUL2 ADD2 8* ~pt1.y MOD8 ADD2 ADD2 
334 333
 	( load ) DUP2 LDR
335
-	( mask ) #01 #07 ~pix.x MOD8 SWP POP SUB SHL ORA
334
+	( mask ) #01 #07 ~pt1.x MOD8 SWP POP SUB SHL ORA
336 335
 	( save ) ROT ROT STR
337 336
 
338 337
 RTN
339 338
 
340 339
 @remove-pixel ( x y )
341 340
 
342
-	=pix.y =pix.x
343
-	( get tile addr ) ,data ~pix.x 8/ ~pix.y 8/ ~canvas.w MUL2 ADD2 8* ~pix.y MOD8 ADD2 ADD2 
341
+	=pt1.y =pt1.x
342
+	( get tile addr ) ,data ~pt1.x 8/ ~pt1.y 8/ ~canvas.w MUL2 ADD2 8* ~pt1.y MOD8 ADD2 ADD2 
344 343
 	( load ) DUP2 LDR
345
-	( mask ) #01 #07 ~pix.x MOD8 SWP POP SUB SHL #ff XOR AND
344
+	( mask ) #01 #07 ~pt1.x MOD8 SWP POP SUB SHL #ff XOR AND
346 345
 	( save ) ROT ROT STR
347 346
 
348 347
 RTN
... ...
@@ -359,7 +358,7 @@ RTN
359 358
 
360 359
 @draw-canvas
361 360
 	
362
-	,draw-canvas-zoom ~cursor.zoom #01 EQU JMP2?
361
+	,draw-canvas-zoom ~zoom.active #01 EQU JMP2?
363 362
 
364 363
 	~canvas.y1 =Sprite.y
365 364
 	,data =Sprite.addr
... ...
@@ -377,20 +376,20 @@ RTN
377 376
 
378 377
 @draw-canvas-zoom
379 378
 	
380
-	~zoom.y =pix.y
379
+	~zoom.y =pt1.y
381 380
 	~canvas.y1 =Sprite.y
382 381
 	,data =Sprite.addr
383 382
 	$ver
384 383
 		~canvas.x1 =Sprite.x 
385
-		~zoom.x =pix.x
384
+		~zoom.x =pt1.x
386 385
 		$hor
387
-			( incr ) ,bigpixel_icn #0008 #00 ~pix.x ~pix.y ,get-pixel JSR2 MUL2 ADD2 =Sprite.addr
386
+			( incr ) ,bigpixel_icn #0008 #00 ~pt1.x ~pt1.y ,get-pixel JSR2 MUL2 ADD2 =Sprite.addr
388 387
 			( draw ) #09 =Sprite.color
389 388
 			( incr ) ~Sprite.x 8+ =Sprite.x
390
-			( incr ) ~pix.x ++ =pix.x
389
+			( incr ) ~pt1.x ++ =pt1.x
391 390
 		,$hor ~Sprite.x ~canvas.x2 NEQ2 JMP2?
392 391
 		( incr ) ~Sprite.y 8+ =Sprite.y
393
-		( incr ) ~pix.y ++ =pix.y
392
+		( incr ) ~pt1.y ++ =pt1.y
394 393
 	,$ver ~Sprite.y ~canvas.y2 NEQ2 JMP2?
395 394
 
396 395
 RTN
... ...
@@ -499,7 +498,7 @@ RTN
499 498
 	,save_icn =Sprite.addr
500 499
 	#01 =Sprite.color
501 500
 	~Screen.width #0020 SUB2 =Sprite.x
502
-	,zoom_icn #00 ~cursor.zoom 8* ADD2 =Sprite.addr
501
+	,zoom_icn #00 ~zoom.active 8* ADD2 =Sprite.addr
503 502
 	#01 =Sprite.color
504 503
 
505 504
 	( draw width )
... ...
@@ -554,13 +553,13 @@ RTN
554 553
 
555 554
 @size_icn    
556 555
 	[ 0000 0010 0000 0000 ]
557
-    [ 0000 1038 1000 0000 ]
558
-    [ 0000 3838 3800 0000 ]
559
-    [ 0010 387c 3810 0000 ]
560
-    [ 0038 7c7c 7c38 0000 ]
561
-    [ 1038 7cfe 7c38 1000 ]
562
-    [ 387c fefe fe7c 3800 ]
563
-    [ 7cfe fefe fefe 7c00 ]
556
+	[ 0000 1038 1000 0000 ]
557
+	[ 0000 3838 3800 0000 ]
558
+	[ 0010 387c 3810 0000 ]
559
+	[ 0038 7c7c 7c38 0000 ]
560
+	[ 1038 7cfe 7c38 1000 ]
561
+	[ 387c fefe fe7c 3800 ]
562
+	[ 7cfe fefe fefe 7c00 ]
564 563
 
565 564
 @pattern_icn 
566 565
 	[ fe82 baba ba82 fe00 ]
... ...
@@ -581,7 +580,7 @@ RTN
581 580
 	[ 1028 4482 4428 1000 ]
582 581
 	[ 3844 8282 8244 3800 ]
583 582
 	[ 7c82 8282 8282 7c00 ]
584
-    [ 7cfe fefe fefe 7c00 ]
583
+	[ 7cfe fefe fefe 7c00 ]
585 584
 
586 585
 @zoom_icn
587 586
 	[ 3048 8484 4834 0200 ]
... ...
@@ -599,7 +598,7 @@ RTN
599 598
 @save_icn       [ fe82 8282 848a f400 ]
600 599
 
601 600
 @blank_icn      [ 0000 0000 0000 0000 ]
602
-@filepath       [ projects/picture(20-10).bit 00 ]
601
+@filepath       [ projects/picture2010.bit 00 ]
603 602
 
604 603
 @font_hex
605 604
 [
606 605
similarity index 100%
607 606
rename from test.txt
608 607
rename to projects/text.txt
... ...
@@ -103,12 +103,12 @@ void (*ops[])(Uxn *u) = {
103 103
 };
104 104
 
105 105
 Uint8 opr[][4] = { /* wstack-/+ rstack-/+ */
106
-	{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {2,1,0,0}, {3,0,0,0}, {1,0,0,0}, {1,0,0,2}, {0,0,2,0}, 
106
+	{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {2,1,0,0}, {3,0,0,0}, {1,0,0,0}, {1,0,0,0}, {1,0,0,2}, 
107 107
 	{2,1,0,0}, {2,1,0,0}, {2,1,0,0}, {2,1,0,0}, {2,1,0,0}, {2,1,0,0}, {2,1,0,0}, {2,1,0,0},
108 108
 	{1,0,0,0}, {0,2,0,0}, {2,2,0,0}, {2,3,0,0}, {3,3,0,0}, {0,0,0,0}, {0,0,0,1}, {0,1,1,0},
109 109
 	{2,1,0,0}, {2,1,0,0}, {2,1,0,0}, {2,1,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,2,0,0},
110 110
 	/* 16-bit */
111
-	{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {2,2,0,0}, {4,0,0,0}, {2,0,0,0}, {2,0,0,0}, {0,0,0,0}, /* TODO */
111
+	{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {2,2,0,0}, {4,0,0,0}, {2,0,0,0}, {2,0,0,0}, {2,0,0,2}, /* TODO */
112 112
 	{4,2,0,0}, {4,2,0,0}, {4,2,0,0}, {4,2,0,0}, {4,2,0,0}, {4,2,0,0}, {4,2,0,0}, {4,2,0,0}, /* TODO */
113 113
 	{0,2,0,0}, {0,2,0,0}, {1,1,0,0}, {4,6,0,0}, {6,6,0,0}, {0,0,0,0}, {0,0,0,2}, {0,2,2,0}, /* TODO */
114 114
 	{4,2,0,0}, {4,2,0,0}, {4,2,0,0}, {4,2,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,2,0,0}