From ff5849ad253f00dfbe64fab760cfbe7256ca5d13 Mon Sep 17 00:00:00 2001
From: David Fifield <david@bamsoftware.com>
Date: Sat, 19 May 2018 12:17:11 -0700
Subject: [PATCH] Add msdos320 format.

---
 backend/formats.c    |  2 ++
 backend/phys_msdos.c | 34 +++++++++++++++++++++++++++++++++-
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/backend/formats.c b/backend/formats.c
index b0eed46..061a7ab 100644
--- a/backend/formats.c
+++ b/backend/formats.c
@@ -16,6 +16,7 @@ extern struct phys phys_ti99ds360;
 extern struct phys phys_atari810;
 extern struct phys phys_msdos1200;
 extern struct phys phys_msdos360;
+extern struct phys phys_msdos320;
 extern struct phys phys_mdsad;
 extern struct phys phys_mdsad350;
 extern struct phys phys_kaypro2;
@@ -49,6 +50,7 @@ static struct format_info {
 	{"ti99ds360","TI-99/4A 360k","dsk",&phys_ti99ds360,NULL},
 	{"atari810","Atari 810","xfd",&phys_atari810,NULL},
 	{"msdos12","MS-DOS 1200k","img",&phys_msdos1200,&log_fat12},
+	{"msdos320","MS-DOS 320k","img",&phys_msdos320,&log_fat12},
 	{"msdos360","MS-DOS 360k","img",&phys_msdos360,&log_fat12},
 	{"mdsad","North Star MDS-A-D 175k","nsi",&phys_mdsad,NULL},
 	{"mdsad350","North Star MDS-A-D 350k","nsi",&phys_mdsad350,NULL},
diff --git a/backend/phys_msdos.c b/backend/phys_msdos.c
index 751356c..70a92ee 100644
--- a/backend/phys_msdos.c
+++ b/backend/phys_msdos.c
@@ -1,4 +1,4 @@
-/* IBM PC formats, 1200k and 360k */
+/* IBM PC formats, 1200k, 360k, and 320k */
 
 #include <stdio.h>
 #include <stdint.h>
@@ -26,6 +26,10 @@ static int max_track_360k(struct phys *this) {
 	return 39;
 }
 
+static int max_track_320k(struct phys *this) {
+	return 39;
+}
+
 static int min_side(struct phys *this) {
 	return 0;
 }
@@ -46,6 +50,10 @@ static int max_sector_360k(struct phys *this, int track, int side) {
 	return 9;
 }
 
+static int max_sector_320k(struct phys *this, int track, int side) {
+	return 8;
+}
+
 static int sector_bytes(struct phys *this, int track, int side, int sector) {
 	return 512;
 }
@@ -86,6 +94,10 @@ static int read_sector_360k(struct phys *this, unsigned char *out, int track, in
 	return read_sector(this,out,track,side,sector,3333);
 }
 
+static int read_sector_320k(struct phys *this, unsigned char *out, int track, int side, int sector) {
+	return read_sector(this,out,track,side,sector,3333);
+}
+
 struct phys phys_msdos1200={
 	.min_track = min_track,
 	.max_track = max_track_1200k,
@@ -125,3 +137,23 @@ struct phys phys_msdos360={
 	.read_sector = read_sector_360k,
 	.prepare = phys_gen_no_prepare
 };
+
+struct phys phys_msdos320={
+	.min_track = min_track,
+	.max_track = max_track_320k,
+	.num_tracks = phys_gen_num_tracks,
+	.min_side = min_side,
+	.max_side = max_side,
+	.num_sides = phys_gen_num_sides,
+	.min_sector = min_sector,
+	.max_sector = max_sector_320k,
+	.num_sectors = phys_gen_num_sectors,
+	.tpi = phys_gen_48tpi,
+	.density = phys_gen_low_density,
+	.sector_bytes = sector_bytes,
+	.track_bytes = phys_gen_track_bytes,
+	.physical_track = phys_gen_physical_track,
+	.best_read_order = phys_gen_best_read_order,
+	.read_sector = read_sector_320k,
+	.prepare = phys_gen_no_prepare
+};
-- 
2.11.0

