... | ... |
@@ -21,13 +21,18 @@ error(char *msg, const char *err) |
21 | 21 |
} |
22 | 22 |
|
23 | 23 |
void |
24 |
-console_onread(void) |
|
24 |
+console_onread(Uint8 *b) |
|
25 | 25 |
{ |
26 |
+ (void)b; |
|
26 | 27 |
} |
27 | 28 |
|
28 | 29 |
void |
29 |
-console_onwrite(void) |
|
30 |
+console_onwrite(Uint8 *b) |
|
30 | 31 |
{ |
32 |
+ if(b) { |
|
33 |
+ printf("%c", *b); |
|
34 |
+ *b = 0x00; |
|
35 |
+ } |
|
31 | 36 |
} |
32 | 37 |
|
33 | 38 |
void |
... | ... |
@@ -114,15 +114,12 @@ lituxn(Uxn *u, Uint8 instr) |
114 | 114 |
} |
115 | 115 |
|
116 | 116 |
int |
117 |
-devuxn(Uxn *u) /* experimental */ |
|
117 |
+devuxn(Uxn *u) |
|
118 | 118 |
{ |
119 | 119 |
int i; |
120 | 120 |
for(i = 0; i < u->devices; ++i) { |
121 |
- Uint16 addr = u->dev[i].w; |
|
122 |
- if(u->ram.dat[addr]) { |
|
123 |
- printf("%c", u->ram.dat[addr]); |
|
124 |
- u->ram.dat[addr] = 0; |
|
125 |
- } |
|
121 |
+ u->dev[i].wfn(&u->ram.dat[u->dev[i].w]); |
|
122 |
+ u->dev[i].rfn(&u->ram.dat[u->dev[i].r]); |
|
126 | 123 |
} |
127 | 124 |
return 1; |
128 | 125 |
} |
... | ... |
@@ -147,10 +144,8 @@ opcuxn(Uxn *u, Uint8 instr) |
147 | 144 |
} |
148 | 145 |
|
149 | 146 |
int |
150 |
-parse(Uxn *u) /* TODO: Rename */ |
|
147 |
+stepuxn(Uxn *u, Uint8 instr) |
|
151 | 148 |
{ |
152 |
- Uint8 instr = u->ram.dat[u->ram.ptr++]; |
|
153 |
- u->counter++; |
|
154 | 149 |
if(u->literal > 0) |
155 | 150 |
return lituxn(u, instr); |
156 | 151 |
else |
... | ... |
@@ -162,8 +157,12 @@ evaluxn(Uxn *u, Uint16 vec) |
162 | 157 |
{ |
163 | 158 |
u->ram.ptr = vec; |
164 | 159 |
setflag(&u->status, FLAG_HALT, 0); |
165 |
- while(!(u->status & FLAG_HALT) && parse(u)) |
|
166 |
- ; |
|
160 |
+ while(!(u->status & FLAG_HALT)) { |
|
161 |
+ Uint8 instr = u->ram.dat[u->ram.ptr++]; |
|
162 |
+ if(!stepuxn(u, instr)) |
|
163 |
+ return 0; |
|
164 |
+ u->counter++; |
|
165 |
+ } |
|
167 | 166 |
return 1; |
168 | 167 |
} |
169 | 168 |
|
... | ... |
@@ -198,7 +197,7 @@ loaduxn(Uxn *u, char *filepath) |
198 | 197 |
/* to start: evaluxn(u, u->vreset); */ |
199 | 198 |
|
200 | 199 |
int |
201 |
-portuxn(Uxn *u, Uint16 r, Uint16 w, void (*onread)(), void (*onwrite)()) |
|
200 |
+portuxn(Uxn *u, Uint16 r, Uint16 w, void (*onread)(Uint8 *), void (*onwrite)(Uint8 *)) |
|
202 | 201 |
{ |
203 | 202 |
Device *d = &u->dev[u->devices++]; |
204 | 203 |
d->r = r; |
... | ... |
@@ -36,8 +36,8 @@ typedef struct { |
36 | 36 |
|
37 | 37 |
typedef struct { |
38 | 38 |
Uint16 r, w; |
39 |
- void (*rfn)(void); |
|
40 |
- void (*wfn)(void); |
|
39 |
+ void (*rfn)(Uint8 *); |
|
40 |
+ void (*wfn)(Uint8 *); |
|
41 | 41 |
} Device; |
42 | 42 |
|
43 | 43 |
typedef struct { |
... | ... |
@@ -54,4 +54,4 @@ int getflag(Uint8 *status, char flag); |
54 | 54 |
int loaduxn(Uxn *c, char *filepath); |
55 | 55 |
int bootuxn(Uxn *c); |
56 | 56 |
int evaluxn(Uxn *u, Uint16 vec); |
57 |
-int portuxn(Uxn *u, Uint16 r, Uint16 w, void (*onread)(), void (*onwrite)()); |
|
57 |
+int portuxn(Uxn *u, Uint16 r, Uint16 w, void (*onread)(Uint8 *), void (*onwrite)(Uint8 *)); |