mirror of
https://github.com/86Box/86Box.git
synced 2026-02-26 05:53:15 -07:00
Merge branch 'master' into pc98x1
This commit is contained in:
@@ -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. */
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user