]> git.sesse.net Git - pistorm/commitdiff
cleanup
authorClaude <claude.schwarz@gmail.com>
Sun, 22 Nov 2020 15:04:53 +0000 (15:04 +0000)
committerClaude <claude.schwarz@gmail.com>
Sun, 22 Nov 2020 15:04:53 +0000 (15:04 +0000)
Gayle.c
emulator.c

diff --git a/Gayle.c b/Gayle.c
index 3bf5cd968c2563a7db91a65f4618bf6864f9abe2..e051095bf5deae2480e7aef7bed51a151ee60cb3 100644 (file)
--- a/Gayle.c
+++ b/Gayle.c
 //  Copyright © 2019 Matt Parsons. All rights reserved.
 //
 
-//Write Byte to Gayle Space 0xda9000 (0x0000c3)
-//Read Byte From Gayle Space 0xda9000
-//Read Byte From Gayle Space 0xdaa000
-
+// Write Byte to Gayle Space 0xda9000 (0x0000c3)
+// Read Byte From Gayle Space 0xda9000
+// Read Byte From Gayle Space 0xdaa000
 
+#include "Gayle.h"
+#include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <fcntl.h>
 #include <unistd.h>
-#include "Gayle.h"
 #include "ide.h"
 
 #define CLOCKBASE 0xDC0000
 
-//#define GSTATUS 0xda201c 
+//#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 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
+#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 */ 
+#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 */ 
+#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 */ 
+#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;
 
-void InitGayle(void){
-   ide0 = ide_allocate("cf");
-   fd = open("hd0.img", O_RDWR);
-   if (fd == -1){
-        printf("HDD Image hd0.image failed open\n");
-   }else{
-        ide_attach(ide0, 0, fd);
-        ide_reset_begin(ide0);
-        printf("HDD Image hd0.image attached\n");
-   }
+void InitGayle(void) {
+  ide0 = ide_allocate("cf");
+  fd = open("hd0.img", O_RDWR);
+  if (fd == -1) {
+    printf("HDD Image hd0.image failed open\n");
+  } else {
+    ide_attach(ide0, 0, fd);
+    ide_reset_begin(ide0);
+    printf("HDD Image hd0.image attached\n");
+  }
 }
 
-uint8_t CheckIrq(void){
-uint8_t irq;
+uint8_t CheckIrq(void) {
+  uint8_t irq;
 
-
- if (gayle_int  & (1<<7)){ 
-       irq = ide0->drive->intrq;
-//     if (irq==0)
-//     printf("IDE IRQ: %x\n",irq);
-        return irq;
-       };
+  if (gayle_int & (1 << 7)) {
+    irq = ide0->drive->intrq;
+    // if (irq==0)
+    // printf("IDE IRQ: %x\n",irq);
+    return irq;
+  };
   return 0;
 }
 
-void writeGayleB(unsigned int address, unsigned int value){
-
-
-    if (address == GFEAT) {
-       ide_write8(ide0, ide_feature_w, value);
-       return;
-       }
-    if (address == GCMD) {
-        ide_write8(ide0, ide_command_w, value);
-        return;
-       }
-    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 == GIDENT){
-        counter = 0;
-       // printf("Write Byte to Gayle Ident 0x%06x (0x%06x)\n",address,value);
-       return;
-       }
-
-
-    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 == 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 == GINT){
-       printf("Write Byte to Gayle GINT 0x%06x (0x%06x)\n",address,value);
-       gayle_int = value;
-        return;
-        }
-
-      if (address == GCONF){
-       printf("Write Byte to Gayle GCONF 0x%06x (0x%06x)\n",address,value);
-       gayle_cfg = value;
-        return;
-        }
-
-
-
-
-
-    printf("Write Byte to Gayle Space 0x%06x (0x%06x)\n",address,value);
+void writeGayleB(unsigned int address, unsigned int value) {
+  if (address == GFEAT) {
+    ide_write8(ide0, ide_feature_w, value);
+    return;
+  }
+  if (address == GCMD) {
+    ide_write8(ide0, ide_command_w, value);
+    return;
+  }
+  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 == GIDENT) {
+    counter = 0;
+    // printf("Write Byte to Gayle Ident 0x%06x (0x%06x)\n",address,value);
+    return;
+  }
+
+  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 == 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 == GINT) {
+    printf("Write Byte to Gayle GINT 0x%06x (0x%06x)\n", address, value);
+    gayle_int = value;
+    return;
+  }
+
+  if (address == GCONF) {
+    printf("Write Byte to Gayle GCONF 0x%06x (0x%06x)\n", address, value);
+    gayle_cfg = value;
+    return;
+  }
+
+  printf("Write Byte to Gayle Space 0x%06x (0x%06x)\n", address, value);
 }
 
-void writeGayle(unsigned int address, unsigned int value){
-       if (address == GDATA) {
-        ide_write16(ide0, ide_data, value);
-        return;
-        }
+void writeGayle(unsigned int address, unsigned int value) {
+  if (address == GDATA) {
+    ide_write16(ide0, ide_data, value);
+    return;
+  }
 
-    printf("Write Word to Gayle Space 0x%06x (0x%06x)\n",address,value);
+  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);
+void writeGayleL(unsigned int address, unsigned int value) {
+  printf("Write Long to Gayle Space 0x%06x (0x%06x)\n", address, value);
 }
 
-uint8_t readGayleB(unsigned int address){
-
-    if (address == GERROR) {
-       return ide_read8(ide0, ide_error_r);
-        }
-    if (address == GSTATUS) {
-        return ide_read8(ide0, ide_status_r);
-        }
-
-    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 == 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 == 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 (address == GIRQ){
-//     printf("Read Byte From GIRQ Space 0x%06x\n",gayle_irq);
-
-       uint8_t irq;
-        irq = ide0->drive->intrq;
-
-       if (irq == 1){
-       //printf("IDE IRQ: %x\n",irq);
-       return 0x80;//gayle_irq;
-       }
-
-       return 0;
-     }
-
-      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 == 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;
-        }
-
-
-    printf("Read Byte From Gayle Space 0x%06x\n",address);
-    return 0xFF;
+uint8_t readGayleB(unsigned int address) {
+  if (address == GERROR) {
+    return ide_read8(ide0, ide_error_r);
+  }
+  if (address == GSTATUS) {
+    return ide_read8(ide0, ide_status_r);
+  }
+
+  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 == 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 == 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 (address == GIRQ) {
+    // printf("Read Byte From GIRQ Space 0x%06x\n",gayle_irq);
+
+    uint8_t irq;
+    irq = ide0->drive->intrq;
+
+    if (irq == 1) {
+      // printf("IDE IRQ: %x\n",irq);
+      return 0x80;  // gayle_irq;
+    }
+
+    return 0;
+  }
+
+  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 == 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;
+  }
+
+  printf("Read Byte From Gayle Space 0x%06x\n", address);
+  return 0xFF;
 }
 
-uint16_t readGayle(unsigned int address){
-       if (address == GDATA){
-       uint16_t value;
-       value = ide_read16 (ide0, ide_data);
-//     value = (value << 8) | (value >> 8);
-        return value;
-        }
-
+uint16_t readGayle(unsigned int 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;
+  printf("Read Word From Gayle Space 0x%06x\n", address);
+  return 0x8000;
 }
 
-uint32_t readGayleL(unsigned int address){
-    printf("Read Long From Gayle Space 0x%06x\n",address);
-    return 0x8000;
+uint32_t readGayleL(unsigned int address) {
+  printf("Read Long From Gayle Space 0x%06x\n", address);
+  return 0x8000;
 }
index 37a5f0d9920f6765bdad5abef03ab7db57b559eb..35b6b9e7847ac6044ee8ad17daa87c3086d06326 100644 (file)
@@ -1,66 +1,81 @@
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <signal.h>
+#include <assert.h>
 #include <dirent.h>
+#include <endian.h>
 #include <fcntl.h>
-#include <assert.h>
+#include <pthread.h>
+#include <sched.h>
+#include <signal.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <sys/mman.h>
-#include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/types.h>
 #include <unistd.h>
-#include <stdint.h>
-#include <sched.h>
-#include "m68k.h"
-#include "main.h"
-#include<pthread.h>
 #include "Gayle.h"
 #include "ide.h"
+#include "m68k.h"
+#include "main.h"
+
 //#define BCM2708_PERI_BASE        0x20000000  //pi0-1
 //#define BCM2708_PERI_BASE    0xFE000000     //pi4
-#define BCM2708_PERI_BASE       0x3F000000     //pi3
-#define BCM2708_PERI_SIZE       0x01000000
-#define GPIO_BASE               (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */
-#define GPCLK_BASE              (BCM2708_PERI_BASE + 0x101000)
-#define GPIO_ADDR                0x200000 /* GPIO controller */
-#define GPCLK_ADDR               0x101000
-#define CLK_PASSWD      0x5a000000
-#define CLK_GP0_CTL     0x070
-#define CLK_GP0_DIV     0x074
+#define BCM2708_PERI_BASE 0x3F000000  // pi3
+#define BCM2708_PERI_SIZE 0x01000000
+#define GPIO_BASE (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */
+#define GPCLK_BASE (BCM2708_PERI_BASE + 0x101000)
+#define GPIO_ADDR 0x200000 /* GPIO controller */
+#define GPCLK_ADDR 0x101000
+#define CLK_PASSWD 0x5a000000
+#define CLK_GP0_CTL 0x070
+#define CLK_GP0_DIV 0x074
 
 #define SA0 5
 #define SA1 3
 #define SA2 2
 
-#define STATUSREGADDR    GPIO_CLR = 1<<SA0;GPIO_CLR = 1<<SA1;GPIO_SET = 1<<SA2;
-#define W16              GPIO_CLR = 1<<SA0;GPIO_CLR = 1<<SA1;GPIO_CLR = 1<<SA2;
-#define R16              GPIO_SET = 1<<SA0;GPIO_CLR = 1<<SA1;GPIO_CLR = 1<<SA2;
-#define W8               GPIO_CLR = 1<<SA0;GPIO_SET = 1<<SA1;GPIO_CLR = 1<<SA2;
-#define R8               GPIO_SET = 1<<SA0;GPIO_SET = 1<<SA1;GPIO_CLR = 1<<SA2;
-
-#define PAGE_SIZE (4*1024)
-#define BLOCK_SIZE (4*1024)
-
-#define GPIOSET(no, ishigh)           \
-do {                                  \
-        if (ishigh)                   \
-                set |= (1 << (no));   \
-        else                          \
-                reset |= (1 << (no)); \
-} while (0)
-
+#define STATUSREGADDR  \
+  GPIO_CLR = 1 << SA0; \
+  GPIO_CLR = 1 << SA1; \
+  GPIO_SET = 1 << SA2;
+#define W16            \
+  GPIO_CLR = 1 << SA0; \
+  GPIO_CLR = 1 << SA1; \
+  GPIO_CLR = 1 << SA2;
+#define R16            \
+  GPIO_SET = 1 << SA0; \
+  GPIO_CLR = 1 << SA1; \
+  GPIO_CLR = 1 << SA2;
+#define W8             \
+  GPIO_CLR = 1 << SA0; \
+  GPIO_SET = 1 << SA1; \
+  GPIO_CLR = 1 << SA2;
+#define R8             \
+  GPIO_SET = 1 << SA0; \
+  GPIO_SET = 1 << SA1; \
+  GPIO_CLR = 1 << SA2;
+
+#define PAGE_SIZE (4 * 1024)
+#define BLOCK_SIZE (4 * 1024)
+
+#define GPIOSET(no, ishigh) \
+  do {                      \
+    if (ishigh)             \
+      set |= (1 << (no));   \
+    else                    \
+      reset |= (1 << (no)); \
+  } while (0)
 
 #define FASTBASE 0x07FFFFFF
 #define FASTSIZE 0xFFFFFFF
-#define GAYLEBASE 0xD80000 //D7FFFF
+#define GAYLEBASE 0xD80000  // D7FFFF
 #define GAYLESIZE 0x6FFFF
 
 #define KICKBASE 0xF80000
 #define KICKSIZE 0x7FFFF
 
-int  mem_fd;
-int  mem_fd_gpclk;
+int mem_fd;
+int mem_fd_gpclk;
 void *gpio_map;
 void *gpclk_map;
 
@@ -74,19 +89,23 @@ volatile unsigned int gpfsel0_o;
 volatile unsigned int gpfsel1_o;
 volatile unsigned int gpfsel2_o;
 
-// GPIO setup macros. Always use INP_GPIO(x) before using OUT_GPIO(x) or SET_GPIO_ALT(x,y)
-#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
-#define OUT_GPIO(g) *(gpio+((g)/10)) |=  (1<<(((g)%10)*3))
-#define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3))
+// GPIO setup macros. Always use INP_GPIO(x) before using OUT_GPIO(x) or
+// SET_GPIO_ALT(x,y)
+#define INP_GPIO(g) *(gpio + ((g) / 10)) &= ~(7 << (((g) % 10) * 3))
+#define OUT_GPIO(g) *(gpio + ((g) / 10)) |= (1 << (((g) % 10) * 3))
+#define SET_GPIO_ALT(g, a)  \
+  *(gpio + (((g) / 10))) |= \
+      (((a) <= 3 ? (a) + 4 : (a) == 4 ? 3 : 2) << (((g) % 10) * 3))
 
-#define GPIO_SET *(gpio+7)  // sets   bits which are 1 ignores bits which are 0
-#define GPIO_CLR *(gpio+10) // clears bits which are 1 ignores bits which are 0
+#define GPIO_SET \
+  *(gpio + 7)  // sets   bits which are 1 ignores bits which are 0
+#define GPIO_CLR \
+  *(gpio + 10)  // clears bits which are 1 ignores bits which are 0
 
-#define GET_GPIO(g) (*(gpio+13)&(1<<g)) // 0 if LOW, (1<<g) if HIGH
-
-#define GPIO_PULL *(gpio+37) // Pull up/pull down
-#define GPIO_PULLCLK0 *(gpio+38) // Pull up/pull down clock
+#define GET_GPIO(g) (*(gpio + 13) & (1 << g))  // 0 if LOW, (1<<g) if HIGH
 
+#define GPIO_PULL *(gpio + 37)      // Pull up/pull down
+#define GPIO_PULLCLK0 *(gpio + 38)  // Pull up/pull down clock
 
 void setup_io();
 
@@ -106,657 +125,537 @@ volatile uint16_t srdata;
 volatile uint32_t srdata2;
 volatile uint32_t srdata2_old;
 
-
 unsigned char g_kick[524288];
-unsigned char g_ram[FASTSIZE+1];                 /* RAM */
+unsigned char g_ram[FASTSIZE + 1]; /* RAM */
 unsigned char toggle;
 static volatile unsigned char ovl;
 static volatile unsigned char maprom;
 
-
-/* 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 sigint_handler(int sig_num) {
+  printf("\n Exit Ctrl+C %d\n", sig_num);
+  exit(0);
 }
 
+void *iplThread(void *args) {
+  printf("thread!/n");
 
-void* iplThread(void *args){ 
-
-printf("thread!/n");
-//srdata2_old = read_reg();
-//toggle = 0;
-
-while(42){
-//printf("thread!/n");
-  if (GET_GPIO(1) == 0){
-                  srdata = read_reg();
-                  if (srdata != srdata2_old){
-                        srdata2 = ((srdata >> 13)&0xff);
-                        //printf("STATUS: %d\n", srdata2);
-                        srdata2_old = srdata;
-                        m68k_set_irq(srdata2);
-                        toggle = 1;
-                        }
-                } else {
-                        if (toggle != 0){
-                        /*
-                       srdata = read_reg();
-                        srdata2 = ((srdata >> 13)&0xff);
-                        srdata2_old = srdata;
-                        m68k_set_irq(srdata2);
-                       */
-                       m68k_set_irq(0);
-                        //printf("STATUS: 0\n");
-                        toggle = 0;
-                        }
-                }
-
-       usleep(1);
-       }
+  while (42) {
+    usleep(1);
+  }
 }
 
-
 int main() {
+  int g;
+  const struct sched_param priority = {99};
 
-
-int g;
-const struct sched_param priority = {99};
-
-    sched_setscheduler(0, SCHED_RR , &priority);
-    mlockall(MCL_CURRENT); // lock in memory to keep us from paging out
-
+  sched_setscheduler(0, SCHED_FIFO, &priority);
+  mlockall(MCL_CURRENT);  // lock in memory to keep us from paging out
 
   InitGayle();
 
   signal(SIGINT, sigint_handler);
   setup_io();
 
-  //Enable 200MHz CLK output on GPIO4, adjust divider and pll source depending on pi model
-  printf("Enable GPCLK0 on GPIO4\n");
-
-        *(gpclk+ (CLK_GP0_CTL/4)) =  CLK_PASSWD | (1 << 5);
-        usleep(10);
-        while ( (*(gpclk+(CLK_GP0_CTL/4))) & (1 << 7));
-        usleep(100);
-        *(gpclk+(CLK_GP0_DIV/4)) =  CLK_PASSWD | (6 << 12); //divider , 6=200MHz on pi3
-        usleep(10);
-        *(gpclk+(CLK_GP0_CTL/4)) =   CLK_PASSWD | 5 | (1 << 4); //pll? 6=plld, 5=pllc
-        usleep(10);
-        while (((*(gpclk+(CLK_GP0_CTL/4))) & (1 << 7))== 0);
-        usleep(100);
-
-    SET_GPIO_ALT(4,0); //gpclk0
-
-   //set SA to output
-    INP_GPIO(2);
-    OUT_GPIO(2);
-    INP_GPIO(3);
-    OUT_GPIO(3);
-    INP_GPIO(5);
-    OUT_GPIO(5);
-
-  //set gpio0 (aux0) and gpio1 (aux1) to input
+  // Enable 200MHz CLK output on GPIO4, adjust divider and pll source depending
+  // on pi model
+  printf("Enable 200MHz GPCLK0 on GPIO4\n");
+
+  *(gpclk + (CLK_GP0_CTL / 4)) = CLK_PASSWD | (1 << 5);
+  usleep(10);
+  while ((*(gpclk + (CLK_GP0_CTL / 4))) & (1 << 7))
+    ;
+  usleep(100);
+  *(gpclk + (CLK_GP0_DIV / 4)) =
+      CLK_PASSWD | (6 << 12);  // divider , 6=200MHz on pi3
+  usleep(10);
+  *(gpclk + (CLK_GP0_CTL / 4)) =
+      CLK_PASSWD | 5 | (1 << 4);  // pll? 6=plld, 5=pllc
+  usleep(10);
+  while (((*(gpclk + (CLK_GP0_CTL / 4))) & (1 << 7)) == 0)
+    ;
+  usleep(100);
+
+  SET_GPIO_ALT(4, 0);  // gpclk0
+
+  // set SA to output
+  INP_GPIO(2);
+  OUT_GPIO(2);
+  INP_GPIO(3);
+  OUT_GPIO(3);
+  INP_GPIO(5);
+  OUT_GPIO(5);
+
+  // set gpio0 (aux0) and gpio1 (aux1) to input
   INP_GPIO(0);
   INP_GPIO(1);
 
   // Set GPIO pins 6,7 and 8-23 to output
-  for (g=6; g<=23; g++)
-  {
+  for (g = 6; g <= 23; g++) {
     INP_GPIO(g);
     OUT_GPIO(g);
   }
-     printf ("Precalculate GPIO8-23 aus Output\n");
-     gpfsel0_o =*(gpio); //store gpio ddr
-     printf ("gpfsel0: %#x\n", gpfsel0_o);
-     gpfsel1_o =*(gpio+1); //store gpio ddr
-     printf ("gpfsel1: %#x\n", gpfsel1_o);
-     gpfsel2_o =*(gpio+2); //store gpio ddr
-     printf ("gpfsel2: %#x\n", gpfsel2_o);
+  printf("Precalculate GPIO8-23 as Output\n");
+  gpfsel0_o = *(gpio);  // store gpio ddr
+  printf("gpfsel0: %#x\n", gpfsel0_o);
+  gpfsel1_o = *(gpio + 1);  // store gpio ddr
+  printf("gpfsel1: %#x\n", gpfsel1_o);
+  gpfsel2_o = *(gpio + 2);  // store gpio ddr
+  printf("gpfsel2: %#x\n", gpfsel2_o);
 
   // Set GPIO pins 8-23 to input
-  for (g=8; g<=23; g++)
-  {
+  for (g = 8; g <= 23; g++) {
     INP_GPIO(g);
   }
-     printf ("Precalculate GPIO8-23 as Input\n");
-     gpfsel0 =*(gpio); //store gpio ddr
-     printf ("gpfsel0: %#x\n", gpfsel0);
-     gpfsel1 =*(gpio+1); //store gpio ddr
-     printf ("gpfsel1: %#x\n", gpfsel1);
-     gpfsel2 =*(gpio+2); //store gpio ddr
-     printf ("gpfsel2: %#x\n", gpfsel2);
-
GPIO_CLR = 1<<2;
GPIO_CLR = 1<<3;
GPIO_SET = 1<<5;
-
GPIO_SET = 1<<6;
GPIO_SET = 1<<7;
-
//reset cpld statemachine first
-
- write_reg(0x01);
- usleep(100);
- usleep(1500);
- write_reg(0x00);
- usleep(100);
-
-/*
maprom = 0;
FILE * fp;
fp = fopen("kick.rom", "rb");
- if (!fp)
- {
printf("kick.rom cannot be opened\n");
- } else {
printf("kick.rom found, using that instead of motherboard rom\n");
- while (1)
-  {
-  unsigned int reads = fread(&g_kick, sizeof(g_kick), 1, fp);
-  if (reads == 0){
-     printf("failed loading kick.rom\n");
-     }else{
-     printf("loaded kick.rom\n");
-     maprom = 1;
-     }
-  break;
+  printf("Precalculate GPIO8-23 as Input\n");
+  gpfsel0 = *(gpio);  // store gpio ddr
+  printf("gpfsel0: %#x\n", gpfsel0);
+  gpfsel1 = *(gpio + 1);  // store gpio ddr
+  printf("gpfsel1: %#x\n", gpfsel1);
+  gpfsel2 = *(gpio + 2);  // store gpio ddr
+  printf("gpfsel2: %#x\n", gpfsel2);
+
 GPIO_CLR = 1 << 2;
 GPIO_CLR = 1 << 3;
 GPIO_SET = 1 << 5;
+
 GPIO_SET = 1 << 6;
 GPIO_SET = 1 << 7;
+
 // reset cpld statemachine first
+
 write_reg(0x01);
 usleep(100);
 usleep(1500);
 write_reg(0x00);
 usleep(100);
+
+  // load kick.rom if present
 maprom = 1;
 int fd = 0;
 fd = open("kick.rom", O_RDONLY);
+  if (fd < 1) {
+    printf("Failed loading kick.rom, using motherboard kickstart\n");
   maprom = 0;
 } else {
   int size = (int)lseek(fd, 0, SEEK_END);
+    if (size == 0x40000) {
+      lseek(fd, 0, SEEK_SET);
+      read(fd, &g_kick, size);
+      lseek(fd, 0, SEEK_SET);
+      read(fd, &g_kick[0x40000], size);
+    } else {
+      lseek(fd, 0, SEEK_SET);
+      read(fd, &g_kick, size);
+    }
+    printf("Loaded kick.rom with size %d kib\n", size / 1024);
   }
- }
- */
- maprom = 1;
- int fd=0;
- fd = open("kick.rom",O_RDONLY);
- if(fd<1){
-       printf("failed loading kick.rom, using motherboard kickstart\n");
-       maprom = 0;
-       }else{
-       int size = (int)lseek(fd, 0, SEEK_END);
-       if(size==0x40000){
-         lseek(fd, 0, SEEK_SET);
-         read(fd, &g_kick, size);
-         lseek(fd, 0, SEEK_SET);
-         read(fd, &g_kick[0x40000], size);
-       }else{
-         lseek(fd, 0, SEEK_SET);
-         read(fd, &g_kick, size);
-        }
-        printf("loaded kick.rom with size %d kib\n",size/1024);
-       }
-
-
-cpu_pulse_reset();
-
- ovl=1;
- m68k_write_memory_8(0xbfe201,0x0001); //AMIGA OVL
- m68k_write_memory_8(0xbfe001,0x0001); //AMIGA OVL high (ROM@0x0)
- //cpu_pulse_reset();
-
- usleep(1500);
-
-       m68k_init();
-       m68k_set_cpu_type(M68K_CPU_TYPE_68030);
-       m68k_pulse_reset();
-
-       if (maprom == 1){
-       m68k_set_reg(M68K_REG_PC, 0xF80002);
-       }else{
-       m68k_set_reg(M68K_REG_PC, 0x0);
-       }
-
-/*
-         pthread_t id;
-         int err;
-        //err = pthread_create(&id, NULL, &iplThread, NULL);
-        if (err != 0)
-            printf("\ncan't create IPL thread :[%s]", strerror(err));
-        else
-            printf("\n IPL Thread created successfully\n");
-*/
-
-       m68k_pulse_reset();
-       while(42) {
-
-               m68k_execute(3000);
-               if (GET_GPIO(1) == 0){
-                srdata = read_reg();
-                m68k_set_irq((srdata >> 13)&0xff);
-               } else {
-                m68k_set_irq(0);
-               };
-       }
-
-       return 0;
-}
 
+  // reset amiga and statemachine
+  cpu_pulse_reset();
+  ovl = 1;
+  m68k_write_memory_8(0xbfe201, 0x0001);  // AMIGA OVL
+  m68k_write_memory_8(0xbfe001, 0x0001);  // AMIGA OVL high (ROM@0x0)
 
+  usleep(1500);
 
-void cpu_pulse_reset(void){
-
-       write_reg(0x00);
-        printf("Status Reg%x\n",read_reg());
-        usleep(100000);
-       write_reg(0x02);
-       printf("Status Reg%x\n",read_reg());
-}
+  m68k_init();
+  m68k_set_cpu_type(M68K_CPU_TYPE_68030);
+  m68k_pulse_reset();
 
+  if (maprom == 1) {
+    m68k_set_reg(M68K_REG_PC, 0xF80002);
+  } else {
+    m68k_set_reg(M68K_REG_PC, 0x0);
+  }
 
+  /*
+           pthread_t id;
+           int err;
+          //err = pthread_create(&id, NULL, &iplThread, NULL);
+          if (err != 0)
+              printf("\ncan't create IPL thread :[%s]", strerror(err));
+          else
+              printf("\n IPL Thread created successfully\n");
+  */
+
+  m68k_pulse_reset();
+  while (42) {
+    m68k_execute(3000);
+    if (GET_GPIO(1) == 0) {
+      srdata = read_reg();
+      m68k_set_irq((srdata >> 13) & 0xff);
+    } else {
+      m68k_set_irq(0);
+    };
+  }
 
+  return 0;
+}
 
-int cpu_irq_ack(int level)
-{
-    printf("cpu irq ack\n");
-    return level;
+void cpu_pulse_reset(void) {
+  write_reg(0x00);
+  // printf("Status Reg%x\n",read_reg());
+  usleep(100000);
+  write_reg(0x02);
+  // printf("Status Reg%x\n",read_reg());
 }
 
+int cpu_irq_ack(int level) {
+  printf("cpu irq ack\n");
+  return level;
+}
 
+unsigned int m68k_read_memory_8(unsigned int address) {
+  if (address > FASTBASE && address < FASTBASE + FASTSIZE) {
+    return g_ram[address - FASTBASE];
+  }
 
-unsigned int  m68k_read_memory_8(unsigned int address){
+  if (maprom == 1) {
+    if (address > KICKBASE && address < KICKBASE + KICKSIZE) {
+      return g_kick[address - KICKBASE];
+    }
+  }
 
+  if (address > GAYLEBASE && address < GAYLEBASE + GAYLESIZE) {
+    return readGayleB(address);
+  }
 
-        if(address>FASTBASE && address<FASTBASE + FASTSIZE){
-//        if(address>FASTBASE){
-        return g_ram[address- FASTBASE];
-        }
+  if (address < 0xffffff) {
+    return read8((uint32_t)address);
+  }
 
-        if (maprom == 1){
-         if(address>KICKBASE && address<KICKBASE + KICKSIZE){
-          return g_kick[address-KICKBASE];
-          }
-        }
+  return 0;
+}
 
-       if(address>GAYLEBASE && address<GAYLEBASE + GAYLESIZE){
-        return readGayleB(address);
-       }
+unsigned int m68k_read_memory_16(unsigned int address) {
+  if (address > FASTBASE && address < FASTBASE + FASTSIZE) {
+    return be16toh(*(uint16_t *)&g_ram[address - FASTBASE]);
+  }
 
-       if (address < 0xffffff){
-         return read8((uint32_t)address);
-       }
+  if (maprom == 1) {
+    if (address > KICKBASE && address < KICKBASE + KICKSIZE) {
+      return be16toh(*(uint16_t *)&g_kick[address - KICKBASE]);
+    }
+  }
 
-       return 0;
-}
+  if (address > GAYLEBASE && address < GAYLEBASE + GAYLESIZE) {
+    return readGayle(address);
+  }
 
-unsigned int  m68k_read_memory_16(unsigned int address){
+  if (address < 0xffffff) {
+    return (unsigned int)read16((uint32_t)address);
+  }
 
-        if(address>FASTBASE && address<FASTBASE + FASTSIZE){
-//        if(address>FASTBASE){
-        uint16_t value = *(uint16_t*)&g_ram[address- FASTBASE];
-        value = (value << 8) | (value >> 8);
-        return value;
-        }
+  return 0;
+}
 
-        if (maprom == 1){
-          if(address>KICKBASE && address<KICKBASE + KICKSIZE){
-           uint16_t value = *(uint16_t*)&g_kick[address-KICKBASE];
-           value = (value << 8) | (value >> 8);
-           return value;
-          }
-        }
+unsigned int m68k_read_memory_32(unsigned int address) {
+  if (address > FASTBASE && address < FASTBASE + FASTSIZE) {
+    return be32toh(*(uint32_t *)&g_ram[address - FASTBASE]);
+  }
 
-       if(address>GAYLEBASE && address<GAYLEBASE + GAYLESIZE){
-        return readGayle(address);
-       }
+  if (maprom == 1) {
+    if (address > KICKBASE && address < KICKBASE + KICKSIZE) {
+      return be32toh(*(uint32_t *)&g_kick[address - KICKBASE]);
+    }
+  }
 
-       if (address < 0xffffff){
-        return (unsigned int)read16((uint32_t)address);
-       }
+  if (address > GAYLEBASE && address < GAYLEBASE + GAYLESIZE) {
+    return readGayleL(address);
+  }
 
-       return 0;
-}
+  if (address < 0xffffff) {
+    uint16_t a = read16(address);
+    uint16_t b = read16(address + 2);
+    return (a << 16) | b;
+  }
 
-unsigned int  m68k_read_memory_32(unsigned int address){
-
-        if(address>FASTBASE && address<FASTBASE + FASTSIZE){
-//        if(address>FASTBASE){
-        uint32_t value = *(uint32_t*)&g_ram[address- FASTBASE];
-        value = ((value << 8) & 0xFF00FF00 ) | ((value >> 8) & 0xFF00FF );
-        return value << 16 | value >> 16;
-        }
-
-        if (maprom == 1){
-          if(address>KICKBASE && address<KICKBASE + KICKSIZE){
-            uint32_t value = *(uint32_t*)&g_kick[address-KICKBASE];
-            value = ((value << 8) & 0xFF00FF00 ) | ((value >> 8) & 0xFF00FF );
-            return value << 16 | value >> 16;
-            }
-        }
-
-       if(address>GAYLEBASE && address<GAYLEBASE + GAYLESIZE){
-         return readGayleL(address);
-       }
-
-       if (address < 0xffffff){
-            uint16_t a = read16(address);
-            uint16_t b = read16(address+2);
-           return (a << 16) | b;
-          }
-
-       return 0;
+  return 0;
 }
 
-void m68k_write_memory_8(unsigned int address, unsigned int value){
+void m68k_write_memory_8(unsigned int address, unsigned int value) {
+  if (address > FASTBASE && address < FASTBASE + FASTSIZE) {
+    g_ram[address - FASTBASE] = value;
+    return;
+  }
 
-       if(address>FASTBASE && address<FASTBASE + FASTSIZE){
-//        if(address>FASTBASE){
-        g_ram[address- FASTBASE] = value;
-        return;
-        }
+  if (address > GAYLEBASE && address < GAYLEBASE + GAYLESIZE) {
+    writeGayleB(address, value);
+    return;
+  }
 
-       if(address>GAYLEBASE && address<GAYLEBASE + GAYLESIZE){
-        writeGayleB(address, value);
-        return;
-       }
+  if (address == 0xbfe001) {
+    ovl = (value & (1 << 0));
+    printf("OVL:%x\n", ovl);
+  }
 
-        if (address == 0xbfe001){
-        ovl = (value & (1<<0));
-        printf("OVL:%x\n", ovl );
-        }
+  if (address < 0xffffff) {
+    write8((uint32_t)address, value);
+    return;
+  }
 
+  return;
+}
 
-       if (address < 0xffffff){
-        write8((uint32_t)address,value);
-        return;
-       }
+void m68k_write_memory_16(unsigned int address, unsigned int value) {
+  if (address > FASTBASE && address < FASTBASE + FASTSIZE) {
+    *(uint16_t *)&g_ram[address - FASTBASE] = htobe16(value);
+    return;
+  }
 
-       return;
-}
+  if (address > GAYLEBASE && address < GAYLEBASE + GAYLESIZE) {
+    writeGayle(address, value);
+    return;
+  }
 
-void m68k_write_memory_16(unsigned int address, unsigned int value){
-//        if (address==0xdff030) printf("%c", value);
-
-      if(address>FASTBASE && address<FASTBASE + FASTSIZE ){
-//        if(address>FASTBASE){
-        uint16_t* dest = (uint16_t*)&g_ram[address- FASTBASE];
-        value = (value << 8) | (value >> 8);
-        *dest = value;
-        return;
-        }
-
-       if(address>GAYLEBASE && address<GAYLEBASE + GAYLESIZE){
-        writeGayle(address,value);
-        return;
-       }
-
-       if (address < 0xffffff){
-         write16((uint32_t)address,value);
-        return;
-       }
-      return;
+  if (address < 0xffffff) {
+    write16((uint32_t)address, value);
+    return;
+  }
+  return;
 }
 
-void m68k_write_memory_32(unsigned int address, unsigned int value){
-
-        if(address>FASTBASE && address<FASTBASE + FASTSIZE ){
-//        if(address>FASTBASE){
-           uint32_t* dest = (uint32_t*)&g_ram[address- FASTBASE];
-           value = ((value << 8) & 0xFF00FF00 ) | ((value >> 8) & 0xFF00FF );
-           value = value << 16 | value >> 16;
-           *dest = value;
-        return;
-        }
+void m68k_write_memory_32(unsigned int address, unsigned int value) {
+  if (address > FASTBASE && address < FASTBASE + FASTSIZE) {
+    *(uint32_t *)&g_ram[address - FASTBASE] = htobe32(value);
+    return;
+  }
 
-       if(address>GAYLEBASE && address<GAYLEBASE + GAYLESIZE){
-        writeGayleL(address, value);
-       }
+  if (address > GAYLEBASE && address < GAYLEBASE + GAYLESIZE) {
+    writeGayleL(address, value);
+  }
 
-       if (address < 0xffffff){
-       write16(address , value >> 16);
-       write16(address+2 , value );
-       return;
-       }
+  if (address < 0xffffff) {
+    write16(address, value >> 16);
+    write16(address + 2, value);
+    return;
+  }
 
-      return;
+  return;
 }
 
-void write16(uint32_t address, uint32_t data)
-{
- uint32_t addr_h_s = (address & 0x0000ffff) << 8;
- uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
- uint32_t addr_l_s = (address >> 16) << 8;
- uint32_t addr_l_r = (~address >> 16) << 8;
- uint32_t data_s = (data & 0x0000ffff) << 8;
- uint32_t data_r = (~data & 0x0000ffff) << 8;
-
- //      asm volatile ("dmb" ::: "memory");
-        W16
-        *(gpio) = gpfsel0_o;
-        *(gpio + 1) = gpfsel1_o;
-        *(gpio + 2) = gpfsel2_o;
-
-        *(gpio + 7) = addr_h_s;
-        *(gpio + 10) = addr_h_r;
-//     while ((GET_GPIO(0)));
-        GPIO_CLR = 1 << 7;
-       GPIO_SET = 1 << 7;
-
-       *(gpio + 7) = addr_l_s;
-        *(gpio + 10) = addr_l_r;
-        GPIO_CLR = 1 << 7;
-       GPIO_SET = 1 << 7;
-
-        //write phase
-        *(gpio + 7) = data_s;
-        *(gpio + 10) = data_r;
-        GPIO_CLR = 1 << 7;
-       GPIO_SET = 1 << 7;
-
-        *(gpio) = gpfsel0;
-        *(gpio + 1) = gpfsel1;
-        *(gpio + 2) = gpfsel2;
-        while ((GET_GPIO(0)));
-   //     asm volatile ("dmb" ::: "memory");
+void write16(uint32_t address, uint32_t data) {
+  uint32_t addr_h_s = (address & 0x0000ffff) << 8;
+  uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
+  uint32_t addr_l_s = (address >> 16) << 8;
+  uint32_t addr_l_r = (~address >> 16) << 8;
+  uint32_t data_s = (data & 0x0000ffff) << 8;
+  uint32_t data_r = (~data & 0x0000ffff) << 8;
+
+  //      asm volatile ("dmb" ::: "memory");
+  W16 *(gpio) = gpfsel0_o;
+  *(gpio + 1) = gpfsel1_o;
+  *(gpio + 2) = gpfsel2_o;
+
+  *(gpio + 7) = addr_h_s;
+  *(gpio + 10) = addr_h_r;
+  GPIO_CLR = 1 << 7;
+  GPIO_SET = 1 << 7;
+
+  *(gpio + 7) = addr_l_s;
+  *(gpio + 10) = addr_l_r;
+  GPIO_CLR = 1 << 7;
+  GPIO_SET = 1 << 7;
+
+  // write phase
+  *(gpio + 7) = data_s;
+  *(gpio + 10) = data_r;
+  GPIO_CLR = 1 << 7;
+  GPIO_SET = 1 << 7;
+
+  *(gpio) = gpfsel0;
+  *(gpio + 1) = gpfsel1;
+  *(gpio + 2) = gpfsel2;
+  while ((GET_GPIO(0)))
+    ;
+  //     asm volatile ("dmb" ::: "memory");
 }
 
-
-void write8(uint32_t address, uint32_t data)
-{
-
-        if ((address & 1) == 0)
-            data = data + (data << 8); //EVEN, A0=0,UDS
-        else data = data & 0xff ; //ODD , A0=1,LDS
- uint32_t addr_h_s = (address & 0x0000ffff) << 8;
- uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
- uint32_t addr_l_s = (address >> 16) << 8;
- uint32_t addr_l_r = (~address >> 16) << 8;
- uint32_t data_s = (data & 0x0000ffff) << 8;
- uint32_t data_r = (~data & 0x0000ffff) << 8;
-
-     //   asm volatile ("dmb" ::: "memory");
-        W8
-        *(gpio) = gpfsel0_o;
-        *(gpio + 1) = gpfsel1_o;
-        *(gpio + 2) = gpfsel2_o;
-
-        *(gpio + 7) = addr_h_s;
-        *(gpio + 10) = addr_h_r;
-       //while ((GET_GPIO(0)));
-        GPIO_CLR = 1 << 7;
-        GPIO_SET = 1 << 7;
-
-        *(gpio + 7) = addr_l_s;
-        *(gpio + 10) = addr_l_r;
-        GPIO_CLR = 1 << 7;
-        GPIO_SET = 1 << 7;
-
-        //write phase
-        *(gpio + 7) = data_s;
-        *(gpio + 10) = data_r;
-        GPIO_CLR = 1 << 7;
-        GPIO_SET = 1 << 7;
-
-        *(gpio) = gpfsel0;
-        *(gpio + 1) = gpfsel1;
-        *(gpio + 2) = gpfsel2;
-        while ((GET_GPIO(0)));
-     //   asm volatile ("dmb" ::: "memory");
-     //        GPIO_SET = 1 << 7;
+void write8(uint32_t address, uint32_t data) {
+  if ((address & 1) == 0)
+    data = data + (data << 8);  // EVEN, A0=0,UDS
+  else
+    data = data & 0xff;  // ODD , A0=1,LDS
+  uint32_t addr_h_s = (address & 0x0000ffff) << 8;
+  uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
+  uint32_t addr_l_s = (address >> 16) << 8;
+  uint32_t addr_l_r = (~address >> 16) << 8;
+  uint32_t data_s = (data & 0x0000ffff) << 8;
+  uint32_t data_r = (~data & 0x0000ffff) << 8;
+
+  //   asm volatile ("dmb" ::: "memory");
+  W8 *(gpio) = gpfsel0_o;
+  *(gpio + 1) = gpfsel1_o;
+  *(gpio + 2) = gpfsel2_o;
+
+  *(gpio + 7) = addr_h_s;
+  *(gpio + 10) = addr_h_r;
+  GPIO_CLR = 1 << 7;
+  GPIO_SET = 1 << 7;
+
+  *(gpio + 7) = addr_l_s;
+  *(gpio + 10) = addr_l_r;
+  GPIO_CLR = 1 << 7;
+  GPIO_SET = 1 << 7;
+
+  // write phase
+  *(gpio + 7) = data_s;
+  *(gpio + 10) = data_r;
+  GPIO_CLR = 1 << 7;
+  GPIO_SET = 1 << 7;
+
+  *(gpio) = gpfsel0;
+  *(gpio + 1) = gpfsel1;
+  *(gpio + 2) = gpfsel2;
+  while ((GET_GPIO(0)))
+    ;
+  //   asm volatile ("dmb" ::: "memory");
 }
 
-
-uint32_t read16(uint32_t address)
-{
- volatile int val;
- uint32_t addr_h_s = (address & 0x0000ffff) << 8;
- uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
- uint32_t addr_l_s = (address >> 16) << 8;
- uint32_t addr_l_r = (~address >> 16) << 8;
-
-     //   asm volatile ("dmb" ::: "memory");
-        R16
-
-        *(gpio) = gpfsel0_o;
-        *(gpio + 1) = gpfsel1_o;
-        *(gpio + 2) = gpfsel2_o;
-
-        *(gpio + 7) = addr_h_s;
-        *(gpio + 10) = addr_h_r;
-//     while ((GET_GPIO(0)));
-        GPIO_CLR = 1 << 7;
-        GPIO_SET = 1 << 7;
-
-        *(gpio + 7) = addr_l_s;
-        *(gpio + 10) = addr_l_r;
-        GPIO_CLR = 1 << 7;
-        GPIO_SET = 1 << 7;
-
-        //read phase
-        *(gpio) = gpfsel0;
-        *(gpio + 1) = gpfsel1;
-        *(gpio + 2) = gpfsel2;
-        GPIO_CLR = 1 << 6;
-        while (!(GET_GPIO(0)));
-        GPIO_CLR = 1 << 6;
-//     asm volatile ("nop" ::);
-       val = *(gpio + 13);
-        GPIO_SET = 1 << 6;
-    //    asm volatile ("dmb" ::: "memory");
-        return (val >>8)&0xffff;
+uint32_t read16(uint32_t address) {
+  volatile int val;
+  uint32_t addr_h_s = (address & 0x0000ffff) << 8;
+  uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
+  uint32_t addr_l_s = (address >> 16) << 8;
+  uint32_t addr_l_r = (~address >> 16) << 8;
+
+  //   asm volatile ("dmb" ::: "memory");
+  R16
+
+      *(gpio) = gpfsel0_o;
+  *(gpio + 1) = gpfsel1_o;
+  *(gpio + 2) = gpfsel2_o;
+
+  *(gpio + 7) = addr_h_s;
+  *(gpio + 10) = addr_h_r;
+  GPIO_CLR = 1 << 7;
+  GPIO_SET = 1 << 7;
+
+  *(gpio + 7) = addr_l_s;
+  *(gpio + 10) = addr_l_r;
+  GPIO_CLR = 1 << 7;
+  GPIO_SET = 1 << 7;
+
+  // read phase
+  *(gpio) = gpfsel0;
+  *(gpio + 1) = gpfsel1;
+  *(gpio + 2) = gpfsel2;
+  GPIO_CLR = 1 << 6;
+  while (!(GET_GPIO(0)))
+    ;
+  GPIO_CLR = 1 << 6;
+  val = *(gpio + 13);
+  GPIO_SET = 1 << 6;
+  //    asm volatile ("dmb" ::: "memory");
+  return (val >> 8) & 0xffff;
 }
 
-
-uint32_t read8(uint32_t address)
-{
- int val;
- uint32_t addr_h_s = (address & 0x0000ffff) << 8;
- uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
- uint32_t addr_l_s = (address >> 16) << 8;
- uint32_t addr_l_r = (~address >> 16) << 8;
-
-    //    asm volatile ("dmb" ::: "memory");
-        R8
-        *(gpio) = gpfsel0_o;
-        *(gpio + 1) = gpfsel1_o;
-        *(gpio + 2) = gpfsel2_o;
-
-        *(gpio + 7) = addr_h_s;
-        *(gpio + 10) = addr_h_r;
-//     while ((GET_GPIO(0)));
-        GPIO_CLR = 1 << 7;
-        GPIO_SET = 1 << 7;
-
-        *(gpio + 7) = addr_l_s;
-        *(gpio + 10) = addr_l_r;
-        GPIO_CLR = 1 << 7;
-        GPIO_SET = 1 << 7;
-
-        //read phase
-        *(gpio) = gpfsel0;
-        *(gpio + 1) = gpfsel1;
-        *(gpio + 2) = gpfsel2;
-
-        GPIO_CLR = 1 << 6;
-        while (!(GET_GPIO(0)));
-        GPIO_CLR = 1 << 6;
-//     asm volatile ("nop" ::);
-        val = *(gpio + 13);
-        GPIO_SET = 1 << 6;
-    //    asm volatile ("dmb" ::: "memory");
-
-       val = (val >>8)&0xffff;
-        if ((address & 1) == 0)
-            val = (val >> 8) & 0xff ; //EVEN, A0=0,UDS
-        else
-            val = val & 0xff ; //ODD , A0=1,LDS
-       return val;
+uint32_t read8(uint32_t address) {
+  int val;
+  uint32_t addr_h_s = (address & 0x0000ffff) << 8;
+  uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
+  uint32_t addr_l_s = (address >> 16) << 8;
+  uint32_t addr_l_r = (~address >> 16) << 8;
+
+  //    asm volatile ("dmb" ::: "memory");
+  R8 *(gpio) = gpfsel0_o;
+  *(gpio + 1) = gpfsel1_o;
+  *(gpio + 2) = gpfsel2_o;
+
+  *(gpio + 7) = addr_h_s;
+  *(gpio + 10) = addr_h_r;
+  GPIO_CLR = 1 << 7;
+  GPIO_SET = 1 << 7;
+
+  *(gpio + 7) = addr_l_s;
+  *(gpio + 10) = addr_l_r;
+  GPIO_CLR = 1 << 7;
+  GPIO_SET = 1 << 7;
+
+  // read phase
+  *(gpio) = gpfsel0;
+  *(gpio + 1) = gpfsel1;
+  *(gpio + 2) = gpfsel2;
+
+  GPIO_CLR = 1 << 6;
+  while (!(GET_GPIO(0)))
+    ;
+  GPIO_CLR = 1 << 6;
+  val = *(gpio + 13);
+  GPIO_SET = 1 << 6;
+  //    asm volatile ("dmb" ::: "memory");
+
+  val = (val >> 8) & 0xffff;
+  if ((address & 1) == 0)
+    val = (val >> 8) & 0xff;  // EVEN, A0=0,UDS
+  else
+    val = val & 0xff;  // ODD , A0=1,LDS
+  return val;
 }
 
-
-
 /******************************************************/
 
-void write_reg(unsigned int value)
-{
-        STATUSREGADDR
-        *(gpio) = gpfsel0_o;
-        *(gpio + 1) = gpfsel1_o;
-        *(gpio + 2) = gpfsel2_o;
-        *(gpio + 7) = (value & 0xffff) << 8;
-        *(gpio + 10) = (~value & 0xffff) << 8;
-        GPIO_CLR = 1 << 7;
-        GPIO_CLR = 1 << 7; //delay
-        GPIO_SET = 1 << 7;
-       GPIO_SET = 1 << 7;
-        //Bus HIGH-Z
-        *(gpio) = gpfsel0;
-        *(gpio + 1) = gpfsel1;
-        *(gpio + 2) = gpfsel2;
+void write_reg(unsigned int value) {
+  STATUSREGADDR
+  *(gpio) = gpfsel0_o;
+  *(gpio + 1) = gpfsel1_o;
+  *(gpio + 2) = gpfsel2_o;
+  *(gpio + 7) = (value & 0xffff) << 8;
+  *(gpio + 10) = (~value & 0xffff) << 8;
+  GPIO_CLR = 1 << 7;
+  GPIO_CLR = 1 << 7;  // delay
+  GPIO_SET = 1 << 7;
+  GPIO_SET = 1 << 7;
+  // Bus HIGH-Z
+  *(gpio) = gpfsel0;
+  *(gpio + 1) = gpfsel1;
+  *(gpio + 2) = gpfsel2;
 }
 
-
-uint16_t read_reg(void)
-{
-        uint32_t val;
-        STATUSREGADDR
-        //Bus HIGH-Z
-        *(gpio) = gpfsel0;
-        *(gpio + 1) = gpfsel1;
-        *(gpio + 2) = gpfsel2;
-        GPIO_CLR = 1 << 6;
-        GPIO_CLR = 1 << 6;      //delay
-       GPIO_CLR = 1 << 6;
-       GPIO_CLR = 1 << 6;
-        val = *(gpio + 13);
-        GPIO_SET = 1 << 6;
-        return (uint16_t)(val >> 8);
+uint16_t read_reg(void) {
+  uint32_t val;
+  STATUSREGADDR
+  // Bus HIGH-Z
+  *(gpio) = gpfsel0;
+  *(gpio + 1) = gpfsel1;
+  *(gpio + 2) = gpfsel2;
+  GPIO_CLR = 1 << 6;
+  GPIO_CLR = 1 << 6;  // delay
+  GPIO_CLR = 1 << 6;
+  GPIO_CLR = 1 << 6;
+  val = *(gpio + 13);
+  GPIO_SET = 1 << 6;
+  return (uint16_t)(val >> 8);
 }
 
-
 //
 // Set up a memory regions to access GPIO
 //
-void setup_io()
-{
-   /* open /dev/mem */
-   if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) {
-      printf("can't open /dev/mem \n");
-      exit(-1);
-   }
-
-   /* mmap GPIO */
-   gpio_map = mmap(
-      NULL,             //Any adddress in our space will do
-      BCM2708_PERI_SIZE,       //Map length
-      PROT_READ|PROT_WRITE,// Enable reading & writting to mapped memory
-      MAP_SHARED,       //Shared with other processes
-      mem_fd,           //File to map
-      BCM2708_PERI_BASE //Offset to GPIO peripheral
-   );
-
-   close(mem_fd); //No need to keep mem_fd open after mmap
-
-   if (gpio_map == MAP_FAILED) {
-      printf("gpio mmap error %d\n", (int)gpio_map);//errno also set!
-      exit(-1);
-   }
-
-   gpio = ((volatile unsigned *)gpio_map) + GPIO_ADDR/4;
-   gpclk = ((volatile unsigned *)gpio_map) + GPCLK_ADDR/4;
+void setup_io() {
+  /* open /dev/mem */
+  if ((mem_fd = open("/dev/mem", O_RDWR | O_SYNC)) < 0) {
+    printf("can't open /dev/mem \n");
+    exit(-1);
+  }
 
+  /* mmap GPIO */
+  gpio_map = mmap(
+      NULL,                    // Any adddress in our space will do
+      BCM2708_PERI_SIZE,       // Map length
+      PROT_READ | PROT_WRITE,  // Enable reading & writting to mapped memory
+      MAP_SHARED,              // Shared with other processes
+      mem_fd,                  // File to map
+      BCM2708_PERI_BASE        // Offset to GPIO peripheral
+  );
+
+  close(mem_fd);  // No need to keep mem_fd open after mmap
+
+  if (gpio_map == MAP_FAILED) {
+    printf("gpio mmap error %d\n", (int)gpio_map);  // errno also set!
+    exit(-1);
+  }
 
-} // setup_io
+  gpio = ((volatile unsigned *)gpio_map) + GPIO_ADDR / 4;
+  gpclk = ((volatile unsigned *)gpio_map) + GPCLK_ADDR / 4;
 
+}  // setup_io