#include <string.h>
#include <stdlib.h>
#include <unistd.h>
+#include <time.h>
+#include <endian.h>
#include "ide.h"
+#include "config_file/config_file.h"
+#include "platforms/amiga/amiga-registers.h"
//#define GSTATUS 0xda201c
//#define GCLOW 0xda2010
#define GCS 0xDA8000 // Card Control
#define GIRQ 0xDA9000 // IRQ
#define GINT 0xDAA000 // Int enable
-#define GCONF 0xDAB00 // Gayle Config
+#define GCONF 0xDAB000 // Gayle Config
/* DA8000 */
#define GAYLE_CS_IDE 0x80 /* IDE int status */
static struct ide_controller *ide0;
int fd;
+uint8_t rtc_type = RTC_TYPE_RICOH;
+
char *hdd_image_file[GAYLE_MAX_HARDFILES];
void set_hard_drive_image_file_amiga(uint8_t index, char *filename) {
return;
}
+ if ((address & GAYLEMASK) == CLOCKBASE) {
+ if ((address & CLOCKMASK) >= 0x8000) {
+ printf("Byte write to CDTV SRAM?\n");
+ return;
+ }
+ put_rtc_byte(address, value, rtc_type);
+ return;
+ }
+
printf("Write Byte to Gayle Space 0x%06x (0x%06x)\n", address, value);
}
return;
}
+ if ((address & GAYLEMASK) == CLOCKBASE) {
+ if ((address & CLOCKMASK) >= 0x8000) {
+ printf("Word write to CDTV SRAM?\n");
+ return;
+ }
+ printf("Word write to RTC.\n");
+ put_rtc_byte(address, (value & 0xFF), rtc_type);
+ put_rtc_byte(address + 1, (value >> 8), rtc_type);
+ return;
+ }
+
printf("Write Word to Gayle Space 0x%06x (0x%06x)\n", address, value);
}
void writeGayleL(unsigned int address, unsigned int value) {
+ if ((address & GAYLEMASK) == CLOCKBASE) {
+ if ((address & CLOCKMASK) >= 0x8000) {
+ printf("Longword write to CDTV SRAM?\n");
+ return;
+ }
+ printf("Longword write to RTC.\n");
+ put_rtc_byte(address, (value & 0xFF), rtc_type);
+ put_rtc_byte(address + 1, ((value & 0x0000FF00) >> 8), rtc_type);
+ put_rtc_byte(address + 2, ((value & 0x00FF0000) >> 16), rtc_type);
+ put_rtc_byte(address + 3, (value >> 24), rtc_type);
+ return;
+ }
+
printf("Write Long to Gayle Space 0x%06x (0x%06x)\n", address, value);
}
+static unsigned char rtc_mystery_reg[3];
+
+void put_rtc_byte(uint32_t address_, uint8_t value, uint8_t rtc_type) {
+ uint32_t address = address_ & 0x3F;
+ address >>= 2;
+ if (rtc_type == RTC_TYPE_MSM) {
+ switch(address) {
+ case 0x0D:
+ rtc_mystery_reg[address - 0x0D] = value & (0x01 | 0x08);
+ break;
+ case 0x0E:
+ case 0x0F:
+ rtc_mystery_reg[address - 0x0D] = value;
+ break;
+ default:
+ return;
+ }
+ }
+ else {
+ int rtc_bank = (rtc_mystery_reg[0] & 0x03);
+ if ((rtc_bank & 0x02) && address < 0x0D) {
+ // RTC memory access?
+ printf("Write to Ricoh RTC memory.\n");
+ return;
+ }
+ else if ((rtc_bank & 0x01) && address < 0x0D) {
+ // RTC alarm access?
+ printf("Write to Ricoh RTC alarm.\n");
+ return;
+ }
+ else if (address >= 0x0D) {
+ rtc_mystery_reg[address - 0x0D] = value;
+ return;
+ }
+ }
+}
+
+uint8_t get_rtc_byte(uint32_t address_, uint8_t rtc_type) {
+ uint32_t address = address_;
+ address >>= 2;
+ time_t t;
+ time(&t);
+ struct tm *rtc_time = localtime(&t);
+
+ if (rtc_type == RTC_TYPE_RICOH) {
+ int rtc_bank = (rtc_mystery_reg[0] & 0x03);
+ if ((rtc_bank & 0x02) && address < 0x0D) {
+ // RTC memory access?
+ printf("Read from Ricoh RTC memory.\n");
+ return 0;
+ }
+ else if ((rtc_bank & 0x01) && address < 0x0D) {
+ // RTC alarm access?
+ printf("Read from Ricoh RTC alarm.\n");
+ return 0;
+ }
+ }
+
+ switch (address) {
+ case 0x00: // Seconds low?
+ return rtc_time->tm_sec % 10;
+ case 0x01: // Seconds high?
+ return rtc_time->tm_sec / 10;
+ case 0x02: // Minutes low?
+ return rtc_time->tm_min % 10;
+ case 0x03: // Minutes high?
+ return rtc_time->tm_min / 10;
+ case 0x04: // Hours low?
+ return rtc_time->tm_hour % 10;
+ case 0x05: // Hours high?
+ if (rtc_type == RTC_TYPE_MSM) {
+ if (rtc_mystery_reg[2] & 4) {
+ return ((rtc_time->tm_hour / 10) | (rtc_time->tm_hour > 12) ? 0x04 : 0x00);
+ }
+ else
+ return rtc_time->tm_hour / 10;
+ }
+ else {
+ break;
+ }
+ case 0x06: // Day low?
+ if (rtc_type == RTC_TYPE_MSM)
+ return rtc_time->tm_mday % 10;
+ else
+ return rtc_time->tm_wday;
+ case 0x07: // Day high?
+ if (rtc_type == RTC_TYPE_MSM)
+ return rtc_time->tm_mday / 10;
+ else
+ return rtc_time->tm_mday % 10;
+ case 0x08: // Month low?
+ if (rtc_type == RTC_TYPE_MSM)
+ return (rtc_time->tm_mon + 1) % 10;
+ else
+ return rtc_time->tm_mday / 10;
+ case 0x09: // Month high?
+ if (rtc_type == RTC_TYPE_MSM)
+ return (rtc_time->tm_mon + 1) / 10;
+ else
+ return (rtc_time->tm_mon + 1) % 10;
+ case 0x0A: // Year low?
+ if (rtc_type == RTC_TYPE_MSM)
+ return rtc_time->tm_year % 10;
+ else
+ return (rtc_time->tm_mon + 1) / 10;
+ case 0x0B: // Year high?
+ if (rtc_type == RTC_TYPE_MSM)
+ return rtc_time->tm_year / 10;
+ else
+ return rtc_time->tm_year % 10;
+ case 0x0C: // Day of week?
+ if (rtc_type == RTC_TYPE_MSM)
+ return rtc_time->tm_wday;
+ else
+ return rtc_time->tm_year / 10;
+ case 0x0D: // Mystery register D-F?
+ return rtc_mystery_reg[address - 0x0D];
+ case 0x0E:
+ case 0x0F:
+ return 0;
+ default:
+ break;
+ }
+
+ return 0x00;
+}
+
uint8_t readGayleB(unsigned int address) {
if (address == GERROR) {
return ide_read8(ide0, ide_error_r);
return ide_read8(ide0, ide_altst_r);
}
+ if ((address & GAYLEMASK) == CLOCKBASE) {
+ if ((address & CLOCKMASK) >= 0x8000) {
+ printf("Byte read from CDTV SRAM?\n");
+ return 0;
+ }
+ return get_rtc_byte((address & 0x3F), rtc_type);
+ }
+
if (address == GIDENT) {
uint8_t val;
// printf("Read Byte from Gayle Ident 0x%06x (0x%06x)\n",address,counter);
return value;
}
+ if ((address & GAYLEMASK) == CLOCKBASE) {
+ if ((address & CLOCKMASK) >= 0x8000) {
+ printf("Word read from CDTV SRAM?\n");
+ return 0;
+ }
+ return ((get_rtc_byte((address & 0x3F), rtc_type) << 8) | (get_rtc_byte(((address + 1) & 0x3F), rtc_type)));
+ }
+
printf("Read Word From Gayle Space 0x%06x\n", address);
return 0x8000;
}
uint32_t readGayleL(unsigned int address) {
+ if ((address & GAYLEMASK) == CLOCKBASE) {
+ if ((address & CLOCKMASK) >= 0x8000) {
+ printf("Longword read from CDTV SRAM?\n");
+ return 0;
+ }
+ return ((get_rtc_byte((address & 0x3F), rtc_type) << 24) | (get_rtc_byte(((address + 1) & 0x3F), rtc_type) << 16) | (get_rtc_byte(((address + 2) & 0x3F), rtc_type) << 8) | (get_rtc_byte(((address + 3) & 0x3F), rtc_type)));
+ }
+
printf("Read Long From Gayle Space 0x%06x\n", address);
return 0x8000;
}