src/lib/formats/d64_dsk.c
| r15871 | r15872 | |
| 26 | 26 | PARAMETERS |
| 27 | 27 | ***************************************************************************/ |
| 28 | 28 | |
| 29 | | #define LOG 1 |
| 30 | | |
| 31 | 29 | #define MAX_HEADS 2 |
| 32 | 30 | #define MAX_TRACKS 84 |
| 33 | 31 | #define MAX_ERROR_SECTORS 4166 |
| r15871 | r15872 | |
| 716 | 714 | tag->dos_tracks = dos_tracks; |
| 717 | 715 | tag->has_errors = has_errors; |
| 718 | 716 | |
| 719 | | if (LOG) |
| 720 | | { |
| 721 | | LOG_FORMATS("D64 size: %04x\n", (UINT32)floppy_image_size(floppy)); |
| 722 | | LOG_FORMATS("D64 heads: %u\n", heads); |
| 723 | | LOG_FORMATS("D64 tracks: %u\n", dos_tracks); |
| 724 | | LOG_FORMATS("D64 DOS version: %s\n", DOS_VERSION[dos]); |
| 725 | | LOG_FORMATS("D64 error codes: %s\n", has_errors ? "yes" : "no"); |
| 726 | | } |
| 717 | LOG_FORMATS("D64 size: %04x\n", (UINT32)floppy_image_size(floppy)); |
| 718 | LOG_FORMATS("D64 heads: %u\n", heads); |
| 719 | LOG_FORMATS("D64 tracks: %u\n", dos_tracks); |
| 720 | LOG_FORMATS("D64 DOS version: %s\n", DOS_VERSION[dos]); |
| 721 | LOG_FORMATS("D64 error codes: %s\n", has_errors ? "yes" : "no"); |
| 727 | 722 | |
| 728 | 723 | /* clear track data offsets */ |
| 729 | 724 | for (head = 0; head < MAX_HEADS; head++) |
| r15871 | r15872 | |
| 755 | 750 | /* also store an error entry for each sector */ |
| 756 | 751 | errors_size += DOS25_SECTORS_PER_TRACK[track]; |
| 757 | 752 | |
| 758 | | if (LOG) |
| 759 | | { |
| 760 | | LOG_FORMATS("D64 head %u track %u data offset: %04x\n", head, track + 1, tag->track_offset[head][track]); |
| 761 | | if (has_errors) LOG_FORMATS("D64 head %u track %u error offset: %04x\n", head, track + 1, tag->error_offset[head][track]); |
| 762 | | } |
| 753 | LOG_FORMATS("D64 head %u track %u data offset: %04x\n", head, track + 1, tag->track_offset[head][track]); |
| 754 | if (has_errors) LOG_FORMATS("D64 head %u track %u error offset: %04x\n", head, track + 1, tag->error_offset[head][track]); |
| 763 | 755 | } |
| 764 | 756 | } |
| 765 | 757 | else |
| r15871 | r15872 | |
| 788 | 780 | errors_size += DOS2_SECTORS_PER_TRACK[track / 2]; |
| 789 | 781 | } |
| 790 | 782 | |
| 791 | | if (LOG) |
| 792 | | { |
| 793 | | LOG_FORMATS("D64 head %u track %.1f data offset: %04x\n", head, get_dos_track(track), tag->track_offset[head][track]); |
| 794 | | if (has_errors) LOG_FORMATS("D64 head %u track %.1f error offset: %04x\n", head, get_dos_track(track), tag->error_offset[head][track]); |
| 795 | | } |
| 783 | LOG_FORMATS("D64 head %u track %.1f data offset: %04x\n", head, get_dos_track(track), tag->track_offset[head][track]); |
| 784 | if (has_errors) LOG_FORMATS("D64 head %u track %.1f error offset: %04x\n", head, get_dos_track(track), tag->error_offset[head][track]); |
| 796 | 785 | } |
| 797 | 786 | } |
| 798 | 787 | } |
| r15871 | r15872 | |
| 805 | 794 | { |
| 806 | 795 | tag->speed_zone[track] = DOS25_SPEED_ZONE[track]; |
| 807 | 796 | |
| 808 | | if (LOG) LOG_FORMATS("D64 track %u speed zone: %u\n", track + 1, tag->speed_zone[track]); |
| 797 | LOG_FORMATS("D64 track %u speed zone: %u\n", track + 1, tag->speed_zone[track]); |
| 809 | 798 | } |
| 810 | 799 | else |
| 811 | 800 | { |
| 812 | 801 | tag->speed_zone[track] = DOS1_SPEED_ZONE[track / 2]; |
| 813 | 802 | |
| 814 | | if (LOG) LOG_FORMATS("D64 track %.1f speed zone: %u\n", get_dos_track(track), tag->speed_zone[track]); |
| 803 | LOG_FORMATS("D64 track %.1f speed zone: %u\n", get_dos_track(track), tag->speed_zone[track]); |
| 815 | 804 | } |
| 816 | 805 | } |
| 817 | 806 | |
| r15871 | r15872 | |
| 830 | 819 | tag->id1 = id[0]; |
| 831 | 820 | tag->id2 = id[1]; |
| 832 | 821 | |
| 833 | | if (LOG) LOG_FORMATS("D64 format ID: %02x%02x\n", id[0], id[1]); |
| 822 | LOG_FORMATS("D64 format ID: %02x%02x\n", id[0], id[1]); |
| 834 | 823 | |
| 835 | 824 | /* read errors */ |
| 836 | 825 | if (tag->has_errors) |
| 837 | 826 | { |
| 838 | | if (LOG) LOG_FORMATS("D64 error blocks: %u %u\n", errors_size, track_offset); |
| 827 | LOG_FORMATS("D64 error blocks: %u %u\n", errors_size, track_offset); |
| 839 | 828 | floppy_image_read(floppy, tag->error, track_offset, errors_size); |
| 840 | 829 | } |
| 841 | 830 | else |
src/lib/formats/g64_dsk.c
| r15871 | r15872 | |
| 24 | 24 | PARAMETERS |
| 25 | 25 | ***************************************************************************/ |
| 26 | 26 | |
| 27 | | #define LOG 0 |
| 28 | | |
| 29 | 27 | #define HEADER_LENGTH 0x2ac /* standard length for 84 half tracks */ |
| 30 | 28 | #define MAX_TRACKS 84 |
| 31 | 29 | |
| r15871 | r15872 | |
| 143 | 141 | |
| 144 | 142 | if (!head && track_offset) |
| 145 | 143 | { |
| 146 | | if (buflen < tag->track_size) { printf("G64 track buffer too small: %u!", (UINT32)buflen); exit(-1); } |
| 144 | if (buflen < tag->track_size) { LOG_FORMATS("G64 track buffer too small: %u!", (UINT32)buflen); exit(-1); } |
| 147 | 145 | |
| 148 | 146 | /* read track */ |
| 149 | 147 | floppy_image_read(floppy, buffer, track_offset + 2, tag->track_size); |
| r15871 | r15872 | |
| 154 | 152 | memset(buffer, 0, buflen); |
| 155 | 153 | } |
| 156 | 154 | |
| 157 | | if (LOG) LOG_FORMATS("G64 track %.1f length %u\n", get_dos_track(track), track_length); |
| 155 | LOG_FORMATS("G64 track %.1f length %u\n", get_dos_track(track), track_length); |
| 158 | 156 | |
| 159 | 157 | return FLOPPY_ERROR_SUCCESS; |
| 160 | 158 | } |
| r15871 | r15872 | |
| 247 | 245 | /* version */ |
| 248 | 246 | floppy_image_read(floppy, header, pos, 0x0c); pos += 0xc; |
| 249 | 247 | tag->version = header[8]; |
| 250 | | if (LOG) LOG_FORMATS("G64 version: %u\n", tag->version); |
| 248 | LOG_FORMATS("G64 version: %u\n", tag->version); |
| 251 | 249 | |
| 252 | 250 | /* number of half tracks */ |
| 253 | 251 | tag->heads = 1; |
| 254 | 252 | tag->tracks = header[9]; |
| 255 | | if (LOG) LOG_FORMATS("G64 tracks: %u\n", tag->tracks); |
| 253 | LOG_FORMATS("G64 tracks: %u\n", tag->tracks); |
| 256 | 254 | |
| 257 | 255 | /* size of each stored half track */ |
| 258 | 256 | tag->track_size = (header[11] << 8) | header[10]; |
| 259 | | if (LOG) LOG_FORMATS("G64 track size: %04x\n", tag->track_size); |
| 257 | LOG_FORMATS("G64 track size: %04x\n", tag->track_size); |
| 260 | 258 | |
| 261 | 259 | /* data offsets */ |
| 262 | 260 | for (i = 0; i < tag->tracks; i++) |
| r15871 | r15872 | |
| 264 | 262 | floppy_image_read(floppy, header, pos, 4); pos += 4; |
| 265 | 263 | tag->track_offset[i] = (header[3] << 24) | (header[2] << 16) | (header[1] << 8) | header[0]; |
| 266 | 264 | |
| 267 | | if (LOG) LOG_FORMATS("G64 track %.1f data offset: %04x\n", get_dos_track(i), tag->track_offset[i]); |
| 265 | LOG_FORMATS("G64 track %.1f data offset: %04x\n", get_dos_track(i), tag->track_offset[i]); |
| 268 | 266 | } |
| 269 | 267 | |
| 270 | 268 | /* speed zone offsets */ |
| r15871 | r15872 | |
| 273 | 271 | floppy_image_read(floppy, header, pos, 4); pos += 4; |
| 274 | 272 | tag->speed_zone_offset[i] = (header[3] << 24) | (header[2] << 16) | (header[1] << 8) | header[0]; |
| 275 | 273 | |
| 276 | | if (LOG) |
| 277 | | { |
| 278 | | if (tag->speed_zone_offset[i] < 4) { |
| 279 | | LOG_FORMATS("G64 track %.1f speed zone: %u\n", get_dos_track(i), tag->speed_zone_offset[i]); |
| 280 | | } else { |
| 281 | | LOG_FORMATS("G64 track %.1f speed zone offset: %04x\n", get_dos_track(i), tag->speed_zone_offset[i]); |
| 282 | | } |
| 274 | if (tag->speed_zone_offset[i] < 4) { |
| 275 | LOG_FORMATS("G64 track %.1f speed zone: %u\n", get_dos_track(i), tag->speed_zone_offset[i]); |
| 276 | } else { |
| 277 | LOG_FORMATS("G64 track %.1f speed zone offset: %04x\n", get_dos_track(i), tag->speed_zone_offset[i]); |
| 283 | 278 | } |
| 284 | 279 | } |
| 285 | 280 | |