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 HP49G
- 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 initialisation 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
  register (0x10D)

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 initialisation

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
  register (0x119) 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
  register (0x128,0x129) emulation
- bugfix in function ReadIO(), the TIMER1CTRL and TIMER2CTRL
  register (0x12E,0x12F) must be updated before reading
- bugfix in function WriteIO(), don't clear the XTRA bit in the
  TIMER1CTRL register (0x12E) while setting 
- bugfix in function WriteIO(), after setting new TIMER1CTRL and
  TIMER2CTRL register (0x12E,0x12F) 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 semaphor 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 register (0x120)
  has been written
- bugfix in function WriteIO(), the Chipset.loffset variable only
  was updated when three nibbles at the LINEOFFS register (0x125)
  has been written
- bugfix in function WriteIO(), the Chipset.lcounter variable only
  was updated when the MSB of the LINECOUNT register (0x129) has
  been written
- bugfix in function WriteIO(), the Chipset.start2 variable only
  was updated when five nibbles at the MENUADDR register (0x130)
  has been written
- bugfix in function ReadIO(), the LINECOUNT register (0x128-0x129)
  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 maskeable), pressing a key detected by the 1 ms keyboard
  scan when enabled (maskeable), 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 semaphor handling to avoid GDI trouble with NT that prevent
  graphic update sometimes
- added message for right mouse key
- bugfix of a parameter of GetPrivateProfileString()
- removed SwitchToState() and KillKML() at end of program
- eliminated memory leak caused by SetWindowTitle()
- function OnPaint() may returned without calling EndPaint()
- execute UpdateWindowStatus() only if window exist

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

EMU48.RC
- added/changed version and copyright

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

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

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

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

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

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

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


(c) by Christoph Gieelink, cgiess@swol.de
