From d94b48a7aa3af74257491bde29265d37e061d671 Mon Sep 17 00:00:00 2001 From: nine Date: Sun, 21 Feb 2021 01:11:09 +0000 Subject: [PATCH 01/11] use menu key (in addition to rmeta) for ramiga many pc keyboards omit right meta (windows) key since in windows it serves the same functin as the left meta (windows) key. --- input/input.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/input.c b/input/input.c index 7da63ea..d4d17f2 100644 --- a/input/input.c +++ b/input/input.c @@ -23,7 +23,7 @@ char keymap_amiga[256] = { \ /*50*/ 0x1E, 0x1F, 0x0F, 0x3C, NONE, NONE, 0x30, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, \ /*60*/ 0x43, NONE, 0x5C, NONE, NONE, NONE, 0x5F, 0x4C, 0x5A, 0x4F, 0x4E, NONE, 0x4D, NONE, 0x0D, 0x46, \ /*70*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, 0x66, 0x67, NONE, \ -/*80*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, \ +/*80*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, 0x67, NONE, NONE, NONE, NONE, \ /*90*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, \ /*A0*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, \ /*B0*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, \ From 08de466db4cdecbaba6fc9140e9fb1a0e5f03695 Mon Sep 17 00:00:00 2001 From: nine Date: Sun, 21 Feb 2021 01:27:14 +0000 Subject: [PATCH 02/11] only display SERDAT lsb --- emulator.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/emulator.c b/emulator.c index 4d34965..7c82712 100644 --- a/emulator.c +++ b/emulator.c @@ -659,8 +659,10 @@ void m68k_write_memory_16(unsigned int address, unsigned int value) { }*/ if (address == 0xDFF030) { - char *beb = (char *)&value; - printf("%c%c", beb[1], beb[0]); + char *serdat = (char *)&value; + // SERDAT word. see amiga dev docs appendix a; upper byte is control codes, and bit 0 is always 1. + // ignore this upper byte as it's not viewable data, only display lower byte. + printf("%c", serdat[0]); } if (address == 0xDFF09A) { if (!(value & 0x8000)) { From 4d09a0ad8b041e57164e30b1232e57452fbdda41 Mon Sep 17 00:00:00 2001 From: nine Date: Sun, 21 Feb 2021 01:27:51 +0000 Subject: [PATCH 03/11] ignore compiled emu binary --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8e3ac16..5b7f6eb 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ /m68kmake.exe /m68kops.c /m68kops.h +/emulator From 8e6b223befe075540dc9cee523bcfc434fd9821d Mon Sep 17 00:00:00 2001 From: nine Date: Sun, 21 Feb 2021 01:32:33 +0000 Subject: [PATCH 04/11] update config for newer openocd in raspios --- 68new.cfg | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/68new.cfg b/68new.cfg index a09ffb5..4ea3c2e 100644 --- a/68new.cfg +++ b/68new.cfg @@ -1,27 +1,22 @@ # this supports ECP5 Evaluation Board reset_config none -interface bcm2835gpio - - +adapter driver bcm2835gpio #bcm2835gpio_peripheral_base 0x20000000 bcm2835gpio_peripheral_base 0x3F000000 - # Transition delay calculation: SPEED_COEFF/khz - SPEED_OFFSET # These depend on system clock, calibrated for stock 700MHz # bcm2835gpio_speed SPEED_COEFF SPEED_OFFSET #bcm2835gpio_speed_coeffs 146203 36 bcm2835gpio_speed_coeffs 194938 48 - - #bcm2835gpio_peripheral_base 0x3F000000 #bcm2835gpio_speed_coeffs 194938 48 reset_config none -adapter_khz 100 +adapter speed 100 # JTAG tck tms tdi tdo bcm2835gpio_jtag_nums 26 24 27 25 @@ -31,7 +26,7 @@ bcm2835gpio_srst_num 5 reset_config srst_only srst_open_drain transport select jtag -jtag newtap max2 tap -irlen 11 -expected-id 0x020a20dd +jtag newtap max2 tap -irlen 11 -expected-id 0x020a20dd init svf ./rtl/bitstream.svf -quiet sleep 200 From 0de35feb3dfed8f397dbfaca811c3f3a1933a17c Mon Sep 17 00:00:00 2001 From: nine Date: Sun, 21 Feb 2021 01:55:03 +0000 Subject: [PATCH 05/11] send nmi/int7 when pause pressed --- emulator.c | 5 +++++ input/input.c | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/emulator.c b/emulator.c index 7c82712..d50a91b 100644 --- a/emulator.c +++ b/emulator.c @@ -383,6 +383,11 @@ int main(int argc, char *argv[]) { if (c == 'S' && realtime_disassembly) { do_disasm = 128; } + + // pause pressed; trigger nmi (int level 7) + if (c == 0x01) { + m68k_set_irq(7); + } } } } diff --git a/input/input.c b/input/input.c index d4d17f2..1acb722 100644 --- a/input/input.c +++ b/input/input.c @@ -65,6 +65,12 @@ int handle_modifier(struct input_event *ev) { #define KEYCASE(a, b, c)case a: return (lshift || rshift) ? c : b; +/** + * translates keycodes back into a simpler enumerable value for handling emulator command events + * + * @param *struct/input_event ev pointer to input layer event structure + * @return char + */ char char_from_input_event(struct input_event *ev) { switch(ev->code) { KEYCASE(KEY_A, 'a', 'A'); @@ -104,6 +110,7 @@ char char_from_input_event(struct input_event *ev) { KEYCASE(KEY_9, '9', '('); KEYCASE(KEY_0, '0', ')'); KEYCASE(KEY_F12, 0x1B, 0x1B); + KEYCASE(KEY_PAUSE, 0x01, 0x01); default: return 0; } From 41887ae2f9fa3892780a27ed3ac974fea11731ea Mon Sep 17 00:00:00 2001 From: nine Date: Sun, 21 Feb 2021 02:25:42 +0000 Subject: [PATCH 06/11] wip amiga registers --- platforms/amiga/registers.h | 52 +++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 platforms/amiga/registers.h diff --git a/platforms/amiga/registers.h b/platforms/amiga/registers.h new file mode 100644 index 0000000..ec7b825 --- /dev/null +++ b/platforms/amiga/registers.h @@ -0,0 +1,52 @@ +/** + * amiga custom chip registers + * + * transcribed from adcd 2.1 amigaguide. likely omits aa chipset registers, and gayle. + * + * just nine + */ + +#ifndef _AMIGA_REGISTERS_H +#define _AMIGA_REGISTERS_H + +/** + * three discernable banks which cover all amiga systems. + * + * bfd000-bfdf00 for the even cia + * bfe001-bfef01 for the odd cia + * dff000-dfffff for custom chip registers + * + * we will concern ourselves with the custom chip registers here; the cia is for additional i/o ops + */ + +#define CREG_BASE 0xdff000 +#define CREG_END 0xdfffff + +#define BLTDDAT CREG_BASE + 0x000 // agnus, blitter destination early read address (dummy) +#define DMACONR CREG_BASE + 0x002 // agnus, paula dma control + blitter status read +#define VPOSR CREG_BASE + 0x004 // ecs agnus, read vertical msb + frame flop +#define VHPOSR CREG_BASE + 0x006 // agnus, vertical + horizonal position of beam +#define DSKDATR CREG_BASE + 0x008 // paula, disk data early read address (dummy) +#define JOY0DAT CREG_BASE + 0x00a // denise, input port 0 data +#define JOY1DAT CREG_BASE + 0x00c // denise, input port 1 data +// clxdat +// adkconr +// pot0dat +// pot1dat +// potgor +#define SERDATR CREG_BASE + 0x018 // paula, serial port data and status, read +// dskbytr +// internar +// intreqr +// dskpth +// dskptl +// dsklen +// refptr +// vposw +// vhposw +// copcon +#define SERDAT CREG_BASE + 0x030 // paula, serial port data and stop bits, write +#define SERPER CREG_BASE + 0x032 // paula, serial port speed and control +// @todo: the rest?! + +#endif From b207f98d72cf800ef512edd26b2722102404990d Mon Sep 17 00:00:00 2001 From: beeanyew Date: Sun, 21 Feb 2021 11:10:33 +0100 Subject: [PATCH 07/11] Update emulator.c, gpio_old.c, and gpio_old.h --- emulator.c | 66 ++++++++++++++++++++++++++++++++++++------------- gpio/gpio_old.c | 22 ++--------------- gpio/gpio_old.h | 2 +- 3 files changed, 52 insertions(+), 38 deletions(-) diff --git a/emulator.c b/emulator.c index d50a91b..b46a64c 100644 --- a/emulator.c +++ b/emulator.c @@ -54,7 +54,7 @@ extern volatile unsigned int *gpio; extern volatile uint16_t srdata; extern uint8_t realtime_graphics_debug; uint8_t realtime_disassembly, int2_enabled = 0; -uint32_t do_disasm = 0; +uint32_t do_disasm = 0, old_level; char disasm_buf[4096]; @@ -66,21 +66,42 @@ int mem_fd_gpclk; int irq; int gayleirq; +//#define MUSASHI_HAX + +#ifdef MUSASHI_HAX +#include "m68kcpu.h" +extern m68ki_cpu_core m68ki_cpu; +extern int m68ki_initial_cycles; +extern int m68ki_remaining_cycles; + +#define M68K_SET_IRQ(i) old_level = CPU_INT_LEVEL; \ + CPU_INT_LEVEL = (i << 8); \ + if(old_level != 0x0700 && CPU_INT_LEVEL == 0x0700) \ + m68ki_cpu.nmi_pending = TRUE; +#define M68K_END_TIMESLICE m68ki_initial_cycles = GET_CYCLES(); \ + SET_CYCLES(0); +#else +#define M68K_SET_IRQ m68k_set_irq +#define M68K_END_TIMESLICE m68k_end_timeslice() +#endif + #define NOP asm("nop"); asm("nop"); asm("nop"); asm("nop"); // Configurable emulator options unsigned int cpu_type = M68K_CPU_TYPE_68000; -unsigned int loop_cycles = 300; +unsigned int loop_cycles = 300, irq_status = 0; struct emulator_config *cfg = NULL; char keyboard_file[256] = "/dev/input/event1"; +uint64_t trig_irq = 0, serv_irq = 0; + void *iplThread(void *args) { printf("IPL thread running\n"); while (1) { if (!gpio_get_irq()) { irq = 1; - m68k_end_timeslice(); + M68K_END_TIMESLICE; } else { irq = 0; @@ -90,7 +111,7 @@ void *iplThread(void *args) { if (((gayle_int & 0x80) || gayle_a4k_int) && (get_ide(0)->drive[0].intrq || get_ide(0)->drive[1].intrq)) { //get_ide(0)->drive[0].intrq = 0; gayleirq = 1; - m68k_end_timeslice(); + M68K_END_TIMESLICE; } else gayleirq = 0; @@ -113,7 +134,7 @@ void *iplThread(void *args) { } void stop_cpu_emulation(uint8_t disasm_cur) { - m68k_end_timeslice(); + M68K_END_TIMESLICE; if (disasm_cur) { m68k_disassemble(disasm_buf, m68k_get_reg(NULL, M68K_REG_PC), cpu_type); printf("REGA: 0:$%.8X 1:$%.8X 2:$%.8X 3:$%.8X 4:$%.8X 5:$%.8X 6:$%.8X 7:$%.8X\n", m68k_get_reg(NULL, M68K_REG_A0), m68k_get_reg(NULL, M68K_REG_A1), m68k_get_reg(NULL, M68K_REG_A2), m68k_get_reg(NULL, M68K_REG_A3), \ @@ -146,6 +167,9 @@ void sigint_handler(int sig_num) { cfg->platform->shutdown(cfg); } + printf("IRQs triggered: %lld\n", trig_irq); + printf("IRQs serviced: %lld\n", serv_irq); + exit(0); } @@ -263,6 +287,7 @@ int main(int argc, char *argv[]) { cpu_pulse_reset(); char c = 0, c_code = 0, c_type = 0; + uint32_t last_irq = 0; pthread_t id; int err; @@ -296,16 +321,22 @@ int main(int argc, char *argv[]) { if (irq) { unsigned int status = read_reg(); - m68k_set_irq((status & 0xe000) >> 13); - //irq = 0; + if (((status & 0xe000) >> 13) != last_irq) { + last_irq = ((status & 0xe000) >> 13); + serv_irq++; + M68K_SET_IRQ(last_irq); + } } else if (gayleirq && int2_enabled) { write16(0xdff09c, 0x8000 | (1 << 3)); - m68k_set_irq(2); - //irq = 0; + last_irq = 2; + M68K_SET_IRQ(2); } else { - m68k_set_irq(0); + if (last_irq != 0) { + last_irq = 0; + M68K_SET_IRQ(0); + } } while (get_key_char(&c, &c_code, &c_type)) { @@ -335,7 +366,8 @@ int main(int argc, char *argv[]) { break; }*/ if (queue_keypress(c_code, c_type, cfg->platform->id) && int2_enabled) { - m68k_set_irq(2); + last_irq = 2; + M68K_SET_IRQ(2); } } } @@ -467,7 +499,7 @@ unsigned int m68k_read_memory_8(unsigned int address) { printf("BYTE read from DMAC @%.8X:", address); uint32_t v = cdtv_dmac_read(address & 0xFFFF, OP_TYPE_BYTE); printf("%.2X\n", v); - m68k_end_timeslice(); + M68K_END_TIMESLICE; cpu_emulation_running = 0; return v; }*/ @@ -531,7 +563,7 @@ unsigned int m68k_read_memory_16(unsigned int address) { printf("WORD read from DMAC @%.8X:", address); uint32_t v = cdtv_dmac_read(address & 0xFFFF, OP_TYPE_WORD); printf("%.2X\n", v); - m68k_end_timeslice(); + M68K_END_TIMESLICE; cpu_emulation_running = 0; return v; }*/ @@ -580,7 +612,7 @@ unsigned int m68k_read_memory_32(unsigned int address) { printf("LONGWORD read from DMAC @%.8X:", address); uint32_t v = cdtv_dmac_read(address & 0xFFFF, OP_TYPE_LONGWORD); printf("%.2X\n", v); - m68k_end_timeslice(); + M68K_END_TIMESLICE; cpu_emulation_running = 0; return v; }*/ @@ -633,7 +665,7 @@ void m68k_write_memory_8(unsigned int address, unsigned int value) { /*if (address >= 0xE90000 && address < 0xF00000) { printf("BYTE write to DMAC @%.8X: %.2X\n", address, value); cdtv_dmac_write(address & 0xFFFF, value, OP_TYPE_BYTE); - m68k_end_timeslice(); + M68K_END_TIMESLICE; cpu_emulation_running = 0; return; }*/ @@ -658,7 +690,7 @@ void m68k_write_memory_16(unsigned int address, unsigned int value) { /*if (address >= 0xE90000 && address < 0xF00000) { printf("WORD write to DMAC @%.8X: %.4X\n", address, value); cdtv_dmac_write(address & 0xFFFF, value, OP_TYPE_WORD); - m68k_end_timeslice(); + M68K_END_TIMESLICE; cpu_emulation_running = 0; return; }*/ @@ -696,7 +728,7 @@ void m68k_write_memory_32(unsigned int address, unsigned int value) { /*if (address >= 0xE90000 && address < 0xF00000) { printf("LONGWORD write to DMAC @%.8X: %.8X\n", address, value); cdtv_dmac_write(address & 0xFFFF, value, OP_TYPE_LONGWORD); - m68k_end_timeslice(); + M68K_END_TIMESLICE; cpu_emulation_running = 0; return; }*/ diff --git a/gpio/gpio_old.c b/gpio/gpio_old.c index ed388c4..9ea5ef3 100644 --- a/gpio/gpio_old.c +++ b/gpio/gpio_old.c @@ -10,7 +10,7 @@ #include "../m68k.h" #include "../platforms/amiga/Gayle.h" #include "../platforms/amiga/gayle-ide/ide.h" -#include "gpio.h" +#include "gpio_old.h" // I/O access volatile unsigned int *gpio; @@ -28,6 +28,7 @@ volatile uint32_t srdata2_old; extern int mem_fd, mouse_fd, keyboard_fd; extern int mem_fd_gpclk; +extern uint8_t gayle_int; void *gpio_map; void *gpclk_map; @@ -389,22 +390,3 @@ inline void gpio_handle_irq() { inline int gpio_get_irq() { return (GET_GPIO(1)); } - - -/* -void *iplThread(void *args) { - printf("IPL thread running/n"); - - while (42) { - - if (GET_GPIO(1) == 0) { - toggle = 1; - m68k_end_timeslice(); - //printf("thread!/n"); - } else { - toggle = 0; - }; - usleep(1); - } -} -*/ diff --git a/gpio/gpio_old.h b/gpio/gpio_old.h index 79e7359..1f59502 100644 --- a/gpio/gpio_old.h +++ b/gpio/gpio_old.h @@ -75,7 +75,7 @@ } \ else \ m68k_set_irq(0); \ - }; \ + }; void setup_io(); void gpio_enable_200mhz(); From c1bd2d40637b3cbd249cbd986f3bc9e02db0006c Mon Sep 17 00:00:00 2001 From: just nine Date: Sun, 21 Feb 2021 23:12:51 +0000 Subject: [PATCH 08/11] mark when an nmi is sent in the output --- emulator.c | 1 + 1 file changed, 1 insertion(+) diff --git a/emulator.c b/emulator.c index b46a64c..b54f716 100644 --- a/emulator.c +++ b/emulator.c @@ -418,6 +418,7 @@ int main(int argc, char *argv[]) { // pause pressed; trigger nmi (int level 7) if (c == 0x01) { + printf("[*] Sending NMI\n"); m68k_set_irq(7); } } From 4d248b83747271c85470b157f54ead2939265532 Mon Sep 17 00:00:00 2001 From: just nine Date: Sun, 21 Feb 2021 23:13:14 +0000 Subject: [PATCH 09/11] menu is not code 8b, it's 7f --- input/input.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/input/input.c b/input/input.c index 1acb722..e4d995d 100644 --- a/input/input.c +++ b/input/input.c @@ -22,8 +22,8 @@ char keymap_amiga[256] = { \ /*40*/ 0x55, 0x56, 0x57, 0x58, 0x69, 0x5B, NONE, 0x3D, 0x3E, 0x3F, 0x4A, 0x2D, 0x2E, 0x2F, 0x4E, 0x1D, \ /*50*/ 0x1E, 0x1F, 0x0F, 0x3C, NONE, NONE, 0x30, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, \ /*60*/ 0x43, NONE, 0x5C, NONE, NONE, NONE, 0x5F, 0x4C, 0x5A, 0x4F, 0x4E, NONE, 0x4D, NONE, 0x0D, 0x46, \ -/*70*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, 0x66, 0x67, NONE, \ -/*80*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, 0x67, NONE, NONE, NONE, NONE, \ +/*70*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, 0x66, 0x67, 0x67, \ +/*80*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, \ /*90*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, \ /*A0*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, \ /*B0*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, \ From 95f2c3eb9f3c520074b996a7a5f34bd53d3c0ec8 Mon Sep 17 00:00:00 2001 From: just nine Date: Sun, 21 Feb 2021 23:29:41 +0000 Subject: [PATCH 10/11] let nmi be triggered regardless of kbd mode --- emulator.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/emulator.c b/emulator.c index b54f716..b022e0e 100644 --- a/emulator.c +++ b/emulator.c @@ -372,6 +372,12 @@ int main(int argc, char *argv[]) { } } + // pause pressed; trigger nmi (int level 7) + if (c == 0x01 && c_type) { + printf("[*] Sending NMI\n"); + m68k_set_irq(7); + } + if (!kb_hook_enabled && c_type) { if (c && c == cfg->mouse_toggle_key) { mouse_hook_enabled ^= 1; @@ -415,12 +421,6 @@ int main(int argc, char *argv[]) { if (c == 'S' && realtime_disassembly) { do_disasm = 128; } - - // pause pressed; trigger nmi (int level 7) - if (c == 0x01) { - printf("[*] Sending NMI\n"); - m68k_set_irq(7); - } } } } From 24860af68dd992bf9f8635896bd403706058268e Mon Sep 17 00:00:00 2001 From: just nine Date: Mon, 22 Feb 2021 01:44:35 +0000 Subject: [PATCH 11/11] use the macro for setting irq level --- emulator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emulator.c b/emulator.c index b022e0e..e8603be 100644 --- a/emulator.c +++ b/emulator.c @@ -375,7 +375,7 @@ int main(int argc, char *argv[]) { // pause pressed; trigger nmi (int level 7) if (c == 0x01 && c_type) { printf("[*] Sending NMI\n"); - m68k_set_irq(7); + M68K_SET_IRQ(7); } if (!kb_hook_enabled && c_type) {