mirror of
https://github.com/captain-amygdala/pistorm.git
synced 2026-01-28 12:39:10 +00:00
Merge branch 'wip-crap' of https://github.com/beeanyew/pistorm into wip-crap
This commit is contained in:
99
emulator.c
99
emulator.c
@@ -88,6 +88,13 @@ extern int m68ki_remaining_cycles;
|
||||
|
||||
#define NOP asm("nop"); asm("nop"); asm("nop"); asm("nop");
|
||||
|
||||
#define DEBUG_EMULATOR
|
||||
#ifdef DEBUG_EMULATOR
|
||||
#define DEBUG printf
|
||||
#else
|
||||
#define DEBUG(...)
|
||||
#endif
|
||||
|
||||
// Configurable emulator options
|
||||
unsigned int cpu_type = M68K_CPU_TYPE_68000;
|
||||
unsigned int loop_cycles = 300, irq_status = 0;
|
||||
@@ -95,17 +102,33 @@ struct emulator_config *cfg = NULL;
|
||||
char keyboard_file[256] = "/dev/input/event1";
|
||||
|
||||
uint64_t trig_irq = 0, serv_irq = 0;
|
||||
uint16_t irq_delay = 0;
|
||||
|
||||
void *iplThread(void *args) {
|
||||
printf("IPL thread running\n");
|
||||
uint16_t old_irq = 0;
|
||||
uint32_t value;
|
||||
|
||||
while (1) {
|
||||
if (!gpio_get_irq()) {
|
||||
value = *(gpio + 13);
|
||||
|
||||
if (!(value & (1 << PIN_IPL_ZERO))) {
|
||||
irq = 1;
|
||||
old_irq = irq_delay;
|
||||
NOP
|
||||
M68K_END_TIMESLICE;
|
||||
}
|
||||
else {
|
||||
irq = 0;
|
||||
if (irq) {
|
||||
if (old_irq) {
|
||||
old_irq--;
|
||||
}
|
||||
else {
|
||||
irq = 0;
|
||||
}
|
||||
NOP
|
||||
M68K_END_TIMESLICE;
|
||||
}
|
||||
}
|
||||
|
||||
if (gayle_ide_enabled) {
|
||||
@@ -118,18 +141,12 @@ void *iplThread(void *args) {
|
||||
gayleirq = 0;
|
||||
}
|
||||
//usleep(0);
|
||||
NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP NOP NOP
|
||||
/*NOP NOP NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP NOP NOP
|
||||
NOP NOP NOP NOP NOP NOP NOP NOP*/
|
||||
}
|
||||
return args;
|
||||
}
|
||||
@@ -178,6 +195,11 @@ int main(int argc, char *argv[]) {
|
||||
int g;
|
||||
//const struct sched_param priority = {99};
|
||||
|
||||
if (argc > 1) {
|
||||
irq_delay = atoi(argv[1]);
|
||||
printf("Setting IRQ delay to %d loops (%s).\n", irq_delay, argv[1]);
|
||||
}
|
||||
|
||||
// Some command line switch stuffles
|
||||
for (g = 1; g < argc; g++) {
|
||||
if (strcmp(argv[g], "--cpu_type") == 0 || strcmp(argv[g], "--cpu") == 0) {
|
||||
@@ -304,7 +326,7 @@ int main(int argc, char *argv[]) {
|
||||
cpu_pulse_reset();
|
||||
|
||||
char c = 0, c_code = 0, c_type = 0;
|
||||
uint32_t last_irq = 0;
|
||||
uint32_t last_irq = 0, last_last_irq = 0;
|
||||
|
||||
pthread_t id;
|
||||
int err;
|
||||
@@ -337,24 +359,30 @@ int main(int argc, char *argv[]) {
|
||||
}
|
||||
|
||||
if (irq) {
|
||||
unsigned int status = read_reg();
|
||||
if (((status & 0xe000) >> 13) != last_irq) {
|
||||
last_irq = ((status & 0xe000) >> 13);
|
||||
serv_irq++;
|
||||
M68K_SET_IRQ(last_irq);
|
||||
while (irq) {
|
||||
last_irq = ((read_reg() & 0xe000) >> 13);
|
||||
if (last_irq != last_last_irq) {
|
||||
last_last_irq = last_irq;
|
||||
M68K_SET_IRQ(last_irq);
|
||||
}
|
||||
m68k_execute(5);
|
||||
}
|
||||
if (gayleirq && int2_enabled) {
|
||||
write16(0xdff09c, 0x8000 | (1 << 3) && last_irq != 2);
|
||||
last_last_irq = last_irq;
|
||||
last_irq = 2;
|
||||
M68K_SET_IRQ(2);
|
||||
}
|
||||
M68K_SET_IRQ(0);
|
||||
last_last_irq = 0;
|
||||
}
|
||||
else if (gayleirq && int2_enabled) {
|
||||
write16(0xdff09c, 0x8000 | (1 << 3));
|
||||
last_irq = 2;
|
||||
M68K_SET_IRQ(2);
|
||||
}
|
||||
else {
|
||||
/*else {
|
||||
if (last_irq != 0) {
|
||||
last_irq = 0;
|
||||
M68K_SET_IRQ(0);
|
||||
last_last_irq = last_irq;
|
||||
last_irq = 0;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
while (get_key_char(&c, &c_code, &c_type)) {
|
||||
if (c && c == cfg->keyboard_toggle_key && !kb_hook_enabled) {
|
||||
@@ -382,9 +410,9 @@ int main(int argc, char *argv[]) {
|
||||
printf("unknown.\n");
|
||||
break;
|
||||
}*/
|
||||
if (queue_keypress(c_code, c_type, cfg->platform->id) && int2_enabled) {
|
||||
last_irq = 2;
|
||||
M68K_SET_IRQ(2);
|
||||
if (queue_keypress(c_code, c_type, cfg->platform->id) && int2_enabled && last_irq != 2) {
|
||||
//last_irq = 0;
|
||||
//M68K_SET_IRQ(2);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -480,6 +508,8 @@ void cpu_pulse_reset(void) {
|
||||
if (cfg->platform->handle_reset)
|
||||
cfg->platform->handle_reset(cfg);
|
||||
|
||||
|
||||
m68k_write_memory_16(INTENA, 0x7FFF);
|
||||
ovl = 1;
|
||||
m68k_write_memory_8(0xbfe201, 0x0001); // AMIGA OVL
|
||||
m68k_write_memory_8(0xbfe001, 0x0001); // AMIGA OVL high (ROM@0x0)
|
||||
@@ -569,19 +599,20 @@ unsigned int m68k_read_memory_8(unsigned int address) {
|
||||
send_keypress = 1;
|
||||
}
|
||||
if (send_keypress == 2) {
|
||||
// result |= 0x02;
|
||||
//result |= 0x02;
|
||||
send_keypress = 0;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
if (address == CIAADAT) {
|
||||
if (send_keypress) {
|
||||
//if (send_keypress) {
|
||||
uint8_t c = 0, t = 0;
|
||||
pop_queued_key(&c, &t);
|
||||
t ^= 0x01;
|
||||
result = ((c << 1) | t) ^ 0xFF;
|
||||
send_keypress = 2;
|
||||
}
|
||||
//M68K_SET_IRQ(0);
|
||||
//}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,11 @@ void adjust_gayle_1200();
|
||||
#define GARY_REG4 0xDE1001
|
||||
#define GARY_REG5 0xDE1002
|
||||
|
||||
#define INTENAR 0xDFF01C
|
||||
#define INTREQR 0xDFF01E
|
||||
#define INTENA 0xDFF09A
|
||||
#define INTREQ 0xDFF09C
|
||||
|
||||
#define JOY0DAT 0xDFF00A
|
||||
#define JOY1DAT 0xDFF00C
|
||||
#define CIAAPRA 0xBFE001
|
||||
|
||||
17870
rtl/bitstream.svf
17870
rtl/bitstream.svf
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user