mirror of
https://github.com/libretro/xmil-libretro.git
synced 2024-11-23 08:09:42 +00:00
65c5334e41
refs #111 svn merge -r 321:329 https://amethyst.yui.ne.jp/svn-dev/x1/xmil/branches/yui/WORK_02
368 lines
6.5 KiB
C
368 lines
6.5 KiB
C
|
||
/* #define SINGLESTEPONLY */
|
||
/* #define IPTRACE (1 << 14) */
|
||
/* #define NEVENT_COUNTER */
|
||
/* #define PCCOUNTER */
|
||
/* #define IOCOUNTER */
|
||
/* #define CTCCOUNTER */
|
||
|
||
#include "compiler.h"
|
||
#if defined(TRACE) && IPTRACE
|
||
#include "dosio.h"
|
||
#endif
|
||
#if defined(SUPPORT_TURBOZ)
|
||
#include "scrnmng.h"
|
||
#endif
|
||
#if !defined(DISABLE_SOUND)
|
||
#include "soundmng.h"
|
||
#endif
|
||
#include "sysmng.h"
|
||
#include "timemng.h"
|
||
#include "xmilver.h"
|
||
#include "z80core.h"
|
||
#include "pccore.h"
|
||
#include "iocore.h"
|
||
#include "nevent.h"
|
||
#include "ievent.h"
|
||
#include "timing.h"
|
||
#include "calendar.h"
|
||
#include "keystat.h"
|
||
#include "palettes.h"
|
||
#include "makescrn.h"
|
||
#include "sound.h"
|
||
#include "sndctrl.h"
|
||
#include "font.h"
|
||
#include "fddfile.h"
|
||
|
||
|
||
const OEMCHAR xmilversion[] = OEMTEXT(XMILVER_CORE);
|
||
|
||
XMILCFG xmilcfg = { 2, 1, 0x03,
|
||
1, 0, 0, 0,
|
||
#if !defined(DISABLE_SOUND)
|
||
44100, 250,
|
||
#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM)
|
||
64,
|
||
#endif
|
||
64, 0, 80,
|
||
#endif
|
||
#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM)
|
||
0,
|
||
#endif
|
||
0, 0, 0, 0};
|
||
|
||
PCCORE pccore;
|
||
CORESTAT corestat;
|
||
|
||
|
||
/* ---- */
|
||
|
||
void pccore_initialize(void) {
|
||
|
||
Z80_INITIALIZE();
|
||
fddfile_initialize();
|
||
sndctrl_initialize();
|
||
makescrn_initialize();
|
||
|
||
font_load(NULL, TRUE);
|
||
|
||
crtc_initialize();
|
||
pcg_initialize();
|
||
ppi_initialize();
|
||
|
||
sndboard_initialize();
|
||
}
|
||
|
||
void pccore_deinitialize(void) {
|
||
|
||
sndboard_deinitialize();
|
||
sndctrl_deinitialize();
|
||
|
||
fddfile_eject(0);
|
||
fddfile_eject(1);
|
||
fddfile_eject(2);
|
||
fddfile_eject(3);
|
||
}
|
||
|
||
#if 0
|
||
void neitem_dummy(NEVENTID id) {
|
||
|
||
nevent_repeat(id);
|
||
}
|
||
#endif
|
||
|
||
void pccore_reset(void) {
|
||
|
||
#if !defined(DISABLE_SOUND)
|
||
soundmng_stop();
|
||
if (corestat.soundrenewal) {
|
||
corestat.soundrenewal = 0;
|
||
sndctrl_deinitialize();
|
||
sndctrl_initialize();
|
||
}
|
||
#endif
|
||
|
||
#if !defined(FIX_Z80A)
|
||
pccore.baseclock = 2000000;
|
||
pccore.multiple = 2;
|
||
pccore.realclock = pccore.baseclock * pccore.multiple;
|
||
#endif
|
||
|
||
pccore.ROM_TYPE = xmilcfg.ROM_TYPE;
|
||
#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM)
|
||
pccore.SOUND_SW = xmilcfg.SOUND_SW;
|
||
if ((xmilcfg.ROM_TYPE >= 3) && (pccore.SOUND_SW == 0))
|
||
{
|
||
pccore.SOUND_SW = 1; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><C293><EFBFBD> */
|
||
}
|
||
#endif
|
||
pccore.DIP_SW = xmilcfg.DIP_SW;
|
||
|
||
/* <20>X<EFBFBD>N<EFBFBD><4E><EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>[<5B>h<EFBFBD>̕ύX... */
|
||
#if defined(SUPPORT_TURBOZ)
|
||
if (pccore.ROM_TYPE >= 3) {
|
||
if (scrnmng_setcolormode(TRUE) != SUCCESS) {
|
||
pccore.ROM_TYPE = 2;
|
||
}
|
||
}
|
||
else {
|
||
scrnmng_setcolormode(FALSE);
|
||
}
|
||
#endif
|
||
|
||
sysmng_cpureset();
|
||
|
||
sound_changeclock();
|
||
sound_reset();
|
||
|
||
Z80_RESET();
|
||
nevent_allreset();
|
||
ievent_reset();
|
||
calendar_reset();
|
||
iocore_reset();
|
||
/* nevent_set(15, 4000000 / (60 * 50), neitem_dummy, NEVENT_RELATIVE); */
|
||
|
||
pal_reset();
|
||
makescrn_reset();
|
||
timing_reset();
|
||
|
||
#if !defined(DISABLE_SOUND)
|
||
soundmng_play();
|
||
#endif
|
||
}
|
||
|
||
|
||
/* ---- */
|
||
|
||
#if defined(TRACE) && IPTRACE
|
||
static UINT trpos = 0;
|
||
static UINT16 treip[IPTRACE];
|
||
|
||
void iptrace_out(void) {
|
||
|
||
FILEH fh;
|
||
UINT s;
|
||
UINT16 pc;
|
||
char buf[32];
|
||
|
||
s = trpos;
|
||
if (s > IPTRACE) {
|
||
s -= IPTRACE;
|
||
}
|
||
else {
|
||
s = 0;
|
||
}
|
||
fh = file_create_c("his.txt");
|
||
while(s < trpos) {
|
||
pc = treip[s & (IPTRACE - 1)];
|
||
s++;
|
||
SPRINTF(buf, "%.4x\r\n", pc);
|
||
file_write(fh, buf, strlen(buf));
|
||
}
|
||
file_close(fh);
|
||
}
|
||
#endif
|
||
|
||
|
||
#if !defined(MAINFRAMES_OLD)
|
||
void neitem_mainframes(NEVENTID id) {
|
||
|
||
SINT32 clock;
|
||
REG8 ppib;
|
||
SINT32 next;
|
||
|
||
clock = CPU_CLOCKCOUNT - iocore.e.framestartclock;
|
||
ppib = iocore.s.ppib & (~0x84);
|
||
do {
|
||
next = iocore.e.dispclock;
|
||
if (clock < next) {
|
||
ppib |= 0x80;
|
||
break;
|
||
}
|
||
next = iocore.e.dispclock;
|
||
if (clock < next) {
|
||
if (xmilcfg.DISPSYNC & 1) {
|
||
scrnupdate();
|
||
}
|
||
break;
|
||
}
|
||
next = iocore.e.vsyncend;
|
||
if (clock < next) {
|
||
ppib |= 0x04;
|
||
break;
|
||
}
|
||
next = corestat.framebaseclock;
|
||
if (clock >= next) {
|
||
corestat.vsync = 2;
|
||
return;
|
||
}
|
||
} while(0);
|
||
iocore.s.ppib = ppib;
|
||
nevent_set(NEVENT_FRAMES,
|
||
next - clock, neitem_mainframes, NEVENT_ABSOLUTE);
|
||
}
|
||
#else
|
||
void neitem_disp(NEVENTID id) {
|
||
|
||
corestat.vsync = 1;
|
||
if (xmilcfg.DISPSYNC & 1) {
|
||
scrnupdate();
|
||
}
|
||
nevent_set(id, corestat.syncclock, neitem_vsync, NEVENT_RELATIVE);
|
||
}
|
||
|
||
void neitem_vsync(NEVENTID id) {
|
||
|
||
corestat.vsync = 2;
|
||
(void)id;
|
||
}
|
||
#endif
|
||
|
||
|
||
/* ---- */
|
||
|
||
#if defined(TRACE) && defined(IOCOUNTER)
|
||
static UINT iocounter = 0;
|
||
UINT icounter[0x2008];
|
||
UINT ocounter[0x2008];
|
||
#endif
|
||
#if defined(TRACE) && defined(CTCCOUNTER)
|
||
UINT ctccnt;
|
||
#endif
|
||
#if defined(TRACE) && defined(PCCOUNTER)
|
||
UINT pccnt;
|
||
UINT pccnt2;
|
||
UINT pccnt3;
|
||
UINT lastpc;
|
||
#endif
|
||
|
||
|
||
void pccore_exec(BOOL draw) {
|
||
|
||
SINT32 frameclock;
|
||
#if defined(MAINFRAMES_OLD)
|
||
SINT32 dispclock;
|
||
#endif
|
||
#if defined(TRACE) && defined(NEVENT_COUNTER)
|
||
UINT ncounter = 0;
|
||
#endif
|
||
|
||
corestat.drawframe = draw;
|
||
pal_eventclear();
|
||
#if !defined(DISABLE_SOUND)
|
||
soundmng_sync();
|
||
#endif
|
||
|
||
frameclock = crtc.e.frameclock;
|
||
if (corestat.framebaseclock != frameclock) {
|
||
corestat.framebaseclock = frameclock;
|
||
timing_setrate(frameclock);
|
||
}
|
||
corestat.vsync = 0;
|
||
|
||
iocore.e.framestartclock = CPU_CLOCKCOUNT;
|
||
|
||
#if !defined(MAINFRAMES_OLD)
|
||
neitem_mainframes(NEVENT_FRAMES);
|
||
#else
|
||
#if !defined(FIX_Z80A)
|
||
frameclock = frameclock * pccore.multiple / 2;
|
||
#endif
|
||
dispclock = min(frameclock, iocore.e.dispclock);
|
||
corestat.syncclock = frameclock - dispclock;
|
||
nevent_set(NEVENT_FRAMES, dispclock, neitem_disp, NEVENT_RELATIVE);
|
||
#endif
|
||
|
||
do {
|
||
#if defined(TRACE) && defined(NEVENT_COUNTER)
|
||
ncounter++;
|
||
#endif
|
||
#if !defined(SINGLESTEPONLY)
|
||
if (CPU_REMCLOCK > 0) {
|
||
Z80_EXECUTE();
|
||
}
|
||
#else
|
||
while(CPU_REMCLOCK > 0) {
|
||
/* TRACEOUT(("%.4x", Z80_PC)); */
|
||
#if defined(TRACE) && IPTRACE
|
||
treip[trpos & (IPTRACE - 1)] = Z80_PC;
|
||
trpos++;
|
||
#endif
|
||
Z80_STEP();
|
||
}
|
||
#endif
|
||
nevent_progress();
|
||
ievent_progress();
|
||
} while(corestat.vsync < 2);
|
||
|
||
scrnupdate();
|
||
sound_sync();
|
||
fdc_callback();
|
||
|
||
#if defined(TRACE) && defined(NEVENT_COUNTER)
|
||
TRACEOUT(("loop = %d", ncounter));
|
||
#endif
|
||
#if defined(TRACE) && defined(CTCCOUNTER)
|
||
TRACEOUT(("ctc = %d", ctccnt));
|
||
ctccnt = 0;
|
||
#endif
|
||
#if defined(TRACE) && defined(PCCOUNTER)
|
||
TRACEOUT(("pccnt = %d %d %d", pccnt, pccnt2, pccnt3));
|
||
pccnt = 0;
|
||
pccnt2 = 0;
|
||
pccnt3 = 0;
|
||
#endif
|
||
#if defined(TRACE) && defined(IOCOUNTER)
|
||
iocounter++;
|
||
if (iocounter >= 60) {
|
||
UINT i, j, cnt, pos;
|
||
iocounter = 0;
|
||
for (i=0; i<10; i++) {
|
||
cnt = 0;
|
||
pos = 0;
|
||
for (j=0; j<0x2004; j++) {
|
||
if (cnt < ocounter[j]) {
|
||
cnt = ocounter[j];
|
||
pos = j;
|
||
}
|
||
}
|
||
ocounter[pos] = 0;
|
||
TRACEOUT(("o%2d - %.4x %8dtimes", i, pos, cnt));
|
||
}
|
||
for (i=0; i<10; i++) {
|
||
cnt = 0;
|
||
pos = 0;
|
||
for (j=0; j<0x2004; j++) {
|
||
if (cnt < icounter[j]) {
|
||
cnt = icounter[j];
|
||
pos = j;
|
||
}
|
||
}
|
||
icounter[pos] = 0;
|
||
TRACEOUT(("i%2d - %.4x %8dtimes", i, pos, cnt));
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
|