Mercurial > repos > simple16
view src/main.c @ 15:c8a0dbd7752c
Forgot to commit SDL code
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 27 Mar 2016 21:31:34 -0700 |
parents | 04d8efe7a1f0 |
children | ae58e7c3c328 |
line wrap: on
line source
#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "cpu.h" #include "vdp.h" #include "system.h" #define CYCLES_PER_FRAME (832*262) uint8_t rom[48 * 1024]; uint8_t ram[16 * 1024]; enum { PORT_CONTROLLER_1, PORT_CONTROLLER_2, PORT_CONTROLLER_3, PORT_CONTROLLER_4, PORT_FREQUENCY_A, PORT_FREQUENCY_B, PORT_FREQUENCY_C, PORT_FREQUENCY_D, PORT_VOLUME_AB, PORT_VOLUME_CD, PORT_TIMER, PORT_SERIAL, PORT_VERTICAL, PORT_HORIZONTAL, PORT_VRAM_ADDRESS, PORT_VRAM_DATA }; typedef struct { cpu *proc; vdp video; } console; void debug_port_write(cpu *context, uint8_t port, uint16_t value) { putchar(value); } uint16_t debug_port_read(cpu *context, uint8_t port) { return getchar(); } void vertical_port_write(cpu *context, uint8_t port, uint16_t value) { console *system = context->system; vdp_run(&system->video, context->cycles); system->video.vscroll = value; } uint16_t vertical_port_read(cpu *context, uint8_t port) { console *system = context->system; vdp_run(&system->video, context->cycles); return system->video.vcounter; } void horizontal_port_write(cpu *context, uint8_t port, uint16_t value) { console *system = context->system; vdp_run(&system->video, context->cycles); system->video.hscroll = value; } uint16_t horizontal_port_read(cpu *context, uint8_t port) { console *system = context->system; vdp_run(&system->video, context->cycles); return system->video.hcounter; } void address_port_write(cpu *context, uint8_t port, uint16_t value) { console *system = context->system; vdp_run(&system->video, context->cycles); vdp_write_address(&system->video, value); } uint16_t address_port_read(cpu *context, uint8_t port) { console *system = context->system; vdp_run(&system->video, context->cycles); return system->video.status; } void data_port_write(cpu *context, uint8_t port, uint16_t value) { console *system = context->system; vdp_run(&system->video, context->cycles); vdp_write_data(&system->video, value); } memory_region regions[] = { {rom, 0, sizeof(rom)-1, MEM_READ}, {ram, sizeof(rom), sizeof(rom)-1+sizeof(ram), MEM_READ}, }; void run_console(console *context) { for(;;) { run_cpu(context->proc, CYCLES_PER_FRAME); vdp_run(&context->video, CYCLES_PER_FRAME); context->proc->cycles -= CYCLES_PER_FRAME; context->video.cycles -= CYCLES_PER_FRAME; } } int main(int argc, char **argv) { if (argc < 2) { fputs("usage: s16 FILE\n", stderr); return 1; } FILE *f = fopen(argv[1], "rb"); if (!f) { fprintf(stderr, "Failed to open %s for reading\n", argv[1]); return 1; } size_t read; if ((read = fread(rom, 1, sizeof(rom), f)) < sizeof(rom)) { memset(rom + read, 0xFF, sizeof(rom)-read); } console context; context.proc = alloc_cpu(10, sizeof(regions)/sizeof(memory_region), regions); context.proc->system = &context; vdp_init(&context.video, 2); context.proc->port_handlers[PORT_SERIAL].write = debug_port_write; context.proc->port_handlers[PORT_SERIAL].read = debug_port_read; context.proc->port_handlers[PORT_VERTICAL].write = vertical_port_write; context.proc->port_handlers[PORT_VERTICAL].read = vertical_port_read; context.proc->port_handlers[PORT_HORIZONTAL].write = horizontal_port_write; context.proc->port_handlers[PORT_HORIZONTAL].read = horizontal_port_read; context.proc->port_handlers[PORT_VRAM_ADDRESS].write = address_port_write; context.proc->port_handlers[PORT_VRAM_ADDRESS].read = address_port_read; context.proc->port_handlers[PORT_VRAM_DATA].write = data_port_write; if (!system_init(640, 480)) { return 1; } run_console(&context); return 0; }