Changes since v0.7 : - Major CPU reorganisation. This has possibly broken some stuff, though I fixed all the regressions I could find - Lazy flags. This brought 10% speed improvement at one point, but that's probably been lost now - 430 VX chipset emulation - IDT Winchip emulation (currently sans MMX). Timing is probably wrong - Fixed a few FPU bugs - Timer reorganisation - Sound reorganisation - Other general reorganisation - AdLib Gold emulation - Windows Sound System emulation - Pro Audio Spectrum 16 emulation. This currently works with most DOS stuff, but not in Windows - Major improvements to GUS emulation. Has the downside that it now conflicts with SB emulation, so probably best to not enable both simultaneously - New graphics cards : - ATI-18800 (VGA Edge-16) - ATI-28800 (VGA Charger) - ATI Mach64GX (Graphics Pro Turbo). Quite a few features missing, but Windows doesn't seem to use half the features of this card - Cirrus Logic CL-GD5429. Blitter is a bit broken - Oak OTI-067 - S3 Trio64 (Number Nine 9FX) - S3 Virge. Only framebuffer stuff at the minute, Windows won't recognise the card - Trident TGUI-9440 - VGA. Doesn't work yet - Beginnings of 3DFX emulation, however this is in extremely early stages and doesn't do anything useful - Fixed DMA bug stopping floppy drives working in Windows 3.x - Fixed some other stuff probably - Broke some other stuff probably as well
79 lines
2.6 KiB
C
79 lines
2.6 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "ibm.h"
|
|
#include "io.h"
|
|
|
|
uint8_t europcdat[16];
|
|
struct
|
|
{
|
|
uint8_t dat[16];
|
|
int stat;
|
|
int addr;
|
|
} europc_rtc;
|
|
|
|
void writejim(uint16_t addr, uint8_t val, void *p)
|
|
{
|
|
if ((addr&0xFF0)==0x250) europcdat[addr&0xF]=val;
|
|
switch (addr)
|
|
{
|
|
case 0x25A:
|
|
// printf("Write RTC stat %i val %02X\n",europc_rtc.stat,val);
|
|
switch (europc_rtc.stat)
|
|
{
|
|
case 0:
|
|
europc_rtc.addr=val&0xF;
|
|
europc_rtc.stat++;
|
|
// printf("RTC addr now %02X - contents %02X\n",val&0xF,europc_rtc.dat[europc_rtc.addr]);
|
|
break;
|
|
case 1:
|
|
europc_rtc.dat[europc_rtc.addr]=(europc_rtc.dat[europc_rtc.addr]&0xF)|(val<<4);
|
|
europc_rtc.stat++;
|
|
break;
|
|
case 2:
|
|
europc_rtc.dat[europc_rtc.addr]=(europc_rtc.dat[europc_rtc.addr]&0xF0)|(val&0xF);
|
|
europc_rtc.stat=0;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
// printf("Write JIM %04X %02X\n",addr,val);
|
|
}
|
|
|
|
uint8_t readjim(uint16_t addr, void *p)
|
|
{
|
|
// printf("Read JIM %04X\n",addr);
|
|
switch (addr)
|
|
{
|
|
case 0x250: case 0x251: case 0x252: case 0x253: return 0;
|
|
case 0x254: case 0x255: case 0x256: case 0x257: return europcdat[addr&0xF];
|
|
case 0x25A:
|
|
if (europc_rtc.stat==1)
|
|
{
|
|
europc_rtc.stat=2;
|
|
return europc_rtc.dat[europc_rtc.addr]>>4;
|
|
}
|
|
if (europc_rtc.stat==2)
|
|
{
|
|
europc_rtc.stat=0;
|
|
return europc_rtc.dat[europc_rtc.addr]&0xF;
|
|
}
|
|
return 0;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void jim_init()
|
|
{
|
|
uint8_t viddat;
|
|
memset(europc_rtc.dat,0,16);
|
|
europc_rtc.dat[0xF]=1;
|
|
europc_rtc.dat[3]=1;
|
|
europc_rtc.dat[4]=1;
|
|
europc_rtc.dat[5]=0x88;
|
|
if (gfxcard==GFX_CGA) viddat=0x12;
|
|
else if (gfxcard==GFX_MDA || gfxcard==GFX_HERCULES) viddat=3;
|
|
else viddat=0x10;
|
|
europc_rtc.dat[0xB]=viddat;
|
|
europc_rtc.dat[0xD]=viddat; /*Checksum*/
|
|
io_sethandler(0x250, 0x10, readjim, NULL, NULL, writejim, NULL, NULL, NULL);
|
|
}
|