Merge branch 'wip-crap' of https://github.com/beeanyew/pistorm into wip-crap

This commit is contained in:
just nine
2020-03-03 07:16:02 +00:00
3 changed files with 9005 additions and 8969 deletions

View File

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

View File

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

File diff suppressed because it is too large Load Diff