Przeglądaj źródła

Moved file to here

Per Mårtensson 2 miesięcy temu
rodzic
commit
dbc41f852d

+ 67 - 0
config_files/blacksasi.json

@@ -0,0 +1,67 @@
+{
+    "_comment": "Example of json config.",
+    "config": {
+        "version": 1,
+        "name": "BlackSASI"
+    },
+    "images": [
+        {
+            "id": 0,
+            "name": "ABC1600 disc",
+            "termination": "high",
+            "disk": [
+                {
+                    "name": "ABC1600 disc 1",
+                    "scsi_id": 2,
+                    "lun": 0,
+                    "file": "abc1600_example1.dsk",
+                    "sectorsize": 512,
+                    "readonly": "false",
+                    "vendor": "SWEPROJ",
+                    "product": "BLACKSASI",
+                    "version": "1.0"
+                },
+                {
+                    "name": "ABC1600 disc 2",
+                    "scsi_id": 3,
+                    "lun": 0,
+                    "file": "abc1600_example2.dsk",
+                    "sectorsize": 512,
+                    "readonly": "false",
+                    "vendor": "SWEPROJ",
+                    "product": "BLACKSASI",
+                    "version": "1.0"
+                }
+            ]
+        },
+        {
+            "id": 1,
+            "name": "X37 disc",
+            "termination": "high",
+            "disk": [
+                {
+                    "name": "X37 disc 1",
+                    "scsi_id": 2,
+                    "lun": 0,
+                    "file": "x37_example1.dsk",
+                    "sectorsize": 512,
+                    "readonly": "false",
+                    "vendor": "SWEPROJ",
+                    "product": "BLACKSASI",
+                    "version": "1.0"
+                },
+                {
+                    "name": "ABC1600 disc 2",
+                    "scsi_id": 3,
+                    "lun": 0,
+                    "file": "x37_example2.dsk",
+                    "sectorsize": 512,
+                    "readonly": "false",
+                    "vendor": "SWEPROJ",
+                    "product": "BLACKSASI",
+                    "version": "1.0"
+                }
+            ]
+        }
+    ]
+}

+ 1941 - 0
config_files/cpm/diskdefs

@@ -0,0 +1,1941 @@
+diskdef monroe.80.16
+  seclen 256
+  tracks 80
+  sectrk 16
+  blocksize 2048
+  maxdir 64
+  skew 4
+  boottrk 3
+  os 2.2
+end
+diskdef monroe.80.8
+  seclen 512
+  tracks 160
+  sectrk 8
+  blocksize 2048
+  maxdir 129
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+diskdef jet80.160.5
+  seclen 1024
+  tracks 160
+  sectrk 5
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 1
+  os 3
+end
+
+diskdef jet80.160.8
+  seclen 1024
+  tracks 160
+  sectrk 8
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 2
+  os 3
+end
+diskdef abc800.1000.26
+  seclen 256
+  tracks 154
+  sectrk 26
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 2
+  os 3
+end
+diskdef ibm-3740
+  seclen 128
+  tracks 77
+  sectrk 26
+  blocksize 1024
+  maxdir 64
+  skew 6
+  boottrk 2
+  os 2.2
+end
+
+diskdef 4mb-hd
+  seclen 128
+  tracks 1024
+  sectrk 32
+  blocksize 2048
+  maxdir 256
+  skew 1
+  boottrk 0
+  os p2dos
+end
+
+diskdef sdcard
+  seclen 512
+  tracks 256
+  sectrk 64
+  blocksize 8192
+  maxdir 256
+  skew 0
+  boottrk 1
+  os 2.2
+end
+
+diskdef pcw
+  seclen 512
+  tracks 40
+  sectrk 9
+  blocksize 1024
+  maxdir 64
+  skew 1
+  boottrk 1
+  os 3
+  libdsk:format pcw180
+end
+
+diskdef pc1.2m
+  seclen 512
+  tracks 80
+  # this format uses 15 sectors per track, but 30 per cylinder
+  sectrk 30
+  blocksize 4096
+  maxdir 256
+  skew 1
+  boottrk 0
+  os 3
+end
+
+# CP/M 86 on 1.44MB floppies
+diskdef cpm86-144feat
+  seclen 512
+  tracks 160
+  sectrk 18
+  blocksize 4096
+  maxdir 256
+  skew 1
+  boottrk 2
+  os 3
+  libdsk:format ibm1440
+end
+
+# CP/M 86 on 720KB floppies
+diskdef cpm86-720
+  seclen 512
+  tracks 160
+  sectrk 9 
+  blocksize 2048
+  maxdir 256
+  skew 1
+  boottrk 2
+  os 3
+end
+
+diskdef cf2dd
+  seclen 512
+  tracks 160
+  sectrk 9
+  blocksize 2048
+  maxdir 256
+  skew 1
+  boottrk 1
+  os 3
+  libdsk:format pcw720
+end
+
+#amstrad: values are read from super block (special name hardcoded)
+
+# Royal alphatronic
+# setfdprm /dev/fd1 dd ssize=256 cyl=40 sect=16 head=2
+diskdef alpha
+  seclen 256
+  tracks 40
+  sectrk 32
+  blocksize 2048
+  maxdir 128
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# Apple II CP/M skew o Apple II DOS 3.3 skew
+diskdef apple-do
+  seclen 256
+  tracks 35
+  sectrk 16
+  blocksize 1024
+  maxdir 64
+  skewtab 0,6,12,3,9,15,14,5,11,2,8,7,13,4,10,1
+  boottrk 3
+  os 2.2
+end
+
+# Apple II CP/M skew o Apple II PRODOS skew
+diskdef apple-po
+  seclen 256
+  tracks 35
+  sectrk 16
+  blocksize 1024
+  maxdir 64
+  skewtab 0,9,3,12,6,15,1,10,4,13,7,8,2,11,5,14
+  boottrk 3
+  os 2.2
+end
+
+# MYZ80 hard drive (only works with libdsk, because it has a 256-byte header)
+diskdef myz80
+  seclen 1024
+  tracks 64
+  sectrk 128
+  blocksize 4096
+  maxdir 1024
+  skew 1
+  boottrk 0
+  os 3
+  libdsk:format pcw720
+end
+
+# Despite being Amstrad formats, CPC System and CPC Data don't have an Amstrad 
+# superblock. You'll need to use libdsk to access them because the Linux 
+# and Windows kernel drivers won't touch them.
+diskdef cpcsys
+  seclen 512
+  tracks 40
+  sectrk 9
+  blocksize 1024
+  maxdir 64
+  skew 1
+  boottrk 2
+  os 3
+  libdsk:format cpcsys
+end
+diskdef cpcdata
+  seclen 512
+  tracks 40
+  sectrk 9
+  blocksize 1024
+  maxdir 64
+  skew 1
+  boottrk 0
+  os 3
+  libdsk:format cpcdata
+end
+
+# after being read in with no sector skew.
+diskdef nigdos
+  seclen 512
+  # NigDos double sided disk format, 42 tracks * 2 sides
+  tracks 84
+  sectrk 10
+  blocksize 2048
+  maxdir 128
+  skew 1
+  boottrk 0
+  # this format wastes half of the directory entry
+  logicalextents 1
+  os 3
+end
+
+diskdef epsqx10
+  seclen 512
+  tracks 40
+  sectrk 20
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 2
+  os 2.2
+end
+
+diskdef ibm-8ss
+  seclen 512
+  tracks 40
+  sectrk 8
+  blocksize 1024
+  maxdir 64
+  skew 0
+  boottrk 1
+  os 2.2
+end
+
+diskdef ibm-8ds
+  seclen 512
+  tracks 40
+  sectrk 8
+  blocksize 1024
+  maxdir 64
+  skew 0
+  boottrk 1
+  os 2.2
+end
+
+diskdef electroglas
+  seclen 512
+  tracks 80
+  sectrk 10
+  blocksize 2048
+  maxdir 256
+  skew 0
+  boottrk 1
+  os 3
+end
+
+# IBM CP/M-86
+# setfdprm /dev/fd1 sect=8 dtr=1 hd ssize=512 tpi=48 head=1
+diskdef ibmpc-514ss
+   seclen 512
+   tracks 40
+   sectrk 8
+   blocksize 1024
+   maxdir 64
+   skew 1
+   boottrk 1
+   os 2.2
+   libdsk:format ibm160
+end
+
+# IBM CP/M-86
+# setfdprm /dev/fd1 sect=8 dtr=1 hd ssize=512 tpi=48
+diskdef ibmpc-514ds
+   seclen 512
+   tracks 80
+   sectrk 8
+   blocksize 2048
+   maxdir 64
+   skew 0
+   boottrk 2
+   os 2.2
+   libdsk:format ibm320
+end
+
+diskdef p112
+  seclen 512
+  tracks 160
+  sectrk 18
+  blocksize 2048
+  maxdir 256
+  skew 1
+  boottrk 2
+  os 3
+end
+
+diskdef p112-old
+  seclen 512
+  tracks 160
+  sectrk 18
+  blocksize 2048
+  maxdir 128
+  skew 1
+  boottrk 1
+  os 3
+end
+
+diskdef gide-cfa
+  seclen 512
+  tracks 1000
+  sectrk 16
+  blocksize 4096
+  maxdir 1024
+  skew 0
+  boottrk 2
+  os 3
+end
+
+diskdef gide-cfb
+  seclen 512
+  tracks 1000
+  sectrk 16
+  blocksize 4096
+  maxdir 1024
+  skew 0
+  boottrk 0
+# Start of second partition
+  offset 1000trk
+  os 3
+end
+
+# AT&T/Olivetti Word Processor
+diskdef attwp
+   seclen 256
+   tracks 80
+   sectrk 32
+   blocksize 2048
+   maxdir 128
+   boottrk 1
+   logicalextents 1
+   skewtab 0,2,4,6,8,10,12,14,1,3,5,7,9,11,13,15,16,18,20,22,24,26,28,30,17,19,21,23,25,27,29,31
+   os 2.2
+end
+
+# setfdprm /dev/fd0 zerobased SS DD ssize=512 cyl=40 sect=10 head=1
+# Kaypro II
+diskdef kpii
+  seclen 512
+  tracks 40
+  sectrk 10
+  blocksize 1024
+  maxdir 64
+  skew 0
+  boottrk 1
+  os 2.2
+end
+
+# setfdprm /dev/fd0 zerobased DS DD ssize=512 cyl=40 sect=10 head=2
+# Kayro IV
+diskdef kpiv
+  seclen 512
+  tracks 80
+  sectrk 10
+  blocksize 2048
+  maxdir 64
+  skew 0
+  boottrk 1
+  os 2.2
+end
+
+# setfdprm /dev/fd0 dd sect=10
+diskdef interak
+  seclen 512
+  tracks 80
+  sectrk 20
+  blocksize 4096
+  maxdir 256
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# Timex FDD3000 3"
+diskdef fdd3000
+  seclen 256
+  tracks 40
+  sectrk 16
+  blocksize 1024
+  maxdir 128
+  boottrk 4
+  os 2.2
+  skew 7
+end
+
+# Timex FDD3000 3"
+diskdef fdd3000_2
+  seclen 256
+  tracks 40
+  sectrk 16
+  blocksize 1024
+  maxdir 128
+  boottrk 2
+  os 2.2
+  skew 5
+end
+
+############################
+# GdR/Robotron scp disks
+############################
+
+# robotron PC1715 SCP 185k (40*1* 5,1024 6 OFS 2k DIR) 5.25"
+# setfdprm /dev/fd1 ds dd ssize=1024 cyl=40 sect=5 head=1 dtr=1 fm=0
+diskdef 1715
+  seclen 1024
+  tracks 40
+  sectrk 5
+  blocksize 1024
+  maxdir 64
+  skew 0
+  boottrk 3
+  os 2.2
+end
+
+# robotron PC1715 SCP3 760k (80*2* 5,1024 8 OFS 4k DIR) 5.25"
+# setfdprm /dev/fd1 ds dd ssize=1024 cyl=80 sect=5 head=2 dtr=1 fm=0
+diskdef 17153
+  seclen 1024
+  tracks 160
+  sectrk 5
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 4
+  os 3
+end
+
+# robotron PC1715 SCP 624k (80*2* 16,256 8 OFS 4k DIR) 5.25"
+# setfdprm /dev/fd1 ds dd ssize=256 cyl=80 sect=16 head=2 dtr=1 fm=0
+diskdef scp624
+  seclen 256
+  tracks 160
+  sectrk 16
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 4
+  os 2.2
+  libdsk:format scp640
+end
+
+# robotron PC1715 SCP 640k (80*2* 16,256 0 OFS 4k DIR) 5.25"
+# setfdprm /dev/fd1 ds dd ssize=256 cyl=80 sect=16 head=2 dtr=1 fm=0
+diskdef scp640
+  seclen 256
+  tracks 160
+  sectrk 16
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 0
+  os 2.2
+  libdsk:format scp640
+end
+
+# robotron PC1715 SCP 780k (80*2* 5,1024 8 OFS 4k DIR) 5.25"
+# setfdprm /dev/fd1 ds dd ssize=1024 cyl=80 sect=5 head=2 dtr=1 fm=0
+diskdef scp780
+  seclen 1024
+  tracks 160
+  sectrk 5
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 4
+  os 2.2
+  libdsk:format scp800
+end
+
+# robotron PC1715 SCP 800k (80*2* 5,1024 0 OFS 4k DIR) 5.25"
+# setfdprm /dev/fd1 ds dd ssize=1024 cyl=80 sect=5 head=2 dtr=1 fm=0
+diskdef scp800
+  seclen 1024
+  tracks 160
+  sectrk 5
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 0
+  os 2.2
+  libdsk:format scp800
+end 
+
+# robotron Z9001 800k (80*2* 5,1024 0 OFS 6k DIR) 5.25"
+# setfdprm /dev/fd1 ds dd ssize=1024 cyl=80 sect=5 head=2 dtr=1 fm=0
+diskdef z9001
+  seclen 1024
+  tracks 160
+  sectrk 5
+  blocksize 2048
+  maxdir 192
+  skew 0
+  boottrk 0
+  os 2.2
+end 
+
+# Visual Technology Visual 1050 computer
+diskdef v1050
+  seclen 512
+  tracks 80
+  sectrk 10
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 2
+  os 3
+end
+
+# Microbee 40 track 5.25" disks
+diskdef microbee40
+  seclen 512
+  tracks 80
+  sectrk 10
+  blocksize 2048
+  maxdir 128
+  skewtab 1,4,7,0,3,6,9,2,5,8
+  boottrk 2
+  os 2.2
+end
+
+diskdef dreamdisk40
+  seclen 512
+  tracks 80
+  sectrk 10
+  blocksize 2048
+  maxdir 128
+  skewtab 1,4,7,0,3,6,9,2,5,8
+  boottrk 2
+  os 2.2
+end
+
+diskdef dreamdisk80
+  seclen 512
+  tracks 160
+  sectrk 10
+  blocksize 2048
+  maxdir 256
+  skewtab 1,4,7,0,3,6,9,2,5,8
+  boottrk 2
+  os 2.2
+end
+
+# RC75x series
+diskdef rc75x
+  seclen 1024
+  tracks 154
+  sectrk 8
+  blocksize 2048
+  maxdir 512
+  boottrk 4
+  os 3
+end
+
+# ICL Comet: 40 track 5.25" Single Sided
+#
+diskdef icl-comet-525ss
+   seclen 512
+   tracks 40
+   sectrk 10
+   blocksize 1024
+   maxdir 64
+   skewtab 0,3,6,9,2,5,8,1,4,7
+   boottrk 2
+   os 2.2
+end
+
+diskdef z80pack-hd
+  seclen 128
+  tracks 255
+  sectrk 128
+  blocksize 2048
+  maxdir 1024
+  skew 0
+  boottrk 0
+  os 2.2
+end
+
+diskdef z80pack-hdb
+  seclen 128
+  tracks 256
+  sectrk 16384
+  blocksize 16384
+  maxdir 8192
+  skew 0
+  boottrk 0
+  os 2.2
+end
+
+# Bondwell 12 and 14 disk images in IMD raw binary format
+diskdef bw12
+  seclen 256
+  tracks 40
+  sectrk 18
+  blocksize 2048
+  maxdir 64
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+diskdef bw14
+  seclen 256
+  tracks 80
+  sectrk 18
+  blocksize 2048
+  maxdir 64
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+############################
+# north star cp/m  disks
+############################
+
+#North Star floppy 360K
+
+diskdef nsfd
+  seclen 512
+  tracks 70 
+  sectrk 10 
+  blocksize 2048
+  maxdir 64
+  skew 5  
+  boottrk 2
+  os 2.2
+end
+
+
+#North Star CP/M Virtual-Disk file on Hard Disk
+# prepared with allocation factor = 4
+# as in "CR CPMB 4000 4"
+# needs to be copied off hard drive before you can 
+# work on it with cpmtools
+
+diskdef nshd4
+  seclen 512
+  tracks 512
+  sectrk 16 
+  blocksize 4096
+  maxdir 256
+  skew 0  
+  boottrk 0
+  os 2.2
+end
+
+
+#North Star CP/M Virtual-Disk file on Hard Disk
+# prepared with allocation factor = 8
+# as in "CR CPMB 6000 8"
+# needs to be copied off hard drive before you can
+# work on it with cpmtools
+
+diskdef nshd8
+  seclen 512
+  tracks 1024
+  sectrk 16 
+  blocksize 8192
+  maxdir 256
+  skew 0  
+  boottrk 0
+  os 2.2
+end
+
+# Northstar Micro-Disk System MDS-A-D 175
+diskdef mdsad175
+    seclen 512
+    blocksize 1024
+    tracks 35
+    maxdir 64
+    boottrk 2
+    sectrk 10
+    skew 5
+    os 2.2
+end
+
+
+# Northstar Micro-Disk System MDS-A-D 350
+diskdef mdsad350
+   seclen 512
+   blocksize 2048
+   tracks 70
+   maxdir 64
+   boottrk 2
+   sectrk 10
+   skew 5
+   os 2.2
+end
+
+
+# Osborne 1
+diskdef osborne1
+   seclen 1024
+   tracks 40
+   sectrk 5
+   blocksize 1024
+   maxdir 64
+   boottrk 3
+   os 2.2
+end
+
+# Osborne Nuevo/Vixen/4
+diskdef osborne4
+   seclen 1024
+   tracks 80
+   sectrk 5
+   blocksize 2048
+   maxdir 128
+   skew 2
+   boottrk 2
+   os 2.2
+end
+
+# Lobo Max-80 8" CP/M 2
+diskdef lobo2
+  seclen 256
+  tracks 77
+  sectrk 30
+  blocksize 2048
+  maxdir 64
+  skew 0
+  boottrk 2
+  os 2.2
+end
+
+#Lobo Max-80 8" CP/M 3
+diskdef lobo3
+  seclen 512
+  tracks 77
+  sectrk 17
+  blocksize 2048
+  maxdir 64
+  skew 0
+  boottrk 2
+  os 3
+end
+
+# DEC VT-180 'Robin' (CP/M); works with disks available on Bitsavers (http://bitsavers.org/pdf/dec/terminal/vt180/dskimage/)
+diskdef vt180
+   seclen 512
+   tracks 40
+   sectrk 9
+   blocksize 1024
+   maxdir 64
+   skew 2
+   os 2.2
+   boottrk 2
+   logicalextents 1
+end
+
+# DEC Rainbow-100 CP/M disks; also DEC PRO CP/M RZ50 DZ format (Perhaps only 79 tracks should be used?)
+diskdef dec_pro
+  seclen 512
+  tracks 80
+  sectrk 10
+  blocksize 2048
+  maxdir 128
+  skew 2
+  boottrk 2
+  os 2.2
+end
+
+# TDOS with DateStamper
+diskdef tdos-ds
+  seclen 1024
+  tracks 77
+  sectrk 16
+  blocksize 2048
+  maxdir 256
+  skew 0
+  boottrk 1
+  os zsys
+end
+
+# The following entires are tested and working
+# Most of the images are either from Don Maslin's archive or from
+# Dave Dunfield's site, but not all - they are noted as well as
+# their size.
+
+# PMC Micromate
+# Dave Dunfield's Imagedisk information from DSK conversion from IMD:
+# IMageDisk Utility 1.18 / Mar 07 2012
+# IMD 1.14: 10/03/2007 11:13:27
+# PMC-101 MicroMate
+# CP/M Plus
+# System Master
+# Assuming 1:1 for Binary output
+# 0/0 250 kbps DD  5x1024
+# 80 tracks(40/40), 400 sectors (12 Compressed)
+# Entry derived from above - image size = 409,600, from Dave Dunfield
+diskdef pmc101
+  seclen 1024
+  tracks 80
+  sectrk 5
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 2
+  os 3
+end
+  
+# BEGIN td143ssdd8  Turbo Dos 1.43 - SSDD 8" - 512 x 16
+# Test OK - image size = 630,784, from Don Maslin's archive
+diskdef td143ssdd8
+  seclen 512
+  tracks 77
+  sectrk 9
+  blocksize 1024
+  maxdir 64
+  skew 0
+  boottrk 0
+  os 2.2
+# DENSITY MFM ,LOW 
+end
+
+# BEGIN headsdd8  Heath H89, Magnolia CP/M - SSDD 8" - 512 x 16
+# Test OK - image size = 630,784, from Don Maslin's archive
+diskdef heassdd8
+  seclen 512
+  tracks 77
+  sectrk 16
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 2
+  os 2.2
+# DENSITY MFM ,LOW 
+end
+
+# ZEN7  Zenith Z-100 - SSDD 48 tpi 5.25" - 512 x 8
+diskdef zen7
+  seclen 512
+  tracks 40
+  sectrk 8
+  blocksize 1024
+  maxdir 128
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# ZEN8  Zenith Z-100 - DSDD 48 tpi 5.25" - 512 x 8
+diskdef zen8
+  seclen 512
+  tracks 80
+  sectrk 8
+  blocksize 2048
+  maxdir 256
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# ZEN9  Zenith Z-100 - SSSD 8" - 128 x 26
+diskdef zen9
+  seclen 128
+  tracks 77
+  sectrk 26
+  blocksize 1024
+  maxdir 64
+  skew 6
+  boottrk 2
+  os 2.2
+end
+
+# ZENA  Zenith Z-100 - SSDD 8" - 256 x 26
+diskdef zena
+  seclen 256
+  tracks 77
+  sectrk 26
+  blocksize 2048
+  maxdir 128
+  skew 9
+  boottrk 2
+  os 2.2
+end
+
+# Morrow Designs Micro-Decision         DOUBLE
+# 64k CP/M Vers. 2.2 Rev.2.3            SIDED
+# Copyright '76, '77, '78, '79, '80
+# Digital Research
+# Copyright 1982,1983 Morrow Designs, Inc.
+# Assuming 1:1 for Binary output
+#  0/0 250 kbps DD  5x1024
+# 80 tracks(40/40), 400 sectors (128 Compressed)
+# Entry derived from above data
+# Test OK - image siae = 409600, from Dave Dunfield
+diskdef mordsdd
+  seclen 1024
+  tracks 80
+  sectrk 5
+  blocksize 2048
+  maxdir 128
+  skew 3
+  boottrk 2
+  OS 2.2
+end
+
+
+# BEGIN morsddd Morrow MD2 - SSDD 48 tpi 5.25" - 1024 x 5
+# Test OK - image size = 204,800, from Don Maslin's archive
+# Also tested with image from Dave Dunfield
+diskdef morsddd
+  seclen 1024
+  tracks 40
+  sectrk 5
+  blocksize 2048
+  maxdir 128
+  skew 3
+  boottrk 2
+  os 2.2
+# DENSITY MFM ,LOW 
+# BSH 4 BLM 15 EXM 1 DSM 94 DRM 127 AL0 0C0H AL1 0 OFS 2
+end
+
+# BEGIN osb1sssd  Osborne 1 - SSSD 48 tpi 5.25" - 256 x 10
+# Test OK - image size = 102,400, from Don Maslin's archive
+diskdef osb1sssd
+  seclen 256
+  tracks 40
+  sectrk 10
+  blocksize 2048
+  maxdir 64
+  skew 2
+  boottrk 3
+  os 2.2
+# DENSITY MFM ,LOW 
+# BSH 4 BLM 15 EXM 1 DSM 45 DRM 63 AL0 080H AL1 0 OFS 3
+end
+
+# BEGIN altdsdd  Altos - DSDD 5" - 512 x 9
+# Test OK - both CP/M and MP/M - image size = 737,280, from Dave Dunfield
+diskdef altdsdd
+  seclen 512
+  tracks 160
+  sectrk 9
+  blocksize 4096
+  maxdir 177
+  skew 0
+  boottrk 2
+  os 3
+# DENSITY MFM ,HIGH 
+# BSH 5 BLM 31 EXM 3 DSM 176 DRM 176 AL0 0C0H AL1 0 OFS 2
+end
+
+# All TRS formats added by Larry Kraemer
+
+# BEGIN trsomsssd  TRS-80 Model 1, Omikron CP/M - SSSD 48 tpi 5.25" - 128 x 18
+# Test OK - image size = 80,640, from TRS-80 Yahoo Group posting
+diskdef trsomsssd
+  seclen 128
+  tracks 35
+  sectrk 18
+  blocksize 1024
+  maxdir 64
+  skew 4
+  boottrk 3
+  os 2.2
+# DENSITY FM ,LOW 
+# BSH 3 BLM 7 EXM 0 DSM 71 DRM 63 AL0 0C0H AL1 0 OFS 3
+end
+
+diskdef trsg         #= TRS-80 Model 4,4P Montezuma System 170K - SSDD 48 tpi 5.25"
+  seclen 256         #= Sectors xx,256
+  tracks 40          #= (Cylinders * Sides) = 40*1 = 40
+# sides alt          #= Order of Cylinders  = alt, outout, outback
+  sectrk 18          #= Sectors 18,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try 2
+  boottrk 2          #= OFS = 2
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+diskdef trsh         #= TRS-80 Model 4,4P Montezuma Data 200K - SSDD 48 tpi 5.25"
+  seclen 512         #= Sectors xx,512
+  tracks 40          #= (Cylinders * Sides) = 40*1 = 40
+# sides alt          #= Order of Cylinders  = alt, outout, outback
+  sectrk 10          #= Sectors 10,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try 2
+  boottrk 0          #= OFS = 0
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+diskdef trsi         #= TRS-80 Model 4,4P Montezuma System 350K - DSDD 48 tpi 5.25"
+  seclen 256         #= Sectors xx,256
+  tracks 80          #= (Cylinders * Sides) = 40*2 = 80
+#  sides outout       #= Order of Cylinders  = alt, outout, outback
+  sectrk 18          #= Sectors 18,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try 2
+  boottrk 2          #= OFS = 2
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+#end
+
+diskdef trsj         #= TRS-80 Model 4,4P Montezuma Data 400K - DSDD 48 tpi 5.25"
+  seclen 512         #= Sectors xx,512
+  tracks 80          #= (Cylinders * Sides) = 40*2 = 80
+#  sides outout       #= Order of Cylinders  = alt, outout, outback
+  sectrk 10          #= Sectors 10,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try 2
+  boottrk 0          #= OFS = 0
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+diskdef trsk         #= TRS-80 Model 4,4P Montezuma System 350K - SSDD 96 tpi 5.25"
+  seclen 256         #= Sectors xx,256
+  tracks 80          #= (Cylinders * Sides) = 80*1 = 80
+# sides alt          #= Order of Cylinders  = alt, outout, outback
+  sectrk 18          #= Sectors 18,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try 2
+  boottrk 2          #= OFS = 2
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+diskdef trsl         #= TRS-80 Model 4,4P Montezuma Data 400K - SSDD 96 tpi 5.25"
+  seclen 512         #= Sectors xx,512
+  tracks 80          #= (Cylinders * Sides) = 80*1 = 80
+# sides alt          #= Order of Cylinders  = alt, outout, outback
+  sectrk 10          #= Sectors 10,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try 2
+  boottrk 0          #= OFS = 0
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+diskdef trsm         #= TRS-80 Model 4,4P Montezuma System 710K - DSDD 96 tpi 5.25"
+  seclen 256         #= Sectors xx,256
+  tracks 160         #= (Cylinders * Sides) = 80*2 = 160
+#  sides alt          #= Order of Cylinders  = alt, outout, outback
+  sectrk 18          #= Sectors 18,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try 2
+  boottrk 2          #= OFS = 2
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+diskdef trsn         #= TRS-80 Model 4,4P Montezuma Data 800K - DSDD 96 tpi 5.25"
+  seclen 512         #= Sectors xx,512
+  tracks 160         #= (Cylinders * Sides) = 80*2 = 160
+#  sides alt          #= Order of Cylinders  = alt, outout, outback
+  sectrk 10          #= Sectors 10,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 0             #= [0..8] try 2
+  boottrk 0          #= OFS = 0
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+diskdef trso         #= TRS-80 Model 4,4P Montezuma Extend System 190K - SSDD 48 tpi 5.25"
+  seclen 512         #= Sectors xx,512
+  tracks 40          #= (Cylinders * Sides) = 40*1 = 40
+# sides alt          #= Order of Cylinders  = alt, outout, outback
+  sectrk 10          #= Sectors 10,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try x
+  boottrk 2          #= OFS = 2
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+diskdef trsp         #= TRS-80 Model 4,4P Montezuma Extend System 390K - DSDD 48 tpi 5.25"
+  seclen 512         #= Sectors xx,512
+  tracks 80          #= (Cylinders * Sides) = 40*2 = 80
+#  sides alt          #= Order of Cylinders  = alt, outout, outback
+  sectrk 10          #= Sectors 10,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try 2
+  boottrk 2          #= OFS = 2
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+diskdef trsq         #= TRS-80 Model 4,4P Montezuma Extend System 390K - SSDD 96 tpi 5.25"
+  seclen 512         #= Sectors xx,512
+  tracks 80          #= (Cylinders * Sides) = 80*1 = 80
+# sides alt          #= Order of Cylinders  = alt, outout, outback
+  sectrk 10          #= Sectors 10,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try 2
+  boottrk 2          #= OFS = 2
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+diskdef trsr         #= TRS-80 Model 4,4P Montezuma Extend System 790K - DSDD 96 tpi 5.25"
+  seclen 512         #= Sectors xx,512
+  tracks 160         #= (Cylinders * Sides) = 80*2 = 160
+#  sides alt          #= Order of Cylinders  = alt, outout, outback
+  sectrk 10          #= Sectors 10,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try 2
+  boottrk 2          #= OFS = 2
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+diskdef trss         #= TRS-80 Model 4,4P Montezuma Super Data 220K - SSDD 48 tpi 5.25"
+  seclen 1024        #= Sectors xx,1024
+  tracks 40          #= (Cylinders * Sides) = 40*1 = 40
+# sides alt          #= Order of Cylinders  = alt, outout, outback
+  sectrk 6           #= Sectors 6,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try 2
+  boottrk 0          #= OFS = 0
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+diskdef trst         #= TRS-80 Model 4,4P Montezuma Super Data 440K - DSDD 48 tpi 5.25"
+  seclen 1024        #= Sectors xx,1024
+  tracks 80          #= (Cylinders * Sides) = 40*2 = 80
+#  sides outout       #= Order of Cylinders  = alt, outout, outback
+  sectrk 6           #= Sectors 6,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try 2
+  boottrk 0          #= OFS = 0
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+diskdef trsu         #= TRS-80 Model 4,4P Montezuma Super Data 440K - SSDD 96 tpi 5.25"
+  seclen 1024        #= Sectors xx,1024
+  tracks 80          #= (Cylinders * Sides) = 80*1 = 80
+# sides alt          #= Order of Cylinders  = alt, outout, outback
+  sectrk 6           #= Sectors 6,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try 2
+  boottrk 0          #= OFS = 0
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+diskdef trsv         #= TRS-80 Model 4,4P Montezuma Super Data 880K - DSDD 96 tpi 5.25"
+  seclen 1024        #= Sectors xx,1024
+  tracks 160         #= (Cylinders * Sides) = 80*2 = 160
+#  sides alt          #= Order of Cylinders  = alt, outout, outback
+  sectrk 6           #= Sectors 6,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try x
+  boottrk 0          #= OFS = 0
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+diskdef trsw         #= TRS-80 Model 4,4P Montezuma System 400K - SSDD 96 tpi 3.5"
+  seclen 512         #= Sectors xx,512
+  tracks 80          #= (Cylinders * Sides) = 80*1 = 80
+# sides alt          #= Order of Cylinders  = alt, outout, outback
+  sectrk 10          #= Sectors 10,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+#  datarate DD        #= DENSITY SD, DD, HD, or ED
+#  FM NO              #= Format YES = FM, or NO = MFM
+  skew 2             #= [0..8] try 2
+  boottrk 0          #= OFS = 0
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+#BEGIN TRSE  TRS-80 II/12/16 Aton CP/M - SSHD 8" - 1024 x 8
+diskdef trse
+  seclen 1024
+  tracks 77
+  sectrk 8
+  blocksize 2048
+  maxdir 128
+  datarate DD
+  fm NO
+  skew 3
+  boottrk 0
+  offset 11520
+  os 2.2
+end
+
+# TRSF  TRS-80 II/12/16 Aton CP/M  - DSHD 8" - 1024 x 8
+diskdef trsf
+  seclen 1024
+  tracks 154
+  sides alt
+  sectrk 8
+  blocksize 2048
+  maxdir 192
+  skew 3
+  boottrk 0
+  offset 11520
+  os 2.2
+end
+
+# TRS5  TRS-80, Lifeboat CP/M (1024 bytes/sector) - SSDD 8"
+# The first track is 26 sectors with 128 bytes, the rest are 1024 x 8
+diskdef trs5
+  seclen 1024
+  tracks 75
+  sectrk 8
+  blocksize 2048
+  maxdir 128
+  skew 3
+  boottrk 0
+  os 2.2
+  offset 11520
+end
+
+# Memotech type 03, ie: 3.5" or 5.25", D/S, D/D, S/T
+# 40 tracks, 2 sides, 16 sectors/track, 256 bytes/sector
+# Bytes on the media = 2*40*16*256 = 327680
+# CP/M sees 26 128 byte records per track (similar to 8" disks).
+# Tracks = 327680/(26*128) = 98
+# Data is in 2048 byte blocks, on track 2 onwards
+# Blocks = ((98-2)*26*128)/2048 = 156, which agrees with DPB
+
+diskdef memotech-type03
+  seclen 128
+  tracks 98
+  sectrk 26
+  blocksize 2048
+  maxdir 64
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# Memotech type 07, ie: 3.5" or 5.25", D/S, D/D, D/T
+# 80 tracks, 2 sides, 16 sectors/track, 256 bytes/sector
+# Bytes on the media = 2*80*16*256 = 655360
+# CP/M sees 26 128 byte records per track (similar to 8" disks).
+# Tracks = 655360/(26*128) = 196
+# Data is in 2048 byte blocks, on track 2 onwards
+# Blocks = ((196-2)*26*128)/2048 = 315, which agrees with DPB
+
+diskdef memotech-type07
+  seclen 128
+  tracks 196
+  sectrk 26
+  blocksize 2048
+  maxdir 128
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# Memotech type 43, ie: 1MB Silicon Disc
+# CP/M sees 26 128 byte records per track
+# Note: Unlike common practice with real physical disks, with real geometry,
+#       the DPB for Silicon Discs includes blocks on the last incomplete track
+# Tracks = 1048576/(26*128) = 315.07
+# Data is in 4096 byte blocks, on track 2 onwards
+# Blocks = (1048576-2*26*128)/4096 = 254, which agrees with DPB
+# Blocks = ((315-2)*26*128)/4096 = 254, so we don't need the 0.07 track
+diskdef memotech-type43
+  seclen 128
+  tracks 315
+  sectrk 26
+  blocksize 4096
+  maxdir 256
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# Memotech type 47, ie: 2MB Silicon Disc
+# CP/M sees 26 128 byte records per track
+# Note: Unlike common practice with real physical disks, with real geometry,
+#       the DPB for Silicon Discs includes blocks on the last incomplete track
+# Tracks = 2097152/(26*128) = 630.15
+# Data is in 4096 byte blocks, on track 2 onwards
+# Blocks = (2097152-2*26*128)/4096 = 510, which agrees with DPB
+# Blocks = ((630-2)*26*128)/4096 = 510, so we don't need the 0.15 track
+diskdef memotech-type47
+  seclen 128
+  tracks 630
+  sectrk 26
+  blocksize 4096
+  maxdir 256
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# Memotech type 4B, ie: 4MB Silicon Disc
+# CP/M sees 26 128 byte records per track
+# Note: Unlike common practice with real physical disks, with real geometry,
+#       the DPB for Silicon Discs includes blocks on the last incomplete track
+# Tracks = 4194304/(26*128) = 1260.3
+# Data is in 4096 byte blocks, on track 2 onwards
+# Blocks = (4194304-2*26*128)/4096 = 1022, which agrees with DPB
+# Blocks = ((1260-2)*26*128)/4096 = 1022, so we don't need the 0.3 track
+diskdef memotech-type4B
+  seclen 128
+  tracks 1260
+  sectrk 26
+  blocksize 4096
+  maxdir 512
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# Memotech type 4F, ie: 8MB Silicon Disc
+# CP/M sees 26 128 byte records per track
+# Note: Unlike common practice with real physical disks, with real geometry,
+#       the DPB for Silicon Discs includes blocks on the last incomplete track
+# Tracks = 8388608/(26*128) = 2520.61
+# Data is in 4096 byte blocks, on track 2 onwards
+# Blocks = (8388608-2*26*128)/4096 = 2046, which agrees with DPB
+# Blocks = ((2520-2)*26*128)/4096 = 2045, so we need the extra 0.61 track
+diskdef memotech-type4F
+  seclen 128
+  tracks 2521
+  sectrk 26
+  blocksize 4096
+  maxdir 512
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# Memotech type 18, ie: 8MB SD Card
+# CP/M sees 26 128 byte records per track
+# Note: Unlike common practice with real physical disks, with real geometry,
+#       the DPB for SD Cards includes blocks on the last incomplete track
+# Tracks = 8388608/(26*128) = 2520.61
+# Data is in 4096 byte blocks, on track 2 onwards
+# Blocks = (8388608-2*26*128)/4096 = 2046, which agrees with DPB
+# Blocks = ((2520-2)*26*128)/4096 = 2045, so we need the extra 0.61 track
+diskdef memotech-type18
+  seclen 128
+  tracks 2521
+  sectrk 26
+  blocksize 4096
+  maxdir 512
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# Memotech type 19, ie: 8MB SD Card
+diskdef memotech-type19
+  seclen 128
+  tracks 2521
+  sectrk 26
+  blocksize 4096
+  maxdir 512
+  skew 1
+  boottrk 2
+  os 2.2
+  offset 8M
+end
+
+# Memotech type 1A, ie: 8MB SD Card
+diskdef memotech-type1A
+  seclen 128
+  tracks 2521
+  sectrk 26
+  blocksize 4096
+  maxdir 512
+  skew 1
+  boottrk 2
+  os 2.2
+  offset 16M
+end
+
+# Memotech type 1B, ie: 8MB SD Card
+diskdef memotech-type1B
+  seclen 128
+  tracks 2521
+  sectrk 26
+  blocksize 4096
+  maxdir 512
+  skew 1
+  boottrk 2
+  os 2.2
+  offset 24M
+end
+
+# Memotech type 1C, ie: 8MB SD Card
+diskdef memotech-type1C
+  seclen 128
+  tracks 2521
+  sectrk 26
+  blocksize 4096
+  maxdir 512
+  skew 1
+  boottrk 2
+  os 2.2
+  offset 32M
+end
+
+# Memotech type 1D, ie: 8MB SD Card
+diskdef memotech-type1D
+  seclen 128
+  tracks 2521
+  sectrk 26
+  blocksize 4096
+  maxdir 512
+  skew 1
+  boottrk 2
+  os 2.2
+  offset 40M
+end
+
+# Memotech type 1E, ie: 8MB SD Card
+diskdef memotech-type1E
+  seclen 128
+  tracks 2521
+  sectrk 26
+  blocksize 4096
+  maxdir 512
+  skew 1
+  boottrk 2
+  os 2.2
+  offset 48M
+end
+
+# Memotech type 1F, ie: 8MB SD Card
+diskdef memotech-type1F
+  seclen 128
+  tracks 2521
+  sectrk 26
+  blocksize 4096
+  maxdir 512
+  skew 1
+  boottrk 2
+  os 2.2
+  offset 56M
+end
+
+# Memotech type 50, ie: 256KB RAM Disc
+# CP/M sees 26 128 byte records per track
+# Note: Unlike common practice with real physical disks, with real geometry,
+#       the DPB for RAM Discs includes blocks on the last incomplete track
+# Tracks = 262144/(26*128) = 78.76
+# Data is in 1024 byte blocks, on track 2 onwards
+# Blocks = (262144-2*26*128)/1024 = 249, which agrees with DPB 
+# Blocks = ((78-2)*26*128)/1024 = 247, so we need the extra 0.76 track
+diskdef memotech-type50
+  seclen 128
+  tracks 79
+  sectrk 26
+  blocksize 1024
+  maxdir 64
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# Memotech type 51, ie: 512KB RAM Disc
+# CP/M sees 26 128 byte records per track
+# Note: Unlike common practice with real physical disks, with real geometry,
+#       the DPB for RAM Discs includes blocks on the last incomplete track
+# Tracks = 524288/(26*128) = 157.53
+# Data is in 2048 byte blocks, on track 2 onwards
+# Blocks = (524288-2*26*128)/2048 = 252, which agrees with DPB
+# Blocks = ((157-2)*26*128)/2048 = 251, so we need the extra 0.53 track
+diskdef memotech-type51
+  seclen 128
+  tracks 158
+  sectrk 26
+  blocksize 2048
+  maxdir 128
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# Memotech type 51, as used in Italy, ie: 480KB RAM Disc
+# CP/M sees 26 128 byte records per track
+# Note: Unlike common practice with real physical disks, with real geometry,
+#       the DPB for RAM Discs includes blocks on the last incomplete track
+# Tracks = 491520/(26*128) = 147.69
+# Data is in 2048 byte blocks, on track 2 onwards
+# Blocks = (491520-2*26*128)/2048 = 236, which agrees with DPB
+# Blocks = ((147-2)*26*128)/2048 = 235, so we need the extra 0.69 track
+diskdef memotech-type51-italy
+  seclen 128
+  tracks 148
+  sectrk 26
+  blocksize 2048
+  maxdir 128
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# Memotech type 51, after S2R64.COM, ie: 448KB RAM Disc
+# CP/M sees 26 128 byte records per track
+# Note: Unlike common practice with real physical disks, with real geometry,
+#       the DPB for RAM Discs includes blocks on the last incomplete track
+# Tracks = 458752/(26*128) = 137.84
+# Data is in 2048 byte blocks, on track 2 onwards
+# Blocks = (458752-2*26*128)/2048 = 220, which agrees with DPB, after S2R64.COM
+# Blocks = ((137-2)*26*128)/2048 = 219, so we need the extra 0.84 track
+diskdef memotech-type51-s2r64
+  seclen 128
+  tracks 138
+  sectrk 26
+  blocksize 2048
+  maxdir 128
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# Memotech type 51, after S2R.COM, ie: 144KB RAM Disc
+# CP/M sees 26 128 byte records per track
+# Note: Unlike common practice with real physical disks, with real geometry,
+#       the DPB for RAM Discs includes blocks on the last incomplete track
+# Tracks = 147456/(26*128) = 44.3
+# Data is in 2048 byte blocks, on track 2 onwards
+# Blocks = (147456-2*26*128)/2048 = 68, which agrees with DPB, after S2R.COM
+# Blocks = ((44-2)*26*128)/2048 = 68, so we don't need the extra 0.3 track
+diskdef memotech-type51-s2r
+  seclen 128
+  tracks 44
+  sectrk 26
+  blocksize 2048
+  maxdir 128
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# Memotech type 52, ie: 320KB RAM Disc
+# Added for REMEMOTECH
+# CP/M sees 26 128 byte records per track
+# Note: Unlike common practice with real physical disks, with real geometry,
+#       the DPB for RAM Discs includes blocks on the last incomplete track
+# Tracks = 327680/(26*128) = 98.46
+# Data is in 2048 byte blocks, on track 2 onwards
+# Blocks = (327680-2*26*128)/2048 = 156
+# Blocks = ((98-2)*26*128)/2048 = 156, so we don't need the extra 0.46 track
+# This type very deliberately and conveniently exactly matches type 03
+diskdef memotech-type52
+  seclen 128
+  tracks 98
+  sectrk 26
+  blocksize 2048
+  maxdir 64
+  skew 1
+  boottrk 2
+  os 2.2
+end
+
+# Research Machines 380Z/480Z 5.25" "Single Density" or "MDS" format.
+# All tracks are formatted FM 16x128.
+diskdef rm-sd
+  seclen 128
+  tracks 40
+  sectrk 16
+  blocksize 1024
+  maxdir 64
+  skew 3
+  boottrk 3
+  os 2.2
+end
+
+# Research Machines 380Z/480Z 5.25" "Double Density" or "MD" format.
+# Track 0 is formatted FM 16x128; 1+ are MFM 9x512.
+# If you're working with an image file, make sure that track 0 is
+# padded to be the same size as the other tracks.
+diskdef rm-dd
+  seclen 512
+  tracks 40
+  sectrk 9
+  blocksize 1024
+  maxdir 64
+  skew 5
+  boottrk 3
+  os 2.2
+end
+
+# Research Machines 380Z/480Z 5.25" "Quad Density" or "MQ" format.
+# Track 0 is formatted FM 16x128; 1+ are MFM 9x512.
+diskdef rm-qd
+  seclen 512
+  tracks 80
+  sectrk 9
+  blocksize 2048
+  maxdir 128
+  skew 5
+  boottrk 3
+  os 2.2
+end
+
+# Ampro Little Board Z80 running CP/M 2.21
+# BEGIN AMP1  Ampro - SSDD 48 tpi 5.25"
+# DENSITY MFM, LOW
+# CYLINDERS 40 SIDES 1 SECTORS 10,512 SKEW 2
+# SIDE1 0 1,2,3,4,5,6,7,8,9,10
+# BSH 4 BLM 15 EXM 1 DSM 94 DRM 63 AL0 080H AL1 0 OFS 2
+# END
+
+diskdef amp1
+  seclen 512       #= Sectors xx,512
+  tracks 40         #= (Cylinders * Sides) = 40*1 = 40
+  sectrk 10         #= Sectors 10,xxx
+  blocksize 2048 #= (128*(BLM+1)) = 2048
+  maxdir 64         #(DRM+1) = 64
+  skew 0             #= SKEW = 0
+  boottrk 2           #= OFS = 2
+  os 2.2
+end
+
+#BEGIN AMP2  Ampro - DSDD 48 tpi 5.25"
+#DENSITY MFM, LOW
+#CYLINDERS 40 SIDES 2
+#SECTORS 10,512
+#SKEW 2
+#SIDE1 0 17,18,19,20,21,22,23,24,25,26
+#SIDE2 1 17,18,19,20,21,22,23,24,25,26
+#ORDER SIDES
+#BSH 4 BLM 15 EXM 1 DSM 194 DRM 127 AL0 0C0H AL1 0 OFS 2
+#END
+
+# setfdprm /dev/fd0 DS DD ssize=512 cyl=40 sect=10 head=2
+diskdef amp2
+  seclen 512
+  tracks 80
+  sectrk 10
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 2
+  os 2.2
+end
+
+#BEGIN AMP3  Ampro - SSDD 96 tpi 3.5"
+#DENSITY MFM, LOW
+#CYLINDERS 80 SIDES 1 SECTORS 5,1024 SKEW 2
+#SIDE1 0 1,2,3,4,5
+#BSH 4 BLM 15 EXM 1 DSM 194 DRM 127 AL0 0C0H AL1 0 OFS 2
+#END
+
+# setfdprm /dev/fd0 SS DD ssize=1024 cyl=80 sect=5 head=1
+diskdef amp3
+  seclen 1024
+  tracks 80
+  sectrk 5
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 2
+  os 2.2
+end
+
+#BEGIN AMP4  Ampro - DSDD 96 tpi 3.5"
+#DENSITY MFM, LOW
+#CYLINDERS 80 SIDES 2 SECTORS 5,1024 SKEW 2
+#SIDE1 0 17,18,19,20,21
+#SIDE2 1 17,18,19,20,21
+#ORDER SIDES
+#BSH 4 BLM 15 EXM 0 DSM 394 DRM 255 AL0 0F0H AL1 0 OFS 2
+#END
+
+# setfdprm /dev/fd0 DS DD ssize=1024 cyl=80 sect=5 head=2
+diskdef amp4
+  seclen 1024
+  tracks 160
+  sectrk 5
+  blocksize 2048
+  maxdir 256
+  skew 0
+  boottrk 2
+  os 2.2
+end
+
+#BEGIN AMP5  Ampro - SSDD 3.5"
+#DENSITY MFM, LOW
+#CYLINDERS 80 SIDES 1 SECTORS 5,1024 SKEW 2
+#SIDE1 0 1,2,3,4,5
+#BSH 4 BLM 15 EXM 1 DSM 194 DRM 127 AL0 0C0H AL1 0 OFS 2
+#END
+
+# setfdprm /dev/fd0 SS DD ssize=1024 cyl=80 sect=5 head=1
+diskdef amp5
+  seclen 1024
+  tracks 80
+  sectrk 5
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 2
+  os 2.2
+end
+
+#BEGIN AMP6  Ampro - DSDD 3.5"
+#DENSITY MFM, LOW
+#CYLINDERS 80 SIDES 2 SECTORS 5,1024 SKEW 2
+#SIDE1 0 17,18,19,20,21
+#SIDE2 1 17,18,19,20,21
+#ORDER SIDES
+#BSH 4 BLM 15 EXM 0 DSM 394 DRM 255 AL0 0F0H AL1 0 OFS 2
+#END
+
+# setfdprm /dev/fd0 DS DD ssize=1024 cyl=80 sect=5 head=2
+diskdef amp6
+  seclen 1024
+  tracks 160
+  sectrk 5
+  blocksize 2048
+  maxdir 256
+  skew 0
+  boottrk 2
+  os 2.2
+end
+
+diskdef ampro800
+  seclen 1024
+  tracks 160
+  sectrk 5
+  blocksize 2048
+  maxdir 256
+  skew 0
+  boottrk 2
+  os 2.2
+end
+
+# Ampro - DSDD 48 tpi 5.25" - 512 x 10
+diskdef ampro400d
+  seclen 512
+  tracks 80
+  sectrk 10
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 2
+  os 2.2
+  libdsk:format ampro400d
+# DENSITY MFM ,LOW 
+# BSH 4 BLM 15 EXM 1 DSM 194 DRM 127 AL0 0C0H AL1 0 OFS 2
+end
+
+# BEGIN ampdsdd80  Ampro - DSDD 96 tpi 5.25" - 512 x 10
+# Test OK - image size = 819,200, from Don Maslin's archive
+diskdef ampdsdd80
+  seclen 1024
+  tracks 160
+  sectrk 5
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 2
+  os 2.2
+  libdsk:format ampro800
+# DENSITY MFM ,LOW 
+# BSH 4 BLM 15 EXM 1 DSM 194 DRM 127 AL0 0C0H AL1 0 OFS 2
+end
+
+# ALTAIRZ80 SIMH *dsk 8MB Harddisk (Type AZ80 HDSK)
+diskdef 8megAltairSIMH
+  seclen 128
+  tracks 2048
+  sectrk 32
+  blocksize 4096
+  maxdir 1024
+  skew 0
+  boottrk 6
+  os 2.2
+end
+
+# ALTAIRZ80 SIMH *dsk MITS 88-DISK 137 Byte/Sektor
+# speedball (copylib) skewtable
+diskdef simh
+  seclen 128
+  tracks 254
+  sectrk 32
+  blocksize 2048
+  maxdir 256
+  skew 17
+  boottrk 6
+  os 2.2
+end
+
+diskdef all1         #= Allen-Bradley Advisor+ - DSDD 3.5"
+  seclen 512         #= Sectors xx,512
+  tracks 160         #= (Cylinders * Sides) = 80*2 = 160
+  sides alt          #= Order of Cylinders  = alt, outout, outback
+  sectrk 8           #= Sectors 8,xxx
+  blocksize 2048     #= (128*(BLM+1)) =  7=1024, 15=2048, 31=4096, 63=8192
+  maxdir 128         #= (DRM+1) = 128
+  datarate DD        #= DENSITY SD, DD, HD, or ED
+  FM NO              #= Format YES = FM, or NO = MFM
+  skew 0             #= [0..8] try x
+  boottrk 1          #= OFS = 1
+#                    #= 2, 2.2, or 3 (NO comment on next line)
+  os 2.2
+end
+
+# COM8  Compupro (Viasyn) 8/16 - SSDD 8" - 1024 x 8
+# IMD RAW format
+diskdef com8
+  seclen 1024
+  tracks 77
+  sectrk 8
+  blocksize 2048
+  maxdir 128
+  skew 3
+  offset 11520
+  boottrk 0
+  os 2.2
+end
+
+# Spectravideo SVI-728 (MSX) with SVI-707 floppy drive
+diskdef svi707
+  seclen 256
+  tracks 40
+  sectrk 17
+  blocksize 2048
+  maxdir 64
+  skew 0
+  boottrk 3
+  os 2.2
+end
+
+# Intel MDS/22 8" Double Density
+diskdef mds-dd
+  seclen 128
+  tracks 77
+  sectrk 52
+  blocksize 2048
+  maxdir 128
+  skew 0
+  boottrk 2
+  os 2.2
+end
+
+# Intel MDS/22 8" Single Density. Untested.
+diskdef mds-sd
+  seclen 128
+  tracks 77
+  sectrk 26
+  blocksize 1024
+  maxdir 64
+  skew 0
+  boottrk 2
+  os 2.2
+end
+
+diskdef jet80.8
+  seclen 1024
+  tracks 154
+  sectrk 8
+  blocksize 4096
+  maxdir 256
+  skew 0
+  boottrk 2
+  os 3
+end
+

+ 291 - 0
config_files/flashfloppy/FF.CFG

@@ -0,0 +1,291 @@
+## FF.CFG: Example FlashFloppy Configuration File
+
+# Place in the root folder or FF/ subfolder of your USB drive.
+# NOTE: If FF/ exists, IMG.CFG must reside there, not the root folder.
+
+# Uncommented lines below are the default settings.
+# Uncommented options cannot be overridden by settings in other config files.
+
+##
+## DRIVE EMULATION
+
+# Floppy-drive interface mode (interface pins 2 and 34)
+# jc: Specified by jumper JC (open: shugart, closed: ibmpc)
+# shugart: P2=DSKCHG, P34=RDY (Amiga, Atari ST, many others)
+# ibmpc: P2=unused, P34=DSKCHG (IBM PC interface)
+# ibmpc-hdout: P2=HD_OUT, P34=DSKCHG (not generally needed: prefer 'ibmpc')
+# jppc: P2=unused, P34=RDY (Japanese PC standard)
+# jppc-hdout: P2=HD_OUT, P34=RDY (Japanese PC alternate: prefer 'jppc')
+# akai-s950: Legacy alias of 'jppc-hdout', previously used for Akai S950
+# amiga: P2=DSKCHG, P34=DRIVE_ID (not generally needed: prefer 'shugart')
+interface = shugart
+
+# Host platform: Improves image-format detection for generic types such as IMG
+# acorn: Acorn ADFS
+# akai: Akai (S01, S20, S950), Korg, SC Prophet 3000
+# casio: Casio (FZ-1)
+# dec: DEC (RX33, RX50)
+# ensoniq: Ensoniq (ASR, TS, etc)
+# fluke: Fluke 9100
+# gem: General Music (S2, S3)
+# ibm-3174: IBM 3174 Establishment Controller
+# memotech: Memotech
+# msx: MSX
+# nascom: Nascom
+# pc98: NEC PC-98
+# pc-dos: PC DOS Format (geometry determined from Bios Parameter Block)
+# tandy-coco: Tandy Color Computer (CoCo)
+# ti99: TI-99/4A
+# uknc: UKNC / DVK Soviet PDP-11
+# unspecified: Common default geometries (including IBM PC)
+host = unspecified
+
+# Pins 2 & 34 output (drive->host) manual configuration
+# auto: Auto-configure from interface= setting
+# nc: Unused/No Connection [eg. if pin is an input (host->drive) on your host]
+# low: Always 0 volts (0v)
+# high: Always 5 volts (5v)
+# rdy: Drive ready (Ready = 0v)
+# nrdy: Logical complement of above
+# dens: Density mode (High Density = 0v)
+# ndens: Logical complement of above
+# chg: Disk changed (Changed = 0v)
+# nchg: Logical complement of above
+# Values: auto, nc, low, high, rdy, nrdy, dens, ndens, chg, nchg
+pin02 = auto
+pin34 = auto
+
+# Forcibly write-protect images, or respect the FAT read-only attribute?
+# Values: yes | no
+write-protect = no
+
+# Maximum cylinder that can be stepped to (255 is required for access to
+# Direct Access mode as used by image-selector utilities and Autoswap games).
+# Values: 0 <= N <= 255
+max-cyl = 255
+
+# Filter glitches in the SIDE-select signal shorter than N microseconds
+# Values: 0 <= N <= 255
+side-select-glitch-filter = 0
+
+# Rotational offset of disk after a track change
+# instant: No rotation during track change
+# realtime: Emulate rotation of disk while track is changing
+# Values: instant | realtime
+track-change = instant
+
+# Rotational offset of disk after draining a write to Flash
+# instant: No rotation
+# realtime: Disk rotates in real time during drain
+# eot: Disk rotates to (near) end of track
+# Values: instant | realtime | eot
+write-drain = instant
+
+# Index pulses suppressed when RDATA and WDATA inactive?
+# Values: yes | no
+index-suppression = yes
+
+# Milliseconds from head-step start to RDATA active.
+# Values: 0 <= N <= 255
+head-settle-ms = 12
+
+# Milliseconds delay from motor-on to drive ready.
+# On a standard unmodified Gotek the motor signal is not connected and a
+# non-default value here will have no effect. Most systems and software do
+# not care about correct motor behaviour, and default (ignore) works fine.
+# Values: ignore | 0 <= N <= 1000
+motor-delay = ignore
+
+# What causes the disk-change (chg) signal to reset after disk insertion?
+# step: Step command received
+# pa14: CHGRST (pin 1 on old Sony drives), connected to PA14 (JTCK/SWCLK)
+# delay-N: Automatically after N*0.5sec (0 <= N <= 15)
+chgrst = step
+
+##
+## STARTUP / INITIALISATION
+
+# Disk image loaded or ejected at startup?
+# Values: yes | no
+ejected-on-startup = no
+
+# Which image (or folder) is selected at startup?
+# last: Last-selected item at power-off (recorded in IMAGE_A.CFG)
+# static: Static path specified in INIT_A.CFG
+# init: First item in root folder
+# Values: last | static | init
+image-on-startup = last
+
+# Time in milliseconds to attempt to probe attached display.
+# You may set this to 0 if you have a 2-digit LED display attached.
+# Values: 0 <= N <= 65535
+display-probe-ms = 3000
+
+##
+## IMAGE NAVIGATION
+
+# Auto-select the current file after N seconds
+# N=0: disable auto-select
+# Values: 0 <= N <= 255
+autoselect-file-secs = 2
+
+# Auto-select the current folder after N seconds
+# N=0: disable auto-select
+# Values: 0 <= N <= 255
+autoselect-folder-secs = 2
+
+# Sorting of folder entries in native navigation mode.
+# always: Always sort folder entries. Large folders may be truncated.
+# never: Never sort folder entries, instead presenting them in FAT order.
+# small: Only sort folders which are small enough to sort in full.
+# Values: always | never | small
+folder-sort = always
+
+# Priority of files vs subfolders when sorting folder entries:
+# folders: Folders listed before files
+# files: Files listed before folders
+# none: Files and folders are not differentiated
+# Values: folders | files | none
+sort-priority = folders
+
+# Navigation mode for selecting images/slots
+# native:  Navigate through all valid images/dirs
+# indexed: Navigate through DSKA0000, DSKA0001, ...
+# default: native unless overridden by HxC-compat-mode config
+nav-mode = default
+
+# When navigating slots or folder, loop at min/max?
+# Values: yes | no
+nav-loop = yes
+
+# Actions of first two buttons.
+#              B1     | B2     | Both
+# zero:        Prev   | Next   | Slot 0
+# eject:       Prev   | Next   | Eject/Insert
+# htu:         +10    | +1     | +100
+# rotary:      Up-dir | Select/Eject/Insert | -
+# rotary-fast: Prev   | Next   | Up-dir [Prev/Next are accelerated]
+# reverse:     Reverse sense of B1 and B2
+# Multiple values can be separated by commas, eg twobutton-action=eject,reverse
+twobutton-action = zero
+
+# Input sensor type at the rotary-encoder inputs (pins PC10 and PC11):
+#  [full | half | quarter]:
+#    Rotary encoder, identified by fraction of a Gray-code cycle performed
+#    per detent/click. If default value ('full') requires multiple
+#    clicks/detents to move position then change to 'half' (if 2 clicks
+#    per move) or 'quarter' (if 4 clicks).
+#  [trackball]:
+#    Blackberry-style trackball (eg. using Hall-effect sensors).
+#  [buttons]:
+#    Push-to-ground Prev/Next buttons.
+#  [reverse]:
+#    If the input is working in reverse, use this option to swap directions.
+#  [v2]:
+#    Use the rotary encoder logic from FlashFloppy v2.x. Use this if the
+#    v3 logic is too strict and results in no, or missing, movements.
+# Multiple values can be separated by commas, eg rotary=quarter,reverse
+# Values: none | quarter | half | full | trackball | buttons | reverse | v2
+rotary = full
+
+# Prefix for image names in indexed navigation mode. String can be empty ("").
+indexed-prefix = "DSKA"
+
+##
+## DISPLAY
+
+# Display Type.
+# auto: Auto-detect (7-seg LED, LCD, OLED)
+# lcd-CCxRR: CCxRR backlit LCD with I2C backpack (16<=CC<=40, 02<=RR<=04)
+# oled-128xNN: 128xNN I2C OLED (NN = 32 | 64)
+#  -rotate:     OLED view is rotated 180 degrees
+#  -hflip:      OLED view is flipped horizontally
+#  -narrow[er]: OLED view is restricted to Gotek display cutout
+#               (-narrow: 18 chars; -narrower: 16 chars)
+#  -inverse:    Inverse/reverse video (black text on white background)
+#  -ztech:      ZHONGJY_TECH 2.23" 128x32 SSD1305 OLED display
+#  -slow:       Run I2C bus slower (use this if OLED regularly blanks/corrupts)
+# Values: auto | lcd-CCxRR | oled-128xNN[-rotate][-narrow[er]]...
+display-type = lcd-40x04
+
+# OLED Font. Narrow and wide options.
+# Narrower 6x13 font permits:
+#  - More characters per row
+#  - Use of Gotek display cutout (eg. "display-type=oled-128x32-narrow")
+# Values: 6x13 | 8x16
+oled-font = 6x13
+
+# OLED contrast/brightness.
+# Values: 0 <= N <= 255
+oled-contrast = 143
+
+# Text height and arrangement on LCD/OLED and on OSD, respectively.
+# 'default', or a comma-separated list (one entry per LCD/OLED row, top down).
+# Each list item is a digit plus optional height specifier: <content-row>[d]
+#  content-row: '0-3' = specified content row, '7' = blank
+#    0: Current image name
+#    1: Status
+#    2: Image/Volume info
+#    3: Current subfolder name
+#  height specifier: 'd' = double height (32px, OLED only; ignored for LCD)
+# 'default' depends on display, eg.: oled-128x32='0,1' ; oled-128x64='3,0d,1'
+# Values: [0-7][d] | default
+display-order = default
+osd-display-order = default
+
+# OSD text columns. This is currently respected only when no LCD/OLED is found.
+# Values: 16 <= N <= 40
+osd-columns = 40
+
+# Turn an LCD or OLED display off after N seconds of inactivity
+# N=0: always off; N=255: always on
+# Values: 0 <= N <= 255
+display-off-secs = 255
+
+# Switch on LCD/OLED display when there is drive activity?
+# yes: Trigger on track changes and disk writes
+# sel: Trigger on drive select
+# no:  No automatic trigger
+# Values: yes | sel | no
+display-on-activity = yes
+
+# LCD/OLED long filename scroll rate in milliseconds per update
+# Values: 100 <= N <= 65535
+display-scroll-rate = 200
+
+# LCD/OLED pause time at start/end of scroll, in milliseconds
+# Zero means endless scroll
+# Values: 0 <= N <= 65535
+display-scroll-pause = 2000
+
+# LCD/OLED long filename scroll rate during navigation (ms per update)
+# Values: 0 <= N <= 65535
+nav-scroll-rate = 80
+
+# LCD/OLED long filename pause before scroll, during navigation (milliseconds)
+# Values: 0 <= N <= 65535
+nav-scroll-pause = 300
+
+##
+## MISCELLANEOUS
+
+# Speaker volume for head STEP
+# Values: 0 <= N <= 20
+step-volume = 10
+
+# Speaker volume for insert, eject, and slot-number notifications.
+# Slot number is indicated by a sequence of beeps when an image is mounted
+# iff "slotnr" is specified. The slot number is then notified by a sequence of
+# long beeps (each counting +5), followed by a sequence of short beeps
+# (each counting +1).
+# Values: N[,slotnr] (0 <= N <= 15)
+notify-volume = 0
+
+# Report the specified version number to host software
+# Values: <quoted-string> ("" means report real version)
+# eg. da-report-version = "v3.0.0.0"
+da-report-version = ""
+
+# Automatically extend certain types of truncated image file (SSD,DSD,TRD)?
+# Values: yes | no
+extend-image = yes

+ 1266 - 0
config_files/greaseweazle/diskdefs.cfg

@@ -0,0 +1,1266 @@
+## Greaseweazle disk definitions.
+
+# Syntax should be fairly obvious from the examples below.
+#
+# A disk definition is declared by "disk <name>"; scope extends to
+# the matching "end". Each disk definition must contain the following:
+#  cyls: Number of cylinders (1-255)
+#  heads: Number of heads/sides (1-2)
+# Also, optionally:
+#  step: Number of physical drive steps per image step (1-4)
+#
+# Each non-empty track in a disk requires a track definition:
+# "tracks <track-list> <format>"
+# Where:
+#  format      ::= ibm.fm | ibm.mfm
+#  track-list  ::= * | <track-range>[,<track-list>]
+#  track-range ::= <cylinder>[.<head>] | <cylinder>-<cylinder>[.<head>]
+#  cylinder    ::= [0-9][0-9]*
+#  head        ::= 0|1
+# "*" means match all otherwise-unmatched tracks (ie. this is the default track
+# definition). If no head is specified in a track-range, then all heads are
+# assumed. Scope of a track definition extends to the matching "end".
+#
+# The ibm.fm and ibm.mfm formats accept the following parameters:
+#  secs: Number of sectors (0-256, default: 0)
+#  bps: Bytes per sector (128, 256, 512, 1024, 2048, 4096, 8192)
+#       List all sizes if the size varies (eg. see "ensoniq.mirage" below)
+#  iam: Index Address Mark (yes|no, default: yes)
+#  cskew: Sector skew per cylinder (0-255, default: 0)
+#  hskew: Sector skew per head (0-255, default: 0)
+#  interleave: Sector interleave, N:1 (1-255, default: 1)
+#  id: Sector ID (aka R) of logical first sector (0-255, default: 1)
+#  h: Head (aka H) byte value in each sector header (0-255, default: auto)
+#  gap1: Post-IAM Gap size (0-255, default: auto)
+#  gap2: Post-IDAM Gap size (0-255, default: auto)
+#  gap3: Post-DAM Gap size (0-255, default: auto)
+#  gap4a: Post-Index Gap size (0-255, default: auto)
+#  gapbyte: Byte value used to fill the above gaps (0-255, default: auto)
+#  rate: Data rate in kbps (1-2000, default: auto)
+#        eg. 250kbps is MFM DD, 500kbps is MFM HD, 1000kbps is MFM ED
+#  rpm: Disk spin speed in RPM (1-2000, default: 300)
+#  img_bps: Bytes per sector in IMG file (short sectors are padded)
+
+disk abc.80.0
+    cyls = 40
+    heads = 1
+    tracks * ibm.fm
+        secs = 8
+        bps = 256
+        gap3 = 84
+        rate = 250
+    end
+end
+disk abc.80.1
+    cyls = 40
+    heads = 1
+    tracks * ibm.fm
+        secs = 16
+        bps = 128
+        rate = 125
+    end
+end
+disk abc.160 
+    cyls = 40
+    heads = 1
+    tracks * ibm.mfm
+        secs = 16
+        bps = 256
+        gap3 = 42
+        rate = 250
+    end
+end
+disk abc.320 
+    cyls = 40
+    heads = 2
+    tracks * ibm.mfm
+        secs = 16
+        bps = 256
+        gap3 = 42
+        rate = 250
+    end
+end
+disk abc.640
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 16
+        bps = 256
+        gap3 = 42
+        rate = 250
+    end
+end
+
+disk abc.1000
+    cyls = 77
+    heads = 2
+    tracks * ibm.mfm
+        secs =26
+        bps = 256
+        rate = 500
+	gap3 = 84
+        rpm = 360
+    end
+end
+disk abc.1000d
+    cyls = 77
+    heads = 2
+    tracks 0.0 ibm.fm
+        secs =26
+        bps = 128
+        gap3 = 42
+        rate = 250
+        rpm = 360
+    end
+    tracks * ibm.mfm
+        secs =26
+        bps = 256
+        gap3 = 84
+        rate = 500
+        rpm = 360
+    end
+end
+
+disk abc.1000s
+    cyls = 77
+    heads = 1
+    tracks 0.0 ibm.fm
+        secs =26
+        bps = 128
+        gap3 = 42
+        rate = 250
+        rpm = 360
+    end
+    tracks * ibm.mfm
+        secs =26
+        bps = 256
+        gap3 = 84
+        rate = 500
+        rpm = 360
+    end
+end
+disk abc.1000data
+    cyls = 77
+    heads = 2
+    tracks 0.0 ibm.mfm
+        secs =15
+        bps = 512
+        gap3 = 84
+        rate = 500
+        rpm = 360
+    end
+
+    tracks * ibm.mfm
+        secs =26
+        bps = 256
+        gap3 = 84
+        rate = 500
+        rpm = 360
+    end
+end
+disk os8.1000
+    cyls = 77
+    heads = 2
+    tracks 0.0 ibm.fm
+        secs =26
+        bps = 128
+        gap3 = 42
+        rate = 250
+        rpm = 360
+    end
+    tracks * ibm.mfm
+        secs =26
+        bps = 256
+        gap3 = 84
+        rate = 500
+        rpm = 360
+    end
+end
+disk amiga.amigados
+    cyls = 80
+    heads = 2
+    tracks * amiga.amigados
+        secs = 11
+    end
+end
+
+disk amiga.amigados_hd
+    cyls = 80
+    heads = 2
+    tracks * amiga.amigados
+        secs = 22
+    end
+end
+
+disk acorn.adfs.160
+    cyls = 40
+    heads = 1
+    tracks * ibm.mfm
+        secs = 16
+        bps = 256
+        gap3 = 57
+        id = 0
+        rate = 250
+    end
+end
+
+disk acorn.adfs.320
+    cyls = 80
+    heads = 1
+    tracks * ibm.mfm
+        secs = 16
+        bps = 256
+        gap3 = 57
+        id = 0
+        rate = 250
+    end
+end
+
+disk acorn.adfs.640
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 16
+        bps = 256
+        gap3 = 57
+        id = 0
+        rate = 250
+    end
+end
+
+disk acorn.adfs.800
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 5
+        bps = 1024
+        gap3 = 116
+        id = 0
+        rate = 250
+    end
+end
+
+disk acorn.adfs.1600
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 10
+        bps = 1024
+        gap3 = 116
+        id = 0
+        rate = 500
+    end
+end
+
+disk acorn.dfs.ss
+    cyls = 40
+    heads = 1
+    tracks * ibm.fm
+        secs = 10
+        bps = 256
+        iam = no
+        gap3 = 21
+        id = 0
+        cskew = 3
+        rate = 125
+    end
+end
+
+disk acorn.dfs.ds
+    cyls = 40
+    heads = 2
+    tracks * ibm.fm
+        secs = 10
+        bps = 256
+        iam = no
+        gap3 = 21
+        id = 0
+        cskew = 3
+        rate = 125
+    end
+end
+
+disk akai.800
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 5
+        bps = 1024
+        gap3 = 116
+        id = 1
+        rate = 250
+        cskew = 2
+    end
+end
+
+disk akai.1600
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 10
+        bps = 1024
+        gap3 = 116
+        id = 1
+        rate = 500
+        cskew = 5
+    end
+end
+
+disk atari.90
+    cyls = 40
+    heads = 1
+    tracks * ibm.fm
+        secs = 18
+        bps = 128
+        iam = yes 
+        gap1 = 6
+        gap3 = 17
+        id = 1
+        cskew = 3
+        rate = 130
+    end
+end
+
+disk atarist.360
+    cyls = 80
+    heads = 1
+    tracks * ibm.mfm
+        secs = 9
+        bps = 512
+        gap3 = 84
+        rate = 250
+        iam = no
+        cskew = 2
+    end
+end
+
+disk atarist.400
+    cyls = 80
+    heads = 1
+    tracks * ibm.mfm
+        secs = 10
+        bps = 512
+        gap3 = 30
+        rate = 250
+        iam = no
+    end
+end
+
+disk atarist.440
+    cyls = 80
+    heads = 1
+    tracks * ibm.mfm
+        secs = 11
+        bps = 512
+        gap3 = 3
+        rate = 261
+        iam = no
+    end
+end
+
+disk atarist.720
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 9
+        bps = 512
+        gap3 = 84
+        rate = 250
+        iam = no
+        cskew = 4
+        hskew = 2
+    end
+end
+
+disk atarist.800
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 10
+        bps = 512
+        gap3 = 30
+        rate = 250
+        iam = no
+    end
+end
+
+disk atarist.880
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 11
+        bps = 512
+        gap3 = 3
+        rate = 261
+        iam = no
+    end
+end
+
+disk coco.decb
+    cyls = 35
+    heads = 1
+    tracks * ibm.mfm
+        secs = 18
+        bps = 256
+        id = 1
+        gap2 = 22
+        gap3 = 24
+        gap4a = 32
+        interleave = 5
+        iam = no
+        rate = 250
+    end
+end
+
+disk coco.decb.40t
+    cyls = 40
+    heads = 1
+    tracks * ibm.mfm
+        secs = 18
+        bps = 256
+        id = 1
+        gap2 = 22
+        gap3 = 24
+        gap4a = 32
+        interleave = 5
+        iam = no
+        rate = 250
+    end
+end
+
+# TRS CoCo OS-9
+disk coco.os9.40ss
+    cyls = 40
+    heads = 1
+    tracks * ibm.mfm
+        secs = 18
+        bps = 256
+        id = 1
+        gap2 = 22
+        gap3 = 24
+        gap4a = 32
+        interleave = 3
+        iam = no
+        rate = 250
+    end
+end
+
+disk coco.os9.40ds
+    cyls = 40
+    heads = 2
+    tracks * ibm.mfm
+        secs = 18
+        bps = 256
+        id = 1
+        gap2 = 22
+        gap3 = 24
+        gap4a = 32
+        interleave = 3
+        iam = no
+        rate = 250
+    end
+end
+
+disk coco.os9.80ss
+    cyls = 80
+    heads = 1
+    tracks * ibm.mfm
+        secs = 18
+        bps = 256
+        id = 1
+        gap2 = 22
+        gap3 = 24
+        gap4a = 32
+        interleave = 3
+        iam = no
+        rate = 250
+    end
+end
+
+disk coco.os9.80ds
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 18
+        bps = 256
+        id = 1
+        gap2 = 22
+        gap3 = 24
+        gap4a = 32
+        interleave = 3
+        iam = no
+        rate = 250
+    end
+end
+
+disk commodore.1541
+    cyls = 40
+    heads = 1
+    tracks 0-16 c64.gcr
+        clock = 3.25
+        secs = 21
+    end
+    tracks 17-23 c64.gcr
+        clock = 3.50
+        secs = 19
+    end
+    tracks 24-29 c64.gcr
+        clock = 3.75
+        secs = 18
+    end
+    tracks * c64.gcr
+        clock = 4.00
+        secs = 17
+    end
+end
+
+disk commodore.1571
+    cyls = 35
+    heads = 2
+    tracks 0-16 c64.gcr
+        clock = 3.25
+        secs = 21
+    end
+    tracks 17-23 c64.gcr
+        clock = 3.50
+        secs = 19
+    end
+    tracks 24-29 c64.gcr
+        clock = 3.75
+        secs = 18
+    end
+    tracks * c64.gcr
+        clock = 4.00
+        secs = 17
+    end
+end
+
+disk commodore.1581
+    cyls = 80
+    heads = 2
+    tracks 0-79.0 ibm.mfm
+        secs = 10
+        bps = 512
+        gap3 = 30
+        rate = 250
+        h = 1
+    end
+    tracks 0-79.1 ibm.mfm
+        secs = 10
+        bps = 512
+        gap3 = 30
+        rate = 250
+        h = 0
+    end
+end
+
+disk dec.rx01
+    cyls = 77
+    heads = 1
+    tracks * ibm.fm
+        secs = 26
+        bps = 128
+        gap3 = 26
+        rate = 250
+        rpm = 360
+    end
+end
+
+disk dec.rx02
+    cyls = 77
+    heads = 1
+    tracks * dec.rx02
+        secs = 26
+        bps = 128 # Actually 256 bytes, at double rate, MMFM coded
+        gap3 = 26
+        rate = 250
+        rpm = 360
+    end
+end
+
+disk dragon.40ss
+    cyls = 40
+    heads = 1
+    tracks * ibm.mfm
+        secs = 18
+        bps = 256
+        id = 1
+        gap2 = 22
+        gap3 = 24
+        gap4a = 32
+        interleave = 2
+        iam = no
+    end
+end
+
+disk dragon.40ds
+    cyls = 40
+    heads = 2
+    tracks * ibm.mfm
+        secs = 18
+        bps = 256
+        id = 1
+        gap2 = 22
+        gap3 = 24
+        gap4a = 32
+        interleave = 2
+        iam = no
+    end
+end
+
+disk dragon.80ss
+    cyls = 80
+    heads = 1
+    tracks * ibm.mfm
+        secs = 18
+        bps = 256
+        id = 1
+        gap2 = 22
+        gap3 = 24
+        gap4a = 32
+        interleave = 2
+        iam = no
+    end
+end
+
+disk dragon.80ds
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 18
+        bps = 256
+        id = 1
+        gap2 = 22
+        gap3 = 24
+        gap4a = 32
+        interleave = 2
+        iam = no
+    end
+end
+
+disk ensoniq.800
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 10
+        bps = 512
+        gap3 = 30
+        id = 0
+        rate = 250
+    end
+end
+
+disk ensoniq.1600
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 20
+        bps = 512
+        gap3 = 40
+        id = 0
+        rate = 500
+    end
+end
+
+disk ensoniq.mirage
+    cyls = 80
+    heads = 1
+    tracks * ibm.mfm
+        # The sectors are a tight fit so squeeze the post-index gaps a little
+        gap1 = 20
+        gap4a = 20
+        secs = 6
+        bps = 1024*5,512
+        id = 0
+        rate = 250
+    end
+end
+
+# General Music (GEM) S2 and S3
+disk gem.1600
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 10
+        bps = 1024
+        gap3 = 116
+        id = 1
+        rate = 500
+        cskew = 5
+    end
+end
+
+disk ibm.160
+    cyls = 40
+    heads = 1
+    tracks * ibm.mfm
+        secs = 8
+        bps = 512
+        gap3 = 84
+        rate = 250
+    end
+end
+
+disk ibm.180
+    cyls = 40
+    heads = 1
+    tracks * ibm.mfm
+        secs = 9
+        bps = 512
+        gap3 = 84
+        rate = 250
+    end
+end
+disk jet.8
+    cyls = 77
+    heads = 2
+    tracks * ibm.mfm
+        secs = 8
+        bps = 1024
+        gap3 = 84
+        rate = 250
+    end
+end
+disk jet.5
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 5
+        bps = 1024
+        gap3 = 84
+        rate = 250
+    end
+end
+
+disk monroe.320
+    cyls = 80
+    heads = 1
+    tracks * ibm.mfm
+        secs = 16
+        bps = 256
+        gap3 = 84
+        rate = 250
+    end
+end
+
+disk ibm.320
+    cyls = 40
+    heads = 2
+    tracks * ibm.mfm
+        secs = 8
+        bps = 512
+        gap3 = 84
+        rate = 250
+    end
+end
+
+disk ibm.360
+    cyls = 40
+    heads = 2
+    tracks * ibm.mfm
+        secs = 9
+        bps = 512
+        gap3 = 84
+        rate = 250
+    end
+end
+
+disk ibm.720
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 9
+        bps = 512
+        gap3 = 84
+        rate = 250
+    end
+end
+
+disk ibm.800
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 10
+        bps = 512
+        gap3 = 30
+        rate = 250
+    end
+end
+
+disk ibm.1200
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 15
+        bps = 512
+        gap3 = 84
+        rate = 500
+        rpm = 360
+    end
+end
+
+disk ibm.1440
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 18
+        bps = 512
+        gap3 = 84
+        rate = 500
+    end
+end
+
+disk ibm.1680
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 21
+        bps = 512
+        gap3 = 12
+        cskew = 3
+        interleave = 2
+        rate = 500
+    end
+end
+
+# alias for ibm.1680
+disk ibm.dmf
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 21
+        bps = 512
+        gap3 = 12
+        cskew = 3
+        interleave = 2
+        rate = 500
+    end
+end
+
+disk ibm.2880
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 36
+        bps = 512
+        gap2 = 41
+        rate = 1000
+    end
+end
+
+# Generic IBM format codec which will scan a track for any valid FM/MFM
+# sectors at standard rates (125kbps, 250kbps, 500kbps) and RPMs (300, 360).
+disk ibm.scan
+    cyls = 80
+    heads = 2
+    tracks * ibm.scan
+        # Following options restrict the scanner's search
+        # rate = 250
+        # rpm = 300
+    end
+end
+
+disk mac.400
+    cyls = 80
+    heads = 1
+    tracks 0-15 mac.gcr
+        clock = 2.63
+        secs = 12
+        format = 0x02
+        interleave = 2
+    end
+    tracks 16-31 mac.gcr
+        clock = 2.89
+        secs = 11
+        format = 0x02
+        interleave = 2
+    end
+    tracks 32-47 mac.gcr
+        clock = 3.20
+        secs = 10
+        format = 0x02
+        interleave = 2
+    end
+    tracks 48-63 mac.gcr
+        clock = 3.57
+        secs = 9
+        format = 0x02
+        interleave = 2
+    end
+    tracks * mac.gcr
+        clock = 3.98
+        secs = 8
+        format = 0x02
+        interleave = 2
+    end
+end
+
+disk mac.800
+    cyls = 80
+    heads = 2
+    tracks 0-15 mac.gcr
+        clock = 2.63
+        secs = 12
+        format = 0x22
+        interleave = 2
+    end
+    tracks 16-31 mac.gcr
+        clock = 2.89
+        secs = 11
+        format = 0x22
+        interleave = 2
+    end
+    tracks 32-47 mac.gcr
+        clock = 3.20
+        secs = 10
+        format = 0x22
+        interleave = 2
+    end
+    tracks 48-63 mac.gcr
+        clock = 3.57
+        secs = 9
+        format = 0x22
+        interleave = 2
+    end
+    tracks * mac.gcr
+        clock = 3.98
+        secs = 8
+        format = 0x22
+        interleave = 2
+    end
+end
+
+# MM/1 3.5" HD 32SPT Microware OS-9
+disk mm1.os9.80ds.hd32spt
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 32
+        bps = 256
+        id = 0
+        gap2 = 22
+        gap3 = 24
+        gap4a = 32
+        interleave = 3
+        iam = no
+        rate = 500
+    end
+end
+
+# MM/1 3.5" HD 36SPT Microware OS-9
+disk mm1.os9.80ds.hd36spt
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 32
+        bps = 256
+        id = 0
+        gap2 = 22
+        gap3 = 24
+        gap4a = 32
+        interleave = 3
+        iam = no
+        rate = 500
+    end
+end
+
+disk msx.1d
+    cyls = 40
+    heads = 1
+    tracks * ibm.mfm
+        secs = 9
+        bps = 512
+        gap3 = 84
+        rate = 250
+    end
+end
+
+disk msx.1dd
+    cyls = 80
+    heads = 1
+    tracks * ibm.mfm
+        secs = 9
+        bps = 512
+        gap3 = 84
+        rate = 250
+    end
+end
+
+disk msx.2d
+    cyls = 40
+    heads = 2
+    tracks * ibm.mfm
+        secs = 9
+        bps = 512
+        gap3 = 84
+        rate = 250
+    end
+end
+
+disk msx.2dd
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 9
+        bps = 512
+        gap3 = 84
+        rate = 250
+    end
+end
+
+# Osborne 1 Single Density
+disk occ1.sd
+   cyls = 40
+   heads = 1
+   tracks * ibm.fm
+       secs = 10
+       bps = 256
+       rate = 125
+   end
+end
+
+# Osborne 1 Double Density
+disk occ1.dd
+   cyls = 40
+   heads = 1
+   tracks * ibm.mfm
+       secs = 5
+       bps = 1024
+       rate = 250
+   end
+end
+
+# Olivetti M20 360kB DD floppies
+disk olivetti.m20
+    cyls = 35
+    heads = 2
+    tracks 0.0 ibm.fm
+        secs = 16
+        bps = 128
+        rate = 125
+        img_bps = 256
+    end
+    tracks * ibm.mfm
+        secs = 16
+        bps = 256
+        rate = 250
+    end
+end
+
+disk pc98.2d
+    cyls = 40
+    heads = 2
+    tracks * ibm.mfm
+        secs = 8
+        bps = 512
+        gap3 = 57
+        rate = 250
+        rpm = 300
+    end
+end
+
+disk pc98.2dd
+    cyls = 77
+    heads = 2
+    tracks * ibm.mfm
+        secs = 8
+        bps = 512
+        gap3 = 57
+        rate = 250
+        rpm = 360
+    end
+end
+
+disk pc98.2hd
+    cyls = 77
+    heads = 2
+    tracks * ibm.mfm
+        secs = 8
+        bps = 1024
+        gap3 = 116
+        rate = 500
+        rpm = 360
+    end
+end
+
+# Used by N88-Basic disks for NEC PC-98
+disk pc98.n88basic.hd
+    cyls = 77
+    heads = 2
+    tracks 0.0 ibm.fm
+        secs = 26
+        bps = 128
+        gap3 = 26
+        rate = 250
+        rpm = 360
+    end
+    tracks * ibm.mfm
+        secs = 26
+        bps = 256
+        gap3 = 26
+        rate = 500
+        rpm = 360
+    end
+end
+
+disk pc98.2hs
+    cyls = 81
+    heads = 2
+    tracks * ibm.mfm
+        secs = 9
+        bps = 1024
+        gap3 = 116
+        rate = 500
+        rpm = 300
+    end
+end
+
+disk raw.125 # 125kbps (eg. FM, 5.25")
+    cyls = 81
+    heads = 2
+    tracks * bitcell
+        clock = 4.0
+    end
+end
+
+disk raw.250 # 250 kbps (eg. MFM DD, 3.5")
+    cyls = 81
+    heads = 2
+    tracks * bitcell
+        clock = 2.0
+    end
+end
+
+disk raw.500 # 500 kbps (eg. MFM HD, 3.5")
+    cyls = 81
+    heads = 2
+    tracks * bitcell
+        clock = 1.0
+    end
+end
+
+# Sequential Circuits Prophet
+disk sci.prophet
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        # gap1 is reduced to give a bit more leeway at the end of the track
+        gap1 = 20
+        secs = 6
+        bps = 1024*5,256
+        id = 0
+        rate = 250
+    end
+end
+
+disk sega.sf7000
+    cyls = 40
+    heads = 1
+    tracks * ibm.mfm
+        secs = 16
+        bps = 256
+        gap3 = 42
+        id = 1
+        rate = 250
+    end
+end
+
+# TSC FLEX: DS/DD with SD (FM) cylinder 0.
+# Sector numbering and interleave is continuous across drive heads. Since
+# there is no direct way to flag this, we implement it here by explicitly
+# specifying head 1 track formats: with sector @id following on from head 0,
+# and with @hskew shifting the first sector of side 1 the correct amount to
+# simulate cross-track interleave.
+disk tsc.flex.dsdd
+  cyls = 80
+  heads = 2
+  tracks 0.0 ibm.fm
+    bps = 256
+    iam = no
+    gap3 = 16
+    gap4a = 16
+    secs = 10
+    interleave = 4
+    id = 1
+    h = 0
+  end
+  tracks 0.1 ibm.fm
+    bps = 256
+    iam = no
+    gap3 = 16
+    gap4a = 16
+    secs = 10
+    interleave = 4
+    hskew = 1
+    id = 11  # Follows on from head 0 (1..10 -> 11..20)
+    h = 0
+  end
+  tracks 1-79.0 ibm.mfm
+    bps = 256
+    iam = no
+    gap3 = 16
+    gap4a = 16
+    secs = 18
+    interleave = 6
+    id = 1
+    h = 1
+  end
+  tracks 1-79.1 ibm.mfm
+    bps = 256
+    iam = no
+    gap3 = 16
+    gap4a = 16
+    secs = 18
+    interleave = 6
+    hskew = 5
+    id = 19  # Follows on from head 0 (1..18 -> 19..36)
+    h = 1
+  end
+end
+
+# TSC FLEX: SS/DD with SD (FM) cylinder 0.
+# Definition is a simplified version of the DS/DD format.
+disk tsc.flex.ssdd
+  cyls = 80
+  heads = 1
+  tracks 0.0 ibm.fm
+    bps = 256
+    iam = no
+    gap3 = 16
+    gap4a = 16
+    secs = 10
+    interleave = 4
+    id = 1
+    h = 0
+  end
+  tracks 1-79.0 ibm.mfm
+    bps = 256
+    iam = no
+    gap3 = 16
+    gap4a = 16
+    secs = 18
+    interleave = 6
+    id = 1
+    h = 1
+  end
+end
+
+disk zx.trdos.640
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 16
+        bps = 256
+        h = 0
+    end
+end
+
+# Quorum (ZX Spectrum clone) running CP/M-80
+disk zx.quorum.800
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 5
+        bps = 1024
+    end
+end

+ 117 - 0
config_files/greaseweazle/diskdefs_abc.cfg

@@ -0,0 +1,117 @@
+disk 80.0
+    cyls = 40
+    heads = 1
+    tracks * ibm.fm
+        secs = 8
+        bps = 256
+        gap3 = 84
+        rate = 250
+    end
+end
+disk 80.1
+    cyls = 40
+    heads = 1
+    tracks * ibm.fm
+        secs = 16
+        bps = 128
+        rate = 125
+    end
+end
+disk 160 
+    cyls = 40
+    heads = 1
+    tracks * ibm.mfm
+        secs = 16
+        bps = 256
+        gap3 = 42
+        rate = 250
+    end
+end
+disk 320 
+    cyls = 40
+    heads = 2
+    tracks * ibm.mfm
+        secs = 16
+        bps = 256
+        gap3 = 42
+        rate = 250
+    end
+end
+disk 640
+    cyls = 80
+    heads = 2
+    tracks * ibm.mfm
+        secs = 16
+        bps = 256
+        gap3 = 42
+        rate = 250
+    end
+end
+
+disk 1000
+    cyls = 77
+    heads = 2
+    tracks * ibm.mfm
+        secs =26
+        bps = 256
+        rate = 500
+	gap3 = 84
+        rpm = 360
+    end
+end
+disk 1000d
+    cyls = 77
+    heads = 2
+    tracks 0.0 ibm.fm
+        secs =26
+        bps = 128
+        gap3 = 42
+        rate = 250
+        rpm = 360
+    end
+    tracks * ibm.mfm
+        secs =26
+        bps = 256
+        gap3 = 84
+        rate = 500
+        rpm = 360
+    end
+end
+
+disk 1000s
+    cyls = 77
+    heads = 1
+    tracks 0.0 ibm.fm
+        secs =26
+        bps = 128
+        gap3 = 42
+        rate = 250
+        rpm = 360
+    end
+    tracks * ibm.mfm
+        secs =26
+        bps = 256
+        gap3 = 84
+        rate = 500
+        rpm = 360
+    end
+end
+disk 1000data
+    cyls = 77
+    heads = 2
+    tracks 0.0 ibm.mfm
+        secs =15
+        bps = 512
+        gap3 = 84
+        rate = 500
+        rpm = 360
+    end
+
+    tracks * ibm.mfm
+        secs =26
+        bps = 256
+        gap3 = 84
+        rate = 500
+        rpm = 360
+    end
+end

+ 18 - 0
config_files/greaseweazle/diskdefs_os8.cfg

@@ -0,0 +1,18 @@
+disk 1000
+    cyls = 77
+    heads = 2
+    tracks 0.0 ibm.fm
+        secs =26
+        bps = 128
+        gap3 = 42
+        rate = 250
+        rpm = 360
+    end
+    tracks * ibm.mfm
+        secs =26
+        bps = 256
+        gap3 = 84
+        rate = 500
+        rpm = 360
+    end
+end

+ 189 - 0
diff_mfm_konan_dj_ii_301

@@ -0,0 +1,189 @@
+diff --git a/mfm/inc/mfm_decoder.h b/mfm/inc/mfm_decoder.h
+index 64796a6..6395567 100644
+--- a/mfm/inc/mfm_decoder.h
++++ b/mfm/inc/mfm_decoder.h
+@@ -1,6 +1,7 @@
+ #ifndef MFM_DECODER_H_
+ #define MFM_DECODER_H_
+ //
++// 10/18/23 SWE Added David Junior II 210 and 301
+ // 10/13/23 DJG Added CONTROLLER_ND100_3041
+ // 09/01/23 DJG Added WD_MICROENGINE support
+ // 08/31/23 DJG Added DIMENSION_68000 support
+@@ -240,6 +241,8 @@ typedef struct {
+       CONTROLLER_ADAPTEC, 
+       CONTROLLER_MVME320,
+       CONTROLLER_SYMBOLICS_3620, 
++      CONTROLLER_DJ_II_210,
++      CONTROLLER_DJ_II_301,
+       CONTROLLER_DJ_II,
+       CONTROLLER_SM1040,
+       CONTROLLER_SYMBOLICS_3640, 
+@@ -399,6 +402,7 @@ DEF_EXTERN struct {
+   {0x00105187, 32, 6},
+   // David Junior II DJ_II
+   {0x5140c101, 32, 6},
++
+   // Nixdorf 
+   {0x8222f0804bda23ll, 56, 22}
+   // DQ604 Not added to search since more likely to cause false
+@@ -3176,6 +3180,24 @@ DEF_EXTERN CONTROLLER mfm_controller_info[]
+          {0,0,0,0},{0,0,0,0}, CONT_ANALYZE,
+          0, 0, 0
+       },
++      {"DJ_II_210",            256, 10000000,      0,
++         0, 0, 4, ARRAYSIZE(mfm_all_poly),
++         0, 0, CINFO_CHS,
++         6, 2, 0, 2, CHECK_NONE, CHECK_CRC,
++         0, 1, NULL, 256, 32, 0, 5209,
++         0, 0,
++         {0,0,0,0},{0,0x5140c101,32,6}, CONT_MODEL,
++         0, 0, 0
++      },
++      {"DJ_II_301",            256, 10000000,      0,
++         0, 0, 4, ARRAYSIZE(mfm_all_poly),
++         0, 0, CINFO_CHS,
++         6, 2, 0, 2, CHECK_NONE, CHECK_CRC,
++         0, 1, NULL, 256, 32, 0, 5209,
++         0, 0,
++         {0,0,0,0},{0,0x5140c101,32,6}, CONT_MODEL,
++         0, 0, 0
++      },
+       // Header is either 6 or 10 bytes
+       {"DJ_II",            256, 10000000,      0,
+          0, 0, 4, ARRAYSIZE(mfm_all_poly),
+diff --git a/mfm/mfm_decoder.c b/mfm/mfm_decoder.c
+index f032fd5..d56bf1c 100644
+--- a/mfm/mfm_decoder.c
++++ b/mfm/mfm_decoder.c
+@@ -603,6 +603,8 @@ SECTOR_DECODE_STATUS mfm_decode_track(DRIVE_PARAMS * drive_params, int cyl,
+          drive_params->controller == CONTROLLER_SHUGART_SA1400 ||
+          drive_params->controller == CONTROLLER_DEC_RQDX3 ||
+          drive_params->controller == CONTROLLER_DJ_II ||
++         drive_params->controller == CONTROLLER_DJ_II_210 ||
++         drive_params->controller == CONTROLLER_DJ_II_301 ||
+          drive_params->controller == CONTROLLER_MYARC_HFDC ||
+          drive_params->controller == CONTROLLER_SHUGART_1610 ||
+          drive_params->controller == CONTROLLER_MVME320 ||
+@@ -1422,6 +1424,8 @@ SECTOR_DECODE_STATUS mfm_process_bytes(DRIVE_PARAMS *drive_params,
+             drive_params->controller == CONTROLLER_SHUGART_SA1400 ||
+             drive_params->controller == CONTROLLER_DEC_RQDX3 ||
+             drive_params->controller == CONTROLLER_DJ_II ||
++            drive_params->controller == CONTROLLER_DJ_II_210 ||
++            drive_params->controller == CONTROLLER_DJ_II_301 ||
+             drive_params->controller == CONTROLLER_MYARC_HFDC ||
+             drive_params->controller == CONTROLLER_SHUGART_1610 ||
+             drive_params->controller == CONTROLLER_MVME320 ||
+diff --git a/mfm/wd_mfm_decoder.c b/mfm/wd_mfm_decoder.c
+index 821d801..05ff1bc 100644
+--- a/mfm/wd_mfm_decoder.c
++++ b/mfm/wd_mfm_decoder.c
+@@ -1228,10 +1228,10 @@ SECTOR_DECODE_STATUS wd_process_data(STATE_TYPE *state, uint8_t bytes[],
+          sector_size = drive_params->sector_size; // Sectore size need from user
+          bad_block = 0;
+          
+-	 cyl_high = ((~bytes[5] ) >> 7) & 0x01; // Get ~T8 from byte 5 and invert it
++	      cyl_high = ((~bytes[5] ) >> 7) & 0x01; // Get ~T8 from byte 5 and invert it
+          //Format change after cylinder d512. Can detect if T4 bit is not inverted in second copy.
+          if (!((bytes[2] ^ bytes[4]) & 0x10)) {
+-	    cyl_high |= (((~bytes[4] ) >> 5) & 0x07) << 1;  //Get ~TB,~TA,~T9 from byte 4 and invert it
++	         cyl_high |= (((~bytes[4] ) >> 5) & 0x07) << 1;  //Get ~TB,~TA,~T9 from byte 4 and invert it
+          }
+ 
+          sector_status.cyl = cyl_high << 8;
+@@ -1285,7 +1285,74 @@ SECTOR_DECODE_STATUS wd_process_data(STATE_TYPE *state, uint8_t bytes[],
+                   bytes[1], sector_status.cyl, sector_status.head, sector_status.sector);
+             sector_status.status |= SECT_BAD_HEADER;
+          }
+-      } else if (drive_params->controller == CONTROLLER_MYARC_HFDC) {
++      } else if (drive_params->controller == CONTROLLER_DJ_II_210 || drive_params->controller == CONTROLLER_DJ_II_301 ) {
++         // Controller David Junior II DJ 210 and maybe DJ 301
++         // Data format of a header is 4 bytes not including 0xa1, 0xfd
++         // -------------------------------------------------------------------------
++         // |   H4   |   H3   |   H2   |   H1   |   H0   |   T10   |   T9   |   T8   |
++         // |   T7   |   T6   |   T5   |   T4   |   T3   |   T2    |   T1   |   S0   |
++         // |   X1   |   X0   |   S5   |   S4   |   S3   |   S2    |   S1   |   S0   | 
++         // |  Check Code                                                            |
++         // -------------------------------------------------------------------------
++         //
++         // X1   X0
++         //  0    0     Normal user track
++         //  0    1     Alternativ track
++         //  1    0     Bad track
++         //  1    1     mapped track 
++
++         //When a drive is f l:rst formatted, all tracks are
++         //normal user tracks. A track can be formatted as a
++         //"bad track•, disallowing any further access to it.
++         //When a track is mapped, it becomes a "mapped track"
++         //which contains pointers to an "alternate track•. An
++         //alternate track is accessed through a request to a
++         //mapped track. 
++ 
++
++         int cyl_high;
++
++         sector_size = drive_params->sector_size; // Sectore size need from user
++         bad_block = 0;
++         
++	      cyl_high = (bytes[2]   & 0x07); // Get high from byte 2
++         sector_status.cyl = cyl_high << 8;
++         sector_status.cyl |= bytes[3]; // Adding low cyl
++
++         if (bytes[4] >> 6 == 0x01){  //alternativ track
++            int new_cyl = sector_status.cyl;
++            int new_head = (bytes[7] & 0xe0) >> 5;
++
++            bad_block=0;
++            sector_status.cyl = cyl_high << 8;
++            sector_status.cyl |= bytes[6];
++            sector_status.head = mfm_fix_head(drive_params, exp_head, (bytes[7] & 0xe0) >> 5 );
++            sector_status.sector = (bytes[7] & 0x1f);
++
++            mfm_handle_alt_track_ch(drive_params, sector_status.cyl, 
++               sector_status.head, new_cyl, new_head);
++         }else if(bytes[4] >> 6 == 0x02) {
++            // Handle bad
++               msg(MSG_INFO, "Header mismatch %x %x %x %x on cyl %d head %d sector %d\n",
++               bytes[2], bytes[3], bytes[4], bytes[5],
++               sector_status.cyl, sector_status.head, sector_status.sector);
++            msg(MSG_INFO, "Marked bad\n");
++         }else{
++
++            sector_status.head = mfm_fix_head(drive_params, exp_head, (bytes[2] & 0xF8) >> 3 );
++            sector_status.sector = (bytes[4] & 0x3f) ; // Get sectors from byte 4
++
++         }
++
++
++         if (bytes[1] != 0xfd) {
++            msg(MSG_INFO, "Invalid header id byte %02x on cyl %d head %d sector %d\n",
++                  bytes[1], sector_status.cyl, sector_status.head, sector_status.sector);
++            sector_status.status |= SECT_BAD_HEADER;
++         }
++         
++         
++         } else if (drive_params->controller == CONTROLLER_MYARC_HFDC) {
+          int ecc_size[] = { 4, -1, -1, -1,  -1, -1, -1 ,-1 ,
+                            -1, -1, -1, -1,  -1,  7,  6,  5};
+          sector_status.cyl = (bytes[3] & 0xf0) << 4;
+@@ -2061,7 +2128,6 @@ SECTOR_DECODE_STATUS wd_process_data(STATE_TYPE *state, uint8_t bytes[],
+       int id_byte_mask = 0xff;
+ 
+       sector_status.status |= init_status;
+-
+       if (drive_params->controller == CONTROLLER_MYARC_HFDC) {
+          if (bytes[1] == 0xf8) {
+             id_byte_expected = 0xf8;
+@@ -2078,6 +2144,11 @@ SECTOR_DECODE_STATUS wd_process_data(STATE_TYPE *state, uint8_t bytes[],
+          id_byte_expected = 0xfb;
+       } else if (drive_params->controller == CONTROLLER_DJ_II) {
+          id_byte_expected = 0xf8;
++      } else if (drive_params->controller == CONTROLLER_DJ_II_210) {
++         id_byte_expected = 0xf8;
++      } else if (drive_params->controller == CONTROLLER_DJ_II_301) {
++
++         id_byte_expected = 0xf9;
+       } else if (drive_params->controller == CONTROLLER_IBM_3174) {
+          id_byte_expected = 0xfb;
+       } else if (drive_params->controller == CONTROLLER_MVME320) {

BIN
empty_gotek/1.640k.img


BIN
empty_gotek/2.640k.img


BIN
empty_gotek/3.640k.img


BIN
empty_gotek/4.640k.img


BIN
empty_gotek/5.640k.img


BIN
empty_gotek/ABC80_UFDDOS_DSDD_80_FORMATED.640k.img


+ 123 - 0
empty_gotek/img.cfg

@@ -0,0 +1,123 @@
+## IMG.CFG: Example FlashFloppy Geometry Configuration File for Raw IMG Images
+
+# Supports tagged IMG/IMA raw image files with self-identifying geometry.
+
+# If you wish to use this feature, your IMG.CFG must be placed in the
+# root folder or FF/ subfolder of your USB drive.
+# NOTE: If FF/ exists, IMG.CFG must reside there, not the root folder.
+
+# Matching Rules:
+#  1. If tag 'tagname' is defined, this describes the geometry of
+#     all IMG/IMA files of the form *.tagname.img and *.tagname.ima
+#  2. If tag 'default' is defined, this describes the geometry of
+#     all IMG/IMA files that do not match any other defined tag.
+#     This includes untagged files (ie. *.img and *.ima).
+#  3. If a file does not match any tag, and no default tag is defined,
+#     FlashFloppy uses normal geometry auto-detection based on the
+#     host= setting in FF.CFG.
+
+# A badly-defined tag (eg. undefined mandatory parameters) will result in
+# error 31 (Bad Image).
+
+# Tag name in square brackets.
+# 'default' matches any *.img or *.ima which are untagged, or do not
+# match any other defined tag.
+[default]
+
+# Mandatory: Number of cylinders (1-254).
+cyls = 80
+
+# Mandatory: Number of heads (1-2).
+heads = 2
+
+# Mandatory: Number of sectors per track (1-256).
+secs = 9
+
+# Mandatory: Bytes per sector (128, 256, 512, 1024, 2048, 4096, 8192).
+bps = 512
+
+# Optional: ID of first sector on each track (0-255[:0-255])
+# Default is 1.
+# Numbers may be expressed in hexadecimal with 0x prefix (eg. 0xab).
+# Format x:y allows specifying different ID (x, y) for each head/disk-side.
+# Format x specifies same ID (x) for both heads/sides of a double-sided disk.
+# id = 1
+
+# Optional: Recording mode (fm | mfm). Default is mfm.
+# mode = mfm
+
+# Optional: Sector interleave. Default is 1:1 (no interleave).
+# interleave = 1
+
+# Optional: Sector skew per cylinders. Default is 0 (no skew).
+# cskew = 0
+
+# Optional: Sector skew per head. Default is 0 (no skew).
+# hskew = 0
+
+# Optional: Rotational RPM. Default is 300.
+# rpm = 300
+
+# Optional: Post-Data Gap (0-255). Default is 0.
+#           0 = based on recording mode and sector size.
+# gap3 = 0
+
+# Optional: Index Address Mark (yes | no). Default is yes.
+# iam = yes
+
+# Optional: Data rate in kHz (kbit/s) (eg. MFM DD = 250). Default is 0.
+#           0 = based on recording mode and size of track.
+# rate = 0
+
+# Optional: Image file track layout. Default is "interleaved".
+# Comma-separated values:
+#   sequential:    Sequential cylinder ordering: all side 0, then side 1.
+#   interleaved:   Interleaved cylinder ordering: c0s0, c0s1, c1s0, c1s1, ...
+#   reverse-sideN: Side-N cylinders are ordered from high to low (N=0,1).
+#   sides-swapped: Sides 0 and 1 ordering is swapped in the image file.
+#   eg. "sequential,reverse-side1"
+# file-layout = interleaved
+
+
+[640k]
+cyls  = 80
+heads = 2
+secs  = 16
+bps   = 256
+mode  = mfm
+iam   = no
+file-layout = sequential
+
+[1001k]
+cyls  = 77
+heads = 2
+secs  = 26
+bps   = 256
+mode  = mfm
+iam   = no
+rpm = 360
+file-layout = sequential
+
+[160k]
+cyls  = 40
+heads = 1
+secs  = 16
+bps   = 256
+mode  = mfm
+iam   = no
+
+[320k]
+cyls  = 40
+heads = 2
+secs  = 16
+bps   = 256
+mode  = mfm
+iam   = no
+
+[80k]
+cyls  = 40
+heads = 1
+secs  = 8
+bps   = 256
+mode  = fm
+iam   = no