mirror of
https://github.com/86Box/86Box.git
synced 2026-02-24 20:35:32 -07:00
Merge branch 'master' into pc98x1
This commit is contained in:
@@ -170,20 +170,20 @@ umc_8886_irq_recalc(umc_8886_t *dev)
|
||||
int irq_routing;
|
||||
uint8_t *conf = dev->pci_conf_sb[0];
|
||||
|
||||
irq_routing = (conf[0x46] & 0x01) ? (conf[0x43] >> 8) : PCI_IRQ_DISABLED;
|
||||
irq_routing = (conf[0x46] & 0x01) ? (conf[0x43] >> 4) : PCI_IRQ_DISABLED;
|
||||
pci_set_irq_routing(PCI_INTA, irq_routing);
|
||||
irq_routing = (conf[0x46] & 0x02) ? (conf[0x43] & 0x0f) : PCI_IRQ_DISABLED;
|
||||
pci_set_irq_routing(PCI_INTB, irq_routing);
|
||||
|
||||
irq_routing = (conf[0x46] & 0x04) ? (conf[0x44] >> 8) : PCI_IRQ_DISABLED;
|
||||
irq_routing = (conf[0x46] & 0x04) ? (conf[0x44] >> 4) : PCI_IRQ_DISABLED;
|
||||
pci_set_irq_routing(PCI_INTC, irq_routing);
|
||||
irq_routing = (conf[0x46] & 0x08) ? (conf[0x44] & 0x0f) : PCI_IRQ_DISABLED;
|
||||
pci_set_irq_routing(PCI_INTD, irq_routing);
|
||||
|
||||
pci_set_irq_level(PCI_INTA, !!(conf[0x47] & 0x01));
|
||||
pci_set_irq_level(PCI_INTB, !!(conf[0x47] & 0x02));
|
||||
pci_set_irq_level(PCI_INTC, !!(conf[0x47] & 0x04));
|
||||
pci_set_irq_level(PCI_INTD, !!(conf[0x47] & 0x08));
|
||||
pci_set_irq_level(PCI_INTA, (conf[0x47] & 0x01));
|
||||
pci_set_irq_level(PCI_INTB, (conf[0x47] & 0x02));
|
||||
pci_set_irq_level(PCI_INTC, (conf[0x47] & 0x04));
|
||||
pci_set_irq_level(PCI_INTD, (conf[0x47] & 0x08));
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -322,6 +322,8 @@ void
|
||||
mtouch_write_to_host(void *priv)
|
||||
{
|
||||
mouse_microtouch_t *dev = (mouse_microtouch_t *) priv;
|
||||
if (dev->serial == NULL)
|
||||
goto no_write_to_machine;
|
||||
if ((dev->serial->type >= SERIAL_16550) && dev->serial->fifo_enabled) {
|
||||
if (fifo_get_full(dev->serial->rcvr_fifo)) {
|
||||
goto no_write_to_machine;
|
||||
|
||||
@@ -142,7 +142,8 @@ sermouse_transmit_byte(mouse_t *dev, int do_next)
|
||||
if (dev->buf_pos == 0)
|
||||
dev->acc_time = 0.0;
|
||||
|
||||
serial_write_fifo(dev->serial, dev->buf[dev->buf_pos]);
|
||||
if (dev->serial)
|
||||
serial_write_fifo(dev->serial, dev->buf[dev->buf_pos]);
|
||||
|
||||
if (do_next) {
|
||||
dev->buf_pos = (dev->buf_pos + 1) % dev->buf_len;
|
||||
|
||||
@@ -1252,7 +1252,10 @@ ide_write_data(ide_t *ide, const uint16_t val)
|
||||
const double xfer_time = ide_get_xfer_time(ide, 512);
|
||||
const double wait_time = seek_time + xfer_time;
|
||||
if (ide->command == WIN_WRITE_MULTIPLE) {
|
||||
if ((ide->blockcount + 1) >= ide->blocksize || ide->tf->secount == 1) {
|
||||
if (hdd[ide->hdd_num].speed_preset == 0) {
|
||||
ide->pending_delay = 0;
|
||||
ide_callback(ide);
|
||||
} else if ((ide->blockcount + 1) >= ide->blocksize || ide->tf->secount == 1) {
|
||||
ide_set_callback(ide, seek_time + xfer_time + ide->pending_delay);
|
||||
ide->pending_delay = 0;
|
||||
} else {
|
||||
@@ -1607,9 +1610,13 @@ ide_writeb(uint16_t addr, uint8_t val, void *priv)
|
||||
ide->sc->callback = 100.0 * IDE_TIME;
|
||||
ide_set_callback(ide, 100.0 * IDE_TIME);
|
||||
} else {
|
||||
double seek_time = hdd_seek_get_time(&hdd[ide->hdd_num], (val & 0x60) ?
|
||||
ide_get_sector(ide) : 0, HDD_OP_SEEK, 0, 0.0);
|
||||
ide_set_callback(ide, seek_time);
|
||||
if (hdd[ide->hdd_num].speed_preset == 0)
|
||||
ide_set_callback(ide, 100.0 * IDE_TIME);
|
||||
else {
|
||||
double seek_time = hdd_seek_get_time(&hdd[ide->hdd_num], (val & 0x60) ?
|
||||
ide_get_sector(ide) : 0, HDD_OP_SEEK, 0, 0.0);
|
||||
ide_set_callback(ide, seek_time);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1652,6 +1659,10 @@ ide_writeb(uint16_t addr, uint8_t val, void *priv)
|
||||
ide_get_sector(ide), sec_count);
|
||||
double xfer_time = ide_get_xfer_time(ide, 512 * sec_count);
|
||||
wait_time = seek_time > xfer_time ? seek_time : xfer_time;
|
||||
} else if ((val == WIN_READ_MULTIPLE) && (hdd[ide->hdd_num].speed_preset == 0)) {
|
||||
ide_set_callback(ide, 200.0 * IDE_TIME);
|
||||
ide->do_initial_read = 1;
|
||||
break;
|
||||
} else if ((val == WIN_READ_MULTIPLE) && (ide->blocksize > 0)) {
|
||||
sec_count = ide->tf->secount ? ide->tf->secount : 256;
|
||||
if (sec_count > ide->blocksize)
|
||||
@@ -1848,7 +1859,9 @@ ide_read_data(ide_t *ide)
|
||||
ide_next_sector(ide);
|
||||
ide->tf->atastat = BSY_STAT | READY_STAT | DSC_STAT;
|
||||
if (ide->command == WIN_READ_MULTIPLE) {
|
||||
if (!ide->blockcount) {
|
||||
if (hdd[ide->hdd_num].speed_preset == 0)
|
||||
ide_callback(ide);
|
||||
else if (!ide->blockcount) {
|
||||
uint32_t cnt = ide->tf->secount ?
|
||||
ide->tf->secount : 256;
|
||||
if (cnt > ide->blocksize)
|
||||
@@ -1888,8 +1901,7 @@ ide_status(ide_t *ide, ide_t *ide_other, int ch)
|
||||
/* On real hardware, a slave with a present master always
|
||||
returns a status of 0x00.
|
||||
Confirmed by the ATA-3 and ATA-4 specifications. */
|
||||
// ret = 0x00;
|
||||
ret = 0x01;
|
||||
ret = 0x00;
|
||||
} else {
|
||||
ret = ide->tf->atastat;
|
||||
if (ide->type == IDE_ATAPI)
|
||||
|
||||
@@ -824,8 +824,6 @@ dma16_read(uint16_t addr, UNUSED(void *priv))
|
||||
case 7: /*Count registers*/
|
||||
dma_wp[1] ^= 1;
|
||||
count = dma[channel].cc/* + 1*/;
|
||||
// if (count > dma[channel].cb)
|
||||
// count = 0x0000;
|
||||
if (dma_wp[1])
|
||||
ret = count & 0xff;
|
||||
else
|
||||
|
||||
@@ -628,10 +628,12 @@ d86f_get_array_size(int drive, int side, int words)
|
||||
int hole;
|
||||
int rm;
|
||||
int ssd;
|
||||
int mpc;
|
||||
|
||||
rm = d86f_get_rpm_mode(drive);
|
||||
ssd = d86f_get_speed_shift_dir(drive);
|
||||
hole = (d86f_handler[drive].disk_flags(drive) & 6) >> 1;
|
||||
hole = (d86f_handler[drive].disk_flags(drive) >> 1) & 3;
|
||||
mpc = (d86f_handler[drive].disk_flags(drive) >> 13) & 1;
|
||||
|
||||
if (!rm && ssd) /* Special case - extra bit cells size specifies entire array size. */
|
||||
array_size = 0;
|
||||
@@ -703,13 +705,20 @@ d86f_get_array_size(int drive, int side, int words)
|
||||
array_size <<= 4;
|
||||
array_size += d86f_handler[drive].extra_bit_cells(drive, side);
|
||||
|
||||
if (array_size & 15)
|
||||
array_size = (array_size >> 4) + 1;
|
||||
else
|
||||
array_size = (array_size >> 4);
|
||||
if (mpc && !words) {
|
||||
if (array_size & 7)
|
||||
array_size = (array_size >> 3) + 1;
|
||||
else
|
||||
array_size = (array_size >> 3);
|
||||
} else {
|
||||
if (array_size & 15)
|
||||
array_size = (array_size >> 4) + 1;
|
||||
else
|
||||
array_size = (array_size >> 4);
|
||||
|
||||
if (!words)
|
||||
array_size <<= 1;
|
||||
if (!words)
|
||||
array_size <<= 1;
|
||||
}
|
||||
|
||||
return array_size;
|
||||
}
|
||||
@@ -1098,9 +1107,9 @@ d86f_get_bit(int drive, int side)
|
||||
/* In some cases, misindentification occurs so we need to make sure the surface data array is not
|
||||
not NULL. */
|
||||
if (d86f_has_surface_desc(drive) && dev->track_surface_data[side]) {
|
||||
if (d86f_reverse_bytes(drive)) {
|
||||
if (d86f_reverse_bytes(drive))
|
||||
surface_data = dev->track_surface_data[side][track_word] & 0xFF;
|
||||
} else {
|
||||
else {
|
||||
surface_data = (dev->track_surface_data[side][track_word] & 0xFF) << 8;
|
||||
surface_data |= (dev->track_surface_data[side][track_word] >> 8);
|
||||
}
|
||||
@@ -1150,9 +1159,9 @@ d86f_put_bit(int drive, int side, int bit)
|
||||
}
|
||||
|
||||
if (d86f_has_surface_desc(drive)) {
|
||||
if (d86f_reverse_bytes(drive)) {
|
||||
if (d86f_reverse_bytes(drive))
|
||||
surface_data = dev->track_surface_data[side][track_word] & 0xFF;
|
||||
} else {
|
||||
else {
|
||||
surface_data = (dev->track_surface_data[side][track_word] & 0xFF) << 8;
|
||||
surface_data |= (dev->track_surface_data[side][track_word] >> 8);
|
||||
}
|
||||
@@ -1177,9 +1186,9 @@ d86f_put_bit(int drive, int side, int bit)
|
||||
|
||||
surface_data &= ~(1 << track_bit);
|
||||
surface_data |= (surface_bit << track_bit);
|
||||
if (d86f_reverse_bytes(drive)) {
|
||||
if (d86f_reverse_bytes(drive))
|
||||
dev->track_surface_data[side][track_word] = surface_data;
|
||||
} else {
|
||||
else {
|
||||
dev->track_surface_data[side][track_word] = (surface_data & 0xFF) << 8;
|
||||
dev->track_surface_data[side][track_word] |= (surface_data >> 8);
|
||||
}
|
||||
@@ -1191,9 +1200,9 @@ d86f_put_bit(int drive, int side, int bit)
|
||||
encoded_data &= ~(1 << track_bit);
|
||||
encoded_data |= (current_bit << track_bit);
|
||||
|
||||
if (d86f_reverse_bytes(drive)) {
|
||||
if (d86f_reverse_bytes(drive))
|
||||
d86f_handler[drive].encoded_data(drive, side)[track_word] = encoded_data;
|
||||
} else {
|
||||
else {
|
||||
d86f_handler[drive].encoded_data(drive, side)[track_word] = (encoded_data & 0xFF) << 8;
|
||||
d86f_handler[drive].encoded_data(drive, side)[track_word] |= (encoded_data >> 8);
|
||||
}
|
||||
@@ -1833,7 +1842,6 @@ d86f_write_direct_common(int drive, int side, uint16_t byte, uint8_t type, uint3
|
||||
uint16_t mask_data;
|
||||
uint16_t mask_surface;
|
||||
uint16_t mask_hole;
|
||||
uint16_t mask_fuzzy;
|
||||
decoded_t dbyte;
|
||||
decoded_t dpbyte;
|
||||
|
||||
@@ -1866,13 +1874,18 @@ d86f_write_direct_common(int drive, int side, uint16_t byte, uint8_t type, uint3
|
||||
dev->preceding_bit[side] = encoded_byte & 1;
|
||||
|
||||
if (d86f_has_surface_desc(drive)) {
|
||||
mask_data = dev->track_encoded_data[side][pos] ^= 0xFFFF;
|
||||
/* Inverted track data, clear bits are now set. */
|
||||
mask_data = ~dev->track_encoded_data[side][pos];
|
||||
/* Surface data. */
|
||||
mask_surface = dev->track_surface_data[side][pos];
|
||||
mask_hole = (mask_surface & mask_data) ^ 0xFFFF; /* This will retain bits that are both fuzzy and 0, therefore physical holes. */
|
||||
encoded_byte &= mask_hole; /* Filter out physical hole bits from the encoded data. */
|
||||
mask_data ^= 0xFFFF; /* Invert back so bits 1 are 1 again. */
|
||||
mask_fuzzy = (mask_surface & mask_data) ^ 0xFFFF; /* All fuzzy bits are 0. */
|
||||
dev->track_surface_data[side][pos] &= mask_fuzzy; /* Remove fuzzy bits (but not hole bits) from the surface mask, making them regular again. */
|
||||
|
||||
/* Hole = surface & ~data, so holes are one. */
|
||||
mask_hole = mask_surface & mask_data;
|
||||
/* Hole bits are ones again, set the surface data to that. */
|
||||
dev->track_surface_data[side][pos] = mask_hole;
|
||||
|
||||
/* Force the data of any hole to zero. */
|
||||
encoded_byte &= ~mask_hole;
|
||||
}
|
||||
|
||||
dev->track_encoded_data[side][pos] = encoded_byte;
|
||||
@@ -2865,22 +2878,22 @@ d86f_construct_encoded_buffer(int drive, int side)
|
||||
/* Source image has surface description data, so we have some more handling to do. */
|
||||
src1_fuzm = src1[i] & src1_s[i];
|
||||
src2_fuzm = src2[i] & src2_s[i];
|
||||
dst_fuzm = src1_fuzm | src2_fuzm; /* The bits that remain set are fuzzy in either one or
|
||||
the other or both. */
|
||||
src1_holm = src1[i] | (src1_s[i] ^ 0xffff);
|
||||
src2_holm = src2[i] | (src2_s[i] ^ 0xffff);
|
||||
dst_holm = (src1_holm & src2_holm) ^ 0xffff; /* The bits that remain set are holes in both. */
|
||||
dst_neim = (dst_fuzm | dst_holm) ^ 0xffff; /* The bits that remain set are those that are neither
|
||||
fuzzy nor are holes in both. */
|
||||
dst_fuzm = src1_fuzm | src2_fuzm; /* The bits that remain set are fuzzy in either one or
|
||||
the other or both. */
|
||||
src1_holm = ~src1[i] & src1_s[i];
|
||||
src2_holm = ~src2[i] & src2_s[i];
|
||||
dst_holm = src1_holm & src2_holm; /* The bits that remain set are holes in both. */
|
||||
dst_neim = ~(dst_fuzm | dst_holm); /* The bits that remain set are those that are neither
|
||||
fuzzy nor are holes in both. */
|
||||
src1_d = src1[i] & dst_neim;
|
||||
src2_d = src2[i] & dst_neim;
|
||||
|
||||
dst_s[i] = (dst_neim ^ 0xffff); /* The set bits are those that are either fuzzy or are
|
||||
holes in both. */
|
||||
dst[i] = (src1_d | src2_d); /* Initial data is remaining data from Source 1 and
|
||||
Source 2. */
|
||||
dst[i] |= dst_fuzm; /* Add to it the fuzzy bytes (holes have surface bit set
|
||||
but data bit clear). */
|
||||
dst_s[i] = ~dst_neim; /* The set bits are those that are either fuzzy or are
|
||||
holes in both. */
|
||||
dst[i] = (src1_d | src2_d); /* Initial data is remaining data from Source 1 and
|
||||
Source 2. */
|
||||
dst[i] |= dst_fuzm; /* Add to it the fuzzy bytes (holes have surface bit set
|
||||
but data bit clear). */
|
||||
} else {
|
||||
/* No surface data, the handling is much simpler - a simple OR. */
|
||||
dst[i] = src1[i] | src2[i];
|
||||
@@ -2909,15 +2922,14 @@ d86f_decompose_encoded_buffer(int drive, int side)
|
||||
if (d86f_has_surface_desc(drive)) {
|
||||
/* Source image has surface description data, so we have some more handling to do.
|
||||
We need hole masks for both buffers. Holes have data bit clear and surface bit set. */
|
||||
temp = src1[i] & (src1_s[i] ^ 0xffff);
|
||||
temp2 = src2[i] & (src2_s[i] ^ 0xffff);
|
||||
src1[i] = dst[i] & temp;
|
||||
src1_s[i] = temp ^ 0xffff;
|
||||
src2[i] = dst[i] & temp2;
|
||||
src2_s[i] = temp2 ^ 0xffff;
|
||||
} else {
|
||||
temp = ~src1[i] & src1_s[i];
|
||||
temp2 = ~src2[i] & src2_s[i];
|
||||
src1[i] = dst[i] & ~temp;
|
||||
src1_s[i] = temp;
|
||||
src2[i] = dst[i] & ~temp2;
|
||||
src2_s[i] = temp2;
|
||||
} else
|
||||
src1[i] = src2[i] = dst[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3544,9 +3556,9 @@ d86f_load(int drive, char *fn)
|
||||
writeprot[drive] = 1;
|
||||
}
|
||||
|
||||
if (ui_writeprot[drive]) {
|
||||
if (ui_writeprot[drive])
|
||||
writeprot[drive] = 1;
|
||||
}
|
||||
|
||||
fwriteprot[drive] = writeprot[drive];
|
||||
|
||||
fseek(dev->fp, 0, SEEK_END);
|
||||
|
||||
@@ -434,7 +434,7 @@ host_to_modem_cb(void *priv)
|
||||
{
|
||||
modem_t *modem = (modem_t *) priv;
|
||||
|
||||
if (modem->in_warmup)
|
||||
if (modem->in_warmup || (modem->serial == NULL))
|
||||
goto no_write_to_machine;
|
||||
|
||||
if ((modem->serial->type >= SERIAL_16550) && modem->serial->fifo_enabled) {
|
||||
@@ -621,10 +621,12 @@ modem_enter_idle_state(modem_t *modem)
|
||||
}
|
||||
}
|
||||
|
||||
serial_set_cts(modem->serial, 1);
|
||||
serial_set_dsr(modem->serial, 1);
|
||||
serial_set_dcd(modem->serial, (!modem->dcdmode ? 1 : 0));
|
||||
serial_set_ri(modem->serial, 0);
|
||||
if (modem->serial != NULL) {
|
||||
serial_set_cts(modem->serial, 1);
|
||||
serial_set_dsr(modem->serial, 1);
|
||||
serial_set_dcd(modem->serial, (!modem->dcdmode ? 1 : 0));
|
||||
serial_set_ri(modem->serial, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -640,8 +642,11 @@ modem_enter_connected_state(modem_t *modem)
|
||||
plat_netsocket_close(modem->serversocket);
|
||||
modem->serversocket = -1;
|
||||
memset(&modem->telClient, 0, sizeof(modem->telClient));
|
||||
serial_set_dcd(modem->serial, 1);
|
||||
serial_set_ri(modem->serial, 0);
|
||||
|
||||
if (modem->serial != NULL) {
|
||||
serial_set_dcd(modem->serial, 1);
|
||||
serial_set_ri(modem->serial, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1391,7 +1396,8 @@ modem_cmdpause_timer_callback(void *priv)
|
||||
} else {
|
||||
modem->ringing = true;
|
||||
modem_send_res(modem, ResRING);
|
||||
serial_set_ri(modem->serial, !serial_get_ri(modem->serial));
|
||||
if (modem->serial != NULL)
|
||||
serial_set_ri(modem->serial, !serial_get_ri(modem->serial));
|
||||
modem->ringtimer = 3000;
|
||||
modem->reg[MREG_RING_COUNT] = 0;
|
||||
}
|
||||
@@ -1405,7 +1411,8 @@ modem_cmdpause_timer_callback(void *priv)
|
||||
return;
|
||||
}
|
||||
modem_send_res(modem, ResRING);
|
||||
serial_set_ri(modem->serial, !serial_get_ri(modem->serial));
|
||||
if (modem->serial != NULL)
|
||||
serial_set_ri(modem->serial, !serial_get_ri(modem->serial));
|
||||
|
||||
modem->ringtimer = 3000;
|
||||
}
|
||||
|
||||
@@ -352,7 +352,8 @@ enum chip_flags {
|
||||
#define RTL8139_PCI_REVID_8139 0x10
|
||||
#define RTL8139_PCI_REVID_8139CPLUS 0x20
|
||||
|
||||
#define RTL8139_PCI_REVID RTL8139_PCI_REVID_8139CPLUS
|
||||
/* Return 0x10 - the RTL8139C+ datasheet and Windows 2000 driver both confirm this. */
|
||||
#define RTL8139_PCI_REVID RTL8139_PCI_REVID_8139
|
||||
|
||||
#pragma pack(push, 1)
|
||||
typedef struct RTL8139TallyCounters {
|
||||
@@ -3111,7 +3112,7 @@ rtl8139_pci_read(UNUSED(int func), int addr, void *priv)
|
||||
case 0x05:
|
||||
return s->pci_conf[addr & 0xFF] & 1;
|
||||
case 0x08:
|
||||
return 0x20;
|
||||
return RTL8139_PCI_REVID;
|
||||
case 0x09:
|
||||
return 0x0;
|
||||
case 0x0a:
|
||||
|
||||
@@ -1020,7 +1020,7 @@ pas16_nsc_mixer_reset(nsc_mixer_t *mixer)
|
||||
mixer->lmc1982_regs[LMC1982_REG_ISELECT] = 0x01;
|
||||
mixer->lmc1982_regs[LMC1982_REG_LES] = 0x00;
|
||||
mixer->lmc1982_regs[LMC1982_REG_BASS] = mixer->lmc1982_regs[LMC1982_REG_TREBLE] = 0x06;
|
||||
mixer->lmc1982_regs[LMC1982_REG_VOL_L] = mixer->lmc1982_regs[LMC1982_REG_VOL_R] = 0x28;
|
||||
mixer->lmc1982_regs[LMC1982_REG_VOL_L] = mixer->lmc1982_regs[LMC1982_REG_VOL_R] = 0x00; /*0x28*/ /*Note by TC1995: otherwise the volume gets lowered too much*/
|
||||
mixer->lmc1982_regs[LMC1982_REG_MODE] = 0x05;
|
||||
|
||||
lmc1982_recalc(mixer);
|
||||
|
||||
@@ -446,11 +446,47 @@ sb_dsp_set_mpu(sb_dsp_t *dsp, mpu_t *mpu)
|
||||
mpu401_irq_attach(mpu, sb_dsp_irq_update, sb_dsp_irq_pending, dsp);
|
||||
}
|
||||
|
||||
static void
|
||||
sb_stop_dma(const sb_dsp_t *dsp)
|
||||
{
|
||||
dma_set_drq(dsp->sb_8_dmanum, 0);
|
||||
|
||||
if (dsp->sb_16_dmanum != 0xff) {
|
||||
if (dsp->sb_16_dmanum == 4)
|
||||
dma_set_drq(dsp->sb_8_dmanum, 0);
|
||||
else
|
||||
dma_set_drq(dsp->sb_16_dmanum, 0);
|
||||
}
|
||||
|
||||
if (dsp->sb_16_8_dmanum != 0xff)
|
||||
dma_set_drq(dsp->sb_16_8_dmanum, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
sb_finish_dma(sb_dsp_t *dsp)
|
||||
{
|
||||
if (dsp->ess_playback_mode) {
|
||||
ESSreg(0xB8) &= ~0x01;
|
||||
dma_set_drq(dsp->sb_8_dmanum, 0);
|
||||
} else
|
||||
sb_stop_dma(dsp);
|
||||
}
|
||||
|
||||
void
|
||||
sb_dsp_reset(sb_dsp_t *dsp)
|
||||
{
|
||||
midi_clear_buffer();
|
||||
|
||||
if (dsp->sb_8_enable) {
|
||||
dsp->sb_8_enable = 0;
|
||||
sb_finish_dma(dsp);
|
||||
}
|
||||
|
||||
if (dsp->sb_16_enable) {
|
||||
dsp->sb_16_enable = 0;
|
||||
sb_finish_dma(dsp);
|
||||
}
|
||||
|
||||
timer_disable(&dsp->output_timer);
|
||||
timer_disable(&dsp->input_timer);
|
||||
|
||||
@@ -565,22 +601,6 @@ sb_resume_dma(const sb_dsp_t *dsp, const int is_8)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
sb_stop_dma(const sb_dsp_t *dsp)
|
||||
{
|
||||
dma_set_drq(dsp->sb_8_dmanum, 0);
|
||||
|
||||
if (dsp->sb_16_dmanum != 0xff) {
|
||||
if (dsp->sb_16_dmanum == 4)
|
||||
dma_set_drq(dsp->sb_8_dmanum, 0);
|
||||
else
|
||||
dma_set_drq(dsp->sb_16_dmanum, 0);
|
||||
}
|
||||
|
||||
if (dsp->sb_16_8_dmanum != 0xff)
|
||||
dma_set_drq(dsp->sb_16_8_dmanum, 0);
|
||||
}
|
||||
|
||||
void
|
||||
sb_start_dma(sb_dsp_t *dsp, int dma8, int autoinit, uint8_t format, int len)
|
||||
{
|
||||
@@ -2206,16 +2226,6 @@ sb_dsp_dma_attach(sb_dsp_t *dsp,
|
||||
dsp->dma_priv = priv;
|
||||
}
|
||||
|
||||
static void
|
||||
sb_finish_dma(sb_dsp_t *dsp)
|
||||
{
|
||||
if (dsp->ess_playback_mode) {
|
||||
ESSreg(0xB8) &= ~0x01;
|
||||
dma_set_drq(dsp->sb_8_dmanum, 0);
|
||||
} else
|
||||
sb_stop_dma(dsp);
|
||||
}
|
||||
|
||||
void
|
||||
sb_espcm_fifoctl_run(sb_dsp_t *dsp)
|
||||
{
|
||||
|
||||
@@ -2592,6 +2592,8 @@ mach_recalctimings(svga_t *svga)
|
||||
}
|
||||
|
||||
svga->clock8514 = (cpuclock * (double) (1ULL << 32)) / svga->getclock((mach->accel.clock_sel >> 2) & 0x0f, svga->clock_gen);
|
||||
if (mach->accel.clock_sel & 0x40)
|
||||
svga->clock8514 *= 2;
|
||||
|
||||
if (dev->interlace)
|
||||
dev->dispend >>= 1;
|
||||
@@ -3532,13 +3534,14 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8
|
||||
case 0xaef:
|
||||
WRITE8(port, mach->cursor_offset_lo_reg, val);
|
||||
mach->cursor_offset_lo = mach->cursor_offset_lo_reg;
|
||||
dev->hwcursor.addr = ((mach->cursor_offset_lo | (mach->cursor_offset_hi << 16)) << 2);
|
||||
break;
|
||||
|
||||
case 0xeee:
|
||||
case 0xeef:
|
||||
WRITE8(port, mach->cursor_offset_hi_reg, val);
|
||||
mach->cursor_offset_hi = mach->cursor_offset_hi_reg & 0x0f;
|
||||
dev->hwcursor.addr = (mach->cursor_offset_lo | (mach->cursor_offset_hi << 16)) << 2;
|
||||
dev->hwcursor.addr = ((mach->cursor_offset_lo | (mach->cursor_offset_hi << 16)) << 2);
|
||||
dev->hwcursor.ena = !!(mach->cursor_offset_hi_reg & 0x8000);
|
||||
break;
|
||||
|
||||
@@ -4633,9 +4636,6 @@ mach32_write_common(uint32_t addr, uint8_t val, int linear, mach_t *mach, svga_t
|
||||
cycles -= svga->monitor->mon_video_timing_write_b;
|
||||
|
||||
if (linear) {
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= dev->vram_size)
|
||||
return;
|
||||
addr &= dev->vram_mask;
|
||||
dev->changedvram[addr >> 12] = svga->monitor->mon_changeframecount;
|
||||
dev->vram[addr] = val;
|
||||
@@ -4825,9 +4825,6 @@ mach32_writew_linear(uint32_t addr, uint16_t val, mach_t *mach)
|
||||
|
||||
cycles -= svga->monitor->mon_video_timing_write_w;
|
||||
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= dev->vram_size)
|
||||
return;
|
||||
addr &= dev->vram_mask;
|
||||
dev->changedvram[addr >> 12] = svga->monitor->mon_changeframecount;
|
||||
*(uint16_t *) &dev->vram[addr] = val;
|
||||
@@ -4841,9 +4838,6 @@ mach32_writel_linear(uint32_t addr, uint32_t val, mach_t *mach)
|
||||
|
||||
cycles -= svga->monitor->mon_video_timing_write_l;
|
||||
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= dev->vram_size)
|
||||
return;
|
||||
addr &= dev->vram_mask;
|
||||
dev->changedvram[addr >> 12] = svga->monitor->mon_changeframecount;
|
||||
*(uint32_t *) &dev->vram[addr] = val;
|
||||
@@ -4862,10 +4856,6 @@ mach32_read_common(uint32_t addr, int linear, mach_t *mach, svga_t *svga)
|
||||
cycles -= svga->monitor->mon_video_timing_read_b;
|
||||
|
||||
if (linear) {
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= dev->vram_size)
|
||||
return 0xff;
|
||||
|
||||
return dev->vram[addr & dev->vram_mask];
|
||||
} else {
|
||||
addr = mach32_decode_addr(svga, addr, 0);
|
||||
@@ -5022,10 +5012,6 @@ mach32_readw_linear(uint32_t addr, mach_t *mach)
|
||||
|
||||
cycles -= svga->monitor->mon_video_timing_read_w;
|
||||
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= dev->vram_size)
|
||||
return 0xffff;
|
||||
|
||||
return *(uint16_t *) &dev->vram[addr & dev->vram_mask];
|
||||
}
|
||||
|
||||
@@ -5037,10 +5023,6 @@ mach32_readl_linear(uint32_t addr, mach_t *mach)
|
||||
|
||||
cycles -= svga->monitor->mon_video_timing_read_l;
|
||||
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= dev->vram_size)
|
||||
return 0xffffffff;
|
||||
|
||||
return *(uint32_t *) &dev->vram[addr & dev->vram_mask];
|
||||
}
|
||||
|
||||
@@ -5294,7 +5276,7 @@ mach32_hwcursor_draw(svga_t *svga, int displine)
|
||||
int x_pos;
|
||||
int y_pos;
|
||||
|
||||
mach_log("BPP=%d.\n", dev->accel_bpp);
|
||||
mach_log("BPP=%d, displine=%d.\n", dev->accel_bpp, displine);
|
||||
switch (dev->accel_bpp) {
|
||||
default:
|
||||
case 8:
|
||||
@@ -5888,7 +5870,7 @@ mach8_init(const device_t *info)
|
||||
else
|
||||
mach->config1 |= 0x0c;
|
||||
mach->config1 |= 0x0400;
|
||||
svga->clock_gen = device_add(&ati18811_0_device);
|
||||
svga->clock_gen = device_add(&ati18811_1_device);
|
||||
} else if (mach->mca_bus) {
|
||||
video_inform(VIDEO_FLAG_TYPE_8514, &timing_mach32_mca);
|
||||
if (is286 && !is386)
|
||||
@@ -5905,11 +5887,11 @@ mach8_init(const device_t *info)
|
||||
else
|
||||
mach->config1 |= 0x0a00;
|
||||
mach->config2 |= 0x2000;
|
||||
svga->clock_gen = device_add(&ati18811_0_device);
|
||||
svga->clock_gen = device_add(&ati18811_1_device);
|
||||
} else {
|
||||
video_inform(VIDEO_FLAG_TYPE_8514, &timing_gfxultra_isa);
|
||||
mach->config1 |= 0x0400;
|
||||
svga->clock_gen = device_add(&ati18811_0_device);
|
||||
svga->clock_gen = device_add(&ati18811_1_device);
|
||||
}
|
||||
mem_mapping_add(&mach->mmio_linear_mapping, 0, 0, mach32_ap_readb, mach32_ap_readw, mach32_ap_readl, mach32_ap_writeb, mach32_ap_writew, mach32_ap_writel, NULL, MEM_MAPPING_EXTERNAL, mach);
|
||||
mem_mapping_disable(&mach->mmio_linear_mapping);
|
||||
@@ -5926,7 +5908,7 @@ mach8_init(const device_t *info)
|
||||
video_inform(VIDEO_FLAG_TYPE_8514, &timing_gfxultra_isa);
|
||||
mach->config1 = 0x01 | 0x02 | 0x20 | 0x08 | 0x80;
|
||||
mach->config2 = 0x02;
|
||||
svga->clock_gen = device_add(&ati18810_device);
|
||||
svga->clock_gen = device_add(&ati18811_0_device);
|
||||
}
|
||||
dev->bpp = 0;
|
||||
svga->getclock = ics2494_getclock;
|
||||
|
||||
@@ -204,6 +204,14 @@ paradise_out(uint16_t addr, uint8_t val, void *priv)
|
||||
return;
|
||||
case 0x0b:
|
||||
svga->gdcreg[0x0b] = val;
|
||||
svga->gdcreg[0x0b] &= ~0xc0;
|
||||
if (paradise->memory == 1024)
|
||||
svga->gdcreg[0x0b] |= 0xc0;
|
||||
else if (paradise->memory == 512)
|
||||
svga->gdcreg[0x0b] |= 0x80;
|
||||
else
|
||||
svga->gdcreg[0x0b] |= 0x40;
|
||||
|
||||
paradise_remap(paradise);
|
||||
return;
|
||||
case 0x0e:
|
||||
@@ -282,6 +290,7 @@ paradise_remap(paradise_t *paradise)
|
||||
paradise->write_bank[1] = paradise->write_bank[3] = (svga->gdcreg[9] << 12) + ((svga->gdcreg[6] & 0x08) ? 0 : 0x8000);
|
||||
}
|
||||
|
||||
/*There are separate drivers for 1M and 512K/256K versions of the PVGA chips.*/
|
||||
if ((svga->gdcreg[0x0b] & 0xc0) < 0xc0) {
|
||||
paradise->read_bank[1] &= 0x7ffff;
|
||||
paradise->write_bank[1] &= 0x7ffff;
|
||||
@@ -482,7 +491,7 @@ paradise_readw(uint32_t addr, void *priv)
|
||||
}
|
||||
|
||||
void *
|
||||
paradise_init(const device_t *info, uint32_t memsize)
|
||||
paradise_init(const device_t *info, uint32_t memory)
|
||||
{
|
||||
paradise_t *paradise = malloc(sizeof(paradise_t));
|
||||
svga_t *svga = ¶dise->svga;
|
||||
@@ -493,35 +502,35 @@ paradise_init(const device_t *info, uint32_t memsize)
|
||||
else
|
||||
video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_paradise_wd90c);
|
||||
|
||||
paradise->memory = memsize >> 10;
|
||||
paradise->memory = memory;
|
||||
|
||||
switch (info->local) {
|
||||
case PVGA1A:
|
||||
svga_init(info, svga, paradise, memsize, /*256kb*/
|
||||
svga_init(info, svga, paradise, (memory << 10), /*256kb default*/
|
||||
paradise_recalctimings,
|
||||
paradise_in, paradise_out,
|
||||
NULL,
|
||||
NULL);
|
||||
paradise->vram_mask = memsize - 1;
|
||||
svga->decode_mask = memsize - 1;
|
||||
paradise->vram_mask = (memory << 10) - 1;
|
||||
svga->decode_mask = (memory << 10) - 1;
|
||||
break;
|
||||
case WD90C11:
|
||||
svga_init(info, svga, paradise, 1 << 19, /*512kb*/
|
||||
svga_init(info, svga, paradise, (memory << 10), /*512kb default*/
|
||||
paradise_recalctimings,
|
||||
paradise_in, paradise_out,
|
||||
NULL,
|
||||
NULL);
|
||||
paradise->vram_mask = (1 << 19) - 1;
|
||||
svga->decode_mask = (1 << 19) - 1;
|
||||
paradise->vram_mask = (memory << 10) - 1;
|
||||
svga->decode_mask = (memory << 10) - 1;
|
||||
break;
|
||||
case WD90C30:
|
||||
svga_init(info, svga, paradise, memsize,
|
||||
svga_init(info, svga, paradise, (memory << 10),
|
||||
paradise_recalctimings,
|
||||
paradise_in, paradise_out,
|
||||
NULL,
|
||||
NULL);
|
||||
paradise->vram_mask = memsize - 1;
|
||||
svga->decode_mask = memsize - 1;
|
||||
paradise->vram_mask = (memory << 10) - 1;
|
||||
svga->decode_mask = (memory << 10) - 1;
|
||||
svga->ramdac = device_add(&sc11487_ramdac_device); /*Actually a Winbond W82c487-80, probably a clone.*/
|
||||
break;
|
||||
|
||||
@@ -566,7 +575,7 @@ paradise_init(const device_t *info, uint32_t memsize)
|
||||
static void *
|
||||
paradise_pvga1a_ncr3302_init(const device_t *info)
|
||||
{
|
||||
paradise_t *paradise = paradise_init(info, 1 << 18);
|
||||
paradise_t *paradise = paradise_init(info, 256);
|
||||
|
||||
if (paradise)
|
||||
rom_init(¶dise->bios_rom, "roms/machines/3302/c000-wd_1987-1989-740011-003058-019c.bin", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
||||
@@ -577,7 +586,7 @@ paradise_pvga1a_ncr3302_init(const device_t *info)
|
||||
static void *
|
||||
paradise_pvga1a_pc2086_init(const device_t *info)
|
||||
{
|
||||
paradise_t *paradise = paradise_init(info, 1 << 18);
|
||||
paradise_t *paradise = paradise_init(info, 256);
|
||||
|
||||
if (paradise)
|
||||
rom_init(¶dise->bios_rom, "roms/machines/pc2086/40186.ic171", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
||||
@@ -588,7 +597,7 @@ paradise_pvga1a_pc2086_init(const device_t *info)
|
||||
static void *
|
||||
paradise_pvga1a_pc3086_init(const device_t *info)
|
||||
{
|
||||
paradise_t *paradise = paradise_init(info, 1 << 18);
|
||||
paradise_t *paradise = paradise_init(info, 256);
|
||||
|
||||
if (paradise)
|
||||
rom_init(¶dise->bios_rom, "roms/machines/pc3086/c000.bin", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
||||
@@ -600,12 +609,9 @@ static void *
|
||||
paradise_pvga1a_standalone_init(const device_t *info)
|
||||
{
|
||||
paradise_t *paradise;
|
||||
uint32_t memory = 512;
|
||||
uint32_t memsize = device_get_config_int("memory");
|
||||
|
||||
memory = device_get_config_int("memory");
|
||||
memory <<= 10;
|
||||
|
||||
paradise = paradise_init(info, memory);
|
||||
paradise = paradise_init(info, memsize);
|
||||
|
||||
if (paradise)
|
||||
rom_init(¶dise->bios_rom, "roms/video/pvga1a/BIOS.BIN", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
||||
@@ -622,7 +628,7 @@ paradise_pvga1a_standalone_available(void)
|
||||
static void *
|
||||
paradise_wd90c11_megapc_init(const device_t *info)
|
||||
{
|
||||
paradise_t *paradise = paradise_init(info, 0);
|
||||
paradise_t *paradise = paradise_init(info, 512);
|
||||
|
||||
if (paradise)
|
||||
rom_init_interleaved(¶dise->bios_rom,
|
||||
@@ -636,7 +642,7 @@ paradise_wd90c11_megapc_init(const device_t *info)
|
||||
static void *
|
||||
paradise_wd90c11_standalone_init(const device_t *info)
|
||||
{
|
||||
paradise_t *paradise = paradise_init(info, 0);
|
||||
paradise_t *paradise = paradise_init(info, 512);
|
||||
|
||||
if (paradise)
|
||||
rom_init(¶dise->bios_rom, "roms/video/wd90c11/WD90C11.VBI", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
||||
@@ -654,12 +660,9 @@ static void *
|
||||
paradise_wd90c30_standalone_init(const device_t *info)
|
||||
{
|
||||
paradise_t *paradise;
|
||||
uint32_t memory = 512;
|
||||
uint32_t memsize = device_get_config_int("memory");
|
||||
|
||||
memory = device_get_config_int("memory");
|
||||
memory <<= 10;
|
||||
|
||||
paradise = paradise_init(info, memory);
|
||||
paradise = paradise_init(info, memsize);
|
||||
|
||||
if (paradise)
|
||||
rom_init(¶dise->bios_rom, "roms/video/wd90c30/90C30-LR.VBI", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
||||
@@ -818,6 +821,10 @@ static const device_config_t paradise_wd90c30_config[] = {
|
||||
.type = CONFIG_SELECTION,
|
||||
.default_int = 1024,
|
||||
.selection = {
|
||||
{
|
||||
.description = "256 kB",
|
||||
.value = 256
|
||||
},
|
||||
{
|
||||
.description = "512 kB",
|
||||
.value = 512
|
||||
|
||||
Reference in New Issue
Block a user