Browse code

(bunnymark) Ported to immediate opcodes

Devine Lu Linvega authored on 03/03/2023 19:03:38
Showing 4 changed files
... ...
@@ -24,10 +24,10 @@
24 24
 	;on-frame .Screen/vector DEO2
25 25
 
26 26
 	( draw "FPS:" and "BUNNIES:" and instructions labels )
27
-	.Screen/width DEI2 #0046 SUB2 #0008 ;text/fps #42 ;draw-str JSR2
28
-	#0004 #0008 ;text/bunnies #42 ;draw-str JSR2
29
-	.Screen/width DEI2 #01 SFT2 #0050 SUB2 #0008 ;text/instructions #43 ;draw-str JSR2
30
-	#0028 #0008 #0000 ;draw-dec JSR2
27
+	.Screen/width DEI2 #0046 SUB2 #0008 ;text/fps #42 draw-str
28
+	#0004 #0008 ;text/bunnies #42 draw-str
29
+	.Screen/width DEI2 #01 SFT2 #0050 SUB2 #0008 ;text/instructions #43 draw-str
30
+	#0028 #0008 #0000 draw-dec
31 31
 
32 32
 	( seed prng )
33 33
 	#04 ;rand/a STA
... ...
@@ -38,29 +38,29 @@ BRK
38 38
 
39 39
 	( frames++ ) 
40 40
 	.frames LDZ2k INC2 ROT STZ2
41
-	.Date/second DEI .last LDZ EQU ,&post-fps-update JCN
41
+	.Date/second DEI .last LDZ EQU ?&post-fps-update
42 42
 	( fps update )
43 43
 	( update last-secs ) .Date/second DEI .last STZ
44
-	( update fps label ) .Screen/width DEI2 #002b SUB2 #0008 .frames LDZ2 ;draw-dec JSR2
44
+	( update fps label ) .Screen/width DEI2 #002b SUB2 #0008 .frames LDZ2 draw-dec
45 45
 	( reset frames counter ) #0000 .frames STZ2
46 46
 
47 47
 	&post-fps-update
48 48
 		( mouse input to add/remove bunnies )
49
-		.Mouse/state DEI #01 EQU ,&add JCN
50
-		.Mouse/state DEI #01 GTH ,&remove JCN
51
-		,&done JMP
49
+		.Mouse/state DEI #01 EQU ?&add
50
+		.Mouse/state DEI #01 GTH ?&remove
51
+		!&done
52 52
 	&add
53
-		;add-bunny JSR2 ,&done JMP
53
+		add-bunny !&done
54 54
 	&remove
55
-		;remove-bunny JSR2 ,&done JMP
55
+		remove-bunny !&done
56 56
 	&done
57 57
 
58 58
 	( loop from 0 to ;sprite/length to make all ;draw-bunny calls )
59 59
 	[ ;sprite/length LDA2 ] #0000
60 60
 	&loop
61
-		EQU2k ,&bail JCN
62
-		DUP2 ,draw-bunny JSR
63
-		INC2 ,&loop JMP
61
+		EQU2k ?&bail
62
+		DUP2 draw-bunny
63
+		INC2 !&loop
64 64
 	&bail
65 65
 	POP2 POP2
66 66
 
... ...
@@ -75,31 +75,31 @@ BRK
75 75
 		( top )
76 76
 	[ LDA2k ] #05 SFT2 .Screen/x DEO2
77 77
 	[ INC2k INC2 LDA2 ] #05 SFT2 .Screen/y DEO2
78
-	#00 ;draw-sprite JSR2
78
+	#00 draw-sprite
79 79
 
80 80
 	( move the sprite by its velocity )
81 81
 	[ LDA2k ] [ OVR2 #0004 ADD2 LDA2 ] ADD2 OVR2 STA2
82 82
 	[ INC2k INC2 LDA2 ] [ OVR2 #0006 ADD2 LDA2 ] ADD2 OVR2 INC2 INC2 STA2
83 83
 
84 84
 	( check for right wall collision + bounce x )
85
-	[ DUP2 #0004 ADD2 LDA2 ] #0f SFT2 #0001 EQU2 ,&skip-max-x JCN
86
-	[ LDA2k ] #05 SFT2 #0008 ADD2 [ .Screen/width DEI2 ] LTH2 ,&skip-max-x JCN
85
+	[ DUP2 #0004 ADD2 LDA2 ] #0f SFT2 #0001 EQU2 ?&skip-max-x
86
+	[ LDA2k ] #05 SFT2 #0008 ADD2 [ .Screen/width DEI2 ] LTH2 ?&skip-max-x
87 87
 	[ DUP2 #0004 ADD2 LDA2 ] #ffff MUL2 [ OVR2 #0004 ADD2 STA2 ]
88 88
 	&skip-max-x
89 89
 	( check for left wall collision + bounce x )
90
-	[ LDA2k ] #0f SFT2 #0000 EQU2 ,&skip-min-x JCN
90
+	[ LDA2k ] #0f SFT2 #0000 EQU2 ?&skip-min-x
91 91
 	[ DUP2 #0004 ADD2 LDA2 ] #ffff MUL2 [ OVR2 #0004 ADD2 STA2 ]
92 92
 	&skip-min-x
93 93
 	( check for bottom wall collision + bounce y )
94
-	[ DUP2 #0006 ADD2 LDA2 ] #0f SFT2 #0001 EQU2 ,&skip-max-y JCN
95
-	[ INC2k INC2 LDA2 ] #05 SFT2 #0008 ADD2 [ .Screen/height DEI2 ] LTH2 ,&skip-max-y JCN
94
+	[ DUP2 #0006 ADD2 LDA2 ] #0f SFT2 #0001 EQU2 ?&skip-max-y
95
+	[ INC2k INC2 LDA2 ] #05 SFT2 #0008 ADD2 [ .Screen/height DEI2 ] LTH2 ?&skip-max-y
96 96
 	[ DUP2 #0006 ADD2 LDA2 ] #ffff MUL2 [ OVR2 #0006 ADD2 STA2 ]
97
-	,&skip-gravity JMP
97
+	!&skip-gravity
98 98
 	&skip-max-y
99 99
 	( check for top wall collision + bounce x )
100
-	[ INC2k INC2 LDA2 ] #0f SFT2 #0000 EQU2 ,&skip-min-y JCN
100
+	[ INC2k INC2 LDA2 ] #0f SFT2 #0000 EQU2 ?&skip-min-y
101 101
 	[ DUP2 #0006 ADD2 LDA2 ] #ffff MUL2 [ OVR2 #0006 ADD2 STA2 ]
102
-	,&skip-gravity JMP
102
+	!&skip-gravity
103 103
 	&skip-min-y
104 104
 
105 105
 	( apply gravity )
... ...
@@ -110,16 +110,16 @@ BRK
110 110
 	( top )
111 111
 	[ LDA2k ] #05 SFT2 .Screen/x DEO2
112 112
 	[ INC2 INC2 LDA2 ] #05 SFT2 .Screen/y DEO2
113
-	#85 ,draw-sprite ( .. )
113
+	#85 
114 114
 
115
-JMP
115
+( >> )
116 116
 
117 117
 @draw-sprite ( color -- )
118 118
 
119
-	#15 .Screen/auto DEO
119
+	[ LIT2 15 -Screen/auto ] DEO
120 120
 	;bunny-chr .Screen/addr DEO2
121 121
 	.Screen/sprite DEO
122
-	#00 .Screen/auto DEO
122
+	[ LIT2 00 -Screen/auto ] DEO
123 123
 
124 124
 JMP2r
125 125
 
... ...
@@ -127,19 +127,19 @@ JMP2r
127 127
 
128 128
 	;sprite/length LDA2
129 129
 	( cap bunny count at 65535 )
130
-	DUP2 #ffff EQU2 ,&bail JCN
130
+	DUP2 #ffff EQU2 ?&bail
131 131
 	( compute the offset to the beginning of this new bunny's data )
132 132
 	DUP2 #30 SFT2 ;sprite/array ADD2
133 133
 	( populate the new bunny's x/y/xvel/yvel with random values )
134
-	#00 [ ;rand JSR2 ] OVR2 STA2
135
-	[ ;rand JSR2 #1f AND ] [ ;rand JSR2 ] OVR2 INC2 INC2 STA2
136
-	#00 [ ;rand JSR2 #7f AND ] OVR2 #0004 ADD2 STA2
137
-	#00 [ ;rand JSR2 #7f AND ] OVR2 #0006 ADD2 STA2
134
+	#00 [ rand ] OVR2 STA2
135
+	[ rand #1f AND ] [ rand ] OVR2 INC2 INC2 STA2
136
+	#00 [ rand #7f AND ] OVR2 #0004 ADD2 STA2
137
+	#00 [ rand #7f AND ] OVR2 #0006 ADD2 STA2
138 138
 	( pop ptr to bunny data ) POP2
139 139
 	( write new increased array length )
140 140
 	INC2 DUP2 ;sprite/length STA2
141 141
 	( update label )
142
-	STH2k #0028 #0008 STH2r ;draw-dec JSR2
142
+	STH2k #0028 #0008 STH2r draw-dec
143 143
 	&bail
144 144
 	( pop sprite/length ) POP2
145 145
 
... ...
@@ -147,23 +147,23 @@ JMP2r
147 147
 
148 148
 @draw-str ( x* y* text* color -- )
149 149
 
150
-	#01 .Screen/auto DEO
150
+	[ LIT2 01 -Screen/auto ] DEO
151 151
 	STH
152 152
 	SWP2 .Screen/y DEO2
153 153
 	SWP2 .Screen/x DEO2
154 154
 	&loop
155 155
 		LDAk #20 SUB #00 SWP #30 SFT2 ;font ADD2 .Screen/addr DEO2
156 156
 		STHkr .Screen/sprite DEO
157
-		INC2 LDAk ,&loop JCN
157
+		INC2 LDAk ?&loop
158 158
 	POP2
159 159
 	STHr POP
160
-	#00 .Screen/auto DEO
160
+	[ LIT2 00 -Screen/auto ] DEO
161 161
 
162 162
 JMP2r
163 163
 
164 164
 @draw-dec ( x* y* num* -- )
165 165
 
166
-	#01 .Screen/auto DEO
166
+	[ LIT2 01 -Screen/auto ] DEO
167 167
 	SWP2 .Screen/y DEO2
168 168
 	SWP2 .Screen/x DEO2
169 169
 	#2710 DIV2k DUP2 NIP ,&digit JSR MUL2 SUB2
... ...
@@ -171,7 +171,7 @@ JMP2r
171 171
 	#0064 DIV2k DUP2 NIP ,&digit JSR MUL2 SUB2 NIP
172 172
 	#0a DIVk DUP ,&digit JSR MUL SUB
173 173
 	,&digit JSR
174
-	#00 .Screen/auto DEO
174
+	[ LIT2 00 -Screen/auto ] DEO
175 175
 
176 176
 JMP2r
177 177
 	&digit ( num -- )
... ...
@@ -183,18 +183,18 @@ JMP2r
183 183
 
184 184
 	;sprite/length LDA2
185 185
 	( don't let length go below 0 )
186
-	ORAk #00 EQU ,&bail JCN
186
+	ORAk #00 EQU ?&bail
187 187
 	( clear the old sprite location )
188 188
 	DUP2 #0001 SUB2 #30 SFT2 ;sprite/array ADD2
189 189
 	( top )
190 190
 	[ LDA2k ] #05 SFT2 .Screen/x DEO2
191 191
 	[ INC2k INC2 LDA2 ] #05 SFT2 .Screen/y DEO2
192 192
 	( clear )
193
-	#00 ;draw-sprite JSR2
193
+	#00 draw-sprite
194 194
 	POP2
195 195
 	#0001 SUB2 DUP2 ;sprite/length STA2
196 196
 	( update label )
197
-	STH2k #0028 #0008 STH2r ;draw-dec JSR2
197
+	STH2k #0028 #0008 STH2r draw-dec
198 198
 	&bail
199 199
 		POP2
200 200
 
... ...
@@ -1,7 +1,5 @@
1 1
 #include "uxn.h"
2 2
 
3
-#include <stdio.h>
4
-
5 3
 /*
6 4
 Copyright (u) 2022-2023 Devine Lu Linvega, Andrew Alderwick, Andrew Richards
7 5
 
... ...
@@ -36,6 +34,27 @@ WITH REGARD TO THIS SOFTWARE.
36 34
 #define PUT2(o, v) { tmp = (v); s->dat[s->ptr - o - 2] = tmp >> 8; s->dat[s->ptr - o - 1] = tmp; }
37 35
 #define PUSH(stack, v) { stack->dat[stack->ptr++] = (v); }
38 36
 #define PUSH2(stack, v) { tmp = (v); stack->dat[stack->ptr] = (v) >> 8; stack->dat[stack->ptr + 1] = (v); stack->ptr += 2; }
37
+#define SEND(a, b) { u->dev[a] = b; if((callbacks[(a) >> 4] >> ((a) & 0xf)) & 0x1) u->deo(u, a, b); }
38
+
39
+static 
40
+Uint16 callbacks[] = {
41
+        0xffff, /* 00 system   1011 0000 1111 1110 */
42
+        0xffff, /* 10 console  0000 0000 1100 0000 */
43
+        0xc028, /* 20 screen   0011 1100 0000 0011 */
44
+        0xffff, /* 30 audio 0  0011 1000 0000 0001 */
45
+        0xffff, /* 40 audio 1  0011 1000 0000 0001 */
46
+        0xffff, /* 50 audio 2  0011 1000 0000 0001 */
47
+        0xffff, /* 60 audio 3  0011 1000 0000 0001 */
48
+        0x0000, /* 70 midi  */
49
+        0x0000, /* 80 mouse */
50
+        0x0000, /* 90 file  */
51
+        0xffff, /* a0 file 0   0000 1110 1100 1111 */
52
+        0xffff, /* b0 file 1   0000 1110 1100 1111 */
53
+        0xffff, /* c0 datetime 1111 1111 1110 0000 */
54
+        0x0000, /* d0 empty */
55
+        0x0000, /* e0 empty */
56
+        0x0000  /* f0 empty */
57
+};
39 58
 
40 59
 int
41 60
 uxn_eval(Uxn *u, Uint16 pc)
... ...
@@ -104,8 +123,8 @@ uxn_eval(Uxn *u, Uint16 pc)
104 123
 			case 0x15: /* STA  */ t=T2;n=L;       DEC(3, 0) u->ram[t] = n; break; 
105 124
 			case 0x36: /* DEI2 */ t=T;            INC(1, 1) PUT(1, u->dei(u, t)) PUT(0, u->dei(u, t + 1)) break;      
106 125
 			case 0x16: /* DEI  */ t=T;            INC(1, 0) PUT(0, u->dei(u, t)) break;
107
-			case 0x37: /* DEO2 */ t=T;n=N;l=L;    DEC(3, 0) u->deo(u, t, l); u->deo(u, t + 1, n); break; 
108
-			case 0x17: /* DEO  */ t=T;n=N;        DEC(2, 0) u->deo(u, t, n); break; 
126
+			case 0x37: /* DEO2 */ t=T;n=N;l=L;    DEC(3, 0) SEND(t, l) SEND(t + 1, n) break; 
127
+			case 0x17: /* DEO  */ t=T;n=N;        DEC(2, 0) SEND(t, n) break; 
109 128
 			case 0x38: /* ADD2 */ t=T2;n=N2;      INC(4,-2) PUT2(0, n + t) break; 
110 129
 			case 0x18: /* ADD  */ t=T;n=N;        INC(2,-1) PUT(0, n + t) break;
111 130
 			case 0x39: /* SUB2 */ t=T2;n=N2;      INC(4,-2) PUT2(0, n - t) break; 
... ...
@@ -63,7 +63,6 @@ static void
63 63
 emu_deo(Uxn *u, Uint8 addr, Uint8 v)
64 64
 {
65 65
 	Uint8 p = addr & 0x0f, d = addr & 0xf0;
66
-	u->dev[addr] = v;
67 66
 	switch(d) {
68 67
 	case 0x00: system_deo(u, &u->dev[d], p); break;
69 68
 	case 0x10: console_deo(&u->dev[d], p); break;
... ...
@@ -130,7 +130,6 @@ static void
130 130
 emu_deo(Uxn *u, Uint8 addr, Uint8 v)
131 131
 {
132 132
 	Uint8 p = addr & 0x0f, d = addr & 0xf0;
133
-	u->dev[addr] = v;
134 133
 	switch(d) {
135 134
 	case 0x00:
136 135
 		system_deo(u, &u->dev[d], p);