diff options
Diffstat (limited to 'trunk/src/lib/formats/dim_dsk.c')
-rw-r--r-- | trunk/src/lib/formats/dim_dsk.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/trunk/src/lib/formats/dim_dsk.c b/trunk/src/lib/formats/dim_dsk.c new file mode 100644 index 00000000000..f070a5008af --- /dev/null +++ b/trunk/src/lib/formats/dim_dsk.c @@ -0,0 +1,101 @@ +/********************************************************************* + + formats/dim_dsk.c + + DIM disk images + +*********************************************************************/ + +#include <string.h> + +#include "dim_dsk.h" +#include "basicdsk.h" + +FLOPPY_IDENTIFY(dim_dsk_identify) +{ + UINT8 dim_header[16]; + + floppy_image_read(floppy, (UINT8*)dim_header,0xab,16); + + if(strncmp((const char*)dim_header,"DIFC HEADER",11) == 0) + *vote = 100; + else + *vote = 0; + return FLOPPY_ERROR_SUCCESS; +} + +FLOPPY_CONSTRUCT(dim_dsk_construct) +{ + struct basicdsk_geometry geometry; + // DIM disk image header, most of this is guesswork + int tracks = 77; + int heads = 2; + int sectors = 8; // per track + int sectorlen = 1024; + int firstsector = 0x01; + UINT8 format_tmp; + int x; + UINT16 temp; + + if(params) + { + // create + return FLOPPY_ERROR_UNSUPPORTED; + } + + // Offset + 0 : disk format type (1 byte): + // 0 = 2HD / 2HDA (8 sector/track, 1024 bytes/sector, GAP#3 = 0x74) + // 1 = 2HS (9 sector/track, 1024 bytes/sector, GAP#3 = 0x39) + // 2 = 2HC (15 sector/track, 512 bytes/sector, GAP#3 = 0x54) + // 3 = 2HDE(68) (9 sector/track, 1024 bytes/sector, GAP#3 = 0x39) + // 9 = 2HQ (18 sector/track, 512 bytes/sector, GAP#3 = 0x54) + // 17 = N88-BASIC (26 sector/track, 256 bytes/sector, GAP#3 = 0x33) + // or (26 sector/track, 128 bytes/sector, GAP#3 = 0x1a) + // + floppy_image_read(floppy, &format_tmp,0,1); + + switch(format_tmp) + { + case 0x00: + sectors = 8; + sectorlen = 1024; + break; + case 0x01: + case 0x03: + sectors = 9; + sectorlen = 1024; + break; + case 0x02: + sectors = 15; + sectorlen = 512; + break; + case 0x09: + sectors = 18; + sectorlen = 512; + break; + case 0x11: + sectors = 26; + sectorlen = 256; + break; + } + tracks = 0; + for (x=0;x<86;x++) + { + floppy_image_read(floppy,&temp,(x*2)+1,2); + if(temp == 0x0101) + tracks++; + } + // TODO: expand on this basic implementation + + LOG_FORMATS("FDD: DIM image loaded - type %i, %i tracks, %i sectors per track, %i bytes per sector\n", format_tmp,tracks, sectors,sectorlen); + + memset(&geometry, 0, sizeof(geometry)); + geometry.heads = heads; + geometry.first_sector_id = firstsector; + geometry.sector_length = sectorlen; + geometry.tracks = tracks+1; + geometry.sectors = sectors; + geometry.offset = 0x100; + return basicdsk_construct(floppy, &geometry); +} + |