Skip to content

Commit

Permalink
Fixed FDS emulation and improved auto insert algorithm.
Browse files Browse the repository at this point in the history
  • Loading branch information
punesemu committed Dec 10, 2023
1 parent 30170cb commit fe10203
Show file tree
Hide file tree
Showing 6 changed files with 122 additions and 453 deletions.
17 changes: 8 additions & 9 deletions src/core/cpu_inline.h
Original file line number Diff line number Diff line change
Expand Up @@ -639,19 +639,19 @@ INLINE static BYTE fds_rd_mem(BYTE nidx, WORD address, BYTE made_tick) {
// bit 0 (timer irq)
nes[nidx].c.cpu.openbus |= fds.drive.irq_timer_high;
// bit 1 (trasfer flag)
nes[nidx].c.cpu.openbus |= fds.drive.irq_disk_high;
nes[nidx].c.cpu.openbus |= fds.drive.transfer_flag;
// bit 2 e 3 non settati
// TODO : bit 4 (CRC control : 0 passato, 1 errore)
// bit 5 non settato
// TODO : bit 6 (end of head)
nes[nidx].c.cpu.openbus |= fds.drive.end_of_head;
//fds.drive.end_of_head = FALSE;
// TODO : bit 7 (disk data read/write enable (1 when disk is readable/writable)
fds.drive.transfer_flag = FALSE;
// devo disabilitare sia il timer IRQ ...
fds.drive.irq_timer_high = FALSE;
nes[nidx].c.irq.high &= ~FDS_TIMER_IRQ;
// che il disk IRQ
fds.drive.irq_disk_high = FALSE;
nes[nidx].c.irq.high &= ~FDS_DISK_IRQ;
#if !defined (RELEASE)
//printf("0x%04X 0x%02X %d\n", address, nes[nidx].c.cpu.openbus, nes[nidx].c.irq.high);
Expand All @@ -665,8 +665,8 @@ INLINE static BYTE fds_rd_mem(BYTE nidx, WORD address, BYTE made_tick) {
// fds.info.sides[fds.drive.side_inserted].data[fds.drive.disk_position], nes[nidx].c.cpu.opcode_PC,
// fds.drive.disk_position, nes[nidx].c.irq.high);
#endif
fds.drive.transfer_flag = FALSE;
// devo disabilitare il disk IRQ
fds.drive.irq_disk_high = FALSE;
nes[nidx].c.irq.high &= ~FDS_DISK_IRQ;
return (TRUE);
}
Expand Down Expand Up @@ -1875,7 +1875,7 @@ INLINE static BYTE fds_wr_mem(BYTE nidx, WORD address, BYTE value) {
}
if (address == 0x4024) {
fds.drive.data_to_write = value;
fds.drive.irq_disk_high = FALSE;
fds.drive.transfer_flag = FALSE;
nes[nidx].c.irq.high &= ~FDS_DISK_IRQ;
return (TRUE);
}
Expand Down Expand Up @@ -1914,10 +1914,10 @@ INLINE static BYTE fds_wr_mem(BYTE nidx, WORD address, BYTE value) {
fds.drive.motor_on = value & 0x01;
fds.drive.transfer_reset = value & 0x02;

// TODO : penso che sia corretto
if (fds.drive.read_mode != (value & 0x04)) {
fds.drive.gap_ended = FALSE;
}
// TODO : penso che sia corretto
// if (fds.drive.read_mode != (value & 0x04)) {
// fds.drive.gap_ended = FALSE;
// }
fds.drive.read_mode = value & 0x04;
fds.drive.mirroring = value & 0x08;
if (fds.drive.mirroring) {
Expand All @@ -1930,7 +1930,6 @@ INLINE static BYTE fds_wr_mem(BYTE nidx, WORD address, BYTE value) {
fds.drive.drive_ready = value & 0x40;
fds.drive.irq_disk_enabled = value & 0x80;

fds.drive.irq_disk_high = FALSE;
nes[nidx].c.irq.high &= ~FDS_DISK_IRQ;
return (TRUE);
}
Expand Down
11 changes: 10 additions & 1 deletion src/core/fds.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
#include "../../c++/crc/crc.h"

#define BIOSFILE "disksys.rom"
#define DIFFVERSION 1
#define DIFFVERSION 2

typedef struct _fds_sinfo {
struct _fds_side_block1 {
Expand Down Expand Up @@ -369,6 +369,7 @@ void fds_disk_op(WORD type, BYTE side_to_insert, BYTE quiet) {
fds.drive.disk_position = 0;
fds.drive.gap_ended = FALSE;
fds.drive.disk_ejected = FALSE;
fds.drive.at_least_one_scan = FALSE;
fds.auto_insert.r4032.frames = 0;
fds.auto_insert.r4032.checks = 0;
if (!quiet) {
Expand Down Expand Up @@ -417,6 +418,7 @@ void fds_disk_op(WORD type, BYTE side_to_insert, BYTE quiet) {
void fds_diff_op(BYTE side, BYTE mode, uint32_t position, WORD value) {
if (!fds.info.diff) {
uTCHAR file[LENGTH_FILE_NAME_LONG];
uint32_t version = 0;

fds_diff_file_name(&file[0], usizeof(file));
fds.info.diff = ufopen(file, uL("r+b"));
Expand All @@ -430,6 +432,13 @@ void fds_diff_op(BYTE side, BYTE mode, uint32_t position, WORD value) {
fds.info.diff = ufopen(file, uL("r+b"));
}
}
if (fds.info.diff) {
// leggo la versione del file
if ((fread(&version, sizeof(uint32_t), 1, fds.info.diff) < 1) || (version < DIFFVERSION)) {
fclose(fds.info.diff);
fds.info.diff = ufopen(file, uL("w+b"));
}
}
}

if (!fds.info.diff) {
Expand Down
11 changes: 7 additions & 4 deletions src/core/fds.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ enum fds_gaps {
// 1016 bit di gap alla fine di ogni blocco.
// Note : con 976 funziona correttamente la read del disco ma non e'
// sufficiente per la write.
FDS_GAP_BLOCK = 1016 / 8,
//FDS_GAP_BLOCK = 1016 / 8, //976 / 8,
FDS_GAP_BLOCK = 976 / 8,
FDS_GAP_END = 0
};
enum fds_block_type {
Expand All @@ -51,12 +52,14 @@ enum fds_block_type {
DISK_QD_SIDE_SIZE = 65536
};
enum fds_misc {
//FDS_8BIT_DELAY = 149, //20 * 8,
FDS_8BIT_DELAY = 22 * 8,
FDS_DISK_GAP = 0x0100,
FDS_DISK_BLOCK_MARK = 0x0180,
FDS_DISK_CRC_CHAR1 = 0x0155,
FDS_DISK_CRC_CHAR2 = 0x01AA,
FDS_OP_SIDE_DELAY = 2500000,
FDS_AUTOINSERT_OP_SIDE_DELAY = 1200000,
FDS_OP_SIDE_DELAY = 2800000,
FDS_AUTOINSERT_OP_SIDE_DELAY = 100,
FDS_AUTOINSERT_R4032_MAX_CHECKS = 150
};

Expand Down Expand Up @@ -119,7 +122,7 @@ typedef struct _fds {
BYTE unknow;
BYTE drive_ready;
BYTE irq_disk_enabled;
BYTE irq_disk_high;
BYTE at_least_one_scan;
BYTE irq_timer_enabled;
BYTE irq_timer_reload_enabled;
BYTE irq_timer_high;
Expand Down
Loading

0 comments on commit fe10203

Please sign in to comment.