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:
waltje
2018-03-14 23:31:44 -05:00
parent cbff303c73
commit a86d717ae1
13 changed files with 2178 additions and 1934 deletions

View File

@@ -8,7 +8,7 @@
*
* 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>
* 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_set_op32();
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 uint32_t codegen_endpc;

View File

@@ -8,7 +8,7 @@
*
* 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>
* Sarah Walker, <tommowalker@tommowalker.co.uk>
@@ -465,6 +465,7 @@ void fdd_load(int drive, wchar_t *fn)
{
driveloaders[drive] = c;
memcpy(floppyfns[drive], fn, (wcslen(fn) << 1) + 2);
d86f_initialize_linked_lists(drive);
loaders[c].load(drive, floppyfns[drive]);
drive_empty[drive] = 0;
fdd_forced_seek(drive, 0);
@@ -486,6 +487,8 @@ void fdd_close(int drive)
drive_empty[drive] = 1;
fdd_set_head(drive, 0);
floppyfns[drive][0] = 0;
d86f_destroy_linked_lists(drive, 0);
d86f_destroy_linked_lists(drive, 1);
drives[drive].hole = NULL;
drives[drive].poll = NULL;
drives[drive].seek = NULL;

View File

@@ -8,7 +8,7 @@
*
* 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>
* Sarah Walker, <tommowalker@tommowalker.co.uk>
@@ -281,7 +281,7 @@ typedef union
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_zero_bit_field(int drive, int side);
void d86f_destroy_linked_lists(int drive, int side);
void d86f_set_fdc(void *fdc);
void fdi_set_fdc(void *fdc);

View File

@@ -10,7 +10,7 @@
* data in the form of FM/MFM-encoded transitions) which also
* 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>
*
@@ -214,6 +214,14 @@ typedef union {
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)
struct
{
@@ -258,7 +266,7 @@ struct
uint8_t *outbuf;
uint32_t dma_over;
int turbo_pos;
uint16_t sector_id_bit_field[2][256][256][256];
sector_t *last_side_sector[2];
} d86f[FDD_NUM + 1];
#pragma pack(pop)
@@ -274,36 +282,38 @@ d86f_log(const char *format, ...)
#ifdef ENABLE_D86F_LOG
va_list ap;
if (d86f_do_log)
{
if (d86f_do_log) {
va_start(ap, format);
pclog_ex(format, ap);
va_end(ap);
}
}
#endif
}
void d86f_zero_bit_field(int drive, int side)
void d86f_initialize_linked_lists(int drive)
{
int i = 0;
int j = 0;
int k = 0;
int l = 0;
d86f[drive].last_side_sector[0] = NULL;
d86f[drive].last_side_sector[1] = NULL;
}
for (i = 0; i < side; i++)
{
for (j = 0; j < 256; j++)
{
for (k = 0; k < 256; k++)
{
for (l = 0; l < 256; l++)
{
d86f[drive].sector_id_bit_field[i][j][k][l] = 0;
}
}
}
}
void d86f_destroy_linked_lists(int drive, int side)
{
sector_t *s;
sector_t *t;
if (d86f[drive].last_side_sector[side]) {
s = d86f[drive].last_side_sector[side];
while (s) {
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)
@@ -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)
{
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++;
return;
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;
fdc_nosector(d86f_fdc);
@@ -2253,7 +2285,11 @@ void d86f_turbo_poll(int drive, int side)
case STATE_0C_FIND_ID:
case STATE_11_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;
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_destroy_linked_lists(drive, side);
for (i = 0; i < raw_size; 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;
int i;
sector_t *s;
int real_gap2_len = gap2;
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 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);
@@ -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");
}
void d86f_init()
void d86f_init(void)
{
int i;
memset(d86f, 0, sizeof(d86f));
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)

View File

@@ -8,7 +8,7 @@
*
* 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>
*
@@ -86,7 +86,9 @@ extern int gap4_size[2];
#define D86FVER 0x020B
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*/

View File

@@ -8,7 +8,7 @@
*
* 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>
*
@@ -561,8 +561,8 @@ void imd_seek(int drive, int track)
d86f_reset_index_hole_pos(drive, 0);
d86f_reset_index_hole_pos(drive, 1);
d86f_zero_bit_field(drive, 0);
d86f_zero_bit_field(drive, 1);
d86f_destroy_linked_lists(drive, 0);
d86f_destroy_linked_lists(drive, 1);
if (track > imd[drive].track_count)
{

View File

@@ -9,7 +9,7 @@
* Implementation of the raw sector-based floppy image format,
* 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>
* 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, 1);
d86f_zero_bit_field(drive, 0);
d86f_zero_bit_field(drive, 1);
d86f_destroy_linked_lists(drive, 0);
d86f_destroy_linked_lists(drive, 1);
if (track > img[drive].tracks)
{

View File

@@ -8,7 +8,7 @@
*
* 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>
*
@@ -386,9 +386,9 @@ json_seek(int drive, int track)
/* Reset the 86F state machine. */
d86f_reset_index_hole_pos(drive, 0);
d86f_destroy_linked_lists(drive, 0);
d86f_reset_index_hole_pos(drive, 1);
d86f_zero_bit_field(drive, 0);
d86f_zero_bit_field(drive, 1);
d86f_destroy_linked_lists(drive, 1);
interleave_type = 0;

View File

@@ -8,7 +8,7 @@
*
* 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>
* 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, 1);
d86f_zero_bit_field(drive, 0);
d86f_zero_bit_field(drive, 1);
d86f_destroy_linked_lists(drive, 0);
d86f_destroy_linked_lists(drive, 1);
if (track > td0[drive].tracks)
{

3127
src/mem.c

File diff suppressed because it is too large Load Diff

353
src/mem.h
View File

@@ -8,7 +8,7 @@
*
* 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>
* Sarah Walker, <tommowalker@tommowalker.co.uk>
@@ -38,22 +38,117 @@
# define EMU_MEM_H
extern uint8_t *ram;
extern uint32_t rammask;
#define MEM_MAPPING_EXTERNAL 1 /* on external bus (ISA/PCI) */
#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];
extern uintptr_t *readlookup2;
extern int readlnext;
extern int writelookup[256],writelookupp[256];
extern uintptr_t *writelookup2;
extern int writelnext;
#define MEM_MAP_TO_SHADOW_RAM_MASK 1
#define MEM_MAP_TO_RAM_ADDR_MASK 2
#define MEM_READ_ANY 0x00
#define MEM_READ_INTERNAL 0x10
#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 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))))
extern uint8_t readmembl(uint32_t addr);
extern void writemembl(uint32_t addr, uint8_t val);
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 addwritelookup(uint32_t virt, uint32_t phys);
extern int shadowbios,shadowbios_write;
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,
extern void mem_mapping_add(mem_mapping_t *mapping,
uint32_t base,
uint32_t size,
uint8_t (*read_b)(uint32_t addr, void *p),
@@ -129,149 +177,74 @@ void mem_mapping_add(mem_mapping_t *mapping,
uint8_t *exec,
uint32_t flags,
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),
uint16_t (*read_w)(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_w)(uint32_t addr, uint16_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
#define MEM_READ_INTERNAL 0x10
#define MEM_READ_EXTERNAL 0x20
#define MEM_READ_MASK 0xf0
extern void mem_mapping_set_addr(mem_mapping_t *mapping,
uint32_t base, uint32_t size);
extern void mem_mapping_set_exec(mem_mapping_t *mapping, uint8_t *exec);
extern void mem_mapping_disable(mem_mapping_t *mapping);
extern void mem_mapping_enable(mem_mapping_t *mapping);
#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
extern void mem_set_mem_state(uint32_t base, uint32_t size, int state);
extern int mem_a20_state;
extern int mem_a20_alt;
extern int mem_a20_key;
void mem_a20_recalc();
extern uint8_t mem_readb_phys(uint32_t addr);
extern uint8_t mem_readb_phys_dma(uint32_t addr);
extern uint16_t mem_readw_phys(uint32_t addr);
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);
uint8_t mem_readb_phys_dma(uint32_t addr);
uint16_t mem_readw_phys(uint32_t addr);
void mem_writeb_phys(uint32_t addr, uint8_t val);
void mem_writeb_phys_dma(uint32_t addr, uint8_t val);
void mem_writew_phys(uint32_t addr, uint16_t val);
extern uint8_t mem_read_ram(uint32_t addr, void *priv);
extern uint16_t mem_read_ramw(uint32_t addr, void *priv);
extern uint32_t mem_read_raml(uint32_t addr, void *priv);
extern void mem_write_ram(uint32_t addr, uint8_t val, void *priv);
extern void mem_write_ramw(uint32_t addr, uint16_t val, void *priv);
extern void mem_write_raml(uint32_t addr, uint32_t val, void *priv);
uint8_t mem_read_ram(uint32_t addr, void *priv);
uint16_t mem_read_ramw(uint32_t addr, void *priv);
uint32_t mem_read_raml(uint32_t addr, void *priv);
extern uint8_t mem_read_bios(uint32_t addr, void *priv);
extern uint16_t mem_read_biosw(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);
void mem_write_ramw(uint32_t addr, uint16_t val, void *priv);
void mem_write_raml(uint32_t addr, uint32_t val, void *priv);
extern void mem_write_null(uint32_t addr, uint8_t val, void *p);
extern void mem_write_nullw(uint32_t addr, uint16_t val, void *p);
extern void mem_write_nulll(uint32_t addr, uint32_t val, void *p);
uint8_t mem_read_bios(uint32_t addr, void *priv);
uint16_t mem_read_biosw(uint32_t addr, void *priv);
uint32_t mem_read_biosl(uint32_t addr, void *priv);
extern uint32_t mmutranslate_noabrt(uint32_t addr, int rw);
void mem_write_null(uint32_t addr, uint8_t val, void *p);
void mem_write_nullw(uint32_t addr, uint16_t val, void *p);
void mem_write_nulll(uint32_t addr, uint32_t val, void *p);
extern void mem_invalidate_range(uint32_t start_addr, uint32_t end_addr);
mem_mapping_t bios_mapping[8];
mem_mapping_t bios_high_mapping[8];
mem_mapping_t romext_mapping;
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_write_ramb_page(uint32_t addr, uint8_t val, page_t *p);
extern void mem_write_ramw_page(uint32_t addr, uint16_t val, page_t *p);
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 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_cr3(void);
extern void flushmmucache_nopc(void);
extern void mmu_invalidate(uint32_t addr);
extern void mem_split_enable(int max_size, uint32_t addr);
extern void mem_split_disable(int max_size, uint32_t addr);
extern void mem_a20_recalc(void);
extern void mem_add_bios(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 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);
#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*/

View File

@@ -8,7 +8,7 @@
*
* 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>
* Miran Grca, <mgrca8@gmail.com>
@@ -640,7 +640,8 @@ pc_reload(wchar_t *fn)
fdd_load(2, floppyfns[2]);
fdd_load(3, floppyfns[3]);
mem_resize();
mem_reset();
network_init();
pc_reset_hard_init();
@@ -777,7 +778,7 @@ pc_reset_hard_init(void)
/* Reset the general machine support modules. */
io_init();
mem_resize();
mem_reset();
timer_reset();
device_init();

View File

@@ -8,7 +8,7 @@
#
# 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>
#
@@ -688,6 +688,9 @@ clobber: clean
@echo Cleaning executables..
@-rm -f *.d 2>NUL
@-rm -f *.exe 2>NUL
ifneq ($(PROFILER), y)
@-rm -f *.map 2>NUL
endif
@-rm -f win/*.manifest 2>NUL
# @-rm -f $(DEPFILE) 2>NUL