/*
 *   Emu48.h
 *
 *   This file is part of Emu48
 *
 *   Copyright (C) 2004 Christoph Gießelink
 *
 */
#include "types.h"

#define	ARRAYSIZEOF(a)	(sizeof(a) / sizeof(a[0]))

#define	_KB(a)			((a)*2*1024)

#define HARDWARE		"Yorke"				// emulator hardware
#define MODELS			"6AEGSX"			// valid calculator models

// cards status
#define PORT1_PRESENT	((cCurrentRomType=='S')?P1C:P2C)
#define PORT1_WRITE		((cCurrentRomType=='S')?P1W:P2W)
#define PORT2_PRESENT	((cCurrentRomType=='S')?P2C:P1C)
#define PORT2_WRITE		((cCurrentRomType=='S')?P2W:P1W)

#define BINARYHEADER48  "HPHP48-W"
#define BINARYHEADER49  "HPHP49-W"

// CPU cycles in 16384 Hz time frame
#define T2CYCLES		((cCurrentRomType=='S')?dwSXCycles:dwGXCycles)

#define SM_RUN			0					// states of cpu emulation thread
#define SM_INVALID		1
#define SM_RETURN		2
#define SM_SLEEP		3

#define S_ERR_NO        0					// stack errorcodes
#define S_ERR_BINARY    1
#define S_ERR_ASCII     2

#define NO_SERIAL       "disabled"			// port not open

#define MACRO_OFF		0					// macro recorder off
#define MACRO_NEW		1
#define MACRO_PLAY		2

#define TOPBAR_OFF		0x1					// top bar off
#define MENUBAR_OFF		0x2					// menu bar off

// macro to check for valid calculator model
#define isModelValid(m)	(m != 0 && strchr(MODELS,m) != NULL)

// values for mapping area
enum MMUMAP { M_IO, M_ROM, M_RAM, M_P1, M_P2, M_BS };

// Emu48.c
extern HPALETTE			hPalette;
extern HPALETTE			hOldPalette;
extern HANDLE			hEventShutdn;
extern LPTSTR			szTitle;
extern CRITICAL_SECTION	csGDILock;
extern CRITICAL_SECTION	csKeyLock;
extern CRITICAL_SECTION	csIOLock;
extern CRITICAL_SECTION	csT1Lock;
extern CRITICAL_SECTION	csT2Lock;
extern CRITICAL_SECTION csTxdLock;
extern CRITICAL_SECTION	csRecvLock;
extern CRITICAL_SECTION csSlowLock;
extern INT				nArgc;
extern LPCTSTR			*ppArgv;
extern LARGE_INTEGER	lFreq;
extern LARGE_INTEGER	lAppStart;
extern LONG				lrcTop;
extern HANDLE			hHeap;
extern HINSTANCE		hApp;
extern HWND				hWnd;
extern HDC				hWindowDC;
extern UINT             nAppZoom;
extern BOOL				bAutoSave;
extern BOOL				bAutoSaveOnExit;
extern BOOL				bSaveDefConfirm;
extern BOOL				bAlwaysDisplayLog;
extern BOOL				bLoadObjectWarning;
extern HANDLE			hThread;
extern DWORD			lThreadId;
extern VOID				SetWindowTitle(LPCTSTR szString);

// Settings.c
extern VOID ReadSettings(VOID);
extern VOID WriteSettings(VOID);
extern VOID ReadLastDocument(LPTSTR szFileName, DWORD nSize);
extern VOID WriteLastDocument(LPCTSTR szFilename);

// Display.c
extern UINT   nFullScreen;
extern UINT   nVertical;
extern UINT   nBackgroundX;
extern UINT   nBackgroundY;
extern UINT   nBackgroundW;
extern UINT   nBackgroundH;
extern UINT   nLcdX;
extern UINT   nLcdY;
extern UINT   nLcdZoom;
extern UINT   nLcdDiv;
extern LPBYTE pbyLcd;
extern HDC    hLcdDC;
extern HDC    hMainDC;
extern VOID   UpdateContrast(BYTE byContrast);
extern VOID   SetLcdColor(UINT nId, UINT nRed, UINT nGreen, UINT nBlue);
extern VOID   CreateLcdBitmap(VOID);
extern VOID   DestroyLcdBitmap(VOID);
extern BOOL   CreateMainBitmap(LPCTSTR szFilename);
extern VOID   DestroyMainBitmap(VOID);
extern VOID   UpdateAnnunciators(VOID);
extern VOID   ResizeWindow(VOID);
extern BYTE   GetLineCounter(VOID);
extern VOID   StartDisplay(BYTE byInitial);
extern VOID   StopDisplay(VOID);

// Engine.c
extern BOOL    bInterrupt;
extern UINT    nState;
extern UINT    nNextState;
extern BOOL    bRealSpeed;
extern BOOL    bKeySlow;
extern BOOL    bCommInit;
extern CHIPSET Chipset;
extern TCHAR   szSerialWire[16];
extern TCHAR   szSerialIr[16];
extern DWORD   dwSXCycles;
extern DWORD   dwGXCycles;
extern VOID    CheckSerial(VOID);
extern VOID    AdjKeySpeed(VOID);
extern VOID    SetSpeed(BOOL bAdjust);
extern VOID    UpdateKdnBit(VOID);
extern BOOL    WaitForSleepState(VOID);
extern UINT    SwitchToState(UINT nNewState);
extern UINT    WorkerThread(LPVOID pParam);

// Fetch.c
extern VOID    EvalOpcode(LPBYTE I);

// Files.c
extern TCHAR   szEmuDirectory[MAX_PATH];
extern TCHAR   szDocDirectory[MAX_PATH];
extern TCHAR   szCurrentKml[MAX_PATH];
extern TCHAR   szBackupKml[MAX_PATH];
extern TCHAR   szCurrentFilename[MAX_PATH];
extern TCHAR   szBackupFilename[MAX_PATH];
extern TCHAR   szBufferFilename[MAX_PATH];
extern TCHAR   szPort2Filename[MAX_PATH];
extern LPBYTE  pbyRom;
extern DWORD   dwRomSize;
extern BYTE    cCurrentRomType;
extern UINT    nCurrentClass;
extern BOOL    bRomWriteable;
extern LPBYTE  pbyPort2;
extern BOOL    bPort2Writeable;
extern BOOL    bPort2IsShared;
extern DWORD   dwPort2Size;
extern DWORD   dwPort2Mask;
extern BOOL    bBackup;
extern LPCTSTR FullFilename(LPCTSTR lpszFilename);
extern VOID    UpdatePatches(BOOL bPatch);
extern BOOL    PatchRom(LPCTSTR szFilename);
extern BOOL    MapRom(LPCTSTR szFilename);
extern VOID    UnmapRom(VOID);
extern WORD    CrcPort2(VOID);
extern BOOL    MapPort2(LPCTSTR szFilename);
extern VOID    UnmapPort2(VOID);
extern VOID    ResetDocument(VOID);
extern BOOL    NewDocument(VOID);
extern BOOL    OpenDocument(LPCTSTR szFilename);
extern BOOL    SaveDocument(VOID);
extern BOOL    SaveDocumentAs(LPCTSTR szFilename);
extern BOOL    SaveBackup(VOID);
extern BOOL    RestoreBackup(VOID);
extern BOOL    ResetBackup(VOID);
extern VOID    SaveLastDocumentFolder(LPCTSTR);
extern BOOL    GetOpenFilename(VOID);
extern BOOL    GetSaveAsFilename(VOID);
extern BOOL    GetLoadObjectFilename(VOID);
extern BOOL    GetSaveObjectFilename(VOID);
extern WORD    WriteStack(UINT nStkLevel,LPBYTE lpBuf,DWORD dwSize);
extern BOOL    LoadObject(LPCTSTR szFilename);
extern BOOL    SaveObject(LPCTSTR szFilename);
extern HBITMAP LoadBitmapFile(LPCTSTR szFilename);

// Timer.c
extern VOID  SetHP48Time(VOID);
extern VOID  StartTimers(VOID);
extern VOID  StopTimers(VOID);
extern DWORD ReadT2(VOID);
extern VOID  SetT2(DWORD dwValue);
extern BYTE  ReadT1(VOID);
extern VOID  SetT1(BYTE byValue);

// Mops.c
extern BOOL        bFlashRomArray;
extern LPBYTE      RMap[256];
extern LPBYTE      WMap[256];
extern VOID        Map(BYTE a, BYTE b);
extern VOID        RomSwitch(DWORD adr);
extern VOID        Config(VOID);
extern VOID        Uncnfg(VOID);
extern VOID        Reset(VOID);
extern VOID        C_Eq_Id(VOID);
extern enum MMUMAP MapData(DWORD d);
extern VOID        CpuReset(VOID);
extern VOID        Npeek(BYTE *a, DWORD d, UINT s);
extern VOID        Nread(BYTE *a, DWORD d, UINT s);
extern VOID        Nwrite(BYTE *a, DWORD d, UINT s);
extern BYTE        Read2(DWORD d);
extern DWORD       Read5(DWORD d);
extern VOID        Write5(DWORD d, DWORD n);
extern VOID        Write2(DWORD d, BYTE n);
extern VOID        IOBit(DWORD d, BYTE b, BOOL s);
extern VOID        ReadIO(BYTE *a, DWORD b, DWORD s, BOOL bUpdate);
extern VOID        WriteIO(BYTE *a, DWORD b, DWORD s);

// Lowbat.c
extern VOID StartBatMeasure(VOID);
extern VOID StopBatMeasure(VOID);
extern VOID GetBatteryState(BOOL *pbLBI, BOOL *pbVLBI);

// Keyboard.c
extern VOID ScanKeyboard(BOOL bActive, BOOL bReset);
extern VOID KeyboardEvent(BOOL bPress, UINT out, UINT in);

// Keymacro.c
extern INT     nMacroState;
extern INT     nMacroTimeout;
extern BOOL    bMacroRealSpeed;
extern VOID    KeyMacroRecord(BOOL bPress, UINT out, UINT in);
extern LRESULT OnToolMacroNew(VOID);
extern LRESULT OnToolMacroPlay(VOID);
extern LRESULT OnToolMacroStop(VOID);
extern LRESULT OnToolMacroSettings(VOID);

// Stack.c
extern LRESULT OnStackCopy(VOID);
extern LRESULT OnStackPaste(VOID);

// RPL.c
extern BOOL    RPL_GetSystemFlag(INT nFlag);
extern DWORD   RPL_SkipOb(DWORD d);
extern DWORD   RPL_ObjectSize(BYTE *o);
extern DWORD   RPL_CreateTemp(DWORD l);
extern UINT    RPL_Depth(VOID);
extern DWORD   RPL_Pick(UINT l);
extern VOID    RPL_Replace(DWORD n);
extern VOID    RPL_Push(UINT l,DWORD n);

// External.c
extern VOID External(CHIPSET* w);

// Serial.c
extern BOOL CommOpen(LPTSTR strWirePort,LPTSTR strIrPort);
extern VOID CommClose(VOID);
extern VOID CommSetBaud(VOID);
extern BOOL UpdateUSRQ(VOID);
extern VOID CommTxBRK(VOID);
extern VOID CommTransmit(VOID);
extern VOID CommReceive(VOID);

// Message Boxes
static __inline int InfoMessage(LPCTSTR szMessage)  {return MessageBox(hWnd, szMessage, szTitle, MB_APPLMODAL|MB_OK|MB_ICONINFORMATION|MB_SETFOREGROUND);}
static __inline int AbortMessage(LPCTSTR szMessage) {return MessageBox(hWnd, szMessage, szTitle, MB_APPLMODAL|MB_OK|MB_ICONSTOP|MB_SETFOREGROUND);}
static __inline int YesNoMessage(LPCTSTR szMessage) {return MessageBox(hWnd, szMessage, szTitle, MB_APPLMODAL|MB_YESNO|MB_ICONEXCLAMATION|MB_SETFOREGROUND);}
static __inline int YesNoCancelMessage(LPCTSTR szMessage,UINT uStyle) {return MessageBox(hWnd, szMessage, szTitle, MB_APPLMODAL|MB_YESNOCANCEL|MB_ICONEXCLAMATION|MB_SETFOREGROUND|uStyle);}

// Missing Win32 API calls
static __inline LPTSTR DuplicateString(LPCTSTR szString)
{
	UINT   uLength = lstrlen(szString) + 1;
	LPTSTR szDup   = HeapAlloc(hHeap,0,uLength*sizeof(szDup[0]));
	lstrcpy(szDup,szString);
	return szDup;
}

// Full screen dialog box
static __inline VOID FULLSCREEN(HWND hDlg)
{
	SHINITDLGINFO shidi;

	_ASSERT(hWnd != NULL);
	SHFullScreen(hWnd, SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON | SHFS_SHOWSTARTICON);

	shidi.dwMask = SHIDIM_FLAGS;
	shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIZEDLG;
	shidi.hDlg = hDlg;
	SHInitDialog(&shidi);
	return;
}

// WinCE replacement
static __inline DWORD GetCurrentDirectory(DWORD nBufferLength,LPTSTR lpBuffer)
{
	LPTSTR lpPos;

	// get path and name of current file
	GetModuleFileName(NULL,lpBuffer,nBufferLength);

	// get delimiter position of filename
	if ((lpPos = _tcsrchr(lpBuffer,_T('\\'))) != NULL)
	{
		*lpPos = 0;							// purge filename
	}
	else
	{
		lpBuffer[0] = _T('\\');				// root path
		lpBuffer[1] = 0;
	}
	return lstrlen(lpBuffer);
}

