7 #include "VCC/mc6809.h"
8 #include "VCC/tcc1014mmu.h"
16 #define MEM_SIZE 0x10000
17 uint8_t mem[MEM_SIZE];
19 int load_ihx(char *name) {
20 FILE *fp = fopen(name, "r");
26 int base = 0, entry_point = 0;
29 while (fgets(line, 0x100, fp)) {
30 for (char *p = line; *p; ++p)
37 fprintf(stderr, "garbage after EOF record: %s\n", line);
42 fprintf(stderr, "require colon: %s\n", line);
48 for (len = 0; len < 0x7f; ++len) {
49 char *p = line + 1 + len * 2;
60 buf[len] = (uint8_t)strtol(p, &q, 16);
63 fprintf(stderr, "not hex byte: %s\n", p);
69 fprintf(stderr, "empty line: %s\n", line);
74 for (int i = 0; i < len; ++i)
77 checksum -= buf[len - 1];
80 "checksum %02x, should be %02x\n",
89 fprintf(stderr, "incorrect length: %s\n", line);
93 int addr = (buf[1] << 8) | buf[2], end_addr;
97 end_addr = addr + len;
98 if (end_addr < addr || end_addr > MEM_SIZE) {
99 fprintf(stderr, "invalid load range: [0x%x, 0x%x)\n", addr, end_addr);
102 memcpy(mem + addr, buf + 4, len);
109 fprintf(stderr, "invalid extended linear address record: %s\n", line);
112 base = (buf[4] << 24) | (buf[5] << 16);
116 fprintf(stderr, "invalid start linear address record: %s\n", line);
119 entry_point = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7];
122 fprintf(stderr, "unknown record type: 0x%x\n", buf[3]);
127 fprintf(stderr, "no EOF record\n");
135 int read_byte(void *context, int addr) {
157 fprintf(stderr, "addr=%04x rd=%02x\n", addr, data);
162 void write_byte(void *context, int addr, int data) {
164 fprintf(stderr, "addr=%04x wr=%02x\n", addr, data);
190 void SetMapType(unsigned char type) {
193 unsigned char MemRead8(short unsigned int addr) {
194 return read_byte(NULL, addr);
197 unsigned short MemRead16(unsigned short addr) {
198 int result = MemRead8(addr) << 8;
199 return result | MemRead8(addr + 1);
202 void MemWrite8(unsigned char value, unsigned short addr) {
203 write_byte(NULL, addr, value);
206 void MemWrite16(unsigned short data,unsigned short addr) {
207 MemWrite8(data >> 8, addr);
208 MemWrite8(data & 0xFF, addr + 1);
213 int main(int argc, char **argv) {
215 printf("usage: %s image.ihx\n", argv[0]);
220 mem[0xa000] = 3; // bit 0 = rdrf, bit 1 = tdre
230 "pc=%04x d=%04x u=%04x s=%04x x=%04x y=%04x cc=%02x ef=%d ff=%d hf=%d if=%d nf=%d zf=%d vf=%d cf=%d\n",
260 cpu_6809_init(&cpu, read_byte, NULL, write_byte, NULL);
261 cpu_6809_reset(&cpu);
267 "pc=%04x d=%04x u=%04x s=%04x x=%04x y=%04x cc=%02x ef=%d ff=%d hf=%d if=%d nf=%d zf=%d vf=%d cf=%d\n",
286 cpu_6809_execute(&cpu);