diff --git a/src/disc.c b/src/disc.c index c14621d59..0a9d07882 100644 --- a/src/disc.c +++ b/src/disc.c @@ -37,7 +37,7 @@ int drive_empty[2] = {1, 1}; int disc_changed[2]; int motorspin; -int motoron; +int64_t motoron; int fdc_indexcount = 52; diff --git a/src/disc.h b/src/disc.h index bc134d559..2d49d2401 100644 --- a/src/disc.h +++ b/src/disc.h @@ -57,7 +57,7 @@ extern int fdc_ready; extern int fdc_indexcount;*/ extern int motorspin; -extern int motoron; +extern int64_t motoron; extern int swwp; extern int disable_write; diff --git a/src/disc_sector_86box.c b/src/disc_sector_86box.c index b52c954f2..9ad06abd2 100644 --- a/src/disc_sector_86box.c +++ b/src/disc_sector_86box.c @@ -319,11 +319,27 @@ int disc_sector_match(int drive) temp = (disc_sector_track[drive] == last_sector[drive]->c); temp = temp && (disc_sector_side[drive] == last_sector[drive]->h); temp = temp && (disc_sector_sector[drive] == last_sector[drive]->r); + temp = temp && (disc_sector_n[drive] == last_sector[drive]->n); + return temp; +} + +uint32_t disc_sector_get_data_len(int drive) +{ if (disc_sector_n[drive]) { - temp = temp && (disc_sector_n[drive] == last_sector[drive]->n); + return (128 << ((uint32_t) disc_sector_n[drive])); + } + else + { + if (fdc_get_dtl() < 128) + { + return fdc_get_dtl(); + } + else + { + return (128 << ((uint32_t) disc_sector_n[drive])); + } } - return temp; } int disc_sector_can_read_address(int drive) @@ -365,7 +381,7 @@ int disc_sector_read_state(int drive) return temp; } -int id_pos = 0; +int section_pos[2] = {0, 0}; typedef union { @@ -385,6 +401,8 @@ void disc_sector_poll() int b = 0; int cur_id_pos = 0; + int cur_data_pos = 0; + int cur_gap3_pos = 0; uint8_t track_byte = 0; uint8_t track_index = 0; @@ -442,7 +460,7 @@ void disc_sector_poll() // pclog("Index hole hit again, format finished\n"); disc_sector_state[drive] = STATE_IDLE; if (!disable_write) disc_sector_writeback[drive](drive, disc_sector_track[drive]); - fdc_finishread(drive); + fdc_sector_finishread(drive); } if ((disc_sector_state[drive] == STATE_FORMAT_FIND) && disc_sector_can_read_address(drive)) { @@ -455,7 +473,7 @@ void disc_sector_poll() { case BYTE_ID_SYNC: if (disc_sector_state[drive] != STATE_FORMAT) break; - cur_id_pos = cur_track_pos[drive] - id_pos; + cur_id_pos = cur_track_pos[drive] - section_pos[drive]; if (cur_id_pos > 3) break; data = fdc_getdata(0); if ((data == -1) && (cur_id_pos < 3)) @@ -477,6 +495,7 @@ void disc_sector_poll() } break; case BYTE_DATA: + cur_data_pos = cur_track_pos[drive] - section_pos[drive]; if (disc_sector_read_state(drive) && (last_sector[drive] != NULL)) { if (fdc_data(last_sector[drive]->data[data_counter[drive]])) @@ -492,7 +511,7 @@ void disc_sector_poll() } if ((disc_sector_state[drive] == STATE_WRITE_SECTOR) && (last_sector[drive] != NULL)) { - data = fdc_getdata(cur_byte[drive] == ((128 << ((uint32_t) last_sector[drive]->n)) - 1)); + data = fdc_getdata(data_counter[drive] == ((128 << ((uint32_t) last_sector[drive]->n)) - 1)); if (data == -1) { /* Data failed to be sent from the FDC, abort. */ @@ -517,23 +536,22 @@ void disc_sector_poll() else { data_counter[drive] %= (128 << ((uint32_t) last_sector[drive]->n)); - if (!data_counter[drive]) + } + break; + case BYTE_GAP3: + cur_gap3_pos = cur_track_pos[drive] - section_pos[drive]; + if (cur_gap3_pos == (fdc_get_gap() - 1)) + { + if (disc_sector_read_state(drive) && (last_sector[drive] != NULL)) { - if (disc_sector_read_state(drive) && (last_sector[drive] != NULL)) - { - disc_sector_state[drive] = STATE_IDLE; - fdc_finishread(drive); - } - if ((disc_sector_state[drive] == STATE_WRITE_SECTOR) && (last_sector[drive] != NULL)) - { - disc_sector_state[drive] = STATE_IDLE; - if (!disable_write) disc_sector_writeback[drive](drive, disc_sector_track[drive]); - fdc_finishread(drive); - } - /* if (disc_sector_state[drive] == STATE_FORMAT && (last_sector[drive] != NULL)) - { - // pclog("Format: Sector fill finished\n"); - } */ + disc_sector_state[drive] = STATE_IDLE; + fdc_sector_finishread(drive); + } + if ((disc_sector_state[drive] == STATE_WRITE_SECTOR) && (last_sector[drive] != NULL)) + { + disc_sector_state[drive] = STATE_IDLE; + if (!disable_write) disc_sector_writeback[drive](drive, disc_sector_track[drive]); + fdc_sector_finishread(drive); } } break; @@ -573,10 +591,10 @@ void disc_sector_poll() if (track_byte != old_track_byte) { // if (disc_sector_state[drive] == STATE_FORMAT) pclog("Track byte: %02X, old: %02X\n", track_byte, old_track_byte); + section_pos[drive] = cur_track_pos[drive]; switch(track_byte) { case BYTE_ID_SYNC: - id_pos = cur_track_pos[drive]; if (disc_sector_state[drive] == STATE_FORMAT) { // pclog("Requesting next sector ID...\n"); @@ -611,7 +629,7 @@ void disc_sector_poll() } break; case BYTE_DATA: - data_counter[drive] = 0; + // data_counter[drive] = 0; switch (disc_sector_state[drive]) { case STATE_READ_FIND_SECTOR: diff --git a/src/fdc.c b/src/fdc.c index 02bea306c..ce6b92316 100644 --- a/src/fdc.c +++ b/src/fdc.c @@ -12,7 +12,7 @@ #include "pic.h" #include "timer.h" -extern int motoron; +extern int64_t motoron; static int fdc_reset_stat = 0; /*FDC*/ @@ -101,6 +101,32 @@ void fdc_reset() int ins; +int fdc_get_bitcell_period(); + +double fdc_get_hut() +{ + int hut = (fdc.specify[0] & 0xF); + double dusec; + double bcp = ((double) fdc_get_bitcell_period()) / 250.0; + double dhut = (double) hut; + if (fdc_get_bitcell_period() == 3333) bcp = 160.0 / 6.0; + if (hut == 0) dhut = 16.0; + dusec = (double) TIMER_USEC; + return (bcp * dhut * dusec * 1000.0); +} + +double fdc_get_hlt() +{ + int hlt = (fdc.specify[1] >> 1); + double dusec; + double bcp = ((double) fdc_get_bitcell_period()) / 2000.0; + double dhlt = (double) hlt; + if (fdc_get_bitcell_period() == 3333) bcp = 20.0 / 6.0; + if (hlt == 0) dhlt = 256.0; + dusec = (double) TIMER_USEC; + return (bcp * dhlt * dusec * 1000.0); +} + void fdc_request_next_sector_id() { if (fdc.pcjr || !fdc.dma) @@ -613,13 +639,13 @@ bad_command: fdc.stat=0x30; discint=fdc.command&0x1F; timer_process(); - disctime = 1024 * (1 << TIMER_SHIFT); + disctime = 1024 * (1 << TIMER_SHIFT); timer_update_outstanding(); // fdc.drive = fdc.params[0] & 3; disc_drivesel = fdc.drive & 1; fdc_reset_stat = 0; disc_set_drivesel(fdc.drive & 1); - switch (discint) + switch (discint & 0x1F) { case 2: /*Read a track*/ fdc_rate(fdc.drive); @@ -639,10 +665,10 @@ bad_command: } fdc.rw_track = fdc.params[1]; // pclog("Read a track track=%i head=%i sector=%i eot=%i\n", fdc.track[fdc.drive], fdc.head, fdc.sector, fdc.eot[fdc.drive]); - disc_readsector(fdc.drive, SECTOR_FIRST, fdc.params[1], fdc.head, fdc.rate, fdc.params[4]); - disctime = 0; - readflash = 1; - fdc.inread = 1; + disc_readsector(fdc.drive, SECTOR_FIRST, fdc.params[1], fdc.head, fdc.rate, fdc.params[4]); + disctime = 0; + readflash = 1; + fdc.inread = 1; break; case 3: /*Specify*/ @@ -669,16 +695,15 @@ bad_command: fdc.track[fdc.drive] = fdc.params[1]; } } - fdc.rw_track = fdc.params[1]; - - disc_writesector(fdc.drive, fdc.sector, fdc.params[1], fdc.head, fdc.rate, fdc.params[4]); - disctime = 0; - fdc.written = 0; - readflash = 1; - fdc.pos = 0; - if (fdc.pcjr) - fdc.stat = 0xb0; -// ioc_fiq(IOC_FIQ_DISC_DATA); + fdc.rw_track = fdc.params[1]; + disc_writesector(fdc.drive, fdc.sector, fdc.params[1], fdc.head, fdc.rate, fdc.params[4]); + disctime = 0; + fdc.written = 0; + readflash = 1; + fdc.pos = 0; + if (fdc.pcjr) + fdc.stat = 0xb0; + // ioc_fiq(IOC_FIQ_DISC_DATA); break; case 6: /*Read data*/ @@ -698,11 +723,10 @@ bad_command: } } fdc.rw_track = fdc.params[1]; - - disc_readsector(fdc.drive, fdc.sector, fdc.params[1], fdc.head, fdc.rate, fdc.params[4]); - disctime = 0; - readflash = 1; - fdc.inread = 1; + disc_readsector(fdc.drive, fdc.sector, fdc.params[1], fdc.head, fdc.rate, fdc.params[4]); + disctime = 0; + readflash = 1; + fdc.inread = 1; break; case 7: /*Recalibrate*/ @@ -758,7 +782,7 @@ bad_command: fdc.head = (fdc.params[0] & 4) ? 1 : 0; fdd_set_head(fdc.drive, (fdc.params[0] & 4) ? 1 : 0); if (((fdc.drive ^ fdd_swap) != 1) || fdc.drv2en) - disc_readaddress(fdc.drive, fdc.track[fdc.drive], fdc.head, fdc.rate); + disc_readaddress(fdc.drive, fdc.track[fdc.drive], fdc.head, fdc.rate); else fdc_notfound(); break; @@ -1310,6 +1334,13 @@ void fdc_finishread() // rpclog("fdc_finishread\n"); } +void fdc_sector_finishread() +{ + fdc.inread = 0; + fdc_callback(); +// rpclog("fdc_finishread\n"); +} + void fdc_notfound() { disctime = 0; diff --git a/src/ibm.h b/src/ibm.h index e1c733ce4..acd26f6bc 100644 --- a/src/ibm.h +++ b/src/ibm.h @@ -242,9 +242,9 @@ typedef struct PIT int rereadlatch[3]; int gate[3]; int out[3]; - int running[3]; - int enabled[3]; - int newcount[3]; + int64_t running[3]; + int64_t enabled[3]; + int64_t newcount[3]; int count[3]; int using_timer[3]; int initial[3]; diff --git a/src/sound_ad1848.h b/src/sound_ad1848.h index 1647409b7..9c9ae5e56 100644 --- a/src/sound_ad1848.h +++ b/src/sound_ad1848.h @@ -16,7 +16,7 @@ typedef struct ad1848_t int16_t out_l, out_r; - int enable; + int64_t enable; int irq, dma; diff --git a/src/sound_opl.h b/src/sound_opl.h index 9e9aa2237..e99f716f9 100644 --- a/src/sound_opl.h +++ b/src/sound_opl.h @@ -6,7 +6,7 @@ typedef struct opl_t int chip_nr[2]; int64_t timers[2][2]; - int timers_enable[2][2]; + int64_t timers_enable[2][2]; int16_t filtbuf[2]; diff --git a/src/sound_pas16.c b/src/sound_pas16.c index d9c6123e7..14366eb88 100644 --- a/src/sound_pas16.c +++ b/src/sound_pas16.c @@ -131,7 +131,7 @@ typedef struct pas16_t int thit[3]; int delay[3]; int rereadlatch[3]; - int enable[3]; + int64_t enable[3]; } pit; opl_t opl; diff --git a/src/sound_pssj.c b/src/sound_pssj.c index 62ac65e5a..dda285291 100644 --- a/src/sound_pssj.c +++ b/src/sound_pssj.c @@ -26,7 +26,7 @@ typedef struct pssj_t int irq; int64_t timer_count; - int enable; + int64_t enable; int wave_pos; int pulse_width; diff --git a/src/sound_sb_dsp.h b/src/sound_sb_dsp.h index 03a188ee5..2dae20442 100644 --- a/src/sound_sb_dsp.h +++ b/src/sound_sb_dsp.h @@ -46,7 +46,7 @@ typedef struct sb_dsp_t uint8_t sb_asp_regs[256]; - int sbenable, sb_enable_i; + int64_t sbenable, sb_enable_i; int64_t sbcount, sb_count_i; diff --git a/src/timer.c b/src/timer.c index de7f1c68c..92686e906 100644 --- a/src/timer.c +++ b/src/timer.c @@ -20,12 +20,12 @@ static struct int present; void (*callback)(void *priv); void *priv; - int *enable; + int64_t *enable; int64_t *count; } timers[TIMERS_MAX]; int timers_present = 0; -int timer_one = 1; +int64_t timer_one = 1; int64_t timer_count = 0, timer_latch = 0; int64_t timer_start = 0; @@ -99,7 +99,7 @@ void timer_reset() // timer_process(); } -int timer_add(void (*callback)(void *priv), int64_t *count, int *enable, void *priv) +int timer_add(void (*callback)(void *priv), int64_t *count, int64_t *enable, void *priv) { if (timers_present < TIMERS_MAX) { diff --git a/src/timer.h b/src/timer.h index 2ca36ebfa..eb19633ce 100644 --- a/src/timer.h +++ b/src/timer.h @@ -46,13 +46,13 @@ extern int64_t timer_start; void timer_process(); void timer_update_outstanding(); void timer_reset(); -int timer_add(void (*callback)(void *priv), int64_t *count, int *enable, void *priv); +int timer_add(void (*callback)(void *priv), int64_t *count, int64_t *enable, void *priv); void timer_set_callback(int timer, void (*callback)(void *priv)); #define TIMER_ALWAYS_ENABLED &timer_one extern int64_t timer_count; -extern int timer_one; +extern int64_t timer_one; #define TIMER_SHIFT 6