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 varaible 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 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 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 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() 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 modul 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 funtion 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 funtion 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 modul 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 modul 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 modul FETCH.C - new modul 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 modul 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 modul 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 modul 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 modul 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 modul 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 modul 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 Gießelink, cgiess@swol.de