Browse code

Added lineRect subroutine

neauoire authored on 12/02/2021 02:48:45
Showing 4 changed files
... ...
@@ -2,6 +2,26 @@
2 2
 
3 3
 A [stack-based VM](https://wiki.xxiivv.com/site/uxn.html), written in ANSI C.
4 4
 
5
+## Setup
6
+
7
+If you wish to build your own emulator, you can create a new instance of Uxn like:
8
+
9
+```
10
+#include "uxn.h"
11
+
12
+Uxn u;
13
+
14
+if(!bootuxn(&u))
15
+	return error("Boot", "Failed");
16
+if(!loaduxn(&u, argv[1]))
17
+	return error("Load", "Failed");
18
+if(!init())
19
+	return error("Init", "Failed");
20
+
21
+evaluxn(u, u->vreset); /* Once on start */
22
+evaluxn(u, u->vframe); /* Each frame
23
+```
24
+
5 25
 ## Assembly Syntax
6 26
 
7 27
 ### Write
... ...
@@ -67,6 +87,10 @@ BRK
67 87
 - Auto-advance ldr?
68 88
 - Getting rid of IOR/IOW would be nice..
69 89
 - Sending from the wst to the rst, balance mode/flag?
90
+- Device that works like an extra memory bank
91
+- Line routine
92
+- LineRect routine
93
+- Draw a chr sprite.
70 94
 
71 95
 ## Refs
72 96
 
... ...
@@ -190,6 +190,12 @@ consolew(Device *d, Uint8 b)
190 190
 Uint8
191 191
 screenr(Device *d, Uint8 b)
192 192
 {
193
+	switch(b) {
194
+	case 0: return (WIDTH >> 8) & 0xff;
195
+	case 1: return WIDTH & 0xff;
196
+	case 2: return (HEIGHT >> 8) & 0xff;
197
+	case 3: return HEIGHT & 0xff;
198
+	}
193 199
 	return d->mem[b];
194 200
 }
195 201
 
... ...
@@ -293,11 +299,6 @@ main(int argc, char **argv)
293 299
 	devmouse = portuxn(&u, "mouse", mouser, mousew);
294 300
 	devkey = portuxn(&u, "key", keyr, keyw);
295 301
 
296
-	devscreen->mem[0] = (WIDTH >> 8) & 0xff;
297
-	devscreen->mem[1] = WIDTH & 0xff;
298
-	devscreen->mem[2] = (HEIGHT >> 8) & 0xff;
299
-	devscreen->mem[3] = HEIGHT & 0xff;
300
-
301 302
 	start(&u);
302 303
 
303 304
 	echos(&u.wst, 0x40, "stack");
... ...
@@ -22,11 +22,22 @@
22 22
 	( fill rect x y w h )
23 23
 	,0040 ,0040 ,0060 ,0040 ,fillrect JSR
24 24
 
25
-
26 25
 	,01 ,color STR
27 26
 	( fill rect x y w h )
28 27
 	,00a0 ,0010 ,0020 ,0020 ,fillrect JSR
29 28
 
29
+	,02 ,color STR
30
+	( fill rect x y w h )
31
+	,00b0 ,0040 ,0020 ,0020 ,linerect JSR
32
+
33
+	,03 ,color STR
34
+	( fill rect x y w h )
35
+	,0058 ,0028 ,0050 ,0050 ,linerect JSR
36
+
37
+	,01 ,color STR
38
+	( fill rect x y w h )
39
+	,0028 ,0038 ,0050 ,0030 ,linerect JSR
40
+
30 41
 	,redraw JSR
31 42
 
32 43
 BRK
... ...
@@ -37,13 +48,28 @@ BRK
37 48
 	@fillrectrow
38 49
 		,x LDR^ ,x_ STR^
39 50
 		@fillrectcol
40
-			,x_ LDR^ ,y_ LDR^ ,putpixel JSR
51
+			( draw ) ,x_ LDR^ ,y_ LDR^ ,putpixel JSR
41 52
 			,x_ LDR^ ,0001 ADD^ ,x_ STR^ 
42 53
 			,x_ LDR^ ,w LDR^ ,x LDR^ ADD^ LTH^ ,fillrectcol ROT JMP? POP^
43 54
 		,y_ LDR^ ,0001 ADD^ ,y_ STR^ 
44 55
 		,y_ LDR^ ,h LDR^ ,y LDR^ ADD^ LTH^ ,fillrectrow ROT JMP? POP^
45 56
 	RTS
46 57
 
58
+@linerect
59
+	,h STR^ ,w STR^ ,y STR^ ,x STR^
60
+	,x LDR^ ,x_ STR^ ,y LDR^ ,y_ STR^
61
+	@linerectcol
62
+		( draw ) ,x LDR^ ,y_ LDR^ ,putpixel JSR
63
+		( draw ) ,x LDR^ ,w LDR^ ADD^ ,y_ LDR^ ,putpixel JSR
64
+		,y_ LDR^ ,0001 ADD^ ,y_ STR^ 
65
+		,y_ LDR^ ,h LDR^ ,y LDR^ ADD^ LTH^ ,linerectcol ROT JMP? POP^
66
+	@linerectrow
67
+		( draw ) ,x_ LDR^ ,y LDR^ ,putpixel JSR
68
+		( draw ) ,x_ LDR^ ,y LDR^ ,h LDR^ ADD^ ,putpixel JSR
69
+		,x_ LDR^ ,0001 ADD^ ,x_ STR^ 
70
+		,x_ LDR^ ,w LDR^ ,x LDR^ ADD^ ,0001 ADD^ LTH^ ,linerectrow ROT JMP? POP^
71
+	RTS
72
+
47 73
 @redraw
48 74
 	,0000 IOW^
49 75
 	,0000 IOW^
... ...
@@ -199,8 +199,6 @@ loaduxn(Uxn *u, char *filepath)
199 199
 	return 1;
200 200
 }
201 201
 
202
-/* to start: evaluxn(u, u->vreset); */
203
-
204 202
 Device *
205 203
 portuxn(Uxn *u, char *name, Uint8 (*rfn)(Device *, Uint8), Uint8 (*wfn)(Device *, Uint8))
206 204
 {