2008-05-11: Updated to version 1.47
Signed-off-by: Gwenhael Le Moine <gwenhael.le.moine@gmail.com>
This commit is contained in:
parent
87da7ee0dd
commit
8fe52143cf
31 changed files with 389 additions and 241 deletions
BIN
EMU48.EXE
BIN
EMU48.EXE
Binary file not shown.
|
@ -474,4 +474,4 @@ E-Mail:
|
|||
c dot giesselink at gmx dot de
|
||||
|
||||
Homepage:
|
||||
http://privat.swol.de/ChristophGiesselink/index.htm
|
||||
http://hp.giesselink.com/index.htm
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
Known bugs and restrictions of Emu48 V1.45
|
||||
Known bugs and restrictions of Emu48 V1.47
|
||||
------------------------------------------
|
||||
|
||||
- the following I/O bits aren't emulated (incomplete)
|
||||
|
@ -53,4 +53,4 @@ Known bugs and restrictions of Emu48 V1.45
|
|||
- quitting the emulator while programming the flash isn't allowed,
|
||||
because the content of flash state machine isn't saved so far
|
||||
|
||||
08/07/07 (c) by Christoph Gießelink, c dot giesselink at gmx dot de
|
||||
04/21/07 (c) by Christoph Gießelink, c dot giesselink at gmx dot de
|
||||
|
|
|
@ -1,3 +1,108 @@
|
|||
Service Pack 47 for Emu48 Version 1.0
|
||||
|
||||
DDESERV.C
|
||||
- bugfix in function DdeCallback(), readded delay after ON key state
|
||||
change, bug introduced in SP37
|
||||
|
||||
DEBUGGER.C
|
||||
- changed function OnLButtonUp(), NewValue(), EnterAddr() and
|
||||
EnterBreakpoint(), replaced WM_GETTEXT message call with function
|
||||
GetWindowText()
|
||||
|
||||
DISASM.C
|
||||
- bugfix in function disassemble(), the NOP5 opcode returned wrong
|
||||
address for next instruction (GOTO opcode skipping one nibble)
|
||||
|
||||
EMU48.C
|
||||
- changed function SettingsProc(), adjusted to new prototype of
|
||||
function GetLoadObjectFilename(), use (*.BIN) as default file
|
||||
filter now
|
||||
- changed function OnPaint(), removed mixture of BitBlt() calls with
|
||||
argument hPaintDC and hWindowDC inside critical section
|
||||
- changed function OnFileClose(), removed call of DisableDebugger()
|
||||
because it's now done in function ResetDocument()
|
||||
- bugfix in function OnDropFiles() and OnObjectLoad(), readded delay
|
||||
after ON key state change, bug introduced in SP37
|
||||
- changed function OnObjectLoad() and OnObjectSave(), adjusted to
|
||||
new prototype of function GetLoadObjectFilename() and
|
||||
GetSaveObjectFilename(), use (*.HP;*.LIB) as default file filter
|
||||
now
|
||||
|
||||
EMU48.H
|
||||
- added file filter definitions
|
||||
- extern declaration of global variable and function
|
||||
- changed function prototypes
|
||||
|
||||
EMU48.RC
|
||||
- changed name order in copyright messages
|
||||
- changed version and copyright
|
||||
|
||||
EXTERNAL.C
|
||||
- removed inline function Return(), replaced by a rstkpop() call
|
||||
- added function Beeper() for beeping without taking care about
|
||||
the different beeping methods
|
||||
- added function RCKBp() simulating the ROM Check Beep
|
||||
|
||||
FILES.C
|
||||
- changed function ResetDocument(), added call of DisableDebugger()
|
||||
- changed function GetOpenFilename() and GetSaveAsFilename(),
|
||||
removed some NULL characters at end of file filter definition
|
||||
string
|
||||
- changed function GetLoadObjectFilename() and
|
||||
GetSaveObjectFilename(), changed function prototype, added
|
||||
arguments for the file filter and the default extention
|
||||
|
||||
I28F160.C
|
||||
- adjusted implementation to the new bit array of the block lock
|
||||
table
|
||||
|
||||
I28F160.H
|
||||
- changed structure WSMset_t, replaced byte array byLockCnfg[32]
|
||||
with the bit array dwLockCnfg variable
|
||||
|
||||
KEYMACRO.C
|
||||
- changed function OnToolMacroNew() and OnToolMacroPlay(), removed
|
||||
some NULL characters at end of file filter definition string
|
||||
|
||||
KML.C
|
||||
- changed function GetStringOf(), changed for better reading
|
||||
- changed function SkipWhite(), optimized and better readable
|
||||
implementation
|
||||
- bugfix in function ParseToken(), optimized string delimeter
|
||||
searching among other optimizations and removed increment of line
|
||||
counter on LF character to correct the line numbering on UNIX
|
||||
files with LF instead of CR LF at line end -> line counter
|
||||
increment is done in function SkipWhite() on decoding next keyword
|
||||
in function Lex()
|
||||
- changed function ParseLine(), replaced main loop "goto" construct
|
||||
|
||||
LOWBAT.C
|
||||
- bugfix in function StartBatMeasure(), creating the battery
|
||||
watching thread wasn't Win9x compatible
|
||||
- changed function GetBatteryState(), added possibility to disable
|
||||
low battery detection
|
||||
|
||||
SETTINGS.C
|
||||
- changed function ReadSettings() and WriteSettings(), added item
|
||||
"Disable" in section [LowBat] in the INI-File
|
||||
|
||||
STACK.C
|
||||
- bugfix in function OnStackPaste(), readded delay after ON key
|
||||
state change, bug introduced in SP37
|
||||
|
||||
|
||||
Service Pack 46 for Emu48 Version 1.0
|
||||
|
||||
EMU48.C
|
||||
- bugfix in function SaveChanges(), returned wrong ID when function
|
||||
GetSaveAsFilename() returned FALSE, bug introduced in SP45
|
||||
- bugfix in function WinMain(), in some cases only file short names
|
||||
had been written as last document
|
||||
|
||||
EMU48.RC
|
||||
- changed version
|
||||
|
||||
|
||||
Service Pack 45 for Emu48 Version 1.0
|
||||
|
||||
EMU48.C
|
||||
|
@ -87,9 +192,9 @@ EMU48.C
|
|||
handler
|
||||
- bugfix in function WinMain(), moved additional DDE stuff just
|
||||
behind DDE server initialization, added StartupBackup handling,
|
||||
adjusted length for cutted filenames preventing negative values
|
||||
and call ShowWindow() before asking for a new document preventing
|
||||
a KML script dialog without a parent window
|
||||
adjusted length for cut filenames preventing negative values and
|
||||
call ShowWindow() before asking for a new document preventing a
|
||||
KML script dialog without a parent window
|
||||
|
||||
EMU48.H
|
||||
- removed declaration of bClassicCursor
|
||||
|
@ -106,7 +211,7 @@ FILES.C
|
|||
- added global variables holding the patched ROM checksum and the
|
||||
port2 CRC
|
||||
- changed function GetCutPathName(), better support for UNC names
|
||||
- changed function SetWindowPathTitle(), adjusted length for cutted
|
||||
- changed function SetWindowPathTitle(), adjusted length for cut
|
||||
filename
|
||||
- changed function CrcRom(), change function prototype, added
|
||||
unpacked data check and made function public
|
||||
|
@ -489,7 +594,7 @@ EMU48.RC
|
|||
|
||||
ENGINE.C
|
||||
- bugfix in function WorkerThread(), when changing into SM_RUN state
|
||||
display constrast must also be restored
|
||||
display contrast must also be restored
|
||||
|
||||
FILES.C
|
||||
- changed function CrcPort2(), made it global accessible
|
||||
|
@ -520,7 +625,7 @@ RPL.C
|
|||
|
||||
SETTINGS.C
|
||||
- changed function ReadSettings() and WriteSettings(), added item
|
||||
"SaveDefaultConfirm" in section [File] in the INI-File
|
||||
"SaveDefaultConfirm" in section [Files] in the INI-File
|
||||
|
||||
STACK.C
|
||||
- added helper functions RPL_GetZInt() and RPL_SetZInt() to handle
|
||||
|
|
|
@ -92,6 +92,7 @@ HDDEDATA CALLBACK DdeCallback(UINT iType,UINT iFmt,HCONV hConv,
|
|||
}
|
||||
|
||||
KeyboardEvent(TRUE,0,0x8000);
|
||||
Sleep(200);
|
||||
KeyboardEvent(FALSE,0,0x8000);
|
||||
// wait for sleep mode
|
||||
while (Chipset.Shutdn == FALSE) Sleep(0);
|
||||
|
|
|
@ -1183,7 +1183,7 @@ static BOOL OnLButtonUp(HWND hDlg, LPARAM lParam)
|
|||
hWnd = ChildWindowFromPointEx(hDlg,pt,CWP_SKIPDISABLED);
|
||||
nId = GetDlgCtrlID(hWnd); // control ID of window
|
||||
|
||||
SendMessage(hWnd,WM_GETTEXT,ARRAYSIZEOF(szBuffer),(LPARAM)szBuffer);
|
||||
GetWindowText(hWnd,szBuffer,ARRAYSIZEOF(szBuffer));
|
||||
switch (nId)
|
||||
{
|
||||
case IDC_REG_A: // A
|
||||
|
@ -2281,7 +2281,7 @@ static INT_PTR CALLBACK NewValue(HWND hDlg, UINT message, WPARAM wParam, LPARAM
|
|||
{
|
||||
case IDOK:
|
||||
hWnd = GetDlgItem(hDlg,IDC_NEWVALUE);
|
||||
SendMessage(hWnd,WM_GETTEXT,(WPARAM)nBufferlen,(LPARAM)szBuffer);
|
||||
GetWindowText(hWnd,szBuffer,nBufferlen);
|
||||
// test if valid hex address
|
||||
for (i = 0; i < (LONG) lstrlen(szBuffer); ++i)
|
||||
{
|
||||
|
@ -2346,7 +2346,7 @@ static INT_PTR CALLBACK EnterAddr(HWND hDlg, UINT message, WPARAM wParam, LPARAM
|
|||
{
|
||||
case IDOK:
|
||||
hWnd = GetDlgItem(hDlg,IDC_ENTERADR);
|
||||
SendMessage(hWnd,WM_GETTEXT,8,(LPARAM)szBuffer);
|
||||
GetWindowText(hWnd,szBuffer,ARRAYSIZEOF(szBuffer));
|
||||
// test if valid hex address
|
||||
for (i = 0; i < (LONG) lstrlen(szBuffer); ++i)
|
||||
{
|
||||
|
@ -2411,7 +2411,7 @@ static INT_PTR CALLBACK EnterBreakpoint(HWND hDlg, UINT message, WPARAM wParam,
|
|||
case IDC_BPWRITE: sBp->nType = BP_WRITE; return TRUE;
|
||||
case IDOK:
|
||||
hWnd = GetDlgItem(hDlg,IDC_ENTERADR);
|
||||
SendMessage(hWnd,WM_GETTEXT,8,(LPARAM)szBuffer);
|
||||
GetWindowText(hWnd,szBuffer,ARRAYSIZEOF(szBuffer));
|
||||
// test if valid hex address
|
||||
for (i = 0; i < (LONG) lstrlen(szBuffer); ++i)
|
||||
{
|
||||
|
|
|
@ -1508,17 +1508,18 @@ DWORD disassemble (DWORD addr, LPTSTR out, BOOL view)
|
|||
|
||||
case 6:
|
||||
pc = addr;
|
||||
disp = read_int (&addr, 3);
|
||||
disp = read_int (&addr, 3); // read GOTO distance
|
||||
switch (disassembler_mode)
|
||||
{
|
||||
case HP_MNEMONICS:
|
||||
if (disp == 3)
|
||||
if (disp == 3) // special case "GOTO next instruction"
|
||||
{
|
||||
p = append_str (out, _T("NOP4"));
|
||||
break;
|
||||
}
|
||||
if (disp == 4)
|
||||
if (disp == 4) // special case "GOTO to +4 nibbles"
|
||||
{
|
||||
addr++; // skipping the fifth nibble in the opcode
|
||||
p = append_str (out, _T("NOP5"));
|
||||
break;
|
||||
}
|
||||
|
@ -1536,6 +1537,7 @@ DWORD disassemble (DWORD addr, LPTSTR out, BOOL view)
|
|||
}
|
||||
if (disp == 4)
|
||||
{
|
||||
addr++; // skipping the fifth nibble in the opcode
|
||||
p = append_str (out, _T("nop5"));
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
#include "kml.h"
|
||||
#include "debugger.h"
|
||||
|
||||
#define VERSION "1.45"
|
||||
#define VERSION "1.47"
|
||||
|
||||
// #define MONOCHROME // CF_BITMAP clipboard format
|
||||
|
||||
|
@ -420,7 +420,7 @@ static INT_PTR CALLBACK SettingsProc(HWND hDlg, UINT message, WPARAM wParam, LPA
|
|||
EnableWindow(GetDlgItem(hDlg,IDC_SOUND_SLIDER),TRUE);
|
||||
return TRUE;
|
||||
case IDC_PORT2LOAD:
|
||||
if (GetLoadObjectFilename())
|
||||
if (GetLoadObjectFilename(_T(BIN_FILTER),_T("BIN")))
|
||||
{
|
||||
TCHAR szFilename[MAX_PATH];
|
||||
LPTSTR lpFilePart;
|
||||
|
@ -623,10 +623,11 @@ static UINT SaveChanges(BOOL bAuto)
|
|||
{
|
||||
if (SaveDocumentAs(szBufferFilename))
|
||||
return IDYES;
|
||||
// error on saving file
|
||||
}
|
||||
else
|
||||
return IDCANCEL;
|
||||
}
|
||||
return IDNO;
|
||||
}
|
||||
|
||||
SaveDocument();
|
||||
return IDYES;
|
||||
|
@ -731,12 +732,15 @@ static LRESULT OnPaint(HWND hWindow)
|
|||
BitBlt(hPaintDC, Paint.rcPaint.left, Paint.rcPaint.top,
|
||||
Paint.rcPaint.right-Paint.rcPaint.left, Paint.rcPaint.bottom-Paint.rcPaint.top,
|
||||
hMainDC, rcMainPaint.left, rcMainPaint.top, SRCCOPY);
|
||||
|
||||
SetWindowOrgEx(hPaintDC, nBackgroundX, nBackgroundY, NULL);
|
||||
|
||||
// redraw main display area
|
||||
BitBlt(hWindowDC, nLcdX, nLcdY,
|
||||
BitBlt(hPaintDC, nLcdX, nLcdY,
|
||||
131*nLcdZoom, nLines*nLcdZoom,
|
||||
hLcdDC, Chipset.boffset*nLcdZoom, 0, SRCCOPY);
|
||||
// redraw menu display area
|
||||
BitBlt(hWindowDC, nLcdX, nLcdY+nLines*nLcdZoom,
|
||||
BitBlt(hPaintDC, nLcdX, nLcdY+nLines*nLcdZoom,
|
||||
131*nLcdZoom, (64-nLines)*nLcdZoom,
|
||||
hLcdDC, 0, nLines*nLcdZoom, SRCCOPY);
|
||||
GdiFlush();
|
||||
|
@ -801,6 +805,7 @@ static LRESULT OnDropFiles(HANDLE hFilesInfo)
|
|||
goto cancel;
|
||||
|
||||
KeyboardEvent(TRUE,0,0x8000);
|
||||
Sleep(200);
|
||||
KeyboardEvent(FALSE,0,0x8000);
|
||||
// wait for sleep mode
|
||||
while (Chipset.Shutdn == FALSE) Sleep(0);
|
||||
|
@ -917,7 +922,6 @@ static LRESULT OnFileClose(VOID)
|
|||
SwitchToState(SM_INVALID);
|
||||
if (SaveChanges(bAutoSave) != IDCANCEL)
|
||||
{
|
||||
DisableDebugger();
|
||||
ResetDocument();
|
||||
SetWindowTitle(NULL);
|
||||
}
|
||||
|
@ -1198,7 +1202,7 @@ static LRESULT OnObjectLoad(VOID)
|
|||
}
|
||||
}
|
||||
|
||||
if (!GetLoadObjectFilename())
|
||||
if (!GetLoadObjectFilename(_T(HP_FILTER),_T("HP")))
|
||||
{
|
||||
SwitchToState(SM_RUN);
|
||||
goto cancel;
|
||||
|
@ -1214,6 +1218,7 @@ static LRESULT OnObjectLoad(VOID)
|
|||
while (nState!=nNextState) Sleep(0);
|
||||
_ASSERT(nState == SM_RUN);
|
||||
KeyboardEvent(TRUE,0,0x8000);
|
||||
Sleep(200);
|
||||
KeyboardEvent(FALSE,0,0x8000);
|
||||
while (Chipset.Shutdn == FALSE) Sleep(0);
|
||||
|
||||
|
@ -1242,7 +1247,7 @@ static LRESULT OnObjectSave(VOID)
|
|||
|
||||
_ASSERT(nState == SM_SLEEP);
|
||||
|
||||
if (GetSaveObjectFilename())
|
||||
if (GetSaveObjectFilename(_T(HP_FILTER),_T("HP")))
|
||||
{
|
||||
SaveObject(szBufferFilename);
|
||||
}
|
||||
|
@ -1532,6 +1537,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nC
|
|||
HACCEL hAccel;
|
||||
HSZ hszService, hszTopic; // variables for DDE server
|
||||
DWORD_PTR dwAffMask;
|
||||
LPTSTR lpFilePart;
|
||||
|
||||
hApp = hInst;
|
||||
#if defined _UNICODE
|
||||
|
@ -1668,7 +1674,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nC
|
|||
SetWindowTitle(szTemp);
|
||||
if (OpenDocument(szBufferFilename))
|
||||
{
|
||||
MruAdd(szBufferFilename);
|
||||
MruAdd(szCurrentFilename);
|
||||
ShowWindow(hWnd,nCmdShow);
|
||||
goto start;
|
||||
}
|
||||
|
@ -1702,7 +1708,10 @@ start:
|
|||
DdeFreeStringHandle(idDdeInst, hszTopic);
|
||||
DdeUninitialize(idDdeInst);
|
||||
|
||||
WriteLastDocument(szCurrentFilename); // save last document setting
|
||||
// get full path name of szCurrentFilename
|
||||
GetFullPathName(szCurrentFilename,ARRAYSIZEOF(szBufferFilename),szBufferFilename,&lpFilePart);
|
||||
|
||||
WriteLastDocument(szBufferFilename); // save last document setting
|
||||
WriteSettings(); // save emulation settings
|
||||
|
||||
CloseHandle(hThread); // close thread handle
|
||||
|
|
|
@ -22,6 +22,9 @@
|
|||
#define BINARYHEADER48 "HPHP48-W"
|
||||
#define BINARYHEADER49 "HPHP49-W"
|
||||
|
||||
#define BIN_FILTER "Port Data File (*.BIN)\0*.BIN\0All Files (*.*)\0*.*\0"
|
||||
#define HP_FILTER "HP Binary Object (*.HP;*.LIB)\0*.HP;*.LIB\0All Files (*.*)\0*.*\0"
|
||||
|
||||
#define CF_HPOBJ "CF_HPOBJ" // clipboard format for DDE
|
||||
|
||||
// CPU cycles in 16384 Hz time frame
|
||||
|
@ -249,8 +252,8 @@ extern BOOL RestoreBackup(VOID);
|
|||
extern BOOL ResetBackup(VOID);
|
||||
extern BOOL GetOpenFilename(VOID);
|
||||
extern BOOL GetSaveAsFilename(VOID);
|
||||
extern BOOL GetLoadObjectFilename(VOID);
|
||||
extern BOOL GetSaveObjectFilename(VOID);
|
||||
extern BOOL GetLoadObjectFilename(LPCTSTR lpstrFilter,LPCTSTR lpstrDefExt);
|
||||
extern BOOL GetSaveObjectFilename(LPCTSTR lpstrFilter,LPCTSTR lpstrDefExt);
|
||||
extern WORD WriteStack(UINT nStkLevel,LPBYTE lpBuf,DWORD dwSize);
|
||||
extern BOOL LoadObject(LPCTSTR szFilename);
|
||||
extern BOOL SaveObject(LPCTSTR szFilename);
|
||||
|
@ -290,6 +293,7 @@ extern VOID ReadIO(BYTE *a, DWORD b, DWORD s, BOOL bUpdate);
|
|||
extern VOID WriteIO(BYTE *a, DWORD b, DWORD s);
|
||||
|
||||
// Lowbat.c
|
||||
extern BOOL bLowBatDisable;
|
||||
extern VOID StartBatMeasure(VOID);
|
||||
extern VOID StopBatMeasure(VOID);
|
||||
extern VOID GetBatteryState(BOOL *pbLBI, BOOL *pbVLBI);
|
||||
|
@ -326,6 +330,7 @@ extern VOID RPL_Push(UINT l,DWORD n);
|
|||
extern BOOL bWaveBeep;
|
||||
extern DWORD dwWaveVol;
|
||||
extern VOID External(CHIPSET* w);
|
||||
extern VOID RCKBp(CHIPSET* w);
|
||||
|
||||
// DDEserv.c
|
||||
extern HDDEDATA CALLBACK DdeCallback(UINT, UINT, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD);
|
||||
|
|
|
@ -225,7 +225,7 @@ FONT 8, "MS Sans Serif"
|
|||
BEGIN
|
||||
ICON IDI_EMU48,IDC_STATIC,7,6,20,20,SS_REALSIZEIMAGE
|
||||
LTEXT "",IDC_VERSION,29,6,151,8,NOT WS_GROUP
|
||||
LTEXT "Copyright © 2007 Sébastien Carlier && Christoph Gießelink",
|
||||
LTEXT "Copyright © 2008 Christoph Gießelink && Sébastien Carlier",
|
||||
IDC_STATIC,29,18,181,8
|
||||
DEFPUSHBUTTON "OK",IDOK,215,12,39,14
|
||||
EDITTEXT IDC_LICENSE,7,33,247,112,ES_MULTILINE | ES_AUTOHSCROLL |
|
||||
|
@ -553,8 +553,8 @@ END
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,4,5,0
|
||||
PRODUCTVERSION 1,4,5,0
|
||||
FILEVERSION 1,4,7,0
|
||||
PRODUCTVERSION 1,4,7,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -569,14 +569,14 @@ BEGIN
|
|||
BEGIN
|
||||
BLOCK "04090000"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Sebastien Carlier & Christoph Gießelink\0"
|
||||
VALUE "CompanyName", "Christoph Gießelink & Sebastien Carlier\0"
|
||||
VALUE "FileDescription", "HP38/39/40/48/49 Emulator\0"
|
||||
VALUE "FileVersion", "1, 4, 5, 0\0"
|
||||
VALUE "FileVersion", "1, 4, 7, 0\0"
|
||||
VALUE "InternalName", "Emu48\0"
|
||||
VALUE "LegalCopyright", "Copyright © 2007\0"
|
||||
VALUE "LegalCopyright", "Copyright © 2008\0"
|
||||
VALUE "OriginalFilename", "Emu48.exe\0"
|
||||
VALUE "ProductName", "Emu48\0"
|
||||
VALUE "ProductVersion", "1, 4, 5, 0\0"
|
||||
VALUE "ProductVersion", "1, 4, 7, 0\0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
|
|
@ -129,28 +129,8 @@ static __inline VOID BeepWin9x(DWORD dwFrequency,DWORD dwDuration)
|
|||
#endif
|
||||
}
|
||||
|
||||
static __inline VOID Return(CHIPSET* w)
|
||||
static VOID Beeper(DWORD freq,DWORD dur)
|
||||
{
|
||||
w->rstkp=(w->rstkp-1)&7;
|
||||
w->pc = w->rstk[w->rstkp];
|
||||
w->rstk[w->rstkp] = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
VOID External(CHIPSET* w) // Beep patch
|
||||
{
|
||||
BYTE fbeep;
|
||||
DWORD freq,dur;
|
||||
|
||||
freq = Npack(w->D,5); // frequency in Hz
|
||||
dur = Npack(w->C,5); // duration in ms
|
||||
Nread(&fbeep,SFLAG53_56,1); // fetch system flags -53 to -56
|
||||
|
||||
w->carry = TRUE; // setting of no beep
|
||||
if (!(fbeep & 0x8) && freq) // bit -56 clear and frequency > 0 Hz
|
||||
{
|
||||
if (freq > 4400) freq = 4400; // high limit of HP (SX)
|
||||
|
||||
if (bWaveBeep)
|
||||
{
|
||||
BeepWave(freq,dur); // wave output over sound card
|
||||
|
@ -173,6 +153,24 @@ VOID External(CHIPSET* w) // Beep patch
|
|||
Beep(freq,dur); // NT: ok, Windows 95: default sound or standard system beep
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
VOID External(CHIPSET* w) // Beep patch
|
||||
{
|
||||
BYTE fbeep;
|
||||
DWORD freq,dur;
|
||||
|
||||
freq = Npack(w->D,5); // frequency in Hz
|
||||
dur = Npack(w->C,5); // duration in ms
|
||||
Nread(&fbeep,SFLAG53_56,1); // fetch system flags -53 to -56
|
||||
|
||||
w->carry = TRUE; // setting of no beep
|
||||
if (!(fbeep & 0x8) && freq) // bit -56 clear and frequency > 0 Hz
|
||||
{
|
||||
if (freq > 4400) freq = 4400; // high limit of HP (SX)
|
||||
|
||||
Beeper(freq,dur); // beeping
|
||||
|
||||
// estimate cpu cycles for beeping time (2MHz / 4MHz)
|
||||
w->cycles += dur * ((cCurrentRomType=='S') ? 2000 : 4000);
|
||||
|
@ -182,6 +180,47 @@ VOID External(CHIPSET* w) // Beep patch
|
|||
w->intk = TRUE; // INTON
|
||||
w->carry = FALSE; // RTNCC
|
||||
}
|
||||
Return(w);
|
||||
w->pc = rstkpop();
|
||||
return;
|
||||
}
|
||||
|
||||
VOID RCKBp(CHIPSET* w) // ROM Check Beep patch
|
||||
{
|
||||
DWORD dw2F,dwCpuFreq;
|
||||
DWORD freq,dur;
|
||||
BYTE f,d;
|
||||
|
||||
f = w->C[1]; // f = freq ctl
|
||||
d = w->C[0]; // d = duration ctl
|
||||
|
||||
if (cCurrentRomType == 'S') // Clarke chip with 48S ROM
|
||||
{
|
||||
// CPU strobe frequency @ RATE 14 = 1.97MHz
|
||||
dwCpuFreq = ((14 + 1) * 524288) >> 2;
|
||||
|
||||
dw2F = f * 126 + 262; // F=f*63+131
|
||||
}
|
||||
else // York chip with 48G and later ROM
|
||||
{
|
||||
// CPU strobe frequency @ RATE 27 = 3.67MHz
|
||||
// CPU strobe frequency @ RATE 29 = 3.93MHz
|
||||
dwCpuFreq = ((27 + 1) * 524288) >> 2;
|
||||
|
||||
dw2F = f * 180 + 367; // F=f*90+183.5
|
||||
}
|
||||
|
||||
freq = dwCpuFreq / dw2F;
|
||||
dur = (dw2F * (256 - 16 * d)) * 1000 / 2 / dwCpuFreq;
|
||||
|
||||
if (freq > 4400) freq = 4400; // high limit of HP
|
||||
|
||||
Beeper(freq,dur); // beeping
|
||||
|
||||
// estimate cpu cycles for beeping time (2MHz / 4MHz)
|
||||
w->cycles += dur * ((cCurrentRomType=='S') ? 2000 : 4000);
|
||||
|
||||
w->P = 0; // P=0
|
||||
w->carry = FALSE; // RTNCC
|
||||
w->pc = rstkpop();
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -646,6 +646,7 @@ static BOOL IsDataPacked(VOID *pMem, DWORD dwSize)
|
|||
|
||||
VOID ResetDocument(VOID)
|
||||
{
|
||||
DisableDebugger();
|
||||
if (szCurrentKml[0])
|
||||
{
|
||||
KillKML();
|
||||
|
@ -1233,8 +1234,7 @@ BOOL GetOpenFilename(VOID)
|
|||
_T("Emu39 Document (*.E39)\0*.E39\0")
|
||||
_T("Emu48 Document (*.E48)\0*.E48\0")
|
||||
_T("Emu49 Document (*.E49)\0*.E49\0")
|
||||
_T("Win48 Document (*.W48)\0*.W48\0")
|
||||
_T("\0\0");
|
||||
_T("Win48 Document (*.W48)\0*.W48\0");
|
||||
ofn.lpstrDefExt = _T("E48"); // HP48SX/GX
|
||||
ofn.nFilterIndex = 3;
|
||||
if (cCurrentRomType=='6' || cCurrentRomType=='A') // HP38G
|
||||
|
@ -1272,8 +1272,7 @@ BOOL GetSaveAsFilename(VOID)
|
|||
_T("Emu38 Document (*.E38)\0*.E38\0")
|
||||
_T("Emu39 Document (*.E39)\0*.E39\0")
|
||||
_T("Emu48 Document (*.E48)\0*.E48\0")
|
||||
_T("Emu49 Document (*.E49)\0*.E49\0")
|
||||
_T("\0\0");
|
||||
_T("Emu49 Document (*.E49)\0*.E49\0");
|
||||
ofn.lpstrDefExt = _T("E48"); // HP48SX/GX
|
||||
ofn.nFilterIndex = 3;
|
||||
if (cCurrentRomType=='6' || cCurrentRomType=='A') // HP38G
|
||||
|
@ -1301,13 +1300,14 @@ BOOL GetSaveAsFilename(VOID)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL GetLoadObjectFilename(VOID)
|
||||
BOOL GetLoadObjectFilename(LPCTSTR lpstrFilter,LPCTSTR lpstrDefExt)
|
||||
{
|
||||
TCHAR szBuffer[ARRAYSIZEOF(szBufferFilename)];
|
||||
OPENFILENAME ofn;
|
||||
|
||||
InitializeOFN(&ofn);
|
||||
ofn.lpstrFilter = _T("All Files (*.*)\0*.*\0") _T("\0\0");
|
||||
ofn.lpstrFilter = lpstrFilter;
|
||||
ofn.lpstrDefExt = lpstrDefExt;
|
||||
ofn.nFilterIndex = 1;
|
||||
ofn.lpstrFile = szBuffer;
|
||||
ofn.lpstrFile[0] = 0;
|
||||
|
@ -1319,13 +1319,14 @@ BOOL GetLoadObjectFilename(VOID)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL GetSaveObjectFilename(VOID)
|
||||
BOOL GetSaveObjectFilename(LPCTSTR lpstrFilter,LPCTSTR lpstrDefExt)
|
||||
{
|
||||
TCHAR szBuffer[ARRAYSIZEOF(szBufferFilename)];
|
||||
OPENFILENAME ofn;
|
||||
|
||||
InitializeOFN(&ofn);
|
||||
ofn.lpstrFilter = _T("All Files (*.*)\0*.*\0") _T("\0\0");
|
||||
ofn.lpstrFilter = lpstrFilter;
|
||||
ofn.lpstrDefExt = lpstrDefExt;
|
||||
ofn.nFilterIndex = 1;
|
||||
ofn.lpstrFile = szBuffer;
|
||||
ofn.lpstrFile[0] = 0;
|
||||
|
|
|
@ -420,8 +420,8 @@ static VOID WrState20C(BYTE a, DWORD d)
|
|||
{
|
||||
if (CONFIRM == a) // block erase confirm?
|
||||
{
|
||||
_ASSERT((d>>16) < ARRAYSIZEOF(WSMset.byLockCnfg));
|
||||
if (WSMset.byLockCnfg[d>>16] & 1) // lock bit of block is set
|
||||
// lock bit of block is set
|
||||
if ((WSMset.dwLockCnfg & (1<<(d>>16))) != 0)
|
||||
{
|
||||
WSMset.byStatusReg |= ECLBS; // error in block erasure
|
||||
WSMset.byStatusReg |= DPS; // lock bit detected
|
||||
|
@ -474,12 +474,12 @@ static VOID WrState30C(BYTE a, DWORD d)
|
|||
for (i = 0; i <= wNoOfBlocks; ++i) // check all blocks
|
||||
{
|
||||
_ASSERT((i+1)*dwBlockSize <= dwRomSize);
|
||||
_ASSERT(i < ARRAYSIZEOF(WSMset.byLockCnfg));
|
||||
|
||||
// lock bit of block is set & WP# = low, locked blocks cannot be erased
|
||||
if ((WSMset.byLockCnfg[i] & 1) == 0 || bWP != FALSE)
|
||||
if ((WSMset.dwLockCnfg & (1<<i)) == 0 || bWP != FALSE)
|
||||
{
|
||||
WSMset.byLockCnfg[i] = 0; // clear block lock bit
|
||||
// clear block lock bit
|
||||
WSMset.dwLockCnfg &= ~(1<<i);
|
||||
|
||||
// write 128K nibble
|
||||
FillMemory(pbyBlock,dwBlockSize,0x0F);
|
||||
|
@ -535,9 +535,8 @@ static VOID WrState60D(BYTE a, DWORD d)
|
|||
switch(a)
|
||||
{
|
||||
case 0x01: // set block lock bit
|
||||
_ASSERT((d>>16) < ARRAYSIZEOF(WSMset.byLockCnfg));
|
||||
if (bWP) // WP# = high, can change block lock status
|
||||
WSMset.byLockCnfg[d>>16] = 1; // set block lock bit
|
||||
WSMset.dwLockCnfg |= (1<<(d>>16)); // set block lock bit
|
||||
else
|
||||
WSMset.byStatusReg |= (BWSLBS | DPS); // device protect detect, WP# = low
|
||||
break;
|
||||
|
@ -548,8 +547,7 @@ static VOID WrState60D(BYTE a, DWORD d)
|
|||
|
||||
for (i = 0; i <= wNoOfBlocks; ++i) // clear all lock bits
|
||||
{
|
||||
_ASSERT(i < ARRAYSIZEOF(WSMset.byLockCnfg));
|
||||
WSMset.byLockCnfg[i] = 0; // clear block lock bit
|
||||
WSMset.dwLockCnfg &= ~(1 << i); // clear block lock bit
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -591,12 +589,11 @@ static BYTE RdStateId(DWORD d)
|
|||
}
|
||||
else // block lock table
|
||||
{
|
||||
UINT uIndex = d >> 15; // index into lock table
|
||||
_ASSERT(uIndex < ARRAYSIZEOF(WSMset.byLockCnfg));
|
||||
byData = WSMset.byLockCnfg[uIndex]; // get data from block lock table
|
||||
// get data from block lock table
|
||||
byData = (BYTE) ((WSMset.dwLockCnfg >> (d >> 15)) & 1);
|
||||
|
||||
d &= 0x1F; // data repetition
|
||||
if (d >= 4) byData |= 0x02; // set bit 1 on wrong ID adresses
|
||||
if (d >= 4) byData |= 0x02; // set bit 1 on wrong ID adress
|
||||
}
|
||||
return byData;
|
||||
}
|
||||
|
@ -616,9 +613,8 @@ static BYTE RdStateQuery(DWORD d)
|
|||
}
|
||||
else // block lock table
|
||||
{
|
||||
UINT uIndex = d >> 15; // index into lock table
|
||||
_ASSERT(uIndex < ARRAYSIZEOF(WSMset.byLockCnfg));
|
||||
byData = WSMset.byLockCnfg[uIndex]; // get data from block lock table
|
||||
// get data from block lock table
|
||||
byData = (BYTE) ((WSMset.dwLockCnfg >> (d >> 15)) & 1);
|
||||
}
|
||||
return byData;
|
||||
}
|
||||
|
@ -644,13 +640,16 @@ static BYTE RdStateXSR(DWORD d)
|
|||
|
||||
VOID FlashInit(VOID)
|
||||
{
|
||||
// check if locking bit table has more or equal than 32 bit
|
||||
_ASSERT(sizeof(WSMset.dwLockCnfg) * 8 >= 32);
|
||||
|
||||
ZeroMemory(&WSMset,sizeof(WSMset));
|
||||
strcpy(WSMset.byType,"WSM"); // Write State Machine header
|
||||
WSMset.uSize = sizeof(WSMset); // size of this structure
|
||||
WSMset.byVersion = WSMVER; // version of flash implementation structure
|
||||
|
||||
// factory setting of locking bits
|
||||
WSMset.byLockCnfg[0] = 0x01; // first 64KB block is locked
|
||||
WSMset.dwLockCnfg = (1 << 0); // first 64KB block is locked
|
||||
|
||||
WSMset.uWrState = WRS_DATA;
|
||||
WSMset.uRdState = RDS_DATA;
|
||||
|
|
|
@ -17,7 +17,7 @@ typedef struct
|
|||
BYTE byVersion; // WSM version
|
||||
|
||||
BOOL bRomArray; // copy of bFlashRomArray
|
||||
BYTE byLockCnfg[32]; // block lock table
|
||||
DWORD dwLockCnfg; // block lock table (32 entries)
|
||||
UINT uWrState; // state of write function WSM
|
||||
UINT uRdState; // state of read function WSM
|
||||
BYTE byStatusReg; // status register
|
||||
|
|
|
@ -132,8 +132,7 @@ LRESULT OnToolMacroNew(VOID)
|
|||
InitializeOFN(&ofn);
|
||||
ofn.lpstrFilter =
|
||||
_T("Keyboard Macro Files (*.MAC)\0*.MAC\0")
|
||||
_T("All Files (*.*)\0*.*\0")
|
||||
_T("\0\0");
|
||||
_T("All Files (*.*)\0*.*\0");
|
||||
ofn.lpstrDefExt = _T("MAC");
|
||||
ofn.nFilterIndex = 1;
|
||||
ofn.lpstrFile = szMacroFile;
|
||||
|
@ -186,8 +185,7 @@ LRESULT OnToolMacroPlay(VOID)
|
|||
InitializeOFN(&ofn);
|
||||
ofn.lpstrFilter =
|
||||
_T("Keyboard Macro Files (*.MAC)\0*.MAC\0")
|
||||
_T("All Files (*.*)\0*.*\0")
|
||||
_T("\0\0");
|
||||
_T("All Files (*.*)\0*.*\0");
|
||||
ofn.lpstrDefExt = _T("MAC");
|
||||
ofn.nFilterIndex = 1;
|
||||
ofn.lpstrFile = szMacroFile;
|
||||
|
|
|
@ -571,81 +571,67 @@ static BOOL IsBlock(TokenId eId)
|
|||
|
||||
static LPCTSTR GetStringOf(TokenId eId)
|
||||
{
|
||||
UINT i = 0;
|
||||
while (pLexToken[i].nLen)
|
||||
UINT i;
|
||||
|
||||
for (i = 0; pLexToken[i].nLen; ++i)
|
||||
{
|
||||
if (pLexToken[i].eId == eId) return pLexToken[i].szName;
|
||||
i++;
|
||||
}
|
||||
return _T("<Undefined>");
|
||||
}
|
||||
|
||||
static VOID SkipWhite(UINT nMode)
|
||||
{
|
||||
UINT i;
|
||||
loop:
|
||||
i = 0;
|
||||
while (szLexDelim[nMode][i])
|
||||
LPTSTR pcDelim;
|
||||
|
||||
while (*szText)
|
||||
{
|
||||
if (*szText == szLexDelim[nMode][i]) break;
|
||||
i++;
|
||||
}
|
||||
if (szLexDelim[nMode][i] != 0)
|
||||
// search for delimiter
|
||||
if ((pcDelim = _tcschr(szLexDelim[nMode],*szText)) != NULL)
|
||||
{
|
||||
if (szLexDelim[nMode][i]==_T('\n')) nLexLine++;
|
||||
_ASSERT(*pcDelim != 0); // no EOS
|
||||
if (*pcDelim == _T('\n')) nLexLine++;
|
||||
szText++;
|
||||
goto loop;
|
||||
continue;
|
||||
}
|
||||
if (*szText==_T('#'))
|
||||
if (*szText == _T('#')) // start of remark
|
||||
{
|
||||
// skip until LF or EOS
|
||||
do szText++; while (*szText != _T('\n') && *szText != 0);
|
||||
if (nMode != LEX_PARAM) goto loop;
|
||||
if (nMode != LEX_PARAM) continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
static TokenId ParseToken(UINT nMode)
|
||||
{
|
||||
UINT i, j, k;
|
||||
i = 0;
|
||||
while (szText[i])
|
||||
UINT i,j;
|
||||
|
||||
for (i = 0; szText[i]; i++) // search for delimeter
|
||||
{
|
||||
j = 0;
|
||||
while (szLexDelim[nMode][j])
|
||||
{
|
||||
if (szLexDelim[nMode][j] == szText[i]) break;
|
||||
j++;
|
||||
if (_tcschr(szLexDelim[nMode],szText[i]) != NULL)
|
||||
break;
|
||||
}
|
||||
if (szLexDelim[nMode][j] == _T('\n')) nLexLine++;
|
||||
if (szLexDelim[nMode][j] != 0) break;
|
||||
i++;
|
||||
}
|
||||
if (i==0)
|
||||
if (i == 0) return TOK_NONE;
|
||||
|
||||
// token length longer or equal than current command
|
||||
for (j = 0; pLexToken[j].nLen >= i; ++j)
|
||||
{
|
||||
return TOK_NONE;
|
||||
}
|
||||
j = 0;
|
||||
while (pLexToken[j].nLen)
|
||||
if (pLexToken[j].nLen == i) // token length has command length
|
||||
{
|
||||
if (pLexToken[j].nLen>i)
|
||||
{
|
||||
j++;
|
||||
continue;
|
||||
}
|
||||
if (pLexToken[j].nLen<i) break;
|
||||
k = 0;
|
||||
if (_tcsncmp(pLexToken[j].szName,szText,i) == 0)
|
||||
{
|
||||
szText += i;
|
||||
return pLexToken[j].eId;
|
||||
szText += i; // remove command from text
|
||||
return pLexToken[j].eId; // return token Id
|
||||
}
|
||||
j++;
|
||||
}
|
||||
szText[i] = 0;
|
||||
}
|
||||
szText[i] = 0; // token not found, set EOS
|
||||
if (bDebug)
|
||||
{
|
||||
PrintfToLog(_T("%i: Undefined token %s"),nLexLine,szText);
|
||||
return TOK_NONE;
|
||||
}
|
||||
return TOK_NONE;
|
||||
}
|
||||
|
@ -734,58 +720,59 @@ static KmlLine* ParseLine(TokenId eCommand)
|
|||
TokenId eToken;
|
||||
KmlLine* pLine;
|
||||
|
||||
i = 0;
|
||||
while (pLexToken[i].nLen)
|
||||
for (i = 0; pLexToken[i].nLen; ++i)
|
||||
{
|
||||
if (pLexToken[i].eId == eCommand) break;
|
||||
i++;
|
||||
}
|
||||
if (pLexToken[i].nLen == 0) return NULL;
|
||||
|
||||
j = 0;
|
||||
pLine = HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(KmlLine));
|
||||
pLine->eCommand = eCommand;
|
||||
nParams = pLexToken[i].nParams;
|
||||
loop:
|
||||
eToken = Lex(LEX_PARAM);
|
||||
|
||||
for (j = 0, nParams = pLexToken[i].nParams; TRUE; nParams >>= 3)
|
||||
{
|
||||
// check for parameter overflow
|
||||
_ASSERT(j < ARRAYSIZEOF(pLine->nParam));
|
||||
|
||||
eToken = Lex(LEX_PARAM); // decode argument token
|
||||
if ((nParams & 7) == TYPE_NONE)
|
||||
{
|
||||
if (eToken != TOK_EOL)
|
||||
{
|
||||
PrintfToLog(_T("%i: Too many parameters (%i expected)."), nLexLine, j);
|
||||
goto errline; // free memory of arguments
|
||||
PrintfToLog(_T("%i: Too many parameters for %s (%i expected)."), nLexLine, pLexToken[i].szName, j);
|
||||
break; // free memory of arguments
|
||||
}
|
||||
return pLine;
|
||||
return pLine; // normal exit -> parsed line
|
||||
}
|
||||
if ((nParams & 7) == TYPE_INTEGER)
|
||||
{
|
||||
if (eToken != TOK_INTEGER)
|
||||
{
|
||||
PrintfToLog(_T("%i: Parameter %i of %s must be an integer."), nLexLine, j+1, pLexToken[i].szName);
|
||||
goto errline; // free memory of arguments
|
||||
break; // free memory of arguments
|
||||
}
|
||||
pLine->nParam[j++] = nLexInteger;
|
||||
nParams >>= 3;
|
||||
goto loop;
|
||||
continue;
|
||||
}
|
||||
if ((nParams & 7) == TYPE_STRING)
|
||||
{
|
||||
if (eToken != TOK_STRING)
|
||||
{
|
||||
PrintfToLog(_T("%i: Parameter %i of %s must be a string."), nLexLine, j+1, pLexToken[i].szName);
|
||||
goto errline; // free memory of arguments
|
||||
break; // free memory of arguments
|
||||
}
|
||||
pLine->nParam[j++] = (DWORD_PTR) szLexString;
|
||||
nParams >>= 3;
|
||||
goto loop;
|
||||
continue;
|
||||
}
|
||||
AddToLog(_T("Oops..."));
|
||||
errline:
|
||||
_ASSERT(FALSE); // unknown parameter type
|
||||
break;
|
||||
}
|
||||
|
||||
// if last argument was string, free it
|
||||
if (eToken == TOK_STRING) HeapFree(hHeap,0,szLexString);
|
||||
|
||||
nParams = pLexToken[i].nParams; // get argument types of command
|
||||
for (i=0; i<j; i++) // handle all scanned arguments
|
||||
for (i = 0; i < j; ++i) // handle all scanned arguments
|
||||
{
|
||||
if ((nParams & 7) == TYPE_STRING) // string type
|
||||
{
|
||||
|
|
|
@ -14,6 +14,8 @@
|
|||
|
||||
#define BAT_FREQ (60*1000) // bat update time in ms (real machine = 60us, HP28C = 60s)
|
||||
|
||||
BOOL bLowBatDisable = FALSE;
|
||||
|
||||
static HANDLE hCThreadBat = NULL;
|
||||
static HANDLE hEventBat;
|
||||
|
||||
|
@ -51,13 +53,15 @@ static DWORD WINAPI LowBatThread(LPVOID pParam)
|
|||
|
||||
VOID StartBatMeasure(VOID)
|
||||
{
|
||||
DWORD dwThreadId;
|
||||
|
||||
if (hCThreadBat) // Bat measuring thread running
|
||||
return; // -> quit
|
||||
|
||||
// event to cancel Bat refresh loop
|
||||
hEventBat = CreateEvent(NULL,FALSE,FALSE,NULL);
|
||||
|
||||
VERIFY(hCThreadBat = CreateThread(NULL,0,&LowBatThread,NULL,0,NULL));
|
||||
VERIFY(hCThreadBat = CreateThread(NULL,0,&LowBatThread,NULL,0,&dwThreadId));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -100,8 +104,8 @@ VOID GetBatteryState(BOOL *pbLBI, BOOL *pbVLBI)
|
|||
|
||||
VERIFY(GetSystemPowerStatus(&sSps));
|
||||
|
||||
// battery powered
|
||||
if (sSps.ACLineStatus == AC_LINE_OFFLINE)
|
||||
// low bat emulation enabled and battery powered
|
||||
if (!bLowBatDisable && sSps.ACLineStatus == AC_LINE_OFFLINE)
|
||||
{
|
||||
// on critical battery state make sure that lowbat flag is also set
|
||||
if ((sSps.BatteryFlag & BATTERY_FLAG_CRITICAL) != 0)
|
||||
|
|
|
@ -376,7 +376,7 @@ VOID CommReceive(VOID)
|
|||
if (UpdateUSRQ()) // update USRQ bit
|
||||
INTERRUPT;
|
||||
}
|
||||
while(0);
|
||||
while (FALSE);
|
||||
LeaveCriticalSection(&csRecvLock);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -185,6 +185,8 @@ VOID ReadSettings(VOID)
|
|||
bWaveBeep = ReadInt(_T("Emulator"),_T("WaveBeep"),bWaveBeep);
|
||||
dwWaveVol = ReadInt(_T("Emulator"),_T("WaveVolume"),dwWaveVol);
|
||||
SetSpeed(bRealSpeed); // set speed
|
||||
// LowBat
|
||||
bLowBatDisable = ReadInt(_T("LowBat"),_T("Disable"),bLowBatDisable);
|
||||
// Macro
|
||||
bMacroRealSpeed = ReadInt(_T("Macro"),_T("RealSpeed"),bMacroRealSpeed);
|
||||
nMacroTimeout = ReadInt(_T("Macro"),_T("ReplayTimeout"),nMacroTimeout);
|
||||
|
@ -222,6 +224,8 @@ VOID WriteSettings(VOID)
|
|||
WriteInt(_T("Emulator"),_T("Grayscale"),bGrayscale);
|
||||
WriteInt(_T("Emulator"),_T("WaveBeep"),bWaveBeep);
|
||||
WriteInt(_T("Emulator"),_T("WaveVolume"),dwWaveVol);
|
||||
// LowBat
|
||||
WriteInt(_T("LowBat"),_T("Disable"),bLowBatDisable);
|
||||
// Macro
|
||||
WriteInt(_T("Macro"),_T("RealSpeed"),bMacroRealSpeed);
|
||||
WriteInt(_T("Macro"),_T("ReplayTimeout"),nMacroTimeout);
|
||||
|
|
|
@ -660,6 +660,7 @@ LRESULT OnStackPaste(VOID) // paste data to stack
|
|||
goto cancel;
|
||||
|
||||
KeyboardEvent(TRUE,0,0x8000);
|
||||
Sleep(200);
|
||||
KeyboardEvent(FALSE,0,0x8000);
|
||||
|
||||
// wait for sleep mode
|
||||
|
|
|
@ -225,7 +225,7 @@ FONT 8, "MS Sans Serif"
|
|||
BEGIN
|
||||
ICON IDI_EMU48,IDC_STATIC,7,6,20,20,SS_REALSIZEIMAGE
|
||||
LTEXT "",IDC_VERSION,29,6,151,8,NOT WS_GROUP
|
||||
LTEXT "Copyright © 2007 Sébastien Carlier && Christoph Gießelink",
|
||||
LTEXT "Copyright © 2008 Sébastien Carlier && Christoph Gießelink",
|
||||
IDC_STATIC,29,18,181,8
|
||||
DEFPUSHBUTTON "OK",IDOK,215,12,39,14
|
||||
EDITTEXT IDC_LICENSE,7,33,247,112,ES_MULTILINE | ES_AUTOHSCROLL |
|
||||
|
@ -581,8 +581,8 @@ END
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,4,5,0
|
||||
PRODUCTVERSION 1,4,5,0
|
||||
FILEVERSION 1,4,7,0
|
||||
PRODUCTVERSION 1,4,7,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -599,12 +599,12 @@ BEGIN
|
|||
BEGIN
|
||||
VALUE "CompanyName", "Sebastien Carlier & Christoph Gießelink\0"
|
||||
VALUE "FileDescription", "HP38/39/40/48/49 Emulator\0"
|
||||
VALUE "FileVersion", "1, 4, 5, 0\0"
|
||||
VALUE "FileVersion", "1, 4, 7, 0\0"
|
||||
VALUE "InternalName", "Emu48\0"
|
||||
VALUE "LegalCopyright", "Copyright © 2007\0"
|
||||
VALUE "LegalCopyright", "Copyright © 2008\0"
|
||||
VALUE "OriginalFilename", "Emu48.exe\0"
|
||||
VALUE "ProductName", "Emu48\0"
|
||||
VALUE "ProductVersion", "1, 4, 5, 0\0"
|
||||
VALUE "ProductVersion", "1, 4, 7, 0\0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
|
|
@ -9,25 +9,18 @@ of the compiler and the necessary files is MinGW at www.mingw.org.
|
|||
Emu48 was tested with the following MinGW file versions:
|
||||
|
||||
MinGW-3.1.0-1.exe
|
||||
w32api-3.3.tar.gz
|
||||
mingw-runtime-3.8.tar.gz
|
||||
binutils-2.16.91-20050827-1.tar.gz
|
||||
gcc-core-3.4.4-20050522-1.tar.gz
|
||||
|
||||
or
|
||||
|
||||
MinGW-3.1.0-1.exe
|
||||
w32api-3.7.tar.gz
|
||||
mingw-runtime-3.9.tar.gz
|
||||
w32api-3.10.tar.gz
|
||||
mingw-runtime-3.13.tar.gz
|
||||
mingw32-make-3.81-2.tar.gz
|
||||
binutils-2.16.91-20060119-1.tar.gz
|
||||
gcc-core-3.4.5-20060117-1.tar.gz
|
||||
|
||||
or
|
||||
|
||||
MinGW-3.1.0-1.exe
|
||||
w32api-3.8.tar.gz
|
||||
mingw-runtime-3.11.tar.gz
|
||||
binutils-2.16.91-20060119-1.tar.gz
|
||||
w32api-3.11.tar.gz
|
||||
mingw-runtime-3.14.tar.gz
|
||||
mingw32-make-3.81-20080326.tar.gz
|
||||
binutils-2.18.50-20080109-2.tar.gz
|
||||
gcc-core-3.4.5-20060117-1.tar.gz
|
||||
|
||||
Older versions of the MinGW package might not work, because there are several
|
||||
|
@ -41,4 +34,4 @@ Many thanks to Pedro A. Arranda Guti
|
|||
compatible.
|
||||
|
||||
|
||||
08/07/07 (c) by Christoph Gießelink
|
||||
04/01/08 (c) by Christoph Gießelink
|
||||
|
|
BIN
Wombat3 48GX.bmp
BIN
Wombat3 48GX.bmp
Binary file not shown.
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
@ -1,7 +1,7 @@
|
|||
Global
|
||||
Print "======================================================="
|
||||
Print "KML script by Christoph Giesselink, c.giesselink@gmx.de"
|
||||
Print "http://privat.swol.de/ChristophGiesselink/"
|
||||
Print "http://hp.giesselink.com/"
|
||||
Print "Wombat3 base on the design of Wombat2 by"
|
||||
Print "Victor Chow & Pete Wilson"
|
||||
Print "======================================================="
|
||||
|
|
BIN
Wombat3 48SX.bmp
BIN
Wombat3 48SX.bmp
Binary file not shown.
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
@ -1,7 +1,7 @@
|
|||
Global
|
||||
Print "======================================================="
|
||||
Print "KML script by Christoph Giesselink, c.giesselink@gmx.de"
|
||||
Print "http://privat.swol.de/ChristophGiesselink/"
|
||||
Print "http://hp.giesselink.com/"
|
||||
Print "Wombat3 base on the design of Wombat2 by"
|
||||
Print "Victor Chow & Pete Wilson"
|
||||
Print "======================================================="
|
||||
|
|
BIN
uninst.exe
BIN
uninst.exe
Binary file not shown.
Loading…
Reference in a new issue