Merge branch 'master' of https://github.com/86Box/86Box into feature/968_new

This commit is contained in:
OBattler
2020-12-22 14:28:46 +01:00
13 changed files with 442 additions and 77 deletions

View File

@@ -353,6 +353,34 @@ kbd_log(const char *fmt, ...)
#define kbd_log(fmt, ...)
#endif
static uint8_t
get_fdd_switch_settings(){
int i, fdd_count = 0;
for (i = 0; i < FDD_NUM; i++) {
if (fdd_get_flags(i))
fdd_count++;
}
if (!fdd_count)
return 0x00;
else
return ((fdd_count - 1) << 6) | 0x01;
}
static uint8_t
get_videomode_switch_settings(){
if (video_is_mda())
return 0x30;
else if (video_is_cga())
return 0x20; /* 0x10 would be 40x25 */
else
return 0x00;
}
static void
kbd_poll(void *priv)
@@ -525,6 +553,7 @@ kbd_read(uint16_t port, void *priv)
{
xtkbd_t *kbd = (xtkbd_t *)priv;
uint8_t ret = 0xff;
switch (port) {
case 0x60:
@@ -532,9 +561,28 @@ kbd_read(uint16_t port, void *priv)
ret = (kbd->pd & ~0x02) | (hasfpu ? 0x02 : 0x00);
else if (((kbd->type == 2) || (kbd->type == 3)) && (kbd->pb & 0x80))
ret = 0xff; /* According to Ruud on the PCem forum, this is supposed to return 0xFF on the XT. */
else
ret = kbd->pa;
break;
else if ((kbd->type == 9) && (kbd->pb & 0x80)) {
/* Zenith Data Systems Z-151
* SW1 switch settings:
* bits 6-7: floppy drive number
* bits 4-5: video mode
* bit 2-3: base memory size
* bit 1: fpu enable
* bit 0: fdc enable
*/
ret = get_fdd_switch_settings();
ret |= get_videomode_switch_settings();
/* base memory size should always be 64k */
ret |= 0x0c;
if (hasfpu)
ret |= 0x02;
} else
ret = kbd->pa;
break;
case 0x61:
ret = kbd->pb;
@@ -543,18 +591,20 @@ kbd_read(uint16_t port, void *priv)
case 0x62:
if (kbd->type == 0)
ret = 0x00;
else if (kbd->type == 1) {
else if (kbd->type == 1) {
if (kbd->pb & 0x04)
ret = ((mem_size-64) / 32) & 0x0f;
else
ret = ((mem_size-64) / 32) >> 4;
} else if (kbd->type == 8) {
/* Olivetti M19 */
if (kbd->pb & 0x04)
ret = kbd->pd;
else
ret = kbd->pd >> 4;
} else {
}
else if (kbd->type == 8 || kbd->type == 9) {
/* Olivetti M19 or Zenith Data Systems Z-151*/
if (kbd->pb & 0x04)
ret = kbd->pd & 0xbf;
else
ret = kbd->pd >> 4;
}
else {
if (kbd->pb & 0x08)
ret = kbd->pd >> 4;
else {
@@ -582,6 +632,7 @@ kbd_read(uint16_t port, void *priv)
case 0x63:
if ((kbd->type == 2) || (kbd->type == 3) || (kbd->type == 4) || (kbd->type == 6))
ret = kbd->pd;
break;
}
@@ -616,8 +667,6 @@ keyboard_set_is_amstrad(int ams)
static void *
kbd_init(const device_t *info)
{
int i, fdd_count = 0;
xtkbd_t *kbd;
kbd = (xtkbd_t *)malloc(sizeof(xtkbd_t));
@@ -634,33 +683,21 @@ kbd_init(const device_t *info)
video_reset(gfxcard);
if (kbd->type <= 3 || kbd-> type == 8) {
for (i = 0; i < FDD_NUM; i++) {
if (fdd_get_flags(i))
fdd_count++;
}
/* DIP switch readout: bit set = OFF, clear = ON. */
if (kbd->type != 8)
/* Switches 7, 8 - floppy drives. */
if (!fdd_count)
kbd->pd = 0x00;
else
kbd->pd = ((fdd_count - 1) << 6) | 0x01;
kbd->pd = get_fdd_switch_settings();
else
/* Jumpers J1, J2 - monitor type.
* 01 - mono (high-res)
* 10 - color (low-res, disables 640x400x2 mode)
* 00 - autoswitching
*/
/* Olivetti M19
* Jumpers J1, J2 - monitor type.
* 01 - mono (high-res)
* 10 - color (low-res, disables 640x400x2 mode)
* 00 - autoswitching
*/
kbd->pd |= 0x00;
/* Switches 5, 6 - video. */
if (video_is_mda())
kbd->pd |= 0x30;
else if (video_is_cga())
kbd->pd |= 0x20; /* 0x10 would be 40x25 */
else
kbd->pd |= 0x00;
kbd->pd |= get_videomode_switch_settings();
/* Switches 3, 4 - memory size. */
// Note to Compaq/Toshiba keyboard maintainers: type 4 and 6 will never be activated in this block
@@ -721,6 +758,44 @@ kbd_init(const device_t *info)
/* Switch 1 - always off. */
kbd->pd |= 0x01;
} else if (kbd-> type == 9) {
/* Zenith Data Systems Z-151
* SW2 switch settings:
* bit 7: monitor frequency
* bits 5-6: autoboot (00-11 resident monitor, 10 hdd, 01 fdd)
* bits 0-4: installed memory
*/
kbd->pd = 0x20;
switch (mem_size) {
case 128:
kbd->pd |= 0x02;
break;
case 192:
kbd->pd |= 0x04;
break;
case 256:
kbd->pd |= 0x02|0x04;
break;
case 320:
kbd->pd |= 0x08;
break;
case 384:
kbd->pd |= 0x02|0x08;
break;
case 448:
kbd->pd |= 0x04|0x08;
break;
case 512:
kbd->pd |= 0x02|0x04|0x08;
break;
case 576:
kbd->pd |= 0x10;
break;
case 640:
default:
kbd->pd |= 0x02|0x10;
break;
}
}
timer_add(&kbd->send_delay_timer, kbd_poll, kbd, 1);
@@ -847,3 +922,13 @@ const device_t keyboard_xt_olivetti_device = {
kbd_reset,
{ NULL }, NULL, NULL
};
const device_t keyboard_xt_zenith_device = {
"Zenith XT Keyboard",
0,
9,
kbd_init,
kbd_close,
kbd_reset,
{ NULL }, NULL, NULL
};

View File

@@ -69,6 +69,7 @@ extern const device_t keyboard_tandy_device;
extern const device_t keyboard_xt_lxt3_device;
#endif
extern const device_t keyboard_xt_olivetti_device;
extern const device_t keyboard_xt_zenith_device;
extern const device_t keyboard_at_device;
extern const device_t keyboard_at_ami_device;
extern const device_t keyboard_at_toshiba_device;

View File

@@ -516,10 +516,13 @@ extern const device_t europc_device;
/* m_xt_olivetti.c */
extern int machine_xt_olim24_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t *m24_get_device(void);
#endif
extern int machine_xt_olim240_init(const machine_t *);
extern int machine_xt_olim19_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t *m24_get_device(void);
extern const device_t *m19_get_device(void);
#endif
/* m_pcjr.c */
@@ -584,6 +587,11 @@ extern int machine_xt_jukopc_init(const machine_t *);
extern int machine_xt_open_xt_init(const machine_t *);
extern int machine_xt_pxxt_init(const machine_t *);
extern int machine_xt_ncrpc4i_init(const machine_t *);
extern int machine_xt_mpc1600_init(const machine_t *);
extern int machine_xt_eaglepcspirit_init(const machine_t *);
extern int machine_xt_multitechpc700_init(const machine_t *);
extern int machine_xt_p3105_init(const machine_t *);
extern int machine_xt_p3120_init(const machine_t *);
extern int machine_xt_iskra3104_init(const machine_t *);
@@ -611,7 +619,12 @@ extern const device_t *t1200_get_device(void);
#endif
/* m_xt_zenith.c */
extern int machine_xt_zenith_init(const machine_t *);
extern int machine_xt_z184_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t *z184_get_device(void);
#endif
extern int machine_xt_z151_init(const machine_t *);
extern int machine_xt_z159_init(const machine_t *);
/* m_xt_xi8088.c */
extern int machine_xt_xi8088_init(const machine_t *);

View File

@@ -26,11 +26,11 @@ machine_xt_common_init(const machine_t *model)
pit_ctr_set_out_func(&pit->counters[1], pit_refresh_timer_xt);
if (fdc_type == FDC_INTERNAL)
device_add(&fdc_xt_device);
device_add(&fdc_xt_device);
nmi_init();
if (joystick_type)
device_add(&gameport_device);
device_add(&gameport_device);
}
@@ -332,12 +332,125 @@ machine_xt_ncrpc4i_init(const machine_t *model)
0x000fc000, 16384, 0);
if (bios_only || !ret)
return ret;
return ret;
machine_xt_clone_init(model);
return ret;
}
int
machine_xt_mpc1600_init(const machine_t *model)
{
int ret;
ret = bios_load_linear(L"roms/machines/mpc1600/mpc4.34_merged.bin",
0x000fc000, 16384, 0);
if (bios_only || !ret)
return ret;
device_add(&keyboard_pc82_device);
machine_xt_common_init(model);
return ret;
}
int
machine_xt_eaglepcspirit_init(const machine_t *model)
{
int ret;
ret = bios_load_linear(L"roms/machines/eagle_pcspirit/u1101.bin",
0x000fe000, 16384, 0);
if (ret) {
bios_load_aux_linear(L"roms/machines/eagle_pcspirit/u1103.bin",
0x000fc000, 8192, 0);
}
if (bios_only || !ret)
return ret;
device_add(&keyboard_pc82_device);
machine_xt_common_init(model);
return ret;
}
int
machine_xt_multitechpc700_init(const machine_t *model)
{
int ret;
ret = bios_load_linear(L"roms/machines/multitech_pc700/multitech pc-700 3.1.bin",
0x000fe000, 8192, 0);
if (bios_only || !ret)
return ret;
device_add(&keyboard_pc_device);
machine_xt_common_init(model);
return ret;
}
/*
* Current bugs and limitations:
* - 640-768 conventional memory not usable (should be mapped at address d0000-effff)
*/
int
machine_xt_p3105_init(const machine_t *model)
{
int ret;
ret = bios_load_linear(L"roms/machines/philips_p3105/philipsnms9100.bin",
0x000fc000, 16384, 0);
if (bios_only || !ret)
return ret;
device_add(&keyboard_pc_device);
machine_xt_common_init(model);
return ret;
}
/*
* Current bugs and limitations:
* - 640-768 conventional memory not usable (should be mapped at address d0000-effff)
* - BIOS detects 4 fdds, so hdd letter is E instead of C
*/
int
machine_xt_p3120_init(const machine_t *model)
{
int ret;
ret = bios_load_linear(L"roms/machines/philips_p3120/philips_p3120.bin",
0x000f8000, 32768, 0);
if (bios_only || !ret)
return ret;
device_add(&keyboard_pc_device);
machine_common_init(model);
pit_ctr_set_out_func(&pit->counters[1], pit_refresh_timer_xt);
if (fdc_type == FDC_INTERNAL)
device_add(&fdc_at_device);
nmi_init();
if (joystick_type)
device_add(&gameport_device);
return ret;
}

View File

@@ -42,6 +42,8 @@
#include <86box/lpt.h>
#include <86box/serial.h>
#include <86box/machine.h>
#include <86box/io.h>
#include <86box/vid_cga.h>
typedef struct {
@@ -105,8 +107,36 @@ static const device_t zenith_scratchpad_device = {
};
void
machine_zenith_init(const machine_t *model){
machine_common_init(model);
if (fdc_type == FDC_INTERNAL)
device_add(&fdc_xt_device);
device_add(&zenith_scratchpad_device);
pit_ctr_set_out_func(&pit->counters[1], pit_refresh_timer_xt);
device_add(&keyboard_xt_zenith_device);
nmi_init();
}
const device_t *
z184_get_device(void)
{
return &cga_device;
}
/*
* Current bugs and limitations:
* - missing NVRAM implementation
*/
int
machine_xt_zenith_init(const machine_t *model)
machine_xt_z184_init(const machine_t *model)
{
int ret;
@@ -114,22 +144,61 @@ machine_xt_zenith_init(const machine_t *model)
0x000f8000, 32768, 0);
if (bios_only || !ret)
return ret;
return ret;
machine_common_init(model);
if (fdc_type == FDC_INTERNAL)
device_add(&fdc_xt_device);
machine_zenith_init(model);
lpt1_remove(); /* only one parallel port */
lpt2_remove();
lpt1_init(0x278);
device_add(&i8250_device);
serial_set_next_inst(2); /* So that serial_standalone_init() won't do anything. */
device_add(&zenith_scratchpad_device);
pit_ctr_set_out_func(&pit->counters[1], pit_refresh_timer_xt);
device_add(&keyboard_xt_compaq_device);
nmi_init();
device_add(&cga_device);
return ret;
}
int
machine_xt_z151_init(const machine_t *model)
{
int ret;
ret = bios_load_linear(L"roms/machines/zdsz151/444-229-18.bin",
0x000fc000, 32768, 0);
if (ret) {
bios_load_aux_linear(L"roms/machines/zdsz151/444-260-18.bin",
0x000f8000, 16384, 0);
}
if (bios_only || !ret)
return ret;
machine_zenith_init(model);
return ret;
}
/*
* Current bugs and limitations:
* - Memory board support for EMS currently missing
*/
int
machine_xt_z159_init(const machine_t *model)
{
int ret;
ret = bios_load_linear(L"roms/machines/zdsz159/z159m v2.9e.10d",
0x000f8000, 32768, 0);
if (bios_only || !ret)
return ret;
machine_zenith_init(model);
/* parallel port is on the memory board */
lpt1_remove(); /* only one parallel port */
lpt2_remove();
lpt1_init(0x278);
return ret;
}

View File

@@ -56,6 +56,8 @@ const machine_type_t machine_types[] = {
const machine_t machines[] = {
/* 8088 Machines */
{ "[8088] Columbia Data Products MPC-1600", "mpc1600", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 128, 512, 64, 0, machine_xt_mpc1600_init, NULL },
{ "[8088] Eagle PC Spirit", "eagle_pcspirit", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 128, 640, 64, 0, machine_xt_eaglepcspirit_init, NULL },
{ "[8088] IBM PC (1981)", "ibmpc", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 16, 64, 16, 0, machine_pc_init, NULL },
{ "[8088] IBM PC (1982)", "ibmpc82", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 256, 256, 256, 0, machine_pc82_init, NULL },
{ "[8088] IBM PCjr", "ibmpcjr", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC | MACHINE_VIDEO_FIXED, 128, 640, 128, 0, machine_pcjr_init, pcjr_get_device },
@@ -67,9 +69,12 @@ const machine_t machines[] = {
{ "[8088] DTK XT clone", "dtk", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 64, 640, 64, 0, machine_xt_dtk_init, NULL },
{ "[8088] Generic XT clone", "genxt", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 64, 640, 64, 0, machine_genxt_init, NULL },
{ "[8088] Juko XT clone", "jukopc", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 64, 640, 64, 0, machine_xt_jukopc_init, NULL },
{ "[8088] NCR PC4i", "ncr_pc4i", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 256, 640, 256, 0, machine_xt_ncrpc4i_init, NULL },
{ "[8088] Olivetti M19", "olivetti_m19", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC | MACHINE_VIDEO_FIXED, 256, 640, 256, 0, machine_xt_olim19_init, NULL },
{ "[8088] Multitech PC-700", "multitech_pc700", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 128, 640, 64, 0, machine_xt_multitechpc700_init, NULL },
{ "[8088] NCR PC4i", "ncr_pc4i", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 256, 640, 256, 0, machine_xt_ncrpc4i_init, NULL },
{ "[8088] Olivetti M19", "olivetti_m19", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC | MACHINE_VIDEO_FIXED, 256, 640, 256, 0, machine_xt_olim19_init, NULL },
{ "[8088] OpenXT", "open_xt", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 64, 640, 64, 0, machine_xt_open_xt_init, NULL },
{ "[8088] Philips P3105/NMS9100", "philips_p3105", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 256, 768, 256, 0, machine_xt_p3105_init, NULL },
{ "[8088] Philips P3120", "philips_p3120", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 256, 768, 256, 0, machine_xt_p3120_init, NULL },
{ "[8088] Phoenix XT clone", "pxxt", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 64, 640, 64, 0, machine_xt_pxxt_init, NULL },
{ "[8088] Schneider EuroPC", "europc", MACHINE_TYPE_8088, CPU_PKG_8088_EUROPC, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC | MACHINE_XTA | MACHINE_MOUSE, 512, 640, 128, 15, machine_europc_init, NULL },
{ "[8088] Tandy 1000", "tandy", MACHINE_TYPE_8088, CPU_PKG_8088_EUROPC, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC | MACHINE_VIDEO_FIXED, 128, 640, 128, 0, machine_tandy_init, tandy1k_get_device },
@@ -79,7 +84,9 @@ const machine_t machines[] = {
{ "[8088] VTech Laser Turbo XT", "ltxt", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 256, 640, 256, 0, machine_xt_laserxt_init, NULL },
#endif
{ "[8088] Xi8088", "xi8088", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_AT | MACHINE_BUS_PS2, 64, 1024, 128, 127, machine_xt_xi8088_init, xi8088_get_device },
{ "[8088] Zenith Data SupersPort", "zdsupers", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 128, 640, 128, 0, machine_xt_zenith_init, NULL },
{ "[8088] Zenith Data Systems Z-151/152/161", "zdsz151", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 128, 640, 64, 0, machine_xt_z151_init, NULL },
{ "[8088] Zenith Data Systems Z-159", "zdsz159", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 128, 640, 64, 0, machine_xt_z159_init, NULL },
{ "[8088] Zenith Data Systems SupersPort (Z-184)", "zdsupers", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC|MACHINE_VIDEO_FIXED, 128, 640, 128, 0, machine_xt_z184_init, z184_get_device },
/* 8086 Machines */
{ "[8086] Amstrad PC1512", "pc1512", MACHINE_TYPE_8086, CPU_PKG_8086, 0, 8000000, 8000000, 0, 0, 0, 0, MACHINE_PC | MACHINE_VIDEO_FIXED | MACHINE_MOUSE, 512, 640, 128, 63, machine_pc1512_init, pc1512_get_device },

View File

@@ -299,6 +299,6 @@ void ad1848_init(ad1848_t *ad1848, int type)
timer_add(&ad1848->timer_count, ad1848_poll, ad1848, 0);
if (ad1848->type != AD1848_TYPE_DEFAULT)
if (ad1848->type != AD1848_TYPE_DEFAULT && ad1848->type != AD1848_TYPE_CS4248)
sound_set_cd_audio_filter(ad1848_filter_cd_audio, ad1848);
}

View File

@@ -1506,8 +1506,11 @@ static const device_config_t sb_config[] =
"0x240", 0x240
},
{
""
}
"0x260", 0x260
},
{
""
}
}
},
{

View File

@@ -355,6 +355,17 @@ void et4000w32p_recalctimings(svga_t *svga)
svga->clock = (cpuclock * (double)(1ull << 32)) / svga->getclock((svga->miscout >> 2) & 3, svga->clock_gen);
if (svga->adv_flags & FLAG_NOSKEW) {
/* On the Cardex ET4000/W32p, adjust text mode clocks by 1. */
if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /*Text mode*/
svga->ma_latch--;
if ((svga->seqregs[1] & 8)) /*40 column*/
svga->hdisp += (svga->seqregs[1] & 1) ? 16 : 18;
else
svga->hdisp += (svga->seqregs[1] & 1) ? 8 : 9;
}
}
switch (svga->bpp)
{
case 15: case 16:

View File

@@ -445,7 +445,7 @@ svga_recalctimings(svga_t *svga)
svga->interlace = 0;
svga->ma_latch = ((svga->crtc[0xc] << 8) | svga->crtc[0xd]);
svga->ma_latch = ((svga->crtc[0xc] << 8) | svga->crtc[0xd]) + ((svga->crtc[8] & 0x60) >> 5);
svga->ca_adj = 0;
svga->rowcount = svga->crtc[9] & 31;
@@ -457,10 +457,11 @@ svga_recalctimings(svga_t *svga)
if (svga->seqregs[1] & 8) /*40 column*/ {
svga->render = svga_render_text_40;
svga->hdisp *= (svga->seqregs[1] & 1) ? 16 : 18;
/* Character clock is off by 1 now in 40-line modes, on all cards. */
svga->ma_latch--;
svga->hdisp += (svga->seqregs[1] & 1) ? 16 : 18;
} else {
svga->render = svga_render_text_80;
if (!(svga->adv_flags & FLAG_NOSKEW))
svga->ma_latch += ((svga->crtc[8] & 0x60) >> 5);
svga->hdisp *= (svga->seqregs[1] & 1) ? 8 : 9;
}
svga->hdisp_old = svga->hdisp;

View File

@@ -116,7 +116,8 @@ typedef struct banshee_t
int desktop_y;
uint32_t desktop_stride_tiled;
int type;
int type, card;
int vblank_irq;
void *i2c, *i2c_ddc, *ddc;
} banshee_t;
@@ -179,6 +180,7 @@ enum
#define VGAINIT0_EXTENDED_SHIFT_OUT (1 << 12)
#define VIDPROCCFG_CURSOR_MODE (1 << 1)
#define VIDPROCCFG_INTERLACE (1 << 3)
#define VIDPROCCFG_HALF_MODE (1 << 4)
#define VIDPROCCFG_OVERLAY_ENABLE (1 << 8)
#define VIDPROCCFG_OVERLAY_CLUT_BYPASS (1 << 11)
@@ -256,6 +258,32 @@ banshee_log(const char *fmt, ...)
static uint32_t banshee_status(banshee_t *banshee);
static int banshee_vga_vsync_enabled(banshee_t *banshee)
{
if (!(banshee->svga.crtc[0x11] & 0x20) && (banshee->svga.crtc[0x11] & 0x10) && ((banshee->pciInit0 >> 18) & 1) != 0)
return 1;
return 0;
}
static void banshee_update_irqs(banshee_t *banshee)
{
if (banshee->vblank_irq > 0 && banshee_vga_vsync_enabled(banshee)) {
pci_set_irq(banshee->card, PCI_INTA);
} else {
pci_clear_irq(banshee->card, PCI_INTA);
}
}
static void banshee_vblank_start(svga_t* svga)
{
banshee_t *banshee = (banshee_t*)svga->p;
if (banshee->vblank_irq >= 0) {
banshee->vblank_irq = 1;
banshee_update_irqs(banshee);
}
}
static void banshee_out(uint16_t addr, uint8_t val, void *p)
{
banshee_t *banshee = (banshee_t *)p;
@@ -281,7 +309,18 @@ static void banshee_out(uint16_t addr, uint8_t val, void *p)
svga->crtc[svga->crtcreg] = val;
if (old != val)
{
if (svga->crtcreg < 0xe || svga->crtcreg > 0x10)
if (svga->crtcreg == 0x11) {
if (!(val & 0x10)) {
if (banshee->vblank_irq > 0)
banshee->vblank_irq = -1;
} else if (banshee->vblank_irq < 0) {
banshee->vblank_irq = 0;
}
banshee_update_irqs(banshee);
if ((val & ~0x30) == (old & ~0x30))
old = val;
}
if (svga->crtcreg < 0xe || svga->crtcreg > 0x11 || (svga->crtcreg == 0x11 && old != val))
{
svga->fullchange = changeframecount;
svga_recalctimings(svga);
@@ -310,6 +349,8 @@ static uint8_t banshee_in(uint16_t addr, void *p)
temp = 0;
else
temp = 0x10;
if (banshee->vblank_irq > 0)
temp |= 0x80;
break;
case 0x3D4:
temp = svga->crtcreg;
@@ -440,6 +481,8 @@ static void banshee_recalctimings(svga_t *svga)
if (svga->crtc[0x1b] & 0x40) svga->vsyncstart += 0x400;
// banshee_log("svga->hdisp=%i\n", svga->hdisp);
svga->interlace = 0;
if (banshee->vgaInit0 & VGAINIT0_EXTENDED_SHIFT_OUT)
{
switch (VIDPROCCFG_DESKTOP_PIX_FORMAT)
@@ -484,6 +527,8 @@ static void banshee_recalctimings(svga_t *svga)
svga->htotal *= 2;
}
svga->interlace = !!(banshee->vidProcCfg & VIDPROCCFG_INTERLACE);
svga->overlay.ena = banshee->vidProcCfg & VIDPROCCFG_OVERLAY_ENABLE;
svga->overlay.x = voodoo->overlay.start_x;
@@ -791,7 +836,6 @@ static uint32_t banshee_status(banshee_t *banshee)
voodoo_t *voodoo = banshee->voodoo;
svga_t *svga = &banshee->svga;
int fifo_entries = FIFO_ENTRIES;
int fifo_size = 0xffff - fifo_entries;
int swap_count = voodoo->swap_count;
int written = voodoo->cmd_written + voodoo->cmd_written_fifo;
int busy = (written - voodoo->cmd_read) || (voodoo->cmdfifo_depth_rd != voodoo->cmdfifo_depth_wr) ||
@@ -801,11 +845,11 @@ static uint32_t banshee_status(banshee_t *banshee)
uint32_t ret;
ret = 0;
if (fifo_size < 0x20)
ret |= fifo_size;
if (fifo_entries < 0x20)
ret |= 0x1f - fifo_entries;
else
ret |= 0x1f;
if (fifo_size)
if (fifo_entries)
ret |= 0x20;
if (swap_count < 7)
ret |= (swap_count << 28);
@@ -1041,6 +1085,14 @@ static uint32_t banshee_reg_readl(uint32_t addr, void *p)
voodoo_flush(voodoo);
switch (addr & 0x1fc)
{
case SST_status:
ret = banshee_status(banshee);
break;
case SST_intrCtrl:
ret = banshee->intrCtrl & 0x0030003f;
break;
case 0x08:
ret = voodoo->banshee_blt.clip0Min;
break;
@@ -1271,7 +1323,11 @@ static void banshee_reg_writel(uint32_t addr, uint32_t val, void *p)
break;
case 0x0100000: /*2D registers*/
voodoo_queue_command(voodoo, (addr & 0x1fc) | FIFO_WRITEL_2DREG, val);
if ((addr & 0x3fc) == SST_intrCtrl) {
banshee->intrCtrl = val & 0x0030003f;
} else {
voodoo_queue_command(voodoo, (addr & 0x1fc) | FIFO_WRITEL_2DREG, val);
}
break;
case 0x0200000: case 0x0300000: case 0x0400000: case 0x0500000: /*3D registers*/
@@ -2365,8 +2421,8 @@ static uint8_t banshee_pci_read(int func, int addr, void *p)
case 0x18: ret = 0x01; break; /*ioBaseAddr*/
case 0x19: ret = banshee->ioBaseAddr >> 8; break;
case 0x1a: ret = 0x00; break;
case 0x1b: ret = 0x00; break;
case 0x1a: ret = banshee->ioBaseAddr >> 16; break;
case 0x1b: ret = banshee->ioBaseAddr >> 24; break;
/*Subsystem vendor ID*/
case 0x2c: ret = banshee->pci_regs[0x2c]; break;
@@ -2445,12 +2501,23 @@ static void banshee_pci_write(int func, int addr, uint8_t val, void *p)
case 0x19:
if (banshee->pci_regs[PCI_REG_COMMAND] & PCI_COMMAND_IO)
io_removehandler(banshee->ioBaseAddr, 0x0100, banshee_ext_in, NULL, banshee_ext_inl, banshee_ext_out, NULL, banshee_ext_outl, banshee);
banshee->ioBaseAddr = val << 8;
banshee->ioBaseAddr &= 0xffff00ff;
banshee->ioBaseAddr |= val << 8;
if ((banshee->pci_regs[PCI_REG_COMMAND] & PCI_COMMAND_IO) && banshee->ioBaseAddr)
io_sethandler(banshee->ioBaseAddr, 0x0100, banshee_ext_in, NULL, banshee_ext_inl, banshee_ext_out, NULL, banshee_ext_outl, banshee);
banshee_log("Banshee ioBaseAddr=%08x\n", banshee->ioBaseAddr);
return;
case 0x1a:
banshee->ioBaseAddr &= 0xff00ffff;
banshee->ioBaseAddr |= val << 16;
break;
case 0x1b:
banshee->ioBaseAddr &= 0x00ffffff;
banshee->ioBaseAddr |= val << 24;
break;
case 0x30: case 0x32: case 0x33:
banshee->pci_regs[addr] = val;
if (banshee->pci_regs[0x30] & 0x01)
@@ -2645,6 +2712,8 @@ static void *banshee_init_common(const device_t *info, wchar_t *fn, int has_sgra
MEM_MAPPING_EXTERNAL,
banshee);
banshee->svga.vblank_start = banshee_vblank_start;
// io_sethandler(0x03c0, 0x0020, banshee_in, NULL, NULL, banshee_out, NULL, NULL, banshee);
banshee->svga.bpp = 8;
@@ -2657,7 +2726,7 @@ static void *banshee_init_common(const device_t *info, wchar_t *fn, int has_sgra
banshee->dramInit1 = 1 << 30; /*SDRAM*/
banshee->svga.decode_mask = 0x1ffffff;
pci_add_card(PCI_ADD_VIDEO, banshee_pci_read, banshee_pci_write, banshee);
banshee->card = pci_add_card(PCI_ADD_VIDEO, banshee_pci_read, banshee_pci_write, banshee);
banshee->voodoo = voodoo_2d3d_card_init(voodoo_type);
banshee->voodoo->p = banshee;

View File

@@ -719,7 +719,6 @@ plat_setvid(int api)
win_log("Initializing VIDAPI: api=%d\n", api);
startblit();
video_wait_for_blit();
/* Close the (old) API. */
vid_apis[vid_api].close();
@@ -750,7 +749,6 @@ plat_vidsize(int x, int y)
if (!vid_api_inited || !vid_apis[vid_api].resize) return;
startblit();
video_wait_for_blit();
vid_apis[vid_api].resize(x, y);
endblit();
}
@@ -764,7 +762,6 @@ plat_vidapi_enable(int enable)
if (!vid_api_inited || !vid_apis[vid_api].enable)
return;
video_wait_for_blit();
vid_apis[vid_api].enable(enable != 0);
if (! i)
@@ -803,7 +800,6 @@ plat_setfullscreen(int on)
}
/* OK, claim the video. */
video_wait_for_blit();
win_mouse_close();
/* Close the current mode, and open the new one. */

View File

@@ -166,7 +166,6 @@ static void
video_toggle_option(HMENU h, int *val, int id)
{
startblit();
video_wait_for_blit();
*val ^= 1;
CheckMenuItem(h, id, *val ? MF_CHECKED : MF_UNCHECKED);
endblit();
@@ -1467,8 +1466,6 @@ plat_resize(int x, int y)
/* First, see if we should resize the UI window. */
if (!vid_resize) {
video_wait_for_blit();
/* scale the screen base on DPI */
if (dpi_scale) {