-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Solace Revision History -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Release 3.2: Sep 26, 2005 -- New Features -- *) Previously, Solace's speed regulation routine would kill time until the next time slice by polling the message queue. This caused Solace to appear to use 100% of the CPU cycles (which it was), but in fact if any other application needed CPU attention, the constant polling of the message queue caused Solace to yield. Nevertheless, it did cause more than one person to think Solace was a CPU hog, so I've changed the speed regulation logic to use the Sleep() function, even though it has very poor granularity. Related to this, I changed the code that updates the status bar with emulation performance statistics to update about once per second whether or not the emulator was in unregulated speed mode. It is easier to read now, and the stats shown are the average over that previous second. *) Internal change (same flush, different plumbing): Code now dynamically attaches handlers to I/O port addresses instead of the old static scheme. -- Bug Fixes -- *) The emulator rate control was broken for AMD-based systems, at least for the Athlon system that I recently upgraded to. The high- resolution performance counter runs 1000x faster than the same counter on my Celeron, which resulted in some overflows using 32 bit math. I rearranged the calculations to prevent that overflow. *) I dropped a line of code somehow, resulting in overlays not working properly when more than one was enabled simultaneously. *) The debugger SAVE and SAVEH commands were both saving in Intel HEX format. *) There was a bug where audio, once disabled, couldn't be re-enabled after starting up again. Now you can enable/disable it at will without problems. *) If the user was viewing the tail part of the log in the debugger window and then resized the window to make it larger, the region after the end of the log would appear as garbage; now it gets cleared properly. *) When a program does an IN from an undriven I/O address, the emulator used to return 0x00. It now returns 0xFF because the real hardware has pullups on the data bus so undriven addresses return 0xFF. This was caught because the program STARW.ECB was counting on this to detect if there was a joystick at a given I/O port. -- Known Bugs -- *) If audio is enabled and the CPU is in unregulated speed mode, and disk accesses are made sporadically (say from doing CP/M DIR commands), the peak CPU speed achieved will settle down to different values. For instance, on my machine, the emulated speed will be 117 MHz, but sometimes after performing a DIR, the speed will become 77 MHz, and a subsequent DIR may nudge it back to 117 or not. This will be investigated for the next release. *) The code relating to the virtual disk access is in a horrible state. A number of times I've started putting in the plumbing to support both virtual northstar (.svn) and virtual helios (.svh) disk files along with the emulation of the helios disk controller. Distractions have kept me from that task, and rather than delay this bug fix release, the code is going out as-is. Don't look at it or you may go blind. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Release 3.1: May 14, 2002 -- New Features -- * Added source level disassembly to debugger. From the debugger, type "help overlay" to get the details on this overwrought command. Also, when loading a ROM/ENT/HEX file from the menu, Solace will see if there is a corresponding .PRN file in the same directory and will load that as a source code overlay automatically. * Enhanced the debugger to put a "splitter bar" between the disassembly window and the command log window. That is, drag the bar between these two windows to change the percentage of debugger window real estate dedicated for these two functions. * Added a "Help" button to the options dialog. Unfortunately, it isn't simple to launch a given URL that contains a target tag (e.g., "solace_options.html#DIP3"). * Solace now emulates the P.T. Music System audio generation hack. This is a simple RC filter on the S-100 interrupt enable line, which drives an audio amp. By toggling this line via EI and DI instructions, multivoiced music can be produced. Control this option via the "Options/Audio" panel. In general this should be disabled unless running the Music System software because otherwise programs that execute EI/DI (such as CP/M) will cause annoying clicks on the audio at various times. The audio can also be dumped to a WAV file. * Having added simple support for audio, I went overboard and added support for sound effects (idea inspired by Bob Stek). Various system activities can be enabled and disabled and volume can be mixed to your annoyance threshold. The audio generation isn't threaded, so that the illusion can be entirely violated simply by selecting a menu item -- audio just stops. Another problem is that I used the older Windows multimedia system instead of the newer DirectX audio API for maximum compatibility, but the net result is that latency from when a sound is initiated until it actually drives the speaker can be considerable. -- Bug Fixes -- *) Some of the main menu items were missing their status line help *) in the debuger command window, hitting used to ring a bell. it got quite annoying very quickly. I didn't debug it before because my PC didn't have a sound card, but now that it does, this became a priority! the solution was to handle the WM_CHAR message in the command entry window edit control subclass handler. *) if you run Solace on a PC that doesn't have a high resolution timer (a really old 386? a x86 emulator?) and it doesn't support the multimedia timer (1ms resolution), solace warns about it but runs without speed regulation. that much is unchanged. it used to be that in these conditions you could still select a CPU speed. now these options are grayed out. *) while fixing that previous bug, I noticed a bug in the emulation's speed regulation code that had a minor impact if the high resolution timer was used but could even hang the emulator if the 1ms timer was used. *) the toolbar wasn't getting notification when the window was resized, so if you made the window too big, the right side of the toolbar wasn't there. *) the scripting feature (main menu File/Run Script...) was found not to work for entering scores for the P.T. Music System program. For whatever reason, the program appears to drop keystrokes if it gets a new keystroke every time the keyboard status port is polled. Solace has a new heuristic that when scripting is enabled, a new key is returned only once every ten times the status register is polled. Scripting now works for MUSIC. -- Unimplemented Features -- 1) the serial port interface 2) the parallel port interface 3) Helios disk system -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Release 3.0: Dec 22, 2001 -- New Features -- * Redesigned the menu system and options control panel. The intent is to reduce menu clutter and to make the control panel easier to navigate. Also, the old "immediate" top level menu items ("Options!" and "Debug!") were pretty non-standard uses of the menu and are replaced by the more standard toolbar. As part of this, the solace.ini file format has changed slightly. There is now an entry for the ini file format. If the version string isn't found, it is assumed that the solace.ini file was generated by a pre-3.0 version of Solace. Also, the windows/main entry used to be the (top,left,bottom,right) coordinates of the main emulator window. However, by adding a toolbar, this would end up effectively shrinking the part of the window used to display the emulated Sol window. For pre-3.0 ini files, a guess is made how high the toolbar is the window size adjusted accordingly. For 3.0 (and later), the windows/main string indicates the window origin and the size of the emulated Sol screen. This allows the size and style of the frame to change without affecting how much of the Sol screen is displayed. * Added support for emulating a Northstar disk controller, along with virtual disks usable with that controller. The actual file on the filesystem has a suffix of ".svn" for Solace Virtual Northstar format. There is a new control panel for selecting some options, such as: + install or remove the disk controller + control disk controller board location. it is strongly advised that you leave it at 0xE800 unless you bother to create a virtual disk that expects it at a different location. All the virtual disks on the Sol Archive will expect 0xE800 unless otherwise noted. + debugging support. if you ever decide to debug a disk driver, the emulator can check that certain disk control lines are driven properly. with the debugging option set, warning boxes pop up and allow you to either ignore the warning or invoke Solace's 8080 debugger * Added "Disk Factory" modal dialog box in support of virutal disk feature. With this dialog box, you can: + create a new virtual disk, optionally installing CP/M boot tracks + inspect format of an existing virtual disk + edit the disk label + set/clear the write protect tab + dump the contents of a virtual disk in a simple text format * Created a new SOLOS image, located in the ROMs subdirectory. solos_cpm.rom removes an annoyance in the standard SOLOS when running CP/M that caused all user entered command lines to be erased as they were entered. * Added a few specially trapped illegal 8080 opcode sequences that can be used for performing magic under 8080 program control. These features are used by the CP/M utilities "import.com" and "export.com" for transferring files between CP/M and the host system in a most convenient fashion. * Made it so the position of the options window is saved between sessions when "Save Options" is selected. * Made it so the size, position, and open/closed state of the debugger window is saved between sessions when "Save Options" is selected. * Restructured breakpoint/exception handling. The old way was more efficient, but caused havoc with the disk controller if a breakpoint was hit during that code. * The built-in personality ROM image is now the standard v1.3 SOLOS modified with a patch to make it work better with CP/M. -- Bug Fixes -- *) 8080 used P flag strictly for parity, eg, even "ADD A,nn". The Z80 uses it as parity for some instructions and for overflow (V) for other, such as "ADD A,nn". Solace uses a Z80 emulator written by Marat Fayzullin to emulate the 8080. I wasn't aware of this difference, so Solace used to treat the P flag like the Z80's P/V flag. This didn't seem to cause any programs to misbehave, but you never know... *) In certain cases, a multiline string would be sent to the debugger command history window, but it didn't always deal with the embedded newlines properly, and the display would look a bit odd (it all came out as one like with a box symbol where the newline should have been). *) In the debugger, using the "exit" command would cause the debugging session to forget all of its state (history, breakpoints, etc). *) A couple of the top-level menu items were missing their help strings that show up in the status bar area *) scrolling debugger dasm window to before 0x0000 caused the instruction at 0x0000 to be displayed repeatedly. *) using the integrated debugger, if you added some breakpoints, then removed some breakpoints, then added some breakpoints, the breakpoints would work OK, but the wrong breakpoint number would be indicated (and sometimes an error message). *) release 2.3 broke saving to tape in realtime mode. fixed. *) not exactly a bug, but a change of heart. For some reason, I had things set up to complain if the solace couldn't find a ROM image in a default place when it started up, and then use the built-in ROM image. I've decided that was too harsh and obtrusive. Instead, I've set things up to complain only if there is a solace.ini and it explicitly specifies an external ROM image. So by default, Solace will silently use its internal ROM image unless told to try something else. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Release 2.3: May 27, 2001 -- New Features -- * At the request of Paul Schaper, I added these three debugger commands, based on similar commands from NSDOS' debugger: MM CM SM * Typing normal text while the input focus is on the tape player dialog will redirect the keystroke to the main window and will shift focus there as well. (idea from Dudley Henderson) * A defeaturing, actually. Solace used to force the numlock state to TRUE when the main window caught focus, and then it would return numlock state back to whatever it was when focus was lost unless the user had actually changed the numlock state in between. The option to have this behavior is still in the code, but it is compiled out by the setting of the DIDDLE_NUMLOCK var defined in solace.h. It didn't work on NT anyway; diddling numlock must be different on that platform. * Added a new feature to the tape dialog: optionally there is a checkbox that allows a user to force the tape motor enable input to the recorder. Oftentimes a user would like to rewind, play, or fast forward a tape yet the Sol is busy running some program. Normally the user would have to quit/suspend the program, do some tape command like CAT to energize the tape motor enable relay, then forward or rewind the tape, then go back to the application. Instead, some users either pulled the motor "remote" wire out, or they added a switch to force the motor enable. Thus, while that progrm was running on the Sol, if they wanted to rewind they just throw the switch, rewind, then turn the switch off. (Requested by Dudley Henderson) To enable this option, go to the "Options/Tape" tab and select the "Allow Forcing Motor Enable" checkbox. * Added a couple of scripting features, at the suggestion of Paul Schaper. There is now a "File/Run Script..." menu item on the main window. A filename is given and then simulated Sol keyboard input comes from the specified file. Files can be nested three deep; a new file is invoked by having a line in the following format: \ However, there should be no leading spaces on the \<.... Each end of line automatically generates a simulated RETURN key stroke. Files can also have "metakeys" that can be one of the following strings on the left, with the corresponding keystroke value on the right: \ (0x0A) \ (0x0D) \ (0x7F) \ (0x80) \ (0x81) \ (0x8B) \ (0x8C) \ (0x8E) \ (0x93) \ (0x97) \ (0x9A) Finally, a specific keycode can be specifed in hex. Eg: \3D (=) \5C (\) \7F (DEL) The debugger has a script interface that is invoked by typing the command include filename.scr where "filename.scr" is the name of the actual script to be read in. Nesting is also three deep here and is invoked by including a line of the form: \ Unlike the scripting facility of the main program, the debugger scripting does not interpret metakeys. NOTE: SOLOS and other programs often poll the keyboard while they are performing output to the screen; they may be looking for the MODE key or CTRL-C or a press of the space bar. At any rate, this will characters from any script that is running unless something is done about it. The script facility in Solace has the following heuristic to try and prevent this. It isn't perfect, but it is better than nothing. Any time the script produces a carriage return, a timer is set for 100 ms to suppress any further script interpretation until the timer times out. If any of the memory mapped locations are written to, indicating output from the program, the timer is reset back to 100 ms. This works OK for the most part, but it isn't perfect. If you have a better idea, let me know about it. -- Bug Fixes -- * The SVT file format presumed that all filenames would consist only of printable ASCII characters, zero padded if less than five chars long. This isn't necessarily so. The file name now has an escape mechanism for specifying odd names. The escape is the backslash (\) character, followed by two hex digits. If the real filename contains a backslash, it should be represented by "\5C". If a name is less than five characters long, it will be padded out with 00 bytes (which is what SOLOS does on the command line). If you need space padding, say on filename "ABC", do it like this: H ABC\20\20 42 0100 0100 0100 otherwise it will be assumed to be ABC\00\00. * When an SVT is read into memory off of disk, if there is an error in the file format, Solace will not indicate the line in error. Before, it simply said that something was wrong with the file with no indication as to where. * If the write protect tab of a virtual tape was changed but nothing else was modified on the tape, Solace didn't consider the tape "dirty" and thus wouldn't prompt the user to save the change on exit. * Dip switch 1 and 4 have only six switches; Solace used to have eight switches there, although switch 7 and 8 were n/c's. * If the display was scrolled while the bottom of the display was offscreen, the scroll would mess up. * If both tape drives motor were enabled, odd things could happen. The emulation still isn't perfect, but better than it was. For instance, if you do a CAT and both tapes are playing, in real life noting intelligible would result, but in solace one or the other will be read. Doing things with both motors enabled isn't heavily tested. Don't push your luck. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Release 2.2: Feb 19, 2001 -- New Features -- * The most significant change is that Solace now supports virtual tapes. There can be two tape decks. The file extension for the virtual tapes is .SVT, for Sol Virtual Tape. The file format is ASCII, which makes for easier construction and debugging. This feature now allows running and saving data and programs from cassette BASIC. * solace.ini now logs more information: - the main window size and position - the tape drive open/closed state and position - the default file for the boot ROM - the default dir for binaries - the virtual tape configuration options * If Solace can't find the ROM image on disk, it defaults to a built-in image of SOLOS. * Whenever the run state changes from running to halted (including after each step or next command), the current state of the registers is logged along with a disassembly of the next instruction to be executed. This is very useful when single- stepping. * When ever a breakpoint is hit, the debbuger now blist's the breakpoint, rather than blandly saying "breakpoint #n has been hit" * When adding, enabling or disabling a breakpoint in the debugger, rather than just saying "breakpoint n" has been added or changed, it is blist'ed. * When the debugger window first popped up, it defaulted to whatever size windows thought appropriate. For high-res displays, it was ridiculously large. Now it is set to 640x480 by default. * Not a new feature, but fileio.c was renamed to hexfile.c and was significantly rewritten to allow serialized access to either an ENT file or a HEX file. Part of this new functionality was required by the virtual tape feature (source file indirection). * The Devanagri font uses 8b per scan row instead of 7b like the normal font. Changed to use 8b. * The About box now has a button that brings up the web page. * Added "Help/Debugger" and "Help/Virtual Tapes" menu items. * Restructured the release directory structure to make the top level less cluttered. -- Bug Fixes -- * The status bar menu help message that pops up associated with FILE/SNAPSHOT always indicated that snap0000.bmp would be created. It now dyamically shows the real next file name to be created. * Changed REGS debugger window to show decimal values without leading zeros. * Dumping memory to an intel-format hex file started with the line "ENTER xxxx", which for the ENT format, not the intel hex format. * solos.ini and snap0000.bmp used to be saved in whichever dir was most recently visited (say, after a "load program") instead of in the same directory where solace.exe lives. * fixed quite a few win32 handle leaks and cases where an object was deleted just before it was deselected from a DC. * Got rid of the "TICK" field in the debugger registers subwindow. It wasn't hooked up to anything. * The horizontal scrollbar in the debugger DASM window was often active even though the screen was quite wide. * Adding, removing, then adding more breakpoints could cause weird behavior. * Removing a breakpoint echoed the array index in the status message rather than the logical breakpoint number. * If more than 9 breakpoints had been defined at some time, the debugger interpreter could get confused whether we were using decimal or hexidecimal arguments. * The status message that was logged when the PC hit a breakpoint was reporting a 32b PC value instead of 16b, with the top 16b as garbage. * The screen snapshot code didn't take the scrollshade state into account. * If the bottom few lines of the screen were clipped, scrolling could cause an incorrect display. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Release 2.1: Dec 2, 2000 This is a brief note on the state of the Solace Sol computer emulator. Please also read the todo.txt file for some insight into my priorities of things to fix and planned enhancements. -- New Features -- * added scrollshade behavior, even though no known program other than my test program uses it. :-) * added emulation of IN 0xFE port, hsync and scroll timer. no program that I know of uses them. * added emulation of IN 0xFE port, the sense switches. * changed SW1/SW2/SW3/SW4 menus to instead be a tabbed, modeless, dialog box. besides removing some clutter from the menu bar, there are a few generic 8080 programs around that expect input from the sense switches in real time (programs that originated on altair, imsai, and the like). manipulating the sense switches from a menu was difficult. * SW1-1 now resets the emulated computer, as it should * moved character generator selection to the new tabbed "options" dialog box. added mode to support alternate font selection as implemented by Dudley Henderson in his Sol. It allows editing in Tibetan fonts! This mode is disabled by default as it is rather specific. * Solace now looks for "solace.ini" in the current directory on start up to initialize various options. there is a corresponding menu option (underneath the File menu) to save the current options to "solace.ini". * added LOAD, SAVE, and SAVEH commands to debugger CLI * added the debugger command "KEY nn" to force a keystroke. pinched the idea from applewin, the apple II emulator. * improved keyboard emulation. in previous versions of Solace holding down the CAPSLOCK and F1 keys (emulating reset from the keyboard) would cause the emulator to repeatedly reset. Now, the screen goes black until either key is released. also, like a real Sol, you can get typematic action by holding down or (ie, in either order). It used to be that had to be the first one held down. * emulate non-infinitessimal duration of keyboard strobe. when a key is pressed on the keyboard, there is an async strobe of approximately 6 uS where the strobe is active. normally, this strobe is gone before the software gets around to reading the key. however, if the key is read while the strobe is still active, the "key ready" flop remains set and it looks like the key was hit twice. here is a small program that you can run on Solace or on a real sol to show the problem, courtesy of Paul Schaper: EN 0 0000: DB FC FE 97 C8 32 00 CC C3 00 00/ IN 0FCH CPI 97H ; check for up-arrow RZ STA 0CC00H JMP 0 It displays the last key pressed onto the screen. While running, any key I press is displayed. If I press the arrow key, it returns to Solos. In Solace, I always get just a prompt. On my Sol, I get a prompt and then the prompt jumps up a line (Solos acted on the up-arrow) 90% of the time. (That is, I press LF, ^, LF, ^ to enter/exit the program but 10% of the time, Solos didn't execute an ^.) * added a program icon. I'm no artist, that's for sure. Looks OK in 32x32 mode, but terrible in 16x16. -- Bug Fixes -- * the "solos.rom" ROM image that was distributed with earlier versions of Solace was functional, but unfortunately wasn't very compatible with the vast majority of Solos ROMs out there. A slight change in the code caused the starting address of many routine entry points to change. Although it shouldn't make a difference, many programs made use of those ROM-resident routines and thus broke. * fixed a bug in disassembler pane scroll logic where scrolling backwords would sometimes trigger an assert. * fixed a bug in stack debugger window where a change in the even/oddness of SP wasn't accounted for. * changed OnPaint handler in command log window to greatly reduce the amount of flashing on a resize event (especially when doing dynamic resizing). * whenever a breakpoint was added or changed in the debugger, the dasm window would go and scroll the current PC back into view. now it only does that after entering debug mode, after single step, or after changing the PC manually (set pc xxxx). * the disassembler window would sometimes go wild. While I was at it, I made the current PC appear on the 4th line of the window whenever the current PC wasn't already displayed somewhere in the current window. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Release 2.0: October 30, 2000, limited release -- New Features -- * added debugger interface. allows disassembly, breakpoints, single step, memory & register viewing & modification. it is a combination CLI (command line interface) and GUI affair. * removed support for Z80. no point in having it; it isn't historically accurate, it complicated the debugger, and it made the binary bigger. -- Bug Fixes -- * fixed small bug; chars of exactly value 0x80 in display didn't track on/off/blink state * fixed small bug: refresh display after loading a program just in case all/part of the loaded data fell into screen space -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Release 1.1: July 11, 2000 First public release. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=