Further implementation of I/O

This commit is contained in:
Luxdragon 2024-01-14 17:50:35 +01:00
parent b9f6acdd76
commit b0536826aa

View file

@ -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