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@29
|
45 BYTE free_run; /* free run if not 0 */
|
jb302@29
|
46 WIDE ac; /* address counter */
|
jb302@29
|
47 BYTE args[4]; /* dbg args */
|
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 dbgi() {
|
jb302@29
|
71 if (free_run == 0) {
|
jb302@28
|
72 switch (rcv()) {
|
jb302@28
|
73
|
jb302@28
|
74 /* step */
|
jb302@28
|
75 case 0x00:
|
jb302@28
|
76 step();
|
jb302@28
|
77 break;
|
jb302@28
|
78
|
jb302@28
|
79 /* run */
|
jb302@28
|
80 case 0x01:
|
jb302@29
|
81 args[0] = rcv(); /* length high */
|
jb302@29
|
82 args[1] = rcv(); /* length low */
|
jb302@29
|
83 tmpw = get_wide(PC);
|
jb302@29
|
84 for (ac = tmpw ; ac < tmpw + MWIDE(args[0], args[1]) ; ac++) {
|
jb302@29
|
85 step();
|
jb302@29
|
86 }
|
jb302@28
|
87 break;
|
jb302@28
|
88
|
jb302@28
|
89 /* set reg */
|
jb302@28
|
90 case 0x02:
|
jb302@28
|
91 args[0] = rcv(); /* reg */
|
jb302@28
|
92 args[1] = rcv(); /* val */
|
jb302@28
|
93 regs[args[0]] = args[1];
|
jb302@28
|
94 break;
|
jb302@28
|
95
|
jb302@28
|
96 /* get reg */
|
jb302@28
|
97 case 0x03:
|
jb302@28
|
98 args[0] = rcv(); /* reg */
|
jb302@28
|
99 snd(regs[args[0]]);
|
jb302@28
|
100 break;
|
jb302@28
|
101
|
jb302@28
|
102 /* set flag */
|
jb302@28
|
103 case 0x04:
|
jb302@28
|
104 args[0] = rcv(); /* flag */
|
jb302@28
|
105 args[1] = rcv(); /* on? */
|
jb302@28
|
106 set_flag(args[0], args[1]);
|
jb302@28
|
107 break;
|
jb302@28
|
108
|
jb302@28
|
109 /* get flag */
|
jb302@28
|
110 case 0x05:
|
jb302@28
|
111 args[0] = rcv(); /* flag */
|
jb302@28
|
112 snd(get_flag(args[0]));
|
jb302@28
|
113 break;
|
jb302@28
|
114
|
jb302@28
|
115 /* write mem block */
|
jb302@28
|
116 case 0x06:
|
jb302@28
|
117 args[0] = rcv(); /* addr high */
|
jb302@28
|
118 args[1] = rcv(); /* addr low */
|
jb302@28
|
119 args[2] = rcv(); /* length high */
|
jb302@28
|
120 args[3] = rcv(); /* length low */
|
jb302@29
|
121 tmpw = MWIDE(args[0], args[1]);
|
jb302@29
|
122 for (ac = tmpw; ac < tmpw + MWIDE(args[2], args[3]); ac++) {
|
jb302@28
|
123 if (ac >= 0xFFFF) {
|
jb302@28
|
124 break;
|
jb302@28
|
125 }
|
jb302@28
|
126 mem[ac] = rcv();
|
jb302@28
|
127 }
|
jb302@28
|
128 break;
|
jb302@28
|
129
|
jb302@28
|
130 /* read mem block */
|
jb302@28
|
131 case 0x07:
|
jb302@28
|
132 args[0] = rcv(); /* addr high */
|
jb302@28
|
133 args[1] = rcv(); /* addr low */
|
jb302@28
|
134 args[2] = rcv(); /* length high */
|
jb302@28
|
135 args[3] = rcv(); /* length low */
|
jb302@29
|
136 tmpw = MWIDE(args[0], args[1]);
|
jb302@29
|
137 for (ac = tmpw; ac < tmpw + MWIDE(args[2], args[3]); ac++) {
|
jb302@28
|
138 if (ac >= 0xFFFF) {
|
jb302@28
|
139 break;
|
jb302@28
|
140 }
|
jb302@28
|
141 snd(mem[ac]);
|
jb302@28
|
142 }
|
jb302@28
|
143 break;
|
jb302@28
|
144
|
jb302@28
|
145 /* get A */
|
jb302@28
|
146 case 0x09:
|
jb302@28
|
147 snd(A);
|
jb302@29
|
148 break;
|
jb302@28
|
149
|
jb302@28
|
150 /* get flags */
|
jb302@29
|
151 case 0x0A:
|
jb302@28
|
152 snd(flags);
|
jb302@29
|
153 break;
|
jb302@28
|
154
|
jb302@28
|
155 /* get instruction register */
|
jb302@29
|
156 case 0x0B:
|
jb302@28
|
157 snd(IR);
|
jb302@29
|
158 break;
|
jb302@28
|
159 }
|
jb302@28
|
160 }
|
jb302@28
|
161 }
|
jb302@28
|
162
|
jb302@28
|
163 void
|
jb302@28
|
164 main(void) {
|
jb302@29
|
165 /* dont go into free run on restart */
|
jb302@29
|
166 free_run = 0;
|
jb302@29
|
167 for (;;) {
|
jb302@29
|
168 dbgi();
|
jb302@28
|
169 }
|
jb302@28
|
170 }
|
jb302@28
|
171
|