diff options
-rw-r--r-- | src/lib/formats/dsk_dsk.c | 39 | ||||
-rw-r--r-- | src/mess/drivers/amstrad.c | 8 | ||||
-rw-r--r-- | src/mess/includes/amstrad.h | 2 |
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, §or,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 ); }; |