Service Pack 67 for Emu48 Version 1.0

DEBUGGER.C
- changed position of debugger window with a default position marker
- changed function Debugger(), in case WM_INITDIALOG set windows
  position only if given windows position don't contain the default
  position marker
- changed function OnToolDebug(), on dialog creation set main window
  as parent window
- changed function LoadMemData() and SaveMemData(), changed function
  prototype by adding a bit mode flag to load or save data in 8-bit
  or 4-bit mode
- changed function DebugMemLoad() and DebugMemSave(), added decoding
  of radio buttons and adjusted to new prototypes of function
  LoadMemData() and SaveMemData()

EMU48.C
- bugfix in function WinMain(), changed UNICODE command line
  argument decoding to prevent memory leak and added WSAStartup() /
  WSACleanup() network stack sequence calling once

EMU48.H
- extern declaration of global variable

EMU48.RC
- changed IDD_DEBUG_MEMSAVE and IDD_DEBUG_MEMLOAD, added radio
  buttons to select bit width of memory files
- changed version and copyright

FETCH.C
- changed all tables, added braces around each table element for
  Clang compatibility

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
- changed function ReadT2Acc(), changed CPU slow down
  implementation, on SMP systems a CriticalSection is treated as a
  mutex object which is much slower, so short consecutive
  CriticalSections of the same object should be avoided
- changed function ReadIO(), changed CPU slow down implementation
  for the TBF bit in the TCS (0x112) register, on SMP systems a
  CriticalSection is treated as a mutex object which is much slower,
  so short consecutive CriticalSections of the same object should be
  avoided

RESOURCE.H
- added definitions

SERIAL.C
- changed function CommOpen(), removed assertion for UART on

SETTINGS.C
- changed function ReadSettings() and WriteSettings(), added item
 "LocaleDecimalPoint" in section [Emulator] in the INI-File

STACK.C
- added variable bLocaleDecimalPoint for choosing the decimal point
  given by the calculator or the Windows Locale setting
- added function CheckThousandGroup(), check if character is the
  thousand separator
- added function GetClpbrdDecimalPoint(), get decimal point from
  clipboard
- changed function SetBcd(), accept number string with thousand
  separator now
- changed function GetRadix(), added possibility of using the
  Windows Locale instead of calculator setting
- changed function OnStackPaste(), get get decimal point for real
  and complex numbers from clipboard instead from calculator

TIMER.C
- changed function SetHP48Time(), use one loop for clock and auto
  off writing, use function UpCRC() for CRC calculation and removed
  intermediate buffer for writing the CRC

UDP.C
- changed function SendByteUdp(), moved WSAStartup() / WSACleanup()
  sequence to function WinMain()


Service Pack 66 for Emu48 Version 1.0

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, optimized
  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


Service Pack 65 for Emu48 Version 1.0

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)


Service Pack 64 for Emu48 Version 1.0

DEBUGGER.C
- bugfix in function EnterBreakpoint(), returned an uninitialized
  address 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 was
  generated 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 for
  writing reference CPU cycles and reference time
- bugfix in function AdjKeySpeed() and SetSpeed(), removed critical
  section handling for initializing CPU slow down, because this
  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_invalid6
  function 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


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

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


Service Pack 61 for Emu48 Version 1.0

EMU48.DSP
- added lodepng.h and lodepng.c sources

EMU48.RC
- changed version

FILES.C
- added function DecodePng() as wrapper for decoding PNG image files
- changed function LoadBitmapFile(), added PNG image file support
- added function EncodeColorBits() returning bitfield position
  encoded color bits
- bugfix in function CreateRgnFromBitmap(), removed GetObject() call
  for getting the image properties, they are get over a GetDIBits()
  query now, removed creating a memory DC because it's unused and
  added bitfield decoding which is important for the 16 bit (5:6:5)
  color setting

KML.C
- changed function AdjustPixel(), changed function prototype using
  a buffer position instead of device context pixel coordinate to
  locate the adjustable pixel
- changed function TransparentCircle(), complete new implementation
  with changed function prototype; the prior implementation used the
  GetPixel()/SetPixel() method to adjust the pixel color of a single
  pixel, this method was extremely slow on some PC configurations,
  the current method is creating a byte copy of the complete target
  area, does the pixel adjustments on byte level and finally copy
  the result back to the target device context
- changed function DrawButton(), adjusted implementation to new
  prototype of function TransparentCircle()

LODEPNG.C
- new module for decoding PNG files LodePNG version 20180611 with
  unmarked typecast patches for x64 compatibility, Copyright (c)
  2005-2018 Lode Vandevenne

LODEPNG.H
- header file for decoding PNG files LodePNG version 20180611,
  Copyright (c) 2005-2018 Lode Vandevenne


Service Pack 60 for Emu48 Version 1.0

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


Service Pack 59 for Emu48 Version 1.0

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


Service Pack 58 for Emu48 Version 1.0

DDESERV.C
- bugfix in function DdeCallback(), improved input data checking and
  avoided multiple DDE data fetch in XTYP_POKE case

DEBUGGER.C
- changed function UpdateStackWnd(), OnStackPush() and OnStackPop(),
  fixed signed/unsigned mismatch
- bugfix in function OnLButtonUp(), fixed a buffer overflow when
  converting a 3 byte hexadecimal string to variable Chipset.out
  which overwrite the content of variable Chipset.in, fixed a buffer
  overflow when converting a 4 byte hexadecimal string to variable
  Chipset.in which overwrite the following two padding bytes and
  changed method converting a 2 byte hexadecimal string to variable
  Chipset.Bank_FF
- changed function UpdateProfileWnd(), fixed signed/unsigned
  mismatch and optimized ENG unit search break
- changed function InfoWoRegister(), changed function prototype to
  DLGPROC

DISPLAY.C
- added variable for additional GDI zoom
- changed function UpdateMainDisplay(), UpdateMenuDisplay(),
  WriteToMainDisplay() and WriteToMenuDisplay(), replaced BitBlt by
  StretchBlt operation to implement an additional GDI zoom factor
  (there is no noticeable speed difference between BitBlt and
  StretchBlt with a stretching factor of 1)
- bugfix in function ResizeWindow(), the WM_PAINT message wasn't
  generated by the InvalidateRect() call when the title and menu bar
  was disabled and the client area was empty, so we got a main
  window with zero size which could not be activated any more ->
  issue solved by forcing a menu bar when client area is empty

EMU48.C
- changed szLicence string, updated to the latest revision of the
  GPLv2
- moved function SetSoundDeviceList() to SNDENUM.C
- bugfix in function SettingsGeneralProc(), SettingsMemoryProc() and
  SettingsPeripheralProc(), changed function prototype to DLGPROC
  for getting a 64 bit lParam pointer when compiling for x64
  architecture
- changed function OnPaint(), replaced BitBlt by StretchBlt
  operation at display handling to implement an additional GDI zoom
  factor
- changed function OnViewSettings(), removed DLGPROC typecasts

EMU48.DSP
- added snddef.h and sndenum.c sources

EMU48.H
- extern declaration of global variable and function

EMU48.RC
- changed IDD_SET_PERIPHERAL, enlarged width of slider
  IDC_SOUND_SLIDER and combo box IDC_SOUND_DEVICE
- changed version and copyright

KML.C
- changed function InitLcd(), removed Zoom factor 4 limitation
- changed function KillKML(), added reset of variable nGdiZoom
- changed function iSqrt(), changed implementation to Heron's method
  for speed optimization

SNDDEF.H
- include files and interface definitions for SNDENUM.C for
  compilers without installed DirectX SDK

SNDENUM.C
- new module with implementation of function SetSoundDeviceList()
  prior located in EMU48.C for sound device enumeration showing the
  full device name used since Windows Vista

STACK.C
- removed include resource.h


Service Pack 57 for Emu48 Version 1.0

DEBUGGER.C
- bugfix in function OnContextMenu(), when the context menu was
  generated from the keyboard it was opened at the wrong position
- bugfix in function Debugger(), use critical section for secure
  deletion of the last instruction buffer

DISMEM.C
- changed function SetMemRomType(), fixed signed/unsigned mismatch

DISPLAY.C
- changed function ResizeWindow(), optimized implementation now
  works independent from window style and menu bar setting

DISRPL.C
- changed function PutSn(), minor optimization
- changed function DoHexStream(), DoIntStream(), DoBint(), DoReal(),
  DoERel(), DoCmp(), DoECmp(), DoChar(), DoCStr(), DoHxs(),
  DoIdnt(), DoLam(), DoRomp(), Semi() and DoFlashPtr(), added
  UNREFERENCED_PARAMETER statement
- changed function DoERel(), made function static
- changed function Getfp(), fixed signed/unsigned mismatch

EMU48.C
- added global variable dwTColor and dwTColorTol for the background
  transparency color matching
- added global variable hRgn to hold a region resource handle for
  a transparent background bitmap
- added global variables bTitleBar, bShowTitle, bShowMenu and
  bClientWinMove
- added Critical Section initialization
- added function UpdateWindowBars(), helper function to update state
  of title and menu bar
- changed function SettingsGeneralProc(), added "Show Title" and
  "Show Menu" checkbox handling
- changed function SettingsPeripheralProc(), added
  UNREFERENCED_PARAMETER statement
- changed function OnPaint(), added UpdateWindowBars() call
- changed function OnInitMenu(), added MRU list update
- added function OnContextMenu(), context menu implementation
- added function OnNcHitTest(), when no title bar check if mouse
  position is in client not over a button area
- changed function MainWndProc(), minor change in WM_PALETTECHANGED
  implementation and added WM_CONTEXTMENU, WM_NCRBUTTONUP and
  WM_NCHITTEST message handler
- changed function WinMain(), changed method of memory leak
  detection by adding _CrtSetDbgFlag() at begin and removing
  _CrtDumpMemoryLeaks() at end of program

EMU48.H
- added window styles definition
- changed function prototypes
- extern declaration of global variables and function

EMU48.RC
- changed IDD_SET_GENERAL, added "Show Title" and "Show Menu"
  checkbox
- added menu IDM_MENU
- changed version and copyright

ENGINE.C
- bugfix in function SaveInstrAddr(), added critical section to be
  sure that last instruction buffer is still available

FETCH.C
- added typecast to all pLnk entries for compatibility with C++
  compiling on GCC 4.8.1

FILES.C
- defined abs() and labs() as intrinsic
- changed function DibNumColors(), fixed typecast
- changed function DecodeGif(), changed function prototype by adding
  an argument overwritten by the transparent color if found
- changed function LoadBitmapFile(), adjusted to new prototype of
  function DecodeGif()
- added function AbsColorCmp() and LabColorCmp(), compare colors
  with tolerance
- added function CreateRgnFromBitmap(), create opaque bitmap region

KML.C
- added keyword "SysItem" to pLexToken[] table
- changed function InitGlobal(), added implementation of keyword
  "Color"
- changed function RunLine(), added implementation of keyword
  "SysItem"
- changed function KillKML(), added reset of variables hRgn,
  dwTColor and dwTColorTol
- added function MouseIsButton() to check if mouse over button area
- changed function MouseMovesTo(), changed _ASSERT implementation to
  make sure that class cursor is NULL and use function
  MouseIsButton() to select cursor type now

KML.H
- added TOK_SYSITEM definition
- changed structure KmlToken, replaced TCHAR array szName[20] with
  LPCTSTR szName pointer
- added MouseIsButton() function prototype

MRU.C
- changed all function argument types from INT to UINT
- removed global variables hMruMenu and nMruPos
- removed all update menu calls in this module and made functions
  robust against non initialized MRU list and ID index out of range
- changed function GetMenuPosForId(), changed function prototype so
  the resulting menu handle and menu position aren't global
  variables any more
- changed function MruInit(), changed return value from FALSE to
  TRUE for success and changed implementation like used in the PPC
  emulator variants
- changed function MruUpdateMenu(), changed function prototype by
  adding the HMENU argument for updating the selected menu and added
  initialization prior done in function MruInit()
- changed function MruWriteList(), if there are no entries don't
  write the "FileCount" setting any more

PCH.H
- added _WINSOCK_DEPRECATED_NO_WARNINGS definition
- added GCLP_HCURSOR, SetClassLongPtr, GetClassLongPtr and ULONG_PTR
  definitions for MSVC6.0 SDK and earlier

REDEYE.C
- changed function CreateCorrectionBits(), fixed signed/unsigned
  mismatch

RESOURCE.H
- added definitions

SERIAL.C
- changed function CommOpen(), fixed signed/unsigned mismatch

SETTINGS.C
- changed function ReadSettings() and WriteSettings(), added item
 "ShowTitle", "ShowMenu" and "ClientWinMove" in section [Emulator]
 in the INI-File

STACK.C
- changed function SetBcd(), fixed signed/unsigned mismatch
- bugfix in function RPL_GetComplex(), function arguments nMantLen
  and nExpLen hadn't been used

SYMBFILE.C
- changed function RplLoadTable(), made optimizations and added
  integrity checks


Service Pack 56 for Emu48 Version 1.0

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


Service Pack 55 for Emu48 Version 1.0

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 at
  sound 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


Service Pack 54 for Emu48 Version 1.0

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


Service Pack 53 for Emu48 Version 1.0

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


Service Pack 52 for Emu48 Version 1.0

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


Service Pack 51 for Emu48 Version 1.0

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


Service Pack 50 for Emu48 Version 1.0

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


Service Pack 49 for Emu48 Version 1.0

DISRPL.C
- bugfix in function BCDx(), detection for exponent writing was
  wrong -> on negative exponents sometimes the result format was
  wrong, on positive exponents sometimes the result itself was wrong

EMU48.C
- changed function OnFileMruOpen(), on success move selected entry
  to top of MRU table

EMU48.DSP
- changed to REGISTRY (HKCU/Software/Emu48) saving

EMU48.H
- extern declaration of global variable and function

EMU48.RC
- changed version

MRU.C
- changed function MruAdd(), added entry moving to top when the
  entry is already in the table
- added function MruMoveTop(), move MRU entry to top of table

STACK.C
- bugfix in function RPL_GetBcd(), detection for exponent writing
  was wrong -> on negative exponents sometimes the result format was
  wrong, on positive exponents from E12 until E14 with 12 digit
  mantissa setting the result itself was wrong
- added helper functions RPL_GetComplex() and RPL_SetComplex() to
  handle complex number objects
- added function DoComplex() to handle a complex number object
- changed function OnStackCopy(), added complex number support
- changed function OnStackPaste(), added flag to disable automatic
  clipboard object detection and added complex number support


Service Pack 48 for Emu48 Version 1.0

DDESERV.C
- bugfix in function DdeCallback(), readded delay at XTYP_POKE after
  ON key state change switching calculator on, bug introduced in
  SP37 and made ON key hold time variable

DEBUGGER.C
- added backup breakpoint list
- added function LoadSymbTable(), loading symbol table defined in
  INI-File
- added function GetMemCurAddr(), get address of cursor in memory
  window
- changed function ViewCodeWnd(), function now returns the line
  number with the pc, adjusted address to Saturn address area, added
  label line if address is a known entry and added a check if the 5
  nibble sequence on an address should be interpreted as PCO
- changed function ViewCodeWnd() and InfoIntr(), adjusted to new
  prototype of function disassemble()
- changed function UpdateCodeWnd(), if pc should shown at first line
  but the pc is the begin of a PCO, show PCO address as first line
  instead, added handling for label line
- changed function OnKeyF5(), for label line support changed
  detection of PC line
- changed function OnCodeGoAdr(), removed limitation to Saturn
  address area, limitation now done in function ViewCodeWnd()
- added function OnKeyPlusMinus(), +/- key handler for memory window
- changed function OnKeyCodeWnd(), added handling for label line and
  removed limitation going back before address 0
- changed function OnDrawCodeWnd(), added draw style for label line
- changed function Debugger(), added initialization and
  uninitialization of symbol table and bold font, added +/- key
  handling for memory window, added Debugger Settings to the system
  menu and added call of "RPL Object Viewer" handling function
- changed function OnFindOK(), in the case of a search match update
  also the RPL object viewer window
- added functions for "RPL Object Viewer" dialog box
- added functions for Debugger Settings handling
- changed function EnterAddr(), added decoding a symbolic entry into
  an address and expanded hex address range from 6 to 8 digits
- changed function InfoIntr(), added label line if instruction
  address is a known entry
- bugfix in function InfoWoRegister(), changed WM_COMMAND message
  handler from IDOK to IDCANCEL to make the close button working
  properly
- added functions SaveBreakpointList() and
  CreateBackupBreakpointList() to handle the backup breakpoint list

DEBUGGER.H
- extern declaration of global functions

DISASM.C
- added variable disassembler_symb to enable symbolic address
  disassembly
- changed function read_nibble(), made function public
- changed function append_imm_nibble(), if the immediate data is 5
  nibbles long and the decoded data is a known symbolic entry, show
  the symbolic name instead of the data
- added new function append_numaddr(), numeric output of an address
- changed function append_addr(), if the address is a known symbolic
  entry, show the symbolic name instead of the address
- bugfix in function append_r_addr(), in some rare conditions the
  program counter value got larger than 0xFFFFF, if the calculated
  absolute address is a known symbolic entry show the symbolic name
  instead of the relative address, in the case of showing the
  relative address the corresponding absolute address is now printed
  by this function and not by the function append_pc_comment(), so
  there's no difference between VIEW_SHORT and VIEW_LONG any more
- removed function append_pc_comment(), implementation is obsolete
  now because absolute address printing is now done in function
  append_r_addr()
- changed function disasm_8() and disassemble(), changed function
  prototypes by removing the view argument

DISPLAY.C
- made global variable public static
- changed DIBPIXEL4() define, generates the same code on MSVC6.0 but
  made it GCC compiler compatible

DISRPL.C
- new module for RPL object decoding

DISRPL.H
- header file for RPL object decoding part

EMU48.C
- bugfix in function OnDropFiles() and OnObjectLoad(), readded
  delay after ON key state change switching calculator on, bug
  introduced in SP37 and made ON key hold time variable
- changed function OnObjectLoad(), changed load object warning
  message
- changed function Disasm(), adjusted to new prototype of function
  disassemble()
- changed function WinMain(), added non modal "RPL Object Viewer"
  dialog box in main message handler
- bugfix in function WinMain(), getting the full path name of the
  current state file failed in the case of an empty name buffer

EMU48.DSP
- added disrpl.c and symbfile.c sources

EMU48.H
- removed extern declaration of pbyLcd
- removed VIEW_SHORT and VIEW_LONG definition
- changed function prototypes
- extern declaration of global variables and functions

EMU48.RC
- changed IDD_WRITEONLYREG, changed ID of OK control from IDOK to
  IDCANCEL
- changed IDD_SETTINGS, replaced "Ok" with "OK" and removed
  accelerator keys from "OK" and "Cancel"
- added dialogs IDD_DEBUG_SETTINGS and IDD_RPLVIEW
- added "Rpl Object Viewer..." menu entry in debugger "Memory"
  context menu
- changed version and copyright

FILES.C
- changed function GetCutPathName(), removed warning when compiling
  for x64 architecture
- changed function IsDataPacked(), made a DWORD pointer copy of the
  VOID pointer argument to avoid type casting, this generates the
  same code on MSVC6.0 but made it GCC compiler compatible
- bugfix in function OpenDocument(), if document reload was refused
  the function returned no success -> this caused trouble in
  function OnFileMruOpen() removing the MRU entry of this document
- bugfix in function SaveBackup(), a backup of the debugger
  breakpoint list wasn't created
- bugfix in function RestoreBackup(), the debugger breakpoint list
  wasn't restored so the breakpoints got lost when saving the state
  file and added preserving debugger open state, this feature was
  lost as a result of a bugfix in an earlier version
- changed function GetOpenFilename(), added file filter for all
  Emu48 specific filenames which is default, changed filter names
  and removed model specific file extension selection
- changed function GetSaveAsFilename(), changed filter names and use
  small size characters for file extensions
- added function DecodeBmp(), contain the BMP image file decoder
  prior located in function LoadBitmapFile() and added check of
  bitmap file size
- added functions ReadGifByte(), ReadGifWord() and DecodeGif() for
  decoding GIF image files
- bugfix in function LoadBitmapFile(), check for a valid file handle
  was missing, moved BMP image file decoder to function DecodeBmp()
  and added GIF image file support

KEYBOARD.C
- changed function KeyboardEvent(), made key switch time variable

KML.C
- changed szText variable qualifier from LPTSTR to LPCTSTR
- added keyword "IfMem" to pLexToken[] table
- added token TOK_IFMEM to eIsBlock[] table
- changed function CreateKmlList(), adjusted to new prototype of
  function GetStringParam()
- added function UpdateScriptList(), filling the KML script combo
  box with all found script titles and select the current used one
- changed function ChooseKMLProc(), call function UpdateScriptList()
  to update the KML script combo box now
- removed function FatalError()
- bugfix in function ParseToken(), modifying the
  script buffer content isn't allowed
- changed function InitLex(), adjusted to constant pointer of
  variable szText
- bugfix in function ParseString(), replaced error text
- bugfix in function IncludeLines(), removed fatal error message
  text and adjusted to constant pointer of variable szText
- bugfix in function ParseLines(), in some cases parsing hadn't
  stopped with an error inside a block with an unreferenced include
  file and removed a fatal error message text
- bugfix in function ParseBlock(), block argument checking generated
  wrong error messages in the case of syntax errors
- bugfix in function IncludeBlocks(), removed fatal error message
  text and adjusted to constant pointer of variable szText
- changed function ParseBlocks(), removed "Invalid block." message
  text and made some code optimizations calling the function
  FatalError()
- changed function InitGlobal(), changed some punctuation and
  capital letters
- changed function InitButton(), source code improvement checking
  the size of button array
- changed function RunLine(), added implementation of "IfMem"
  command
- changed function GetStringParam(), changed return variable
  qualifier from LPTSTR to LPCTSTR
- bugfix in function ReloadButtons(), global variable bKeyPressed
  wasn't updated

KML.H
- added TOK_IFMEM definition

PCH.H
- added INVALID_SET_FILE_POINTER definition

RESOURCE.H
- added definitions for Debugger Settings and RPL object viewer
  handling

RPL.C
- renamed definition DOEREAL to DOEREL and adjusted usage in
  function RPL_SkipOb() and RPL_ObjectSize()
- bugfix in function RPL_SkipOb() and RPL_ObjectSize(), the object
  at address 0x02BAA was always interpreted as =DOACPTR, a
  constant-length object consisting of two 5-nibble addresses, on
  the HP48S series the object is interpreted as =DOEXT1, an object
  with 5-nibble length information followed by data

SETTINGS.C
- changed function ReadSettings() and WriteSettings(), added item
  "Symbolic" in section [Disassembler] and added items "WakeupDelay"
  and "KeyMinDelay" in section [Emulator] in the INI-File

STACK.C
- bugfix in function OnStackPaste(), readded delay after ON key
  state change switching calculator on and made ON key hold time
  variable

SYMBFILE.C
- new module for loading external symbols from a Saturn3 linker file


Service Pack 47 for Emu48 Version 1.0

DDESERV.C
- bugfix in function DdeCallback(), readded delay after ON key state
  change, bug introduced in SP37

DEBUGGER.C
- changed function OnLButtonUp(), NewValue(), EnterAddr() and
  EnterBreakpoint(), replaced WM_GETTEXT message call with function
  GetWindowText()

DISASM.C
- bugfix in function disassemble(), the NOP5 opcode returned wrong
  address for next instruction (GOTO opcode skipping one nibble)

EMU48.C
- changed function SettingsProc(), adjusted to new prototype of
  function GetLoadObjectFilename(), use (*.BIN) as default file
  filter now
- changed function OnPaint(), removed mixture of BitBlt() calls with
  argument hPaintDC and hWindowDC inside critical section
- changed function OnFileClose(), removed call of DisableDebugger()
  because it's now done in function ResetDocument()
- bugfix in function OnDropFiles() and OnObjectLoad(), readded delay
  after ON key state change, bug introduced in SP37
- changed function OnObjectLoad() and OnObjectSave(), adjusted to
  new prototype of function GetLoadObjectFilename() and
  GetSaveObjectFilename(), use (*.HP;*.LIB) as default file filter
  now

EMU48.H
- added file filter definitions
- extern declaration of global variable and function
- changed function prototypes

EMU48.RC
- changed name order in copyright messages
- changed version and copyright

EXTERNAL.C
- removed inline function Return(), replaced by a rstkpop() call
- added function Beeper() for beeping without taking care about
  the different beeping methods
- added function RCKBp() simulating the ROM Check Beep

FILES.C
- changed function ResetDocument(), added call of DisableDebugger()
- changed function GetOpenFilename() and GetSaveAsFilename(),
  removed some NULL characters at end of file filter definition
  string
- changed function GetLoadObjectFilename() and
  GetSaveObjectFilename(), changed function prototype, added
  arguments for the file filter and the default extention

I28F160.C
- adjusted implementation to the new bit array of the block lock
  table

I28F160.H
- changed structure WSMset_t, replaced byte array byLockCnfg[32]
  with the bit array dwLockCnfg variable

KEYMACRO.C
- changed function OnToolMacroNew() and OnToolMacroPlay(), removed
  some NULL characters at end of file filter definition string

KML.C
- changed function GetStringOf(), changed for better reading
- changed function SkipWhite(), optimized and better readable
  implementation
- bugfix in function ParseToken(), optimized string delimiter
  searching among other optimizations and removed increment of line
  counter on LF character to correct the line numbering on UNIX
  files with LF instead of CR LF at line end -> line counter
  increment is done in function SkipWhite() on decoding next keyword
  in function Lex()
- changed function ParseLine(), replaced main loop "goto" construct

LOWBAT.C
- bugfix in function StartBatMeasure(), creating the battery
  watching thread wasn't Win9x compatible
- changed function GetBatteryState(), added possibility to disable
  low battery detection

SETTINGS.C
- changed function ReadSettings() and WriteSettings(), added item
  "Disable" in section [LowBat] in the INI-File

STACK.C
- bugfix in function OnStackPaste(), readded delay after ON key
  state change, bug introduced in SP37


Service Pack 46 for Emu48 Version 1.0

EMU48.C
- bugfix in function SaveChanges(), returned wrong ID when function
  GetSaveAsFilename() returned FALSE, bug introduced in SP45
- bugfix in function WinMain(), in some cases only file short names
  had been written as last document

EMU48.RC
- changed version


Service Pack 45 for Emu48 Version 1.0

EMU48.C
- bugfix in function SaveChanges(), function GetSaveAsFilename()
  returns a boolean and not a button ID and removed call of last
  document saving
- changed function OnFileOpen(), added MruAdd() call
- added new function OnFileMruOpen(), command handler for MRU menu
  selections
- bugfix in function OnFileSaveAs(), function GetSaveAsFilename()
  returns a boolean and not a button ID, minor optimizations,
  removed call of last document saving and added MruAdd() call
- changed function OnObjectSave(), minor optimization
- changed function MainWndProc(), added MRU message handler
- changed function WinMain(), added MRU handling and added last
  document saving at end of program

EMU48.DSP
- added mru.c sources

EMU48.H
- extern declaration of global functions

EMU48.RC
- added Menuitem Files "Recent Files..."
- changed version

MRU.C
- new module for MRU routines

RESOURCE.H
- added definition for MRU handling

SETTINGS.C
- added function DelReg() for deleting a registry item
- added functions ReadSettingsString(), WriteSettingsString(),
  ReadSettingsInt(), WriteSettingsInt() and DelSettingsKey(),
  universal settings interface used for MRU data handling

TIMER.C
- bugfix in function TimeProc(), under certain conditions this
  function is called with a zero uEventId and this may clash with a
  reset timer event identifier


Service Pack 44 for Emu48 Version 1.0

DEBUGGER.C
- added new function OnSetCursor(), message handler for
  "Activation Follows Mouse" implementation
- changed function Debugger(), added "Always On Top" and
  "Activation Follows Mouse" handling
- bugfix in function OnToolDebug(), argument for owner window handle
  was wrong, but over the years I has liked this debugger dialog
  behavior so I put in the correct argument for this behavior

DISASM.C
- disabled automatic inline code
- fixed source file formatting error
- changed function append_field(), defined as inline code
- changed function append_r_addr(), code optimization

DISPLAY.C
- changed function ResizeWindow(), added "Always on top" feature

EMU48.C
- removed definition of MAXPORTS
- removed global variable bClassicCursor
- added function ForceForegroundWindow() forcing window to
  foreground
- changed function SetCommList(), don't try all possible COM ports
  any more, get current serial device list from registry
  "HKLM\Hardware\\DeviceMap\\SerialComm" and fill both combo boxes
  at one loop for speed up scanning
- changed function SettingsProc(), added "Always On Top" and
  "Activation Follows Mouse" checkbox handling, adjusted to new CRC
  handling of port2 and adjusted to new prototype of function
  SetCommList()
- bugfix in function OnFileNew(), function SaveBackup() was called
  when emulator engine was running -> this may caused inconsistent
  backup data
- changed function OnMouseMove(), added "Activation follows mouse"
  feature
- added function OnNcMouseMove() for "Activation follows mouse"
  feature in non client area
- changed function MainWndProc(), added WM_NCMOUSEMOVE message
  handler
- bugfix in function WinMain(), moved additional DDE stuff just
  behind DDE server initialization, added StartupBackup handling,
  adjusted length for cut filenames preventing negative values and
  call ShowWindow() before asking for a new document preventing a
  KML script dialog without a parent window

EMU48.H
- removed declaration of bClassicCursor
- extern declaration of global variables and functions
- changed function prototypes

EMU48.RC
- added item "Always On Top" and "Activation Follows Mouse" in
  settings dialog
- cosmetic changes in dialog IDD_CHOOSEKML to improve WinXP style
- changed version

FILES.C
- added global variables holding the patched ROM checksum and the
  port2 CRC
- changed function GetCutPathName(), better support for UNC names
- changed function SetWindowPathTitle(), adjusted length for cut
  filename
- changed function CrcRom(), change function prototype, added
  unpacked data check and made function public
- bugfix in function CrcRom(), hadn't detected address content
  changes at addresses ending with a 0x2 and 0x3 because only lower
  16 bit of checksum was used -> modified function cause a warmstart
  because of new checksum
- changed function MapRom(), removed check for packed ROM image ->
  a more complete check is implemented in InitKML() now
- changed function UnmapRom(), added reset of ROM checksum variable
- changed function CrcPort2(), change function prototype and added
  unpacked data check
- changed function MapPort2(), added CRC calculation with saving
  result in global variable and added unpacked data check
- changed function UnmapPort2(), added reset of port2 CRC variable
- new function IsDataPacked() for unpacked data check
- changed function OpenDocument(), use ROM checksum made in
  InitKML() and port2 CRC made in MapPort2() and added checks for
  packed memory data
- changed function SaveDocument(), changed document signature to
  "Emu48 Document\xFE" without the calculator model dependent
  variations and adjusted implementation to new prototypes of
  CrcRom() and CrcPort2()
- changed function SaveBackup(), added assertion for checking
  emulator engine state
- bugfix in function GetSaveAsFilename(), removed "Win48 Document"
  from filter list because Emu48 cannot create such a document
- changed function WriteStack(), adjusted to new prototype of
  function RPL_ObjectSize() and added new error state for bad
  objects
- changed function LoadObject(), added error message for bad objects

KML.C
- bugfix in function KillKML(), class member variable wasn't reset
- changed function MouseMovesTo(), removed bClassicCursor switch
  for using arrow cursor over button
- changed function InitKML(), added full check for unpacked ROM
  image and build checksum of patched ROM

OPCODES.C
- changed function o83n(), o88n() and o89n(), speed optimization

OPS.H
- changed function Tbit0(), Tbit1(), Ta(), Tb(), Tae() and Tbe(),
  speed optimization

PCH.H
- added include stddef.h
- restricted DWORD_PTR type definition for MSVC6.0 and earlier

RESOURCE.H
- added some definitions

RPL.C
- bugfix in RPL_ObjectSize(), changed function prototype for adding
  buffer size parameter preventing reading outside buffer area when
  decoding bad objects

SERIAL.C
- changed function CommOpen(), increased buffer size for device name

SETTINGS.C
- changed function ReadSettings() and WriteSettings(), added item
  "StartupBackup" in section [Files] and item "ActFollowsMouse" and
  "AlwaysOnTop" in section [Emulator], removed item "ClassicCursor"
  from [KML] section in the INI-File


Service Pack 43 for Emu48 Version 1.0

DDESERV.C
- removed warnings when compiling under VS2005
- changed function DdeCallback(), case XTYP_POKE and XTYP_REQUEST
  now decode the item name for the stack level

DEBUGGER.C
- removed warnings when compiling under VS2005

DISASM.C
- bugfix in function disasm_8(), the ?HS=0 n opcode showed always as
  ?=0 opcode

DISPLAY.C
- changed function StopDisplayGray() and StopDisplayBW(), adjusted
  to new prototype of ReadIO()

EMU48.C
- removed warnings when compiling under VS2005
- moved CF_HPOBJ definition to EMU48.H
- replaced function IsPort2Writeable() with IsFileWriteable()
- bugfix in function SettingsProc(), in case IDC_PORT2LOAD an update
  of the port2 writeable checkbox was missing, in case IDOK a
  changed port2 writeable checkbox made a warmstart even if there's
  no port2 filename, changed behavior of port2 area if port2
  filename is given by the command line argument: show actual port2
  file in disabled port2 filename edit field now, also changes of
  the port2 shared and writeable checkboxes have affect now
- changed function OnFileClose(), removed call of KillKML() because
  will be done in ResetDocument()

EMU48.DSP
- added lowbat.c sources

EMU48.H
- added CF_HPOBJ definition from EMU48.C
- changed function prototypes
- extern declaration of global functions

EMU48.RC
- replaced CREATEPROCESS_MANIFEST_RESOURCE_ID definition in manifest
  declaration by 1
- changed version and copyright

ENGINE.C
- changed function WorkerThread(), added control of battery
  measurement thread

EXTERNAL.C
- changed function BeepWave(), removed VS2005 warning
- changed function BeepWin9x(), disabled implementation for x64
  architecture

FILES.C
- changed function PatchNibble(), added saving state that ROM
  address is patched
- bugfix in function UpdatePatches(), the function maybe called for
  patching the ROM when it's already patched, in this case the patch
  restore list was overwritten with the patched data
- changed function PatchRom(), removed VS2005 warning
- changed function MapPort2(), improved checking for valid size
- bugfix in function GetLoadObjectFilename(), removed call of
  HeapFree() which was a remainder of the implementation prior to
  SP42
- changed function WriteStack(), added stack level argument
- changed function LoadObject(), adjusted call of WriteStack() to
  new function prototype

KEYBOARD.C
- bugfix in function ScanKeyboard(), if keyboard reading wasn't
  active a released ON key wasn't cleared in the "in" register

KEYMACRO.C
- removed warnings when compiling under VS2005
- changed function OnToolMacroNew(), minor optimization writing
  macro file header

KML.C
- removed warnings when compiling under VS2005
- changed function DisplayChooseKml(), changed return type of dialog
  box
- changed function ParseLine(), change typecast of szLexString from
  DWORD to DWORD_PTR
- bugfix in function TransparentCircle(), there was no radius value
  check for preventing division by 0 and color low adjust value
  wasn't reached because of wrong color offset divisor -> adjusted
  LOWADJ definition to get similar output to buggy earlier version

KML.H
- changed variable type of nParam[] element of KmlLine structure
  because element is also used as pointer

LOWBAT.C
- new module with battery measurement

MOPS.C
- changed function Npeek() and Nread(), adjusted to new prototype of
  ReadIO()
- changed prototype of function ReadIO(), added update argument
- bugfix in function ReadIO(), the LPE (0x109), RBR LSB (0x114) and
  RBR MSB (0x115) register access had to differ between peek and
  read mode and added implementation of the LB0 and VLBI bits in the
  LPD (0x108) and implementation of the ELBI and EVLBI bits in the
  LPE (0x109) register

OPCODES.C
- bugfix in function o807(), Chipset.in register must be refreshed
  before checking for a pressed key

PCH.H
- added _CRT_SECURE_NO_DEPRECATE definition
- added DWORD_PTR type definition

RESOURCE.H
- removed CREATEPROCESS_MANIFEST_RESOURCE_ID and RT_MANIFEST
  definition

RPL.C
- added definition of EDITLINE
- added function RPL_Depth() returning stack depth
- changed function RPL_Pick(), added check of stack depth
- changed function RPL_Push(), new implementation with stack level
  argument

STACK.C
- adjusted calls of RPL_Push() to new function prototype
- changed function RPL_SetBcd(), removed compiler warning
- bugfix in function OnStackPaste(), case "any other format" must be
  treated as string and not as binary object

TIMER.C
- removed warnings when compiling under VS2005
- changed function CalcT2(), in the case of a pending timer2
  interrupt return always the timer2 value 0xFFFFFFFF


Service Pack 42 for Emu48 Version 1.0

EMU48.C
- bugfix in function OnViewScript(), removed error message because
  it's wrong when script is ok, but log report was leaved with
  Cancel button, also if clause of error message box was never
  reached because error message box had no Cancel button
- changed function OnViewScript(), added call of
  SetWindowPathTitle() to adjust length of window title
- changed function WinMain(), simplified document loading at startup
  and replaced full filename title with length cut filename

EMU48.H
- extern declaration of global functions

EMU48.RC
- changed version

FETCH.C
- changed function EvalOpcode(), included assertion for detecting
  access to packed memory data

FILES.C
- moved function WriteStack() inside file
- added new function GetCutPathName(), creating a length cut
  filename
- added new function SetWindowPathTitle(), replacement for calling
  SetWindowTitle() for getting length cut filenames as title
- changed function OpenDocument(), SaveDocumentAs() and
  RestoreBackup(), replaced call of function SetWindowTitle() with
  SetWindowPathTitle()
- changed function GetOpenFilename(), GetSaveAsFilename(),
  GetLoadObjectFilename() and GetSaveObjectFilename(), moved
  storage place of local file buffer from heap to stack

I28F160.C
- bugfix in function WrStateE8N(), removed "Write to Buffer command
  failed when requesting for the buffer length" code part introduced
  in SP27; this was in reality a workaround for the actually fixed
  Nwrite() flash access bug and illegal data length information
  wasn't handled correctly

IO.H
- added DISP1CTL, LINENIBS, DISP2CTL and BAUD bit definitions

KML.C
- added keyword "Menubar" to pLexToken[] table -> scripts using this
  keyword are parsed with a warning but not with a fatal error
- changed function CreateKmlList(), select only KML files with a
  valid Model statement
- bugfix in function Lex(), EOF without LF at end of non empty line
  wasn't detected as EOL

KML.H
- added TOK_MENUBAR definition

MOPS.C
- bugfix in function UckBit(), when UART is off then the UCK bit
  was always cleared, but it's always set
- bugfix in function Npeek(), Nread() and Nwrite(), flash access
  over a 2KB MMU boundary caused problems in some cases
- bugfix in function WriteIO(), race condition when clearing the SON
  bit in the IOC (0x110) register, the UART was still working so the
  cleared IOC (0x110), RCS (0x111), TCS (0x112), RBR (0x114,0x115)
  and TBR (0x116,0x117) register can be overwritten by the serial
  thread

SERIAL.C
- bugfix in function CommOpen(), method of port closing was illegal
  because COM port dependent threads hadn't been stopped


Service Pack 41 for Emu48 Version 1.0

DDESERV.C
- bugfix in function DdeCallback(), used wrong return in XTYP_POKE
  case for calculator models without stack

DEBUGGER.C
- changed function UpdateMemoryWnd(), added follow dispatcher
- new function OnMemFollow() to handle follow menu entries
- changed function OnDblClick() and OnKeyUpDown(), replaced all
  function calls of UpdateMemoryWnd() with ViewMemWnd() because of
  the modified behavior of UpdateMemoryWnd()
- changed function Debugger(), added "Follow" menu entry
  initialization in WM_INITDIALOG and menu commands handler in
  WM_COMMAND section

DISPLAY.C
- added Zoom 3 to all nLcdZoom range assertions
- changed function UpdateMainDisplay(), UpdateMenuDisplay(),
  WriteToMainDisplay() and WriteToMenuDisplay(), added Zoom factor 3
  handling

EMU48.H
- added definition with valid calculator models
- added macro with model validation code

EMU48.RC
- changed IDD_KMLLOG, replaced "Always" text with "Show Script
  compilation result next time"
- added "Follow" menu entries in debugger "Memory" context menu
- changed version and copyright

FILES.C
- bugfix in function NewDocument(), the backup now behave like with
  function OpenDocument() -> the backup now contain the emulator
  state before the new session and not the new session itself
- bugfix in function OpenDocument(), after reading CPU state, port
  pointers must immediately be deleted because on error condition
  function ResetDocument() tries to free this memory; added check
  for valid calculator model
- bugfix in function RestoreBackup(), window title wasn't updated
- bugfix in function CreateBIPalette(), for 16 and 32 bitcount
  bitmaps no logical palette was created
- bugfix in function LoadBitmapFile(), function blocked loading
  bitmap when ROM file was missing

KML.C
- changed table szLexDelim[], removed first element
- added new table eIsGlobalBlock[] with valid block tokens
- added new function IsGlobalBlock(), checking if token inside
  eIsGlobalBlock[] table
- changed function Lex(), added assertion for mode checking
- changed function ParseLines(), added syntax checking for command
  tokens and removed "Open block." message
- changed function ParseBlocks(), added syntax checking for block
  tokens
- changed function InitLcd(), added zoom factor 3 to range check of
  TOK_ZOOM
- bugfix in function InitButton(), nested scancode block commands
  hadn't handled correctly
- bugfix in function LoadKMLGlobal(), keyword "Global" had only been
  detected as first command in KML script
- changed function InitKML(), changed checking for valid Model
  argument and changed the corresponding error message

KML.H
- adjusted definitions of LEX_BLOCK, LEX_COMMAND and LEX_PARAM to
  modified table szLexDelim[]

RESOURCE.H
- added several definitions

RPL.C
- added new function RPL_GarbageCol() for doing a garbage collection
- changed function RPL_CreateTemp(), added garbage collection on low
  memory condition


Service Pack 40 for Emu48 Version 1.0

DISPLAY.C
- bugfix in function UpdateContrast(), used background Color 0 in
  calculator off state even if Color 32 was defined
- bugfix in function CreateLcdBitmap(), DIB section shouldn't
  created from the memory DC

EMU48.C
- added function IsPort2Writeable() to check if read only file
  attribute is not set on port2 file
- major changes in function SettingsProc(), added "Port 2 is
  Writeable" handling and make port2 changeable without closing the
  current emulation session
- changed function SaveChanges(), default button for confirming the
  "Do you want to save changes ?" message depends now on the
  "SaveDefaultConfirm" INI-File setting (1=yes / 0=no button)

EMU48.H
- extern declaration of global variable and functions

EMU48.RC
- added item "Port 2 is Writeable" in settings dialog
- changed version

ENGINE.C
- bugfix in function WorkerThread(), when changing into SM_RUN state
  display contrast must also be restored

FILES.C
- changed function CrcPort2(), made it global accessible

KML.C
- added keywords "Topbar" and "Vga" to pLexToken[] table -> scripts
  using these keywords now are parsed with warnings and not quit
  with a fatal error any more
- bugfix in function SkipWhite(), skipping remark text hadn't stop
  at string end
- bugfix in function ParseBlocks(), stopped script parsing without
  error at unknown block token
- bugfix in function SkipLines(), TOK_END was handled wrong -> this
  caused a RunKey end if condition of TOK_IFPRESSED or TOK_IFFLAG
  was false and there was no TOK_ELSE inside this level
- bugfix in function KillKML(), ROM type wasn't reset to the preset
  value at the end

KML.H
- added TOK_TOPBAR and TOK_VGA definition

RESOURCE.H
- added definition

RPL.C
- added function RPL_GetSystemFlag() returning the state of the
  given system flag

SETTINGS.C
- changed function ReadSettings() and WriteSettings(), added item
 "SaveDefaultConfirm" in section [Files] in the INI-File

STACK.C
- added helper functions RPL_GetZInt() and RPL_SetZInt() to handle
  HP49G Precision Integer objects
- added function DoInt() to handle a HP49G Precision Integer object
- changed function OnStackCopy() and OnStackPaste(), added HP49G
  Precision Integer support (limited to 127/128 digits incl. sign)

TIMER.C
- changed function CheckT1() and CheckT2(), minor optimization in
  checking if INT or WAKE bit is set


Service Pack 39 for Emu48 Version 1.0

DISPLAY.C
- bugfix in function CreateMainBitmap(), in error case hMainDC
  variable wasn't cleared

EMU48.C
- changed function SettingsProc(), added sound handling
- moved function OnStackCopy() and OnStackPaste() to STACK.C
- changed function WinMain(), added accelerator key access for menus

EMU48.DSP
- added stack.c sources

EMU48.H
- extern declaration of global variables and functions

EMU48.RC
- added "Sound" group in Settings dialog
- changed menu text "Copy String" to "Copy Stack" and menu text
  "Paste String" to "Paste Stack"
- added accelerator resource
- changed version

EXTERNAL.C
- added function BeepWave(), beeper function using sound card
- added function BeepWin9x(), PC speaker function for working on
  Win9x
- changed function External(), removed range checking of duration;
  call function BeepWin9x() on Win9x instead of Beep() or in the
  case of wave sound the function BeepWave()

KML.C
- bugfix in function InitKML(), changed log message for no "Model"
  definition found and a missing "Bitmap" definition wasn't detected

PCH.H
- added include conio.h

RESOURCE.H
- added several definitions

SETTINGS.C
- changed function ReadSettings() and WriteSettings(), added item
  "WaveBeep" and "WaveVolume" in section [Emulator] in the INI-File

STACK.C
- new module with the message handler functions OnStackCopy() and
  OnStackPaste() prior located in EMU48.C
- changed function OnStackCopy() and OnStackPaste(), they can now
  also copy real numbers from and to the clipboard

TIMER.C
- bugfix in function SetT1(), fixed unsynchronized access to timer1
  value, stop timer1 only if running and restart timer1 only when
  timer2 is running


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
- changed function DdeCallback(), removed delays after ON key state
  change

EMU48.C
- changed function SettingsProc(), added IDC_PORT2LOAD button
  handling
- changed function OnStackPaste(), minor code optimization
- changed function OnDropFiles(), OnStackPaste() and OnObjectLoad(),
  removed delays after ON key state change
- bugfix in function WinMain(), szCurrentKml wasn't initialized

EMU48.RC
- added "..." button Settings dialog
- changed version

ENGINE.C
- bugfix in function UpdateKdnBit(), wrong DWORD truncation of
  Chipset.cycles variable

FILES.C
- changed function WriteStack(), minor optimization when saving as
  string
- bugfix in function OpenDocument(), check for empty KML file name
  was wrong, so the error handler of the following InitKML() was
  always called in this case
- changed function LoadObject(), file access is now shared
- changed function DibNumColors() and CreateBIPalette(), changed
  argument qualifier

KML.C
- changed variable qualifier of eIsBlock[] table and removed
  TOK_NONE item from it
- bugfix, global variables pKml and pKmlList hadn't be initialized
- removed usage of global variables bKmlLogOkEnabled and nKmlFiles
- changed function AddToLog(), changed argument qualifier and minor
  code optimization
- changed function PrintfToLog(), use a local buffer instead of the
  heap for the output buffer of the wvsprintf() function, this helps
  to reduce fragmentation of the heap
- changed function KMLLogProc(), minor code optimization and removed
  use of global variable bKmlLogOkEnabled and windows redraw in the
  WM_INITDIALOG case
- changed function DisplayKMLLog(), removed use of global variable
  bKmlLogOkEnabled and transfer state of bOkEnabled over the lParam
  argument to the dialog box procedure
- bugfix in function CreateKmlList(), fixed a memory leak in the
  case of no title
- changed function ChooseKMLProc(), minor code optimization
- changed function IsBlock(), minor code optimization
- bugfix in function ParseString(), fixed memory leak in error case
  and optimized implementation
- changed function IncludeLines(), IncludeBlocks(), LoadKMLGlobal()
  and InitKML(), file access is now shared

OPS.H
- bugfix in function Nsub() and Nrsub(), in some situations wrong
  results in dec mode with illegal decimal number entry as 2nd
  operator

RESOURCE.H
- added definition

TIMER.C
- bugfix in function RescheduleT2(), better accuracy on conversation
  of timer2 ticks into multimedia timer ms
- changed function StartTimers(), added calculation of maximum
  timer2 ticks that can be handled by one timer event
- changed function StartTimers() and StopTimers(), changed
  multimedia timer to best possible timer resolution instead of
  risking to fail with 1 ms resolution preset


Service Pack 36 for Emu48 Version 1.0

CHECKBOX.BMP
- fixed one pixel with wrong color

DEBUGGER.C
- bugfix in function Debugger(), used function to set icon which
  hasn't worked properly under WinXP

DISPLAY.C
- changed function UpdateMenuDisplay(), minor code optimizations
- changed function WriteToMenuDisplay(), code optimizations

EMU48.C
- changed function UpdateWindowStatus(), added macro specific menu
  control
- changed function CopyItemsToClipboard(), simplified implementation
  in UNICODE mode by saving the data in the CF_UNICODETEXT format
- changed function OnLButtonDown(), OnLButtonUp(), OnMouseMove(),
  OnKeyDown() and OnKeyUp(), disable function handling when in macro
  play mode
- changed function MainWndProc(), added some macro handler functions

EMU48.DSP
- added keymacro.c sources

EMU48.H
- extern declaration of global variables and functions

EMU48.RC
- changed "Always" checkbox in "KML Script Compilation Result"
  dialog from a pushlike to normal one for better readability under
  WinXP style
- added "Macro Settings" dialog
- added Menuitem Tools "Macro..."
- changed version and copyright

ENGINE.C
- bugfix in function AdjustSpeed(), on large operations the
  workaround condition for Win2k was detected and the following
  synchronizing failed because the CPU didn't got the free running
  cycles for the waited time
- changed function WorkerThread(), close running keyboard macros
  when switching into invalid state

FILES.C
- changed function MapRom(), added detection for packed ROM images
- bugfix in function OpenDocument(), reload KML button state from
  last document close

KEYBOARD.C
- changed function KeyboardEvent(), added call to key recording
  function KeyMacroRecord()
- bugfix in function KeyboardEvent(), prevent buffer overflow with
  too big out codes on Chipset.Keyboard_Row array

KEYMACRO.C
- new module supporting keyboard macro functions

KML.C
- added function ReloadButtons(), update internal button state from
  chip keyboard matrix content
- added function PlayKey(), handle button with OutIn code

KML.H
- added ReloadButtons() and PlayKey() function prototype

MOPS.C
- bugfix in function WriteIO(), writing to timer2 failed if first
  writing address was before the timer2 address area
- changed function WriteIO(), changing the CONTRLSB (0x101) or the
  DISPTEST (0x102) register doesn't effect any display pointer, so
  update request for recalculating the pointers removed

OPCODES.C
- bugfix in function o802() and o803(), the r=IN opcodes work also
  on odd addresses in the IO register memory mapping area

PCH.H
- added VERIFY macro

RESOURCE.H
- added several definitions

SETTINGS.C
- changed function ReadSettings() and WriteSettings(), added section
  [Macro] in INI-File


Service Pack 35 for Emu48 Version 1.0

DDESERV.C
- replaced all LocalAlloc() with HeapAlloc() memory requests

DEBUGGER.C
- replaced all LocalAlloc() with HeapAlloc() memory requests
- changed function UpdateProfileWnd(), replaced CONST TCHAR * with
  LPCTSTR

DISASM.C
- changed several variable qualifiers from TCHAR * to LPCTSTR and
  replaced rest of TCHAR * by LPTSTR
- changed variable qualifier of hp_reg_1_af and hp_reg_2_af
- changed function append_tab(), speed optimization
- changed function append_field(), removed use of temporary variable

DISPLAY.C
- renamed variable nLcdDoubled to nLcdZoom
- changed function UpdateMainDisplay() and UpdateMenuDisplay(),
  minor improvement by reading each display line now with the actual
  display start pointer

EMU48.C
- renamed variable nLcdDoubled to nLcdZoom
- replaced all LocalAlloc() with HeapAlloc() memory requests
- bugfix in function CopyItemsToClipboard(), don't worked in UNICODE
  mode because character translation was missing

EMU48.H
- extern declaration of global variable
- moved T2CYCLES definition from OPCODES.H
- renamed variable nLcdDoubled to nLcdZoom
- changed function DuplicateString(), replaced LocalAlloc() with
  HeapAlloc() memory request

EMU48.RC
- changed version
- changed resource language description to English

FILES.C
- replaced all LocalAlloc() with HeapAlloc() memory requests
- changed function CreateBIPalette(), allocated memory for
  LOGPALETTE isn't initialized with zero any more

KML.C
- renamed variable nLcdDoubled to nLcdZoom
- replaced all LocalAlloc() with HeapAlloc() memory requests
- bugfix in function PrintfToLog(), temporary buffer was half of
  size in UNICODE mode
- changed function BrowseFolder() and ChooseKMLProc(), renamed
  IDC_EMU48DIR to IDC_EMUDIR and IDC_EMU48DIRSEL to IDC_EMUDIRSEL
- bugfix in function BrowseFolder(), the shell's allocator release
  was missing in one case
- changed function ChooseKMLProc(), optimized IDC_EMUDIRSEL command
  case
- bugfix in function ParseString(), strings greater 127 characters
  caused a buffer overflow in UNICODE mode
- bugfix in function KillKML(), display size wasn't reset to the
  preset value at the end

RESOURCE.H
- renamed IDC_EMU48DIR to IDC_EMUDIR
- renamed IDC_EMU48DIRSEL to IDC_EMUDIRSEL

RPL.C
- replaced all LocalAlloc() with HeapAlloc() memory requests

OPCODES.H
- moved T2CYCLES definition to EMU48.H

OPS.H
- changed function Nadd(), optimized "illegal number in dec mode"
  detection
- changed function Ninc(), Ndec(), Nsub() and Nrsub(), removed
  register wrap handling
- changed function Nneg(), optimized non zero value handling
- bugfix in function Nsrc(), the Sticky Bit (SB) wasn't handled in
  all rSRC opcodes

TIMER.C
- bugfix in function CalcT2(), estimated timer2 ticks were sometimes
  to large because there was a misbehavior between real time clock
  and counted CPU cycles when in free running mode
- changed function RescheduleT2(), optimized initialization of
  synchronization variables used in CalcT2()
- changed function SetHP48Time(), changed variable typ of ticks and
  time from LONGLONG to ULONGLONG
- changed function ReadT2(), minor optimization calculating the
  timer2 value


Service Pack 34 for Emu48 Version 1.0

CURSOR.C
- new module to create a hand cursor

DEBUGGER.C
- bugfix in function NewValue(), EnterAddr(), EnterBreakpoint(),
  EditBreakpoint(), InfoIntr() and InfoWoRegister(), uncompleted
  wParam argument decoding in WM_COMMAND case
- replaced function OnToggleCheck() with ToggleBreakpointItem(), a
  more general function to toggle a breakpoint check box
- changed function EditBreakpoint(), adjusted LBN_DBLCLK case to use
  the new ToggleBreakpointItem() function and modified behavior of
  VK_SPACE to toogle all selected items

DISPLAY.C
- replaced variable use of hOldLcdBitmap with hLcdBitmap
- replaced variable use of hOldMainBitmap with hMainBitmap

EMU48.C
- removed limitation to 16 COM ports
- changed variable qualifier of szLicence
- added global variables
- added Critical Section initialization for CPU slow down
- changed function SetWindowTitle(), changed argument qualifier
- bugfix in function SettingsProc(), Disasm() and About(),
  uncompleted wParam argument decoding in WM_COMMAND case
- changed function OnCreate() and OnDestroy(), added load and
  destroy of two new cursor resources
- bugfix in function MainWndProc(), wrong wParam argument decoding
  in WM_SYSCOMMAND case
- changed function WinMain(), removed class cursor from main window
- bugfix in function WinMain(), fixed possible buffer overflows in
  state file loading message

EMU48.DSP
- added cursor.c sources

EMU48.H
- extern declaration of global variables and functions

EMU48.RC
- changed IDC_DEBUG_MEM from static to listbox control, looks better
  in connection with WinXP style
- changed version and copyright

FILES.C
- renamed variable szEmu48Directory[] to szEmuDirectory[]
- changed buffer size information of files and pathes from 260 to
  MAX_PATH definition
- bugfix in function GetOpenFilename(), GetSaveAsFilename(),
  GetLoadObjectFilename() and GetSaveObjectFilename(), adjusted
  size of temporary buffer to size of destination buffer and fixed
  memory allocation bug in UNICODE mode
- changed function LoadBitmapFile(), it's better to validate the
  pbyRom instead of the hRomFile variable to check if the ROM is
  loaded to avoid possible side effects (ROM loaded by resource) and
  removed uncalled code part

ENGINE.C
- bugfix in function AdjustSpeed(), AdjKeySpeed() and SetSpeed(),
  reference setting wasn't synchronized

KML.C
- renamed variable szEmu48Directory[] to szEmuDirectory[]
- bugfix in function KMLLogProc(), uncompleted wParam argument
  decoding in WM_COMMAND case and update of the bAlwaysDisplayLog
  variable only in the IDOK and IDCANCEL case
- bugfix in function ChooseKMLProc(), uncompleted wParam argument
  decoding in WM_COMMAND case and added UNREFERENCED_PARAMETER
  statement
- bugfix in function ParseLines() and ParseBlocks(), fixed problem
  of uninitialized variable which may occur on parsing corrupt KML
  files
- bugfix in function KillKML(), set variables bDebug and nKMLFlags
  to there startup values
- changed function MouseMovesTo(), added code part to select cursor

OPCODES.C
- bugfix in function o3X(), o8082X(), oBb0(), oBb1(), oBb2(),
  oBb3(), oBb4(), oBb5(), oBb6() and oBb7(), used wrong cpu cycles

PCH.H
- added IDC_HAND definition for non Win2k OS project

SETTINGS.C
- renamed variable szEmu48Directory[] to szEmuDirectory[]
- changed function ReadSettings() and WriteSettings(), added item
  "ClassicCursor" in section [KML] in the INI-File


Service Pack 33 for Emu48 Version 1.0

DEBUGGER.C
- bugfix in function Debugger(), removed illegal call of
  DestroyMenu() in WM_DESTROY message handler
- added function UpdateDbgCycleCounter() to handle a 64 bit CPU
  cycles counter in debug mode
- added implementation of "Profiler" dialog box

DEBUGGER.H
- extern declaration of global function

EMU48.C
- changed function WinMain(), added non modal "Profiler" dialog box
  in main message handler

EMU48.H
- extern declaration of global variable

EMU48.RC
- changed version and copyright
- bugfix in dialogs, some WS_EX_ styles (especially window borders)
  don't worked on some operating systems
- added Menuitem Info "Profiler..." in debugger menu
- added "Profiler" dialog

ENGINE.C
- bugfix in function Debugger(), fixed problem at quitting debugger
  when last executed opcode was SHUTDN
- changed function Debugger(), added call for 64 bit cpu cycle
  counter adjust

KEYBOARD.C
- bugfix in function KeyboardEvent(), CPU slow down by calling the
  function AdjKeySpeed() on key pressed must be activated here

OPCODES.C
- changed function o802() and o803(), removed AdjKeySpeed() call

RESOURCE.H
- added definitions

RPL.C
- replaced object prolog entries by definitions

SERIAL.C
- bugfix in function CommSetBaud(), changed DCB setting from 1 to 2
  stop bits which is closer to the original 2-3/16 stop bits

TIMER.C
- changed function TimeProc(), removed check if timer running


Service Pack 32 for Emu48 Version 1.0

DDESERV.C
- bugfix in function DdeCallback(), DDE commands POKE and REQUEST
  worked also on machines with no stack and debugger control in DDE
  command POKE was missing

DEBUGGER.C
- bugfix in function OnKeyF7() and OnKeyF8(), on expected longer
  operations like with skipping interrrupt code, the menu and
  toolbar should be set into run mode; a general setting into run
  mode wasn't used because of menu flickering
- changed function OnStackPush() and OnStackPop(), stack elements
  can be pushed or poped on any stack level now
- bugfix in function OnLButtonUp(), forgot P and WP field selection
  update on P register changing
- changed function OnKeyRightLeft(), code optimizations
- changed function NotifyDebugger(), handle changed argument type
- bugfix in function Debugger(), set the menu and toolbar into run
  mode at startup, this prevents wrong active buttons when interrupt
  code should be skipped and the calculator can't leave the
  interrupt code because the ON key is permanently down or another
  interrupt source prevent leaving the interrupt handler

DEBUGGER.H
- added new debugger notify defines

EMU48.C
- changed function OnCreate(), don't enable DragAcceptFiles() here
- changed function OnDropFiles(), checking calculator model to
  disable stack writing isn't necessary any more

EMU48.DSP
- new makefile for MSVC 6.0

EMU48.H
- extern declaration of global function (DLL version)
- added hardware type define

EMU48.RC
- changed version

ENGINE.C
- changed function Debugger(), added ability to detect an ASM and
  RPL breakpoint on the same address
- bugfix in function ResumeDebugger(), resume may hung in CPU
  shutdown mode

FILES.C
- changed function OpenDocument() and SaveDocumentAs(), added
  callback notify function call for DLL version

KML.C
- added "Hardware" keyword in Global section
- changed function CreateKmlList(), added checking the "Hardware"
  keyword to ignore KML scripts for other emulators
- changed function InitGlobal(), added logfile output for the
  "Hardware" keyword
- changed function InitKML(), enable object "Drag and Drop"
  calculator model dependent here now

KML.H
- added TOK_HARDWARE definition


Service Pack 31 for Emu48 Version 1.0

DEBUGGER.C
- bugfix in function Debugger(), used wrong background color in
  WM_CTLCOLORSTATIC message handler for WinXP style

DISPLAY.C
- bugfix in function WriteToMainDisplay() and WriteToMenuDisplay(),
  drew to display even if the DON bit in the =BITOFFSET (0x100)
  register was cleared

EMU48.C
- added global variable
- changed function SettingsProc(), added IDC_OBJECTLOADWARNING check
  box handling
- bugfix in function OnViewSettings(), removed calling of function
  ReadSettings() because INI file settings may be invalid here
- changed function OnObjectLoad(), to disable warning message use a
  global variable now

EMU48.H
- extern declaration of global variable
- changed prototype of function ScanKeyboard()

EMU48.RC
- added item "Show Load Object Warning" in Settings dialog
- added "..." button in "Choose Your KML Script" dialog
- changed version

ENGINE.C
- bugfix in function UpdateKdnBit(), update KDN bit only when
  keyboard interrupt is on and the timer is running

FILES.C
- bugfix in function NewDocument(), set the RST bit in the LPE
  (0x109) register to indicate a POR (Power On Reset)
- bugfix in function RestoreBackup(), when the KML script
  initialization failed the Chipset.Port0, Chipset.Port1 and
  Chipset.Port2 pointer referenced to unallocated memory

IO.H
- added LPD and LPE definitions

KEYBOARD.C
- bugfix in function ScanKeyboard(), a stopped timer don't prevent
  keyboard status update, it prevents the 1ms keyboard polling and
  generating a keyboard interrupt; also now distinguish keyboard
  update between 1ms keyboard poll and direct update with A=IN and
  C=IN command
- changed function KeyboardEvent(), call function ScanKeyboard() in
  the 1ms poll context now

KML.C
- new functions BrowseCallbackProc() and BrowseFolder(), helper
  functions to browse a directory
- changed function ChooseKMLProc(), added implementation of browser
  button, removed WM_SETTEXT message handler and changed WM_COMMAND
  handler from 'if' to 'switch' structure
- bugfix in function ChooseKMLProc(), used wrong array size of
  szEmu48Directory in UNICODE mode

MOPS.C
- bugfix in function CpuReset(), set the RST bit in the LPE (0x109)
  register to indicate NRES reset
- bugfix in function Npeek(), Nread() and Nwrite(), wrap around over
  address #FFFFF failed
- bugfix in function ReadIO(), reset the RST bit in the LPE (0x109)
  register after reading
- bugfix in function WriteIO(), added implementation of the RST bit
  in the LPE (0x109) register

OPCODES.C
- renamed define BIGENDIAN to _BIGENDIAN to avoid problems with the
  definition in WINSOCK2.H
- bugfix in function o158x(), o159x(), o15Cx(), o15Dx(), o15Ax(),
  o15Bx(), o15Ex(), o15Fx(), o807(), o819f0(), o819f1(), o819f2(),
  o819f3(), oF0(), oF1(), oF2(), oF3(), oF4(), oF5(), oF6() and
  oF7(), used wrong cpu cycles
- changed function o800() and o801(), call function ScanKeyboard()
  in the 1ms poll context now
- bugfix in function o802() and o803(), added ScanKeyboard()
  function call for direct Chipset.in update
- bugfix in function o8080(), added ScanKeyboard() function call to
  activate 1ms keyboard polling
- changed function o80810(), call function ScanKeyboard() in the
  direct update context now

OPCODES.H
- changed some remarks

PCH.H
- added include shlobj.h

RESOURCE.H
- added definition

SETTINGS.C
- changed definitions, allows setting of INI filename and registry
  path in the makefile now
- changed function ReadSettings() and WriteSettings(), added item
  "LoadObjectWarning" in section [Files] in the INI-File


Service Pack 30 for Emu48 Version 1.0

DEBUGGER.C
- bugfix in function Debugger(), used wrong debugger window position
  when task bar was on top or left side
- added implementation of "Write-Only Register" dialog box

DDESERV.C
- added io.h in header definition
- removed usage of Chipset.dispon variable

DISPLAY.C
- added sources of gray scale emulation (experimental)
- replaced the LCD1_ROW by the LCD_ROW definition and the use of the
  LCD2_ROW and the LCD3_ROW definitions by a calculation base on
  LCD_ROW
- changed macro LINES(), added brackets forcing operator priority
- changed BITMAPINFO color table variable type from DWORD to RGBQUAD
- changed LCD bitmap from 64 palette entries to the number of used
  colors in the LCD area, so function UpdateContrast() do not change
  the drawing patterns to a new palette entry, it change the palette
  itself now
- bugfix in function UpdateContrast(), switch palette to LCD off
  background color if display is off
- bugfix in function DestroyLcdBitmap(), contrast palette wasn't
  restored to startup colors
- changed function WriteToMainDisplay(), used wrong sizeof argument
  to get the 4 byte x-multiplier in the calculation of the memory
  position in the LCD bitmap
- bugfix in function StartDisplay(), the VBL counter of a switched
  on display starts at the LINECOUNT (0x128,0x129) register content

EMU48.C
- removed usage of Chipset.dispon variable
- bugfix in function SetCommList(), used wrong NO_SERIAL string
  definition for UNICODE mode
- bugfix in function OnDestroy(), call function SwitchToState() only
  if CPU emulation thread is running
- bugfix in function OnViewCopy(), clipboard contained wrong data
  when left display margin was unequal to zero

EMU48.H
- changed prototype of function StartDisplay()
- extern declaration of global function

EMU48.RC
- fixed misspellings "hexdezimal" to "hexadecimal"
- added "Write-Only Register" dialog
- added Windows XP manifest resource
- changed version and copyright

EMU48.XML
- manifest file for Windows XP

ENGINE.C
- changed function WorkerThread(), added parameter to StartDisplay()
  function call

FILES.C
- bugfix in function NewDocument(), OpenDocument() and
  RestoreBackup(), used wrong window restore position when task bar
  was on top or left side
- bugfix in function SaveBackup(), get workspace instead of screen
  coordinates of main window
- changed function LoadObject(), changed text output of "load error"
  message boxes

KML.C
- changed function InitAnnunciator() and DrawAnnunciator(),
  determine the number of valid entries now from the annunciator
  array size

MOPS.C
- removed usage of Chipset.dispon variable
- bugfix in function Npeek(), fixed most of the wrong read values in
  the I/O register area
- changed function Nwrite(), added conditional gray scale compiling
  and added parameter to StartDisplay() function call
- bugfix in function WriteIO(), after changing the DON bit in
  BITOFFSET (0x100) the display contrast must be updated as well

RESOURCE.H
- added some definitions

SERIAL.C
- redesign of character transmit part, on some PC systems corrupted
  characters were sent

TIMER.C
- workaround for Win2k in function CalcT2(), when detecting a
  "negative" time use the CPU cycles for new timer2 value


Service Pack 29 for Emu48 Version 1.0

DEBUGGER.C
- bugfix in function UpdateMiscWnd(), readded trailing spaces in
  "On" text
- changed function Debugger(), replaced bDbgEnable with nDbgState
  access

DEBUGGER.H
- added new debugger state defines

DISPLAY.C
- added variable and functions from MOPS.C
- new functions StartDisplay() and StopDisplay() to control display

EMU48.C
- added VOID as parameter in functions with no argument
- added Critical Section initialization for gray scale emulation
- changed function UpdateWindowStatus(), OnDropFiles(),
  OnStackPaste() and OnObjectLoad(), replaced bDbgEnable with
  nDbgState access
- changed function OnDropFiles(), OnFileClose(), OnStackPaste() and
  OnObjectLoad(), added debugger control

EMU48.H
- added defines for conditional gray scale compiling
- removed declaration of bDbgEnable
- extern declaration of global variables and functions

EMU48.RC
- changed version and copyright

ENGINE.C
- removed global variable bDbgEnable, replaced by a state in the
  nDbgState variable
- added new functions SuspendDebugger() and ResumeDebugger() for
  debugger control
- changed functions Debugger(), WaitForSleepState(), SwitchToState()
  and WorkerThread(), added debugger control instead of general
  debugger switching off
- changed function CheckSerial(), removed interrupt handling and
  made function public
- changed function SwitchToState() and WorkerThread(), replaced
  bDbgEnable with nDbgState access
- changed function WorkerThread(), main loop don't check status of
  serial port any more, serial port must be initialized before
  entering the RUN state now, added start/stop VBL counter at
  entering/leaving the RUN state

FILES.C
- changed function WriteStack(), minor optimization

MOPS.C
- removed variable ioc_acc
- moved variable byVblRef and the functions F4096Hz() and
  GetLineCounter() to DISPLAY.C
- changed function CpuReset(), must close serial port here
- changed function WriteIO(), control of the BITOFFSET (0x100)
  register calls now the functions StartDisplay() and StopDisplay()
  to modify the VBL counter reference
- changed function WriteIO(), changing the IOC (0x110) register
  must also update the serial port status, because this isn't
  handled in the CPU main loop any more

TIMER.C
- changed function RescheduleT2(), calculate now ceil of time delay
  to reduce checking of timer2 value without timer2 overflow


Service Pack 28 for Emu48 Version 1.0

DEBUGGER.C
- bugfix in table MemMap[], NCE3 reference in HP39/40 part was wrong
- bugfix in function SetMappingMenu(), used wrong variable type for
  UNICODE mode
- changed function UpdateMiscWnd(), removed trailing spaces in text
- new functions OnStackPush(), OnStackPop() and OnStackModify() and
  other changes for implementation of the stack context menu
- changed function OnFindOK(), minor optimizations
- changed function OnNewValue(), now returns exit condition

DISPLAY.C
- removed usage of Chipset.dispon variable

EMU48.C
- bugfix in function SetCommList(), detection of COM ports larger
  than COM9 failed
- moved shutdown of CPU emulation thread from the WinMain() to the
  OnDestroy() function to avoid trouble with closed window DC

EMU48.DSP
- added configuration "Release Unicode"
- added configuration "Debug Unicode"

EMU48.RC
- added "Stack" menu entries
- added accelerator key in "Find" dialog
- changed version and copyright

I28F160.C
- bugfix in table byQueryTab[], content of not specified offset 0x03
  is 0x02; offset 0x1B and 0x1D contain 0x30 in the real chip
- changed function WrStateE8N(), WrStateE8D() and WrState60D(), use
  device specific data from query table instead of program constants
- bugfix in function WrStateE8C(), don't set the BWSLBS bit in the
  status register on trying to set a 0 bit
- changed function WrState40D(), removed useless increment
- bugfix in function WrState30C(), don't set the ECLBS bit in the
  status register when trying to erase a lock bit with WP# = low
- changed function WrState20C() and WrState30C(), use device
  dimensions from query table now and optimized data filling part
- bugfix in function WrState60D(), the BWSLBS or the ECLBS bit in
  the status register is set when trying to modify lock bits with
  WP# = low
- bugfix in function RdStateId() and RdStateQuery(), Flash commands
  "Read Identifier Codes" and "Read Query" now behave on illegal
  address access like the original calculator

RESOURCE.H
- added definitions

SERIAL.C
- bugfix in function SerialThread(), added implementation of the RER
  bit in the RCS (0x111) register for receiver BREAK condition
- bugfix in function CommOpen(), opening COM ports larger than COM9
  failed
- bugfix in function CommTxBRK(), added LPB (Loop Back) emulation


Service Pack 27 for Emu48 Version 1.0

DEBUGGER.C
- various changes in many functions for implementation of the module
  memory view
- changed function CreateToolbar(), replaced InitCommonControlsEx()
  with InitCommonControls() function call to be compatible with the
  project version 0x0200

EMU48.C
- changed function Disasm(), can use value of external port2 size
  directly now

EMU48.RC
- added "Mapping" menu entries
- changed version

FILES.C
- changed function MapPort2(), don't limit port2 to 128KB here

I28F160.C
- bugfix in function WrStateE8N(), a "Write to Buffer" command
  failed when requesting for the buffer length

KML.C
- added VOID as parameter in function prototypes
- replaced structure names changed in KML.H into the new ones

KML.H
- changed structure names Token to KmlToken, Line to KmlLine, Block
  to KmlBlock, Button to KmlButton and Annunciator to KmlAnnunciator
  because the Line and Button definition clash with the MacOS API

MOPS.C
- changed function MapP2(), limit port2 mapping size to 128KB here

OPCODES.C
- changed function o138(), o139(), o13A(), o13B(), o13C(), o13D(),
  o13E(), o13F(), o19d2(), o1Ad4(), o1Dd2() and o1Ed4(), added big
  endian machine support (use define BIGENDIAN)

PCH.H
- added _WIN32_IE definition for project version

RESOURCE.H
- added definitions


Service Pack 26 for Emu48 Version 1.0

DEBUGGER.C
- bugfix in function ViewMemWnd(), wrong ASCII view of characters in
  text area, strings are saved in LSB, MSB order
- changed function Debugger(), save and restore debugger window
  position in session now
- bugfix in function Debugger(), missing initialization of menu
  entry CODE Object Breakpoints
- bugfix in function OnFindOK(), search for ASCII character in
  LSB, MSB order

DISPLAY.C
- bugfix in function ResizeWindow(), 'Offset' command in KML script
  section 'Background' hasn't worked

EMU48.C
- added Critical Section initialization
- bugfix in function OnPaint(), 'Offset' command in KML script
  section 'Background' hasn't worked

EMU48.H
- extern declaration of global variable and function

EMU48.RC
- changed version

FILES.C
- changed functions ResetDocument(), ResetBackup() and
  InitializeOFN(), replaced function FillMemory() with ZeroMemory()
- changed function OpenDocument(), can handle various Chipset sizes
  now

KML.C
- bugfix in function DrawButton() and ClipButton, 'Offset' command
  in KML script section 'Background' hasn't worked

MOPS.C
- bugfix function WriteIO(), when writing to the IOC (0x110)
  register a possible USRQ interrupt wasn't generated
- changed function WriteIO(), writing the RER bit of the RCS (0x111)
  register and writing the TBF bit of the TBR (0x116,0x117) register
  is thread save now
- bugfix function WriteIO(), added implementation of the BRK bit in
  the TCS (0x112) register
- changed function WriteIO(), removed NINT2 line update at writing
  TBR (0x116,0x117) register, is doing in function CommTransmit()

PCH.H
- added include ctype.h

SERIAL.C
- minimized size of PC receive buffer
- bugfix in function SerialThread(), CommOpen(), CommClose() and
  CommTransmit(), added implementation of the RER bit (only for
  framing errors) in the RCS (0x111) register and of the TBF and TBZ
  bit in the TCS (0x112) register
- new function CommTxBRK(), handle BREAK condition on Tx line


Service Pack 25 for Emu48 Version 1.0

DDESERV.C
- replaced variable type _TCHAR with TCHAR
- added some UNREFERENCED_PARAMETER statements

DEBUGGER.C
- replaced variable type _TCHAR with TCHAR
- added UNREFERENCED_PARAMETER statement
- bugfix in function UpdateCodeWnd(), used uninitialized variables
  at first call and optimized actual address searching
- changed function UpdateStackWnd(), save stack content also as
  value for easier access
- changed function OnKeyF6(), optimized getting address of selected
  item
- changed function OnKeyF8(), optimized GOSUB, GOSUBL, GOSBVL
  decoding
- replaced functions OnNOP3Break(), OnRplBreak() and
  OnInterruptsStepOverInt() with OnToggleMenuItem()
- changed function OnDblClick(), double click on stack window item
  now shows the address content in the code window
- bugfix in function InfoIntr(), variable lIndex may be used without
  having been initialized

DISASM.C
- replaced variable type _TCHAR with TCHAR
- bugfix in function disassemble(), the r=-r fs opcodes showed
  always as r=r-1 fs opcodes

DISPLAY.C
- added UNICODE support in debug output parts
- used wrong black and white RGB definition, so default display
  color was white on black background and not vice versa
- changed function UpdateContrast(), optimization

EMU48.C
- replaced variable type _TCHAR with TCHAR
- changed function CopyItemsToClipboard(), SetCommList(),
  OnStackCopy() and OnStackPaste(), added some brackets

EMU48.H
- replaced variable type _TCHAR with TCHAR
- added MapData defines
- extern declaration of global variable and function
- removed declaration of Npack() and Nunpack()

EMU48.RC
- changed properties of IDC_DEBUG_STACK
- added Menuitem Debug "CODE Objects Breakpoints" in debugger menu
- changed version and copyright

ENGINE.C
- replaced variable type _TCHAR with TCHAR
- changed function Debugger(), added DOCODE breakpoint handling

EXTERNAL.C
- added ops.h in header definition

FILES.C
- replaced variable type _TCHAR with TCHAR
- added ops.h in header definition
- changed function PatchRom(), added typecast for GCC compiler
- bugfix in function PatchRom(), lines beginning with a remark were
  sometimes decoded as a valid line
- bugfix in function MapPort2(), 32KB cards were rejected

I28F160.C
- changed table definitions fnWrState[] and fnRdState[], removed a
  CONST statement

KML.C
- replaced variable type _TCHAR with TCHAR
- changed function ParseLines(), added some brackets
- changed prototypes of function GetStringParam(), GetIntegerParam()
  and SkipLines(), fixed argument mismatch
- changed function RunLine(), added default case for GCC compiler
- changed function SkipWhite(), If() and InitKML(), removed unused
  variables
- changed function KillKML(), optimizations
- changed function DrawAnnunciator(), optimizations

KML.H
- replaced variable type _TCHAR with TCHAR

MOPS.C
- added UNICODE support in debug output parts
- added ops.h in header definition
- moved MapData defines to EMU48.H
- made function MapData() public
- changed function Npeek(), Nread() and Nwrite(), added brackets for
  better code understanding

OPCODES.C
- changed function o8Cd4() and o8Ed4(), added some spaces for better
  code understanding

OPS.H
- changed function Npack() and Nunpack(), made them static
- changed function Nneg(), added some brackets

RESOURCE.H
- added definition

RPL.C
- added ops.h in header definition
- added missing HP39/40G entries in RAM entry table

SERIAL.C
- replaced variable type _TCHAR with TCHAR
- changed function UpdateUSRQ(), added return type
- changed function CommTransmit() and CommReceive(), derivate
  interrupt generation from the state of the USRQ bit now

SETTINGS.C
- replaced variable type _TCHAR with TCHAR
- bugfix in registry macro WriteString(), used wrong data size in
  UNICODE mode
- bugfix in function GetRegistryString(), returned wrong string
  length and used wrong read buffer size in UNICODE mode

TIMER.C
- added ops.h in header definition
- changed function MAX(), had no definition of return value
- changed function RescheduleT2(), added some brackets


Service Pack 24 for Emu48 Version 1.0

DBGTOOL.BMP
- bitmap with debugger toolbar buttons

DEBUGGER.C
- added toolbar to debugger window
- changed function EnterBreakpoint(), DrawBreakpoint() and
  EditBreakpoint(), added RPL breakpoint handling
- changed function OnToggleCheck(), changed method of item redraw
- changed function EditBreakpoint(), added multiple selection for
  deleting breakpoints

DEBUGGER.H
- added new breakpoint define

DISASM.C
- bugfix in function rn_map(), handle NULL pointer pages now
- bugfix in function disasm_8(), fixed broken opcode 80810
  mnemonic

EMU48.C
- changed function SetWindowTitle(), optimization

EMU48.DSP
- added library comctl32.lib

EMU48.RC
- added debugger toolbar
- added RPL breakpoint in "Enter breakpoint" dialog
- changed version and copyright

ENGINE.C
- changed function Debugger(), added RPL breakpoint handling

PCH.H
- added include commctrl.h

RESOURCE.H
- added definitions


Service Pack 23 for Emu48 Version 1.0

DDESERV.C
- replaced numbers with state machines defines

DEBUGGER.C
- new function DisableMenuKeys(), replace menu item disable in
  function OnKeyF5() and OnKeyF9()
- bugfix in function StrToReg() and OnLButtonUp(), used ASCII
  instead of a member function of TCHAR.H
- changed function OnLButtonUp(), skip automatically disabled
  windows
- bugfix in function OnKeyF9(), "Run to Cursor" menu item wasn't
  disabled

DISASM.C
- bugfix in function disasm_8(), illegal opcodes beginning with 8081
  crashed emulator, illegal opcodes beginning with 818f were shown
  as r=r+CON fs,n and r=r-CON fs,n opcodes, illegal opcodes
  beginning with 819f were shown as rSRB.F opcodes

EMU48.C
- replaced numbers with state machines defines
- moved the ShowWindow() call in main program behind the state file
  load to avoid viewing the window at the standard startup position

EMU48.RC
- changed version and copyright

ENGINE.C
- replaced numbers with state machines defines
- bugfix in function Debugger(), checked wrong data breakpoint
  addresses in connection with the P,WP,XS,S,M fields

FILES.C
- bugfix in function SaveDocument(), when the emulator window is
  minimized the wrong window position was saved in the Chipset
  structure

IO.H
- changed LINECOUNT MSB definitions

KEYBOARD.C
- replaced numbers with state machines defines

KML.C
- replaced numbers with state machines defines

MOPS.C
- bugfix in function CpuReset(), BS-FF must be cleared as well

OPCODES.C
- bugfix in function o807(), added BS-FF reset handling
- removed function o_invalid()

OPCODES.H
- removed prototype of function o_invalid()


Service Pack 22 for Emu48 Version 1.0

DEBUGGER.C
- moved global variables to EMU48.C and ENGINE.C
- changed function ViewCodeWnd() and NotifyDebugger(), changed "->"
  PC position marker to "-R" on RPL breakpoints
- bugfix in function DisableDebugger(), don't destroy handle before
  windows closed
- changed function Debugger(), set signal for window and last
  instruction buffer closed at end of WM_DESTROY message handler,
  init additional variables
- added implementation of "Find" dialog box
- bugfix in function NewValue(), EnterAddr() and EnterBreakpoint(),
  used ASCII instead of a member function of TCHAR.H
- changed function OnToggleCheck(), OnDrawBreakWnd(),
  DrawBreakpoint() and EditBreakpoint(), now the list box element
  use a link to the corresponding breakpoint element
- bugfix in function OnDrawBreakWnd(), sometimes the old focus
  rectangle wasn't purged
- changed function EditBreakpoint(), checkbox can also be toggled
  with the space key now
- bugfix in function OnEditBreakpoint(), redrawed code window always
  at PC position and not at actual address

DEBUGGER.H
- moved extern declaration of global variables to EMU48.H

DISPLAY.C
- bugfix in function UpdateDisplayPointers(), UpdateMainDisplay(),
  UpdateMenuDisplay(), WriteToMainDisplay(), WriteToMenuDisplay(),
  calculated wrong display areas when LINECOUNT (0x128,0x129)
  register was zero

EMU48.C
- replaced numbers with state machines defines
- added global variable from DEBUGGER.C
- changed function UpdateWindowStatus(), use groups for
  enable/disable menu items now
- changed function SettingsProc(), use global variable if COM port
  is open instead of calling CommConnect()
- bugfix in function OnPaint(), calculated wrong rectangle for
  display area when LINECOUNT (0x128,0x129) register was zero
- bugfix in function OnDropFiles(), OnStackPaste(), OnObjectLoad(),
  can't switch on if in debugger mode
- changed function WinMain(), added non modal "Find" dialog box in
  main message handler
- bugfix in function WinMain(), fixed a resource leak

EMU48.DSP
- added library advapi32.lib

EMU48.H
- removed extern declaration of global variable and function
- removed COM port state defines
- added state machine defines
- extern declaration of global variables
- changed function prototype

EMU48.RC
- changed properties of IDC_BREAKEDIT_WND
- added "Find" dialog
- changed version

ENGINE.C
- replaced numbers with state machines defines
- made COM port open flag public
- added global variables from DEBUGGER.C
- changed function Debugger(), a RPL breakpoint is now set on the
  destination address of a PC=(A) or a PC=(C) instruction and the
  RPL breakpoint detection with a prior A=DAT0 A D0=D0+ 5 sequence
  has been removed
- changed function CheckSerial(), use return value of CommOpen()
  instead of calling CommConnect()
- changed function WaitForSleepState(), close debugger before going
  into sleep state
- changed function SwitchToState(), changed detection of emulation
  thread termination and debugger now can be active when changing
  from Run to Sleep state

FILES.C
- changed function OpenDocument(), because of changed function
  CpuReset() additional work for automatic restart on changed ROM
  needed

IO.H
- added BITOFFSET definition

MOPS.C
- removed variable ir_ctrl_acc, was never used
- bugfix in function CpuReset(), changed some initial settings
- bugfix in function WriteIO(), force new COM port initialization
  when the EIRU bit in the IRC (0x11A) register has changed
- bugfix in function WriteIO(), reading from the LINECOUNT
  (0x128,0x129) register destroyed the settings for the
  Chipset.lcounter variable

RESOURCE.H
- added some definitions

RPL.C
- changed function RPL_CreateTemp(), changed remarks

SERIAL.C
- removed function CommConnect(), not used any more
- changed function CommOpen(), changed function return type
- bugfix in function CommOpen(), receiver state variables weren't
  resetted
- bugfix in function CommClose(), changed detection of thread
  termination and fixed a resource leak
- bugfix in function CommTransmit(), receive buffer may be
  overflowed when LPB (Loop Back) bit was set

SETTINGS.C
- prepared for registry support


Service Pack 21 for Emu48 Version 1.0

CHECKBOX.BMP
- bitmap with checked and unchecked box

DDESERV.C
- prepared for UNICODE support

DEBUGGER.C
- prepared for UNICODE support
- added implementation of "Run to Cursor"
- added HP39/40G stuff to function InitBsArea() and UpdateMiscWnd()
- added Enable/Disable of breakpoints in the Edit breakpoints dialog
- added breakpoint load/save file functions
- bugfix in function NewValue(), EnterAddr(), EnterBreakpoint(),
  EditBreakpoint() and InfoIntr(), try to get a window handle at
  begin of a dialog message handler cause illegal handles in some
  cases

DEBUGGER.H
- extern declaration of global variable and functions

DISASM.C
- prepared for UNICODE support
- changed function rn_port2(), select internal or external port2
  memory by the Chipset.Port2Size variable now

DISPLAY.C
- prepared for UNICODE support

EMU48.C
- prepared for UNICODE support
- added HP39/40G stuff to function UpdateWindowStatus(),
  SettingsProc(), OnDropFiles() and Disasm()
- bugfix in function OnPaint(), redraw display and button area even
  if emulation is suspended, redraw only requested bitmap area and
  redraw display without updating bitmap with display data
- bugfix in function OnFileNew(), overwrite title only on new
  document

EMU48.H
- prepared for UNICODE support

EMU48.ICO
- deleted unused device images

EMU48.RC
- changed properties of IDC_BREAKEDIT_WND
- added Menuitem Debug "Run to Cursor" in debugger menu
- changed version and copyright

ENGINE.C
- prepared for UNICODE support
- added part for debugger function "Run to Cursor"

EXTERNAL.C
- added HP39/40G stuff to the SFLAG53_56 definition

FILES.C
- prepared for UNICODE support
- added new document type for HP39/40G in several functions
- bugfix in function MapPort2(), in the first program instance in
  not shared mode a read only port2 file couldn't be loaded
- bugfix in function ResetDocument(), delete MMU mappings as well
- bugfix in function OpenDocument(), ask for new KML script when
  emulator state file and KML script file use different 'Model'
  settings
- changed function OpenDocument() and SaveDocument(), added debugger
  breakpoint data handling

IO.H
- added LINECOUNT definition

KML.C
- prepared for UNICODE support
- added "Class" keyword in Global section
- deleted function IsDigit(), replaced by function _istdigit()
- bugfix in function AddToLog(), fixed a memory leak
- new function MapKMLFile(), map KML file into memory
- new functions iSqrt(), AdjustPixel() and TransparentCircle(),
  subroutines for new button type
- changed function DrawButton(), changed button type 5 (was same
  implementation as type 0) to draw transparent circles
- changed function RefreshButtons(), redraw only buttons in
  requested area

KML.H
- prepared for UNICODE support
- added TOK_CLASS definition

MOPS.C
- new function UpdateDisplay(), handle display update
- changed function MapP2(), select internal or external port2 memory
  by the Chipset.Port2Size variable now
- added HP39/40G stuff to function MapROM(), RomSwitch(), Nread(),
  Nwrite() and ReadIO()
- bugfix in function Nwrite(), update display with address content
- changed function ReadIO(), set RX bit in the RCS (0x111) register
  for no character receive
- bugfix in function ReadIO(), wrong implementation of TBR register
  (0x116,0x117), read return last written byte
- bugfix in function WriteIO(), clearing the SON bit in the IOC
  (0x110) register clears also the IOC (0x110), RCS (0x111), TCS
  (0x112), RBR (0x114,0x115) and TBR (0x116,0x117) register
- bugfix in function WriteIO(), writing to the RCS (0x111), TCS
  (0x111) and TBR (0x116,0x117) register only works when the SON bit
  in the IOC (0x110) register is set

OPCODES.C
- prepared for UNICODE support
- removed InfoMessage in SREQ? opcode

PCH.H
- added include tchar.h

RESOURCE.H
- added some definitions
- removed IDC_DISASM_MNEMONICS

RPL.C
- bugfix in function Metakernel(), check for port1 memory before
  reading

SERIAL.C
- prepared for UNICODE support
- bugfix in function UpdateUSRQ(), USRQ bit in SRQ1 (0x118) register
  only set on serial interrupt condition when UART enabled

SETTINGS.C
- prepared for UNICODE support
- changed function ReadSettings(), use variable content as default

TIMER.C
- bugfix in function StartTimers(), check for timer interrupts at
  timer start


Service Pack 20 for Emu48 Version 1.0

DEBUGGER.C
- changed function UpdateStackWnd(), index of topmost item is now
  saved at content update
- changed function CheckBreakpoint(), allow breakpoints in an area
  now (used by memory breakpoints to get all touched addresses on a
  r=DATx fs access)

DEBUGGER.H
- changed prototype of function CheckBreakpoint()

EMU48.C
- use semaphores to avoid GDI trouble with NT in OnPaint()
- specify processor affinity for the cpu emulation thread to avoid
  problems with the QueryPerformanceCounter() function

EMU48.H
- extern declaration of global variable

EMU48.RC
- fixed multiple use of accelerator key in debugger menu
- changed version and copyright

ENGINE.C
- bugfix in function Debugger(), check complete address range of
  memory access area
- workaround for Win2k in function AdjustSpeed(), when command
  sequence took over 50ms new synchronizing of the emulation slow
  down part
- bugfix in function WorkerThread(), update NINT and NINT2 lines
  after port status changing

KML.C
- use semaphores to avoid GDI trouble with NT in RefreshButtons()

MOPS.C
- bugfix in function UckBit() and F4096Hz(), depending on clock
  value functions returned wrong results

OPCODES.C
- moved address field start and length array from OPS.H and made
  them public

OPCODES.H
- extern declaration of global address field start and length
  variables

OPS.H
- moved address field start and length array to OPCODES.C
- bugfix in function FASTPTR(), address area is only 5 nibbles long

RESOURCE.H
- deleted several unused definitions

RPL.C
- added function Metakernel() to detect MK2.30 and prior
- changed function RPL_Pick() and RPL_Push() to support
  "Save/Load Object" with a stack incompatible Metakernel versions

SERIAL.C
- use own OVERLAPPED stucture for reading and writing
- bugfix in function CommClose(), added additional delay to fix
  problems with some Kermit server
- bugfix in function CommTransmit(), wait until write completed

SETTINGS.C
- changed function ReadSettings(), use variable content as default


Service Pack 19 for Emu48 Version 1.0

DEBUGGER.C
- several modifications for memory breakpoint handling
- added step over interrupt code part setting
- bugfix in function NewValue(), at wrong input numbers ignore input
  string at <CANCEL> and set focus to edit control
- bugfix in function EnterAddr(), at wrong input numbers set focus
  to edit control

DEBUGGER.H
- added breakpoint type defines
- extern declaration of global variable
- changed prototype of function CheckBreakpoint()

DISPLAY.C
- added io.h in header definition
- bugfix in function CreateMainBitmap(), check error condition and
  realize palette also in memory DC
- bugfix in CreateLcdBitmap(), must set color palette for LCD DC
- bugfix in function UpdateAnnunciators(), annunciators are off if
  timer2 is stopped

EMU48.C
- added io.h in header definition
- changed function SettingsProc(), added HP/Class mnemonic setting
- bugfix in function SettingsProc(), new implementation of card
  detection port 1
- moved initialize/remove of the Critical Section part from main
  program to message handler
- changed function OnDropFiles(), OnStackCopy(), OnStackPaste(),
  OnObjectLoad() and OnObjectSave(), don't wait for changed state
  after function WaitForSleepState()
- bugfix in function OnObjectSave(), set info message when emulator
  is busy
- changed function Disasm(), removed HP/Class mnemonic setting
- bugfix in function Disasm(), addresses > 0x1869F showed in wrong
  format
- bugfix in function WinMain(), synchronized thread start

EMU48.H
- changed definition of PORT1_PRESENT, PORT1_WRITE, PORT2_PRESENT
  and PORT2_WRITE

EMU48.RC
- added HP/Class mnemonics in "Settings" dialog
- added "Interrupts" part in debugger menu
- added "Enter breakpoint" dialog
- changed version and copyright

ENGINE.C
- moved debugger part from function WorkerThread() to own function
- added C=DAT0 A, D0=D0+ 5, PC=(C) code sequence detection for RPL
  breakpoint in debugger
- added step over interrupt code part handler in debugger section
- bugfix in function SwitchToState(), when switch from Invalid into
  Run state then don't enter opcode loop on interrupt request or in
  SHUTDN mode
- changed function WorkerThread(), added memory breakpoint handler
- bugfix in function WorkerThread(), timer emulation in debugger
  part must check the timer RUN bit
- bugfix in function WorkerThread(), must set wakeup flag on SHUTDN
  on interrupt request condition
- changed function WorkerThread(), minor optimization

FILES.C
- added io.h in header definition
- bugfix in function OpenDocument(), check card detection only if
  enabled and set NINT line to low on a MP interrupt
- changed function DibNumColors(), optimized by removing case switch

IO.H
- added ANNCTRL and CARDSTAT definitions

MOPS.C
- removed conditional compiling with WSMSET
- bugfix in function RomSwitch(), mirror smaller ROMs than 2MB
- bugfix in function Npeek(), wrong content of SRQ2 (0x119) register
- bugfix in function ReadIO(), wrong implementation of the SMP and
  SWINT bit in the CARDCTL (0x10E) register
- bugfix in function ReadIO(), wrong implementation of the NINT2 and
  NINT bit in the SRQ2 (0x119) register
- bugfix in function WriteIO(), wrong implementation of the SMP and
  ECDT bit and removed some wrong stuff in the CARDCTL (0x10E)
  register
- bugfix in function WriteIO(), the DA19 bit in the LINECOUNT
  (0x129) register is also available in the Clarke hardware
- bugfix in function WriteIO(), the RUN bit in the TIMER2CTRL
  (0x12F) register has an affection to the display annunciators

OPCODES.C
- added io.h in header definition
- bugfix in RTI command, low NINT2 or NINT line reenter interrupt
- bugfix in function o808C() and o808E(), opcodes PC=(A) and PC=(C)
  modify the CRC register

OPCODES.H
- moved HST bit definition to TYPES.H

RESOURCE.H
- added several definitions

SETTINGS.C
- changed function ReadSettings() and WriteSettings(), added section
  [Disassembler] in INI-File

TYPES.H
- added definition of HST bits


Service Pack 18 for Emu48 Version 1.0

EMU48.RC
- changed version and copyright

ENGINE.C
- bugfix in function WorkerThread(), ignore SHUTDN on interrupt
  request

SERIAL.C
- bugfix in function CommOpen(), must wait for EV_RXCHAR event
  thread directly after opening the serial port


Service Pack 17 for Emu48 Version 1.0

DEBUGGER.C
- bugfix in function StrToReg() and OnLButtonUp(), wrong string to
  HEX conversation with lowercase letters
- bugfix in function Debugger(), used wrong background color in
  WM_CTLCOLORSTATIC message handler

EMU48.C
- bugfix in function SettingsProc(), don't overwite Serial-Ir
  setting in HP49 mode

EMU48.DSP
- added i28f160.c sources

EMU48.H
- extern declaration of global variable and functions

EMU48.RC
- changed version and copyright

FILES.C
- added new functions in the ROM patch part
- changed function PatchRom(), original content of patched address
  is saved now
- changed function MapRom(), added ROM writing feature
- changed function UnmapRom(), restore original content before
  closing
- bugfix in function MapPort2(), shared mode now works, when first
  program instance opened the file with Read/Write access
- changed function NewDocument() and OpenDocument(), initialize
  flash memory structure

I28F160.C
- new module with I28F160 flash memory implementation

I28F160.H
- header file for flash memory implementation

MOPS.C
- changed function MapROM(), added flash register mode
- changed function Npeek(), added flash access part
- changed function Nread(), completed flash access part
- changed function Nwrite(), completed flash access part

OPS.H
- bugfix in function FASTPTR(), handle NULL pointer pages now
- bugfix in function Ninc(), Ndec(), Nadd(), Nsub(), Nrsub(), Nnot()
  and Nneg(), wrong results in dec mode with illegal decimal number
  entry

SETTINGS.C
- changed function ReadSettings() and WriteSettings(), added section
  [ROM] in INI-File

TIMER.C
- bugfix in function CalcT2(), workaround to minimize skipping
  timer2 values


Service Pack 16 for Emu48 Version 1.0

DEBUGGER.C
- added "MMU" and "Miscellaneous" view in debugger dialog
- added RPL exit breakpoint on A=DAT0 A, D0=D0+ 5, PC=(A) sequence
- added last instruction viewer in debugger
- renamed function name ViewStackWnd() to UpdateStackWnd()
- bugfix in function UpdateRegisterWnd() and OnCtlColorStatic(),
  fixed problems of register update in RUN mode
- bugfix in function OnKeyF11(), in sleep mode break hasn't worked
- bugfix in function OnLButtonUp(), register setting wasn't disabled
  in running state
- changed function NotifyDebugger(), added argument to detect RPL
  breakpoint
- bugfix in function Debugger(), code disassembler wasn't reset to
  mapped mode at startup and fixed a resource leak
- bugfix in function EditBreakpoint(), added breakpoint buffer
  overflow check at add breakpoint command

DEBUGGER.H
- extern declaration of global variables

DISASM.C
- bugfix in function disasm_1(), the C=ss, ss=C and CssEX opcodes
  showed always as A=ss, ss=A and AssEX opcodes
- bugfix in function disasm_8(), the r register in the rSRB.F fs
  opcodes and the opcode lenght was wrong

EMU48.C
- new function CopyItemsToClipboard(), copy selected items from
  listbox to clipboard, extracted from function Disasm()
- added HP38G64K stuff to function UpdateWindowStatus() and
  SettingsProc()
- changed function Disasm(), call function CopyItemsToClipboard()
  now

EMU48.H
- extern declaration of global functions

EMU48.RC
- added "MMU" and "Miscellaneous" part in debugger dialog
- changed copyright date in IDD_ABOUT
- changed version and copyright

ENGINE.C
- added RPL breakpoint handling
- added last instruction buffer update handling
- changed function WorkerThread(), added timer emulation in debugger
  mode
- bugfix infunction WorkerThread(), in debugger mode Chipset.pc may
  have been changed, so the FASTPTR access must be updated as well

EXTERNAL.C
- some minor changes for the HP38G64K beeper emulation

FILES.C
- added new document type for HP38G64K

IO.H
- added CARDCTL and LCR definitions

KEYBOARD.C
- bugfix in function ScanKeyboard(), update keyboard status only on
  timer running and keyboard interrupt only occur on the rising edge
  of "logic or" of IR[8:0] and not on the rising edge of each line;
  the IRX15 interrupt (ON key) is level sensitive

MOPS.C
- added function MapData() to detect the memory controller handle
  the given address, needed for function Npeek(), Nread() and
  Nwrite()
- bugfix in function MapROM(), no difference between Clarke and
  Yorke chip in DA19 bit behavior, depends on ROM size
- bugfix in function Map(), on a HP49 NCE3 may mapped to ROM
- changed function CpuReset(), reset WSM state of flash memory
- bugfix in function Npeek(), update card status register in I/O
  register area before reading and simulate an open data bus
- bugfix in function Nread(), loaded wrong bank switcher FF value
  for a HP49
- bugfix in function Nwrite(), loaded wrong bank switcher FF value
  when writing on slot2 enabled (GX only)
- changed function Nread() and Nwrite(), added Flash memory access
  detection part
- bugfix in function ReadIO(), the CARDSTATUS (0x10F) register
  return zero when card detection is disabled
- bugfix in function WriteIO(), on a HP49 force new memory mapping
  on changing the LED bit in the LCR (0x11C) register

RESOURCE.H
- added several definitions

TYPES.H
- conditional compiling of cycle counter (32bit EXE/64bit DLL)
- use position of Port2_NBanks for flash memory WSM state variable


Service Pack 15 for Emu48 Version 1.0

DEBUGGER.C
- added emulation run flag
- added notify function for emulation stopped
- added color highlighting on changed registers
- added implementation of "Step Out" (exit function)
- bugfix in function ViewMemWnd(), use the Npeek() function for
  reading memory data, so fixed some problems with reading invalid
  data from the I/O register area
- changed function OnClearAll(), changed argument to dialog handle
- bugfix in function OnDblClick(), fixed swapped nibbles after enter
  new data
- changed function OnKeyCodeWnd(), changed first argument to dialog
  handle
- bugfix in function Debugger(), removed context menu resource leaks
  and a call of GetDlgItem() with invalid arguments

DEBUGGER.H
- extern declaration of global functions
- moved WM_UPDATE definition to DEBUGGER.C

EMU48.C
- replaced __argc and __argv variables by process variables
- replaced INI file handling part
- changed address in GPL license string
- added HP38 stuff to function UpdateWindowStatus() and
  SettingsProc()
- changed function SettingsProc(), replaced Port1_Writeable variable
- bugfix in function OnViewReset(), some registers wasn't reset,
  call reset function now
- bugfix in function OnDestroy(), moved functions SwitchToState()
  and WriteSettings() to main program, because emulation thread may
  not run and settings aren't read so far when main window close
- removed function FlushMessages() and all references, because it's
  useless and references made trouble at a WM_QUIT message
- removed several other resource leaks on error conditions
- made function MainWndProc() public

EMU48.DSP
- renamed serial.h into io.h in header definition
- added settings.c sources

EMU48.H
- extern declaration of global variable and functions

EMU48.RC
- changed language definition of dialog IDD_BREAKEDIT
- added Menuitem Debug "Step Out" in debugger menu
- changed version and copyright

ENGINE.C
- renamed header Serial.h into io.h
- renamed wShutdnWake to bShutdnWake in Chipset structure
- moved bRealSpeed variable and make it public
- solved bRealSpeed name conflict
- added DWORD casting from Chipset.cycles variable
- added part for debugger function "Step Out"
- changed notify function for update debugger window

EXTERNAL.C
- some minor changes for the HP38 beeper emulation

FILES.C
- added new document type for HP38G
- replaced __argc and __argv variables by process variables
- added function CrcRom() to get a fingerprint of the ROM
- changed function NewDocument(), deleted Port1_Writeable variable,
  isn't used any more
- bugfix in function OpenDocument(), in restore situation add port2
  only at HP48 emulation
- changed function OpenDocument(), check fingerprint of ROM
- changed function SaveDocument(), update fingerprint of ROM
- changed function SaveBackup(), save window position as well
- bugfix in function RestoreBackup(), lost port2 of a HP48

KEYBOARD.C
- renamed wShutdnWake to bShutdnWake in Chipset structure
- added DWORD casting from Chipset.cycles variable

KLM.C
- bugfix in function InitKML(), on a KML script syntax error only
  continue with the Cancel button

IO.H
- old SERIAL.H, added I/O definitions

MOPS.C
- renamed header Serial.h into io.h
- renamed function CRC() to UpCRC()
- changed function UckBit(), removed unused variable
- changed function MapP1(), use cards_status instead of
  Port1_Writeable variable
- bugfix in function RomSwitch(), lached address line A6 was always
  zero -> no access to upper half of flash memory
- added function CpuReset() to set cpu registers after reset
- changed function Npeek(), return data from I/O register area as
  well now (for debugger support)
- bugfix in function Nread(), reading from the timer2 MSB (0x13F)
  register updates the CRC (0x104-0x107) register
- bugfix in function ReadIO(), update the USRQ bit in the SRQ1
  (0x118) register after reading the RBR (0x114,0x115) register
- bugfix in function ReadIO(), update the NINT2 and NINT bits in the
  SRQ2 (0x119) register
- bugfix in function WriteIO(), update the USRQ bit in the SRQ1
  (0x118) register after writing the IOC (0x110) register or the
  TBR (0x116,0x117) register

OPCODES.C
- added DWORD casting from w.cycles variable
- checked all undocumented cpu cycles and removed remarks
- bugfix in function o08(), o09(), o0A(), o0B(), o3X(), o8086n(),
  o8087n(), o808An(), o808Bn() and o8Ed4(), changed number of cpu
  cycles

RESOURCE.H
- added several definitions

SERIAL.C
- renamed header Serial.h into io.h
- renamed wShutdnWake to bShutdnWake in Chipset structure
- moved initialize/remove of Critical Section handler from the
  function CommOpen() and CommClose() to main program
- added function UpdateUSRQ(), implements USRQ bit handling
- bugfix in function CommTransmit(), added LPB bit emulation in the
  TCS (0x112) register and USRQ bit emulation in the SRQ1 (0x118)
  register
- bugfix in function CommReceive(), only reject reading if com port
  is closed and not whole operation and added USRQ bit emulation in
  the SRQ1 (0x118) register

SERIAL.H
- renamed to IO.H

SETTINGS.C
- new module to handle the INI file

TIMER.C
- removed timer I/O definitions, replaced by include file IO.H
- replaced INT define with INTR (conflict with C variable type INT)
- renamed wShutdnWake variable to bShutdnWake
- bugfix in function CheckT1() and CheckT2(), added TSRQ bit
  emulation in the SRQ1 (0x118) register

TYPES.H
- changed variable type of wPosX and wPosY, position data is signed
- use position of wShutdnWake for wRomCrc
- use position of dwKdnCycles for cycles variable
- use position of Port1_Writeable for MSB of cycles variable
- use position of Port2_Writeable for dwKdnCycles variable
- use old position of the cycles variable for bShutdnWake


Service Pack 14 for Emu48 Version 1.0

COLOR.H
- new header with color definitions

DDESERV.C
- added different files headers for HP48/49

DEBUGGER.C
- new module for debugger routines

DEBUGGER.H
- header file for debugger part

DISASM.C
- changed function append_r_addr() and append_pc_comment(), relative
  jumps now can viewed with the target address instead of a relative
  offset and target address in remark; implemented a local variable
- bugfix in function rn_port2(), calculated port2 mask was wrong
- added HP49 stuff to function rn_port2()

EMU48.DSP
- added debugger.c sources

EMU48.C
- added debugger menu entry
- added HP49 stuff to the disassembler
- added HP49 stuff to function SettingsProc()
- changed function OnViewSettings(), removed port2 open/close
  handling, now done in the document handler
- deleted unused function OnSysClose()
- bugfix in function Disasm(), in entry IDC_DISASM_PORT2 the highest
  useable address was always wrong

EMU48.RC
- added Menuitem Tools "Debugger..."
- changed version and copyright

EMU48.H
- extern declaration of global variable and functions

ENGINE.C
- moved inline function FASTPTR() to OPS.H
- added debug part in main emulation loop

EXTERNAL.C
- some minor changes for the HP49 beeper emulation

FILES.C
- added new document type for HP49
- change in function WriteStack(), accept HP49 binary files now
- the port2 open/close handling is now controlled by the document
- several changes in port2 handling, the HP49 use an internal 128KB
  RAM card instead of the external RAM card of the HP48
- changed function UnmapPort2(), added return value for unmap
  success
- changed function PatchRom(), longer addresses than 5 nibbles can
  be used now
- changed function OpenDocument(), restore HP49 ROM bank selection
  after document load
- changed function InitKML(), removed initialization of MMU

KEYBOARD.C
- changed function ScanKeyboard(), added a flag for wake up from
  SHUTDN mode

KML.C
- bugfix in function PressButton(), if button already pressed, do
  nothing -> fixed a draw problem with KML button type 3
- bugfix in function RefreshButtons(), KML type 3 buttons, must
  complete redraw before refresh them

MOPS.C
- added HP49 MMU parts
- bugfix in function ReadIO(), update the UCK bit in the BAU (0x10D)
  register

OPS.H
- moved inline function FASTPTR() from ENGINE.C to header file

RESOURCE.H
- added several definitions

RPL.C
- added HP49 memory pointers
- added HP49 flash pointer object (=DOFASHP)
- added HP49 precision integer object (=DOINT)
- added HP49 precision real object (=DOLNGREAL)
- added HP49 precision complex object (=DOLNGCMP)
- added HP49 symbolic matrix object (=DOMATRIX)
- added HP49 aplet object (=DOAPLET)
- added HP49 mini font object (=DOMINIFONT)

SERIAL.C
- changed function SerialThread(), added a flag for wake up from
  SHUTDN mode

TIMER.C
- changed functions CheckT1() and CheckT2(), added a flag for wake
  up from SHUTDN mode

TYPES.H
- use position of the wUnused1 variable for SHUTDN wake up flag


Service Pack 13 for Emu48 Version 1.0

DISASM.C
- bugfix in function disasm_8(), the HS=0 n opcode was showed wrong

EMU48.DSP
- added fetch.c and opcodes.c sources

EMU48.C
- bugfix in function Disasm() and About(), handled messages must
  return TRUE

EMU48.H
- added function prototypes

ENGINE.C
- moved several definitions to OPCODE.H
- made function AdjKeySpeed() public
- replaced opcode handling include files by a function call, decoder
  now works with tables instead of case switching
- deleted unused code parts in module

FETCH.C
- new module with opcode dispatcher

FETCH.H
- file deleted, replaced by FETCH.C

FILES.C
- bugfix in function PatchRom(), no correct handling of remarks,
  interpreter failed on lower case hex digits in arguments

OPCODES.C
- new module with opcode implementation

OPCODES.H
- file content changed, replaced by OPCODES.C


Service Pack 12 for Emu48 Version 1.0

DISPLAY.C
- minor change in function UpdateMainDisplay()
- deleted remarked global variables and unused code parts in
  function WriteToMainDisplay()

EMU48.C
- added auto event object for controlling the CPU thread

EMU48.H
- removed extern declaration of variable
- extern declaration of global variable and functions

ENGINE.C
- new function CheckDisp(), synchronize display update now with the
  line update counter
- replaced all ResumeThread() with SetEvent() calls
- replaced all SuspendThread() with WaitForSingleObject() calls

KEYBOARD.C
- replaced all ResumeThread() with SetEvent() calls
- deleted unused code parts in function ScanKeyboard()

MOPS.C
- flag for updating display area is now global
- new function GetLineCounter() for getting the actual display
  refresh line
- changed function WriteIO(), display isn't updated here any more
- use serial definitions from "serial.h" now
- deleted remarked functions Nread2(), Nwrite2(), Nread5() and
  Nwrite5()

SERIAL.C
- replaced all ResumeThread() with SetEvent() calls

TIMER.C
- bugfix in function SetT1(), loading same timer value doesn't
  restart timer period
- replaced all ResumeThread() with SetEvent() calls


Service Pack 11 for Emu48 Version 1.0

EMU48.C
- removed cards status definitions
- bugfix in function OnFileExit(), continuing the emulation failed
  after pressing the "Cancel" button in save dialogbox
- removed function OnSysClose(), no difference to function
  OnFileExit()
- changed message implementation WM_SYSCOMMAND/SC_CLOSE to function
  OnFileExit()

EMU48.DSP
- added preprocessor definition "STRICT" to project

EMU48.H
- moved cards status definitions from EMU48.C to header file
- extern declaration of global function

EMU48.RC
- changed version and copyright

ENGINE.C
- bugfix in function WorkerThread(), after changing the port2 card
  status the memory mapping must be updated
- update HP48 time now in function WorkerThread() and not in
  function StartTimers()

FILES.C
- changed function MapPort2(), dwPort2Mask now shows the valid
  address lines of the bank switcher FF

MOPS.C
- bugfix in function MapP1() and MapP2(), clear mapping area if port
  is configured but not plugged
- bugfix in function MapP2(), odd bank switch values loaded the
  wrong page of port2 and bank switcher must be disabled on S(X)
  versions
- changed function Nread(), simulate an open data bus now (fix
  value for even and odd address)
- bugfix in function Nread(), don't change bank switcher value if
  RAM or CE2 is on the same address, because these modules have
  higher access priority
- bugfix in function Nwrite(), bank switching now works with the
  'datx=r fsd' command

TIMER.C
- renamed function SetAccesstime() to SetHP48Time() and made
  function public
- removed update of HP48 time in function StartTimers()


Service Pack 10 for Emu48 Version 1.0

DISPLAY.C
- use only one pattern field for all display resolutions
- added new display contrast scheme
- bugfix in function WriteToMainDisplay(), calculated source memory
  address was illegal memory pointer

EMU48.C
- bugfix in functions OnFileExit() and OnSysClose(), stop emulation
  thread before saving emulation data
- changed function Disasm(), changed list box from single to multi
  selectable items, added button to copy selected items to
  clipboard
- moved function DragAcceptFiles() to WM_CREATE handler
- added function DragAcceptFiles() to WM_DESTROY handler
- allow second command line parameter as port2 filename
- added Critical Section initialization

EMU48.H
- removed extern declaration of global function
- extern declaration of global variable and functions

EMU48.RC
- added button in dialog IDD_DISASM
- reinsert button IDC_UPDATE in dialog IDD_CHOOSEKML
- changed version and copyright

ENGINE.C
- functions CheckSerial() and AdjustSpeed() are inline coded now
- new function UpdateKdnBit() for updating the KDN bit by the 1ms
  keyboard interrupt handler

FILES.C
- added new function CrcPort2() to get a fingerprint of port2
- changed function OpenDocument(), check fingerprint of port2
- changed function SaveDocument(), update fingerprint of port2

KEYBOARD.C
- changed function Keyboard_GetIR() to static
- bugfix in function ScanKeyboard(), added fixes for the KDN bit
  implementation and update keyboard interrupt pending flag when
  1ms keyboard handler is disabled

KML.C
- bugfix in function ParseLine(), caused memory leaks when an error
  occured
- bugfix in function ParseLines(), fixed a windows program abort on
  some KML script or line include errors
- bugfix in function ParseBlock(), abort parsing on KML script
  errors
- bugfix in function ParseBlocks(), fixed a windows program abort on
  block include errors
- bugfix in function FreeLines(), caused memory leaks when different
  argument types are used in a line

MOPS.C
- added new function IOBit()
- bugfix in function ReadIO(), update the KDN bit in the SRQ2
  (0x119) register before reading

OPCODES.H
- bugfix in A=IN and C=IN command, update KDN bit in the SRQ
  register
- bugfix in all r=r+CON fs,n and r=r-CON fs,n opcodes, they always
  work in HEX mode
- changes in INTON, INTOFF and RTI for KDN bit implementation
- changed RTI command, execute pending key interrupt only if enabled
- changed RSI command, set key interrupt pending flag also when 1ms
  keyboard handler is disabled
- bugfix in INTON command, execute interrupt if key interrupt is
  pending

OPS.H
- added new inline functions Ninc16() and Ndec16()

RESOURCE.H
- added/changed definitions
- removed ID_HELP_REGISTER

TYPES.H
- use position of the uUnused1 variable for fingerprint of port2
- use position of the Port2_Size variable for cpu cycles at start of
  1ms key interrupt handler


Service Pack 9 for Emu48 Version 1.0

DISASM.C
- changed output of HP Mnemonic P=n

DISPLAY.C
- bugfix in function UpdateMainDisplay(), with off display and Zoom
  > 1 only a part of the display was cleared
- changed function UpdateMenuDisplay(), use a common pointer offset
  calculation and display output part now

EMU48.C
- changed function OnViewCopy(), changed screen clipboard format
  from CF_BITMAP to CF_DIB
- bugfix in function OnViewReset(), must unconfig MMU on reset too
- changed function OnAbout(), don't stop emulation while viewing
  About box
- moved initialize/remove of the Critical Section part from message
  handler to main program

EMU48.H
- removed extern declaration of global variables and functions

EMU48.RC
- changed design of IDD_ABOUT
- changed version and copyright

ENGINE.C
- bugfix in function FASTPTR(), code execution is possible in IO
  register area as well

FETCH.H
- removed jump to extension opcode 81B0

FILES.C
- removed global variable

MOPS.C
- bugfix in function MapP0(), MapP1(), MapP2(), MapBS(), mapping
  area may have holes
- bugfix in function MapBS(), no read from ROM at mapped bank
  switch control area
- bugfix in function MapP2(), if G(X) ROM select port2 only if
  DA19=0 and BEN=1, now the saved bank switch control information is
  used
- bugfix in function MapROM(), if G(X) ROM and DA19=0 (ROM disabled)
  then mirror lower ROM at #80000 (AR18=0)
- bugfix in function Nread(), bank switching now works with every
  'r=datx fsd' command in the complete mapped bank switch control
  area, an unconfigured bank switch area is now disabled and the
  GX bank switch information (content of Flipflop) is saved now
- bugfix in function Nwrite(), at some conditions no update of the
  display area and IO area couldn't be unconfigured
- removed functions Nread2(), Nwrite2(), Nread5() and Nwrite5()
- bugfix in function ReadIO(), several minor fixes in the LINECOUNT
  (0x128,0x129) register emulation
- bugfix in function ReadIO(), the TIMER1CTRL and TIMER2CTRL
  (0x12E,0x12F) register must be updated before reading
- bugfix in function WriteIO(), don't clear the XTRA bit in the
  TIMER1CTRL (0x12E) register while setting
- bugfix in function WriteIO(), after setting new TIMER1CTRL and
  TIMER2CTRL (0x12E,0x12F) register values the control bit
  condition must be checked
- bugfix in function WriteIO(), handle start/stop of the LINECOUNT
  register when the DON bit in the DISPIO (0x100) register has
  changed
- bugfix in function WriteIO(), force new ROM mapping if DA19 in
  the MSB LINECOUNT (0x129) register has changed on a G(X) ROM

OPCODES.H
- Nwrite2() replaced by Nwrite()
- Nwrite5() replaced by Nwrite()
- Nread2() replaced by Nread() for the BS 'r=datx fsd' bugfix
- Nread5() replaced by Nread() for the BS 'r=datx fsd' bugfix
- bugfix in RTI command, generate interrupt if ON key is pressed
- bugfix in RSI command, don't set key interrupt pending flag if
  INTOFF command is active
- removed extension opcode 81B0

TIMER.C
- removed assertions in function CheckT1() and CheckT2() that the
  timers must run
- moved initialize/remove of Critical Section handler from the
  function StartTimers() and StopTimers() to main program for bugfix
  the problems with the Critical Section area of the function
  ReadT1() and ReadT2() when the timers are stopped
- bugfix in function ReadT2(), timer2 was always running

TYPES.H
- use Port2_Bank variable to save state of GX port2 Flip-Flop


Service Pack 8 for Emu48 Version 1.0

DISASM.C
- changed function read_nibble() to disassemble modules
- added new mapping functions for function read_nibble()
- bugfix in function append_imm_nibble(), HP Mnemonic hex number
  was showed as decimal number

EMU48.C
- changed variable types of function WinMain()
- added "drag and drop" implementation for HP objects
- added some features to function Disasm()
- removed all parts handled with the global variables bAccurateTimer
  and uT1Period
- bugfix in function Disasm(), button "Next Address" caused a
  windows program abort if the given address was outside of the
  cpu address area
- bugfix in function UpdateWindowStatus(), Menuitem Tools
  "Disassembler..." must be disabled when document file is closed
- bugfix in function OnStackPaste(), fixed problem when HP is off
- bugfix in function OnObjectLoad(), solve problem when calculator
  is off and bugfixed method to switch emulator into sleep state
- bugfix in function OnObjectSave(), bugfixed method to switch
  emulator into sleep state

EMU48.DSP
- added library shell32.lib

EMU48.H
- bugfix of variable hApp, used wrong type
- extern declaration of global variables
- removed extern declaration of global variables
- added some disassembler defines

EMU48.RC
- added my name to dialog IDD_ABOUT
- added some radio buttons to dialog IDD_DISASM
- removed Timers part from dialog IDD_SETTINGS
- changed version and copyright

ENGINE.C
- added global variable
- removed global variable
- bugfix in function AdjKeySpeed(), slow down whole emulation now,
  when a key is pressed

KEYBOARD.C
- changed key event signal in function KeyboardEvent()

MOPS.C
- bugfix in function Uncnfg(), I/O mapped address area begin and end
  on a 64 nibble boundary, Chipset.IOBase must be saved for the C=ID
  command
- bugfix in function C_Eq_Id(), don't shift Chipset.IOBase for ID
- changed function Nread(), Nwrite(), Nread2(), Nwrite2(), Nread5()
  and Nwrite5(), test Chipset.IOCfig as well for mapping

OPCODES.H
- removed InfoMessage in BUSCB, BUSCC and BUSCD opcode, emulate as
  NOP
- bugfix in RTI command, don't return from interrupt at timer1/2
  interrupt condition
- bugfix in SHUTDN command, don't shut down at timer1/2 wake up
  condition
- bugfix in RSI command, detection of interrupt is in service was
  wrong

PCH.H
- added include shellapi.h

RESOURCE.H
- added several definitions
- removed IDC_BROWSEDIR, IDC_REFRESH, IDC_USEMMTIMER, IDC_T1PERIOD,
  IDC_T1DEFAULT

TIMER.C
- removed global variables bAccurateTimer and uT1Period, replaced by
  a static variable and a constant
- changed function CheckT1() and function CheckT2(), use function
  parameter for the timer value now
- changed function ReadT1() and function ReadT2(), update timer
  control bits after reading
- bugfix in function RescheduleT2(), execute timer2 event when MSB
  of timer changed to update timer2 control register
- bugfix in function TimeProc(), waiting for timer2 overrun prevents
  access to the timer2 value from the cpu emulation thread and reset
  of variable uT2TimerId was outside synchronized area
- bugfix in function CheckT1() and function CheckT2(), fixed SRQ bit
  handling
- bugfix in function SetT1() and function SetT2(), update timer
  control bits and check for interrupts after setting
- bugfix in function StopTimers() and function SetT2(), killing
  timer1 or timer2 in a Critical Section part may cause a dead lock
  with the timer callback function (function timeKillEvent() waits
  for the finish of the corresponding callback function, but the
  callback function is locked by the Critical Section handler)


Service Pack 7 for Emu48 Version 1.0

DISASM.C
- new module with disassembler

DISPLAY.C
- bugfixes in function UpdateDisplayPointers(), next line offset was
  sometimes wrong and the addresses of the main display area were
  wrong when next line offset was negative
- new implementation of function WriteToMainDisplay(), fixed several
  bugs (no output when next line offset was negative, sometimes
  problems with left margin values > 4 and garbage on display)
- bugfix in function WriteToMenuDisplay(), menu wasn't updated
  when next line offset was negative

EMU48.C
- added global variable
- added semaphore handling for key scan
- added disassembler dialog box and menu entry
- bugfix in function OnViewCopy(), the clipboard wasn't closed when
  EmptyClipboard() failed
- bugfix in function OnKeyDown(), suppress autorepeat feature of
  keyboard

EMU48.DSP
- added disasm.c source

EMU48.H
- extern declaration of global variables
- added function prototypes

EMU48.RC
- added Menuitem Tools "Disassembler..."
- changed version and copyright

ENGINE.C
- added global variable
- bugfix in function AdjKeySpeed(), exit delay loop when a key
  event has occured and use Chipset.Keyboard_Row[] instead of
  Chipset.in to detect a pressed key

FILES.C
- function LoadBitmapFile() save old hWindowDC palette now
- bugfix in function SaveDocumentAs(), previous opened file wasn't
  closed

KEYBOARD.C
- bugfix in function ScanKeyboard(), code part must be synchronized
  and an interrupt was only generated when all input lines has been
  low (no keys pressed)
- added parameter to function ScanKeyboard(), parameter indicates if
  the Chipset.in interrupt register should be reset
- added key event signal in function KeyboardEvent()
- workaround in function KeyboardEvent(), hold key state for a
  definite time

KML.C
- bugfix in function ParseLines() and ParseBlocks(), allocated
  memory for string parameter of include token wasn't freed
- bugfix in function KillKML(), palette resource couldn't freed,
  when hWindowDC was open

MOPS.C
- bugfix in function WriteIO(), the Chipset.start1 variable only
  was updated when five nibbles at the DISPADDR (0x120) register
  has been written
- bugfix in function WriteIO(), the Chipset.loffset variable only
  was updated when three nibbles at the LINEOFFS (0x125) register
  has been written
- bugfix in function WriteIO(), the Chipset.lcounter variable only
  was updated when the MSB of the LINECOUNT (0x129) register has
  been written
- bugfix in function WriteIO(), the Chipset.start2 variable only
  was updated when five nibbles at the MENUADDR (0x130) register
  has been written
- bugfix in function ReadIO(), the LINECOUNT (0x128-0x129) register
  is a down counter

OPCODES.H
- changed RSI command for thread synchronize

RESOURCE.H
- added several definitions

TIMER.C
- bugfix in function SetAccesstime(), sync time values must always
  save in port0 and not at the mapped address
- bugfix in function RescheduleT2(), used wrong event time when
  reference point for timer2 value wasn't saved


Service Pack 6 for Emu48 Version 1.0

DDESERV.C
- bugfix in XTYP_POKE part, fixed problem when HP is off

DISPLAY.C
- added X4 display size parts

EMU48.C
- changed function OnViewCopy() for X4 display size
- init lFreq variable for high performance counter here now

EMU48.H
- changed type and name of bLcdDoubled to nLcdDoubled
- extern declaration of global variables

EMU48.RC
- changed version and copyright

EXTERNAL.C
- changed high limit of frequency, use SX specification
- added high limit of beep duration, use SX specification
- estimate cpu cycles for beep time
- adjust some cpu flags and registers modified by the original code

KML.C
- changed TOK_ZOOM implementation in function InitLcd()

MOPS.C
- changed implementation of registers 0x128-0x12D in function
  ReadIO()

OPCODES.H
- update field select table in "EXTENSION opcode o81B1"

TIMER.C
- moved static lFreq variable to module EMU48.C


Service Pack 5a for Emu48 Version 1.0

EMU48.C
- bugfix in OnPaint(), must redraw annunciators


Service Pack 5 for Emu48 Version 1.0

DDESERV.C
- return DDE error if emulator state couldn't change to sleep state

EMU48.C
- added Copy/Paste Clipboard data from/to stack (strings only)

EMU48.H
- extern declaration of global variables
- added function prototypes

EMU48.RC
- added Menuitem Edit "Copy String" and "Paste String"
- fixed multiple use of accelerator keys
- changed version and copyright

ENGINE.C
- added function WaitForSleepState(), wait for the SHUTDN command
  -> stack isn't in use (when the clock is displayed, a time string
  was sometimes on stack instead of the loaded item), then switch to
  state 3 (Sleep state)
- added function AdjKeySpeed(), slow down key repetition

FILES.C
- save mapping size of port2 in global variable
- optimized calculation of bank switch mask in MapPort2()

MOPS.C
- bugfix in MapP0(), data offset was wrong
- bugfix in MapP1(), data offset was wrong
- bugfix in MapP2(), data offset was wrong and real size of module
  was zero
- bugfix in MapBS(), wrong pointer in mirrored data page
- bugfix in MapROM(), wrong pointer in mirrored data page
- bugfix in MapP0(), MapP1(), MapP2(), MapBS(), Config(), Uncnfg(),
  mapped address area begin and end on a mapping size boundary
- bugfix in Map(), the access priority of CE1 and CE2 was wrong
  (SX: port1<->port2, GX: port1<->bank select)
- bugfix in Uncnfg(), the unconfig priority of CE1 and CE2 was wrong
  (SX: port1<->port2, GX: port1<->bank select)
- Map(), size optimized implementation
- Config(), size optimized implementation
- Uncnfg(), size optimized implementation
- C_Eq_Id(), size optimized implementation

OPCODES.H
- insert key slow down in A=IN and C=IN

RESOURCE.H
- added ID_STACK_COPY and ID_STACK_PASTE


Service Pack 4 for Emu48 Version 1.0

EMU48.C
- added code for port1 disable
- changed the default box setting of "Accurate Timer" in checked

EMU48.RC
- added item "Port 1 is Plugged"
- changed version and copyright

KEYBOARD.C
- bugfixes in 1 ms keyboard interrupt handler, keyboard interrupts
  are generated at one of the following conditions: pressing the ON
  key (non maskable), pressing a key detected by the 1 ms keyboard
  scan when enabled (maskable), detect a key after an OUT command
  or after the RSI command when a bit in the IN register is set

MOPS.C
- bugfix in WriteIO(), TIMER1 was loaded with the current value

OPCODES.H
- bugfix in INTON and INTOFF command, they aren't able to generate a
  keyboard interrupt
- bugfix in RSI command, call interrupt routine or set interrupt
  pending flag if a bit of the IN register is high
- RTI command changed, doesn't handle ON key here
- added InfoMessage for BUSCB command

RESOURCE.H
- added IDC_PORT1EN

SERIAL.C
- bugfix, synchronize threads for receive char

TIMER.C
- changed function CheckT1(), quite similar to V1.0 with minor fixes
- changed function CheckT2(), minor fixes
- bugfix in function SetT1(), decrement value after full period,
  don't check for interrupts after setting
- bugfix in function SetT2(), don't check for interrupts after
  setting


Service Pack 3 for Emu48 Version 1.0

DDESERV.C
- new module for DDE communication

EMU48.C
- init DDE callback function and name service
- added section [Serial] in INI-File
- added combobox update in dialog box handler

EMU48.DSP
- new makefile for MSVC 5.0

EMU48.H
- extern declaration of global variables
- added function prototypes

EMU48.RC
- added block "Serial"
- changed version and copyright

ENGINE.C
- bugfix in SetSpeed(), may enable "realspeed" with illegal
  reference counts
- bugfix in SwitchToState(), switching from "Invalid" or "Sleep"
  state into another, ResumeThread() may called before
  SuspendThread() (unsynchronized threads)
- added code for serial device

FILES.C
- separated stack writing code from LoadObject() to WriteStack()

MOPS.C
- added global variables
- changed code in ReadIO() for BAUD, IO CONTROL, RCS, TCS, RBR,
  SREQ?, IR CONTROL for serial support
- changed code in WriteIO() for BAUD, IOC, TBR, IRC for serial
  support

RESOURCE.H
- added IDC_WIRE and IDC_IR

SERIAL.C
- new module for serial support

SERIAL.H
- new header with serial definitions


Service Pack 2 for Emu48 Version 1.0

DISPLAY.C
- bugfix in UpdateMainDisplay(), update display even if it's off

EMU48.C
- added section [Emulator] in INI-File
- added checkbox update in dialog box handler

EMU48.H
- extern declaration of variables

EMU48.RC
- added item "Authentic Calculator Speed"
- changed version and copyright

ENGINE.C
- added code to slow down emulation

RESOURCE.H
- added IDC_REALSPEED


Service Pack 1 for Emu48 Version 1.0

DISPLAY.C
- red and blue has been changed in SetLcdColor()
- use display contrast value from chipset and not the default
  value in CreateLcdBitmap()
- use semaphores to avoid GDI trouble with NT in
  UpdateMainDisplay(), UpdateMenuDisplay(), WriteToMainDisplay()
  and WriteToMenuDisplay()
- execute ResizeWindow() only if window exist
- bugfix in draw part of WriteToMainDisplay()

EMU48.C
- version changed
- added global variable
- added semaphore handling to avoid GDI trouble with NT that prevent
  graphic update sometimes
- added message for right mouse key
- bugfix of a parameter of GetPrivateProfileString()
- removed SwitchToState() and KillKML() at end of program
- eliminated memory leak caused by SetWindowTitle()
- function OnPaint() may returned without calling EndPaint()
- execute UpdateWindowStatus() only if window exist

EMU48.H
- extern declaration of global variable
- added VOID as parameter in function prototypes

EMU48.RC
- added/changed version and copyright

EXTERNAL.C
- bugfix, check if beeper enabled
- changed beeper emulation, more realistic with Windows NT

FILES.C
- avoid an open handle and adjust file attributes in
  LoadBitmapFile()
- the WORD to int conversion used in function SetWindowPos()
  failed; windows with negative position data wouldn't pop up with
  NT (NT GDI is 32 bit coded, Windows 95 mostly 16 bit -> the
  failed conversion doesn't matter with Windows 95)
- bugfix in close file handling of function OpenDocument()
- InitKML() need chipset for contrast setting in RestoreBackup()

KML.C
- added global variables
- use semaphores to avoid GDI trouble with NT in DrawButton() and
  DrawAnnunciator()
- added function ReleaseAllButtons()
- changed mouse handling for pressing more than one key

OPCODES.H
- added S(X) oscillator cycles for each command
- bugfix in A=IN and C=IN command to emulate a saturn bug, on real
  machines the assembler commands only work on an even address
- bugfix in all r=r+CON fs,n and r=r-CON fs,n opcodes to emulate a
  saturn bug, on real machines commands with a single field selector
  cause an overrun to other fields of the register
- NFdbl() replaced by NFadd()
- Ndbl() replaced by Nadd()

OPS.H
- NFinc() definition changed
- NFdec() definition changed
- NFdbl() definition removed
- Ndbl() function removed
- changed implementation of Ninc(), added offset variable
- changed implementation of Ndec(), added offset variable
- optimized implementation of Nadd()
- optimized implementation of Nsub()
- optimized implementation of Nrsub()
- optimized implementation of Nnot()
- optimized implementation of Nneg()

TIMER.C
- added global variables, defines and constants
- added function SetAccesstime() for setting the correct time
- bugfix in AbortT2() which prevent updating the clock sometime
- changed implementation of CheckT1() to correct blink frequency
  of input cursor
- changed implementation of ReadT2() using a high resolution
  timer to minimize skipping timer2 values
- bugfix in SetT2(), always check timer2 control register
- solved a problem with timer2 counts greater than 16.67 min.
- bugfix of wrong timer1/2 values (unsynchronized threads)

TYPES.H
- use position of the t2_ticks variable for oscillator cycles


(c) by Christoph Gieelink
