mirror of
https://github.com/86Box/86Box.git
synced 2026-02-22 01:25:33 -07:00
Merge remote-tracking branch 'origin/master' into feature/recompiler_improvements
This commit is contained in:
@@ -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) */
|
||||
}
|
||||
@@ -248,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
|
||||
@@ -266,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);
|
||||
@@ -331,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;
|
||||
@@ -401,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;
|
||||
@@ -470,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;
|
||||
}
|
||||
|
||||
@@ -490,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;
|
||||
}
|
||||
|
||||
@@ -584,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);
|
||||
}
|
||||
|
||||
@@ -621,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);
|
||||
|
||||
14
src/config.c
14
src/config.c
@@ -910,10 +910,10 @@ load_network(void)
|
||||
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)
|
||||
nc->switch_group = NET_SWITCH_GRP_MIN;
|
||||
sprintf(temp, "net_%02i_secret", c + 1);
|
||||
p = ini_section_get_string(cat, temp, NULL);
|
||||
strncpy(nc->secret, p ? p : "", sizeof(nc->secret) - 1);
|
||||
nc->secret[sizeof(net_cards_conf[c].secret) - 1] = '\0';
|
||||
|
||||
sprintf(temp, "net_%02i_promisc", c + 1);
|
||||
nc->promisc_mode = ini_section_get_int(cat, temp, 0);
|
||||
@@ -3019,11 +3019,11 @@ save_network(void)
|
||||
ini_section_delete_var(cat, temp);
|
||||
}
|
||||
|
||||
sprintf(temp, "net_%02i_switch_group", c + 1);
|
||||
if (nc->switch_group == NET_SWITCH_GRP_MIN)
|
||||
sprintf(temp, "net_%02i_secret", c + 1);
|
||||
if (nc->secret[0] == '\0')
|
||||
ini_section_delete_var(cat, temp);
|
||||
else
|
||||
ini_section_set_int(cat, temp, nc->switch_group);
|
||||
ini_section_set_string(cat, temp, net_cards_conf[c].secret);
|
||||
|
||||
sprintf(temp, "net_%02i_promisc", c + 1);
|
||||
if (nc->promisc_mode == 0)
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
13
src/dma.c
13
src/dma.c
@@ -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;
|
||||
|
||||
122
src/floppy/fdc.c
122
src/floppy/fdc.c
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 *);
|
||||
@@ -1511,6 +1512,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;
|
||||
|
||||
@@ -60,8 +60,6 @@
|
||||
#define NET_QUEUE_COUNT 4
|
||||
#define NET_CARD_MAX 4
|
||||
#define NET_HOST_INTF_MAX 64
|
||||
#define NET_SWITCH_GRP_MIN 1
|
||||
#define NET_SWITCH_GRP_MAX 10
|
||||
|
||||
#define NET_PERIOD_10M 0.8
|
||||
#define NET_PERIOD_100M 0.08
|
||||
@@ -97,7 +95,7 @@ typedef struct netcard_conf_t {
|
||||
int net_type;
|
||||
char host_dev_name[128];
|
||||
uint32_t link_state;
|
||||
uint8_t switch_group;
|
||||
char secret[256];
|
||||
uint8_t promisc_mode;
|
||||
char slirp_net[16];
|
||||
char nrs_hostname[128];
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -245,6 +245,7 @@ extern const device_t soundman_device;
|
||||
/* Tandy PSSJ */
|
||||
extern const device_t pssj_device;
|
||||
extern const device_t pssj_isa_device;
|
||||
extern const device_t pssj_1e0_device;
|
||||
|
||||
/* Tandy PSG */
|
||||
extern const device_t tndy_device;
|
||||
|
||||
@@ -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);
|
||||
|
||||
481
src/include/shathree.h
Normal file
481
src/include/shathree.h
Normal file
@@ -0,0 +1,481 @@
|
||||
/*
|
||||
** This code is from SQLite
|
||||
** (https://sqlite.org/src/info/2025-02-27T21:17:55z), at file path
|
||||
** ext/misc/shathree.c. The SQLite functions have been removed, but
|
||||
** it is the same code written by D. Richard Hipp.
|
||||
*/
|
||||
|
||||
#ifndef SHATHREE_H
|
||||
|
||||
/*
|
||||
** 2017-03-08
|
||||
**
|
||||
** The author disclaims copyright to this source code. In place of
|
||||
** a legal notice, here is a blessing:
|
||||
**
|
||||
** May you do good and not evil.
|
||||
** May you find forgiveness for yourself and forgive others.
|
||||
** May you share freely, never taking more than you give.
|
||||
**
|
||||
*/
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
/******************************************************************************
|
||||
** The Hash Engine
|
||||
*/
|
||||
/*
|
||||
** Macros to determine whether the machine is big or little endian,
|
||||
** and whether or not that determination is run-time or compile-time.
|
||||
**
|
||||
** For best performance, an attempt is made to guess at the byte-order
|
||||
** using C-preprocessor macros. If that is unsuccessful, or if
|
||||
** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
|
||||
** at run-time.
|
||||
*/
|
||||
#ifndef SHA3_BYTEORDER
|
||||
# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \
|
||||
defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \
|
||||
defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \
|
||||
defined(__arm__)
|
||||
# define SHA3_BYTEORDER 1234
|
||||
# elif defined(sparc) || defined(__ppc__)
|
||||
# define SHA3_BYTEORDER 4321
|
||||
# else
|
||||
# define SHA3_BYTEORDER 0
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#define u64 uint64_t
|
||||
|
||||
|
||||
/*
|
||||
** State structure for a SHA3 hash in progress
|
||||
*/
|
||||
typedef struct SHA3Context SHA3Context;
|
||||
struct SHA3Context {
|
||||
union {
|
||||
u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */
|
||||
unsigned char x[1600]; /* ... or 1600 bytes */
|
||||
} u;
|
||||
unsigned nRate; /* Bytes of input accepted per Keccak iteration */
|
||||
unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */
|
||||
unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */
|
||||
unsigned iSize; /* 224, 256, 358, or 512 */
|
||||
};
|
||||
|
||||
/*
|
||||
** A single step of the Keccak mixing function for a 1600-bit state
|
||||
*/
|
||||
static void KeccakF1600Step(SHA3Context *p){
|
||||
int i;
|
||||
u64 b0, b1, b2, b3, b4;
|
||||
u64 c0, c1, c2, c3, c4;
|
||||
u64 d0, d1, d2, d3, d4;
|
||||
static const u64 RC[] = {
|
||||
0x0000000000000001ULL, 0x0000000000008082ULL,
|
||||
0x800000000000808aULL, 0x8000000080008000ULL,
|
||||
0x000000000000808bULL, 0x0000000080000001ULL,
|
||||
0x8000000080008081ULL, 0x8000000000008009ULL,
|
||||
0x000000000000008aULL, 0x0000000000000088ULL,
|
||||
0x0000000080008009ULL, 0x000000008000000aULL,
|
||||
0x000000008000808bULL, 0x800000000000008bULL,
|
||||
0x8000000000008089ULL, 0x8000000000008003ULL,
|
||||
0x8000000000008002ULL, 0x8000000000000080ULL,
|
||||
0x000000000000800aULL, 0x800000008000000aULL,
|
||||
0x8000000080008081ULL, 0x8000000000008080ULL,
|
||||
0x0000000080000001ULL, 0x8000000080008008ULL
|
||||
};
|
||||
# define a00 (p->u.s[0])
|
||||
# define a01 (p->u.s[1])
|
||||
# define a02 (p->u.s[2])
|
||||
# define a03 (p->u.s[3])
|
||||
# define a04 (p->u.s[4])
|
||||
# define a10 (p->u.s[5])
|
||||
# define a11 (p->u.s[6])
|
||||
# define a12 (p->u.s[7])
|
||||
# define a13 (p->u.s[8])
|
||||
# define a14 (p->u.s[9])
|
||||
# define a20 (p->u.s[10])
|
||||
# define a21 (p->u.s[11])
|
||||
# define a22 (p->u.s[12])
|
||||
# define a23 (p->u.s[13])
|
||||
# define a24 (p->u.s[14])
|
||||
# define a30 (p->u.s[15])
|
||||
# define a31 (p->u.s[16])
|
||||
# define a32 (p->u.s[17])
|
||||
# define a33 (p->u.s[18])
|
||||
# define a34 (p->u.s[19])
|
||||
# define a40 (p->u.s[20])
|
||||
# define a41 (p->u.s[21])
|
||||
# define a42 (p->u.s[22])
|
||||
# define a43 (p->u.s[23])
|
||||
# define a44 (p->u.s[24])
|
||||
# define ROL64(a,x) ((a<<x)|(a>>(64-x)))
|
||||
|
||||
for(i=0; i<24; i+=4){
|
||||
c0 = a00^a10^a20^a30^a40;
|
||||
c1 = a01^a11^a21^a31^a41;
|
||||
c2 = a02^a12^a22^a32^a42;
|
||||
c3 = a03^a13^a23^a33^a43;
|
||||
c4 = a04^a14^a24^a34^a44;
|
||||
d0 = c4^ROL64(c1, 1);
|
||||
d1 = c0^ROL64(c2, 1);
|
||||
d2 = c1^ROL64(c3, 1);
|
||||
d3 = c2^ROL64(c4, 1);
|
||||
d4 = c3^ROL64(c0, 1);
|
||||
|
||||
b0 = (a00^d0);
|
||||
b1 = ROL64((a11^d1), 44);
|
||||
b2 = ROL64((a22^d2), 43);
|
||||
b3 = ROL64((a33^d3), 21);
|
||||
b4 = ROL64((a44^d4), 14);
|
||||
a00 = b0 ^((~b1)& b2 );
|
||||
a00 ^= RC[i];
|
||||
a11 = b1 ^((~b2)& b3 );
|
||||
a22 = b2 ^((~b3)& b4 );
|
||||
a33 = b3 ^((~b4)& b0 );
|
||||
a44 = b4 ^((~b0)& b1 );
|
||||
|
||||
b2 = ROL64((a20^d0), 3);
|
||||
b3 = ROL64((a31^d1), 45);
|
||||
b4 = ROL64((a42^d2), 61);
|
||||
b0 = ROL64((a03^d3), 28);
|
||||
b1 = ROL64((a14^d4), 20);
|
||||
a20 = b0 ^((~b1)& b2 );
|
||||
a31 = b1 ^((~b2)& b3 );
|
||||
a42 = b2 ^((~b3)& b4 );
|
||||
a03 = b3 ^((~b4)& b0 );
|
||||
a14 = b4 ^((~b0)& b1 );
|
||||
|
||||
b4 = ROL64((a40^d0), 18);
|
||||
b0 = ROL64((a01^d1), 1);
|
||||
b1 = ROL64((a12^d2), 6);
|
||||
b2 = ROL64((a23^d3), 25);
|
||||
b3 = ROL64((a34^d4), 8);
|
||||
a40 = b0 ^((~b1)& b2 );
|
||||
a01 = b1 ^((~b2)& b3 );
|
||||
a12 = b2 ^((~b3)& b4 );
|
||||
a23 = b3 ^((~b4)& b0 );
|
||||
a34 = b4 ^((~b0)& b1 );
|
||||
|
||||
b1 = ROL64((a10^d0), 36);
|
||||
b2 = ROL64((a21^d1), 10);
|
||||
b3 = ROL64((a32^d2), 15);
|
||||
b4 = ROL64((a43^d3), 56);
|
||||
b0 = ROL64((a04^d4), 27);
|
||||
a10 = b0 ^((~b1)& b2 );
|
||||
a21 = b1 ^((~b2)& b3 );
|
||||
a32 = b2 ^((~b3)& b4 );
|
||||
a43 = b3 ^((~b4)& b0 );
|
||||
a04 = b4 ^((~b0)& b1 );
|
||||
|
||||
b3 = ROL64((a30^d0), 41);
|
||||
b4 = ROL64((a41^d1), 2);
|
||||
b0 = ROL64((a02^d2), 62);
|
||||
b1 = ROL64((a13^d3), 55);
|
||||
b2 = ROL64((a24^d4), 39);
|
||||
a30 = b0 ^((~b1)& b2 );
|
||||
a41 = b1 ^((~b2)& b3 );
|
||||
a02 = b2 ^((~b3)& b4 );
|
||||
a13 = b3 ^((~b4)& b0 );
|
||||
a24 = b4 ^((~b0)& b1 );
|
||||
|
||||
c0 = a00^a20^a40^a10^a30;
|
||||
c1 = a11^a31^a01^a21^a41;
|
||||
c2 = a22^a42^a12^a32^a02;
|
||||
c3 = a33^a03^a23^a43^a13;
|
||||
c4 = a44^a14^a34^a04^a24;
|
||||
d0 = c4^ROL64(c1, 1);
|
||||
d1 = c0^ROL64(c2, 1);
|
||||
d2 = c1^ROL64(c3, 1);
|
||||
d3 = c2^ROL64(c4, 1);
|
||||
d4 = c3^ROL64(c0, 1);
|
||||
|
||||
b0 = (a00^d0);
|
||||
b1 = ROL64((a31^d1), 44);
|
||||
b2 = ROL64((a12^d2), 43);
|
||||
b3 = ROL64((a43^d3), 21);
|
||||
b4 = ROL64((a24^d4), 14);
|
||||
a00 = b0 ^((~b1)& b2 );
|
||||
a00 ^= RC[i+1];
|
||||
a31 = b1 ^((~b2)& b3 );
|
||||
a12 = b2 ^((~b3)& b4 );
|
||||
a43 = b3 ^((~b4)& b0 );
|
||||
a24 = b4 ^((~b0)& b1 );
|
||||
|
||||
b2 = ROL64((a40^d0), 3);
|
||||
b3 = ROL64((a21^d1), 45);
|
||||
b4 = ROL64((a02^d2), 61);
|
||||
b0 = ROL64((a33^d3), 28);
|
||||
b1 = ROL64((a14^d4), 20);
|
||||
a40 = b0 ^((~b1)& b2 );
|
||||
a21 = b1 ^((~b2)& b3 );
|
||||
a02 = b2 ^((~b3)& b4 );
|
||||
a33 = b3 ^((~b4)& b0 );
|
||||
a14 = b4 ^((~b0)& b1 );
|
||||
|
||||
b4 = ROL64((a30^d0), 18);
|
||||
b0 = ROL64((a11^d1), 1);
|
||||
b1 = ROL64((a42^d2), 6);
|
||||
b2 = ROL64((a23^d3), 25);
|
||||
b3 = ROL64((a04^d4), 8);
|
||||
a30 = b0 ^((~b1)& b2 );
|
||||
a11 = b1 ^((~b2)& b3 );
|
||||
a42 = b2 ^((~b3)& b4 );
|
||||
a23 = b3 ^((~b4)& b0 );
|
||||
a04 = b4 ^((~b0)& b1 );
|
||||
|
||||
b1 = ROL64((a20^d0), 36);
|
||||
b2 = ROL64((a01^d1), 10);
|
||||
b3 = ROL64((a32^d2), 15);
|
||||
b4 = ROL64((a13^d3), 56);
|
||||
b0 = ROL64((a44^d4), 27);
|
||||
a20 = b0 ^((~b1)& b2 );
|
||||
a01 = b1 ^((~b2)& b3 );
|
||||
a32 = b2 ^((~b3)& b4 );
|
||||
a13 = b3 ^((~b4)& b0 );
|
||||
a44 = b4 ^((~b0)& b1 );
|
||||
|
||||
b3 = ROL64((a10^d0), 41);
|
||||
b4 = ROL64((a41^d1), 2);
|
||||
b0 = ROL64((a22^d2), 62);
|
||||
b1 = ROL64((a03^d3), 55);
|
||||
b2 = ROL64((a34^d4), 39);
|
||||
a10 = b0 ^((~b1)& b2 );
|
||||
a41 = b1 ^((~b2)& b3 );
|
||||
a22 = b2 ^((~b3)& b4 );
|
||||
a03 = b3 ^((~b4)& b0 );
|
||||
a34 = b4 ^((~b0)& b1 );
|
||||
|
||||
c0 = a00^a40^a30^a20^a10;
|
||||
c1 = a31^a21^a11^a01^a41;
|
||||
c2 = a12^a02^a42^a32^a22;
|
||||
c3 = a43^a33^a23^a13^a03;
|
||||
c4 = a24^a14^a04^a44^a34;
|
||||
d0 = c4^ROL64(c1, 1);
|
||||
d1 = c0^ROL64(c2, 1);
|
||||
d2 = c1^ROL64(c3, 1);
|
||||
d3 = c2^ROL64(c4, 1);
|
||||
d4 = c3^ROL64(c0, 1);
|
||||
|
||||
b0 = (a00^d0);
|
||||
b1 = ROL64((a21^d1), 44);
|
||||
b2 = ROL64((a42^d2), 43);
|
||||
b3 = ROL64((a13^d3), 21);
|
||||
b4 = ROL64((a34^d4), 14);
|
||||
a00 = b0 ^((~b1)& b2 );
|
||||
a00 ^= RC[i+2];
|
||||
a21 = b1 ^((~b2)& b3 );
|
||||
a42 = b2 ^((~b3)& b4 );
|
||||
a13 = b3 ^((~b4)& b0 );
|
||||
a34 = b4 ^((~b0)& b1 );
|
||||
|
||||
b2 = ROL64((a30^d0), 3);
|
||||
b3 = ROL64((a01^d1), 45);
|
||||
b4 = ROL64((a22^d2), 61);
|
||||
b0 = ROL64((a43^d3), 28);
|
||||
b1 = ROL64((a14^d4), 20);
|
||||
a30 = b0 ^((~b1)& b2 );
|
||||
a01 = b1 ^((~b2)& b3 );
|
||||
a22 = b2 ^((~b3)& b4 );
|
||||
a43 = b3 ^((~b4)& b0 );
|
||||
a14 = b4 ^((~b0)& b1 );
|
||||
|
||||
b4 = ROL64((a10^d0), 18);
|
||||
b0 = ROL64((a31^d1), 1);
|
||||
b1 = ROL64((a02^d2), 6);
|
||||
b2 = ROL64((a23^d3), 25);
|
||||
b3 = ROL64((a44^d4), 8);
|
||||
a10 = b0 ^((~b1)& b2 );
|
||||
a31 = b1 ^((~b2)& b3 );
|
||||
a02 = b2 ^((~b3)& b4 );
|
||||
a23 = b3 ^((~b4)& b0 );
|
||||
a44 = b4 ^((~b0)& b1 );
|
||||
|
||||
b1 = ROL64((a40^d0), 36);
|
||||
b2 = ROL64((a11^d1), 10);
|
||||
b3 = ROL64((a32^d2), 15);
|
||||
b4 = ROL64((a03^d3), 56);
|
||||
b0 = ROL64((a24^d4), 27);
|
||||
a40 = b0 ^((~b1)& b2 );
|
||||
a11 = b1 ^((~b2)& b3 );
|
||||
a32 = b2 ^((~b3)& b4 );
|
||||
a03 = b3 ^((~b4)& b0 );
|
||||
a24 = b4 ^((~b0)& b1 );
|
||||
|
||||
b3 = ROL64((a20^d0), 41);
|
||||
b4 = ROL64((a41^d1), 2);
|
||||
b0 = ROL64((a12^d2), 62);
|
||||
b1 = ROL64((a33^d3), 55);
|
||||
b2 = ROL64((a04^d4), 39);
|
||||
a20 = b0 ^((~b1)& b2 );
|
||||
a41 = b1 ^((~b2)& b3 );
|
||||
a12 = b2 ^((~b3)& b4 );
|
||||
a33 = b3 ^((~b4)& b0 );
|
||||
a04 = b4 ^((~b0)& b1 );
|
||||
|
||||
c0 = a00^a30^a10^a40^a20;
|
||||
c1 = a21^a01^a31^a11^a41;
|
||||
c2 = a42^a22^a02^a32^a12;
|
||||
c3 = a13^a43^a23^a03^a33;
|
||||
c4 = a34^a14^a44^a24^a04;
|
||||
d0 = c4^ROL64(c1, 1);
|
||||
d1 = c0^ROL64(c2, 1);
|
||||
d2 = c1^ROL64(c3, 1);
|
||||
d3 = c2^ROL64(c4, 1);
|
||||
d4 = c3^ROL64(c0, 1);
|
||||
|
||||
b0 = (a00^d0);
|
||||
b1 = ROL64((a01^d1), 44);
|
||||
b2 = ROL64((a02^d2), 43);
|
||||
b3 = ROL64((a03^d3), 21);
|
||||
b4 = ROL64((a04^d4), 14);
|
||||
a00 = b0 ^((~b1)& b2 );
|
||||
a00 ^= RC[i+3];
|
||||
a01 = b1 ^((~b2)& b3 );
|
||||
a02 = b2 ^((~b3)& b4 );
|
||||
a03 = b3 ^((~b4)& b0 );
|
||||
a04 = b4 ^((~b0)& b1 );
|
||||
|
||||
b2 = ROL64((a10^d0), 3);
|
||||
b3 = ROL64((a11^d1), 45);
|
||||
b4 = ROL64((a12^d2), 61);
|
||||
b0 = ROL64((a13^d3), 28);
|
||||
b1 = ROL64((a14^d4), 20);
|
||||
a10 = b0 ^((~b1)& b2 );
|
||||
a11 = b1 ^((~b2)& b3 );
|
||||
a12 = b2 ^((~b3)& b4 );
|
||||
a13 = b3 ^((~b4)& b0 );
|
||||
a14 = b4 ^((~b0)& b1 );
|
||||
|
||||
b4 = ROL64((a20^d0), 18);
|
||||
b0 = ROL64((a21^d1), 1);
|
||||
b1 = ROL64((a22^d2), 6);
|
||||
b2 = ROL64((a23^d3), 25);
|
||||
b3 = ROL64((a24^d4), 8);
|
||||
a20 = b0 ^((~b1)& b2 );
|
||||
a21 = b1 ^((~b2)& b3 );
|
||||
a22 = b2 ^((~b3)& b4 );
|
||||
a23 = b3 ^((~b4)& b0 );
|
||||
a24 = b4 ^((~b0)& b1 );
|
||||
|
||||
b1 = ROL64((a30^d0), 36);
|
||||
b2 = ROL64((a31^d1), 10);
|
||||
b3 = ROL64((a32^d2), 15);
|
||||
b4 = ROL64((a33^d3), 56);
|
||||
b0 = ROL64((a34^d4), 27);
|
||||
a30 = b0 ^((~b1)& b2 );
|
||||
a31 = b1 ^((~b2)& b3 );
|
||||
a32 = b2 ^((~b3)& b4 );
|
||||
a33 = b3 ^((~b4)& b0 );
|
||||
a34 = b4 ^((~b0)& b1 );
|
||||
|
||||
b3 = ROL64((a40^d0), 41);
|
||||
b4 = ROL64((a41^d1), 2);
|
||||
b0 = ROL64((a42^d2), 62);
|
||||
b1 = ROL64((a43^d3), 55);
|
||||
b2 = ROL64((a44^d4), 39);
|
||||
a40 = b0 ^((~b1)& b2 );
|
||||
a41 = b1 ^((~b2)& b3 );
|
||||
a42 = b2 ^((~b3)& b4 );
|
||||
a43 = b3 ^((~b4)& b0 );
|
||||
a44 = b4 ^((~b0)& b1 );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Initialize a new hash. iSize determines the size of the hash
|
||||
** in bits and should be one of 224, 256, 384, or 512. Or iSize
|
||||
** can be zero to use the default hash size of 256 bits.
|
||||
*/
|
||||
static void SHA3Init(SHA3Context *p, int iSize){
|
||||
memset(p, 0, sizeof(*p));
|
||||
p->iSize = iSize;
|
||||
if( iSize>=128 && iSize<=512 ){
|
||||
p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
|
||||
}else{
|
||||
p->nRate = (1600 - 2*256)/8;
|
||||
}
|
||||
#if SHA3_BYTEORDER==1234
|
||||
/* Known to be little-endian at compile-time. No-op */
|
||||
#elif SHA3_BYTEORDER==4321
|
||||
p->ixMask = 7; /* Big-endian */
|
||||
#else
|
||||
{
|
||||
static unsigned int one = 1;
|
||||
if( 1==*(unsigned char*)&one ){
|
||||
/* Little endian. No byte swapping. */
|
||||
p->ixMask = 0;
|
||||
}else{
|
||||
/* Big endian. Byte swap. */
|
||||
p->ixMask = 7;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
** Make consecutive calls to the SHA3Update function to add new content
|
||||
** to the hash
|
||||
*/
|
||||
static void SHA3Update(
|
||||
SHA3Context *p,
|
||||
const unsigned char *aData,
|
||||
unsigned int nData
|
||||
){
|
||||
unsigned int i = 0;
|
||||
if( aData==0 ) return;
|
||||
#if SHA3_BYTEORDER==1234
|
||||
if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
|
||||
for(; i+7<nData; i+=8){
|
||||
p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
|
||||
p->nLoaded += 8;
|
||||
if( p->nLoaded>=p->nRate ){
|
||||
KeccakF1600Step(p);
|
||||
p->nLoaded = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
for(; i<nData; i++){
|
||||
#if SHA3_BYTEORDER==1234
|
||||
p->u.x[p->nLoaded] ^= aData[i];
|
||||
#elif SHA3_BYTEORDER==4321
|
||||
p->u.x[p->nLoaded^0x07] ^= aData[i];
|
||||
#else
|
||||
p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
|
||||
#endif
|
||||
p->nLoaded++;
|
||||
if( p->nLoaded==p->nRate ){
|
||||
KeccakF1600Step(p);
|
||||
p->nLoaded = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** After all content has been added, invoke SHA3Final() to compute
|
||||
** the final hash. The function returns a pointer to the binary
|
||||
** hash value.
|
||||
*/
|
||||
static unsigned char *SHA3Final(SHA3Context *p){
|
||||
unsigned int i;
|
||||
if( p->nLoaded==p->nRate-1 ){
|
||||
const unsigned char c1 = 0x86;
|
||||
SHA3Update(p, &c1, 1);
|
||||
}else{
|
||||
const unsigned char c2 = 0x06;
|
||||
const unsigned char c3 = 0x80;
|
||||
SHA3Update(p, &c2, 1);
|
||||
p->nLoaded = p->nRate - 1;
|
||||
SHA3Update(p, &c3, 1);
|
||||
}
|
||||
for(i=0; i<p->nRate; i++){
|
||||
p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
|
||||
}
|
||||
return &p->u.x[p->nRate];
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
2132
src/machine/m_xt_ibm5550.c
Normal file
2132
src/machine/m_xt_ibm5550.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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",
|
||||
|
||||
@@ -49,10 +49,11 @@
|
||||
#include <86box/config.h>
|
||||
#include <86box/net_event.h>
|
||||
#include <86box/bswap.h>
|
||||
#include <shathree.h>
|
||||
|
||||
#define SWITCH_PKT_BATCH NET_QUEUE_LEN
|
||||
|
||||
#define SWITCH_MULTICAST_GROUP 0xefff5656 /* 239.255.86.86 */
|
||||
#define SWITCH_MULTICAST_GROUP 0xefff5056 /* 239.255.80.86 */
|
||||
#define SWITCH_MULTICAST_PORT 8086
|
||||
|
||||
enum {
|
||||
@@ -80,6 +81,8 @@ typedef struct net_switch_t {
|
||||
net_switch_hostaddr_t *hostaddrs;
|
||||
uint16_t port_out;
|
||||
|
||||
uint8_t secret_enabled;
|
||||
uint8_t secret_hash[32];
|
||||
uint8_t promisc;
|
||||
union {
|
||||
uint8_t mac_addr[6];
|
||||
@@ -123,6 +126,15 @@ net_switch_in_available(void *priv)
|
||||
net_event_set(&netswitch->tx_event);
|
||||
}
|
||||
|
||||
static void
|
||||
net_switch_secret_hash(const char *secret, uint8_t *hash)
|
||||
{
|
||||
SHA3Context cx;
|
||||
SHA3Init(&cx, 256);
|
||||
SHA3Update(&cx, (const uint8_t *)secret, strlen(secret));
|
||||
memcpy(hash, SHA3Final(&cx), 32);
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
net_switch_add_hostaddr(net_switch_t *netswitch, net_switch_sockaddr_t *addr, net_switch_sockaddr_t *broadcast, net_switch_sockaddr_t *netmask, unsigned int flags)
|
||||
{
|
||||
@@ -186,10 +198,12 @@ net_switch_add_hostaddr(net_switch_t *netswitch, net_switch_sockaddr_t *addr, ne
|
||||
}
|
||||
|
||||
/* Join IPv4 multicast group. */
|
||||
struct ip_mreq mreq = {
|
||||
.imr_multiaddr = { .s_addr = htonl(SWITCH_MULTICAST_GROUP) },
|
||||
.imr_interface = { .s_addr = hostaddr->addr.sin.sin_addr.s_addr }
|
||||
};
|
||||
struct ip_mreq mreq = { .imr_interface = { .s_addr = hostaddr->addr.sin.sin_addr.s_addr } };
|
||||
if (netswitch->secret_enabled)
|
||||
mreq.imr_multiaddr.s_addr = htonl(SWITCH_MULTICAST_GROUP);
|
||||
else
|
||||
mreq.imr_multiaddr.s_addr = htonl(SWITCH_MULTICAST_GROUP + 0x600); // 239.255.86.86
|
||||
|
||||
if (setsockopt(netswitch->socket_rx, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq, sizeof(mreq)) < 0) {
|
||||
netswitch_log("Network Switch: could not join multicast group on interface %s\n", buf);
|
||||
goto broadcast;
|
||||
@@ -374,16 +388,35 @@ net_switch_thread(void *priv)
|
||||
packets = network_tx_popv(netswitch->card, netswitch->pkt_tx_v, SWITCH_PKT_BATCH);
|
||||
if (!(net_cards_conf[netswitch->card->card_num].link_state & NET_LINK_DOWN)) {
|
||||
for (int i = 0; i < packets; i++) {
|
||||
int orig_len = netswitch->pkt_tx_v[i].len;
|
||||
int send_len = orig_len;
|
||||
uint8_t augmented[sizeof(netswitch->secret_hash) + NET_MAX_FRAME];
|
||||
if (netswitch->secret_enabled) {
|
||||
send_len = orig_len + sizeof(netswitch->secret_hash);
|
||||
|
||||
/* Build header with secret hash */
|
||||
uint8_t *hdr = augmented;
|
||||
memcpy(hdr, netswitch->secret_hash, sizeof(netswitch->secret_hash));
|
||||
memcpy(augmented + sizeof(netswitch->secret_hash),
|
||||
netswitch->pkt_tx_v[i].data, orig_len);
|
||||
}
|
||||
|
||||
#define MAC_FORMAT "(%02X:%02X:%02X:%02X:%02X:%02X -> %02X:%02X:%02X:%02X:%02X:%02X)"
|
||||
#define MAC_FORMAT_ARGS(p) (p)[6], (p)[7], (p)[8], (p)[9], (p)[10], (p)[11], (p)[0], (p)[1], (p)[2], (p)[3], (p)[4], (p)[5]
|
||||
#define MAC_FORMAT_NOSECRET_ARGS(p) (p)[6], (p)[7], (p)[8], (p)[9], (p)[10], (p)[11], (p)[0], (p)[1], (p)[2], (p)[3], (p)[4], (p)[5]
|
||||
#define MAC_FORMAT_ARGS(p) (p)[38], (p)[39], (p)[40], (p)[41], (p)[42], (p)[43], (p)[32], (p)[33], (p)[34], (p)[35], (p)[36], (p)[37]
|
||||
netswitch_log("Network Switch: sending %d-byte packet " MAC_FORMAT "\n",
|
||||
netswitch->pkt_tx_v[i].len, MAC_FORMAT_ARGS(netswitch->pkt_tx_v[i].data));
|
||||
netswitch->pkt_tx_v[i].len,
|
||||
netswitch->secret_enabled ? MAC_FORMAT_ARGS(netswitch->pkt_tx_v[i].data)
|
||||
: MAC_FORMAT_NOSECRET_ARGS(netswitch->pkt_tx_v[i].data));
|
||||
|
||||
/* Send through all known host interfaces. */
|
||||
for (net_switch_hostaddr_t *hostaddr = netswitch->hostaddrs; hostaddr; hostaddr = hostaddr->next)
|
||||
sendto(hostaddr->socket_tx,
|
||||
(char *) netswitch->pkt_tx_v[i].data, netswitch->pkt_tx_v[i].len, 0,
|
||||
&hostaddr->addr_tx.sa, sizeof(hostaddr->addr_tx.sa));
|
||||
if (netswitch->secret_enabled)
|
||||
sendto(hostaddr->socket_tx, (char *)augmented, send_len, 0,
|
||||
&hostaddr->addr_tx.sa, sizeof(hostaddr->addr_tx.sa));
|
||||
else
|
||||
sendto(hostaddr->socket_tx, (char *)netswitch->pkt_tx_v[i].data,
|
||||
send_len, 0, &hostaddr->addr_tx.sa, sizeof(hostaddr->addr_tx.sa));
|
||||
}
|
||||
}
|
||||
netswitch->during_tx = 0;
|
||||
@@ -406,10 +439,32 @@ net_switch_thread(void *priv)
|
||||
}
|
||||
if (pfd[NET_EVENT_RX].revents & POLLIN) {
|
||||
#endif
|
||||
len = recv(netswitch->socket_rx, (char *) netswitch->pkt.data, NET_MAX_FRAME, 0);
|
||||
if (len < 12) {
|
||||
netswitch_log("Network Switch: recv error (%d)\n", len);
|
||||
} else if ((AS_U64(netswitch->pkt.data[6]) & le64_to_cpu(0xffffffffffffULL)) == netswitch->mac_addr_u64) {
|
||||
if (netswitch->secret_enabled) {
|
||||
len = recv(netswitch->socket_rx, (char *) netswitch->pkt.data, NET_MAX_FRAME + sizeof(netswitch->secret_hash), 0);
|
||||
if (len < sizeof(netswitch->secret_hash) + 12) {
|
||||
netswitch_log("Network Switch: recv error (%d)\n", len);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (memcmp(netswitch->pkt.data, netswitch->secret_hash, sizeof(netswitch->secret_hash)) != 0) {
|
||||
/* This packet contains a different secret hash, ignore it. */
|
||||
continue;
|
||||
} else {
|
||||
memmove(netswitch->pkt.data,
|
||||
netswitch->pkt.data + sizeof(netswitch->secret_hash),
|
||||
len - sizeof(netswitch->secret_hash));
|
||||
len = len - sizeof(netswitch->secret_hash);
|
||||
netswitch->pkt.len = len;
|
||||
}
|
||||
} else {
|
||||
len = recv(netswitch->socket_rx, (char *) netswitch->pkt.data, NET_MAX_FRAME, 0);
|
||||
if (len < 12) {
|
||||
netswitch_log("Network Switch: recv error (%d)\n", len);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if ((AS_U64(netswitch->pkt.data[netswitch->secret_enabled ? 38 : 6]) & le64_to_cpu(0xffffffffffffULL)) == netswitch->mac_addr_u64) {
|
||||
/* A packet we've sent has looped back, drop it. */
|
||||
} else if (!(net_cards_conf[netswitch->card->card_num].link_state & NET_LINK_DOWN) && (netswitch->promisc || /* promiscuous mode? */
|
||||
(netswitch->pkt.data[0] & 1) || /* broadcast packet? */
|
||||
@@ -443,13 +498,20 @@ net_switch_init(const netcard_t *card, const uint8_t *mac_addr, void *priv, char
|
||||
{
|
||||
netcard_conf_t *netcard = (netcard_conf_t *) priv;
|
||||
|
||||
netswitch_log("Network Switch: initializing with group %d...\n", netcard->switch_group);
|
||||
|
||||
net_switch_t *netswitch = calloc(1, sizeof(net_switch_t));
|
||||
memcpy(netswitch->mac_addr, mac_addr, sizeof(netswitch->mac_addr));
|
||||
netswitch->card = (netcard_t *) card;
|
||||
netswitch->promisc = !!netcard->promisc_mode;
|
||||
|
||||
if (netcard->secret[0] != '\0') {
|
||||
uint8_t temp[32];
|
||||
net_switch_secret_hash((const uint8_t *)netcard->secret, (uint8_t *) temp);
|
||||
memcpy(netswitch->secret_hash, temp, 32);
|
||||
netswitch->secret_enabled = 1;
|
||||
} else {
|
||||
netswitch->secret_enabled = 0;
|
||||
}
|
||||
|
||||
/* Initialize receive socket. */
|
||||
netswitch->socket_rx = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (netswitch->socket_rx < 0) {
|
||||
@@ -473,7 +535,7 @@ net_switch_init(const netcard_t *card, const uint8_t *mac_addr, void *priv, char
|
||||
val = 0;
|
||||
setsockopt(netswitch->socket_rx, IPPROTO_IP, IP_MULTICAST_LOOP, (char *) &val, sizeof(val));
|
||||
|
||||
netswitch->port_out = htons(SWITCH_MULTICAST_PORT - NET_SWITCH_GRP_MIN + netcard->switch_group);
|
||||
netswitch->port_out = htons(SWITCH_MULTICAST_PORT);
|
||||
struct sockaddr_in addr = {
|
||||
.sin_family = AF_INET,
|
||||
.sin_addr = { .s_addr = htonl(INADDR_ANY) },
|
||||
|
||||
15
src/pit.c
15
src/pit.c
@@ -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,
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
@@ -1,63 +1,30 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* Implementation of the Generic ESC/P 2 Dot-Matrix printer.
|
||||
* This file is part of the 86Box distribution.
|
||||
*
|
||||
* Authors: Michael Drüing, <michael@drueing.de>
|
||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* Implementation of 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-2019 Michael Drüing.
|
||||
* Copyright 2019 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 <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <wchar.h>
|
||||
#include <math.h>
|
||||
#include <ft2build.h>
|
||||
#include FT_FREETYPE_H
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include <86box/device.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/machine.h>
|
||||
#include <86box/timer.h>
|
||||
#include <86box/mem.h>
|
||||
#include <86box/rom.h>
|
||||
@@ -79,6 +46,11 @@ enum {
|
||||
LANG_ESCP2
|
||||
};
|
||||
|
||||
enum {
|
||||
QUALITY_DRAFT = 0,
|
||||
QUALITY_LQ
|
||||
};
|
||||
|
||||
enum {
|
||||
PAPER_LETTER = 0,
|
||||
PAPER_A4,
|
||||
@@ -88,7 +60,7 @@ enum {
|
||||
|
||||
/* Default page values (for now.) */
|
||||
#define COLOR_BLACK 7 << 5
|
||||
#define PAGE_CPI 10.0 /* standard310 cpi */
|
||||
#define PAGE_CPI 10.0 /* standard 10 cpi */
|
||||
#define PAGE_LPI 6.0 /* standard 6 lpi */
|
||||
|
||||
/* FreeType library handles - global so they can be shared. */
|
||||
@@ -106,19 +78,19 @@ enum {
|
||||
};
|
||||
|
||||
/* Font styles. */
|
||||
#define STYLE_PROP 0x0001
|
||||
#define STYLE_CONDENSED 0x0002
|
||||
#define STYLE_BOLD 0x0004
|
||||
#define STYLE_DOUBLESTRIKE 0x0008
|
||||
#define STYLE_DOUBLEWIDTH 0x0010
|
||||
#define STYLE_ITALICS 0x0020
|
||||
#define STYLE_UNDERLINE 0x0040
|
||||
#define STYLE_SUPERSCRIPT 0x0080
|
||||
#define STYLE_SUBSCRIPT 0x0100
|
||||
#define STYLE_STRIKETHROUGH 0x0200
|
||||
#define STYLE_OVERSCORE 0x0400
|
||||
#define STYLE_DOUBLEWIDTHONELINE 0x0800
|
||||
#define STYLE_DOUBLEHEIGHT 0x1000
|
||||
#define STYLE_PROP 0x0002
|
||||
#define STYLE_CONDENSED 0x0004
|
||||
#define STYLE_BOLD 0x0008
|
||||
#define STYLE_DOUBLESTRIKE 0x0010
|
||||
#define STYLE_DOUBLEWIDTH 0x0020
|
||||
#define STYLE_ITALICS 0x0040
|
||||
#define STYLE_UNDERLINE 0x0080
|
||||
#define STYLE_SUPERSCRIPT 0x0100
|
||||
#define STYLE_SUBSCRIPT 0x0200
|
||||
#define STYLE_STRIKETHROUGH 0x0400
|
||||
#define STYLE_OVERSCORE 0x0800
|
||||
#define STYLE_DOUBLEWIDTHONELINE 0x1000
|
||||
#define STYLE_DOUBLEHEIGHT 0x2000
|
||||
|
||||
/* Underlining styles. */
|
||||
#define SCORE_NONE 0x00
|
||||
@@ -127,10 +99,6 @@ enum {
|
||||
#define SCORE_SINGLEBROKEN 0x05
|
||||
#define SCORE_DOUBLEBROKEN 0x06
|
||||
|
||||
/* Print quality. */
|
||||
#define QUALITY_DRAFT 0x01
|
||||
#define QUALITY_LQ 0x02
|
||||
|
||||
/* Typefaces. */
|
||||
enum {
|
||||
TYPEFACE_ROMAN = 0,
|
||||
@@ -151,8 +119,8 @@ enum {
|
||||
|
||||
/* Some helper macros. */
|
||||
#define PARAM16(x) (dev->esc_parms[x + 1] * 256 + dev->esc_parms[x])
|
||||
#define PIXX ((unsigned) floor(dev->curr_x * dev->dpi + 0.5))
|
||||
#define PIXY ((unsigned) floor(dev->curr_y * dev->dpi + 0.5))
|
||||
#define PIXX ((unsigned) round(dev->curr_x * dev->dpi))
|
||||
#define PIXY ((unsigned) round(dev->curr_y * dev->dpi))
|
||||
|
||||
typedef struct psurface_t {
|
||||
int8_t dirty; /* has the page been printed on? */
|
||||
@@ -179,6 +147,8 @@ typedef struct escp_t {
|
||||
char page_fn[260];
|
||||
uint8_t color;
|
||||
|
||||
bool dc1_selected;
|
||||
|
||||
/* page data (TODO: make configurable) */
|
||||
double page_width; /* all in inches */
|
||||
double page_height;
|
||||
@@ -204,24 +174,25 @@ typedef struct escp_t {
|
||||
/* bit graphics data */
|
||||
uint16_t bg_h_density; /* in dpi */
|
||||
uint16_t bg_v_density; /* in dpi */
|
||||
int8_t bg_adjacent; /* print adjacent pixels (ignored) */
|
||||
int8_t bg_adjacent; /* print adjacent pixels */
|
||||
uint8_t bg_bytes_per_column;
|
||||
uint16_t bg_remaining_bytes; /* #bytes left before img is complete */
|
||||
uint8_t bg_column[6]; /* #bytes of the current and last col */
|
||||
uint8_t bg_previous[6]; // for non-adjacent pixels in graphics mode
|
||||
uint8_t bg_bytes_read; /* #bytes read so far for current col */
|
||||
|
||||
/* handshake data */
|
||||
uint8_t data;
|
||||
uint8_t ack;
|
||||
uint8_t select;
|
||||
uint8_t busy;
|
||||
uint8_t int_pending;
|
||||
uint8_t error;
|
||||
uint8_t autofeed;
|
||||
bool ack;
|
||||
bool select;
|
||||
bool busy;
|
||||
bool int_pending;
|
||||
bool error;
|
||||
bool autofeed;
|
||||
|
||||
/* ESC command data */
|
||||
int8_t esc_seen; /* set to 1 if an ESC char was seen */
|
||||
int8_t fss_seen;
|
||||
bool esc_seen; /* set if an ESC char was seen */
|
||||
bool fss_seen;
|
||||
uint16_t esc_pending; /* in which ESC command are we */
|
||||
uint8_t esc_parms_req;
|
||||
uint8_t esc_parms_curr;
|
||||
@@ -266,7 +237,7 @@ typedef struct escp_t {
|
||||
|
||||
PALETTE palcol;
|
||||
|
||||
uint8_t auto_lf;
|
||||
bool auto_lf;
|
||||
} escp_t;
|
||||
|
||||
/* Codepage table, needed for ESC t ( */
|
||||
@@ -327,18 +298,13 @@ static const uint16_t intCharSets[15][12] = {
|
||||
};
|
||||
|
||||
#ifdef ENABLE_ESCP_LOG
|
||||
int escp_do_log = ENABLE_ESCP_LOG;
|
||||
|
||||
static void
|
||||
escp_log(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (escp_do_log) {
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
#else
|
||||
# define escp_log(fmt, ...)
|
||||
@@ -381,7 +347,7 @@ pulse_timer(void *priv)
|
||||
escp_t *dev = (escp_t *) priv;
|
||||
|
||||
if (dev->ack) {
|
||||
dev->ack = 0;
|
||||
dev->ack = false;
|
||||
lpt_irq(dev->lpt, 1);
|
||||
}
|
||||
|
||||
@@ -402,13 +368,11 @@ timeout_timer(void *priv)
|
||||
static void
|
||||
fill_palette(uint8_t redmax, uint8_t greenmax, uint8_t bluemax, uint8_t colorID, escp_t *dev)
|
||||
{
|
||||
uint8_t colormask;
|
||||
const uint8_t colormask = colorID <<= 5;
|
||||
|
||||
double red = (double) redmax / (double) 30.9;
|
||||
double green = (double) greenmax / (double) 30.9;
|
||||
double blue = (double) bluemax / (double) 30.9;
|
||||
|
||||
colormask = colorID <<= 5;
|
||||
const double red = (double) redmax / (double) 30.9;
|
||||
const double green = (double) greenmax / (double) 30.9;
|
||||
const double blue = (double) bluemax / (double) 30.9;
|
||||
|
||||
for (uint8_t i = 0; i < 32; i++) {
|
||||
dev->palcol[i + colormask].r = 255 - (uint8_t) floor(red * (double) i);
|
||||
@@ -427,7 +391,7 @@ update_font(escp_t *dev)
|
||||
double vpoints = 10.5;
|
||||
|
||||
/* We need the FreeType library. */
|
||||
if (ft_lib == NULL)
|
||||
if (!ft_lib)
|
||||
return;
|
||||
|
||||
/* Release current font if we have one. */
|
||||
@@ -561,9 +525,10 @@ reset_printer(escp_t *dev)
|
||||
dev->bottom_margin = dev->page_height - 1.0 / 36.0;
|
||||
/* TODO: these should be configurable. */
|
||||
dev->color = COLOR_BLACK;
|
||||
dev->dc1_selected = true;
|
||||
dev->curr_x = dev->curr_y = 0.0;
|
||||
dev->esc_seen = 0;
|
||||
dev->fss_seen = 0;
|
||||
dev->esc_seen = false;
|
||||
dev->fss_seen = false;
|
||||
dev->esc_pending = 0;
|
||||
dev->esc_parms_req = dev->esc_parms_curr = 0;
|
||||
dev->lpi = PAGE_LPI;
|
||||
@@ -571,7 +536,7 @@ reset_printer(escp_t *dev)
|
||||
dev->cpi = PAGE_CPI;
|
||||
dev->curr_char_table = 1;
|
||||
dev->font_style = 0;
|
||||
dev->print_quality = QUALITY_DRAFT;
|
||||
dev->print_quality = device_get_config_int("quality");
|
||||
dev->extra_intra_space = 0.0;
|
||||
dev->print_upper_control = 1;
|
||||
dev->bg_remaining_bytes = 0;
|
||||
@@ -601,7 +566,7 @@ reset_printer(escp_t *dev)
|
||||
dev->num_horizontal_tabs = 32;
|
||||
dev->num_vertical_tabs = -1;
|
||||
|
||||
if (dev->page != NULL)
|
||||
if (dev->page)
|
||||
dev->page->dirty = 0;
|
||||
|
||||
escp_log("ESC/P: width=%.1fin,height=%.1fin dpi=%i cpi=%i lpi=%i\n",
|
||||
@@ -612,7 +577,7 @@ reset_printer(escp_t *dev)
|
||||
static void
|
||||
reset_printer_hard(escp_t *dev)
|
||||
{
|
||||
dev->ack = 0;
|
||||
dev->ack = false;
|
||||
timer_disable(&dev->pulse_timer);
|
||||
timer_stop(&dev->timeout_timer);
|
||||
reset_printer(dev);
|
||||
@@ -777,6 +742,8 @@ setup_bit_image(escp_t *dev, uint8_t density, uint16_t num_columns)
|
||||
escp_log("ESC/P: Unsupported bit image density %d.\n", density);
|
||||
break;
|
||||
}
|
||||
for (uint8_t i = 0; i < dev->bg_bytes_per_column; ++i)
|
||||
dev->bg_previous[i] = 0;
|
||||
|
||||
dev->bg_remaining_bytes = num_columns * dev->bg_bytes_per_column;
|
||||
dev->bg_bytes_read = 0;
|
||||
@@ -802,7 +769,7 @@ process_char(escp_t *dev, uint8_t ch)
|
||||
dev->esc_pending = ch;
|
||||
if (dev->fss_seen)
|
||||
dev->esc_pending |= 0x800;
|
||||
dev->esc_seen = dev->fss_seen = 0;
|
||||
dev->esc_seen = dev->fss_seen = false;
|
||||
dev->esc_parms_curr = 0;
|
||||
|
||||
escp_log("Command pending=%02x, font path=%s\n", dev->esc_pending, dev->fontpath);
|
||||
@@ -1168,24 +1135,11 @@ process_char(escp_t *dev, uint8_t ch)
|
||||
case '!': /* master select */
|
||||
dev->cpi = (dev->esc_parms[0]) & 0x01 ? 12.0 : 10.0;
|
||||
|
||||
/* Reset first seven bits. */
|
||||
dev->font_style &= 0xFF80;
|
||||
if (dev->esc_parms[0] & 0x02)
|
||||
dev->font_style |= STYLE_PROP;
|
||||
if (dev->esc_parms[0] & 0x04)
|
||||
dev->font_style |= STYLE_CONDENSED;
|
||||
if (dev->esc_parms[0] & 0x08)
|
||||
dev->font_style |= STYLE_BOLD;
|
||||
if (dev->esc_parms[0] & 0x10)
|
||||
dev->font_style |= STYLE_DOUBLESTRIKE;
|
||||
if (dev->esc_parms[0] & 0x20)
|
||||
dev->font_style |= STYLE_DOUBLEWIDTH;
|
||||
if (dev->esc_parms[0] & 0x40)
|
||||
dev->font_style |= STYLE_ITALICS;
|
||||
if (dev->esc_parms[0] & 0x80) {
|
||||
/* Reset first seven style bits (starting from two as CPI had one). */
|
||||
dev->font_style &= 0xFF01;
|
||||
dev->font_style |= dev->esc_parms[0];
|
||||
if (dev->esc_parms[0] & 0x80)
|
||||
dev->font_score = SCORE_SINGLE;
|
||||
dev->font_style |= STYLE_UNDERLINE;
|
||||
}
|
||||
|
||||
dev->hmi = -1;
|
||||
dev->multipoint_mode = 0;
|
||||
@@ -1267,6 +1221,10 @@ process_char(escp_t *dev, uint8_t ch)
|
||||
dev->print_upper_control = 0;
|
||||
break;
|
||||
|
||||
case '8': // disable
|
||||
case '9': // enable paper-out sensor
|
||||
// We don't have real paper, ignore.
|
||||
|
||||
case '<': /* unidirectional mode (one line) */
|
||||
/* We don't have a print head, so just
|
||||
* ignore this. */
|
||||
@@ -1408,7 +1366,7 @@ process_char(escp_t *dev, uint8_t ch)
|
||||
break;
|
||||
|
||||
case 'T': /* cancel superscript/subscript printing */
|
||||
dev->font_style &= 0xFFFF - STYLE_SUPERSCRIPT - STYLE_SUBSCRIPT;
|
||||
dev->font_style &= ~(STYLE_SUPERSCRIPT | STYLE_SUBSCRIPT);
|
||||
update_font(dev);
|
||||
break;
|
||||
|
||||
@@ -1736,7 +1694,7 @@ process_char(escp_t *dev, uint8_t ch)
|
||||
}
|
||||
|
||||
if (dev->font_style & STYLE_DOUBLEWIDTHONELINE) {
|
||||
dev->font_style &= 0xFFFF - STYLE_DOUBLEWIDTHONELINE;
|
||||
dev->font_style &= ~STYLE_DOUBLEWIDTHONELINE;
|
||||
update_font(dev);
|
||||
}
|
||||
return 1;
|
||||
@@ -1783,8 +1741,8 @@ process_char(escp_t *dev, uint8_t ch)
|
||||
return 1;
|
||||
|
||||
case 0x11: /* select printer (DC1) */
|
||||
/* Ignore. */
|
||||
return 0;
|
||||
dev->dc1_selected = true;
|
||||
return 1;
|
||||
|
||||
case 0x12: /* cancel condensed printing (DC2) */
|
||||
dev->hmi = -1;
|
||||
@@ -1793,7 +1751,7 @@ process_char(escp_t *dev, uint8_t ch)
|
||||
return 1;
|
||||
|
||||
case 0x13: /* deselect printer (DC3) */
|
||||
/* Ignore. */
|
||||
dev->dc1_selected = false;
|
||||
return 1;
|
||||
|
||||
case 0x14: /* cancel double-width printing (one line) (DC4) */
|
||||
@@ -1806,13 +1764,13 @@ process_char(escp_t *dev, uint8_t ch)
|
||||
return 1;
|
||||
|
||||
case 0x1b: /* ESC */
|
||||
dev->esc_seen = 1;
|
||||
dev->esc_seen = true;
|
||||
return 1;
|
||||
|
||||
case 0x1c: /* FS (IBM Proprinter II)
|
||||
TODO: Make an IBM printer. */
|
||||
if (dev->lang == LANG_ESCP2) {
|
||||
dev->fss_seen = 1;
|
||||
dev->fss_seen = true;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1831,7 +1789,7 @@ blit_glyph(escp_t *dev, unsigned destx, unsigned desty, int8_t add)
|
||||
uint8_t *dst;
|
||||
|
||||
/* check if freetype is available */
|
||||
if (ft_lib == NULL)
|
||||
if (!ft_lib)
|
||||
return;
|
||||
|
||||
for (unsigned int y = 0; y < bitmap->rows; y++) {
|
||||
@@ -1879,10 +1837,6 @@ draw_hline(escp_t *dev, unsigned from_x, unsigned to_x, unsigned y, int8_t broke
|
||||
static void
|
||||
print_bit_graph(escp_t *dev, uint8_t ch)
|
||||
{
|
||||
uint8_t pixel_w; /* width of the "pixel" */
|
||||
uint8_t pixel_h; /* height of the "pixel" */
|
||||
double old_y;
|
||||
|
||||
dev->bg_column[dev->bg_bytes_read++] = ch;
|
||||
dev->bg_remaining_bytes--;
|
||||
|
||||
@@ -1890,16 +1844,18 @@ print_bit_graph(escp_t *dev, uint8_t ch)
|
||||
if (dev->bg_bytes_read < dev->bg_bytes_per_column)
|
||||
return;
|
||||
|
||||
old_y = dev->curr_y;
|
||||
/* vertical density is how big the dot is
|
||||
* (horziontal / vertical / 2) is how many middle points between two full dots are
|
||||
* if horizontal < vertical, this means a column is printed multiple times
|
||||
*/
|
||||
uint8_t dot_size_x;
|
||||
const uint8_t dot_size_y = round((double) dev->dpi / (double) dev->bg_v_density);
|
||||
if (dev->bg_h_density < dev->bg_v_density)
|
||||
dot_size_x = round((double) dev->dpi / (double) dev->bg_h_density);
|
||||
else
|
||||
dot_size_x = dot_size_y;
|
||||
|
||||
pixel_w = 1;
|
||||
pixel_h = 1;
|
||||
|
||||
if (dev->bg_adjacent) {
|
||||
/* if page DPI is bigger than bitgraphics DPI, drawn pixels get "bigger" */
|
||||
pixel_w = dev->dpi / dev->bg_h_density > 0 ? dev->dpi / dev->bg_h_density : 1;
|
||||
pixel_h = dev->dpi / dev->bg_v_density > 0 ? dev->dpi / dev->bg_v_density : 1;
|
||||
}
|
||||
const double old_y = dev->curr_y;
|
||||
|
||||
for (uint8_t i = 0; i < dev->bg_bytes_per_column; i++) {
|
||||
/* for each byte */
|
||||
@@ -1908,11 +1864,21 @@ print_bit_graph(escp_t *dev, uint8_t ch)
|
||||
break;
|
||||
/* for each bit */
|
||||
if (dev->bg_column[i] & j) {
|
||||
/* draw a "pixel" */
|
||||
for (uint8_t xx = 0; xx < pixel_w; xx++) {
|
||||
for (uint8_t yy = 0; yy < pixel_h; yy++) {
|
||||
if (((PIXX + xx) < (unsigned) dev->page->w) && ((PIXY + yy) < (unsigned) dev->page->h))
|
||||
*((uint8_t *) dev->page->pixels + (PIXX + xx) + (PIXY + yy) * dev->page->pitch) |= (dev->color | 0x1f);
|
||||
if (!(dev->bg_adjacent) && (dev->bg_previous[i] & j)) {
|
||||
dev->bg_column[i] &= ~j;
|
||||
dev->curr_y += 1.0 / (double) dev->bg_v_density;
|
||||
continue;
|
||||
}
|
||||
/* draw a dot */
|
||||
for (uint8_t xx = 0; xx < dot_size_x; ++xx) {
|
||||
if ((PIXX + xx) >= (unsigned) dev->page->w)
|
||||
break;
|
||||
|
||||
for (uint8_t yy = 0; yy < dot_size_y; ++yy) {
|
||||
if ((PIXY + yy) >= (unsigned) dev->page->h)
|
||||
break;
|
||||
|
||||
*((uint8_t *) dev->page->pixels + (PIXX + xx) + (PIXY + yy) * dev->page->pitch) |= (dev->color | 0x1f);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1921,6 +1887,8 @@ print_bit_graph(escp_t *dev, uint8_t ch)
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(dev->bg_previous, dev->bg_column, dev->bg_bytes_per_column * sizeof(uint8_t));
|
||||
|
||||
/* Mark page dirty. */
|
||||
dev->page->dirty = 1;
|
||||
|
||||
@@ -1943,16 +1911,18 @@ handle_char(escp_t *dev, uint8_t ch)
|
||||
uint16_t line_y;
|
||||
double x_advance;
|
||||
|
||||
if (dev->page == NULL)
|
||||
if (!(dev->page))
|
||||
return;
|
||||
|
||||
/* MSB mode */
|
||||
if (dev->msb != 255) {
|
||||
if (dev->msb == 0)
|
||||
ch &= 0x7f;
|
||||
else if (dev->msb == 1)
|
||||
ch |= 0x80;
|
||||
}
|
||||
if (dev->msb == 0)
|
||||
ch &= 0x7f;
|
||||
else if (dev->msb == 1)
|
||||
ch |= 0x80;
|
||||
// else it's neutral at 255
|
||||
|
||||
if (!(dev->dc1_selected) && ch != 0x11)
|
||||
return;
|
||||
|
||||
if (dev->bg_remaining_bytes > 0) {
|
||||
print_bit_graph(dev, ch);
|
||||
@@ -1970,7 +1940,7 @@ handle_char(escp_t *dev, uint8_t ch)
|
||||
}
|
||||
|
||||
/* We cannot print if we have no font loaded. */
|
||||
if (dev->fontface == NULL)
|
||||
if (!(dev->fontface))
|
||||
return;
|
||||
|
||||
if (ch == 0x01)
|
||||
@@ -2055,7 +2025,7 @@ write_data(uint8_t val, void *priv)
|
||||
{
|
||||
escp_t *dev = (escp_t *) priv;
|
||||
|
||||
if (dev == NULL)
|
||||
if (!dev)
|
||||
return;
|
||||
|
||||
dev->data = val;
|
||||
@@ -2066,7 +2036,7 @@ strobe(uint8_t old, uint8_t val, void *priv)
|
||||
{
|
||||
escp_t *dev = (escp_t *) priv;
|
||||
|
||||
if (dev == NULL)
|
||||
if (!dev)
|
||||
return;
|
||||
|
||||
/* Data is strobed to the parallel printer on the falling edge of the
|
||||
@@ -2083,7 +2053,7 @@ strobe(uint8_t old, uint8_t val, void *priv)
|
||||
#endif
|
||||
}
|
||||
/* ACK it, will be read on next READ STATUS. */
|
||||
dev->ack = 1;
|
||||
dev->ack = true;
|
||||
timer_set_delay_u64(&dev->pulse_timer, ISACONST);
|
||||
|
||||
timer_on_auto(&dev->timeout_timer, 5000000.0);
|
||||
@@ -2095,17 +2065,17 @@ write_ctrl(uint8_t val, void *priv)
|
||||
{
|
||||
escp_t *dev = (escp_t *) priv;
|
||||
|
||||
if (dev == NULL)
|
||||
if (!dev)
|
||||
return;
|
||||
|
||||
if (val & 0x08) { /* SELECT */
|
||||
/* select printer */
|
||||
dev->select = 1;
|
||||
dev->select = true;
|
||||
}
|
||||
|
||||
if ((val & 0x04) && !(dev->ctrl & 0x04)) {
|
||||
/* reset printer */
|
||||
dev->select = 0;
|
||||
dev->select = false;
|
||||
|
||||
reset_printer_hard(dev);
|
||||
}
|
||||
@@ -2124,7 +2094,7 @@ write_ctrl(uint8_t val, void *priv)
|
||||
#endif
|
||||
}
|
||||
/* ACK it, will be read on next READ STATUS. */
|
||||
dev->ack = 1;
|
||||
dev->ack = true;
|
||||
timer_set_delay_u64(&dev->pulse_timer, ISACONST);
|
||||
|
||||
timer_on_auto(&dev->timeout_timer, 5000000.0);
|
||||
@@ -2163,11 +2133,11 @@ escp_init(const device_t *info)
|
||||
escp_t *dev = NULL;
|
||||
|
||||
/* Initialize FreeType. */
|
||||
if (ft_lib == NULL) {
|
||||
if (!ft_lib) {
|
||||
if (FT_Init_FreeType(&ft_lib)) {
|
||||
pclog("ESC/P: FT_Init_FreeType failed\n");
|
||||
ft_lib = NULL;
|
||||
return (NULL);
|
||||
return(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2186,7 +2156,7 @@ escp_init(const device_t *info)
|
||||
ui_msgbox_header(MBX_ERROR, plat_get_string(STRING_ESCP_ERROR_TITLE),
|
||||
plat_get_string(STRING_ESCP_ERROR_DESC));
|
||||
free(dev);
|
||||
return (NULL);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/* Create the full path for the page images. */
|
||||
@@ -2229,14 +2199,13 @@ escp_init(const device_t *info)
|
||||
memset(dev->page->pixels, 0x00, (size_t) dev->page->pitch * dev->page->h);
|
||||
|
||||
/* Initialize parameters. */
|
||||
/* 0 = all white needed for logic 000 */
|
||||
for (uint8_t i = 0; i < 32; i++) {
|
||||
dev->palcol[i].r = 255;
|
||||
dev->palcol[i].g = 255;
|
||||
dev->palcol[i].b = 255;
|
||||
}
|
||||
|
||||
/* 0 = all white needed for logic 000 */
|
||||
fill_palette(0, 0, 0, 1, dev);
|
||||
/* 1 = magenta* 001 */
|
||||
fill_palette(0, 255, 0, 1, dev);
|
||||
/* 2 = cyan* 010 */
|
||||
@@ -2254,7 +2223,7 @@ escp_init(const device_t *info)
|
||||
|
||||
dev->color = COLOR_BLACK;
|
||||
dev->fontface = 0;
|
||||
dev->autofeed = 0;
|
||||
dev->autofeed = false;
|
||||
|
||||
reset_printer(dev);
|
||||
|
||||
@@ -2272,15 +2241,15 @@ escp_close(void *priv)
|
||||
{
|
||||
escp_t *dev = (escp_t *) priv;
|
||||
|
||||
if (dev == NULL)
|
||||
if (!dev)
|
||||
return;
|
||||
|
||||
if (dev->page != NULL) {
|
||||
if (dev->page) {
|
||||
/* Print last page if it contains data. */
|
||||
if (dev->page->dirty)
|
||||
dump_page(dev);
|
||||
|
||||
if (dev->page->pixels != NULL)
|
||||
if (dev->page->pixels)
|
||||
free(dev->page->pixels);
|
||||
free(dev->page);
|
||||
}
|
||||
@@ -2290,11 +2259,6 @@ escp_close(void *priv)
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
#if 0
|
||||
static const device_config_t lpt_prt_escp_config[] = {
|
||||
{ .name = "", .description = "", .type = CONFIG_END }
|
||||
};
|
||||
#endif
|
||||
static const device_config_t lpt_prt_escp_config[] = {
|
||||
{
|
||||
.name = "language",
|
||||
@@ -2332,6 +2296,21 @@ static const device_config_t lpt_prt_escp_config[] = {
|
||||
},
|
||||
.bios = { { 0 } }
|
||||
},
|
||||
{
|
||||
.name = "quality",
|
||||
.description = "Quality",
|
||||
.type = CONFIG_SELECTION,
|
||||
.default_string = NULL,
|
||||
.default_int = 0,
|
||||
.file_filter = NULL,
|
||||
.spinner = { 0 },
|
||||
.selection = {
|
||||
{ .description = "Draft", .value = QUALITY_DRAFT },
|
||||
{ .description = "(Near) Letter", .value = QUALITY_LQ },
|
||||
{ .description = "" }
|
||||
},
|
||||
.bios = { { 0 } }
|
||||
},
|
||||
{
|
||||
.name = "auto_lf",
|
||||
.description = "Auto LF",
|
||||
|
||||
@@ -2832,7 +2832,7 @@ msgstr ""
|
||||
msgid "Remote Switch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Switch:"
|
||||
msgid "Shared secret:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hub Mode"
|
||||
|
||||
@@ -2838,8 +2838,8 @@ msgstr "Commutador local"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Commutador remot"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Commutador:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Secret compartit:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Modalitat de concentrador"
|
||||
|
||||
@@ -2838,8 +2838,8 @@ msgstr "Lokální switch"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Vzdálený switch"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Switch:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Sdílené tajemství:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Režim hubu"
|
||||
|
||||
@@ -2838,8 +2838,8 @@ msgstr "Lokaler Schalter"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Entfernter Schalter"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Schalter:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Gemeinsames Geheimnis:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Hub-Modus"
|
||||
|
||||
@@ -2883,8 +2883,8 @@ msgstr "Τοπικός Διακόπτης"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Απομακρυσμένος Διακόπτης"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Διακόπτης:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Κοινό μυστικό:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Λειτουργία Hub"
|
||||
|
||||
@@ -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."
|
||||
|
||||
|
||||
@@ -2838,8 +2838,8 @@ msgstr "Conmutador local"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Conmutador remoto"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Conmutador:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Secreto compartido:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Modo de concentrador"
|
||||
|
||||
@@ -2838,8 +2838,8 @@ msgstr "Paikallinen kytkin"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Etäkytkin"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Kytkin:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Jaettu salaisuus:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Hubitila"
|
||||
|
||||
@@ -2838,8 +2838,8 @@ msgstr "Commutateur local"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Commutateur distant"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Commutateur :"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Secret partagé:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Mode concentrateur"
|
||||
|
||||
@@ -2840,8 +2840,8 @@ msgstr "Lokalni prekidač"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Udaljeni prekidač"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Prekidač:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Zajednička tajna:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Način čvorišta"
|
||||
|
||||
@@ -2838,8 +2838,8 @@ msgstr "Commutatore locale"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Commutatore remoto"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Commutatore:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Segreto condiviso:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Modalità Hub"
|
||||
|
||||
@@ -2839,8 +2839,8 @@ msgstr "ローカルスイッチ"
|
||||
msgid "Remote Switch"
|
||||
msgstr "リモートスイッチ"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "スイッチ:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "共有秘密:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "ハブモード"
|
||||
|
||||
@@ -2838,8 +2838,8 @@ msgstr "로컬 스위치"
|
||||
msgid "Remote Switch"
|
||||
msgstr "원격 스위치"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "스위치:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "공유 비밀:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "허브 모드"
|
||||
|
||||
@@ -2839,8 +2839,8 @@ msgstr "Lokal svitsj"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Ekstern svitsj"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Svitsj:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Delt hemmelighet:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Hub-modus"
|
||||
|
||||
@@ -2838,8 +2838,8 @@ msgstr "Lokale Switch"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Externe Switch"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Switch:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Gedeeld geheim:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Hub-modus"
|
||||
|
||||
@@ -2839,8 +2839,8 @@ msgstr "Switch lokalny"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Switch zdalny"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Switch:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Wspólny sekret:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Tryb hub"
|
||||
|
||||
@@ -2832,8 +2832,8 @@ msgstr "Switch Local"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Switch Remoto"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Switch:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Segredo compartilhado:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Modo Hub"
|
||||
|
||||
@@ -2839,8 +2839,8 @@ msgstr "Comutador local"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Comutador remoto"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Comutador:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Segredo partilhado:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Modo de concentrador"
|
||||
|
||||
@@ -2851,8 +2851,8 @@ msgstr "Локальный коммутатор"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Удалённый коммутатор"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Номер коммутатора:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Общий секрет:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Режим концентратора"
|
||||
|
||||
@@ -2838,8 +2838,8 @@ msgstr "Lokálny prepínač"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Vzdialený prepínač"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Prepínač:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Zdieľané tajomstvo:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Režim hubu"
|
||||
|
||||
@@ -2840,8 +2840,8 @@ msgstr "Lokalno stikalo"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Oddaljeno stikalo"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Stikalo:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Skupna skrivnost:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Način koncentratorja"
|
||||
|
||||
@@ -2838,8 +2838,8 @@ msgstr "Lokal switch"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Fjärr-switch"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Switch:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Delad hemlighet:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Hubb-läge"
|
||||
|
||||
@@ -2838,8 +2838,8 @@ msgstr "Yerel Switch"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Uzak Switch"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Switch:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Paylaşılan sır:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Hub Modu"
|
||||
|
||||
@@ -2840,8 +2840,8 @@ msgstr "Локальний комутатор"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Віддалений комутатор"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Номер комутатора:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Спільний секрет:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Режим концентратора"
|
||||
|
||||
@@ -2839,8 +2839,8 @@ msgstr "Công tắc cục bộ"
|
||||
msgid "Remote Switch"
|
||||
msgstr "Công tắc từ xa"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "Công tắc:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "Bí mật chia sẻ:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "Chế độ hub"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2026-01-23 17:57+0000\n"
|
||||
"PO-Revision-Date: 2026-02-11 06:30+0000\n"
|
||||
"Last-Translator: BlueRain-debug <bluerain.debug@gmail.com>\n"
|
||||
"Language-Team: Chinese (Simplified Han script) <https://weblate.86box.net/"
|
||||
"projects/86box/86box/zh_Hans/>\n"
|
||||
@@ -2839,8 +2839,8 @@ msgstr "本地交换机"
|
||||
msgid "Remote Switch"
|
||||
msgstr "远程交换机"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "交换机:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "共享密钥:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "集线器模式"
|
||||
|
||||
@@ -2839,8 +2839,8 @@ msgstr "本地交換器"
|
||||
msgid "Remote Switch"
|
||||
msgstr "遠端交換器"
|
||||
|
||||
msgid "Switch:"
|
||||
msgstr "交換器:"
|
||||
msgid "Shared secret:"
|
||||
msgstr "共用秘鑰:"
|
||||
|
||||
msgid "Hub Mode"
|
||||
msgstr "集線器模式"
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -49,13 +49,9 @@ SettingsNetwork::enableElements(Ui::SettingsNetwork *ui)
|
||||
auto *option_list_label = findChild<QLabel *>(QString("labelOptionList%1").arg(i + 1));
|
||||
auto *option_list_line = findChild<QWidget *>(QString("lineOptionList%1").arg(i + 1));
|
||||
|
||||
// Switch group
|
||||
auto *switch_group_label = findChild<QLabel *>(QString("labelSwitch%1").arg(i + 1));
|
||||
// auto *switch_group_hlayout = findChild<QHBoxLayout *>(QString("HLayoutSwitch%1").arg(i + 1));
|
||||
// auto *switch_group_hspacer = findChild<QWidget *>(QString("horizontalSpacerSwitch%1").arg(i + 1));
|
||||
auto *switch_group_value = findChild<QSpinBox *>(QString("spinnerSwitch%1").arg(i + 1));
|
||||
switch_group_value->setMinimum(NET_SWITCH_GRP_MIN);
|
||||
switch_group_value->setMaximum(NET_SWITCH_GRP_MAX);
|
||||
// Shared secret
|
||||
auto *secret_label = findChild<QLabel *>(QString("labelSecret%1").arg(i + 1));
|
||||
auto *secret_value = findChild<QLineEdit *>(QString("secretSwitch%1").arg(i + 1));
|
||||
|
||||
// Promiscuous option
|
||||
auto *promisc_label = findChild<QLabel *>(QString("labelPromisc%1").arg(i + 1));
|
||||
@@ -73,10 +69,8 @@ SettingsNetwork::enableElements(Ui::SettingsNetwork *ui)
|
||||
// NEW STUFF
|
||||
// Make all options invisible by default
|
||||
|
||||
// Switch group
|
||||
switch_group_label->setVisible(false);
|
||||
switch_group_value->setVisible(false);
|
||||
// switch_group_hspacer->setVisible(false);
|
||||
secret_label->setVisible(false);
|
||||
secret_value->setVisible(false);
|
||||
|
||||
// Promiscuous options
|
||||
promisc_label->setVisible(false);
|
||||
@@ -142,10 +136,9 @@ SettingsNetwork::enableElements(Ui::SettingsNetwork *ui)
|
||||
option_list_label->setVisible(true);
|
||||
option_list_line->setVisible(true);
|
||||
|
||||
// Switch group
|
||||
switch_group_label->setVisible(true);
|
||||
switch_group_value->setVisible(true);
|
||||
// switch_group_hspacer->setVisible(false);
|
||||
// Shared secret
|
||||
secret_label->setVisible(true);
|
||||
secret_value->setVisible(true);
|
||||
|
||||
// Promiscuous options
|
||||
promisc_label->setVisible(true);
|
||||
@@ -157,10 +150,9 @@ SettingsNetwork::enableElements(Ui::SettingsNetwork *ui)
|
||||
option_list_label->setVisible(true);
|
||||
option_list_line->setVisible(true);
|
||||
|
||||
// Switch group
|
||||
switch_group_label->setVisible(true);
|
||||
switch_group_value->setVisible(true);
|
||||
// switch_group_hspacer->setVisible(false);
|
||||
// Shared secret
|
||||
secret_label->setVisible(true);
|
||||
secret_value->setVisible(true);
|
||||
|
||||
// Hostname
|
||||
hostname_label->setVisible(true);
|
||||
@@ -215,7 +207,7 @@ SettingsNetwork::save()
|
||||
cbox = findChild<QComboBox *>(QString("comboBoxIntf%1").arg(i + 1));
|
||||
auto *hostname_value = findChild<QLineEdit *>(QString("hostnameSwitch%1").arg(i + 1));
|
||||
auto *promisc_value = findChild<QCheckBox *>(QString("boxPromisc%1").arg(i + 1));
|
||||
auto *switch_group_value = findChild<QSpinBox *>(QString("spinnerSwitch%1").arg(i + 1));
|
||||
auto *secret_value = findChild<QLineEdit *>(QString("secretSwitch%1").arg(i + 1));
|
||||
memset(net_cards_conf[i].host_dev_name, '\0', sizeof(net_cards_conf[i].host_dev_name));
|
||||
if (net_cards_conf[i].net_type == NET_TYPE_PCAP)
|
||||
strncpy(net_cards_conf[i].host_dev_name, network_devs[cbox->currentData().toInt()].device, sizeof(net_cards_conf[i].host_dev_name) - 1);
|
||||
@@ -230,10 +222,12 @@ SettingsNetwork::save()
|
||||
else if (net_cards_conf[i].net_type == NET_TYPE_NRSWITCH) {
|
||||
memset(net_cards_conf[i].nrs_hostname, '\0', sizeof(net_cards_conf[i].nrs_hostname));
|
||||
strncpy(net_cards_conf[i].nrs_hostname, hostname_value->text().toUtf8().constData(), sizeof(net_cards_conf[i].nrs_hostname) - 1);
|
||||
net_cards_conf[i].switch_group = switch_group_value->value();
|
||||
memset(net_cards_conf[i].secret, '\0', sizeof(net_cards_conf[i].secret));
|
||||
strncpy(net_cards_conf[i].secret, secret_value->text().toUtf8().constData(), sizeof(net_cards_conf[i].secret) - 1);
|
||||
} else if (net_cards_conf[i].net_type == NET_TYPE_NLSWITCH) {
|
||||
net_cards_conf[i].promisc_mode = promisc_value->isChecked();
|
||||
net_cards_conf[i].switch_group = switch_group_value->value();
|
||||
memset(net_cards_conf[i].secret, '\0', sizeof(net_cards_conf[i].secret));
|
||||
strncpy(net_cards_conf[i].secret, secret_value->text().toUtf8().constData(), sizeof(net_cards_conf[i].secret) - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -349,13 +343,13 @@ SettingsNetwork::onCurrentMachineChanged(int machineId)
|
||||
} else if (net_cards_conf[i].net_type == NET_TYPE_NLSWITCH) {
|
||||
auto *promisc_value = findChild<QCheckBox *>(QString("boxPromisc%1").arg(i + 1));
|
||||
promisc_value->setCheckState(net_cards_conf[i].promisc_mode == 1 ? Qt::CheckState::Checked : Qt::CheckState::Unchecked);
|
||||
auto *switch_group_value = findChild<QSpinBox *>(QString("spinnerSwitch%1").arg(i + 1));
|
||||
switch_group_value->setValue(net_cards_conf[i].switch_group);
|
||||
auto *secret_value = findChild<QLineEdit *>(QString("secretSwitch%1").arg(i + 1));
|
||||
secret_value->setText(net_cards_conf[i].secret);
|
||||
} else if (net_cards_conf[i].net_type == NET_TYPE_NRSWITCH) {
|
||||
auto *hostname_value = findChild<QLineEdit *>(QString("hostnameSwitch%1").arg(i + 1));
|
||||
hostname_value->setText(net_cards_conf[i].nrs_hostname);
|
||||
auto *switch_group_value = findChild<QSpinBox *>(QString("spinnerSwitch%1").arg(i + 1));
|
||||
switch_group_value->setValue(net_cards_conf[i].switch_group);
|
||||
auto *secret_value = findChild<QLineEdit *>(QString("secretSwitch%1").arg(i + 1));
|
||||
secret_value->setText(net_cards_conf[i].secret);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -170,38 +170,18 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0">
|
||||
<widget class="QLabel" name="labelSwitch1">
|
||||
<widget class="QLabel" name="labelSecret1">
|
||||
<property name="text">
|
||||
<string>Switch:</string>
|
||||
<string>Shared secret:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="1">
|
||||
<layout class="QHBoxLayout" name="HLayoutSwitch1">
|
||||
<item>
|
||||
<widget class="QSpinBox" name="spinnerSwitch1">
|
||||
<property name="minimum">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>10</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacerSwitch1">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
<widget class="QLineEdit" name="secretSwitch1">
|
||||
<property name="maxLength">
|
||||
<number>256</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0">
|
||||
<widget class="QLabel" name="labelPromisc1">
|
||||
@@ -385,38 +365,18 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0">
|
||||
<widget class="QLabel" name="labelSwitch2">
|
||||
<widget class="QLabel" name="labelSecret2">
|
||||
<property name="text">
|
||||
<string>Switch:</string>
|
||||
<string>Shared secret:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="1">
|
||||
<layout class="QHBoxLayout" name="HLayoutSwitch2">
|
||||
<item>
|
||||
<widget class="QSpinBox" name="spinnerSwitch2">
|
||||
<property name="minimum">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>10</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacerSwitch2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
<widget class="QLineEdit" name="secretSwitch2">
|
||||
<property name="maxLength">
|
||||
<number>256</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0">
|
||||
<widget class="QLabel" name="labelPromisc2">
|
||||
@@ -600,38 +560,18 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0">
|
||||
<widget class="QLabel" name="labelSwitch3">
|
||||
<widget class="QLabel" name="labelSecret3">
|
||||
<property name="text">
|
||||
<string>Switch:</string>
|
||||
<string>Shared secret:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="1">
|
||||
<layout class="QHBoxLayout" name="HLayoutSwitch3">
|
||||
<item>
|
||||
<widget class="QSpinBox" name="spinnerSwitch3">
|
||||
<property name="minimum">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>10</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacerSwitch3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
<widget class="QLineEdit" name="secretSwitch3">
|
||||
<property name="maxLength">
|
||||
<number>256</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0">
|
||||
<widget class="QLabel" name="labelPromisc3">
|
||||
@@ -815,38 +755,18 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0">
|
||||
<widget class="QLabel" name="labelSwitch4">
|
||||
<widget class="QLabel" name="labelSecret4">
|
||||
<property name="text">
|
||||
<string>Switch:</string>
|
||||
<string>Shared secret:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="1">
|
||||
<layout class="QHBoxLayout" name="HLayoutSwitch4">
|
||||
<item>
|
||||
<widget class="QSpinBox" name="spinnerSwitch4">
|
||||
<property name="minimum">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>10</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacerSwitch4">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
<widget class="QLineEdit" name="secretSwitch4">
|
||||
<property name="maxLength">
|
||||
<number>256</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0">
|
||||
<widget class="QLabel" name="labelPromisc4">
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
@@ -76,7 +76,7 @@ rtg_in(uint16_t addr, void *priv)
|
||||
|
||||
case 0x3cf:
|
||||
if (svga->gdcaddr == 0x0c)
|
||||
return svga->gdcreg[0x0c] | 4;
|
||||
return svga->gdcreg[0x0c] | 0x04;
|
||||
else if ((svga->gdcaddr > 8) && (svga->gdcaddr != 0x0c))
|
||||
return svga->gdcreg[svga->gdcaddr];
|
||||
break;
|
||||
@@ -89,13 +89,13 @@ rtg_in(uint16_t addr, void *priv)
|
||||
return dev->type << 6;
|
||||
if (svga->crtcreg == 0x1e) {
|
||||
ret = svga->crtc[0x1e];
|
||||
ret &= ~3;
|
||||
ret &= ~0x03;
|
||||
if (dev->vram_size == 1024)
|
||||
ret = 2;
|
||||
ret = 0x02;
|
||||
else if (dev->vram_size == 512)
|
||||
ret = 1;
|
||||
ret = 0x01;
|
||||
else
|
||||
ret = 0;
|
||||
ret = 0x00;
|
||||
return ret;
|
||||
}
|
||||
return svga->crtc[svga->crtcreg];
|
||||
@@ -207,60 +207,60 @@ rtg_out(uint16_t addr, uint8_t val, void *priv)
|
||||
static void
|
||||
rtg_recalctimings(svga_t *svga)
|
||||
{
|
||||
const rtg_t *dev = (rtg_t *) svga->priv;
|
||||
const rtg_t *dev = (rtg_t *) svga->priv;
|
||||
int clk_sel = ((svga->miscout >> 2) & 0x03) | ((svga->gdcreg[0x0c] & 0x20) >> 3);
|
||||
|
||||
svga->memaddr_latch |= ((svga->crtc[0x19] & 0x10) << 16) | ((svga->crtc[0x19] & 0x40) << 17);
|
||||
|
||||
svga->interlace = (svga->crtc[0x19] & 1);
|
||||
svga->interlace = (svga->crtc[0x19] & 0x01);
|
||||
|
||||
/*Clock table not available, currently a guesswork*/
|
||||
switch (((svga->miscout >> 2) & 3) | ((svga->gdcreg[0x0c] & 0x20) >> 3)) {
|
||||
case 0:
|
||||
case 1:
|
||||
break;
|
||||
/*Source: xfree86 3.3.6 source code, rt_driver.c.*/
|
||||
switch (clk_sel) {
|
||||
case 2:
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / 36000000.0;
|
||||
break;
|
||||
case 3:
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / 65100000.0;
|
||||
break;
|
||||
case 4:
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / 44900000.0;
|
||||
break;
|
||||
case 3:
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / 71600000.0;
|
||||
break;
|
||||
case 4:
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / 73000000.0;
|
||||
break;
|
||||
case 5:
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / 50000000.0;
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / 64000000.0;
|
||||
break;
|
||||
case 6:
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / 80000000.0;
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / 84000000.0;
|
||||
break;
|
||||
case 7:
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / 75000000.0;
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / 79000000.0;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (svga->gdcreg[0x0c] & 3) {
|
||||
case 1:
|
||||
svga->clock /= 1.5;
|
||||
break;
|
||||
case 2:
|
||||
svga->clock /= 2;
|
||||
break;
|
||||
case 3:
|
||||
svga->clock /= 4;
|
||||
break;
|
||||
if (clk_sel >= 2) {
|
||||
switch (svga->gdcreg[0x0b] & 0x03) {
|
||||
case 1:
|
||||
svga->clock *= 1.5;
|
||||
break;
|
||||
case 2:
|
||||
svga->clock *= 2.0;
|
||||
break;
|
||||
case 3:
|
||||
svga->clock *= 4.0;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!svga->scrblank && (svga->crtc[0x17] & 0x80) && svga->attr_palette_enable) {
|
||||
if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) {
|
||||
switch (svga->gdcreg[5] & 0x60) {
|
||||
case 0x00:
|
||||
if (svga->seqregs[1] & 8) /*Low res (320)*/
|
||||
if (svga->seqregs[1] & 0x08) /*Low res (320)*/
|
||||
svga->render = svga_render_4bpp_lowres;
|
||||
else {
|
||||
if (svga->hdisp == 1280)
|
||||
@@ -270,17 +270,18 @@ rtg_recalctimings(svga_t *svga)
|
||||
}
|
||||
break;
|
||||
case 0x20: /*4 colours*/
|
||||
if (svga->seqregs[1] & 8) /*Low res (320)*/
|
||||
if (svga->seqregs[1] & 0x08) /*Low res (320)*/
|
||||
svga->render = svga_render_2bpp_lowres;
|
||||
else
|
||||
svga->render = svga_render_2bpp_highres;
|
||||
break;
|
||||
case 0x40:
|
||||
case 0x60:
|
||||
if (svga->crtc[0x19] & 2) {
|
||||
if (svga->hdisp == 1280)
|
||||
if (svga->crtc[0x19] & 0x02) {
|
||||
if (svga->hdisp == 1280) {
|
||||
svga->hdisp >>= 1;
|
||||
else if (dev->type == 2)
|
||||
svga->dots_per_clock >>= 1;
|
||||
} else if (dev->type == 2)
|
||||
svga->rowoffset <<= 1;
|
||||
|
||||
svga->render = svga_render_8bpp_highres;
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user