Merge branch 'master' into pc98x1

This commit is contained in:
TC1995
2024-09-19 12:26:23 +02:00
6 changed files with 81 additions and 62 deletions

View File

@@ -1076,7 +1076,6 @@ read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int m
for (i = first_track; i <= last_track; i++) {
cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
pclog(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
dev->ops->get_track_info(dev, i + 1, 0, &ti);
b[len++] = 0; /* reserved */
@@ -1174,7 +1173,6 @@ read_toc_raw(cdrom_t *dev, unsigned char *b)
int last_track;
cdrom_log("read_toc_raw(%08X, %08X)\n", dev, b);
pclog("read_toc_raw(%08X, %08X)\n", dev, b);
dev->ops->get_tracks(dev, &first_track, &last_track);
@@ -1185,7 +1183,6 @@ read_toc_raw(cdrom_t *dev, unsigned char *b)
dev->ops->get_track_info(dev, i + 1, 0, &ti);
cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
pclog(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
b[len++] = 1; /* Session number */
b[len++] = ti.attr; /* Track ADR and Control */
@@ -2036,8 +2033,6 @@ cdrom_exit(uint8_t id)
memset(dev->image_path, 0, sizeof(dev->image_path));
cdrom_insert(id);
pclog("CD-ROM exited\n");
}
/* The mechanics of ejecting a CD-ROM from a drive. */

View File

@@ -164,11 +164,32 @@ umc_8886_bus_recalc(umc_8886_t *dev)
}
}
static void
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;
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;
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));
}
static void
umc_8886_write(int func, int addr, uint8_t val, void *priv)
{
umc_8886_t *dev = (umc_8886_t *) priv;
int irq_routing;
if (func <= dev->max_func)
switch (func) {
@@ -195,28 +216,12 @@ umc_8886_write(int func, int addr, uint8_t val, void *priv)
break;
case 0x43:
dev->pci_conf_sb[func][addr] = val;
irq_routing = (dev->pci_conf_sb[func][0x46] & 0x01) ? (val >> 8) :
PCI_IRQ_DISABLED;
pci_set_irq_routing(PCI_INTA, irq_routing);
irq_routing = (dev->pci_conf_sb[func][0x46] & 0x02) ? (val & 0x0f) :
PCI_IRQ_DISABLED;
pci_set_irq_routing(PCI_INTB, irq_routing);
break;
case 0x44:
dev->pci_conf_sb[func][addr] = val;
irq_routing = (dev->pci_conf_sb[func][0x46] & 0x04) ? (val >> 8) :
PCI_IRQ_DISABLED;
pci_set_irq_routing(PCI_INTC, irq_routing);
irq_routing = (dev->pci_conf_sb[func][0x46] & 0x08) ? (val & 0x0f) :
PCI_IRQ_DISABLED;
pci_set_irq_routing(PCI_INTD, irq_routing);
break;
case 0x46: /* Bits 3-0 = 0 = IRQ disabled, 1 = IRQ enabled. */
case 0x47: /* Bits 3-0 = 0 = IRQ edge-triggered, 1 = IRQ level-triggered. */
/* Bit 6 seems to be the IRQ/SMI# toggle, 1 = IRQ, 0 = SMI#. */
dev->pci_conf_sb[func][addr] = val;
umc_8886_irq_recalc(dev);
break;
case 0x56:

View File

@@ -850,6 +850,9 @@ machine_at_t3100e_init(const machine_t *model)
NULL, MEM_MAPPING_INTERNAL, &t3100e_ems);
mem_mapping_disable(&t3100e_ems.upper_mapping);
if (mem_size < (16384 - 448))
mem_set_mem_state_both(mem_size * 1024, 384 * 1024, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL);
device_add(&t3100e_device);
return ret;

View File

@@ -264,7 +264,7 @@ modem_read_phonebook_file(modem_t *modem, const char *path)
if (strspn(entry.phone, "01234567890*=,;#+>") != strlen(entry.phone)) {
/* Invalid characters. */
pclog("Modem: Invalid character in phone number %s\n", entry.phone);
modem_log("Modem: Invalid character in phone number %s\n", entry.phone);
continue;
}
@@ -617,7 +617,7 @@ modem_enter_idle_state(modem_t *modem)
if (modem->listen_port) {
modem->serversocket = plat_netsocket_create_server(NET_SOCKET_TCP, modem->listen_port);
if (modem->serversocket == (SOCKET) -1) {
pclog("Failed to set up server on port %d\n", modem->listen_port);
modem_log("Failed to set up server on port %d\n", modem->listen_port);
}
}
@@ -703,14 +703,14 @@ modem_dial(modem_t *modem, const char *str)
modem->numberinprogress[0] = 0;
modem->clientsocket = plat_netsocket_create(NET_SOCKET_TCP);
if (modem->clientsocket == -1) {
pclog("Failed to create client socket\n");
modem_log("Failed to create client socket\n");
modem_send_res(modem, ResNOCARRIER);
modem_enter_idle_state(modem);
return;
}
if (-1 == plat_netsocket_connect(modem->clientsocket, buf, port)) {
pclog("Failed to connect to %s\n", buf);
modem_log("Failed to connect to %s\n", buf);
modem_send_res(modem, ResNOCARRIER);
modem_enter_idle_state(modem);
return;
@@ -1147,7 +1147,7 @@ fifo8_resize_2x(Fifo8 *fifo)
if (!used)
return;
uint8_t *temp_buf = calloc(fifo->capacity * 2, 1);
uint8_t *temp_buf = calloc(size, 1);
if (!temp_buf) {
fatal("net_modem: Out Of Memory!\n");
}
@@ -1440,7 +1440,8 @@ modem_cmdpause_timer_callback(void *priv)
if (modem->connected) {
uint8_t buffer[16];
int wouldblock = 0;
int res = plat_netsocket_receive(modem->clientsocket, buffer, sizeof(buffer), &wouldblock);
int recv = MIN(modem->rx_data.capacity - modem->rx_data.num, sizeof(buffer));
int res = plat_netsocket_receive(modem->clientsocket, buffer, recv, &wouldblock);
if (res > 0) {
if (modem->telnet_mode)
@@ -1488,8 +1489,8 @@ modem_init(const device_t *info)
modem->clientsocket = modem->serversocket = modem->waitingclientsocket = -1;
fifo8_create(&modem->data_pending, 0x20000);
fifo8_create(&modem->rx_data, 0x20000);
fifo8_create(&modem->data_pending, 0x40000);
fifo8_create(&modem->rx_data, 0x40000);
timer_add(&modem->dtr_timer, modem_dtr_callback_timer, modem, 0);
timer_add(&modem->host_to_serial_timer, host_to_modem_cb, modem, 0);

View File

@@ -227,7 +227,12 @@ plat_getcwd(char *bufp, int max)
{
#ifdef __APPLE__
/* Working directory for .app bundles is undefined. */
#ifdef USE_EXE_PATH
strncpy(bufp, exe_path, max);
#else
CharPointer(bufp, max) = QDir::homePath().toUtf8();
path_append_filename(bufp, bufp, "Library/86Box");
#endif
#else
CharPointer(bufp, max) = QDir::currentPath().toUtf8();
#endif

View File

@@ -1182,8 +1182,6 @@ scsi_cdrom_cmd_error(scsi_cdrom_t *dev)
{
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
dev->tf->error = ((scsi_cdrom_sense_key & 0xf) << 4) | ABRT_ERR;
if (dev->unit_attention > 2)
dev->tf->error |= MCR_ERR;
dev->tf->status = READY_STAT | ERR_STAT;
dev->tf->phase = 3;
dev->tf->pos = 0;
@@ -1199,8 +1197,6 @@ scsi_cdrom_unit_attention(scsi_cdrom_t *dev)
{
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
dev->tf->error = (SENSE_UNIT_ATTENTION << 4) | ABRT_ERR;
if (dev->unit_attention > 2)
dev->tf->error |= MCR_ERR;
dev->tf->status = READY_STAT | ERR_STAT;
dev->tf->phase = 3;
dev->tf->pos = 0;
@@ -1543,13 +1539,23 @@ scsi_cdrom_insert(void *priv)
{
scsi_cdrom_t *dev = (scsi_cdrom_t *) priv;
if (!dev)
if ((dev == NULL) || (dev->drv == NULL))
return;
dev->unit_attention = 1;
/* Turn off the medium changed status. */
dev->drv->cd_status &= ~CD_STATUS_MEDIUM_CHANGED;
scsi_cdrom_log("CD-ROM %i: Media insert\n", dev->id);
if (dev->drv->ops == NULL) {
dev->unit_attention = 0;
dev->drv->cd_status = CD_STATUS_EMPTY;
scsi_cdrom_log("CD-ROM %i: Media removal\n", dev->id);
} else if (dev->drv->cd_status & CD_STATUS_TRANSITION) {
dev->unit_attention = 1;
/* Turn off the medium changed status. */
dev->drv->cd_status &= ~(CD_STATUS_TRANSITION | CD_STATUS_MEDIUM_CHANGED);
scsi_cdrom_log("CD-ROM %i: Media insert\n", dev->id);
} else {
dev->unit_attention = 0;
dev->drv->cd_status |= CD_STATUS_TRANSITION;
scsi_cdrom_log("CD-ROM %i: Media transition\n", dev->id);
}
}
static int
@@ -1621,29 +1627,31 @@ scsi_cdrom_pre_execution_check(scsi_cdrom_t *dev, uint8_t *cdb)
goto skip_ready_check;
}
if ((dev->drv->cd_status & CD_STATUS_MEDIUM_CHANGED) || (ext_medium_changed == 1))
scsi_cdrom_insert((void *) dev);
if (dev->drv->cd_status & CD_STATUS_TRANSITION) {
if ((cdb[0] == GPCMD_TEST_UNIT_READY) || (cdb[0] == GPCMD_REQUEST_SENSE))
ready = 0;
else {
scsi_cdrom_insert((void *) dev);
ready = (dev->drv->cd_status != CD_STATUS_EMPTY) || (ext_medium_changed == -1);
ready = (dev->drv->cd_status != CD_STATUS_EMPTY) || (ext_medium_changed == -1);
}
} else {
if ((dev->drv->cd_status & CD_STATUS_MEDIUM_CHANGED) || (ext_medium_changed == 1))
scsi_cdrom_insert((void *) dev);
ready = (dev->drv->cd_status != CD_STATUS_EMPTY) || (ext_medium_changed == -1);
}
skip_ready_check:
/* If the drive is not ready, there is no reason to keep the
UNIT ATTENTION condition present, as we only use it to mark
disc changes. */
if (!ready && (dev->unit_attention > 2))
if (!ready && (dev->unit_attention > 0))
dev->unit_attention = 0;
/* If the UNIT ATTENTION condition is set and the command does not allow
execution under it, error out and report the condition. */
if ((dev->unit_attention > 0) && (dev->unit_attention < 3)) {
dev->media_status = MEC_MEDIA_REMOVAL;
if (scsi_command_check_ready(dev, cdb)) {
dev->unit_attention++;
scsi_cdrom_log("CD-ROM %i: Simulated not ready phase (%02X)\n", dev->id, cdb[0]);
scsi_cdrom_not_ready(dev);
return 0;
}
} else if (dev->unit_attention == 3) {
if (dev->unit_attention == 1) {
/* Only increment the unit attention phase if the command can not pass through it. */
if (!(scsi_cdrom_command_flags[cdb[0]] & ALLOW_UA)) {
/* scsi_cdrom_log("CD-ROM %i: Unit attention now 2\n", dev->id); */
@@ -1653,7 +1661,7 @@ skip_ready_check:
scsi_cdrom_unit_attention(dev);
return 0;
}
} else if (dev->unit_attention == 4) {
} else if (dev->unit_attention == 2) {
if (cdb[0] != GPCMD_REQUEST_SENSE) {
/* scsi_cdrom_log("CD-ROM %i: Unit attention now 0\n", dev->id); */
dev->unit_attention = 0;
@@ -1666,10 +1674,10 @@ skip_ready_check:
scsi_cdrom_sense_clear(dev, cdb[0]);
/* Next it's time for NOT READY. */
if (!ready || ((dev->unit_attention > 0) && (dev->unit_attention < 3)))
dev->media_status = MEC_MEDIA_REMOVAL;
if (ready)
dev->media_status = dev->unit_attention ? MEC_NEW_MEDIA : MEC_NO_CHANGE;
else
dev->media_status = (dev->unit_attention > 2) ? MEC_NEW_MEDIA : MEC_NO_CHANGE;
dev->media_status = MEC_MEDIA_REMOVAL;
if (!ready && scsi_command_check_ready(dev, cdb)) {
scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]);
@@ -1726,8 +1734,7 @@ scsi_cdrom_request_sense(scsi_cdrom_t *dev, uint8_t *buffer, uint8_t alloc_lengt
buffer[2] = SENSE_ILLEGAL_REQUEST;
buffer[12] = ASC_AUDIO_PLAY_OPERATION;
buffer[13] = (dev->drv->cd_status == CD_STATUS_PLAYING) ? ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS : ASCQ_AUDIO_PLAY_OPERATION_PAUSED;
} else if ((dev->unit_attention > 2) &&
((scsi_cdrom_sense_key == 0) || (scsi_cdrom_sense_key == 2))) {
} else if (dev->unit_attention && ((scsi_cdrom_sense_key == 0) || (scsi_cdrom_sense_key == 2))) {
buffer[2] = SENSE_UNIT_ATTENTION;
buffer[12] = ASC_MEDIUM_MAY_HAVE_CHANGED;
buffer[13] = 0;
@@ -1740,6 +1747,9 @@ scsi_cdrom_request_sense(scsi_cdrom_t *dev, uint8_t *buffer, uint8_t alloc_lengt
that condition. */
dev->unit_attention = 0;
}
if (dev->drv->cd_status & CD_STATUS_TRANSITION)
scsi_cdrom_insert((void *) dev);
}
void
@@ -1750,7 +1760,7 @@ scsi_cdrom_request_sense_for_scsi(scsi_common_t *sc, uint8_t *buffer, uint8_t al
if (dev->drv->cd_status & CD_STATUS_MEDIUM_CHANGED)
scsi_cdrom_insert((void *) dev);
if ((dev->drv->cd_status == CD_STATUS_EMPTY) && (dev->unit_attention > 2)) {
if ((dev->drv->cd_status == CD_STATUS_EMPTY) && dev->unit_attention) {
/* If the drive is not ready, there is no reason to keep the
UNIT ATTENTION condition present, as we only use it to mark
disc changes. */
@@ -1833,7 +1843,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb)
memcpy(dev->current_cdb, cdb, 12);
dev->sony_vendor = 0;
if (cdb[0] != 0) {
// if (cdb[0] != 0) {
scsi_cdrom_log("CD-ROM %i: Command 0x%02X, Sense Key %02X, Asc %02X, Ascq %02X, Unit attention: %i\n",
dev->id, cdb[0], scsi_cdrom_sense_key, scsi_cdrom_asc, scsi_cdrom_ascq,
dev->unit_attention);
@@ -1842,7 +1852,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb)
scsi_cdrom_log("CD-ROM %i: CDB: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
dev->id, cdb[0], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6], cdb[7],
cdb[8], cdb[9], cdb[10], cdb[11]);
}
// }
msf = cdb[1] & 2;
dev->sector_len = 0;