/*
 *   Emu48.h
 *
 *   This file is part of Emu48
 *
 *   Copyright (C) 1995 Sebastien Carlier
 *
 */

#include "types.h"

// Emu48.c
extern HPALETTE hPalette;
extern LPSTR   szTitle;
extern HANDLE  hApp;
extern HWND    hWnd;
extern HDC     hWindowDC;
extern BOOL    bPort2IsShared;
extern BOOL    bAlwaysDisplayLog;
extern UINT    uTimer1Period;
extern VOID    SetWindowTitle(LPSTR szString);
extern VOID    UpdateWindowStatus();

// Display.c
extern UINT    nBackgroundX;
extern UINT    nBackgroundY;
extern UINT    nBackgroundW;
extern UINT    nBackgroundH;
extern UINT    nLcdX;
extern UINT    nLcdY;
extern BOOL    bLcdDoubled;
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();
extern VOID DestroyLcdBitmap();
extern BOOL CreateMainBitmap(LPSTR szFilename);
extern VOID DestroyMainBitmap();
extern VOID UpdateDisplayPointers();
extern VOID UpdateMainDisplay();
extern VOID UpdateMenuDisplay();
extern VOID WriteToMainDisplay(LPBYTE a, DWORD d, UINT s);
extern VOID WriteToMenuDisplay(LPBYTE a, DWORD d, UINT s);
extern VOID UpdateAnnunciators();
extern VOID ResizeWindow();

// Engine.c
extern BOOL     bInterrupt;
extern UINT     nState;
extern UINT     nNextState;
extern HANDLE   hThread;
extern CHIPSET  Chipset;
extern UINT     SwitchToState(UINT nNewState);
extern UINT     WorkerThread(LPVOID pParam);
extern DWORD    Npack(BYTE *a, UINT s);
extern VOID     Nunpack(BYTE *a, DWORD b, UINT s);

// Files.c
extern char    szEmu48Directory[260];
extern char    szCurrentDirectory[260];
extern char    szCurrentKml[260];
extern char    szBackupKml[260];
extern char    szCurrentFilename[260];
extern char    szBackupFilename[260];
extern char    szBufferFilename[260];
extern char    szPort2Filename[260];
extern LPBYTE  pbyRom;
extern DWORD   dwRomSize;
extern char    cCurrentRomType;
extern LPBYTE  pbyPort2;
extern BOOL    bPort2Writeable;
extern BOOL    bPort2IsShared;
extern DWORD   dwPort2Mask;
extern UINT    nPort2Bank;
extern BOOL    bBackup;
extern BOOL    MapRom(LPCSTR szFilename);
extern VOID    UnmapRom();
extern BOOL    MapPort2(LPCSTR szFilename);
extern VOID    UnmapPort2();
extern BOOL    PatchRom(LPCSTR szFilename);
extern VOID    ResetDocument();
extern BOOL    NewDocument();
extern BOOL    OpenDocument(LPCSTR szFilename);
extern BOOL    SaveDocument();
extern BOOL    SaveDocumentAs(LPCTSTR szFilename);
extern BOOL    SaveBackup();
extern BOOL    RestoreBackup();
extern BOOL    ResetBackup();
extern BOOL    GetOpenFilename();
extern BOOL    GetSaveAsFilename();
extern BOOL    GetLoadObjectFilename();
extern BOOL    GetSaveObjectFilename();
extern BOOL    LoadObject(LPCSTR szFilename);
extern BOOL    SaveObject(LPCSTR szFilename);
extern HBITMAP LoadBitmapFile(LPCSTR szFilename);

// Timer.c
extern BOOL  bAccurateTimer;
extern UINT  uT1Period;
extern VOID  StartTimers();
extern VOID  StopTimers();
extern DWORD ReadT2();
extern VOID  SetT2(DWORD dwValue);
extern BYTE  ReadT1();
extern VOID  SetT1(BYTE byValue);

// MOps.c
extern LPBYTE  RMap[256];
extern LPBYTE  WMap[256];
extern VOID    Map(BYTE a, BYTE b);
extern VOID    Config();
extern VOID    Uncnfg();
extern VOID    Reset();
extern VOID    C_Eq_Id();
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 VOID    Nread2(BYTE *a, DWORD d);
extern VOID    Nwrite2(BYTE *a, DWORD d);
extern VOID    Nread5(BYTE *a, DWORD d);
extern VOID    Nwrite5(BYTE *a, DWORD d);
extern BYTE    Read2(DWORD d);
extern DWORD   Read5(DWORD d);
extern VOID    Write5(DWORD d, DWORD n);
extern VOID    ReadIO(BYTE *a, DWORD b, DWORD s);
extern VOID    WriteIO(BYTE *a, DWORD b, DWORD s);

// Keyboard.c
extern WORD Keyboard_GetIR();
extern VOID ScanKeyboard();
extern VOID KeyboardEvent(BOOL bPress, UINT out, UINT in);

// RPL.c
extern DWORD   RPL_SkipOb(DWORD d);
extern DWORD   RPL_ObjectSize(BYTE *o);
extern DWORD   RPL_CreateTemp(DWORD l);
extern DWORD   RPL_Pick(UINT l);
extern VOID    RPL_Replace(DWORD n);
extern VOID    RPL_Push(DWORD n);

// in External.c
extern VOID External(CHIPSET* w);

// Message Boxes
static __inline int InfoMessage(LPCSTR szMessage)  {return MessageBox(hWnd, szMessage, szTitle, MB_APPLMODAL|MB_OK|MB_ICONINFORMATION|MB_SETFOREGROUND);}
static __inline int AbortMessage(LPCSTR szMessage) {return MessageBox(hWnd, szMessage, szTitle, MB_APPLMODAL|MB_OK|MB_ICONSTOP|MB_SETFOREGROUND);}
static __inline int YesNoMessage(LPCSTR szMessage) {return MessageBox(hWnd, szMessage, szTitle, MB_APPLMODAL|MB_YESNO|MB_ICONEXCLAMATION|MB_SETFOREGROUND);}
static __inline int YesNoCancelMessage(LPCSTR szMessage) {return MessageBox(hWnd, szMessage, szTitle, MB_APPLMODAL|MB_YESNOCANCEL|MB_ICONEXCLAMATION|MB_SETFOREGROUND);}

// Missing Win32 API calls
static __inline LPSTR   DuplicateString(LPCSTR szString)
{
	UINT  uLength = strlen(szString) + 1;
	LPSTR szDup   = LocalAlloc(0,uLength+1);
	CopyMemory(szDup,szString,uLength);
	return szDup;
}
