From beb4e7869d454d676c8ea20080118a628b20620d Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 11 Nov 2016 03:16:41 +0100 Subject: [PATCH] The FDC READ TRACK command should now operate properly. --- src/386.c | 1 + src/386_dynarec.c | 1 + src/disc.h | 15 +++++++++++++++ src/disc_86f.c | 26 +++++++++++--------------- src/disc_imd.c | 4 ++-- src/disc_img.c | 4 ++-- src/disc_td0.c | 4 ++-- src/dma.c | 1 + src/fdc.c | 13 +++++++++++++ src/fdc.h | 1 + src/fdc37c665.c | 1 + src/fdc37c932fr.c | 1 + src/model.c | 1 + src/pc87306.c | 1 + src/sis85c471.c | 1 + src/um8669f.c | 1 + src/wd76c10.c | 1 + 17 files changed, 56 insertions(+), 21 deletions(-) diff --git a/src/386.c b/src/386.c index 6c6df2623..526a659c5 100644 --- a/src/386.c +++ b/src/386.c @@ -6,6 +6,7 @@ #include "x87.h" #include "mem.h" #include "cpu.h" +#include "disc.h" #include "fdc.h" #include "timer.h" diff --git a/src/386_dynarec.c b/src/386_dynarec.c index e2d532472..9bad1d323 100644 --- a/src/386_dynarec.c +++ b/src/386_dynarec.c @@ -8,6 +8,7 @@ #include "mem.h" #include "codegen.h" #include "cpu.h" +#include "disc.h" #include "fdc.h" #include "timer.h" diff --git a/src/disc.h b/src/disc.h index 5525c2635..aa9b077d7 100644 --- a/src/disc.h +++ b/src/disc.h @@ -184,3 +184,18 @@ void null_set_sector(int drive, int side, uint8_t c, uint8_t h, uint8_t r, uint8 uint32_t null_index_hole_pos(int drive, int side); uint32_t common_get_raw_size(int drive, int side); + +typedef struct +{ + uint8_t c; + uint8_t h; + uint8_t r; + uint8_t n; +} sector_id_fields_t; + +typedef union +{ + uint32_t dword; + uint8_t byte_array[4]; + sector_id_fields_t id; +} sector_id_t; diff --git a/src/disc_86f.c b/src/disc_86f.c index 187e8a711..dbbe49b80 100644 --- a/src/disc_86f.c +++ b/src/disc_86f.c @@ -89,21 +89,6 @@ enum static uint16_t CRCTable[256]; -typedef struct -{ - uint8_t c; - uint8_t h; - uint8_t r; - uint8_t n; -} sector_id_fields_t; - -typedef union -{ - uint32_t dword; - uint8_t byte_array[4]; - sector_id_fields_t id; -} sector_id_t; - typedef struct __attribute__((packed)) { uint8_t buffer[10]; @@ -1394,6 +1379,17 @@ void d86f_read_sector_id(int drive, int side, int match) { // pclog("ID read (%02X)\n", d86f[drive].state); d86f_handler[drive].set_sector(drive, side, d86f[drive].last_sector.id.c, d86f[drive].last_sector.id.h, d86f[drive].last_sector.id.r, d86f[drive].last_sector.id.n); + if (d86f[drive].state == STATE_02_READ_ID) + { + /* READ TRACK command, we need some special handling here. */ + if (d86f[drive].last_sector.dword != fdc_get_read_track_sector().dword) + { + d86f[drive].error_condition |= 4; /* Mark that the sector ID is not the one expected by the FDC. */ + /* Make sure we use the sector size from the FDC. */ + d86f[drive].last_sector.id.n = fdc_get_read_track_sector().id.n; + } + /* If the two ID's are identical, then we do not need to do anything regarding the sector size. */ + } d86f[drive].state++; } else diff --git a/src/disc_imd.c b/src/disc_imd.c index 06fd0a45a..1aa587b6d 100644 --- a/src/disc_imd.c +++ b/src/disc_imd.c @@ -2,10 +2,10 @@ see COPYING for more details */ #include "ibm.h" -#include "fdc.h" -#include "fdd.h" #include "disc.h" #include "disc_imd.h" +#include "fdc.h" +#include "fdd.h" #include diff --git a/src/disc_img.c b/src/disc_img.c index cf399ad7a..0fe016fcd 100644 --- a/src/disc_img.c +++ b/src/disc_img.c @@ -2,10 +2,10 @@ see COPYING for more details */ #include "ibm.h" -#include "fdc.h" -#include "fdd.h" #include "disc.h" #include "disc_img.h" +#include "fdc.h" +#include "fdd.h" static struct { diff --git a/src/disc_td0.c b/src/disc_td0.c index 3844deef9..d622c4c16 100644 --- a/src/disc_td0.c +++ b/src/disc_td0.c @@ -15,10 +15,10 @@ */ #include "ibm.h" -#include "fdc.h" -#include "fdd.h" #include "disc.h" #include "disc_td0.h" +#include "fdc.h" +#include "fdd.h" #include diff --git a/src/dma.c b/src/dma.c index 278d528a8..bb28c6668 100644 --- a/src/dma.c +++ b/src/dma.c @@ -3,6 +3,7 @@ */ #include "ibm.h" +#include "disc.h" #include "dma.h" #include "fdc.h" #include "io.h" diff --git a/src/fdc.c b/src/fdc.c index 42d710b6d..a25bf8a7e 100644 --- a/src/fdc.c +++ b/src/fdc.c @@ -7,6 +7,7 @@ #include "disc.h" #include "dma.h" +#include "fdc.h" #include "fdd.h" #include "io.h" #include "pic.h" @@ -94,6 +95,8 @@ typedef struct FDC int sc; int satisfying_sectors; + + sector_id_t read_track_sector; } FDC; static FDC fdc; @@ -124,6 +127,11 @@ void fdc_reset() // pclog("Reset FDC\n"); } +sector_id_t fdc_get_read_track_sector() +{ + return fdc.read_track_sector; +} + int fdc_get_compare_condition() { switch (discint) @@ -836,6 +844,10 @@ bad_command: fdc.eot[fdc.drive] = fdc.params[5]; fdc.gap = fdc.params[6]; fdc.dtl = fdc.params[7]; + fdc.read_track_sector.id.c = fdc.params[1]; + fdc.read_track_sector.id.h = fdc.params[2]; + fdc.read_track_sector.id.r = 1; + fdc.read_track_sector.id.n = fdc.params[4]; if (fdc.config & 0x40) { if (fdc.params[1] != fdc.track[fdc.drive]) @@ -1281,6 +1293,7 @@ void fdc_callback() case 2: /*Read track*/ readflash = 1; fdc.eot[fdc.drive]--; + fdc.read_track_sector.id.r++; // pclog("Read a track callback, eot=%i\n", fdc.eot[fdc.drive]); if (!fdc.eot[fdc.drive] || fdc.tc) { diff --git a/src/fdc.h b/src/fdc.h index eefeee400..1e159abc7 100644 --- a/src/fdc.h +++ b/src/fdc.h @@ -31,6 +31,7 @@ void fdc_update_densel_force(int densel_force); void fdc_update_drvrate(int drive, int drvrate); void fdc_update_drv2en(int drv2en); +sector_id_t fdc_get_read_track_sector(); int fdc_get_compare_condition(); int fdc_is_deleted(); int fdc_is_sk(); diff --git a/src/fdc37c665.c b/src/fdc37c665.c index 9bea552cb..7a6dcb700 100644 --- a/src/fdc37c665.c +++ b/src/fdc37c665.c @@ -3,6 +3,7 @@ */ #include "ibm.h" +#include "disc.h" #include "fdc.h" #include "fdd.h" #include "io.h" diff --git a/src/fdc37c932fr.c b/src/fdc37c932fr.c index 7b22d746f..96c9e1a04 100644 --- a/src/fdc37c932fr.c +++ b/src/fdc37c932fr.c @@ -8,6 +8,7 @@ #include "ibm.h" +#include "disc.h" #include "fdc.h" #include "fdd.h" #include "ide.h" diff --git a/src/model.c b/src/model.c index 47cc68a83..c40ca222d 100644 --- a/src/model.c +++ b/src/model.c @@ -14,6 +14,7 @@ #include "amstrad.h" #include "compaq.h" #include "device.h" +#include "disc.h" #include "dma.h" #include "fdc.h" #include "fdc37c665.h" diff --git a/src/pc87306.c b/src/pc87306.c index fe04a9827..61aa985e2 100644 --- a/src/pc87306.c +++ b/src/pc87306.c @@ -8,6 +8,7 @@ #include "ibm.h" +#include "disc.h" #include "fdc.h" #include "fdd.h" #include "io.h" diff --git a/src/sis85c471.c b/src/sis85c471.c index 2807ea314..ee123649c 100644 --- a/src/sis85c471.c +++ b/src/sis85c471.c @@ -9,6 +9,7 @@ #include "ibm.h" #include "ide.h" +#include "disc.h" #include "fdc.h" #include "fdd.h" #include "io.h" diff --git a/src/um8669f.c b/src/um8669f.c index 1b7c85833..d953bcb5f 100644 --- a/src/um8669f.c +++ b/src/um8669f.c @@ -41,6 +41,7 @@ COM2 : #include "ibm.h" +#include "disc.h" #include "fdc.h" #include "io.h" #include "lpt.h" diff --git a/src/wd76c10.c b/src/wd76c10.c index 8809a1b45..595a1d6f3 100644 --- a/src/wd76c10.c +++ b/src/wd76c10.c @@ -2,6 +2,7 @@ see COPYING for more details */ #include "ibm.h" +#include "disc.h" #include "fdc.h" #include "io.h" #include "mem.h"