2020-09-30: Updated to version 1.63

Signed-off-by: Gwenhael Le Moine <gwenhael.le.moine@gmail.com>
This commit is contained in:
Gwenhael Le Moine 2024-03-19 23:35:30 +01:00
parent a6d5624a8b
commit 523b8ba30d
No known key found for this signature in database
GPG key ID: FDFE3669426707A7
23 changed files with 2993 additions and 2957 deletions

BIN
Emu48.exe

Binary file not shown.

View file

@ -399,15 +399,10 @@ h3 { color:red; font-size:1.1em; }
output obsolete. The new sound engine emulates the behaviour of the output obsolete. The new sound engine emulates the behaviour of the
beeper output ports and only work in connection with a sound card. beeper output ports and only work in connection with a sound card.
Using the legacy PC speaker mode isn't possible any more. The old Using the legacy PC speaker mode isn't possible any more. The old
beeper method with a ROM patch is still working but deprecated, it's beeper method with a ROM patch has been removed, so you have to remove
strongly recommended to remove all beep patches from your current KML the ROM beep patches from your KML scripts. Actually the program
scripts to enable the new sound engine. The support of the old sound informs you when detecting ROM beep patches by opening the &quot;KML
implementation by a ROM patch maybe removed in later versions of the Script Compilation Result&quot; dialog reporting an error.
emulator and remaining beep patches will corrupt the ROM with an
illegal opcode then. Actually the program informs you when
detecting ROM beep patches by opening the &quot;KML Script Compilation
Result&quot; dialog. To prevent this, remove the ROM beep patches
from the KML script.
</p> </p>
<p>For the sound generation the calculator must know his own CPU strobe <p>For the sound generation the calculator must know his own CPU strobe
frequency. On the real calculator the speed depends on various settings frequency. On the real calculator the speed depends on various settings
@ -601,7 +596,7 @@ h3 { color:red; font-size:1.1em; }
</table> </table>
<h1><a name=s14>14. License</a></h1> <h1><a name=s14>14. License</a></h1>
<p>Emu48 - A HP38G/39G/40G/48SX/48GX/49G Emulator<br> <p>Emu48 - A HP38G/39G/40G/48SX/48GX/49G Emulator<br>
Copyright (C) 2019 Christoph Gie&szlig;elink</p> Copyright (C) 2020 Christoph Gie&szlig;elink</p>
<p>This program is free software; you can redistribute it and/or modify it <p>This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option) Software Foundation; either version 2 of the License, or (at your option)

View file

@ -1,4 +1,4 @@
Known bugs and restrictions of Emu48 V1.62 Known bugs and restrictions of Emu48 V1.63
------------------------------------------ ------------------------------------------
- the following I/O bits aren't emulated (incomplete) - the following I/O bits aren't emulated (incomplete)
@ -47,4 +47,4 @@ Known bugs and restrictions of Emu48 V1.62
- quitting the emulator while programming the flash isn't allowed, - quitting the emulator while programming the flash isn't allowed,
because the content of flash state machine isn't saved so far because the content of flash state machine isn't saved so far
10/15/19 (c) by Christoph Gießelink, c dot giesselink at gmx dot de 09/22/20 (c) by Christoph Gießelink, c dot giesselink at gmx dot de

View file

@ -1,3 +1,70 @@
Service Pack 63 for Emu48 Version 1.0
DISPLAY.C
- changed function UpdateAnnunciators(), changed function prototype
with an additional argument to get information which annunciators
have changed, so only the annunciators which have changed are
redrawn now
EMU48.C
- changed function OnPaint(), changed call of function
UpdateAnnunciators() updating all annunciators
EMU48.DSP
- removed external.c sources
EMU48.H
- removed DISP_ANNUN definition
- changed function prototype
- removed extern declaration of global functions
EMU48.RC
- changed version and copyright
ENGINE.C
- changed function CheckDisp(), removed assertion with DISP_ANNUN
definition
- changed function WorkerThread(), changed call of function
UpdateAnnunciators() updating all annunciators
EXTERNAL.C
- file deleted
FETCH.C
- changed table o81B_, replaced beep patch opcode o81B1 by
o_invalid4
FILES.C
- changed function OpenDocument(), when KML script file name is
longer than the file buffer, skip the name heading until the name
remainder fits into the buffer, this cause a KML script error with
the selection of a new KML script instead of a general document
file read error before
KML.C
- changed function InitKML(), changed warning to error at ROM beep
patch detection
LODEPNG.C
- changed implementation file to LodePNG version 20200306 with
unmarked typecast patches for x64 compatibility, Copyright (c)
2005-2020 Lode Vandevenne
LODEPNG.H
- changed header file to LodePNG version 20200306
MOPS.C
- changed function WriteIO(), the annunciator access variable now
contain bit coded the annunciators which have changed and is the
argument for the modified UpdateAnnunciators() function
OPCODES.C
- removed function o81B1() as part of the beep patch
OPCODES.H
- removed extern declaration of function o81B1()
Service Pack 62 for Emu48 Version 1.0 Service Pack 62 for Emu48 Version 1.0
DEBUGGER.C DEBUGGER.C

View file

@ -850,21 +850,26 @@ VOID WriteToMenuDisplay(LPBYTE a, DWORD d, UINT s)
return; return;
} }
VOID UpdateAnnunciators(VOID) VOID UpdateAnnunciators(DWORD dwUpdateMask)
{ {
BYTE c; BYTE c;
UINT i;
c = (BYTE)(Chipset.IORam[ANNCTRL] | (Chipset.IORam[ANNCTRL+1]<<4)); c = (BYTE)(Chipset.IORam[ANNCTRL] | (Chipset.IORam[ANNCTRL+1]<<4));
// switch annunciators off if timer stopped // switch annunciators off if timer stopped
if ((c & AON) == 0 || (Chipset.IORam[TIMER2_CTRL] & RUN) == 0) if ((c & AON) == 0 || (Chipset.IORam[TIMER2_CTRL] & RUN) == 0)
c = 0; c = 0;
DrawAnnunciator(1,c&LA1); for (i = 1; i <= 6; ++i)
DrawAnnunciator(2,c&LA2); {
DrawAnnunciator(3,c&LA3); if ((dwUpdateMask & 0x1) != 0) // annunciator changed?
DrawAnnunciator(4,c&LA4); {
DrawAnnunciator(5,c&LA5); DrawAnnunciator(i,c & 0x1);
DrawAnnunciator(6,c&LA6); }
dwUpdateMask >>= 1;
c >>= 1;
}
_ASSERT(dwUpdateMask == 0);
return; return;
} }

View file

@ -13,7 +13,7 @@
#include "kml.h" #include "kml.h"
#include "debugger.h" #include "debugger.h"
#define VERSION "1.62" #define VERSION "1.63"
#ifdef _DEBUG #ifdef _DEBUG
LPCTSTR szNoTitle = _T("Emu48 ")_T(VERSION)_T(" Debug"); LPCTSTR szNoTitle = _T("Emu48 ")_T(VERSION)_T(" Debug");
@ -898,7 +898,7 @@ static LRESULT OnPaint(HWND hWindow)
GdiFlush(); GdiFlush();
} }
LeaveCriticalSection(&csGDILock); LeaveCriticalSection(&csGDILock);
UpdateAnnunciators(); UpdateAnnunciators(0x3F);
RefreshButtons(&rcMainPaint); RefreshButtons(&rcMainPaint);
} }
EndPaint(hWindow, &Paint); EndPaint(hWindow, &Paint);

View file

@ -191,10 +191,6 @@ SOURCE=.\engine.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\external.c
# End Source File
# Begin Source File
SOURCE=.\fetch.c SOURCE=.\fetch.c
# End Source File # End Source File
# Begin Source File # Begin Source File

View file

@ -54,7 +54,6 @@
#define DISP_POINTER 0x01 // defines for display area #define DISP_POINTER 0x01 // defines for display area
#define DISP_MAIN 0x02 #define DISP_MAIN 0x02
#define DISP_MENUE 0x04 #define DISP_MENUE 0x04
#define DISP_ANNUN 0x08
#define ROMPAGESIZE (1<<12) // ROM dirty page size in nibbles #define ROMPAGESIZE (1<<12) // ROM dirty page size in nibbles
@ -182,7 +181,7 @@ extern VOID UpdateMainDisplay(VOID);
extern VOID UpdateMenuDisplay(VOID); extern VOID UpdateMenuDisplay(VOID);
extern VOID WriteToMainDisplay(LPBYTE a, DWORD d, UINT s); extern VOID WriteToMainDisplay(LPBYTE a, DWORD d, UINT s);
extern VOID WriteToMenuDisplay(LPBYTE a, DWORD d, UINT s); extern VOID WriteToMenuDisplay(LPBYTE a, DWORD d, UINT s);
extern VOID UpdateAnnunciators(VOID); extern VOID UpdateAnnunciators(DWORD dwUpdateMask);
extern VOID ResizeWindow(VOID); extern VOID ResizeWindow(VOID);
// Engine.c // Engine.c
@ -369,10 +368,6 @@ extern DWORD RPL_Pick(UINT l);
extern VOID RPL_Replace(DWORD n); extern VOID RPL_Replace(DWORD n);
extern VOID RPL_Push(UINT l,DWORD n); extern VOID RPL_Push(UINT l,DWORD n);
// External.c
extern VOID External(CHIPSET* w);
extern VOID RCKBp(CHIPSET* w);
// SndEnum.c // SndEnum.c
extern VOID SetSoundDeviceList(HWND hWnd,UINT uDeviceID); extern VOID SetSoundDeviceList(HWND hWnd,UINT uDeviceID);

View file

@ -303,7 +303,7 @@ FONT 8, "MS Sans Serif"
BEGIN BEGIN
ICON IDI_EMU48,IDC_STATIC,7,6,20,20,SS_REALSIZEIMAGE ICON IDI_EMU48,IDC_STATIC,7,6,20,20,SS_REALSIZEIMAGE
LTEXT "",IDC_VERSION,29,6,151,8,NOT WS_GROUP LTEXT "",IDC_VERSION,29,6,151,8,NOT WS_GROUP
LTEXT "Copyright © 2019 Christoph Gießelink && Sébastien Carlier", LTEXT "Copyright © 2020 Christoph Gießelink && Sébastien Carlier",
IDC_STATIC,29,18,181,8 IDC_STATIC,29,18,181,8
DEFPUSHBUTTON "OK",IDOK,215,12,39,14 DEFPUSHBUTTON "OK",IDOK,215,12,39,14
EDITTEXT IDC_LICENSE,7,33,247,112,ES_MULTILINE | ES_AUTOHSCROLL | EDITTEXT IDC_LICENSE,7,33,247,112,ES_MULTILINE | ES_AUTOHSCROLL |
@ -723,8 +723,8 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,6,2,0 FILEVERSION 1,6,3,0
PRODUCTVERSION 1,6,2,0 PRODUCTVERSION 1,6,3,0
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -741,12 +741,12 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "Christoph Gießelink & Sebastien Carlier\0" VALUE "CompanyName", "Christoph Gießelink & Sebastien Carlier\0"
VALUE "FileDescription", "HP38/39/40/48/49 Emulator\0" VALUE "FileDescription", "HP38/39/40/48/49 Emulator\0"
VALUE "FileVersion", "1, 6, 2, 0\0" VALUE "FileVersion", "1, 6, 3, 0\0"
VALUE "InternalName", "Emu48\0" VALUE "InternalName", "Emu48\0"
VALUE "LegalCopyright", "Copyright © 2019\0" VALUE "LegalCopyright", "Copyright © 2020\0"
VALUE "OriginalFilename", "Emu48.exe\0" VALUE "OriginalFilename", "Emu48.exe\0"
VALUE "ProductName", "Emu48\0" VALUE "ProductName", "Emu48\0"
VALUE "ProductVersion", "1, 6, 2, 0\0" VALUE "ProductVersion", "1, 6, 3, 0\0"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View file

@ -281,7 +281,6 @@ static __inline VOID CheckDisp(BOOL bSync)
_ASSERT((disp & DISP_POINTER) == 0); // display pointer already updated _ASSERT((disp & DISP_POINTER) == 0); // display pointer already updated
if (disp & DISP_MAIN) UpdateMainDisplay(); if (disp & DISP_MAIN) UpdateMainDisplay();
if (disp & DISP_MENUE) UpdateMenuDisplay(); if (disp & DISP_MENUE) UpdateMenuDisplay();
_ASSERT((disp & DISP_ANNUN) == 0); // annunciators already updated
disp = 0; // display updated disp = 0; // display updated
return; return;
} }
@ -568,7 +567,7 @@ loop:
UpdateDisplayPointers(); UpdateDisplayPointers();
UpdateMainDisplay(); UpdateMainDisplay();
UpdateMenuDisplay(); UpdateMenuDisplay();
UpdateAnnunciators(); UpdateAnnunciators(0x3F);
// init speed reference // init speed reference
dwOldCyc = (DWORD) (Chipset.cycles & 0xFFFFFFFF); dwOldCyc = (DWORD) (Chipset.cycles & 0xFFFFFFFF);
QueryPerformanceCounter(&lDummyInt); QueryPerformanceCounter(&lDummyInt);

View file

@ -1,99 +0,0 @@
/*
* external.c
*
* This file is part of Emu48
*
* Copyright (C) 1995 Sebastien Carlier
* Copyright (C) 2005 Christoph Gießelink
*
*/
#include "pch.h"
#include "Emu48.h"
#include "ops.h"
//| 38G | 39G | 40G | 48SX | 48GX | 49G | Name
//#F0E4F #80F0F #80F0F #706D2 #80850 #80F0F =SFLAG53_56
// memory address for flags -53 to -56
#define SFLAG53_56 ( (cCurrentRomType=='6') \
? 0xE0E4F \
: ( (cCurrentRomType=='A') \
? 0xF0E4F \
: ( (cCurrentRomType!='E' && cCurrentRomType!='X') \
? ( (cCurrentRomType=='S') \
? 0x706D2 \
: 0x80850 \
) \
: 0x80F0F \
) \
) \
)
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)
SoundBeep(freq,dur); // beeping
// estimate cpu cycles for beeping time (2MHz / 4MHz)
w->cycles += dur * ((cCurrentRomType=='S') ? 2000 : 4000);
// original routine return with...
w->P = 0; // P=0
w->intk = TRUE; // INTON
w->carry = FALSE; // RTNCC
}
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
SoundBeep(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;
}

View file

@ -321,7 +321,7 @@ static JMPTAB o8A_[] =
static JMPTAB o81B_[] = static JMPTAB o81B_[] =
{ {
(LPCVOID) o_invalid4, F, (LPCVOID) o_invalid4, F,
(LPCVOID) o81B1, F, // normally o_invalid4, beep patch (LPCVOID) o_invalid4, F,
(LPCVOID) o81B2, F, (LPCVOID) o81B2, F,
(LPCVOID) o81B3, F, (LPCVOID) o81B3, F,
(LPCVOID) o81B4, F, (LPCVOID) o81B4, F,

View file

@ -1011,8 +1011,16 @@ BOOL OpenDocument(LPCTSTR szFilename)
case 0xFE: // Win48 2.1 / Emu4x 0.99.x format case 0xFE: // Win48 2.1 / Emu4x 0.99.x format
// read length of KML script name // read length of KML script name
ReadFile(hFile,&nLength,sizeof(nLength),&lBytesRead,NULL); ReadFile(hFile,&nLength,sizeof(nLength),&lBytesRead,NULL);
// KML script name too long for file buffer // KML script name too long for file buffer
if (nLength >= ARRAYSIZEOF(szCurrentKml)) goto read_err; if (nLength >= ARRAYSIZEOF(szCurrentKml))
{
// skip heading KML script name characters until remainder fits into file buffer
UINT nSkip = nLength - (ARRAYSIZEOF(szCurrentKml) - 1);
SetFilePointer(hFile, nSkip, NULL, FILE_CURRENT);
nLength = ARRAYSIZEOF(szCurrentKml) - 1;
}
#if defined _UNICODE #if defined _UNICODE
{ {
LPSTR szTmp = (LPSTR) malloc(nLength); LPSTR szTmp = (LPSTR) malloc(nLength);

View file

@ -2630,9 +2630,8 @@ BOOL InitKML(LPCTSTR szFilename, BOOL bNoLog)
} }
if (CheckForBeepPatch()) // check if ROM contain beep patches if (CheckForBeepPatch()) // check if ROM contain beep patches
{ {
AddToLog(_T("Warning, ROM beep patch detected. Remove beep patches please.")); AddToLog(_T("Error, ROM beep patch detected. Remove beep patches please."));
bNoLog = FALSE; goto quit;
bAlwaysDisplayLog = TRUE;
} }
ResizeMainBitmap(nScaleMul,nScaleDiv); // resize main picture ResizeMainBitmap(nScaleMul,nScaleDiv); // resize main picture

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
/* /*
LodePNG version 20190914 LodePNG version 20200306
Copyright (c) 2005-2019 Lode Vandevenne Copyright (c) 2005-2020 Lode Vandevenne
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -335,17 +335,19 @@ typedef struct LodePNGColorMode {
palette (PLTE and tRNS) palette (PLTE and tRNS)
Dynamically allocated with the colors of the palette, including alpha. Dynamically allocated with the colors of the palette, including alpha.
When encoding a PNG, to store your colors in the palette of the LodePNGColorMode, first use This field may not be allocated directly, use lodepng_color_mode_init first,
lodepng_palette_clear, then for each color use lodepng_palette_add. then lodepng_palette_add per color to correctly initialize it (to ensure size
If you encode an image without alpha with palette, don't forget to put value 255 in each A byte of the palette. of exactly 1024 bytes).
The alpha channels must be set as well, set them to 255 for opaque images.
When decoding, by default you can ignore this palette, since LodePNG already When decoding, by default you can ignore this palette, since LodePNG already
fills the palette colors in the pixels of the raw RGBA output. fills the palette colors in the pixels of the raw RGBA output.
The palette is only supported for color type 3. The palette is only supported for color type 3.
*/ */
unsigned char* palette; /*palette in RGBARGBA... order. When allocated, must be either 0, or have size 1024*/ unsigned char* palette; /*palette in RGBARGBA... order. Must be either 0, or when allocated must have 1024 bytes*/
size_t palettesize; /*palette size in number of colors (amount of bytes is 4 * palettesize)*/ size_t palettesize; /*palette size in number of colors (amount of used bytes is 4 * palettesize)*/
/* /*
transparent color key (tRNS) transparent color key (tRNS)
@ -691,20 +693,11 @@ typedef struct LodePNGColorStats {
void lodepng_color_stats_init(LodePNGColorStats* stats); void lodepng_color_stats_init(LodePNGColorStats* stats);
/*Get a LodePNGColorStats of the image. The stats must already have been inited.*/ /*Get a LodePNGColorStats of the image. The stats must already have been inited.
void lodepng_compute_color_stats(LodePNGColorStats* stats, Returns error code (e.g. alloc fail) or 0 if ok.*/
unsigned lodepng_compute_color_stats(LodePNGColorStats* stats,
const unsigned char* image, unsigned w, unsigned h, const unsigned char* image, unsigned w, unsigned h,
const LodePNGColorMode* mode_in); const LodePNGColorMode* mode_in);
/*Computes a minimal PNG color model that can contain all colors as indicated by the stats and it settings.
The stats should be computed with lodepng_compute_color_stats.
mode_in is raw color profile of the image the stats were computed on, to copy palette order from when relevant.
Minimal PNG color model means the color type and bit depth that gives smallest amount of bits in the output image,
e.g. gray if only grayscale pixels, palette if less than 256 colors, color key if only single transparent color, ...
LodePNG uses this function internally if auto_convert is enabled (it is by default).
*/
unsigned lodepng_auto_choose_color(LodePNGColorMode* mode_out,
const LodePNGColorMode* mode_in,
const LodePNGColorMode* stats);
/*Settings for the encoder.*/ /*Settings for the encoder.*/
typedef struct LodePNGEncoderSettings { typedef struct LodePNGEncoderSettings {
@ -753,10 +746,6 @@ typedef struct LodePNGState {
LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/ LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/
LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/ LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/
unsigned error; unsigned error;
#ifdef LODEPNG_COMPILE_CPP
/* For the lodepng::State subclass. */
virtual ~LodePNGState(){}
#endif
} LodePNGState; } LodePNGState;
/*init, cleanup and copy functions to use with this struct*/ /*init, cleanup and copy functions to use with this struct*/
@ -868,32 +857,32 @@ Input must be at the beginning of a chunk (result of a previous lodepng_chunk_ne
or the 8th byte of a PNG file which always has the first chunk), or alternatively may or the 8th byte of a PNG file which always has the first chunk), or alternatively may
point to the first byte of the PNG file (which is not a chunk but the magic header, the point to the first byte of the PNG file (which is not a chunk but the magic header, the
function will then skip over it and return the first real chunk). function will then skip over it and return the first real chunk).
Expects at least 8 readable bytes of memory in the input pointer. Will output pointer to the start of the next chunk, or at or beyond end of the file if there
Will output pointer to the start of the next chunk or the end of the file if there is no more chunk after this or possibly if the chunk is corrupt.
is no more chunk after this. Start this process at the 8th byte of the PNG file. Start this process at the 8th byte of the PNG file.
In a non-corrupt PNG file, the last chunk should have name "IEND". In a non-corrupt PNG file, the last chunk should have name "IEND".
*/ */
unsigned char* lodepng_chunk_next(unsigned char* chunk); unsigned char* lodepng_chunk_next(unsigned char* chunk, unsigned char* end);
const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk); const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk, const unsigned char* end);
/*Finds the first chunk with the given type in the range [chunk, end), or returns NULL if not found.*/ /*Finds the first chunk with the given type in the range [chunk, end), or returns NULL if not found.*/
unsigned char* lodepng_chunk_find(unsigned char* chunk, const unsigned char* end, const char type[5]); unsigned char* lodepng_chunk_find(unsigned char* chunk, unsigned char* end, const char type[5]);
const unsigned char* lodepng_chunk_find_const(const unsigned char* chunk, const unsigned char* end, const char type[5]); const unsigned char* lodepng_chunk_find_const(const unsigned char* chunk, const unsigned char* end, const char type[5]);
/* /*
Appends chunk to the data in out. The given chunk should already have its chunk header. Appends chunk to the data in out. The given chunk should already have its chunk header.
The out variable and outlength are updated to reflect the new reallocated buffer. The out variable and outsize are updated to reflect the new reallocated buffer.
Returns error code (0 if it went ok) Returns error code (0 if it went ok)
*/ */
unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk); unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk);
/* /*
Appends new chunk to out. The chunk to append is given by giving its length, type Appends new chunk to out. The chunk to append is given by giving its length, type
and data separately. The type is a 4-letter string. and data separately. The type is a 4-letter string.
The out variable and outlength are updated to reflect the new reallocated buffer. The out variable and outsize are updated to reflect the new reallocated buffer.
Returne error code (0 if it went ok) Returne error code (0 if it went ok)
*/ */
unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, unsigned length,
const char* type, const unsigned char* data); const char* type, const unsigned char* data);
@ -983,7 +972,7 @@ class State : public LodePNGState {
public: public:
State(); State();
State(const State& other); State(const State& other);
virtual ~State(); ~State();
State& operator=(const State& other); State& operator=(const State& other);
}; };
@ -1065,8 +1054,7 @@ TODO:
[ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes [ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes
[ ] allow user to provide custom color conversion functions, e.g. for premultiplied alpha, padding bits or not, ... [ ] allow user to provide custom color conversion functions, e.g. for premultiplied alpha, padding bits or not, ...
[ ] allow user to give data (void*) to custom allocator [ ] allow user to give data (void*) to custom allocator
[ ] provide alternatives for C library functions not present on some platforms (memcpy, ...) [X] provide alternatives for C library functions not present on some platforms (memcpy, ...)
[ ] rename "grey" to "gray" everywhere since "color" also uses US spelling (keep "grey" copies for backwards compatibility)
*/ */
#endif /*LODEPNG_H inclusion guard*/ #endif /*LODEPNG_H inclusion guard*/
@ -1582,12 +1570,12 @@ Iterate to the next chunk. This works if you have a buffer with consecutive chun
functions do no boundary checking of the allocated data whatsoever, so make sure there is enough functions do no boundary checking of the allocated data whatsoever, so make sure there is enough
data available in the buffer to be able to go to the next chunk. data available in the buffer to be able to go to the next chunk.
unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk): unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk):
unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, unsigned length,
const char* type, const unsigned char* data): const char* type, const unsigned char* data):
These functions are used to create new chunks that are appended to the data in *out that has These functions are used to create new chunks that are appended to the data in *out that has
length *outlength. The append function appends an existing chunk to the new data. The create length *outsize. The append function appends an existing chunk to the new data. The create
function creates a new chunk with the given parameters and appends it. Type is the 4-letter function creates a new chunk with the given parameters and appends it. Type is the 4-letter
name of the chunk. name of the chunk.
@ -1787,14 +1775,18 @@ symbol.
Not all changes are listed here, the commit history in github lists more: Not all changes are listed here, the commit history in github lists more:
https://github.com/lvandeve/lodepng https://github.com/lvandeve/lodepng
*) 06 mar 2020: simplified some of the dynamic memory allocations.
*) 12 jan 2020: (!) added 'end' argument to lodepng_chunk_next to allow correct
overflow checks.
*) 14 aug 2019: around 25% faster decoding thanks to huffman lookup tables. *) 14 aug 2019: around 25% faster decoding thanks to huffman lookup tables.
*) 15 jun 2019 (!): auto_choose_color API changed (for bugfix: don't use palette *) 15 jun 2019: (!) auto_choose_color API changed (for bugfix: don't use palette
if gray ICC profile) and non-ICC LodePNGColorProfile renamed to LodePNGColorStats. if gray ICC profile) and non-ICC LodePNGColorProfile renamed to
LodePNGColorStats.
*) 30 dec 2018: code style changes only: removed newlines before opening braces. *) 30 dec 2018: code style changes only: removed newlines before opening braces.
*) 10 sep 2018: added way to inspect metadata chunks without full decoding. *) 10 sep 2018: added way to inspect metadata chunks without full decoding.
*) 19 aug 2018 (!): fixed color mode bKGD is encoded with and made it use *) 19 aug 2018: (!) fixed color mode bKGD is encoded with and made it use
palette index in case of palette. palette index in case of palette.
*) 10 aug 2018 (!): added support for gAMA, cHRM, sRGB and iCCP chunks. This *) 10 aug 2018: (!) added support for gAMA, cHRM, sRGB and iCCP chunks. This
change is backwards compatible unless you relied on unknown_chunks for those. change is backwards compatible unless you relied on unknown_chunks for those.
*) 11 jun 2018: less restrictive check for pixel size integer overflow *) 11 jun 2018: less restrictive check for pixel size integer overflow
*) 14 jan 2018: allow optionally ignoring a few more recoverable errors *) 14 jan 2018: allow optionally ignoring a few more recoverable errors
@ -1814,25 +1806,25 @@ https://github.com/lvandeve/lodepng
*) 22 dec 2013: Power of two windowsize required for optimization. *) 22 dec 2013: Power of two windowsize required for optimization.
*) 15 apr 2013: Fixed bug with LAC_ALPHA and color key. *) 15 apr 2013: Fixed bug with LAC_ALPHA and color key.
*) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png). *) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png).
*) 11 mar 2013 (!): Bugfix with custom free. Changed from "my" to "lodepng_" *) 11 mar 2013: (!) Bugfix with custom free. Changed from "my" to "lodepng_"
prefix for the custom allocators and made it possible with a new #define to prefix for the custom allocators and made it possible with a new #define to
use custom ones in your project without needing to change lodepng's code. use custom ones in your project without needing to change lodepng's code.
*) 28 jan 2013: Bugfix with color key. *) 28 jan 2013: Bugfix with color key.
*) 27 okt 2012: Tweaks in text chunk keyword length error handling. *) 27 okt 2012: Tweaks in text chunk keyword length error handling.
*) 8 okt 2012 (!): Added new filter strategy (entropy) and new auto color mode. *) 8 okt 2012: (!) Added new filter strategy (entropy) and new auto color mode.
(no palette). Better deflate tree encoding. New compression tweak settings. (no palette). Better deflate tree encoding. New compression tweak settings.
Faster color conversions while decoding. Some internal cleanups. Faster color conversions while decoding. Some internal cleanups.
*) 23 sep 2012: Reduced warnings in Visual Studio a little bit. *) 23 sep 2012: Reduced warnings in Visual Studio a little bit.
*) 1 sep 2012 (!): Removed #define's for giving custom (de)compression functions *) 1 sep 2012: (!) Removed #define's for giving custom (de)compression functions
and made it work with function pointers instead. and made it work with function pointers instead.
*) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc *) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc
and free functions and toggle #defines from compiler flags. Small fixes. and free functions and toggle #defines from compiler flags. Small fixes.
*) 6 may 2012 (!): Made plugging in custom zlib/deflate functions more flexible. *) 6 may 2012: (!) Made plugging in custom zlib/deflate functions more flexible.
*) 22 apr 2012 (!): Made interface more consistent, renaming a lot. Removed *) 22 apr 2012: (!) Made interface more consistent, renaming a lot. Removed
redundant C++ codec classes. Reduced amount of structs. Everything changed, redundant C++ codec classes. Reduced amount of structs. Everything changed,
but it is cleaner now imho and functionality remains the same. Also fixed but it is cleaner now imho and functionality remains the same. Also fixed
several bugs and shrunk the implementation code. Made new samples. several bugs and shrunk the implementation code. Made new samples.
*) 6 nov 2011 (!): By default, the encoder now automatically chooses the best *) 6 nov 2011: (!) By default, the encoder now automatically chooses the best
PNG color model and bit depth, based on the amount and type of colors of the PNG color model and bit depth, based on the amount and type of colors of the
raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color. raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color.
*) 9 okt 2011: simpler hash chain implementation for the encoder. *) 9 okt 2011: simpler hash chain implementation for the encoder.
@ -1841,7 +1833,7 @@ https://github.com/lvandeve/lodepng
A bug with the PNG filtertype heuristic was fixed, so that it chooses much A bug with the PNG filtertype heuristic was fixed, so that it chooses much
better ones (it's quite significant). A setting to do an experimental, slow, better ones (it's quite significant). A setting to do an experimental, slow,
brute force search for PNG filter types is added. brute force search for PNG filter types is added.
*) 17 aug 2011 (!): changed some C zlib related function names. *) 17 aug 2011: (!) changed some C zlib related function names.
*) 16 aug 2011: made the code less wide (max 120 characters per line). *) 16 aug 2011: made the code less wide (max 120 characters per line).
*) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors. *) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors.
*) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled. *) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled.
@ -1949,5 +1941,5 @@ Domain: gmail dot com.
Account: lode dot vandevenne. Account: lode dot vandevenne.
Copyright (c) 2005-2019 Lode Vandevenne Copyright (c) 2005-2020 Lode Vandevenne
*/ */

View file

@ -1286,6 +1286,7 @@ VOID WriteIO(BYTE *a, DWORD d, DWORD s)
BOOL bDISPADDR = FALSE; // flag addr 0x120-0x124 changed BOOL bDISPADDR = FALSE; // flag addr 0x120-0x124 changed
BOOL bLINEOFFS = FALSE; // flag addr 0x125-0x127 changed BOOL bLINEOFFS = FALSE; // flag addr 0x125-0x127 changed
BOOL bMENUADDR = FALSE; // flag addr 0x130-0x134 changed BOOL bMENUADDR = FALSE; // flag addr 0x130-0x134 changed
DWORD dwAnnunciator = 0; // no annunciator write
#if defined DEBUG_IO #if defined DEBUG_IO
{ {
@ -1391,7 +1392,8 @@ VOID WriteIO(BYTE *a, DWORD d, DWORD s)
if (c & RST) if (c & RST)
{ {
CpuReset(); // emulate NRES signal CpuReset(); // emulate NRES signal
disp |= (DISP_POINTER | DISP_MAIN | DISP_MENUE | DISP_ANNUN); disp |= (DISP_POINTER | DISP_MAIN | DISP_MENUE);
dwAnnunciator = 0x3F; // update all annunciators
bInterrupt = TRUE; // SHUTDN bInterrupt = TRUE; // SHUTDN
} }
break; break;
@ -1404,11 +1406,9 @@ VOID WriteIO(BYTE *a, DWORD d, DWORD s)
// 0010B @ Annunciator control [LA4 LA3 LA2 LA1] = [ alarm alpha -> <- ] // 0010B @ Annunciator control [LA4 LA3 LA2 LA1] = [ alarm alpha -> <- ]
case 0x0B: case 0x0B:
case 0x0C: case 0x0C:
if (c!=Chipset.IORam[d]) // annunciator changed
{ dwAnnunciator |= ((Chipset.IORam[d] ^c) << ((d - 0x0B) * 4)) & 0x3F;
Chipset.IORam[d] = c; Chipset.IORam[d] = c;
disp |= DISP_ANNUN;
}
break; break;
// 0010D = NS:BAUD // 0010D = NS:BAUD
@ -1727,7 +1727,7 @@ VOID WriteIO(BYTE *a, DWORD d, DWORD s)
StartTimers(); StartTimers();
else else
StopTimers(); StopTimers();
disp |= DISP_ANNUN; // update annunciators dwAnnunciator = 0x3F; // update all annunciators
break; break;
// 00130 = NS:MENUADDR // 00130 = NS:MENUADDR
@ -1810,10 +1810,9 @@ finish:
disp &= ~DISP_POINTER; // display pointer updated disp &= ~DISP_POINTER; // display pointer updated
UpdateDisplayPointers(); UpdateDisplayPointers();
} }
if (disp & DISP_ANNUN) if (dwAnnunciator)
{ {
disp &= ~DISP_ANNUN; // annunciators updated UpdateAnnunciators(dwAnnunciator);
UpdateAnnunciators();
} }
return; return;
} }

View file

@ -2437,12 +2437,3 @@ VOID o_goyes5(LPBYTE I)
w.pc=rstkpop(); w.pc=rstkpop();
return; return;
} }
//////// EXTENSIONS ////////
VOID o81B1(LPBYTE I) // beep patch
{
External(&w);
PCHANGED; // update field select table
return;
}
////////////////////////////

View file

@ -441,5 +441,3 @@ extern VOID o_invalid6(LPBYTE I);
extern VOID o_goyes3(LPBYTE I); extern VOID o_goyes3(LPBYTE I);
extern VOID o_goyes5(LPBYTE I); extern VOID o_goyes5(LPBYTE I);
extern VOID o81B1(LPBYTE I); // beep patch

View file

@ -303,7 +303,7 @@ FONT 8, "MS Sans Serif"
BEGIN BEGIN
ICON IDI_EMU48,IDC_STATIC,7,6,20,20,SS_REALSIZEIMAGE ICON IDI_EMU48,IDC_STATIC,7,6,20,20,SS_REALSIZEIMAGE
LTEXT "",IDC_VERSION,29,6,151,8,NOT WS_GROUP LTEXT "",IDC_VERSION,29,6,151,8,NOT WS_GROUP
LTEXT "Copyright © 2019 Christoph Gießelink && Sébastien Carlier", LTEXT "Copyright © 2020 Christoph Gießelink && Sébastien Carlier",
IDC_STATIC,29,18,181,8 IDC_STATIC,29,18,181,8
DEFPUSHBUTTON "OK",IDOK,215,12,39,14 DEFPUSHBUTTON "OK",IDOK,215,12,39,14
EDITTEXT IDC_LICENSE,7,33,247,112,ES_MULTILINE | ES_AUTOHSCROLL | EDITTEXT IDC_LICENSE,7,33,247,112,ES_MULTILINE | ES_AUTOHSCROLL |
@ -752,8 +752,8 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,6,2,0 FILEVERSION 1,6,3,0
PRODUCTVERSION 1,6,2,0 PRODUCTVERSION 1,6,3,0
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -770,12 +770,12 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "Christoph Gießelink & Sebastien Carlier\0" VALUE "CompanyName", "Christoph Gießelink & Sebastien Carlier\0"
VALUE "FileDescription", "HP38/39/40/48/49 Emulator\0" VALUE "FileDescription", "HP38/39/40/48/49 Emulator\0"
VALUE "FileVersion", "1, 6, 2, 0\0" VALUE "FileVersion", "1, 6, 3, 0\0"
VALUE "InternalName", "Emu48\0" VALUE "InternalName", "Emu48\0"
VALUE "LegalCopyright", "Copyright © 2019\0" VALUE "LegalCopyright", "Copyright © 2020\0"
VALUE "OriginalFilename", "Emu48.exe\0" VALUE "OriginalFilename", "Emu48.exe\0"
VALUE "ProductName", "Emu48\0" VALUE "ProductName", "Emu48\0"
VALUE "ProductVersion", "1, 6, 2, 0\0" VALUE "ProductVersion", "1, 6, 3, 0\0"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View file

@ -29,7 +29,7 @@ RSRC=$(PRJ).rc
RSRCOBJ=$(PRJ).o RSRCOBJ=$(PRJ).o
OBJS=cursor.o ddeserv.o debugger.o disasm.o dismem.o display.o disrpl.o \ OBJS=cursor.o ddeserv.o debugger.o disasm.o dismem.o display.o disrpl.o \
emu48.o engine.o external.o fetch.o files.o i28f160.o keyboard.o \ emu48.o engine.o fetch.o files.o i28f160.o keyboard.o \
keymacro.o kml.o lodepng.o lowbat.o mru.o mops.o opcodes.o \ keymacro.o kml.o lodepng.o lowbat.o mru.o mops.o opcodes.o \
redeye.o rpl.o serial.o settings.o sndenum.o sound.o stack.o \ redeye.o rpl.o serial.o settings.o sndenum.o sound.o stack.o \
symbfile.o timer.o udp.o \ symbfile.o timer.o udp.o \
@ -83,9 +83,6 @@ engine.o: engine.c pch.h emu48.h types.h opcodes.h \
io.h debugger.h io.h debugger.h
$(CC) $(CFLAGS) $(DEFINES) -c -o engine.o engine.c $(CC) $(CFLAGS) $(DEFINES) -c -o engine.o engine.c
external.o: external.c pch.h emu48.h types.h ops.h
$(CC) $(CFLAGS) $(DEFINES) -c -o external.o external.c
fetch.o: fetch.c pch.h opcodes.h fetch.o: fetch.c pch.h opcodes.h
$(CC) $(CFLAGS) $(DEFINES) -c -o fetch.o fetch.c $(CC) $(CFLAGS) $(DEFINES) -c -o fetch.o fetch.c

View file

@ -67,4 +67,4 @@ Many thanks to Pedro A. Arranda Guti
compatible. compatible.
10/15/19 (c) by Christoph Gießelink 09/17/20 (c) by Christoph Gießelink

Binary file not shown.