Emu48 Changelog

What's new in Emu48 1.66

Jun 20, 2023
  • DISRPL.C:
  • Changed function PutSn(), BINx(), DoSemiStream(),
  • RplDecodeObject() and RplCreateObjView(), added error handling for memory allocation failed
  • EMU48.C:
  • Changed function WinMain(), added disable of TIMER_RESOLUTION throttling for Windows 11 and added a more flexible CPU binding for the Saturn core emulation thread on Windows Vista and later with function GetCurrentProcessorNumber()
  • EMU48.H:
  • Added _KB definition
  • Changed function prototypes
  • Extern declaration of global variable and functions
  • Removed extern declaration of global function
  • Added inline function UpCRC(), new implementation as inline function using a polynomial multiplication instead of the earlier polynomial table solution which is faster on host CPUs with a hardware integer multiplication unit
  • EMU48.DSP:
  • Added romcrc.c and pngcrc.c sources
  • Added "LODEPNG_NO_COMPILE_CRC" to lodepng.c definitions
  • EMU48.RC:
  • Changed version and copyright
  • FILES.C:
  • Added global variable for ROM CRC correction
  • Changed pbySignatureA[], pbySignatureB[], pbySignatureE[], pbySignatureW[] and pbySignatureV[] to the byte pointer array bySignature[] and defined signatures as constant
  • Changed function PatchRom(), made function public and set flag to correct the ROM CRC
  • Changed function MapRom() and UnmapRom(), speed optimization unpacking/packing ROM image and added reset of ROM patch flag
  • Changed function CrcPort2(), made function public, optimize memory access and replaced CRC formula by call of function UpCRC()
  • Changed function NewDocument(), SaveBackup(), RestoreBackup() and CreateRgnFromBitmap(), added error handling for memory allocation failed
  • Changed function OpenDocument(), simplified file signature check
  • Changed function SaveDocument(), adjusted to bySignatureE[]
  • KML.C:
  • Changed function AddToLog(), optimized implementation
  • Changed function DestroyKmlList(), minor optimization
  • Changed function CreateKmlList(), added error handling for memory allocation failed
  • Changed function ParseString(), optimized memory allocation and added error handling for memory allocation failed
  • Changed function ParseLine(), ParseLines() and ParseBlock(), added error handling for memory allocation failed
  • Changed function InitKML(), added rebuild of ROM CRC after ROM patches
  • LODEPNG.C:
  • Changed implementation file to LodePNG version 20230410 with unmarked typecast patches for x64 compatibility, Copyright (c) 2005-2023 Lode Vandevenne
  • LODEPNG.H:
  • Changed header file to LodePNG version 20230410
  • MOPS.C:
  • Moved function UpCRC() with a new function prototype and implementation to EMU48.H
  • Changed function Nread(), adjusted to he new prototype of function UpCRC()
  • Changed function ReadIO(), added CPU slow down for the TBF bit in the TCS (0x112) register as workaround for the HP48G-series transmit buffer full timeout overflow in the XSEND command and the software derivations base on this source code
  • PCH.H:
  • Added definitions, emum and struct for calling function SetProcessInformation()
  • PNGCRC.C:
  • New module for generating the PNG CRC32 replacing the CRC generation in LODEPNG.C
  • ROMCRC.C:
  • New module correcting the ROM CRC after a ROM patch
  • SERIAL.C:
  • Bugfix in function CommOpen(), global variable dwBytesRead wasn't initialized with 0 in all cases
  • Bugfix in function CommReceive(), added workaround for ReadFile() timeouts to get "Library 1275: XYMODEM v3.2 for S/G" working
  • UDP.C:
  • Replaced static IN_ADDR by SOCKADDR_IN structure
  • Changed function ResetUdp(), invalidate IP address inside SOCKADDR_IN structure
  • Changed function SendByteUdp(), replaced local SOCKADDR_IN by the global static SOCKADDR_IN structure

New in Emu48 1.65 (Jul 27, 2022)

  • EMU48.C:
  • Changed function SettingsPeripheralProc(), get the COM port state
  • over function CommIsOpen() now
  • Changed function SaveChanges(), added document name to MRU list
  • Changed function OnFileMruOpen(), modified implementation taking
  • care of the SaveChanges() modification adding a filename to the
  • MRU list after saving a document
  • EMU48.H:
  • Changed function prototype
  • Extern declaration of global functions
  • Removed extern declaration of global variable
  • EMU48.RC:
  • Changed version and copyright
  • ENGINE.C:
  • Removed global variable bCommInit
  • Changed function CheckSerial(), get the COM port state over
  • function CommIsOpen() now
  • Changed function WorkerThread(), removed bCommInit setting
  • FILES.C:
  • Changed function DibNumColors(), CreateBIPalette() and
  • DecodeBmp(), marked BITMAPINFOHEADER pointer as unaligned
  • Changed function CreateBIPalette() and DecodeBmp(), minor
  • optimization at input data check
  • Changed function DecodePng(), simplified destination row pointer
  • calculation in main loop and removed dead code in function
  • cleanup
  • LODEPNG.C:
  • Changed implementation file to LodePNG version 20220717 with
  • unmarked typecast patches for x64 compatibility, Copyright (c)
  • 2005-2022 Lode Vandevenne
  • LODEPNG.H:
  • Changed header file to LodePNG version 20220717
  • MOPS.C:
  • Bugfix in function ReadIO(), the RBF (Receive Buffer Full) bit was
  • cleared before the content of the RBR LSB (0x114) and RBR MSB
  • (0x115) register was read, so the serial port event thread
  • overwrote the RBR register with new data in some conditions
  • Bugfix in function WriteIO(), fixed implementation of the EIRU
  • bit in the IRC (0x11A) register
  • MRU.C:
  • Added some remarks
  • Added function MruID(), return ID of the given entry
  • Changed function MruFilename(), changed function interface writing
  • found filename into a buffer instead of returning a pointer to the
  • filename
  • PCH.H:
  • Added __unaligned definition for MSVC6.0 SDK and earlier
  • SERIAL.C:
  • Added new function CommIsOpen(), return if COM port open
  • Bugfix in function CommReceive(), the ReadFile() buffer argument
  • was a BYTE** instead of a BYTE* (the wrong argument type was fixed
  • by the compiler)

New in Emu48 1.64 (Sep 28, 2021)

  • DEBUGGER.C:
  • bugfix in function EnterBreakpoint(), returned an uninitializedaddress value on empty breakpoint edit control
  • bugfix in function OnDrawBreakWnd(), fixed highlighted background color
  • DISASM.C:
  • bugfix in function disasm_1() and disasm_8(), fixed decoding of r=ss, ss=r and rssEX with ss = 5, 6, 7, D, E or F register select
  • EMU48.C:
  • changed function OnContextMenu(), when the context menu wasgenerated from the keyboard it opened at a fix position, now when the mouse cursor position is inside the client window, at the mouse cursor position
  • EMU48.RC
  • changed version and copyright
  • ENGINE.C:
  • changed function InitAdjustSpeed(), added critical section forwriting reference CPU cycles and reference time
  • bugfix in function AdjKeySpeed() and SetSpeed(), removed critical section handling for initializing CPU slow down, because thi section is locked when the CPU emulation thread already slow down the CPU speed
  • FETCH.C:
  • bugfix in table o81Af2_, o81Af1_ and o81Af0_, replaced o_invalid6function pointers by their corresponding opcode function
  • bugfix in table o12_, o11_ and o10_, replaced o_invalid3 function pointers by their corresponding opcode function
  • LODEPNG.C:
  • changed implementation file to LodePNG version 20210627 with unmarked typecast patches for x64 compatibility, Copyright (c) 2005-2021 Lode Vandevenne
  • LODEPNG.H:
  • changed header file to LodePNG version 20210627
  • MOPS.C:
  • bugfix in function ReadT2Acc(), moved critical section because InitAdjustSpeed() part is already protected
  • SOUND.C:
  • bugfix in function SoundOut(), removed critical section handling because InitAdjustSpeed() is already protected

New in Emu48 1.63 (Sep 22, 2020)

  • 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()

New in Emu48 1.62 (Oct 16, 2019)

  • DEBUGGER.C
  • Added enum type, static variables and static function prototypes for trace implementation
  • Removed all occurrences of UNREFERENCED_PARAMETER(wParam);
  • Changed function NotifyDebugger(), added flush trace buffer
  • Changed function Debugger(), added trace implementation in case
  • WM_INITDIALOG, WM_DESTROY and WM_COMMAND
  • Added functions StartTrace(), StopTrace(), FlushTrace(),
  • PrintTrace(), OutTrace(), OnBrowseTraceSettings(),
  • TraceSettings(), OnTraceSettings() and OnTraceEnable() for trace implementation
  • DISPLAY.C:
  • Changed function CreateMainBitmap(), changed LoadBitmapFile() function call loading a bitmap with realizing a palette
  • Changed function CreateAnnunBitmap(), changed LoadBitmapFile() function call loading a bitmap without realizing a palette
  • EMU48.C:
  • Added variable bMouseButton saving if mouse button was pressed when mouse cursor was inside a virtual button hit area
  • Removed function OnNcHitTest(), replaced by additional OnLButtonDown() implementation
  • Changed function OnLButtonDown(), added part for windows movement when having no title bar prior done over the WM_NCHITTEST message handler which caused side effects
  • Changed function OnLButtonUp() and OnKeyDown(), added reset of variable bMouseButton
  • Changed function MainWndProc(), added WM_ENDSESSION handler for
  • document saving, WM_CONTEXTMENU calls the context menu only when
  • the right mouse button was not pressed over a virtual button hit
  • area before, removed the WM_NCRBUTTONUP case and removed the WM_NCHITTEST message handler
  • EMU48.DSP
  • Added "LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS" to lodepng.c definitions
  • EMU48.H:
  • Changed function prototype
  • Extern declaration of global functions
  • EMU48.RC:
  • Added dialog IDD_TRACE
  • Changed menu IDR_DEBUG, added ID_TRACE_SETTINGS and
  • ID_TRACE_ENABLE menu items
  • Changed version and copyright
  • ENGINE.C:
  • Changed function Debugger(), added function fnOutTrace() call
  • FILES.C:
  • Added function CheckForBeepPatch() looking for ROM beep patches at
  • known positions
  • Bugfix in function NewDocument(), initialize the ROM fingerprint
  • after loading the KML script
  • Changed function DecodeBmp(), DecodeGif(), DecodePng() and
  • LoadBitmapFile(), changed function prototype by adding an argument if a palette should realized
  • KML.C:
  • Bugfix in function ParseLines() and ParseBlocks(), if loading of an include file failed the KML script line number at the error message was wrong
  • Changed function InitKML(), added error check ROM beep patches
  • LODEPNG.C:
  • Changed implementation file to LodePNG version 20190914 with unmarked typecast patches for x64 compatibility, Copyright (c) 2005-2019 Lode Vandevenne
  • LODEPNG.H:
  • Changed header file to LodePNG version 20190914
  • RESOURCE.H:
  • Added definitions

New in Emu48 1.60 (Jan 24, 2018)

  • DISRPL.C:
  • Changed function DoHexStream() and DoHxs(), removed trailing space
  • if data length is zero
  • Bugfix in function DoIntStream(), =DOINT stream with zero data
  • length crashed decoder
  • EMU48.C:
  • Bugfix in function OnViewCopy(), fixed unsynchronized GDI
  • operations, fixed wrong menu display view when left margin of main
  • display is unequal to zero and dependent on the LCD zoom factor
  • the bitmap in the clipboard was sometimes too small
  • EMU48.RC:
  • Changed version and copyright

New in Emu48 1.59 (Sep 20, 2017)

  • DISPLAY.C:
  • Splitted nGdiZoom in nGdiXZoom and nGdiYZoom to get the ability for different zoom factors in x and y direction
  • Added function CreateAnnunBitmap() and DestroyAnnunBitmap(), handle a separate annunciator bitmap
  • Changed function UpdateMainDisplay(), UpdateMenuDisplay(), WriteToMainDisplay() and WriteToMenuDisplay(), modified to the separated nGdiXZoom and nGdiYZoom zoom factors
  • Bugfix in function ResizeWindow(), added Critical Section for GDI access
  • EMU48.C:
  • Changed function OnPaint(), modified to the separated nGdiXZoom and nGdiYZoom zoom factors
  • Added function OnTopics() to call help file
  • Changed function MainWndProc(), added ID_HELP_TOPICS message handler
  • EMU48.H:
  • Changed window style for disabled title bar, added system menu with minimize in task bar
  • Extern declaration of global variables and functions
  • EMU48.RC:
  • Changed IDD_CHOOSEKML, enlarged width of dialog to get an enlarged "Current KML Script" combo box
  • Changed IDD_KMLLOG, enlarged width of "Title of the Script", "by" and "The Author" text boxes
  • Added Menuitem Help "Help Topics" in main menu
  • Changed version and copyright
  • FILES.C:
  • Changed function NewDocument(), removed SetWindowLocation() call in restore case because on a valid document the window position was already restored in function RestoreBackup()
  • Changed function GetSaveObjectFilename(), changed function behavior with file extensions; the old implementation added the default extension always when the file had no extension or the given extension wasn't in the file filter list, the actual implementation adds the default extension for the case of no extension only
  • Added function LoadIconFromFile(), load icon file and activate the icons
  • Added function LoadIconDefault(), activate the window class default icons
  • KML.C:
  • Added keyword "Zoomxy", "Scale" and "Icon" to pLexToken[] table
  • Changed function InitGlobal(), added implementation of keyword "Scale" and "Icon"
  • Changed function InitLcd(), adjusted keyword "Zoom" to the separated nGdiXZoom and nGdiYZoom zoom factors, added implementation of keyword "Zoomxy" and "Bitmap"
  • Changed function KillKML(), added LoadIconDefault() to disable custom icons, added DestroyAnnunBitmap() and preset of some global variables
  • Changed function DrawAnnunciator(), added alternative annunciator bitmap
  • Added function ResizeMainBitmap(), resize main bitmap and main bitmap dependend variables like size, offset, ...
  • Changed function InitKML(), added scaling main bitmap
  • KML.H:
  • Added TOK_ZOOMXY, TOK_SCALE and TOK_ICON definition
  • MOPS.C:
  • Changed function Npeek() and Nread(), removed conditional jump for speed optimization
  • RESOURCE.H:
  • Added ID_HELP_TOPICS definition

New in Emu48 1.56 (Nov 18, 2014)

  • DEBUGGER.C:
  • removed INSTRSIZE definition
  • changed function GetAddr(), made function more general by adding address range check and the ability of decoding a symbolic entry into an address
  • bugfix in function OnSetCursor(), on "Activation follows mouse" enabled child dialogs lost focus when cursor moved over parent debugger dialog
  • changed function Debugger(), removed initialization of global variable wInstrSize
  • changed function EnterAddr(), changed parameter storage from static variable to window user data and replaced address decoder code by GetAddr() function call
  • changed function EnterBreakpoint(), replaced address decoder code by GetAddr() function call and so added decoding a symbolic entry into an address
  • bugfix in function LoadMemData(), forgot to check if file content fit into Saturn address range, loading now stops also after last Saturn address written
  • changed function SaveMemData(), added assertion for Saturn address verification
  • bugfix in function DebugMemLoad() and DebugMemSave(), adjusted to new prototype of function GetAddr() and so added checking if the given addresses are in the Saturn address range because Saturn read/write functions don't do the range check; this also cause a
  • change in behavior, on empty address fields the operation fails and the dialog still remains open
  • EMU48.C:
  • changed function SetSoundDeviceList(), replaced "Standard Audio" device ID from constant to definition
  • bugfix in function SettingsGeneralProc(), on "Activation follows mouse" enabled debugger dialog maybe got focus even if it's not the last active one
  • bugfix in function SettingsPeripheralProc(), restart the sound engine by calling the clean up and initialization functions now changed function OnFileNew(), removed call of function SaveBackup() which is already a part of function NewDocument()
  • changed function OnFileNew(), OnFileOpen(), OnFileMruOpen(), OnFileSave(), OnFileSaveAs() and OnFileClose(), switched detection of document is available from variable pbyRom (ROM image loaded) to variable bDocumentAvail
  • changed function OnViewCopy(), removed MONOCHROME source code part
  • changed function WinMain(), added sound engine initialization and clean up
  • EMU48.RC:
  • changed version and copyright
  • ENGINE.C:
  • initialized variable wInstrSize with size of last instruction array (the circular buffer can hold (wInstrSize-1) instructions)
  • bugfix in function WorkerThread(), moved sound engine initialization and clean up from SM_RUN state to main function, this prevents a non responding Saturn CPU emulation when changing from SM_SLEEP to SM_RUN state during sound engine initialization
  • FETCH.C:
  • made typedef of jump table struct constant, so the const keyword was removed from all references of JMPTAB
  • changed function EvalOpcode(), minor code optimization
  • FILES.C:
  • bugfix in function PatchRom(), removed limitation that patch file must have 6 characters minimum, fixed a buffer overflow when end of patch file consists of white space characters, recalculate CRC's only on address patch written and return failture on syntax errors now
  • PCH.H:
  • added GWLP_USERDATA, SetWindowLongPtr, GetWindowLongPtr and LONG_PTR definitions for MSVC6.0 SDK and earlier
  • SETTINGS.C:
  • changed function ReadSettings() and WriteSettings(), added item "LastInstrBufSize" in section [Debugger] in the INI-File
  • SOUND.C:
  • bugfix in function DestroyWaveThread(), the WM_QUIT message may failed and so the sound message thread wasn't shut down
  • changed function SoundOpen(), added additional check if the sound device support the necessary audio format
  • STACK.C:
  • added function Trim(), create a trimmed copy of the input string
  • added function SetZInt(), contain implementation of prior function RPL_SetZInt()
  • changed function RPL_SetZInt(), wrapper for function SetZInt() to trim data before decoding
  • added function SetBcd(), contain implementation of prior function RPL_SetBcd()
  • changed function RPL_SetBcd(), wrapper for function SetBcd() to trim data before decoding
  • changed function RPL_SetComplex(), create a trimmed working copy before decoding the outline brackets and because of the changed function RPL_SetBcd() the real number arguments are accepted with white spaces around now
  • removed disabled function IsRealNumber(), it was more or less functional compatible with actual modified function RPL_SetBcd()
  • TIMER.C:
  • removed UNIX_0_TIME definition
  • UDP.C:
  • changed function SendByteUdp(), replaced malloc() by _alloca() call for UNICODE wchar to char string translation to get rid of freeing the allocated memory manually

New in Emu48 1.55 (Nov 18, 2014)

  • DISMEM.C:
  • prepared for C++ compiling
  • EMU48.C:
  • replaced global variable lThreadId with local variable dwThreadId
  • added global variable with the identifier for the waveform-audio output device
  • added function SetSoundDeviceList(), helper function for filling sound device combo box with waveform-audio output devices
  • changed function SettingsPeripheralProc(), removed sound radio button handlers and added implementation of sound device combo box
  • bugfix in function OnViewScript(), ROM image change wasn't handled
  • EMU48.DSP:
  • added sound.c sources
  • EMU48.H:
  • extern declaration of global variables and functions
  • removed extern declaration of global variable
  • EMU48.RC:
  • changed IDD_SET_PERIPHERAL dialog, removed "Speaker" and "Wave" radio buttons and added "Device" combo box in the sound section changed version
  • ENGINE.C:
  • added global variable bEnableSlow for global disabling slowing down the CPU
  • added global variable bSoundSlow slowing down the CPU core atsound output
  • changed function AdjustSpeed() and InitAdjustSpeed, added sound slow down implementation
  • changed function WorkerThread(), added sound engine control
  • EXTERNAL.C:
  • removed global variable bWaveBeep
  • moved global variable dwWaveVol to module sound.c
  • removed functions BeepWave(), BeepWin9x() and Beeper()
  • changed function External() and RCKBp(), removed PC speaker support and used function SoundBeep() instead of Beeper() for beep output over sound card
  • FILES.C:
  • bugfix in function MapRom(), modified minimum file size detection and fixed memory deallocation bug in memory allocation error case
  • changed function MapPort2(), improved file size validation and freeing of file mapping in error case
  • changed function UnmapPort2(), added ability to free incomplete file mapping
  • KML.C:
  • bugfix in function KillKML(), key mapping state table wasn't cleared at the end
  • MOPS.C:
  • changed function ReadIO(), make only DEBUG_SERIAL output if bUpdate is true to distinguish between peek-access from debugger no output) and read-access from opcode evaluation (with output)
  • OPCODES.C:
  • changed function o801(), call beeper handler function on beeper port change
  • RESOURCE.H:
  • added definition
  • removed IDC_SOUND_SPEAKER and IDC_SOUND_WAVE
  • SETTINGS.C:
  • bugfix in function GetRegistryString(), ignored target buffer size when copying the default to the target string buffer
  • changed function ReadSettings() and WriteSettings(), added item "WaveDeviceId" and "WaveTime" and deleted item "WaveBeep" in section [Emulator] in the INI-File
  • SOUND.C:
  • new module for native beeper emulation over wave output device

New in Emu48 1.54 (Jan 24, 2013)

  • DDESERV.C
  • prepared for C++ compiling
  • DEBUGGER.C
  • prepared for C++ compiling
  • added new function OnCodeFindPCO(), search for a PCO object in the
  • code window
  • changed function Debugger(), added context menu commands handler
  • in the WM_COMMAND section
  • changed function OnFindOK(), added downwards search direction
  • changed function Find(), added and changed message handler for the
  • "Previous" and "Next" buttons
  • DISPLAY.C
  • prepared for C++ compiling
  • EMU48.C
  • prepared for C++ compiling
  • added function OnCopyData() as WM_COPYDATA message handler
  • implementation for changing the state file to the given state file
  • name
  • changed function MainWndProc(), added WM_COPYDATA message handler
  • changed function WinMain(), expanded single instance case by
  • transmitting the given state file name to the already opened
  • program instance
  • EMU48.H
  • prepared for C++ compiling
  • added WM_COPYDATA identifier definition
  • EMU48.RC
  • changed IDD_FIND, added a "Previous" button for previous search,
  • shorten the text of the "Find Next" button to "Next" and changed
  • the ID of the next search button
  • added "Previous PCO" and "Next PCO" menu entries in debugger
  • "Code" context menu
  • changed version and copyright
  • EXTERNAL.C
  • prepared for C++ compiling
  • FETCH.C
  • prepared for C++ compiling
  • FILES.C
  • prepared for C++ compiling
  • changed function MapRom() and UnmapRom(), replaced VirtualAlloc()
  • with malloc() memory request
  • changed function SaveBackup() and RestoreBackup(), improved
  • document available detection and added check at port data copy if
  • port source buffer is allocated
  • I28F160.C
  • prepared for C++ compiling
  • KML.C
  • prepared for C++ compiling
  • added global variable wKeybLocId to hold the keyboard layout input
  • locale at begin of KML loading
  • added global variable bLocaleInc for checking if locale block
  • content already included
  • added keyword "Locale" to pLexToken[] and token TOK_LOCALE to
  • eIsGlobalBlock[] table
  • changed function ParseLine() and ParseBlock(), preset szLexString
  • variable with NULL after freeing
  • changed function IncludeLines() and IncludeBlocks(), changed
  • function prototype by adding a boolean argument for selecting the
  • text message "Including" or "Parsing" in the log file
  • bugfix in function ParseLines(), return a TOK_NONE line for an
  • empty block instead of a NULL pointer which regular stands for a
  • syntax error
  • bugfix in function ParseLines() and ParseBlocks(), changed
  • function prototype by adding a boolean argument for selecting the
  • mode "include" or "parse" for the next lines or blocks and
  • verifying the "Include" argument was incomplete and may caused
  • memory leaks at error condition
  • bugfix in function ParseBlock(), verifying the block commmand
  • argument was incomplete and may caused a memory leak at error
  • condition
  • changed function ParseBlocks(), changed function prototype by
  • adding a boolean argument if an "End" token is also valid and
  • added implementation of block "Locale"
  • changed function KillKML(), added reset of variables wKeybLocId
  • and bLocaleInc
  • changed function ReleaseButton(), for speed optimization skip
  • function if button is already released
  • bugfix in function LoadKMLGlobal(), fixed a memory leak caused by
  • the error condition that expected block command is a string
  • changed function InitKML(), read and added current keyboard layout
  • input locale setting to log file text
  • KML.H
  • added TOK_LOCALE definition
  • MRU.C
  • prepared for C++ compiling
  • PCH.H
  • added include malloc.h
  • RESOURCE.H
  • added definitions
  • removed IDC_FIND_CASE
  • RPL.C
  • prepared for C++ compiling
  • STACK.C
  • prepared for C++ compiling
  • SYMBFILE.C
  • prepared for C++ compiling

New in Emu48 1.53 (Jan 24, 2013)

  • DEBUGGER.C
  • removed structure MODEL_MAP_T, variables pbyNoMEM, MemMap[],
  • pbyMapData, dwMapDataSize and pMapping, the implementation behind
  • moved to module DISMEM.C
  • changed function SetMappingMenu(), changed to DISMEM.C
  • implementation and added control of memory data menu items
  • changed function GetMemCurAddr(), OnMemGoAdr(), OnKeyUpDown() and
  • OnKeyPlusMinus(), variable dwMapDataSize isn't global any more,
  • use function GetMemDataMask() instead
  • changed function InitMemMap(), ViewMemWnd() and OnFindOK(),
  • changed to DISMEM.C implementation
  • changed function ViewCodeWnd(), set disassembler to memory mapped
  • mode
  • bugfix in function OnDblClick(), fixed buffer overflow when
  • converting a 2 byte hexadecimal string to a byte and added an
  • update of code window
  • changed function Debugger(), changed disassembler mode setting and
  • added initialization of RPL object viewer get nibble function in
  • WM_INITDIALOG message and added calls of "Load Memory Data..." and
  • "Save Memory Data..." handling functions
  • bugfix in function UpdateRplObjViewWnd(), show entry point names
  • only in mapped mode and end address for RPL object viewer depend
  • on the actual memory mapping mode and with the design change to
  • the DISMEM.C implementation in all debugger and disassembler
  • related parts, the RPL object viewer also works in all memory
  • mapping modes properly now
  • added functions OnBrowseLoadMem(), OnBrowseSaveMem(),
  • LoadMemData(), SaveMemData(), GetAddr(), DebugMemLoad(),
  • OnMemLoadData(), DebugMemSave() and OnMemSaveData() to handle the
  • Load/Save Memory Data feature
  • DISASM.C
  • removed global variable disassembler_map
  • removed functions rn_map(), rn_rom(), rn_ram(), rn_port1() and
  • rn_port2()
  • changed function read_nibble(), call function GetMemNib() from the
  • new module DISMEM.C for mapping mode memory access and made
  • function static again
  • DISMEM.C
  • new module for accessing memory data for debug view purpose
  • DISPLAY.C
  • changed function GetLineCounterGray() to static
  • DISRPL.C
  • the get nibble function is not hard referenced as read_nibble()
  • call any more, it's now called over RplReadNibble() function
  • pointer
  • changed function PrintTail(), expanded to handle 6 digit addresses
  • DISRPL.H
  • added extern declaration of RplReadNibble() function pointer
  • EMU48.C
  • changed function Disasm(), replaced the radio button
  • implementation for the memory mapping mode by a combo box
  • solution; the combo box solution don't work with the HP48 module
  • names any more, it now use the memory controller names used in the
  • debugger memory viewer for a more general approach for the non
  • HP48 calculator models
  • changed function WinMain(), added more flexible CPU binding for
  • the Saturn core emulation thread on Windows NT4.0 and later
  • EMU48.DSP
  • added dismem.c sources
  • EMU48.H
  • replaced old "memory module definitions" by the enum MEM_MAPPING
  • extern declaration of global functions
  • removed extern declaration of global variables
  • EMU48.RC
  • changed IDD_DISASM dialog, replaced the radio buttons for the
  • memory mapping mode by a more general combo box
  • added dialogs IDD_DEBUG_MEMSAVE and IDD_DEBUG_MEMLOAD
  • added "Load Memory Data..." and "Save Memory Data..." menu entries
  • in debugger "Memory" context menu
  • changed version
  • KML.C
  • bugfix in function ReloadButtons(), ON key button wasn't handled
  • RESOURCE.H
  • added several definitions
  • deleted some radio button definitions from the IDD_DISASM dialog
  • TIMER.C
  • changed function SetHP48Time(), time calculation now work properly
  • for host system dates before 1970/01/01 and after 2106/02/07

New in Emu48 1.52 (Jan 24, 2013)

  • DEBUGGER.C
  • changed function ViewMemWnd(), removed initialized but unused
  • variable
  • DISPLAY.C
  • changed DIBPIXEL4() and DIBPIXEL3() define, generates the same
  • code on MSVC6.0 but made it GCC4 compiler compatible
  • DISRPL.C
  • changed function RplCreateObjView(), defined end pointer also as
  • constant
  • EMU48.C
  • added property sheet page handlers SettingsGeneralProc(),
  • SettingsMemoryProc() and SettingsPeripheralProc()
  • removed function SettingsProc(), replaced by the property sheet
  • page handler functions
  • bugfix in function OnDropFiles(), changed function prototype to
  • the correct structure type of dropped file names and initialized
  • the bSuccess variable for the case the wNumFiles variable is 0
  • added function PropSheetProc(), callback function for setup the
  • property sheet
  • changed function OnViewSettings(), now creating a propery sheet
  • instead of a settings dialog
  • changed function MainWndProc(), made correct type cast to argument
  • of function OnDropFiles()
  • changed function WinMain(), replaced multiple class name usage
  • with atom variable, moved read settings before window creation,
  • and added check for setting "SingleInstance" to switch to an
  • already running program instance instead of creating a new one
  • EMU48.H
  • extern declaration of global variable and function
  • EMU48.RC
  • split IDD_SETTINGS dialog into the property pages IDD_SET_GENERAL,
  • IDD_SET_MEMORY and IDD_SET_PERIPHERAL and added item
  • "Single Instance" in the "General" property page
  • removed IDD_SETTINGS dialog
  • changed version and copyright
  • FILES.C
  • bugfix in function DecodeBmp() and DecodeGif(), a 2nd bitmap load
  • allocated and bound a 2nd palette to the main window, now only the
  • 1st bitmap (mostly the KML background bitmap) bound his palette to
  • the main window
  • KML.C
  • changed table pLexToken[], defined table as constant and changed
  • last token id table preset from constant number to member of token
  • id enumerator
  • bugfix in function ParseString(), decoding the \" sequence as
  • quotation mark inside a string was incomplete, so every single '\'
  • character was also removed
  • MRU.C
  • changed function MruUpdateMenu(), changed variable type of
  • variable hMenu
  • changed function MruReadList(), removed initialized but unused
  • variable
  • RESOURCE.H
  • removed IDD_SETTINGS definition
  • added some definitions
  • SETTINGS.C
  • changed function ReadSettings(), moved CPU speed setting to
  • MainWndProc()
  • changed function ReadSettings() and WriteSettings(), added item
  • "SingleInstance" in section [Emulator] in the INI-File
  • UDP.C
  • added function ResetUdp(), reset UDP address
  • bugfix in function SendByteUdp(), fixed memory leak at error
  • condition and optimized IP address decoding

New in Emu48 1.51 (Jan 24, 2013)

  • DDESERV.C
  • replaced all HeapAlloc() with malloc() memory requests
  • DEBUGGER.C
  • replaced all HeapAlloc() with malloc() memory requests
  • changed function ToggleBreakpoint() and EditBreakpoint(), minor
  • code optimization purging breakpoint
  • changed function Debugger(), removed all UpdateWindowStatus()
  • function calls
  • bugfix in function LoadBreakpointList(), added check of breakpoint
  • entries against breakpoint table size
  • DISRPL.C
  • replaced all HeapAlloc() with malloc() memory requests
  • bugfix in function BCDx(), fixed possible uninitialized bExpflag
  • variable
  • bugfix in function DoRrp(), fixed possible uninitialized bErr
  • variable
  • EMU48.C
  • removed global variable hHeap
  • replaced all HeapAlloc() with malloc() memory requests
  • changed function SettingsProc(), added infrared printer settings
  • changed function SaveChanges(), detect if document is available
  • now over the variable bDocumentAvail and not over the variable
  • pbyRom any more; in the case of an illegal KML script there maybe
  • a document loaded, but no ROM image, so pbyRom will be NULL in
  • this case
  • renamed function UpdateWindowStatus() to OnInitMenu() and modified
  • it to a WM_INITMENU message handler
  • changed function OnFileNew() and WinMain(), removed all
  • UpdateWindowStatus() function calls
  • bugfix function OnViewScript(), when quitted the dialog "Choose
  • Your KML Script" with the Cancel button when chosen an invalid
  • script the function returned without the possibility of saving the
  • current document; now the function try to reload the primarily KML
  • script and if this also fails then the current document is saved
  • changed function MainWndProc(), added WM_INITMENU message handler
  • and call of _CrtDumpMemoryLeaks() at end of program to detect
  • malloc() memory leaks
  • EMU48.DSP
  • changed the resource natural language to English
  • added redeye.c and udp.c sources
  • added library Ws2_32.lib
  • EMU48.H
  • removed extern declaration of hHeap
  • extern declaration of global variables and functions
  • removed declaration of global function UpdateWindowStatus()
  • replaced all HeapAlloc() with malloc() memory requests
  • EMU48.RC
  • changed version and copyright
  • ENGINE.C
  • added global variable nOpcSlow to hold the number of CPU opcodes
  • slowing down the CPU core
  • changed function AdjustSpeed(), added CPU opcode slow down
  • implementation
  • added function InitAdjustSpeed(), initialize CPU slow down part
  • if necessary
  • changed function AdjKeySpeed() and SetSpeed(), use function
  • InitAdjustSpeed() to initialize the CPU slow down variables
  • changed function SwitchToState(), removed all UpdateWindowStatus()
  • function calls
  • EXTERNAL.C
  • replaced all HeapAlloc() with malloc() memory requests
  • FILES.C
  • replaced all HeapAlloc() with malloc() memory requests
  • changed TREENODE structure, added prev element for a double linked
  • list
  • changed function PatchNibble(), added prev element handling
  • bugfix in function UpdatePatches(), in the case an address was
  • patched more than one time, the ROM was patched in wrong order and
  • moreover the original content of the double patched ROM address
  • was destroyed
  • changed function CrcRom(), if no ROM available return without
  • modifying the checksum
  • changed function MapRom(), removed using of memory mapped files
  • which has the major advantage that packed ROM files are also valid
  • now
  • changed function UnmapRom(), adjusted to changed MapRom() function
  • changed function ResetDocument(), OpenDocument(),
  • SaveDocumentAs(), SaveBackup(), RestoreBackup() and ResetBackup(),
  • removed all UpdateWindowStatus() function calls
  • changed function ResetDocument(), NewDocument(), OpenDocument()
  • and RestoreBackup(), added state variable if document is available
  • bugfix in function OpenDocument(), added check of KML script name
  • length against target buffer size
  • changed function DibNumColors(), changed function prototype from
  • UINT to WORD return
  • changed function CreateBIPalette(), changed variable
  • UINT nNumColors to WORD wNumColors to avoid variable overflow
  • loading palNumEntries of LOGPALETTE structure
  • I28F160.C
  • added functions WrDirtyPage(), EraseBlock(), WriteByte() and
  • ReadByte() for access to the ROM buffer
  • changed function WrStateE8C(), WrState40D(), WrState20C(),
  • WrState30C() and RdStateData(), changed implementation using the
  • new ROM buffer access functions
  • IO.H
  • added LBR and LBO bit definitions
  • KEYMACRO.C
  • changed function OnToolMacroNew(), OnToolMacroPlay() and
  • OnToolMacroStop(), removed all UpdateWindowStatus() function calls
  • changed function EventThread(), added minimum key hold time for
  • keyboard macro playing and subtract minimum key hold time from
  • saved waiting time, this is more accurate when the user has
  • selected a different minimum key hold time than the default one
  • changed function KeyMacroRecord(), now saving the complete waiting
  • time including the key state holding time, the key state holding
  • time is now subtract in the player function thread EventThread()
  • changed function OnToolMacroNew(), removed adding the key state
  • holding time to the reference time, this is not necessary any more
  • KML.C
  • replaced all HeapAlloc() with malloc() memory requests
  • changed function ParseLines(), BOOL expression was missing in main
  • while() loop, worked because TOK_NONE is 0
  • bugfix in function ParseBlock(), string argument wasn't freed in
  • error case
  • changed function KillKML(), removed UpdateWindowStatus() function
  • call
  • changed function LoadKMLGlobal(), used wrong variable type for
  • variable eToken
  • MOPS.C
  • added function ReadT2Acc(), reading timer2 value with checking for
  • CPU speed measurement behaviour
  • bugfix in function ReadIO(), added implementation of the LED and
  • ELBE bit in the LCR (0x11C) register and of the LBO bit in the LBR
  • (0x11D) register
  • changed function ReadIO(), the timer2 register content is now read
  • by function ReadT2Acc() to analyze the read access scheme
  • bugfix in function WriteIO(), added implementation of the ELBE bit
  • in the LCR (0x11C) register and of the LBO bit in the LBR (0x11D)
  • register
  • MRU.C
  • replaced all HeapAlloc() with malloc() memory requests
  • OPS.H
  • bugfix in function FASTPTR(), longest opcode calculation from
  • buffer size was wrong, so MMU boundary fixup wasn't working
  • properly
  • PCH.H
  • added include winsock2.h
  • REDEYE.C
  • new module for decoding the redeye data stream for a HP82240B
  • printer
  • RESOURCE.H
  • added some definitions
  • RPL.C
  • replaced all HeapAlloc() with malloc() memory requests
  • SETTINGS.C
  • changed function ReadSettings() and WriteSettings(), added item
  • "KeyMinDelay" in section [Macro] and the items "Address" and
  • "Port" in section [IrPrinter] in the INI-File
  • STACK.C
  • replaced all HeapAlloc() with malloc() memory requests
  • bugfix in function RPL_GetBcd(), fixed possible uninitialized
  • bExpflag variable
  • bugfix in function OnStackCopy(), fixed possible uninitialized
  • uClipboardFormat variable in DOCSTR case
  • SYMBFILE.C
  • replaced all HeapAlloc() with malloc() memory requests
  • UDP.C
  • new module for sending a byte over UDP

New in Emu48 1.50 (Jan 24, 2013)

  • DEBUGGER.C
  • changed table MemMap[], replaced Chipset_t memory pointer Port0,
  • Port1 and Port2 by new variables
  • DISASM.C
  • changed function rn_ram(), rn_port1() and rn_port2(), replaced
  • Chipset_t memory pointers Port0, Port1 and Port2 by new variables
  • DISRPL.C
  • cosmetic changes
  • EMU48.C
  • changed function Disasm(), added if opcode should be interpreted
  • as PCO
  • EMU48.H
  • extern declaration of global variables
  • added RplGetName(a) definition for DLL version linking
  • EMU48.RC
  • changed IDD_DEBUG_SETTINGS, replaced "Ok" with "OK" and removed
  • accelerator keys from "OK" and "Cancel"
  • changed IDR_DEBUG_MEM, added several accelerator keys
  • changed version and copyright
  • ENGINE.C
  • changed function WorkerThread(), replaced structure Chipset_t
  • element Port2 by new variable
  • FILES.C
  • added global variables to hold the memory module pointer prior
  • located in the Chipset_t structure
  • bugfix in function PatchRom(), if first patch address in a line
  • was outside the ROM area, the emulator crashed with an access
  • violation, removed the patch address wrap around
  • changed function ResetDocument(), NewDocument(), OpenDocument(),
  • SaveDocument(), SaveBackup(), RestoreBackup() and ResetBackup(),
  • replaced Chipset_t memory pointer Port0, Port1 and Port2 by new
  • variables
  • KML.C
  • changed function RunLine(), removed warning when compiling for x64
  • architecture
  • changed function InitKML(), pointed out that a packed ROM image is
  • an error
  • MOPS.C
  • changed function MapP0(), MapP1() and MapP2(), replaced Chipset_t
  • memory pointer Port0, Port1 and Port2 by new variables
  • OPCODES.C
  • bugfix in function o807(), a pressed ON key prevented the CPU
  • going into shutdown mode
  • OPS.H
  • bugfix in function FASTPTR(), longest opcode is 21 nibbles long
  • and fixed problem executing an opcode over a MMU boundary
  • changed function Nunpack(), new coding for speed optimization,
  • this solved also a bug in the code optimizer of VS2010 (the
  • optimizer generated wrong code, another possible workaround for
  • this problem was declaring the function argument "BYTE *a" as
  • "volatile BYTE *a")
  • PCH.H
  • added INVALID_FILE_ATTRIBUTES definition
  • enabled WinXP style under VS2005, VS2008 and VS2010
  • RPL.C
  • changed function Metakernel(), replaced structure Chipset_t
  • element Port1 by new variable
  • SETTINGS.C
  • changed function WriteReg() and DelReg(), changed function
  • protoytypes to make them compatible with the functions
  • WritePrivateProfileString() and WritePrivateProfileInt()
  • changed function GetRegistryInt(), changed function protoytype to
  • make it compatible with function GetPrivateProfileInt()
  • TIMER.C
  • changed function SetHP48Time(), replaced structure Chipset_t
  • element Port0 by new variable
  • TYPES.H
  • changed structure Chipset_t, replaced Port0, Port1 and Port2 with
  • a DWORD placeholder each, because when compiling for x64
  • architecture these 3 byte pointers grow up to 8 bytes and destroy
  • the state file structure