xmil-libretro/pccore.c

366 lines
6.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. 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)
22050, 500,
#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();
}
void pccore_deinitialize(void) {
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)
if (xmilcfg.ROM_TYPE >= 3) {
pccore.SOUND_SW = 1; /* ³<E28093>ðŒ<C3B0>Å“<E2809C>Ú */
}
else {
pccore.SOUND_SW = xmilcfg.SOUND_SW;
}
#endif
pccore.DIP_SW = xmilcfg.DIP_SW;
/* ƒXƒNƒŠ<C692>[ƒ“ƒ<C692>[ƒhÌ•Ï<E280A2>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
}