summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2012-12-28 11:13:31 +0000
committer Olivier Galibert <galibert@pobox.com>2012-12-28 11:13:31 +0000
commitb368d0f478dce64908e3f5cb479902ffad7dfce4 (patch)
treea96d63d07b05ff1d12a04631e7f3bd6d12eeba0b /src
parentfe62c377e0eab68a5f5fb0549ed4da7d1407f9c6 (diff)
(mess) dsk: (minimally) complete the dsk support [O. Galibert]
Diffstat (limited to 'src')
-rw-r--r--src/lib/formats/dsk_dsk.c39
-rw-r--r--src/mess/drivers/amstrad.c8
-rw-r--r--src/mess/includes/amstrad.h2
3 files changed, 39 insertions, 10 deletions
diff --git a/src/lib/formats/dsk_dsk.c b/src/lib/formats/dsk_dsk.c
index ffdda771daf..0dfe2046fa9 100644
--- a/src/lib/formats/dsk_dsk.c
+++ b/src/lib/formats/dsk_dsk.c
@@ -333,7 +333,7 @@ struct sector_header
UINT8 sector_size_code;
UINT8 fdc_status_reg1;
UINT8 fdc_status_reg2;
- UINT16 data_lenght;
+ UINT16 data_length;
};
#pragma pack()
@@ -343,6 +343,8 @@ bool dsk_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
UINT8 header[100];
bool extendformat = FALSE;
+ int image_size = io_generic_size(io);
+
io_generic_read(io, &header, 0, sizeof(header));
if ( memcmp( header, EXT_FORMAT_HEADER, 16 ) ==0) {
extendformat = TRUE;
@@ -377,19 +379,40 @@ bool dsk_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
int counter = 0;
for(int track=0; track < tracks; track++) {
for(int side=0; side < heads; side++) {
- // read location of
+ if(track_offsets[(track<<1)+side] >= image_size)
+ continue;
track_header tr;
io_generic_read(io, &tr,track_offsets[(track<<1)+side],sizeof(tr));
- //printf("%d,%d %d, %d\n",track,side,tr.track_number, tr.gap3_length);
- //int sec_location = track_offsets[(track<<1)+side] + 0x100;
- for(int j=0;j<tr.number_of_sector;j++)
- {
+ desc_pc_sector sects[256];
+ UINT8 sect_data[65536];
+ int sdatapos = 0;
+ int pos = track_offsets[(track<<1)+side] + 0x100;
+ for(int j=0;j<tr.number_of_sector;j++) {
sector_header sector;
io_generic_read(io, &sector,track_offsets[(track<<1)+side]+sizeof(tr)+(sizeof(sector)*j),sizeof(sector));
- //printf("sec %02x %08x\n",sector.sector_id,sec_location);
- //sec_location += sector.data_lenght;
+ sects[j].track = sector.track;
+ sects[j].head = sector.side;
+ sects[j].sector = sector.sector_id;
+ sects[j].size = sector.sector_size_code;
+ sects[j].actual_size = sector.data_length;
+ sects[j].deleted = sector.fdc_status_reg1 == 0xb2;
+ sects[j].bad_crc = sector.fdc_status_reg1 == 0xb5;
+
+ if(!sects[j].deleted) {
+ sects[j].data = sect_data + sdatapos;
+ io_generic_read(io, sects[j].data, pos, sects[j].actual_size);
+ sdatapos += sects[j].actual_size;
+
+ } else
+ sects[j].data = NULL;
+
+ if(extendformat)
+ pos += sector.data_length;
+ else
+ pos += 128 << tr.sector_size_code;
}
+ build_pc_track_mfm(track, side, image, 100000, tr.number_of_sector, sects, tr.gap3_length);
counter++;
}
}
diff --git a/src/mess/drivers/amstrad.c b/src/mess/drivers/amstrad.c
index 68ed77afdf0..d86bd318ca7 100644
--- a/src/mess/drivers/amstrad.c
+++ b/src/mess/drivers/amstrad.c
@@ -105,6 +105,7 @@ Some bugs left :
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "formats/tzx_cas.h"
+#include "formats/dsk_dsk.h"
#include "machine/ram.h"
@@ -883,12 +884,15 @@ static MACHINE_CONFIG_START( amstrad_nofdc, amstrad_state )
MCFG_RAM_DEFAULT_SIZE("128K")
MACHINE_CONFIG_END
+FLOPPY_FORMATS_MEMBER( amstrad_state::floppy_formats )
+ FLOPPY_DSK_FORMAT
+FLOPPY_FORMATS_END
static MACHINE_CONFIG_DERIVED( amstrad, amstrad_nofdc )
MCFG_UPD765A_ADD("upd765", true, true)
- MCFG_FLOPPY_DRIVE_ADD("upd765:0", amstrad_floppies, "3ssdd", 0, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765:1", amstrad_floppies, "3ssdd", 0, floppy_image_device::default_floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("upd765:0", amstrad_floppies, "3ssdd", 0, amstrad_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("upd765:1", amstrad_floppies, "3ssdd", 0, amstrad_state::floppy_formats)
MCFG_SOFTWARE_LIST_ADD("flop_list","cpc_flop")
MACHINE_CONFIG_END
diff --git a/src/mess/includes/amstrad.h b/src/mess/includes/amstrad.h
index bf52cf39484..35003e3168f 100644
--- a/src/mess/includes/amstrad.h
+++ b/src/mess/includes/amstrad.h
@@ -187,6 +187,8 @@ public:
DECLARE_WRITE8_MEMBER(amstrad_ppi_portc_w);
void aleste_interrupt(bool state);
+
+ DECLARE_FLOPPY_FORMATS( floppy_formats );
};