-
#include <string.h>
+#include <semaphore.h>
+
#include "tools.h"
#include "bus.h"
#include "rom.h"
static unsigned short addr_bus;
static unsigned char data_bus;
static struct cpu_pin pin_status;
+static sem_t sem_bus_wait;
/*
* NES memory map
#define IO_APU_MASK 0x001F
#define ROM_MASK 0x7FFF
+void release_bus(void) {
+ pin_status.ready = 1;
+ sem_post(&sem_bus_wait);
+}
+
void start_bus(void) {
if (addr_bus & ROM_BIT) {
/*case rom*/
+ pin_status.ready = 0;
set_rom_ce_pin(TRUE);
+
+ //wait for the bus ready.
+ sem_wait(&sem_bus_wait);
}
else if (addr_bus & IO_APU_BIT) {
}
}
else {
/*case ram*/
+ pin_status.ready = 0;
set_ram_ce_pin(TRUE);
+
+ //wait for the bus ready.
+ sem_wait(&sem_bus_wait);
}
}
}
void set_bus_addr(unsigned short addr) {
+ if (!pin_status.ready)
+ return;
+
if (addr & ROM_BIT) {
/*case rom*/
set_rom_addr(addr & ROM_MASK);
}
void set_bus_data(unsigned char data){
+ if (!pin_status.ready)
+ return;
+
if (addr_bus & ROM_BIT) {
}
else if (addr_bus & IO_APU_BIT) {
}
char get_bus_data(void) {
+ if (!pin_status.ready)
+ return 0;
+
if (addr_bus & ROM_BIT) {
data_bus = get_rom_data();
}
}
int init_bus(void) {
+ int ret;
+
addr_bus = 0;
data_bus = 0;
memset(&pin_status, 0, sizeof(struct cpu_pin));
+ pin_status.ready = 1;
+
+ ret = sem_init(&sem_bus_wait, 0, 0);
+ if (ret != RT_OK)
+ return FALSE;
+
return TRUE;
}
void clean_bus(void){
+ sem_destroy(&sem_bus_wait);
}
long sec;
long nsec;
- clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &begin);
+ clock_gettime(CLOCK_REALTIME, &begin);
dprint("-----------------\nclock ");
ch = handler_list;
while (ch != NULL) {
ch = (struct clock_handler*)ch->l.next;
}
- clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
+ clock_gettime(CLOCK_REALTIME, &end);
//calcurate sleep time.
if (end.tv_sec < begin.tv_sec )
sec = LONG_MAX - begin.tv_sec + end.tv_sec + 1;
}
unsigned char load_memory(unsigned short addr) {
- struct timespec ts = {CPU_CLOCK_SEC, CPU_CLOCK_NSEC / 2};
set_rw_pin(0);
set_bus_addr(addr);
start_bus();
-
- //must wait half cycle for the bus ready
- nanosleep(&ts, NULL);
-
cpu_data_buffer = get_bus_data();
end_bus();
}
void store_memory(unsigned short addr, unsigned char data) {
- struct timespec ts = {CPU_CLOCK_SEC, CPU_CLOCK_NSEC / 2};
set_rw_pin(1);
set_bus_addr(addr);
set_bus_data(data);
start_bus();
-
- //must wait half cycle for the bus ready
- nanosleep(&ts, NULL);
end_bus();
cpu_addr_buffer = addr;