Changes to significantly reduce the emulator's RAM footprint.
Changes to the memory manager reduced by 120MB for machines with CPU < 80386. Changes to the 86F diskette data processor (required by all floppy controllers) reduced by 330M. Test machine OpenXT now runs at 240MB, instead of 680MB.
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Definitions for the code generator.
|
* Definitions for the code generator.
|
||||||
*
|
*
|
||||||
* Version: @(#)codegen.h 1.0.1 2018/02/14
|
* Version: @(#)codegen.h 1.0.2 2018/03/14
|
||||||
*
|
*
|
||||||
* Authors: Sarah Walker, <tommowalker@tommowalker.co.uk>
|
* Authors: Sarah Walker, <tommowalker@tommowalker.co.uk>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -303,7 +303,7 @@ void codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t
|
|||||||
void codegen_generate_seg_restore();
|
void codegen_generate_seg_restore();
|
||||||
void codegen_set_op32();
|
void codegen_set_op32();
|
||||||
void codegen_flush();
|
void codegen_flush();
|
||||||
void codegen_check_flush(struct page_t *page, uint64_t mask, uint32_t phys_addr);
|
void codegen_check_flush(page_t *page, uint64_t mask, uint32_t phys_addr);
|
||||||
|
|
||||||
extern int cpu_block_end;
|
extern int cpu_block_end;
|
||||||
extern uint32_t codegen_endpc;
|
extern uint32_t codegen_endpc;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Implementation of the floppy drive emulation.
|
* Implementation of the floppy drive emulation.
|
||||||
*
|
*
|
||||||
* Version: @(#)fdd.c 1.0.3 2018/03/12
|
* Version: @(#)fdd.c 1.0.4 2018/03/14
|
||||||
*
|
*
|
||||||
* Authors: Miran Grca, <mgrca8@gmail.com>
|
* Authors: Miran Grca, <mgrca8@gmail.com>
|
||||||
* Sarah Walker, <tommowalker@tommowalker.co.uk>
|
* Sarah Walker, <tommowalker@tommowalker.co.uk>
|
||||||
@@ -465,6 +465,7 @@ void fdd_load(int drive, wchar_t *fn)
|
|||||||
{
|
{
|
||||||
driveloaders[drive] = c;
|
driveloaders[drive] = c;
|
||||||
memcpy(floppyfns[drive], fn, (wcslen(fn) << 1) + 2);
|
memcpy(floppyfns[drive], fn, (wcslen(fn) << 1) + 2);
|
||||||
|
d86f_initialize_linked_lists(drive);
|
||||||
loaders[c].load(drive, floppyfns[drive]);
|
loaders[c].load(drive, floppyfns[drive]);
|
||||||
drive_empty[drive] = 0;
|
drive_empty[drive] = 0;
|
||||||
fdd_forced_seek(drive, 0);
|
fdd_forced_seek(drive, 0);
|
||||||
@@ -486,6 +487,8 @@ void fdd_close(int drive)
|
|||||||
drive_empty[drive] = 1;
|
drive_empty[drive] = 1;
|
||||||
fdd_set_head(drive, 0);
|
fdd_set_head(drive, 0);
|
||||||
floppyfns[drive][0] = 0;
|
floppyfns[drive][0] = 0;
|
||||||
|
d86f_destroy_linked_lists(drive, 0);
|
||||||
|
d86f_destroy_linked_lists(drive, 1);
|
||||||
drives[drive].hole = NULL;
|
drives[drive].hole = NULL;
|
||||||
drives[drive].poll = NULL;
|
drives[drive].poll = NULL;
|
||||||
drives[drive].seek = NULL;
|
drives[drive].seek = NULL;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Definitions for the floppy drive emulation.
|
* Definitions for the floppy drive emulation.
|
||||||
*
|
*
|
||||||
* Version: @(#)fdd.h 1.0.1 2018/02/14
|
* Version: @(#)fdd.h 1.0.2 2018/03/14
|
||||||
*
|
*
|
||||||
* Authors: Miran Grca, <mgrca8@gmail.com>
|
* Authors: Miran Grca, <mgrca8@gmail.com>
|
||||||
* Sarah Walker, <tommowalker@tommowalker.co.uk>
|
* Sarah Walker, <tommowalker@tommowalker.co.uk>
|
||||||
@@ -281,7 +281,7 @@ typedef union
|
|||||||
void d86f_set_version(int drive, uint16_t version);
|
void d86f_set_version(int drive, uint16_t version);
|
||||||
|
|
||||||
void d86f_initialize_last_sector_id(int drive, int c, int h, int r, int n);
|
void d86f_initialize_last_sector_id(int drive, int c, int h, int r, int n);
|
||||||
void d86f_zero_bit_field(int drive, int side);
|
void d86f_destroy_linked_lists(int drive, int side);
|
||||||
|
|
||||||
void d86f_set_fdc(void *fdc);
|
void d86f_set_fdc(void *fdc);
|
||||||
void fdi_set_fdc(void *fdc);
|
void fdi_set_fdc(void *fdc);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
* data in the form of FM/MFM-encoded transitions) which also
|
* data in the form of FM/MFM-encoded transitions) which also
|
||||||
* forms the core of the emulator's floppy disk emulation.
|
* forms the core of the emulator's floppy disk emulation.
|
||||||
*
|
*
|
||||||
* Version: @(#)fdd_86f.c 1.0.4 2018/03/12
|
* Version: @(#)fdd_86f.c 1.0.5 2018/03/14
|
||||||
*
|
*
|
||||||
* Author: Miran Grca, <mgrca8@gmail.com>
|
* Author: Miran Grca, <mgrca8@gmail.com>
|
||||||
*
|
*
|
||||||
@@ -214,6 +214,14 @@ typedef union {
|
|||||||
static fdc_t *d86f_fdc;
|
static fdc_t *d86f_fdc;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma pack(push,1)
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t c, h, r, n;
|
||||||
|
void *prev;
|
||||||
|
} sector_t;
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
#pragma pack(push,1)
|
#pragma pack(push,1)
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
@@ -258,7 +266,7 @@ struct
|
|||||||
uint8_t *outbuf;
|
uint8_t *outbuf;
|
||||||
uint32_t dma_over;
|
uint32_t dma_over;
|
||||||
int turbo_pos;
|
int turbo_pos;
|
||||||
uint16_t sector_id_bit_field[2][256][256][256];
|
sector_t *last_side_sector[2];
|
||||||
} d86f[FDD_NUM + 1];
|
} d86f[FDD_NUM + 1];
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
@@ -274,36 +282,38 @@ d86f_log(const char *format, ...)
|
|||||||
#ifdef ENABLE_D86F_LOG
|
#ifdef ENABLE_D86F_LOG
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
if (d86f_do_log)
|
if (d86f_do_log) {
|
||||||
{
|
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
pclog_ex(format, ap);
|
pclog_ex(format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void d86f_zero_bit_field(int drive, int side)
|
void d86f_initialize_linked_lists(int drive)
|
||||||
{
|
{
|
||||||
int i = 0;
|
d86f[drive].last_side_sector[0] = NULL;
|
||||||
int j = 0;
|
d86f[drive].last_side_sector[1] = NULL;
|
||||||
int k = 0;
|
}
|
||||||
int l = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < side; i++)
|
void d86f_destroy_linked_lists(int drive, int side)
|
||||||
{
|
{
|
||||||
for (j = 0; j < 256; j++)
|
sector_t *s;
|
||||||
{
|
sector_t *t;
|
||||||
for (k = 0; k < 256; k++)
|
|
||||||
{
|
if (d86f[drive].last_side_sector[side]) {
|
||||||
for (l = 0; l < 256; l++)
|
s = d86f[drive].last_side_sector[side];
|
||||||
{
|
while (s) {
|
||||||
d86f[drive].sector_id_bit_field[i][j][k][l] = 0;
|
t = s->prev;
|
||||||
}
|
free(s);
|
||||||
}
|
s = NULL;
|
||||||
}
|
if (!t)
|
||||||
}
|
break;
|
||||||
|
s = t;
|
||||||
|
}
|
||||||
|
d86f[drive].last_side_sector[side] = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void d86f_setupcrc(uint16_t poly)
|
static void d86f_setupcrc(uint16_t poly)
|
||||||
@@ -2209,6 +2219,24 @@ void d86f_turbo_format(int drive, int side, int nop)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int d86f_sector_is_present(int drive, int side, uint8_t c, uint8_t h, uint8_t r, uint8_t n)
|
||||||
|
{
|
||||||
|
sector_t *s, *t;
|
||||||
|
|
||||||
|
if (d86f[drive].last_side_sector[side]) {
|
||||||
|
s = d86f[drive].last_side_sector[side];
|
||||||
|
while (s) {
|
||||||
|
if ((s->c == c) && (s->h == h) && (s->r == r) && (s->n == n))
|
||||||
|
return 1;
|
||||||
|
if (!s->prev)
|
||||||
|
break;
|
||||||
|
t = s->prev;
|
||||||
|
s = t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void d86f_turbo_poll(int drive, int side)
|
void d86f_turbo_poll(int drive, int side)
|
||||||
{
|
{
|
||||||
if ((d86f[drive].state != STATE_IDLE) && (d86f[drive].state != STATE_SECTOR_NOT_FOUND) && ((d86f[drive].state & 0xF8) != 0xE8))
|
if ((d86f[drive].state != STATE_IDLE) && (d86f[drive].state != STATE_SECTOR_NOT_FOUND) && ((d86f[drive].state & 0xF8) != 0xE8))
|
||||||
@@ -2232,7 +2260,11 @@ void d86f_turbo_poll(int drive, int side)
|
|||||||
d86f[drive].state++;
|
d86f[drive].state++;
|
||||||
return;
|
return;
|
||||||
case STATE_02_FIND_ID:
|
case STATE_02_FIND_ID:
|
||||||
if (!(d86f[drive].sector_id_bit_field[side][fdc_get_read_track_sector(d86f_fdc).id.c][fdc_get_read_track_sector(d86f_fdc).id.h][fdc_get_read_track_sector(d86f_fdc).id.r] & (1 << fdc_get_read_track_sector(d86f_fdc).id.n)))
|
if (!d86f_sector_is_present(drive, side,
|
||||||
|
fdc_get_read_track_sector(d86f_fdc).id.c,
|
||||||
|
fdc_get_read_track_sector(d86f_fdc).id.h,
|
||||||
|
fdc_get_read_track_sector(d86f_fdc).id.r,
|
||||||
|
fdc_get_read_track_sector(d86f_fdc).id.n))
|
||||||
{
|
{
|
||||||
d86f[drive].id_find.sync_marks = d86f[drive].id_find.bits_obtained = d86f[drive].id_find.bytes_obtained = d86f[drive].error_condition = 0;
|
d86f[drive].id_find.sync_marks = d86f[drive].id_find.bits_obtained = d86f[drive].id_find.bytes_obtained = d86f[drive].error_condition = 0;
|
||||||
fdc_nosector(d86f_fdc);
|
fdc_nosector(d86f_fdc);
|
||||||
@@ -2253,7 +2285,11 @@ void d86f_turbo_poll(int drive, int side)
|
|||||||
case STATE_0C_FIND_ID:
|
case STATE_0C_FIND_ID:
|
||||||
case STATE_11_FIND_ID:
|
case STATE_11_FIND_ID:
|
||||||
case STATE_16_FIND_ID:
|
case STATE_16_FIND_ID:
|
||||||
if (!(d86f[drive].sector_id_bit_field[side][d86f[drive].req_sector.id.c][d86f[drive].req_sector.id.h][d86f[drive].req_sector.id.r] & (1 << d86f[drive].req_sector.id.n)))
|
if (!d86f_sector_is_present(drive, side,
|
||||||
|
d86f[drive].req_sector.id.c,
|
||||||
|
d86f[drive].req_sector.id.h,
|
||||||
|
d86f[drive].req_sector.id.r,
|
||||||
|
d86f[drive].req_sector.id.n))
|
||||||
{
|
{
|
||||||
d86f[drive].id_find.sync_marks = d86f[drive].id_find.bits_obtained = d86f[drive].id_find.bytes_obtained = d86f[drive].error_condition = 0;
|
d86f[drive].id_find.sync_marks = d86f[drive].id_find.bits_obtained = d86f[drive].id_find.bytes_obtained = d86f[drive].error_condition = 0;
|
||||||
fdc_nosector(d86f_fdc);
|
fdc_nosector(d86f_fdc);
|
||||||
@@ -2596,6 +2632,8 @@ uint16_t d86f_prepare_pretrack(int drive, int side, int iso)
|
|||||||
|
|
||||||
d86f[drive].index_hole_pos[side] = 0;
|
d86f[drive].index_hole_pos[side] = 0;
|
||||||
|
|
||||||
|
d86f_destroy_linked_lists(drive, side);
|
||||||
|
|
||||||
for (i = 0; i < raw_size; i++)
|
for (i = 0; i < raw_size; i++)
|
||||||
{
|
{
|
||||||
d86f_write_direct_common(drive, side, gap_fill, 0, i);
|
d86f_write_direct_common(drive, side, gap_fill, 0, i);
|
||||||
@@ -2640,6 +2678,7 @@ uint16_t d86f_prepare_sector(int drive, int side, int prev_pos, uint8_t *id_buf,
|
|||||||
uint16_t pos;
|
uint16_t pos;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
sector_t *s;
|
||||||
|
|
||||||
int real_gap2_len = gap2;
|
int real_gap2_len = gap2;
|
||||||
int real_gap3_len = gap3;
|
int real_gap3_len = gap3;
|
||||||
@@ -2654,7 +2693,17 @@ uint16_t d86f_prepare_sector(int drive, int side, int prev_pos, uint8_t *id_buf,
|
|||||||
uint16_t dataam_mfm = 0x4555;
|
uint16_t dataam_mfm = 0x4555;
|
||||||
uint16_t datadam_mfm = 0x4A55;
|
uint16_t datadam_mfm = 0x4A55;
|
||||||
|
|
||||||
d86f[drive].sector_id_bit_field[side][id_buf[0]][id_buf[1]][id_buf[2]] |= (1 << id_buf[3]);
|
if (fdd_get_turbo(drive) && (d86f[drive].version == 0x0063)) {
|
||||||
|
s = (sector_t *) malloc(sizeof(sector_t));
|
||||||
|
memset(s, 0, sizeof(sector_t));
|
||||||
|
s->c = id_buf[0];
|
||||||
|
s->h = id_buf[1];
|
||||||
|
s->r = id_buf[2];
|
||||||
|
s->n = id_buf[3];
|
||||||
|
if (d86f[drive].last_side_sector[side])
|
||||||
|
s->prev = d86f[drive].last_side_sector[side];
|
||||||
|
d86f[drive].last_side_sector[side] = s;
|
||||||
|
}
|
||||||
|
|
||||||
mfm = d86f_is_mfm(drive);
|
mfm = d86f_is_mfm(drive);
|
||||||
|
|
||||||
@@ -3764,12 +3813,18 @@ void d86f_load(int drive, wchar_t *fn)
|
|||||||
d86f_log("86F: Disk is %scompressed and %s surface description data\n", d86f[drive].is_compressed ? "" : "not ", d86f_has_surface_desc(drive) ? "has" : "does not have");
|
d86f_log("86F: Disk is %scompressed and %s surface description data\n", d86f[drive].is_compressed ? "" : "not ", d86f_has_surface_desc(drive) ? "has" : "does not have");
|
||||||
}
|
}
|
||||||
|
|
||||||
void d86f_init()
|
void d86f_init(void)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
memset(d86f, 0, sizeof(d86f));
|
memset(d86f, 0, sizeof(d86f));
|
||||||
d86f_setupcrc(0x1021);
|
d86f_setupcrc(0x1021);
|
||||||
|
|
||||||
d86f[0].state = d86f[1].state = STATE_IDLE;
|
for (i = 0; i < (FDD_NUM + 1); i++)
|
||||||
|
{
|
||||||
|
d86f[i].state = STATE_IDLE;
|
||||||
|
d86f_initialize_linked_lists(i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void d86f_set_fdc(void *fdc)
|
void d86f_set_fdc(void *fdc)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Definitions for the 86F floppy image format.
|
* Definitions for the 86F floppy image format.
|
||||||
*
|
*
|
||||||
* Version: @(#)floppy_86f.h 1.0.1 2018/02/14
|
* Version: @(#)floppy_86f.h 1.0.2 2018/03/14
|
||||||
*
|
*
|
||||||
* Author: Miran Grca, <mgrca8@gmail.com>
|
* Author: Miran Grca, <mgrca8@gmail.com>
|
||||||
*
|
*
|
||||||
@@ -86,7 +86,9 @@ extern int gap4_size[2];
|
|||||||
#define D86FVER 0x020B
|
#define D86FVER 0x020B
|
||||||
|
|
||||||
extern void d86f_initialize_last_sector_id(int drive, int c, int h, int r, int n);
|
extern void d86f_initialize_last_sector_id(int drive, int c, int h, int r, int n);
|
||||||
extern void d86f_zero_bit_field(int drive, int side);
|
|
||||||
|
extern void d86f_initialize_linked_lists(int drive);
|
||||||
|
extern void d86f_destroy_linked_lists(int drive, int side);
|
||||||
|
|
||||||
|
|
||||||
#endif /*EMU_FLOPPY_86F_H*/
|
#endif /*EMU_FLOPPY_86F_H*/
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Implementation of the IMD floppy image format.
|
* Implementation of the IMD floppy image format.
|
||||||
*
|
*
|
||||||
* Version: @(#)fdd_imd.c 1.0.3 2018/03/12
|
* Version: @(#)fdd_imd.c 1.0.4 2018/03/14
|
||||||
*
|
*
|
||||||
* Author: Miran Grca, <mgrca8@gmail.com>
|
* Author: Miran Grca, <mgrca8@gmail.com>
|
||||||
*
|
*
|
||||||
@@ -561,8 +561,8 @@ void imd_seek(int drive, int track)
|
|||||||
d86f_reset_index_hole_pos(drive, 0);
|
d86f_reset_index_hole_pos(drive, 0);
|
||||||
d86f_reset_index_hole_pos(drive, 1);
|
d86f_reset_index_hole_pos(drive, 1);
|
||||||
|
|
||||||
d86f_zero_bit_field(drive, 0);
|
d86f_destroy_linked_lists(drive, 0);
|
||||||
d86f_zero_bit_field(drive, 1);
|
d86f_destroy_linked_lists(drive, 1);
|
||||||
|
|
||||||
if (track > imd[drive].track_count)
|
if (track > imd[drive].track_count)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
* Implementation of the raw sector-based floppy image format,
|
* Implementation of the raw sector-based floppy image format,
|
||||||
* as well as the Japanese FDI, CopyQM, and FDF formats.
|
* as well as the Japanese FDI, CopyQM, and FDF formats.
|
||||||
*
|
*
|
||||||
* Version: @(#)fdd_img.c 1.0.1 2018/02/14
|
* Version: @(#)fdd_img.c 1.0.2 2018/03/14
|
||||||
*
|
*
|
||||||
* Authors: Miran Grca, <mgrca8@gmail.com>
|
* Authors: Miran Grca, <mgrca8@gmail.com>
|
||||||
* Sarah Walker, <tommowalker@tommowalker.co.uk>
|
* Sarah Walker, <tommowalker@tommowalker.co.uk>
|
||||||
@@ -978,8 +978,8 @@ void img_seek(int drive, int track)
|
|||||||
d86f_reset_index_hole_pos(drive, 0);
|
d86f_reset_index_hole_pos(drive, 0);
|
||||||
d86f_reset_index_hole_pos(drive, 1);
|
d86f_reset_index_hole_pos(drive, 1);
|
||||||
|
|
||||||
d86f_zero_bit_field(drive, 0);
|
d86f_destroy_linked_lists(drive, 0);
|
||||||
d86f_zero_bit_field(drive, 1);
|
d86f_destroy_linked_lists(drive, 1);
|
||||||
|
|
||||||
if (track > img[drive].tracks)
|
if (track > img[drive].tracks)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Implementation of the PCjs JSON floppy image format.
|
* Implementation of the PCjs JSON floppy image format.
|
||||||
*
|
*
|
||||||
* Version: @(#)fdd_json.c 1.0.2 2018/03/12
|
* Version: @(#)fdd_json.c 1.0.3 2018/03/14
|
||||||
*
|
*
|
||||||
* Author: Fred N. van Kempen, <decwiz@yahoo.com>
|
* Author: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
*
|
*
|
||||||
@@ -386,9 +386,9 @@ json_seek(int drive, int track)
|
|||||||
|
|
||||||
/* Reset the 86F state machine. */
|
/* Reset the 86F state machine. */
|
||||||
d86f_reset_index_hole_pos(drive, 0);
|
d86f_reset_index_hole_pos(drive, 0);
|
||||||
|
d86f_destroy_linked_lists(drive, 0);
|
||||||
d86f_reset_index_hole_pos(drive, 1);
|
d86f_reset_index_hole_pos(drive, 1);
|
||||||
d86f_zero_bit_field(drive, 0);
|
d86f_destroy_linked_lists(drive, 1);
|
||||||
d86f_zero_bit_field(drive, 1);
|
|
||||||
|
|
||||||
interleave_type = 0;
|
interleave_type = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Implementation of the Teledisk floppy image format.
|
* Implementation of the Teledisk floppy image format.
|
||||||
*
|
*
|
||||||
* Version: @(#)fdd_td0.c 1.0.2 2018/03/12
|
* Version: @(#)fdd_td0.c 1.0.3 2018/03/14
|
||||||
*
|
*
|
||||||
* Authors: Miran Grca, <mgrca8@gmail.com>
|
* Authors: Miran Grca, <mgrca8@gmail.com>
|
||||||
* Milodrag Milanovic,
|
* Milodrag Milanovic,
|
||||||
@@ -1127,8 +1127,8 @@ void td0_seek(int drive, int track)
|
|||||||
d86f_reset_index_hole_pos(drive, 0);
|
d86f_reset_index_hole_pos(drive, 0);
|
||||||
d86f_reset_index_hole_pos(drive, 1);
|
d86f_reset_index_hole_pos(drive, 1);
|
||||||
|
|
||||||
d86f_zero_bit_field(drive, 0);
|
d86f_destroy_linked_lists(drive, 0);
|
||||||
d86f_zero_bit_field(drive, 1);
|
d86f_destroy_linked_lists(drive, 1);
|
||||||
|
|
||||||
if (track > td0[drive].tracks)
|
if (track > td0[drive].tracks)
|
||||||
{
|
{
|
||||||
|
|||||||
353
src/mem.h
353
src/mem.h
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Definitions for the memory interface.
|
* Definitions for the memory interface.
|
||||||
*
|
*
|
||||||
* Version: @(#)mem.h 1.0.2 2018/03/12
|
* Version: @(#)mem.h 1.0.3 2018/03/14
|
||||||
*
|
*
|
||||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
* Sarah Walker, <tommowalker@tommowalker.co.uk>
|
* Sarah Walker, <tommowalker@tommowalker.co.uk>
|
||||||
@@ -38,22 +38,117 @@
|
|||||||
# define EMU_MEM_H
|
# define EMU_MEM_H
|
||||||
|
|
||||||
|
|
||||||
extern uint8_t *ram;
|
#define MEM_MAPPING_EXTERNAL 1 /* on external bus (ISA/PCI) */
|
||||||
extern uint32_t rammask;
|
#define MEM_MAPPING_INTERNAL 2 /* on internal bus (RAM) */
|
||||||
|
#define MEM_MAPPING_ROM 4 /* Executing from ROM may involve
|
||||||
|
* additional wait states. */
|
||||||
|
|
||||||
extern int readlookup[256],readlookupp[256];
|
#define MEM_MAP_TO_SHADOW_RAM_MASK 1
|
||||||
extern uintptr_t *readlookup2;
|
#define MEM_MAP_TO_RAM_ADDR_MASK 2
|
||||||
extern int readlnext;
|
|
||||||
extern int writelookup[256],writelookupp[256];
|
#define MEM_READ_ANY 0x00
|
||||||
extern uintptr_t *writelookup2;
|
#define MEM_READ_INTERNAL 0x10
|
||||||
extern int writelnext;
|
#define MEM_READ_EXTERNAL 0x20
|
||||||
|
#define MEM_READ_MASK 0xf0
|
||||||
|
|
||||||
|
#define MEM_WRITE_ANY 0x00
|
||||||
|
#define MEM_WRITE_INTERNAL 0x01
|
||||||
|
#define MEM_WRITE_EXTERNAL 0x02
|
||||||
|
#define MEM_WRITE_DISABLED 0x03
|
||||||
|
#define MEM_WRITE_MASK 0x0f
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _mem_mapping_ {
|
||||||
|
struct _mem_mapping_ *prev, *next;
|
||||||
|
|
||||||
|
int enable;
|
||||||
|
|
||||||
|
uint32_t base;
|
||||||
|
uint32_t size;
|
||||||
|
|
||||||
|
uint8_t (*read_b)(uint32_t addr, void *priv);
|
||||||
|
uint16_t (*read_w)(uint32_t addr, void *priv);
|
||||||
|
uint32_t (*read_l)(uint32_t addr, void *priv);
|
||||||
|
void (*write_b)(uint32_t addr, uint8_t val, void *priv);
|
||||||
|
void (*write_w)(uint32_t addr, uint16_t val, void *priv);
|
||||||
|
void (*write_l)(uint32_t addr, uint32_t val, void *priv);
|
||||||
|
|
||||||
|
uint8_t *exec;
|
||||||
|
|
||||||
|
uint32_t flags;
|
||||||
|
|
||||||
|
void *p;
|
||||||
|
} mem_mapping_t;
|
||||||
|
|
||||||
|
typedef struct _page_ {
|
||||||
|
void (*write_b)(uint32_t addr, uint8_t val, struct _page_ *p);
|
||||||
|
void (*write_w)(uint32_t addr, uint16_t val, struct _page_ *p);
|
||||||
|
void (*write_l)(uint32_t addr, uint32_t val, struct _page_ *p);
|
||||||
|
|
||||||
|
uint8_t *mem;
|
||||||
|
|
||||||
|
uint64_t code_present_mask[4],
|
||||||
|
dirty_mask[4];
|
||||||
|
|
||||||
|
struct codeblock_t *block[4], *block_2[4];
|
||||||
|
|
||||||
|
/*Head of codeblock tree associated with this page*/
|
||||||
|
struct codeblock_t *head;
|
||||||
|
} page_t;
|
||||||
|
|
||||||
|
|
||||||
|
extern uint8_t *ram;
|
||||||
|
extern uint32_t rammask;
|
||||||
|
|
||||||
|
extern uint8_t *rom;
|
||||||
|
extern uint8_t romext[32768];
|
||||||
|
extern uint32_t biosmask;
|
||||||
|
|
||||||
|
extern int readlookup[256],
|
||||||
|
readlookupp[256];
|
||||||
|
extern uintptr_t * readlookup2;
|
||||||
|
extern int readlnext;
|
||||||
|
extern int writelookup[256],
|
||||||
|
writelookupp[256];
|
||||||
|
extern uintptr_t *writelookup2;
|
||||||
|
extern int writelnext;
|
||||||
|
extern uint32_t ram_mapped_addr[64];
|
||||||
|
|
||||||
|
extern mem_mapping_t bios_mapping[8],
|
||||||
|
bios_high_mapping[8],
|
||||||
|
romext_mapping,
|
||||||
|
ram_low_mapping,
|
||||||
|
ram_mid_mapping,
|
||||||
|
ram_high_mapping;
|
||||||
|
|
||||||
|
extern uint32_t mem_logical_addr;
|
||||||
|
|
||||||
|
extern page_t *pages,
|
||||||
|
**page_lookup;
|
||||||
|
|
||||||
|
extern uint32_t get_phys_virt,get_phys_phys;
|
||||||
|
|
||||||
|
extern int shadowbios,
|
||||||
|
shadowbios_write;
|
||||||
|
extern int readlnum,
|
||||||
|
writelnum;
|
||||||
|
|
||||||
|
extern int nopageerrors;
|
||||||
|
extern int memspeed[11];
|
||||||
|
extern uint8_t isram[0x10000];
|
||||||
|
|
||||||
|
extern int mmu_perm;
|
||||||
|
|
||||||
|
extern int mem_a20_state,
|
||||||
|
mem_a20_alt,
|
||||||
|
mem_a20_key;
|
||||||
|
|
||||||
extern int mmu_perm;
|
|
||||||
|
|
||||||
#define readmemb(a) ((readlookup2[(a)>>12]==-1)?readmembl(a):*(uint8_t *)(readlookup2[(a) >> 12] + (a)))
|
#define readmemb(a) ((readlookup2[(a)>>12]==-1)?readmembl(a):*(uint8_t *)(readlookup2[(a) >> 12] + (a)))
|
||||||
#define readmemw(s,a) ((readlookup2[(uint32_t)((s)+(a))>>12]==-1 || (s)==0xFFFFFFFF || (((s)+(a)) & 1))?readmemwl(s,a):*(uint16_t *)(readlookup2[(uint32_t)((s)+(a))>>12]+(uint32_t)((s)+(a))))
|
#define readmemw(s,a) ((readlookup2[(uint32_t)((s)+(a))>>12]==-1 || (s)==0xFFFFFFFF || (((s)+(a)) & 1))?readmemwl(s,a):*(uint16_t *)(readlookup2[(uint32_t)((s)+(a))>>12]+(uint32_t)((s)+(a))))
|
||||||
#define readmeml(s,a) ((readlookup2[(uint32_t)((s)+(a))>>12]==-1 || (s)==0xFFFFFFFF || (((s)+(a)) & 3))?readmemll(s,a):*(uint32_t *)(readlookup2[(uint32_t)((s)+(a))>>12]+(uint32_t)((s)+(a))))
|
#define readmeml(s,a) ((readlookup2[(uint32_t)((s)+(a))>>12]==-1 || (s)==0xFFFFFFFF || (((s)+(a)) & 3))?readmemll(s,a):*(uint32_t *)(readlookup2[(uint32_t)((s)+(a))>>12]+(uint32_t)((s)+(a))))
|
||||||
|
|
||||||
|
|
||||||
extern uint8_t readmembl(uint32_t addr);
|
extern uint8_t readmembl(uint32_t addr);
|
||||||
extern void writemembl(uint32_t addr, uint8_t val);
|
extern void writemembl(uint32_t addr, uint8_t val);
|
||||||
extern uint8_t readmemb386l(uint32_t seg, uint32_t addr);
|
extern uint8_t readmemb386l(uint32_t seg, uint32_t addr);
|
||||||
@@ -70,54 +165,7 @@ extern uint32_t mmutranslatereal(uint32_t addr, int rw);
|
|||||||
extern void addreadlookup(uint32_t virt, uint32_t phys);
|
extern void addreadlookup(uint32_t virt, uint32_t phys);
|
||||||
extern void addwritelookup(uint32_t virt, uint32_t phys);
|
extern void addwritelookup(uint32_t virt, uint32_t phys);
|
||||||
|
|
||||||
extern int shadowbios,shadowbios_write;
|
extern void mem_mapping_add(mem_mapping_t *mapping,
|
||||||
extern int readlnum,writelnum;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct mem_mapping_t
|
|
||||||
{
|
|
||||||
struct mem_mapping_t *prev, *next;
|
|
||||||
|
|
||||||
int enable;
|
|
||||||
|
|
||||||
uint32_t base;
|
|
||||||
uint32_t size;
|
|
||||||
|
|
||||||
uint8_t (*read_b)(uint32_t addr, void *priv);
|
|
||||||
uint16_t (*read_w)(uint32_t addr, void *priv);
|
|
||||||
uint32_t (*read_l)(uint32_t addr, void *priv);
|
|
||||||
void (*write_b)(uint32_t addr, uint8_t val, void *priv);
|
|
||||||
void (*write_w)(uint32_t addr, uint16_t val, void *priv);
|
|
||||||
void (*write_l)(uint32_t addr, uint32_t val, void *priv);
|
|
||||||
|
|
||||||
uint8_t *exec;
|
|
||||||
|
|
||||||
uint32_t flags;
|
|
||||||
|
|
||||||
void *p;
|
|
||||||
} mem_mapping_t;
|
|
||||||
|
|
||||||
/*Only present on external bus (ISA/PCI)*/
|
|
||||||
#define MEM_MAPPING_EXTERNAL 1
|
|
||||||
/*Only present on internal bus (RAM)*/
|
|
||||||
#define MEM_MAPPING_INTERNAL 2
|
|
||||||
/*Executing from ROM may involve additional wait states*/
|
|
||||||
#define MEM_MAPPING_ROM 4
|
|
||||||
|
|
||||||
extern uint8_t *ram,*rom;
|
|
||||||
extern uint8_t romext[32768];
|
|
||||||
extern int readlnum,writelnum;
|
|
||||||
extern int memspeed[11];
|
|
||||||
extern int nopageerrors;
|
|
||||||
extern uint32_t biosmask;
|
|
||||||
extern unsigned char isram[0x10000];
|
|
||||||
|
|
||||||
#define MEM_MAP_TO_SHADOW_RAM_MASK 1
|
|
||||||
#define MEM_MAP_TO_RAM_ADDR_MASK 2
|
|
||||||
|
|
||||||
extern uint32_t ram_mapped_addr[64];
|
|
||||||
|
|
||||||
void mem_mapping_add(mem_mapping_t *mapping,
|
|
||||||
uint32_t base,
|
uint32_t base,
|
||||||
uint32_t size,
|
uint32_t size,
|
||||||
uint8_t (*read_b)(uint32_t addr, void *p),
|
uint8_t (*read_b)(uint32_t addr, void *p),
|
||||||
@@ -129,149 +177,74 @@ void mem_mapping_add(mem_mapping_t *mapping,
|
|||||||
uint8_t *exec,
|
uint8_t *exec,
|
||||||
uint32_t flags,
|
uint32_t flags,
|
||||||
void *p);
|
void *p);
|
||||||
void mem_mapping_set_handler(mem_mapping_t *mapping,
|
|
||||||
|
extern void mem_mapping_set_handler(mem_mapping_t *mapping,
|
||||||
uint8_t (*read_b)(uint32_t addr, void *p),
|
uint8_t (*read_b)(uint32_t addr, void *p),
|
||||||
uint16_t (*read_w)(uint32_t addr, void *p),
|
uint16_t (*read_w)(uint32_t addr, void *p),
|
||||||
uint32_t (*read_l)(uint32_t addr, void *p),
|
uint32_t (*read_l)(uint32_t addr, void *p),
|
||||||
void (*write_b)(uint32_t addr, uint8_t val, void *p),
|
void (*write_b)(uint32_t addr, uint8_t val, void *p),
|
||||||
void (*write_w)(uint32_t addr, uint16_t val, void *p),
|
void (*write_w)(uint32_t addr, uint16_t val, void *p),
|
||||||
void (*write_l)(uint32_t addr, uint32_t val, void *p));
|
void (*write_l)(uint32_t addr, uint32_t val, void *p));
|
||||||
void mem_mapping_set_p(mem_mapping_t *mapping, void *p);
|
|
||||||
void mem_mapping_set_addr(mem_mapping_t *mapping, uint32_t base, uint32_t size);
|
|
||||||
void mem_mapping_set_exec(mem_mapping_t *mapping, uint8_t *exec);
|
|
||||||
void mem_mapping_disable(mem_mapping_t *mapping);
|
|
||||||
void mem_mapping_enable(mem_mapping_t *mapping);
|
|
||||||
|
|
||||||
void mem_set_mem_state(uint32_t base, uint32_t size, int state);
|
extern void mem_mapping_set_p(mem_mapping_t *mapping, void *p);
|
||||||
|
|
||||||
#define MEM_READ_ANY 0x00
|
extern void mem_mapping_set_addr(mem_mapping_t *mapping,
|
||||||
#define MEM_READ_INTERNAL 0x10
|
uint32_t base, uint32_t size);
|
||||||
#define MEM_READ_EXTERNAL 0x20
|
extern void mem_mapping_set_exec(mem_mapping_t *mapping, uint8_t *exec);
|
||||||
#define MEM_READ_MASK 0xf0
|
extern void mem_mapping_disable(mem_mapping_t *mapping);
|
||||||
|
extern void mem_mapping_enable(mem_mapping_t *mapping);
|
||||||
|
|
||||||
#define MEM_WRITE_ANY 0x00
|
extern void mem_set_mem_state(uint32_t base, uint32_t size, int state);
|
||||||
#define MEM_WRITE_INTERNAL 0x01
|
|
||||||
#define MEM_WRITE_EXTERNAL 0x02
|
|
||||||
#define MEM_WRITE_DISABLED 0x03
|
|
||||||
#define MEM_WRITE_MASK 0x0f
|
|
||||||
|
|
||||||
extern int mem_a20_state;
|
extern uint8_t mem_readb_phys(uint32_t addr);
|
||||||
extern int mem_a20_alt;
|
extern uint8_t mem_readb_phys_dma(uint32_t addr);
|
||||||
extern int mem_a20_key;
|
extern uint16_t mem_readw_phys(uint32_t addr);
|
||||||
void mem_a20_recalc();
|
extern void mem_writeb_phys(uint32_t addr, uint8_t val);
|
||||||
|
extern void mem_writeb_phys_dma(uint32_t addr, uint8_t val);
|
||||||
|
extern void mem_writew_phys(uint32_t addr, uint16_t val);
|
||||||
|
|
||||||
uint8_t mem_readb_phys(uint32_t addr);
|
extern uint8_t mem_read_ram(uint32_t addr, void *priv);
|
||||||
uint8_t mem_readb_phys_dma(uint32_t addr);
|
extern uint16_t mem_read_ramw(uint32_t addr, void *priv);
|
||||||
uint16_t mem_readw_phys(uint32_t addr);
|
extern uint32_t mem_read_raml(uint32_t addr, void *priv);
|
||||||
void mem_writeb_phys(uint32_t addr, uint8_t val);
|
extern void mem_write_ram(uint32_t addr, uint8_t val, void *priv);
|
||||||
void mem_writeb_phys_dma(uint32_t addr, uint8_t val);
|
extern void mem_write_ramw(uint32_t addr, uint16_t val, void *priv);
|
||||||
void mem_writew_phys(uint32_t addr, uint16_t val);
|
extern void mem_write_raml(uint32_t addr, uint32_t val, void *priv);
|
||||||
|
|
||||||
uint8_t mem_read_ram(uint32_t addr, void *priv);
|
extern uint8_t mem_read_bios(uint32_t addr, void *priv);
|
||||||
uint16_t mem_read_ramw(uint32_t addr, void *priv);
|
extern uint16_t mem_read_biosw(uint32_t addr, void *priv);
|
||||||
uint32_t mem_read_raml(uint32_t addr, void *priv);
|
extern uint32_t mem_read_biosl(uint32_t addr, void *priv);
|
||||||
|
|
||||||
void mem_write_ram(uint32_t addr, uint8_t val, void *priv);
|
extern void mem_write_null(uint32_t addr, uint8_t val, void *p);
|
||||||
void mem_write_ramw(uint32_t addr, uint16_t val, void *priv);
|
extern void mem_write_nullw(uint32_t addr, uint16_t val, void *p);
|
||||||
void mem_write_raml(uint32_t addr, uint32_t val, void *priv);
|
extern void mem_write_nulll(uint32_t addr, uint32_t val, void *p);
|
||||||
|
|
||||||
uint8_t mem_read_bios(uint32_t addr, void *priv);
|
extern uint32_t mmutranslate_noabrt(uint32_t addr, int rw);
|
||||||
uint16_t mem_read_biosw(uint32_t addr, void *priv);
|
|
||||||
uint32_t mem_read_biosl(uint32_t addr, void *priv);
|
|
||||||
|
|
||||||
void mem_write_null(uint32_t addr, uint8_t val, void *p);
|
extern void mem_invalidate_range(uint32_t start_addr, uint32_t end_addr);
|
||||||
void mem_write_nullw(uint32_t addr, uint16_t val, void *p);
|
|
||||||
void mem_write_nulll(uint32_t addr, uint32_t val, void *p);
|
|
||||||
|
|
||||||
mem_mapping_t bios_mapping[8];
|
extern void mem_write_ramb_page(uint32_t addr, uint8_t val, page_t *p);
|
||||||
mem_mapping_t bios_high_mapping[8];
|
extern void mem_write_ramw_page(uint32_t addr, uint16_t val, page_t *p);
|
||||||
mem_mapping_t romext_mapping;
|
extern void mem_write_raml_page(uint32_t addr, uint32_t val, page_t *p);
|
||||||
|
extern void mem_flush_write_page(uint32_t addr, uint32_t virt);
|
||||||
extern mem_mapping_t ram_high_mapping;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct page_t
|
|
||||||
{
|
|
||||||
void (*write_b)(uint32_t addr, uint8_t val, struct page_t *p);
|
|
||||||
void (*write_w)(uint32_t addr, uint16_t val, struct page_t *p);
|
|
||||||
void (*write_l)(uint32_t addr, uint32_t val, struct page_t *p);
|
|
||||||
|
|
||||||
uint8_t *mem;
|
|
||||||
|
|
||||||
struct codeblock_t *block[4], *block_2[4];
|
|
||||||
|
|
||||||
/*Head of codeblock tree associated with this page*/
|
|
||||||
struct codeblock_t *head;
|
|
||||||
|
|
||||||
uint64_t code_present_mask[4], dirty_mask[4];
|
|
||||||
} page_t;
|
|
||||||
|
|
||||||
extern page_t *pages;
|
|
||||||
|
|
||||||
extern page_t **page_lookup;
|
|
||||||
|
|
||||||
uint32_t mmutranslate_noabrt(uint32_t addr, int rw);
|
|
||||||
|
|
||||||
extern uint32_t get_phys_virt,get_phys_phys;
|
|
||||||
|
|
||||||
#ifdef EMU_CPU_H
|
|
||||||
static __inline uint32_t get_phys(uint32_t addr)
|
|
||||||
{
|
|
||||||
if (!((addr ^ get_phys_virt) & ~0xfff))
|
|
||||||
return get_phys_phys | (addr & 0xfff);
|
|
||||||
|
|
||||||
get_phys_virt = addr;
|
|
||||||
|
|
||||||
if (!(cr0 >> 31))
|
|
||||||
{
|
|
||||||
get_phys_phys = (addr & rammask) & ~0xfff;
|
|
||||||
return addr & rammask;
|
|
||||||
}
|
|
||||||
|
|
||||||
get_phys_phys = (mmutranslatereal(addr, 0) & rammask) & ~0xfff;
|
|
||||||
return get_phys_phys | (addr & 0xfff);
|
|
||||||
/* return mmutranslatereal(addr, 0) & rammask; */
|
|
||||||
}
|
|
||||||
|
|
||||||
static __inline uint32_t get_phys_noabrt(uint32_t addr)
|
|
||||||
{
|
|
||||||
if (!(cr0 >> 31))
|
|
||||||
return addr & rammask;
|
|
||||||
|
|
||||||
return mmutranslate_noabrt(addr, 0) & rammask;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void mem_invalidate_range(uint32_t start_addr, uint32_t end_addr);
|
|
||||||
|
|
||||||
extern uint32_t mem_logical_addr;
|
|
||||||
|
|
||||||
void mem_write_ramb_page(uint32_t addr, uint8_t val, page_t *p);
|
|
||||||
void mem_write_ramw_page(uint32_t addr, uint16_t val, page_t *p);
|
|
||||||
void mem_write_raml_page(uint32_t addr, uint32_t val, page_t *p);
|
|
||||||
void mem_flush_write_page(uint32_t addr, uint32_t virt);
|
|
||||||
|
|
||||||
extern void mem_reset_page_blocks(void);
|
extern void mem_reset_page_blocks(void);
|
||||||
|
|
||||||
extern mem_mapping_t ram_low_mapping;
|
|
||||||
extern mem_mapping_t ram_mid_mapping;
|
|
||||||
|
|
||||||
extern void mem_remap_top_256k(void);
|
|
||||||
extern void mem_remap_top_384k(void);
|
|
||||||
|
|
||||||
extern void flushmmucache(void);
|
extern void flushmmucache(void);
|
||||||
extern void flushmmucache_cr3(void);
|
extern void flushmmucache_cr3(void);
|
||||||
extern void flushmmucache_nopc(void);
|
extern void flushmmucache_nopc(void);
|
||||||
extern void mmu_invalidate(uint32_t addr);
|
extern void mmu_invalidate(uint32_t addr);
|
||||||
|
|
||||||
extern void mem_split_enable(int max_size, uint32_t addr);
|
extern void mem_a20_recalc(void);
|
||||||
extern void mem_split_disable(int max_size, uint32_t addr);
|
|
||||||
|
|
||||||
|
|
||||||
extern void mem_add_bios(void);
|
extern void mem_add_bios(void);
|
||||||
|
|
||||||
extern void mem_init(void);
|
extern void mem_init(void);
|
||||||
extern void mem_resize(void);
|
extern void mem_reset(void);
|
||||||
|
extern void mem_remap_top_256k(void);
|
||||||
|
extern void mem_remap_top_384k(void);
|
||||||
|
|
||||||
|
extern void mem_split_enable(int max_size, uint32_t addr);
|
||||||
|
extern void mem_split_disable(int max_size, uint32_t addr);
|
||||||
|
|
||||||
extern uint8_t port_92_read(uint16_t port, void *priv);
|
extern uint8_t port_92_read(uint16_t port, void *priv);
|
||||||
extern void port_92_write(uint16_t port, uint8_t val, void *priv);
|
extern void port_92_write(uint16_t port, uint8_t val, void *priv);
|
||||||
@@ -281,4 +254,38 @@ extern void port_92_remove(void);
|
|||||||
extern void port_92_reset(void);
|
extern void port_92_reset(void);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef EMU_CPU_H
|
||||||
|
static __inline uint32_t get_phys(uint32_t addr)
|
||||||
|
{
|
||||||
|
if (! ((addr ^ get_phys_virt) & ~0xfff))
|
||||||
|
return get_phys_phys | (addr & 0xfff);
|
||||||
|
|
||||||
|
get_phys_virt = addr;
|
||||||
|
|
||||||
|
if (! (cr0 >> 31)) {
|
||||||
|
get_phys_phys = (addr & rammask) & ~0xfff;
|
||||||
|
|
||||||
|
return addr & rammask;
|
||||||
|
}
|
||||||
|
|
||||||
|
get_phys_phys = (mmutranslatereal(addr, 0) & rammask) & ~0xfff;
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
return get_phys_phys | (addr & 0xfff);
|
||||||
|
#else
|
||||||
|
return mmutranslatereal(addr, 0) & rammask;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static __inline uint32_t get_phys_noabrt(uint32_t addr)
|
||||||
|
{
|
||||||
|
if (! (cr0 >> 31))
|
||||||
|
return addr & rammask;
|
||||||
|
|
||||||
|
return mmutranslate_noabrt(addr, 0) & rammask;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif /*EMU_MEM_H*/
|
#endif /*EMU_MEM_H*/
|
||||||
|
|||||||
7
src/pc.c
7
src/pc.c
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Main emulator module where most things are controlled.
|
* Main emulator module where most things are controlled.
|
||||||
*
|
*
|
||||||
* Version: @(#)pc.c 1.0.8 2018/03/13
|
* Version: @(#)pc.c 1.0.9 2018/03/14
|
||||||
*
|
*
|
||||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -640,7 +640,8 @@ pc_reload(wchar_t *fn)
|
|||||||
fdd_load(2, floppyfns[2]);
|
fdd_load(2, floppyfns[2]);
|
||||||
fdd_load(3, floppyfns[3]);
|
fdd_load(3, floppyfns[3]);
|
||||||
|
|
||||||
mem_resize();
|
mem_reset();
|
||||||
|
|
||||||
network_init();
|
network_init();
|
||||||
|
|
||||||
pc_reset_hard_init();
|
pc_reset_hard_init();
|
||||||
@@ -777,7 +778,7 @@ pc_reset_hard_init(void)
|
|||||||
|
|
||||||
/* Reset the general machine support modules. */
|
/* Reset the general machine support modules. */
|
||||||
io_init();
|
io_init();
|
||||||
mem_resize();
|
mem_reset();
|
||||||
timer_reset();
|
timer_reset();
|
||||||
device_init();
|
device_init();
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
# Makefile for Windows systems using the MinGW32 environment.
|
# Makefile for Windows systems using the MinGW32 environment.
|
||||||
#
|
#
|
||||||
# Version: @(#)Makefile.mingw 1.0.12 2018/03/14
|
# Version: @(#)Makefile.mingw 1.0.13 2018/03/14
|
||||||
#
|
#
|
||||||
# Author: Fred N. van Kempen, <decwiz@yahoo.com>
|
# Author: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
#
|
#
|
||||||
@@ -688,6 +688,9 @@ clobber: clean
|
|||||||
@echo Cleaning executables..
|
@echo Cleaning executables..
|
||||||
@-rm -f *.d 2>NUL
|
@-rm -f *.d 2>NUL
|
||||||
@-rm -f *.exe 2>NUL
|
@-rm -f *.exe 2>NUL
|
||||||
|
ifneq ($(PROFILER), y)
|
||||||
|
@-rm -f *.map 2>NUL
|
||||||
|
endif
|
||||||
@-rm -f win/*.manifest 2>NUL
|
@-rm -f win/*.manifest 2>NUL
|
||||||
# @-rm -f $(DEPFILE) 2>NUL
|
# @-rm -f $(DEPFILE) 2>NUL
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user