diff --git a/apple1/main.c b/apple1/main.c index 1f2755f..67bc6db 100644 --- a/apple1/main.c +++ b/apple1/main.c @@ -96,7 +96,7 @@ int main(int argc, const char * argv[]) v6502_write(cpu->memory, v6502_memoryVectorResetHigh, RESET_VECTOR >> 8); // Attach PIA - pia_map(cpu->memory); + a1pia *pia = pia_create(cpu->memory); v6502_reset(cpu); @@ -105,6 +105,7 @@ int main(int argc, const char * argv[]) v6502_step(cpu); } + pia_destroy(pia); v6502_destroyMemory(cpu->memory); v6502_destroyCPU(cpu); } diff --git a/apple1/pia.c b/apple1/pia.c index 1543244..3a59f19 100644 --- a/apple1/pia.c +++ b/apple1/pia.c @@ -9,6 +9,7 @@ #include "pia.h" #include #include +#include #define FIXME_I_SHOULDNT_BE_NULL NULL @@ -35,13 +36,29 @@ void videoWriteNewlineCallback(struct _v6502_memory *memory, uint16_t offset, ui } uint8_t keyboardReadNewlineCallback(struct _v6502_memory *memory, uint16_t offset, int trap, void *context) { - // FIXME: this is just to satiate the woz monitor until real input is hooked up + // FIXME: this is just to satiate the woz monitor until real input is hooked up return 1; } -void pia_map(v6502_memory *mem) { - v6502_map(mem, A1PIA_KEYBOARD_INPUT, 1, FIXME_I_SHOULDNT_BE_NULL, NULL, NULL); - v6502_map(mem, A1PIA_KEYBOARD_CRLF_REG, 1, keyboardReadNewlineCallback, NULL, NULL); - v6502_map(mem, A1PIA_VIDEO_OUTPUT, 1, FIXME_I_SHOULDNT_BE_NULL, videoWriteCharCallback, NULL); - v6502_map(mem, A1PIA_VIDEO_CRLF_REG, 1, FIXME_I_SHOULDNT_BE_NULL, videoWriteNewlineCallback, NULL); -} \ No newline at end of file +static void _doCoolVideoStart(a1pia *pia) { + +} + +a1pia *pia_create(v6502_memory *mem) { + a1pia *pia = malloc(sizeof(a1pia)); + pia->memory = mem; + pia->screen = initscr(); + + v6502_map(mem, A1PIA_KEYBOARD_INPUT, 1, FIXME_I_SHOULDNT_BE_NULL, NULL, pia); + v6502_map(mem, A1PIA_KEYBOARD_CRLF_REG, 1, keyboardReadNewlineCallback, NULL, pia); + v6502_map(mem, A1PIA_VIDEO_OUTPUT, 1, FIXME_I_SHOULDNT_BE_NULL, videoWriteCharCallback, pia); + v6502_map(mem, A1PIA_VIDEO_CRLF_REG, 1, FIXME_I_SHOULDNT_BE_NULL, videoWriteNewlineCallback, pia); + + _doCoolVideoStart(pia); + return pia; +} + +void pia_destroy(a1pia *pia) { + endwin(); + free(pia); +} diff --git a/apple1/pia.h b/apple1/pia.h index fc43e4e..7749930 100644 --- a/apple1/pia.h +++ b/apple1/pia.h @@ -10,13 +10,21 @@ #define __apple1__pia__ #include +#include #define A1PIA_KEYBOARD_INPUT 0xD010 #define A1PIA_KEYBOARD_CRLF_REG 0xD011 #define A1PIA_VIDEO_OUTPUT 0xD012 #define A1PIA_VIDEO_CRLF_REG 0xD013 -// Assumes stdin/stdout -void pia_map(v6502_memory *mem); +typedef struct { + /** @brief Curses output object */ + WINDOW *screen; + /** @brief Hardwired memory used to trap video activity and report keyboard input */ + v6502_memory *memory; +} a1pia; + +a1pia *pia_create(v6502_memory *mem); +void pia_destroy(a1pia *pia); #endif /* defined(__apple1__pia__) */