Revision History ---------------- V0.60 * What was lost is found, I appear to have found a backup of Handy source code that is dated after the release codebase I used when I restarted Handy. I had thought that this was lost in a hard disk crash !!! This has support for headerless cartridges as per the Handy development system and also some fixes to the sprite engine. (Needs HOWARD.O) I've now merged the two releases. (Note Handy981102.zip contains last valid Handy codebase before merge) * Implemented a new CGraphicsWindow class to the debugger to display raw screen data from the Lynx memory. * Implemented some additional sprite code to use the collision memory, I dont know if it is correct as the docs are a little sketchy in this area. Bastians invaders now works OK. * Modified some of the debug window code structure so that LynxWin is not required by any of the debug windows. * Fixed a couple of bugs in the 6502 BRK & Interrupt implementation. * Re-wrote the C65C02 class to use INT type as oppsed to BYTE/WORD types. This has given a 5%-7% speed increase over 0.52. * Fixed bug in Dev version where KEYUP messages were not being passed back to the main window causing lynx buttons to get stuck when debugging. * Added code to stop full screen switch during a debug session. * Bugfix for string length overrun in mikie.cpp causing crash if Lynx went into auto powerdown mode. * Fixed a bug with TSB & TRB instructions that was stopping many games from working with the new CPU core. * Added multiple breakpoint support to debugger and display of breakpoints into the trace window. * Added LSS (LynxSnapShot) support...Handy can now load/save game snapshots. * Reworked LFSR sound code to remove the big (8MB) lookup table, Handy is now be much more memory frugal and easier on your cache. LFSR values are now recalculated on the fly. * Removed the "waiting" dialog box from initialisation as with the above change the init of the lynx object is almost instant. * Fixed a new bug introduced with the collision memory fix. * Fixed CPU bug with indexed pointers, they now wrap correctly. * Changed Mikie so that Lynx thinks its plugged onto an AC Adaptor, stops the annoying timeout your used to get. * Rewrote the memory handlers, speed increase only 1-2%, a little dissapointing. Should also reduce memory requirements by about 4MB. * Fixed bug with spurious TX Uart interrupts. * Fixed timer bug, TIMER_DONE is always set regardless of timer type. Gates of Zendocon no longer hangs. * Fixed some more UART bugs, specifically, mUART_RX_READY was only getting set as pulse due to a bug in the timer code. Finally, finally Bastians T_TRIS.O now WORKS, yeeeeeha. V0.52 * Created the new CDirectSoundPlayer class and linked into CLynxWindow. * Removed system linkage to CSoundPlayer class * Small optimisation to CMikie::Update() sound catchup code was calculating the sample each time thru the loop, even though the value is always static. * Modify Mikie code to use a single buffer for sound and fit in with the new sound player class. * Fixed a bug where X4 would give a blank screen under full-screen mode. * Fixed a bug in CDirectSoundPlayer causing crash if another app had the directSound primary buffer locked. * Created new error handling dialog class so that full screeen is auto cleared on error. Stops a problem with machine lockout in full screen. * Removed some of the global variables back into CLynxWindow as they were no longer accessed outside of this class. V0.51 24th October 1998 * Moved history into whatsnew.txt * Tidied the documents a little. * Fixed joystick initialisation problem, forgot to set dwSize * Designed a new homepage V0.50 20th October 1998 * Implemented DirectDraw full screen support * Fixed some memory leaks V0.40 20th July 1997 * Implemented sound code * Implemented support for .com files * Implemented hidden mikie register $FD97 returns 0x42 (life'n all that) * Implemented snapshots for BMP & RAW format * Implemented registry support for persistant parameters. * Fixed a bug in the sprite engine on literal sprites with 3 bits/pixel * Bug fix for multi-quadrant sprite offset error (+1,+1 problem). (I'm a little unhappy with this fix, its a bodge and has caused) (streaking of sprites in some games (California Games, Raiden...)) * 2 Bug fixes for absolute literal sprites. * Implemented cartridge detail boxes into the about box * Added dialog box whilst Handy object constructor is running as this is a little slower than 0.31 due to the sound initialisation. * Speeded up cartridge reloading. * Implemented screen rotation via LNX cart header * Wrote ROTATE.EXE and added to the distribution notes & readme * Fixed the sound problems on the early Atari/Epyx games. * Fixed the 0x80000000 rollback bug causing sound output to stop. * Commented out code for +1,+1 multiquadrant sprite fix. V0.31 21st June 1997 * Fixed error with cycle counting & emulation speed calculations * Fixed throttling code and improved accuracy * Implemented spin control for setting emulation max % * Fixed bug with CPU Stack pointer initialising to wrong value. V0.30 17th June 1997 * Reworked make_lnx.exe, all command line options now work. * Added double buffering logic into core code. * Added additional image modes, hooks for direct-x * Re-organised screen mode selection code new CLynxWindow::VideoModeSet() * Implemented screen rotate * Modified line drawing code so that image reversal is done at source and not with Bit/StrechBlt - Nice speed improvement. * Some optimisation of CSusie::PaintSprites() to improve speed. * Added fps & efficiency calculations plus display window. * Re-wrote sprite painting/cpu interleave. (Some improvement in IRQ flicker) * Added joystick support. V0.20 25th May 1997 * Fixed a few minor bugs in the cart class, no affect on Handy though!! * Implemented early bailout in CSusie::PaintSprites() when offscreen * Implemented he pause key on 'Q' * Restructured source code so that the CPU emulation is entirely inline. * Changed sprite/timer interleave back original concept - separate updates with no interleaving, faster, causes IRQ (HBL) stability problems. * Speed improvements to CSusie::PaintSprites() & CMikie::Update(). * Small speed improvements to the CPU model. * Moved a number of common vars to global status. * Further optimised the CMikie::Update & CSystem::Update() functions, I can now get approx 50% performance on my P133 with 1x screen. (16 bit colour) * Implemented screen flipping * Finally fixed the superclipping algorithm, forgot to flip the quadrants around when hflip & vlfip are used !! * Split distribution into two separate archives - Dev & Std. * Implemented 1st attempt at hardware sprite collison, documentation is a little scarce. * Seemed nobody except me noticed that the screen was always 4 pixels too small. * Fixed nasty bug in UART emulation, caused by a misunderstanding of comlynx hardware implementation, Rx & Tx are looped, doh! (Homebrew:T_TRIS.O now works) * Fixed a bug in the timer implementation relating to timer done. * Fixed the other timer bug, that was stopping serial irq's being processed, even though handy doesn't support serial operations it must support UART emulation due to the loopback issue above. * Found and fixed another sprite engine bug relating to the screen origin being negative and the end positive, error in signed/unsigned handling. V0.10 23rd April 1997 * Rewrote entire CPU class to increase speed! * Modified CMikie::Update to stop timer slippage * Numerous mods to CMikie:Update to implement my new understanding of the way that Mikey IRQ's operate. * Fixed IODAT so that comlynx is NOT connected. * Implemented comlynx serial registers & IRQ structure (Not sure its correct though!!). * Corrected timer mode for non-reload, timers should stop after expiry. * Finally fixed the mother of all bugs in my my system class, not so much a bug but a misunderstanding of the documentation.... doh! V0.06 16th April 1997 (Beta-Tester only release) * Renamed the project to Handy from LWE to make it less windows specific * Fixed annoying message about fake rom after every cart load/reset, it should only happen on the first occurance now. * Fixed a bugette with negative tilt values, forgot to cast to a signed word. * Fixed a typo bug in the superclipper h & v swapped. * Rewrote CSusie::UpdateSprites() due to an implementation bug. Tilt is now possible once more... * Monster bug bashing session in CSusie::UpdateSprites() tilt/stretch is now working correctly. Still one issue with jitter on trailing edge. * Implemented PBKUP counter in Mikey to be a pseudo line hold-off before starting line DMA, hope this is right, there is no documentation to say exactl what this counter does. * Fixed bug with CPU Zero Page references being able to to beyond the zero page boundary, forgot to and with 0xff, Doh! (Many things now work!!!) * Fixed bug where by the current video page address was being picked up before the pseudo VBL resulting in frame being flipped in the wrong order. * Unfortunatly I've had to remove one of the optimisations as it was stopping some games (California Games in particular) working. Handy was doing 2 CPU instructions for each mikey/suzy update, I've now had to reduce that back to 1 with a resulting speed loss 8-( * Rewrote CMikie::Update() to improve the speed of operation. * Repartitioned & removed CSusie::Update to move functions under system::poke() handlers to speed up the system. V0.05 12th April 1997 * Command line filename support added * Homepage added to documentation, document tidyup. * Fixed CSusie::UpdateSprites() unpack bugs, vague documents are always such fun to interpret. * Implemented superclipping algorithm in CSusie:UpdateSprites() * Fixed sign bug in signed multiply function in CSusie::UpdateMath() due to incorrect casting. (apfel_2a.o looks like its working correctly now.) * Found and fixed the bug in CMikie::Update() that was stopping some cartridges loading, it took a long time to find as I was looking in the wrong place... * Reversed joystick axis, the documents seem to be wrong ?? V0.04 10th April 1997 * Repartitioned CLynxWindow::CLynxWindow() so that the lynx system creation is now outside in LynxInit() which returns a pointer to a lynx. * Added code to allow cartridge load from the file menu using LynxInit() * Added code so that LWE will remember the last cart type loaded and use that for the next cart to save the default to .o each time. * Added support for 16bit colour mode under windows. (Much prettier) * Optimised CMikie::Update() screen accesses. * Added code to pause the emulator when it loses focus to another window. * Implemented sprite h/v flip in CSusie:UpdateSprites() * Corrected quadrant initialisation error in CSusie:UpdateSprites() * Implemented signed maths in CSusie::UpdateMath() * Started implementation of sprite collision logic in CSusie::Update() V0.03 9th April 1997 * Repartitioned CSusie:Update() into UpdateSprites() & UpdateMath() * Implemented CSusie::UpdateMath(), signed arithmetic still needs doing. * Fixed 2 bugs in CSusue:UpdateSprites() * Update & implement cpu, mikey & suzy cycle counters V0.02 8th April 1997 * Its amazing what an evening with a source code profiler can do, LoadRunner is now almost playable on my P133. There's still scope for a number of speedups that will take a little more time than an evening. * Minor bugfix in CLynxWindow::OnKeyUp() left/right reversed. * Minor bugfix in CSusie::Update() Error in pixel calc on absolute literals fixed absolute literal sprites now seem to be working correctly. * Some cartridges now work. The boot screen of Gauntlet is recognisable !!! V0.01 7th April 1997 * First functional release of the emulator. All of the lynx hardware is now emulated except for the MATH & AUDIO functions. V0.00 ?? Oct 1996 * Started writing the debugging kernel & windows --- END OF FILE ---