Vastly overhauled the UI, there's now a completely new Settings dialog as well as a status bar with disk activity icons and removable drive menus;

Thoroughly clean up the code to vastly reduce the number of compiler warnings and found and fixed several bugs in the process;
Applied all mainline PCem commits;
Added SCSI hard disk emulation;
Commented out all unfinished machines and graphics cards;
Added the AOpen AP53 and ASUS P/I-P55T2 machines as well as another Tyan 440FX machine, all three with AMI WinBIOS (patch from TheCollector1995);
Added the Diamond Stealth 3D 3000 (S3 ViRGE/VX) graphics card (patch from TheCollector1995);
Added the PS/2 XT IDE (AccuLogic) HDD Controller (patch from TheCollector1995);
Added Microsoft/Logitech Bus Mouse emulation (patch from waltje);
Overhauled the makefiles (patch from waltje);
Added the Adaptec AHA-1542CF SCSI controller (patch from waltje);
Added preliminary (but still unfinished) Adaptec AHA-154x SCSI controller BIOS support (patch from waltje);
Added an ISABugger debugging device (patch from waltje);
Added sanity checks to the Direct3D code.
This commit is contained in:
OBattler
2017-05-05 01:49:42 +02:00
parent d07d53962c
commit f6ef1f833c
346 changed files with 24292 additions and 18058 deletions

View File

@@ -5,8 +5,6 @@
#include <string.h>
#include <assert.h>
// #include "crcspeed/crc64speed.h"
// #include "zlib.h"
#include "lzf/lzf.h"
#include "config.h"
@@ -22,7 +20,7 @@
#define CHUNK 16384
uint64_t poly = 0x42F0E1EBA9EA3693; /* ECMA normal */
uint64_t poly = 0x42F0E1EBA9EA3693ll; /* ECMA normal */
uint64_t table[256];
@@ -86,25 +84,45 @@ enum
/* 1 11 01 ??? */
STATE_0D_SPIN_TO_INDEX = 0xE8, /* FORMAT TRACK */
STATE_0D_FORMAT_TRACK
STATE_0D_FORMAT_TRACK,
/* 1 11 11 ??? */
STATE_0D_NOP_SPIN_TO_INDEX = 0xF8, /* FORMAT TRACK */
STATE_0D_NOP_FORMAT_TRACK
};
static uint16_t CRCTable[256];
typedef struct __attribute__((packed))
#ifdef __MSC__
# pragma pack(push,1)
typedef struct
#else
typedef struct __attribute__((__packed__))
#endif
{
uint8_t buffer[10];
uint32_t pos;
uint32_t len;
} sliding_buffer_t;
#ifdef __MSC__
# pragma pack(pop)
#endif
typedef struct __attribute__((packed))
#ifdef __MSC__
# pragma pack(push,1)
typedef struct
#else
typedef struct __attribute__((__packed__))
#endif
{
uint32_t sync_marks;
uint32_t bits_obtained;
uint32_t bytes_obtained;
uint32_t sync_pos;
} find_t;
#ifdef __MSC__
# pragma pack(pop)
#endif
uint8_t encoded_fm[64] = { 0xAA, 0xAB, 0xAE, 0xAF, 0xBA, 0xBB, 0xBE, 0xBF, 0xEA, 0xEB, 0xEE, 0xEF, 0xFA, 0xFB, 0xFE, 0xFF,
0xAA, 0xAB, 0xAE, 0xAF, 0xBA, 0xBB, 0xBE, 0xBF, 0xEA, 0xEB, 0xEE, 0xEF, 0xFA, 0xFB, 0xFE, 0xFF,
@@ -135,14 +153,22 @@ enum
FMT_SECTOR_GAP3,
FMT_POSTTRK_CHECK,
FMT_POSTTRK_GAP4,
FMT_POSTTRK_GAP4
};
typedef struct __attribute__((packed))
#ifdef __MSC__
# pragma pack(push,1)
typedef struct
#else
typedef struct __attribute__((__packed__))
#endif
{
unsigned nibble0 :4;
unsigned nibble1 :4;
} split_byte_t;
#ifdef __MSC__
# pragma pack(pop)
#endif
typedef union {
uint8_t byte;
@@ -160,7 +186,12 @@ typedef union {
Bits 10, 9 Zone type (3 = Commodore 64 zoned, 2 = Apple zoned, 1 = Pre-Apple zoned #2, 0 = Pre-Apple zoned #1)
Bit 11 Data and surface bits are stored in reverse byte endianness */
static struct __attribute__((packed))
#ifdef __MSC__
# pragma pack(push,1)
struct
#else
struct __attribute__((__packed__))
#endif
{
FILE *f;
uint16_t version;
@@ -198,11 +229,14 @@ static struct __attribute__((packed))
uint32_t error_condition;
int is_compressed;
int id_found;
uint8_t original_file_name[2048];
char original_file_name[2048];
uint8_t *filebuf;
uint8_t *outbuf;
uint32_t dma_over;
} d86f[FDD_NUM];
#ifdef __MSC__
# pragma pack(pop)
#endif
int d86f_do_log = 0;
@@ -475,7 +509,6 @@ int d86f_get_array_size(int drive, int side)
int array_size = 0;
int rm = 0;
int hole = 0;
int extra_bytes = 0;
rm = d86f_get_rpm_mode(drive);
hole = (d86f_handler[drive].disk_flags(drive) & 6) >> 1;
switch (hole)
@@ -833,7 +866,7 @@ void d86f_get_bit(int drive, int side)
uint32_t track_word;
uint32_t track_bit;
uint16_t encoded_data;
uint16_t surface_data;
uint16_t surface_data = 0;
uint16_t current_bit;
uint16_t surface_bit;
@@ -905,7 +938,7 @@ void d86f_put_bit(int drive, int side, int bit)
uint32_t track_word;
uint32_t track_bit;
uint16_t encoded_data;
uint16_t surface_data;
uint16_t surface_data = 0;
uint16_t current_bit;
uint16_t surface_bit;
@@ -1124,7 +1157,6 @@ void d86f_find_address_mark_mfm(int drive, int side, find_t *find, uint16_t req_
{
find->sync_marks++;
find->sync_pos = d86f[drive].track_pos;
// d86f_log("Sync marks: %i\n", find->sync_marks);
return;
}
@@ -1137,7 +1169,6 @@ void d86f_find_address_mark_mfm(int drive, int side, find_t *find, uint16_t req_
disc_calccrc(decodefm(drive, d86f[drive].last_word[side]), &(d86f[drive].calc_crc));
find->sync_marks = find->bits_obtained = find->bytes_obtained = 0;
find->sync_pos = 0xFFFFFFFF;
// d86f_log("AM found (%04X) (%02X)\n", req_am, d86f[drive].state);
d86f[drive].preceding_bit[side] = d86f[drive].last_word[side] & 1;
d86f[drive].state++;
return;
@@ -1160,7 +1191,6 @@ void d86f_find_address_mark_mfm(int drive, int side, find_t *find, uint16_t req_
else
{
/* Not skip mode, process the sector anyway. */
// d86f_log("Wrong AM found (%04X) (%02X)\n", other_am, d86f[drive].state);
fdc_set_wrong_am();
d86f[drive].preceding_bit[side] = d86f[drive].last_word[side] & 1;
d86f[drive].state++;
@@ -1212,8 +1242,6 @@ void d86f_write_find_address_mark_mfm(int drive, int side, find_t *find)
/* State 2: Read sector ID and CRC*/
void d86f_read_sector_id(int drive, int side, int match)
{
uint16_t temp;
if (d86f[drive].id_find.bits_obtained)
{
if (!(d86f[drive].id_find.bits_obtained & 15))
@@ -1264,12 +1292,10 @@ void d86f_read_sector_id(int drive, int side, int match)
else
{
/* CRC is valid. */
// d86f_log("Sector ID found: %08X; Requested: %08X\n", d86f[drive].last_sector.dword, d86f[drive].req_sector.dword);
d86f[drive].id_find.sync_marks = d86f[drive].id_find.bits_obtained = d86f[drive].id_find.bytes_obtained = 0;
d86f[drive].id_found++;
if ((d86f[drive].last_sector.dword == d86f[drive].req_sector.dword) || !match)
{
// d86f_log("ID read (%02X)\n", d86f[drive].state);
d86f_handler[drive].set_sector(drive, side, d86f[drive].last_sector.id.c, d86f[drive].last_sector.id.h, d86f[drive].last_sector.id.r, d86f[drive].last_sector.id.n);
if (d86f[drive].state == STATE_02_READ_ID)
{
@@ -1291,12 +1317,10 @@ void d86f_read_sector_id(int drive, int side, int match)
{
if (d86f[drive].last_sector.id.c == 0xFF)
{
// d86f_log("[State: %02X] [Side %i] Bad cylinder (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
d86f[drive].error_condition |= 8;
}
else
{
// d86f_log("[State: %02X] [Side %i] Wrong cylinder (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
d86f[drive].error_condition |= 0x10;
}
}
@@ -1372,7 +1396,6 @@ void d86f_read_sector_data(int drive, int side)
int data = 0;
int recv_data = 0;
int read_status = 0;
uint16_t temp;
uint32_t sector_len = d86f[drive].last_sector.id.n;
uint32_t crc_pos = 0;
sector_len = 1 << (7 + sector_len);
@@ -1402,7 +1425,6 @@ void d86f_read_sector_data(int drive, int side)
if (read_status == -1)
{
d86f[drive].dma_over++;
// d86f_log("DMA over now: %i\n", d86f[drive].dma_over);
}
}
}
@@ -1420,7 +1442,6 @@ void d86f_read_sector_data(int drive, int side)
/* We've got the data. */
if (d86f[drive].dma_over > 1)
{
// d86f_log("DMA overrun while reading data!\n");
d86f[drive].data_find.sync_marks = d86f[drive].data_find.bits_obtained = d86f[drive].data_find.bytes_obtained = 0;
d86f[drive].error_condition = 0;
d86f[drive].state = STATE_IDLE;
@@ -1432,10 +1453,6 @@ void d86f_read_sector_data(int drive, int side)
d86f[drive].data_find.bits_obtained++;
return;
}
else
{
// d86f_log("Bytes over DMA: %i\n", d86f[drive].dma_over);
}
if ((d86f[drive].calc_crc.word != d86f[drive].track_crc.word) && (d86f[drive].state != STATE_02_READ_DATA))
{
@@ -1448,7 +1465,6 @@ void d86f_read_sector_data(int drive, int side)
}
else if ((d86f[drive].calc_crc.word != d86f[drive].track_crc.word) && (d86f[drive].state == STATE_02_READ_DATA))
{
// printf("%04X != %04X (%08X)\n", d86f[drive].track_crc.word, d86f[drive].calc_crc.word, d86f[drive].last_sector.dword);
d86f[drive].data_find.sync_marks = d86f[drive].data_find.bits_obtained = d86f[drive].data_find.bytes_obtained = 0;
d86f[drive].error_condition |= 2; /* Mark that there was a data error. */
d86f[drive].state = STATE_IDLE;
@@ -1507,7 +1523,6 @@ void d86f_write_sector_data(int drive, int side, int mfm, uint16_t am)
{
/* We're in the data field of the sector, use a CRC byte. */
d86f[drive].current_byte[side] = d86f[drive].calc_crc.bytes[(d86f[drive].data_find.bytes_obtained & 1)];
// d86f_log("BO: %04X (%02X)\n", d86f[drive].data_find.bytes_obtained, d86f[drive].current_byte[side]);
}
d86f[drive].current_bit[side] = (15 - (d86f[drive].data_find.bits_obtained & 15)) >> 1;
@@ -1591,7 +1606,6 @@ void d86f_write_sector_data(int drive, int side, int mfm, uint16_t am)
{
if (d86f[drive].dma_over > 1)
{
// d86f_log("DMA overrun while writing data!\n");
d86f[drive].data_find.sync_marks = d86f[drive].data_find.bits_obtained = d86f[drive].data_find.bytes_obtained = 0;
d86f[drive].error_condition = 0;
d86f[drive].state = STATE_IDLE;
@@ -1628,7 +1642,6 @@ void d86f_advance_bit(int drive, int side)
if (d86f[drive].state != STATE_IDLE)
{
d86f[drive].index_count++;
// d86f_log("Index count now: %i\n", d86f[drive].index_count);
}
}
}
@@ -1650,7 +1663,7 @@ void d86f_spin_to_index(int drive, int side)
if (d86f[drive].track_pos == d86f_handler[drive].index_hole_pos(drive, side))
{
if (d86f[drive].state == STATE_0D_SPIN_TO_INDEX)
if ((d86f[drive].state == STATE_0D_SPIN_TO_INDEX) || (d86f[drive].state == STATE_0D_NOP_SPIN_TO_INDEX))
{
/* When starting format, reset format state to the beginning. */
d86f[drive].preceding_bit[side] = 1;
@@ -1664,12 +1677,11 @@ void d86f_spin_to_index(int drive, int side)
void d86f_write_direct_common(int drive, int side, uint16_t byte, uint8_t type, uint32_t pos)
{
uint16_t encoded_byte, mask_data, mask_surface, mask_hole, mask_fuzzy;
uint16_t encoded_byte = 0, mask_data, mask_surface, mask_hole, mask_fuzzy;
decoded_t dbyte, dpbyte;
dbyte.byte = byte;
dpbyte.byte = d86f[drive].preceding_bit[side];
d86f[drive].preceding_bit[side] = encoded_byte & 1;
if (type == 0)
{
@@ -1696,6 +1708,8 @@ void d86f_write_direct_common(int drive, int side, uint16_t byte, uint8_t type,
}
}
d86f[drive].preceding_bit[side] = encoded_byte & 1;
if (d86f_has_surface_desc(drive))
{
mask_data = d86f[drive].track_encoded_data[side][pos] ^= 0xFFFF;
@@ -1737,21 +1751,23 @@ void d86f_format_finish(int drive, int side, int mfm, uint16_t sc, uint16_t gap_
}
d86f[drive].state = STATE_IDLE;
d86f_handler[drive].writeback(drive);
// d86f_log("Format finished (%i) (%i)!\n", d86f[drive].track_pos, sc);
if (do_write)
{
d86f_handler[drive].writeback(drive);
}
d86f[drive].error_condition = 0;
d86f[drive].datac = 0;
fdc_sector_finishread();
}
void d86f_format_track(int drive, int side)
void d86f_format_track(int drive, int side, int do_write)
{
int data;
uint16_t max_len, temp, temp2;
uint16_t max_len;
int mfm;
uint16_t i = 0;
uint16_t j = 0;
uint16_t sc = 0;
uint16_t dtl = 0;
int gap_sizes[4] = { 0, 0, 0, 0 };
@@ -1764,7 +1780,6 @@ void d86f_format_track(int drive, int side)
uint16_t idam_fm = 0x7EF5;
uint16_t dataam_fm = 0x6FF5;
uint16_t gap_fill = 0x4E;
int do_write = 0;
mfm = d86f_is_mfm(drive);
am_len = mfm ? 4 : 1;
@@ -1776,7 +1791,6 @@ void d86f_format_track(int drive, int side)
sc = fdc_get_format_sectors();
dtl = 128 << fdc_get_format_n();
gap_fill = mfm ? 0x4E : 0xFF;
do_write = (d86f[drive].version == D86FVER);
switch(d86f[drive].format_state)
{
@@ -1789,6 +1803,7 @@ void d86f_format_track(int drive, int side)
if (do_write) d86f_write_direct(drive, side, gap_fill, 0);
break;
case FMT_SECTOR_ID_SYNC:
max_len = sync_len;
if (d86f[drive].datac <= 3)
{
data = fdc_getdata(0);
@@ -1801,11 +1816,9 @@ void d86f_format_track(int drive, int side)
data = 0;
}
d86f[drive].format_sector_id.byte_array[d86f[drive].datac] = data & 0xff;
// d86f_log("format_sector_id[%i] = %i\n", d86f[drive].datac, d86f[drive].format_sector_id.byte_array[d86f[drive].datac]);
if (d86f[drive].datac == 3)
{
fdc_stop_id_request();
// d86f_log("Formatting sector: %08X (%i) (%i)...\n", d86f[drive].format_sector_id.dword, d86f[drive].track_pos, sc);
}
}
case FMT_PRETRK_SYNC:
@@ -1890,15 +1903,17 @@ void d86f_format_track(int drive, int side)
max_len = gap_sizes[3];
if (do_write) d86f_write_direct(drive, side, gap_fill, 0);
break;
default:
max_len = 0;
break;
}
d86f[drive].datac++;
d86f_advance_word(drive, side);
if ((d86f[drive].index_count) && (d86f[drive].format_state < FMT_SECTOR_ID_SYNC) || (d86f[drive].format_state > FMT_SECTOR_GAP3))
if ((d86f[drive].index_count) && ((d86f[drive].format_state < FMT_SECTOR_ID_SYNC) || (d86f[drive].format_state > FMT_SECTOR_GAP3)))
{
// d86f_log("Format finished regularly\n");
d86f_format_finish(drive, side, mfm, sc, gap_fill, do_write);
return;
}
@@ -1920,7 +1935,6 @@ void d86f_format_track(int drive, int side)
case FMT_POSTTRK_CHECK:
if (d86f[drive].index_count)
{
// d86f_log("Format finished with delay\n");
d86f_format_finish(drive, side, mfm, sc, gap_fill, do_write);
return;
}
@@ -1942,6 +1956,16 @@ void d86f_format_track(int drive, int side)
}
}
void d86f_format_track_normal(int drive, int side)
{
d86f_format_track(drive, side, (d86f[drive].version == D86FVER));
}
void d86f_format_track_nop(int drive, int side)
{
d86f_format_track(drive, side, 0);
}
void d86f_poll(int drive)
{
int side = 0;
@@ -1980,6 +2004,7 @@ void d86f_poll(int drive)
{
case STATE_02_SPIN_TO_INDEX:
case STATE_0D_SPIN_TO_INDEX:
case STATE_0D_NOP_SPIN_TO_INDEX:
d86f_spin_to_index(drive, side);
return;
case STATE_02_FIND_ID:
@@ -2084,7 +2109,13 @@ void d86f_poll(int drive)
case STATE_0D_FORMAT_TRACK:
if (!(d86f[drive].track_pos & 15))
{
d86f_format_track(drive, side);
d86f_format_track_normal(drive, side);
}
return;
case STATE_0D_NOP_FORMAT_TRACK:
if (!(d86f[drive].track_pos & 15))
{
d86f_format_track_nop(drive, side);
}
return;
case STATE_IDLE:
@@ -2098,7 +2129,6 @@ void d86f_poll(int drive)
if (d86f_wrong_densel(drive) && (d86f[drive].state != STATE_IDLE))
{
// d86f_log("[State: %02X] [Side %i] No ID address mark (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
d86f[drive].state = STATE_IDLE;
fdc_noidam();
return;
@@ -2110,7 +2140,6 @@ void d86f_poll(int drive)
{
case STATE_0A_FIND_ID:
case STATE_SECTOR_NOT_FOUND:
// d86f_log("[State: %02X] [Side %i] No ID address mark (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
d86f[drive].state = STATE_IDLE;
fdc_noidam();
break;
@@ -2121,7 +2150,6 @@ void d86f_poll(int drive)
case STATE_05_FIND_DATA:
case STATE_09_FIND_DATA:
case STATE_0C_FIND_DATA:
// d86f_log("[State: %02X] [Side %i] No data address mark (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
d86f[drive].state = STATE_IDLE;
fdc_nodataam();
break;
@@ -2145,24 +2173,20 @@ void d86f_poll(int drive)
{
if ((d86f[drive].error_condition & 0x18) == 0x08)
{
// d86f_log("[State: %02X] [Side %i] Bad cylinder (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
fdc_badcylinder();
}
if ((d86f[drive].error_condition & 0x10) == 0x10)
{
// d86f_log("[State: %02X] [Side %i] Wrong cylinder (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
fdc_wrongcylinder();
}
}
else
{
// d86f_log("[State: %02X] [Side %i] Sector not found (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
fdc_nosector();
}
}
else
{
// d86f_log("[State: %02X] [Side %i] No ID address mark (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
fdc_noidam();
}
break;
@@ -2245,7 +2269,7 @@ uint16_t d86f_prepare_pretrack(int drive, int side, int iso)
d86f_write_direct_common(drive, side, mfm ? iam_mfm : iam_fm, 1, pos);
pos = (pos + 1) % raw_size;
}
for (i = 0; i < real_gap0_len; i++)
for (i = 0; i < real_gap1_len; i++)
{
d86f_write_direct_common(drive, side, gap_fill, 0, pos);
pos = (pos + 1) % raw_size;
@@ -2427,7 +2451,6 @@ void d86f_decompose_encoded_buffer(int drive, int side)
uint16_t temp, temp2;
uint32_t len;
uint16_t *dst = d86f[drive].track_encoded_data[side];
uint16_t *dst_s = d86f[drive].track_surface_data[side];
uint16_t *src1 = d86f[drive].thin_track_encoded_data[0][side];
uint16_t *src1_s = d86f[drive].thin_track_surface_data[0][side];
uint16_t *src2 = d86f[drive].thin_track_encoded_data[1][side];
@@ -2538,7 +2561,6 @@ void d86f_read_track(int drive, int track, int thin_track, int side, uint16_t *d
void d86f_seek(int drive, int track)
{
uint8_t track_id = track;
int sides;
int side, thin_track;
sides = d86f_get_sides(drive);
@@ -2597,8 +2619,6 @@ void d86f_seek(int drive, int track)
void d86f_write_track(int drive, int side, uint16_t *da0, uint16_t *sa0)
{
// d86f_log("Pos: %08X\n", ftell(d86f[drive].f));
fwrite(&(d86f[drive].side_flags[side]), 1, 2, d86f[drive].f);
if (d86f_has_extra_bit_cells(drive))
@@ -2614,8 +2634,6 @@ void d86f_write_track(int drive, int side, uint16_t *da0, uint16_t *sa0)
}
fwrite(da0, 1, d86f_get_array_size(drive, side) << 1, d86f[drive].f);
// d86f_log("Pos: %08X\n", ftell(d86f[drive].f));
}
int d86f_get_track_table_size(int drive)
@@ -2632,16 +2650,12 @@ int d86f_get_track_table_size(int drive)
void d86f_writeback(int drive)
{
uint8_t track_id = d86f[drive].cur_track;
uint8_t header[32];
int sides, header_size;
int side, thin_track;
// uint64_t crc64;
uint32_t len;
int i = 0;
int ret = 0;
int logical_track = 0;
uint8_t tempb;
FILE *cf;
sides = d86f_get_sides(drive);
header_size = d86f_header_size(drive);
@@ -2656,9 +2670,7 @@ void d86f_writeback(int drive)
fread(header, 1, header_size, d86f[drive].f);
fseek(d86f[drive].f, 8, SEEK_SET);
// d86f_log("PosEx: %08X\n", ftell(d86f[drive].f));
fwrite(d86f[drive].track_offset, 1, d86f_get_track_table_size(drive), d86f[drive].f);
// d86f_log("PosEx: %08X\n", ftell(d86f[drive].f));
if (!fdd_doublestep_40(drive))
{
@@ -2698,15 +2710,12 @@ void d86f_writeback(int drive)
}
if (d86f[drive].track_offset[logical_track])
{
// d86f_log("Writing track...\n");
fseek(d86f[drive].f, d86f[drive].track_offset[logical_track], SEEK_SET);
d86f_write_track(drive, side, d86f[drive].track_encoded_data[side], d86f[drive].track_surface_data[side]);
}
}
}
// d86f_log("Position: %08X\n", ftell(d86f[drive].f));
if (d86f[drive].is_compressed)
{
/* The image is compressed. */
@@ -2729,7 +2738,6 @@ void d86f_writeback(int drive)
fread(d86f[drive].filebuf, 1, len, d86f[drive].f);
ret = lzf_compress(d86f[drive].filebuf, len, d86f[drive].outbuf, len - 1);
// ret = d86f_zlib(cf, d86f[drive].f, 0);
if (!ret)
{
d86f_log("86F: Error compressing file\n");
@@ -2738,58 +2746,7 @@ void d86f_writeback(int drive)
fwrite(d86f[drive].outbuf, 1, ret, cf);
free(d86f[drive].outbuf);
free(d86f[drive].filebuf);
#ifdef DO_CRC64
len = ftell(cf);
fclose(cf);
cf = fopen(d86f[drive].original_file_name, "rb+");
crc64 = 0xffffffffffffffff;
fseek(cf, 8, SEEK_SET);
fwrite(&crc64, 1, 8, cf);
fseek(cf, 0, SEEK_SET);
d86f[drive].filebuf = (uint8_t *) malloc(len);
fread(d86f[drive].filebuf, 1, len, cf);
*(uint64_t *) &(d86f[drive].filebuf[8]) = 0xffffffffffffffff;
crc64 = (uint64_t) crc64speed(0, d86f[drive].filebuf, len);
free(d86f[drive].filebuf);
fseek(cf, 8, SEEK_SET);
fwrite(&crc64, 1, 8, cf);
/* Close the original file. */
fclose(cf);
#endif
}
#ifdef DO_CRC64
else
{
fseek(d86f[drive].f, 0, SEEK_END);
len = ftell(d86f[drive].f);
fseek(d86f[drive].f, 0, SEEK_SET);
crc64 = 0xffffffffffffffff;
fseek(d86f[drive].f, 8, SEEK_SET);
fwrite(&crc64, 1, 8, d86f[drive].f);
fseek(d86f[drive].f, 0, SEEK_SET);
d86f[drive].filebuf = (uint8_t *) malloc(len);
fread(d86f[drive].filebuf, 1, len, d86f[drive].f);
*(uint64_t *) &(d86f[drive].filebuf[8]) = 0xffffffffffffffff;
crc64 = (uint64_t) crc64speed(0, d86f[drive].filebuf, len);
free(d86f[drive].filebuf);
fseek(d86f[drive].f, 8, SEEK_SET);
fwrite(&crc64, 1, 8, d86f[drive].f);
}
#endif
// d86f_log("d86f_writeback(): %08X\n", d86f[drive].track_offset[track]);
}
void d86f_stop(int drive)
@@ -2819,7 +2776,6 @@ int d86f_common_command(int drive, int sector, int track, int side, int rate, in
if (fdd_get_head(drive) && (d86f_get_sides(drive) == 1))
{
// d86f_log("Wrong side!\n");
fdc_noidam();
d86f[drive].state = STATE_IDLE;
d86f[drive].index_count = 0;
@@ -2880,11 +2836,8 @@ void d86f_comparesector(int drive, int sector, int track, int side, int rate, in
void d86f_readaddress(int drive, int side, int rate)
{
// d86f_log("Reading sector ID on drive %i...\n", drive);
if (fdd_get_head(drive) && (d86f_get_sides(drive) == 1))
{
// d86f_log("Trying to access the second side of a single-sided disk\n");
fdc_noidam();
d86f[drive].state = STATE_IDLE;
d86f[drive].index_count = 0;
@@ -2952,7 +2905,7 @@ void d86f_common_format(int drive, int side, int rate, uint8_t fill, int proxy)
return;
}
if ((side && (d86f_get_sides(drive) == 1)) || !(d86f_can_format(drive)))
if (!(d86f_can_format(drive)))
{
fdc_cannotformat();
d86f[drive].state = STATE_IDLE;
@@ -2960,49 +2913,48 @@ void d86f_common_format(int drive, int side, int rate, uint8_t fill, int proxy)
return;
}
if (!proxy)
if (!side || (d86f_get_sides(drive) == 2))
{
d86f_reset_index_hole_pos(drive, side);
if (d86f[drive].cur_track > 256)
if (!proxy)
{
// d86f_log("Track above 256\n");
fdc_writeprotect();
d86f[drive].state = STATE_IDLE;
d86f[drive].index_count = 0;
return;
}
d86f_reset_index_hole_pos(drive, side);
array_size = d86f_get_array_size(drive, side);
if (d86f_has_surface_desc(drive))
{
/* Preserve the physical holes but get rid of the fuzzy bytes. */
for (i = 0; i < array_size; i++)
if (d86f[drive].cur_track > 256)
{
temp = d86f[drive].track_encoded_data[side][i] ^ 0xffff;
temp2 = d86f[drive].track_surface_data[side][i];
temp &= temp2;
d86f[drive].track_surface_data[side][i] = temp;
fdc_writeprotect();
d86f[drive].state = STATE_IDLE;
d86f[drive].index_count = 0;
return;
}
array_size = d86f_get_array_size(drive, side);
if (d86f_has_surface_desc(drive))
{
/* Preserve the physical holes but get rid of the fuzzy bytes. */
for (i = 0; i < array_size; i++)
{
temp = d86f[drive].track_encoded_data[side][i] ^ 0xffff;
temp2 = d86f[drive].track_surface_data[side][i];
temp &= temp2;
d86f[drive].track_surface_data[side][i] = temp;
}
}
/* Zero the data buffer. */
memset(d86f[drive].track_encoded_data[side], 0, array_size << 1);
d86f_add_track(drive, d86f[drive].cur_track, side);
if (!fdd_doublestep_40(drive))
{
d86f_add_track(drive, d86f[drive].cur_track + 1, side);
}
}
/* Zero the data buffer. */
memset(d86f[drive].track_encoded_data[side], 0, array_size << 1);
d86f_add_track(drive, d86f[drive].cur_track, side);
if (!fdd_doublestep_40(drive))
{
d86f_add_track(drive, d86f[drive].cur_track + 1, side);
}
}
// d86f_log("Formatting track %i side %i\n", track, side);
d86f[drive].fill = fill;
if (!proxy)
{
// d86f[drive].side_flags[side] &= 0xc0;
d86f[drive].side_flags[side] = 0;
d86f[drive].side_flags[side] |= (fdd_getrpm(real_drive(drive)) == 360) ? 0x20 : 0;
d86f[drive].side_flags[side] |= fdc_get_bit_rate();
@@ -3016,7 +2968,14 @@ void d86f_common_format(int drive, int side, int rate, uint8_t fill, int proxy)
d86f[drive].index_count = d86f[drive].error_condition = d86f[drive].satisfying_bytes = d86f[drive].sector_count = 0;
d86f[drive].dma_over = 0;
d86f[drive].state = STATE_0D_SPIN_TO_INDEX;
if (!side || (d86f_get_sides(drive) == 2))
{
d86f[drive].state = STATE_0D_SPIN_TO_INDEX;
}
else
{
d86f[drive].state = STATE_0D_NOP_SPIN_TO_INDEX;
}
}
void d86f_proxy_format(int drive, int side, int rate, uint8_t fill)
@@ -3046,12 +3005,8 @@ void d86f_load(int drive, char *fn)
{
uint32_t magic = 0;
uint32_t len = 0;
uint32_t len2 = 0;
uint8_t temp_file_name[2048];
char temp_file_name[2048];
uint16_t temp = 0;
uint8_t tempb = 0;
// uint64_t crc64 = 0;
// uint64_t read_crc64 = 0;
int i = 0;
FILE *tf;
@@ -3173,8 +3128,6 @@ void d86f_load(int drive, char *fn)
fread(&temp, 1, 2, tf);
fwrite(&temp, 1, 2, d86f[drive].f);
}
// temp = d86f_zlib(d86f[drive].f, tf, 1);
d86f[drive].filebuf = (uint8_t *) malloc(len);
d86f[drive].outbuf = (uint8_t *) malloc(67108864);
@@ -3328,19 +3281,15 @@ void d86f_load(int drive, char *fn)
void d86f_init()
{
disc_random_init();
memset(d86f, 0, sizeof(d86f));
d86f_setupcrc(0x1021);
// crc64speed_init();
d86f[0].state = d86f[1].state = STATE_IDLE;
}
void d86f_close(int drive)
{
uint8_t temp_file_name[2048];
char temp_file_name[2048];
append_filename(temp_file_name, pcempath, drive ? "TEMP$$$1.$$$" : "TEMP$$$0.$$$", 511);
memcpy(temp_file_name, drive ? "TEMP$$$1.$$$" : "TEMP$$$0.$$$", 13);