| ... | ... |
@@ -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; |