pavone@820: #include pavone@820: #include pavone@820: #include pavone@820: #include pavone@820: #include pavone@820: pavone@820: #include "z80_to_x86.h" pavone@820: #include "util.h" pavone@820: pavone@820: uint8_t ram[64 * 1024]; pavone@820: pavone@820: #define START_OFF 0x100 pavone@820: #define OS_START 0xE400 pavone@820: #define OS_RESET 0xE403 pavone@820: int headless = 1; pavone@820: pavone@820: void z80_next_int_pulse(z80_context * context) pavone@820: { pavone@820: context->int_pulse_start = context->int_pulse_end = CYCLE_NEVER; pavone@820: } pavone@820: pavone@820: void render_errorbox(char *title, char *message) pavone@820: { pavone@820: } pavone@820: pavone@820: void render_infobox(char *title, char *message) pavone@820: { pavone@820: } pavone@820: pavone@820: void *console_write(uint32_t address, void *context, uint8_t value) pavone@820: { pavone@820: putchar(value); pavone@820: return context; pavone@820: } pavone@820: pavone@820: uint8_t console_read(uint32_t address, void *context) pavone@820: { pavone@820: return getchar(); pavone@820: } pavone@820: pavone@820: void *console_flush_write(uint32_t address, void *context, uint8_t value) pavone@820: { pavone@820: fflush(stdout); pavone@820: return context; pavone@820: } pavone@820: pavone@820: uint8_t console_status_read(uint32_t address, void *context) pavone@820: { pavone@820: fd_set read_fds; pavone@820: FD_ZERO(&read_fds); pavone@820: struct timeval timeout; pavone@820: timeout.tv_sec = 0; pavone@820: timeout.tv_usec = 0; pavone@820: FD_SET(fileno(stdin), &read_fds); pavone@820: return select(fileno(stdin)+1, &read_fds, NULL, NULL, &timeout) > 0; pavone@820: } pavone@820: pavone@820: void *exit_write(uint32_t address, void *context, uint8_t value) pavone@820: { pavone@820: exit(0); pavone@820: return context; pavone@820: } pavone@820: pavone@820: const memmap_chunk z80_map[] = { pavone@820: { 0x0000, 0x10000, 0xFFFF, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, ram, NULL, NULL, NULL, NULL}, pavone@820: }; pavone@820: pavone@820: const memmap_chunk io_map[] = { pavone@820: { 0x0, 0x1, 0xFFFF, 0, 0, NULL, NULL, NULL, console_read, console_write}, pavone@820: { 0x1, 0x2, 0xFFFF, 0, 0, NULL, NULL, NULL, console_status_read, console_flush_write}, pavone@820: { 0x2, 0x3, 0xFFFF, 0, 0, NULL, NULL, NULL, NULL, exit_write}, pavone@820: }; pavone@820: pavone@820: int main(int argc, char **argv) pavone@820: { pavone@820: FILE *f = fopen("fake_cpm.bin", "rb"); pavone@820: long fsize = file_size(f); pavone@820: if (fsize > sizeof(ram) - OS_START) { pavone@820: fsize = sizeof(ram) - OS_START; pavone@820: } pavone@820: if (fread(ram + OS_START, 1, fsize, f) != fsize) { pavone@820: fprintf(stderr, "Error reading from fake_cpm.bin\n"); pavone@820: exit(1); pavone@820: } pavone@820: f = fopen(argv[1], "rb"); pavone@820: fsize = file_size(f); pavone@820: if (fsize > OS_START - START_OFF) { pavone@820: fsize = OS_START - START_OFF; pavone@820: } pavone@820: if (fread(ram + START_OFF, 1, fsize, f) != fsize) { pavone@820: fprintf(stderr, "Error reading from file %s\n", argv[1]); pavone@820: exit(1); pavone@820: } pavone@820: fclose(f); pavone@820: ram[0] = 0xC3; pavone@820: ram[1] = OS_RESET & 0xFF; pavone@820: ram[2] = OS_RESET >> 8; pavone@820: ram[5] = 0xC3; pavone@820: ram[6] = OS_START & 0xFF; pavone@820: ram[7] = OS_START >> 8; pavone@820: pavone@820: z80_options opts; pavone@820: z80_context context; pavone@1116: init_z80_opts(&opts, z80_map, 1, io_map, 3, 1, 0xFF); pavone@820: init_z80_context(&context, &opts); pavone@820: for(;;) pavone@820: { pavone@820: z80_run(&context, 1000000); pavone@820: context.current_cycle = 0; pavone@820: } pavone@820: return 0; pavone@820: }