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

This commit is contained in:
Jasmine Iwanek
2023-08-06 17:10:39 -04:00
7 changed files with 101 additions and 55 deletions

View File

@@ -167,7 +167,7 @@ i420ex_drb_recalc(i420ex_t *dev)
{
uint32_t boundary;
for (uint8_t i = 4; i >= 0; i--)
for (int8_t i = 4; i >= 0; i--)
row_disable(i);
for (uint8_t i = 0; i <= 4; i++) {

View File

@@ -450,7 +450,7 @@ retry_vhd:
else
fatal("hdd_image_load(): VHD: Error opening VHD file '%s': %s\n", fn, mvhd_strerr(vhd_error));
} else if (vhd_error == MVHD_ERR_TIMESTAMP) {
fatal("hdd_image_load(): VHD: Parent/child timestamp mismatch for VHD file '%s'\n", fn);
pclog("hdd_image_load(): VHD: Parent/child timestamp mismatch for VHD file '%s'\n", fn);
}
hdd[id].tracks = hdd_images[id].vhd->footer.geom.cyl;

View File

@@ -214,7 +214,7 @@ row_reset(UNUSED(void *priv))
uint32_t boundary;
uint32_t shift;
for (uint8_t i = (rows_num - 1); i >= 0; i--)
for (int8_t i = (rows_num - 1); i >= 0; i--)
row_disable(i);
for (uint8_t i = 0; i < rows_num; i++) {

View File

@@ -182,7 +182,7 @@ msgid "Take s&creenshot\tCtrl+F11"
msgstr "擷圖(&C)\tCtrl+F11"
msgid "&Preferences..."
msgstr "首選項(&P)..."
msgstr "偏好設定(&P)..."
msgid "Enable &Discord integration"
msgstr "啟用 Discord 整合(&D)"
@@ -278,7 +278,7 @@ msgid "&Remove shader"
msgstr "移除著色器(&R)"
msgid "Preferences"
msgstr "首選項"
msgstr "偏好設定"
msgid "Sound Gain"
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 輸出裝置:"
@@ -557,7 +557,7 @@ msgid "Heads:"
msgstr "磁頭(H):"
msgid "Cylinders:"
msgstr "柱(C):"
msgstr "柱(C):"
msgid "Size (MB):"
msgstr "大小 (MB):"

View File

@@ -621,27 +621,16 @@ mach64_updatemapping(mach64_t *mach64)
/*8 MB aperture*/
mem_mapping_set_addr(&mach64->linear_mapping, mach64->linear_base, (8 << 20) - 0x4000);
mem_mapping_set_addr(&mach64->mmio_linear_mapping, mach64->linear_base + ((8 << 20) - 0x4000), 0x4000);
} else if ((mach64->config_cntl & 3) == 1) {
} else {
/*4 MB aperture*/
mem_mapping_set_addr(&mach64->linear_mapping, mach64->linear_base, (4 << 20) - 0x4000);
mem_mapping_set_addr(&mach64->mmio_linear_mapping, mach64->linear_base + ((4 << 20) - 0x4000), 0x4000);
} else {
/*Disable aperture on reserved values*/
mem_mapping_disable(&mach64->linear_mapping);
mem_mapping_disable(&mach64->mmio_linear_mapping);
}
} else {
if ((mach64->config_cntl & 3) == 2) {
/*2*8 MB aperture*/
mem_mapping_set_addr(&mach64->linear_mapping, mach64->linear_base, (8 << 20) - 0x4000);
mem_mapping_set_addr(&mach64->mmio_linear_mapping, mach64->linear_base + ((8 << 20) - 0x4000), 0x4000);
mem_mapping_set_addr(&mach64->mmio_linear_mapping_2, mach64->linear_base + ((16 << 20) - 0x4000), 0x4000);
} else {
/*Disable aperture on reserved values*/
mem_mapping_disable(&mach64->linear_mapping);
mem_mapping_disable(&mach64->mmio_linear_mapping);
mem_mapping_disable(&mach64->mmio_linear_mapping_2);
}
/*2*8 MB aperture*/
mem_mapping_set_addr(&mach64->linear_mapping, mach64->linear_base, (8 << 20) - 0x4000);
mem_mapping_set_addr(&mach64->mmio_linear_mapping, mach64->linear_base + ((8 << 20) - 0x4000), 0x4000);
mem_mapping_set_addr(&mach64->mmio_linear_mapping_2, mach64->linear_base + ((16 << 20) - 0x4000), 0x4000);
}
} else {
mem_mapping_disable(&mach64->linear_mapping);

View File

@@ -279,6 +279,7 @@ typedef struct virge_t {
uint32_t dma_ptr;
uint64_t blitter_time;
volatile int fifo_slot;
int fifo_slots_num;
pc_timer_t tri_timer;
@@ -1031,6 +1032,8 @@ s3_virge_mmio_fifo_write_l(uint32_t addr, uint32_t val, virge_t *virge)
else
s3_virge_bitblt(virge, 32, val);
} else {
if (virge->fifo_slot >= virge->fifo_slots_num)
return;
virge->fifo_slot++;
switch (addr & 0xfffc) {
case 0x8590:
@@ -1480,16 +1483,25 @@ s3_virge_mmio_read(uint32_t addr, void *priv)
switch (addr & 0xffff) {
case 0x8505:
ret = 0;
if (virge->s3d_busy || virge->fifo_slot) {
ret = 0x10;
} else {
ret = 0x30;
}
ret = 0xc0;
if (!virge->s3d_busy && !virge->fifo_slot)
ret |= 0x20;
if (virge->fifo_slot)
virge->fifo_slot--;
ret |= (virge->fifo_slots_num - virge->fifo_slot);
return ret;
case 0x850c:
ret = virge->advfunc_cntl & 0x3f;
if (virge->fifo_slot)
virge->fifo_slot--;
ret |= (virge->fifo_slots_num - virge->fifo_slot) << 6;
ret &= 0xff;
break;
case 0x850d:
ret = (virge->fifo_slots_num - virge->fifo_slot) >> 2;
break;
case 0x83b0:
case 0x83b1:
case 0x83b2:
@@ -1564,15 +1576,25 @@ s3_virge_mmio_read_w(uint32_t addr, void *priv)
switch (addr & 0xfffe) {
case 0x8504:
ret = 0xc000;
if (!virge->s3d_busy && !virge->fifo_slot)
ret |= 0x2000;
if (!virge->fifo_slot)
virge->subsys_stat |= INT_FIFO_EMP;
ret |= virge->subsys_stat;
if (virge->fifo_slot)
virge->fifo_slot--;
ret |= 0x30; /*A bit of a workaround at the moment.*/
ret |= (virge->fifo_slots_num - virge->fifo_slot) << 8;
s3_virge_update_irqs(virge);
return ret;
case 0x850c:
ret = virge->advfunc_cntl & 0x3f;
if (virge->fifo_slot)
virge->fifo_slot--;
ret |= (virge->fifo_slots_num - virge->fifo_slot) << 6;
break;
case 0x859c:
return virge->cmd_dma;
@@ -1660,10 +1682,9 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv)
break;
case 0x8504:
if (virge->s3d_busy || virge->fifo_slot) {
ret = (0x10 << 8);
} else {
ret = (0x10 << 8) | (1 << 13);
ret = 0x0000c000;
if (!virge->s3d_busy && !virge->fifo_slot) {
ret |= 0x00002000;
if (!virge->s3d_busy)
virge->subsys_stat |= INT_3DF_EMP;
if (!virge->fifo_slot)
@@ -1672,9 +1693,17 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv)
ret |= virge->subsys_stat;
if (virge->fifo_slot)
virge->fifo_slot--;
ret |= (virge->fifo_slots_num - virge->fifo_slot) << 8;
s3_virge_update_irqs(virge);
break;
case 0x850c:
ret = virge->advfunc_cntl & 0x3f;
if (virge->fifo_slot)
virge->fifo_slot--;
ret |= (virge->fifo_slots_num - virge->fifo_slot) << 6;
break;
case 0x8590:
ret = virge->cmd_dma_base;
break;
@@ -3498,26 +3527,41 @@ s3_virge_hwcursor_draw(svga_t *svga, int displine)
svga->hwcursor_latch.addr += 16;
switch (svga->bpp) {
default:
if (virge->chip != S3_VIRGEGX2) {
fg = svga->pallook[virge->hwc_fg_col & 0xff];
bg = svga->pallook[virge->hwc_bg_col & 0xff];
break;
}
#ifdef FALLTHROUGH_ANNOTATION
[[fallthrough]];
#endif
case 15:
fg = video_15to32[virge->hwc_fg_col & 0xffff];
bg = video_15to32[virge->hwc_bg_col & 0xffff];
break;
if (virge->chip != S3_VIRGEGX2) {
fg = video_15to32[virge->hwc_fg_col & 0xffff];
bg = video_15to32[virge->hwc_bg_col & 0xffff];
break;
}
#ifdef FALLTHROUGH_ANNOTATION
[[fallthrough]];
#endif
case 16:
fg = video_16to32[virge->hwc_fg_col & 0xffff];
bg = video_16to32[virge->hwc_bg_col & 0xffff];
break;
if (virge->chip != S3_VIRGEGX2) {
fg = video_16to32[virge->hwc_fg_col & 0xffff];
bg = video_16to32[virge->hwc_bg_col & 0xffff];
break;
}
#ifdef FALLTHROUGH_ANNOTATION
[[fallthrough]];
#endif
case 24:
case 32:
fg = virge->hwc_fg_col;
bg = virge->hwc_bg_col;
break;
default:
fg = svga->pallook[virge->hwc_fg_col & 0xff];
bg = svga->pallook[virge->hwc_bg_col & 0xff];
break;
}
for (uint8_t x = 0; x < 64; x += 16) {
@@ -3527,6 +3571,9 @@ s3_virge_hwcursor_draw(svga_t *svga, int displine)
/*X11*/
for (xx = 0; xx < 16; xx++) {
if (offset >= 0) {
if (virge->chip == S3_VIRGEGX2)
dat[0] ^= 0x8000;
if (dat[0] & 0x8000)
buffer32->line[displine][offset + svga->x_add] = (dat[1] & 0x8000) ? fg : bg;
}
@@ -4086,24 +4133,29 @@ s3_virge_reset(void *priv)
switch (virge->local) {
case S3_VIRGE_325:
case S3_DIAMOND_STEALTH3D_2000:
virge->fifo_slots_num = 8;
virge->svga.crtc[0x59] = 0x70;
break;
case S3_DIAMOND_STEALTH3D_3000:
case S3_STB_VELOCITY_3D:
virge->fifo_slots_num = 8;
virge->svga.crtc[0x59] = 0x70;
break;
case S3_VIRGE_GX2:
case S3_DIAMOND_STEALTH3D_4000:
virge->fifo_slots_num = 16;
virge->svga.crtc[0x6c] = 1;
virge->svga.crtc[0x59] = 0x70;
break;
case S3_TRIO_3D2X:
virge->fifo_slots_num = 16;
virge->svga.crtc[0x6c] = 1;
virge->svga.crtc[0x59] = 0x70;
break;
default:
virge->fifo_slots_num = 8;
virge->svga.crtc[0x6c] = 1;
virge->svga.crtc[0x59] = 0x70;
break;
@@ -4262,6 +4314,7 @@ s3_virge_init(const device_t *info)
switch (info->local) {
case S3_VIRGE_325:
case S3_DIAMOND_STEALTH3D_2000:
virge->fifo_slots_num = 8;
virge->svga.decode_mask = (4 << 20) - 1;
virge->virge_id_high = 0x56;
virge->virge_id_low = 0x31;
@@ -4271,6 +4324,7 @@ s3_virge_init(const device_t *info)
break;
case S3_DIAMOND_STEALTH3D_3000:
case S3_STB_VELOCITY_3D:
virge->fifo_slots_num = 8;
virge->svga.decode_mask = (8 << 20) - 1;
virge->virge_id_high = 0x88;
virge->virge_id_low = 0x3d;
@@ -4280,6 +4334,7 @@ s3_virge_init(const device_t *info)
break;
case S3_VIRGE_GX2:
case S3_DIAMOND_STEALTH3D_4000:
virge->fifo_slots_num = 16;
virge->svga.decode_mask = (4 << 20) - 1;
virge->virge_id_high = 0x8a;
virge->virge_id_low = 0x10;
@@ -4291,6 +4346,7 @@ s3_virge_init(const device_t *info)
break;
case S3_TRIO_3D2X:
virge->fifo_slots_num = 16;
virge->svga.decode_mask = (8 << 20) - 1;
virge->virge_id_high = 0x8a;
virge->virge_id_low = 0x13;
@@ -4309,6 +4365,7 @@ s3_virge_init(const device_t *info)
#endif
default:
virge->fifo_slots_num = 8;
virge->svga.decode_mask = (4 << 20) - 1;
virge->virge_id_high = 0x8a;
virge->virge_id_low = 0x01;

View File

@@ -109,7 +109,7 @@ BEGIN
MENUITEM SEPARATOR
MENUITEM "擷圖(&C)\tCtrl+F11", IDM_ACTION_SCREENSHOT
MENUITEM SEPARATOR
MENUITEM "首選項(&P)...", IDM_PREFERENCES
MENUITEM "偏好設定(&P)...", IDM_PREFERENCES
#ifdef DISCORD
MENUITEM "啟用 Discord 整合(&D)", IDM_DISCORD
#endif
@@ -240,7 +240,7 @@ END
// Dialog
//
#define STR_PREFERENCES "首選項"
#define STR_PREFERENCES "偏好設定"
#define STR_SND_GAIN "音量增益"
#define STR_NEW_FLOPPY "新增映像"
#define STR_CONFIG "設定"
@@ -293,10 +293,10 @@ 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"
@@ -357,7 +357,7 @@ END
#define STR_SPECIFY "指定(&S)..."
#define STR_SECTORS "磁區(S):"
#define STR_HEADS "磁頭(H):"
#define STR_CYLS "柱(C):"
#define STR_CYLS "柱(C):"
#define STR_SIZE_MB "大小 (MB):"
#define STR_TYPE "類型:"
#define STR_IMG_FORMAT "映像格式:"