Browse code

Removed overdrawing in PPU

neauoire authored on 12/04/2021 03:38:21
Showing 5 changed files
... ...
@@ -32,7 +32,7 @@ else
32 32
 fi
33 33
 
34 34
 echo "Assembling.."
35
-./bin/assembler projects/examples/dev.controller.keys.usm bin/boot.rom
35
+./bin/assembler projects/software/noodle.usm bin/boot.rom
36 36
 
37 37
 echo "Running.."
38 38
 if [ "${2}" = '--cli' ]; 
... ...
@@ -23,11 +23,11 @@
23 23
 |0200
24 24
 	
25 25
 	( theme ) #0ff8 =System.r #0f08 =System.g #0f08 =System.b
26
-	( vectors ) ,FRAME =Screen.vector
26
+	( vectors ) ,on-frame =Screen.vector
27 27
 
28 28
 BRK
29 29
 
30
-@FRAME
30
+@on-frame
31 31
 	
32 32
 	#00 =DateTime.refresh
33 33
 
34 34
new file mode 100644
... ...
@@ -0,0 +1,63 @@
1
+( GUI Animation )
2
+
3
+;dvd { x 2 y 2 dx 1 dy 1 }
4
+
5
+|0100 ;System { vector 2 pad 6 r 2 g 2 b 2 }
6
+|0120 ;Screen { vector 2 width 2 height 2 pad 2 x 2 y 2 addr 2 color 1 }
7
+
8
+( program )
9
+
10
+|0200
11
+	
12
+	( theme ) #4cfd =System.r #4cf3 =System.g #dcf2 =System.b
13
+	( vectors ) ,on-frame =Screen.vector
14
+	( init ) ~Screen.width #0002 DIV2 =dvd.x
15
+	( init ) ~Screen.height #0002 DIV2 =dvd.y
16
+	
17
+BRK
18
+
19
+@on-frame ( -> )
20
+	
21
+	( clear ) #20 ,draw-dvd JSR2
22
+	( hit-right ) ~dvd.x ~Screen.width #0020 SUB2 EQU2
23
+	( hit-left ) ~dvd.x #0000 EQU2 
24
+	#0000 EQU2 ^$no-flipx JNZ 
25
+		~dvd.dx #00 EQU =dvd.dx $no-flipx
26
+	( hit-bottom ) ~dvd.y ~Screen.height #0010 SUB2 EQU2
27
+	( hit-top ) ~dvd.y #0000 EQU2 
28
+	#0000 EQU2 ^$no-flipy JNZ 
29
+		~dvd.dy #00 EQU =dvd.dy $no-flipy
30
+	( incr ) ~dvd.x #0001 #00 ~dvd.dx #00 EQU #fffe MUL2 ADD2 ADD2 =dvd.x 
31
+	( incr ) ~dvd.y #0001 #00 ~dvd.dy #00 EQU #fffe MUL2 ADD2 ADD2 =dvd.y 
32
+	( draw ) #21 ,draw-dvd JSR2
33
+
34
+BRK
35
+
36
+@draw-dvd ( color -- )
37
+	
38
+	( stash color ) STH 
39
+	,dvd_icn =Screen.addr
40
+	~dvd.y ~dvd.y #0010 ADD2
41
+	$ver
42
+		OVR2 =Screen.y
43
+		~dvd.x ~dvd.x #0020 ADD2
44
+		$hor
45
+			OVR2 =Screen.x
46
+			( draw ) DUPr STHr =Screen.color
47
+			( next ) ~Screen.addr #0008 ADD2 =Screen.addr
48
+			( incr ) SWP2 #0008 ADD2 SWP2
49
+			OVR2 OVR2 LTH2 ^$hor JNZ
50
+		POP2 POP2
51
+		( incr ) SWP2 #0008 ADD2 SWP2
52
+		OVR2 OVR2 LTH2 ^$ver JNZ
53
+	POP2 POP2
54
+	( destroy color ) POPr
55
+
56
+JMP2r
57
+
58
+@dvd_icn [
59
+	001f 3f38 3838 787f 00fe fe7e 7777 e3c3
60
+	000f 1f3b 7b77 e7c7 00fc fe8f 8707 0efc
61
+	7f00 000f ff7f 0700 0301 00ff f0f8 ff00
62
+	8700 00ff 7f7f ff00 f000 00e0 fcfc 8000
63
+]
0 64
\ No newline at end of file
... ...
@@ -27,6 +27,8 @@
27 27
 	#0128 #0010 #0080 #0080 #2e ,pict_medium ,draw-picture JSR2
28 28
 	#0020 #00d0 #0020 #0020 #25 ,pict_small ,draw-picture JSR2
29 29
 
30
+	#0010 #0010 #0020 #0010 #25 ,dvd_icn ,draw-picture JSR2
31
+
30 32
 BRK
31 33
 
32 34
 @on-mouse 
... ...
@@ -78,6 +80,17 @@ RTN
78 80
 
79 81
 RTN
80 82
 
83
+@dvd_icn [
84
+	001f 3f38 3838 787f
85
+	00fe fe7e 7777 e3c3
86
+	000f 1f3b 7b77 e7c7
87
+	00fc fe8f 8707 0efc
88
+	7f00 000f ff7f 0700
89
+	0301 00ff f0f8 ff00
90
+	8700 00ff 7f7f ff00
91
+	f000 00e0 fcfc 8000
92
+]
93
+
81 94
 @clear_icn   [ 0000 0000 0000 0000 ]
82 95
 @pointer_icn [ 80c0 e0f0 f8e0 1000 ]
83 96
 
... ...
@@ -50,19 +50,6 @@ drawpixel(Ppu *p, Uint16 x, Uint16 y, Uint8 color)
50 50
 		p->output[y * p->width + x] = p->colors[color];
51 51
 }
52 52
 
53
-void
54
-drawchr(Ppu *p, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 alpha)
55
-{
56
-	Uint8 v, h;
57
-	for(v = 0; v < 8; v++)
58
-		for(h = 0; h < 8; h++) {
59
-			Uint8 ch1 = ((sprite[v] >> h) & 0x1);
60
-			Uint8 ch2 = (((sprite[v + 8] >> h) & 0x1) << 1);
61
-			if(!alpha || (alpha && ch1 + ch2 != 0))
62
-				drawpixel(p, x + 7 - h, y + v, ch1 + ch2);
63
-		}
64
-}
65
-
66 53
 void
67 54
 putpixel(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 color)
68 55
 {
... ...
@@ -142,9 +129,20 @@ drawppu(Ppu *p)
142 129
 	Uint16 x, y;
143 130
 	for(y = 0; y < p->ver; ++y)
144 131
 		for(x = 0; x < p->hor; ++x) {
132
+			Uint8 v, h;
145 133
 			Uint16 key = (y * p->hor + x) * 16;
146
-			drawchr(p, x * 8 + p->pad, y * 8 + p->pad, &p->bg[key], 0);
147
-			drawchr(p, x * 8 + p->pad, y * 8 + p->pad, &p->fg[key], 1);
134
+			for(v = 0; v < 8; v++)
135
+				for(h = 0; h < 8; h++) {
136
+					Uint8 *sprite = &p->fg[key];
137
+					Uint8 ch1 = ((sprite[v] >> h) & 0x1);
138
+					Uint8 ch2 = (((sprite[v + 8] >> h) & 0x1) << 1);
139
+					if(ch1 + ch2 == 0) {
140
+						sprite = &p->bg[key];
141
+						ch1 = ((sprite[v] >> h) & 0x1);
142
+						ch2 = (((sprite[v + 8] >> h) & 0x1) << 1);
143
+					}
144
+					drawpixel(p, x * 8 + p->pad + 7 - h, y * 8 + p->pad + v, ch1 + ch2);
145
+				}
148 146
 		}
149 147
 }
150 148