Nova Formo (DEBUG necesota)
This commit is contained in:
parent
2b343e6dca
commit
8e0625a750
1 changed files with 26 additions and 28 deletions
|
@ -3,10 +3,10 @@
|
|||
#include <stdint.h> // for the uintx_t's
|
||||
#include <unistd.h> // for sleep
|
||||
#include <gtk/gtk.h>
|
||||
#include <pthread.h>
|
||||
|
||||
// gcc emulator_shell.c `pkg-config --cflags --libs gtk+-3.0` -o emulator
|
||||
// gcc emulator_shell.c `pkg-config --cflags --libs gtk+-3.0` -lpthread -o emulator
|
||||
|
||||
#define FREQUENCY 500
|
||||
#define WIDTH 224
|
||||
#define HEIGHT 256
|
||||
|
||||
|
@ -986,16 +986,6 @@ void keyUp( uint8_t key)
|
|||
}
|
||||
}
|
||||
|
||||
void simulateNanoseconds(unsigned int numNanoseconds)
|
||||
{
|
||||
struct timespec sleepTime;
|
||||
sleepTime.tv_sec = 0;
|
||||
sleepTime.tv_nsec = numNanoseconds;
|
||||
|
||||
// Pause the program execution for the specified duration
|
||||
nanosleep(&sleepTime, NULL);
|
||||
}
|
||||
|
||||
typedef struct cpu_data {
|
||||
char done;
|
||||
int total_cycles_count;
|
||||
|
@ -1008,18 +998,24 @@ typedef struct cpu_data {
|
|||
|
||||
static void draw_callback(GtkWidget *widget, cairo_t *cr, gpointer user_data) {
|
||||
int x, y;
|
||||
for (y = 0; y < HEIGHT; y++) {
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
int upscaleFactor = 4;
|
||||
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
for (y = 0; y < HEIGHT; y++) {
|
||||
if (bitmap[y * WIDTH + x]) {
|
||||
cairo_rectangle(cr, x, y, 1, 1);
|
||||
cairo_fill(cr);
|
||||
cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); // Set color to white
|
||||
} else {
|
||||
cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); // Set color to black
|
||||
}
|
||||
|
||||
cairo_rectangle(cr, x * upscaleFactor, y * upscaleFactor, upscaleFactor, upscaleFactor);
|
||||
cairo_fill(cr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean cpu(gpointer user_data) {
|
||||
cpu_data *cpu = user_data;
|
||||
void *cpu(void* arg) {
|
||||
cpu_data *cpu = (cpu_data*) arg;
|
||||
char done = cpu->done;
|
||||
State8080* state = cpu->state;
|
||||
int counter;
|
||||
|
@ -1028,10 +1024,10 @@ static gboolean cpu(gpointer user_data) {
|
|||
counter = emulate8080(cpu->state);
|
||||
cpu->total_cycles_count += counter;
|
||||
|
||||
simulateNanoseconds(FREQUENCY * counter); // EMULATION OF THE PROCESSOR ŠPEED
|
||||
usleep(counter / 2); // EMULATION OF THE PROCESSOR ŠPEED
|
||||
if ((cpu->total_cycles_count > 16000000) && (state->int_enable)) //1/60 second has elapsed
|
||||
{
|
||||
gtk_widget_queue_draw(user_data);
|
||||
//redraw screen() will be handeled by the gtk_main() function
|
||||
if (which_interrupt == 2) {
|
||||
generateInterrupt(state, 2); //interrupt 2
|
||||
cpu->total_cycles_count = 0;
|
||||
|
@ -1067,7 +1063,6 @@ int main (int argc, char *argv[]) {
|
|||
// GTK INIT
|
||||
gtk_init(&argc, &argv);
|
||||
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||
g_print("Test\n");
|
||||
gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
|
||||
gtk_window_set_title(GTK_WINDOW(window), "Lux8080-Emulator");
|
||||
g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);
|
||||
|
@ -1077,24 +1072,27 @@ int main (int argc, char *argv[]) {
|
|||
// DRAWING AREA INIT
|
||||
bitmap = &(state->memory[0x2400]);
|
||||
GtkWidget *drawing_area = gtk_drawing_area_new();
|
||||
gtk_widget_set_app_paintable(drawing_area, TRUE);
|
||||
gtk_container_add(GTK_CONTAINER(window), drawing_area);
|
||||
g_signal_connect(drawing_area, "draw", G_CALLBACK(draw_callback), NULL);
|
||||
gtk_widget_show_all(window);
|
||||
|
||||
|
||||
|
||||
// CPU INIT
|
||||
// CPU INIT
|
||||
cpu_data *cpu_eco = malloc(sizeof(cpu_data));
|
||||
cpu_eco->state = state;
|
||||
cpu_eco->drawing_area = drawing_area;
|
||||
cpu_eco->done = 0;
|
||||
cpu_eco->total_cycles_count = 0;
|
||||
g_idle_add(cpu, cpu_eco);
|
||||
|
||||
// PTHREAD
|
||||
pthread_t pid;
|
||||
pthread_create(&pid, NULL, cpu, (void*) cpu_eco);
|
||||
|
||||
|
||||
//MAIN LOOP & TERMINATION
|
||||
|
||||
//MAIN LOOP & TERMINATION //gtk_widget_queue_draw
|
||||
g_timeout_add(16, (GSourceFunc)gtk_widget_queue_draw, drawing_area);
|
||||
gtk_main();
|
||||
pthread_join(pid, NULL);
|
||||
free(state->memory);
|
||||
free(state);
|
||||
free(cpu_eco);
|
||||
|
|
Loading…
Reference in a new issue