]> git.sesse.net Git - pistorm/commitdiff
IDE starts working,minimal hd0.img
authorClaude <claude.schwarz@gmail.com>
Sat, 7 Nov 2020 14:03:19 +0000 (15:03 +0100)
committerClaude <claude.schwarz@gmail.com>
Sat, 7 Nov 2020 14:03:19 +0000 (15:03 +0100)
Gayle.c
Makefile
emulator.c
hd0.tar.gz [new file with mode: 0644]

diff --git a/Gayle.c b/Gayle.c
index 5c16da3ba95120b1dd836996d083a57456492d9e..5a6c8bf1980bb8767ab764222e6e3eb4ad7e9a74 100644 (file)
--- a/Gayle.c
+++ b/Gayle.c
 
 #define CLOCKBASE 0xDC0000
 
-#define GSTATUS 0xda201c 
-#define GCLOW   0xda2010
-#define GDH    0xda2018
-
-
-
-//Write Byte to Gayle Space 0xda2018 (0x000000)
-//Read Byte From Gayle Space 0xda2010
-//Read Byte From Gayle Space 0xda201c
-//Write Byte to Gayle Space 0xdaa000 (0x00002c)
-//Write Byte to Gayle Space 0xda8000 (0x000000)
-//Write Byte to Gayle Space 0xda2018 (0x000000)
-//Write Byte to Gayle Space 0xda2010 (0x000012)
-
-
-
-/*
-Write Byte to Gayle Space 0xda3018 (0x000000)
-
-Read Byte from Gayle Ident 0xde1000 (0x000004)
-Write ide_dev_head: 0x0000a0
-Write Byte to Gayle Space 0xda2018 (0x0000a0)
-Write ide_cyl_low: 0x000012
-Write Byte to Gayle Space 0xda2010 (0x000012)
-Write ide_cyl_low: 0x000034
-Write Byte to Gayle Space 0xda2010 (0x000034)
-Write Byte to Gayle Space 0xda3018 (0x000000)
-Write ide_status_r: 0x000010
-Write Byte to Gayle Space 0xda201c (0x000010)
-*/
-
+//#define GSTATUS 0xda201c 
+//#define GCLOW   0xda2010
+//#define GDH  0xda2018
+
+
+
+
+//Gayle Addresses
+
+//Gayle IDE Reads
+#define  GERROR 0xda2004       //Error
+#define  GSTATUS 0xda201c      //Status
+//Gayle IDE Writes
+#define  GFEAT 0xda2004         //Write : Feature
+#define  GCMD   0xda201c        //Write : Command
+//Gayle IDE RW
+#define  GDATA 0xda2000         //Data
+#define  GSECTCNT 0xda2008      //SectorCount
+#define  GSECTNUM 0xda200c      //SectorNumber
+#define  GCYLLOW 0xda2010       //CylinderLow
+#define  GCYLHIGH 0xda2014      //CylinderHigh
+#define  GDEVHEAD 0xda2018      //Device/Head
+#define  GCTRL 0xda3018         //Control
+// Gayle Ident
+#define GIDENT 0xDE1000
+
+// Gayle IRQ/CC
+#define GCS 0xDA8000  //Card Control
+#define GIRQ 0xDA9000 // IRQ
+#define GINT 0xDAA000 //Int enable
+#define GCONF 0xDAB00 //Gayle Config
+
+/* DA8000 */
+#define GAYLE_CS_IDE   0x80    /* IDE int status */
+#define GAYLE_CS_CCDET 0x40    /* credit card detect */
+#define GAYLE_CS_BVD1  0x20    /* battery voltage detect 1 */
+#define GAYLE_CS_SC    0x20    /* credit card status change */
+#define GAYLE_CS_BVD2  0x10    /* battery voltage detect 2 */
+#define GAYLE_CS_DA    0x10    /* digital audio */
+#define GAYLE_CS_WR    0x08    /* write enable (1 == enabled) */
+#define GAYLE_CS_BSY   0x04    /* credit card busy */
+#define GAYLE_CS_IRQ   0x04    /* interrupt request */
+#define GAYLE_CS_DAEN   0x02    /* enable digital audio */ 
+#define GAYLE_CS_DIS    0x01    /* disable PCMCIA slot */ 
+
+/* DA9000 */
+#define GAYLE_IRQ_IDE      0x80
+#define GAYLE_IRQ_CCDET            0x40    /* credit card detect */
+#define GAYLE_IRQ_BVD1     0x20    /* battery voltage detect 1 */
+#define GAYLE_IRQ_SC       0x20    /* credit card status change */
+#define GAYLE_IRQ_BVD2     0x10    /* battery voltage detect 2 */
+#define GAYLE_IRQ_DA       0x10    /* digital audio */
+#define GAYLE_IRQ_WR       0x08    /* write enable (1 == enabled) */
+#define GAYLE_IRQ_BSY      0x04    /* credit card busy */
+#define GAYLE_IRQ_IRQ      0x04    /* interrupt request */
+#define GAYLE_IRQ_RESET            0x02    /* reset machine after CCDET change */ 
+#define GAYLE_IRQ_BERR      0x01    /* generate bus error after CCDET change */ 
+
+/* DAA000 */
+#define GAYLE_INT_IDE      0x80    /* IDE interrupt enable */
+#define GAYLE_INT_CCDET            0x40    /* credit card detect change enable */
+#define GAYLE_INT_BVD1     0x20    /* battery voltage detect 1 change enable */
+#define GAYLE_INT_SC       0x20    /* credit card status change enable */
+#define GAYLE_INT_BVD2     0x10    /* battery voltage detect 2 change enable */
+#define GAYLE_INT_DA       0x10    /* digital audio change enable */
+#define GAYLE_INT_WR       0x08    /* write enable change enabled */
+#define GAYLE_INT_BSY      0x04    /* credit card busy */
+#define GAYLE_INT_IRQ      0x04    /* credit card interrupt request */
+#define GAYLE_INT_BVD_LEV   0x02    /* BVD int level, 0=lev2,1=lev6 */ 
+#define GAYLE_INT_BSY_LEV   0x01    /* BSY int level, 0=lev2,1=lev6 */ 
 
 int counter;
+static uint8_t gayle_irq, gayle_int, gayle_cs, gayle_cs_mask, gayle_cfg;
 static struct ide_controller *ide0;
 int fd;
 
@@ -81,44 +121,69 @@ return irq;
 void writeGayleB(unsigned int address, unsigned int value){
 
 
-    if (address == GSTATUS) {
-       ide_write8(ide0, ide_status_r, value);
-//     printf("Write ide_status_r: 0x%06x IRQ:0x%06x\n",value, ide0->drive->intrq);
+    if (address == GFEAT) {
+       ide_write8(ide0, ide_feature_w, value);
        return;
        }
-
-   if (address == GDH) {
-        ide_write8(ide0, ide_dev_head, value);
-//     printf("Write ide_dev_head: 0x%06x\n",value);
+    if (address == GCMD) {
+        ide_write8(ide0, ide_command_w, value);
         return;
        }
-
-    if (address == GCLOW) {
-        ide_write8(ide0, ide_cyl_low, value);
-//        printf("Write ide_cyl_low: 0x%06x\n",value);
+    if (address == GSECTCNT) {
+        ide_write8(ide0, ide_sec_count, value);
        return;
         }
+    if (address == GSECTNUM) {
+        ide_write8(ide0, ide_sec_num, value);
+        return;
+        }
+    if (address == GCYLLOW) {
+        ide_write8(ide0, ide_cyl_low, value);
+        return;
+        }
+    if (address == GCYLHIGH) {
+        ide_write8(ide0, ide_cyl_hi, value);
+        return;
+        }
+    if (address == GDEVHEAD) {
+        ide_write8(ide0, ide_dev_head, value);
+        return;
+        }
+    if (address == GCTRL) {
+        ide_write8(ide0, ide_devctrl_w, value);
+        return;
+        }
 
-
-    if (address == 0xDE1000){
+    if (address == GIDENT){
         counter = 0;
-//      printf("Write Byte to Gayle Ident 0x%06x (0x%06x)\n",address,value);
+       // printf("Write Byte to Gayle Ident 0x%06x (0x%06x)\n",address,value);
        return;
        }
 
-    if (address == 0xda9000){
+
+    if (address == GIRQ){
+//      printf("Write Byte to Gayle GIRQ 0x%06x (0x%06x)\n",address,value);
+       gayle_irq = (gayle_irq & value) | (value & (GAYLE_IRQ_RESET | GAYLE_IRQ_BERR));
        return;
        }
 
-      if (address == 0xda8000){
+      if (address == GCS){
+       printf("Write Byte to Gayle GCS 0x%06x (0x%06x)\n",address,value);
+       gayle_cs_mask = value & ~3;
+       gayle_cs &= ~3;
+       gayle_cs |= value & 3;
         return;
         }
 
-      if (address == 0xdaa000){
+      if (address == GINT){
+       printf("Write Byte to Gayle GINT 0x%06x (0x%06x)\n",address,value);
+       gayle_int = value;
         return;
         }
 
-      if (address == 0xdab000){
+      if (address == GCONF){
+       printf("Write Byte to Gayle GCONF 0x%06x (0x%06x)\n",address,value);
+       gayle_cfg = value;
         return;
         }
 
@@ -130,58 +195,100 @@ void writeGayleB(unsigned int address, unsigned int value){
 }
 
 void writeGayle(unsigned int address, unsigned int value){
-//    printf("Write to Gayle Space 0x%06x (0x%06x)\n",address,value);
+       if (address == GDATA) {
+        ide_write16(ide0, ide_data, value);
+        return;
+        }
+
+    printf("Write Word to Gayle Space 0x%06x (0x%06x)\n",address,value);
 }
 
 void writeGayleL(unsigned int address, unsigned int value){
-//    printf("Write Long to Gayle Space 0x%06x (0x%06x)\n",address,value);
+    printf("Write Long to Gayle Space 0x%06x (0x%06x)\n",address,value);
 }
 
 uint8_t readGayleB(unsigned int address){
 
-       if (address == GSTATUS) {
-//     printf("Read ide_status_r\n");
+    if (address == GERROR) {
+       return ide_read8(ide0, ide_error_r);
+        }
+    if (address == GSTATUS) {
         return ide_read8(ide0, ide_status_r);
         }
 
-       if (address == GCLOW) {
-//     printf("Read ide_cyl_low\n");
+    if (address == GSECTCNT) {
+        return ide_read8(ide0, ide_sec_count);
+        }
+
+    if (address == GSECTNUM) {
+        return ide_read8(ide0, ide_sec_num);
+        }
+
+    if (address == GCYLLOW) {
         return ide_read8(ide0, ide_cyl_low);
         }
 
-       if (address == GDH) {
-//     printf("Read ide_dev_head\n");
+    if (address == GCYLHIGH) {
+        return ide_read8(ide0, ide_cyl_hi);
+        }
+
+    if (address == GDEVHEAD) {
         return ide_read8(ide0, ide_dev_head);
         }
 
+    if (address == GCTRL) {
+        return ide_read8(ide0, ide_altst_r);
+        }
 
-    if (address == 0xDE1000){
-        counter++;
-//     printf("Read Byte from Gayle Ident 0x%06x (0x%06x)\n",address,counter);
+    if (address == 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{
+               val= 0x00;
+         }
+        counter++;
+        return val;
+        }
 
-       if (counter == 3){ 
-//             printf("Gayle Ident cycle\n");
-               return 0xFF;//7F; to enable gayle
-       }else{
-               return 0xFF;
-       }
+     if (address == GIRQ){
+//     printf("Read Byte From GIRQ Space 0x%06x\n",gayle_irq);
+       return 0x80;//gayle_irq;
+        }
 
+      if (address == GCS){
+       printf("Read Byte From GCS Space 0x%06x\n",0x1234);
+        uint8_t v;
+        v = gayle_cs_mask | gayle_cs;
+         return v;
         }
 
-      if (address == 0xda9000){
-        return 0;
+      if (address == GINT){
+//     printf("Read Byte From GINT Space 0x%06x\n",gayle_int);
+        return gayle_int;
+        }
+
+      if (address == GCONF){
+        printf("Read Byte From GCONF Space 0x%06x\n",gayle_cfg & 0x0f);
+       return gayle_cfg & 0x0f;
         }
 
-      if (address == 0xdaa000){
-        return 0;
-       }
 
     printf("Read Byte From Gayle Space 0x%06x\n",address);
     return 0xFF;
 }
 
 uint16_t readGayle(unsigned int address){
-    printf("Read From Gayle Space 0x%06x\n",address);
+       if (address == GDATA){
+       uint16_t value;
+       value = ide_read16 (ide0, ide_data);
+//     value = (value << 8) | (value >> 8);
+        return value;
+        }
+
+
+    printf("Read Word From Gayle Space 0x%06x\n",address);
     return 0x8000;
 }
 
index 1f8e2a2c2c7afc0f71189cd8a689f7e143bba565..107737e99c62b65a181d49137744fee8d410b9df 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -16,7 +16,7 @@ EXEPATH = ./
 
 CC        = gcc
 WARNINGS  = -Wall -Wextra -pedantic
-CFLAGS    = $(WARNINGS) -march=armv7 -O3
+CFLAGS    = $(WARNINGS) -march=armv7 -O3 -pg
 LFLAGS    = $(WARNINGS)
 
 TARGET = $(EXENAME)$(EXE)
@@ -31,7 +31,7 @@ clean:
 
 
 $(TARGET): $(MUSASHIGENHFILES) $(.OFILES) Makefile
-       $(CC) -o $@ $(.OFILES) -O3 -pthread $(LFLAGS) -lm
+       $(CC) -o $@ $(.OFILES) -O3 -pthread $(LFLAGS) -lm -pg
 
 $(MUSASHIGENCFILES) $(MUSASHIGENHFILES): $(MUSASHIGENERATOR)$(EXE)
        $(EXEPATH)$(MUSASHIGENERATOR)$(EXE)
index fea58442e0fd9c5c756755d63479028b332b7796..a931df6f3b497d5deca4fc255fd28023e16d289f 100644 (file)
@@ -1,6 +1,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <signal.h>
 #include <dirent.h>
 #include <fcntl.h>
 #include <assert.h>
@@ -109,7 +110,16 @@ volatile uint32_t srdata2_old;
 unsigned char g_ram[FASTSIZE+1];                 /* RAM */
 unsigned char toggle;
 
+/* Signal Handler for SIGINT */
+void sigint_handler(int sig_num)
+{
+    /* Reset handler to catch SIGINT next time.
+       Refer http://en.cppreference.com/w/c/program/signal */
+    printf("\n User provided signal handler for Ctrl+C \n");
 
+    /* Do a graceful cleanup of the program like: free memory/resources/etc and exit */
+    exit(0);
+}
 
 
 void* iplThread(void *args){ 
@@ -175,7 +185,7 @@ const struct sched_param priority = {99};
        printf("HDD Image hd0.image attached\n");
    }
 */
-
+  signal(SIGINT, sigint_handler);
   setup_io();
 
   //Enable 200MHz CLK output on GPIO4, adjust divider and pll source depending on pi model
diff --git a/hd0.tar.gz b/hd0.tar.gz
new file mode 100644 (file)
index 0000000..ff21813
Binary files /dev/null and b/hd0.tar.gz differ