comparison emu/main.c @ 28:6d32e54e5c16

emulator overhauled really, new a better memory structure also cleaned up the file system some what.
author james <jb302@eecs.qmul.ac.uk>
date Fri, 11 Apr 2014 14:38:09 +0100
parents
children 83e80c2c489c
comparison
equal deleted inserted replaced
27:a542cd390efd 28:6d32e54e5c16
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #define MAIN
5 #include "mem.h"
6 #include "iset.h"
7
8 /* fill instruction table
9 * MCS-51 - this needs to be stored in code memory */
10 void (*iset[256])(void) = {
11 NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
12 SET, CLR, SET, CLR, SET, CLR, CPL, CPL,
13 XCSD, SFA, LAF, MOV, MOV, MOV, MOV, MOV,
14 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
15 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
16 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
17 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
18 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
19 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
20 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
21 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
22 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
23 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
24 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
25 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
26 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
27 ANL, ANL, ANL, ANL, ANL, ANL, ANL, ANL,
28 ORL, ORL, ORL, ORL, ORL, ORL, ORL, ORL,
29 XRL, XRL, XRL, XRL, XRL, XRL, XRL, XRL,
30 RL, RLC, RR, RRC, INC, DEC, INC, DEC,
31 ADD, ADD, ADD, ADD, ADD, ADD, ADD, ADD,
32 ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, ADDC,
33 SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB,
34 SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, SUBB,
35 PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, PJMP,
36 PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, PCALL,
37 DJNZ, DJNZ, DJNZ, DJNZ, CJNE, CJNE, CJNE, CJNE,
38 LJMP, LCALL, RET, RETI, SJMP, JMP, JMP, CJNE,
39 JZ, JNZ, JC, JNC, JPO, JPE, JS, JNS,
40 PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, PUSH,
41 POP, POP, POP, POP, POP, POP, POP, POP,
42 MUL, DIV, DA, NOP, IN, OUT, INT, HLT
43 };
44
45 BYTE run;
46 WIDE ac;
47 BYTE args[4];
48
49 /* don't need the file on the MCS-51 version */
50 FILE *fp;
51 void
52 snd(BYTE c) {
53 /* putchar(c); */
54 fp = fopen("out", "a");
55 fputc(c, fp);
56 fclose(fp);
57 }
58
59 BYTE
60 rcv(void) {
61 return getchar();
62 }
63
64 void
65 step(void) {
66 IR = fetch();
67 (*iset[IR])();
68 }
69
70 void
71 boot(void) {
72 run = 0;
73 }
74
75
76 void dbgi() {
77 if (run == 0) {
78 switch (rcv()) {
79
80 /* step */
81 case 0x00:
82 step();
83 break;
84
85 /* run */
86 case 0x01:
87 run = 1;
88 break;
89
90 /* set reg */
91 case 0x02:
92 args[0] = rcv(); /* reg */
93 args[1] = rcv(); /* val */
94 regs[args[0]] = args[1];
95 break;
96
97 /* get reg */
98 case 0x03:
99 args[0] = rcv(); /* reg */
100 snd(regs[args[0]]);
101 break;
102
103 /* set flag */
104 case 0x04:
105 args[0] = rcv(); /* flag */
106 args[1] = rcv(); /* on? */
107 set_flag(args[0], args[1]);
108 break;
109
110 /* get flag */
111 case 0x05:
112 args[0] = rcv(); /* flag */
113 snd(get_flag(args[0]));
114 break;
115
116 /* write mem block */
117 case 0x06:
118 args[0] = rcv(); /* addr high */
119 args[1] = rcv(); /* addr low */
120 args[2] = rcv(); /* length high */
121 args[3] = rcv(); /* length low */
122 tmpw = args[1] | (args[0] << 8);
123 for (ac = tmpw; ac < (tmpw + (args[3] | (args[2] << 8))); ac++) {
124 if (ac >= 0xFFFF) {
125 break;
126 }
127 mem[ac] = rcv();
128 }
129 break;
130
131 /* read mem block */
132 case 0x07:
133 args[0] = rcv(); /* addr high */
134 args[1] = rcv(); /* addr low */
135 args[2] = rcv(); /* length high */
136 args[3] = rcv(); /* length low */
137 tmpw = args[1] | (args[0] << 8);
138 for (ac = tmpw; ac < (tmpw + (args[3] | (args[2] << 8))); ac++) {
139 if (ac >= 0xFFFF) {
140 break;
141 }
142 snd(mem[ac]);
143 }
144 break;
145
146 /* get A */
147 case 0x09:
148 snd(A);
149
150 /* get flags */
151 case 0x0F:
152 snd(flags);
153
154 /* get instruction register */
155 case 0x10:
156 snd(IR);
157 }
158 }
159 }
160
161 void
162 main(void) {
163
164 A = 0xAA;
165 IR = 0x12;
166
167 unsigned char i;
168 for (i = 0 ; i < 8 ; i++) {
169 set_flag(i, 1);
170 }
171
172 set_wide(DPTR, 0xDE1D);
173 set_wide(PC, 0xBEFA);
174 set_wide(SP, 0xADEA);
175 set_wide(TMP, 0xEFC3);
176
177 for (i = 0; i < 4; i++) {
178 regs[i] = i;
179 }
180
181 for (i = 8; i < 0x0C; i++) {
182 regs[i] = 0x10 | (i - 8);
183 }
184
185 /* 0xAA 0x12 0xFF
186 * 0x00 0x01 0x02 0x03
187 * 0xDE 0xAD 0xBE 0xFF
188 * 0x10 0x11 0x12 0x13
189 * 0x1D 0xEA 0xFA 0xC3 */
190
191 putchar(A);
192 putchar(IR);
193 putchar(flags);
194
195 for (i = 0; i < 0x10; i++) {
196 putchar(regs[i]);
197 }
198
199 unsigned short int data_pointer = get_wide(DPTR);
200 unsigned short int program_counter = get_wide(PC);
201 unsigned short int stack_pointer = get_wide(SP);
202 unsigned short int temp = get_wide(tmp);
203
204
205
206
207 }
208