Browse code

Fixed issue with vectors

neauoire authored on 05/02/2021 05:39:03
Showing 2 changed files
... ...
@@ -6,21 +6,20 @@
6 6
 @0100 
7 7
 
8 8
 :RESET ( --- )
9
-
10
-,22 ,var1 STR ( store 0x22 in var1 )
11
-,var1 LDR ( load var2, put value on stack )
12
-
13
-BRK
9
+	,1234
10
+	BRK
14 11
 
15 12
 @c000 ( much further.. )
16 13
 
17 14
 :FRAME ( --- )
18
-  BRK
15
+	,ab ,0008 str
16
+	BRK
19 17
 
20 18
 @d000 ( further still.. )
21 19
 
22 20
 :ERROR ( --- )
23
-  BRK
21
+	,cdef
22
+	BRK
24 23
 
25 24
 @FFFA ( vectors, last 3 shorts )
26 25
 
... ...
@@ -85,45 +85,39 @@ echom(Memory *m, Uint8 len, char *name)
85 85
 
86 86
 /* clang-format off */
87 87
 
88
-Uint8 mempoke8(Uint16 p) { return cpu.rom.dat[p+1] & 0xff; }
89
-Uint16 mempoke16(Uint16 p) { return (cpu.rom.dat[p] << 8) + (cpu.rom.dat[p+1] & 0xff); }
90
-void wspush(Uint8 b) { cpu.wst.dat[cpu.wst.ptr++] = b; }
91
-Uint8 wspop(void) { return cpu.wst.dat[--cpu.wst.ptr]; }
92
-void wspush16(Uint16 s) { 
93
-
94
-	printf("0x%04x\n", s);
95
-}
96
-Uint16 wspop16(void) { return wspop() + (wspop() << 8); }
97
-Uint8 wspeek(void) { return cpu.wst.dat[cpu.wst.ptr - 1]; }
98
-void rspush(Uint8 b) { cpu.rst.dat[cpu.rst.ptr++] = b; }
99
-Uint8 rspop(void) { return cpu.rst.dat[--cpu.rst.ptr]; }
88
+Uint8 mempeek8(Uint16 s) { return cpu.rom.dat[s] & 0xff; }
89
+Uint16 mempeek16(Uint16 s) { return (cpu.rom.dat[s] << 8) + (cpu.rom.dat[s+1] & 0xff); }
90
+void wspush8(Uint8 b) { cpu.wst.dat[cpu.wst.ptr++] = b; }
91
+Uint8 wspop8(void) { return cpu.wst.dat[--cpu.wst.ptr]; }
92
+Uint16 wspop16(void) { return wspop8() + (wspop8() << 8); }
93
+Uint8 wspeek8(void) { return cpu.wst.dat[cpu.wst.ptr - 1]; }
100 94
 
101 95
 void op_brk() { setflag(FLAG_HALT, 1); }
102
-void op_rts() {	cpu.rom.ptr = rspop(); }
96
+void op_rts() {	cpu.rom.ptr = cpu.rst.dat[--cpu.rst.ptr]; }
103 97
 void op_lit() { cpu.literal += cpu.rom.dat[cpu.rom.ptr++]; }
104
-void op_drp() { wspop(); }
105
-void op_dup() { wspush(wspeek()); }
106
-void op_swp() { Uint8 b = wspop(), a = wspop(); wspush(b); wspush(a); }
107
-void op_ovr() { wspush(cpu.wst.dat[cpu.wst.ptr - 2]); }
108
-void op_rot() { Uint8 c = wspop(),b = wspop(),a = wspop(); wspush(b); wspush(c); wspush(a); }
109
-void op_jmu() { cpu.rom.ptr = wspop(); }
110
-void op_jsu() { rspush(cpu.rom.ptr); cpu.rom.ptr = wspop(); }
111
-void op_jmc() { if(wspop()) op_jmu(); }
112
-void op_jsc() { if(wspop()) op_jsu(); }
113
-void op_equ() { wspush(wspop() == wspop()); }
114
-void op_neq() { wspush(wspop() != wspop()); }
115
-void op_gth() {	wspush(wspop() < wspop()); }
116
-void op_lth() {	wspush(wspop() > wspop()); }
117
-void op_and() {	wspush(wspop() & wspop()); }
118
-void op_ora() {	wspush(wspop() | wspop()); }
119
-void op_rol() { wspush(wspop() << 1); }
120
-void op_ror() { wspush(wspop() >> 1); }
121
-void op_add() { wspush(wspop() + wspop()); }
122
-void op_sub() { wspush(wspop() - wspop()); }
123
-void op_mul() { wspush(wspop() * wspop()); }
124
-void op_div() { wspush(wspop() / wspop()); }
125
-void op_ldr() { wspush(cpu.ram.dat[wspop16()]); }
126
-void op_str() { cpu.ram.dat[wspop16()] = wspop(); }
98
+void op_drp() { wspop8(); }
99
+void op_dup() { wspush8(wspeek8()); }
100
+void op_swp() { Uint8 b = wspop8(), a = wspop8(); wspush8(b); wspush8(a); }
101
+void op_ovr() { wspush8(cpu.wst.dat[cpu.wst.ptr - 2]); }
102
+void op_rot() { Uint8 c = wspop8(),b = wspop8(),a = wspop8(); wspush8(b); wspush8(c); wspush8(a); }
103
+void op_jmu() { cpu.rom.ptr = wspop8(); }
104
+void op_jsu() { cpu.rst.dat[cpu.rst.ptr++] = cpu.rom.ptr; cpu.rom.ptr = wspop8(); }
105
+void op_jmc() { if(wspop8()) op_jmu(); }
106
+void op_jsc() { if(wspop8()) op_jsu(); }
107
+void op_equ() { wspush8(wspop8() == wspop8()); }
108
+void op_neq() { wspush8(wspop8() != wspop8()); }
109
+void op_gth() {	wspush8(wspop8() < wspop8()); }
110
+void op_lth() {	wspush8(wspop8() > wspop8()); }
111
+void op_and() {	wspush8(wspop8() & wspop8()); }
112
+void op_ora() {	wspush8(wspop8() | wspop8()); }
113
+void op_rol() { wspush8(wspop8() << 1); }
114
+void op_ror() { wspush8(wspop8() >> 1); }
115
+void op_add() { wspush8(wspop8() + wspop8()); }
116
+void op_sub() { wspush8(wspop8() - wspop8()); }
117
+void op_mul() { wspush8(wspop8() * wspop8()); }
118
+void op_div() { wspush8(wspop8() / wspop8()); }
119
+void op_ldr() { wspush8(cpu.ram.dat[wspop16()]); }
120
+void op_str() { cpu.ram.dat[wspop16()] = wspop8(); }
127 121
 
128 122
 void (*ops[])(void) = {
129 123
 	op_brk, op_rts, op_lit, op_drp, op_dup, op_swp, op_ovr, op_rot, 
... ...
@@ -169,7 +163,7 @@ eval(void)
169 163
 {
170 164
 	Uint8 instr = cpu.rom.dat[cpu.rom.ptr++];
171 165
 	if(cpu.literal > 0) {
172
-		wspush(instr);
166
+		wspush8(instr);
173 167
 		cpu.literal--;
174 168
 		return 1;
175 169
 	}
... ...
@@ -194,14 +188,17 @@ start(FILE *f)
194 188
 {
195 189
 	reset();
196 190
 	fread(cpu.rom.dat, sizeof(cpu.rom.dat), 1, f);
197
-	cpu.vreset = mempoke16(0xfffa);
198
-	cpu.vframe = mempoke16(0xfffc);
199
-	cpu.verror = mempoke16(0xfffe);
191
+	cpu.vreset = mempeek16(0xfffa);
192
+	cpu.vframe = mempeek16(0xfffc);
193
+	cpu.verror = mempeek16(0xfffe);
200 194
 	/* eval reset */
195
+	printf("Phase: reset\n");
201 196
 	cpu.rom.ptr = cpu.vreset;
202 197
 	while(!(cpu.status & FLAG_HALT) && eval())
203 198
 		;
204 199
 	/*eval frame */
200
+	printf("Phase: frame\n");
201
+	setflag(FLAG_HALT, 0);
205 202
 	cpu.rom.ptr = cpu.vframe;
206 203
 	while(!(cpu.status & FLAG_HALT) && eval())
207 204
 		;