Emu71 Changelog

What's new in Emu71 1.17

Jul 25, 2023
  • Changed function WinMain(), added disable of TIMER_RESOLUTIONthrottling for Windows 11 and added a more flexible CPU binding for the Saturn core emulation thread on Windows Vista and later with function GetCurrentProcessorNumber()

New in Emu71 1.16 (Aug 24, 2022)

  • EMU71.C:
  • 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
  • EMU71.H:
  • changed function prototype
  • extern declaration of global functions
  • EMU71.RC:
  • changed version and copyright
  • 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
  • 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

New in Emu71 1.14 (May 18, 2021)

  • EMU71.RC
  • Changed version and copyright
  • HPIL.C
  • Added variable dwHpilConncetTimeout for loading the non-blocked IO
  • Connect timeout
  • Changed function CreateHpilThread(), added initialization of
  • DwHpilConncetTimeout
  • HPIL.H
  • Added dwHpilConncetTimeout variable saving the non-blocked IO connect timeout
  • HPIL.H
  • Extern declaration of global variable
  • TCPIP.C
  • Added function SetNonBlockedIO() for enable/disable blocked IO
  • Bugfix in function TcpSendFrame(), new IPv4 only implementation
  • Fixing host name resolution with a buffer maybe destroyed before
  • Using and added implementation for non-blocked IO connect
  • Changed function TcpInit(), added initialization of
  • DwConncetTimeout to blocked IO connect
  • TCPIP.H
  • Added dwConncetTimeout for non-blocked IO client connect
  • SETTINGS.C
  • Changed function ReadSettings() and WriteSettings(), added item
  • "ConnectTimeout" in section [HPIL] in the INI-File

New in Emu71 1.13 (Nov 17, 2020)

  • EMU71.DSP
  • Removed external.c sources
  • EMU71.H
  • Removed extern declaration of global functions
  • EMU71.RC
  • Changed version
  • 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
  • EXTERNAL.C
  • File deleted
  • FETCH.C
  • Changed table o81B_, removed 1LK7 changes because table has no
  • 1LK7 related opcodes any more
  • Changed table o81_, replaced beep patch opcode o81B_ by
  • o_invalid3, so table o81B_ isn't used any more
  • KML.C
  • Changed function InitKML(), changed warning to error at ROM beep
  • patch detection
  • LODEPNG.C
  • Changed implementation file to LodePNG version 20201017 with
  • unmarked typecast patches for x64 compatibility, Copyright (c)
  • 2005-2020 Lode Vandevenne
  • LODEPNG.H
  • Changed header file to LodePNG version 20201017
  • MOPS.C
  • Bugfix in function TAcc(), moved critical section because
  • InitAdjustSpeed() part is already protected
  • OPCODES.C
  • Removed function o81B0() and o81B1() as part of the beep patch
  • OPCODES.H
  • Removed extern declaration of function o81B0() and o81B1()
  • SOUND.C
  • Bugfix in function SoundOut(), removed critical section handling
  • because InitAdjustSpeed() is already protected

New in Emu71 1.12 (Jul 14, 2020)

  • Changed function OnPaint(), changed call of function
  • UpdateAnnunciators() updating all annunciators

New in Emu71 1.11 (Oct 30, 2019)

  • DEBUGGER.C:
  • Added enum type, static variables and static function prototypes for trace implementation
  • Removed all occurrences of UNREFERENCED_PARAMETER(wParam);
  • Changed function NotifyDebugger(), added flush trace buffer
  • Changed function Debugger(), added trace implementation in case WM_INITDIALOG, WM_DESTROY and WM_COMMAND
  • Added functions StartTrace(), StopTrace(), FlushTrace(), PrintTrace(), OutTrace(), OnBrowseTraceSettings(), TraceSettings(), OnTraceSettings() and OnTraceEnable() for trace implementation
  • DISPLAY.C:
  • Changed function CreateMainBitmap(), changed LoadBitmapFile() function call loading a bitmap with realizing a palette
  • Changed function CreateAnnunBitmap(), changed LoadBitmapFile() function call loading a bitmap without realizing a palette
  • EMU71.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
  • EMU71.H:
  • Changed function prototype
  • Extern declaration of global functions
  • EMU71.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 warning for 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
  • TCPIP.C:
  • Changed function ThreadTcpIpServer(), first argument of functionselect() wasn't Berkeley sockets compatible but had no influence on Windows usage

New in Emu71 1.10 (Oct 17, 2018)

  • DEBUGGER.C:
  • Bugfix in function AddPortChip(), showed wrong HPIL mailbox size, bug introduced in v1.09 when saving the internal HPIL CPU state
  • DISPLAY.C:
  • Added function SetAnnunBitmap(), setting a created annunciator bitmap
  • EMU71.C:
  • Bugfix in function OnViewCopy(), fixed unsynchronized GDI operation
  • EMU71.DSP:
  • Added lodepng.h and lodepng.c sources
  • EMU71.H:
  • Extern declaration of global function
  • EMU71.RC:
  • Changed version and copyright
  • 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
  • HPIL.H:
  • Added wTalkerFrame variable saving the last talker frame
  • Added bySrqEn variable saving the SRQ acknowledge flag
  • HPILBUF.C:
  • Bugfix in OutSetFrame(), fixed deadlock by adding a timeout for the case not being active talker
  • HPILCMD.C:
  • Changed function TransmitFrame(), added Remote implementation for HP-IL Interface Status Byte as controller and parallel poll memory implementation addressing myself
  • Changed function enter_bytes(), optimized ETO/ETE detection and added ETE handling after single data byte and NRD frame
  • Changed function end_listen(), optimized ETO/ETE detection and added ETE return to EOT received status message
  • Bugfix in function execmd15(), at case 3 "set SOT response" added status SRQ acknowledge flag handling and parallel poll SRQ handling
  • Bugfix in function execmd(), at case 1 "frame class" added frame type checking when operating as device
  • HPILDEV.C:
  • Changed function DeviceInit(), changed initialization of device ID and added initialization of parallel poll, local mode, last talker frame and SRQ acknowledge flag
  • Bugfix in function class_doe(), as active talker a set SRQ bit in the DOE frames wasn't preserved, added talker ETE implementation and last received data frame variable must be set as listener only, otherwise frames to other listener overwrite this variable
  • Bugfix in function class_cmd(), added PPE, PPD, PPU and GTL frame implementation, changed the REN frame implementation: REN switch from 'local mode' to the newly created 'remote enabled mode' and a following LAD frame switch from the 'remote enabled' to the 'remote mode', expanded NRE frame implementation with cleaning up the internal state register
  • Changed function class_rdy(), added last talker frame saving, status of SRQ acknowledge flag and expanded SST implementation with parallel poll SRQ handling
  • Bugfix in function DeviceFrame(), added SRQ bit in frame only if SRQ is not acknowledged by reading the HP-IL status and added IDY implementation for parallel poll
  • 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()
  • Bugfix in function DrawAnnunciator(), used wrong device context on external annunciator bitmap for getting background pixel color (buggy implementation only worked with external bitmaps having a white background color)
  • Changed function ResizeMainBitmap(), added annunciator resize handling for annunciator definitions inside main bitmap
  • LODEPNG.C:
  • New module for decoding PNG files LodePNG version 20180910 with unmarked typecast patches for x64 compatibility, Copyright (c) 2005-2018 Lode Vandevenne
  • LODEPNG.H:
  • Header file for decoding PNG files LodePNG version 20180910, Copyright (c) 2005-2018 Lode Vandevenne

New in Emu71 1.09 (Sep 20, 2017)

  • DISPLAY.C:
  • Bugfix in function ResizeWindow(), added Critical Section for GDI access
  • EMU71.DSP:
  • Added hpilbuf.c and hpildev.c sources
  • EMU71.H:
  • Changed window style for disabled title bar, added system menu with minimize in task bar
  • Extern declaration of global variable and functions
  • EMU71.RC:
  • 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 OpenDocument(), skip packed HPIL module data check
  • Added function LoadIconFromFile(), load icon file and activate the icons
  • Added function LoadIconDefault(), activate the window class default icons
  • HPIL.C:
  • Replaced HPILMEM structure variable dwSize by HPILDATA structure array size constant byIOMem
  • Changed access to all variables located in the I/O processor data structure now
  • Added function InitIoMem() for basic initialization of the I/O processor memory
  • Added function ResetHpilData() for resetting the I/O processor memory
  • Changed function CreateHpilThread(), moved initialization of the I/O processor memory to function InitIoMem() and removed bController setting
  • Changed function DestroyHpilThread(), cleanup device features
  • Changed function IoThread(), detect controller mode now over the status bit in byIoStatus
  • Changed function AllocHpilMem(), changed function prototype to be able to modify the given module data size and the size of the module data array and added initialization logic and saving the complete I/O processor data structure now
  • Bugfix in function UncnfgHpilMem(), changed function prototype returning VOID
  • Bugfix in function DetachHpilMem(), removed searching for the hMemModule instance in the module list, from design the module to remove must be the one given by the 1st argument and changed function prototype removing the 2nd argument hMemModule
  • HPIL.H:
  • The I/O processor data is separated into an own structure which is part of the module administration structure
  • Added critical sections
  • Added I/O processor RAM
  • Added state variables for working as device
  • Moved variable byIdySrqPollTimeout to address in I/O processor RAM
  • Changed variable bAbort to byAbort
  • Added extern declaration of global functions
  • HPILBUF.C:
  • New module with HPIL input and output buffer handling
  • HPILCMD.C:
  • Changed access to all variables located in the I/O processor data structure now
  • Added critical section around all byIoStatus write access
  • Replaced all calls of HpilController() with TransmitFrame()
  • Added function IntrFrame(), helper function to decode interrupt cause from frame
  • Added function TransmitFrame(), added special handling for LAD 00, TAD 00, UNL, UNT and SDA frames, send frame over the loop and decode controller specific interrupt cause
  • Changed function sendbytes(), added device mode implementation
  • Bugfix in function enter_bytes(), IDY frames had been detected as an END data frame
  • Changed function execmd0(), at case 2 "request hpil status" set "I/O CPU requires service" bit when in device mode and data is in the input buffer and also clear HP-71 NRD bit in mailbox, at case 3 "end of message" added device mode implementation, at case 6 "send error msg" also clear HP-71 NRD bit in mailbox, at case 14 "read my loop address" added device implementation and at case 15 "take/give loop control" replaced bController variable usage and added terminator mode and byCstate settings
  • Changed function execmd15(), at case 0 "read memory" added a basic implementation, at case 3 "set SOT response" added implementation, at case 9 "set IDY SRQ poll timeout" replaced variable byIdySrqPollTimeout by byRAM[0x64], the address in the I/O processor RAM, at case 10 "set up interrupt mask" save the interrupt mask value in the I/O processor RAM, at case case 11 "read interrupt cause" and at case 12 "read DDC frame" added implementation
  • Bugfix in function execmd(), at case 1 "frame class" added device mode implementation, at case 2 "(un)address me as TL" fixes in address (setting TL) and unaddress (unaddress only with one or both of the TL bits set) and added byCstate setting, at case 12 "pass control", at case 13 "set frame timeout value" and case 14 "set frame count" added implementation
  • Changed function reset_mb(), added device specific resets and use external function for resetting the I/O processor memory
  • Added function device_listen(), added listen transfer from input buffer to mailbox when configured as device
  • Changed function ilmailbox(), added device listen transfer
  • Moved function DeviceFrame() to HPILDEV.C
  • HPILDEV.C:
  • New module with HP71 device implementation
  • KML.C:
  • Added keyword "Opaque" and "Icon" to pLexToken[] table
  • Changed function InitGlobal(), added implementation of keyword "Icon"
  • Changed function InitAnnunciator(), added implementation of keyword "Opaque"
  • Changed function KillKML(), added LoadIconDefault() to disable custom icons
  • Changed function DrawAnnunciator(), added opaque bitmap drawing
  • Bugfix in function ResizeMainBitmap(), added Critical Section for GDI access and added upscaling feature
  • Changed function InitKML(), removed main bitmap downscaling limitation
  • KML.H:
  • Added TOK_OPAQUE and TOK_ICON definition
  • Added bOpaque in KmlAnnunciator structure
  • MOPS.C:
  • Added global variable HMap for remembering hard configured chips
  • Changed function MapDDC() and MapROM(), added hard configured chip setting
  • Bugfix in function MapIRam(), map only free memory pages
  • Changed function Map(), disable hard configured chip settings and config ROM modules first
  • Changed function MountPorts(), adjusted call of function AllocHpilMem()
  • Changed function DismountPorts(), removed memory handle argument from pfnDetachMem() call
  • Bugfix in function Uncnfg(), had only unconfigured first module with matching base address, but have to unconfigure all
  • Changed function UpdateBatState(), changed function prototype returning VOID
  • PORTCFG.C:
  • Changed valid module type list from an array of strings to an array of pairs with module type and corresponding string; this allows to change order of the list
  • New function GetModuleID() returning the module type list entry for the given module type
  • Changed function ShowPortConfig(), adjusted to new module type list and added "UNKNOWN" module type message
  • Changed function OnAddPort(), adjusted to new module type list and optimized filename control
  • Changed function ApplyPort() and PortSettingsProc(), adjusted to new module type list
  • PORTMEM.C:
  • Changed function UncnfgMem(), changed function prototype returning VOID
  • SATMEM.C:
  • Bugfix in function MapSaturnMem(), map only free memory pages
  • Changed function ConfigSaturnMem(), optimized by using config page
  • Bugfix in function UncnfgSaturnMem(), changed address page to DWORD, increased readability by page of base address calculation, had only unconfigured first module with matching base address, but have to unconfigure all and changed function prototype returning VOID
  • Bugfix in function DetachSaturnMem(), removed searching for the hMemModule instance in the module list, from design the module to remove must be the one given by the 1st argument and changed function prototype removing the 2nd argument hMemModule
  • STACK.C:
  • Changed function DspRedraw(), allocate memory for CHIPSET copy from heap now to avoid a possible stack overflow
  • Changed function OnStackPaste(), shrinked display status variable to 2 bytes and so the data to transfer
  • TCPIP.C:
  • Changed function ThreadTcpIpServer(), the response type is now dependent on the frame initiator
  • Changed function TcpInit(), added initialization of variable bOriginClient
  • Changed function HpilController(), added frame initiator control handling
  • Changed function HpilDevice(), changed function prototype and added broken loop feature
  • TCPIP.H:
  • Replaced bController by bOriginClient variable in TCPIP structure
  • Changed function prototype
  • TYPES.H:
  • Changed pfnUncnfg function pointer prototype to VOID return
  • Changed pfnDetachMem function pointer prototype removing hMemModule argument

New in Emu71 1.08 (Sep 28, 2016)

  • DEBUGGER.C:
  • changed function UpdateStackWnd(), OnStackPush() and OnStackPop(), fixed signed/unsigned mismatch
  • changed function OnUpdate(), added call of UpdateMemMapWnd()
  • 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 and fixed a buffer overflow when converting a 4 byte hexadecimal string to variable Chipset.in which overwrite the content of variable Chipset.SoftInt
  • changed function UpdateProfileWnd(), fixed signed/unsigned mismatch and optimized ENG unit search break
  • added function GetExpMemCfgTree(), the get expanded or collapsed state of all tree nodes
  • added function SetExpMemCfgTree(), restore the state of tree the nodes
  • added function UpdateMemMapWnd(), update memory mapping dialog content
  • changed function MemMap() and OnMemMap(), switched from modal to non modal dialog
  • DISPLAY.C:
  • added function CreateAnnunBitmap() and DestroyAnnunBitmap(), handle a separate annunciator bitmap
  • 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
  • EMU71.C:
  • changed szLicence string, updated to the latest revision of the GPLv2
  • moved function SetSoundDeviceList() to SNDENUM.C
  • changed function WinMain(), added non modal "Memory Mapping" dialog box in main message handler
  • EMU71.DSP:
  • added snddef.h and sndenum.c sources
  • EMU71.H:
  • extern declaration of global variables and functions
  • EMU71.RC:
  • changed IDD_SETTINGS, removed text "Device" and enlarged width of combo box IDC_SOUND_DEVICE
  • 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 - changed IDD_DEBUG_MEMMAP, added WS_VISIBLE style - changed version and copyright
  • ENGINE.C:
  • added global variable bBusCfg for signaling if the device configuration changed since last debugger update
  • added global variable bBusCfgOpc for signaling that current opcode will change the device configuration
  • changed function Debugger(), added signaling device configuration changed
  • FILES.C:
  • bugfix in function OpenDocument(), prevent buffer overflow on reading pbyPlugData and removed switcher for document format version
  • HPIL.C:
  • changed function CreateHpilThread(), added initialization of byIdySrqPollTimeout
  • changed function IoThread(), added the IDY frame polling feature
  • added function SReqMem() returning the HP-IL service request state
  • changed function ReadIOHpilMem(), removed obsolete remark
  • changed function AttachHpilMem(), added initialization of the service request function pointer
  • HPIL.H:
  • added byIdySrqPollTimeout variable saving the IDY SRQ poll timeout
  • HPILCMD.C:
  • changed function SendFrame(), added "SRQ received from loop" mailbox bit support
  • bugfix in function enter_bytes(), received data frames with set SRQ frame bit had been send back to the loop without cleared SRQ frame bit
  • changed function execmd15(), at case 9 "set IDY SRQ poll timeout" added implementation, at case 14 "power up the loop" added clearing bus SRQ mailbox bit and disable the IDY polling and at case 15 "enable/disable IDY poll" added implementation
  • changed function execmd(), at case 1 "frame class" added manual mode and "SRQ received from loop" mailbox bit support and at case 3 "power down the loop" added clearing the SRQ bits in the mailbox and clearing the IDY polling status bit
  • changed function reset_mb(), added initialization of byIdySrqPollTimeout and removed switching to state MBIDLE to avoid executing reset_mb() more than one time
  • KML.C:
  • added keyword "Scale" to pLexToken[] table
  • changed function InitGlobal(), added implementation of keyword "Scale"
  • changed function InitLcd(), added implementation of keyword "Bitmap"
  • changed function KillKML(), added DestroyAnnunBitmap() and preset of some global variables
  • changed function iSqrt(), changed implementation to Heron's method for speed optimization
  • 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 downscaling main bitmap
  • KML.H:
  • added TOK_SCALE definition
  • MOPS.C:
  • bugfix in function MapROM(), map ROM only if loaded and masking the ROM size with 0xFFFFF is not necessary
  • changed function DismountPorts(), optimized setting of detached marker
  • bugfix in function Uncnfg(), modules on the ports 1-5 were only unconfigured when the corresponding DAISYIN line had been high
  • changed function C_Eq_Id(), loop optimization scanning for ID in attached port
  • added function SREQ(), general function to capture the service requests from the modules (this function was necessary to synchronize the main CPU with the HP-IL I/O CPU)
  • changed function NreadEx(), removed conditional jump for speed optimization
  • OPCODES.C:
  • changed function o80E(), added some remarks and replaced direct loading of the service request BUS content by a function call for CPU synchronization
  • PORTMEM.C:
  • added function SReqMem() as empty function for service request
  • changed function AllocPortMem(), added initialization of service request function pointer
  • 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
  • TYPES.H:
  • added service request function pointer in PORTACC structure

New in Emu71 1.07 (Jul 31, 2015)

  • 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
  • Bugfix in function ShowMemCfgTree(), used interface port list as counter for enumbering the loaded port list (it doesn't matter here because both arrays have had the same number of elements)
  • DISPLAY.C
  • Changed function CreateMainBitmap(), removed unreferenced variable in release mode
  • Changed function WritePixelDWORD() and WritePixelWORD(), changed order of operands to enable constant folding of compiler
  • Changed function ResizeWindow(), optimized implementation now works independent from window style and menu bar setting
  • EMU71.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 SettingsProc(), added "Show Title" and "Show Menu" checkbox handling
  • 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
  • EMU71.H
  • added window styles definition
  • added IRAM macro for linear address access to the 1LF3 RAM part
  • changed function prototypes
  • extern declaration of global variables and function
  • EMU71.RC
  • changed IDD_SETTINGS, 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 ResetDocument(), init the external port interface after dismounting the ports is obsolete, because dismount ports already cleared the external port interface; the problem may occur before, if the external port interface isn't initialized with NULL pointers the function DismountPorts() fail and may corrupt memory;
  • changed function SaveBackup(), changed local variable type of source structure from PPORTDATA *ppsData to PPORTDATA psData and made sure that all source data refer to psData and not to ppsDataBackup, even if the target variable already contain the necessary data;
  • changed function RestoreBackup(), changed local variable type of source structure from PPORTDATA *ppsDataBackup to PPORTDATA psDataBackup and made sure that all source data refer to psDataBackup and not to ppsData, even if the target variable already contain the necessary data;
  • 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 HPIL.C;
  • added variable bEnableRFC to enable the RFC frame following each CMD frame
  • changed function CreateHpilThread(), added reinitialization of DISPLAY IS setting, added initialization of bEnableRFC, bAbort, bySleep, byEndchar, byManual, byMsgCount and byPowered variable, cleared "System Controller" and set "Address Table is not valid" bit in the I/O Processor Status initialization, removed some double variable initializations and changed info message when server start fail;
  • changed function IoThread(), removed initialization of virtual IL, set sleep state of the I/O CPU and adjusted ilmailbox() call to the new function prototype;
  • bugfix in function ReadIOHpilMem(), update I/O memory only when reading the I/O Low handshake nibble, added the sleep state of the I/O CPU to the mailbox and fixed bug clearing the I/O CPU Message Available bit in the I/O CPU Low Handshake Nibble;
  • changed function AttachHpilMem(), added error handling for hMemModule is NULL.
  • HPIL.H
  • added bEnableRFC variable adding RFC frames, added bAbort variable for abort operation because of fatal error, added bySleep variable holding the sleep state of the I/O CPU, added byPowered variable holding the power state of the loop, added byMsgCount variable for returning more than one message by a mailbox command and added byManual holding the manual state of the I/O CPU to the HPILMEM structure;
  • added extern declaration of global variable;
  • removed extern declaration of global functions;
  • HPILCMD.C - replaced all calls of HpilController() with SendFrame():
  • in functions writing to the I/O CPU Low Handshake Nibble fixed clearing all bits instead of the sleep flag and the I/O CPU Message Available bit only;
  • in functions writing to the I/O CPU High Handshake Nibble fixed clearing all bits instead of the three data bytes and error occurred bit only;
  • in functions loading the mailbox register nibble 12 with the status register 2 removed the explicit setting of bit 0;
  • removed function init_hpil() and hpil_ctrl();
  • added function SendFrame(), sending a frame over the loop, check if CMD frames aren't modified and append the RFC behind a CMD frame;
  • bugfix in function autoaddrloop(), fixed an endless loop in the "auto extended addressing" implementation when the number of "auto extended addressing" devices was a multiple of 31, also fixed a wrong byAAD content when only "auto extended addressing" devices are in the loop and also implemented the status bit "Address Table is not valid";
  • changed function incr_addr(), because of bugfix in function autoaddrloop() byAEP and byAAD has to be checked for last address;
  • bugfix in function enter_bytes(), a dwMaxCount value of 0xFFFFF wasn't interpreted as "is termed infinity";
  • changed function end_listen(), minor code size optimizations;
  • bugfix in function do_listen(), at case 1 "received 1 bytes" the "Error Occurred" bit in the I/O CPU High Handshake Nibble was set;
  • changed function findndevice(), added exits for aborting frame sequence;
  • bugfix in function execmd0(), at case 1 "read address table" the "Three Data Bytes" bit in the I/O CPU High Handshake Nibble wasn't set, at case 2 "request hpil status" clearing the "requires service" bit is only allowed when "C" bit is set, at case 3 "end of message" added implementation, at case 8 "go into manual mode"
  • and case 9 "go into auto mode" added rudimentary manual state support, at case 10 "update system controller bit" added implementation, at case 12 "read current address" and case 13 "increment current address" the message nibble 13 was wrong in "auto extended addressing" mode, the nibbles 14 and 15 aren't updated by the I/O CPU and also at case 13 the error bit hasn't to be set when sending the status message, at case "read my loop address" the nibbles 14 and 15 aren't updated by the I/O CPU, at case 15 "take/give loop control" the "L" bit wasn't checked and so a requested CMD frame wasn't send, also fixed overwriting the "C" bit of the status register;
  • changed function execmd15(), at case 0 "read memory" and case 1 "write memory" added TRACE comments, at case 2 "self test" added implementation, at case 4 "set terminator mode" optimized implementation, at case 14 "power up the loop" added setting the power state of the loop, if the loop is powered don't send the NOP frame any more and at a broken loop the mailbox message available flag isn't set any more;
  • bugfix in function execmd(), at case 1 "frame class" the message nibbles 12 and 13 had been wrong, the nibbles 14 and 15 aren't updated by the I/O CPU, at case 3 "power down the loop" added a primitive implementation of the command, at case 6 "find Nth device, type M" and case 7 "auto address the loop" the message nibble 13 was wrong in "auto extended addressing" mode, the nibbles 14 and 15 aren't updated by the I/O CPU, at case 6 the error code in the status register and the error bit hasn't been set, but the message nibbles 14 and 15 are set to error code 1 when sending the status message, at case 7 both I/O CPU Handshake Nibbles had been undefined;
  • changed function reset_mb(), cleared "System Controller" bit in the I/O Processor Status, removed auto addressing the loop, added reset of manual state, added reset for mailbox command returning one message and added state setting; changed function ilmailbox(), changed function prototype by removing the mailbox message data because the pointer to the message data is part of the mailbox data set and added support for mailbox commands returning more than one message.
  • 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.
  • MOPS.C
  • made variable psExtPorts[] static, this make also sure that the variable is initialized with 0;
  • bugfix in function MapROM(), make sure that ROM address space is disabled for writing;
  • changed function ReadIO() and WriteIO(), optimized default case.
  • 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 GCLP_HCURSOR, SetClassLongPtr, GetClassLongPtr and ULONG_PTR definitions for MSVC6.0 SDK and earlier.
  • PORTCFG.C
  • changed function OnAddPort(), removed disabling the no. of chips combobox at HP-IL module type.
  • changed function PortSettingsProc(), renamed variable ppsCfgIns to psCfgIns and changed the "Add" button default configuration from a 4KB to a 32KB RAM module.
  • RESOURCE.H
  • added definitions
  • SATMEM.C
  • changed function AllocSaturnMem(), not necessary to clear the allocated memory;
  • changed function AttachSaturnMem(), added error handling for hMemModule is NULL;
  • SETTINGS.C
  • changed function ReadSettings() and WriteSettings(), added item "ShowTitle", "ShowMenu" and "ClientWinMove" in section [Emulator] and item "EnableRFC" in section [HPIL] in the INI-File.
  • SYMBFILE.C
  • changed function RplLoadTable(), made optimizations and added integrity checks;
  • TCPIP.C
  • changed function TcpCreateSvr(), changed WSADATA variable storage location from instance static to local.
  • TCPIP.H
  • removed wsd variable from TCPIP structure;
  • TIMER.C
  • changed function SetHPTime(), use the IRAM macro to update the NXTIRQ memory content now;
  • changed function StopTimers(), removed VERIFY at waiting for timer function finished because at program debugging the timer may already elapsed and so WAIT_OBJECT_0 never occur any more.

New in Emu71 1.06 (May 21, 2014)

  • DEBUGGER.C:
  • removed INSTRSIZE definition
  • changed function GetAddr(), made function more general by adding address range check and the ability of decoding a symbolic entry into an address
  • changed function ViewCodeWnd(), removed remainder of PCO detection
  • 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
  • changed function AddPortChip(), removed TYPE_EMPTY case because it's only used as end marker and not as valid module
  • 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
  • DISPLAY.C:
  • changed function UpdateContrast(), replaced BitBlt() by PatBlt() function call
  • changed function CreateLcdBitmap(), added implementation to select the pixel drawing routine over function pointer, Zoom factors 1-4 still using the old implementation, greater Zoom factors are using a more generic approach
  • changed DestroyLcdBitmap(), added reset of variables x-zoom factor and function pointer WritePixel
  • replaced function WritePixelQuad() by the new functions WritePixelZoom4(), WritePixelZoom3(), WritePixelZoom2() and WritePixelZoom1() and WritePixelDWORD(), WritePixelWORD() and WritePixelBYTE() with new implementation to support nLcdZoom values > 4
  • added function WriteDisplayCol() for writing a display column
  • bugfix in function UpdateMainDisplay(), removed zoom factor assertion, handle blink mode only if display is on, fixed a off by one synchronization problem in blink mode, redraw annunciators only on change of blink state to avoid annunciator symbols flickering and simplified writing of the display area
  • changed function UpdateAnnunciators(), minor size optimization with better readability
  • changed function StartDisplay(), added reset of blink counter
  • bugfix in function StopDisplay(), restoring the LCD background wasn't locked against GUI thread GDI access
  • EMU71.C:
  • changed function SetSoundDeviceList(), replaced "Standard Audio" device ID from constant to definition
  • bugfix in function SettingsProc(), 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 nLcdZoom assertion
  • changed function WinMain(), added sound engine initialization and clean up
  • EMU71.DSP:
  • added portmem.c sources
  • EMU71.H:
  • changed function prototype
  • EMU71.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:
  • changed function MapFile(), added check of file size and added 64bit qualifier for packed image mask constant
  • 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 checksums only on address patch written and return failture on syntax errors now
  • changed argument type of function ResetPortModule() from PPORTDATA *ppsData to PPORTDATA psData
  • changed function ResetPortData(), adjusted to new prototype of function ResetPortModule()
  • changed function OpenDocument() and SaveDocument(), removed TYPE_EMPTY from module type switcher
  • HPIL.C
  • changed function AllocHpilMem(), changed function prototype returning a HANDLE type
  • deleted function FreeHpilMem()
  • changed function DetachHpilMem(), made function static, added freeing the memory of the module instance and changed function prototype by changing 2nd argument type from PHPILMEM to HANDLE
  • changed function AttachHpilMem(), changed method of memory allocation for the port interface, added setting the destructor function pointer, added freeing memory of module instance in error case, changed function prototype by returning a success flag and changing 2nd argument type from PHPILMEM to HANDLE
  • HPIL.H:
  • changed function AllocHpilMem(), AttachHpilMem() and DetachHpilMem(), changed function prototypes from PHPILMEM to HANDLE
  • deleted prototype of function FreeHpilMem() and DetachHpilMem()
  • HPILCMD.C:
  • used incompatible GCC #else and #endif extention
  • changed function init_hpil(), init the loop only when controller
  • KML.C:
  • changed function InitLcd(), removed Zoom factor 4 limitation
  • MOPS.C:
  • changed function MapDDC(), wrong position of close bracket inside end of IORAM mapping calculation caused a GCC warning
  • changed function Map(), Config(), Uncnfg(), Reset(), C_Eq_Id() and GetPortModule(), removed module function pointer check because the function pointers are loaded now with default handlers
  • changed function Config() and Uncnfg(), removed WORD cast when calling the Map() function
  • changed function MountPorts(), adjusted to new interfaces of AllocSaturnMem(), AttachSaturnMem(), AllocHpilMem() and AttachHpilMem() and removed TYPE_EMPTY case as module type
  • changed function DismountPorts(), new implementation using the generic port detach function
  • changed function NreadEx() and Nwrite(), changed position of 'eChip = NONE' setting to avoid GCC warning
  • changed function UpdateSreq(), replaced binary with boolean OR operator with BOOL data type as 1st operand
  • bugfix in function WriteIO(), annunciators must be redrawn when changing the DON bit or clearing the DBLINK bit in the DDCTL (0xFF) register of the master chip
  • PCH.H:
  • added MSVC6.0 compatible 64bit constant qualifier macro
  • PORTCFG.C
  • changed function SaveCurrPortConfig(), adjusted to new prototype of function ResetPortModule()
  • changed function GetOpenImageFile() and GetSaveImageFile(), merged dialog flags to one constant
  • changed function PortSettingsProc(), removed remaining code of an early beta version
  • RESOURCE.H:
  • removed IDD_RPLVIEW and IDC_CFG_SELHPIL
  • SATMEM.C:
  • added SATMEM structure from file SATMEM.H
  • changed function AllocSaturnMem(), changed function prototype returning a HANDLE type
  • deleted function FreeSaturnMem()
  • changed function ConfigSaturnMem() and UncnfgSaturnMem(), removed WORD cast when calling the Map() function
  • changed function DetachSaturnMem(), made function static, added freeing the memory of the module instance and changed function prototype by changing 2nd argument type from PSATMEM to HANDLE
  • changed function AttachSaturnMem(), changed method of memory allocation for the port interface, added memory allocation check, added setting the destructor function pointer, added freeing memory of module instance in error case, changed function prototype by returning a success flag and changing 2nd argument type from PSATMEM to HANDLE
  • SATMEM.H:
  • moved SATMEM structure to file SATMEM.C
  • changed function AllocSaturnMem(), AttachSaturnMem() and DetachSaturnMem(), changed function prototypes from PSATMEM to HANDLE
  • deleted prototype of function FreeSaturnMem() and DetachSaturnMem()
  • 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
  • TCPIP.C:
  • changed function ThreadTcpIpServer(), removed unused peer socket information and added a security check to prevent a buffer overflow
  • changed function StartServer(), updated IPv6_DUAL implementation to last reference implementation with more checks and removed usage of function GetVersionEx() to set the IPV6_V6ONLY option
  • TIMER.C:
  • removed AUTO_OFF, UNIX_0_TIME, OFF_TIME and ALRM4 definition
  • removed unused uTMaxTicks global variable
  • TYPES.H:
  • added destructor function pointer in PORTACC structure

New in Emu71 1.05 (Sep 25, 2013)

  • DEBUGGER.C:
  • bugfix in function OnSetCursor(), on "Activation follows mouse enabled child dialogs lost focus when cursor moved over parent debugger dialog
  • EMU71.C:
  • bugfix in function SettingsProc(), on "Activation follows mouse" enabled debugger dialog maybe get focus even if it's not the last active one
  • bugfix in function OnViewScript(), ROM image change wasn't handled
  • EMU71.H:
  • extern declaration of global functions
  • removed extern declaration of global variable
  • changed function prototype
  • EMU71.RC:
  • changed version
  • EXTERNAL.C:
  • removed global variable bWaveBeep
  • removed functions BeepWave(), BeepWin9x() and Beeper()
  • changed function External0() and External1(), removed maximum frequency limitation and removed PC speaker support and used function SoundBeep() instead of Beeper() for beep output over sound card
  • FILES.C:
  • added function CalcWarmstart(), if calculator ROM enabled do a warmstart else a coldstart
  • changed function OpenDocument(), use function CalcWarmstart() on ROM change detection now and adjusted to new prototype of function GetOpenImageFile()
  • HPIL.C:
  • adjusted byCurrentAddr variable name
  • HPIL.H:
  • renamed variable byNoDev to byAAD and added the variables byAEP and byAES to hold the last addresses of the "auto extended addressing" method
  • changed variable type of byCurrentAddr from BYTE to WORD to hold the 10 bits of an extended HP-IL address
  • HPILCMD.C:
  • bugfix in function init_hpil(), incomplete initialization on broken HP-IL loop
  • added function autoaddrloop() for initializing the loop with auto-address (AAD) or auto-extended address (AES, AEP, AAD) method
  • added function incr_addr() to increment HP-IL address to next device
  • changed function findndevice(), execmd0() and execmd(), added auto-extended addressing method
  • bugfix in function DeviceFrame(), device address 30 wasn't allowed
  • MOPS.C:
  • changed function MountPorts() and DismountPorts(), changed local variable type of source structure from PPORTDATA *ppsData to PPORTDATA psData
  • PCH.H:
  • added GWLP_USERDATA, SetWindowLongPtr, GetWindowLongPtr and LONG_PTR definitions for MSVC6.0 SDK and earlier
  • PORTCFG.C:
  • changed function LoadCurrPortConfig(), changed local variable type of source structure from PPORTDATA *ppsData to PPORTDATA psData
  • changed function SaveCurrPortConfig(), changed local variable type of source structure from PPORTCFG *ppsCfg to PPORTCFG psCfg
  • changed function ShowPortConfig(), minor optimization with UNICODE handling
  • changed function OnAddPort() and ApplyPort(), changed local variable type from PPORTCFG *ppsCfg to PPORTCFG psCfg
  • changed function GetOpenImageFile(), GetSaveImageFile() and OnEditTcpIpSettings(), added function argument to define the parent window for the called dialog
  • bugfix in function OnBrowse(), OnPortCfgDataLoad(), OnPortCfgDataSave(), OnPortCfgTcpIpSettings() and PortSettingsProc(), adjusted to the new function prototypes above by adding the actual dialog handle as parent window to fix the possibility of opening a 2nd instance of the child window
  • changed function TcpIpSettingsProc() and OnEditTcpIpSettings(), changed parameter type from PPORTCFG *ppsCfg to PPORTCFG psCfg and parameter storage from static variable to window user data
  • SETTINGS.C:
  • changed function ReadSettings() and WriteSettings(), deleted item WaveBeep" in section [Emulator] in the INI-File
  • SOUND.C:
  • changed function GetSoundBuf() and SoundOpen(), eliminate GCCwarning
  • added function SoundBeep(), simple beeper function with frequency and duration argument as replacement for the BeepWave() function
  • TIMER.C:
  • changed function TimeProc(), Critical Section for reading the original timer MSB content isn't necessary

New in Emu71 1.04 (Apr 17, 2013)

  • DEBUGGER.C
  • changed function UpdateProfileWnd(), changed CPU frequency from
  • 640000 constant to calculated one from T2CYCLES
  • EMU71.C
  • replaced global variable ThreadId 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 SettingsProc(), removed sound radio button
  • handlers and added implementation of sound device combo box
  • EMU71.DSP
  • added sound.c sources
  • EMU71.H
  • extern declaration of global variables and functions
  • EMU71.RC
  • changed IDD_SETTINGS, 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
  • added global variable nOpcSlow to hold the number of CPU opcodes
  • slowing down the CPU core
  • changed function AdjustSpeed(), added sound and CPU opcode slow
  • down implementation
  • added function InitAdjustSpeed(), initialize sound and CPU slow
  • down part if necessary
  • changed function AdjKeySpeed() and SetSpeed(), use function
  • InitAdjustSpeed() to initialize the CPU slow down variables
  • changed function WorkerThread(), added sound engine control
  • EXTERNAL.C
  • changed PCM sampling frequency and definition name
  • moved global variable dwWaveVol to module sound.c
  • bugfix in function BeepWave(), eliminated DC offset from waveform,
  • use global waveform-audio output device identifier for opening and
  • made a more general initialization of the waveform-audio output
  • device
  • added function GetFlag() returning the state of the given system
  • flag
  • bugfix function External1(), beeper was always enabled even if the
  • frequency value was 0 Hz or the beeper flag -2 was set (BEEP OFF)
  • KML.C
  • bugfix in function KillKML(), key mapping state table wasn't
  • cleared at the end
  • MOPS.C
  • added function TAcc(), checking timer access for CPU speed
  • measurement behaviour
  • changed function ReadIO(), the timer2 LSB register access is now
  • monitored to analyze the read access scheme
  • 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
  • changed function ReadSettings() and WriteSettings(), added item
  • "WaveDeviceId" and "WaveTime" in section [Emulator] in the
  • INI-File
  • SOUND.C
  • new module for native beeper emulation over wave output device

New in Emu71 1.03 (Feb 20, 2013)

  • DEBUGGER.C
  • prepared for C++ compiling
  • changed function OnFindOK(), added downwards search direction
  • changed function Find(), added and changed message handler for the
  • "Previous" and "Next" buttons
  • EMU71.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
  • EMU71.H
  • added WM_COPYDATA identifier definition
  • EMU71.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
  • changed version and copyright
  • FETCH.C
  • prepared for C++ compiling
  • FILES.C
  • prepared for C++ compiling
  • bugfix in function MapFile(), minimum checked file size was
  • smaller than the initial read size for packed image file check and
  • changed allocation method for image file buffer, don't need an 0
  • initialized buffer
  • changed function SaveBackup(), improved document available
  • detection
  • HPIL.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
  • 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
  • changed function ParseBlocks(), use variable wKeybLocId instead
  • of input locale reading
  • changed function KillKML(), added reset of variable wKeybLocId
  • changed function ReleaseButton(), for speed optimization skip
  • function if button is already released
  • bugfix in function InitKML(), changed implementation by reading
  • the current keyboard layout and convert the layout data to the
  • input locale setting
  • PCH.H
  • added include malloc.h
  • PORTCFG.C
  • bugfix in function ApplyPort(), fixed unsecured access reading the
  • independent RAM signature of a RAM data file, at TYPE_ROM modules
  • the check if the overall module size is a multiple of the single
  • chip size wasn't working properly, made code optimization at
  • TYPE_ROM file loading and improved the check if the single chip
  • has a power of 2 size
  • bugfix in function OnContextMenu(), fixed unsecured access reading
  • the independent RAM signature of a RAM data file
  • RESOURCE.H
  • added definitions
  • SETTINGS.C
  • bugfix in function GetRegistryString(), ignored target buffer size
  • when copying the default to the target string buffer
  • STACK.C
  • prepared for C++ compiling
  • SYMBFILE.C
  • prepared for C++ compiling

New in Emu71 1.02 (Jan 25, 2013)

  • DEBUGGER.C
  • removed variables pbyMapData and dwMapDataSize, the implementation
  • behind moved to module DISMEM.C
  • changed function SetMappingMenu(), ViewMemWnd() and OnFindOK(),
  • changed to DISMEM.C implementation
  • changed function GetMemCurAddr(), OnMemGoAdr(), OnKeyUpDown() and
  • OnKeyPlusMinus(), variable dwMapDataSize isn't global any more,
  • use function GetMemDataMask() instead
  • 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
  • DISASM.C
  • changed function read_nibble(), call function GetMemNib() from the
  • new module DISMEM.C for mapping mode memory access and made
  • function static
  • DISMEM.C
  • new module for accessing memory data for debug view purpose
  • DISPLAY.C
  • initialize hBrush variable
  • bugfix in function UpdateContrast(), delete brush only if exists
  • and create new brush only for an initialized KML contrast palette
  • entry
  • bugfix in function CreateLcdBitmap(), preset KML contrast palette
  • with black on background for the case of a complete uninitialized
  • KML contrast palette and display pattern brush initialization may
  • failed because of an uninitialized KML contrast palette -> brush
  • now created in function UpdateContrast()
  • changed function DestroyLcdBitmap(), reset hBrush after deleting
  • changed function UpdateMainDisplay(), exchanged StretchBlt() back
  • to BitBlt() because the bug in the WineHQ BitBlt() implementation
  • was fixed in Wine 1.4
  • EMU71.C
  • changed function OnPaint(), exchanged StretchBlt() back to
  • BitBlt() in display redraw part because the bug in the WineHQ
  • BitBlt() implementation was fixed in Wine 1.4
  • changed function WinMain(), added more flexible CPU binding for
  • the Saturn core emulation thread on Windows NT4.0 and later
  • EMU71.DSP
  • added dismem.c sources
  • EMU71.H
  • added enum MEM_MAPPING
  • extern declaration of global functions
  • removed extern declaration of global variable
  • EMU71.RC
  • changed version
  • 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
  • HPILCMD.C
  • bugfix in function findndevice(), if a HP-IL device reply with a
  • accessory ID to a SAI frame, the controller has to send back the
  • accessory ID to get the ETO frame from the device
  • KML.C
  • 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 ParseString(), added decoding the \\ sequence as
  • single '\' character
  • 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() 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 variable bLocaleInc
  • bugfix in function ReloadButtons(), ON key button wasn't handled
  • bugfix in function LoadKMLGlobal(), fixed a memory leak caused by
  • the error condition that expected block command is a string
  • changed function InitKML(), added current keyboard input locale
  • setting log file text
  • KML.H
  • added TOK_LOCALE definition
  • TCPIP.C
  • enable IPv6_DUAL definition on VS2005 and later
  • TIMER.C
  • changed function SetHPTime(), time calculation now work properly
  • for host system dates before 1970/01/01 and after 2106/02/07

New in Emu71 1.01 (Jan 25, 2013)

  • DEBUGGER.C
  • changed function ViewMemWnd(), removed initialized but unused
  • variable
  • EMU42.ICO
  • added renamed icon of v1.00
  • EMU71.C
  • changed function SettingsProc(), added "Single Instance" checkbox
  • handling
  • 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
  • bugfix in 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 Disasm(), changed to DISMEM.C implementation
  • 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
  • EMU71.H
  • extern declaration of global variables
  • EMU71.ICO
  • new icon made by Pastor Jack
  • EMU71.RC
  • adjusted IDD_ABOUT dialog to new Emu71 icon
  • added item "Single Instance" in settings dialog
  • added new Emu71 main icon, but remain prior icon with new name
  • inside
  • changed version and copyright
  • FILES.C
  • changed function CrcRom(), if no ROM available return without
  • modifying the checksum
  • changed function ResetDocument(), NewDocument(), OpenDocument()
  • and RestoreBackup(), added state variable if document is available
  • HPILCMD.C
  • changed function execmd(), optimized frame generation in the
  • "frame class" case by removing the pbyMsg[5] buffer usage
  • 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
  • added definition
  • 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