Updated pc.c to have the memory dumper use the current CS:IP.
Updated the rom.ch files to properly handle mirroring (from 86Box.) Updated the vid_ht216.c driver for proper operation under Windows 3.x (from 86Box.)
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Video7 VGA 1024i emulation.
|
* Video7 VGA 1024i emulation.
|
||||||
*
|
*
|
||||||
* Version: @(#)vid_ht216.c 1.0.2 2019/05/05
|
* Version: @(#)vid_ht216.c 1.0.3 2019/05/10
|
||||||
*
|
*
|
||||||
* 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>
|
||||||
@@ -114,12 +114,10 @@ typedef struct {
|
|||||||
static const video_timings_t v7vga_timings = {VID_ISA,5,5,9,20,20,30};
|
static const video_timings_t v7vga_timings = {VID_ISA,5,5,9,20,20,30};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ht216_remap(ht216_t *dev)
|
ht216_remap(ht216_t *dev)
|
||||||
{
|
{
|
||||||
svga_t *svga = &dev->svga;
|
svga_t *svga = &dev->svga;
|
||||||
uint32_t read_offset, write_offset;
|
|
||||||
|
|
||||||
mem_map_disable(&dev->linear_mapping);
|
mem_map_disable(&dev->linear_mapping);
|
||||||
|
|
||||||
@@ -129,39 +127,38 @@ ht216_remap(ht216_t *dev)
|
|||||||
mem_map_set_addr(&dev->linear_mapping, linear_base, 0x100000);
|
mem_map_set_addr(&dev->linear_mapping, linear_base, 0x100000);
|
||||||
|
|
||||||
/*Linear mapping enabled*/
|
/*Linear mapping enabled*/
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
read_offset = (dev->ht_regs[0xf6] & 0xc) << 16;
|
|
||||||
write_offset = (dev->ht_regs[0xf6] & 0x3) << 18;
|
|
||||||
|
|
||||||
if (svga->chain4 && (dev->ht_regs[0xfc] & HT_REG_FC_ECOLRE)) {
|
|
||||||
if (dev->misc & HT_MISC_PAGE_SEL) {
|
|
||||||
read_offset |= (1 << 17);
|
|
||||||
write_offset |= (1 << 17);
|
|
||||||
}
|
|
||||||
if (dev->ht_regs[0xf9] & HT_REG_F9_XPSEL) {
|
|
||||||
read_offset |= (1 << 16);
|
|
||||||
write_offset |= (1 << 16);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dev->read_bank[0] = read_offset + (dev->read_bank_reg[0] << 12);
|
|
||||||
dev->write_bank[0] = write_offset + (dev->write_bank_reg[0] << 12);
|
|
||||||
|
|
||||||
if (dev->ht_regs[0xe0] & HT_REG_E0_SBAE) {
|
|
||||||
/*Split bank*/
|
|
||||||
dev->read_bank[1] = read_offset + (dev->read_bank_reg[1] << 12);
|
|
||||||
dev->write_bank[1] = write_offset + (dev->write_bank_reg[1] << 12);
|
|
||||||
} else {
|
} else {
|
||||||
dev->read_bank[1] = dev->read_bank[0] + (svga->chain4 ? 0x8000 : 0x20000);
|
uint8_t read_bank_reg[2] = {
|
||||||
dev->write_bank[1] = dev->write_bank[0] + (svga->chain4 ? 0x8000 : 0x20000);
|
dev->read_bank_reg[0], dev->read_bank_reg[1]
|
||||||
}
|
};
|
||||||
|
uint8_t write_bank_reg[2] = {
|
||||||
|
dev->write_bank_reg[0], dev->write_bank_reg[1]
|
||||||
|
};
|
||||||
|
|
||||||
if (! svga->chain4) {
|
if (!svga->chain4 || !(dev->ht_regs[0xfc] & HT_REG_FC_ECOLRE)) {
|
||||||
dev->read_bank[0] >>= 2;
|
read_bank_reg[0] &= ~0x30;
|
||||||
dev->read_bank[1] >>= 2;
|
read_bank_reg[1] &= ~0x30;
|
||||||
dev->write_bank[0] >>= 2;
|
write_bank_reg[0] &= ~0x30;
|
||||||
dev->write_bank[1] >>= 2;
|
write_bank_reg[1] &= ~0x30;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev->read_bank[0] = read_bank_reg[0] << 12;
|
||||||
|
dev->write_bank[0] = write_bank_reg[0] << 12;
|
||||||
|
if (dev->ht_regs[0xe0] & HT_REG_E0_SBAE) {
|
||||||
|
/* split bank */
|
||||||
|
dev->read_bank[1] = read_bank_reg[1] << 12;
|
||||||
|
dev->write_bank[1] = write_bank_reg[1] << 12;
|
||||||
|
} else {
|
||||||
|
dev->read_bank[1] = dev->read_bank[0] + (svga->chain4 ? 0x8000 : 0x20000);
|
||||||
|
dev->write_bank[1] = dev->write_bank[0] + (svga->chain4 ? 0x8000 : 0x20000);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! svga->chain4) {
|
||||||
|
dev->read_bank[0] >>= 2;
|
||||||
|
dev->read_bank[1] >>= 2;
|
||||||
|
dev->write_bank[0] >>= 2;
|
||||||
|
dev->write_bank[1] >>= 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -191,11 +188,6 @@ recalc_timings(svga_t *svga)
|
|||||||
|
|
||||||
if ((svga->bpp == 8) && !svga->lowres)
|
if ((svga->bpp == 8) && !svga->lowres)
|
||||||
svga->render = svga_render_8bpp_highres;
|
svga->render = svga_render_8bpp_highres;
|
||||||
|
|
||||||
if (dev->ht_regs[0xc8] & HT_REG_C8_E256) {
|
|
||||||
svga->bpp = 8;
|
|
||||||
svga->render = svga_render_8bpp_highres;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -239,6 +231,8 @@ ht216_in(uint16_t addr, void *priv)
|
|||||||
return (svga->latch >> 16) & 0xff;
|
return (svga->latch >> 16) & 0xff;
|
||||||
case 0xa3:
|
case 0xa3:
|
||||||
return (svga->latch >> 24) & 0xff;
|
return (svga->latch >> 24) & 0xff;
|
||||||
|
case 0xf7:
|
||||||
|
return 0x01;
|
||||||
|
|
||||||
case 0xff:
|
case 0xff:
|
||||||
return 0x80;
|
return 0x80;
|
||||||
@@ -277,6 +271,8 @@ ht216_out(uint16_t addr, uint8_t val, void *priv)
|
|||||||
case 0x03c2:
|
case 0x03c2:
|
||||||
dev->clk_sel = (dev->clk_sel & ~3) | ((val & 0x0c) >> 2);
|
dev->clk_sel = (dev->clk_sel & ~3) | ((val & 0x0c) >> 2);
|
||||||
dev->misc = val;
|
dev->misc = val;
|
||||||
|
dev->read_bank_reg[0] = (dev->read_bank_reg[0] & ~0x20) | ((val & HT_MISC_PAGE_SEL) ? 0x20 : 0);
|
||||||
|
dev->write_bank_reg[0] = (dev->write_bank_reg[0] & ~0x20) | ((val & HT_MISC_PAGE_SEL) ? 0x20 : 0);
|
||||||
ht216_remap(dev);
|
ht216_remap(dev);
|
||||||
svga_recalctimings(&dev->svga);
|
svga_recalctimings(&dev->svga);
|
||||||
break;
|
break;
|
||||||
@@ -357,6 +353,13 @@ ht216_out(uint16_t addr, uint8_t val, void *priv)
|
|||||||
|
|
||||||
case 0xf6:
|
case 0xf6:
|
||||||
svga->vram_display_mask = (val & 0x40) ? dev->vram_mask : 0x3ffff;
|
svga->vram_display_mask = (val & 0x40) ? dev->vram_mask : 0x3ffff;
|
||||||
|
dev->read_bank_reg[0] = (dev->read_bank_reg[0] & ~0xc0) | ((val & 0xc) << 4);
|
||||||
|
dev->write_bank_reg[0] = (dev->write_bank_reg[0] & ~0xc0) | ((val & 0x3) << 6);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xf9:
|
||||||
|
dev->read_bank_reg[0] = (dev->read_bank_reg[0] & ~0x10) | ((val & 1) ? 0x10 : 0);
|
||||||
|
dev->write_bank_reg[0] = (dev->write_bank_reg[0] & ~0x10) | ((val & 1) ? 0x10 : 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xff:
|
case 0xff:
|
||||||
@@ -374,9 +377,14 @@ ht216_out(uint16_t addr, uint8_t val, void *priv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (svga->seqaddr & 0xff) {
|
switch (svga->seqaddr & 0xff) {
|
||||||
case 0xc8: case 0xc9: case 0xcf:
|
case 0xc8:
|
||||||
case 0xe0: case 0xe8: case 0xe9:
|
case 0xc9:
|
||||||
case 0xf6: case 0xf9:
|
case 0xcf:
|
||||||
|
case 0xe0:
|
||||||
|
case 0xe8:
|
||||||
|
case 0xe9:
|
||||||
|
case 0xf6:
|
||||||
|
case 0xf9:
|
||||||
ht216_remap(dev);
|
ht216_remap(dev);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -452,7 +460,7 @@ hwcursor_draw(svga_t *svga, int displine)
|
|||||||
svga->vram[svga->hwcursor_latch.addr+128+3];
|
svga->vram[svga->hwcursor_latch.addr+128+3];
|
||||||
|
|
||||||
for (x = 0; x < 32; x++) {
|
for (x = 0; x < 32; x++) {
|
||||||
if (!(dat[0] & 0x80000000))
|
if (! (dat[0] & 0x80000000))
|
||||||
screen->line[displine][offset + x].val = 0;
|
screen->line[displine][offset + x].val = 0;
|
||||||
if (dat[1] & 0x80000000)
|
if (dat[1] & 0x80000000)
|
||||||
screen->line[displine][offset + x].val ^= 0xffffff;
|
screen->line[displine][offset + x].val ^= 0xffffff;
|
||||||
@@ -495,22 +503,238 @@ extalu(int op, uint8_t input_a, uint8_t input_b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
dm_write(ht216_t *dev, uint32_t addr, uint8_t cpu_dat, uint8_t cpu_dat_unexpanded)
|
||||||
|
{
|
||||||
|
svga_t *svga = &dev->svga;
|
||||||
|
uint8_t vala, valb, valc, vald, wm = svga->writemask;
|
||||||
|
int writemask2 = svga->writemask;
|
||||||
|
uint8_t fg_data[4] = {0, 0, 0, 0};
|
||||||
|
|
||||||
|
if (! (svga->gdcreg[6] & 1))
|
||||||
|
svga->fullchange = 2;
|
||||||
|
if (svga->chain4 || svga->fb_only) {
|
||||||
|
writemask2 = 1 << (addr & 3);
|
||||||
|
addr &= ~3;
|
||||||
|
} else if (svga->chain2_write) {
|
||||||
|
writemask2 &= ~0xa;
|
||||||
|
if (addr & 1)
|
||||||
|
writemask2 <<= 1;
|
||||||
|
addr &= ~1;
|
||||||
|
addr <<= 2;
|
||||||
|
} else
|
||||||
|
addr <<= 2;
|
||||||
|
if (addr >= svga->vram_max)
|
||||||
|
return;
|
||||||
|
|
||||||
|
svga->changedvram[addr >> 12] = changeframecount;
|
||||||
|
|
||||||
|
switch (dev->ht_regs[0xfe] & HT_REG_FE_FBMC) {
|
||||||
|
case 0x00:
|
||||||
|
fg_data[0] = fg_data[1] = fg_data[2] = fg_data[3] = cpu_dat;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x04:
|
||||||
|
if (dev->ht_regs[0xfe] & HT_REG_FE_FBRC) {
|
||||||
|
if (addr & 4) {
|
||||||
|
fg_data[0] = (cpu_dat_unexpanded & (1 << (((addr + 4) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
fg_data[1] = (cpu_dat_unexpanded & (1 << (((addr + 5) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
fg_data[2] = (cpu_dat_unexpanded & (1 << (((addr + 6) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
fg_data[3] = (cpu_dat_unexpanded & (1 << (((addr + 7) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
} else {
|
||||||
|
fg_data[0] = (cpu_dat_unexpanded & (1 << (((addr + 0) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
fg_data[1] = (cpu_dat_unexpanded & (1 << (((addr + 1) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
fg_data[2] = (cpu_dat_unexpanded & (1 << (((addr + 2) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
fg_data[3] = (cpu_dat_unexpanded & (1 << (((addr + 3) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (addr & 4) {
|
||||||
|
fg_data[0] = (dev->ht_regs[0xf5] & (1 << (((addr + 4) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
fg_data[1] = (dev->ht_regs[0xf5] & (1 << (((addr + 5) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
fg_data[2] = (dev->ht_regs[0xf5] & (1 << (((addr + 6) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
fg_data[3] = (dev->ht_regs[0xf5] & (1 << (((addr + 7) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
} else {
|
||||||
|
fg_data[0] = (dev->ht_regs[0xf5] & (1 << (((addr + 0) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
fg_data[1] = (dev->ht_regs[0xf5] & (1 << (((addr + 1) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
fg_data[2] = (dev->ht_regs[0xf5] & (1 << (((addr + 2) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
fg_data[3] = (dev->ht_regs[0xf5] & (1 << (((addr + 3) & 7) ^ 7))) ? dev->ht_regs[0xfa] : dev->ht_regs[0xfb];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x08:
|
||||||
|
fg_data[0] = dev->ht_regs[0xec];
|
||||||
|
fg_data[1] = dev->ht_regs[0xed];
|
||||||
|
fg_data[2] = dev->ht_regs[0xee];
|
||||||
|
fg_data[3] = dev->ht_regs[0xef];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x0c:
|
||||||
|
fg_data[0] = dev->ht_regs[0xec];
|
||||||
|
fg_data[1] = dev->ht_regs[0xed];
|
||||||
|
fg_data[2] = dev->ht_regs[0xee];
|
||||||
|
fg_data[3] = dev->ht_regs[0xef];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (svga->writemode) {
|
||||||
|
case 1:
|
||||||
|
if (writemask2 & 1) svga->vram[addr] = svga->latch & 0xff;
|
||||||
|
if (writemask2 & 2) svga->vram[addr | 0x1] = (svga->latch >> 8) & 0xff;
|
||||||
|
if (writemask2 & 4) svga->vram[addr | 0x2] = (svga->latch >> 16) & 0xff;
|
||||||
|
if (writemask2 & 8) svga->vram[addr | 0x3] = (svga->latch >> 24) & 0xff;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
if (svga->gdcreg[8] == 0xff && !(svga->gdcreg[3] & 0x18) &&
|
||||||
|
(!svga->gdcreg[1] || svga->set_reset_disabled)) {
|
||||||
|
if (writemask2 & 1) svga->vram[addr] = fg_data[0];
|
||||||
|
if (writemask2 & 2) svga->vram[addr | 0x1] = fg_data[1];
|
||||||
|
if (writemask2 & 4) svga->vram[addr | 0x2] = fg_data[2];
|
||||||
|
if (writemask2 & 8) svga->vram[addr | 0x3] = fg_data[3];
|
||||||
|
} else {
|
||||||
|
if (svga->gdcreg[1] & 1) vala = (svga->gdcreg[0] & 1) ? 0xff : 0;
|
||||||
|
else vala = fg_data[0];
|
||||||
|
if (svga->gdcreg[1] & 2) valb = (svga->gdcreg[0] & 2) ? 0xff : 0;
|
||||||
|
else valb = fg_data[1];
|
||||||
|
if (svga->gdcreg[1] & 4) valc = (svga->gdcreg[0] & 4) ? 0xff : 0;
|
||||||
|
else valc = fg_data[2];
|
||||||
|
if (svga->gdcreg[1] & 8) vald = (svga->gdcreg[0] & 8) ? 0xff : 0;
|
||||||
|
else vald = fg_data[3];
|
||||||
|
|
||||||
|
switch (svga->gdcreg[3] & 0x18) {
|
||||||
|
case 0: /* set */
|
||||||
|
if (writemask2 & 1) svga->vram[addr] = (vala & svga->gdcreg[8]) | ((svga->latch & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
if (writemask2 & 2) svga->vram[addr | 0x1] = (valb & svga->gdcreg[8]) | (((svga->latch >> 8) & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
if (writemask2 & 4) svga->vram[addr | 0x2] = (valc & svga->gdcreg[8]) | (((svga->latch >> 16) & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
if (writemask2 & 8) svga->vram[addr | 0x3] = (vald & svga->gdcreg[8]) | (((svga->latch >> 24) & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8: /* AND */
|
||||||
|
if (writemask2 & 1) svga->vram[addr] = (vala | ~svga->gdcreg[8]) & (svga->latch & 0xff);
|
||||||
|
if (writemask2 & 2) svga->vram[addr | 0x1] = (valb | ~svga->gdcreg[8]) & ((svga->latch >> 8) & 0xff);
|
||||||
|
if (writemask2 & 4) svga->vram[addr | 0x2] = (valc | ~svga->gdcreg[8]) & ((svga->latch >> 16) & 0xff);
|
||||||
|
if (writemask2 & 8) svga->vram[addr | 0x3] = (vald | ~svga->gdcreg[8]) & ((svga->latch >> 24) & 0xff);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x10: /* OR */
|
||||||
|
if (writemask2 & 1) svga->vram[addr] = (vala & svga->gdcreg[8]) | (svga->latch & 0xff);
|
||||||
|
if (writemask2 & 2) svga->vram[addr | 0x1] = (valb & svga->gdcreg[8]) | ((svga->latch >> 8) & 0xff);
|
||||||
|
if (writemask2 & 4) svga->vram[addr | 0x2] = (valc & svga->gdcreg[8]) | ((svga->latch >> 16) & 0xff);
|
||||||
|
if (writemask2 & 8) svga->vram[addr | 0x3] = (vald & svga->gdcreg[8]) | ((svga->latch >> 24) & 0xff);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x18: /* XOR */
|
||||||
|
if (writemask2 & 1) svga->vram[addr] = (vala & svga->gdcreg[8]) ^ (svga->latch & 0xff);
|
||||||
|
if (writemask2 & 2) svga->vram[addr | 0x1] = (valb & svga->gdcreg[8]) ^ ((svga->latch >> 8) & 0xff);
|
||||||
|
if (writemask2 & 4) svga->vram[addr | 0x2] = (valc & svga->gdcreg[8]) ^ ((svga->latch >> 16) & 0xff);
|
||||||
|
if (writemask2 & 8) svga->vram[addr | 0x3] = (vald & svga->gdcreg[8]) ^ ((svga->latch >> 24) & 0xff);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
if (!(svga->gdcreg[3] & 0x18) && (!svga->gdcreg[1] || svga->set_reset_disabled)) {
|
||||||
|
if (writemask2 & 1) svga->vram[addr] = (((cpu_dat & 1) ? 0xff : 0) & svga->gdcreg[8]) | ((svga->latch & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
if (writemask2 & 2) svga->vram[addr | 0x1] = (((cpu_dat & 2) ? 0xff : 0) & svga->gdcreg[8]) | (((svga->latch >> 8) & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
if (writemask2 & 4) svga->vram[addr | 0x2] = (((cpu_dat & 4) ? 0xff : 0) & svga->gdcreg[8]) | (((svga->latch >> 16) & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
if (writemask2 & 8) svga->vram[addr | 0x3] = (((cpu_dat & 8) ? 0xff : 0) & svga->gdcreg[8]) | (((svga->latch >> 24) & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
} else {
|
||||||
|
vala = ((cpu_dat & 1) ? 0xff : 0);
|
||||||
|
valb = ((cpu_dat & 2) ? 0xff : 0);
|
||||||
|
valc = ((cpu_dat & 4) ? 0xff : 0);
|
||||||
|
vald = ((cpu_dat & 8) ? 0xff : 0);
|
||||||
|
switch (svga->gdcreg[3] & 0x18) {
|
||||||
|
case 0: /* set */
|
||||||
|
if (writemask2 & 1) svga->vram[addr] = (vala & svga->gdcreg[8]) | ((svga->latch & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
if (writemask2 & 2) svga->vram[addr | 0x1] = (valb & svga->gdcreg[8]) | (((svga->latch >> 8) & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
if (writemask2 & 4) svga->vram[addr | 0x2] = (valc & svga->gdcreg[8]) | (((svga->latch >> 16) & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
if (writemask2 & 8) svga->vram[addr | 0x3] = (vald & svga->gdcreg[8]) | (((svga->latch >> 24) & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8: /* AND */
|
||||||
|
if (writemask2 & 1) svga->vram[addr] = (vala | ~svga->gdcreg[8]) & (svga->latch & 0xff);
|
||||||
|
if (writemask2 & 2) svga->vram[addr | 0x1] = (valb | ~svga->gdcreg[8]) & ((svga->latch >> 8) & 0xff);
|
||||||
|
if (writemask2 & 4) svga->vram[addr | 0x2] = (valc | ~svga->gdcreg[8]) & ((svga->latch >> 16) & 0xff);
|
||||||
|
if (writemask2 & 8) svga->vram[addr | 0x3] = (vald | ~svga->gdcreg[8]) & ((svga->latch >> 24) & 0xff);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x10: /* OR */
|
||||||
|
if (writemask2 & 1) svga->vram[addr] = (vala & svga->gdcreg[8]) | (svga->latch & 0xff);
|
||||||
|
if (writemask2 & 2) svga->vram[addr | 0x1] = (valb & svga->gdcreg[8]) | ((svga->latch >> 8) & 0xff);
|
||||||
|
if (writemask2 & 4) svga->vram[addr | 0x2] = (valc & svga->gdcreg[8]) | ((svga->latch >> 16) & 0xff);
|
||||||
|
if (writemask2 & 8) svga->vram[addr | 0x3] = (vald & svga->gdcreg[8]) | ((svga->latch >> 24) & 0xff);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x18: /* XOR */
|
||||||
|
if (writemask2 & 1) svga->vram[addr] = (vala & svga->gdcreg[8]) ^ (svga->latch & 0xff);
|
||||||
|
if (writemask2 & 2) svga->vram[addr | 0x1] = (valb & svga->gdcreg[8]) ^ ((svga->latch >> 8) & 0xff);
|
||||||
|
if (writemask2 & 4) svga->vram[addr | 0x2] = (valc & svga->gdcreg[8]) ^ ((svga->latch >> 16) & 0xff);
|
||||||
|
if (writemask2 & 8) svga->vram[addr | 0x3] = (vald & svga->gdcreg[8]) ^ ((svga->latch >> 24) & 0xff);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
wm = svga->gdcreg[8];
|
||||||
|
svga->gdcreg[8] &= cpu_dat;
|
||||||
|
|
||||||
|
vala = (svga->gdcreg[0] & 1) ? 0xff : 0;
|
||||||
|
valb = (svga->gdcreg[0] & 2) ? 0xff : 0;
|
||||||
|
valc = (svga->gdcreg[0] & 4) ? 0xff : 0;
|
||||||
|
vald = (svga->gdcreg[0] & 8) ? 0xff : 0;
|
||||||
|
switch (svga->gdcreg[3] & 0x18) {
|
||||||
|
case 0: /* set */
|
||||||
|
if (writemask2 & 1) svga->vram[addr] = (vala & svga->gdcreg[8]) | ((svga->latch & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
if (writemask2 & 2) svga->vram[addr | 0x1] = (valb & svga->gdcreg[8]) | (((svga->latch >> 8) & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
if (writemask2 & 4) svga->vram[addr | 0x2] = (valc & svga->gdcreg[8]) | (((svga->latch >> 16) & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
if (writemask2 & 8) svga->vram[addr | 0x3] = (vald & svga->gdcreg[8]) | (((svga->latch >> 24) & 0xff) & ~svga->gdcreg[8]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8: /* AND */
|
||||||
|
if (writemask2 & 1) svga->vram[addr] = (vala | ~svga->gdcreg[8]) & (svga->latch & 0xff);
|
||||||
|
if (writemask2 & 2) svga->vram[addr | 0x1] = (valb | ~svga->gdcreg[8]) & ((svga->latch >> 8) & 0xff);
|
||||||
|
if (writemask2 & 4) svga->vram[addr | 0x2] = (valc | ~svga->gdcreg[8]) & ((svga->latch >> 16) & 0xff);
|
||||||
|
if (writemask2 & 8) svga->vram[addr | 0x3] = (vald | ~svga->gdcreg[8]) & ((svga->latch >> 24) & 0xff);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x10: /* OR */
|
||||||
|
if (writemask2 & 1) svga->vram[addr] = (vala & svga->gdcreg[8]) | (svga->latch & 0xff);
|
||||||
|
if (writemask2 & 2) svga->vram[addr | 0x1] = (valb & svga->gdcreg[8]) | ((svga->latch >> 8) & 0xff);
|
||||||
|
if (writemask2 & 4) svga->vram[addr | 0x2] = (valc & svga->gdcreg[8]) | ((svga->latch >> 16) & 0xff);
|
||||||
|
if (writemask2 & 8) svga->vram[addr | 0x3] = (vald & svga->gdcreg[8]) | ((svga->latch >> 24) & 0xff);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x18: /* XOR */
|
||||||
|
if (writemask2 & 1) svga->vram[addr] = (vala & svga->gdcreg[8]) ^ (svga->latch & 0xff);
|
||||||
|
if (writemask2 & 2) svga->vram[addr | 0x1] = (valb & svga->gdcreg[8]) ^ ((svga->latch >> 8) & 0xff);
|
||||||
|
if (writemask2 & 4) svga->vram[addr | 0x2] = (valc & svga->gdcreg[8]) ^ ((svga->latch >> 16) & 0xff);
|
||||||
|
if (writemask2 & 8) svga->vram[addr | 0x3] = (vald & svga->gdcreg[8]) ^ ((svga->latch >> 24) & 0xff);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
svga->gdcreg[8] = wm;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dm_extalu_write(ht216_t *dev, uint32_t addr, uint8_t cpu_dat, uint8_t bit_mask, uint8_t cpu_dat_unexpanded, uint8_t rop_select)
|
dm_extalu_write(ht216_t *dev, uint32_t addr, uint8_t cpu_dat, uint8_t bit_mask, uint8_t cpu_dat_unexpanded, uint8_t rop_select)
|
||||||
{
|
{
|
||||||
/*Input B = CD.5
|
/*Input B = CD.5
|
||||||
Input A = FE[3:2]
|
Input A = FE[3:2]
|
||||||
00 = Set/Reset output mode
|
00 = Set/Reset output mode
|
||||||
output = CPU-side ALU input
|
output = CPU-side ALU input
|
||||||
01 = Solid fg/bg mode (3C4:FA/FB)
|
01 = Solid fg/bg mode (3C4:FA/FB)
|
||||||
Bit mask = 3CF.F5 or CPU byte
|
Bit mask = 3CF.F5 or CPU byte
|
||||||
10 = Dithered fg (3CF:EC-EF)
|
10 = Dithered fg (3CF:EC-EF)
|
||||||
11 = RMW (dest data) (set if CD.5 = 1)
|
11 = RMW (dest data) (set if CD.5 = 1)
|
||||||
F/B ROP select = FE[5:4]
|
F/B ROP select = FE[5:4]
|
||||||
00 = CPU byte
|
00 = CPU byte
|
||||||
01 = Bit mask (3CF:8)
|
01 = Bit mask (3CF:8)
|
||||||
1x = (3C4:F5)*/
|
1x = (3C4:F5)*/
|
||||||
|
|
||||||
svga_t *svga = &dev->svga;
|
svga_t *svga = &dev->svga;
|
||||||
uint8_t input_a = 0, input_b = 0;
|
uint8_t input_a = 0, input_b = 0;
|
||||||
uint8_t fg, bg;
|
uint8_t fg, bg;
|
||||||
@@ -566,44 +790,47 @@ write_common(ht216_t *dev, uint32_t addr, uint8_t val)
|
|||||||
01 = Bit mask (3CF:8)
|
01 = Bit mask (3CF:8)
|
||||||
1x = (3C4:F5)
|
1x = (3C4:F5)
|
||||||
*/
|
*/
|
||||||
uint8_t bit_mask = 0, rop_select = 0;
|
|
||||||
svga_t *svga = &dev->svga;
|
svga_t *svga = &dev->svga;
|
||||||
|
uint8_t bit_mask = 0, rop_select = 0;
|
||||||
|
|
||||||
|
cycles -= video_timing_write_b;
|
||||||
|
|
||||||
addr &= 0xfffff;
|
addr &= 0xfffff;
|
||||||
|
|
||||||
val = svga_rotate[svga->gdcreg[3] & 7][val];
|
val = svga_rotate[svga->gdcreg[3] & 7][val];
|
||||||
|
|
||||||
switch (dev->ht_regs[0xcd] & HT_REG_CD_BMSKSL) {
|
if (dev->ht_regs[0xcd] & HT_REG_CD_EXALU) {
|
||||||
case 0x00:
|
/*Extended ALU*/
|
||||||
bit_mask = svga->gdcreg[8];
|
switch (dev->ht_regs[0xfe] & HT_REG_FE_FBRSL) {
|
||||||
break;
|
case 0x00:
|
||||||
|
rop_select = val;
|
||||||
|
break;
|
||||||
|
|
||||||
case 0x04:
|
case 0x10:
|
||||||
bit_mask = val;
|
rop_select = svga->gdcreg[8];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x08:
|
case 0x20:
|
||||||
case 0x0c:
|
case 0x30:
|
||||||
bit_mask = dev->ht_regs[0xf5];
|
rop_select = dev->ht_regs[0xf5];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (dev->ht_regs[0xfe] & HT_REG_FE_FBRSL) {
|
switch (dev->ht_regs[0xcd] & HT_REG_CD_BMSKSL) {
|
||||||
case 0x00:
|
case 0x00:
|
||||||
rop_select = val;
|
bit_mask = svga->gdcreg[8];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x10:
|
case 0x04:
|
||||||
rop_select = svga->gdcreg[8];
|
bit_mask = val;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x20:
|
case 0x08:
|
||||||
case 0x30:
|
case 0x0c:
|
||||||
rop_select = dev->ht_regs[0xf5];
|
bit_mask = dev->ht_regs[0xf5];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->ht_regs[0xcd] & HT_REG_CD_EXALU) { /*Extended ALU*/
|
|
||||||
if (dev->ht_regs[0xcd] & HT_REG_CD_FP8PCEXP) { /*1->8 bit expansion*/
|
if (dev->ht_regs[0xcd] & HT_REG_CD_FP8PCEXP) { /*1->8 bit expansion*/
|
||||||
addr = (addr << 3) & 0xfffff;
|
addr = (addr << 3) & 0xfffff;
|
||||||
dm_extalu_write(dev, addr, (val & 0x80) ? 0xff : 0, (bit_mask & 0x80) ? 0xff : 0, val, (rop_select & 0x80) ? 0xff : 0);
|
dm_extalu_write(dev, addr, (val & 0x80) ? 0xff : 0, (bit_mask & 0x80) ? 0xff : 0, val, (rop_select & 0x80) ? 0xff : 0);
|
||||||
@@ -616,6 +843,19 @@ write_common(ht216_t *dev, uint32_t addr, uint8_t val)
|
|||||||
dm_extalu_write(dev, addr + 7, (val & 0x01) ? 0xff : 0, (bit_mask & 0x01) ? 0xff : 0, val, (rop_select & 0x01) ? 0xff : 0);
|
dm_extalu_write(dev, addr + 7, (val & 0x01) ? 0xff : 0, (bit_mask & 0x01) ? 0xff : 0, val, (rop_select & 0x01) ? 0xff : 0);
|
||||||
} else
|
} else
|
||||||
dm_extalu_write(dev, addr, val, bit_mask, val, rop_select);
|
dm_extalu_write(dev, addr, val, bit_mask, val, rop_select);
|
||||||
|
} else {
|
||||||
|
if (dev->ht_regs[0xcd] & HT_REG_CD_FP8PCEXP) { /*1->8 bit expansion*/
|
||||||
|
addr = (addr << 3) & 0xfffff;
|
||||||
|
dm_write(dev, addr, (val & 0x80) ? 0xff : 0, val);
|
||||||
|
dm_write(dev, addr + 1, (val & 0x40) ? 0xff : 0, val);
|
||||||
|
dm_write(dev, addr + 2, (val & 0x20) ? 0xff : 0, val);
|
||||||
|
dm_write(dev, addr + 3, (val & 0x10) ? 0xff : 0, val);
|
||||||
|
dm_write(dev, addr + 4, (val & 0x08) ? 0xff : 0, val);
|
||||||
|
dm_write(dev, addr + 5, (val & 0x04) ? 0xff : 0, val);
|
||||||
|
dm_write(dev, addr + 6, (val & 0x02) ? 0xff : 0, val);
|
||||||
|
dm_write(dev, addr + 7, (val & 0x01) ? 0xff : 0, val);
|
||||||
|
} else
|
||||||
|
dm_write(dev, addr, val, val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -632,7 +872,7 @@ ht216_write(uint32_t addr, uint8_t val, void *priv)
|
|||||||
if (dev->ht_regs[0xcd])
|
if (dev->ht_regs[0xcd])
|
||||||
write_common(dev, addr, val);
|
write_common(dev, addr, val);
|
||||||
else
|
else
|
||||||
svga_write_linear(addr, val, svga);
|
svga_write_linear(addr, val, &dev->svga);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -644,12 +884,11 @@ ht216_writew(uint32_t addr, uint16_t val, void *priv)
|
|||||||
|
|
||||||
addr &= svga->banked_mask;
|
addr &= svga->banked_mask;
|
||||||
addr = (addr & 0x7fff) + dev->write_bank[(addr >> 15) & 1];
|
addr = (addr & 0x7fff) + dev->write_bank[(addr >> 15) & 1];
|
||||||
|
|
||||||
if (dev->ht_regs[0xcd]) {
|
if (dev->ht_regs[0xcd]) {
|
||||||
write_common(dev, addr, val & 0xff);
|
write_common(dev, addr, val);
|
||||||
write_common(dev, addr+1, val >> 8);
|
write_common(dev, addr+1, val >> 8);
|
||||||
} else
|
} else
|
||||||
svga_writew_linear(addr, val, svga);
|
svga_writew_linear(addr, val, &dev->svga);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
19
src/pc.c
19
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.76 2019/05/09
|
* Version: @(#)pc.c 1.0.76 2019/05/10
|
||||||
*
|
*
|
||||||
* 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>
|
||||||
@@ -226,12 +226,12 @@ pclog_repeat(int enabled)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
/* Log a block of code around the current CS:IP. */
|
/* Log a block of code around the current CS:IP. */
|
||||||
void
|
void
|
||||||
pclog_dump(int num)
|
pclog_dump(int num)
|
||||||
{
|
{
|
||||||
char buff[128];
|
char buff[128];
|
||||||
|
uint32_t addr;
|
||||||
char *sp = NULL;
|
char *sp = NULL;
|
||||||
int i, k;
|
int i, k;
|
||||||
|
|
||||||
@@ -242,32 +242,41 @@ pclog_dump(int num)
|
|||||||
/* Disable the repeat-detection. */
|
/* Disable the repeat-detection. */
|
||||||
pclog_repeat(0);
|
pclog_repeat(0);
|
||||||
|
|
||||||
|
addr = (uint32_t)(_cs.base | cpu_state.pc);
|
||||||
|
|
||||||
while (i < num) {
|
while (i < num) {
|
||||||
if (sp == NULL) {
|
if (sp == NULL) {
|
||||||
sp = buff;
|
sp = buff;
|
||||||
sprintf(sp, "%08lx:", (unsigned long)cpu_state.pc + i);
|
sprintf(sp, "%08x:", addr + i);
|
||||||
sp += strlen(sp);
|
sp += strlen(sp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get byte from memory. */
|
/* Get byte from memory. */
|
||||||
k = readmembl(cpu_state.pc + i);
|
k = readmembl(addr + i);
|
||||||
i++;
|
i++;
|
||||||
|
|
||||||
sprintf(sp, " %02x", k & 0xff);
|
sprintf(sp, " %02x", k & 0xff);
|
||||||
sp += strlen(sp);
|
sp += strlen(sp);
|
||||||
|
|
||||||
if ((i % 16) == 0) {
|
if ((i % 16) == 0) {
|
||||||
|
#ifdef _DEBUG
|
||||||
|
INFO("%s\n", buff);
|
||||||
|
#else
|
||||||
DBGLOG(2, "%s\n", buff);
|
DBGLOG(2, "%s\n", buff);
|
||||||
|
#endif
|
||||||
sp = NULL;
|
sp = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sp != NULL)
|
if (sp != NULL)
|
||||||
|
#ifdef _DEBUG
|
||||||
|
INFO("%s\n", buff);
|
||||||
|
#else
|
||||||
DBGLOG(2, "%s\n", buff);
|
DBGLOG(2, "%s\n", buff);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Re-enable the repeat-detection. */
|
/* Re-enable the repeat-detection. */
|
||||||
pclog_repeat(1);
|
pclog_repeat(1);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Log a fatal error, and display a UI message before exiting. */
|
/* Log a fatal error, and display a UI message before exiting. */
|
||||||
|
|||||||
22
src/rom.c
22
src/rom.c
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Handling of ROM image files.
|
* Handling of ROM image files.
|
||||||
*
|
*
|
||||||
* Version: @(#)rom.c 1.0.20 2019/05/05
|
* Version: @(#)rom.c 1.0.21 2019/05/10
|
||||||
*
|
*
|
||||||
* 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>
|
||||||
@@ -91,6 +91,12 @@ rom_read(uint32_t addr, void *priv)
|
|||||||
DEBUG("ROM: read byte from BIOS at %06lX\n", addr);
|
DEBUG("ROM: read byte from BIOS at %06lX\n", addr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (addr < ptr->mapping.base)
|
||||||
|
return 0xff;
|
||||||
|
|
||||||
|
if (addr >= (ptr->mapping.base + ptr->sz))
|
||||||
|
return 0xff;
|
||||||
|
|
||||||
return(ptr->rom[addr & ptr->mask]);
|
return(ptr->rom[addr & ptr->mask]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,6 +112,12 @@ rom_readw(uint32_t addr, void *priv)
|
|||||||
DEBUG("ROM: read word from BIOS at %06lX\n", addr);
|
DEBUG("ROM: read word from BIOS at %06lX\n", addr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (addr < (ptr->mapping.base - 1))
|
||||||
|
return 0xffff;
|
||||||
|
|
||||||
|
if (addr >= (ptr->mapping.base + ptr->sz))
|
||||||
|
return 0xffff;
|
||||||
|
|
||||||
return(*(uint16_t *)&ptr->rom[addr & ptr->mask]);
|
return(*(uint16_t *)&ptr->rom[addr & ptr->mask]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,6 +133,12 @@ rom_readl(uint32_t addr, void *priv)
|
|||||||
DEBUG("ROM: read long from BIOS at %06lX\n", addr);
|
DEBUG("ROM: read long from BIOS at %06lX\n", addr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (addr < (ptr->mapping.base - 3))
|
||||||
|
return 0xffffffff;
|
||||||
|
|
||||||
|
if (addr >= (ptr->mapping.base + ptr->sz))
|
||||||
|
return 0xffffffff;
|
||||||
|
|
||||||
return(*(uint32_t *)&ptr->rom[addr & ptr->mask]);
|
return(*(uint32_t *)&ptr->rom[addr & ptr->mask]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -355,6 +373,7 @@ rom_init(rom_t *ptr, const wchar_t *fn, uint32_t addr, int sz, int mask, int off
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ptr->sz = sz;
|
||||||
ptr->mask = mask;
|
ptr->mask = mask;
|
||||||
|
|
||||||
mem_map_add(&ptr->mapping, addr, sz,
|
mem_map_add(&ptr->mapping, addr, sz,
|
||||||
@@ -381,6 +400,7 @@ rom_init_interleaved(rom_t *ptr, const wchar_t *fnl, const wchar_t *fnh, uint32_
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ptr->sz = sz;
|
||||||
ptr->mask = mask;
|
ptr->mask = mask;
|
||||||
|
|
||||||
mem_map_add(&ptr->mapping, addr, sz,
|
mem_map_add(&ptr->mapping, addr, sz,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Definitions for the ROM image handler.
|
* Definitions for the ROM image handler.
|
||||||
*
|
*
|
||||||
* Version: @(#)rom.h 1.0.14 2019/05/05
|
* Version: @(#)rom.h 1.0.15 2019/05/10
|
||||||
*
|
*
|
||||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
*
|
*
|
||||||
@@ -53,6 +53,7 @@
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t *rom;
|
uint8_t *rom;
|
||||||
|
uint32_t sz;
|
||||||
uint32_t mask;
|
uint32_t mask;
|
||||||
mem_map_t mapping;
|
mem_map_t mapping;
|
||||||
} rom_t;
|
} rom_t;
|
||||||
|
|||||||
Reference in New Issue
Block a user