Merge remote-tracking branch 'origin/master' into c&t_69000
This commit is contained in:
@@ -1223,34 +1223,48 @@ static void
|
|||||||
add(int bits)
|
add(int bits)
|
||||||
{
|
{
|
||||||
int size_mask = (1 << bits) - 1;
|
int size_mask = (1 << bits) - 1;
|
||||||
|
int special_case = 0;
|
||||||
|
uint32_t temp_src = cpu_src;
|
||||||
|
|
||||||
|
if ((cpu_alu_op == 2) && !(cpu_src & size_mask) && (cpu_state.flags & C_FLAG))
|
||||||
|
special_case = 1;
|
||||||
|
|
||||||
cpu_data = cpu_dest + cpu_src;
|
cpu_data = cpu_dest + cpu_src;
|
||||||
|
if ((cpu_alu_op == 2) && (cpu_state.flags & C_FLAG))
|
||||||
|
cpu_src--;
|
||||||
set_apzs(bits);
|
set_apzs(bits);
|
||||||
set_of_add(bits);
|
set_of_add(bits);
|
||||||
|
|
||||||
/* Anything - FF with carry on is basically anything + 0x100: value stays
|
/* Anything - FF with carry on is basically anything + 0x100: value stays
|
||||||
unchanged but carry goes on. */
|
unchanged but carry goes on. */
|
||||||
if ((cpu_alu_op == 2) && !(cpu_src & size_mask) && (cpu_state.flags & C_FLAG))
|
if (special_case)
|
||||||
cpu_state.flags |= C_FLAG;
|
cpu_state.flags |= C_FLAG;
|
||||||
else
|
else
|
||||||
set_cf((cpu_src & size_mask) > (cpu_data & size_mask));
|
set_cf((temp_src & size_mask) > (cpu_data & size_mask));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sub(int bits)
|
sub(int bits)
|
||||||
{
|
{
|
||||||
int size_mask = (1 << bits) - 1;
|
int size_mask = (1 << bits) - 1;
|
||||||
|
int special_case = 0;
|
||||||
|
uint32_t temp_src = cpu_src;
|
||||||
|
|
||||||
|
if ((cpu_alu_op == 3) && !(cpu_src & size_mask) && (cpu_state.flags & C_FLAG))
|
||||||
|
special_case = 1;
|
||||||
|
|
||||||
cpu_data = cpu_dest - cpu_src;
|
cpu_data = cpu_dest - cpu_src;
|
||||||
|
if ((cpu_alu_op == 3) && (cpu_state.flags & C_FLAG))
|
||||||
|
cpu_src--;
|
||||||
set_apzs(bits);
|
set_apzs(bits);
|
||||||
set_of_sub(bits);
|
set_of_sub(bits);
|
||||||
|
|
||||||
/* Anything - FF with carry on is basically anything - 0x100: value stays
|
/* Anything - FF with carry on is basically anything - 0x100: value stays
|
||||||
unchanged but carry goes on. */
|
unchanged but carry goes on. */
|
||||||
if ((cpu_alu_op == 3) && !(cpu_src & size_mask) && (cpu_state.flags & C_FLAG))
|
if (special_case)
|
||||||
cpu_state.flags |= C_FLAG;
|
cpu_state.flags |= C_FLAG;
|
||||||
else
|
else
|
||||||
set_cf((cpu_src & size_mask) > (cpu_dest & size_mask));
|
set_cf((temp_src & size_mask) > (cpu_dest & size_mask));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
47
src/dma.c
47
src/dma.c
@@ -949,16 +949,47 @@ dma_page_read(uint16_t addr, UNUSED(void *priv))
|
|||||||
uint8_t convert[8] = CHANNELS;
|
uint8_t convert[8] = CHANNELS;
|
||||||
uint8_t ret = 0xff;
|
uint8_t ret = 0xff;
|
||||||
|
|
||||||
addr &= 0x0f;
|
if (((addr & 0xfffc) == 0x80) && (CS == 0xf000) &&
|
||||||
ret = dmaregs[2][addr];
|
((cpu_state.pc & 0xfffffff8) == 0x00007278) &&
|
||||||
|
!strcmp(machine_get_internal_name(), "megapc")) switch (addr) {
|
||||||
|
/* The Amstrad MegaPC Quadtel BIOS times a sequence of:
|
||||||
|
mov ax,di
|
||||||
|
div bx
|
||||||
|
And expects this value to be at least 0x06e0 for 20 MHz,
|
||||||
|
and at least 0x0898 for 25 MHz, everything below 0x06e0
|
||||||
|
is assumed to be 16 MHz. Given that for some reason, this
|
||||||
|
does not occur on 86Box, we have to work around it here,
|
||||||
|
we return 0x0580 for 16 MHz, because it logically follows
|
||||||
|
in the sequence (0x06e0 = 0x0898 * (20 / 25), and
|
||||||
|
0x0580 = 0x06e0 * (16 / 20)). */
|
||||||
|
case 0x0081:
|
||||||
|
if (cpu_busspeed >= 25000000)
|
||||||
|
ret = 0x98;
|
||||||
|
else if (cpu_busspeed >= 20000000)
|
||||||
|
ret = 0xe0;
|
||||||
|
else
|
||||||
|
ret = 0x80;
|
||||||
|
break;
|
||||||
|
case 0x0082:
|
||||||
|
if (cpu_busspeed >= 25000000)
|
||||||
|
ret = 0x08;
|
||||||
|
else if (cpu_busspeed >= 20000000)
|
||||||
|
ret = 0x06;
|
||||||
|
else
|
||||||
|
ret = 0x05;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
addr &= 0x0f;
|
||||||
|
ret = dmaregs[2][addr];
|
||||||
|
|
||||||
if (addr >= 8)
|
if (addr >= 8)
|
||||||
addr = convert[addr & 0x07] | 4;
|
addr = convert[addr & 0x07] | 4;
|
||||||
else
|
else
|
||||||
addr = convert[addr & 0x07];
|
addr = convert[addr & 0x07];
|
||||||
|
|
||||||
if (addr < 8)
|
if (addr < 8)
|
||||||
ret = dma[addr].page_l;
|
ret = dma[addr].page_l;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4628,8 +4628,8 @@ const machine_t machines[] = {
|
|||||||
.cpu = {
|
.cpu = {
|
||||||
.package = CPU_PKG_386SX,
|
.package = CPU_PKG_386SX,
|
||||||
.block = CPU_BLOCK_NONE,
|
.block = CPU_BLOCK_NONE,
|
||||||
.min_bus = 0,
|
.min_bus = 16000000,
|
||||||
.max_bus = 0,
|
.max_bus = 25000000,
|
||||||
.min_voltage = 0,
|
.min_voltage = 0,
|
||||||
.max_voltage = 0,
|
.max_voltage = 0,
|
||||||
.min_multi = 0,
|
.min_multi = 0,
|
||||||
|
|||||||
Reference in New Issue
Block a user