OSDN Git Service

nmi bug fix.
[motonesemu/motonesemu.git] / emulator / rom.c
index dd80c7b..cd24f92 100644 (file)
@@ -1,12 +1,12 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
-#include <pthread.h>
-#include <semaphore.h>
 
 #include "tools.h"
 #include "clock.h"
 
+void release_bus(void);
+
 struct rom_pin {
     unsigned int rw     :1;     /*assert on write.*/
     unsigned int ce     :1;     /*chip enable*/
@@ -15,15 +15,12 @@ struct rom_pin {
 static struct rom_pin rom_pin_status;
 static unsigned short rom_addr;
 static unsigned char rom_data;
-static pthread_t rom_thread_id;
-static int rom_end_loop;
-static sem_t rom_sem_id;
 
 #define ROM_32K 0x8000
 
-unsigned char * rom_buffer;
+static unsigned char * rom_buffer;
 
-int load_rom_file(FILE* cartridge, int num_rom_bank) {
+int load_prg_rom(FILE* cartridge, int num_rom_bank) {
     int len;
 
     rom_buffer = malloc(ROM_32K);
@@ -46,62 +43,38 @@ unsigned char get_rom_data(void) {
 void set_rom_ce_pin(int ce) {
     rom_pin_status.ce = ce;
     //let rom write the value on the bus.
-    sem_post(&rom_sem_id);
-}
-
-static void *rom_loop(void* arg) {
-    //rom data load delay is 1/10 (dummy interval)
-    struct timespec ts = {CPU_CLOCK_SEC, CPU_CLOCK_NSEC / 10};
-
-    while (!rom_end_loop) {
-        sem_wait(&rom_sem_id);
-        if (rom_pin_status.ce) {
-            nanosleep(&ts, NULL);
+    if (ce) {
             rom_data = rom_buffer[rom_addr];
-        }
+            release_bus();
     }
-    return NULL;
 }
 
 int init_rom(void) {
-    int ret;
-    pthread_attr_t attr;
-
     rom_buffer = NULL;
     rom_addr = 0;
     rom_data = 0;
     rom_pin_status.rw = 0;
     rom_pin_status.ce = 0;
 
-    rom_end_loop = FALSE;
-
-    ret = pthread_attr_init(&attr);
-    if (ret != RT_OK)
-        return FALSE;
-
-    rom_thread_id = 0;
-    ret = pthread_create(&rom_thread_id, &attr, rom_loop, NULL);
-    if (ret != RT_OK)
-        return FALSE;
-
-    ret = sem_init(&rom_sem_id, 0, 0);
-    if (ret != RT_OK)
-        return FALSE;
-
     return TRUE;
 }
 
-void clear_rom(void) {
-    void* ret;
-    rom_end_loop = TRUE;
-    //join the running thread.
-    sem_post(&rom_sem_id);
-    pthread_join(rom_thread_id, &ret);
-
-    sem_destroy(&rom_sem_id);
-    dprint("rom thread joined.\n");
-
+void clean_rom(void) {
     if (rom_buffer)
         free(rom_buffer);
 }
 
+/*
+ * for debug.c
+ * */
+unsigned char dbg_rom_get_byte(unsigned short offset) {
+    return rom_buffer[offset];
+}
+unsigned short dbg_rom_get_short(unsigned short offset) {
+    unsigned short ret;
+    //little endian. low byte first.
+    ret = rom_buffer[offset];
+    ret |= (rom_buffer[offset + 1] << 8);
+    return ret;
+}
+