From b0536826aaa49cc9dd0aeb58ca69d167c6d2fcd6 Mon Sep 17 00:00:00 2001 From: Luxdragon Date: Sun, 14 Jan 2024 17:50:35 +0100 Subject: [PATCH] Further implementation of I/O --- emulator_shell.c | 106 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 95 insertions(+), 11 deletions(-) diff --git a/emulator_shell.c b/emulator_shell.c index d0d32ee..85bf70a 100644 --- a/emulator_shell.c +++ b/emulator_shell.c @@ -16,10 +16,27 @@ static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer use case GDK_KEY_Left: // Code to be executed when the left arrow key is pressed down g_print("Left arrow key pressed down\n"); + keyDown(1); break; case GDK_KEY_Right: // Code to be executed when the right arrow key is pressed down g_print("Right arrow key pressed down\n"); + keyDown(2); + break; + case GDK_KEY_space: + // Code to be executed when the space bar is pressed down + g_print("Space bar pressed down\n"); + keyDown(3); + break; + case GDK_KEY_c: + // Code to be executed when the 'c' key is pressed down + g_print("'c' key pressed down\n"); + keyDown(0); + break; + case GDK_KEY_s: + // Code to be executed when the 's' key is pressed down + g_print("'s' key pressed down\n"); + keyDown(4); break; } @@ -33,11 +50,29 @@ static gboolean on_key_release(GtkWidget *widget, GdkEventKey *event, gpointer u case GDK_KEY_Left: // Code to be executed when the left arrow key is released g_print("Left arrow key released\n"); + keyUp(1); break; case GDK_KEY_Right: // Code to be executed when the right arrow key is released g_print("Right arrow key released\n"); + keyUp(2); break; + case GDK_KEY_space: + // Code to be executed when the space bar is pressed down + g_print("Space bar released\n"); + keyUp(3); + break; + case GDK_KEY_c: + // Code to be executed when the 'c' key is pressed down + g_print("'c' key released\n"); + keyUp(0); + break; + case GDK_KEY_s: + // Code to be executed when the 's' key is pressed down + g_print("'s' key released\n"); + keyUp(4); + break; + } } return FALSE; @@ -45,6 +80,8 @@ static gboolean on_key_release(GtkWidget *widget, GdkEventKey *event, gpointer u //===== EMULATOR SETUP ===== +uint8_t in_port; //GLOBALLY DECLARED + typedef struct ConditionCodes { //bitfields for condition codes //the number following the variables sets the number of bits @@ -430,14 +467,14 @@ uint8_t machineIn(State8080* state, uint8_t port) { a = 1; break; case 2: - a = 0; + a = in_port; break; case 3: { uint16_t v = (state->shift1<<8) | (state->shift0); a = ((v >> (8-state->shift_offset)) & 0xff); } - break; + break; } return a; } @@ -586,7 +623,8 @@ int emulate8080(State8080* state) { uint32_t hl = (state->h << 8) | state->l; uint32_t result = hl + hl; state->h = (result & 0xff00) >> 8; - state->l = result & 0xff; + state->l = result & 0xff;0[*opcode]; +} state->cc.cy = ((result & 0xffff0000) != 0); } break; @@ -857,6 +895,7 @@ int emulate8080(State8080* state) { default: unknownInstruction(state); break; } printState(state); + return cycles8080[*opcode]; } void generateInterrupt(State8080* state, int interrupt_num) @@ -891,16 +930,52 @@ void read_Space_Invaders_ROM(State8080* state, const char* filename, int offset) fclose(file); } +void keyDown(uint8_t key) +{ + switch(key) { + case 0: // COIN + in_port |= 0x1; + break; + case 1: // LEFT + in_port |= 0x20; + break; + case 2: // RIGHT + in_port |= 0x40; + break; + case 3: // FIRE + in_port |= 0x10; + break; + case 4: // START + in_port |= 0x04; + break; + } +} + +void keyUp( uint8_t key) +{ + switch(key) { + case 0: // COIN + in_port &= ~0x1; + break; + case 1: // LEFT + in_port &= ~0x20; + break; + case 2: // RIGHT + in_port &= ~0x40; + break; + case 3: // FIRE + in_port &= ~0x10; + break; + case 4: // START + in_port &= ~0x04; + break; + } +} + int main (int argc, char *argv[]) { - // GTK INIT - gtk_init(&argc, &argv); - GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - g_print("Test\n"); - g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL); - g_signal_connect(window, "key-release-event", G_CALLBACK(on_key_release), NULL); - gtk_widget_show(window); + // EMULATOR INIT @@ -919,11 +994,20 @@ int main (int argc, char *argv[]) { read_Space_Invaders_ROM(state, "ROM/invaders.f", 0x1000); read_Space_Invaders_ROM(state, "ROM/invaders.e", 0x1800); + // GTK INIT + gtk_init(&argc, &argv); + GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + g_print("Test\n"); + g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL); + g_signal_connect(window, "key-release-event", G_CALLBACK(on_key_release), NULL); + gtk_widget_show(window); + int i = 0; char done = 0; + int counter; while (!done) { - emulate8080(state); + counter = emulate8080(state); i++; sleep(0.00001); if ( time() - lastInterrupt > 1.0/60.0) //1/60 second has elapsed