]> git.sesse.net Git - pistorm/commitdiff
Fix A4000 Gayle
authorbeeanyew <beeanyew@gmail.com>
Thu, 14 Jan 2021 00:11:51 +0000 (01:11 +0100)
committerbeeanyew <beeanyew@gmail.com>
Thu, 14 Jan 2021 00:11:51 +0000 (01:11 +0100)
emulator.c
gpio/gpio.h
input/input.c
platforms/amiga/Gayle.c
platforms/amiga/Gayle.h

index d02dd58b6d7de641b84e637cd24e9143fabe5a3d..d4beade583a769bd9df0b0594439437452c22f68 100644 (file)
@@ -69,7 +69,8 @@ void *iplThread(void *args) {
       irq = 0;
 
     if (gayle_emulation_enabled) {
-      if ((gayle_int & 0x80) && get_ide(0)->drive->intrq) {
+      if (((gayle_int & 0x80) || gayle_a4k_int) && get_ide(0)->drive->intrq) {
+        get_ide(0)->drive->intrq = 0;
         gayleirq = 1;
         m68k_end_timeslice();
       }
@@ -308,7 +309,7 @@ disasm_run:;
         }
         if (c == 'R') {
           cpu_pulse_reset();
-          m68k_pulse_reset();
+          //m68k_pulse_reset();
           printf("CPU emulation reset.\n");
         }
         if (c == 'q') {
index e61eecf5c18391f5b8491026da9123f9c1df130d..5ad470afc7c21880bcce309356242482820dcd89 100644 (file)
@@ -85,6 +85,7 @@
   }; \
 
 extern uint8_t gayle_int;
+extern uint8_t gayle_a4k_int;
 
 void setup_io();
 void gpio_enable_200mhz();
index 32a51915e8e62e3816d4b752aa0a2f25c1b07715..7da63eab3e43e973f63fd80e08bbd434ab85bddd 100644 (file)
@@ -170,7 +170,7 @@ int queue_keypress(uint8_t keycode, uint8_t event_type, uint8_t platform) {
   if (keymap != NULL) {
     if (keymap[keycode] != NONE) {
       if (queued_keypresses < 255) {
-        printf("Keypress queued, matched %.2X to host key code %.2X\n", keycode, keymap[keycode]);
+        //printf("Keypress queued, matched %.2X to host key code %.2X\n", keycode, keymap[keycode]);
         queued_keys[queue_output_pos] = keymap[keycode];
         queued_events[queue_output_pos] = event_type;
         queue_output_pos++;
index 39f552ff626eb19a970950a74640164c3b98c99f..6e38ffa35006a177a86622ca142ac61e74d82cee 100644 (file)
 #include "gayle-ide/ide.h"
 #include "amiga-registers.h"
 
-//#define GSTATUS 0xda201c
-//#define GCLOW   0xda2010
-//#define GDH  0xda2018
-
 uint8_t gary_cfg[8];
 
-uint8_t gayle_a4k = 0xA0;
-uint16_t gayle_a4k_irq;
 uint8_t ramsey_cfg = 0x08;
 static uint8_t ramsey_id = RAMSEY_REV7;
 
@@ -48,7 +42,10 @@ char *hdd_image_file[GAYLE_MAX_HARDFILES];
 uint8_t cdtv_mode = 0;
 unsigned char cdtv_sram[32 * SIZE_KILO];
 
-uint8_t gayle_int;
+uint8_t gayle_a4k = 0xA0;
+uint16_t gayle_a4k_irq = 0;
+uint8_t gayle_a4k_int = 0;
+uint8_t gayle_int = 0;
 
 uint32_t gayle_ide_mask = ~GDATA;
 uint32_t gayle_ide_base = GDATA;
@@ -60,8 +57,9 @@ struct ide_controller *get_ide(int index) {
 }
 
 void adjust_gayle_4000() {
-  gayle_ide_base = GDATA_A4000;
+  gayle_ide_base = GAYLE_IDE_BASE_A4000;
   gayle_ide_adj = 2;
+  gayle_a4k_int = 1;
 }
 
 void adjust_gayle_1200() {
@@ -108,7 +106,7 @@ static uint8_t ide_action = 0;
 
 void writeGayleB(unsigned int address, unsigned int value) {
   if (address >= gayle_ide_base) {
-    switch (address - gayle_ide_base + gayle_ide_adj) {
+    switch ((address - gayle_ide_base) - gayle_ide_adj) {
       case GFEAT_OFFSET:
         ide_action = ide_feature_w;
         goto idewrite8;
@@ -147,9 +145,10 @@ skip_idewrite8:;
   }
 
   switch (address) {
-    case 0xDD203A:
+    /*case 0xDD203A:
+      printf("Write bye to A4000 Gayle: %.2X\n", value);
       gayle_a4k = value;
-      return;
+      return;*/
     case GIDENT:
       counter = 0;
       return;
@@ -236,8 +235,8 @@ void writeGayleL(unsigned int address, unsigned int value) {
 uint8_t readGayleB(unsigned int address) {
   uint8_t ide_action = 0;
 
-  if (address >= gayle_ide_base + gayle_ide_adj) {
-    switch (address - gayle_ide_base) {
+  if (address >= gayle_ide_base) {
+    switch ((address - gayle_ide_base) - gayle_ide_adj) {
       case GERROR_OFFSET:
         ide_action = ide_error_r;
         goto ideread8;
@@ -276,7 +275,6 @@ skip_ideread8:;
   switch (address) {
     case GIDENT: {
       uint8_t val;
-      // printf("Read Byte from Gayle Ident 0x%06x (0x%06x)\n",address,counter);
       if (counter == 0 || counter == 1 || counter == 3) {
         val = 0x80;  // 80; to enable gayle
       } else {
@@ -304,14 +302,13 @@ skip_ideread8:;
     //case GARY_REG3:
     case GARY_REG4:
     //case GARY_REG5:
-      return gary_cfg[address - GARY_REG3];
+      return gary_cfg[address - GARY_REG4];
     case RAMSEY_ID:
       return ramsey_id;
     case RAMSEY_REG:
       return ramsey_cfg;
     case GARY_REG5: { // This makes no sense.
       uint8_t val;
-      printf("Read Byte from GARY Ident 0x%06x (0x%06x)\n",address,counter);
       if (counter == 0 || counter == 1 || counter == 3) {
         val = 0x80;  // 80; to enable GARY
       } else {
@@ -320,8 +317,10 @@ skip_ideread8:;
       counter++;
       return val;
     }
-    case 0xDD203A:
-      return gayle_a4k;
+    //case 0xDD203A:
+      // This can't be correct, as this is the same address as GDEVHEAD on the A4000 Gayle.
+      //printf("Read Byte from Gayle A4k: %.2X\n", gayle_a4k);
+      //return gayle_a4k;
   }
 
   if ((address & GAYLEMASK) == CLOCKBASE) {
@@ -350,7 +349,7 @@ uint16_t readGayle(unsigned int address) {
 
   if (address == GIRQ_A4000) {
     gayle_a4k_irq = 0x8000;
-    return 0x80FF;
+    return 0x8000;
   }
 
   if ((address & GAYLEMASK) == CLOCKBASE) {
index 69e65b421860790895463f360cb6ff06db07b0a1..b4575562a99a3942bb051ffaed214b5d9b81c10b 100644 (file)
@@ -50,7 +50,7 @@ struct ide_controller *get_ide(int index);
 #define GDEVHEAD_OFFSET 0x18
 #define GCTRL_OFFSET 0x1018
 #define GIRQ_OFFSET 0x7000
-#define GIRQ_4000_OFFSET 0x0FFE
+#define GIRQ_4000_OFFSET 0x1002
 
 // Gayle IDE Writes
 #define GFEAT 0xda2004  // Write : Feature