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;
-unsigned int amiga_reset=0, amiga_reset_last=0;
-unsigned int do_reset=0;
+const uint16_t irq_delay = 0;
+
+struct DoReset
+{
+ char pad0[64];
+ unsigned int value;
+ char pad1[64];
+};
+
+volatile struct DoReset do_reset = {0};
void *ipl_task(void *args) {
printf("IPL thread running\n");
uint16_t old_irq = 0;
uint32_t value;
+ unsigned int amiga_reset=0, amiga_reset_last=0;
while (1) {
value = *(gpio + 13);
+ if (value & (1 << PIN_TXN_IN_PROGRESS))
+ goto noppers;
if (!(value & (1 << PIN_IPL_ZERO))) {
old_irq = irq_delay;
//usleep(0);
}
}
- if(do_reset==0)
+ if(do_reset.value==0)
{
amiga_reset=(value & (1 << PIN_RESET));
if(amiga_reset!=amiga_reset_last)
if(amiga_reset==0)
{
printf("Amiga Reset is down...\n");
- do_reset=1;
+ do_reset.value=1;
M68K_END_TIMESLICE;
}
else
}*/
//usleep(0);
//NOP NOP
+noppers:
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;
}
+static inline unsigned int inline_read_status_reg() {
+ *(gpio + 7) = (REG_STATUS << PIN_A0);
+ *(gpio + 7) = 1 << PIN_RD;
+ *(gpio + 7) = 1 << PIN_RD;
+ *(gpio + 7) = 1 << PIN_RD;
+ *(gpio + 7) = 1 << PIN_RD;
+
+ unsigned int value = *(gpio + 13);
+
+ *(gpio + 10) = 0xffffec;
+
+ return (value >> 8) & 0xffff;
+}
+
void *cpu_task() {
m68ki_cpu_core *state = &m68ki_cpu;
m68k_pulse_reset(state);
}
}
- if (irq) {
- last_irq = ((read_reg() & 0xe000) >> 13);
- if (last_irq != last_last_irq) {
+ while (irq) {
+ last_irq = ((inline_read_status_reg() & 0xe000) >> 13);
+ if (last_irq != 0 && last_irq != last_last_irq) {
last_last_irq = last_irq;
M68K_SET_IRQ(last_irq);
}
- } else if (!irq && last_last_irq != 0) {
- M68K_SET_IRQ(0);
+ m68k_execute(state, 50);
+ }
+ if (!irq && last_last_irq != 0) {
+ //M68K_SET_IRQ(0);
last_last_irq = 0;
}
- if (do_reset) {
+ if (do_reset.value) {
cpu_pulse_reset();
- do_reset=0;
+ do_reset.value=0;
usleep(1000000); // 1sec
rtg_on=0;
// while(amiga_reset==0);
usleep(0);
}
- printf("IRQs triggered: %lld\n", trig_irq);
- printf("IRQs serviced: %lld\n", serv_irq);
exit(0);
}
void cpu_pulse_reset(void) {
m68ki_cpu_core *state = &m68ki_cpu;
ps_pulse_reset();
- 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)
+ if (cfg->platform->handle_reset)
+ cfg->platform->handle_reset(cfg);
m68k_pulse_reset(state);
}
uint32_t cdtv_dmac_read(uint32_t address, uint8_t type);
void cdtv_dmac_write(uint32_t address, uint32_t value, uint8_t type);
+unsigned int garbage = 0;
+
static inline void inline_write_16(unsigned int address, unsigned int data) {
*(gpio + 0) = GPFSEL0_OUTPUT;
*(gpio + 1) = GPFSEL1_OUTPUT;
*(gpio + 2) = GPFSEL2_INPUT;
while (*(gpio + 13) & (1 << PIN_TXN_IN_PROGRESS)) {}
+ NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP
}
static inline void inline_write_8(unsigned int address, unsigned int data) {
*(gpio + 2) = GPFSEL2_INPUT;
while (*(gpio + 13) & (1 << PIN_TXN_IN_PROGRESS)) {}
+ NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP
}
static inline void inline_write_32(unsigned int address, unsigned int value) {
return 0;
}
+static inline void ps_write(uint8_t type, uint32_t addr, uint32_t val) {
+ switch (type) {
+ case OP_TYPE_BYTE:
+ inline_write_8(addr, val);
+ return;
+ case OP_TYPE_WORD:
+ inline_write_16(addr, val);
+ return;
+ case OP_TYPE_LONGWORD:
+ inline_write_32(addr, val);
+ return;
+ }
+ // This shouldn't actually happen.
+ return;
+}
+
static inline int32_t platform_read_check(uint8_t type, uint32_t addr, uint32_t *res) {
switch (cfg->platform->id) {
case PLATFORM_AMIGA:
if (val & 0x10 && !ovl) {
ovl = 1;
printf("[MAC] OVL on.\n");
+ handle_ovl_mappings_mac68k(cfg);
} else if (ovl) {
ovl = 0;
printf("[MAC] OVL off.\n");
+ handle_ovl_mappings_mac68k(cfg);
}
break;
}