7 #include "vrEmu6502/src/vrEmu6502.h"
15 #define MEM_SIZE 0x10000
16 uint8_t mem[MEM_SIZE];
18 int load_ihx(char *name) {
19 FILE *fp = fopen(name, "r");
25 int base = 0, entry_point = 0;
28 while (fgets(line, 0x100, fp)) {
29 for (char *p = line; *p; ++p)
36 fprintf(stderr, "garbage after EOF record: %s\n", line);
41 fprintf(stderr, "require colon: %s\n", line);
47 for (len = 0; len < 0x7f; ++len) {
48 char *p = line + 1 + len * 2;
59 buf[len] = (uint8_t)strtol(p, &q, 16);
62 fprintf(stderr, "not hex byte: %s\n", p);
68 fprintf(stderr, "empty line: %s\n", line);
73 for (int i = 0; i < len; ++i)
76 checksum -= buf[len - 1];
79 "checksum %02x, should be %02x\n",
88 fprintf(stderr, "incorrect length: %s\n", line);
92 int addr = (buf[1] << 8) | buf[2], end_addr;
96 end_addr = addr + len;
97 if (end_addr < addr || end_addr > MEM_SIZE) {
98 fprintf(stderr, "invalid load range: [0x%x, 0x%x)\n", addr, end_addr);
101 memcpy(mem + addr, buf + 4, len);
108 fprintf(stderr, "invalid extended linear address record: %s\n", line);
111 base = (buf[4] << 24) | (buf[5] << 16);
115 fprintf(stderr, "invalid start linear address record: %s\n", line);
118 entry_point = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7];
121 fprintf(stderr, "unknown record type: 0x%x\n", buf[3]);
126 fprintf(stderr, "no EOF record\n");
134 int read_byte(void *context, int addr) {
136 int data = mem[addr];
137 fprintf(stderr, "addr=%04x rd=%02x\n", addr, data);
144 void write_byte(void *context, int addr, int data) {
146 fprintf(stderr, "addr=%04x wr=%02x\n", addr, data);
152 uint8_t mem_read(uint16_t addr, bool isDbg) {
153 return read_byte(NULL, addr);
156 void mem_write(uint16_t addr, uint8_t val) {
157 write_byte(NULL, addr, val);
161 int main(int argc, char **argv) {
163 printf("usage: %s image.ihx\n", argv[0]);
166 int entry_point = load_ihx(argv[1]);
169 mem[0xfffc] = (uint8_t)(entry_point & 0xff);
170 mem[0xfffd] = (uint8_t)(entry_point >> 8);
172 VrEmu6502 *cpu = vrEmu6502New(CPU_W65C02, mem_read, mem_write);
182 "pc=%04x a=%02x x=%02x y=%02x s=%02x p=%02x cf=%d zf=%d if=%d df=%d vf=%d nf=%d\n",
184 vrEmu6502GetAcc(cpu),
187 vrEmu6502GetStackPointer(cpu),
188 vrEmu6502GetStatus(cpu) | 0x30,
189 vrEmu6502GetStatus(cpu) & 1,
190 (vrEmu6502GetStatus(cpu) >> 1) & 1,
191 (vrEmu6502GetStatus(cpu) >> 2) & 1,
192 (vrEmu6502GetStatus(cpu) >> 3) & 1,
193 (vrEmu6502GetStatus(cpu) >> 6) & 1,
194 (vrEmu6502GetStatus(cpu) >> 7) & 1
198 int pc = vrEmu6502GetPC(cpu);
200 vrEmu6502RunInstrs(cpu, 1, &i);
201 if (pc == vrEmu6502GetPC(cpu)) {
202 printf("hung at %04x\n", pc);
207 struct cpu_65c02 cpu;
208 cpu_65c02_init(&cpu, read_byte, NULL, write_byte, NULL);
209 cpu_65c02_reset(&cpu);
210 cpu.regs.word.pc = entry_point;
211 cpu.regs.byte.s = 0xff;
217 "pc=%04x a=%02x x=%02x y=%02x s=%02x p=%02x cf=%d zf=%d if=%d df=%d vf=%d nf=%d\n",
233 int pc = cpu.regs.word.pc;
234 cpu_65c02_execute(&cpu);
235 if (pc == cpu.regs.word.pc) {
236 printf("hung at %04x\n", pc);