diff -ru -x *.orig -x *.rej -x *.a -x *.o -x vmlinux -x System.map -x .depend -x .version -x .menuconfig* -x .hdepend -x .config* -x *_MODULES -x *.ver -x bootstrap -x atari_bootstrap /var/src/linux-2.1.26/arch/m68k/atari/atari_ksyms.c /var/src/linux/arch/m68k/atari/atari_ksyms.c
--- /var/src/linux-2.1.26/arch/m68k/atari/atari_ksyms.c	Fri Feb 14 21:38:24 1997
+++ /var/src/linux/arch/m68k/atari/atari_ksyms.c	Tue Feb 25 20:17:24 1997
@@ -14,6 +14,7 @@
 EXPORT_SYMBOL(atari_mch_cookie);
 EXPORT_SYMBOL(atari_hw_present);
 EXPORT_SYMBOL(is_medusa);
+EXPORT_SYMBOL(is_hades);
 EXPORT_SYMBOL(atari_register_vme_int);
 EXPORT_SYMBOL(atari_unregister_vme_int);
 EXPORT_SYMBOL(stdma_lock);
diff -ru -x *.orig -x *.rej -x *.a -x *.o -x vmlinux -x System.map -x .depend -x .version -x .menuconfig* -x .hdepend -x .config* -x *_MODULES -x *.ver -x bootstrap -x atari_bootstrap /var/src/linux-2.1.26/arch/m68k/atari/config.c /var/src/linux/arch/m68k/atari/config.c
--- /var/src/linux-2.1.26/arch/m68k/atari/config.c	Sun Feb 16 09:49:05 1997
+++ /var/src/linux/arch/m68k/atari/config.c	Mon Mar  3 19:26:26 1997
@@ -279,7 +279,7 @@
      */
 
     printk( "Atari hardware found: " );
-    if (is_medusa) {
+    if (is_medusa || is_hades) {
         /* There's no Atari video hardware on the Medusa, but all the
          * addresses below generate a DTACK so no bus error occurs! */
     }
@@ -321,7 +321,7 @@
 	ATARIHW_SET(SCSI_DMA);
         printk( "TT_SCSI_DMA " );
     }
-    if (hwreg_present( &st_dma.dma_hi )) {
+    if (!is_hades && hwreg_present( &st_dma.dma_hi )) {
 	ATARIHW_SET(STND_DMA);
         printk( "STND_DMA " );
     }
@@ -343,11 +343,11 @@
 	ATARIHW_SET(YM_2149);
         printk( "YM2149 " );
     }
-    if (!is_medusa && hwreg_present( &tt_dmasnd.ctrl )) {
+    if (!is_medusa && !is_hades && hwreg_present( &tt_dmasnd.ctrl )) {
 	ATARIHW_SET(PCM_8BIT);
         printk( "PCM " );
     }
-    if (hwreg_present( &codec.unused5 )) {
+    if (!is_hades && hwreg_present( &codec.unused5 )) {
 	ATARIHW_SET(CODEC);
         printk( "CODEC " );
     }
@@ -361,7 +361,7 @@
 	(tt_scc_dma.dma_ctrl = 0x01, (tt_scc_dma.dma_ctrl & 1) == 1) &&
 	(tt_scc_dma.dma_ctrl = 0x00, (tt_scc_dma.dma_ctrl & 1) == 0)
 #else
-	!is_medusa
+	!is_medusa && !is_hades
 #endif
 	) {
 	ATARIHW_SET(SCC_DMA);
@@ -375,7 +375,12 @@
 	ATARIHW_SET( ST_ESCC );
 	printk( "ST_ESCC " );
     }
-    if (hwreg_present( &tt_scu.sys_mask )) {
+    if (is_hades)
+    {
+        ATARIHW_SET( VME );
+        printk( "VME " );
+    }
+    else if (hwreg_present( &tt_scu.sys_mask )) {
 	ATARIHW_SET(SCU);
 	/* Assume a VME bus if there's a SCU */
 	ATARIHW_SET( VME );
@@ -385,7 +390,7 @@
 	ATARIHW_SET(ANALOG_JOY);
         printk( "ANALOG_JOY " );
     }
-    if (hwreg_present( blitter.halftone )) {
+    if (!is_hades && hwreg_present( blitter.halftone )) {
 	ATARIHW_SET(BLITTER);
         printk( "BLITTER " );
     }
@@ -394,7 +399,7 @@
         printk( "IDE " );
     }
 #if 1 /* This maybe wrong */
-    if (!is_medusa &&
+    if (!is_medusa && !is_hades &&
 	hwreg_present( &tt_microwire.data ) &&
 	hwreg_present( &tt_microwire.mask ) &&
 	(tt_microwire.mask = 0x7ff,
@@ -412,20 +417,20 @@
         mach_hwclk = atari_hwclk;
         mach_set_clock_mmss = atari_set_clock_mmss;
     }
-    if (hwreg_present( &mste_rtc.sec_ones)) {
+    if (!is_hades && hwreg_present( &mste_rtc.sec_ones)) {
 	ATARIHW_SET(MSTE_CLK);
         printk( "MSTE_CLK ");
         mach_gettod = atari_mste_gettod;
         mach_hwclk = atari_mste_hwclk;
         mach_set_clock_mmss = atari_mste_set_clock_mmss;
     }
-    if (!is_medusa &&
+    if (!is_medusa && !is_hades &&
 	hwreg_present( &dma_wd.fdc_speed ) &&
 	hwreg_write( &dma_wd.fdc_speed, 0 )) {
 	    ATARIHW_SET(FDCSPEED);
 	    printk( "FDC_SPEED ");
     }
-    if (!ATARIHW_PRESENT(ST_SCSI)) {
+    if (!is_hades && !ATARIHW_PRESENT(ST_SCSI)) {
 	ATARIHW_SET(ACSI);
         printk( "ACSI " );
     }
@@ -638,7 +643,7 @@
        we use the fact that in head.S we have set up a mapping
        0xFFxxxxxx -> 0x00xxxxxx, so that the first 16MB is accessible
        in the last 16MB of the address space. */
-    tos_version = is_medusa ? 0xfff : *(unsigned short *)0xFF000002;
+    tos_version = (is_medusa || is_hades) ? 0xfff : *(unsigned short *)0xFF000002;
     *yearp += (tos_version < 0x306) ? 70 : 68;
 }
 
@@ -713,7 +718,7 @@
 
     /* Tos version at Physical 2.  See above for explanation why we
        cannot use PTOV(2).  */
-    tos_version = is_medusa ? 0xfff : *(unsigned short *)0xff000002;
+    tos_version = (is_medusa || is_hades) ? 0xfff : *(unsigned short *)0xff000002;
 
     ctrl = RTC_READ(RTC_CONTROL); /* control registers are
                                    * independent from the UIP */
@@ -1102,7 +1107,8 @@
 
     /* On the Medusa, phys. 0x4 may contain garbage because it's no
        ROM.  See above for explanation why we cannot use PTOV(4). */
-    reset_addr = is_medusa ? 0xe00030 : *(unsigned long *) 0xff000004;
+    reset_addr = is_hades ? 0x7fe00030 :
+                 (is_medusa ? 0xe00030 : *(unsigned long *) 0xff000004);
 
     acia.key_ctrl = ACIA_RESET;             /* reset ACIA for switch off OverScan, if it's active */
 
@@ -1182,6 +1188,8 @@
 	    if (is_medusa)
 		/* Medusa has TT _MCH cookie */
 		strcat (model, "Medusa");
+	    else if (is_hades)
+		strcat(model, "Hades");
 	    else
 		strcat (model, "TT");
 	    break;
diff -ru -x *.orig -x *.rej -x *.a -x *.o -x vmlinux -x System.map -x .depend -x .version -x .menuconfig* -x .hdepend -x .config* -x *_MODULES -x *.ver -x bootstrap -x atari_bootstrap /var/src/linux-2.1.26/arch/m68k/boot/atari/bootstrap.c /var/src/linux/arch/m68k/boot/atari/bootstrap.c
--- /var/src/linux-2.1.26/arch/m68k/boot/atari/bootstrap.c	Wed Feb 19 21:06:05 1997
+++ /var/src/linux/arch/m68k/boot/atari/bootstrap.c	Wed Feb 19 20:51:40 1997
@@ -163,6 +163,9 @@
  * ...err! On the Afterburner040 (for the Falcon) it's the same... So we do
  * another test with 0x00ff82fe, that gives a bus error on the Falcon, but is
  * in the range where the Medusa always asserts DTACK.
+ * On the Hades address 0 is writeable as well and it asserts DTACK on
+ * address 0x00ff82fe. To test if the machine is a Hades, address 0xb0000000
+ * is tested. On the Medusa this gives a bus error.
  */
 
 int test_medusa( void )
@@ -181,7 +184,10 @@
 		  "nop		\n\t"
 		  "tstb		0x00ff82fe\n\t"
 		  "nop		\n\t"
-		  "moveq	#1,%0\n"
+		  "moveq	#1,%0\n\t"
+		  "tstb		0xb0000000\n\t"
+		  "nop		\n\t"
+		  "moveq	#0,%0\n"
 		"Lberr:\t"
 		  "movel	a1,sp\n\t"
 		  "movel	a0,0x8"
diff -ru -x *.orig -x *.rej -x *.a -x *.o -x vmlinux -x System.map -x .depend -x .version -x .menuconfig* -x .hdepend -x .config* -x *_MODULES -x *.ver -x bootstrap -x atari_bootstrap /var/src/linux-2.1.26/arch/m68k/kernel/head.S /var/src/linux/arch/m68k/kernel/head.S
--- /var/src/linux-2.1.26/arch/m68k/kernel/head.S	Mon Feb  3 22:42:32 1997
+++ /var/src/linux/arch/m68k/kernel/head.S	Thu Feb 20 19:30:35 1997
@@ -73,6 +73,7 @@
 
 .globl SYMBOL_NAME(kernel_pg_dir), SYMBOL_NAME(kpt)
 .globl SYMBOL_NAME(availmem), SYMBOL_NAME(is_medusa)
+.globl SYMBOL_NAME(is_hades)
 .globl SYMBOL_NAME(m68k_pgtable_cachemode)
 .globl SYMBOL_NAME(kernel_pmd_table), SYMBOL_NAME(swapper_pg_dir)
 
@@ -235,8 +236,58 @@
 #endif
 
 /*
+   If running on an Atari, determine the I/O base of the
+   serial port and test if we are running on a Medusa or Hades.
+   This test is necessary here, because on the Hades the serial
+   port is only accessible in the high I/O memory area.
+
+   The test whether it is a Medusa is done by writing to the byte at
+   phys. 0x0. This should result in a bus error on all other machines.
+
+   ...should, but doesn't. The Afterburner040 for the Falcon has the
+   same behaviour (0x0..0x7 are no ROM shadow). So we have to do
+   another test to distinguish Medusa and AB040. This is a
+   read attempt for 0x00ff82fe phys. that should bus error on a Falcon
+   (+AB040), but is in the range where the Medusa always asserts DTACK.
+
+   The test for the Hades is done by reading address 0xb0000000. This
+   should give a bus error on the Medusa.
+ */
+
+#ifdef CONFIG_ATARI
+	is_not_atari(Lnotypetest)
+
+	moveq	#0,%d3			/* base addr for others: 0x00000000 */
+	moveq	#0,%d2			/* no Hades */
+	movec	%d3,%vbr
+	lea	%pc@(Ltest_berr),%a0
+	movel	%a0,0x8
+	movel	%sp,%a0
+	moveb	0x0,%d1
+	clrb	0x0
+	nop
+	moveb	%d1,0x0
+	nop
+	tstb	0x00ff82fe
+	nop
+	movel	#0xff000000,%d3		/* Medusa base addr: 0xff000000 */
+	tstb	0xb0000000
+	nop
+	movel	#0xff000000,%d2		/* Computer is a Hades */
+	moveq	#0,%d3
+Ltest_berr:
+	movel	%a0,%sp
+	lea	%pc@(SYMBOL_NAME(is_hades)),%a0
+	movel	%d2,%a0@
+	lea	%pc@(SYMBOL_NAME(is_medusa)),%a0
+	movel	%d3,%a0@
+Lnotypetest:
+#endif
+
+/*
  * Initialize serial port
  */
+
 	jbsr Lserial_init
 
 	putr()
@@ -491,35 +542,16 @@
 
    For the Medusa it is better to map the I/O region transparently
    (i.e. 0xffxxxxxx -> 0xffxxxxxx), because some I/O registers are
-   accessible only in the high area. The test whether it is a Medusa
-   is done by writing to the byte at phys. 0x0. This should result
-   in a bus error on all other machines.
+   accessible only in the high area.
 
-   ...should, but doesn't. The Afterburner040 for the Falcon has the
-   same behaviour (0x0..0x7 are no ROM shadow). So we have to do
-   another test to distinguish Medusa and AB040. This is a
-   read attempt for 0x00ff82fe phys. that should bus error on a Falcon
-   (+AB040), but is in the range where the Medusa always asserts DTACK.
+   On the Hades all I/O registers are only accessible in the high
+   area.
 */
 
-	moveq	#0,%d3			/* base addr for others: 0x00000000 */
-	movec	%d3,%vbr
-	lea	%pc@(Ltest_berr),%a0
-	movel	%a0,0x8
-	movel	%sp,%a0
-	moveb	0x0,%d1
-	clrb	0x0
-	nop
-	moveb	%d1,0x0
-	nop
-	tstb	0x00ff82fe
-	nop
-	movel	#0xff000000,%d3		/* Medusa base addr: 0xff000000 */
-Ltest_berr:
-	movel	%a0,%sp
-	lea     %pc@(SYMBOL_NAME(is_medusa)),%a0
-	movel	%d3,%a0@
-
+	movel   %pc@(is_medusa),%d3
+	bne     1f
+	movel   %pc@(is_hades),%d3
+1:
 	/* Let the root table point to the new pointer table */
 	lea	%a4@(PTR_TABLE_SIZE<<2),%a4
 	movel	%a4,%a0
@@ -979,19 +1011,20 @@
 #ifdef CONFIG_ATARI
 	cmpil   #MACH_ATARI,%d4
 	jne	4f
+	movel	%pc@(Liobase),%a1
 #ifdef USE_PRINTER
-	bclr	#0,LSTMFP_IERB
-	bclr	#0,LSTMFP_DDR
-	moveb	#LPSG_CONTROL,LPSG_SELECT
-	moveb	#0xff,LPSG_WRITE
-	moveb	#LPSG_IO_B,LPSG_SELECT
-	clrb	LPSG_WRITE
-	moveb	#LPSG_IO_A,LPSG_SELECT
-	moveb	LPSG_READ,%d0
+	bclr	#0,%a1@(LSTMFP_IERB)
+	bclr	#0,%a1@(LSTMFP_DDR)
+	moveb	#LPSG_CONTROL,%a1@(LPSG_SELECT)
+	moveb	#0xff,%a1@(LPSG_WRITE)
+	moveb	#LPSG_IO_B,%a1@(LPSG_SELECT)
+	clrb	%a1@(LPSG_WRITE)
+	moveb	#LPSG_IO_A,%a1@(LPSG_SELECT)
+	moveb	%a1@(LPSG_READ),%d0
 	bset	#5,%d0
-	moveb	%d0,LPSG_WRITE
+	moveb	%d0,%a1@(LPSG_WRITE)
 #elif defined(USE_SCC)
-	lea	LSCC_CTRL_B,%a0
+	lea	%a1@(LSCC_CTRL_B),%a0
 	lea	%pc@(scc_initable:w),%a1
 2:	moveb	%a1@+,%d0
 	jmi	3f
@@ -1000,12 +1033,12 @@
 	jra	2b
 3:	clrb	%a0@
 #elif defined(USE_MFP)
-	bclr	#1,LMFP_TSR
-	moveb   #0x88,LMFP_UCR
-	andb	#0x70,LMFP_TDCDR
-	moveb   #2,LMFP_TDDR
-	orb	#1,LMFP_TDCDR
-	bset	#1,LMFP_TSR
+	bclr	#1,%a1@(LMFP_TSR)
+	moveb   #0x88,%a1@(LMFP_UCR)
+	andb	#0x70,%a1@(LMFP_TDCDR)
+	moveb   #2,%a1@(LMFP_TDDR)
+	orb	#1,%a1@(LMFP_TDCDR)
+	bset	#1,%a1@(LMFP_TSR)
 #endif
 4:
 #endif
@@ -1140,6 +1173,8 @@
 SYMBOL_NAME_LABEL(availmem)
 	.long 0
 SYMBOL_NAME_LABEL(is_medusa)
+	.long 0
+SYMBOL_NAME_LABEL(is_hades)
 	.long 0
 SYMBOL_NAME_LABEL(m68k_pgtable_cachemode)
 	.long 0
diff -ru -x *.orig -x *.rej -x *.a -x *.o -x vmlinux -x System.map -x .depend -x .version -x .menuconfig* -x .hdepend -x .config* -x *_MODULES -x *.ver -x bootstrap -x atari_bootstrap /var/src/linux-2.1.26/drivers/scsi/atari_scsi.c /var/src/linux/drivers/scsi/atari_scsi.c
--- /var/src/linux-2.1.26/drivers/scsi/atari_scsi.c	Fri Feb 14 21:43:43 1997
+++ /var/src/linux/drivers/scsi/atari_scsi.c	Tue Feb 25 20:06:51 1997
@@ -665,7 +665,7 @@
 	if (setup_use_tagged_queuing < 0)
 		setup_use_tagged_queuing = DEFAULT_USE_TAGGED_QUEUING;
 #endif
-
+#ifdef REAL_DMA
 	/* If running on a Falcon and if there's TT-Ram (i.e., more than one
 	 * memory block, since there's always ST-Ram in a Falcon), then allocate a
 	 * STRAM_BUFFER_SIZE byte dribble buffer for transfers from/to alternative
@@ -678,7 +678,7 @@
 		atari_dma_phys_buffer = VTOP( atari_dma_buffer );
 		atari_dma_orig_addr = 0;
 	}
-
+#endif
 	instance = scsi_register (host, sizeof (struct NCR5380_hostdata));
 	atari_scsi_host = instance;
 #if 1
@@ -714,8 +714,8 @@
 		tt_scsi_dma.dma_ctrl = 0;
 		atari_dma_residual = 0;
 #endif /* REAL_DMA */
-
-		if (is_medusa) {
+#ifdef REAL_DMA
+		if (is_medusa || is_hades) {
 			/* While the read overruns (described by Drew Eckhardt in
 			 * NCR5380.c) never happened on TTs, they do in fact on the Medusa
 			 * (This was the cause why SCSI didn't work right for so long
@@ -730,6 +730,7 @@
 			 */
 			atari_read_overruns = 4;
 		}
+#endif
 		
 	}
 	else { /* ! IS_A_TT */
diff -ru -x *.orig -x *.rej -x *.a -x *.o -x vmlinux -x System.map -x .depend -x .version -x .menuconfig* -x .hdepend -x .config* -x *_MODULES -x *.ver -x bootstrap -x atari_bootstrap /var/src/linux-2.1.26/include/asm-m68k/atarihw.h /var/src/linux/include/asm-m68k/atarihw.h
--- /var/src/linux-2.1.26/include/asm-m68k/atarihw.h	Sun Feb 16 09:49:09 1997
+++ /var/src/linux/include/asm-m68k/atarihw.h	Wed Feb 19 22:20:59 1997
@@ -98,6 +98,7 @@
 void atari_stram_free (void *);
 
 extern int is_medusa;
+extern int is_hades;
 
 /* Do cache push/invalidate for DMA read/write. This function obeys the
  * snooping on some machines (Medusa) and processors: The Medusa itself can
