Browse code

Starting noodle

neauoire authored on 18/03/2021 17:13:55
Showing 2 changed files
... ...
@@ -1,22 +1,35 @@
1 1
 ( 
2 2
 	app/noodle : illustration program
3
+
4
+	TODO
5
+		- Only redraw when mouse has changed
6
+		- Only redraw target tile
3 7
 )
4 8
 
5 9
 %RTN   { JMP2r }
6 10
 %RTN?  { JMP2r? }
11
+%++ { #0001 ADD2 } %-- { #0001 SUB2 }
12
+%2/ { #0001 SHR2 } %2* { #0001 SHL2 }
13
+%8/ { #0003 SHR2 } %8* { #0003 SHL2 }
14
+%8- { #0008 SUB2 } %8+ { #0008 ADD2 }
15
+%MOD8 { #0007 AND2  }
7 16
 
8
-%ABS { DUP #07 SHR #ff SWP MUL? } ( abs )
9
-%ABS2 { DUP2 #000f SHR2 #ffff SWP2 SWP POP MUL2? } ( abs2 )
10
-
17
+;toolbar { x 2 y 2 }
11 18
 ;cursor { x 2 y 2 }
12
-;a { x 2 y 2 }
13
-;b { x 2 y 2 }
14
-;d { x 2 y 2 }
15
-;s { x 2 y 2 }
19
+;rect { x1 2 y1 2 x2 2 y2 2 }
20
+;color { byte 1 }
21
+;pt { x 2 y 2 }
22
+;label { x 2 y 2 color 1 addr 2 } ( remove )
16 23
 
17 24
 |0100 @RESET 
25
+	
26
+	#0008 =toolbar.x #0068 =toolbar.y
18 27
 
19
-	#0020 #0020 #0090 #0070 ,draw-line JSR2
28
+	#0010 =canvas.x1 #0020 =canvas.y1 
29
+	#0026 =canvas.w #0010 =canvas.h ,fit JSR2
30
+
31
+	,draw-titlebar JSR2
32
+	,draw-toolbar JSR2
20 33
 
21 34
 BRK
22 35
 
... ...
@@ -24,27 +37,65 @@ BRK
24 37
 
25 38
 	,draw-cursor JSR2
26 39
 
40
+	,$no-touch ~Mouse.state #01 NEQ JMP2?
41
+
42
+		,$no-paint ~Mouse.x CLN2r ~canvas.x1 GTH2 STH2r ~canvas.x2 LTH2 #0101 NEQ2 JMP2?
43
+		,$no-paint ~Mouse.y CLN2r ~canvas.y1 GTH2 STH2r ~canvas.y2 LTH2 #0101 NEQ2 JMP2?
44
+
45
+		~Mouse.x ~canvas.x1 SUB2 ~Mouse.y ~canvas.y1 SUB2 ,paint JSR2
46
+
47
+		$no-paint
48
+
49
+	$no-touch
50
+
27 51
 BRK
28 52
 
29
-@draw-line ( x1 y1 x2 y2 )
53
+@paint ( x y )
30 54
 
31
-	=b.y =b.x ( target, b )
32
-	=a.y =a.x ( target, a )
55
+	=pt.y =pt.x
33 56
 
34
-	( dx = abs[bx - ax] )
35
-	~b.x ~a.x SUB2 ABS2 =d.x
57
+	( get tile addr ) ,data ~pt.x 8/ ~pt.y 8/ ~canvas.w MUL2 ADD2 8* ~pt.y MOD8 ADD2 ADD2 
36 58
 
37
-	( dx = abs[bx - ax] )
38
-	~b.y ~a.y SUB2 ABS2 =d.y
59
+	( load ) DUP2 LDR
60
+	( mask ) #01 #07 ~pt.x MOD8 SWP POP SUB SHL XOR
61
+	( save ) ROT ROT STR
39 62
 
40
-	( sx = ax < bx ? 1 : -1; )
41
-	#ffff #00 ~a.x ~b.x GTH2 #0002 MUL2 ADD2 =s.x 
42
-	
43
-	( sy = ay < by ? 1 : -1; )
44
-	#ffff #00 ~a.y ~b.y GTH2 #0002 MUL2 ADD2 =s.y 
63
+	,redraw JSR2
64
+
65
+RTN
66
+
67
+@redraw
45 68
 	
69
+	~canvas.y1 =Sprite.y
70
+	,data =Sprite.addr
71
+	$ver
72
+		~canvas.x1 =Sprite.x 
73
+		$hor
74
+			( draw ) #09 =Sprite.color
75
+			( incr ) ~Sprite.x 8+ =Sprite.x
76
+			( incr ) ~Sprite.addr 8+ =Sprite.addr
77
+		,$hor ~Sprite.x ~canvas.x2 LTH2 JMP2?
78
+		( incr ) ~Sprite.y 8+ =Sprite.y
79
+	,$ver ~Sprite.y ~canvas.y2 LTH2 JMP2?
80
+
81
+	,draw-toolbar JSR2
82
+
83
+RTN
46 84
 
47
-	#01 =Screen.color
85
+@line-rect ( x1 y1 x2 y2 color )
86
+
87
+	( load ) =color =rect.y2 =rect.x2 DUP2 =Screen.y =rect.y1 DUP2 =Screen.x =rect.x1
88
+	$hor
89
+		( incr ) ~Screen.x ++ =Screen.x
90
+		( draw ) ~rect.y1 =Screen.y ~color =Screen.color
91
+		( draw ) ~rect.y2 =Screen.y ~color =Screen.color
92
+		,$hor ~Screen.x ~rect.x2 LTH2 JMP2?
93
+	~rect.y1 =Screen.y
94
+	$ver
95
+		( draw ) ~rect.x1 =Screen.x ~color =Screen.color
96
+		( draw ) ~rect.x2 =Screen.x ~color =Screen.color
97
+		( incr ) ~Screen.y ++ =Screen.y
98
+		,$ver ~Screen.y ~rect.y2 ++ LTH2 JMP2?
48 99
 
49 100
 RTN
50 101
 
... ...
@@ -68,15 +119,144 @@ RTN
68 119
 	( draw new cursor )
69 120
 	~cursor.x =Sprite.x
70 121
 	~cursor.y =Sprite.y
71
-	,tool_pointer =Sprite.addr
72
-	#12 =Sprite.color
122
+	,brush_pointer =Sprite.addr
123
+	#13 =Sprite.color
124
+
125
+RTN
126
+
127
+@draw-titlebar
128
+	
129
+	~canvas.x1 ~canvas.y2 #06 ,filepath 
130
+	( load ) =label.addr =label.color =Sprite.y =Sprite.x 
131
+	~label.addr
132
+	$loop NOP
133
+		( draw ) DUP2 LDR #00 SWP #20 SUB 8* ,font ADD2 =Sprite.addr ~label.color =Sprite.color
134
+		( incr ) ++
135
+		( incr ) ~Sprite.x 8+ =Sprite.x
136
+		DUP2 LDR #00 NEQ ^$loop MUL JMP
137
+	POP2
73 138
 
74 139
 RTN
75 140
 
76
-@tool_pointer [ 80c0 e0f0 f8e0 1000 ]
77
-@tool_hand    [ 4040 4070 f8f8 f870 ]
78
-@tool_eraser  [ 2050 b87c 3e1c 0800 ]
141
+@fit
142
+	
143
+	~canvas.w 8* ~canvas.x1 ADD2 =canvas.x2 
144
+	~canvas.h 8* ~canvas.y1 ADD2 =canvas.y2 
145
+	~canvas.x1 -- ~canvas.y1 -- ~canvas.x2 ~canvas.y2 #01 ,line-rect JSR2
146
+	,redraw JSR2
147
+
148
+RTN
149
+
150
+@draw-toolbar
151
+	
152
+	~toolbar.x -- ~toolbar.y -- ~toolbar.x #0010 ADD2 ~toolbar.y #0050 ADD2 #02 ,line-rect JSR2
153
+	~toolbar.x #0002 SUB2 ~toolbar.y #0002 SUB2 ~toolbar.x #0010 ADD2 ++ ~toolbar.y #0050 ADD2 ++ #01 ,line-rect JSR2
154
+
155
+	~toolbar.x =Sprite.x
156
+	~toolbar.y =Sprite.y
157
+	,size0_icn =Sprite.addr
158
+
159
+	( draw brush sizes )
160
+
161
+	$sizes
162
+		( draw ) #09 =Sprite.color
163
+		( incr ) ~Sprite.y 8+ =Sprite.y
164
+		( incr ) ~Sprite.addr 8+ =Sprite.addr
165
+		,$sizes ~Sprite.y ~toolbar.y #0040 ADD2 LTH2 JMP2?
166
+
167
+	( draw brush tools )
168
+
169
+	~toolbar.x 8+ =Sprite.x
170
+	~toolbar.y =Sprite.y
171
+
172
+	$brushes
173
+		( draw ) #09 =Sprite.color
174
+		( incr ) ~Sprite.y 8+ =Sprite.y
175
+		( incr ) ~Sprite.addr 8+ =Sprite.addr
176
+		,$brushes ~Sprite.y ~toolbar.y #0040 ADD2 LTH2 JMP2?
177
+
178
+RTN
179
+
180
+@size0_icn    [ 0000 0010 0000 0000 ]
181
+@size1_icn    [ 0000 1038 1000 0000 ]
182
+@size2_icn    [ 0000 3838 3800 0000 ]
183
+@size3_icn    [ 0010 387c 3810 0000 ]
184
+@size4_icn    [ 0038 7c7c 7c38 0000 ]
185
+@size5_icn    [ 1038 7cfe 7c38 1000 ]
186
+@size6_icn    [ 387c fefe fe7c 3800 ]
187
+@size7_icn    [ 7cfe fefe fefe 7c00 ]
188
+
189
+@brush_pointer  [ 80c0 e0f0 f8e0 1000 ]
190
+@brush_hand     [ 4040 4070 f8f8 f870 ]
191
+@brush_eraser   [ 2050 b87c 3e1c 0800 ]
192
+@brush_pattern0 [ ffff ffff ffff ffff ]
193
+@brush_pattern1 [ aa55 aa55 aa55 aa55 ]
194
+@brush_pattern2 [ 8800 2200 8800 2200 ]
195
+
196
+@mode_guidesoff [ 0038 4492 2810 0000 ]
197
+@mode_zoomout   [ 3048 8484 4834 0200 ]
198
+
199
+@mode_guideson  [ 0000 0082 4438 0000 ]
200
+@mode_zoomin    [ 3245 8284 4834 0200 ]
201
+
79 202
 @blank_icn    [ 0000 0000 0000 0000 ]
203
+@filepath      [ projects/drawings/hello.chr 00 ]
204
+
205
+@font ( specter8-frag font ) 
206
+[
207
+	0000 0000 0000 0000 0008 0808 0800 0800
208
+	0014 1400 0000 0000 0024 7e24 247e 2400
209
+	0008 1e28 1c0a 3c08 0000 2204 0810 2200
210
+	0030 4832 4c44 3a00 0008 1000 0000 0000
211
+	0004 0808 0808 0400 0020 1010 1010 2000
212
+	0000 2214 0814 2200 0000 0808 3e08 0800
213
+	0000 0000 0000 0810 0000 0000 3e00 0000
214
+	0000 0000 0000 0800 0000 0204 0810 2000
215
+	003c 464a 5262 3c00 0018 0808 0808 1c00
216
+	003c 4202 3c40 7e00 003c 421c 0242 3c00
217
+	000c 1424 447e 0400 007e 407c 0242 3c00
218
+	003c 407c 4242 3c00 007e 0204 0810 1000
219
+	003c 423c 4242 3c00 003c 4242 3e02 3c00
220
+	0000 0010 0000 1000 0000 1000 0010 1020
221
+	0000 0810 2010 0800 0000 003e 003e 0000
222
+	0000 1008 0408 1000 003c 420c 1000 1000
223
+	003c 4232 4a42 3c00 003c 4242 7e42 4200
224
+	007c 427c 4242 7c00 003c 4240 4042 3c00
225
+	007c 4242 4242 7c00 007e 4078 4040 7e00
226
+	007e 4078 4040 4000 003c 4240 4642 3c00
227
+	0042 427e 4242 4200 001c 0808 0808 1c00
228
+	007e 0202 0242 3c00 0042 4478 4442 4200
229
+	0040 4040 4040 7e00 0042 665a 4242 4200
230
+	0042 6252 4a46 4200 003c 4242 4242 3c00
231
+	007c 4242 7c40 4000 003c 4242 4244 3a00
232
+	007c 4242 7c44 4200 003e 403c 0242 3c00
233
+	007e 0808 0808 1000 0042 4242 4244 3a00
234
+	0042 4242 4224 1800 0042 4242 5a66 4200
235
+	0042 423c 4242 4200 0042 423e 0242 3c00
236
+	007e 020c 3040 7e00 000c 0808 0808 0c00
237
+	0040 2010 0804 0200 0030 1010 1010 3000
238
+	0008 1400 0000 0000 0000 0000 0000 7e00
239
+	0008 0400 0000 0000 0000 3c02 3e42 3a00
240
+	0040 407c 4242 7c00 0000 3c42 4042 3c00
241
+	0002 023e 4242 3e00 0000 3c42 7e40 3e00
242
+	0000 3e40 7840 4000 0000 3c42 3e02 3c00
243
+	0040 405c 6242 4200 0008 0018 0808 0400
244
+	0008 0018 0808 4830 0040 4244 7844 4200
245
+	0010 1010 1010 0c00 0000 6c52 5252 5200
246
+	0000 5c62 4242 4200 0000 3c42 4242 3c00
247
+	0000 7c42 427c 4040 0000 3e42 423e 0202
248
+	0000 5c62 4040 4000 0000 3e40 3c02 7c00
249
+	0008 7e08 0808 1000 0000 4242 4244 3a00
250
+	0000 4242 4224 1800 0000 5252 5252 2e00
251
+	0000 4224 1824 4200 0000 4242 3e02 7c00
252
+	0000 7e02 3c40 7e00 000c 0810 1008 0c00
253
+	0008 0808 0808 0800 0030 1008 0810 3000
254
+	0000 0032 4c00 0000 3c42 99a1 a199 423c
255
+
256
+]
257
+
258
+|8000 ;canvas { w 2 h 2 x1 2 y1 2 x2 2 y2 2 }
259
+|9000 @data
80 260
 
81 261
 |F000 @ERROR BRK 
82 262
 
... ...
@@ -89,4 +269,4 @@ RTN
89 269
 |FF60 ;File { pad 8 name 2 length 2 load 2 save 2 }
90 270
 
91 271
 |FFF0 .RESET .FRAME .ERROR ( vectors )
92
-|FFF8 [ 13fd 1ef3 1bf2 ]   ( palette )
93 272
\ No newline at end of file
273
+|FFF8 [ c0fd c0f3 c0f2 ]   ( palette )
94 274
\ No newline at end of file
95 275
new file mode 100644
... ...
@@ -0,0 +1,88 @@
1
+( tests/draw )
2
+
3
+%RTN   { JMP2r }
4
+%RTN?  { JMP2r? }
5
+
6
+;cursor { x 2 y 2 }
7
+;a { x 2 y 2 }
8
+;b { x 2 y 2 }
9
+;s { x 2 y 2 }
10
+
11
+|0100 @RESET 
12
+	
13
+	#0020 #0020 #0070 #0080 ,draw-line JSR2
14
+	#0020 #0080 #0070 #0030 ,draw-line JSR2
15
+	#00a0 #0020 #0050 #00b0 ,draw-line JSR2
16
+	#00b0 #0090 #0030 #0010 ,draw-line JSR2
17
+
18
+BRK
19
+
20
+@draw-line ( x1 y1 x2 y2 )
21
+
22
+	=b.y =b.x ( target, b )
23
+	=a.y =a.x ( target, a )
24
+
25
+	~a.x =Screen.x ~a.y =Screen.y #02 =Screen.color
26
+	~b.x =Screen.x ~b.y =Screen.y #02 =Screen.color
27
+
28
+	( dx = abs[bx - ax] )
29
+	~b.x ~a.x SUB2 ABS2 =d.x
30
+
31
+	( dy = -abs[by - ay] )
32
+	~b.y ~a.y SUB2 ABS2 #0000 SWP2 SUB2 =d.y
33
+
34
+	( sx = ax < bx ? 1 : -1; )
35
+	#ffff #00 ~a.x ~b.x LTH2 #0002 MUL2 ADD2 =s.x 
36
+
37
+	( sy = ay < by ? 1 : -1; )
38
+	#ffff #00 ~a.y ~b.y LTH2 #0002 MUL2 ADD2 =s.y 
39
+
40
+	( err = dx + dy )
41
+	~d.x ~d.y ADD2 =err
42
+
43
+	( loop )
44
+	$loop
45
+
46
+		( putchr[ax, ay, color]; )
47
+		~a.x =Screen.x ~a.y =Screen.y #01 =Screen.color
48
+
49
+		( if[ax == bx && ay == by] break; )
50
+		,$end ~a.x ~b.x EQU2 ~a.y ~b.y EQU2 #0101 EQU2 JMP2?
51
+
52
+		( fallback, remove )
53
+		,$end ~i #90 GTH JMP2? ~i #01 ADD =i
54
+
55
+		( err2 = 2 * err; )
56
+		~err #0002 MUL2 =err2
57
+
58
+		~err2 =Console.short
59
+
60
+		( if[err2 >= dy] )
61
+		,$skipy ~err2 ~d.y LTH2 JMP2?
62
+			( err += dy; )
63
+			~err ~d.y ADD2 =err
64
+			( ax += sx; )
65
+			~a.x ~s.x ADD2 =a.x
66
+		$skipy
67
+
68
+		( if[err2 <= dx] )
69
+		,$skipx ~err2 ~d.x GTH2 JMP2?
70
+			( err += dx; )
71
+			~err ~d.x ADD2 =err
72
+			( ay += sy; )
73
+			~a.y ~s.y ADD2 =a.y
74
+		$skipx
75
+
76
+		,$loop JMP2
77
+
78
+	$end
79
+
80
+RTN
81
+
82
+|c000 @FRAME
83
+|d000 @ERROR 
84
+
85
+|FF00 ;Console { pad 8 char 1 byte 1 short 2 }
86
+
87
+|FFF0 .RESET .FRAME .ERROR ( vectors )
88
+|FFF8 [ 13fd 1ef3 1bf2 ] ( palette )
0 89
\ No newline at end of file