10
10
#include <assert.h>
13
14
#include "formats/coco_dsk.h"
14
15
#include "formats/basicdsk.h"
18
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
29
18
/* -----------------------------------------------------------------------
30
19
* JVC (Jeff Vavasour CoCo) format
320
309
geometry->sector_length = 256;
321
310
geometry->sectors = (header[0x11] << 8) + header[0x12];
322
311
geometry->heads = (header[0x10] & 0x01) ? 2 : 1;
313
if (!geometry->sectors)
314
return FLOPPY_ERROR_INVALIDIMAGE;
323
316
geometry->tracks = total_sectors / geometry->sectors / geometry->heads;
325
318
if (total_sectors != geometry->tracks * geometry->sectors * geometry->heads)
750
err = floppy_load_track(floppy, head, track, TRUE, (void **) &track_data, NULL);
744
err = floppy_load_track(floppy, head, track, TRUE, &track_data_v, NULL);
747
track_data = (UINT8 *) track_data_v;
754
749
/* set up sector map */
755
750
sector_map = malloc(sectors * sizeof(*sector_map));
769
764
physical_sector %= sectors;
772
sector_map[physical_sector] = logical_sector;
767
sector_map[physical_sector] = logical_sector + first_sector_id;
773
768
physical_sector += interleave + 1;
774
769
physical_sector %= sectors;
874
static floperr_t coco_dmk_seek_sector_in_track(floppy_image *floppy, int head, int track, int sector, int dirtify, UINT8 **sector_data, UINT32 *sector_length)
869
static floperr_t coco_dmk_seek_sector_in_track(floppy_image *floppy, int head, int track, int sector, int sector_is_index, int dirtify, UINT8 **sector_data, UINT32 *sector_length)
876
871
struct dmk_tag *tag = get_dmk_tag(floppy);
873
UINT32 idam_offset = 0;
879
874
UINT16 calculated_crc;
883
878
UINT8 *track_data;
884
880
size_t track_length;
887
err = floppy_load_track(floppy, head, track, dirtify, (void **) &track_data, &track_length);
883
err = floppy_load_track(floppy, head, track, dirtify, &track_data_v, &track_length);
886
track_data = (UINT8 *) track_data_v;
891
888
/* search for matching IDAM */
892
889
for (i = 0; i < DMK_TOC_LEN; i++)
909
906
calculated_crc = ccitt_crc16(0xCDB4, &track_data[idam_offset], DMK_IDAM_LENGTH - 2);
911
/* check IDAM integrity and check for matching sector */
912
if ((calculated_crc == dmk_idam_crc(&track_data[idam_offset]))
913
&& (track == dmk_idam_track(&track_data[idam_offset]))
914
&& (head == dmk_idam_side(&track_data[idam_offset]))
915
&& (sector == dmk_idam_sector(&track_data[idam_offset])))
908
if (calculated_crc == dmk_idam_crc(&track_data[idam_offset]))
912
/* the sector is indexed; decrement the index and go */
918
/* check IDAM integrity and check for matching sector */
919
if ((sector == dmk_idam_sector(&track_data[idam_offset]))
920
/* && (track == dmk_idam_track(&track_data[idam_offset])) */
921
/* && (head == dmk_idam_side(&track_data[idam_offset])) */
919
928
if (i >= DMK_TOC_LEN)
958
967
static floperr_t coco_dmk_get_sector_length(floppy_image *floppy, int head, int track, int sector, UINT32 *sector_length)
960
return coco_dmk_seek_sector_in_track(floppy, head, track, sector, FALSE, NULL, sector_length);
969
return coco_dmk_seek_sector_in_track(floppy, head, track, sector, FALSE, FALSE, NULL, sector_length);
965
static floperr_t coco_dmk_get_indexed_sector_info(floppy_image *floppy, int head, int track, int sector_index, int *sector, UINT32 *sector_length)
974
static floperr_t coco_dmk_get_indexed_sector_info(floppy_image *floppy, int head, int track, int sector_index, int *cylinder, int *side, int *sector, UINT32 *sector_length)
968
977
UINT32 idam_offset;
969
978
const UINT8 *track_data;
971
981
if (sector_index*2 >= DMK_TOC_LEN)
972
982
return FLOPPY_ERROR_SEEKERROR;
974
err = floppy_load_track(floppy, head, track, FALSE, (void **) &track_data, NULL);
984
err = floppy_load_track(floppy, head, track, FALSE, &track_data_v, NULL);
987
track_data = (UINT8 *) track_data_v;
978
989
idam_offset = track_data[sector_index * 2 + 1];
979
990
idam_offset <<= 8;
995
static floperr_t coco_dmk_read_sector(floppy_image *floppy, int head, int track, int sector, void *buffer, size_t buflen)
1010
static floperr_t internal_coco_dmk_read_sector(floppy_image *floppy, int head, int track, int sector, int sector_is_index, void *buffer, size_t buflen)
998
1013
UINT32 sector_length;
1000
1015
UINT16 calculated_crc;
1001
1016
UINT8 *sector_data;
1003
err = coco_dmk_seek_sector_in_track(floppy, head, track, sector, FALSE, §or_data, §or_length);
1018
err = coco_dmk_seek_sector_in_track(floppy, head, track, sector, sector_is_index, FALSE, §or_data, §or_length);
1017
1032
return FLOPPY_ERROR_SUCCESS;
1022
static floperr_t coco_dmk_write_sector(floppy_image *floppy, int head, int track, int sector, const void *buffer, size_t buflen)
1037
static floperr_t internal_coco_dmk_write_sector(floppy_image *floppy, int head, int track, int sector, int sector_is_index, const void *buffer, size_t buflen)
1025
1040
UINT32 sector_length;
1026
1041
UINT8 *sector_data;
1029
err = coco_dmk_seek_sector_in_track(floppy, head, track, sector, TRUE, §or_data, §or_length);
1044
err = coco_dmk_seek_sector_in_track(floppy, head, track, sector, sector_is_index, TRUE, §or_data, §or_length);
1061
static floperr_t coco_dmk_read_sector(floppy_image *floppy, int head, int track, int sector, void *buffer, size_t buflen)
1063
return internal_coco_dmk_read_sector(floppy, head, track, sector, FALSE, buffer, buflen);
1066
static floperr_t coco_dmk_write_sector(floppy_image *floppy, int head, int track, int sector, const void *buffer, size_t buflen)
1068
return internal_coco_dmk_write_sector(floppy, head, track, sector, FALSE, buffer, buflen);
1071
static floperr_t coco_dmk_read_indexed_sector(floppy_image *floppy, int head, int track, int sector, void *buffer, size_t buflen)
1073
return internal_coco_dmk_read_sector(floppy, head, track, sector, TRUE, buffer, buflen);
1076
static floperr_t coco_dmk_write_indexed_sector(floppy_image *floppy, int head, int track, int sector, const void *buffer, size_t buflen)
1078
return internal_coco_dmk_write_sector(floppy, head, track, sector, TRUE, buffer, buflen);
1046
1083
static void coco_dmk_interpret_header(floppy_image *floppy, int *heads, int *tracks, int *track_size)
1048
1085
UINT8 header[DMK_HEADER_LEN];
1107
1144
callbacks->get_indexed_sector_info = coco_dmk_get_indexed_sector_info;
1108
1145
callbacks->read_sector = coco_dmk_read_sector;
1109
1146
callbacks->write_sector = coco_dmk_write_sector;
1147
callbacks->read_indexed_sector = coco_dmk_read_indexed_sector;
1148
callbacks->write_indexed_sector = coco_dmk_write_indexed_sector;
1111
1150
return FLOPPY_ERROR_SUCCESS;