#include "compiler.h"
#include "resource.h"
#include "strres.h"
#include "xmil.h"
#include "dosio.h"
#include "mousemng.h"
#include "scrnmng.h"
#include "soundmng.h"
#include "sysmng.h"
#include "palmkbd.h"
#include "ini.h"
#include "dialog.h"
#include "z80core.h"
#include "pccore.h"
#include "iocore.h"
#include "timing.h"
#include "debugsub.h"
#include "scrndraw.h"
#include "makescrn.h"
#include "diskdrv.h"
#include "fdd_ini.h"
#include "x1f.h"
#include "keystat.h"
#include "fddfile.h"
#include "PalmNavigator.h"
#include "joymng.h"
#include "statsave.h"
XMILOSCFG xmiloscfg = {100, 100, 0, 0, 3, 2, 3, 4, 5,
#ifdef SUPPORT_RESUME
0,
#endif
0, 0, 0};
BRESULT xmilrunning;
static BRESULT inmenu = FALSE;
#define DEFAULTPATH "/Palm/Programs/X1/"
#define MAINLOOPWAIT 100
static char target[MAX_PATH] = DEFAULTPATH;
static const char xmilresume[] = "sav";
static const char xmilapp[] = "xmil";
void SetHardKey(UINT32 data) {
UINT update = 0;
switch (data & 0xffff) {
case IDC_KEYLIST1:
xmiloscfg.HARDKEY1 = data >> 16;
update = SYS_UPDATEOSCFG;
break;
case IDC_KEYLIST2:
xmiloscfg.HARDKEY2 = data >> 16;
update = SYS_UPDATEOSCFG;
break;
case IDC_KEYLIST3:
xmiloscfg.HARDKEY3 = data >> 16;
update = SYS_UPDATEOSCFG;
break;
case IDC_KEYLIST4:
xmiloscfg.HARDKEY4 = data >> 16;
update = SYS_UPDATEOSCFG;
break;
default:
break;
}
sysmng_update(update);
}
static void setvalue(FormType* frm, UINT16 id, UINT8 cfg) {
ARM_CtlSetValue(ARM_FrmGetObjectPtr(frm, ARM_FrmGetObjectIndex(frm, id)), cfg);
}
static void setlabel(FormType* frm, UINT16 listid, UINT16 lableid, UINT8 cfg) {
ListType* list;
ControlType* ctrl = ARM_FrmGetObjectPtr(frm, ARM_FrmGetObjectIndex(frm, lableid));
if (cfg < 12) {
list = ARM_FrmGetObjectPtr(frm, ARM_FrmGetObjectIndex(frm, listid));
ARM_CtlSetLabel(ctrl, ARM_LstGetSelectionText(list, cfg));
} else {
ARM_CtlSetLabel(ctrl, "N/A");
}
}
void FormInit(void) {
FormType* frm = ARM_FrmGetActiveForm();
setvalue(frm, IDC_NOWAIT, xmiloscfg.NOWAIT);
setvalue(frm, IDC_CAPS, keystat.hit[CAPS_CODE]);
setvalue(frm, IDC_KANA, keystat.hit[KANA_CODE]);
setvalue(frm, IDC_SHIFT, keystat.hit[SHIFT_CODE]);
setvalue(frm, IDC_CTRL, keystat.hit[CTRL_CODE]);
setvalue(frm, IDC_GRAPH, keystat.hit[GRAPH_CODE]);
setlabel(frm, IDC_KEYLIST1, IDC_HARDKEY1, xmiloscfg.HARDKEY1);
setlabel(frm, IDC_KEYLIST2, IDC_HARDKEY2, xmiloscfg.HARDKEY2);
setlabel(frm, IDC_KEYLIST3, IDC_HARDKEY3, xmiloscfg.HARDKEY3);
setlabel(frm, IDC_KEYLIST4, IDC_HARDKEY4, xmiloscfg.HARDKEY4);
sysmng_updatecaption(3);
ARM_FrmDrawForm(frm);
}
static const UINT hardkey[] = {0, 0,0x20,0x0d,0x1b,0x8a,0x8b,0x91,0x92,0x93,0x94,0x95};
void HandleMenuChoice(UINT wParam) {
UINT update;
update = 0;
switch(wParam) {
case IDM_ABOUT:
AboutDialogProc();
break;
case IDM_IPLRESET:
pccore_reset();
break;
case IDM_NMIRESET:
Z80_NMI();
break;
case IDM_CONFIG:
ConfigDialogProc();
break;
case IDM_NEWDISK:
dialog_newdisk();
break;
case IDM_EXIT:
xmilrunning = FALSE;
break;
case IDM_FDD0OPEN:
dialog_changefdd(0);
break;
case IDM_FDD0EJECT:
diskdrv_setfdd(0, NULL, 0);
break;
case IDM_FDD1OPEN:
dialog_changefdd(1);
break;
case IDM_FDD1EJECT:
diskdrv_setfdd(1, NULL, 0);
break;
case IDM_FDD2OPEN:
dialog_changefdd(2);
break;
case IDM_FDD2EJECT:
diskdrv_setfdd(2, NULL, 0);
break;
case IDM_FDD3OPEN:
dialog_changefdd(3);
break;
case IDM_FDD3EJECT:
diskdrv_setfdd(3, NULL, 0);
break;
case IDM_WIDTH80:
crtc_forcesetwidth(80);
break;
case IDM_WIDTH40:
crtc_forcesetwidth(40);
break;
#if 0
case IDM_DISPSYNC:
xmilcfg.DISPSYNC = (xmilcfg.DISPSYNC ^ 1) & 1;
update = SYS_UPDATECFG;
break;
case IDM_RASTER:
xmilcfg.RASTER = (xmilcfg.RASTER ^ 1) & 1;
update = SYS_UPDATECFG;
break;
#endif
case IDM_NOWAIT:
xmiloscfg.NOWAIT = (xmiloscfg.NOWAIT ^ 1) & 1;
update = SYS_UPDATEOSCFG;
break;
case IDM_AUTOFPS:
xmiloscfg.DRAW_SKIP = 0;
update = SYS_UPDATEOSCFG;
break;
case IDM_60FPS:
xmiloscfg.DRAW_SKIP = 1;
update = SYS_UPDATEOSCFG;
break;
case IDM_30FPS:
xmiloscfg.DRAW_SKIP = 2;
update = SYS_UPDATEOSCFG;
break;
case IDM_20FPS:
xmiloscfg.DRAW_SKIP = 3;
update = SYS_UPDATEOSCFG;
break;
case IDM_15FPS:
xmiloscfg.DRAW_SKIP = 4;
update = SYS_UPDATEOSCFG;
break;
#if 0
case IDM_MOUSE:
menu_setmouse(xmilcfg.MOUSE_SW ^ 1);
update = SYS_UPDATECFG;
break;
case IDM_SEEKSND:
menu_setmotorflg(xmilcfg.MOTOR ^ 1);
update = SYS_UPDATECFG;
break;
#endif
case IDM_BMPSAVE:
dialog_writebmp();
break;
case IDM_DISPCLOCK:
xmiloscfg.DISPCLK = (xmiloscfg.DISPCLK ^ 1) & 3;
update = SYS_UPDATEOSCFG;
sysmng_workclockrenewal();
sysmng_updatecaption(2);
break;
case IDM_DISPFRAME:
xmiloscfg.DISPCLK = (xmiloscfg.DISPCLK ^ 2) & 3;
update = SYS_UPDATEOSCFG;
sysmng_workclockrenewal();
sysmng_updatecaption(2);
break;
case IDM_DIPSW:
DipswDialogProc();
break;
case IDM_OPTION:
OptionDialogProc();
break;
case IDM_SOUNDOPT:
SoundDialogProc();
break;
case IDM_SCRNOPT:
ScrnOptionDialogProc();
break;
#if 0
case IDM_Z80SAVE:
debugsub_status();
break;
#endif
default:
return;
}
sysmng_update(update);
inmenu = FALSE;
scrndraw_redraw();
soundmng_play();
}
static int ApplicationHandleEvent(EventPtr eventP) {
int handled = 0;
UINT32* idp = (UINT32*)eventP;
UINT16 topdata = ByteSwap16(*(idp+2) & 0xffff);
UINT keycode;
UINT32 keystate, rockerstate, updownstate, navstate;
keystate = ARM_KeyCurrentState();
rockerstate = (keystate & 0x001f0000) >> 16;
updownstate = (keystate & (keyBitPageUp | keyBitPageDown)) >> 1;
navstate = (keystate & keyBitNavLRS) >> 22;
joymng_5way(rockerstate | updownstate | navstate);
joymng_hardkey(keystate);
switch (ByteSwap16(eventP->eType)) {
case keyDownEvent:
if (inmenu) break;
switch (topdata) {
case vchrNavChange:
case vchrPageUp:
case vchrPageDown:
case vchrRockerLeft:
case vchrRockerRight:
case vchrHard1:
case vchrHard2:
case vchrHard3:
case vchrHard4:
handled = 1;
break;
default:
if (!(topdata & 0xff00)) {
keycode = topdata & 0x7f;
palmkbd_keydown(keycode, TRUE);
handled = 1;
}
}
break;
case keyUpEvent:
if (inmenu) break;
if (!(topdata & 0xff00)) {
keycode = topdata & 0x7f;
palmkbd_keyup(keycode);
handled = 1;
}
break;
case menuEvent:
HandleMenuChoice(topdata);
handled = 1;
break;
case appStopEvent:
xmilrunning = FALSE;
handled = 1;
break;
case penUpEvent:
#if 0
{
UINT16 x = ByteSwap16(*(idp+1));
UINT16 y = ByteSwap32(*(idp+1)) & 0xffff;
if (y < 14+100){
menuout = true;
}
break;
}
#endif
case penMoveEvent:
case penDownEvent:
if (xmiloscfg.graffiti) {
handled = -1;
}
break;
default:
break;
}
return(handled);
}
#ifdef SUPPORT_RESUME
// ----
static void getstatfilename(char *path, const char *ext, int size) {
file_cpyname(path, file_getcd(xmilapp), size);
file_catname(path, str_dot, size);
file_catname(path, ext, size);
}
static void flagsave(const char *ext) {
char path[MAX_PATH];
getstatfilename(path, ext, sizeof(path));
statsave_save(path);
}
static void flagdelete(const char *ext) {
char path[MAX_PATH];
getstatfilename(path, ext, sizeof(path));
file_delete(path);
}
static int flagload(const char *ext) {
int ret;
char path[MAX_PATH];
char buf[1024];
int r;
ret = IDC_OK;
getstatfilename(path, ext, sizeof(path));
r = statsave_check(path, buf, sizeof(buf));
if (r & (~STATFLAG_DISKCHG)) {
ResumeErrorDialogProc();
ret = IDC_CANCEL;
}
else if (r & STATFLAG_DISKCHG) {
ret = ResumeWarningDialogProc(buf);
ret = IDC_CANCEL;
}
if (ret == IDC_OK) {
statsave_load(path);
}
return(ret);
}
#endif
// ----
static UINT framecnt = 0;
static UINT waitcnt = 0;
static UINT framemax = 1;
static void framereset(void) {
framecnt = 0;
if (xmiloscfg.DISPCLK & 3) {
if (sysmng_workclockrenewal()) {
sysmng_updatecaption(2);
}
}
}
static void processwait(UINT waitcnt) {
if (timing_getcount() >= waitcnt) {
timing_setcount(0);
framereset();
}
}
static void exec1frame(void) {
palmkbd_callback();
joymng_callback();
pccore_exec(framecnt == 0);
framecnt++;
}
int x1main(int argc, char *argv[]) {
EventType event;
UINT16 error;
UINT32 wait = 0;
int result;
show_progress();
dosio_init();
file_setcd(target);
palmossub_init();
initload();
TRACEINIT();
scrnmng_initialize();
scrndraw_initialize();
if (scrnmng_create(0) != SUCCESS) {
TRACETERM();
palmossub_term();
dosio_term();
return(2);
}
sysmng_initialize();
joymng_initialize();
palmkbd_initialize();
#if 0
mousemng_initialize();
if (np2oscfg.MOUSE_SW) {
mousemng_enable(MOUSEPROC_SYSTEM);
}
#endif
pccore_initialize();
pccore_reset();
#ifdef SUPPORT_RESUME
if (xmiloscfg.resume) {
flagload(xmilresume);
}
#endif
FormInit();
erase_progress();
scrndraw_redraw();
xmilrunning = TRUE;
while(xmilrunning) {
if (inmenu) {
wait = evtWaitForever;
}
else {
int count;
wait = 0;
for (count = 0;count < MAINLOOPWAIT;count++) {
if (xmiloscfg.NOWAIT) {
exec1frame();
if (xmiloscfg.DRAW_SKIP) { // nowait frame skip
if (framecnt >= xmiloscfg.DRAW_SKIP) {
processwait(0);
}
}
else { // nowait auto skip
if (timing_getcount()) {
processwait(0);
}
}
}
else if (xmiloscfg.DRAW_SKIP) { // frame skip
if (framecnt < xmiloscfg.DRAW_SKIP) {
exec1frame();
}
else {
processwait(xmiloscfg.DRAW_SKIP);
}
}
else { // auto skip
if (!waitcnt) {
UINT cnt;
exec1frame();
cnt = timing_getcount();
if (framecnt > cnt) {
waitcnt = framecnt;
if (framemax > 1) {
framemax--;
}
}
else if (framecnt >= framemax) {
if (framemax < 12) {
framemax++;
}
if (cnt >= 12) {
timing_reset();
}
else {
timing_setcount(cnt - framecnt);
}
framereset();
}
}
else {
processwait(waitcnt);
waitcnt = framecnt;
}
}
}
}
ARM_EvtGetEvent(&event, wait);
result = ApplicationHandleEvent(&event);
if (result == 1) {
continue;
}
if (result == 0) {
if (ARM_SysHandleEvent(&event)) {
continue;
}
}
if (ARM_MenuHandleEvent(NULL, &event, &error)) {
inmenu = TRUE;
soundmng_stop();
} else {
ARM_FrmDispatchEvent(&event);
}
}
xmilrunning = FALSE;
show_progress();
soundmng_stop();
#ifdef SUPPORT_RESUME
if (xmiloscfg.resume) {
flagsave(xmilresume);
}
else {
flagdelete(xmilresume);
}
#endif
mousemng_disable(MOUSEPROC_SYSTEM);
x1f_close();
pccore_deinitialize();
scrnmng_destroy();
soundmng_destroy();
if (sys_updates & (SYS_UPDATECFG | SYS_UPDATEOSCFG)) {
initsave();
}
TRACETERM();
palmossub_term();
dosio_term();
erase_progress();
(void)argc;
(void)argv;
return(0);
}
RetroPC.NET-CVS <cvs@retropc.net>