xmil-libretro/pccore.c
2015-12-30 08:43:11 +00:00

368 lines
6.5 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* #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
}