Merge branch '86Box:master' into broken-sensation1

This commit is contained in:
win2kgamer
2026-02-09 21:29:04 -06:00
committed by GitHub
55 changed files with 4410 additions and 1680 deletions

View File

@@ -3,7 +3,7 @@ In order for everyone to enjoy their time contributing to 86Box or otherwise bei
## 1. No illegal activity or GitHub ToS violations
- 1.1. Do not distribute malware for non-research purposes. Post samples in a clearly named encrypted archive.
- 1.2. Posting old software is allowed if at least 10 years old and out of support.
- 1.2. Disclosure of copyrighted materials is permitted only if they are demo/trial versions, shareware, freeware, or open-source software, or if they are disclosed by the copyright holder or on the copyright holders behalf. If such materials need to be disclosed for testing or bug-fixing purposes, any available private channels should be used. Developers undertake to remove any materials obtained for such purposes as soon as they are no longer needed.
- 1.3. Do not post NSFW content (defined at the staff's discretion).
- 1.4. Do not do anything forbidden by the law or the Discord or GitHub Terms of Service.

View File

@@ -1494,6 +1494,7 @@ pc_init_modules(void)
fdd_audio_init();
}
hdd_audio_load_profiles();
hdd_audio_init();
sound_init();

View File

@@ -692,14 +692,14 @@ read_toc_raw(const cdrom_t *dev, unsigned char *b, const unsigned char start_tra
int num = 0;
int len = 4;
/* Bytes 2 and 3 = Number of first and last sessions */
read_toc_identify_sessions((raw_track_info_t *) rti, num, b);
cdrom_log(dev->log, "read_toc_raw(%016" PRIXPTR ", %016" PRIXPTR ", %02X)\n",
(uintptr_t) dev, (uintptr_t) b, start_track);
dev->ops->get_raw_track_info(dev->local, &num, rti);
/* Bytes 2 and 3 = Number of first and last sessions */
read_toc_identify_sessions((raw_track_info_t *) rti, num, b);
if (num != 0) for (int i = 0; i < num; i++)
if (t[i].session >= start_track) {
memcpy(&(b[len]), &(t[i]), 11);
@@ -1654,6 +1654,9 @@ cdrom_audio_play(cdrom_t *dev, const uint32_t pos, const uint32_t len, const int
dev->cd_end = len2;
dev->cd_status = CD_STATUS_PLAYING;
dev->cd_buflen = 0;
if (dev->cached_sector != dev->seek_pos)
dev->cached_sector = -1;
} else {
cdrom_log(dev->log, "LBA %08X not on an audio track\n", pos);
cdrom_stop(dev);

View File

@@ -2965,7 +2965,7 @@ image_close(void *local)
free(img);
if (temp_file[0] != 0x00) {
remove(temp_file);
remove(nvr_path(temp_file));
temp_file[0] = 0x00;
}
}

View File

@@ -18,11 +18,17 @@
* Copyright 2017-2019 Miran Grca.
* Copyright 2017-2019 GreatPsycho.
*/
#ifdef ENABLE_HEADLAND_LOG
#include <stdarg.h>
#endif
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#ifdef ENABLE_HEADLAND_LOG
#define HAVE_STDARG_H
#endif
#include <86box/86box.h>
#include "cpu.h"
#include "x86.h"
@@ -35,6 +41,24 @@
#include <86box/plat_unused.h>
#include <86box/port_92.h>
#include <86box/chipset.h>
#include <86box/log.h>
#ifdef ENABLE_HEADLAND_LOG
int headland_do_log = ENABLE_HEADLAND_LOG;
static void
headland_log(void *priv, const char *fmt, ...)
{
if (headland_do_log) {
va_list ap;
va_start(ap, fmt);
log_out(priv, fmt, ap);
va_end(ap);
}
}
#else
# define headland_log(fmt, ...)
#endif
enum {
HEADLAND_GC103 = 0x00,
@@ -82,6 +106,8 @@ typedef struct headland_t {
mem_mapping_t high_mapping;
mem_mapping_t shadow_mapping[2];
mem_mapping_t upper_mapping[24];
void * log; /* New logging system */
} headland_t;
/* TODO - Headland chipset's memory address mapping emulation isn't fully implemented yet,
@@ -117,27 +143,30 @@ get_addr(headland_t *dev, uint32_t addr, headland_mr_t *mr)
else if ((addr >= 0xfe0000) && (addr <= 0xffffff))
return addr & 0x0fffff;
if (dev->revision == 8) {
shift = (dev->cr[0] & 0x80) ? 21 : ((dev->cr[6] & 0x01) ? 23 : 19);
other_shift = (dev->cr[0] & 0x80) ? ((dev->cr[6] & 0x01) ? 19 : 23) : 21;
if ((dev->revision == 8) && ((dev->cr[6] & 0x01) == 0x01)) {
shift = (dev->cr[0] & 0x80) ? 21 : ((dev->cr[1] & 0x40) ? 19 : 23);
other_shift = (dev->cr[0] & 0x80) ? 23 : ((dev->cr[1] & 0x40) ? 23 : 23);
} else {
shift = (dev->cr[0] & 0x80) ? 21 : 19;
other_shift = (dev->cr[0] & 0x80) ? 21 : 19;
other_shift = (dev->cr[0] & 0x80) ? 19 : 21;
}
headland_log(dev->log, "Headland shift values: shift = %i, other_shift = %i\n", shift, other_shift);
/* Bank size = 1 << (bank shift + 2) . */
bank_shift[0] = bank_shift[1] = shift;
bank_base[0] = 0x00000000;
bank_base[1] = bank_base[0] + (1 << shift);
bank_base[2] = bank_base[1] + (1 << shift);
if ((dev->revision > 0) && (dev->revision < 8) && (dev->cr[1] & 0x40)) {
if ((dev->revision > 0) && (dev->cr[1] & 0x40)) {
bank_shift[2] = bank_shift[3] = other_shift;
bank_base[2] = bank_base[1] + (1 << other_shift);
bank_base[3] = bank_base[2] + (1 << other_shift);
/* First address after the memory is bank_base[3] + (1 << other_shift) */
} else {
bank_shift[2] = bank_shift[3] = shift;
bank_base[2] = bank_base[1] + (1 << shift);
bank_base[3] = bank_base[2] + (1 << shift);
/* First address after the memory is bank_base[3] + (1 << shift) */
}
@@ -220,9 +249,10 @@ memmap_state_default(headland_t *dev, uint8_t ht_romcs)
mem_mapping_disable(&dev->mid_mapping);
if (ht_romcs)
mem_set_mem_state(0x0e0000, 0x20000, MEM_READ_ROMCS | MEM_WRITE_ROMCS);
mem_set_mem_state(0x0e0000, 0x10000, MEM_READ_ROMCS | MEM_WRITE_ROMCS);
else
mem_set_mem_state(0x0e0000, 0x20000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
mem_set_mem_state(0x0e0000, 0x10000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
mem_set_mem_state(0x0f0000, 0x10000, MEM_READ_ROMCS | MEM_WRITE_ROMCS);
mem_set_mem_state(0xfe0000, 0x20000, MEM_READ_ROMCS | MEM_WRITE_ROMCS);
mem_mapping_disable(&dev->shadow_mapping[0]);
@@ -247,15 +277,18 @@ memmap_state_update(headland_t *dev)
memmap_state_default(dev, ht_romcs);
headland_log(dev->log, "Headland 384K Remap %sabled\n", ht_cr0 & 0x04 ? "Dis" : "En");
if (mem_size > 640) {
if (ht_cr0 & 0x04) {
mem_mapping_set_addr(&dev->mid_mapping, 0xA0000, 0x40000);
mem_mapping_set_exec(&dev->mid_mapping, ram + 0xA0000);
mem_mapping_disable(&dev->mid_mapping);
if (mem_size > 1024) {
mem_set_mem_state((mem_size << 10), 0x60000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL);
mem_set_mem_state((mem_size << 10), 0x60000, MEM_READ_EXTANY | MEM_WRITE_EXTANY);
mem_mapping_set_addr(&dev->high_mapping, 0x100000, (mem_size - 1024) << 10);
mem_mapping_set_exec(&dev->high_mapping, ram + 0x100000);
} else if ((mem_size > 640) && (mem_size <=1024)) {
mem_set_mem_state(0x100000, (mem_size - 640) << 10, MEM_READ_EXTANY | MEM_WRITE_EXTANY);
}
} else {
/* 1 MB - 1 MB + 384k: RAM pointing to A0000-FFFFF
@@ -265,14 +298,17 @@ memmap_state_update(headland_t *dev)
mem_mapping_set_exec(&dev->mid_mapping, ram + 0xA0000);
if (mem_size > 1024) {
/* We have ram above 1 MB, we need to relocate that. */
mem_set_mem_state((mem_size << 10), 0x60000, MEM_READ_EXTANY | MEM_WRITE_EXTANY);
mem_set_mem_state((mem_size << 10), 0x60000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL);
mem_mapping_set_addr(&dev->high_mapping, 0x160000, (mem_size - 1024) << 10);
mem_mapping_set_exec(&dev->high_mapping, ram + 0x100000);
} else if ((mem_size > 640) && (mem_size <=1024)) {
mem_set_mem_state(0x100000, (mem_size - 640) << 10, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL);
}
}
}
switch (ht_cr0) {
headland_log(dev->log, "Headland shadow RAM val = %02X\n", ht_cr0 & 0x18);
switch (ht_cr0 & 0x18) {
case 0x18:
if ((mem_size << 10) > 0xe0000) {
mem_set_mem_state(0x0e0000, 0x20000, MEM_READ_INTERNAL | MEM_WRITE_DISABLED);
@@ -330,6 +366,8 @@ hl_write(uint16_t addr, uint8_t val, void *priv)
{
headland_t *dev = (headland_t *) priv;
headland_log(dev->log, "[%04X:%08X] Headland: [W] addr = %04X, val = %02X\n", CS, cpu_state.pc, addr, val);
switch (addr) {
case 0x01ec:
dev->ems_mr[dev->ems_mar & 0x3f].mr = val | 0xff00;
@@ -400,6 +438,8 @@ hl_writew(uint16_t addr, uint16_t val, void *priv)
{
headland_t *dev = (headland_t *) priv;
headland_log(dev->log, "[%04X:%08X] Headland: [W] addr = %04X, val = %04X\n", CS, cpu_state.pc, addr, val);
switch (addr) {
case 0x01ec:
dev->ems_mr[dev->ems_mar & 0x3f].mr = val;
@@ -469,6 +509,8 @@ hl_read(uint16_t addr, void *priv)
break;
}
headland_log(dev->log, "[%04X:%08X] Headland [R] addr = %04X, val = %02X\n", CS, cpu_state.pc, addr, ret);
return ret;
}
@@ -489,6 +531,8 @@ hl_readw(uint16_t addr, void *priv)
break;
}
headland_log(dev->log, "[%04X:%08X] Headland [R] addr = %04X, val = %04X\n", CS, cpu_state.pc, addr, ret);
return ret;
}
@@ -583,6 +627,11 @@ headland_close(void *priv)
{
headland_t *dev = (headland_t *) priv;
if (dev->log != NULL) {
log_close(dev->log);
dev->log = NULL;
}
free(dev);
}
@@ -620,6 +669,8 @@ headland_init(const device_t *info)
dev->ems_mr[i].headland = dev;
}
dev->log = log_open("Headland");
/* Turn off mem.c mappings. */
mem_mapping_disable(&ram_low_mapping);
mem_mapping_disable(&ram_mid_mapping);

View File

@@ -28,6 +28,7 @@
#include <86box/device.h>
#include <86box/mem.h>
#include <86box/port_92.h>
#include <86box/plat_fallthrough.h>
#include <86box/plat_unused.h>
#include <86box/chipset.h>
@@ -176,6 +177,9 @@ opti499_write(uint16_t addr, uint8_t val, void *priv)
break;
case 0x22:
mem_a20_chipset = (val & 0x02);
mem_a20_recalc();
fallthrough;
case 0x23:
case 0x26:
case 0x2d:

View File

@@ -27,6 +27,11 @@
* -DANSI_CFG for use on these systems.
*/
#ifdef _WIN32
# include <ws2tcpip.h>
#else
# include <arpa/inet.h>
#endif
#include <inttypes.h>
#ifdef ENABLE_CONFIG_LOG
#include <stdarg.h>
@@ -886,6 +891,25 @@ load_network(void)
} else
strcpy(nc->host_dev_name, "none");
if (nc->net_type == NET_TYPE_SLIRP) {
sprintf(temp, "net_%02i_addr", c + 1);
p = ini_section_get_string(cat, temp, "");
if (p && *p) {
struct in_addr addr;
if (inet_pton(AF_INET, p, &addr)) {
uint8_t *bytes = (uint8_t *)&addr.s_addr;
bytes[3] = 0;
sprintf(nc->slirp_net, "%d.%d.%d.0", bytes[0], bytes[1], bytes[2]);
} else {
nc->slirp_net[0] = '\0';
}
} else {
nc->slirp_net[0] = '\0';
}
} else {
nc->slirp_net[0] = '\0';
}
sprintf(temp, "net_%02i_switch_group", c + 1);
nc->switch_group = ini_section_get_int(cat, temp, NET_SWITCH_GRP_MIN);
if (nc->switch_group < NET_SWITCH_GRP_MIN)
@@ -1458,7 +1482,7 @@ load_floppy_and_cdrom_drives(void)
int c;
int d;
int count = cdrom_get_type_count();
#ifndef DISABLE_FDD_AUDIO
fdd_audio_load_profiles();
#endif
@@ -1532,7 +1556,7 @@ load_floppy_and_cdrom_drives(void)
fdd_set_audio_profile(c, d);
#else
fdd_set_audio_profile(c, 0);
#endif
#endif
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
fdd_image_history[c][i] = (char *) calloc((MAX_IMAGE_PATH_LEN + 1) << 1, sizeof(char));
@@ -2987,6 +3011,14 @@ save_network(void)
else
ini_section_set_int(cat, temp, nc->link_state);
if (nc->net_type == NET_TYPE_SLIRP && nc->slirp_net[0] != '\0') {
sprintf(temp, "net_%02i_addr", c + 1);
ini_section_set_string(cat, temp, nc->slirp_net);
} else {
sprintf(temp, "net_%02i_addr", c + 1);
ini_section_delete_var(cat, temp);
}
sprintf(temp, "net_%02i_switch_group", c + 1);
if (nc->switch_group == NET_SWITCH_GRP_MIN)
ini_section_delete_var(cat, temp);

View File

@@ -4758,7 +4758,7 @@ static const scancode scancode_set82[512] = {
// clang-format on
};
/* Scancode set 8Ah : IBM 5556 keyboard compatible scancode set used by J-DOS */
static scancode scancode_set8a[512] =
const scancode scancode_set8a[512] =
{
// clang-format off
{.mk = { 0 }, .brk = { 0 } }, /* 000 */
@@ -4817,7 +4817,7 @@ static scancode scancode_set8a[512] =
{.mk = { 0x0a, 0 }, .brk = { 0 } }, /* 035 */
{.mk = { 0x39, 0 }, .brk = { 0xb9, 0 } }, /* 036 RSHIFT */
{.mk = { 0x64, 0 }, .brk = { 0 } }, /* 037 * (asterisk) */
{.mk = { 0x3A, 0 }, .brk = { 0xba, 0 } }, /* 038 0x3A LALT = Kanji */
{.mk = { 0x3a, 0 }, .brk = { 0xba, 0 } }, /* 038 0x3A LALT = Kanji */
{.mk = { 0x34, 0 }, .brk = { 0 } }, /* 039 */
{.mk = { 0x32, 0 }, .brk = { 0xb2, 0 } }, /* 03a CAPSLOCK */
{.mk = { 0x68, 0 }, .brk = { 0 } }, /* 03b F1 */

View File

@@ -143,8 +143,24 @@ sermouse_transmit_byte(mouse_t *dev, int do_next)
if (dev->buf_pos == 0)
dev->acc_time = 0.0;
if (dev->serial)
if (dev->serial) {
if ((dev->state == STATE_TRANSMIT_REPORT) && (dev->format == FORMAT_PB_5BYTE) &&
(dev->buf_pos == 3)) {
/*
The last two bytes are the delta between now and when we originally
prepared the report for sending.
*/
int delta_x = 0;
int delta_y = 0;
mouse_subtract_coords(&delta_x, &delta_y, NULL, NULL, -128, 127, 1, 0);
dev->buf[3] = delta_x; /* same as byte 1 */
dev->buf[4] = delta_y; /* same as byte 2 */
}
serial_write_fifo(dev->serial, dev->buf[dev->buf_pos]);
}
if (do_next) {
/* If we have a buffer length of 0, pretend the state is STATE_SKIP_PACKET. */

View File

@@ -195,6 +195,8 @@ postcard_init(UNUSED(const device_t *info))
postcard_port = 0x190; /* ISA PS/2 machines */
else if (strstr(machines[machine].name, " IBM XT "))
postcard_port = 0x60; /* IBM XT */
else if (strstr(machines[machine].name, " Multistation "))
postcard_port = 0xA1; /* IBM 5550 */
else if (strstr(machines[machine].name, " IBM PCjr")) {
postcard_port = 0x10; /* IBM PCjr */
postcard_ports_num = 3; /* IBM PCjr error ports 11h and 12h */

View File

@@ -2610,8 +2610,8 @@ ide_callback(void *priv)
err = ABRT_ERR;
else {
/* Only accept after RESET or DIAG. */
if (ide->params_specified) {
ide->cfg_spt = ide->tf->secount;
if (!ide->params_specified) {
ide->cfg_spt = (ide->tf->secount == 0) ? 256 : ide->tf->secount;
ide->cfg_hpc = ide->tf->head + 1;
ide->params_specified = 1;

View File

@@ -978,10 +978,15 @@ dma_page_write(uint16_t addr, uint8_t val, UNUSED(void *priv))
addr &= 0x0f;
dmaregs[2][addr] = val;
if (addr >= 8)
addr = convert[addr & 0x07] | 4;
else
addr = convert[addr & 0x07];
if (machines[machine].init == machine_xt_ibm5550_init) {
if (addr >= 4)
addr = 8;
} else {
if (addr >= 8)
addr = convert[addr & 0x07] | 4;
else
addr = convert[addr & 0x07];
}
if (addr < 8) {
dma[addr].page_l = val;

View File

@@ -664,6 +664,21 @@ real_drive(fdc_t *fdc, int drive)
return drive;
}
void
fdc_diskchange_interrupt(fdc_t *fdc, int drive)
{
/*
For the IBM 5550 machine to detect the disk in the drive has been changed.
A hardware interrupt is caused by the FDC (NEC uPD765A) when the Ready line from the drive changes its state.
Other PCs never use the Ready line.
*/
if (fdc->flags & FDC_FLAG_5550) {
fdc->st0 = 0xc0 | (drive & 3);
fdc_int(fdc, 1);
fdd_changed[drive] = 0;
}
}
/* FDD notifies FDC when seek operation is complete */
void
fdc_seek_complete_interrupt(fdc_t *fdc, int drive)
@@ -822,8 +837,47 @@ fdc_write(uint16_t addr, uint8_t val, void *priv)
case 0:
return;
case 1:
if (fdc->flags & FDC_FLAG_5550) {
val = 0;
if (!(val & 0x08)) { /* Drive 2 active */
val = 0x42;
}
if (!(val & 0x04)) { /* Drive 1 active */
val &= 0xf0;
val |= 0x21;
}
if (!(val & 0x02)) { /* Drive 0 active */
val &= 0xf0;
val |= 0x10;
}
/* Update the DOR because this emulation module depend on it */
fdc->dor &= 0x0c;
fdc->dor |= val;
/* We can now simplify this since each motor now spins separately. */
for (int i = 0; i < FDD_NUM; i++) {
drive_num = real_drive(fdc, i);
if ((!fdd_get_flags(drive_num)) || (drive_num >= FDD_NUM))
val &= ~(0x10 << drive_num);
else
fdd_set_motor_enable(i, (val & (0x10 << drive_num)));
}
drive_num = real_drive(fdc, val & 0x03);
current_drive = drive_num;
fdc->st0 = (fdc->st0 & 0xf8) | (val & 0x03) | (fdd_get_head(drive_num) ? 4 : 0);
fdc_log("val:%x, dor=%x, drv=%x\n", val, fdc->dor, drive_num);
}
return;
case 2: /*DOR*/
if (fdc->flags & FDC_FLAG_5550) { /* Reset */
fdd_stop(fdc->drive);
for (int i = 0; i < FDD_NUM; i++)
fdd_set_motor_enable(i, 0); /* Need to restart fdd timer */
fdc->stat = 0x00;
fdc->pnum = fdc->ptot = 0;
fdc_soft_reset(fdc);
fdc->dor = 0x0c;
return;
}
if (fdc->flags & FDC_FLAG_PCJR) {
if ((fdc->dor & 0x40) && !(val & 0x40)) {
timer_set_delay_u64(&fdc->watchdog_timer, 1000 * TIMER_USEC);
@@ -903,6 +957,8 @@ fdc_write(uint16_t addr, uint8_t val, void *priv)
}
return;
case 4: /* DSR */
if (fdc->flags & FDC_FLAG_5550)
picintc(1 << fdc->irq);
if (!(fdc->flags & FDC_FLAG_NO_DSR_RESET)) {
if (!(val & 0x80)) {
timer_set_delay_u64(&fdc->timer, 8 * TIMER_USEC);
@@ -914,6 +970,8 @@ fdc_write(uint16_t addr, uint8_t val, void *priv)
fdc->dsr = val;
return;
case 5: /*Command register*/
if (fdc->flags & FDC_FLAG_5550)
picintc(1 << fdc->irq);
if (fdc->fifointest) {
/* Write FIFO buffer in the test mode (PS/55) */
fdc_log("FIFO buffer position = %X\n", ((fifo_t *) fdc->fifo_p)->end);
@@ -948,7 +1006,33 @@ fdc_write(uint16_t addr, uint8_t val, void *priv)
fdc->command = val;
fdc->stat |= 0x10;
fdc_log("Starting FDC command %02X\n", fdc->command);
fdc_log("Starting FDC command %02X ", fdc->command);
switch (fdc->command & 0x1f) {
case 0x06:
fdc_log("READ DATA\n");
break;
case 0x0a:
fdc_log("READ ID\n");
break;
case 0x07:
fdc_log("RECALIB\n");
break;
case 0x08:
fdc_log("SENSE INTERRUPT\n");
break;
case 0x03:
fdc_log("SPECIFY\n");
break;
case 0x04:
fdc_log("SENSE DRIVE\n");
break;
case 0x0f:
fdc_log("SEEK\n");
break;
default:
fdc_log("\n");
break;
}
fdc->error = 0;
if (((fdc->command & 0x1f) == 0x02) || ((fdc->command & 0x1f) == 0x05) ||
@@ -1106,6 +1190,8 @@ fdc_write(uint16_t addr, uint8_t val, void *priv)
if (command_has_drivesel[fdc->command & 0x1F]) {
if (fdc->flags & FDC_FLAG_PCJR)
fdc->drive = 0;
else if (fdc->flags & FDC_FLAG_5550)
fdc->drive = fdc->params[0] & 3;
else
fdc->drive = fdc->dor & 3;
fdc->rw_drive = fdc->params[0] & 3;
@@ -1115,6 +1201,8 @@ fdc_write(uint16_t addr, uint8_t val, void *priv)
}
if (fdc->pnum == fdc->ptot) {
fdc_log("Got all params %02X\n", fdc->command);
for (int i = 0; i < fdc->ptot; i++)
fdc_log(" [%d] %02x\n", i, fdc->params[i]);
fifo_reset(fdc->fifo_p);
fdc->interrupt = fdc->processed_cmd;
fdc->reset_stat = 0;
@@ -1451,6 +1539,8 @@ fdc_read(uint16_t addr, void *priv)
ret = 0xc0;
ret |= (fdc->dor & 0x01) << 5; /* Drive Select 0 */
ret |= (fdc->dor & 0x30) >> 4; /* Motor Select 1, 0 */
} else if (fdc->flags & FDC_FLAG_5550) {
ret = 0;
} else {
if (is486 || !fdc->enable_3f1)
ret = 0xff;
@@ -1503,9 +1593,13 @@ fdc_read(uint16_t addr, void *priv)
ret = (fdc->rwc[drive] << 4) | (fdc->media_id << 6);
break;
case 4: /*Status*/
if (fdc->flags & FDC_FLAG_5550)
picintc(1 << fdc->irq);
ret = fdc->stat;
break;
case 5: /*Data*/
if (fdc->flags & FDC_FLAG_5550)
picintc(1 << fdc->irq);
if (fdc->fifointest) {
/* Read FIFO buffer in the test mode (PS/55) */
ret = fifo_read(fdc->fifo_p);
@@ -1733,6 +1827,8 @@ fdc_callback(void *priv)
}
if (writeprot[fdc->drive])
fdc->res[10] |= 0x40;
if ((fdc->flags & FDC_FLAG_5550) && drive_empty[fdc->drive])//IBM 5550
fdc->res[10] &= 0xdf; /* Set Not Ready */
fdc->stat = (fdc->stat & 0xf) | 0xd0;
fdc->paramstogo = 1;
@@ -2349,6 +2445,10 @@ fdc_set_base(fdc_t *fdc, int base)
if (fdc->flags & FDC_FLAG_NSC) {
io_sethandler(base + 2, 0x0004, fdc_read, NULL, NULL, fdc_write, NULL, NULL, fdc);
io_sethandler(base + 7, 0x0001, fdc_read, NULL, NULL, fdc_write, NULL, NULL, fdc);
} else if (fdc->flags & FDC_FLAG_5550) {
io_sethandler(base, 0x0003, fdc_read, NULL, NULL, fdc_write, NULL, NULL, fdc);
io_sethandler(base + 0x0004, 0x0001, fdc_read, NULL, NULL, NULL, NULL, NULL, fdc);
io_sethandler(base + 0x0005, 0x0001, fdc_read, NULL, NULL, fdc_write, NULL, NULL, fdc);
} else {
if ((fdc->flags & FDC_FLAG_AT) || (fdc->flags & FDC_FLAG_AMSTRAD)) {
io_sethandler(base + (super_io ? 2 : 0), super_io ? 0x0004 : 0x0006, fdc_read, NULL, NULL, fdc_write, NULL, NULL, fdc);
@@ -2383,6 +2483,10 @@ fdc_remove(fdc_t *fdc)
if (fdc->flags & FDC_FLAG_NSC) {
io_removehandler(fdc->base_address + 2, 0x0004, fdc_read, NULL, NULL, fdc_write, NULL, NULL, fdc);
io_removehandler(fdc->base_address + 7, 0x0001, fdc_read, NULL, NULL, fdc_write, NULL, NULL, fdc);
} else if (fdc->flags & FDC_FLAG_5550) {
io_removehandler(fdc->base_address, 0x0003, fdc_read, NULL, NULL, fdc_write, NULL, NULL, fdc);
io_removehandler(fdc->base_address + 4, 0x0001, fdc_read, NULL, NULL, NULL, NULL, NULL, fdc);
io_removehandler(fdc->base_address + 5, 0x0001, fdc_read, NULL, NULL, fdc_write, NULL, NULL, fdc);
} else {
if ((fdc->flags & FDC_FLAG_AT) || (fdc->flags & FDC_FLAG_AMSTRAD)) {
io_removehandler(fdc->base_address + (super_io ? 2 : 0), super_io ? 0x0004 : 0x0006, fdc_read, NULL, NULL, fdc_write, NULL, NULL, fdc);
@@ -2534,6 +2638,8 @@ fdc_init(const device_t *info)
fdc->irq = FDC_TERTIARY_IRQ;
else if (fdc->flags & FDC_FLAG_QUA)
fdc->irq = FDC_QUATERNARY_IRQ;
else if (fdc->flags & FDC_FLAG_5550)
fdc->irq = 4;
else
fdc->irq = FDC_PRIMARY_IRQ;
@@ -2686,6 +2792,20 @@ const device_t fdc_xt_umc_um8398_device = {
.config = NULL
};
const device_t fdc_xt_5550_device = {
.name = "IBM 5550 Floppy Drive Controller",
.internal_name = "fdc_xt_5550",
.flags = 0,
.local = FDC_FLAG_5550,
.init = fdc_init,
.close = fdc_close,
.reset = fdc_reset,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
const device_t fdc_pcjr_device = {
.name = "PCjr Floppy Drive Controller",
.internal_name = "fdc_pcjr",

View File

@@ -777,6 +777,10 @@ fdd_poll(void *priv)
if (!fdd_notfound)
fdc_noidam(fdd_fdc);
}
if (fdd_changed[drive]) {
fdc_diskchange_interrupt(fdd_fdc, drive);
}
}
int

View File

@@ -59,6 +59,7 @@
#define FDC_FLAG_TER 0x40000 /* Is Tertiary */
#define FDC_FLAG_QUA 0x80000 /* Is Quaternary */
#define FDC_FLAG_SMC661 0x100000 /* SM(s)C FDC37C661 - different TDR enhanced mode */
#define FDC_FLAG_5550 0x200000 /* IBM Multistation 5550 */
typedef struct fdc_t {
uint8_t dor;
@@ -252,6 +253,7 @@ extern void fdc_reset(void *priv);
extern uint8_t fdc_get_current_drive(void);
extern void fdc_seek_complete_interrupt(fdc_t *fdc, int drive);
extern void fdc_diskchange_interrupt(fdc_t *fdc, int drive);
#ifdef EMU_DEVICE_H
extern const device_t fdc_xt_device;
@@ -262,6 +264,7 @@ extern const device_t fdc_xt_t1x00_device;
extern const device_t fdc_xt_tandy_device;
extern const device_t fdc_xt_amstrad_device;
extern const device_t fdc_xt_umc_um8398_device;
extern const device_t fdc_xt_5550_device;
extern const device_t fdc_pcjr_device;
extern const device_t fdc_at_device;
extern const device_t fdc_at_sec_device;

View File

@@ -170,6 +170,7 @@ extern void kbd_adddata_process(uint16_t val, void (*adddata)(uint16_t val));
extern void kbd_adddata_process_10x(uint16_t val, void (*adddata)(uint16_t val));
extern const scancode scancode_xt[512];
extern const scancode scancode_set8a[512];
extern uint8_t keyboard_set3_flags[512];
extern uint8_t keyboard_set3_all_repeat;

View File

@@ -569,6 +569,7 @@ extern int machine_at_acer100t_init(const machine_t *);
/* HT18 */
extern int machine_at_ama932j_init(const machine_t *);
extern int machine_at_tandy1000rsx_init(const machine_t *);
/* Intel 82335 */
extern int machine_at_adi386sx_init(const machine_t *);
@@ -750,6 +751,9 @@ extern int machine_at_4gpv5_init(const machine_t *);
/* Contaq 82C597 */
extern int machine_at_greenb_init(const machine_t *);
/* OPTi 499 */
extern int machine_at_xenon_init(const machine_t *);
/* OPTi 895 */
#ifdef EMU_DEVICE_H
extern const device_t j403tg_device;
@@ -1211,6 +1215,9 @@ extern int machine_at_ma30d_init(const machine_t *);
/* i440EX */
extern int machine_at_brio83xx_init(const machine_t *);
extern int machine_at_p6i440e2_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t como_device;
#endif
extern int machine_at_como_init(const machine_t *);
/* i440BX */
@@ -1506,6 +1513,10 @@ extern int machine_xt_iskra3104_init(const machine_t *);
extern int machine_xt_lxt3_init(const machine_t *);
extern int machine_xt_compaq_deskpro_init(const machine_t *);
/* m_xt_ibm5550.c */
extern int machine_xt_ibm5550_init(const machine_t *);
/* m_xt_t1000.c */
#ifdef EMU_DEVICE_H
extern const device_t t1000_video_device;

View File

@@ -307,6 +307,7 @@ extern int read_type;
extern int mem_a20_state;
extern int mem_a20_alt;
extern int mem_a20_chipset;
extern int mem_a20_key;
extern uint8_t read_mem_b(uint32_t addr);

View File

@@ -99,6 +99,7 @@ typedef struct netcard_conf_t {
uint32_t link_state;
uint8_t switch_group;
uint8_t promisc_mode;
char slirp_net[16];
char nrs_hostname[128];
} netcard_conf_t;

View File

@@ -90,6 +90,8 @@ typedef struct pit_intf_t {
void (*write)(uint16_t addr, uint8_t val, void *priv);
/* Gets a counter's count. */
uint16_t (*get_count)(void *data, int counter_id);
/* Gets a counter's out. */
int (*get_outlevel)(void *data, int counter_id);
/* Sets a counter's GATE input. */
void (*set_gate)(void *data, int counter_id, int gate);
/* Sets if a counter's CLOCK input is from the timer or not - used by PCjr. */

View File

@@ -28,23 +28,27 @@
#define LEDGER_PAGE_HEIGHT 17.0
/* Standard A0 */
#define A0_PAGE_WIDTH 33.125
#define A0_PAGE_HEIGHT 46.75
#define A0_PAGE_WIDTH 33.110236
#define A0_PAGE_HEIGHT 46.811023
/* Standard A1 */
#define A1_PAGE_WIDTH 23.375
#define A1_PAGE_HEIGHT 33.125
#define A1_PAGE_WIDTH 23.385826
#define A1_PAGE_HEIGHT 33.110236
/* Standard A2 */
#define A2_PAGE_WIDTH 16.5
#define A2_PAGE_HEIGHT 23.375
#define A2_PAGE_WIDTH 16.535433
#define A2_PAGE_HEIGHT 23.385826
/* Standard A3 */
#define A3_PAGE_WIDTH 11.75
#define A3_PAGE_HEIGHT 16.5
#define A3_PAGE_WIDTH 11.692913
#define A3_PAGE_HEIGHT 16.535433
/* Standard A4 */
#define A4_PAGE_WIDTH 8.25
#define A4_PAGE_HEIGHT 11.75
#define A4_PAGE_WIDTH 8.267716
#define A4_PAGE_HEIGHT 11.692913
/* Standard B4 */
#define B4_PAGE_WIDTH 9.8425197
#define B4_PAGE_HEIGHT 13.897637
#endif /*EMU_PLAT_FALLTHROUGH_H*/

View File

@@ -352,8 +352,9 @@ extern void ati8514_out(uint16_t addr, uint8_t val, void *priv);
extern uint8_t ati8514_in(uint16_t addr, void *priv);
extern void ati8514_recalctimings(svga_t *svga);
extern uint8_t ati8514_mca_read(int port, void *priv);
extern uint8_t ati8514_rom_readb(uint32_t addr, void *priv);
extern uint16_t ati8514_rom_readw(uint32_t addr, void *priv);
extern uint8_t ati8514_bios_rom_readb(uint32_t addr, void *priv);
extern uint16_t ati8514_bios_rom_readw(uint32_t addr, void *priv);
extern uint32_t ati8514_bios_rom_readl(uint32_t addr, void *priv);
extern void ati8514_mca_write(int port, uint8_t val, void *priv);
extern void ati8514_pos_write(uint16_t port, uint8_t val, void *priv);
extern void ati8514_init(svga_t *svga, void *ext8514, void *dev8514);

View File

@@ -26,6 +26,7 @@ add_library(mch OBJECT
m_europc.c
m_elt.c
m_xt_olivetti.c
m_xt_ibm5550.c
m_tandy.c
m_v86p.c
m_at_t3100e.c

View File

@@ -42,6 +42,7 @@
#include <86box/vid_cga.h>
#include <86box/flash.h>
#include <86box/machine.h>
#include <86box/sound.h>
/* ISA */
/*
@@ -369,6 +370,32 @@ machine_at_ama932j_init(const machine_t *model)
return ret;
}
int
machine_at_tandy1000rsx_init(const machine_t *model)
{
int ret;
ret = bios_load_linear("roms/machines/tandy1000rsx/tandy-1000rsx-1-10.00.bin",
0x000e0000, 131072, 0);
if (bios_only || !ret)
return ret;
machine_at_common_ide_init(model);
device_add(&headland_ht18c_device);
device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params);
device_add(&pssj_1e0_device);
if (fdc_current[0] == FDC_INTERNAL)
device_add(&fdc_at_device);
if (gfxcard[0] == VID_INTERNAL)
device_add(machine_get_vid_device(machine));
return ret;
}
/* Intel 82335 */
int
machine_at_adi386sx_init(const machine_t *model)

View File

@@ -544,17 +544,72 @@ machine_at_brio83xx_init(const machine_t *model)
return ret;
}
static const device_config_t como_config[] = {
// clang-format off
{
.name = "bios",
.description = "BIOS Version",
.type = CONFIG_BIOS,
.default_string = "como",
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = {
{
.name = "AMIBIOS 6 (071595) - Revision 1.08 (Olivetti OEM)",
.internal_name = "como_olivetti",
.bios_type = BIOS_NORMAL,
.files_no = 1,
.local = 0,
.size = 262144,
.files = { "roms/machines/como/COMO_Olivetti_OEM.ROM", "" }
},
{
.name = "AMIBIOS 6 (071595) - Revision 1.12 (eMachines OEM)",
.internal_name = "como",
.bios_type = BIOS_NORMAL,
.files_no = 1,
.local = 0,
.size = 262144,
.files = { "roms/machines/como/COMO.ROM", "" }
},
{ .files_no = 0 }
}
},
{ .name = "", .description = "", .type = CONFIG_END }
// clang-format on
};
const device_t como_device = {
.name = "TriGem Como",
.internal_name = "como_device",
.flags = 0,
.local = 0,
.init = NULL,
.close = NULL,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = como_config
};
int
machine_at_como_init(const machine_t *model)
{
int ret;
int ret = 0;
const char *fn;
ret = bios_load_linear("roms/machines/como/COMO.ROM",
0x000c0000, 262144, 0);
if (bios_only || !ret)
/* No ROMs available */
if (!device_available(model->device))
return ret;
device_context(model->device);
fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0);
ret = bios_load_linear(fn, 0x000c0000, 262144, 0);
device_context_restore();
machine_at_common_init_ex(model, 2);
pci_init(PCI_CONFIG_TYPE_1);

View File

@@ -426,6 +426,8 @@ machine_at_tuliptc38_init(const machine_t *model)
device_add(&ide_isa_device);
device_add_params(&fdc37c6xx_device, (void *) (FDC37C651 | FDC37C6XX_IDE_PRI));
video_reset(gfxcard[0]);
if (gfxcard[0] == VID_INTERNAL) {
bios_load_aux_linear("roms/machines/tuliptc38/VBIOS.BIN",
0x000c0000, 32768, 0);

View File

@@ -311,6 +311,8 @@ machine_at_dell466np_init(const machine_t *model)
machine_at_common_init(model);
device_add(&sis_85c461_device);
video_reset(gfxcard[0]);
if (gfxcard[0] == VID_INTERNAL)
device_add(machine_get_vid_device(machine));
else {
@@ -354,6 +356,8 @@ machine_at_valuepoint433_init(const machine_t *model) // hangs without the PS/2
if (fdc_current[0] == FDC_INTERNAL)
device_add(&fdc_at_device);
video_reset(gfxcard[0]);
if (gfxcard[0] != VID_INTERNAL) {
for (uint16_t i = 0; i < 32768; i++)
rom[i] = mem_readb_phys(0x000c0000 + i);

View File

@@ -166,6 +166,29 @@ machine_at_greenb_init(const machine_t *model)
return ret;
}
/* OPTi 499 */
int
machine_at_xenon_init(const machine_t *model)
{
int ret;
ret = bios_load_linear("roms/machines/xenon/addx-bios-7-71-i28f001.bin",
0x000e0000, 131072, 0);
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
device_add(&opti499_device);
device_add(&ide_vlb_device);
device_add_params(&fdc37c6xx_device, (void *) (FDC37C661 | FDC37C6XX_IDE_PRI));
device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params);
device_add(&intel_flash_bxt_device);
return ret;
}
/* OPTi 895 */
static const device_config_t j403tg_config[] = {
// clang-format off
@@ -467,6 +490,8 @@ machine_at_tg486g_init(const machine_t *model)
device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params);
video_reset(gfxcard[0]);
if (gfxcard[0] != VID_INTERNAL) {
for (uint16_t i = 0; i < 32768; i++)
rom[i] = mem_readb_phys(0x000c0000 + i);

2132
src/machine/m_xt_ibm5550.c Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -3033,6 +3033,49 @@ const machine_t machines[] = {
.snd_device = NULL,
.net_device = NULL
},
{
.name = "[8086] IBM Multistation 5550",
.internal_name = "ibm5550",
.type = MACHINE_TYPE_8086,
.chipset = MACHINE_CHIPSET_DISCRETE,
.init = machine_xt_ibm5550_init,
.p1_handler = NULL,
.gpio_handler = NULL,
.available_flag = MACHINE_AVAILABLE,
.gpio_acpi_handler = NULL,
.cpu = {
.package = CPU_PKG_8086,
.block = CPU_BLOCK_NONE,
.min_bus = 0,
.max_bus = 0,
.min_voltage = 0,
.max_voltage = 0,
.min_multi = 0,
.max_multi = 0
},
.bus_flags = MACHINE_PC,
.flags = MACHINE_VIDEO_FIXED | MACHINE_KEYBOARD,
.ram = {
.min = 256,
.max = 640,
.step = 128
},
.nvrmask = 15,
.jumpered_ecp_dma = 0,
.default_jumpered_ecp_dma = -1,
.kbc_device = NULL,
.kbc_params = 0x00000000,
.kbc_p1 = 0xff,
.gpio = 0xffffffff,
.gpio_acpi = 0xffffffff,
.device = NULL,
.kbd_device = NULL,
.fdc_device = NULL,
.sio_device = NULL,
.vid_device = NULL,
.snd_device = NULL,
.net_device = NULL
},
/* 286 AT machines */
/* Has IBM AT KBC firmware. */
@@ -5468,6 +5511,50 @@ const machine_t machines[] = {
.snd_device = NULL,
.net_device = NULL
},
/* Has unknown KBC firmware */
{
.name = "[HT18] Tandy 1000 RSX",
.internal_name = "tandy1000rsx",
.type = MACHINE_TYPE_386SX,
.chipset = MACHINE_CHIPSET_HT18,
.init = machine_at_tandy1000rsx_init,
.p1_handler = machine_generic_p1_handler,
.gpio_handler = NULL,
.available_flag = MACHINE_AVAILABLE,
.gpio_acpi_handler = NULL,
.cpu = {
.package = CPU_PKG_386SX,
.block = CPU_BLOCK_NONE,
.min_bus = 0,
.max_bus = 0,
.min_voltage = 0,
.max_voltage = 0,
.min_multi = 0,
.max_multi = 0
},
.bus_flags = MACHINE_PS2,
.flags = MACHINE_IDE | MACHINE_VIDEO | MACHINE_GAMEPORT,
.ram = {
.min = 1024,
.max = 9216,
.step = 512
},
.nvrmask = 127,
.jumpered_ecp_dma = 0,
.default_jumpered_ecp_dma = -1,
.kbc_device = &kbc_at_device,
.kbc_params = 0x00000000,
.kbc_p1 = 0x000004f0,
.gpio = 0xffffffff,
.gpio_acpi = 0xffffffff,
.device = NULL,
.kbd_device = NULL,
.fdc_device = NULL,
.sio_device = NULL,
.vid_device = &gd5402_onboard_device,
.snd_device = NULL,
.net_device = NULL
},
/* Most likely has a Phoenix MultiKey/42 keyboard controller. */
{
.name = "[Intel 82335] ADI 386SX",
@@ -8805,6 +8892,50 @@ const machine_t machines[] = {
.snd_device = NULL,
.net_device = NULL
},
/* Has AMIKey F KBC firmware. */
{
.name = "[OPTi 499] ADD-X Normerel Xenon",
.internal_name = "xenon",
.type = MACHINE_TYPE_486_S3,
.chipset = MACHINE_CHIPSET_OPTI_499,
.init = machine_at_xenon_init,
.p1_handler = machine_generic_p1_handler,
.gpio_handler = NULL,
.available_flag = MACHINE_AVAILABLE,
.gpio_acpi_handler = NULL,
.cpu = {
.package = CPU_PKG_SOCKET3,
.block = CPU_BLOCK_NONE,
.min_bus = 0,
.max_bus = 0,
.min_voltage = 0,
.max_voltage = 0,
.min_multi = 0,
.max_multi = 0
},
.bus_flags = MACHINE_PS2_VLB,
.flags = MACHINE_IDE | MACHINE_APM,
.ram = {
.min = 1024,
.max = 65536,
.step = 1024
},
.nvrmask = 127,
.jumpered_ecp_dma = 0,
.default_jumpered_ecp_dma = -1,
.kbc_device = &kbc_at_device,
.kbc_params = KBC_VEN_AMI | 0x00004600,
.kbc_p1 = 0x00000cf0,
.gpio = 0xffffffff,
.gpio_acpi = 0xffffffff,
.device = NULL,
.kbd_device = NULL,
.fdc_device = NULL,
.sio_device = NULL,
.vid_device = NULL,
.snd_device = NULL,
.net_device = NULL
},
/* Version 1.0 has an AMIKEY-2, version 2.0 has a VIA VT82C42N KBC. */
{
.name = "[OPTi 895] Jetway J-403TG",
@@ -18575,11 +18706,11 @@ const machine_t machines[] = {
.kbc_p1 = 0x00000cf0,
.gpio = 0xffffffff,
.gpio_acpi = 0xffffffff,
.device = NULL,
.device = &como_device,
.kbd_device = NULL,
.fdc_device = NULL,
.sio_device = NULL,
.vid_device = NULL,
.vid_device = NULL, /* Onboard video not yet emulated: ATi Rage IIc AGP */
.snd_device = &cs4235_onboard_device,
.net_device = NULL
},

View File

@@ -106,9 +106,10 @@ int cachesize = 256;
uint32_t get_phys_virt;
uint32_t get_phys_phys;
int mem_a20_key = 0;
int mem_a20_alt = 0;
int mem_a20_state = 0;
int mem_a20_key = 0;
int mem_a20_alt = 0;
int mem_a20_chipset = 0;
int mem_a20_state = 0;
int mmuflush = 0;
@@ -3109,12 +3110,12 @@ mem_a20_recalc(void)
if (!is286) {
rammask = 0xfffff;
flushmmucache();
mem_a20_key = mem_a20_alt = mem_a20_state = 0;
mem_a20_key = mem_a20_alt = mem_a20_state = mem_a20_chipset = 0;
return;
}
state = mem_a20_key | mem_a20_alt;
state = mem_a20_key | mem_a20_alt | mem_a20_chipset;
if (state && !mem_a20_state) {
rammask = cpu_16bitbus ? 0xffffff : 0xffffffff;
if (is6117)

View File

@@ -43,6 +43,7 @@
#ifdef _WIN32
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
# include <ws2tcpip.h>
#else
# include <poll.h>
#endif
@@ -493,13 +494,30 @@ net_slirp_init(const netcard_t *card, const uint8_t *mac_addr, UNUSED(void *priv
slirp->pfd = calloc(1, slirp->pfd_size);
#endif
/* Set the IP addresses to use. */
struct in_addr net = { .s_addr = htonl(0x0a000000 | (slirp_card_num << 8)) }; /* 10.0.x.0 */
struct in_addr mask = { .s_addr = htonl(0xffffff00) }; /* 255.255.255.0 */
struct in_addr host = { .s_addr = htonl(0x0a000002 | (slirp_card_num << 8)) }; /* 10.0.x.2 */
struct in_addr dhcp = { .s_addr = htonl(0x0a00000f | (slirp_card_num << 8)) }; /* 10.0.x.15 */
struct in_addr dns = { .s_addr = htonl(0x0a000003 | (slirp_card_num << 8)) }; /* 10.0.x.3 */
struct in_addr bind = { .s_addr = htonl(0x00000000) }; /* 0.0.0.0 */
struct in_addr net;
struct in_addr host;
struct in_addr dhcp;
struct in_addr dns;
/* Set the IP addresses to use.
Use a configured address if set, otherwise 10.0.x.0 */
const char *slirp_net = net_cards_conf[card->card_num].slirp_net;
if (slirp_net[0] != '\0') {
struct in_addr addr;
inet_pton(AF_INET, slirp_net, &addr);
net.s_addr = htonl(ntohl(addr.s_addr) & 0xffffff00);
host.s_addr = htonl(ntohl(addr.s_addr) + 2);
dhcp.s_addr = htonl(ntohl(addr.s_addr) + 15);
dns.s_addr = htonl(ntohl(addr.s_addr) + 3);
} else {
net.s_addr = htonl(0x0a000000 | (slirp_card_num << 8)); /* 10.0.x.0 */
host.s_addr = htonl(0x0a000002 | (slirp_card_num << 8)); /* 10.0.x.2 */
dhcp.s_addr = htonl(0x0a00000f | (slirp_card_num << 8)); /* 10.0.x.15 */
dns.s_addr = htonl(0x0a000003 | (slirp_card_num << 8)); /* 10.0.x.3 */
}
struct in_addr mask = { .s_addr = htonl(0xffffff00) }; /* 255.255.255.0 */
struct in_addr bind = { .s_addr = htonl(0x00000000) }; /* 0.0.0.0 */
const SlirpConfig slirp_config = {
#if SLIRP_CHECK_VERSION(4, 9, 0)

View File

@@ -420,6 +420,15 @@ pit_ctr_get_count(void *data, int counter_id)
return (uint16_t) ctr->l;
}
int
pit_ctr_get_outlevel(void *data, int counter_id)
{
const pit_t *pit = (pit_t *) data;
const ctr_t *ctr = &pit->counters[counter_id];
return (int) ctr->out;
}
void
pit_ctr_set_load_func(void *data, int counter_id, void (*func)(uint8_t new_m, int new_count))
{
@@ -1208,6 +1217,11 @@ pit_set_clock(uint32_t clock)
CGACONST = (uint64_t) ((cpuclock / (157500000.0 / 88.0)) * (double) (1ULL << 32));
#endif
}
if (machines[machine].init == machine_xt_ibm5550_init) {
PITCONSTD = (cpuclock / 2000000.0); /* CLK input 2.0 MHz */
PITCONST = (uint64_t) (PITCONSTD * (double) (1ULL << 32));
}
ISACONST = (1ULL << 32ULL);
}
@@ -1263,6 +1277,7 @@ const pit_intf_t pit_classic_intf = {
.read = &pit_read,
.write = &pit_write,
.get_count = &pit_ctr_get_count,
.get_outlevel = &pit_ctr_get_outlevel,
.set_gate = &pit_ctr_set_gate,
.set_using_timer = &pit_ctr_set_using_timer,
.set_out_func = &pit_ctr_set_out_func,

View File

@@ -1,75 +1,24 @@
/*
* VARCem Virtual ARchaeological Computer EMulator.
* An emulator of (mostly) x86-based PC systems and devices,
* using the ISA,EISA,VLB,MCA and PCI system buses, roughly
* spanning the era between 1981 and 1995.
* 86Box A hypervisor and IBM PC system emulator that specializes in
* running old operating systems and software designed for IBM
* PC systems and compatibles from 1981 through fairly recent
* system designs based on the PCI bus.
*
* Various ASCII to Unicode maps, for the various codepages.
* This file is part of the 86Box distribution.
*
* Authors: Michael Drüing, <michael@drueing.de>
* Fred N. van Kempen, <decwiz@yahoo.com>
* Code page to Unicode mapping
* for a generic ESC/P 2 dot-matrix printer.
*
* Based on code by Frederic Weymann (originally for DosBox.)
* Authors: Lili Kurek, <lili@lili.lgbt>
*
* Copyright 2018 Michael Drüing.
* Copyright 2018 Fred N. van Kempen.
* Based on code by Frederic Weymann (originally for DOSBox.)
*
* Redistribution and use in source and binary forms, with
* or without modification, are permitted provided that the
* following conditions are met:
*
* 1. Redistributions of source code must retain the entire
* above notice, this list of conditions and the following
* disclaimer.
*
* 2. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names
* of its contributors may be used to endorse or promote
* products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* Copyright 2025-2026 Lili Kurek.
*/
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include <wchar.h>
#include <86box/86box.h>
#include <86box/plat.h>
#include <86box/printer.h>
static const uint16_t cp437Map[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
static const uint16_t cp437Map[128] = {
0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7,
0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
@@ -88,23 +37,7 @@ static const uint16_t cp437Map[256] = {
0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0
};
static const uint16_t cp737Map[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
static const uint16_t cp737Map[128] = {
0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398,
0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0,
0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9,
@@ -123,23 +56,7 @@ static const uint16_t cp737Map[256] = {
0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0
};
static const uint16_t cp775Map[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
static const uint16_t cp775Map[128] = {
0x0106, 0x00fc, 0x00e9, 0x0101, 0x00e4, 0x0123, 0x00e5, 0x0107,
0x0142, 0x0113, 0x0156, 0x0157, 0x012b, 0x0179, 0x00c4, 0x00c5,
0x00c9, 0x00e6, 0x00c6, 0x014d, 0x00f6, 0x0122, 0x00a2, 0x015a,
@@ -158,23 +75,7 @@ static const uint16_t cp775Map[256] = {
0x00b0, 0x2219, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0
};
static const uint16_t cp850Map[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
static const uint16_t cp850Map[128] = {
0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7,
0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
@@ -193,23 +94,7 @@ static const uint16_t cp850Map[256] = {
0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0
};
static const uint16_t cp852Map[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
static const uint16_t cp852Map[128] = {
0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x016f, 0x0107, 0x00e7,
0x0142, 0x00eb, 0x0150, 0x0151, 0x00ee, 0x0179, 0x00c4, 0x0106,
0x00c9, 0x0139, 0x013a, 0x00f4, 0x00f6, 0x013d, 0x013e, 0x015a,
@@ -228,23 +113,7 @@ static const uint16_t cp852Map[256] = {
0x00b0, 0x00a8, 0x02d9, 0x0171, 0x0158, 0x0159, 0x25a0, 0x00a0
};
static const uint16_t cp855Map[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
static const uint16_t cp855Map[128] = {
0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404,
0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408,
0x0459, 0x0409, 0x045a, 0x040a, 0x045b, 0x040b, 0x045c, 0x040c,
@@ -263,23 +132,7 @@ static const uint16_t cp855Map[256] = {
0x042d, 0x0449, 0x0429, 0x0447, 0x0427, 0x00a7, 0x25a0, 0x00a0
};
static const uint16_t cp857Map[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
static const uint16_t cp857Map[128] = {
0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7,
0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x0131, 0x00c4, 0x00c5,
0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
@@ -298,23 +151,7 @@ static const uint16_t cp857Map[256] = {
0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0
};
static const uint16_t cp860Map[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
static const uint16_t cp860Map[128] = {
0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e3, 0x00e0, 0x00c1, 0x00e7,
0x00ea, 0x00ca, 0x00e8, 0x00cd, 0x00d4, 0x00ec, 0x00c3, 0x00c2,
0x00c9, 0x00c0, 0x00c8, 0x00f4, 0x00f5, 0x00f2, 0x00da, 0x00f9,
@@ -333,23 +170,7 @@ static const uint16_t cp860Map[256] = {
0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0
};
static const uint16_t cp861Map[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
static const uint16_t cp861Map[128] = {
0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7,
0x00ea, 0x00eb, 0x00e8, 0x00d0, 0x00f0, 0x00de, 0x00c4, 0x00c5,
0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00fe, 0x00fb, 0x00dd,
@@ -368,23 +189,7 @@ static const uint16_t cp861Map[256] = {
0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0
};
static const uint16_t cp862Map[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
static const uint16_t cp862Map[128] = {
0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7,
0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df,
0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7,
@@ -403,23 +208,7 @@ static const uint16_t cp862Map[256] = {
0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0
};
static const uint16_t cp863Map[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
static const uint16_t cp863Map[128] = {
0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00c2, 0x00e0, 0x00b6, 0x00e7,
0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x2017, 0x00c0, 0x00a7,
0x00c9, 0x00c8, 0x00ca, 0x00f4, 0x00cb, 0x00cf, 0x00fb, 0x00f9,
@@ -438,23 +227,7 @@ static const uint16_t cp863Map[256] = {
0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0
};
static const uint16_t cp864Map[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x066a, 0x0026, 0x0027,
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
static const uint16_t cp864Map[128] = {
0x00b0, 0x00b7, 0x2219, 0x221a, 0x2592, 0x2500, 0x2502, 0x253c,
0x2524, 0x252c, 0x251c, 0x2534, 0x2510, 0x250c, 0x2514, 0x2518,
0x03b2, 0x221e, 0x03c6, 0x00b1, 0x00bd, 0x00bc, 0x2248, 0x00ab,
@@ -473,23 +246,7 @@ static const uint16_t cp864Map[256] = {
0xfed5, 0xfef5, 0xfef6, 0xfedd, 0xfed9, 0xfef1, 0x25a0, 0x00a0
};
static const uint16_t cp865Map[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
static const uint16_t cp865Map[128] = {
0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7,
0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
@@ -508,23 +265,7 @@ static const uint16_t cp865Map[256] = {
0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0
};
static const uint16_t cp866Map[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
static const uint16_t cp866Map[128] = {
0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
@@ -570,7 +311,7 @@ static const struct {
void
select_codepage(uint16_t code, uint16_t *curmap)
{
uint16_t i = 0;
uint8_t i = 0;
const uint16_t *map_to_use;
map_to_use = maps[0].map;
@@ -583,6 +324,9 @@ select_codepage(uint16_t code, uint16_t *curmap)
i++;
}
for (uint16_t j = 0; j < 256; j++)
curmap[j] = map_to_use[j];
for (i = 0; i < 128; ++i)
curmap[i] = i;
for (; i != 0; ++i)
curmap[i] = map_to_use[i - 128];
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -55,10 +55,10 @@ msgid "&Resizeable window"
msgstr "G&rößenverstellbares Fenster"
msgid "R&emember size && position"
msgstr "Größe && &Position merken"
msgstr "Größe und &Position merken"
msgid "Remember size && position"
msgstr "Größe && Position merken"
msgstr "Größe und Position merken"
msgid "Re&nderer"
msgstr "Re&nderer"
@@ -742,10 +742,10 @@ msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video
msgstr "Die Videokarte \"%hs\" ist aufgrund von fehlenden ROMs im Verzeichnis roms/video nicht verfügbar. Es wird auf eine verfügbare Videokarte gewechselt."
msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card."
msgstr "Das Gerät \"%hs\" ist aufgrund von fehlenden ROMs nicht verfügbar. Es wird ignoriert."
msgstr "Die Videokarte 2 \"%hs\" ist aufgrund von fehlenden ROMs im Verzeichnis roms/video nicht verfügbar. Es wird deaktiviert."
msgid "Device \"%hs\" is not available due to missing ROMs. Ignoring the device."
msgstr "Die Videokarte 2 \"%hs\" ist aufgrund von fehlenden ROMs im Verzeichnis roms/video nicht verfügbar. Es wird deaktiviert."
msgstr "Das Gerät \"%hs\" ist aufgrund von fehlenden ROMs nicht verfügbar. Es wird ignoriert."
msgid "Machine"
msgstr "System"
@@ -2848,10 +2848,10 @@ msgid "Hostname:"
msgstr "Hostname:"
msgid "ISA RAM:"
msgstr ""
msgstr "ISA RAM:"
msgid "ISA ROM:"
msgstr ""
msgstr "ISA ROM:"
msgid "&Wipe NVRAM"
msgstr "NVRAM leeren"
@@ -2869,7 +2869,7 @@ msgid "An error occurred trying to wipe the NVRAM contents of the virtual machin
msgstr "Beim Leeren des NVRAMs der virtuellen Maschine ist ein Fehler aufgetreten \"%1\""
msgid "%1 VM Manager"
msgstr ""
msgstr "%1 VM Manager"
msgid "%n disk(s)"
msgstr "%n Festplatte(n)"

View File

@@ -1,6 +1,6 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-01-26 17:57+0000\n"
"PO-Revision-Date: 2026-02-04 18:32+0000\n"
"Last-Translator: DimMan88 <dimman88@hotmail.com>\n"
"Language-Team: Greek <https://weblate.86box.net/projects/86box/86box/el/>\n"
"Language: el-GR\n"
@@ -61,7 +61,7 @@ msgid "Remember size && position"
msgstr "Απομνήμευση μεγέθους && θέσης"
msgid "Re&nderer"
msgstr "Re&nderer"
msgstr "&Απεικονιστής"
msgid "&Qt (Software)"
msgstr "&Qt (Software)"
@@ -397,7 +397,7 @@ msgid "Enabled (UTC)"
msgstr "Ενεργό (UTC)"
msgid "Dynamic Recompiler"
msgstr "Dynamic Recompiler"
msgstr "Δυναμικός Αναμεταγλωττιστής"
msgid "CPU frame size"
msgstr "Μέγεθος πλαισίου CPU"
@@ -619,7 +619,7 @@ msgid "Image Format:"
msgstr "Τύπος Εικόνας:"
msgid "Block Size:"
msgstr "Block Size:"
msgstr "Μέγεθος Block:"
msgid "Floppy drives:"
msgstr "Οδηγοί δισκέτας:"
@@ -721,10 +721,10 @@ msgid "Turbo"
msgstr "Turbo"
msgid "On"
msgstr "On"
msgstr "Ενεργό"
msgid "Off"
msgstr "Off"
msgstr "Ανενεργό"
msgid "All images"
msgstr "Όλες οι εικόνες"
@@ -1080,7 +1080,7 @@ msgid "Cartridge %1: %2"
msgstr "Κασέτα δεδομένων %1: %2"
msgid "Car&tridge %1: %2"
msgstr "Car&tridge %1: %2"
msgstr "&Κασέτα δεδομένων %1: %2"
msgid "Cartridge images"
msgstr "Εικόνες κασέτας δεδομένων"
@@ -1460,13 +1460,13 @@ msgid "HDX image"
msgstr "Εικόνα HDX"
msgid "Fixed-size VHD"
msgstr "Fixed-size VHD"
msgstr "Σταθερό-μέγεθος VHD"
msgid "Dynamic-size VHD"
msgstr "Dynamic-size VHD"
msgstr "Δυναμικό-μέγεθος VHD"
msgid "Differencing VHD"
msgstr "Differencing VHD"
msgstr "Διαφοροποίηση VHD"
msgid "(N/A)"
msgstr "(Μ/Δ)"
@@ -1481,19 +1481,19 @@ msgid "HDX image (.hdx)"
msgstr "Εικόνα HDX (.hdx)"
msgid "Fixed-size VHD (.vhd)"
msgstr "Fixed-size VHD (.vhd)"
msgstr "Σταθερό-μέγεθος VHD (.vhd)"
msgid "Dynamic-size VHD (.vhd)"
msgstr "Dynamic-size VHD (.vhd)"
msgstr "Δυναμικό-μέγεθος VHD (.vhd)"
msgid "Differencing VHD (.vhd)"
msgstr "Differencing VHD (.vhd)"
msgstr "Διαφοροποίηση VHD (.vhd)"
msgid "Large blocks (2 MB)"
msgstr "Large blocks (2 MB)"
msgstr "Μεγάλα blocks (2 MB)"
msgid "Small blocks (512 KB)"
msgstr "Small blocks (512 KB)"
msgstr "Μικρά blocks (512 KB)"
msgid "VHD files"
msgstr "Αρχεία VHD"
@@ -2964,7 +2964,7 @@ msgid "version"
msgstr "έκδοση"
msgid "build"
msgstr "build"
msgstr "δομή"
msgid "You are currently running version <b>%1</b>."
msgstr "Τρέχετε την έκδοση <b>%1</b>."

View File

@@ -15,6 +15,9 @@ msgstr "&RGB Greyscale"
msgid "Generic RGBI color monitor"
msgstr "Generic RGBI colour monitor"
msgid "Grayscale &conversion type"
msgstr "Greyscale &conversion type"
msgid "Time synchronization"
msgstr "Time synchronisation"
@@ -28,7 +31,7 @@ msgid "Failed to initialize network driver"
msgstr "Failed to initialise network driver"
msgid "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behavior will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use."
msgstr "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behaviour will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use."
msgstr "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behaviour should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behaviour will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use."
msgid "Appl&y fullscreen stretch mode when maximized"
msgstr "Appl&y fullscreen stretch mode when maximised"
@@ -78,9 +81,18 @@ msgstr "Enhanced Colour - Enhanced Mode (5154/ECD)"
msgid "Gray"
msgstr "Grey"
msgid "Grayscale"
msgstr "Greyscale"
msgid "Color"
msgstr "Colour"
msgid "Color Interlaced"
msgstr "Colour Interlaced"
msgid "Color Non-Interlaced"
msgstr "Colour Non-Interlaced"
msgid "Failed to initialize Vulkan renderer."
msgstr "Failed to initialise Vulkan renderer."

View File

@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2025-11-29 00:34+0000\n"
"Last-Translator: OBattler <oubattler@gmail.com>\n"
"PO-Revision-Date: 2026-02-06 05:57+0000\n"
"Last-Translator: Jeffrey Hope <strangercoug@hotmail.com>\n"
"Language-Team: Spanish <https://weblate.86box.net/projects/86box/86box/es/>\n"
"Language: es-ES\n"
"MIME-Version: 1.0\n"
@@ -1108,7 +1108,7 @@ msgid "Not running"
msgstr "No en ejecución"
msgid "Running"
msgstr "En ejeución"
msgstr "En ejecución"
msgid "Paused"
msgstr "En pausa"

View File

@@ -400,7 +400,8 @@ emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
ret = CallNextHookEx(NULL, nCode, wParam, lParam);
if (lpKdhs->scanCode == 0x00000045) {
if ((lpKdhs->flags & LLKHF_EXTENDED) && (lpKdhs->vkCode == 0x00000090)) {
if ((lpKdhs->flags & LLKHF_EXTENDED) && ((lpKdhs->vkCode == 0x00000090) ||
(lpKdhs->vkCode == 0x00000013))) {
/* NumLock. */
lpKdhs->flags &= ~LLKHF_EXTENDED;
} else if (!(lpKdhs->flags & LLKHF_EXTENDED) && (lpKdhs->vkCode == 0x00000013)) {
@@ -621,7 +622,7 @@ main(int argc, char *argv[])
fprintf(stderr, "Qt: version %s, platform \"%s\"\n", qVersion(), QApplication::platformName().toUtf8().data());
ProgSettings::loadTranslators(&app);
#ifdef Q_OS_WINDOWS
QApplication::setFont(QFont(ProgSettings::getFontName(lang_id), 9));
QApplication::setFont(ProgSettings::getUIFont());
SetCurrentProcessExplicitAppUserModelID(L"86Box.86Box");
#endif

View File

@@ -2431,7 +2431,7 @@ MainWindow::changeEvent(QEvent *event)
#ifdef Q_OS_WINDOWS
if (event->type() == QEvent::LanguageChange) {
auto size = this->centralWidget()->size();
QApplication::setFont(QFont(ProgSettings::getFontName(lang_id), 9));
QApplication::setFont(ProgSettings::getUIFont());
QApplication::processEvents();
main_window->centralWidget()->setFixedSize(size);
QApplication::processEvents();

View File

@@ -592,10 +592,10 @@ MediaMenu::cdromMount(int i, int dir, const QString &arg)
if (dir > 1)
filename = QString::asprintf(R"(ioctl://%s)", arg.toUtf8().data());
else if (dir == 1)
filename = QFileDialog::getExistingDirectory(parentWidget);
filename = QFileDialog::getExistingDirectory(parentWidget, QString(), getMediaOpenDirectory());
else {
filename = QFileDialog::getOpenFileName(parentWidget, QString(),
QString(),
getMediaOpenDirectory(),
tr("CD-ROM images") % util::DlgFilter({ "iso", "cue", "mds", "mdx" }) % tr("All files") % util::DlgFilter({ "*" }, true));
}
@@ -1199,10 +1199,13 @@ MediaMenu::nicUpdateMenu(int i)
QString
MediaMenu::getMediaOpenDirectory()
{
QString openDirectory;
static bool firstCall = true;
QString openDirectory;
if (open_dir_usr_path > 0)
if (open_dir_usr_path > 0 && firstCall) {
openDirectory = QString::fromUtf8(usr_path);
firstCall = false;
}
return openDirectory;
}

View File

@@ -28,6 +28,8 @@
#ifdef Q_OS_WINDOWS
# include <QSysInfo>
# include <QVersionNumber>
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
#endif
extern "C" {
@@ -157,27 +159,67 @@ ProgSettings::~ProgSettings()
delete ui;
}
static QString sys_lang;
#ifdef Q_OS_WINDOWS
/* Return the standard font name on Windows, which is overridden per-language
to prevent CJK fonts with embedded bitmaps being chosen as a fallback. */
QString
ProgSettings::getFontName(int langId)
/* Returns the standard UI font for Windows, which by default varies for different
languages. It can also be changed via external tools, if the user wants that.
We use the message font here since that is what most Windows components and
other third-party programs use. */
QFont
ProgSettings::getUIFont()
{
QString langCode = languageIdToCode(lang_id);
if (langCode == "ja-JP") {
/* Check for Windows 10 or later to choose the appropriate system font */
if (QVersionNumber::fromString(QSysInfo::kernelVersion()).majorVersion() >= 10)
return "Yu Gothic UI";
else
return "Meiryo UI";
} else if (langCode == "ko-KR")
return "Malgun Gothic";
else if (langCode == "zh-CN")
return "Microsoft YaHei";
else if (langCode == "zh-TW")
return "Microsoft JhengHei";
else
return "Segoe UI";
if ((langCode != sys_lang) && ((langCode == "ja-JP") || (langCode == "ko-KR") ||
(langCode == "zh-CN") || (langCode == "zh-TW"))) {
/*
Work around Windows' inappropriate, ugly default fonts when using an East Asian
language when it is not also the system language.
*/
if (langCode == "ja-JP") {
/* Check for Windows 10 or later to choose the appropriate system font */
if (QVersionNumber::fromString(QSysInfo::kernelVersion()).majorVersion() >= 10)
return QFont("Yu Gothic UI", 9);
else
return QFont("Meiryo UI", 9);
} else if (langCode == "ko-KR")
return QFont("Malgun Gothic", 9);
else if (langCode == "zh-CN")
return QFont("Microsoft YaHei", 9);
else if (langCode == "zh-TW")
return QFont("Microsoft JhengHei", 9);
}
// Get the system (primary monitor) DPI. The font returned by
// SystemParametersInfo is scaled according to this and we need
// to get the font size in points to pass into QFont's constructor.
HDC hdc = GetDC(NULL);
int systemDpi = GetDeviceCaps(hdc, LOGPIXELSY);
ReleaseDC(NULL, hdc);
// Get the font metrics.
NONCLIENTMETRICSW ncm = {};
ncm.cbSize = sizeof(ncm);
// This should never happen, but just to be safe, return Segoe UI if
// SPI fails.
if (!SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0))
{
return QFont("Segoe UI", 9);
}
QString fontName = QString::fromWCharArray(ncm.lfMessageFont.lfFaceName);
// Windows' conversion from points to pixels goes as follows:
//
// -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72)
//
// (source: https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createfontw)
//
// Let's reverse that calculation to get the point size from the message font.
int fontSize = -MulDiv(ncm.lfMessageFont.lfHeight, 72, systemDpi);
return QFont(fontName, fontSize);
}
#endif
@@ -201,9 +243,42 @@ ProgSettings::languageIdToCode(int id)
return languages[id].first;
}
void
ProgSettings::getSysLang(QObject *parent)
{
if (qtTranslator) {
QApplication::removeTranslator(qtTranslator);
qtTranslator = nullptr;
}
if (translator) {
QApplication::removeTranslator(translator);
translator = nullptr;
}
qtTranslator = new QTranslator(parent);
translator = new CustomTranslator(parent);
QString localetofilename = "";
for (int i = 0; i < QLocale::system().uiLanguages().size(); i++) {
localetofilename = QLocale::system().uiLanguages()[i];
if (translator->load(QLatin1String("86box_") + localetofilename, QLatin1String(":/"))) {
qDebug() << "Translations loaded.";
QCoreApplication::installTranslator(translator);
/* First try qtbase */
if (!loadQtTranslations(QLatin1String("qtbase_") + localetofilename.replace('-', '_')))
/* If that fails, try legacy qt_* translations */
if (!loadQtTranslations(QLatin1String("qt_") + localetofilename.replace('-', '_')))
qDebug() << "Failed to find Qt translations!";
if (QCoreApplication::installTranslator(qtTranslator))
qDebug() << "Qt translations loaded.";
sys_lang = localetofilename;
break;
}
}
}
void
ProgSettings::loadTranslators(QObject *parent)
{
getSysLang(parent);
if (qtTranslator) {
QApplication::removeTranslator(qtTranslator);
qtTranslator = nullptr;

View File

@@ -15,10 +15,11 @@ public:
explicit ProgSettings(QWidget *parent = nullptr);
~ProgSettings();
#ifdef Q_OS_WINDOWS
static QString getFontName(int langId);
static QFont getUIFont();
#endif
static int languageCodeToId(QString langCode);
static QString languageIdToCode(int id);
static void getSysLang(QObject *parent = nullptr);
static void loadTranslators(QObject *parent = nullptr);
static void reloadStrings();
class CustomTranslator : public QTranslator {

View File

@@ -44,6 +44,9 @@ extern "C" {
#include <QApplication>
#include <QStyle>
#include <dirent.h>
#include <unistd.h>
class SettingsModel : public QAbstractListModel {
public:
SettingsModel(QObject *parent)
@@ -236,5 +239,36 @@ Settings::accept()
return;
}
}
QDialog::accept();
}
static int
plat_path_is_empty(char *path)
{
int n = 0;
DIR *dir = opendir(path);
struct dirent *d;
if (dir == NULL)
/* Not a directory or doesn't exist. */
return 1;
while ((d = readdir(dir)) != NULL) {
if (++n > 2)
break;
}
closedir(dir);
return (n <= 2);
}
void
Settings::reject()
{
if (plat_path_is_empty(usr_path))
rmdir(usr_path);
QDialog::reject();
}

View File

@@ -30,6 +30,7 @@ public:
static Settings *settings;
protected slots:
void accept() override;
void reject() override;
private:
Ui::Settings *ui;

View File

@@ -165,7 +165,7 @@ VMManagerDetails::VMManagerDetails(QWidget *parent)
connect(this, &VMManagerDetails::styleUpdated, portsSection, &VMManagerDetailSection::updateStyle);
connect(this, &VMManagerDetails::styleUpdated, otherSection, &VMManagerDetailSection::updateStyle);
QApplication::setFont(QFont(ProgSettings::getFontName(lang_id), 9));
QApplication::setFont(ProgSettings::getUIFont());
#endif
sysconfig = new VMManagerSystem();

View File

@@ -269,7 +269,7 @@ VMManagerMainWindow::changeEvent(QEvent *event)
{
#ifdef Q_OS_WINDOWS
if (event->type() == QEvent::LanguageChange) {
QApplication::setFont(QFont(ProgSettings::getFontName(lang_id), 9));
QApplication::setFont(QFont(ProgSettings::getUIFont()));
}
#endif
QWidget::changeEvent(event);

View File

@@ -411,19 +411,6 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv)
goto readonly_i;
}
/* HACK: the Windows 9x driver's "Synth" control writes to this
register with no remapping, even if internal FM is enabled. */
if (ad1848->index == 18) {
if (val & 0x80)
ad1848->fm_vol_l = 0;
else
ad1848->fm_vol_l = (int) ad1848_vols_5bits_aux_gain[val & 0x1f];
} else {
if (val & 0x80)
ad1848->fm_vol_r = 0;
else
ad1848->fm_vol_r = (int) ad1848_vols_5bits_aux_gain[val & 0x1f];
}
}
if ((ad1848->type >= AD1848_TYPE_CS4232) && (ad1848->type <= AD1848_TYPE_CS4236)) {
if (ad1848->index == 18) {

View File

@@ -290,7 +290,7 @@ cs423x_write(uint16_t addr, uint8_t val, void *priv)
ad1848_init(&dev->ad1848, dev->ad1848_type);
ad1848_set_cd_audio_channel(&dev->ad1848, AD1848_AUX2);
}
val = 0x00;
val &= 0x07;
break;
case 1: /* Version / Chip ID */

View File

@@ -55,8 +55,10 @@ pssj_write(uint16_t port, uint8_t val, void *priv)
if (!pssj->enable)
timer_disable(&pssj->timer_count);
sn74689_set_extra_divide(&pssj->sn76489, val & 0x40);
if (!(val & 8))
if (!(val & 8)) {
pssj->irq = 0;
picintc(1 << 7);
}
pssj_update_irq(pssj);
break;
case 1:
@@ -78,7 +80,7 @@ pssj_write(uint16_t port, uint8_t val, void *priv)
break;
case 3:
pssj->freq = (pssj->freq & 0x0ff) | ((val & 0xf) << 8);
pssj->amplitude = val >> 4;
pssj->amplitude = (val & 0xef) >> 4;
break;
default:

View File

@@ -45,7 +45,7 @@
# undef CLAMP
#endif
#define BIOS_MACH8_ROM_PATH "roms/video/mach8/11301113140_ROM.BIN"
#define BIOS_MACH8_ROM_PATH "roms/video/mach8/11301113140_4k.BIN"
static void ibm8514_accel_outb(uint16_t port, uint8_t val, void *priv);
static void ibm8514_accel_outw(uint16_t port, uint16_t val, void *priv);
@@ -1197,8 +1197,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
old_mix_dat = mix_dat;
if (cmd != 0)
ibm8514_log("CMD=%d, full=%04x, pixcntl=%d, filling=%02x, ssvdraw=%02x.\n", cmd, dev->accel.cmd, pixcntl, dev->accel.multifunc[0x0a] & 0x06, dev->accel.ssv_draw);
ibm8514_log("CMD=%d, full=%04x, pixcntl=%d, filling=%02x, ssvdraw=%02x.\n", cmd, dev->accel.cmd, pixcntl, dev->accel.multifunc[0x0a] & 0x06, dev->accel.ssv_draw);
/*Bit 4 of the Command register is the draw yes bit, which enables writing to memory/reading from memory when enabled.
When this bit is disabled, no writing to memory/reading from memory is allowed. (This bit is almost meaningless on
@@ -1215,41 +1214,43 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
(dev->accel.cy >= clip_t) &&
(dev->accel.cy <= clip_b)) {
dev->subsys_stat |= INT_GE_BSY;
switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
case 0:
src_dat = bkgd_color;
break;
case 1:
src_dat = frgd_color;
break;
case 2:
src_dat = cpu_dat;
break;
case 3:
src_dat = 0;
break;
if (ibm8514_cpu_src(svga) || !cpu_input) {
switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
case 0:
src_dat = bkgd_color;
break;
case 1:
src_dat = frgd_color;
break;
case 2:
src_dat = cpu_dat;
break;
case 3:
src_dat = 0;
break;
default:
break;
}
default:
break;
}
READ((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat);
READ((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat);
if ((compare_mode == 0) ||
((compare_mode == 0x10) && (dest_dat >= compare)) ||
((compare_mode == 0x18) && (dest_dat < compare)) ||
((compare_mode == 0x20) && (dest_dat != compare)) ||
((compare_mode == 0x28) && (dest_dat == compare)) ||
((compare_mode == 0x30) && (dest_dat <= compare)) ||
((compare_mode == 0x38) && (dest_dat > compare))) {
old_dest_dat = dest_dat;
MIX(mix_dat & mix_mask, dest_dat, src_dat);
dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
if (dev->accel.ssv_draw) {
if ((dev->accel.cmd & 0x04) && dev->accel.ssv_len) {
WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat);
} else if (!(dev->accel.cmd & 0x04)) {
WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat);
if ((compare_mode == 0) ||
((compare_mode == 0x10) && (dest_dat >= compare)) ||
((compare_mode == 0x18) && (dest_dat < compare)) ||
((compare_mode == 0x20) && (dest_dat != compare)) ||
((compare_mode == 0x28) && (dest_dat == compare)) ||
((compare_mode == 0x30) && (dest_dat <= compare)) ||
((compare_mode == 0x38) && (dest_dat > compare))) {
old_dest_dat = dest_dat;
MIX(mix_dat & mix_mask, dest_dat, src_dat);
dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
if (dev->accel.ssv_draw) {
if ((dev->accel.cmd & 0x04) && dev->accel.ssv_len) {
WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat);
} else if (!(dev->accel.cmd & 0x04)) {
WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat);
}
}
}
}
@@ -1837,20 +1838,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
(dev->accel.cy >= clip_t) &&
(dev->accel.cy <= clip_b)) {
dev->subsys_stat |= INT_GE_BSY;
if (ibm8514_cpu_dest(svga) && (pixcntl == 0)) {
mix_dat = mix_mask; /* Mix data = forced to foreground register. */
} else if (ibm8514_cpu_dest(svga) && (pixcntl == 3)) {
/* Mix data = current video memory value. */
READ((dev->accel.cy * dev->pitch) + dev->accel.cx, mix_dat);
mix_dat = ((mix_dat & rd_mask) == rd_mask);
mix_dat = mix_dat ? mix_mask : 0;
}
if (ibm8514_cpu_dest(svga)) {
READ((dev->accel.cy * dev->pitch) + dev->accel.cx, src_dat);
if (pixcntl == 3)
src_dat = ((src_dat & rd_mask) == rd_mask);
} else
if (ibm8514_cpu_src(svga) || !cpu_input) {
switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
case 0:
src_dat = bkgd_color;
@@ -1869,21 +1857,18 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
break;
}
READ((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat);
READ((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat);
if ((compare_mode == 0) ||
((compare_mode == 0x10) && (dest_dat >= compare)) ||
((compare_mode == 0x18) && (dest_dat < compare)) ||
((compare_mode == 0x20) && (dest_dat != compare)) ||
((compare_mode == 0x28) && (dest_dat == compare)) ||
((compare_mode == 0x30) && (dest_dat <= compare)) ||
((compare_mode == 0x38) && (dest_dat > compare))) {
old_dest_dat = dest_dat;
MIX(mix_dat & mix_mask, dest_dat, src_dat);
dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
if ((dev->accel.cmd & 0x04) && dev->accel.sy) {
WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat);
} else if (!(dev->accel.cmd & 0x04)) {
if ((compare_mode == 0) ||
((compare_mode == 0x10) && (dest_dat >= compare)) ||
((compare_mode == 0x18) && (dest_dat < compare)) ||
((compare_mode == 0x20) && (dest_dat != compare)) ||
((compare_mode == 0x28) && (dest_dat == compare)) ||
((compare_mode == 0x30) && (dest_dat <= compare)) ||
((compare_mode == 0x38) && (dest_dat > compare))) {
old_dest_dat = dest_dat;
MIX(mix_dat & mix_mask, dest_dat, src_dat);
dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat);
}
}
@@ -4038,10 +4023,8 @@ ibm8514_vblank_start(void *priv)
static void *
ibm8514_init(const device_t *info)
{
FILE *fp;
uint8_t *rom_load = NULL;
uint32_t bios_addr = 0;
uint16_t bios_rom_eeprom = 0x0000;
uint32_t bios_addr;
if (svga_get_pri() == NULL)
return NULL;
@@ -4067,37 +4050,34 @@ ibm8514_init(const device_t *info)
dev->bpp = 0;
dev->extensions = device_get_config_int("extensions");
bios_addr = device_get_config_hex20("bios_addr");
dev->bios_addr = device_get_config_hex20("bios_addr");
if (dev->type & DEVICE_MCA)
bios_addr = 0xc6800;
dev->bios_addr = 0xc6800;
switch (dev->extensions) {
case ATI:
if (rom_present(BIOS_MACH8_ROM_PATH)) {
mach_t * mach = (mach_t *) calloc(1, sizeof(mach_t));
svga->ext8514 = mach;
fp = rom_fopen(BIOS_MACH8_ROM_PATH, "rb");
if (bios_addr & 0x800)
(void) fseek(fp, 0x000, SEEK_SET);
else
(void) fseek(fp, 0x800, SEEK_SET);
bios_addr = dev->bios_addr;
rom_load = malloc(0x2000);
(void) !fread(rom_load, 0x2000, 1, fp);
(void) fclose(fp);
memset(&dev->bios_rom, 0x00, sizeof(rom_t));
dev->bios_rom.rom = malloc(0x2000);
memset(dev->bios_rom.rom, 0xff, 0x2000);
dev->bios_rom.rom = rom_load;
(void) rom_load_linear(BIOS_MACH8_ROM_PATH, bios_addr, 0x2000, 0x0000, dev->bios_rom.rom + (bios_addr & 0x0800));
dev->bios_rom.sz = 0x2000;
dev->bios_rom.mask = 0x1fff;
mem_mapping_add(&dev->bios_rom.mapping, bios_addr, 0x2000,
ati8514_rom_readb, ati8514_rom_readw, NULL,
mem_mapping_add(&dev->bios_rom.mapping, bios_addr, dev->bios_rom.sz,
ati8514_bios_rom_readb, ati8514_bios_rom_readw, ati8514_bios_rom_readl,
NULL, NULL, NULL,
dev->bios_rom.rom, MEM_MAPPING_EXTERNAL | MEM_MAPPING_ROM_WS, dev);
ati8514_init(svga, svga->ext8514, svga->dev8514);
if (dev->type & DEVICE_MCA) {
dev->accel.scratch0 = (((bios_addr >> 7) - 0x1000) >> 4);
dev->accel.scratch0 |= ((dev->accel.scratch0 + 0x01) << 8);
bios_rom_eeprom = dev->accel.scratch0;
mach->accel.scratch0 = (((dev->bios_addr >> 7) - 0x1000) >> 4);
mach->accel.scratch0 |= ((mach->accel.scratch0 + 0x01) << 8);
bios_rom_eeprom = mach->accel.scratch0;
dev->pos_regs[0] = 0x88;
dev->pos_regs[1] = 0x80;
mach->eeprom.data[1] = bios_rom_eeprom;
@@ -4105,8 +4085,9 @@ ibm8514_init(const device_t *info)
ati_eeprom_load_mach8(&mach->eeprom, "ati8514_mca.nvr", 1);
mem_mapping_disable(&dev->bios_rom.mapping);
} else {
dev->accel.scratch0 = ((bios_addr >> 7) - 0x1000) >> 4;
dev->accel.scratch0 |= ((dev->accel.scratch0 + 0x01) << 8);
mach->accel.scratch0 = ((dev->bios_addr >> 7) - 0x1000) >> 4;
mach->accel.scratch0 |= ((mach->accel.scratch0 + 0x01) << 8);
ibm8514_log("Scratch0 init val=%04x, bios=%06x, base=%06x.\n", mach->accel.scratch0, dev->bios_addr, dev->bios_rom.mapping.base);
ati_eeprom_load_mach8(&mach->eeprom, "ati8514.nvr", 0);
}
break;

File diff suppressed because it is too large Load Diff

View File

@@ -814,6 +814,7 @@ svga_recalctimings(svga_t *svga)
svga->render = svga_render_2bpp_highres;
} else {
svga->map8 = svga->pallook;
svga_log("Map8.\n");
if (svga->lowres) { /*Low res (320)*/
svga->render = svga_render_8bpp_lowres;
svga_log("8 bpp low res.\n");