2005-09-03: Updated to version 1.38

Signed-off-by: Gwenhael Le Moine <gwenhael.le.moine@gmail.com>
This commit is contained in:
Gwenhael Le Moine 2024-03-19 23:35:29 +01:00
parent e1230f4415
commit 0c2f128039
No known key found for this signature in database
GPG key ID: FDFE3669426707A7
16 changed files with 373 additions and 266 deletions

BIN
EMU48.EXE

Binary file not shown.

View file

@ -1,4 +1,4 @@
Known bugs and restrictions of Emu48 V1.37
Known bugs and restrictions of Emu48 V1.38
------------------------------------------
- the following I/O bits aren't emulated (incomplete)
@ -55,4 +55,4 @@ Known bugs and restrictions of Emu48 V1.37
- quitting the emulator while programming the flash isn't allowed,
because the content of flash state machine isn't saved so far
06/14/04 (c) by Christoph Gießelink, c dot giesselink at gmx dot de
08/30/05 (c) by Christoph Gießelink, c dot giesselink at gmx dot de

View file

@ -1,3 +1,50 @@
Service Pack 38 for Emu48 Version 1.0
DISPLAY.C
- changed gray scale implementation from conditional compiling to
variable controlled
- bugfix in function GetLineCounterGray() and StartDisplayGray(),
VBL down counter counted 62,...,0,63 instead of 63,...,0
EMU48.C
- changed function SettingsProc(), added IDC_GRAYSCALE button
handling
- changed function OnCreate() and OnDestroy(), changed gray scale
implementation from conditional compiling to variable controlled
EMU48.H
- removed gray scale definitions
- changed some function prototypes to function pointers
EMU48.RC
- added "Enable Virtual LCD Delay" checkbox in Settings dialog
- changed menu text order from "Copy Stack/Copy Screen/Paste Stack"
to "Copy Screen/Copy Stack/Paste Stack"
- changed version
ENGINE.C
- changed function WorkerThread(), changed gray scale implementation
from conditional compiling to variable controlled
FILES.C
- changed function PatchRom(), changed ASCII string handling from
BYTE to CHAR data type
MOPS.C
- changed function Nwrite(), changed gray scale implementation from
conditional compiling to variable controlled
OPS.H
- changed function Nsrb(), speed optimization
RESOURCE.H
- added definition
SETTINGS.C
- changed function ReadSettings() and WriteSettings(), added item
"Grayscale" in section [Emulator] in the INI-File
Service Pack 37 for Emu48 Version 1.0
DDESERV.C

View file

@ -15,11 +15,10 @@
// #define DEBUG_DISPLAY // switch for DISPLAY debug purpose
#if defined GRAYSCALE
#define NOCOLORS 8
#else
#define NOCOLORS 2
#endif
#define NOCOLORSGRAY 8 // no. of colors in gray scale mode
#define NOCOLORSBW 2 // no. of colors in black and white mode
#define DISPLAY_FREQ 19 // display update 1/frequency (1/64) in ms (gray scale mode)
#define B 0x00000000 // black
#define W 0x00FFFFFF // white
@ -30,13 +29,14 @@
// main display lines, handle zero lines exception
#define LINES(n) (((n) == 0) ? 64 : ((n)+1))
#define GRAYMASK (((((NOCOLORS)-1)>>1)<<24) \
|((((NOCOLORS)-1)>>1)<<16) \
|((((NOCOLORS)-1)>>1)<<8) \
|((((NOCOLORS)-1)>>1)))
#define GRAYMASK(c) (((((c)-1)>>1)<<24) \
|((((c)-1)>>1)<<16) \
|((((c)-1)>>1)<<8) \
|((((c)-1)>>1)))
#define DIBPIXEL(d,p) *(((DWORD*)(d))++) = ((*((DWORD*)(d)) & GRAYMASK) << 1) | (p)
#define DIBPIXEL(d,p) *(((DWORD*)(d))++) = ((*((DWORD*)(d)) & dwGrayMask) << 1) | (p)
BOOL bGrayscale = FALSE;
UINT nBackgroundX = 0;
UINT nBackgroundY = 0;
UINT nBackgroundW = 0;
@ -48,12 +48,30 @@ LPBYTE pbyLcd;
HDC hLcdDC = NULL;
HDC hMainDC = NULL;
BYTE (*GetLineCounter)(VOID) = NULL;
VOID (*StartDisplay)(BYTE byInitial) = NULL;
VOID (*StopDisplay)(VOID) = NULL;
static BYTE GetLineCounterGray(VOID);
static BYTE GetLineCounterBW(VOID);
static VOID StartDisplayGray(BYTE byInitial);
static VOID StartDisplayBW(BYTE byInitial);
static VOID StopDisplayGray(VOID);
static VOID StopDisplayBW(VOID);
static HBITMAP hLcdBitmap;
static HBITMAP hMainBitmap;
static DWORD Pattern[16];
static BYTE Buf[36];
static DWORD dwGrayMask;
static LARGE_INTEGER lLcdRef; // reference time for VBL counter
static UINT uLcdTimerId = 0;
static BYTE byVblRef = 0; // VBL stop reference
static DWORD dwKMLColor[64] = // color table loaded by KML script
{
W,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,
@ -65,10 +83,10 @@ static DWORD dwKMLColor[64] = // color table loaded by KML script
static struct
{
BITMAPINFOHEADER Lcd_bmih;
RGBQUAD bmiColors[NOCOLORS];
RGBQUAD bmiColors[NOCOLORSGRAY];
} bmiLcd =
{
{0x28,0/*x*/,0/*y*/,1,8,BI_RGB,0,0,0,NOCOLORS,0}
{0x28,0/*x*/,0/*y*/,1,8,BI_RGB,0,0,0,NOCOLORSGRAY,0}
};
static __inline VOID BuildPattern(VOID)
@ -106,32 +124,28 @@ static __inline VOID BuildPattern(VOID)
VOID UpdateContrast(BYTE byContrast)
{
#if defined GRAYSCALE
INT i;
INT i,nColors;
// table for max. 8 colors
const INT nCAdj[] = { 0, 1, 1, 2, 1, 2, 2, 3 };
RGBQUAD c = *(RGBQUAD*)&dwKMLColor[byContrast]; // pixel on color
RGBQUAD b = *(RGBQUAD*)&dwKMLColor[byContrast+32]; // pixel off color
if ((Chipset.IORam[BITOFFSET] & DON) == 0 || I == *(DWORD*)&b)
b = *(RGBQUAD*)&dwKMLColor[0];
// fill color palette of bitmap
for (i = 0; i < ARRAYSIZEOF(bmiLcd.bmiColors); ++i)
{
const INT nCAdj[] = { 0, 1, 1, 2, 1, 2, 2, 3 };
nColors = bGrayscale ? (NOCOLORSGRAY-1) : (NOCOLORSBW-1);
_ASSERT(i < ARRAYSIZEOF(bmiLcd.bmiColors));
_ASSERT(i < ARRAYSIZEOF(nCAdj));
_ASSERT(nColors <= ARRAYSIZEOF(nCAdj)); // no. of colors must be smaller than entries in the gray color table
// fill color palette of bitmap
for (i = 0; i <= nColors; ++i)
{
bmiLcd.bmiColors[i] = b;
bmiLcd.bmiColors[i].rgbRed += (((INT) c.rgbRed - (INT) b.rgbRed) * nCAdj[i] / 3);
bmiLcd.bmiColors[i].rgbGreen += (((INT) c.rgbGreen - (INT) b.rgbGreen) * nCAdj[i] / 3);
bmiLcd.bmiColors[i].rgbBlue += (((INT) c.rgbBlue - (INT) b.rgbBlue) * nCAdj[i] / 3);
bmiLcd.bmiColors[i].rgbRed += ((INT) c.rgbRed - (INT) b.rgbRed) * nCAdj[i] / nCAdj[nColors];
bmiLcd.bmiColors[i].rgbGreen += ((INT) c.rgbGreen - (INT) b.rgbGreen) * nCAdj[i] / nCAdj[nColors];
bmiLcd.bmiColors[i].rgbBlue += ((INT) c.rgbBlue - (INT) b.rgbBlue) * nCAdj[i] / nCAdj[nColors];
}
#else
bmiLcd.bmiColors[1] = *(RGBQUAD*)&dwKMLColor[byContrast]; // pixel on color
bmiLcd.bmiColors[0] = *(RGBQUAD*)&dwKMLColor[byContrast+32]; // pixel off color
if ((Chipset.IORam[BITOFFSET] & DON) == 0 || I == *(DWORD*)&bmiLcd.bmiColors[0])
bmiLcd.bmiColors[0] = *(RGBQUAD*)&dwKMLColor[0];
#endif
// update palette information
_ASSERT(hLcdDC);
@ -145,6 +159,28 @@ VOID SetLcdColor(UINT nId, UINT nRed, UINT nGreen, UINT nBlue)
return;
}
VOID SetLcdMode(BOOL bMode)
{
if ((bGrayscale = bMode))
{
// set pixel update mask
dwGrayMask = GRAYMASK(NOCOLORSGRAY);
GetLineCounter = GetLineCounterGray;
StartDisplay = StartDisplayGray;
StopDisplay = StopDisplayGray;
}
else
{
// set pixel update mask
dwGrayMask = GRAYMASK(NOCOLORSBW);
GetLineCounter = GetLineCounterBW;
StartDisplay = StartDisplayBW;
StopDisplay = StopDisplayBW;
}
UpdateContrast(Chipset.contrast);
return;
}
VOID CreateLcdBitmap(VOID)
{
// create LCD bitmap
@ -159,7 +195,7 @@ VOID CreateLcdBitmap(VOID)
SelectPalette(hLcdDC,hPalette,FALSE); // set palette for LCD DC
RealizePalette(hLcdDC); // realize palette
BuildPattern(); // build Nibble -> DIB mask pattern
UpdateContrast(Chipset.contrast);
SetLcdMode(bGrayscale); // init display update function pointer
return;
}
@ -170,6 +206,10 @@ VOID DestroyLcdBitmap(VOID)
while(i < 32) dwKMLColor[i++] = B;
while(i < 64) dwKMLColor[i++] = I;
GetLineCounter = NULL;
StartDisplay = NULL;
StopDisplay = NULL;
if (hLcdDC != NULL)
{
// destroy LCD bitmap
@ -220,7 +260,7 @@ VOID DestroyMainBitmap(VOID)
VOID UpdateDisplayPointers(VOID)
{
GRAYON(EnterCriticalSection(&csLcdLock));
EnterCriticalSection(&csLcdLock);
{
UINT nLines = LINES(Chipset.lcounter);
@ -248,7 +288,7 @@ VOID UpdateDisplayPointers(VOID)
}
Chipset.end2 = Chipset.start2 + (64 - nLines) * 34;
}
GRAYON(LeaveCriticalSection(&csLcdLock));
LeaveCriticalSection(&csLcdLock);
return;
}
@ -425,13 +465,16 @@ VOID UpdateMenuDisplay(VOID)
VOID WriteToMainDisplay(LPBYTE a, DWORD d, UINT s)
{
#if !defined GRAYSCALE
INT x0, x;
INT y0, y;
DWORD *p;
INT lWidth;
UINT nLines;
INT lWidth = abs(Chipset.width); // display width
UINT nLines = LINES(Chipset.lcounter); // main display lines
if (bGrayscale) return; // no direct writing in grayscale mode
lWidth = abs(Chipset.width); // display width
nLines = LINES(Chipset.lcounter); // main display lines
#if defined DEBUG_DISPLAY
{
@ -531,18 +574,19 @@ VOID WriteToMainDisplay(LPBYTE a, DWORD d, UINT s)
GdiFlush();
}
LeaveCriticalSection(&csGDILock);
#endif
return;
}
VOID WriteToMenuDisplay(LPBYTE a, DWORD d, UINT s)
{
#if !defined GRAYSCALE
UINT x0, x;
UINT y0, y;
DWORD *p;
UINT nLines;
UINT nLines = LINES(Chipset.lcounter); // main display lines
if (bGrayscale) return; // no direct writing in grayscale mode
nLines = LINES(Chipset.lcounter); // main display lines
#if defined DEBUG_DISPLAY
{
@ -651,7 +695,6 @@ VOID WriteToMenuDisplay(LPBYTE a, DWORD d, UINT s)
GdiFlush();
}
LeaveCriticalSection(&csGDILock);
#endif
return;
}
@ -706,15 +749,13 @@ VOID ResizeWindow(VOID)
return;
}
//################
//#
//# functions for gray scale implementation
//#
//################
#if defined GRAYSCALE
#define DISPLAY_FREQ 19 // display update 1/frequency (1/64) in ms
static LARGE_INTEGER lLcdRef; // reference time for VBL counter
static UINT uLcdTimerId = 0;
// main display update routine
static VOID CALLBACK LcdProc(UINT uEventId, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
EnterCriticalSection(&csLcdLock);
@ -735,7 +776,7 @@ static VOID CALLBACK LcdProc(UINT uEventId, UINT uMsg, DWORD dwUser, DWORD dw1,
}
// LCD line counter calculation
BYTE GetLineCounter(VOID)
BYTE GetLineCounterGray(VOID)
{
LARGE_INTEGER lLC;
BYTE byTime;
@ -750,10 +791,10 @@ BYTE GetLineCounter(VOID)
if (byTime > 0x3F) byTime = 0x3F; // all counts made
return (0x7E - byTime) & 0x3F; // update display between VBL counter 0x3F-0x3E
return 0x3F - byTime; // update display between VBL counter 0x3F-0x3E
}
VOID StartDisplay(BYTE byInitial)
static VOID StartDisplayGray(BYTE byInitial)
{
if (uLcdTimerId) // LCD update timer running
return; // -> quit
@ -763,14 +804,15 @@ VOID StartDisplay(BYTE byInitial)
QueryPerformanceCounter(&lLcdRef); // actual time of top line
// adjust startup counter to get the right VBL value
lLcdRef.QuadPart -= ((LONGLONG) ((0x7E - byInitial) & 0x3F) * lFreq.QuadPart) >> 12;
_ASSERT(byInitial <= 0x3F); // line counter value 0 - 63
lLcdRef.QuadPart -= ((LONGLONG) (0x3F - byInitial) * lFreq.QuadPart) >> 12;
VERIFY(uLcdTimerId = timeSetEvent(DISPLAY_FREQ,0,(LPTIMECALLBACK)&LcdProc,0,TIME_PERIODIC));
}
return;
}
VOID StopDisplay(VOID)
static VOID StopDisplayGray(VOID)
{
BYTE a[2];
ReadIO(a,LINECOUNT,2); // update VBL at display off time
@ -790,11 +832,13 @@ VOID StopDisplay(VOID)
return;
}
#else
//################
//#
//# functions for black and white implementation
//#
//################
static BYTE byVblRef = 0; // VBL stop reference
// LCD line counter calculation
// LCD line counter calculation in BW mode
static BYTE F4096Hz(VOID) // get a 6 bit 4096Hz down counter value
{
LARGE_INTEGER lLC;
@ -805,24 +849,22 @@ static BYTE F4096Hz(VOID) // get a 6 bit 4096Hz down counter value
return -(BYTE)(((lLC.QuadPart - lAppStart.QuadPart) << 12) / lFreq.QuadPart) & 0x3F;
}
BYTE GetLineCounter(VOID) // get line counter value
static BYTE GetLineCounterBW(VOID) // get line counter value
{
_ASSERT(byVblRef < 0x40);
return (0x40 + F4096Hz() - byVblRef) & 0x3F;
}
VOID StartDisplay(BYTE byInitial)
static VOID StartDisplayBW(BYTE byInitial)
{
// get positive VBL difference between now and stop time
byVblRef = (0x40 + F4096Hz() - byInitial) & 0x3F;
return;
}
VOID StopDisplay(VOID)
static VOID StopDisplayBW(VOID)
{
BYTE a[2];
ReadIO(a,LINECOUNT,2); // update VBL at display off time
return;
}
#endif

View file

@ -13,7 +13,7 @@
#include "kml.h"
#include "debugger.h"
#define VERSION "1.37"
#define VERSION "1.38"
#define CF_HPOBJ "CF_HPOBJ" // clipboard format for DDE
#define MAXPORTS 256 // number of COM ports
@ -48,7 +48,7 @@ static const LPCTSTR szLicence =
CRITICAL_SECTION csGDILock; // critical section for hWindowDC
GRAYON(CRITICAL_SECTION csLcdLock); // critical section for display update
CRITICAL_SECTION csLcdLock; // critical section for display update
CRITICAL_SECTION csKeyLock; // critical section for key scan
CRITICAL_SECTION csIOLock; // critical section for I/O access
CRITICAL_SECTION csT1Lock; // critical section for timer1 access
@ -266,6 +266,7 @@ static BOOL CALLBACK SettingsProc(HWND hDlg, UINT message, DWORD wParam, LONG lP
CheckDlgButton(hDlg,IDC_AUTOSAVEONEXIT,bAutoSaveOnExit);
CheckDlgButton(hDlg,IDC_OBJECTLOADWARNING,bLoadObjectWarning);
CheckDlgButton(hDlg,IDC_ALWAYSDISPLOG,bAlwaysDisplayLog);
CheckDlgButton(hDlg,IDC_GRAYSCALE,bGrayscale);
// set disassebler mode
CheckDlgButton(hDlg,(disassembler_mode == HP_MNEMONICS) ? IDC_DISASM_HP : IDC_DISASM_CLASS,BST_CHECKED);
@ -375,6 +376,13 @@ static BOOL CALLBACK SettingsProc(HWND hDlg, UINT message, DWORD wParam, LONG lP
bLoadObjectWarning = IsDlgButtonChecked(hDlg, IDC_OBJECTLOADWARNING);
bAlwaysDisplayLog = IsDlgButtonChecked(hDlg, IDC_ALWAYSDISPLOG);
SetSpeed(bRealSpeed); // set speed
// LCD grayscale checkbox has been changed
if (bGrayscale != (BOOL) IsDlgButtonChecked(hDlg,IDC_GRAYSCALE))
{
UINT nOldState = SwitchToState(SM_INVALID);
SetLcdMode(!bGrayscale); // set new display mode
SwitchToState(nOldState);
}
if (nState == SM_INVALID)
{
bPort2IsShared = IsDlgButtonChecked(hDlg,IDC_PORT2ISSHARED);
@ -450,7 +458,7 @@ static UINT SaveChanges(BOOL bAuto)
static LRESULT OnCreate(HWND hWindow)
{
InitializeCriticalSection(&csGDILock);
GRAYON(InitializeCriticalSection(&csLcdLock));
InitializeCriticalSection(&csLcdLock);
InitializeCriticalSection(&csKeyLock);
InitializeCriticalSection(&csIOLock);
InitializeCriticalSection(&csT1Lock);
@ -492,7 +500,7 @@ static LRESULT OnDestroy(HWND hWindow)
}
DeleteCriticalSection(&csGDILock);
GRAYON(DeleteCriticalSection(&csLcdLock));
DeleteCriticalSection(&csLcdLock);
DeleteCriticalSection(&csKeyLock);
DeleteCriticalSection(&csIOLock);
DeleteCriticalSection(&csT1Lock);

View file

@ -6,14 +6,6 @@
* Copyright (C) 1995 Sebastien Carlier
*
*/
#if defined GRAYSCALE // grayscale defines
#define GRAYON(a) a
#define GRAYOFF(a)
#else
#define GRAYON(a)
#define GRAYOFF(a) a
#endif
#include "types.h"
#define HARDWARE "Yorke" // emulator hardware
@ -116,6 +108,7 @@ extern VOID ReadLastDocument(LPTSTR szFileName, DWORD nSize);
extern VOID WriteLastDocument(LPCTSTR szFilename);
// Display.c
extern BOOL bGrayscale;
extern UINT nBackgroundX;
extern UINT nBackgroundY;
extern UINT nBackgroundW;
@ -126,8 +119,12 @@ extern UINT nLcdZoom;
extern LPBYTE pbyLcd;
extern HDC hLcdDC;
extern HDC hMainDC;
extern BYTE (*GetLineCounter)(VOID);
extern VOID (*StartDisplay)(BYTE byInitial);
extern VOID (*StopDisplay)(VOID);
extern VOID UpdateContrast(BYTE byContrast);
extern VOID SetLcdColor(UINT nId, UINT nRed, UINT nGreen, UINT nBlue);
extern VOID SetLcdMode(BOOL bMode);
extern VOID CreateLcdBitmap(VOID);
extern VOID DestroyLcdBitmap(VOID);
extern BOOL CreateMainBitmap(LPCTSTR szFilename);
@ -139,9 +136,6 @@ extern VOID WriteToMainDisplay(LPBYTE a, DWORD d, UINT s);
extern VOID WriteToMenuDisplay(LPBYTE a, DWORD d, UINT s);
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;

View file

@ -74,7 +74,7 @@ BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 160
TOPMARGIN, 4
BOTTOMMARGIN, 210
BOTTOMMARGIN, 222
END
IDD_CHOOSEKML, DIALOG
@ -232,46 +232,48 @@ BEGIN
ES_READONLY
END
IDD_SETTINGS DIALOG DISCARDABLE 0, 0, 167, 217
IDD_SETTINGS DIALOG DISCARDABLE 0, 0, 167, 229
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Settings"
FONT 8, "MS Sans Serif"
BEGIN
CONTROL "Authentic Calculator Speed",IDC_REALSPEED,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,13,13,100,10
CONTROL "Enable Virtual LCD Delay",IDC_GRAYSCALE,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,25,100,10
CONTROL "Automatically Save Files",IDC_AUTOSAVE,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,13,25,89,10
BS_AUTOCHECKBOX | WS_TABSTOP,13,37,89,10
CONTROL "Automatically Save Files On Exit",IDC_AUTOSAVEONEXIT,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,37,114,10
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,49,114,10
CONTROL "Show Load Object Warning",IDC_OBJECTLOADWARNING,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,13,49,102,10
BS_AUTOCHECKBOX | WS_TABSTOP,13,61,102,10
CONTROL "Always Show KML Compilation Result",IDC_ALWAYSDISPLOG,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,61,133,10
GROUPBOX "General",IDC_STATIC,7,4,153,71
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,73,133,10
GROUPBOX "General",IDC_STATIC,7,4,153,83
CONTROL "HP Mnemonics",IDC_DISASM_HP,"Button",BS_AUTORADIOBUTTON |
WS_GROUP | WS_TABSTOP,13,89,65,11
WS_GROUP | WS_TABSTOP,13,101,65,11
CONTROL "Class Mnemonics",IDC_DISASM_CLASS,"Button",
BS_AUTORADIOBUTTON,84,89,70,11
GROUPBOX "Disassembler",IDC_STATIC,7,78,153,28
BS_AUTORADIOBUTTON,84,101,70,11
GROUPBOX "Disassembler",IDC_STATIC,7,90,153,28
CONTROL "Port 1 is Plugged",IDC_PORT1EN,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,13,119,67,10
WS_TABSTOP,13,131,67,10
CONTROL "Port 1 is Writeable",IDC_PORT1WR,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,84,119,69,10
BS_AUTOCHECKBOX | WS_TABSTOP,84,131,69,10
CONTROL "Port 2 is Shared",IDC_PORT2ISSHARED,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,13,131,65,10
LTEXT "Port 2 File :",IDC_STATIC,13,147,37,8
EDITTEXT IDC_PORT2,51,144,94,12,ES_AUTOHSCROLL
PUSHBUTTON "...",IDC_PORT2LOAD,145,144,10,12
GROUPBOX "Memory Cards",IDC_STATIC,7,110,153,51
LTEXT "Wire:",IDC_STATIC,13,176,17,8
COMBOBOX IDC_WIRE,31,174,48,42,CBS_DROPDOWNLIST | WS_VSCROLL |
BS_AUTOCHECKBOX | WS_TABSTOP,13,143,65,10
LTEXT "Port 2 File :",IDC_STATIC,13,159,37,8
EDITTEXT IDC_PORT2,51,156,94,12,ES_AUTOHSCROLL
PUSHBUTTON "...",IDC_PORT2LOAD,145,156,10,12
GROUPBOX "Memory Cards",IDC_STATIC,7,122,153,51
LTEXT "Wire:",IDC_STATIC,13,188,17,8
COMBOBOX IDC_WIRE,31,186,48,42,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
LTEXT "IR:",IDC_STATIC,89,176,9,8
COMBOBOX IDC_IR,107,174,48,43,CBS_DROPDOWNLIST | WS_VSCROLL |
LTEXT "IR:",IDC_STATIC,89,188,9,8
COMBOBOX IDC_IR,107,186,48,43,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
GROUPBOX "Serial Ports",IDC_STATIC,7,164,153,27
DEFPUSHBUTTON "&Ok",IDOK,9,196,50,14
PUSHBUTTON "&Cancel",IDCANCEL,107,196,50,14
GROUPBOX "Serial Ports",IDC_STATIC,7,176,153,27
DEFPUSHBUTTON "&Ok",IDOK,9,208,50,14
PUSHBUTTON "&Cancel",IDCANCEL,107,208,50,14
END
IDD_CHOOSEKML DIALOG DISCARDABLE 0, 0, 195, 66
@ -536,8 +538,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,3,7,0
PRODUCTVERSION 1,3,7,0
FILEVERSION 1,3,8,0
PRODUCTVERSION 1,3,8,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -554,12 +556,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Sebastien Carlier & Christoph Gießelink\0"
VALUE "FileDescription", "HP38/39/40/48/49 Emulator\0"
VALUE "FileVersion", "1, 3, 7, 0\0"
VALUE "FileVersion", "1, 3, 8, 0\0"
VALUE "InternalName", "Emu48\0"
VALUE "LegalCopyright", "Copyright © 2005\0"
VALUE "OriginalFilename", "Emu48.exe\0"
VALUE "ProductName", "Emu48\0"
VALUE "ProductVersion", "1, 3, 7, 0\0"
VALUE "ProductVersion", "1, 3, 8, 0\0"
END
END
BLOCK "VarFileInfo"
@ -604,8 +606,8 @@ BEGIN
MENUITEM "&Load Object...", ID_OBJECT_LOAD
MENUITEM "&Save Object...", ID_OBJECT_SAVE
MENUITEM SEPARATOR
MENUITEM "&Copy String", ID_STACK_COPY
MENUITEM "C&opy Screen", ID_VIEW_COPY
MENUITEM "&Copy String", ID_STACK_COPY
MENUITEM "&Paste String", ID_STACK_PASTE
MENUITEM SEPARATOR
MENUITEM "&Reset Calculator", ID_VIEW_RESET, GRAYED

View file

@ -579,7 +579,8 @@ loop:
EvalOpcode(FASTPTR(Chipset.pc)); // execute opcode
GRAYOFF(CheckDisp(!Chipset.Shutdn)); // check for display update
// check for display update in BW mode
if (!bGrayscale) CheckDisp(!Chipset.Shutdn);
AdjustSpeed(); // adjust emulation speed
}
bInterrupt = FALSE; // be sure to reenter opcode loop

View file

@ -216,7 +216,7 @@ BOOL PatchRom(LPCTSTR szFilename)
DWORD dwFileSizeLow = 0;
DWORD dwFileSizeHigh = 0;
DWORD lBytesRead = 0;
LPBYTE lpStop,lpBuf = NULL;
PSZ lpStop,lpBuf = NULL;
DWORD dwAddress = 0;
UINT nPos = 0;
@ -269,7 +269,7 @@ BOOL PatchRom(LPCTSTR szFilename)
} while (lpBuf[nPos]);
continue;
}
dwAddress = strtoul(&lpBuf[nPos],(CHAR **)&lpStop,16);
dwAddress = strtoul(&lpBuf[nPos], &lpStop, 16);
nPos += lpStop-&lpBuf[nPos]+1;
if (*lpStop != ':' || *lpStop == 0)
continue;

View file

@ -931,7 +931,7 @@ VOID Nwrite(BYTE *a, DWORD d, UINT s)
if ((p=WMap[u]) != NULL) memcpy(p+v, a, c);
}
}
GRAYOFF(UpdateDisplay(d, c)); // update display
if (!bGrayscale) UpdateDisplay(d, c); // update display
a+=c;
d=(d+c)&0xFFFFF;
} while (s-=c);

View file

@ -353,7 +353,7 @@ static __inline void Nsrb(BYTE *a, UINT s)
while (--s)
{
*a >>= 1;
if (a[1]&1) *a |= 8;
*a |= ((a[1] & 1) << 3);
a++;
}
*a >>= 1;

View file

@ -28,123 +28,124 @@
#define IDD_PROFILE 121
#define IDD_MACROSET 122
#define IDC_REALSPEED 1000
#define IDC_AUTOSAVE 1001
#define IDC_AUTOSAVEONEXIT 1002
#define IDC_OBJECTLOADWARNING 1003
#define IDC_ALWAYSDISPLOG 1004
#define IDC_PORT1EN 1005
#define IDC_PORT1WR 1006
#define IDC_PORT2ISSHARED 1007
#define IDC_PORT2 1008
#define IDC_PORT2LOAD 1009
#define IDC_WIRE 1010
#define IDC_IR 1011
#define IDC_EMUDIR 1012
#define IDC_EMUDIRSEL 1013
#define IDC_UPDATE 1014
#define IDC_KMLSCRIPT 1015
#define IDC_AUTHOR 1016
#define IDC_TITLE 1017
#define IDC_KMLLOG 1018
#define IDC_VERSION 1019
#define IDC_LICENSE 1020
#define IDC_DISASM_WIN 1021
#define IDC_DISASM_MAP 1022
#define IDC_DISASM_ROM 1023
#define IDC_DISASM_RAM 1024
#define IDC_DISASM_PORT1 1025
#define IDC_DISASM_PORT2 1026
#define IDC_DISASM_MODULE 1027
#define IDC_DISASM_HP 1028
#define IDC_DISASM_CLASS 1029
#define IDC_ADDRESS 1030
#define IDC_DISASM_ADR 1031
#define IDC_DISASM_NEXT 1032
#define IDC_DISASM_COPY 1033
#define IDC_DEBUG_CODE 1034
#define IDC_STATIC_CODE 1035
#define IDC_STATIC_REGISTERS 1036
#define IDC_STATIC_MEMORY 1037
#define IDC_STATIC_STACK 1038
#define IDC_REG_A 1039
#define IDC_REG_B 1040
#define IDC_REG_C 1041
#define IDC_REG_D 1042
#define IDC_REG_R0 1043
#define IDC_REG_R1 1044
#define IDC_REG_R2 1045
#define IDC_REG_R3 1046
#define IDC_REG_R4 1047
#define IDC_REG_D0 1048
#define IDC_REG_D1 1049
#define IDC_REG_P 1050
#define IDC_REG_PC 1051
#define IDC_REG_OUT 1052
#define IDC_REG_IN 1053
#define IDC_REG_ST 1054
#define IDC_REG_CY 1055
#define IDC_REG_MODE 1056
#define IDC_REG_MP 1057
#define IDC_REG_SR 1058
#define IDC_REG_SB 1059
#define IDC_REG_XM 1060
#define IDC_MISC_INT 1061
#define IDC_MISC_KEY 1062
#define IDC_MISC_BS 1063
#define IDC_NEWVALUE 1064
#define IDC_ENTERADR 1065
#define IDC_DEBUG_MEM 1066
#define IDC_DEBUG_MEM_ADDR 1067
#define IDC_DEBUG_MEM_COL0 1068
#define IDC_DEBUG_MEM_COL1 1069
#define IDC_DEBUG_MEM_COL2 1070
#define IDC_DEBUG_MEM_COL3 1071
#define IDC_DEBUG_MEM_COL4 1072
#define IDC_DEBUG_MEM_COL5 1073
#define IDC_DEBUG_MEM_COL6 1074
#define IDC_DEBUG_MEM_COL7 1075
#define IDC_DEBUG_MEM_TEXT 1076
#define IDC_DEBUG_STACK 1077
#define IDC_STATIC_BREAKPOINT 1078
#define IDC_BREAKEDIT_ADD 1079
#define IDC_BREAKEDIT_DELETE 1080
#define IDC_BREAKEDIT_WND 1081
#define IDC_STATIC_MMU 1082
#define IDC_MMU_IO_A 1083
#define IDC_MMU_NCE2_A 1084
#define IDC_MMU_CE1_A 1085
#define IDC_MMU_CE2_A 1086
#define IDC_MMU_NCE3_A 1087
#define IDC_MMU_IO_S 1088
#define IDC_MMU_CE1_S 1089
#define IDC_MMU_CE2_S 1090
#define IDC_MMU_NCE2_S 1091
#define IDC_MMU_NCE3_S 1092
#define IDC_STATIC_MISC 1093
#define IDC_MISC_BS_TXT 1094
#define IDC_INSTR_TEXT 1095
#define IDC_INSTR_CODE 1096
#define IDC_INSTR_COPY 1097
#define IDC_INSTR_CLEAR 1098
#define IDC_PROFILE_LASTCYCLES 1099
#define IDC_PROFILE_LASTTIME 1100
#define IDC_BPCODE 1101
#define IDC_BPRPL 1102
#define IDC_BPACCESS 1103
#define IDC_BPREAD 1104
#define IDC_BPWRITE 1105
#define IDC_FIND_DATA 1106
#define IDC_FIND_ASCII 1107
#define IDC_FIND_CASE 1108
#define IDC_ADDR20_24 1109
#define IDC_ADDR25_27 1110
#define IDC_ADDR28_29 1111
#define IDC_ADDR30_34 1112
#define IDC_MACRO_SLOW 1113
#define IDC_MACRO_FAST 1114
#define IDC_MACRO_SLIDER 1115
#define IDC_MACRO_REAL 1116
#define IDC_MACRO_MANUAL 1117
#define IDC_GRAYSCALE 1001
#define IDC_AUTOSAVE 1002
#define IDC_AUTOSAVEONEXIT 1003
#define IDC_OBJECTLOADWARNING 1004
#define IDC_ALWAYSDISPLOG 1005
#define IDC_PORT1EN 1006
#define IDC_PORT1WR 1007
#define IDC_PORT2ISSHARED 1008
#define IDC_PORT2 1009
#define IDC_PORT2LOAD 1010
#define IDC_WIRE 1011
#define IDC_IR 1012
#define IDC_EMUDIR 1013
#define IDC_EMUDIRSEL 1014
#define IDC_UPDATE 1015
#define IDC_KMLSCRIPT 1016
#define IDC_AUTHOR 1017
#define IDC_TITLE 1018
#define IDC_KMLLOG 1019
#define IDC_VERSION 1020
#define IDC_LICENSE 1021
#define IDC_DISASM_WIN 1022
#define IDC_DISASM_MAP 1023
#define IDC_DISASM_ROM 1024
#define IDC_DISASM_RAM 1025
#define IDC_DISASM_PORT1 1026
#define IDC_DISASM_PORT2 1027
#define IDC_DISASM_MODULE 1028
#define IDC_DISASM_HP 1029
#define IDC_DISASM_CLASS 1030
#define IDC_ADDRESS 1031
#define IDC_DISASM_ADR 1032
#define IDC_DISASM_NEXT 1033
#define IDC_DISASM_COPY 1034
#define IDC_DEBUG_CODE 1035
#define IDC_STATIC_CODE 1036
#define IDC_STATIC_REGISTERS 1037
#define IDC_STATIC_MEMORY 1038
#define IDC_STATIC_STACK 1039
#define IDC_REG_A 1040
#define IDC_REG_B 1041
#define IDC_REG_C 1042
#define IDC_REG_D 1043
#define IDC_REG_R0 1044
#define IDC_REG_R1 1045
#define IDC_REG_R2 1046
#define IDC_REG_R3 1047
#define IDC_REG_R4 1048
#define IDC_REG_D0 1049
#define IDC_REG_D1 1050
#define IDC_REG_P 1051
#define IDC_REG_PC 1052
#define IDC_REG_OUT 1053
#define IDC_REG_IN 1054
#define IDC_REG_ST 1055
#define IDC_REG_CY 1056
#define IDC_REG_MODE 1057
#define IDC_REG_MP 1058
#define IDC_REG_SR 1059
#define IDC_REG_SB 1060
#define IDC_REG_XM 1061
#define IDC_MISC_INT 1062
#define IDC_MISC_KEY 1063
#define IDC_MISC_BS 1064
#define IDC_NEWVALUE 1065
#define IDC_ENTERADR 1066
#define IDC_DEBUG_MEM 1067
#define IDC_DEBUG_MEM_ADDR 1068
#define IDC_DEBUG_MEM_COL0 1069
#define IDC_DEBUG_MEM_COL1 1070
#define IDC_DEBUG_MEM_COL2 1071
#define IDC_DEBUG_MEM_COL3 1072
#define IDC_DEBUG_MEM_COL4 1073
#define IDC_DEBUG_MEM_COL5 1074
#define IDC_DEBUG_MEM_COL6 1075
#define IDC_DEBUG_MEM_COL7 1076
#define IDC_DEBUG_MEM_TEXT 1077
#define IDC_DEBUG_STACK 1078
#define IDC_STATIC_BREAKPOINT 1079
#define IDC_BREAKEDIT_ADD 1080
#define IDC_BREAKEDIT_DELETE 1081
#define IDC_BREAKEDIT_WND 1082
#define IDC_STATIC_MMU 1083
#define IDC_MMU_IO_A 1084
#define IDC_MMU_NCE2_A 1085
#define IDC_MMU_CE1_A 1086
#define IDC_MMU_CE2_A 1087
#define IDC_MMU_NCE3_A 1088
#define IDC_MMU_IO_S 1089
#define IDC_MMU_CE1_S 1090
#define IDC_MMU_CE2_S 1091
#define IDC_MMU_NCE2_S 1092
#define IDC_MMU_NCE3_S 1093
#define IDC_STATIC_MISC 1094
#define IDC_MISC_BS_TXT 1095
#define IDC_INSTR_TEXT 1096
#define IDC_INSTR_CODE 1097
#define IDC_INSTR_COPY 1098
#define IDC_INSTR_CLEAR 1099
#define IDC_PROFILE_LASTCYCLES 1100
#define IDC_PROFILE_LASTTIME 1101
#define IDC_BPCODE 1102
#define IDC_BPRPL 1103
#define IDC_BPACCESS 1104
#define IDC_BPREAD 1105
#define IDC_BPWRITE 1106
#define IDC_FIND_DATA 1107
#define IDC_FIND_ASCII 1108
#define IDC_FIND_CASE 1109
#define IDC_ADDR20_24 1110
#define IDC_ADDR25_27 1111
#define IDC_ADDR28_29 1112
#define IDC_ADDR30_34 1113
#define IDC_MACRO_SLOW 1114
#define IDC_MACRO_FAST 1115
#define IDC_MACRO_SLIDER 1116
#define IDC_MACRO_REAL 1117
#define IDC_MACRO_MANUAL 1118
#define ID_FILE_NEW 40001
#define ID_FILE_OPEN 40002
#define ID_FILE_SAVE 40003
@ -211,7 +212,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 123
#define _APS_NEXT_COMMAND_VALUE 40062
#define _APS_NEXT_CONTROL_VALUE 1118
#define _APS_NEXT_CONTROL_VALUE 1119
#define _APS_NEXT_SYMED_VALUE 108
#endif
#endif

View file

@ -152,6 +152,7 @@ VOID ReadSettings(VOID)
disassembler_mode = ReadInt(_T("Disassembler"),_T("Mnemonics"),disassembler_mode);
// Emulator
bRealSpeed = ReadInt(_T("Emulator"),_T("RealSpeed"),bRealSpeed);
bGrayscale = ReadInt(_T("Emulator"),_T("Grayscale"),bGrayscale);
dwSXCycles = ReadInt(_T("Emulator"),_T("SXCycles"),dwSXCycles);
dwGXCycles = ReadInt(_T("Emulator"),_T("GXCycles"),dwGXCycles);
SetSpeed(bRealSpeed); // set speed
@ -184,6 +185,7 @@ VOID WriteSettings(VOID)
WriteInt(_T("Disassembler"),_T("Mnemonics"),disassembler_mode);
// Emulator
WriteInt(_T("Emulator"),_T("RealSpeed"),bRealSpeed);
WriteInt(_T("Emulator"),_T("Grayscale"),bGrayscale);
WriteInt(_T("Emulator"),_T("SXCycles"),dwSXCycles);
WriteInt(_T("Emulator"),_T("GXCycles"),dwGXCycles);
// Macro

View file

@ -232,46 +232,48 @@ BEGIN
ES_READONLY
END
IDD_SETTINGS DIALOG DISCARDABLE 0, 0, 167, 217
IDD_SETTINGS DIALOG DISCARDABLE 0, 0, 167, 229
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Settings"
FONT 8, "MS Sans Serif"
BEGIN
CONTROL "Authentic Calculator Speed",IDC_REALSPEED,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,13,13,100,10
CONTROL "Enable Virtual LCD Delay",IDC_GRAYSCALE,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,25,100,10
CONTROL "Automatically Save Files",IDC_AUTOSAVE,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,13,25,89,10
BS_AUTOCHECKBOX | WS_TABSTOP,13,37,89,10
CONTROL "Automatically Save Files On Exit",IDC_AUTOSAVEONEXIT,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,37,114,10
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,49,114,10
CONTROL "Show Load Object Warning",IDC_OBJECTLOADWARNING,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,13,49,102,10
BS_AUTOCHECKBOX | WS_TABSTOP,13,61,102,10
CONTROL "Always Show KML Compilation Result",IDC_ALWAYSDISPLOG,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,61,133,10
GROUPBOX "General",IDC_STATIC,7,4,153,71
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,73,133,10
GROUPBOX "General",IDC_STATIC,7,4,153,83
CONTROL "HP Mnemonics",IDC_DISASM_HP,"Button",BS_AUTORADIOBUTTON |
WS_GROUP | WS_TABSTOP,13,89,65,11
WS_GROUP | WS_TABSTOP,13,101,65,11
CONTROL "Class Mnemonics",IDC_DISASM_CLASS,"Button",
BS_AUTORADIOBUTTON,84,89,70,11
GROUPBOX "Disassembler",IDC_STATIC,7,78,153,28
BS_AUTORADIOBUTTON,84,101,70,11
GROUPBOX "Disassembler",IDC_STATIC,7,90,153,28
CONTROL "Port 1 is Plugged",IDC_PORT1EN,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,13,119,67,10
WS_TABSTOP,13,131,67,10
CONTROL "Port 1 is Writeable",IDC_PORT1WR,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,84,119,69,10
BS_AUTOCHECKBOX | WS_TABSTOP,84,131,69,10
CONTROL "Port 2 is Shared",IDC_PORT2ISSHARED,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,13,131,65,10
LTEXT "Port 2 File :",IDC_STATIC,13,147,37,8
EDITTEXT IDC_PORT2,51,144,94,12,ES_AUTOHSCROLL
PUSHBUTTON "...",IDC_PORT2LOAD,145,144,10,12
GROUPBOX "Memory Cards",IDC_STATIC,7,110,153,51
LTEXT "Wire:",IDC_STATIC,13,176,17,8
COMBOBOX IDC_WIRE,31,174,48,42,CBS_DROPDOWNLIST | WS_VSCROLL |
BS_AUTOCHECKBOX | WS_TABSTOP,13,143,65,10
LTEXT "Port 2 File :",IDC_STATIC,13,159,37,8
EDITTEXT IDC_PORT2,51,156,94,12,ES_AUTOHSCROLL
PUSHBUTTON "...",IDC_PORT2LOAD,145,156,10,12
GROUPBOX "Memory Cards",IDC_STATIC,7,122,153,51
LTEXT "Wire:",IDC_STATIC,13,188,17,8
COMBOBOX IDC_WIRE,31,186,48,42,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
LTEXT "IR:",IDC_STATIC,89,176,9,8
COMBOBOX IDC_IR,107,174,48,43,CBS_DROPDOWNLIST | WS_VSCROLL |
LTEXT "IR:",IDC_STATIC,89,188,9,8
COMBOBOX IDC_IR,107,186,48,43,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
GROUPBOX "Serial Ports",IDC_STATIC,7,164,153,27
DEFPUSHBUTTON "&Ok",IDOK,9,196,50,14
PUSHBUTTON "&Cancel",IDCANCEL,107,196,50,14
GROUPBOX "Serial Ports",IDC_STATIC,7,176,153,27
DEFPUSHBUTTON "&Ok",IDOK,9,208,50,14
PUSHBUTTON "&Cancel",IDCANCEL,107,208,50,14
END
IDD_CHOOSEKML DIALOG DISCARDABLE 0, 0, 195, 66

View file

@ -24,6 +24,14 @@ mingw-runtime-3.3.tar.gz
binutils-2.15.90-20040222-1.tar.gz
gcc-core-3.4.1-20040711-1.tar.gz
or
MinGW-3.1.0-1.exe
w32api-3.3.tar.gz
mingw-runtime-3.8.tar.gz
binutils-2.15.94-20050118-1.tar.gz
gcc-core-3.4.4-20050522-1.tar.gz
Older versions of the MinGW package might not work, because there are several
bug fixes, especially in the header files, made in the last time.
@ -35,4 +43,4 @@ Many thanks to Pedro A. Arranda Guti
compatible.
06/13/05 (c) by Christoph Gießelink
08/22/05 (c) by Christoph Gießelink

Binary file not shown.