Implemented software-requested DMA block transfers, fixes #405, and also fixes UMBPCI's DMACHK ISA DMA tests;
Reworked a few things and re-implemented memory write protection in the SCAT emulation, to require less unusual mappings; Removed two files that should not be there; Made sure all graphics cards' memory mappings are mapped as MEM_MAPPING_EXTERNAL; Added MEM_MAPPING_ROMCS flag to signal that a mapping responds to MEMCS* and made the BIOS and Intel flash mappings use it.
This commit is contained in:
@@ -92,8 +92,6 @@ typedef struct scat_t {
|
||||
mem_mapping_t high_mapping[16];
|
||||
mem_mapping_t remap_mapping[6];
|
||||
mem_mapping_t efff_mapping[44];
|
||||
mem_mapping_t romcs_mapping[8];
|
||||
mem_mapping_t bios_mapping[8];
|
||||
mem_mapping_t ems_mapping[32];
|
||||
} scat_t;
|
||||
|
||||
@@ -123,43 +121,38 @@ static uint8_t scat_in(uint16_t port, void *priv);
|
||||
static void scat_out(uint16_t port, uint8_t val, void *priv);
|
||||
|
||||
|
||||
static void
|
||||
romcs_state_update(scat_t *dev, uint8_t val)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (val & 1) {
|
||||
mem_mapping_enable(&dev->romcs_mapping[i << 1]);
|
||||
mem_mapping_enable(&dev->romcs_mapping[(i << 1) + 1]);
|
||||
} else {
|
||||
mem_mapping_disable(&dev->romcs_mapping[i << 1]);
|
||||
mem_mapping_disable(&dev->romcs_mapping[(i << 1) + 1]);
|
||||
}
|
||||
val >>= 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (val & 1) {
|
||||
mem_mapping_enable(&dev->bios_mapping[i << 1]);
|
||||
mem_mapping_enable(&dev->bios_mapping[(i << 1) + 1]);
|
||||
} else {
|
||||
mem_mapping_disable(&dev->bios_mapping[i << 1]);
|
||||
mem_mapping_disable(&dev->bios_mapping[(i << 1) + 1]);
|
||||
}
|
||||
val >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
shadow_state_update(scat_t *dev)
|
||||
{
|
||||
int i, val;
|
||||
|
||||
uint32_t base, bit, romcs, rommap_r, rommap_w, wp, shflags = 0;
|
||||
|
||||
for (i = 0; i < 24; i++) {
|
||||
val = ((dev->regs[SCAT_SHADOW_RAM_ENABLE_1 + (i >> 3)] >> (i & 7)) & 1) ? MEM_READ_INTERNAL | MEM_WRITE_INTERNAL : MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL;
|
||||
mem_set_mem_state((i + 40) << 14, 0x4000, val);
|
||||
val = (dev->regs[SCAT_SHADOW_RAM_ENABLE_1 + (i >> 3)] >> (i & 7)) & 1;
|
||||
|
||||
base = 0xa0000 + (i << 14);
|
||||
bit = (base - 0xc0000) >> 15;
|
||||
romcs = 0;
|
||||
wp = 0;
|
||||
|
||||
if (base >= 0xc0000) {
|
||||
romcs = dev->regs[SCAT_ROM_ENABLE] & (1 << bit);
|
||||
|
||||
wp = dev->regs[SCAT_RAM_WRITE_PROTECT] & (1 << bit);
|
||||
}
|
||||
|
||||
rommap_r = mem_mapping_is_romcs(base, 0) ? romcs : 1;
|
||||
rommap_w = mem_mapping_is_romcs(base, 1) ? romcs : 1;
|
||||
|
||||
shflags = val ? MEM_READ_INTERNAL : (rommap_r ? MEM_READ_EXTERNAL : MEM_READ_DISABLED);
|
||||
|
||||
if (wp)
|
||||
shflags |= MEM_WRITE_DISABLED;
|
||||
else
|
||||
shflags |= (val ? MEM_WRITE_INTERNAL : (rommap_w ? MEM_WRITE_EXTERNAL : MEM_WRITE_DISABLED));
|
||||
|
||||
mem_set_mem_state(base, 0x4000, shflags);
|
||||
}
|
||||
|
||||
flushmmucache();
|
||||
@@ -1037,6 +1030,8 @@ memmap_state_update(scat_t *dev)
|
||||
}
|
||||
|
||||
set_global_EMS_state(dev, dev->regs[SCAT_EMS_CONTROL] & 0x80);
|
||||
|
||||
flushmmucache_cr3();
|
||||
}
|
||||
|
||||
|
||||
@@ -1118,15 +1113,7 @@ scat_out(uint16_t port, uint8_t val, void *priv)
|
||||
break;
|
||||
|
||||
case SCAT_ROM_ENABLE:
|
||||
romcs_state_update(dev, val);
|
||||
reg_valid = 1;
|
||||
break;
|
||||
|
||||
case SCAT_RAM_WRITE_PROTECT:
|
||||
reg_valid = 1;
|
||||
flushmmucache_cr3();
|
||||
break;
|
||||
|
||||
case SCAT_SHADOW_RAM_ENABLE_1:
|
||||
case SCAT_SHADOW_RAM_ENABLE_2:
|
||||
case SCAT_SHADOW_RAM_ENABLE_3:
|
||||
@@ -1468,7 +1455,9 @@ scat_init(const device_t *info)
|
||||
if (! sx)
|
||||
mem_mapping_disable(&ram_mid_mapping);
|
||||
mem_mapping_disable(&ram_high_mapping);
|
||||
#if 0
|
||||
mem_mapping_disable(&bios_mapping);
|
||||
#endif
|
||||
|
||||
k = (sx) ? 0x80000 : 0x40000;
|
||||
|
||||
@@ -1514,25 +1503,6 @@ scat_init(const device_t *info)
|
||||
mem_mapping_enable(&dev->efff_mapping[i]);
|
||||
}
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
mem_mapping_add(&dev->romcs_mapping[i], 0xc0000 + (i << 14), 0x4000,
|
||||
mem_read_bios, mem_read_biosw, mem_read_biosl,
|
||||
mem_write_null, mem_write_nullw, mem_write_nulll,
|
||||
rom + ((i << 14) & biosmask),
|
||||
MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM, NULL);
|
||||
mem_mapping_disable(&dev->romcs_mapping[i]);
|
||||
}
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
mem_mapping_add(&dev->bios_mapping[i], 0xe0000 + (i << 14), 0x4000,
|
||||
mem_read_bios, mem_read_biosw, mem_read_biosl,
|
||||
mem_write_null, mem_write_nullw, mem_write_nulll,
|
||||
rom + ((i << 14) & biosmask),
|
||||
MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM, NULL);
|
||||
if (i < 4)
|
||||
mem_mapping_disable(&dev->bios_mapping[i]);
|
||||
}
|
||||
|
||||
if (sx) {
|
||||
for (i = 24; i < 32; i++) {
|
||||
dev->page[i].valid = 1;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,196 +0,0 @@
|
||||
/*
|
||||
* 86Box A hypervisor and IBM PC system emulator that specializes in
|
||||
* running old operating systems and software designed for IBM
|
||||
* PC systems and compatibles from 1981 through fairly recent
|
||||
* system designs based on the PCI bus.
|
||||
*
|
||||
* This file is part of the 86Box distribution.
|
||||
*
|
||||
* Implementation of the WD76C10 System Controller chip.
|
||||
*
|
||||
* Version: @(#)wd76c10.c 1.0.0 2019/05/14
|
||||
*
|
||||
* Authors: Sarah Walker, <tommowalker@tommowalker.co.uk>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
*
|
||||
* Copyright 2008-2019 Sarah Walker.
|
||||
* Copyright 2016-2019 Miran Grca.
|
||||
* Copyright 2017-2019 Fred N. van Kempen.
|
||||
*/
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <wchar.h>
|
||||
#include "../86box.h"
|
||||
#include "../device.h"
|
||||
#include "../timer.h"
|
||||
#include "../io.h"
|
||||
#include "../keyboard.h"
|
||||
#include "../mem.h"
|
||||
#include "../port_92.h"
|
||||
#include "../serial.h"
|
||||
#include "../floppy/fdd.h"
|
||||
#include "../floppy/fdc.h"
|
||||
#include "../video/vid_paradise.h"
|
||||
#include "chipset.h"
|
||||
|
||||
|
||||
typedef struct {
|
||||
int type;
|
||||
|
||||
uint16_t reg_0092;
|
||||
uint16_t reg_2072;
|
||||
uint16_t reg_2872;
|
||||
uint16_t reg_5872;
|
||||
|
||||
serial_t *uart[2];
|
||||
|
||||
fdc_t *fdc;
|
||||
} wd76c10_t;
|
||||
|
||||
|
||||
static uint16_t
|
||||
wd76c10_read(uint16_t port, void *priv)
|
||||
{
|
||||
wd76c10_t *dev = (wd76c10_t *)priv;
|
||||
int16_t ret = 0xffff;
|
||||
|
||||
switch (port) {
|
||||
case 0x2072:
|
||||
ret = dev->reg_2072;
|
||||
break;
|
||||
|
||||
case 0x2872:
|
||||
ret = dev->reg_2872;
|
||||
break;
|
||||
|
||||
case 0x5872:
|
||||
ret = dev->reg_5872;
|
||||
break;
|
||||
}
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
wd76c10_write(uint16_t port, uint16_t val, void *priv)
|
||||
{
|
||||
wd76c10_t *dev = (wd76c10_t *)priv;
|
||||
|
||||
switch (port) {
|
||||
case 0x2072:
|
||||
dev->reg_2072 = val;
|
||||
|
||||
serial_remove(dev->uart[0]);
|
||||
if (!(val & 0x10))
|
||||
{
|
||||
switch ((val >> 5) & 7)
|
||||
{
|
||||
case 1: serial_setup(dev->uart[0], 0x3f8, 4); break;
|
||||
case 2: serial_setup(dev->uart[0], 0x2f8, 4); break;
|
||||
case 3: serial_setup(dev->uart[0], 0x3e8, 4); break;
|
||||
case 4: serial_setup(dev->uart[0], 0x2e8, 4); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
serial_remove(dev->uart[1]);
|
||||
if (!(val & 0x01))
|
||||
{
|
||||
switch ((val >> 1) & 7)
|
||||
{
|
||||
case 1: serial_setup(dev->uart[1], 0x3f8, 3); break;
|
||||
case 2: serial_setup(dev->uart[1], 0x2f8, 3); break;
|
||||
case 3: serial_setup(dev->uart[1], 0x3e8, 3); break;
|
||||
case 4: serial_setup(dev->uart[1], 0x2e8, 3); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x2872:
|
||||
dev->reg_2872 = val;
|
||||
|
||||
fdc_remove(dev->fdc);
|
||||
if (! (val & 1))
|
||||
fdc_set_base(dev->fdc, 0x03f0);
|
||||
break;
|
||||
|
||||
case 0x5872:
|
||||
dev->reg_5872 = val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static uint8_t
|
||||
wd76c10_readb(uint16_t port, void *priv)
|
||||
{
|
||||
if (port & 1)
|
||||
return(wd76c10_read(port & ~1, priv) >> 8);
|
||||
|
||||
return(wd76c10_read(port, priv) & 0xff);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
wd76c10_writeb(uint16_t port, uint8_t val, void *priv)
|
||||
{
|
||||
uint16_t temp = wd76c10_read(port, priv);
|
||||
|
||||
if (port & 1)
|
||||
wd76c10_write(port & ~1, (temp & 0x00ff) | (val << 8), priv);
|
||||
else
|
||||
wd76c10_write(port , (temp & 0xff00) | val, priv);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
wd76c10_close(void *priv)
|
||||
{
|
||||
wd76c10_t *dev = (wd76c10_t *)priv;
|
||||
|
||||
free(dev);
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
wd76c10_init(const device_t *info)
|
||||
{
|
||||
wd76c10_t *dev;
|
||||
|
||||
dev = (wd76c10_t *) malloc(sizeof(wd76c10_t));
|
||||
memset(dev, 0x00, sizeof(wd76c10_t));
|
||||
dev->type = info->local;
|
||||
|
||||
dev->fdc = (fdc_t *)device_add(&fdc_at_device);
|
||||
|
||||
dev->uart[0] = device_add_inst(&i8250_device, 1);
|
||||
dev->uart[1] = device_add_inst(&i8250_device, 2);
|
||||
|
||||
device_add(&port_92_word_device);
|
||||
|
||||
io_sethandler(0x2072, 2,
|
||||
wd76c10_readb,wd76c10_read,NULL,
|
||||
wd76c10_writeb,wd76c10_write,NULL, dev);
|
||||
io_sethandler(0x2872, 2,
|
||||
wd76c10_readb,wd76c10_read,NULL,
|
||||
wd76c10_writeb,wd76c10_write,NULL, dev);
|
||||
io_sethandler(0x5872, 2,
|
||||
wd76c10_readb,wd76c10_read,NULL,
|
||||
wd76c10_writeb,wd76c10_write,NULL, dev);
|
||||
|
||||
return(dev);
|
||||
}
|
||||
|
||||
|
||||
const device_t wd76c10_device = {
|
||||
"WD 76C10",
|
||||
0,
|
||||
0,
|
||||
wd76c10_init, wd76c10_close, NULL,
|
||||
NULL, NULL, NULL,
|
||||
NULL
|
||||
};
|
||||
67
src/dma.c
67
src/dma.c
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Implementation of the Intel DMA controllers.
|
||||
*
|
||||
* Version: @(#)dma.c 1.0.6 2019/09/21
|
||||
* Version: @(#)dma.c 1.0.7 2019/09/28
|
||||
*
|
||||
* Authors: Sarah Walker, <tommowalker@tommowalker.co.uk>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -51,6 +51,10 @@ static uint8_t dma_stat_rq;
|
||||
static uint8_t dma_stat_rq_pc;
|
||||
static uint8_t dma_command,
|
||||
dma16_command;
|
||||
static uint8_t dma_req_is_soft;
|
||||
static uint8_t dma_buffer[65536];
|
||||
static uint16_t dma16_buffer[65536];
|
||||
|
||||
static struct {
|
||||
int xfr_command,
|
||||
xfr_channel;
|
||||
@@ -87,6 +91,31 @@ dma_set_drq(int channel, int set)
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
dma_block_transfer(int channel)
|
||||
{
|
||||
int i, bit16;
|
||||
|
||||
bit16 = (channel >= 4);
|
||||
|
||||
dma_req_is_soft = 1;
|
||||
for (i = 0; i <= dma[channel].cb; i++) {
|
||||
if ((dma[channel].mode & 0x8c) == 0x84) {
|
||||
if (bit16)
|
||||
dma_channel_write(channel, dma16_buffer[i]);
|
||||
else
|
||||
dma_channel_write(channel, dma_buffer[i]);
|
||||
} else if ((dma[channel].mode & 0x8c) == 0x88) {
|
||||
if (bit16)
|
||||
dma16_buffer[i] = dma_channel_read(channel);
|
||||
else
|
||||
dma_buffer[i] = dma_channel_read(channel);
|
||||
}
|
||||
}
|
||||
dma_req_is_soft = 0;
|
||||
}
|
||||
|
||||
|
||||
static uint8_t
|
||||
dma_read(uint16_t addr, void *priv)
|
||||
{
|
||||
@@ -168,17 +197,19 @@ dma_write(uint16_t addr, uint8_t val, void *priv)
|
||||
|
||||
case 9: /*Request register */
|
||||
channel = (val & 3);
|
||||
if (val & 4)
|
||||
if (val & 4) {
|
||||
dma_stat_rq_pc |= (1 << channel);
|
||||
else
|
||||
dma_block_transfer(channel);
|
||||
} else
|
||||
dma_stat_rq_pc &= ~(1 << channel);
|
||||
break;
|
||||
|
||||
case 0xa: /*Mask*/
|
||||
channel = (val & 3);
|
||||
if (val & 4)
|
||||
dma_m |= (1 << (val & 3));
|
||||
else
|
||||
dma_m &= ~(1 << (val & 3));
|
||||
dma_m |= (1 << channel);
|
||||
else
|
||||
dma_m &= ~(1 << channel);
|
||||
return;
|
||||
|
||||
case 0xb: /*Mode*/
|
||||
@@ -462,17 +493,19 @@ dma16_write(uint16_t addr, uint8_t val, void *priv)
|
||||
|
||||
case 9: /*Request register */
|
||||
channel = (val & 3) + 4;
|
||||
if (val & 4)
|
||||
if (val & 4) {
|
||||
dma_stat_rq_pc |= (1 << channel);
|
||||
else
|
||||
dma_block_transfer(channel);
|
||||
} else
|
||||
dma_stat_rq_pc &= ~(1 << channel);
|
||||
break;
|
||||
|
||||
case 0xa: /*Mask*/
|
||||
channel = (val & 3);
|
||||
if (val & 4)
|
||||
dma_m |= (0x10 << (val & 3));
|
||||
else
|
||||
dma_m &= ~(0x10 << (val & 3));
|
||||
dma_m |= (0x10 << channel);
|
||||
else
|
||||
dma_m &= ~(0x10 << channel);
|
||||
return;
|
||||
|
||||
case 0xb: /*Mode*/
|
||||
@@ -582,8 +615,8 @@ dma_reset(void)
|
||||
dma_wp = dma16_wp = 0;
|
||||
dma_m = 0;
|
||||
|
||||
for (c = 0; c < 16; c++)
|
||||
dmaregs[c] = 0;
|
||||
for (c = 0; c < 16; c++)
|
||||
dmaregs[c] = dma16regs[c] = 0;
|
||||
for (c = 0; c < 8; c++) {
|
||||
dma[c].mode = 0;
|
||||
dma[c].ac = 0;
|
||||
@@ -596,6 +629,10 @@ dma_reset(void)
|
||||
dma_stat = 0x00;
|
||||
dma_stat_rq = 0x00;
|
||||
dma_stat_rq_pc = 0x00;
|
||||
dma_req_is_soft = 0;
|
||||
|
||||
memset(dma_buffer, 0x00, sizeof(dma_buffer));
|
||||
memset(dma16_buffer, 0x00, sizeof(dma16_buffer));
|
||||
}
|
||||
|
||||
|
||||
@@ -699,7 +736,7 @@ dma_channel_read(int channel)
|
||||
return(DMA_NODATA);
|
||||
}
|
||||
|
||||
if (dma_m & (1 << channel))
|
||||
if ((dma_m & (1 << channel)) && !dma_req_is_soft)
|
||||
return(DMA_NODATA);
|
||||
if ((dma_c->mode & 0xC) != 8)
|
||||
return(DMA_NODATA);
|
||||
@@ -772,7 +809,7 @@ dma_channel_write(int channel, uint16_t val)
|
||||
return(DMA_NODATA);
|
||||
}
|
||||
|
||||
if (dma_m & (1 << channel))
|
||||
if ((dma_m & (1 << channel)) && !dma_req_is_soft)
|
||||
return(DMA_NODATA);
|
||||
if ((dma_c->mode & 0xC) != 4)
|
||||
return(DMA_NODATA);
|
||||
|
||||
@@ -295,16 +295,16 @@ intel_flash_add_mappings(flash_t *dev)
|
||||
mem_mapping_add(&(dev->mapping[i]), base, 0x10000,
|
||||
flash_read, flash_readw, flash_readl,
|
||||
flash_write, flash_writew, flash_writel,
|
||||
dev->array + fbase, MEM_MAPPING_EXTERNAL, (void *) dev);
|
||||
dev->array + fbase, MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM|MEM_MAPPING_ROMCS, (void *) dev);
|
||||
}
|
||||
mem_mapping_add(&(dev->mapping_h[i]), (base | 0xfff00000) - 0x40000, 0x10000,
|
||||
flash_read, flash_readw, flash_readl,
|
||||
flash_write, flash_writew, flash_writel,
|
||||
dev->array + fbase, MEM_MAPPING_EXTERNAL, (void *) dev);
|
||||
dev->array + fbase, MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM|MEM_MAPPING_ROMCS, (void *) dev);
|
||||
mem_mapping_add(&(dev->mapping_h[i + 4]), (base | 0xfff00000), 0x10000,
|
||||
flash_read, flash_readw, flash_readl,
|
||||
flash_write, flash_writew, flash_writel,
|
||||
dev->array + fbase, MEM_MAPPING_EXTERNAL, (void *) dev);
|
||||
dev->array + fbase, MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM|MEM_MAPPING_ROMCS, (void *) dev);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
23
src/mem.c
23
src/mem.c
@@ -844,6 +844,23 @@ writememql(uint32_t seg, uint32_t addr, uint64_t val)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
mem_mapping_is_romcs(uint32_t addr, int write)
|
||||
{
|
||||
mem_mapping_t *map;
|
||||
|
||||
if (write)
|
||||
map = write_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
else
|
||||
map = read_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
|
||||
if (map)
|
||||
return !!(map->flags & MEM_MAPPING_ROMCS);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
uint8_t
|
||||
@@ -1420,19 +1437,19 @@ mem_add_bios(void)
|
||||
/* 256k+ BIOS'es only have low mappings at E0000-FFFFF. */
|
||||
mem_mapping_add(&bios_mapping, 0xe0000, 0x20000,
|
||||
mem_read_bios,mem_read_biosw,mem_read_biosl,
|
||||
mem_write_null,mem_write_nullw,mem_write_nulll,
|
||||
mem_write_null,mem_write_nullw,mem_write_nulll,
|
||||
&rom[0x20000], MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM|MEM_MAPPING_ROMCS, 0);
|
||||
} else {
|
||||
mem_mapping_add(&bios_mapping, biosaddr, biosmask + 1,
|
||||
mem_read_bios,mem_read_biosw,mem_read_biosl,
|
||||
mem_write_null,mem_write_nullw,mem_write_nulll,
|
||||
mem_write_null,mem_write_nullw,mem_write_nulll,
|
||||
rom, MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM|MEM_MAPPING_ROMCS, 0);
|
||||
}
|
||||
|
||||
if (AT) {
|
||||
mem_mapping_add(&bios_high_mapping, biosaddr | (cpu_16bitbus ? 0x00f00000 : 0xfff00000), biosmask + 1,
|
||||
mem_read_bios,mem_read_biosw,mem_read_biosl,
|
||||
mem_write_null,mem_write_nullw,mem_write_nulll,
|
||||
mem_write_null,mem_write_nullw,mem_write_nulll,
|
||||
rom, MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM|MEM_MAPPING_ROMCS, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
#define MEM_MAPPING_INTERNAL 2 /* on internal bus (RAM) */
|
||||
#define MEM_MAPPING_ROM 4 /* Executing from ROM may involve
|
||||
* additional wait states. */
|
||||
#define MEM_MAPPING_ROMCS 8 /* respond to ROMCS* */
|
||||
|
||||
#define MEM_MAP_TO_SHADOW_RAM_MASK 1
|
||||
#define MEM_MAP_TO_RAM_ADDR_MASK 2
|
||||
@@ -271,6 +272,7 @@ extern void mem_mapping_set_addr(mem_mapping_t *,
|
||||
extern void mem_mapping_set_exec(mem_mapping_t *, uint8_t *exec);
|
||||
extern void mem_mapping_disable(mem_mapping_t *);
|
||||
extern void mem_mapping_enable(mem_mapping_t *);
|
||||
extern int mem_mapping_is_romcs(uint32_t addr, int write);
|
||||
|
||||
extern void mem_set_mem_state(uint32_t base, uint32_t size, int state);
|
||||
|
||||
|
||||
@@ -821,6 +821,23 @@ writememql(uint32_t addr, uint64_t val)
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
mem_mapping_is_romcs(uint32_t addr, int write)
|
||||
{
|
||||
mem_mapping_t *map;
|
||||
|
||||
if (write)
|
||||
map = write_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
else
|
||||
map = read_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
|
||||
if (map)
|
||||
return !!(map->flags & MEM_MAPPING_ROMCS);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
uint8_t
|
||||
mem_readb_phys(uint32_t addr)
|
||||
{
|
||||
@@ -1415,12 +1432,12 @@ mem_add_bios(void)
|
||||
mem_mapping_add(&bios_mapping, 0xe0000, 0x20000,
|
||||
mem_read_bios,mem_read_biosw,mem_read_biosl,
|
||||
mem_write_null,mem_write_nullw,mem_write_nulll,
|
||||
&rom[0x20000], MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM, 0);
|
||||
&rom[0x20000], MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM|MEM_MAPPING_ROMCS, 0);
|
||||
} else {
|
||||
mem_mapping_add(&bios_mapping, biosaddr, biosmask + 1,
|
||||
mem_read_bios,mem_read_biosw,mem_read_biosl,
|
||||
mem_write_null,mem_write_nullw,mem_write_nulll,
|
||||
rom, MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM, 0);
|
||||
rom, MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM|MEM_MAPPING_ROMCS, 0);
|
||||
}
|
||||
|
||||
if (AT) {
|
||||
@@ -1428,7 +1445,7 @@ mem_add_bios(void)
|
||||
mem_read_bios,mem_read_biosw,mem_read_biosl,
|
||||
mem_write_null,mem_write_nullw,mem_write_nulll,
|
||||
rom,
|
||||
MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM, 0);
|
||||
MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM|MEM_MAPPING_ROMCS, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,13 +8,13 @@
|
||||
*
|
||||
* ATi Mach64 graphics card emulation.
|
||||
*
|
||||
* Version: @(#)vid_ati_mach64.c 1.0.26 2018/10/18
|
||||
* Version: @(#)vid_ati_mach64.c 1.0.27 2019/09/28
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
*
|
||||
* Copyright 2008-2018 Sarah Walker.
|
||||
* Copyright 2016-2018 Miran Grca.
|
||||
* Copyright 2008-2019 Sarah Walker.
|
||||
* Copyright 2016-2019 Miran Grca.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
#include <stdint.h>
|
||||
@@ -3310,10 +3310,10 @@ static void *mach64_common_init(const device_t *info)
|
||||
if (info->flags & DEVICE_PCI)
|
||||
mem_mapping_disable(&mach64->bios_rom.mapping);
|
||||
|
||||
mem_mapping_add(&mach64->linear_mapping, 0, 0, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, NULL, 0, &mach64->svga);
|
||||
mem_mapping_add(&mach64->mmio_linear_mapping, 0, 0, mach64_ext_readb, mach64_ext_readw, mach64_ext_readl, mach64_ext_writeb, mach64_ext_writew, mach64_ext_writel, NULL, 0, mach64);
|
||||
mem_mapping_add(&mach64->mmio_linear_mapping_2, 0, 0, mach64_ext_readb, mach64_ext_readw, mach64_ext_readl, mach64_ext_writeb, mach64_ext_writew, mach64_ext_writel, NULL, 0, mach64);
|
||||
mem_mapping_add(&mach64->mmio_mapping, 0xbc000, 0x04000, mach64_ext_readb, mach64_ext_readw, mach64_ext_readl, mach64_ext_writeb, mach64_ext_writew, mach64_ext_writel, NULL, 0, mach64);
|
||||
mem_mapping_add(&mach64->linear_mapping, 0, 0, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, NULL, MEM_MAPPING_EXTERNAL, &mach64->svga);
|
||||
mem_mapping_add(&mach64->mmio_linear_mapping, 0, 0, mach64_ext_readb, mach64_ext_readw, mach64_ext_readl, mach64_ext_writeb, mach64_ext_writew, mach64_ext_writel, NULL, MEM_MAPPING_EXTERNAL, mach64);
|
||||
mem_mapping_add(&mach64->mmio_linear_mapping_2, 0, 0, mach64_ext_readb, mach64_ext_readw, mach64_ext_readl, mach64_ext_writeb, mach64_ext_writew, mach64_ext_writel, NULL, MEM_MAPPING_EXTERNAL, mach64);
|
||||
mem_mapping_add(&mach64->mmio_mapping, 0xbc000, 0x04000, mach64_ext_readb, mach64_ext_readw, mach64_ext_readl, mach64_ext_writeb, mach64_ext_writew, mach64_ext_writel, NULL, MEM_MAPPING_EXTERNAL, mach64);
|
||||
mem_mapping_disable(&mach64->mmio_mapping);
|
||||
|
||||
mach64_io_set(mach64);
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
*
|
||||
* Known bugs: Accelerator doesn't work in planar modes
|
||||
*
|
||||
* Version: @(#)vid_et4000w32.c 1.0.21 2018/10/18
|
||||
* Version: @(#)vid_et4000w32.c 1.0.22 2019/09/28
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
*
|
||||
* Copyright 2008-2018 Sarah Walker.
|
||||
* Copyright 2016-2018 Miran Grca.
|
||||
* Copyright 2008-2019 Sarah Walker.
|
||||
* Copyright 2016-2019 Miran Grca.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
#include <stdint.h>
|
||||
@@ -1266,8 +1266,8 @@ void *et4000w32p_init(const device_t *info)
|
||||
if (info->flags & DEVICE_PCI)
|
||||
mem_mapping_disable(&et4000->bios_rom.mapping);
|
||||
|
||||
mem_mapping_add(&et4000->linear_mapping, 0, 0, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, NULL, 0, &et4000->svga);
|
||||
mem_mapping_add(&et4000->mmu_mapping, 0, 0, et4000w32p_mmu_read, NULL, NULL, et4000w32p_mmu_write, NULL, NULL, NULL, 0, et4000);
|
||||
mem_mapping_add(&et4000->linear_mapping, 0, 0, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, NULL, MEM_MAPPING_EXTERNAL, &et4000->svga);
|
||||
mem_mapping_add(&et4000->mmu_mapping, 0, 0, et4000w32p_mmu_read, NULL, NULL, et4000w32p_mmu_write, NULL, NULL, NULL, MEM_MAPPING_EXTERNAL, et4000);
|
||||
|
||||
et4000w32p_io_set(et4000);
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Video 7 VGA 1024i emulation.
|
||||
*
|
||||
* Version: @(#)vid_ht216.c 1.0.0 2019/04/05
|
||||
* Version: @(#)vid_ht216.c 1.0.1 2019/09/28
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -1058,7 +1058,7 @@ void
|
||||
|
||||
mem_mapping_set_handler(&ht216->svga.mapping, ht216_read, NULL, NULL, ht216_write, ht216_writew, ht216_writel);
|
||||
mem_mapping_set_p(&ht216->svga.mapping, ht216);
|
||||
mem_mapping_add(&ht216->linear_mapping, 0, 0, ht216_read_linear, NULL, NULL, ht216_write_linear, ht216_writew_linear, ht216_writel_linear, NULL, 0, &ht216->svga);
|
||||
mem_mapping_add(&ht216->linear_mapping, 0, 0, ht216_read_linear, NULL, NULL, ht216_write_linear, ht216_writew_linear, ht216_writel_linear, NULL, MEM_MAPPING_EXTERNAL, &ht216->svga);
|
||||
|
||||
svga->bpp = 8;
|
||||
svga->miscout = 1;
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
*
|
||||
* This is expected to be done shortly.
|
||||
*
|
||||
* Version: @(#)vid_pgc.c 1.0.2 2019/03/03
|
||||
* Version: @(#)vid_pgc.c 1.0.3 2019/09/28
|
||||
*
|
||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* John Elliott, <jce@seasip.info>
|
||||
@@ -2633,7 +2633,6 @@ pgc_init(pgc_t *dev, int maxw, int maxh, int visw, int vish,
|
||||
/* Make it a 16k mapping at C4000 (will be C4000-C7FFF),
|
||||
because of the emulator's granularity - the original
|
||||
mapping will conflict with hard disk controller BIOS'es. */
|
||||
// mem_mapping_add(&dev->mapping, 0xc6000, 2048,
|
||||
mem_mapping_add(&dev->mapping, 0xc4000, 16384,
|
||||
pgc_read,NULL,NULL, pgc_write,NULL,NULL,
|
||||
NULL, MEM_MAPPING_EXTERNAL, dev);
|
||||
|
||||
@@ -47,13 +47,13 @@
|
||||
* access size or host data has any affect, but the Windows 3.1
|
||||
* driver always reads bytes and write words of 0xffff.
|
||||
*
|
||||
* Version: @(#)vid_tgui9440.c 1.0.9 2018/10/04
|
||||
* Version: @(#)vid_tgui9440.c 1.0.10 2019/09/28
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
*
|
||||
* Copyright 2008-2018 Sarah Walker.
|
||||
* Copyright 2016-2018 Miran Grca.
|
||||
* Copyright 2008-2019 Sarah Walker.
|
||||
* Copyright 2016-2019 Miran Grca.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
@@ -1679,8 +1679,8 @@ static void *tgui_init(const device_t *info)
|
||||
if (tgui->type == TGUI_9400CXI)
|
||||
tgui->svga.ramdac = device_add(&tkd8001_ramdac_device);
|
||||
|
||||
mem_mapping_add(&tgui->linear_mapping, 0, 0, svga_read_linear, svga_readw_linear, svga_readl_linear, tgui_accel_write_fb_b, tgui_accel_write_fb_w, tgui_accel_write_fb_l, NULL, 0, &tgui->svga);
|
||||
mem_mapping_add(&tgui->accel_mapping, 0xbc000, 0x4000, tgui_accel_read, tgui_accel_read_w, tgui_accel_read_l, tgui_accel_write, tgui_accel_write_w, tgui_accel_write_l, NULL, 0, tgui);
|
||||
mem_mapping_add(&tgui->linear_mapping, 0, 0, svga_read_linear, svga_readw_linear, svga_readl_linear, tgui_accel_write_fb_b, tgui_accel_write_fb_w, tgui_accel_write_fb_l, NULL, MEM_MAPPING_EXTERNAL, &tgui->svga);
|
||||
mem_mapping_add(&tgui->accel_mapping, 0xbc000, 0x4000, tgui_accel_read, tgui_accel_read_w, tgui_accel_read_l, tgui_accel_write, tgui_accel_write_w, tgui_accel_write_l, NULL, MEM_MAPPING_EXTERNAL, tgui);
|
||||
mem_mapping_disable(&tgui->accel_mapping);
|
||||
|
||||
io_sethandler(0x03c0, 0x0020, tgui_in, NULL, NULL, tgui_out, NULL, NULL, tgui);
|
||||
|
||||
Reference in New Issue
Block a user