Merge remote-tracking branch 'upstream/master' into feature/machine_cdpmpc

This commit is contained in:
Jasmine Iwanek
2023-10-07 16:40:48 -04:00
64 changed files with 5186 additions and 3753 deletions

View File

@@ -95,7 +95,7 @@ jobs:
libvncserver:p
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: make
run: >-

View File

@@ -62,11 +62,12 @@ jobs:
static: on
- name: Qt GUI
qt: on
static: off
static: on
slug: -Qt
packages: >-
qt5-base:p
qt5-tools:p
qt5-static:p
# qt5-base:p
# qt5-tools:p
environment:
# - msystem: MSYS
# toolchain: ./cmake/flags-gcc-x86_64.cmake
@@ -110,7 +111,7 @@ jobs:
${{ matrix.ui.packages }}
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
@@ -233,7 +234,7 @@ jobs:
run: dir "C:/Program Files/Microsoft Visual Studio/2022/*/VC/Tools/MSVC/*/include" -include stdatomic.h -recurse | del
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
@@ -340,7 +341,7 @@ jobs:
${{ matrix.ui.packages }}
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
@@ -426,7 +427,7 @@ jobs:
${{ matrix.ui.packages }}
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
@@ -457,10 +458,12 @@ jobs:
sonar-scanner --define sonar.cfamily.build-wrapper-output="${{ env.BUILD_WRAPPER_OUT_DIR }}"
- name: Generate package
if: 0
run: |
cmake --install build
- name: Upload artifact
if: 0
uses: actions/upload-artifact@v3
with:
name: '86Box${{ matrix.ui.slug }}${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-macOS-x86_64-gha${{ github.run_number }}'

View File

@@ -113,7 +113,7 @@ jobs:
${{ matrix.ui.packages }}
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
@@ -199,7 +199,7 @@ jobs:
${{ matrix.ui.packages }}
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
@@ -275,7 +275,7 @@ jobs:
${{ matrix.ui.packages }}
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v2

View File

@@ -68,7 +68,7 @@ Donations
---------
We do not charge you for the emulator but donations are still welcome:
https://paypal.me/86Box.
<https://paypal.me/86Box>.
You can also support the project on Patreon:
https://www.patreon.com/86box.
<https://www.patreon.com/86box>.

View File

@@ -1071,11 +1071,13 @@ pc_reset_hard_init(void)
/* Reset and reconfigure the Sound Card layer. */
sound_card_reset();
/* Initialize parallel devices. */
/* note: PLIP LPT side has to be initialized before the network side */
lpt_devices_init();
/* Reset and reconfigure the Network Card layer. */
network_reset();
lpt_devices_init();
/* Reset and reconfigure the serial ports. */
serial_standalone_init();
serial_passthrough_init();

View File

@@ -128,14 +128,14 @@ acpi_update_irq(acpi_t *dev)
else if (dev->irq_mode == 2)
pci_set_mirq(5, dev->mirq_is_level, &dev->irq_state);
else
pci_set_mirq(PCI_DIRQ_BASE | dev->irq_line, 1, &dev->irq_state);
picintlevel(1 << dev->irq_line, &dev->irq_state);
} else {
if (dev->irq_mode == 1)
pci_clear_irq(dev->slot, dev->irq_pin, &dev->irq_state);
else if (dev->irq_mode == 2)
pci_clear_mirq(5, dev->mirq_is_level, &dev->irq_state);
else
pci_clear_mirq(PCI_DIRQ_BASE | dev->irq_line, 1, &dev->irq_state);
picintclevel(1 << dev->irq_line, &dev->irq_state);
}
acpi_timer_update(dev, (dev->regs.pmen & TMROF_EN) && !(dev->regs.pmsts & TMROF_STS));

View File

@@ -531,7 +531,7 @@ cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf)
f = pos & 0xff;
/* NEC CDR-260 speaks BCD. */
if (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01") || (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00"))) /*NEC*/
if ((dev->type == CDROM_TYPE_NEC_260_100) || (dev->type == CDROM_TYPE_NEC_260_101)) /*NEC*/
msf_from_bcd(&m, &s, &f);
if (pos == 0xffffff) {
@@ -545,7 +545,7 @@ cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf)
f = len & 0xff;
/* NEC CDR-260 speaks BCD. */
if (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01") || (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00"))) /*NEC*/
if ((dev->type == CDROM_TYPE_NEC_260_100) || (dev->type == CDROM_TYPE_NEC_260_101)) /*NEC*/
msf_from_bcd(&m, &s, &f);
len = MSFtoLBA(m, s, f) - 150;
@@ -571,7 +571,6 @@ cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf)
dev->cd_end = len;
dev->cd_status = CD_STATUS_PLAYING;
dev->cd_buflen = 0;
return 1;
}
@@ -624,6 +623,52 @@ cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit)
return 1;
}
uint8_t
cdrom_audio_track_search_pioneer(cdrom_t *dev, uint32_t pos, uint8_t playbit)
{
int m = 0;
int s = 0;
int f = 0;
if (dev->cd_status == CD_STATUS_DATA_ONLY)
return 0;
f = bcd2bin((pos >> 24) & 0xff);
s = bcd2bin((pos >> 16) & 0xff);
m = bcd2bin((pos >> 8) & 0xff);
if (pos == 0xffffffff) {
pos = dev->seek_pos;
} else
pos = MSFtoLBA(m, s, f) - 150;
dev->seek_pos = pos;
dev->cd_buflen = 0;
dev->cd_status = playbit ? CD_STATUS_PLAYING : CD_STATUS_PAUSED;
return 1;
}
uint8_t
cdrom_audio_play_pioneer(cdrom_t *dev, uint32_t pos)
{
int m = 0;
int s = 0;
int f = 0;
if (dev->cd_status == CD_STATUS_DATA_ONLY)
return 0;
f = bcd2bin((pos >> 24) & 0xff);
s = bcd2bin((pos >> 16) & 0xff);
m = bcd2bin((pos >> 8) & 0xff);
pos = MSFtoLBA(m, s, f) - 150;
dev->cd_end = pos;
dev->cd_buflen = 0;
dev->cd_status = CD_STATUS_PLAYING;
return 1;
}
uint8_t
cdrom_audio_play_toshiba(cdrom_t *dev, uint32_t pos, int type)
{
@@ -664,7 +709,6 @@ cdrom_audio_play_toshiba(cdrom_t *dev, uint32_t pos, int type)
/* Unlike standard commands, if there's a data track on an Audio CD (mixed mode)
the playback continues with the audio muted (Toshiba CD-ROM SCSI-2 manual reference). */
dev->cd_buflen = 0;
dev->cd_status = CD_STATUS_PLAYING;
return 1;
@@ -751,7 +795,7 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf)
ret = 0x13;
}
cdrom_log("CD-ROM %i: Returned subchannel at %02i:%02i.%02i, ret = %02x, seek pos = %08x, cd_end = %08x.\n", dev->id, subc.abs_m, subc.abs_s, subc.abs_f, ret, dev->seek_pos, dev->cd_end);
cdrom_log("CD-ROM %i: Returned subchannel absolute at %02i:%02i.%02i, relative at %02i:%02i.%02i, ret = %02x, seek pos = %08x, cd_end = %08x.\n", dev->id, subc.abs_m, subc.abs_s, subc.abs_f, subc.rel_m, subc.rel_s, subc.rel_f, ret, dev->seek_pos, dev->cd_end);
if (b[pos] > 1) {
cdrom_log("B[%i] = %02x, ret = %02x.\n", pos, b[pos], ret);
@@ -766,7 +810,7 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf)
b[pos] = 0;
/* NEC CDR-260 speaks BCD. */
if (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01") || (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00"))) /*NEC*/ {
if ((dev->type == CDROM_TYPE_NEC_260_100) || (dev->type == CDROM_TYPE_NEC_260_101)) { /*NEC*/
m = subc.abs_m;
s = subc.abs_s;
f = subc.abs_f;
@@ -785,7 +829,7 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf)
b[pos] = 0;
/* NEC CDR-260 speaks BCD. */
if (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01") || (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00"))) /*NEC*/ {
if ((dev->type == CDROM_TYPE_NEC_260_100) || (dev->type == CDROM_TYPE_NEC_260_101)) { /*NEC*/
m = subc.rel_m;
s = subc.rel_s;
f = subc.rel_f;
@@ -820,36 +864,62 @@ void
cdrom_get_current_subchannel_sony(cdrom_t *dev, uint8_t *b, int msf)
{
subchannel_t subc;
int pos = 0;
uint32_t dat;
dev->ops->get_subchannel(dev, dev->seek_pos, &subc);
cdrom_log("CD-ROM %i: Returned subchannel at %02i:%02i.%02i, seek pos = %08x, cd_end = %08x.\n", dev->id, subc.abs_m, subc.abs_s, subc.abs_f, dev->seek_pos, dev->cd_end);
cdrom_log("CD-ROM %i: Returned subchannel at %02i:%02i.%02i, seek pos = %08x, cd_end = %08x, msf = %x.\n", dev->id, subc.abs_m, subc.abs_s, subc.abs_f, dev->seek_pos, dev->cd_end, msf);
b[pos++] = subc.attr;
b[pos++] = subc.track;
b[pos++] = subc.index;
b[0] = subc.attr;
b[1] = subc.track;
b[2] = subc.index;
if (msf) {
b[pos++] = subc.rel_m;
b[pos++] = subc.rel_s;
b[pos++] = subc.rel_f;
b[pos++] = subc.abs_m;
b[pos++] = subc.abs_s;
b[pos++] = subc.abs_f;
b[3] = subc.rel_m;
b[4] = subc.rel_s;
b[5] = subc.rel_f;
b[6] = subc.abs_m;
b[7] = subc.abs_s;
b[8] = subc.abs_f;
} else {
dat = MSFtoLBA(subc.rel_m, subc.rel_s, subc.rel_f);
b[pos++] = (dat >> 16) & 0xff;
b[pos++] = (dat >> 8) & 0xff;
b[pos++] = dat & 0xff;
b[3] = (dat >> 16) & 0xff;
b[4] = (dat >> 8) & 0xff;
b[5] = dat & 0xff;
dat = MSFtoLBA(subc.abs_m, subc.abs_s, subc.abs_f) - 150;
b[pos++] = (dat >> 16) & 0xff;
b[pos++] = (dat >> 8) & 0xff;
b[pos++] = dat & 0xff;
b[6] = (dat >> 16) & 0xff;
b[7] = (dat >> 8) & 0xff;
b[8] = dat & 0xff;
}
}
uint8_t
cdrom_get_audio_status_pioneer(cdrom_t *dev, uint8_t *b)
{
uint8_t ret;
subchannel_t subc;
uint32_t dat;
dev->ops->get_subchannel(dev, dev->seek_pos, &subc);
if (dev->cd_status == CD_STATUS_DATA_ONLY)
ret = 0x05;
else {
if (dev->cd_status == CD_STATUS_PLAYING)
ret = dev->sound_on ? 0x00 : 0x02;
else if (dev->cd_status == CD_STATUS_PAUSED)
ret = 0x01;
else
ret = 0x03;
}
b[0] = 0;
b[1] = bin2bcd(subc.abs_m);
b[2] = bin2bcd(subc.abs_s);
b[3] = bin2bcd(subc.abs_f);
return ret;
}
uint8_t
cdrom_get_audio_status_sony(cdrom_t *dev, uint8_t *b, int msf)
@@ -887,17 +957,36 @@ cdrom_get_audio_status_sony(cdrom_t *dev, uint8_t *b, int msf)
return ret;
}
uint8_t
cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b)
void
cdrom_get_current_subcodeq(cdrom_t *dev, uint8_t *b)
{
uint8_t ret;
uint8_t ret;
subchannel_t subc;
dev->ops->get_subchannel(dev, dev->seek_pos, &subc);
cdrom_log("Get Current Subcode-q Play Status = %02x, op = %02x.\n", dev->cd_status, dev->audio_op);
b[0] = subc.attr;
b[1] = bin2bcd(subc.track);
b[2] = bin2bcd(subc.index);
b[3] = bin2bcd(subc.rel_m);
b[4] = bin2bcd(subc.rel_s);
b[5] = bin2bcd(subc.rel_f);
b[6] = bin2bcd(subc.abs_m);
b[7] = bin2bcd(subc.abs_s);
b[8] = bin2bcd(subc.abs_f);
}
if ((dev->cd_status == CD_STATUS_DATA_ONLY) || (dev->cd_status == CD_STATUS_PLAYING_COMPLETED))
uint8_t
cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b)
{
uint8_t ret;
subchannel_t subc;
dev->ops->get_subchannel(dev, dev->seek_pos, &subc);
if ((dev->cd_status == CD_STATUS_DATA_ONLY) ||
(dev->cd_status == CD_STATUS_PLAYING_COMPLETED) ||
(dev->cd_status == CD_STATUS_STOPPED))
ret = 0x03;
else
ret = (dev->cd_status == CD_STATUS_PLAYING) ? 0x00 : dev->audio_op;
@@ -957,9 +1046,7 @@ read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int m
/* No suitable starting track, return with error. */
if (first_track == -1) {
#ifdef ENABLE_CDROM_LOG
cdrom_log(" [ERROR] No suitable track found\n");
#endif
return -1;
}
@@ -976,7 +1063,7 @@ read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int m
b[len++] = 0;
/* NEC CDR-260 speaks BCD. */
if (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01") || (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00"))) { /*NEC*/
if ((dev->type == CDROM_TYPE_NEC_260_100) || (dev->type == CDROM_TYPE_NEC_260_101)) { /*NEC*/
m = ti.m;
s = ti.s;
f = ti.f;
@@ -1128,9 +1215,7 @@ read_toc_sony(cdrom_t *dev, unsigned char *b, unsigned char start_track, int msf
/* No suitable starting track, return with error. */
if (first_track == -1) {
#ifdef ENABLE_CDROM_LOG
cdrom_log(" [ERROR] No suitable track found\n");
#endif
return -1;
}
@@ -1138,8 +1223,8 @@ read_toc_sony(cdrom_t *dev, unsigned char *b, unsigned char start_track, int msf
cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
dev->ops->get_track_info(dev, i + 1, 0, &ti);
b[len++] = ti.attr;
b[len++] = ti.number; /* track number */
b[len++] = ti.attr;
if (msf) {
b[len++] = 0;
@@ -1154,7 +1239,6 @@ read_toc_sony(cdrom_t *dev, unsigned char *b, unsigned char start_track, int msf
b[len++] = temp;
}
}
return len;
}

View File

@@ -73,7 +73,7 @@ bin_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count)
track_file_t *tf = (track_file_t *) priv;
cdrom_image_backend_log("CDROM: binary_read(%08lx, pos=%" PRIu64 " count=%lu\n",
tf->file, seek, count);
tf->fp, seek, count);
if (tf->fp == NULL)
return 0;
@@ -101,14 +101,14 @@ bin_get_length(void *priv)
off64_t len;
track_file_t *tf = (track_file_t *) priv;
cdrom_image_backend_log("CDROM: binary_length(%08lx)\n", tf->file);
cdrom_image_backend_log("CDROM: binary_length(%08lx)\n", tf->fp);
if (tf->fp == NULL)
return 0;
fseeko64(tf->fp, 0, SEEK_END);
len = ftello64(tf->fp);
cdrom_image_backend_log("CDROM: binary_length(%08lx) = %" PRIu64 "\n", tf->file, len);
cdrom_image_backend_log("CDROM: binary_length(%08lx) = %" PRIu64 "\n", tf->fp, len);
return len;
}
@@ -145,7 +145,7 @@ bin_init(const char *filename, int *error)
memset(tf->fn, 0x00, sizeof(tf->fn));
strncpy(tf->fn, filename, sizeof(tf->fn) - 1);
tf->fp = plat_fopen64(tf->fn, "rb");
cdrom_image_backend_log("CDROM: binary_open(%s) = %08lx\n", tf->fn, tf->file);
cdrom_image_backend_log("CDROM: binary_open(%s) = %08lx\n", tf->fn, tf->fp);
if (stat(tf->fn, &stats) != 0) {
/* Use a blank structure if stat failed. */
@@ -332,6 +332,11 @@ cdi_get_track(cd_img_t *cdi, uint32_t sector)
for (int i = 0; i < (cdi->tracks_num - 1); i++) {
cur = &cdi->tracks[i];
next = &cdi->tracks[i + 1];
/* Take into account cue sheets that do not start on sector 0. */
if ((i == 0) && (sector < cur->start))
return cur->number;
if ((cur->start <= sector) && (sector < next->start))
return cur->number;
}
@@ -425,8 +430,9 @@ cdi_read_sector(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector)
return 1;
} else if (!raw && track_is_raw)
return trk->file->read(trk->file, buffer, seek + offset, length);
else
else {
return trk->file->read(trk->file, buffer, seek, length);
}
}
int

View File

@@ -33,6 +33,10 @@
#include <86box/plat.h>
#include <86box/sound.h>
#define MCD_DEFAULT_IOPORT 0x310
#define MCD_DEFAULT_IRQ 5
#define MCD_DEFAULT_DMA 5
#define RAW_SECTOR_SIZE 2352
#define COOKED_SECTOR_SIZE 2048
@@ -86,8 +90,9 @@ enum {
IRQ_ERROR = 4
};
typedef struct {
int dma, irq;
typedef struct mcd_t {
int dma;
int irq;
int change;
int data;
uint8_t stat;
@@ -244,6 +249,8 @@ mitsumi_cdrom_in(uint16_t port, void *priv)
ret |= FLAG_NOSTAT;
pclog("Read port 1: ret = %02x\n", ret | FLAG_UNK);
return ret | FLAG_UNK;
case 2:
break;
default:
break;
}
@@ -394,10 +401,10 @@ mitsumi_cdrom_out(uint16_t port, uint8_t val, void *priv)
}
break;
case CMD_GET_VER:
dev->cmdbuf[1] = 1;
dev->cmdbuf[2] = 'D';
dev->cmdbuf[3] = 0;
dev->cmdbuf_count = 4;
dev->cmdbuf[0] = 1;
dev->cmdbuf[1] = 'D';
dev->cmdbuf[2] = 0;
dev->cmdbuf_count = 3;
break;
case CMD_EJECT:
cdrom_stop(&cdrom);
@@ -419,6 +426,8 @@ mitsumi_cdrom_out(uint16_t port, uint8_t val, void *priv)
case 1:
mitsumi_cdrom_reset(dev);
break;
case 2:
break;
default:
break;
}
@@ -432,10 +441,10 @@ mitsumi_cdrom_init(UNUSED(const device_t *info))
dev = malloc(sizeof(mcd_t));
memset(dev, 0x00, sizeof(mcd_t));
dev->irq = 5;
dev->dma = 5;
dev->irq = MCD_DEFAULT_IRQ;
dev->dma = MCD_DEFAULT_DMA;
io_sethandler(0x310, 2,
io_sethandler(MCD_DEFAULT_IOPORT, 3,
mitsumi_cdrom_in, NULL, NULL, mitsumi_cdrom_out, NULL, NULL, dev);
mitsumi_cdrom_reset(dev);

View File

@@ -510,7 +510,7 @@ load_machine(void)
cpu_use_dynarec = !!ini_section_get_int(cat, "cpu_use_dynarec", 0);
fpu_softfloat = !!ini_section_get_int(cat, "fpu_softfloat", 0);
if (machine_has_flags(machine, MACHINE_SOFTFLOAT_ONLY))
if ((fpu_type != FPU_NONE) && machine_has_flags(machine, MACHINE_SOFTFLOAT_ONLY))
fpu_softfloat = 1;
p = ini_section_get_string(cat, "time_sync", NULL);
@@ -1804,7 +1804,7 @@ load_other_removable_devices(void)
if (p[0] != 0x00) {
if (path_abs(p)) {
if (strlen(p) > 511)
fatal("load_other_removable_devices(): strlen(p) > 511 (mo_drives[%i].image_path)\n",
fatal("load_other_removable_devices(): strlen(p) > 511 (mo_drives[%i].image_path)\n",
c);
else
strncpy(mo_drives[c].image_path, p, 511);

View File

@@ -140,13 +140,13 @@ static uint8_t ide_ter_pnp_rom[] = {
0x15, 0x09, 0xf8, 0x00, 0x01, 0x00, /* logical device BOX0001 */
0x1c, 0x41, 0xd0, 0x06, 0x00, /* compatible device PNP0600 */
0x31, 0x00, /* start dependent functions, preferred */
0x22, 0x00, 0x04, /* IRQ 10 */
0x47, 0x01, 0x68, 0x01, 0x68, 0x01, 0x01, 0x08, /* I/O 0x168, decodes 16-bit, 1-byte alignment, 8 addresses */
0x47, 0x01, 0x6e, 0x03, 0x6e, 0x03, 0x01, 0x01, /* I/O 0x36E, decodes 16-bit, 1-byte alignment, 1 address */
0x22, 0x00, 0x08, /* IRQ 11 */
0x47, 0x01, 0xe8, 0x01, 0xe8, 0x01, 0x01, 0x08, /* I/O 0x1E8, decodes 16-bit, 1-byte alignment, 8 addresses */
0x47, 0x01, 0xee, 0x03, 0xee, 0x03, 0x01, 0x01, /* I/O 0x3EE, decodes 16-bit, 1-byte alignment, 1 address */
0x30, /* start dependent functions, acceptable */
0x22, 0xb8, 0x1e, /* IRQ 3/4/5/7/9/10/11/12 */
0x47, 0x01, 0x68, 0x01, 0x68, 0x01, 0x01, 0x08, /* I/O 0x168, decodes 16-bit, 1-byte alignment, 8 addresses */
0x47, 0x01, 0x6e, 0x03, 0x6e, 0x03, 0x01, 0x01, /* I/O 0x36E, decodes 16-bit, 1-byte alignment, 1 address */
0x47, 0x01, 0xe8, 0x01, 0xe8, 0x01, 0x01, 0x08, /* I/O 0x1E8, decodes 16-bit, 1-byte alignment, 8 addresses */
0x47, 0x01, 0xee, 0x03, 0xee, 0x03, 0x01, 0x01, /* I/O 0x3EE, decodes 16-bit, 1-byte alignment, 1 address */
0x30, /* start dependent functions, acceptable */
0x22, 0xb8, 0x1e, /* IRQ 3/4/5/7/9/10/11/12 */
0x47, 0x01, 0x00, 0x01, 0xf8, 0xff, 0x08, 0x08, /* I/O 0x100-0xFFF8, decodes 16-bit, 8-byte alignment, 8 addresses */
@@ -163,13 +163,13 @@ static uint8_t ide_qua_pnp_rom[] = {
0x15, 0x09, 0xf8, 0x00, 0x01, 0x00, /* logical device BOX0001 */
0x1c, 0x41, 0xd0, 0x06, 0x00, /* compatible device PNP0600 */
0x31, 0x00, /* start dependent functions, preferred */
0x22, 0x00, 0x08, /* IRQ 11 */
0x47, 0x01, 0xe8, 0x01, 0xe8, 0x01, 0x01, 0x08, /* I/O 0x1E8, decodes 16-bit, 1-byte alignment, 8 addresses */
0x47, 0x01, 0xee, 0x03, 0xee, 0x03, 0x01, 0x01, /* I/O 0x3EE, decodes 16-bit, 1-byte alignment, 1 address */
0x22, 0x00, 0x04, /* IRQ 10 */
0x47, 0x01, 0x68, 0x01, 0x68, 0x01, 0x01, 0x08, /* I/O 0x168, decodes 16-bit, 1-byte alignment, 8 addresses */
0x47, 0x01, 0x6e, 0x03, 0x6e, 0x03, 0x01, 0x01, /* I/O 0x36E, decodes 16-bit, 1-byte alignment, 1 address */
0x30, /* start dependent functions, acceptable */
0x22, 0xb8, 0x1e, /* IRQ 3/4/5/7/9/10/11/12 */
0x47, 0x01, 0xe8, 0x01, 0xe8, 0x01, 0x01, 0x08, /* I/O 0x1E8, decodes 16-bit, 1-byte alignment, 8 addresses */
0x47, 0x01, 0xee, 0x03, 0xee, 0x03, 0x01, 0x01, /* I/O 0x3EE, decodes 16-bit, 1-byte alignment, 1 address */
0x47, 0x01, 0x68, 0x01, 0x68, 0x01, 0x01, 0x08, /* I/O 0x168, decodes 16-bit, 1-byte alignment, 8 addresses */
0x47, 0x01, 0x6e, 0x03, 0x6e, 0x03, 0x01, 0x01, /* I/O 0x36E, decodes 16-bit, 1-byte alignment, 1 address */
0x30, /* start dependent functions, acceptable */
0x22, 0xb8, 0x1e, /* IRQ 3/4/5/7/9/10/11/12 */
0x47, 0x01, 0x00, 0x01, 0xf8, 0xff, 0x08, 0x08, /* I/O 0x100-0xFFF8, decodes 16-bit, 8-byte alignment, 8 addresses */
@@ -2979,7 +2979,7 @@ ide_ter_init(const device_t *info)
if (irq == -1)
isapnp_add_card(ide_ter_pnp_rom, sizeof(ide_ter_pnp_rom), ide_pnp_config_changed, NULL, NULL, NULL, (void *) 2);
} else {
ide_board_init(2, irq, 0x168, 0x36e, 0);
ide_board_init(2, irq, HDC_TERTIARY_BASE, HDC_TERTIARY_SIDE, 0);
}
return (ide_boards[2]);
@@ -3010,7 +3010,7 @@ ide_qua_init(const device_t *info)
if (irq == -1)
isapnp_add_card(ide_qua_pnp_rom, sizeof(ide_qua_pnp_rom), ide_pnp_config_changed, NULL, NULL, NULL, (void *) 3);
} else {
ide_board_init(3, irq, 0x1e8, 0x3ee, 0);
ide_board_init(3, irq, HDC_QUATERNARY_BASE, HDC_QUATERNARY_SIDE, 0);
}
return (ide_boards[3]);
@@ -3239,7 +3239,7 @@ static const device_config_t ide_ter_config[] = {
.description = "IRQ",
.type = CONFIG_SELECTION,
.default_string = "",
.default_int = 10,
.default_int = HDC_TERTIARY_IRQ,
.file_filter = "",
.spinner = { 0 },
.selection = {
@@ -3265,7 +3265,7 @@ static const device_config_t ide_qua_config[] = {
.description = "IRQ",
.type = CONFIG_SELECTION,
.default_string = "",
.default_int = 11,
.default_int = HDC_QUATERNARY_IRQ,
.file_filter = "",
.spinner = { 0 },
.selection = {

View File

@@ -222,8 +222,10 @@ static char target_xml[] = /* QEMU gdb-xml/i386-32bit.xml with modificati
"<reg name=\"fs\" bitsize=\"16\" type=\"int32\"/>"
"<reg name=\"gs\" bitsize=\"16\" type=\"int32\"/>"
""
#if 0
"<reg name=\"fs_base\" bitsize=\"32\" type=\"int32\"/>"
"<reg name=\"gs_base\" bitsize=\"32\" type=\"int32\"/>"
#endif
""
"<flags id=\"i386_cr0\" size=\"4\">"
"<field name=\"PG\" start=\"31\" end=\"31\"/>"
@@ -548,10 +550,12 @@ gdbstub_client_write_reg(int index, uint8_t *buf)
flushmmucache();
break;
#if 0
case GDB_REG_FS_BASE ... GDB_REG_GS_BASE:
/* Do what qemu does and just load the base. */
segment_regs[(index - 16) + (GDB_REG_FS - GDB_REG_CS)]->base = *((uint32_t *) buf);
break;
#endif
case GDB_REG_CR0 ... GDB_REG_CR4:
*cr_regs[index - GDB_REG_CR0] = *((uint32_t *) buf);
@@ -627,10 +631,10 @@ gdbstub_client_respond(gdbstub_client_t *client)
/* Send response packet. */
client->response[client->response_pos] = '\0';
#ifdef ENABLE_GDBSTUB_LOG
i = client->response[995]; /* pclog_ex buffer too small */
client->response[995] = '\0';
i = client->response[994]; /* pclog_ex buffer too small */
client->response[994] = '\0';
gdbstub_log("GDB Stub: Sending response: %s\n", client->response);
client->response[995] = i;
client->response[994] = i;
#endif
send(client->socket, "$", 1, 0);
send(client->socket, client->response, client->response_pos, 0);
@@ -1096,7 +1100,7 @@ e00:
} else if (!strcmp(client->response, "C")) {
FAST_RESPONSE("QC1");
} else if (!strcmp(client->response, "fThreadInfo")) {
FAST_RESPONSE("m 1");
FAST_RESPONSE("m1");
} else if (!strcmp(client->response, "sThreadInfo")) {
FAST_RESPONSE("l");
} else if (!strcmp(client->response, "Rcmd")) {
@@ -1344,7 +1348,7 @@ unknown:
/* Flag this watchpoint's corresponding pages as having a watchpoint. */
k = (breakpoint->end - 1) >> MEM_GRANULARITY_BITS;
for (i = breakpoint->addr >> MEM_GRANULARITY_BITS; i <= k; i++)
gdbstub_watch_pages[i >> 6] |= (1 << (i & 63));
gdbstub_watch_pages[i >> 6] |= (1ULL << (i & 63));
breakpoint = breakpoint->next;
} else {
@@ -1748,8 +1752,10 @@ gdbstub_mem_access(uint32_t *addrs, int access)
if (watchpoint) {
/* Check if any component of this address is within the breakpoint's range. */
for (i = 0; i < width; i++) {
if ((addrs[i] >= watchpoint->addr) && (addrs[i] < watchpoint->end))
if ((addrs[i] >= watchpoint->addr) && (addrs[i] < watchpoint->end)) {
watch_addr = addrs[i];
break;
}
}
if (i < width) {
gdbstub_log("GDB Stub: %s watchpoint at %08X\n", (access & GDBSTUB_MEM_AWATCH) ? "Access" : ((access & GDBSTUB_MEM_WRITE) ? "Write" : "Read"), watch_addr);

View File

@@ -15,7 +15,7 @@
#ifndef EMU_CDROM_H
#define EMU_CDROM_H
#define CDROM_NUM 4
#define CDROM_NUM 8
#define CD_STATUS_EMPTY 0
#define CD_STATUS_DATA_ONLY 1
@@ -60,7 +60,53 @@ enum {
CDROM_BUS_USB = 8
};
#define KNOWN_CDROM_DRIVE_TYPES 35
enum
{
CDROM_TYPE_86BOX_100,
CDROM_TYPE_AZT_CDA46802I_115,
CDROM_TYPE_BTC_BCD36XH_U10,
CDROM_TYPE_GOLDSTAR_CRD_8160B_314,
CDROM_TYPE_HITACHI_CDR_8130_0020,
CDROM_TYPE_KENWOOD_UCR_421_208E,
CDROM_TYPE_MATSHITA_587_7S13,
CDROM_TYPE_MATSHITA_588_LS15,
CDROM_TYPE_MATSHITA_571_10e,
CDROM_TYPE_MATSHITA_572_10j,
CDROM_TYPE_MITSUMI_FX4820T_D02A,
CDROM_TYPE_NEC_260_100,
CDROM_TYPE_NEC_260_101,
CDROM_TYPE_NEC_273_420,
CDROM_TYPE_NEC_280_105,
CDROM_TYPE_NEC_280_308,
CDROM_TYPE_PHILIPS_PCA403CD_U31P,
CDROM_TYPE_SONY_CDU76_10i,
CDROM_TYPE_SONY_CDU311_30h,
CDROM_TYPE_TOSHIBA_5302TA_0305,
CDROM_TYPE_TOSHIBA_5702B_TA70,
CDROM_TYPE_CHINON_CDS431_H42,
CDROM_TYPE_DEC_RRD45_0436,
CDROM_TYPE_MATSHITA_501_10b,
CDROM_TYPE_NEC_38_103,
CDROM_TYPE_NEC_211_100,
CDROM_TYPE_NEC_464_105,
CDROM_TYPE_SONY_CDU541_10i,
CDROM_TYPE_SONY_CDU561_18k,
CDROM_TYPE_SONY_CDU76S_100,
CDROM_TYPE_PHILIPS_CDD2600_107,
CDROM_TYPE_PIONEER_DRM604X_2403,
CDROM_TYPE_PLEXTOR_PX32TS_103,
CDROM_TYPE_TEAC_CD50_100,
CDROM_TYPE_TEAC_R55S_10R,
CDROM_TYPE_TEXEL_DMXX24_100,
CDROM_TYPE_TOSHIBA_XM_3433,
CDROM_TYPE_TOSHIBA_XM3201B_3232,
CDROM_TYPE_TOSHIBA_XM3301TA_0272,
CDROM_TYPE_TOSHIBA_XM5701TA_3136,
CDROM_TYPE_TOSHIBA_SDM1401_1008,
CDROM_TYPES_NUM
};
#define KNOWN_CDROM_DRIVE_TYPES CDROM_TYPES_NUM
#define BUS_TYPE_IDE CDROM_BUS_ATAPI
#define BUS_TYPE_SCSI CDROM_BUS_SCSI
#define BUS_TYPE_BOTH -2
@@ -75,42 +121,48 @@ static const struct
const char *internal_name;
const int bus_type;
} cdrom_drive_types[] = {
{ "86BOX", "CD-ROM", "1.00", "(ATAPI/SCSI) 86BOX CD-ROM 1.00", "86BOX_CD-ROM_1.00", BUS_TYPE_BOTH }, /*1*/
{ "AZT", "CDA46802I", "1.15", "(ATAPI) AZT CDA46802I 1.15", "AZT_CDA46802I_1.15", BUS_TYPE_IDE }, /*2*/
{ "BTC", "CD-ROM BCD36XH", "U1.0", "(ATAPI) BTC CD-ROM BCD36XH U1.0", "BTC_CD-ROM_BCD36XH_U1.0", BUS_TYPE_IDE }, /*3*/
{ "GOLDSTAR", "CRD-8160B", "3.14", "(ATAPI) GOLDSTAR CRD-8160B 3.14", "GOLDSTAR_CRD-8160B_3.14", BUS_TYPE_IDE }, /*4*/
{ "HITACHI", "CDR-8130", "0020", "(ATAPI) HITACHI CDR-8130 0020", "HITACHI_CDR-8130_0020", BUS_TYPE_IDE }, /*5*/
{ "KENWOOD", "CD-ROM UCR-421", "208E", "(ATAPI) KENWOOD CD-ROM UCR-421 208E", "KENWOOD_CD-ROM_UCR-421_208E", BUS_TYPE_IDE }, /*6*/
{ "MATSHITA", "CD-ROM CR-587", "7S13", "(ATAPI) MATSHITA CD-ROM CR-587 7S13", "MATSHITA_CD-ROM_CR-587_7S13", BUS_TYPE_IDE }, /*7*/
{ "MATSHITA", "CD-ROM CR-588", "LS15", "(ATAPI) MATSHITA CD-ROM CR-588 LS15", "MATSHITA_CD-ROM_CR-588_LS15", BUS_TYPE_IDE }, /*8*/
{ "MATSHITA", "CR-571", "1.0e", "(ATAPI) MATSHITA CR-571 1.0e", "MATSHITA_CR-571_1.0e", BUS_TYPE_IDE }, /*9*/
{ "MATSHITA", "CR-572", "1.0j", "(ATAPI) MATSHITA CR-572 1.0j", "MATSHITA_CR-572_1.0j", BUS_TYPE_IDE }, /*10*/
{ "MITSUMI", "CRMC-FX4820T", "D02A", "(ATAPI) MITSUMI CRMC-FX4820T D02A", "MITSUMI_CRMC-FX4820T_D02A", BUS_TYPE_IDE }, /*11*/
{ "NEC", "CD-ROM DRIVE:260", "1.00", "(ATAPI) NEC CD-ROM DRIVE:260 1.00", "NEC_CD-ROM_DRIVE260_1.00", BUS_TYPE_IDE }, /*12*/
{ "NEC", "CD-ROM DRIVE:260", "1.01", "(ATAPI) NEC CD-ROM DRIVE:260 1.01", "NEC_CD-ROM_DRIVE260_1.01", BUS_TYPE_IDE }, /*13*/
{ "NEC", "CD-ROM DRIVE:273", "4.20", "(ATAPI) NEC CD-ROM DRIVE:273 4.20", "NEC_CD-ROM_DRIVE273_4.20", BUS_TYPE_IDE }, /*14*/
{ "NEC", "CD-ROM DRIVE:280", "1.05", "(ATAPI) NEC CD-ROM DRIVE:280 1.05", "NEC_CD-ROM_DRIVE280_1.05", BUS_TYPE_IDE }, /*15*/
{ "NEC", "CD-ROM DRIVE:280", "3.08", "(ATAPI) NEC CD-ROM DRIVE:280 3.08", "NEC_CD-ROM_DRIVE280_3.08", BUS_TYPE_IDE }, /*16*/
{ "PHILIPS", "CD-ROM PCA403CD", "U31P", "(ATAPI) PHILIPS CD-ROM PCA403CD U31P", "PHILIPS_CD-ROM_PCA403CD_U31P", BUS_TYPE_IDE }, /*17*/
{ "SONY", "CD-ROM CDU76", "1.0i", "(ATAPI) SONY CD-ROM CDU76 1.0i", "SONY_CD-ROM_CDU76_1.0i", BUS_TYPE_IDE }, /*18*/
{ "SONY", "CD-ROM CDU311", "3.0h", "(ATAPI) SONY CD-ROM CDU311 3.0h", "SONY_CD-ROM_CDU311_3.0h", BUS_TYPE_IDE }, /*19*/
{ "TOSHIBA", "CD-ROM XM-5302TA", "0305", "(ATAPI) TOSHIBA CD-ROM XM-5302TA 0305", "TOSHIBA_CD-ROM_XM-5302TA_0305", BUS_TYPE_IDE }, /*20*/
{ "TOSHIBA", "CD-ROM XM-5702B", "TA70", "(ATAPI) TOSHIBA CD-ROM XM-5702B TA70", "TOSHIBA_CD-ROM_XM-5702B_TA70", BUS_TYPE_IDE }, /*21*/
{ "CHINON", "CD-ROM CDS-431", "H42 ", "(SCSI) CHINON CD-ROM CDS-431 H42", "CHINON_CD-ROM_CDS-431_H42", BUS_TYPE_SCSI }, /*22*/
{ "DEC", "RRD45 (C) DEC", "0436", "(SCSI) DEC RRD45 0436", "DEC_RRD45_0436", BUS_TYPE_SCSI }, /*23*/
{ "MATSHITA", "CD-ROM CR-501", "1.0b", "(SCSI) MATSHITA CD-ROM CR-501 1.0b", "MATSHITA_CD-ROM_CR-501_1.0b", BUS_TYPE_SCSI }, /*24*/
{ "NEC", "CD-ROM DRIVE:75", "1.00", "(SCSI) NEC CD-ROM DRIVE:75 1.00", "NEC_CD-ROM_DRIVE75_1.00", BUS_TYPE_SCSI }, /*25*/
{ "NEC", "CD-ROM DRIVE:464", "1.05", "(SCSI) NEC CD-ROM DRIVE:464 1.05", "NEC_CD-ROM_DRIVE464_1.05", BUS_TYPE_SCSI }, /*26*/
{ "SONY", "CD-ROM CDU-541", "1.0i", "(SCSI) SONY CD-ROM CDU-541 1.0i", "SONY_CD-ROM_CDU-541_1.0i", BUS_TYPE_SCSI }, /*27*/
{ "SONY", "CD-ROM CDU-76S", "1.00", "(SCSI) SONY CD-ROM CDU-76S 1.00", "SONY_CD-ROM_CDU-76S_1.00", BUS_TYPE_SCSI }, /*28*/
{ "PHILIPS", "CDD2600", "1.07", "(SCSI) PHILIPS CDD2600 1.07", "PHILIPS_CDD2600_1.07", BUS_TYPE_SCSI }, /*29*/
{ "PIONEER", "CD-ROM DRM-604X", "2403", "(SCSI) PIONEER CD-ROM DRM-604X 2403", "PIONEER_CD-ROM_DRM-604X_2403", BUS_TYPE_SCSI }, /*30*/
{ "PLEXTOR", "CD-ROM PX-32TS", "1.03", "(SCSI) PLEXTOR CD-ROM PX-32TS 1.03", "PLEXTOR_CD-ROM_PX-32TS_1.03", BUS_TYPE_SCSI }, /*31*/
{ "TEAC", "CD-R55S", "1.0R", "(SCSI) TEAC CD-R55S 1.0R", "TEAC_CD-R55S_1.0R", BUS_TYPE_SCSI }, /*32*/
{ "TOSHIBA", "CD-ROM DRIVE:XM", "3433", "(SCSI) TOSHIBA CD-ROM DRIVE:XM 3433", "TOSHIBA_CD-ROM_DRIVEXM_3433", BUS_TYPE_SCSI }, /*33*/
{ "TOSHIBA", "CD-ROM XM-3301TA", "0272", "(SCSI) TOSHIBA CD-ROM XM-3301TA 0272", "TOSHIBA_CD-ROM_XM-3301TA_0272", BUS_TYPE_SCSI }, /*34*/
{ "TOSHIBA", "CD-ROM XM-5701TA", "3136", "(SCSI) TOSHIBA CD-ROM XM-5701TA 3136", "TOSHIBA_CD-ROM_XM-5701TA_3136", BUS_TYPE_SCSI }, /*35*/
{ "", "", "", "", "", BUS_TYPE_NONE },
{ "86BOX", "CD-ROM", "1.00", "86BOX CD-ROM 1.00", "86BOX_CD-ROM_1.00", BUS_TYPE_BOTH }, /*1*/
{ "AZT", "CDA46802I", "1.15", "AZT CDA46802I 1.15", "AZT_CDA46802I_1.15", BUS_TYPE_IDE }, /*2*/
{ "BTC", "CD-ROM BCD36XH", "U1.0", "BTC CD-ROM BCD36XH U1.0", "BTC_CD-ROM_BCD36XH_U1.0", BUS_TYPE_IDE }, /*3*/
{ "GOLDSTAR", "CRD-8160B", "3.14", "GOLDSTAR CRD-8160B 3.14", "GOLDSTAR_CRD-8160B_3.14", BUS_TYPE_IDE }, /*4*/
{ "HITACHI", "CDR-8130", "0020", "HITACHI CDR-8130 0020", "HITACHI_CDR-8130_0020", BUS_TYPE_IDE }, /*5*/
{ "KENWOOD", "CD-ROM UCR-421", "208E", "KENWOOD CD-ROM UCR-421 208E", "KENWOOD_CD-ROM_UCR-421_208E", BUS_TYPE_IDE }, /*6*/
{ "MATSHITA", "CD-ROM CR-587", "7S13", "MATSHITA CD-ROM CR-587 7S13", "MATSHITA_CD-ROM_CR-587_7S13", BUS_TYPE_IDE }, /*7*/
{ "MATSHITA", "CD-ROM CR-588", "LS15", "MATSHITA CD-ROM CR-588 LS15", "MATSHITA_CD-ROM_CR-588_LS15", BUS_TYPE_IDE }, /*8*/
{ "MATSHITA", "CR-571", "1.0e", "MATSHITA CR-571 1.0e", "MATSHITA_CR-571_1.0e", BUS_TYPE_IDE }, /*9*/
{ "MATSHITA", "CR-572", "1.0j", "MATSHITA CR-572 1.0j", "MATSHITA_CR-572_1.0j", BUS_TYPE_IDE }, /*10*/
{ "MITSUMI", "CRMC-FX4820T", "D02A", "MITSUMI CRMC-FX4820T D02A", "MITSUMI_CRMC-FX4820T_D02A", BUS_TYPE_IDE }, /*11*/
{ "NEC", "CD-ROM DRIVE:260", "1.00", "NEC CD-ROM DRIVE:260 1.00", "NEC_CD-ROM_DRIVE260_1.00", BUS_TYPE_IDE }, /*12*/
{ "NEC", "CD-ROM DRIVE:260", "1.01", "NEC CD-ROM DRIVE:260 1.01", "NEC_CD-ROM_DRIVE260_1.01", BUS_TYPE_IDE }, /*13*/
{ "NEC", "CD-ROM DRIVE:273", "4.20", "NEC CD-ROM DRIVE:273 4.20", "NEC_CD-ROM_DRIVE273_4.20", BUS_TYPE_IDE }, /*14*/
{ "NEC", "CD-ROM DRIVE:280", "1.05", "NEC CD-ROM DRIVE:280 1.05", "NEC_CD-ROM_DRIVE280_1.05", BUS_TYPE_IDE }, /*15*/
{ "NEC", "CD-ROM DRIVE:280", "3.08", "NEC CD-ROM DRIVE:280 3.08", "NEC_CD-ROM_DRIVE280_3.08", BUS_TYPE_IDE }, /*16*/
{ "PHILIPS", "CD-ROM PCA403CD", "U31P", "PHILIPS CD-ROM PCA403CD U31P", "PHILIPS_CD-ROM_PCA403CD_U31P", BUS_TYPE_IDE }, /*17*/
{ "SONY", "CD-ROM CDU76", "1.0i", "SONY CD-ROM CDU76 1.0i", "SONY_CD-ROM_CDU76_1.0i", BUS_TYPE_IDE }, /*18*/
{ "SONY", "CD-ROM CDU311", "3.0h", "SONY CD-ROM CDU311 3.0h", "SONY_CD-ROM_CDU311_3.0h", BUS_TYPE_IDE }, /*19*/
{ "TOSHIBA", "CD-ROM XM-5302TA", "0305", "TOSHIBA CD-ROM XM-5302TA 0305", "TOSHIBA_CD-ROM_XM-5302TA_0305", BUS_TYPE_IDE }, /*20*/
{ "TOSHIBA", "CD-ROM XM-5702B", "TA70", "TOSHIBA CD-ROM XM-5702B TA70", "TOSHIBA_CD-ROM_XM-5702B_TA70", BUS_TYPE_IDE }, /*21*/
{ "CHINON", "CD-ROM CDS-431", "H42 ", "CHINON CD-ROM CDS-431 H42", "CHINON_CD-ROM_CDS-431_H42", BUS_TYPE_SCSI }, /*22*/
{ "DEC", "RRD45 (C) DEC", "0436", "DEC RRD45 0436", "DEC_RRD45_0436", BUS_TYPE_SCSI }, /*23*/
{ "MATSHITA", "CD-ROM CR-501", "1.0b", "MATSHITA CD-ROM CR-501 1.0b", "MATSHITA_CD-ROM_CR-501_1.0b", BUS_TYPE_SCSI }, /*24*/
{ "NEC", "CD-ROM DRIVE:38", "1.03", "NEC CD-ROM DRIVE:38 1.03", "NEC_CD-ROM_DRIVE38_1.03", BUS_TYPE_SCSI }, /*25*/
{ "NEC", "CD-ROM DRIVE:211", "1.00", "NEC CD-ROM DRIVE:211 1.00", "NEC_CD-ROM_DRIVE211_1.00", BUS_TYPE_SCSI }, /*26*/
{ "NEC", "CD-ROM DRIVE:464", "1.05", "NEC CD-ROM DRIVE:464 1.05", "NEC_CD-ROM_DRIVE464_1.05", BUS_TYPE_SCSI }, /*27*/
{ "SONY", "CD-ROM CDU-541", "1.0i", "SONY CD-ROM CDU-541 1.0i", "SONY_CD-ROM_CDU-541_1.0i", BUS_TYPE_SCSI }, /*28*/
{ "SONY", "CD-ROM CDU-561", "1.8k", "SONY CD-ROM CDU-561 1.8k", "SONY_CD-ROM_CDU-561_1.8k", BUS_TYPE_SCSI }, /*29*/
{ "SONY", "CD-ROM CDU-76S", "1.00", "SONY CD-ROM CDU-76S 1.00", "SONY_CD-ROM_CDU-76S_1.00", BUS_TYPE_SCSI }, /*30*/
{ "PHILIPS", "CDD2600", "1.07", "PHILIPS CDD2600 1.07", "PHILIPS_CDD2600_1.07", BUS_TYPE_SCSI }, /*31*/
{ "PIONEER", "CD-ROM DRM-604X", "2403", "PIONEER CD-ROM DRM-604X 2403", "PIONEER_CD-ROM_DRM-604X_2403", BUS_TYPE_SCSI }, /*32*/
{ "PLEXTOR", "CD-ROM PX-32TS", "1.03", "PLEXTOR CD-ROM PX-32TS 1.03", "PLEXTOR_CD-ROM_PX-32TS_1.03", BUS_TYPE_SCSI }, /*33*/
{ "TEAC", "CD 50", "1.00", "TEAC CD 50 1.00", "TEAC_CD_50_1.00", BUS_TYPE_SCSI }, /*34*/
{ "TEAC", "CD-ROM R55S", "1.0R", "TEAC CD-ROM R55S 1.0R", "TEAC_CD-ROM_R55S_1.0R", BUS_TYPE_SCSI }, /*35*/
{ "TEXEL", "CD-ROM DM-XX24", "1.00", "TEXEL CD-ROM DM-XX24 1.00", "TEXEL_CD-ROM_DM-XX24_1.00", BUS_TYPE_SCSI }, /*36*/
{ "TOSHIBA", "CD-ROM DRIVE:XM", "3433", "TOSHIBA CD-ROM DRIVE:XM 3433", "TOSHIBA_CD-ROM_DRIVEXM_3433", BUS_TYPE_SCSI }, /*37*/
{ "TOSHIBA", "CD-ROM XM-3201B", "3232", "TOSHIBA CD-ROM XM-3201B 3232", "TOSHIBA_CD-ROM_XM-3201B_3232", BUS_TYPE_SCSI }, /*38*/
{ "TOSHIBA", "CD-ROM XM-3301TA", "0272", "TOSHIBA CD-ROM XM-3301TA 0272", "TOSHIBA_CD-ROM_XM-3301TA_0272", BUS_TYPE_SCSI }, /*39*/
{ "TOSHIBA", "CD-ROM XM-5701TA", "3136", "TOSHIBA CD-ROM XM-5701TA 3136", "TOSHIBA_CD-ROM_XM-5701TA_3136", BUS_TYPE_SCSI }, /*40*/
{ "TOSHIBA", "DVD-ROM SD-M1401", "1008", "TOSHIBA DVD-ROM SD-M1401 1008", "TOSHIBA_DVD-ROM_SD-M1401_1008", BUS_TYPE_SCSI }, /*41*/
{ "", "", "", "", "", BUS_TYPE_NONE },
};
/* To shut up the GCC compilers. */
@@ -186,6 +238,7 @@ typedef struct cdrom {
int prev_host_drive;
int cd_buflen;
int audio_op;
int sony_msf;
const cdrom_ops_t *ops;
@@ -193,8 +246,8 @@ typedef struct cdrom {
void (*insert)(void *priv);
void (*close)(void *priv);
uint32_t (*get_volume)(void *priv, int channel);
uint32_t (*get_channel)(void *priv, int channel);
uint32_t (*get_volume)(void *p, int channel);
uint32_t (*get_channel)(void *p, int channel);
int16_t cd_buffer[BUF_SIZE];
} cdrom_t;
@@ -215,12 +268,16 @@ extern int cdrom_is_pre(cdrom_t *dev, uint32_t lba);
extern int cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len);
extern uint8_t cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf);
extern uint8_t cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit);
extern uint8_t cdrom_audio_track_search_pioneer(cdrom_t *dev, uint32_t pos, uint8_t playbit);
extern uint8_t cdrom_audio_play_pioneer(cdrom_t *dev, uint32_t pos);
extern uint8_t cdrom_audio_play_toshiba(cdrom_t *dev, uint32_t pos, int type);
extern void cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume);
extern uint8_t cdrom_audio_scan(cdrom_t *dev, uint32_t pos, int type);
extern uint8_t cdrom_get_audio_status_pioneer(cdrom_t *dev, uint8_t *b);
extern uint8_t cdrom_get_audio_status_sony(cdrom_t *dev, uint8_t *b, int msf);
extern uint8_t cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf);
extern void cdrom_get_current_subchannel_sony(cdrom_t *dev, uint8_t *b, int msf);
extern void cdrom_get_current_subcodeq(cdrom_t *dev, uint8_t *b);
extern uint8_t cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b);
extern int cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type,
unsigned char start_track, int msf, int max_len);
@@ -243,6 +300,10 @@ extern int cdrom_image_open(cdrom_t *dev, const char *fn);
extern void cdrom_image_close(cdrom_t *dev);
extern void cdrom_image_reset(cdrom_t *dev);
extern void cdrom_ioctl_eject(void);
extern void cdrom_ioctl_load(void);
extern int cdrom_ioctl_open(cdrom_t *dev, const char d);
extern void cdrom_update_cdb(uint8_t *cdb, int lba_pos,
int number_of_blocks);

View File

@@ -36,19 +36,19 @@ enum {
#ifdef USE_GDBSTUB
# define GDBSTUB_MEM_ACCESS(addr, access, width) \
uint32_t gdbstub_page = addr >> MEM_GRANULARITY_BITS; \
if (gdbstub_watch_pages[gdbstub_page >> 6] & (1 << (gdbstub_page & 63))) { \
uint32_t gdbstub_addrs[width]; \
for (int gdbstub_i = 0; gdbstub_i < width; gdbstub_i++) \
gdbstub_addrs[gdbstub_i] = addr + gdbstub_i; \
gdbstub_mem_access(gdbstub_addrs, access | width); \
# define GDBSTUB_MEM_ACCESS(addr, access, width) \
uint32_t gdbstub_page = (addr) >> MEM_GRANULARITY_BITS; \
if (gdbstub_watch_pages[gdbstub_page >> 6] & (1ULL << (gdbstub_page & 63))) { \
uint32_t gdbstub_addrs[(width)]; \
for (int gdbstub_i = 0; gdbstub_i < (width); gdbstub_i++) \
gdbstub_addrs[gdbstub_i] = (addr) + gdbstub_i; \
gdbstub_mem_access(gdbstub_addrs, (access) | (width)); \
}
# define GDBSTUB_MEM_ACCESS_FAST(addrs, access, width) \
uint32_t gdbstub_page = addr >> MEM_GRANULARITY_BITS; \
if (gdbstub_watch_pages[gdbstub_page >> 6] & (1 << (gdbstub_page & 63))) \
gdbstub_mem_access(addrs, access | width);
# define GDBSTUB_MEM_ACCESS_FAST(addrs, access, width) \
uint32_t gdbstub_page = (addrs)[0] >> MEM_GRANULARITY_BITS; \
if (gdbstub_watch_pages[gdbstub_page >> 6] & (1ULL << (gdbstub_page & 63))) \
gdbstub_mem_access((addrs), (access) | (width));
extern int gdbstub_step, gdbstub_next_asap;
extern uint64_t gdbstub_watch_pages[(((uint32_t) -1) >> (MEM_GRANULARITY_BITS + 6)) + 1];

View File

@@ -28,12 +28,12 @@
#define HDC_SECONDARY_BASE 0x0170
#define HDC_SECONDARY_SIDE 0x0376
#define HDC_SECONDARY_IRQ 15
#define HDC_TERTIARY_BASE 0x0168
#define HDC_TERTIARY_SIDE 0x036E
#define HDC_TERTIARY_IRQ 10
#define HDC_QUATERNARY_BASE 0x01E8
#define HDC_QUATERNARY_SIDE 0x03EE
#define HDC_QUATERNARY_IRQ 11
#define HDC_TERTIARY_BASE 0x01E8
#define HDC_TERTIARY_SIDE 0x03EE
#define HDC_TERTIARY_IRQ 11
#define HDC_QUATERNARY_BASE 0x0168
#define HDC_QUATERNARY_SIDE 0x036E
#define HDC_QUATERNARY_IRQ 10
enum {
IDE_NONE = 0,

View File

@@ -299,10 +299,10 @@ typedef struct _machine_ {
uint32_t type;
uintptr_t chipset;
int (*init)(const struct _machine_ *);
uintptr_t pad;
uintptr_t pad0;
uintptr_t pad1;
uintptr_t pad2;
uint8_t (*p1_handler)(uint8_t write, uint8_t val);
uint32_t (*gpio_handler)(uint8_t write, uint32_t val);
uintptr_t available_flag;
uint32_t (*gpio_acpi_handler)(uint8_t write, uint32_t val);
const machine_cpu_t cpu;
uintptr_t bus_flags;
uintptr_t flags;
@@ -314,10 +314,7 @@ typedef struct _machine_ {
#else
void *kbc_device;
#endif /* EMU_DEVICE_H */
/* Bits:
7-0 Set bits are forced set on P1 (no forced set = 0x00);
15-8 Clear bits are forced clear on P1 (no foced clear = 0xff). */
uint16_t kbc_p1;
uint8_t kbc_p1;
uint32_t gpio;
uint32_t gpio_acpi;
#ifdef EMU_DEVICE_H
@@ -375,10 +372,17 @@ extern int machine_has_mouse(void);
extern int machine_is_sony(void);
extern uint8_t machine_get_p1(void);
extern void machine_load_p1(int m);
extern uint32_t machine_get_gpi(void);
extern void machine_load_gpi(int m);
extern void machine_set_gpi(uint32_t gpi);
extern void machine_set_p1(uint8_t val);
extern void machine_init_p1(void);
extern uint8_t machine_handle_p1(uint8_t write, uint8_t val);
extern uint32_t machine_get_gpio(void);
extern void machine_set_gpio(uint32_t val);
extern void machine_init_gpio(void);
extern uint32_t machine_handle_gpio(uint8_t write, uint32_t val);
extern uint32_t machine_get_gpio_acpi(void);
extern void machine_set_gpio_acpi(uint32_t gpio_val);
extern void machine_init_gpio_acpi(void);
extern uint32_t machine_handle_gpio_acpi(uint8_t write, uint32_t val);
/* Initialization functions for boards and systems. */
extern void machine_common_init(const machine_t *);

View File

@@ -37,17 +37,17 @@ typedef struct mo_type_t {
#define KNOWN_MO_TYPES 10
static const mo_type_t mo_types[KNOWN_MO_TYPES] = {
// 3.5" standard M.O. disks
{248826, 512 },
{ 446325, 512 },
{ 1041500, 512 },
{ 310352, 2048},
{ 605846, 2048},
{ 1063146, 2048},
{ 248826, 512 },
{ 446325, 512 },
{ 1041500, 512 },
{ 310352, 2048 },
{ 605846, 2048 },
{ 1063146, 2048 },
// 5.25" M.O. disks
{ 573624, 512 },
{ 314568, 1024},
{ 904995, 512 },
{ 637041, 1024},
{ 573624, 512 },
{ 314568, 1024 },
{ 904995, 512 },
{ 637041, 1024 },
};
typedef struct mo_drive_type_t {
@@ -60,7 +60,7 @@ typedef struct mo_drive_type_t {
#define KNOWN_MO_DRIVE_TYPES 22
static const mo_drive_type_t mo_drive_types[KNOWN_MO_DRIVE_TYPES] = {
{"86BOX", "MAGNETO OPTICAL", "1.00", { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }},
{ "FUJITSU", "M2512A", "1314", { 1, 1, 0, 0, 0, 0, 0, 0, 0 } },
{ "FUJITSU", "M2512A", "1314", { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }},
{ "FUJITSU", "M2513-MCC3064SS", "1.00", { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 }},
{ "FUJITSU", "MCE3130SS", "0070", { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }},
{ "FUJITSU", "MCF3064SS", "0030", { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 }},
@@ -165,8 +165,10 @@ typedef struct mo_t {
extern mo_t *mo[MO_NUM];
extern mo_drive_t mo_drives[MO_NUM];
#if 0
extern uint8_t atapi_mo_drives[8];
extern uint8_t scsi_mo_drives[16];
#endif
#define mo_sense_error dev->sense[0]
#define mo_sense_key dev->sense[2]

View File

@@ -78,13 +78,9 @@ enum {
NET_LINK_1000_FD = (1 << 8),
};
/* Supported network cards. */
enum {
NONE = 0,
NE1000 = 1,
NE2000 = 2,
RTL8019AS = 3,
RTL8029AS = 4
NET_NONE = 0,
NET_INTERNAL
};
enum {

View File

@@ -146,11 +146,11 @@
pci_register_bus_slot(0, card, type, inta, intb, intc, intd)
#define pci_set_mirq(mirq, level, irq_state) \
pci_irq(PCI_MIRQ_BASE | mirq, 0, level, 1, irq_state)
pci_irq(PCI_MIRQ_BASE | (mirq), 0, level, 1, irq_state)
#define pci_set_irq(slot, pci_int, irq_state) \
pci_irq(slot, pci_int, 0, 1, irq_state)
#define pci_clear_mirq(mirq, level, irq_state) \
pci_irq(PCI_MIRQ_BASE | mirq, 0, level, 0, irq_state)
pci_irq(PCI_MIRQ_BASE | (mirq), 0, level, 0, irq_state)
#define pci_clear_irq(slot, pci_int, irq_state) \
pci_irq(slot, pci_int, 0, 0, irq_state)

View File

@@ -224,12 +224,12 @@
#define RW_DELAY (TIMER_USEC * 500)
/* Some generally useful CD-ROM information */
#define CD_MINS 75 /* max. minutes per CD */
#define CD_MINS 90 /* max. minutes per CD */
#define CD_SECS 60 /* seconds per minute */
#define CD_FRAMES 75 /* frames per second */
#define CD_FRAMESIZE 2048 /* bytes per frame, "cooked" mode */
#define CD_MAX_BYTES (CD_MINS * CD_SECS * CD_FRAMES * CD_FRAMESIZE)
#define CD_MAX_SECTORS (CD_MAX_BYTES / 512)
#define CD_MAX_SECTORS (CD_MAX_BYTES / 2048)
/* Event notification classes for GET EVENT STATUS NOTIFICATION */
#define GESN_NO_EVENTS 0

View File

@@ -22,5 +22,6 @@
#define SCSI_SPOCK_H
extern const device_t spock_device;
extern const device_t tribble_device;
#endif /*SCSI_SPOCK_H*/

View File

@@ -366,6 +366,7 @@ typedef struct SGE_t {
#define X54X_INT_GEOM_WRITABLE 8
#define X54X_MBX_24BIT 16
#define X54X_ISAPNP 32
#define X54X_HAS_SIGNATURE 64
typedef struct x54x_t {
/* 32 bytes */
@@ -404,7 +405,7 @@ typedef struct x54x_t {
/* for multi-threading, keep these volatile */
volatile uint8_t Status;
volatile uint8_t Interrupt;
volatile uint8_t Interrupt;
volatile uint8_t MailboxIsBIOS;
volatile uint8_t ToRaise;
volatile uint8_t flags;

View File

@@ -201,6 +201,8 @@ typedef struct xga_t {
int dst_map;
int bkgd_src;
int fore_src;
int oldx;
int oldy;
int x;
int y;
int sx;
@@ -211,6 +213,7 @@ typedef struct xga_t {
int py;
int pattern;
int command_len;
int filling;
uint32_t short_stroke;
uint32_t color_cmp;

View File

@@ -348,7 +348,7 @@ ini_read(const char *fn)
while (1) {
memset(buff, 0x00, sizeof(buff));
#ifdef __HAIKU__
ini_fgetws(buff, sizeof_w(buff), f);
ini_fgetws(buff, sizeof_w(buff), fp);
#else
(void) !fgetws(buff, sizeof_w(buff), fp);
#endif

View File

@@ -54,14 +54,14 @@ machine_at_p6rp4_init(const machine_t *model)
device_add(&p6rp4_nvr_device);
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x19, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
pci_register_slot(0x14, PCI_CARD_AGPBRIDGE, 0, 0, 0, 0);
pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
pci_register_slot(0x08, PCI_CARD_IDE, 0, 0, 0, 0);
pci_register_slot(0x07, PCI_CARD_NORMAL, 1, 2, 3, 4);
pci_register_slot(0x06, PCI_CARD_NORMAL, 2, 3, 4, 1);
pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2);
pci_register_slot(0x04, PCI_CARD_NORMAL, 4, 1, 2, 3);
pci_register_slot(0x19, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
pci_register_slot(0x14, PCI_CARD_NORTHBRIDGE_SEC, 0, 0, 0, 0);
pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
pci_register_slot(0x08, PCI_CARD_IDE, 0, 0, 0, 0);
pci_register_slot(0x07, PCI_CARD_NORMAL, 1, 2, 3, 4);
pci_register_slot(0x06, PCI_CARD_NORMAL, 2, 3, 4, 1);
pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2);
pci_register_slot(0x04, PCI_CARD_NORMAL, 4, 1, 2, 3);
device_add(&i450kx_device);
device_add(&sio_zb_device);
device_add(&ide_cmd646_device);

View File

@@ -362,11 +362,6 @@ static void
model_50_write(uint16_t port, uint8_t val)
{
switch (port) {
case 0x100:
ps2.io_id = val;
break;
case 0x101:
break;
case 0x102:
lpt1_remove();
serial_remove(ps2.uart);
@@ -499,11 +494,6 @@ static void
model_55sx_write(uint16_t port, uint8_t val)
{
switch (port) {
case 0x100:
ps2.io_id = val;
break;
case 0x101:
break;
case 0x102:
lpt1_remove();
serial_remove(ps2.uart);
@@ -563,10 +553,6 @@ static void
model_70_type3_write(uint16_t port, uint8_t val)
{
switch (port) {
case 0x100:
break;
case 0x101:
break;
case 0x102:
lpt1_remove();
serial_remove(ps2.uart);
@@ -621,10 +607,6 @@ static void
model_80_write(uint16_t port, uint8_t val)
{
switch (port) {
case 0x100:
break;
case 0x101:
break;
case 0x102:
lpt1_remove();
serial_remove(ps2.uart);
@@ -985,12 +967,12 @@ ps2_mca_mem_d071_init(int start_mb)
}
static void
ps2_mca_board_model_50_init(int slots)
ps2_mca_board_model_50_init(void)
{
ps2_mca_board_common_init();
mem_remap_top(384);
mca_init(slots);
mca_init(4);
device_add(&keyboard_ps2_mca_2_device);
ps2.planar_read = model_50_read;
@@ -1005,6 +987,29 @@ ps2_mca_board_model_50_init(int slots)
device_add(&ps1vga_mca_device);
}
static void
ps2_mca_board_model_60_init(void)
{
ps2_mca_board_common_init();
mem_remap_top(384);
mca_init(8);
device_add(&keyboard_ps2_mca_2_device);
ps2.planar_read = model_50_read;
ps2.planar_write = model_50_write;
if (mem_size > 2048) {
/* Only 2 MB supported on planar, create a memory expansion card for the rest */
ps2_mca_mem_fffc_init(2);
}
device_add(&ps2_nvr_55ls_device);
if (gfxcard[0] == VID_INTERNAL)
device_add(&ps1vga_mca_device);
}
static void
ps2_mca_board_model_55sx_init(int has_sec_nvram, int slots)
{
@@ -1051,10 +1056,8 @@ ps2_mca_board_model_55sx_init(int has_sec_nvram, int slots)
mca_init(slots);
device_add(&keyboard_ps2_device);
if (has_sec_nvram == 1)
if (has_sec_nvram)
device_add(&ps2_nvr_55ls_device);
else if (has_sec_nvram == 2)
device_add(&ps2_nvr_device);
ps2.planar_read = model_55sx_read;
ps2.planar_write = model_55sx_write;
@@ -1312,7 +1315,7 @@ ps2_mca_board_model_70_type34_init(int is_type4, int slots)
}
static void
ps2_mca_board_model_80_type2_init(int is486ps2)
ps2_mca_board_model_80_type2_init(void)
{
ps2_mca_board_common_init();
@@ -1372,7 +1375,7 @@ ps2_mca_board_model_80_type2_init(int is486ps2)
NULL);
mem_mapping_disable(&ps2.split_mapping);
if ((mem_size > 4096) && !is486ps2) {
if (mem_size > 4096) {
/* Only 4 MB supported on planar, create a memory expansion card for the rest */
if (mem_size > 12288)
ps2_mca_mem_d071_init(4);
@@ -1426,7 +1429,7 @@ machine_ps2_model_50_init(const machine_t *model)
machine_ps2_common_init(model);
ps2.planar_id = 0xfbff;
ps2_mca_board_model_50_init(4);
ps2_mca_board_model_50_init();
return ret;
}
@@ -1448,8 +1451,8 @@ machine_ps2_model_60_init(const machine_t *model)
machine_ps2_common_init(model);
ps2.planar_id = 0xfbff;
ps2_mca_board_model_50_init(8);
ps2.planar_id = 0xf7ff;
ps2_mca_board_model_60_init();
return ret;
}
@@ -1509,7 +1512,6 @@ machine_ps2_model_70_type3_init(const machine_t *model)
machine_ps2_common_init(model);
ps2.planar_id = 0xf9ff;
ps2_mca_board_model_70_type34_init(0, 4);
return ret;
@@ -1530,7 +1532,7 @@ machine_ps2_model_80_init(const machine_t *model)
machine_ps2_common_init(model);
ps2.planar_id = 0xfdff;
ps2_mca_board_model_80_type2_init(0);
ps2_mca_board_model_80_type2_init();
return ret;
}
@@ -1550,7 +1552,6 @@ machine_ps2_model_80_axx_init(const machine_t *model)
machine_ps2_common_init(model);
ps2.planar_id = 0xfff9;
ps2_mca_board_model_70_type34_init(0, 8);
return ret;
@@ -1571,7 +1572,6 @@ machine_ps2_model_70_type4_init(const machine_t *model)
machine_ps2_common_init(model);
ps2.planar_id = 0xf9ff;
ps2_mca_board_model_70_type34_init(1, 4);
return ret;

File diff suppressed because it is too large Load Diff

View File

@@ -94,8 +94,23 @@ static const device_t net_none_device = {
.config = NULL
};
static const device_t net_internal_device = {
.name = "Internal",
.internal_name = "internal",
.flags = 0,
.local = NET_TYPE_NONE,
.init = NULL,
.close = NULL,
.reset = NULL,
{ .available = NULL },
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
static const device_t *net_cards[] = {
&net_none_device,
&net_internal_device,
&threec501_device,
&threec503_device,
&pcnet_am79c960_device,

View File

@@ -240,7 +240,6 @@ pci_relocate_slot(int type, int new_slot)
{
int card = -1;
int old_slot;
uint8_t mapping;
if ((new_slot < 0) || (new_slot > 31))
return;
@@ -257,9 +256,12 @@ pci_relocate_slot(int type, int new_slot)
old_slot = pci_cards[card].id;
pci_cards[card].id = new_slot;
mapping = pci_card_to_slot_mapping[0][old_slot];
pci_card_to_slot_mapping[0][old_slot] = PCI_CARD_INVALID;
pci_card_to_slot_mapping[0][new_slot] = mapping;
if (pci_card_to_slot_mapping[0][old_slot] == card)
pci_card_to_slot_mapping[0][old_slot] = PCI_CARD_INVALID;
if (pci_card_to_slot_mapping[0][new_slot] == PCI_CARD_INVALID)
pci_card_to_slot_mapping[0][new_slot] = card;
}
/* Write PCI enable/disable key, split for the ALi M1435. */

433
src/pic.c
View File

@@ -51,23 +51,20 @@ pic_t pic2;
static pc_timer_t pic_timer;
static uint16_t smi_irq_mask = 0x0000;
static uint16_t smi_irq_status = 0x0000;
static uint16_t enabled_latches = 0x0000;
static uint16_t latched_irqs = 0x0000;
static int shadow = 0;
static int elcr_enabled = 0;
static int tmr_inited = 0;
static int latched = 0;
static int pic_pci = 0;
static int kbd_latch = 0;
static int mouse_latch = 0;
static void (*update_pending)(void);
static uint16_t smi_irq_mask = 0x0000;
static uint16_t smi_irq_status = 0x0000;
static void pic_update_request(pic_t *dev, int irq);
static void pic_update_irr(pic_t *dev, uint16_t num);
static uint16_t latched_irqs = 0x0000;
static void pic_cascade(int set);
static void (*update_pending)(void);
#ifdef ENABLE_PIC_LOG
int pic_do_log = ENABLE_PIC_LOG;
@@ -226,27 +223,29 @@ find_best_interrupt(pic_t *dev)
static __inline void
pic_update_pending_xt(void)
{
if (!(pic.flags & PIC_FREEZE))
if (!(pic.interrupt & 0x20))
pic.int_pending = (find_best_interrupt(&pic) != -1);
}
/* Only check if PIC 1 frozen, because it should not happen
that one is frozen but the other is not. */
static __inline void
pic_update_pending_at(void)
{
if (!(pic2.flags & PIC_FREEZE)) {
if (!(pic.interrupt & 0x20)) {
pic2.int_pending = (find_best_interrupt(&pic2) != -1);
if (pic2.int_pending)
pic.irr |= (1 << pic2.icw3);
else
pic.irr &= ~(1 << pic2.icw3);
pic_cascade(pic2.int_pending);
}
if (!(pic.flags & PIC_FREEZE))
pic.int_pending = (find_best_interrupt(&pic) != -1);
pic_log("pic_update_pending_at(): dev->int_pending = %i (%i)\n", pic.int_pending, !!(pic.flags & PIC_FREEZE));
}
}
static void
pic_callback(UNUSED(void *priv))
pic_callback(void *priv)
{
update_pending();
}
@@ -263,13 +262,8 @@ pic_reset(void)
pic.is_master = 1;
pic.interrupt = pic2.interrupt = 0x17;
pic.has_slaves = 0;
pic2.has_slaves = 0;
if (is_at) {
if (is_at)
pic.slaves[2] = &pic2;
pic.has_slaves = 1;
}
if (tmr_inited)
timer_on_auto(&pic_timer, 0.0);
@@ -320,25 +314,14 @@ picint_is_level(int irq)
}
static void
pic_acknowledge(pic_t *dev, int poll)
pic_acknowledge(pic_t *dev)
{
int pic_int = dev->interrupt & 7;
int pic_int_num = 1 << pic_int;
dev->isr |= pic_int_num;
/* Simulate the clearing of the edge pulse. */
dev->edge_lines &= ~pic_int_num;
/* Clear the edge sense latch. */
dev->irq_latch &= ~pic_int_num;
if (!poll) {
dev->flags |= PIC_FREEZE; /* Freeze it so it still takes interrupts but they do not
override the one currently being processed. */
/* Clear the reset latch. */
pic_update_request(dev, pic_int);
}
if (!pic_level_triggered(dev, pic_int) || (dev->lines[pic_int] == 0))
dev->irr &= ~pic_int_num;
}
/* Find IRQ for non-specific EOI (either by command or automatic) by finding the highest IRQ
@@ -375,7 +358,6 @@ pic_action(pic_t *dev, uint8_t irq, uint8_t eoi, uint8_t rotate)
if (rotate)
dev->priority = (irq + 1) & 7;
pic_update_request(dev, irq);
update_pending();
}
}
@@ -415,10 +397,13 @@ pic_latch_read(UNUSED(uint16_t addr), UNUSED(void *priv))
{
uint8_t ret = 0xff;
pic_log("pic_latch_read(%04X): %04X\n", enabled_latches, latched_irqs & 0x1002);
pic_log("pic_latch_read(%i, %i)\n", kbd_latch, mouse_latch);
if (latched_irqs & 0x1002)
picintc(latched_irqs & 0x1002);
if (kbd_latch && (latched_irqs & 0x0002))
picintc(0x0002);
if (mouse_latch && (latched_irqs & 0x1000))
picintc(0x1000);
/* Return FF - we just lower IRQ 1 and IRQ 12. */
return ret;
@@ -447,23 +432,24 @@ pic_read(uint16_t addr, void *priv)
dev->data_bus = dev->irr;
#endif
if (dev->ocw3 & 0x04) {
dev->interrupt &= ~0x20; /* Freeze the interrupt until the poll is over. */
if (dev->int_pending) {
dev->data_bus = 0x80 | (dev->interrupt & 7);
pic_acknowledge(dev, 1);
pic_acknowledge(dev);
dev->int_pending = 0;
update_pending();
} else
dev->data_bus = 0x00;
dev->ocw3 &= ~0x04;
dev->flags &= ~PIC_FREEZE; /* Freeze the interrupt until the poll is over. */
pic_update_irr(dev, 0x00ff); /* Update IRR, just in case anything came while frozen. */
update_pending();
} else if (addr & 0x0001)
dev->data_bus = dev->imr;
else if (dev->ocw3 & 0x02) {
if (dev->ocw3 & 0x01)
dev->data_bus = dev->isr;
#ifdef UNDEFINED_READ
else
dev->data_bus = dev->irr;
dev->data_bus = 0x00;
#endif
}
/* If A0 = 0, VIA shadow is disabled, and poll mode is disabled,
simply read whatever is currently on the data bus. */
@@ -505,7 +491,7 @@ pic_write(uint16_t addr, uint8_t val, void *priv)
if (is286)
update_pending();
else
timer_on_auto(&pic_timer, 1.0 * ((10000000.0 * (double) xt_cpu_multi) / (double) cpu_s->rspeed));
timer_on_auto(&pic_timer, .0 * ((10000000.0 * (double) xt_cpu_multi) / (double) cpu_s->rspeed));
break;
default:
@@ -522,13 +508,11 @@ pic_write(uint16_t addr, uint8_t val, void *priv)
if (!(dev->icw1 & 1))
dev->icw4 = 0x00;
dev->ocw2 = dev->ocw3 = 0x00;
dev->flags = PIC_MASTER_CLEAR;
dev->irr = 0x00;
dev->edge_lines = 0x00;
dev->irq_latch = 0x00;
for (uint8_t i = 0; i <= 7; i++)
pic_update_request(dev, i);
dev->flags &= ~PIC_MASTER_CLEAR;
dev->irr = 0x00;
for (uint8_t i = 0; i <= 7; i++) {
if (dev->lines[i] > 0)
dev->irr |= (1 << i);
}
dev->imr = dev->isr = 0x00;
dev->ack_bytes = dev->priority = 0x00;
dev->auto_eoi_rotate = dev->special_mask_mode = 0x00;
@@ -539,7 +523,7 @@ pic_write(uint16_t addr, uint8_t val, void *priv)
} else if (val & 0x08) {
dev->ocw3 = val;
if (dev->ocw3 & 0x04)
dev->flags |= PIC_FREEZE; /* Freeze the interrupt until the poll is over. */
dev->interrupt |= 0x20; /* Freeze the interrupt until the poll is over. */
if (dev->ocw3 & 0x40)
dev->special_mask_mode = !!(dev->ocw3 & 0x20);
} else {
@@ -566,15 +550,12 @@ pic_set_pci(void)
void
pic_kbd_latch(int enable)
{
uint16_t old_latches = enabled_latches;
pic_log("PIC keyboard latch now %sabled\n", enable ? "en" : "dis");
enable = (!!enable) << 1;
enabled_latches = (enabled_latches & 0x1000) | enable;
if (!!(enable | mouse_latch) != !!(kbd_latch | mouse_latch))
io_handler(!!(enable | mouse_latch), 0x0060, 0x0001, pic_latch_read, NULL, NULL, NULL, NULL, NULL, NULL);
if (!!(enabled_latches & 0x1002) != !!(old_latches & 0x1002))
io_handler(!!(enabled_latches & 0x1002), 0x0060, 0x0001, pic_latch_read, NULL, NULL, NULL, NULL, NULL, NULL);
kbd_latch = !!enable;
if (!enable)
picintc(0x0002);
@@ -583,15 +564,12 @@ pic_kbd_latch(int enable)
void
pic_mouse_latch(int enable)
{
uint16_t old_latches = enabled_latches;
pic_log("PIC mouse latch now %sabled\n", enable ? "en" : "dis");
enable = (!!enable) << 12;
enabled_latches = (enabled_latches & 0x0002) | enable;
if (!!(kbd_latch | enable) != !!(kbd_latch | mouse_latch))
io_handler(!!(kbd_latch | enable), 0x0060, 0x0001, pic_latch_read, NULL, NULL, NULL, NULL, NULL, NULL);
if (!!(enabled_latches & 0x1002) != !!(old_latches & 0x1002))
io_handler(!!(enabled_latches & 0x1002), 0x0060, 0x0001, pic_latch_read, NULL, NULL, NULL, NULL, NULL, NULL);
mouse_latch = !!enable;
if (!enable)
picintc(0x1000);
@@ -603,11 +581,11 @@ pic_reset_hard(void)
pic_reset();
/* Explicitly reset the latches. */
enabled_latches = 0x0000;
kbd_latch = mouse_latch = 0;
latched_irqs = 0x0000;
/* The situation is as follows: There is a giant mess when it comes to these latches on real hardware,
to the point that there's even boards with board-level latches that get used in place of the latches
to the point that there's even boards with board-level latched that get used in place of the latches
on the chipset, therefore, I'm just doing this here for the sake of simplicity. */
if (machine_has_bus(machine, MACHINE_BUS_PS2_LATCH)) {
pic_kbd_latch(0x01);
@@ -643,169 +621,118 @@ pic2_init(void)
pic.slaves[2] = &pic2;
}
void
pic_update_lines(pic_t *dev, uint16_t num, int level, int set, uint8_t *irq_state)
{
uint8_t old_edge_lines;
uint8_t bit;
switch (level) {
case PIC_IRQ_EDGE:
old_edge_lines = dev->edge_lines;
dev->edge_lines &= ~num;
if (set)
dev->edge_lines |= num;
if ((dev->isr & num) || (dev->flags & PIC_MASTER_CLEAR))
dev->irq_latch = (dev->irq_latch & ~num) | (dev->edge_lines & num);
else if ((dev->edge_lines & num) && !(old_edge_lines & num))
dev->irq_latch |= num;
break;
case PIC_IRQ_LEVEL:
for (uint8_t i = 0; i < 8; i++) {
bit = (1 << i);
if ((num & bit) && ((!!*irq_state) != !!set))
dev->lines[i] += (set ? 1 : -1);
}
if ((!!*irq_state) != !!set)
*irq_state = set;
break;
default:
break;
}
}
static uint8_t
pic_irq_get_request(pic_t *dev, int irq)
{
uint8_t ret;
ret = ((dev->edge_lines & (1 << irq)) || (dev->lines[irq] > 0));
return ret;
}
static uint8_t
pic_es_latch_clear(pic_t *dev, int irq)
{
uint8_t ret;
ret = (dev->isr & (1 << irq)) || (dev->flags & PIC_MASTER_CLEAR);
return ret;
}
static uint8_t
pic_es_latch_out(pic_t *dev, int irq)
{
uint8_t ret;
ret = !((pic_es_latch_clear(dev, irq) && (dev->irq_latch & (1 << irq))) || !pic_irq_get_request(dev, irq));
return ret;
}
static uint8_t
pic_es_latch_nor(pic_t *dev, int irq)
{
uint8_t ret;
ret = !(pic_es_latch_out(dev, irq) || picint_is_level(irq));
return ret;
}
static uint8_t
pic_irq_request_nor(pic_t *dev, int irq)
{
uint8_t ret;
ret = !(pic_es_latch_nor(dev, irq) || !pic_irq_get_request(dev, irq));
return ret;
}
static void
pic_update_request(pic_t *dev, int irq)
{
dev->irr &= ~(1 << irq);
if (!(dev->flags & PIC_FREEZE))
dev->irr |= (pic_irq_request_nor(dev, irq) << irq);
}
static void
pic_update_irr(pic_t *dev, uint16_t num)
{
for (uint8_t i = 0; i < 8; i++) {
if (num & (1 << i))
pic_update_request(dev, i);
}
}
void
picint_common(uint16_t num, int level, int set, uint8_t *irq_state)
{
pic_log("picint_common(%04X, %i, %i, %08X)\n", num, level, set, (uint32_t) (uintptr_t) irq_state);
set = !!set;
int raise;
int max = 16;
uint8_t b;
uint8_t slaves = 0;
uint16_t w;
uint16_t lines = level ? 0x0000 : num;
pic_t *dev;
/* Make sure to ignore all slave IRQ's, and in case of AT+,
translate IRQ 2 to IRQ 9. */
if (num & pic.icw3) {
num &= ~pic.icw3;
if (pic.at)
num |= (1 << 9);
for (uint8_t i = 0; i < 8; i++) {
b = (uint8_t) (1 << i);
raise = num & b;
if (pic.icw3 & b) {
slaves++;
if (raise) {
num &= ~b;
if (pic.at && (i == 2))
num |= (1 << 9);
}
}
}
if (!pic.has_slaves)
num &= 0x00ff;
if (!slaves)
max = 8;
if (!num) {
pic_log("Attempting to %s null IRQ\n", set ? "raise" : "lower");
return;
}
if (num & 0x0100)
acpi_rtc_status = !!set;
if (level) {
dev = &pic;
smi_irq_status &= ~num;
if (set && (smi_irq_mask & num)) {
smi_raise();
smi_irq_status |= num;
for (uint16_t i = 0; i < max; i++) {
if (i == 8)
dev = &pic2;
b = i & 7;
w = 1 << i;
if (num & w) {
if ((!!*irq_state) != !!set)
set ? dev->lines[b]++ : dev->lines[b]--;
if (!pic_level_triggered(dev, b) ||
(((!!*irq_state) != !!set) && (dev->lines[b] == (!!set))))
lines |= w;
}
}
if ((!!*irq_state) != !!set)
*irq_state = set;
num = lines;
}
if (!slaves)
num &= 0x00ff;
if (num & 0x0100)
acpi_rtc_status = !!set;
if (num) {
if (set) {
if (smi_irq_mask & num) {
smi_raise();
smi_irq_status |= num;
}
if (num & 0xff00) {
/* Latch IRQ 12 if the mouse latch is enabled. */
if ((num & 0x1000) && mouse_latch)
latched_irqs |= 0x1000;
pic2.irr |= (num >> 8);
}
if (num & 0x00ff) {
/* Latch IRQ 1 if the keyboard latch is enabled. */
if (kbd_latch && (num & 0x0002))
latched_irqs |= 0x0002;
pic.irr |= (num & 0x00ff);
}
} else {
smi_irq_status &= ~num;
if (num & 0xff00) {
/* Unlatch IRQ 12 if the mouse latch is enabled. */
if ((num & 0x1000) && mouse_latch)
latched_irqs &= 0xefff;
pic2.irr &= ~(num >> 8);
}
if (num & 0x00ff) {
/* Unlatch IRQ 1 if the keyboard latch is enabled. */
if (kbd_latch && (num & 0x0002))
latched_irqs &= 0xfffd;
pic.irr &= ~(num & 0x00ff);
}
}
update_pending();
}
if (num & 0xff00) {
pic_update_lines(&pic2, num >> 8, level, set, irq_state);
/* Latch IRQ 12 if the mouse latch is enabled. */
if ((num & enabled_latches) & 0x1000)
latched_irqs = (latched_irqs & 0xefff) | (set << 12);
pic_update_irr(&pic2, num >> 8);
}
if (num & 0x00ff) {
pic_update_lines(&pic, num & 0x00ff, level, set, irq_state);
/* Latch IRQ 1 if the keyboard latch is enabled. */
if ((num & enabled_latches) & 0x0002)
latched_irqs = (latched_irqs & 0xfffd) | (set << 1);
pic_update_irr(&pic, num & 0x00ff);
}
update_pending();
}
static void
pic_cascade(int set)
{
pic_update_lines(&pic, (1 << pic2.icw3), PIC_IRQ_EDGE, set, NULL);
pic_update_irr(&pic, (1 << pic2.icw3));
}
static uint8_t
@@ -817,13 +744,16 @@ pic_i86_mode(pic_t *dev)
static uint8_t
pic_irq_ack_read(pic_t *dev, int phase)
{
uint8_t intr = dev->interrupt & 0x07;
uint8_t slave = dev->flags & PIC_SLAVE_PENDING;
uint8_t intr = dev->interrupt & 0x47;
uint8_t slave = intr & 0x40;
intr &= 0x07;
pic_log(" pic_irq_ack_read(%08X, %i)\n", dev, phase);
if (dev != NULL) {
if (phase == 0) {
pic_acknowledge(dev, 0);
dev->interrupt |= 0x20; /* Freeze it so it still takes interrupts but they do not
override the one currently being processed. */
pic_acknowledge(dev);
if (slave)
dev->data_bus = pic_irq_ack_read(dev->slaves[intr], phase);
else
@@ -855,9 +785,6 @@ pic_irq_ack_read(pic_t *dev, int phase)
return dev->data_bus;
}
/* 808x: Update the requests for all interrupts since any of them
could have arrived during the freeze. */
uint8_t
pic_irq_ack(void)
{
@@ -871,7 +798,7 @@ pic_irq_ack(void)
exit(-1);
}
pic.flags |= PIC_SLAVE_PENDING;
pic.interrupt |= 0x40; /* Mark slave pending. */
}
ret = pic_irq_ack_read(&pic, pic.ack_bytes);
@@ -879,13 +806,8 @@ pic_irq_ack(void)
if (pic.ack_bytes == 0) {
/* Needed for Xi8088. */
if (pic.flags & PIC_SLAVE_PENDING) {
pic2.flags &= ~PIC_FREEZE;
pic_update_irr(&pic2, 0x00ff);
if (pic.interrupt & 0x40)
pic2.interrupt = 0x17;
}
pic.flags &= ~(PIC_SLAVE_PENDING | PIC_FREEZE);
pic_update_irr(&pic, 0x00ff);
pic.interrupt = 0x17;
update_pending();
}
@@ -893,9 +815,6 @@ pic_irq_ack(void)
return ret;
}
/* 286+: Only update the request for the pending interrupt as it is
impossible that any other interrupt has arrived during the
freeze. */
int
picinterrupt(void)
{
@@ -905,32 +824,34 @@ picinterrupt(void)
if (pic_slave_on(&pic, pic.interrupt)) {
if (!pic.slaves[pic.interrupt]->int_pending) {
/* If we are on AT, IRQ 2 is pending, and we cannot find a pending IRQ on PIC 2, fatal out. */
fatal("IRQ %i pending on AT without a pending IRQ on PIC %i (normal)\n", pic.interrupt, pic.interrupt);
exit(-1);
}
pic.flags |= PIC_SLAVE_PENDING;
// fatal("IRQ %i pending on AT without a pending IRQ on PIC %i (normal)\n", pic.interrupt, pic.interrupt);
// exit(-1);
/* Error correction mechanism: Do a supurious IRQ 15 (spurious IRQ 7 on PIC 2). */
pic.slaves[pic.interrupt]->int_pending = 1;
pic.slaves[pic.interrupt]->interrupt = 0x07;
} else
pic.interrupt |= 0x40; /* Mark slave pending. */
}
} else {
/* pic.int_pending was somehow cleared despite the fact we made it here,
do a spurious IRQ 7. */
pic.int_pending = 1;
pic.interrupt = 0x07;
}
if ((pic.interrupt == 0) && (pit_devs[1].data != NULL))
pit_devs[1].set_gate(pit_devs[1].data, 0, 0);
if ((pic.interrupt == 0) && (pit_devs[1].data != NULL))
pit_devs[1].set_gate(pit_devs[1].data, 0, 0);
/* Two ACK's - do them in a loop to avoid potential compiler misoptimizations. */
for (uint8_t i = 0; i < 2; i++) {
ret = pic_irq_ack_read(&pic, pic.ack_bytes);
pic.ack_bytes = (pic.ack_bytes + 1) % (pic_i86_mode(&pic) ? 2 : 3);
/* Two ACK's - do them in a loop to avoid potential compiler misoptimizations. */
for (uint8_t i = 0; i < 2; i++) {
ret = pic_irq_ack_read(&pic, pic.ack_bytes);
pic.ack_bytes = (pic.ack_bytes + 1) % (pic_i86_mode(&pic) ? 2 : 3);
if (pic.ack_bytes == 0) {
if (pic.flags & PIC_SLAVE_PENDING) {
pic2.flags &= ~PIC_FREEZE;
pic_update_request(&pic2, pic2.interrupt & 0x07);
pic2.interrupt = 0x17;
}
pic.flags &= ~(PIC_SLAVE_PENDING | PIC_FREEZE);
pic_update_request(&pic, pic.interrupt & 0x07);
pic.interrupt = 0x17;
update_pending();
}
if (pic.ack_bytes == 0) {
if (pic.interrupt & 0x40)
pic2.interrupt = 0x17;
pic.interrupt = 0x17;
update_pending();
}
}

View File

@@ -1,14 +1,14 @@
msgid "&Action"
msgstr "作(&A)"
msgstr "作(&A)"
msgid "&Keyboard requires capture"
msgstr "キーボードはキャプチャが必要(&K)"
msgid "&Right CTRL is left ALT"
msgstr "右CTRLを左ALTへ(&R)"
msgstr "右CTRLを左ALTへ変換(&R)"
msgid "&Hard Reset..."
msgstr "ハードリセット(&H)..."
msgstr "ハード リセット(&H)..."
msgid "&Ctrl+Alt+Del\tCtrl+F12"
msgstr "Ctrl+Alt+Del(&C)\tCtrl+F12"
@@ -26,16 +26,16 @@ msgid "&View"
msgstr "表示(&V)"
msgid "&Hide status bar"
msgstr "ステータスバーを隠す(&H)"
msgstr "ステータス バーを隠す(&H)"
msgid "Hide &toolbar"
msgstr "ツールバーを隠す(&T)"
msgstr "ツール バーを隠す(&T)"
msgid "&Resizeable window"
msgstr "ウィンドウのサイズをリサイズ可能(&R)"
msgstr "ウィンドウのサイズを変更可能(&R)"
msgid "R&emember size && position"
msgstr "ウィンドウのサイズと位置を記憶(&E)"
msgstr "ウィンドウのサイズと位置を保存(&E)"
msgid "Re&nderer"
msgstr "レンダラー(&N)"
@@ -56,10 +56,10 @@ msgid "&VNC"
msgstr "VNC(&V)"
msgid "Specify dimensions..."
msgstr "ウィンドウのサイズを指定..."
msgstr "ディメンションを指定..."
msgid "F&orce 4:3 display ratio"
msgstr "4:3アスペクト比を固定(&O)"
msgstr "4:3の縦横比を強制表示(&O)"
msgid "&Window scale factor"
msgstr "ウィンドウの表示倍率(&W)"
@@ -107,13 +107,13 @@ msgid "Hi&DPI scaling"
msgstr "HiDPIスケーリング(&D)"
msgid "&Fullscreen\tCtrl+Alt+PgUp"
msgstr "フルスクリーン(&F)\tCtrl+Alt+PgUp"
msgstr "全画面表示(&F)\tCtrl+Alt+PgUp"
msgid "Fullscreen &stretch mode"
msgstr "フルスクリーンのスケール(&S)"
msgstr "全画面の拡大表示モード(&S)"
msgid "&Full screen stretch"
msgstr "フルスクリーンに拡大(&F)"
msgstr "全画面の拡大表示(&F)"
msgid "&4:3"
msgstr "4:3(&4)"
@@ -128,7 +128,7 @@ msgid "E&GA/(S)VGA settings"
msgstr "E&GA/(S)VGAの設定"
msgid "&Inverted VGA monitor"
msgstr "色反転(&I)"
msgstr "色反転(&I)"
msgid "VGA screen &type"
msgstr "画面タイプ(&T)"
@@ -140,7 +140,7 @@ msgid "&RGB Grayscale"
msgstr "RGB(グレースケール)(&R)"
msgid "&Amber monitor"
msgstr "モニター(琥珀色)(&A)"
msgstr "モニター(色)(&A)"
msgid "&Green monitor"
msgstr "モニター(緑色)(&G)"
@@ -185,10 +185,10 @@ msgid "&Preferences..."
msgstr "環境設定(&P)..."
msgid "Enable &Discord integration"
msgstr "Discordとの連携機能(&D)"
msgstr "Discord連携機能(&D)"
msgid "Sound &gain..."
msgstr "音量を調節(&G)..."
msgstr "音量調整(&G)..."
msgid "Begin trace\tCtrl+T"
msgstr "トレース開始\tCtrl+T"
@@ -200,7 +200,7 @@ msgid "&Help"
msgstr "ヘルプ(&H)"
msgid "&Documentation..."
msgstr "ドキュメント(&D)..."
msgstr "文書(&D)..."
msgid "&About 86Box..."
msgstr "86Boxのバージョン情報(&A)..."
@@ -221,7 +221,7 @@ msgid "&Play"
msgstr "再生(&P)"
msgid "&Rewind to the beginning"
msgstr "冒頭に巻き戻す(&R)"
msgstr "先頭まで巻き戻す(&R)"
msgid "&Fast forward to the end"
msgstr "最後まで早送り(&F)"
@@ -239,7 +239,7 @@ msgid "&Mute"
msgstr "ミュート(&M)"
msgid "E&mpty"
msgstr "(&M)"
msgstr "なし(&M)"
msgid "&Reload previous image"
msgstr "前のイメージを再読み込み(&R)"
@@ -299,7 +299,7 @@ msgid "Cancel"
msgstr "キャンセル"
msgid "Save these settings as &global defaults"
msgstr "これらの設定をグローバル既定値として保存する(&G)"
msgstr "これらの設定をグローバル既定値として保存(&G)"
msgid "&Default"
msgstr "既定値(&D)"
@@ -320,7 +320,7 @@ msgid "Disk size:"
msgstr "ディスクサイズ:"
msgid "RPM mode:"
msgstr "回転数モード:"
msgstr "RPMモード:"
msgid "Progress:"
msgstr "進行状況:"
@@ -332,10 +332,10 @@ msgid "Height:"
msgstr "高さ:"
msgid "Lock to this size"
msgstr "このサイズをロックする"
msgstr "サイズを固定"
msgid "Machine type:"
msgstr "マシンタイプ:"
msgstr "マシン タイプ:"
msgid "Machine:"
msgstr "マシン:"
@@ -353,7 +353,7 @@ msgid "FPU:"
msgstr "FPU:"
msgid "Wait states:"
msgstr "待機状態:"
msgstr "ウェイトステート:"
msgid "MB"
msgstr "MB"
@@ -365,13 +365,13 @@ msgid "Time synchronization"
msgstr "時刻同期機能"
msgid "Disabled"
msgstr "無効にする"
msgstr "無効"
msgid "Enabled (local time)"
msgstr "有効にする (現地時間)"
msgstr "有効(現地時間)"
msgid "Enabled (UTC)"
msgstr "有効にする (UTC)"
msgstr "有効(UTC)"
msgid "Dynamic Recompiler"
msgstr "動的リコンパイラ"
@@ -407,16 +407,16 @@ msgid "Joystick 4..."
msgstr "ジョイスティック4..."
msgid "Sound card 1:"
msgstr "サウンドカード 1:"
msgstr "サウンドカード1:"
msgid "Sound card 2:"
msgstr "サウンドカード 2:"
msgstr "サウンドカード2:"
msgid "Sound card 3:"
msgstr "サウンドカード 3:"
msgstr "サウンドカード3:"
msgid "Sound card 4:"
msgstr "サウンドカード 4:"
msgstr "サウンドカード4:"
msgid "MIDI Out Device:"
msgstr "MIDI出力デバイス:"
@@ -434,13 +434,13 @@ msgid "FM synth driver"
msgstr "FMシンセドライバー"
msgid "Nuked (more accurate)"
msgstr "Nuked (高精度化)"
msgstr "Nuked(高精度化)"
msgid "YMFM (faster)"
msgstr "YMFM (より速く)"
msgstr "YMFM(より速く)"
msgid "Network type:"
msgstr "ネットワークタイプ:"
msgstr "ネットワーク タイプ:"
msgid "PCap device:"
msgstr "PCapデバイス:"
@@ -497,16 +497,16 @@ msgid "Parallel port 4"
msgstr "パラレルポート4"
msgid "HD Controller:"
msgstr "HDコントローラー:"
msgstr "HDDコントローラー:"
msgid "FD Controller:"
msgstr "FDコントローラー:"
msgstr "FDDコントローラー:"
msgid "Tertiary IDE Controller"
msgstr "第三IDEコントローラー"
msgstr "第三IDEコントローラー"
msgid "Quaternary IDE Controller"
msgstr "第四IDEコントローラー"
msgstr "第四IDEコントローラー"
msgid "SCSI"
msgstr "SCSI"
@@ -527,7 +527,7 @@ msgid "Cassette"
msgstr "カセット"
msgid "Hard disks:"
msgstr "ハードディスク:"
msgstr "ハード ディスク:"
msgid "&New..."
msgstr "新規(&N)..."
@@ -536,7 +536,7 @@ msgid "&Existing..."
msgstr "既定(&E)..."
msgid "&Remove"
msgstr "除(&R)"
msgstr "除(&R)"
msgid "Bus:"
msgstr "バス:"
@@ -578,13 +578,13 @@ msgid "Turbo timings"
msgstr "高速タイミング"
msgid "Check BPB"
msgstr "BPBチェック"
msgstr "BPBチェック"
msgid "CD-ROM drives:"
msgstr "CD-ROMドライブ:"
msgid "Earlier drive"
msgstr "アーリードライブ"
msgstr "先のドライブ"
msgid "MO drives:"
msgstr "光磁気ドライブ:"
@@ -599,7 +599,7 @@ msgid "ISA RTC:"
msgstr "ISA RTCカード:"
msgid "ISA Memory Expansion"
msgstr "ISAメモリ拡張カード"
msgstr "ISAメモリ拡張カード"
msgid "Card 1:"
msgstr "カード1:"
@@ -677,10 +677,10 @@ msgid "Surface images"
msgstr "表面イメージ"
msgid "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine."
msgstr "roms/machinesディレクトリにROMがないため、マシン「%hs」は使用できません。使用可能なマシンに切り替えます。"
msgstr "roms/machines ディレクトリにROMがないため、マシン「%hs」は使用できません。使用可能なマシンに切り替えます。"
msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card."
msgstr "roms/videoディレクトリにROMがないため、ビデオカード「%hs」は使用できません。使用可能なビデオカードに切り替えます。"
msgstr "roms/video ディレクトリにROMがないため、ビデオ カード「%hs」は使用できません。使用可能なビデオカードに切り替えます。"
msgid "Machine"
msgstr "マシン"
@@ -698,22 +698,22 @@ msgid "Network"
msgstr "ネットワーク"
msgid "Ports (COM & LPT)"
msgstr "ポート (COM & LPT)"
msgstr "ポート (COM/LPT)"
msgid "Storage controllers"
msgstr "ストレージコントローラ"
msgstr "ストレージ コントローラ"
msgid "Hard disks"
msgstr "ハードディスク"
msgstr "ハード ディスク"
msgid "Floppy & CD-ROM drives"
msgstr "フロッピー/CD-ROMドライブ"
msgid "Other removable devices"
msgstr "その他のリムーバブルデバイス"
msgstr "他のリムーバブル デバイス"
msgid "Other peripherals"
msgstr "その他の周辺装置"
msgstr "他の周辺デバイス"
msgid "Click to capture mouse"
msgstr "クリックするとマウスをキャプチャします"
@@ -722,7 +722,7 @@ msgid "Press F8+F12 to release mouse"
msgstr "F8+F12キーでマウスを解放します"
msgid "Press F8+F12 or middle button to release mouse"
msgstr "F8+F12キーまたは中ボタンでマウスを解放します"
msgstr "F8+F12キーまたはマウスの中ボタンを押してマウスを解放します"
msgid "Bus"
msgstr "バス"
@@ -749,7 +749,7 @@ msgid "Default"
msgstr "既定値"
msgid "%i Wait state(s)"
msgstr "%iつの待機状態"
msgstr "%iつのウェイト ステート"
msgid "Type"
msgstr "タイプ"
@@ -779,10 +779,10 @@ msgid "CH Flightstick Pro"
msgstr "CH Flightstick Pro"
msgid "Microsoft SideWinder Pad"
msgstr "Microsoft SideWinder Pad"
msgstr "Microsoft SideWinderパッド"
msgid "Thrustmaster Flight Control System"
msgstr "Thrustmaster Flight Control System"
msgstr "Thrustmaster飛行制御システム"
msgid "None"
msgstr "なし"
@@ -791,13 +791,13 @@ msgid "Unable to load keyboard accelerators."
msgstr "キーボードアクセラレータを読み込めません。"
msgid "Unable to register raw input."
msgstr "生入力が登録できません。"
msgstr "生入力が登録できません。"
msgid "%u"
msgstr "%u"
msgid "%u MB (CHS: %i, %i, %i)"
msgstr "%u MB (CHS: %i, %i, %i)"
msgstr "%u MB (CHS: %i、%i、%i)"
msgid "Floppy %i (%s): %ls"
msgstr "フロッピー %i (%s): %ls"
@@ -806,13 +806,13 @@ msgid "Advanced sector images"
msgstr "アドバンスドセクターイメージ"
msgid "Flux images"
msgstr "フラックスイメージ"
msgstr "Fluxイメージ"
msgid "Unable to initialize SDL, SDL2.dll is required"
msgstr "SDLが初期化できません。SDL2.dllが必要です"
msgid "Are you sure you want to hard reset the emulated machine?"
msgstr "使用中のマシンをハードリセットしますか?"
msgstr "使用中のマシンをハード リセットしますか?"
msgid "Are you sure you want to exit 86Box?"
msgstr "86Boxを終了しますか"
@@ -842,7 +842,7 @@ msgid "Do you want to save the settings?"
msgstr "設定を保存しますか?"
msgid "This will hard reset the emulated machine."
msgstr "保存すると使用中のマシンがハードリセットされます。"
msgstr "使用中のマシンがハードリセットされます。"
msgid "Save"
msgstr "保存"
@@ -878,10 +878,10 @@ msgid "libgs"
msgstr "libgs"
msgid " is required for automatic conversion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript (.ps) files."
msgstr "PostScriptファイルをPDFに自動変換するにはlibgsが必要です。\n\n汎用PostScriptプリンターに送信されたドキュメントは、PostScript(.ps)ファイルとして保存されます。"
msgstr "PostScriptファイルをPDFに自動変換するにはlibgsが必要です。\n\n汎用PostScriptプリンターに送信された文書は、PostScript (.ps) ファイルとして保存されます。"
msgid "Entering fullscreen mode"
msgstr "フルスクリーンに切り替えています"
msgstr "全画面モードを入力"
msgid "Don't show this message again"
msgstr "今後、このメッセージを表示しない"
@@ -914,7 +914,7 @@ msgid "You are loading an unsupported configuration"
msgstr "サポートされていない設定を読み込んでいます"
msgid "CPU type filtering based on selected machine is disabled for this emulated machine.\n\nThis makes it possible to choose a CPU that is otherwise incompatible with the selected machine. However, you may run into incompatibilities with the machine BIOS or other software.\n\nEnabling this setting is not officially supported and any bug reports filed may be closed as invalid."
msgstr "選択したマシンに基づくCPUタイプのフィルタリングは、このエミュレートされたマシンでは無効になっています。\n\nこれにより、選択したマシンと互換性のないCPUが選択できます。ただし、マシンのBIOSまたは他のソフトウェアと互換性が失われる可能性があります。\n\nこの設定有効は公式サポートができません。また、バグレポート無効として閉じられる場合があります。"
msgstr "選択したマシンに基づくCPUタイプのフィルター機能は、使用中のマシンでは無効になっています。\n\nこれにより、選択したマシンと互換性のないCPUが選択できます。しかし、マシンのBIOS他のソフトウェアと互換性がない場合があります。\n\nこの設定有効にすることは公式にはサポートされておらず、バグレポート無効として中止される可能性があります。"
msgid "Continue"
msgstr "続行"
@@ -998,7 +998,7 @@ msgid "HDI or HDX images with a sector size other than 512 are not supported."
msgstr "512以外のセクタサイズを持つHDIまたはHDXイメージはサポートされていません。"
msgid "USB is not yet supported"
msgstr "USBはまだサポートされていません"
msgstr "USBはまだ非対応です"
msgid "Disk image file already exists"
msgstr "ディスクイメージファイルが既に存在します"
@@ -1022,10 +1022,10 @@ msgid "Remember to partition and format the newly-created drive."
msgstr "新規ドライブをパーティション分割し、フォーマットを必ずしといてください。"
msgid "The selected file will be overwritten. Are you sure you want to use it?"
msgstr "選択したファイル上書きされます。使っていいですか?"
msgstr "選択したファイル上書きされます。よろしいですか?"
msgid "Unsupported disk image"
msgstr "サポートされていないディスクイメージ"
msgstr "非対応のディスクイメージ"
msgid "Overwrite"
msgstr "上書き"
@@ -1043,19 +1043,19 @@ msgid "HDX image (.hdx)"
msgstr "HDXイメージ (.hdx)"
msgid "Fixed-size VHD (.vhd)"
msgstr "VHD(容量固定)(.vhd)"
msgstr "VHD (容量固定) (.vhd)"
msgid "Dynamic-size VHD (.vhd)"
msgstr "VHD(容量可変)(.vhd)"
msgstr "VHD (容量可変) (.vhd)"
msgid "Differencing VHD (.vhd)"
msgstr "VHD(差分)(.vhd)"
msgstr "VHD (差分) (.vhd)"
msgid "Large blocks (2 MB)"
msgstr "大ブロック (2 MB)"
msgstr "大きなブロック (2 MB)"
msgid "Small blocks (512 KB)"
msgstr "小ブロック (512 KB)"
msgstr "小さなブロック (512 KB)"
msgid "VHD files"
msgstr "VHDファイル"
@@ -1064,13 +1064,13 @@ msgid "Select the parent VHD"
msgstr "親VHDの選択"
msgid "This could mean that the parent image was modified after the differencing image was created.\n\nIt can also happen if the image files were moved or copied, or by a bug in the program that created this disk.\n\nDo you want to fix the timestamps?"
msgstr "親イメージがディファレンシングイメージの作成の後に修正した可能性があります。\n\nイメージファイル移動、コピーまたはこのディスクを作成したプログラムにバグが発生した可能性があります。\n\nタイムスタンプを修正しますか"
msgstr "親イメージが差分イメージの作成の後に変更される可能性があります。\n\nイメージ ファイル移動またはコピーされたか、イメージ ファイルを作成したプログラムにバグが発生した可能性があります。\n\nタイムスタンプを修正しますか"
msgid "Parent and child disk timestamps do not match"
msgstr "親ディスクと子ディスクのタイムスタンプが一致しません"
msgstr "親ディスクと子ディスクのタイムス タンプが一致しません"
msgid "Could not fix VHD timestamp."
msgstr "VHD のタイムスタンプを修正できませんでした。"
msgstr "VHD のタイムスタンプを修正できません。"
msgid "%01i:%02i"
msgstr "%01i:%02i"
@@ -1181,16 +1181,16 @@ msgid "5.25\" 1.3 GB"
msgstr "5.25\" 1.3 GB"
msgid "Perfect RPM"
msgstr "規定の回転数"
msgstr "規定のRPM"
msgid "1% below perfect RPM"
msgstr "1%低い回転数"
msgstr "1%低いRPM"
msgid "1.5% below perfect RPM"
msgstr "1.5%低い回転数"
msgstr "1.5%低いRPM"
msgid "2% below perfect RPM"
msgstr "2%低い回転数"
msgstr "2%低いRPM"
msgid "(System Default)"
msgstr "(システム既定値)"
@@ -1199,13 +1199,13 @@ msgid "Failed to initialize network driver"
msgstr "ネットワークドライバの初期化に失敗しました"
msgid "The network configuration will be switched to the null driver"
msgstr "ネットワーク設定がヌルドライバに切り替わる"
msgstr "ネットワーク設定がヌルドライバに切り替えられます"
msgid "Mouse sensitivity:"
msgstr "マウスの感度:"
msgid "Select media images from program working directory"
msgstr "プログラムの作業ディレクトリからメディアイメージを選択する"
msgstr "プログラムの作業ディレクトリからメディアイメージを選択してください"
msgid "PIT mode:"
msgstr "PITモード:"

View File

@@ -206,13 +206,13 @@ msgid "&About 86Box..."
msgstr "关于 86Box(&A)..."
msgid "&New image..."
msgstr "新建像(&N)..."
msgstr "新建像(&N)..."
msgid "&Existing image..."
msgstr "打开已存在的像(&E)..."
msgstr "打开已存在的像(&E)..."
msgid "Existing image (&Write-protected)..."
msgstr "打开已存在的像并写保护(&W)..."
msgstr "打开已存在的像并写保护(&W)..."
msgid "&Record"
msgstr "录制(&R)"
@@ -230,7 +230,7 @@ msgid "E&ject"
msgstr "弹出(&J)"
msgid "&Image..."
msgstr "像(&I)..."
msgstr "像(&I)..."
msgid "E&xport to 86F..."
msgstr "导出为 86F 格式(&x)..."
@@ -242,7 +242,7 @@ msgid "E&mpty"
msgstr "空置驱动器(&M)"
msgid "&Reload previous image"
msgstr "载入上一个像(&R)"
msgstr "载入上一个像(&R)"
msgid "&Folder..."
msgstr "文件夹(&F)..."
@@ -284,7 +284,7 @@ msgid "Sound Gain"
msgstr "音量增益"
msgid "New Image"
msgstr "新建像"
msgstr "新建像"
msgid "Settings"
msgstr "设置"
@@ -533,7 +533,7 @@ msgid "&New..."
msgstr "新建(&N)..."
msgid "&Existing..."
msgstr "已有像(&E)..."
msgstr "已有像(&E)..."
msgid "&Remove"
msgstr "移除(&R)"
@@ -566,7 +566,7 @@ msgid "Type:"
msgstr "类型:"
msgid "Image Format:"
msgstr "像格式:"
msgstr "像格式:"
msgid "Block Size:"
msgstr "块大小:"
@@ -599,7 +599,7 @@ msgid "ISA RTC:"
msgstr "ISA 实时时钟:"
msgid "ISA Memory Expansion"
msgstr "ISA 内存扩"
msgstr "ISA 内存扩"
msgid "Card 1:"
msgstr "扩展卡 1:"
@@ -647,10 +647,10 @@ msgid "ZIP %03i %i (%s): %ls"
msgstr "ZIP %03i %i (%s): %ls"
msgid "ZIP images"
msgstr "ZIP 像"
msgstr "ZIP 像"
msgid "86Box could not find any usable ROM images.\n\nPlease <a href=\"https://github.com/86Box/roms/releases/latest\">download</a> a ROM set and extract it into the \"roms\" directory."
msgstr "86Box 找不到任何可用的 ROM 像。\n\n请<a href=\"https://github.com/86Box/roms/releases/latest\">下载</a>ROM 包并将其解压到 \"roms\" 文件夹。"
msgstr "86Box 找不到任何可用的 ROM 像。\n\n请<a href=\"https://github.com/86Box/roms/releases/latest\">下载</a>ROM 包并将其解压到 \"roms\" 文件夹。"
msgid "(empty)"
msgstr "(空)"
@@ -668,13 +668,13 @@ msgid "Off"
msgstr "关"
msgid "All images"
msgstr "所有像"
msgstr "所有像"
msgid "Basic sector images"
msgstr "基本扇区像"
msgstr "基本扇区像"
msgid "Surface images"
msgstr "表面像"
msgstr "表面像"
msgid "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine."
msgstr "由于 roms/machines 文件夹中缺少合适的 ROM机型 \"%hs\" 不可用。将切换到其他可用机型。"
@@ -803,10 +803,10 @@ msgid "Floppy %i (%s): %ls"
msgstr "软盘 %i (%s): %ls"
msgid "Advanced sector images"
msgstr "高级扇区像"
msgstr "高级扇区像"
msgid "Flux images"
msgstr "Flux 像"
msgstr "Flux 像"
msgid "Unable to initialize SDL, SDL2.dll is required"
msgstr "无法初始化 SDL需要 SDL2.dll"
@@ -824,7 +824,7 @@ msgid "MO %i (%ls): %ls"
msgstr "磁光盘 %i (%ls): %ls"
msgid "MO images"
msgstr "磁光盘像"
msgstr "磁光盘像"
msgid "Welcome to 86Box!"
msgstr "欢迎使用 86Box"
@@ -854,7 +854,7 @@ msgid "86Box v"
msgstr "86Box v"
msgid "An emulator of old computers\n\nAuthors: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, and others.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2 or later. See LICENSE for more information."
msgstr "一个旧式计算机模拟器\n\n作者: Miran Grča (OBattler)、RichardG867、Jasmine Iwanek、TC1995、coldbrewed、Teemu Korhonen (Manaatti)、Joakim L. Gilje、Adrien Moulin (elyosh)、Daniel Balsom (gloriouscow)、Cacodemon345、Fred N. van Kempen (waltje)、Tiseno100、reenigne 等人。\n\nWith previous core contributions from Sarah WalkerleileiJohnElliottgreatpsycho 等人。\n\n本软件依据 GNU 通用公共许可证第二版或更新版本发布。详情见 LICENSE 文件。"
msgstr "一个旧式计算机模拟器\n\n作者: Miran Grča (OBattler)、RichardG867、Jasmine Iwanek、TC1995、coldbrewed、Teemu Korhonen (Manaatti)、Joakim L. Gilje、Adrien Moulin (elyosh)、Daniel Balsom (gloriouscow)、Cacodemon345、Fred N. van Kempen (waltje)、Tiseno100、reenigne 等人。\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\n本软件依据 GNU 通用公共许可证第二版或更新版本发布。详情见 LICENSE 文件。"
msgid "Hardware not available"
msgstr "硬件不可用"
@@ -896,7 +896,7 @@ msgid "Don't reset"
msgstr "不重置"
msgid "CD-ROM images"
msgstr "光盘像"
msgstr "光盘像"
msgid "%hs Device Configuration"
msgstr "%hs 设备配置"
@@ -923,13 +923,13 @@ msgid "Cassette: %s"
msgstr "磁带: %s"
msgid "Cassette images"
msgstr "磁带像"
msgstr "磁带像"
msgid "Cartridge %i: %ls"
msgstr "卡带 %i: %ls"
msgid "Cartridge images"
msgstr "卡带像"
msgstr "卡带像"
msgid "Error initializing renderer"
msgstr "初始化渲染器时出错"
@@ -980,13 +980,13 @@ msgid "Add Existing Hard Disk"
msgstr "添加已存在的硬盘"
msgid "HDI disk images cannot be larger than 4 GB."
msgstr "HDI 磁盘像不能超过 4 GB。"
msgstr "HDI 磁盘像不能超过 4 GB。"
msgid "Disk images cannot be larger than 127 GB."
msgstr "磁盘像不能超过 127 GB。"
msgstr "磁盘像不能超过 127 GB。"
msgid "Hard disk images"
msgstr "硬盘像"
msgstr "硬盘像"
msgid "Unable to read file"
msgstr "无法读取文件"
@@ -995,19 +995,19 @@ msgid "Unable to write file"
msgstr "无法写入文件"
msgid "HDI or HDX images with a sector size other than 512 are not supported."
msgstr "不支持非 512 字节扇区大小的 HDI 或 HDX 像。"
msgstr "不支持非 512 字节扇区大小的 HDI 或 HDX 像。"
msgid "USB is not yet supported"
msgstr "尚未支持 USB"
msgid "Disk image file already exists"
msgstr "磁盘像文件已存在"
msgstr "磁盘像文件已存在"
msgid "Please specify a valid file name."
msgstr "请指定有效的文件名。"
msgid "Disk image created"
msgstr "已创建磁盘像"
msgstr "已创建磁盘像"
msgid "Make sure the file exists and is readable."
msgstr "请确定此文件已存在并可读取。"
@@ -1016,16 +1016,16 @@ msgid "Make sure the file is being saved to a writable directory."
msgstr "请确定此文件保存在可写目录中。"
msgid "Disk image too large"
msgstr "磁盘像太大"
msgstr "磁盘像太大"
msgid "Remember to partition and format the newly-created drive."
msgstr "请记得为新创建的像分区并格式化。"
msgstr "请记得为新创建的像分区并格式化。"
msgid "The selected file will be overwritten. Are you sure you want to use it?"
msgstr "选定的文件将被覆盖。确定继续使用此文件吗?"
msgid "Unsupported disk image"
msgstr "不支持的磁盘像"
msgstr "不支持的磁盘像"
msgid "Overwrite"
msgstr "覆盖"
@@ -1034,13 +1034,13 @@ msgid "Don't overwrite"
msgstr "不覆盖"
msgid "Raw image (.img)"
msgstr "原始像 (.img)"
msgstr "原始像 (.img)"
msgid "HDI image (.hdi)"
msgstr "HDI 像 (.hdi)"
msgstr "HDI 像 (.hdi)"
msgid "HDX image (.hdx)"
msgstr "HDX 像 (.hdx)"
msgstr "HDX 像 (.hdx)"
msgid "Fixed-size VHD (.vhd)"
msgstr "固定大小 VHD (.vhd)"
@@ -1064,7 +1064,7 @@ msgid "Select the parent VHD"
msgstr "选择父 VHD 文件"
msgid "This could mean that the parent image was modified after the differencing image was created.\n\nIt can also happen if the image files were moved or copied, or by a bug in the program that created this disk.\n\nDo you want to fix the timestamps?"
msgstr "父映像可能在创建差异像后被修改。\n\n如果像文件被移动或复制,或创建此磁盘的程序中存在错误,也可能发生这种情况。\n\n是否需要修复时间戳"
msgstr "父映像可能在创建差异像后被修改。\n\n如果像文件被移动或复制,或创建此磁盘的程序中存在错误,也可能发生这种情况。\n\n是否需要修复时间戳"
msgid "Parent and child disk timestamps do not match"
msgstr "父盘与子盘的时间戳不匹配"
@@ -1205,7 +1205,7 @@ msgid "Mouse sensitivity:"
msgstr "鼠标敏感度:"
msgid "Select media images from program working directory"
msgstr "从程序工作目录中选择介质像"
msgstr "从程序工作目录中选择介质像"
msgid "PIT mode:"
msgstr "PIT 模式:"

View File

@@ -854,7 +854,7 @@ msgid "86Box v"
msgstr "86Box v"
msgid "An emulator of old computers\n\nAuthors: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, and others.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2 or later. See LICENSE for more information."
msgstr "一個舊式電腦模擬器\n\n作者: Miran Grča (OBattler)、RichardG867、Jasmine Iwanek、TC1995、coldbrewed、Teemu Korhonen (Manaatti)、Joakim L. Gilje、Adrien Moulin (elyosh)、Daniel Balsom (gloriouscow)、Cacodemon345、Fred N. van Kempen (waltje)、Tiseno100、reenigne 等人。\n\nWith previous core contributions from Sarah WalkerleileiJohnElliottgreatpsycho 等人。\n\n本軟體依據 GNU 通用公共授權第二版或更新版本發布。詳情見 LICENSE 檔案。"
msgstr "一個舊式電腦模擬器\n\n作者: Miran Grča (OBattler)、RichardG867、Jasmine Iwanek、TC1995、coldbrewed、Teemu Korhonen (Manaatti)、Joakim L. Gilje、Adrien Moulin (elyosh)、Daniel Balsom (gloriouscow)、Cacodemon345、Fred N. van Kempen (waltje)、Tiseno100、reenigne 等人。\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\n本軟體依據 GNU 通用公共授權第二版或更新版本發布。詳情見 LICENSE 檔案。"
msgid "Hardware not available"
msgstr "硬體不可用"

View File

@@ -28,6 +28,8 @@
#include <QLibraryInfo>
#include <QString>
#include <QFont>
#include <QDialog>
#include <QMessageBox>
#ifdef QT_STATIC
/* Static builds need plugin imports */
@@ -274,6 +276,21 @@ main(int argc, char *argv[])
main_window->installEventFilter(&socket);
socket.connectToServer(qgetenv("86BOX_MANAGER_SOCKET"));
}
/* Warn the user about unsupported configs */
if (cpu_override) {
QMessageBox warningbox(QMessageBox::Icon::Warning, QObject::tr("You are loading an unsupported configuration"),
QObject::tr("CPU type filtering based on selected machine is disabled for this emulated machine.\n\nThis makes it possible to choose a CPU that is otherwise incompatible with the selected machine. However, you may run into incompatibilities with the machine BIOS or other software.\n\nEnabling this setting is not officially supported and any bug reports filed may be closed as invalid."),
QMessageBox::NoButton, main_window);
warningbox.addButton(QObject::tr("Continue"), QMessageBox::AcceptRole);
warningbox.addButton(QObject::tr("Exit"), QMessageBox::RejectRole);
warningbox.exec();
if (warningbox.result() == QDialog::Accepted) {
confirm_exit_cmdl = 0; /* skip the confirmation prompt without touching the config */
emit main_window->close();
}
}
// pc_reset_hard_init();
/* Set the PAUSE mode depending on the renderer. */

View File

@@ -333,6 +333,8 @@ MainWindow::MainWindow(QWidget *parent)
#ifndef DISCORD
ui->actionEnable_Discord_integration->setVisible(false);
#else
ui->actionEnable_Discord_integration->setEnabled(discord_loaded);
#endif
#if defined Q_OS_WINDOWS || defined Q_OS_MACOS

View File

@@ -110,7 +110,10 @@ SettingsDisplay::onCurrentMachineChanged(int machineId)
void
SettingsDisplay::on_pushButtonConfigure_clicked()
{
auto *device = video_card_getdevice(ui->comboBoxVideo->currentData().toInt());
int videoCard = ui->comboBoxVideo->currentData().toInt();
auto *device = video_card_getdevice(videoCard);
if (videoCard == VID_INTERNAL)
device = machine_get_vid_device(machineId);
DeviceConfig::ConfigureDevice(device, 0, qobject_cast<Settings *>(Settings::settings));
}
@@ -138,7 +141,11 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index)
}
auto curVideoCard_2 = videoCard[1];
videoCard[0] = ui->comboBoxVideo->currentData().toInt();
ui->pushButtonConfigure->setEnabled(video_card_has_config(videoCard[0]) > 0);
if (videoCard[0] == VID_INTERNAL)
ui->pushButtonConfigure->setEnabled(machine_has_flags(machineId, MACHINE_VIDEO) &&
device_has_config(machine_get_vid_device(machineId)));
else
ui->pushButtonConfigure->setEnabled(video_card_has_config(videoCard[0]) > 0);
bool machineHasPci = machine_has_bus(machineId, MACHINE_BUS_PCI) > 0;
ui->checkBoxVoodoo->setEnabled(machineHasPci);
if (machineHasPci) {

View File

@@ -278,7 +278,7 @@ SettingsMachine::on_comboBoxSpeed_currentIndexChanged(int index)
if (!(flags & CPU_SUPPORTS_DYNAREC)) {
ui->checkBoxDynamicRecompiler->setChecked(false);
ui->checkBoxDynamicRecompiler->setEnabled(false);
} else if (flags & CPU_REQUIRES_DYNAREC) {
} else if ((flags & CPU_REQUIRES_DYNAREC) && !cpu_override) {
ui->checkBoxDynamicRecompiler->setChecked(true);
ui->checkBoxDynamicRecompiler->setEnabled(false);
} else {
@@ -288,7 +288,6 @@ SettingsMachine::on_comboBoxSpeed_currentIndexChanged(int index)
#endif
// win_settings_machine_recalc_fpu
int machineId = ui->comboBoxMachine->currentData().toInt();
auto *modelFpu = ui->comboBoxFPU->model();
int removeRows = modelFpu->rowCount();
@@ -306,11 +305,27 @@ SettingsMachine::on_comboBoxSpeed_currentIndexChanged(int index)
ui->comboBoxFPU->setEnabled(modelFpu->rowCount() > 1);
ui->comboBoxFPU->setCurrentIndex(-1);
ui->comboBoxFPU->setCurrentIndex(selectedFpuRow);
}
}
ui->checkBoxFPUSoftfloat->setChecked(machine_has_flags(machineId, MACHINE_SOFTFLOAT_ONLY) ?
true : fpu_softfloat);
ui->checkBoxFPUSoftfloat->setEnabled(machine_has_flags(machineId, MACHINE_SOFTFLOAT_ONLY) ?
false : true);
void
SettingsMachine::on_comboBoxFPU_currentIndexChanged(int index)
{
if (index >= 0) {
int cpuFamilyId = ui->comboBoxCPU->currentData().toInt();
const auto *cpuFamily = &cpu_families[cpuFamilyId];
int cpuId = ui->comboBoxSpeed->currentData().toInt();
int machineId = ui->comboBoxMachine->currentData().toInt();
if (fpu_get_type_from_index(cpuFamily, cpuId, index) == FPU_NONE) {
ui->checkBoxFPUSoftfloat->setChecked(false);
ui->checkBoxFPUSoftfloat->setEnabled(false);
} else {
ui->checkBoxFPUSoftfloat->setChecked(machine_has_flags(machineId, MACHINE_SOFTFLOAT_ONLY) ?
true : fpu_softfloat);
ui->checkBoxFPUSoftfloat->setEnabled(machine_has_flags(machineId, MACHINE_SOFTFLOAT_ONLY) ?
false : true);
}
}
}

View File

@@ -21,6 +21,9 @@ signals:
private slots:
void on_pushButtonConfigure_clicked();
private slots:
void on_comboBoxFPU_currentIndexChanged(int index);
private slots:
void on_comboBoxSpeed_currentIndexChanged(int index);

View File

@@ -47,7 +47,12 @@ SettingsNetwork::enableElements(Ui::SettingsNetwork *ui)
intf_cbox->setEnabled(net_type_cbox->currentData().toInt() == NET_TYPE_PCAP);
nic_cbox->setEnabled(adaptersEnabled);
conf_btn->setEnabled(adaptersEnabled && network_card_has_config(nic_cbox->currentData().toInt()));
int netCard = nic_cbox->currentData().toInt();
if ((i == 0) && (netCard == NET_INTERNAL))
conf_btn->setEnabled(adaptersEnabled && machine_has_flags(machineId, MACHINE_NIC) &&
device_has_config(machine_get_net_device(machineId)));
else
conf_btn->setEnabled(adaptersEnabled && network_card_has_config(nic_cbox->currentData().toInt()));
socket_line->setEnabled(net_type_cbox->currentData().toInt() == NET_TYPE_VDE);
}
}
@@ -110,6 +115,12 @@ SettingsNetwork::onCurrentMachineChanged(int machineId)
selectedRow = 0;
while (true) {
/* Skip "internal" if machine doesn't have it or this is not the primary card. */
if ((c == 1) && ((i > 0) || (machine_has_flags(machineId, MACHINE_NIC) == 0))) {
c++;
continue;
}
auto name = DeviceConfig::DeviceName(network_card_getdevice(c), network_card_get_internal_name(c), 1);
if (name.isEmpty()) {
break;
@@ -182,23 +193,33 @@ SettingsNetwork::on_comboIndexChanged(int index)
void
SettingsNetwork::on_pushButtonConf1_clicked()
{
DeviceConfig::ConfigureDevice(network_card_getdevice(ui->comboBoxNIC1->currentData().toInt()), 1, qobject_cast<Settings *>(Settings::settings));
int netCard = ui->comboBoxNIC1->currentData().toInt();
auto *device = network_card_getdevice(netCard);
if (netCard == NET_INTERNAL)
device = machine_get_net_device(machineId);
DeviceConfig::ConfigureDevice(device, 1, qobject_cast<Settings *>(Settings::settings));
}
void
SettingsNetwork::on_pushButtonConf2_clicked()
{
DeviceConfig::ConfigureDevice(network_card_getdevice(ui->comboBoxNIC2->currentData().toInt()), 2, qobject_cast<Settings *>(Settings::settings));
int netCard = ui->comboBoxNIC2->currentData().toInt();
auto *device = network_card_getdevice(netCard);
DeviceConfig::ConfigureDevice(device, 2, qobject_cast<Settings *>(Settings::settings));
}
void
SettingsNetwork::on_pushButtonConf3_clicked()
{
DeviceConfig::ConfigureDevice(network_card_getdevice(ui->comboBoxNIC3->currentData().toInt()), 3, qobject_cast<Settings *>(Settings::settings));
int netCard = ui->comboBoxNIC3->currentData().toInt();
auto *device = network_card_getdevice(netCard);
DeviceConfig::ConfigureDevice(device, 3, qobject_cast<Settings *>(Settings::settings));
}
void
SettingsNetwork::on_pushButtonConf4_clicked()
{
DeviceConfig::ConfigureDevice(network_card_getdevice(ui->comboBoxNIC4->currentData().toInt()), 4, qobject_cast<Settings *>(Settings::settings));
int netCard = ui->comboBoxNIC4->currentData().toInt();
auto *device = network_card_getdevice(netCard);
DeviceConfig::ConfigureDevice(device, 4, qobject_cast<Settings *>(Settings::settings));
}

View File

@@ -82,8 +82,8 @@ SettingsSound::onCurrentMachineChanged(int machineId)
selectedRow = 0;
while (true) {
/* Skip "internal" if machine doesn't have it. */
if ((c == 1) && (machine_has_flags(machineId, MACHINE_SOUND) == 0)) {
/* Skip "internal" if machine doesn't have it or this is not the primary card. */
if ((c == 1) && ((i > 0) || (machine_has_flags(machineId, MACHINE_SOUND) == 0))) {
c++;
continue;
}
@@ -192,13 +192,22 @@ SettingsSound::on_comboBoxSoundCard1_currentIndexChanged(int index)
if (index < 0) {
return;
}
ui->pushButtonConfigureSoundCard1->setEnabled(sound_card_has_config(ui->comboBoxSoundCard1->currentData().toInt()));
int sndCard = ui->comboBoxSoundCard1->currentData().toInt();
if (sndCard == SOUND_INTERNAL)
ui->pushButtonConfigureSoundCard1->setEnabled(machine_has_flags(machineId, MACHINE_SOUND) &&
device_has_config(machine_get_snd_device(machineId)));
else
ui->pushButtonConfigureSoundCard1->setEnabled(sound_card_has_config(sndCard));
}
void
SettingsSound::on_pushButtonConfigureSoundCard1_clicked()
{
DeviceConfig::ConfigureDevice(sound_card_getdevice(ui->comboBoxSoundCard1->currentData().toInt()), 0, qobject_cast<Settings *>(Settings::settings));
int sndCard = ui->comboBoxSoundCard1->currentData().toInt();
auto *device = sound_card_getdevice(sndCard);
if (sndCard == SOUND_INTERNAL)
device = machine_get_snd_device(machineId);
DeviceConfig::ConfigureDevice(device, 0, qobject_cast<Settings *>(Settings::settings));
}
void
@@ -207,13 +216,16 @@ SettingsSound::on_comboBoxSoundCard2_currentIndexChanged(int index)
if (index < 0) {
return;
}
ui->pushButtonConfigureSoundCard2->setEnabled(sound_card_has_config(ui->comboBoxSoundCard2->currentData().toInt()));
int sndCard = ui->comboBoxSoundCard2->currentData().toInt();
ui->pushButtonConfigureSoundCard2->setEnabled(sound_card_has_config(sndCard));
}
void
SettingsSound::on_pushButtonConfigureSoundCard2_clicked()
{
DeviceConfig::ConfigureDevice(sound_card_getdevice(ui->comboBoxSoundCard2->currentData().toInt()), 0, qobject_cast<Settings *>(Settings::settings));
int sndCard = ui->comboBoxSoundCard2->currentData().toInt();
auto *device = sound_card_getdevice(sndCard);
DeviceConfig::ConfigureDevice(device, 0, qobject_cast<Settings *>(Settings::settings));
}
void
@@ -222,13 +234,16 @@ SettingsSound::on_comboBoxSoundCard3_currentIndexChanged(int index)
if (index < 0) {
return;
}
ui->pushButtonConfigureSoundCard3->setEnabled(sound_card_has_config(ui->comboBoxSoundCard3->currentData().toInt()));
int sndCard = ui->comboBoxSoundCard3->currentData().toInt();
ui->pushButtonConfigureSoundCard3->setEnabled(sound_card_has_config(sndCard));
}
void
SettingsSound::on_pushButtonConfigureSoundCard3_clicked()
{
DeviceConfig::ConfigureDevice(sound_card_getdevice(ui->comboBoxSoundCard3->currentData().toInt()), 0, qobject_cast<Settings *>(Settings::settings));
int sndCard = ui->comboBoxSoundCard3->currentData().toInt();
auto *device = sound_card_getdevice(sndCard);
DeviceConfig::ConfigureDevice(device, 0, qobject_cast<Settings *>(Settings::settings));
}
void
@@ -237,13 +252,16 @@ SettingsSound::on_comboBoxSoundCard4_currentIndexChanged(int index)
if (index < 0) {
return;
}
ui->pushButtonConfigureSoundCard4->setEnabled(sound_card_has_config(ui->comboBoxSoundCard4->currentData().toInt()));
int sndCard = ui->comboBoxSoundCard4->currentData().toInt();
ui->pushButtonConfigureSoundCard4->setEnabled(sound_card_has_config(sndCard));
}
void
SettingsSound::on_pushButtonConfigureSoundCard4_clicked()
{
DeviceConfig::ConfigureDevice(sound_card_getdevice(ui->comboBoxSoundCard4->currentData().toInt()), 0, qobject_cast<Settings *>(Settings::settings));
int sndCard = ui->comboBoxSoundCard4->currentData().toInt();
auto *device = sound_card_getdevice(sndCard);
DeviceConfig::ConfigureDevice(device, 0, qobject_cast<Settings *>(Settings::settings));
}
void

View File

@@ -86,6 +86,7 @@ static SCSI_CARD scsi_cards[] = {
{ &buslogic_640a_device, },
{ &ncr53c90_mca_device, },
{ &spock_device, },
{ &tribble_device, },
{ &buslogic_958d_pci_device, },
{ &ncr53c810_pci_device, },
{ &ncr53c815_pci_device, },

View File

@@ -1025,6 +1025,7 @@ aha_init(const device_t *info)
dev->rom_shramsz = 128; /* size of shadow RAM */
dev->rom_ioaddr = 0x3F7E; /* [2:0] idx into addr table */
dev->rom_fwhigh = 0x0022; /* firmware version (hi/lo) */
dev->flags |= X54X_HAS_SIGNATURE;
dev->ven_get_host_id = aha_get_host_id; /* function to return host ID from EEPROM */
dev->ven_get_irq = aha_get_irq; /* function to return IRQ from EEPROM */
dev->ven_get_dma = aha_get_dma; /* function to return DMA channel from EEPROM */
@@ -1041,6 +1042,7 @@ aha_init(const device_t *info)
dev->rom_ioaddr = 0x3F7E; /* [2:0] idx into addr table */
dev->rom_fwhigh = 0x0022; /* firmware version (hi/lo) */
dev->flags |= X54X_CDROM_BOOT;
dev->flags |= X54X_HAS_SIGNATURE;
dev->ven_get_host_id = aha_get_host_id; /* function to return host ID from EEPROM */
dev->ven_get_irq = aha_get_irq; /* function to return IRQ from EEPROM */
dev->ven_get_dma = aha_get_dma; /* function to return DMA channel from EEPROM */
@@ -1061,6 +1063,7 @@ aha_init(const device_t *info)
dev->rom_fwhigh = 0x0055; /* firmware version (hi/lo) */
dev->flags |= X54X_CDROM_BOOT;
dev->flags |= X54X_ISAPNP;
dev->flags |= X54X_HAS_SIGNATURE;
dev->ven_get_host_id = aha_get_host_id; /* function to return host ID from EEPROM */
dev->ven_get_irq = aha_get_irq; /* function to return IRQ from EEPROM */
dev->ven_get_dma = aha_get_dma; /* function to return DMA channel from EEPROM */
@@ -1085,6 +1088,7 @@ aha_init(const device_t *info)
dev->fw_rev = "BB01";
dev->flags |= X54X_LBA_BIOS;
dev->flags |= X54X_HAS_SIGNATURE; /*To be confirmed*/
/* Enable MCA. */
dev->pos_regs[0] = 0x1F; /* MCA board ID */

File diff suppressed because it is too large Load Diff

View File

@@ -1553,10 +1553,14 @@ ncr_init(const device_t *info)
ncr_dev->bios_ver = 1;
}
if (ncr_dev->bios_ver == 1)
fn = RT1000B_820R_ROM;
else
fn = RT1000B_810R_ROM;
switch (ncr_dev->bios_ver) {
case 0:
fn = RT1000B_810R_ROM;
break;
case 1:
fn = RT1000B_820R_ROM;
break;
}
rom_init(&ncr_dev->bios_rom, fn,
ncr_dev->rom_addr, 0x4000, 0x3fff, 0, MEM_MAPPING_EXTERNAL);
@@ -1601,9 +1605,8 @@ ncr_init(const device_t *info)
ncr_dev->irq = device_get_config_int("irq");
ncr_dev->t128.bios_enabled = device_get_config_int("boot");
if (ncr_dev->t128.bios_enabled)
rom_init(&ncr_dev->bios_rom, T128_ROM,
ncr_dev->rom_addr, 0x4000, 0x3fff, 0, MEM_MAPPING_EXTERNAL);
rom_init(&ncr_dev->bios_rom, T128_ROM,
ncr_dev->rom_addr, 0x4000, 0x3fff, 0, MEM_MAPPING_EXTERNAL);
mem_mapping_add(&ncr_dev->mapping, ncr_dev->rom_addr, 0x4000,
t128_read, NULL, NULL,
@@ -1635,15 +1638,12 @@ ncr_init(const device_t *info)
ncr_log("%s\n", temp);
ncr_reset(ncr_dev, &ncr_dev->ncr);
if (ncr_dev->type < 3 || ncr_dev->type == 4) {
if ((ncr_dev->type < 3) || (ncr_dev->type == 4)) {
ncr_dev->status_ctrl = STATUS_BUFFER_NOT_READY;
ncr_dev->buffer_host_pos = 128;
} else {
ncr_dev->t128.status = 0x04;
ncr_dev->t128.host_pos = 512;
if (!ncr_dev->t128.bios_enabled)
ncr_dev->t128.status |= 0x80;
}
timer_add(&ncr_dev->timer, ncr_callback, ncr_dev, 0);
@@ -1894,13 +1894,6 @@ static const device_config_t t128_config[] = {
{ .description = "" }
},
},
{
.name = "boot",
.description = "Enable Boot ROM",
.type = CONFIG_BINARY,
.default_string = "",
.default_int = 1
},
{ .name = "", .description = "", .type = CONFIG_END }
};
// clang-format on

View File

@@ -135,7 +135,7 @@ typedef struct {
int cir_status;
uint8_t pacing;
uint8_t irq_state;
uint8_t buf[0x600];
struct {
@@ -159,6 +159,7 @@ typedef struct {
int scb_state;
int in_reset;
int in_invalid;
int spock_16bit;
uint64_t temp_period;
double media_period;
@@ -674,9 +675,9 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb)
spock_log("Get POS Info\n");
get_pos_info_t *get_pos_info = &scsi->get_pos_info;
get_pos_info->pos = 0x8eff;
get_pos_info->pos = scsi->spock_16bit ? 0x8efe : 0x8eff;
get_pos_info->pos1 = scsi->pos_regs[3] | (scsi->pos_regs[2] << 8);
get_pos_info->pos2 = 0x0e | (scsi->pos_regs[4] << 8);
get_pos_info->pos2 = scsi->irq | (scsi->pos_regs[4] << 8);
get_pos_info->pos3 = 1 << 12;
get_pos_info->pos4 = (7 << 8) | 8;
get_pos_info->pos5 = (16 << 8) | scsi->pacing;
@@ -716,7 +717,7 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb)
case CMD_SEND_OTHER_SCSI:
scsi->cdb_id = scsi->assign ? scsi->dev_id[scsi->scb_id].phys_id : scsi->present[scsi->scb_id];
dma_bm_read(scsi->scb_addr + 0x18, scsi->cdb, 12, 2);
spock_log("Send Other SCSI, SCB ID=%d, PHYS ID=%d\n", scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_id);
spock_log("Send Other SCSI, SCB ID=%d, PHYS ID=%d, CDB[0]=%02x, CDB_ID=%d\n", scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_id, scsi->cdb[0], scsi->cdb_id);
scsi->cdb[1] = (scsi->cdb[1] & 0x1f) | (scsi->dev_id[scsi->scb_id].lun_id << 5); /*Patch correct LUN into command*/
scsi->cdb_len = (scb->lba_addr & 0xff) ? (scb->lba_addr & 0xff) : 6;
scsi->scsi_state = SCSI_STATE_SELECT;
@@ -916,7 +917,7 @@ spock_process_scsi(spock_t *scsi, scb_t *scb)
scsi_device_command_phase0(sd, scsi->temp_cdb);
spock_log("SCSI ID %i: Current CDB[0] = %02x, LUN = %i, data len = %i, max len = %i, phase val = %02x\n", scsi->cdb_id, scsi->temp_cdb[0], scsi->temp_cdb[1] >> 5, sd->buffer_length, spock_get_len(scsi, scb), sd->phase);
if (sd->phase != SCSI_PHASE_STATUS && sd->buffer_length > 0) {
if ((sd->phase != SCSI_PHASE_STATUS) && (sd->buffer_length > 0)) {
p = scsi_device_get_callback(sd);
if (p <= 0.0)
spock_add_to_period(scsi, sd->buffer_length);
@@ -969,9 +970,9 @@ spock_process_scsi(spock_t *scsi, scb_t *scb)
scsi->scsi_state = SCSI_STATE_IDLE;
spock_log("State to idle, cmd timer %d\n", scsi->cmd_timer);
if (!scsi->cmd_timer) {
if (!scsi->cmd_timer)
scsi->cmd_timer = 1;
}
spock_add_to_period(scsi, 1);
break;
}
@@ -1056,7 +1057,7 @@ spock_callback(void *priv)
period = 0.2 * ((double) scsi->temp_period);
timer_on_auto(&scsi->callback_timer, (scsi->media_period + period + 10.0));
spock_log("Temporary period: %lf us (%" PRIi64 " periods)\n", scsi->callback_timer.period, scsi->temp_period);
spock_log("Temporary period: %lf us (%" PRIi64 " periods), media period = %lf\n", scsi->callback_timer.period, scsi->temp_period, scsi->media_period);
}
static void
@@ -1081,6 +1082,7 @@ spock_mca_write(int port, uint8_t val, void *priv)
mem_mapping_enable(&scsi->bios_rom.mapping);
}
}
spock_log("[%04X:%08X]: POS Write Port = %x, val = %02x, rom addr = %05x\n", CS, cpu_state.pc, port & 7, val, ((scsi->pos_regs[2] >> 4) * 0x2000) + 0xc0000);
}
static uint8_t
@@ -1088,6 +1090,8 @@ spock_mca_read(int port, void *priv)
{
const spock_t *scsi = (spock_t *) priv;
spock_log("[%04X:%08X]: POS Read Port = %x, val = %02x\n", CS, cpu_state.pc,
port & 7, scsi->pos_regs[port & 7]);
return scsi->pos_regs[port & 7];
}
@@ -1118,10 +1122,14 @@ spock_mca_reset(void *priv)
scsi_device_reset(&scsi_devices[scsi->bus][i]);
scsi->present[i] = 0;
}
spock_log("Reset.\n");
mem_mapping_disable(&scsi->bios_rom.mapping);
spock_mca_write(0x102, 0, scsi);
}
static void *
spock_init(UNUSED(const device_t *info))
spock_init(const device_t *info)
{
spock_t *scsi = malloc(sizeof(spock_t));
memset(scsi, 0x00, sizeof(spock_t));
@@ -1131,23 +1139,24 @@ spock_init(UNUSED(const device_t *info))
scsi->irq = 14;
scsi->bios_ver = device_get_config_int("bios_ver");
scsi->spock_16bit = info->local & 0xff;
switch (scsi->bios_ver) {
case 1:
rom_init_interleaved(&scsi->bios_rom, SPOCK_U68_1991_ROM, SPOCK_U69_1991_ROM,
0xc8000, 0x8000, 0x7fff, 0x4000, MEM_MAPPING_EXTERNAL);
break;
case 0:
rom_init_interleaved(&scsi->bios_rom, SPOCK_U68_1990_ROM, SPOCK_U69_1990_ROM,
0xc8000, 0x8000, 0x7fff, 0x4000, MEM_MAPPING_EXTERNAL);
break;
case 1:
rom_init_interleaved(&scsi->bios_rom, SPOCK_U68_1991_ROM, SPOCK_U69_1991_ROM,
0xc8000, 0x8000, 0x7fff, 0x4000, MEM_MAPPING_EXTERNAL);
break;
default:
break;
}
mem_mapping_disable(&scsi->bios_rom.mapping);
scsi->pos_regs[0] = 0xff;
scsi->pos_regs[0] = scsi->spock_16bit ? 0xfe : 0xff;
scsi->pos_regs[1] = 0x8e;
mca_add(spock_mca_read, spock_mca_write, spock_mca_feedb, spock_mca_reset, scsi);
@@ -1218,3 +1227,17 @@ const device_t spock_device = {
.force_redraw = NULL,
.config = spock_rom_config
};
const device_t tribble_device = {
.name = "IBM PS/2 SCSI Adapter (Tribble)",
.internal_name = "tribble",
.flags = DEVICE_MCA,
.local = 1,
.init = spock_init,
.close = spock_close,
.reset = NULL,
{ .available = spock_available },
.speed_changed = NULL,
.force_redraw = NULL,
.config = spock_rom_config
};

View File

@@ -103,7 +103,7 @@ x54x_irq(x54x_t *dev, int set)
else
picintc(1 << irq);
}
}
}
}
static void
@@ -466,6 +466,7 @@ x54x_bios_command(x54x_t *x54x, uint8_t max_id, BIOSCMD *cmd, int8_t islba)
}
return 0;
break;
case 0x02: /* Read Desired Sectors to Memory */
case 0x03: /* Write Desired Sectors from Memory */
@@ -1341,24 +1342,27 @@ x54x_in(uint16_t port, void *priv)
if (dev->flags & X54X_INT_GEOM_WRITABLE)
ret = dev->Geometry;
else {
switch (dev->Geometry) {
default:
case 0:
ret = 'A';
break;
case 1:
ret = 'D';
break;
case 2:
ret = 'A';
break;
case 3:
ret = 'P';
break;
}
ret ^= 1;
dev->Geometry++;
dev->Geometry &= 0x03;
if (dev->flags & X54X_HAS_SIGNATURE) {
switch (dev->Geometry) {
default:
case 0:
ret = 'A';
break;
case 1:
ret = 'D';
break;
case 2:
ret = 'A';
break;
case 3:
ret = 'P';
break;
}
ret ^= 1;
dev->Geometry++;
dev->Geometry &= 0x03;
} else
ret = 0xff;
break;
}
break;

View File

@@ -40,6 +40,7 @@ typedef struct pc87306_t {
uint8_t tries;
uint8_t regs[29];
uint8_t gpio[2];
uint16_t gpioba;
int cur_reg;
fdc_t *fdc;
serial_t *uart[2];
@@ -65,22 +66,35 @@ pc87306_gpio_read(uint16_t port, void *priv)
static void
pc87306_gpio_remove(pc87306_t *dev)
{
io_removehandler(dev->regs[0x0f] << 2, 0x0001,
pc87306_gpio_read, NULL, NULL, pc87306_gpio_write, NULL, NULL, dev);
io_removehandler((dev->regs[0x0f] << 2) + 1, 0x0001,
pc87306_gpio_read, NULL, NULL, pc87306_gpio_write, NULL, NULL, dev);
if (dev->gpioba != 0x0000) {
io_removehandler(dev->gpioba, 0x0001,
pc87306_gpio_read, NULL, NULL, pc87306_gpio_write, NULL, NULL, dev);
io_removehandler(dev->gpioba + 1, 0x0001,
pc87306_gpio_read, NULL, NULL, pc87306_gpio_write, NULL, NULL, dev);
}
}
static void
pc87306_gpio_init(pc87306_t *dev)
{
if ((dev->regs[0x12]) & 0x10)
io_sethandler(dev->regs[0x0f] << 2, 0x0001,
pc87306_gpio_read, NULL, NULL, pc87306_gpio_write, NULL, NULL, dev);
dev->gpioba = ((uint16_t) dev->regs[0x0f]) << 2;
if ((dev->regs[0x12]) & 0x20)
io_sethandler((dev->regs[0x0f] << 2) + 1, 0x0001,
pc87306_gpio_read, NULL, NULL, pc87306_gpio_write, NULL, NULL, dev);
if (dev->gpioba != 0x0000) {
if ((dev->regs[0x12]) & 0x10)
io_sethandler(dev->regs[0x0f] << 2, 0x0001,
pc87306_gpio_read, NULL, NULL, pc87306_gpio_write, NULL, NULL, dev);
if ((dev->regs[0x12]) & 0x20)
io_sethandler((dev->regs[0x0f] << 2) + 1, 0x0001,
pc87306_gpio_read, NULL, NULL, pc87306_gpio_write, NULL, NULL, dev);
}
}
static void
pc87306_gpio_handler(pc87306_t *dev)
{
pc87306_gpio_remove(dev);
pc87306_gpio_init(dev);
}
static void
@@ -315,13 +329,13 @@ pc87306_write(uint16_t port, uint8_t val, void *priv)
break;
case 0xF:
if (valxor)
pc87306_gpio_init(dev);
pc87306_gpio_handler(dev);
break;
case 0x12:
if (valxor & 0x01)
nvr_wp_set(!!(val & 0x01), 0, dev->nvr);
if (valxor & 0x30)
pc87306_gpio_init(dev);
pc87306_gpio_handler(dev);
break;
case 0x19:
if (valxor) {

View File

@@ -16,7 +16,9 @@
#include <86box/pic.h>
#include <86box/sound.h>
#include <86box/timer.h>
#include <86box/snd_ad1848.h>
#if defined(DEV_BRANCH) && defined(USE_GUSMAX)
# include <86box/snd_ad1848.h>
#endif
#include <86box/plat_fallthrough.h>
#include <86box/plat_unused.h>
@@ -104,9 +106,12 @@ typedef struct gus_t {
pc_timer_t timer_1;
pc_timer_t timer_2;
uint8_t type;
int irq;
int dma;
int irq_midi;
int dma2;
uint16_t base;
int latch_enable;
@@ -139,9 +144,9 @@ typedef struct gus_t {
uint8_t usrr;
#if defined(DEV_BRANCH) && defined(USE_GUSMAX)
uint8_t max_ctrl;
#if defined(DEV_BRANCH) && defined(USE_GUSMAX)
ad1848_t ad1848;
#endif
} gus_t;
@@ -211,16 +216,16 @@ gus_update_int_status(gus_t *gus)
if (gus->irq != -1) {
if (intr_pending)
picintlevel(1 << gus->irq, &gus->irq_state);
picint(1 << gus->irq);
else
picintclevel(1 << gus->irq, &gus->irq_state);
picintc(1 << gus->irq);
}
if (gus->irq_midi != -1) {
if ((gus->irq_midi != -1) && (gus->irq_midi != gus->irq)) {
if (midi_intr_pending)
picintlevel(1 << gus->irq_midi, &gus->midi_irq_state);
picint(1 << gus->irq_midi);
else
picintclevel(1 << gus->irq_midi, &gus->midi_irq_state);
picintc(1 << gus->irq_midi);
}
}
@@ -589,14 +594,24 @@ writegus(uint16_t addr, uint8_t val, void *priv)
} else
gus->irq_midi = gus_midi_irqs[(val >> 3) & 7];
#if defined(DEV_BRANCH) && defined(USE_GUSMAX)
ad1848_setirq(&gus->ad1848, gus->irq);
if (gus->type == GUS_MAX)
ad1848_setirq(&gus->ad1848, gus->irq);
#endif
gus->sb_nmi = val & 0x80;
} else {
gus->dma = gus_dmas[val & 7];
if (val & 0x40) {
if (gus->dma == -1)
gus->dma = gus->dma2 = gus_dmas[(val >> 3) & 7];
else
gus->dma2 = gus->dma;
} else
gus->dma2 = gus_dmas[(val >> 3) & 7];
#if defined(DEV_BRANCH) && defined(USE_GUSMAX)
ad1848_setdma(&gus->ad1848, gus->dma);
if (gus->type == GUS_MAX)
ad1848_setdma(&gus->ad1848, gus->dma2);
#endif
}
break;
@@ -655,20 +670,24 @@ writegus(uint16_t addr, uint8_t val, void *priv)
break;
case 0x306:
case 0x706:
if (gus->dma >= 4)
val |= 0x30;
gus->max_ctrl = (val >> 6) & 1;
#if defined(DEV_BRANCH) && defined(USE_GUSMAX)
if (val & 0x40) {
if ((val & 0xF) != ((addr >> 4) & 0xF)) {
csioport = 0x30c | ((addr >> 4) & 0xf);
io_removehandler(csioport, 4,
ad1848_read, NULL, NULL,
ad1848_write, NULL, NULL, &gus->ad1848);
csioport = 0x30c | ((val & 0xf) << 4);
io_sethandler(csioport, 4,
ad1848_read, NULL, NULL,
ad1848_write, NULL, NULL, &gus->ad1848);
if (gus->type == GUS_MAX) {
if (gus->dma >= 4)
val |= 0x10;
if (gus->dma2 >= 4)
val |= 0x20;
gus->max_ctrl = (val >> 6) & 1;
if (val & 0x40) {
if ((val & 0xF) != ((addr >> 4) & 0xF)) {
csioport = 0x30c | ((addr >> 4) & 0xf);
io_removehandler(csioport, 4,
ad1848_read, NULL, NULL,
ad1848_write, NULL, NULL, &gus->ad1848);
csioport = 0x30c | ((val & 0xf) << 4);
io_sethandler(csioport, 4,
ad1848_read, NULL, NULL,
ad1848_write, NULL, NULL, &gus->ad1848);
}
}
}
#endif
@@ -723,9 +742,11 @@ readgus(uint16_t addr, void *priv)
return val;
case 0x20F:
if (gus->max_ctrl)
#if defined(DEV_BRANCH) && defined(USE_GUSMAX)
if (gus->type == GUS_MAX)
val = 0x02;
else
#endif
val = 0x00;
break;
@@ -844,9 +865,11 @@ readgus(uint16_t addr, void *priv)
break;
case 0x306:
case 0x706:
if (gus->max_ctrl)
#if defined(DEV_BRANCH) && defined(USE_GUSMAX)
if (gus->type == GUS_MAX)
val = 0x0a; /* GUS MAX */
else
#endif
val = 0xff; /*Pre 3.7 - no mixer*/
break;
@@ -1128,21 +1151,21 @@ gus_get_buffer(int32_t *buffer, int len, void *priv)
gus_t *gus = (gus_t *) priv;
#if defined(DEV_BRANCH) && defined(USE_GUSMAX)
if (gus->max_ctrl)
if ((gus->type == GUS_MAX) && (gus->max_ctrl))
ad1848_update(&gus->ad1848);
#endif
gus_update(gus);
for (int c = 0; c < len * 2; c++) {
#if defined(DEV_BRANCH) && defined(USE_GUSMAX)
if (gus->max_ctrl)
if ((gus->type == GUS_MAX) && (gus->max_ctrl))
buffer[c] += (int32_t) (gus->ad1848.buffer[c] / 2);
#endif
buffer[c] += (int32_t) gus->buffer[c & 1][c >> 1];
}
#if defined(DEV_BRANCH) && defined(USE_GUSMAX)
if (gus->max_ctrl)
if ((gus->type == GUS_MAX) && (gus->max_ctrl))
gus->ad1848.pos = 0;
#endif
gus->pos = 0;
@@ -1277,7 +1300,9 @@ gus_reset(void *priv)
gus->usrr = 0;
#if defined(DEV_BRANCH) && defined(USE_GUSMAX)
gus->max_ctrl = 0;
#endif
gus->irq_state = 0;
gus->midi_irq_state = 0;
@@ -1317,6 +1342,8 @@ gus_init(UNUSED(const device_t *info))
gus->uart_out = 1;
gus->type = device_get_config_int("type");
gus->base = device_get_config_hex16("base");
io_sethandler(gus->base, 0x0010, readgus, NULL, NULL, writegus, NULL, NULL, gus);
@@ -1325,11 +1352,13 @@ gus_init(UNUSED(const device_t *info))
io_sethandler(0x0388, 0x0002, readgus, NULL, NULL, writegus, NULL, NULL, gus);
#if defined(DEV_BRANCH) && defined(USE_GUSMAX)
ad1848_init(&gus->ad1848, AD1848_TYPE_CS4231);
ad1848_setirq(&gus->ad1848, 5);
ad1848_setdma(&gus->ad1848, 3);
io_sethandler(0x10C + gus->base, 4,
ad1848_read, NULL, NULL, ad1848_write, NULL, NULL, &gus->ad1848);
if (gus->type == GUS_MAX) {
ad1848_init(&gus->ad1848, AD1848_TYPE_CS4231);
ad1848_setirq(&gus->ad1848, 5);
ad1848_setdma(&gus->ad1848, 3);
io_sethandler(0x10C + gus->base, 4,
ad1848_read, NULL, NULL, ad1848_write, NULL, NULL, &gus->ad1848);
}
#endif
timer_add(&gus->samp_timer, gus_poll_wave, gus, 1);
@@ -1364,7 +1393,7 @@ gus_speed_changed(void *priv)
gus->samp_latch = (uint64_t) (TIMER_USEC * (1000000.0 / gusfreqs[gus->voices - 14]));
#if defined(DEV_BRANCH) && defined(USE_GUSMAX)
if (gus->max_ctrl)
if ((gus->type == GUS_MAX) && (gus->max_ctrl))
ad1848_speed_changed(&gus->ad1848);
#endif
}

View File

@@ -1461,7 +1461,7 @@ sb_16_pnp_config_changed(uint8_t ld, isapnp_device_config_t *config, void *priv)
break;
case 1: /* IDE */
ide_pnp_config_changed(0, config, (void *) 2);
ide_pnp_config_changed(0, config, (void *) 3);
break;
case 2: /* Reserved (16) / WaveTable (32+) */
@@ -2033,7 +2033,7 @@ sb_16_pnp_init(UNUSED(const device_t *info))
sb->gameport = gameport_add(&gameport_pnp_device);
device_add(&ide_ter_pnp_device);
device_add(&ide_qua_pnp_device);
isapnp_add_card(sb_16_pnp_rom, sizeof(sb_16_pnp_rom), sb_16_pnp_config_changed, NULL, NULL, NULL, sb);
@@ -2200,7 +2200,7 @@ sb_awe32_pnp_init(const device_t *info)
sb->gameport = gameport_add(&gameport_pnp_device);
if ((info->local != 2) && (info->local != 3) && (info->local != 4))
device_add(&ide_ter_pnp_device);
device_add(&ide_qua_pnp_device);
const char *pnp_rom_file = NULL;
switch (info->local) {

View File

@@ -12,7 +12,7 @@
# After a successful build, you can install the RPMs as follows:
# sudo dnf install RPMS/$(uname -m)/86Box-3* RPMS/noarch/86Box-roms*
%global romver 3.11
%global romver 4.0
Name: 86Box
Version: 4.0
@@ -27,11 +27,14 @@ Source1: https://github.com/86Box/roms/archive/refs/tags/v%{romver}.zip
BuildRequires: cmake
BuildRequires: desktop-file-utils
BuildRequires: extra-cmake-modules
BuildRequires: fluidsynth-devel
BuildRequires: freetype-devel
BuildRequires: gcc-c++
BuildRequires: libFAudio-devel
BuildRequires: libappstream-glib
BuildRequires: libatomic
BuildRequires: libevdev-devel
BuildRequires: libslirp-devel
BuildRequires: libxkbcommon-x11-devel
BuildRequires: libXi-devel
BuildRequires: ninja-build
@@ -118,5 +121,5 @@ popd
%{_datadir}/%{name}/roms
%changelog
* Tue Feb 28 2023 Robert de Rooy <robert.de.rooy[AT]gmail.com> 4.0-1
* Sat Aug 26 2023 Robert de Rooy <robert.de.rooy[AT]gmail.com> 4.0-1
- Bump release

View File

@@ -149,7 +149,7 @@ plat_serpt_set_params(void *priv)
BAUDRATE_RANGE(dev->baudrate, 57600, 115200, B57600);
BAUDRATE_RANGE(dev->baudrate, 115200, 0xFFFFFFFF, B115200);
term_attr.c_cflag &= CSIZE;
term_attr.c_cflag &= ~CSIZE;
switch (dev->data_bits) {
case 8:
default:
@@ -165,13 +165,13 @@ plat_serpt_set_params(void *priv)
term_attr.c_cflag |= CS5;
break;
}
term_attr.c_cflag &= CSTOPB;
term_attr.c_cflag &= ~CSTOPB;
if (dev->serial->lcr & 0x04)
term_attr.c_cflag |= CSTOPB;
#if !defined(__linux__)
term_attr.c_cflag &= PARENB | PARODD;
term_attr.c_cflag &= ~(PARENB | PARODD);
#else
term_attr.c_cflag &= PARENB | PARODD | CMSPAR;
term_attr.c_cflag &= ~(PARENB | PARODD | CMSPAR);
#endif
if (dev->serial->lcr & 0x08) {
term_attr.c_cflag |= PARENB;

View File

@@ -144,13 +144,13 @@ ibm8514_log(const char *fmt, ...)
dest_dat = MAX(src_dat, dest_dat); \
break; \
case 0x15: \
dest_dat = (dest_dat - src_dat) / 2; \
dest_dat = (dest_dat - src_dat) >> 1; \
break; \
case 0x16: \
dest_dat = (src_dat - dest_dat) / 2; \
dest_dat = (src_dat - dest_dat) >> 1; \
break; \
case 0x17: \
dest_dat = (dest_dat + src_dat) / 2; \
dest_dat = (dest_dat + src_dat) >> 1; \
break; \
case 0x18: \
dest_dat = MAX(0, (dest_dat - src_dat)); \
@@ -162,7 +162,7 @@ ibm8514_log(const char *fmt, ...)
dest_dat = MAX(0, (src_dat - dest_dat)); \
break; \
case 0x1b: \
dest_dat = MIN(0xff, (dest_dat + src_dat)); \
dest_dat = MIN(~0, (dest_dat + src_dat)); \
break; \
case 0x1c: \
dest_dat = MAX(0, (dest_dat - src_dat)) / 2; \
@@ -174,7 +174,7 @@ ibm8514_log(const char *fmt, ...)
dest_dat = MAX(0, (src_dat - dest_dat)) / 2; \
break; \
case 0x1f: \
dest_dat = (0xff < (src_dat + dest_dat)) ? 0xff : ((src_dat + dest_dat) / 2); \
dest_dat = (~0 < (src_dat + dest_dat)) ? ~0 : ((src_dat + dest_dat) >> 1); \
break; \
} \
}
@@ -1297,7 +1297,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
/*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
the NOP command)*/
ibm8514_log("CMD8514: CMD=%d, full=%04x, pixcntl=%x, count=%d.\n", cmd, dev->accel.cmd, pixcntl, count);
ibm8514_log("CMD8514: CMD=%d, full=%04x, pixcntl=%x, count=%d, frgdmix = %02x, bkgdmix = %02x, polygon=%x.\n", cmd, dev->accel.cmd, pixcntl, count, frgd_mix, bkgd_mix, dev->accel.multifunc[0x0a] & 6);
switch (cmd) {
case 0: /*NOP (Short Stroke Vectors)*/
@@ -3057,13 +3057,39 @@ rect_fill:
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 & 4) && (dev->accel.sy < dev->accel.maj_axis_pcnt)) {
if (!dev->accel.sy) {
WRITE((dev->accel.cy * dev->pitch) + (dev->accel.cx), dest_dat);
} else if ((dev->accel.cmd & 0x40) && dev->accel.sy && (dev->accel.cy == (dev->accel.oldcy + 1))) {
WRITE((dev->accel.cy * dev->pitch) + (dev->accel.cx), dest_dat);
} else if (!(dev->accel.cmd & 0x40) && dev->accel.sy && (dev->accel.err_term >= 0) && (dev->accel.cy == (dev->accel.oldcy + 1))) {
if (dev->accel.cmd & 4) {
if (dev->accel.sy < dev->accel.maj_axis_pcnt) {
if (dev->accel.cmd & 0x40) {
WRITE((dev->accel.cy * dev->pitch) + (dev->accel.cx), dest_dat);
} else {
if (dev->accel.cy == (dev->accel.oldcy + 1)) {
if (dev->accel.cmd & 0x20) {
if (dev->accel.err_term < (dev->accel.destx_distp + dev->accel.desty_axstp)) {
WRITE((dev->accel.cy * dev->pitch) + (dev->accel.cx), dest_dat);
}
} else {
if (dev->accel.err_term >= 0) {
WRITE((dev->accel.cy * dev->pitch) + (dev->accel.cx), dest_dat);
}
}
}
}
}
} else {
if (dev->accel.cmd & 0x40) {
WRITE((dev->accel.cy * dev->pitch) + (dev->accel.cx), dest_dat);
} else {
if (dev->accel.cy == (dev->accel.oldcy + 1)) {
if (dev->accel.cmd & 0x20) {
if (dev->accel.err_term < (dev->accel.destx_distp + dev->accel.desty_axstp)) {
WRITE((dev->accel.cy * dev->pitch) + (dev->accel.cx), dest_dat);
}
} else {
if (dev->accel.err_term >= 0) {
WRITE((dev->accel.cy * dev->pitch) + (dev->accel.cx), dest_dat);
}
}
}
}
}
}
@@ -3080,7 +3106,42 @@ rect_fill:
break;
}
if (dev->accel.err_term >= dev->accel.maj_axis_pcnt) {
/*Step major axis*/
switch (dev->accel.cmd & 0xe0) {
case 0x00:
dev->accel.cx--;
break;
case 0x20:
dev->accel.cx++;
break;
case 0x40:
dev->accel.oldcy = dev->accel.cy;
dev->accel.cy--;
break;
case 0x60:
dev->accel.oldcy = dev->accel.cy;
dev->accel.cy--;
break;
case 0x80:
dev->accel.cx--;
break;
case 0xa0:
dev->accel.cx++;
break;
case 0xc0:
dev->accel.oldcy = dev->accel.cy;
dev->accel.cy++;
break;
case 0xe0:
dev->accel.oldcy = dev->accel.cy;
dev->accel.cy++;
break;
default:
break;
}
if (dev->accel.err_term >= 0) {
dev->accel.err_term += dev->accel.destx_distp;
/*Step minor axis*/
switch (dev->accel.cmd & 0xe0) {
@@ -3119,41 +3180,6 @@ rect_fill:
} else
dev->accel.err_term += dev->accel.desty_axstp;
/*Step major axis*/
switch (dev->accel.cmd & 0xe0) {
case 0x00:
dev->accel.cx--;
break;
case 0x20:
dev->accel.cx++;
break;
case 0x40:
dev->accel.oldcy = dev->accel.cy;
dev->accel.cy--;
break;
case 0x60:
dev->accel.oldcy = dev->accel.cy;
dev->accel.cy--;
break;
case 0x80:
dev->accel.cx--;
break;
case 0xa0:
dev->accel.cx++;
break;
case 0xc0:
dev->accel.oldcy = dev->accel.cy;
dev->accel.cy++;
break;
case 0xe0:
dev->accel.oldcy = dev->accel.cy;
dev->accel.cy++;
break;
default:
break;
}
dev->accel.sy++;
}
break;

View File

@@ -99,6 +99,7 @@ typedef struct mach_t {
uint8_t bank_w;
uint8_t bank_r;
uint16_t shadow_set;
int ext_on;
struct {
uint8_t line_idx;
@@ -2599,7 +2600,6 @@ mach_recalctimings(svga_t *svga)
if (dev->on) {
mach_log("8514/A ON.\n");
svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock((mach->accel.clock_sel >> 2) & 0x0f, svga->clock_gen);
if (dev->local >= 2) {
dev->h_disp = (dev->hdisp + 1) << 3;
dev->h_total = (dev->htotal + 1);
@@ -2614,6 +2614,9 @@ mach_recalctimings(svga_t *svga)
if (dev->dispend == 598)
dev->dispend += 2;
if (dev->h_disp == 1024)
dev->accel.advfunc_cntl |= 4; /*Bit 2 means high resolution e.g.: 1024x768*/
if (dev->accel.advfunc_cntl & 4) {
if (mach->shadow_set & 2) {
if (dev->h_disp == 8) {
@@ -2622,14 +2625,20 @@ mach_recalctimings(svga_t *svga)
dev->v_total = 1536;
dev->v_syncstart = 1536;
}
}
mach_log("Shadow set 2.\n");
svga->clock = (cpuclock * (double) (1ULL << 32)) / 44900000.0;
} else
svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock((mach->accel.clock_sel >> 2) & 0x0f, svga->clock_gen);
} else {
if (mach->shadow_set & 1) {
if (dev->h_disp == 1024) {
dev->h_disp = 640;
dev->dispend = 480;
}
if (dev->h_disp == 1024) {
dev->h_disp = 640;
dev->dispend = 480;
}
if (mach->shadow_set & 1) {
mach_log("Shadow set 1.\n");
svga->clock = (cpuclock * (double) (1ULL << 32)) / 25175000.0;
} else
svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock((mach->accel.clock_sel >> 2) & 0x0f, svga->clock_gen);
}
if (dev->interlace) {
@@ -2721,14 +2730,18 @@ mach_recalctimings(svga_t *svga)
dev->v_total = 1536;
dev->v_syncstart = 1536;
}
}
svga->clock = (cpuclock * (double) (1ULL << 32)) / 44900000.0;
} else
svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock((mach->accel.clock_sel >> 2) & 0x0f, svga->clock_gen);
} else {
if (mach->shadow_set & 1) {
if (dev->h_disp == 1024) {
dev->h_disp = 640;
dev->dispend = 480;
}
if (dev->h_disp == 1024) {
dev->h_disp = 640;
dev->dispend = 480;
}
if (mach->shadow_set & 1) {
svga->clock = (cpuclock * (double) (1ULL << 32)) / 25175000.0;
} else
svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock((mach->accel.clock_sel >> 2) & 0x0f, svga->clock_gen);
}
if (dev->interlace) {
dev->dispend >>= 1;
@@ -2740,7 +2753,7 @@ mach_recalctimings(svga_t *svga)
}
dev->pitch = dev->ext_pitch;
dev->rowoffset = dev->ext_crt_pitch;
mach_log("hv(%d,%d), pitch=%d, rowoffset=%d, gextconfig=%03x.\n", dev->h_disp, dev->dispend, dev->pitch, dev->rowoffset, mach->accel.ext_ge_config & 0xcec0);
mach_log("cntl=%d, hv(%d,%d), pitch=%d, rowoffset=%d, gextconfig=%03x.\n", dev->accel.advfunc_cntl & 4, dev->h_disp, dev->dispend, dev->pitch, dev->rowoffset, mach->accel.ext_ge_config & 0xcec0);
svga->map8 = dev->pallook;
svga->render8514 = ibm8514_render_8bpp;
if (mach->regs[0xb8] & 0x40)
@@ -2750,6 +2763,7 @@ mach_recalctimings(svga_t *svga)
if (!svga->scrblank && (svga->crtc[0x17] & 0x80) && svga->attr_palette_enable) {
if (((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1))) {
mach_log("VGA clock=%02x.\n", mach->regs[0xa7] & 0x80);
svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clock_sel, svga->clock_gen);
if (mach->regs[0xa7] & 0x80)
svga->clock *= 3;
@@ -3688,7 +3702,9 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
} else {
dev->on = (dev->accel.advfunc_cntl & 0x01);
vga_on = !dev->on;
mach_log("ATI 8514/A: (0x4ae8) val = %04x\n", val & 0x01);
mach->ext_on = dev->on;
mach_log("ATI 8514/A: (0x4ae9) val = %04x, ext = %d.\n", dev->accel.advfunc_cntl & 0x01, mach->ext_on);
mach32_updatemapping(mach);
}
svga_recalctimings(svga);
break;
@@ -3777,6 +3793,7 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
case 0x36ee:
case 0x36ef:
mach_log("ATI 8514/A: (0x%04x) val = %04x.\n", port, val);
WRITE8(port, mach->misc, val);
mach->misc &= 0xfff0;
break;
@@ -3813,21 +3830,27 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
case 0x4aef:
WRITE8(port, mach->accel.clock_sel, val);
if (port & 1) {
mach_log("ATI 8514/A: (0x4aee) val = %04x\n", mach->accel.clock_sel & 0x01);
dev->on = mach->accel.clock_sel & 0x01;
vga_on = !dev->on;
pclog("ATI 8514/A: (0x4aef) val = %04x, ext = %d.\n", mach->accel.clock_sel & 0x01, mach->ext_on);
}
svga_recalctimings(svga);
break;
case 0x52ee:
case 0x52ef:
mach_log("ATI 8514/A: (0x%04x) val = %04x.\n", port, val);
WRITE8(port, mach->accel.scratch0, val);
if (port & 1)
mach->ext_on = 1;
break;
case 0x56ee:
case 0x56ef:
mach_log("ATI 8514/A: (0x%04x) val = %04x.\n", port, val);
WRITE8(port, mach->accel.scratch1, val);
if (port & 1)
mach->ext_on = 1;
break;
case 0x5aee:
@@ -4744,13 +4767,8 @@ mach32_write_linear(uint32_t addr, uint8_t val, void *priv)
static void
mach32_write(uint32_t addr, uint8_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
const ibm8514_t *dev = &svga->dev8514;
if (!dev->on) {
svga_write(addr, val, svga);
return;
}
mach_t *mach = (mach_t *) priv;
svga_t *svga = &mach->svga;
addr = (addr & svga->banked_mask) + svga->write_bank;
mach32_write_linear(addr, val, svga);
@@ -4759,33 +4777,25 @@ mach32_write(uint32_t addr, uint8_t val, void *priv)
static void
mach32_writew(uint32_t addr, uint16_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
const ibm8514_t *dev = &svga->dev8514;
mach_t *mach = (mach_t *) priv;
svga_t *svga = &mach->svga;
if (!dev->on) {
svga_writew(addr, val, svga);
return;
}
mach32_write(addr, val & 0xff, svga);
mach32_write(addr + 1, val >> 8, svga);
addr = (addr & svga->banked_mask) + svga->write_bank;
mach32_write_linear(addr, val & 0xff, svga);
mach32_write_linear(addr + 1, val >> 8, svga);
}
static void
mach32_writel(uint32_t addr, uint32_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
const ibm8514_t *dev = &svga->dev8514;
mach_t *mach = (mach_t *) priv;
svga_t *svga = &mach->svga;
if (!dev->on) {
svga_writel(addr, val, svga);
return;
}
mach32_write(addr, val & 0xff, svga);
mach32_write(addr + 1, val >> 8, svga);
mach32_write(addr + 2, val >> 16, svga);
mach32_write(addr + 3, val >> 24, svga);
addr = (addr & svga->banked_mask) + svga->write_bank;
mach32_write_linear(addr, val & 0xff, svga);
mach32_write_linear(addr + 1, val >> 8, svga);
mach32_write_linear(addr + 2, val >> 16, svga);
mach32_write_linear(addr + 3, val >> 24, svga);
}
static uint8_t
@@ -4872,15 +4882,10 @@ mach32_read_linear(uint32_t addr, void *priv)
static uint8_t
mach32_read(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
const ibm8514_t *dev = &svga->dev8514;
mach_t *mach = (mach_t *) priv;
svga_t *svga = &mach->svga;
uint8_t ret;
if (!dev->on) {
ret = svga_read(addr, svga);
return ret;
}
addr = (addr & svga->banked_mask) + svga->read_bank;
ret = mach32_read_linear(addr, svga);
return ret;
@@ -4889,36 +4894,28 @@ mach32_read(uint32_t addr, void *priv)
static uint16_t
mach32_readw(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
const ibm8514_t *dev = &svga->dev8514;
mach_t *mach = (mach_t *) priv;
svga_t *svga = &mach->svga;
uint16_t ret;
if (!dev->on) {
ret = svga_readw(addr, svga);
return ret;
}
ret = mach32_read(addr, svga);
ret |= (mach32_read(addr + 1, svga) << 8);
addr = (addr & svga->banked_mask) + svga->read_bank;
ret = mach32_read_linear(addr, svga);
ret |= (mach32_read_linear(addr + 1, svga) << 8);
return ret;
}
static uint32_t
mach32_readl(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
const ibm8514_t *dev = &svga->dev8514;
mach_t *mach = (mach_t *) priv;
svga_t *svga = &mach->svga;
uint32_t ret;
if (!dev->on) {
ret = svga_readl(addr, svga);
return ret;
}
ret = mach32_read(addr, svga);
ret |= (mach32_read(addr + 1, svga) << 8);
ret |= (mach32_read(addr + 2, svga) << 16);
ret |= (mach32_read(addr + 3, svga) << 24);
addr = (addr & svga->banked_mask) + svga->read_bank;
ret = mach32_read_linear(addr, svga);
ret |= (mach32_read_linear(addr + 1, svga) << 8);
ret |= (mach32_read_linear(addr + 2, svga) << 16);
ret |= (mach32_read_linear(addr + 3, svga) << 24);
return ret;
}
@@ -4986,7 +4983,7 @@ mach32_ap_writel(uint32_t addr, uint32_t val, void *priv)
mach_accel_outw(0x02e8 + (port_dword << 8) + 4, val >> 16, mach);
}
} else {
mach_log("Linear WORDL Write=%08x, val=%08x, mode=%d, rop=%02x.\n", addr, val, mach->svga.writemode, mach->svga.gdcreg[3] & 0x18);
mach_log("Linear WORDL Write=%08x.\n", addr);
mach32_write_linear(addr, val & 0xff, svga);
mach32_write_linear(addr + 1, val >> 8, svga);
mach32_write_linear(addr + 2, val >> 16, svga);
@@ -5069,6 +5066,7 @@ static void
mach32_updatemapping(mach_t *mach)
{
svga_t *svga = &mach->svga;
ibm8514_t *dev = &svga->dev8514;
if (mach->pci_bus && (!(mach->pci_regs[PCI_REG_COMMAND] & PCI_COMMAND_MEM))) {
mem_mapping_disable(&svga->mapping);
@@ -5118,6 +5116,13 @@ mach32_updatemapping(mach_t *mach)
mach->ap_size = 4;
mem_mapping_disable(&mach->mmio_linear_mapping);
}
if (mach->ext_on && (dev->local >= 2)) {
mem_mapping_set_handler(&svga->mapping, mach32_read, mach32_readw, mach32_readl, mach32_write, mach32_writew, mach32_writel);
mem_mapping_set_p(&svga->mapping, mach);
} else {
mem_mapping_set_handler(&svga->mapping, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel);
mem_mapping_set_p(&svga->mapping, svga);
}
}
static void
@@ -5692,7 +5697,6 @@ mach8_init(const device_t *info)
mach->config1 |= 0x0400;
svga->clock_gen = device_add(&ati18811_0_device);
}
mem_mapping_set_handler(&svga->mapping, mach32_read, mach32_readw, mach32_readl, mach32_write, mach32_writew, mach32_writel);
mem_mapping_add(&mach->mmio_linear_mapping, 0, 0, mach32_ap_readb, mach32_ap_readw, mach32_ap_readl, mach32_ap_writeb, mach32_ap_writew, mach32_ap_writel, NULL, MEM_MAPPING_EXTERNAL, mach);
mem_mapping_disable(&mach->mmio_linear_mapping);
} else {

View File

@@ -1739,6 +1739,10 @@ gd54xx_recalctimings(svga_t *svga)
svga->interlace = (svga->crtc[0x1a] & 0x01);
if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /*Text mode*/
svga->interlace = 0;
}
svga->map8 = svga->pallook;
if (svga->seqregs[7] & CIRRUS_SR7_BPP_SVGA) {
if (linedbl)
@@ -1921,6 +1925,13 @@ gd54xx_recalctimings(svga_t *svga)
}
svga->vram_display_mask = (svga->crtc[0x1b] & 2) ? gd54xx->vram_mask : 0x3ffff;
if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /*Text mode*/
if (svga->seqregs[1] & 8) {
svga->render = svga_render_text_40;
} else
svga->render = svga_render_text_80;
}
}
static void

View File

@@ -1085,7 +1085,7 @@ im1024_speed_changed(void *priv)
const device_t im1024_device = {
.name = "ImageManager 1024",
.internal_name = "im1024",
.flags = DEVICE_ISA | DEVICE_AT,
.flags = DEVICE_ISA,
.local = 0,
.init = im1024_init,
.close = im1024_close,

View File

@@ -341,23 +341,44 @@ paradise_recalctimings(svga_t *svga)
}
}
if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /*Text mode*/
svga->interlace = 0;
}
if (paradise->type < WD90C30) {
if (svga->bpp >= 8 && !svga->lowres) {
if ((svga->bpp >= 8) && !svga->lowres) {
svga->render = svga_render_8bpp_highres;
}
} else {
if (svga->bpp >= 8 && !svga->lowres) {
if ((svga->bpp >= 8) && !svga->lowres) {
if (svga->bpp == 16) {
svga->render = svga_render_16bpp_highres;
svga->hdisp >>= 1;
if (svga->hdisp == 788)
svga->hdisp += 12;
if (svga->hdisp == 800)
svga->ma_latch -= 3;
} else if (svga->bpp == 15) {
svga->render = svga_render_15bpp_highres;
svga->hdisp >>= 1;
if (svga->hdisp == 788)
svga->hdisp += 12;
if (svga->hdisp == 800)
svga->ma_latch -= 3;
} else {
svga->render = svga_render_8bpp_highres;
}
}
}
if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /*Text mode*/
if (svga->hdisp == 360)
svga->hdisp <<= 1;
if (svga->seqregs[1] & 8) {
svga->render = svga_render_text_40;
} else
svga->render = svga_render_text_80;
}
}
static void

View File

@@ -830,7 +830,7 @@ svga_poll(void *priv)
return;
}
if (xga_active && xga->on) {
if ((xga->disp_cntl_2 & 7) >= 3) {
if ((xga->disp_cntl_2 & 7) >= 2) {
xga_poll(xga, svga);
return;
}
@@ -1247,11 +1247,12 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *priv)
if (((xga->op_mode & 7) >= 4) && (xga->aperture_cntl >= 1)) {
if (val == 0xa5) { /*Memory size test of XGA*/
xga->test = val;
xga->a5_test = 1;
if (addr == 0xa0001)
xga->a5_test = 1;
xga->on = 0;
vga_on = 1;
xga->disp_cntl_2 = 0;
xga->clk_sel_1 = 0;
svga_log("XGA test1 addr = %05x.\n", addr);
return;
} else if (val == 0x5a) {
@@ -1259,7 +1260,7 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *priv)
xga->on = 0;
vga_on = 1;
xga->disp_cntl_2 = 0;
xga->clk_sel_1 = 0;
svga_log("XGA test2 addr = %05x.\n", addr);
return;
} else if ((addr == 0xa0000) || (addr == 0xa0010)) {
addr += xga->write_bank;
@@ -1469,6 +1470,7 @@ svga_read_common(uint32_t addr, uint8_t linear, void *priv)
xga->on = 1;
vga_on = 0;
} else if ((addr == 0xa0000) && xga->a5_test) { /*This is required by XGAKIT to pass the memory test*/
svga_log("A5 test bank = %x.\n", addr);
addr += xga->read_bank;
ret = xga->vram[addr & xga->vram_mask];
} else {
@@ -1476,7 +1478,7 @@ svga_read_common(uint32_t addr, uint8_t linear, void *priv)
xga->on = 1;
vga_on = 0;
}
svga_log("A5 read: XGA ON = %d, addr = %05x.\n", xga->on, addr);
svga_log("A5 read: XGA ON = %d, addr = %05x, ret = %02x, test1 = %x.\n", xga->on, addr, ret, xga->a5_test);
return ret;
} else if (xga->test == 0x5a) {
ret = xga->test;

View File

@@ -1399,6 +1399,7 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
uint32_t trans_col = (tgui->accel.flags & TGUI_TRANSREV) ? tgui->accel.fg_col : tgui->accel.bg_col;
uint16_t *vram_w = (uint16_t *) svga->vram;
uint32_t *vram_l = (uint32_t *) svga->vram;
uint8_t ger22upper = (tgui->accel.ger22 >> 8);
if (tgui->accel.bpp == 0) {
trans_col &= 0xff;
@@ -1454,6 +1455,16 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
}
}
/*For delayed mode switches.*/
if (tgui->type == TGUI_9440) {
if (tgui->accel.pitch == 800)
tgui->accel.pitch += 32;
if (tgui->accel.bpp == 1) {
if (!ger22upper)
tgui->accel.pitch = svga->rowoffset << 2;
}
}
#if 0
pclog("TGUI accel command = %x, ger22 = %04x, hdisp = %d, dispend = %d, vtotal = %d, rowoffset = %d, svgabpp = %d, interlace = %d, accelbpp = %d, pitch = %d.\n", tgui->accel.command, tgui->accel.ger22, svga->hdisp, svga->dispend, svga->vtotal, svga->rowoffset, svga->bpp, svga->interlace, tgui->accel.bpp, tgui->accel.pitch);
#endif
@@ -2066,6 +2077,19 @@ tgui_accel_out(uint16_t addr, uint8_t val, void *priv)
case 0x2123:
//pclog("Pitch IO23: val = %02x, rowoffset = %x, pitch = %d.\n", val, svga->rowoffset, tgui->accel.pitch);
switch (svga->bpp) {
case 8:
case 24:
tgui->accel.bpp = 0;
break;
case 15:
case 16:
tgui->accel.bpp = 1;
break;
case 32:
tgui->accel.bpp = 3;
break;
}
tgui->accel.ger22 = (tgui->accel.ger22 & 0xff) | (val << 8);
if ((val & 0x80) || ((val & 0xc0) == 0x40))
tgui->accel.pitch = svga->rowoffset << 3;
@@ -2075,15 +2099,14 @@ tgui_accel_out(uint16_t addr, uint8_t val, void *priv)
tgui->accel.pitch = 1024;
}
if (tgui->accel.pitch == 800)
tgui->accel.pitch += 32;
if (tgui->accel.bpp == 1)
tgui->accel.pitch >>= 1;
else if (tgui->accel.bpp == 3)
tgui->accel.pitch >>= 2;
if (tgui->accel.pitch == 800)
tgui->accel.pitch += 32;
svga_recalctimings(svga);
break;
@@ -2722,7 +2745,19 @@ tgui_accel_write(uint32_t addr, uint8_t val, void *priv)
break;
case 0x23:
//pclog("Pitch MM23: val = %02x, rowoffset = %x, pitch = %d.\n", val, svga->rowoffset, tgui->accel.pitch);
switch (svga->bpp) {
case 8:
case 24:
tgui->accel.bpp = 0;
break;
case 15:
case 16:
tgui->accel.bpp = 1;
break;
case 32:
tgui->accel.bpp = 3;
break;
}
tgui->accel.ger22 = (tgui->accel.ger22 & 0xff) | (val << 8);
if ((val & 0x80) || ((val & 0xc0) == 0x40))
tgui->accel.pitch = svga->rowoffset << 3;
@@ -2732,14 +2767,15 @@ tgui_accel_write(uint32_t addr, uint8_t val, void *priv)
tgui->accel.pitch = 1024;
}
if (tgui->accel.pitch == 800)
tgui->accel.pitch += 32;
if (tgui->accel.bpp == 1)
tgui->accel.pitch >>= 1;
else if (tgui->accel.bpp == 3)
tgui->accel.pitch >>= 2;
if (tgui->accel.pitch == 800)
tgui->accel.pitch += 32;
//pclog("Pitch MM23: fullval = %04x, rowoffset = %x, pitch = %d.\n", tgui->accel.ger22, svga->rowoffset, tgui->accel.pitch);
svga_recalctimings(svga);
break;

View File

@@ -49,6 +49,7 @@ static uint8_t xga_ext_inb(uint16_t addr, void *priv);
static void xga_writew(uint32_t addr, uint16_t val, void *priv);
static uint16_t xga_readw(uint32_t addr, void *priv);
static void xga_render_4bpp(svga_t *svga);
static void xga_render_8bpp(svga_t *svga);
static void xga_render_16bpp(svga_t *svga);
@@ -376,7 +377,7 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val)
case 0x51:
xga_log("Reg51 write = %02x.\n", val);
xga->disp_cntl_2 = val;
xga->on = ((val & 7) >= 3);
xga->on = ((val & 7) >= 2);
vga_on = !xga->on;
svga_recalctimings(svga);
break;
@@ -406,7 +407,7 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val)
if ((xga->sprite_pos >= 0) && (xga->sprite_pos <= 16)) {
if ((xga->op_mode & 7) >= 5)
xga->cursor_data_on = 1;
else if ((xga->sprite_pos >= 1) || ((xga->disp_cntl_2 & 7) == 4))
else if ((xga->sprite_pos >= 1) || (((xga->disp_cntl_2 & 7) == 2) || (xga->disp_cntl_2 & 7) == 4))
xga->cursor_data_on = 1;
else if (xga->aperture_cntl == 0) {
if (xga->linear_endian_reverse && !(xga->access_mode & 8))
@@ -888,7 +889,7 @@ xga_ext_inb(uint16_t addr, void *priv)
d = MIN(s, d); \
break; \
case 0x12: \
d = MIN(0xff, s + d); \
d = MIN(~0, s + d); \
break; \
case 0x13: \
d = MAX(0, d - s); \
@@ -908,7 +909,7 @@ xga_accel_read_pattern_map_pixel(svga_t *svga, int x, int y, int map, uint32_t b
const xga_t *xga = &svga->xga;
uint32_t addr = base;
int bits;
uint32_t byte;
uint8_t byte;
uint8_t px;
int skip = 0;
@@ -978,6 +979,15 @@ xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int
}
px = (byte >> bits) & 1;
return px;
case 2: /*4-bit*/
addr += (y * (width >> 1));
addr += (x >> 1);
if (!skip) {
READ(addr, byte);
} else {
byte = mem_readb_phys(addr);
}
return byte;
case 3: /*8-bit*/
addr += (y * width);
addr += x;
@@ -1060,6 +1070,29 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui
}
mem_writeb_phys(addr, byte);
break;
case 2: /*4-bit*/
addr += (y * (width >> 1));
addr += (x >> 1);
if (!skip) {
READ(addr, byte);
} else {
byte = mem_readb_phys(addr);
}
if (xga->linear_endian_reverse) {
mask = 0x0f << ((1 - (x & 1)) << 2);
} else {
if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8)) {
mask = 0x0f << ((x & 1) << 2);
} else {
mask = 0x0f << ((1 - (x & 1)) << 2);
}
}
byte = (byte & ~mask) | (pixel & mask);
if (!skip) {
WRITE(addr, byte);
}
mem_writeb_phys(addr, byte);
break;
case 3: /*8-bit*/
addr += (y * width);
addr += x;
@@ -1076,14 +1109,12 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui
pixel = ((pixel & 0xff00) >> 8) | ((pixel & 0x00ff) << 8);
else if (xga->access_mode & 8)
pixel = ((pixel & 0xff00) >> 8) | ((pixel & 0x00ff) << 8);
mem_writew_phys(addr, pixel);
} else {
if (!skip) {
WRITEW(addr, pixel);
}
mem_writew_phys(addr, pixel);
}
mem_writew_phys(addr, pixel);
break;
default:
@@ -1243,6 +1274,7 @@ xga_line_draw_write(svga_t *svga)
int x = 0;
int dx;
int dy;
int draw_pixel;
dminor = (xga->accel.bres_k1);
if (xga->accel.bres_k1 & 0x2000)
@@ -1257,7 +1289,7 @@ xga_line_draw_write(svga_t *svga)
err = (xga->accel.bres_err_term);
if (xga->accel.bres_err_term & 0x2000)
destxtmp |= ~0x1fff;
err |= ~0x1fff;
if (xga->accel.octant & 0x02) {
ydir = -1;
@@ -1279,6 +1311,9 @@ xga_line_draw_write(svga_t *svga)
if (xga->accel.dst_map_y >= 0x1800)
dy |= ~0x17ff;
if ((xga->accel.command & 0x30) == 0x30)
xga_log("Line Draw Write: BLTWIDTH=%d, BLTHEIGHT=%d, FRGDCOLOR=%04x, XDIR=%i, YDIR=%i, steep=%s, ERR=%04x.\n", xga->accel.blt_width, xga->accel.blt_height, xga->accel.frgd_color & 0xffff, xdir, ydir, (xga->accel.octant & 0x01) ? "0" : "1", err);
if (xga->accel.octant & 0x01) {
steep = 0;
SWAP(dx, dy);
@@ -1287,6 +1322,7 @@ xga_line_draw_write(svga_t *svga)
if (xga->accel.pat_src == 8) {
while (y >= 0) {
draw_pixel = 1;
if (xga->accel.command & 0xc0) {
if (steep) {
if ((dx >= xga->accel.mask_map_origin_x_off) && (dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (dy >= xga->accel.mask_map_origin_y_off) && (dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) {
@@ -1303,6 +1339,21 @@ xga_line_draw_write(svga_t *svga)
xga_accel_write_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dest_dat, xga->accel.px_map_width[xga->accel.dst_map] + 1);
else if (((xga->accel.command & 0x30) == 0x20) && y)
xga_accel_write_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dest_dat, xga->accel.px_map_width[xga->accel.dst_map] + 1);
else if ((xga->accel.command & 0x30) == 0x30) {
if (err < 0)
draw_pixel = 0;
else {
if (ydir == -1) { /*Bottom-to-Top*/
if (!x)
draw_pixel = 0;
} else { /*Top-to-Bottom*/
if (!y)
draw_pixel = 0;
}
}
if (draw_pixel)
xga_accel_write_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dest_dat, xga->accel.px_map_width[xga->accel.dst_map] + 1);
}
}
}
} else {
@@ -1320,6 +1371,17 @@ xga_line_draw_write(svga_t *svga)
xga_accel_write_map_pixel(svga, dy, dx, xga->accel.dst_map, dstbase, dest_dat, xga->accel.px_map_width[xga->accel.dst_map] + 1);
else if (((xga->accel.command & 0x30) == 0x20) && y)
xga_accel_write_map_pixel(svga, dy, dx, xga->accel.dst_map, dstbase, dest_dat, xga->accel.px_map_width[xga->accel.dst_map] + 1);
else if ((xga->accel.command & 0x30) == 0x30) {
if (xdir == -1) { /*Bottom-to-Top*/
if (!x)
draw_pixel = 0;
} else { /*Top-to-Bottom*/
if (!y)
draw_pixel = 0;
}
if (draw_pixel)
xga_accel_write_map_pixel(svga, dy, dx, xga->accel.dst_map, dstbase, dest_dat, xga->accel.px_map_width[xga->accel.dst_map] + 1);
}
}
}
}
@@ -1338,6 +1400,21 @@ xga_line_draw_write(svga_t *svga)
xga_accel_write_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dest_dat, xga->accel.px_map_width[xga->accel.dst_map] + 1);
else if (((xga->accel.command & 0x30) == 0x20) && y)
xga_accel_write_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dest_dat, xga->accel.px_map_width[xga->accel.dst_map] + 1);
else if ((xga->accel.command & 0x30) == 0x30) {
if (err < 0)
draw_pixel = 0;
else {
if (ydir == -1) { /*Bottom-to-Top*/
if (!x)
draw_pixel = 0;
} else { /*Top-to-Bottom*/
if (!y)
draw_pixel = 0;
}
}
if (draw_pixel)
xga_accel_write_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dest_dat, xga->accel.px_map_width[xga->accel.dst_map] + 1);
}
}
} else {
src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.src_map_x & 0xfff, xga->accel.src_map_y & 0xfff, xga->accel.src_map, srcbase, xga->accel.px_map_width[xga->accel.src_map] + 1, 1) : xga->accel.frgd_color;
@@ -1353,6 +1430,17 @@ xga_line_draw_write(svga_t *svga)
xga_accel_write_map_pixel(svga, dy, dx, xga->accel.dst_map, dstbase, dest_dat, xga->accel.px_map_width[xga->accel.dst_map] + 1);
else if (((xga->accel.command & 0x30) == 0x20) && y)
xga_accel_write_map_pixel(svga, dy, dx, xga->accel.dst_map, dstbase, dest_dat, xga->accel.px_map_width[xga->accel.dst_map] + 1);
else if ((xga->accel.command & 0x30) == 0x30) {
if (xdir == -1) { /*Bottom-to-Top*/
if (!x)
draw_pixel = 0;
} else { /*Top-to-Bottom*/
if (!y)
draw_pixel = 0;
}
if (draw_pixel)
xga_accel_write_map_pixel(svga, dy, dx, xga->accel.dst_map, dstbase, dest_dat, xga->accel.px_map_width[xga->accel.dst_map] + 1);
}
}
}
}
@@ -1361,7 +1449,7 @@ xga_line_draw_write(svga_t *svga)
break;
}
while (err > 0) {
while (err >= 0) {
dy += ydir;
err -= (dmajor << 1);
}
@@ -1383,10 +1471,13 @@ xga_line_draw_write(svga_t *svga)
}
}
#undef SWAP
static void
xga_bitblt(svga_t *svga)
{
xga_t *xga = &svga->xga;
uint8_t area_state = 0;
uint32_t src_dat;
uint32_t dest_dat;
uint32_t old_dest_dat;
@@ -1405,9 +1496,12 @@ xga_bitblt(svga_t *svga)
#endif
uint32_t frgdcol = xga->accel.frgd_color;
uint32_t bkgdcol = xga->accel.bkgd_color;
int mix = 0;
int mix = 0;
int xdir;
int ydir;
int skip = 0;
int x = 0;
int y = 0;
if (xga->accel.octant & 0x02) {
ydir = -1;
@@ -1556,17 +1650,105 @@ xga_bitblt(svga_t *svga)
xga_log("Pattern Map = %d: CMD = %08x: PATBase = %08x, SRCBase = %08x, DSTBase = %08x\n",
xga->accel.pat_src, xga->accel.command, patbase, srcbase, dstbase);
xga_log("CMD = %08x: Y = %d, X = %d, patsrc = %02x, srcmap = %d, dstmap = %d, py = %d, "
"sy = %d, dy = %d, width0 = %d, width1 = %d, width2 = %d, width3 = %d\n",
"sy = %d, dy = %d, width0 = %d, width1 = %d, width2 = %d, width3 = %d, bkgdcol = %02x\n",
xga->accel.command, xga->accel.y, xga->accel.x, xga->accel.pat_src,
xga->accel.src_map, xga->accel.dst_map, xga->accel.py, xga->accel.sy, xga->accel.dy,
xga->accel.px_map_width[0], xga->accel.px_map_width[1],
xga->accel.px_map_width[2], xga->accel.px_map_width[3]);
xga->accel.px_map_width[2], xga->accel.px_map_width[3], bkgdcol);
while (xga->accel.y >= 0) {
mix = xga_accel_read_pattern_map_pixel(svga, xga->accel.px, xga->accel.py, xga->accel.pat_src, patbase, patwidth + 1);
if (((xga->accel.command >> 24) & 0x0f) == 0x0a) {
while (xga->accel.y >= 0) {
mix = xga_accel_read_pattern_map_pixel(svga, xga->accel.px, xga->accel.py, xga->accel.pat_src, patbase, patwidth + 1);
if (mix)
area_state ^= 1;
if (xga->accel.command & 0xc0) {
if ((xga->accel.dx >= xga->accel.mask_map_origin_x_off) && (xga->accel.dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (xga->accel.dy >= xga->accel.mask_map_origin_y_off) && (xga->accel.dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) {
if (xga->accel.command & 0xc0) {
if ((xga->accel.dx >= xga->accel.mask_map_origin_x_off) && (xga->accel.dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (xga->accel.dy >= xga->accel.mask_map_origin_y_off) && (xga->accel.dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) {
if (area_state)
src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol;
else
src_dat = (((xga->accel.command >> 30) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : bkgdcol;
if ((xga->accel.px_map_format[xga->accel.dst_map] & 7) <= 3)
src_dat &= 0xff;
dest_dat = xga_accel_read_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) {
old_dest_dat = dest_dat;
ROP(area_state, dest_dat, src_dat);
dest_dat = (dest_dat & plane_mask) | (old_dest_dat & ~plane_mask);
xga_log("1SRCDat=%02x, DSTDat=%02x, Old=%02x, MIX=%d.\n", src_dat, dest_dat, old_dest_dat, area_state);
xga_accel_write_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
}
}
} else {
if (area_state)
src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol;
else
src_dat = (((xga->accel.command >> 30) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : bkgdcol;
if ((xga->accel.px_map_format[xga->accel.dst_map] & 7) <= 3)
src_dat &= 0xff;
dest_dat = xga_accel_read_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) {
old_dest_dat = dest_dat;
ROP(area_state, dest_dat, src_dat);
dest_dat = (dest_dat & plane_mask) | (old_dest_dat & ~plane_mask);
xga_log("2Fill: NumXY(%d,%d): DXY(%d,%d): SRCDat=%02x, DSTDat=%02x, Old=%02x, frgdcol=%02x, bkgdcol=%02x, MIX=%d, frgdmix=%02x, bkgdmix=%02x, dstmapfmt=%02x, srcmapfmt=%02x, srcmapnum=%d.\n", x, y, xga->accel.dx, xga->accel.dy, src_dat, dest_dat, old_dest_dat, frgdcol, bkgdcol, area_state, xga->accel.frgd_mix & 0x1f, xga->accel.bkgd_mix & 0x1f, xga->accel.px_map_format[xga->accel.dst_map] & 0x0f, xga->accel.px_map_format[xga->accel.src_map] & 0x0f, xga->accel.src_map);
xga_accel_write_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
}
}
xga->accel.sx = ((xga->accel.sx + 1) & srcwidth) | (xga->accel.sx & ~srcwidth);
xga->accel.px = ((xga->accel.px + 1) & patwidth) | (xga->accel.px & ~patwidth);
xga->accel.dx++;
xga->accel.x--;
x++;
if (xga->accel.x < 0) {
area_state = 0;
x = 0;
xga->accel.y--;
xga->accel.x = xga->accel.blt_width & 0xfff;
xga->accel.dx = xga->accel.dst_map_x & 0x1fff;
if (xga->accel.dst_map_x >= 0x1800)
xga->accel.dx |= ~0x17ff;
xga->accel.sx = xga->accel.src_map_x & 0xfff;
xga->accel.px = xga->accel.pat_map_x & 0xfff;
xga->accel.sy = ((xga->accel.sy + ydir) & srcheight) | (xga->accel.sy & ~srcheight);
xga->accel.py += ydir;
xga->accel.dy += ydir;
y++;
if (xga->accel.y < 0) {
xga->accel.dst_map_x = xga->accel.dx;
xga->accel.dst_map_y = xga->accel.dy;
return;
}
}
}
} else {
while (xga->accel.y >= 0) {
mix = xga_accel_read_pattern_map_pixel(svga, xga->accel.px, xga->accel.py, xga->accel.pat_src, patbase, patwidth + 1);
if (xga->accel.command & 0xc0) {
if ((xga->accel.dx >= xga->accel.mask_map_origin_x_off) && (xga->accel.dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (xga->accel.dy >= xga->accel.mask_map_origin_y_off) && (xga->accel.dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) {
if (mix) {
src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol;
} else {
src_dat = (((xga->accel.command >> 30) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : bkgdcol;
}
dest_dat = xga_accel_read_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) {
old_dest_dat = dest_dat;
ROP(mix, dest_dat, src_dat);
dest_dat = (dest_dat & plane_mask) | (old_dest_dat & ~plane_mask);
xga_accel_write_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
}
}
} else {
if (mix) {
src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol;
} else {
@@ -1580,49 +1762,36 @@ xga_bitblt(svga_t *svga)
xga_accel_write_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
}
}
} else {
if (mix) {
src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol;
} else {
src_dat = (((xga->accel.command >> 30) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : bkgdcol;
}
dest_dat = xga_accel_read_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) {
old_dest_dat = dest_dat;
ROP(mix, dest_dat, src_dat);
dest_dat = (dest_dat & plane_mask) | (old_dest_dat & ~plane_mask);
xga_accel_write_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
}
}
xga->accel.sx += xdir;
if (xga->accel.pattern)
xga->accel.px = ((xga->accel.px + xdir) & patwidth) | (xga->accel.px & ~patwidth);
else
xga->accel.px += xdir;
xga->accel.dx += xdir;
xga->accel.x--;
if (xga->accel.x < 0) {
xga->accel.y--;
xga->accel.x = (xga->accel.blt_width & 0xfff);
xga->accel.dx = xga->accel.dst_map_x & 0x1fff;
if (xga->accel.dst_map_x >= 0x1800)
xga->accel.dx |= ~0x17ff;
xga->accel.sx = xga->accel.src_map_x & 0xfff;
xga->accel.px = xga->accel.pat_map_x & 0xfff;
xga->accel.sy += ydir;
xga->accel.sx += xdir;
if (xga->accel.pattern)
xga->accel.py = ((xga->accel.py + ydir) & patheight) | (xga->accel.py & ~patheight);
xga->accel.px = ((xga->accel.px + xdir) & patwidth) | (xga->accel.px & ~patwidth);
else
xga->accel.py += ydir;
xga->accel.dy += ydir;
xga->accel.px += xdir;
xga->accel.dx += xdir;
xga->accel.x--;
if (xga->accel.x < 0) {
xga->accel.y--;
xga->accel.x = (xga->accel.blt_width & 0xfff);
if (xga->accel.y < 0) {
xga->accel.dst_map_x = xga->accel.dx;
xga->accel.dst_map_y = xga->accel.dy;
return;
xga->accel.dx = xga->accel.dst_map_x & 0x1fff;
if (xga->accel.dst_map_x >= 0x1800)
xga->accel.dx |= ~0x17ff;
xga->accel.sx = xga->accel.src_map_x & 0xfff;
xga->accel.px = xga->accel.pat_map_x & 0xfff;
xga->accel.sy += ydir;
if (xga->accel.pattern)
xga->accel.py = ((xga->accel.py + ydir) & patheight) | (xga->accel.py & ~patheight);
else
xga->accel.py += ydir;
xga->accel.dy += ydir;
if (xga->accel.y < 0) {
xga->accel.dst_map_x = xga->accel.dx;
xga->accel.dst_map_y = xga->accel.dy;
return;
}
}
}
}
@@ -2054,24 +2223,29 @@ exec_command:
#endif
switch ((xga->accel.command >> 24) & 0x0f) {
case 2: /*Short Stroke Vectors Read */
xga_log("Short Stroke Vectors Read.\n");
break;
case 3: /*Bresenham Line Draw Read*/
xga_log("Line Draw Read\n");
break;
case 4: /*Short Stroke Vectors*/
xga_log("Short Stroke Vectors.\n");
case 4: /*Short Stroke Vectors Write*/
xga_log("Short Stroke Vectors Write.\n");
break;
case 5: /*Bresenham Line Draw Write*/
xga_log("Line Draw Write.\n");
xga_line_draw_write(svga);
break;
case 8: /*BitBLT*/
xga_log("BitBLT.\n");
xga_bitblt(svga);
break;
case 9: /*Inverting BitBLT*/
xga_log("Inverting BitBLT\n");
break;
case 0x0a: /*Area Fill*/
xga_log("Area Fill.\n");
xga_log("Area Fill BitBLT.\n");
xga_bitblt(svga);
break;
default:
@@ -2355,6 +2529,47 @@ xga_render_overscan_right(xga_t *xga, svga_t *svga)
*line_ptr++ = svga->overscan_color;
}
static void
xga_render_4bpp(svga_t *svga)
{
xga_t *xga = &svga->xga;
uint32_t *p;
uint32_t dat;
if ((xga->displine + svga->y_add) < 0)
return;
if (xga->changedvram[xga->ma >> 12] || xga->changedvram[(xga->ma >> 12) + 1] || svga->fullchange) {
p = &svga->monitor->target_buffer->line[xga->displine + svga->y_add][svga->x_add];
if (xga->firstline_draw == 2000)
xga->firstline_draw = xga->displine;
xga->lastline_draw = xga->displine;
for (int x = 0; x <= xga->h_disp; x += 16) {
dat = *(uint32_t *) (&xga->vram[xga->ma & xga->vram_mask]);
p[0] = xga->pallook[(dat >> 4) & 0x0f];
p[1] = xga->pallook[dat & 0x0f];
p[2] = xga->pallook[(dat >> 12) & 0x0f];
p[3] = xga->pallook[(dat >> 8) & 0x0f];
p[4] = xga->pallook[(dat >> 20) & 0x0f];
p[5] = xga->pallook[(dat >> 16) & 0x0f];
p[6] = xga->pallook[(dat >> 28) & 0x0f];
p[7] = xga->pallook[(dat >> 24) & 0x0f];
dat = *(uint32_t *) (&xga->vram[(xga->ma + 4) & xga->vram_mask]);
p[9] = xga->pallook[dat & 0x0f];
p[11] = xga->pallook[(dat >> 8) & 0x0f];
p[13] = xga->pallook[(dat >> 16) & 0x0f];
p[15] = xga->pallook[(dat >> 24) & 0x0f];
xga->ma += 8;
p += 16;
}
xga->ma &= xga->vram_mask;
}
}
static void
xga_render_8bpp(svga_t *svga)
{
@@ -2449,7 +2664,7 @@ xga_write(uint32_t addr, uint8_t val, void *priv)
if (addr >= xga->vram_size)
return;
cycles -= video_timing_write_b;
cycles -= svga->monitor->mon_video_timing_write_b;
if (xga->access_mode & 8) {
if ((xga->access_mode & 7) == 4)
@@ -2510,7 +2725,7 @@ xga_read(uint32_t addr, void *priv)
if (addr >= xga->vram_size)
return ret;
cycles -= video_timing_read_b;
cycles -= svga->monitor->mon_video_timing_read_b;
if (xga->access_mode & 8) {
if ((xga->access_mode & 7) == 4)
@@ -2695,6 +2910,9 @@ xga_do_render(svga_t *svga)
xga_log("DISPCNTL = %d, vga = %d.\n", xga->disp_cntl_2 & 7, vga_on);
switch (xga->disp_cntl_2 & 7) {
case 2:
xga_render_4bpp(svga);
break;
case 3:
xga_render_8bpp(svga);
break;
@@ -2773,15 +2991,9 @@ xga_poll(xga_t *xga, svga_t *svga)
if (xga->sc == xga->rowcount) {
xga->sc = 0;
if ((xga->disp_cntl_2 & 7) == 4) {
xga->maback += (xga->rowoffset << 4);
if (xga->interlace)
xga->maback += (xga->rowoffset << 4);
} else {
xga->maback += (xga->rowoffset << 3);
if (xga->interlace)
xga->maback += (xga->rowoffset << 3);
}
xga->maback += (xga->rowoffset << (xga->disp_cntl_2 & 7));
if (xga->interlace)
xga->maback += (xga->rowoffset << (xga->disp_cntl_2 & 7));
xga->maback &= xga->vram_mask;
xga->ma = xga->maback;
} else {

View File

@@ -15,12 +15,12 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
MainMenu MENU DISCARDABLE
BEGIN
POPUP "作(&A)"
POPUP "作(&A)"
BEGIN
MENUITEM "キーボードはキャプチャが必要(&K)", IDM_ACTION_KBD_REQ_CAPTURE
MENUITEM "右CTRLを左ALTへ(&R)", IDM_ACTION_RCTRL_IS_LALT
MENUITEM "右CTRLを左ALTへ変換(&R)", IDM_ACTION_RCTRL_IS_LALT
MENUITEM SEPARATOR
MENUITEM "ハードリセット(&H)...", IDM_ACTION_HRESET
MENUITEM "ハード リセット(&H)...", IDM_ACTION_HRESET
MENUITEM "Ctrl+Alt+Del(&C)\tCtrl+F12", IDM_ACTION_RESET_CAD
MENUITEM SEPARATOR
MENUITEM "Ctrl+Alt+Esc(&E)", IDM_ACTION_CTRL_ALT_ESC
@@ -34,9 +34,9 @@ BEGIN
MENUITEM "ステータスバーを隠す(&H)", IDM_VID_HIDE_STATUS_BAR
MENUITEM "ツールバーを隠す(&T)", IDM_VID_HIDE_TOOLBAR
MENUITEM SEPARATOR
MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS
MENUITEM "ウィンドウのサイズをリサイズ可能(&R)", IDM_VID_RESIZE
MENUITEM "ウィンドウのサイズと位置を記憶(&E)", IDM_VID_REMEMBER
MENUITEM "プライマリ以外のモニターを表示(&S)", IDM_VID_MONITORS
MENUITEM "ウィンドウのサイズを変更可能(&R)", IDM_VID_RESIZE
MENUITEM "ウィンドウのサイズと位置を保存(&E)", IDM_VID_REMEMBER
MENUITEM SEPARATOR
POPUP "レンダラー(&N)"
BEGIN
@@ -49,8 +49,8 @@ BEGIN
#endif
END
MENUITEM SEPARATOR
MENUITEM "ウィンドウのサイズを指定...", IDM_VID_SPECIFY_DIM
MENUITEM "4:3アスペクト比を固定(&O)", IDM_VID_FORCE43
MENUITEM "ディメンションを指定...", IDM_VID_SPECIFY_DIM
MENUITEM "4:3の縦横比を強制表示(&O)", IDM_VID_FORCE43
POPUP "ウィンドウの表示倍率(&W)"
BEGIN
MENUITEM "0.5x(&0)", IDM_VID_SCALE_1X
@@ -71,22 +71,22 @@ BEGIN
END
MENUITEM "HiDPIスケーリング(&D)", IDM_VID_HIDPI
MENUITEM SEPARATOR
MENUITEM "フルスクリーン(&F)\tCtrl+Alt+PgUp", IDM_VID_FULLSCREEN
POPUP "フルスクリーンのスケール(&S)"
MENUITEM "全画面表示(&F)\tCtrl+Alt+PgUp", IDM_VID_FULLSCREEN
POPUP "全画面の拡大表示モード(&S)"
BEGIN
MENUITEM "フルスクリーンに拡大(&F)", IDM_VID_FS_FULL
MENUITEM "ストレッチ モード(&F)", IDM_VID_FS_FULL
MENUITEM "4:3(&4)", IDM_VID_FS_43
MENUITEM "正方形ピクセル(アスペクト比を維持)(&S)", IDM_VID_FS_KEEPRATIO
MENUITEM "整数倍(&I)", IDM_VID_FS_INT
END
POPUP "E&GA/(S)VGAの設定"
BEGIN
MENUITEM "色反転(&I)", IDM_VID_INVERT
MENUITEM "色反転(&I)", IDM_VID_INVERT
POPUP "画面タイプ(&T)"
BEGIN
MENUITEM "RGB(カラー)(&C)", IDM_VID_GRAY_RGB
MENUITEM "RGB(グレースケール)(&R)", IDM_VID_GRAY_MONO
MENUITEM "モニター(琥珀色)(&A)", IDM_VID_GRAY_AMBER
MENUITEM "モニター(色)(&A)", IDM_VID_GRAY_AMBER
MENUITEM "モニター(緑色)(&G)", IDM_VID_GRAY_GREEN
MENUITEM "モニター(白色)(&W)", IDM_VID_GRAY_WHITE
END
@@ -111,10 +111,10 @@ BEGIN
MENUITEM SEPARATOR
MENUITEM "環境設定(&P)...", IDM_PREFERENCES
#ifdef DISCORD
MENUITEM "Discordとの連携機能(&D)", IDM_DISCORD
MENUITEM "Discord連携機能(&D)", IDM_DISCORD
#endif
MENUITEM SEPARATOR
MENUITEM "音量を調節(&G)...", IDM_SND_GAIN
MENUITEM "音量調整(&G)...", IDM_SND_GAIN
#ifdef MTR_ENABLED
MENUITEM SEPARATOR
MENUITEM "トレース開始\tCtrl+T", IDM_ACTION_BEGIN_TRACE
@@ -123,7 +123,7 @@ BEGIN
END
POPUP "ヘルプ(&H)"
BEGIN
MENUITEM "ドキュメント(&D)...", IDM_DOCS
MENUITEM "文書(&D)...", IDM_DOCS
MENUITEM "86Boxのバージョン情報(&A)...", IDM_ABOUT
END
END
@@ -142,9 +142,9 @@ BEGIN
MENUITEM "既存のイメージを開く(&E)...", IDM_CASSETTE_IMAGE_EXISTING
MENUITEM "既存のイメージを開く(書き込み保護)(&W)...", IDM_CASSETTE_IMAGE_EXISTING_WP
MENUITEM SEPARATOR
MENUITEM "録(&R)", IDM_CASSETTE_RECORD
MENUITEM "録(&R)", IDM_CASSETTE_RECORD
MENUITEM "再生(&P)", IDM_CASSETTE_PLAY
MENUITEM "冒頭に巻き戻す(&R)", IDM_CASSETTE_REWIND
MENUITEM "先頭まで巻き戻す(&R)", IDM_CASSETTE_REWIND
MENUITEM "最後まで早送り(&F)", IDM_CASSETTE_FAST_FORWARD
MENUITEM SEPARATOR
MENUITEM "取り出す(&J)", IDM_CASSETTE_EJECT
@@ -241,47 +241,47 @@ END
//
#define STR_PREFERENCES "環境設定"
#define STR_SND_GAIN "音量ゲイン"
#define STR_SND_GAIN "音量調整"
#define STR_NEW_FLOPPY "新規のイメージ"
#define STR_CONFIG "設定"
#define STR_SPECIFY_DIM "メインウィンドウのサイズ指定"
#define STR_SPECIFY_DIM "メイン ウィンドウのサイズ指定"
#define STR_OK "OK"
#define STR_CANCEL "キャンセル"
#define STR_GLOBAL "これらの設定をグローバル既定値として保存する(&G)"
#define STR_GLOBAL "これらの設定をグローバル既定値として保存(&G)"
#define STR_DEFAULT "既定値(&D)"
#define STR_LANGUAGE "言語:"
#define STR_ICONSET "アイコンセット:"
#define STR_ICONSET "アイコン セット:"
#define STR_GAIN "ゲイン値"
#define STR_FILE_NAME "ファイル名:"
#define STR_DISK_SIZE "ディスクサイズ:"
#define STR_RPM_MODE "回転数モード:"
#define STR_DISK_SIZE "ディスク サイズ:"
#define STR_RPM_MODE "RPMモード:"
#define STR_PROGRESS "進行状況:"
#define STR_WIDTH "幅:"
#define STR_HEIGHT "高さ:"
#define STR_LOCK_TO_SIZE "このサイズをロックする"
#define STR_LOCK_TO_SIZE "このサイズを固定"
#define STR_MACHINE_TYPE "マシンタイプ:"
#define STR_MACHINE_TYPE "マシン タイプ:"
#define STR_MACHINE "マシン:"
#define STR_CONFIGURE "設定"
#define STR_CPU_TYPE "CPUタイプ:"
#define STR_CPU_SPEED "速度:"
#define STR_FPU "FPU:"
#define STR_WAIT_STATES "待機状態:"
#define STR_WAIT_STATES "ウェイト ステート:"
#define STR_MB "MB"
#define STR_MEMORY "メモリ:"
#define STR_TIME_SYNC "時刻同期機能"
#define STR_DISABLED "無効にする"
#define STR_ENABLED_LOCAL "有効にする (現地時間)"
#define STR_ENABLED_UTC "有効にする (UTC)"
#define STR_DISABLED "無効"
#define STR_ENABLED_LOCAL "有効(現地時間)"
#define STR_ENABLED_UTC "有効(UTC)"
#define STR_DYNAREC "動的リコンパイラ"
#define STR_SOFTFLOAT "Softfloat FPU"
#define STR_VIDEO "ビデオカード:"
#define STR_VIDEO_2 "ビデオカード 2:"
#define STR_VIDEO_2 "ビデオカード2:"
#define STR_VOODOO "Voodooグラフィック"
#define STR_IBM8514 "IBM 8514/aグラフィック"
#define STR_XGA "XGAグラフィック"
@@ -293,25 +293,25 @@ END
#define STR_JOY3 "ジョイスティック3..."
#define STR_JOY4 "ジョイスティック4..."
#define STR_SOUND1 "サウンドカード 1:"
#define STR_SOUND2 "サウンドカード 2:"
#define STR_SOUND3 "サウンドカード 3:"
#define STR_SOUND4 "サウンドカード 4:"
#define STR_SOUND1 "サウンド カード1:"
#define STR_SOUND2 "サウンド カード2:"
#define STR_SOUND3 "サウンド カード3:"
#define STR_SOUND4 "サウンド カード4:"
#define STR_MIDI_OUT "MIDI出力デバイス:"
#define STR_MIDI_IN "MIDI入力デバイス:"
#define STR_MPU401 "独立型MPU-401"
#define STR_FLOAT "FLOAT32サウンドを使用する"
#define STR_FLOAT "FLOAT32サウンドを使用"
#define STR_FM_DRIVER "FMシンセドライバー"
#define STR_FM_DRV_NUKED "Nuked (高精度化)"
#define STR_FM_DRV_YMFM "YMFM (より速く)"
#define STR_FM_DRV_NUKED "Nuked(高精度化)"
#define STR_FM_DRV_YMFM "YMFM(より速く)"
#define STR_NET_TYPE "ネットワークタイプ:"
#define STR_PCAP "PCapデバイス:"
#define STR_NET "ネットワークアダプター:"
#define STR_NET1 "Network card 1:"
#define STR_NET2 "Network card 2:"
#define STR_NET3 "Network card 3:"
#define STR_NET4 "Network card 4:"
#define STR_NET1 "ネットワーク カード1:"
#define STR_NET2 "ネットワーク カード2:"
#define STR_NET3 "ネットワーク カード3:"
#define STR_NET4 "ネットワーク カード4:"
#define STR_COM1 "COM1デバイス:"
#define STR_COM2 "COM2デバイス:"
@@ -321,23 +321,23 @@ END
#define STR_LPT2 "LPT2デバイス:"
#define STR_LPT3 "LPT3デバイス:"
#define STR_LPT4 "LPT4デバイス:"
#define STR_SERIAL1 "シリアルポート1"
#define STR_SERIAL2 "シリアルポート2"
#define STR_SERIAL3 "シリアルポート3"
#define STR_SERIAL4 "シリアルポート4"
#define STR_PARALLEL1 "パラレルポート1"
#define STR_PARALLEL2 "パラレルポート2"
#define STR_PARALLEL3 "パラレルポート3"
#define STR_PARALLEL4 "パラレルポート4"
#define STR_SERIAL_PASS1 "Serial port passthrough 1"
#define STR_SERIAL_PASS2 "Serial port passthrough 2"
#define STR_SERIAL_PASS3 "Serial port passthrough 3"
#define STR_SERIAL_PASS4 "Serial port passthrough 4"
#define STR_SERIAL1 "シリアル ポート1"
#define STR_SERIAL2 "シリアル ポート2"
#define STR_SERIAL3 "シリアル ポート3"
#define STR_SERIAL4 "シリアル ポート4"
#define STR_PARALLEL1 "パラレル ポート1"
#define STR_PARALLEL2 "パラレル ポート2"
#define STR_PARALLEL3 "パラレル ポート3"
#define STR_PARALLEL4 "パラレル ポート4"
#define STR_SERIAL_PASS1 "シリアル ポート パススルー対応1"
#define STR_SERIAL_PASS2 "シリアル ポート パススルー対応2"
#define STR_SERIAL_PASS3 "シリアル ポート パススルー対応3"
#define STR_SERIAL_PASS4 "シリアル ポート パススルー対応4"
#define STR_HDC "HDコントローラー:"
#define STR_FDC "FDコントローラー:"
#define STR_IDE_TER "第三IDEコントローラー"
#define STR_IDE_QUA "第四IDEコントローラー"
#define STR_HDC "HDDコントローラー:"
#define STR_FDC "FDDコントローラー:"
#define STR_IDE_TER "第三IDEコントローラー"
#define STR_IDE_QUA "第四IDEコントローラー"
#define STR_SCSI "SCSI"
#define STR_SCSI_1 "コントローラー1:"
#define STR_SCSI_2 "コントローラー2:"
@@ -345,14 +345,14 @@ END
#define STR_SCSI_4 "コントローラー4:"
#define STR_CASSETTE "カセット"
#define STR_HDD "ハードディスク:"
#define STR_HDD "ハード ディスク:"
#define STR_NEW "新規(&N)..."
#define STR_EXISTING "既定(&E)..."
#define STR_REMOVE "除去(&R)"
#define STR_BUS "バス:"
#define STR_CHANNEL "チャンネル:"
#define STR_ID "ID:"
#define STR_SPEED "Speed:"
#define STR_SPEED "速度:"
#define STR_SPECIFY "参照(&S)..."
#define STR_SECTORS "セクター:"
@@ -361,11 +361,11 @@ END
#define STR_SIZE_MB "サイズ(MB):"
#define STR_TYPE "タイプ:"
#define STR_IMG_FORMAT "イメージ形式:"
#define STR_BLOCK_SIZE "ブロックサイズ:"
#define STR_BLOCK_SIZE "ブロック サイズ:"
#define STR_FLOPPY_DRIVES "フロッピードライブ:"
#define STR_FLOPPY_DRIVES "フロッピー ドライブ:"
#define STR_TURBO "高速タイミング"
#define STR_CHECKBPB "BPBチェック"
#define STR_CHECKBPB "BPBチェック"
#define STR_CDROM_DRIVES "CD-ROMドライブ:"
#define STR_CD_SPEED "速度:"
@@ -374,7 +374,7 @@ END
#define STR_250 "ZIP 250"
#define STR_ISARTC "ISA RTCカード:"
#define STR_ISAMEM "ISAメモリ拡張カード"
#define STR_ISAMEM "ISAメモリ拡張カード"
#define STR_ISAMEM_1 "カード1:"
#define STR_ISAMEM_2 "カード2:"
#define STR_ISAMEM_3 "カード3:"
@@ -409,27 +409,27 @@ BEGIN
IDS_2060 "オン"
IDS_2061 "オフ"
IDS_2062 "すべてのイメージ (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0基本的なセクターイメージ (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0表面イメージ (*.86F)\0*.86F\0"
IDS_2063 "roms/machinesディレクトリにROMがないため、マシン「%hs」は使用できません。使用可能なマシンに切り替えます。"
IDS_2063 "roms/machinesディレクトリにROMがないため、マシン「%hs」は使用できません。使用可能なマシンに切り替えます。"
END
STRINGTABLE DISCARDABLE
BEGIN
IDS_2064 "roms/videoディレクトリにROMがないため、ビデオカード「%hs」は使用できません。使用可能なビデオカードに切り替えます。"
IDS_2064 "roms/videoディレクトリにROMがないため、ビデオカード「%hs」は使用できません。使用可能なビデオカードに切り替えます。"
IDS_2065 "マシン"
IDS_2066 "画面表示"
IDS_2067 "入力デバイス"
IDS_2068 "サウンド"
IDS_2069 "ネットワーク"
IDS_2070 "ポート (COM & LPT)"
IDS_2071 "ストレージコントローラ"
IDS_2072 "ハードディスク"
IDS_2070 "ポート (COM/LPT)"
IDS_2071 "ストレージ コントローラ"
IDS_2072 "ハード ディスク"
IDS_2073 "フロッピー/CD-ROMドライブ"
IDS_2074 "その他のリムーバブルデバイス"
IDS_2075 "その他の周辺装置"
IDS_2074 "他のリムーバブル デバイス"
IDS_2075 "他の周辺デバイス"
IDS_2076 "表面イメージ (*.86F)\0*.86F\0"
IDS_2077 "クリックするとマウスをキャプチャします"
IDS_2078 "F8+F12キーマウスを解放します"
IDS_2079 "F8+F12キーまたは中ボタンでマウスを解放します"
IDS_2078 "F8+F12キーを押してマウスを解放します"
IDS_2079 "F8+F12キーまたはマウスの中ボタンを押してマウスを解放します"
END
STRINGTABLE DISCARDABLE
@@ -441,11 +441,11 @@ BEGIN
IDS_2085 "S"
IDS_2086 "MB"
IDS_2087 "Speed"
IDS_2088 "BPBチェック"
IDS_2088 "BPBチェック"
IDS_2089 "KB"
IDS_2090 "ビデオレンダラーが初期化できません。"
IDS_2091 "既定値"
IDS_2092 "%iつの待機状態"
IDS_2092 "%iつのウェイト ステート"
IDS_2093 "タイプ"
IDS_2094 "PCapのセットアップに失敗しました"
IDS_2095 "PCapデバイスがありません"
@@ -455,17 +455,17 @@ BEGIN
IDS_2099 "標準ジョイスティック(6ボタン)"
IDS_2100 "標準ジョイスティック(8ボタン)"
IDS_2101 "CH Flightstick Pro"
IDS_2102 "Microsoft SideWinder Pad"
IDS_2103 "Thrustmaster Flight Control System"
IDS_2102 "Microsoft SideWinderパッド"
IDS_2103 "Thrustmaster飛行制御システム"
IDS_2104 "なし"
IDS_2105 "キーボードアクセラレータを読み込めません。"
IDS_2106 "生入力が登録できません。"
IDS_2105 "キーボード アクセラレータを読み込めません。"
IDS_2106 "生入力が登録できません。"
IDS_2107 "%u"
IDS_2108 "%u MB (CHS: %i, %i, %i)"
IDS_2108 "%u MB (CHS: %i、%i、%i)"
IDS_2109 "フロッピー %i (%s): %ls"
IDS_2110 "すべてのイメージ (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0アドバンスドセクターイメージ (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0基本セクターイメージ (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0フラックスイメージ (*.FDI)\0*.FDI\0表面イメージ (*.86F;*.MFM)\0*.86F;*.MFM\0すべてのファイル (*.*)\0*.*\0"
IDS_2112 "SDLが初期化できません。SDL2.dllが必要です"
IDS_2113 "使用中のマシンをハードリセットしますか?"
IDS_2113 "使用中のマシンをハードリ セットしますか?"
IDS_2114 "86Boxを終了しますか"
IDS_2115 "Ghostscriptが初期化できません"
IDS_2116 "光磁気 %i (%ls): %ls"
@@ -475,7 +475,7 @@ BEGIN
IDS_2120 "終了"
IDS_2121 "ROMが見つかりません"
IDS_2122 "設定を保存しますか?"
IDS_2123 "保存すると使用中のマシンがハードリセットされます。"
IDS_2123 "使用中のマシンがハードリ セットされます。"
IDS_2124 "保存"
IDS_2125 "86Boxのバージョン情報"
IDS_2126 "86Box v" EMU_VERSION
@@ -489,14 +489,14 @@ BEGIN
#define LIB_NAME_PCAP "libpcap"
#endif
IDS_2130 LIB_NAME_PCAP "がインストールされてるか、" LIB_NAME_PCAP "に対応したネットワークに接続されてるか確認してください。"
IDS_2131 "不正な設定です"
IDS_2131 "無効な設定"
#ifdef _WIN32
#define LIB_NAME_GS "gsdll32.dll"
#else
#define LIB_NAME_GS "libgs"
#endif
IDS_2133 "PostScriptファイルをPDFに自動変換するには" LIB_NAME_GS "が必要です。\n\n汎用PostScriptプリンターに送信されたドキュメントは、PostScript(.ps)ファイルとして保存されます。"
IDS_2135 "フルスクリーンに切り替えています"
IDS_2133 "PostScriptファイルをPDFに自動変換するには" LIB_NAME_GS "が必要です。\n\n汎用PostScriptプリンターに送信された文書は、PostScript (.ps) ファイルとして保存されます。"
IDS_2135 "全画面モードを入力"
IDS_2136 "今後、このメッセージを表示しない"
IDS_2137 "終了しない"
IDS_2138 "リセット"
@@ -504,16 +504,16 @@ BEGIN
IDS_2140 "光磁気イメージ (*.IM?;*.MDI)\0*.IM?;*.MDI\0すべてのファイル (*.*)\0*.*\0"
IDS_2141 "CD-ROMイメージ (*.ISO;*.CUE)\0*.ISO;*.CUE\0すべてのファイル (*.*)\0*.*\0"
IDS_2142 "%hs デバイスの設定"
IDS_2143 "モニターのスリープモード"
IDS_2143 "モニターのスリープ モード"
IDS_2144 "OpenGLシェーダー (*.GLSL)\0*.GLSL\0すべてのファイル (*.*)\0*.*\0"
IDS_2145 "OpenGL設定"
IDS_2146 "サポートされていない設定を読み込んでいます"
IDS_2147 "選択したマシンに基づくCPUタイプのフィルタリングは、このエミュレートされたマシンでは無効になっています。\n\nこれにより、選択したマシンと互換性のないCPUが選択できます。ただし、マシンのBIOSまたは他のソフトウェアと互換性が失われる可能性があります。\n\nこの設定有効は公式サポートができません。また、バグレポート無効として閉じられる場合があります。"
IDS_2147 "選択したマシンに基づくCPUタイプのフィルター機能は、使用中のマシンでは無効になっています。\n\nこれにより、選択したマシンと互換性のないCPUが選択できます。しかし、マシンのBIOS他のソフトウェアと互換性がない場合があります。\n\nこの設定有効にすることは公式にはサポートされておらず、バグレポート無効として中止される可能性があります。"
IDS_2148 "続行"
IDS_2149 "カセット: %s"
IDS_2150 "カセットイメージ (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0すべてのファイル (*.*)\0*.*\0"
IDS_2150 "カセット イメージ (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0すべてのファイル (*.*)\0*.*\0"
IDS_2151 "カートリッジ %i: %ls"
IDS_2152 "カートリッジイメージ (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0すべてのファイル (*.*)\0*.*\0"
IDS_2152 "カートリッジ イメージ (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0すべてのファイル (*.*)\0*.*\0"
IDS_2153 "レンダラーの初期化エラー"
IDS_2154 "OpenGL (3.0コア) レンダラーが初期化できませんでした。別のレンダラーを使用してください。"
IDS_2155 "実行を再開"
@@ -523,56 +523,56 @@ BEGIN
IDS_2159 "ハードリセット"
IDS_2160 "ACPIシャットダウン"
IDS_2161 "設定"
IDS_2162 "Type"
IDS_2163 "No Dynarec"
IDS_2164 "Old Dynarec"
IDS_2165 "New Dynarec"
IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card."
IDS_2167 "Failed to initialize network driver"
IDS_2168 "The network configuration will be switched to the null driver"
IDS_2162 "タイプ"
IDS_2163 "Dynarecなし"
IDS_2164 "旧型Dynarec"
IDS_2165 "新型Dynarec"
IDS_2166 "「roms/video」ディレクトリにROMがないため、ビデオカード#2「%hs」は使用できません。2枚目のビデオカードを無効にします。"
IDS_2167 "ネットワーク ドライバの初期化に失敗しました。"
IDS_2168 "ネットワーク設定がヌル ドライバに切り替えられます"
END
STRINGTABLE DISCARDABLE
BEGIN
IDS_4096 "ハードディスク (%s)"
IDS_4096 "ハード ディスク (%s)"
IDS_4097 "%01i:%01i"
IDS_4098 "%01i"
IDS_4099 "MFM/RLLまたはESDIのCD-ROMドライブが存在しません"
IDS_4100 "カスタム..."
IDS_4101 "カスタム (大)..."
IDS_4101 "カスタム (大容量)..."
IDS_4102 "新規のディスクを追加"
IDS_4103 "既定のディスクを追加"
IDS_4104 "HDIディスクイメージは4GBを超えることはできません。"
IDS_4105 "ディスクイメージは127GBを超えることはできません。"
IDS_4106 "ハードディスクイメージ (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0すべてのファイル (*.*)\0*.*\0"
IDS_4104 "HDIディスク イメージは4GBを超えることはできません。"
IDS_4105 "ディスク イメージは127GBを超えることはできません。"
IDS_4106 "ハード ディスク イメージ (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0すべてのファイル (*.*)\0*.*\0"
IDS_4107 "ファイルの読み込みができません"
IDS_4108 "ファイルの書き込みができません"
IDS_4109 "512以外のセクタサイズを持つHDIまたはHDXイメージはサポートされていません。"
IDS_4110 "USBはまだサポートされていません"
IDS_4111 "ディスクイメージファイルが既に存在します"
IDS_4109 "512以外のセクタ サイズを持つHDIまたはHDXイメージは対応していません。"
IDS_4110 "USBはまだ非対応です"
IDS_4111 "ディスク イメージ ファイルが既に存在します"
IDS_4112 "有効なファイル名を指定してください。"
IDS_4113 "ディスクイメージが作成されました"
IDS_4113 "ディスク イメージが作成されました"
IDS_4114 "ファイルが存在し、読み取り可能であることを確認してください。"
IDS_4115 "ファイルが書き込み可能なディレクトリに保存されていることを確認してください。"
IDS_4116 "ディスクイメージのサイズが大きすぎます"
IDS_4116 "ディスク イメージのサイズが大きすぎます"
IDS_4117 "新規ドライブをパーティション分割し、フォーマットを必ずしといてください。"
IDS_4118 "選択したファイル上書きされます。使っていいですか?"
IDS_4119 "サポートされていないディスクイメージ"
IDS_4118 "選択したファイル上書きされます。よろしいですか?"
IDS_4119 "非対応のディスク イメージ"
IDS_4120 "上書き"
IDS_4121 "上書きしない"
IDS_4122 "Rawイメージ (.img)"
IDS_4123 "HDIイメージ (.hdi)"
IDS_4124 "HDXイメージ (.hdx)"
IDS_4125 "VHD(容量固定)(.vhd)"
IDS_4126 "VHD(容量可変)(.vhd)"
IDS_4127 "VHD(差分)(.vhd)"
IDS_4125 "VHD (容量固定) (.vhd)"
IDS_4126 "VHD (容量可変) (.vhd)"
IDS_4127 "VHD (差分) (.vhd)"
IDS_4128 "大型ブロック (2 MB)"
IDS_4129 "小型ブロック (512 KB)"
IDS_4130 "VHDファイル (*.VHD)\0*.VHD\0すべてのファイル (*.*)\0*.*\0"
IDS_4131 "親VHDの選択"
IDS_4132 "親イメージがディファレンシングイメージの作成の後に修正した可能性があります。\n\nイメージファイル移動、コピーまたはこのディスクを作成したプログラムにバグが発生した可能性があります。\n\nタイムスタンプを修正しますか"
IDS_4133 "親ディスクと子ディスクのタイムスタンプが一致しません"
IDS_4134 "VHD のタイムスタンプを修正できませんでした。"
IDS_4132 "親イメージが差分イメージの作成の後に変更される可能性があります。\n\nイメージ ファイル移動またはコピーされたか、イメージ ファイルを作成したプログラムにバグが発生した可能性があります。\n\nタイム スタンプを修正しますか?"
IDS_4133 "親ディスクと子ディスクのタイム スタンプが一致しません"
IDS_4134 "VHD のタイム スタンプを修正できませんでした。"
IDS_4135 "%01i:%02i"
IDS_4352 "MFM/RLL"
@@ -624,10 +624,10 @@ BEGIN
IDS_5910 "5.25"" 1 GB"
IDS_5911 "5.25"" 1.3 GB"
IDS_6144 "規定の回転数"
IDS_6145 "1%低い回転数"
IDS_6146 "1.5%低い回転数"
IDS_6147 "2%低い回転数"
IDS_6144 "規定のRPM"
IDS_6145 "1%低いRPM"
IDS_6146 "1.5%低いRPM"
IDS_6147 "2%低いRPM"
IDS_7168 "(システム既定値)"
END

View File

@@ -34,7 +34,7 @@ BEGIN
MENUITEM "隐藏状态栏(&H)", IDM_VID_HIDE_STATUS_BAR
MENUITEM "隐藏工具栏(&T)", IDM_VID_HIDE_TOOLBAR
MENUITEM SEPARATOR
MENUITEM "Show non-primary monitors(&S)", IDM_VID_MONITORS
MENUITEM "显示次要显示器(&S)", IDM_VID_MONITORS
MENUITEM "窗口大小可调(&R)", IDM_VID_RESIZE
MENUITEM "记住窗口大小和位置(&E)", IDM_VID_REMEMBER
MENUITEM SEPARATOR
@@ -137,10 +137,10 @@ CassetteSubmenu MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
MENUITEM "新建像(&N)...", IDM_CASSETTE_IMAGE_NEW
MENUITEM "新建像(&N)...", IDM_CASSETTE_IMAGE_NEW
MENUITEM SEPARATOR
MENUITEM "打开已存在的像(&E)...", IDM_CASSETTE_IMAGE_EXISTING
MENUITEM "打开已存在的像并写保护(&W)...", IDM_CASSETTE_IMAGE_EXISTING_WP
MENUITEM "打开已存在的像(&E)...", IDM_CASSETTE_IMAGE_EXISTING
MENUITEM "打开已存在的像并写保护(&W)...", IDM_CASSETTE_IMAGE_EXISTING_WP
MENUITEM SEPARATOR
MENUITEM "录制(&R)", IDM_CASSETTE_RECORD
MENUITEM "播放(&P)", IDM_CASSETTE_PLAY
@@ -155,7 +155,7 @@ CartridgeSubmenu MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
MENUITEM "像(&I)...", IDM_CARTRIDGE_IMAGE
MENUITEM "像(&I)...", IDM_CARTRIDGE_IMAGE
MENUITEM SEPARATOR
MENUITEM "弹出(&J)", IDM_CARTRIDGE_EJECT
END
@@ -165,10 +165,10 @@ FloppySubmenu MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
MENUITEM "新建像(&N)...", IDM_FLOPPY_IMAGE_NEW
MENUITEM "新建像(&N)...", IDM_FLOPPY_IMAGE_NEW
MENUITEM SEPARATOR
MENUITEM "打开已存在的像(&E)...", IDM_FLOPPY_IMAGE_EXISTING
MENUITEM "打开已存在的像并写保护(&W)...", IDM_FLOPPY_IMAGE_EXISTING_WP
MENUITEM "打开已存在的像(&E)...", IDM_FLOPPY_IMAGE_EXISTING
MENUITEM "打开已存在的像并写保护(&W)...", IDM_FLOPPY_IMAGE_EXISTING_WP
MENUITEM SEPARATOR
MENUITEM "导出为 86F 格式(&x)...", IDM_FLOPPY_EXPORT_TO_86F
MENUITEM SEPARATOR
@@ -183,9 +183,9 @@ BEGIN
MENUITEM "静音(&M)", IDM_CDROM_MUTE
MENUITEM SEPARATOR
MENUITEM "空置驱动器(&M)", IDM_CDROM_EMPTY
MENUITEM "载入上一个像(&R)", IDM_CDROM_RELOAD
MENUITEM "载入上一个像(&R)", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "像(&I)...", IDM_CDROM_IMAGE
MENUITEM "像(&I)...", IDM_CDROM_IMAGE
MENUITEM "文件夹(&F)...", IDM_CDROM_DIR
END
END
@@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
MENUITEM "新建像(&N)...", IDM_ZIP_IMAGE_NEW
MENUITEM "新建像(&N)...", IDM_ZIP_IMAGE_NEW
MENUITEM SEPARATOR
MENUITEM "打开已存在的像(&E)...", IDM_ZIP_IMAGE_EXISTING
MENUITEM "打开已存在的像并写保护(&W)...", IDM_ZIP_IMAGE_EXISTING_WP
MENUITEM "打开已存在的像(&E)...", IDM_ZIP_IMAGE_EXISTING
MENUITEM "打开已存在的像并写保护(&W)...", IDM_ZIP_IMAGE_EXISTING_WP
MENUITEM SEPARATOR
MENUITEM "弹出(&J)", IDM_ZIP_EJECT
MENUITEM "载入上一个像(&R)", IDM_ZIP_RELOAD
MENUITEM "载入上一个像(&R)", IDM_ZIP_RELOAD
END
END
@@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
MENUITEM "新建像(&N)...", IDM_MO_IMAGE_NEW
MENUITEM "新建像(&N)...", IDM_MO_IMAGE_NEW
MENUITEM SEPARATOR
MENUITEM "打开已存在的像(&E)...", IDM_MO_IMAGE_EXISTING
MENUITEM "打开已存在的像并写保护(&W)...", IDM_MO_IMAGE_EXISTING_WP
MENUITEM "打开已存在的像(&E)...", IDM_MO_IMAGE_EXISTING
MENUITEM "打开已存在的像并写保护(&W)...", IDM_MO_IMAGE_EXISTING_WP
MENUITEM SEPARATOR
MENUITEM "弹出(&J)", IDM_MO_EJECT
MENUITEM "载入上一个像(&R)", IDM_MO_RELOAD
MENUITEM "载入上一个像(&R)", IDM_MO_RELOAD
END
END
@@ -242,7 +242,7 @@ END
#define STR_PREFERENCES "首选项"
#define STR_SND_GAIN "音量增益"
#define STR_NEW_FLOPPY "新建像"
#define STR_NEW_FLOPPY "新建像"
#define STR_CONFIG "设置"
#define STR_SPECIFY_DIM "指定主窗口大小"
@@ -276,15 +276,15 @@ END
#define STR_TIME_SYNC "时间同步"
#define STR_DISABLED "禁用"
#define STR_ENABLED_LOCAL "启用 (本地时间)"
#define STR_ENABLED_UTC "启用 (UTC)"
#define STR_ENABLED_UTC "启用 (协调世界时)"
#define STR_DYNAREC "动态重编译器"
#define STR_SOFTFLOAT "Softfloat FPU"
#define STR_SOFTFLOAT "软浮点 FPU"
#define STR_VIDEO "显卡:"
#define STR_VIDEO_2 "显卡 2:"
#define STR_VOODOO "Voodoo Graphics"
#define STR_IBM8514 "IBM 8514/a Graphics"
#define STR_XGA "XGA Graphics"
#define STR_VOODOO "Voodoo 显卡"
#define STR_IBM8514 "IBM 8514/a 显卡"
#define STR_XGA "XGA 显卡"
#define STR_MOUSE "鼠标:"
#define STR_JOYSTICK "操纵杆:"
@@ -308,10 +308,10 @@ END
#define STR_NET_TYPE "网络类型:"
#define STR_PCAP "PCap 设备:"
#define STR_NET "网络适配器:"
#define STR_NET1 "Network card 1:"
#define STR_NET2 "Network card 2:"
#define STR_NET3 "Network card 3:"
#define STR_NET4 "Network card 4:"
#define STR_NET1 "网卡 1:"
#define STR_NET2 "网卡 2:"
#define STR_NET3 "网卡 3:"
#define STR_NET4 "网卡 4:"
#define STR_COM1 "COM1 设备:"
#define STR_COM2 "COM2 设备:"
@@ -329,10 +329,10 @@ END
#define STR_PARALLEL2 "并口 2"
#define STR_PARALLEL3 "并口 3"
#define STR_PARALLEL4 "并口 4"
#define STR_SERIAL_PASS1 "Serial port passthrough 1"
#define STR_SERIAL_PASS2 "Serial port passthrough 2"
#define STR_SERIAL_PASS3 "Serial port passthrough 3"
#define STR_SERIAL_PASS4 "Serial port passthrough 4"
#define STR_SERIAL_PASS1 "串口直通 1"
#define STR_SERIAL_PASS2 "串口直通 2"
#define STR_SERIAL_PASS3 "串口直通 3"
#define STR_SERIAL_PASS4 "串口直通 4"
#define STR_HDC "硬盘控制器:"
#define STR_FDC "软盘控制器:"
@@ -347,12 +347,12 @@ END
#define STR_HDD "硬盘:"
#define STR_NEW "新建(&N)..."
#define STR_EXISTING "已有像(&E)..."
#define STR_EXISTING "已有像(&E)..."
#define STR_REMOVE "移除(&R)"
#define STR_BUS "总线:"
#define STR_CHANNEL "通道:"
#define STR_ID "ID:"
#define STR_SPEED "Speed:"
#define STR_SPEED "速度:"
#define STR_SPECIFY "指定(&S)..."
#define STR_SECTORS "扇区(S):"
@@ -360,7 +360,7 @@ END
#define STR_CYLS "柱面(C):"
#define STR_SIZE_MB "大小 (MB):"
#define STR_TYPE "类型:"
#define STR_IMG_FORMAT "像格式:"
#define STR_IMG_FORMAT "像格式:"
#define STR_BLOCK_SIZE "块大小:"
#define STR_FLOPPY_DRIVES "软盘驱动器:"
@@ -401,14 +401,14 @@ BEGIN
IDS_2052 "按下 Ctrl+Alt+PgDn 返回到窗口模式。"
IDS_2053 "速度"
IDS_2054 "ZIP %03i %i (%s): %ls"
IDS_2055 "ZIP 像 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0"
IDS_2056 "86Box 找不到任何可用的 ROM 像。\n\n请<a href=""https://github.com/86Box/roms/releases/latest"">下载</a>ROM 包并将其解压到 ""roms"" 文件夹。"
IDS_2055 "ZIP 像 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0"
IDS_2056 "86Box 找不到任何可用的 ROM 像。\n\n请<a href=""https://github.com/86Box/roms/releases/latest"">下载</a>ROM 包并将其解压到 ""roms"" 文件夹。"
IDS_2057 "(空)"
IDS_2058 "ZIP 像 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0所有文件 (*.*)\0*.*\0"
IDS_2058 "ZIP 像 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0所有文件 (*.*)\0*.*\0"
IDS_2059 "加速"
IDS_2060 "开"
IDS_2061 "关"
IDS_2062 "所有像 (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0基本扇区像 (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0表面像 (*.86F)\0*.86F\0"
IDS_2062 "所有像 (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0基本扇区像 (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0表面像 (*.86F)\0*.86F\0"
IDS_2063 "由于 roms/machines 文件夹中缺少合适的 ROM机型 ""%hs"" 不可用。将切换到其他可用机型。"
END
@@ -426,7 +426,7 @@ BEGIN
IDS_2073 "软盘/光盘驱动器"
IDS_2074 "其他可移动设备"
IDS_2075 "其他外围设备"
IDS_2076 "表面像 (*.86F)\0*.86F\0"
IDS_2076 "表面像 (*.86F)\0*.86F\0"
IDS_2077 "单击窗口捕捉鼠标"
IDS_2078 "按下 F8+F12 释放鼠标"
IDS_2079 "按下 F8+F12 或鼠标中键释放鼠标"
@@ -440,7 +440,7 @@ BEGIN
IDS_2084 "H"
IDS_2085 "S"
IDS_2086 "MB"
IDS_2087 "Speed"
IDS_2087 "速度"
IDS_2088 "检查 BPB"
IDS_2089 "KB"
IDS_2090 "无法初始化视频渲染器。"
@@ -463,13 +463,13 @@ BEGIN
IDS_2107 "%u"
IDS_2108 "%u MB (CHS: %i, %i, %i)"
IDS_2109 "软盘 %i (%s): %ls"
IDS_2110 "所有像 (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0高级扇区像 (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0基本扇区像 (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux 像 (*.FDI)\0*.FDI\0表面像 (*.86F;*.MFM)\0*.86F;*.MFM\0所有文件 (*.*)\0*.*\0"
IDS_2110 "所有像 (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0高级扇区像 (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0基本扇区像 (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux 像 (*.FDI)\0*.FDI\0表面像 (*.86F;*.MFM)\0*.86F;*.MFM\0所有文件 (*.*)\0*.*\0"
IDS_2112 "无法初始化 SDL需要 SDL2.dll"
IDS_2113 "确定要硬重置模拟器吗?"
IDS_2114 "确定要退出 86Box 吗?"
IDS_2115 "无法初始化 Ghostscript"
IDS_2116 "磁光盘 %i (%ls): %ls"
IDS_2117 "磁光盘像 (*.IM?;*.MDI)\0*.IM?;*.MDI\0所有文件 (*.*)\0*.*\0"
IDS_2117 "磁光盘像 (*.IM?;*.MDI)\0*.IM?;*.MDI\0所有文件 (*.*)\0*.*\0"
IDS_2118 "欢迎使用 86Box"
IDS_2119 "内部控制器"
IDS_2120 "退出"
@@ -480,7 +480,7 @@ BEGIN
IDS_2125 "关于 86Box"
IDS_2126 "86Box v" EMU_VERSION
IDS_2127 "一个旧式计算机模拟器\n\n作者: Miran Grča (OBattler)、RichardG867、Jasmine Iwanek、TC1995、coldbrewed、Teemu Korhonen (Manaatti)、Joakim L. Gilje、Adrien Moulin (elyosh)、Daniel Balsom (gloriouscow)、Cacodemon345、Fred N. van Kempen (waltje)、Tiseno100、reenigne 等人。\n\nWith previous core contributions from Sarah WalkerleileiJohnElliottgreatpsycho 等人。\n\n本软件依据 GNU 通用公共许可证第二版或更新版本发布。详情见 LICENSE 文件。"
IDS_2127 "一个旧式计算机模拟器\n\n作者: Miran Grča (OBattler)、RichardG867、Jasmine Iwanek、TC1995、coldbrewed、Teemu Korhonen (Manaatti)、Joakim L. Gilje、Adrien Moulin (elyosh)、Daniel Balsom (gloriouscow)、Cacodemon345、Fred N. van Kempen (waltje)、Tiseno100、reenigne 等人。\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\n本软件依据 GNU 通用公共许可证第二版或更新版本发布。详情见 LICENSE 文件。"
IDS_2128 "确定"
IDS_2129 "硬件不可用"
#ifdef _WIN32
@@ -497,12 +497,12 @@ BEGIN
#endif
IDS_2133 LIB_NAME_GS " 是将 PostScript 文件转换为 PDF 所需要的库。\n\n使用通用 PostScript 打印机打印的文档将被保存为 PostScript (.ps) 文件。"
IDS_2135 "正在进入全屏模式"
IDS_2136 "不再显示此消息"
IDS_2136 "不再显示此消息"
IDS_2137 "不退出"
IDS_2138 "重置"
IDS_2139 "不重置"
IDS_2140 "磁光盘像 (*.IM?;*.MDI)\0*.IM?;*.MDI\0所有文件 (*.*)\0*.*\0"
IDS_2141 "光盘像 (*.ISO;*.CUE)\0*.ISO;*.CUE\0所有文件 (*.*)\0*.*\0"
IDS_2140 "磁光盘像 (*.IM?;*.MDI)\0*.IM?;*.MDI\0所有文件 (*.*)\0*.*\0"
IDS_2141 "光盘像 (*.ISO;*.CUE)\0*.ISO;*.CUE\0所有文件 (*.*)\0*.*\0"
IDS_2142 "%hs 设备配置"
IDS_2143 "显示器处在睡眠状态"
IDS_2144 "OpenGL 着色器 (*.GLSL)\0*.GLSL\0所有文件 (*.*)\0*.*\0"
@@ -511,9 +511,9 @@ BEGIN
IDS_2147 "此模拟计算机禁用了基于选定计算机的 CPU 类型过滤。\n\n能够选中与所选机器本不兼容的 CPU但是可能会遇到与机器 BIOS 或其他软件不兼容的问题。\n\n启用此设置不受官方支持并且提交的任何错误报告可能会视为无效而关闭。"
IDS_2148 "继续"
IDS_2149 "磁带: %s"
IDS_2150 "磁带像 (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0所有文件 (*.*)\0*.*\0"
IDS_2150 "磁带像 (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0所有文件 (*.*)\0*.*\0"
IDS_2151 "卡带 %i: %ls"
IDS_2152 "卡带像 (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0所有文件 (*.*)\0*.*\0"
IDS_2152 "卡带像 (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0所有文件 (*.*)\0*.*\0"
IDS_2153 "初始化渲染器时出错"
IDS_2154 "无法初始化 OpenGL (3.0 核心) 渲染器。请使用其他渲染器。"
IDS_2155 "恢复执行"
@@ -523,13 +523,13 @@ BEGIN
IDS_2159 "硬重置"
IDS_2160 "ACPI 关机"
IDS_2161 "设置"
IDS_2162 "Type"
IDS_2163 "No Dynarec"
IDS_2164 "Old Dynarec"
IDS_2165 "New Dynarec"
IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card."
IDS_2167 "Failed to initialize network driver"
IDS_2168 "The network configuration will be switched to the null driver"
IDS_2162 "类型"
IDS_2163 "无动态重编译"
IDS_2164 "旧式动态重编译"
IDS_2165 "新式动态重编译"
IDS_2166 "由于 roms/video 文件夹中缺少合适的 ROM显卡 #2 ""%hs"" 不可用。将禁用第二张显卡。"
IDS_2167 "初始化网络驱动程序失败"
IDS_2168 "网络配置将切换为空驱动程序"
END
STRINGTABLE DISCARDABLE
@@ -542,27 +542,27 @@ BEGIN
IDS_4101 "自定义 (大容量)..."
IDS_4102 "添加新硬盘"
IDS_4103 "添加已存在的硬盘"
IDS_4104 "HDI 磁盘像不能超过 4 GB。"
IDS_4105 "磁盘像不能超过 127 GB。"
IDS_4106 "硬盘像 (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0所有文件 (*.*)\0*.*\0"
IDS_4104 "HDI 磁盘像不能超过 4 GB。"
IDS_4105 "磁盘像不能超过 127 GB。"
IDS_4106 "硬盘像 (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0所有文件 (*.*)\0*.*\0"
IDS_4107 "无法读取文件"
IDS_4108 "无法写入文件"
IDS_4109 "不支持非 512 字节扇区大小的 HDI 或 HDX 像。"
IDS_4109 "不支持非 512 字节扇区大小的 HDI 或 HDX 像。"
IDS_4110 "尚未支持 USB"
IDS_4111 "磁盘像文件已存在"
IDS_4111 "磁盘像文件已存在"
IDS_4112 "请指定有效的文件名。"
IDS_4113 "已创建磁盘像"
IDS_4113 "已创建磁盘像"
IDS_4114 "请确定此文件已存在并可读取。"
IDS_4115 "请确定此文件保存在可写目录中。"
IDS_4116 "磁盘像太大"
IDS_4117 "请记得为新创建的像分区并格式化。"
IDS_4116 "磁盘像太大"
IDS_4117 "请记得为新创建的像分区并格式化。"
IDS_4118 "选定的文件将被覆盖。确定继续使用此文件吗?"
IDS_4119 "不支持的磁盘像"
IDS_4119 "不支持的磁盘像"
IDS_4120 "覆盖"
IDS_4121 "不覆盖"
IDS_4122 "原始像 (.img)"
IDS_4123 "HDI 像 (.hdi)"
IDS_4124 "HDX 像 (.hdx)"
IDS_4122 "原始像 (.img)"
IDS_4123 "HDI 像 (.hdi)"
IDS_4124 "HDX 像 (.hdx)"
IDS_4125 "固定大小 VHD (.vhd)"
IDS_4126 "动态大小 VHD (.vhd)"
IDS_4127 "差分 VHD (.vhd)"
@@ -570,7 +570,7 @@ BEGIN
IDS_4129 "小块 (512 KB)"
IDS_4130 "VHD 文件 (*.VHD)\0*.VHD\0所有文件 (*.*)\0*.*\0"
IDS_4131 "选择父 VHD 文件"
IDS_4132 "父映像可能在创建差异像后被修改。\n\n如果像文件被移动或复制,或创建此磁盘的程序中存在错误,也可能发生这种情况。\n\n是否需要修复时间戳"
IDS_4132 "父映像可能在创建差异像后被修改。\n\n如果像文件被移动或复制,或创建此磁盘的程序中存在错误,也可能发生这种情况。\n\n是否需要修复时间戳"
IDS_4133 "父盘与子盘的时间戳不匹配"
IDS_4134 "无法修复 VHD 时间戳。"
IDS_4135 "%01i:%02i"

View File

@@ -480,7 +480,7 @@ BEGIN
IDS_2125 "關於 86Box"
IDS_2126 "86Box v" EMU_VERSION
IDS_2127 "一個舊式電腦模擬器\n\n作者: Miran Grča (OBattler)、RichardG867、Jasmine Iwanek、TC1995、coldbrewed、Teemu Korhonen (Manaatti)、Joakim L. Gilje、Adrien Moulin (elyosh)、Daniel Balsom (gloriouscow)、Cacodemon345、Fred N. van Kempen (waltje)、Tiseno100、reenigne 等人。\n\nWith previous core contributions from Sarah WalkerleileiJohnElliottgreatpsycho 等人。\n\n本軟體依據 GNU 通用公共授權第二版或更新版本發布。詳情見 LICENSE 檔案。"
IDS_2127 "一個舊式電腦模擬器\n\n作者: Miran Grča (OBattler)、RichardG867、Jasmine Iwanek、TC1995、coldbrewed、Teemu Korhonen (Manaatti)、Joakim L. Gilje、Adrien Moulin (elyosh)、Daniel Balsom (gloriouscow)、Cacodemon345、Fred N. van Kempen (waltje)、Tiseno100、reenigne 等人。\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\n本軟體依據 GNU 通用公共授權第二版或更新版本發布。詳情見 LICENSE 檔案。"
IDS_2128 "確定"
IDS_2129 "硬體不可用"
#ifdef _WIN32

View File

@@ -739,7 +739,7 @@ NewFloppyDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, UNUSED(LPARAM l
new_floppy_msgbox_header(hdlg, MBX_ERROR, (wchar_t *) IDS_4108, (wchar_t *) IDS_4115);
return TRUE;
}
/*FALLTHROUGH*/
fallthrough;
case IDCANCEL:
EndDialog(hdlg, 0);
plat_pause(0);

View File

@@ -688,6 +688,18 @@ win_settings_save(void)
pc_reset_hard_init();
}
static void
win_settings_machine_recalc_softfloat(HWND hdlg)
{
if (temp_fpu == FPU_NONE) {
settings_set_check(hdlg, IDC_CHECK_SOFTFLOAT, FALSE);
settings_enable_window(hdlg, IDC_CHECK_SOFTFLOAT, FALSE);
} else {
settings_set_check(hdlg, IDC_CHECK_SOFTFLOAT, (machine_has_flags(temp_machine, MACHINE_SOFTFLOAT_ONLY) ? TRUE : temp_fpu_softfloat));
settings_enable_window(hdlg, IDC_CHECK_SOFTFLOAT, (machine_has_flags(temp_machine, MACHINE_SOFTFLOAT_ONLY) ? FALSE : TRUE));
}
}
static void
win_settings_machine_recalc_fpu(HWND hdlg)
{
@@ -714,12 +726,11 @@ win_settings_machine_recalc_fpu(HWND hdlg)
c++;
}
settings_set_check(hdlg, IDC_CHECK_SOFTFLOAT, (machine_has_flags(temp_machine, MACHINE_SOFTFLOAT_ONLY) ? TRUE : temp_fpu_softfloat));
settings_enable_window(hdlg, IDC_CHECK_SOFTFLOAT, (machine_has_flags(temp_machine, MACHINE_SOFTFLOAT_ONLY) ? FALSE : TRUE));
settings_enable_window(hdlg, IDC_COMBO_FPU, c > 1);
temp_fpu = fpu_get_type_from_index(temp_cpu_f, temp_cpu, settings_get_cur_sel(hdlg, IDC_COMBO_FPU));
win_settings_machine_recalc_softfloat(hdlg);
}
static void
@@ -737,7 +748,7 @@ win_settings_machine_recalc_cpu(HWND hdlg)
cpu_flags = temp_cpu_f->cpus[temp_cpu].cpu_flags;
if (!(cpu_flags & CPU_SUPPORTS_DYNAREC) && (cpu_flags & CPU_REQUIRES_DYNAREC))
fatal("Attempting to select a CPU that requires the recompiler and does not support it at the same time\n");
if (!(cpu_flags & CPU_SUPPORTS_DYNAREC) || (cpu_flags & CPU_REQUIRES_DYNAREC)) {
if (!(cpu_flags & CPU_SUPPORTS_DYNAREC) || ((cpu_flags & CPU_REQUIRES_DYNAREC) && !cpu_override)) {
if (!(cpu_flags & CPU_SUPPORTS_DYNAREC))
temp_dynarec = 0;
if (cpu_flags & CPU_REQUIRES_DYNAREC)
@@ -1046,6 +1057,7 @@ win_settings_machine_proc(HWND hdlg, UINT message, WPARAM wParam, UNUSED(LPARAM
temp_fpu = fpu_get_type_from_index(temp_cpu_f, temp_cpu,
settings_get_cur_sel(hdlg, IDC_COMBO_FPU));
}
win_settings_machine_recalc_softfloat(hdlg);
break;
case IDC_CONFIGURE_MACHINE:
temp_machine = listtomachine[settings_get_cur_sel(hdlg, IDC_COMBO_MACHINE)];
@@ -4384,7 +4396,7 @@ win_settings_mo_drives_init_columns(HWND hdlg)
static void
win_settings_zip_drives_resize_columns(HWND hdlg)
{
int width[C_COLUMNS_MO_DRIVES] = {
int width[C_COLUMNS_ZIP_DRIVES] = {
C_COLUMNS_ZIP_DRIVES_BUS,
C_COLUMNS_ZIP_DRIVES_TYPE
};
@@ -4701,12 +4713,12 @@ cdrom_recalc_location_controls(HWND hdlg, int assign_id)
settings_show_window(hdlg, IDC_COMBO_CD_SPEED, bus != CDROM_BUS_DISABLED);
settings_show_window(hdlg, IDT_CD_SPEED, bus != CDROM_BUS_DISABLED);
#if 0
settings_show_window(hdlg, IDC_CHECKEARLY, bus != CDROM_BUS_DISABLED);
settings_show_window(hdlg, IDC_COMBO_CD_TYPE, bus != CDROM_BUS_DISABLED);
#endif
if (bus != CDROM_BUS_DISABLED) {
settings_set_cur_sel(hdlg, IDC_COMBO_CD_SPEED, temp_cdrom[lv2_current_sel].speed - 1);
#if 0
settings_set_check(hdlg, IDC_CHECKEARLY, temp_cdrom[lv2_current_sel].early);
settings_set_check(hdlg, IDC_COMBO_CD_TYPE, temp_cdrom[lv2_current_sel].early);
#endif
}
@@ -4912,7 +4924,7 @@ static void
mo_track(uint8_t id)
{
if (temp_mo_drives[id].bus_type == MO_BUS_ATAPI)
ide_tracking |= (1 << (temp_zip_drives[id].ide_channel << 3));
ide_tracking |= (1 << (temp_mo_drives[id].ide_channel << 3));
else if (temp_mo_drives[id].bus_type == MO_BUS_SCSI)
scsi_tracking[temp_mo_drives[id].scsi_device_id >> 3] |= (1 << (temp_mo_drives[id].scsi_device_id & 0x07));
}
@@ -4921,7 +4933,7 @@ static void
mo_untrack(uint8_t id)
{
if (temp_mo_drives[id].bus_type == MO_BUS_ATAPI)
ide_tracking &= ~(1 << (temp_zip_drives[id].ide_channel << 3));
ide_tracking &= ~(1 << (temp_mo_drives[id].ide_channel << 3));
else if (temp_mo_drives[id].bus_type == MO_BUS_SCSI)
scsi_tracking[temp_mo_drives[id].scsi_device_id >> 3] &= ~(1 << (temp_mo_drives[id].scsi_device_id & 0x07));
}
@@ -5098,8 +5110,8 @@ win_settings_floppy_and_cdrom_drives_proc(HWND hdlg, UINT message, WPARAM wParam
break;
#if 0
case IDC_CHECKEARLY:
temp_cdrom[lv2_current_sel].early = settings_get_check(hdlg, IDC_CHECKEARLY);
case IDC_COMBO_CD_TYPE::
temp_cdrom[lv2_current_sel].early = settings_get_check(hdlg, IDC_COMBO_CD_TYPE:);
win_settings_cdrom_drives_update_item(hdlg, lv2_current_sel);
break;
#endif