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