Florence

Florence is an Apple IIGS emulator originally written in Java 1.3, and now ported to Objective-C under Cocoa for Mac OS X.

Changes

1.0d2 - 21st April 2008
  • Finished port of IWM and threading code.

1.0d1 - 3rd April 2008
  • Built initial VGC support.
  • Name changed and versioning reset.

2.0d1 - 24th January 2008
  • Completed initial conversion of CPU, MMU and debugger to Objective-C under Cocoa. Now runs as an OS X native app. Not bad for only a week's work.

1.0d35 - 12th June 2002
  • Some more speed improvements (around 10%) for standard hires through some additional look up tables. (Lucky that memory is cheap these days)
  • Speed improvements overall by around 20% through debug string optimizations.
  • Hires wasn't displaying hi bit colours (blue and orange). Fixed.

1.0d34 - 11th June 2002
  • Replaced debugger button names with remote control style icons and tool tip text.

1.0d33 - 10th June 2002
  • Improved graphics performance by 4x with some double buffering and image caching tricks.
  • Emulated code running on text page wasn't fetching 8 bit bytes, causing an exception. Fixed.
  • New command line switch -jv to display Java version information on startup.
  • Time stamp now displayed on console lines.

1.0d32 - 14th April 2002
  • New command line switch -meter to turn on instruction metering. New meter window displays crude total instructions executed and rough instructions per second.

1.0d31 - 29th March 2002
  • Built framework for varying display types (text, hires, super etc.)
  • Added more VGC soft switches for video display mode handling.
  • VGC was using location $0800 for screen storage. No effect, just wasted code. Fixed.
  • Hires implemented. Now runs copy protected Alien Rain. Woohoo!

1.0d30 - 26th March 2002
  • Implemented ADB type ahead buffer (supports 256, but is equate change).
  • Refactored breakpoints ready for masking support.

1.0d29 - 24th March 2002
  • Speed improvements for VGC. Screen is now about five times faster on simple character updates.
  • Implemented full correct Apple IIgs key mappings in ADB, including modifiers, repeat and any key down. (Ugly in Unicode Java, but works well)

1.0d28 - 23th March 2002
  • 5.25" support integrated into IWM.
  • IWM now supports everything except writing. (can read and move around on 5.25" and 3.5" nibblized images)
  • VGC wasn't clearing the top line of the 40 column screen correctly. Fixed.
  • New command line switch to load nibblized images into slots 5 and 6, drives 1 and 2.
  • New "[modulename]s" command in xdebugger to show status of each module. So far only IWM supported.
  • In a few circumstances, debugging access to I/O registers were actually triggering I/O. Fixed.

1.0d27 - 22nd March 2002
  • Keyboard now supported through ADB. (Can now boot to DOS 3.3, write/run Applesoft code, drop to monitor and use GS monitor etc. First time in monitor looking at memory was spooky!)

1.0d26 - 21st March 2002
  • Added stepper motor support for 5.25". Now boots 5.25" nibblized disk images. (Which means there's now a whole bunch of software it will run)
  • Now saves and restores BRAM to a file.

1.0d25 - 20th March 2002
  • Now reads/boots 5.25" nibblized disk images. (DOS 3.3 master boots until track seek required)

1.0d24 - 17th March 2002
  • Initial implementation of IWM with minimal support.

1.0d23 - 11th November 2001
  • Basic ADB functionality implemented. Now runs to slot 6 boot code and spins with no drive attached. Looking good.
  • New command line parameter -logadb turns on ADB emulation diagnostics.
  • Debugger now monos itself when doing a step over.
  • Debugger now disassembles tool call names ala GSBug.

1.0d22 - 29th October 2001
  • Real time clock rewritten. Now supports all functions except for time (amusing if you don't know the Apple IIgs).
  • New command line parameter -logclock turns on real time clock emulation diagnostics.
  • Xdebug switch was turning internal debugging off instead of on. Fixed.
  • When in run mode, debugger now "monos" itself to show that the various displays are no longer valid.
  • Debugger wasn't able to read from $C010 to $C01F switches. Fixed.
  • Debugger setting of breakpoint while CPU running wasn't updating the debugger display with the new breakpoint. Fixed.

1.0d21 - 14th October 2001
  • Can now set breakpoint counters instead of just defaulting to 0

1.0d20 - 10th October 2001
  • Changed debugger "Special" button to "Run". Breakpoints now provide the functionality of Special
  • Application/main class name changed from JavaA2 to AppleIIgs

1.0d19 - 9th October 2001
  • Breakpoints now support GSBug style counters
  • Register display is now larger and easier to read

1.0d18 - 7th October 2001
  • Moved development environment from CodeWarrior for Windows to BBEdit on Mac OS X
  • Implemented MVN and MVP
  • Added overflow support to ADC, SBC and BIT
  • Can now set breakpoints and watchpoints from the debugger. Breakpoints now break, watchpoints don't yet watch
  • Now displays version on debugger
  • Version and code name no longer hard coded

1.0d17 - 6th October 2001
  • VGC fetch from text screen exception. Fixed

1.0d16 - 30th August 2001
  • Moved all preferences and startup arguments into preferences object
  • Added -novbl argument to dummy vbl speed up
  • Threads are now all named appropriately
  • Debugger can now switch between various step/trace modes asynchronously
  • Added initialisation complete message
  • Cleaned up console displays
  • BRK wasn't pushing status register in native mode. Fixed
  • Implemented COP, RTI, STP and WDM instructions
  • No addressing mode instructions now disassemble neater
  • Added -logall argument to turn all logging options on
  • Refactored logging management
  • Re-enabled Debugger Trace now that Debugger is async (ie. it can be stopped while tracing)
  • Refactored Supervisor, too many changes to mention. Supervisor = console debugging interface, similar to the Apple II monitor, but external to the emulator, so it is always available. Mainly a test bed for Debugger features before moving into the Debugger, but still available via -supervisor argument at start up
  • Added external devo test support code

1.0d15 - 26th August 2001
  • Debugger stop was doing a step. Fixed
  • Added -debugger, -help, -loginits, -log65816, -Xdebug, -nolog and -rom romname command line arguments
  • Step out fixed. Two problems: Debugger display not updating, test case I was using never actually returns
  • Special now updates Debugger displays after the trigger fires
  • Operand fetch cache wasn't single touching. Fixed
  • ORA (d,x) didn't have an addressing mode. Fixed
  • ADC [d] wasn't registered as a valid instruction and didn't have an addressing mode
  • XCE was shortening mx on switch to native. Weird this never showed up before. Fixed
  • Debugger wasn't predicting mx switches for disassembly correctly. Fixed
  • Debugger now shows start up message
  • Absolute indirect addressing wasn't actually doing the direct part (COUT never calls COUT1 :-)
  • JMP and JSR were only getting operand, not operand result. Fixed
  • Absolute indexed indirect refactored
  • Added ROM symbols (826 to be precise) for disassembly/Debugger (see screen shot for example)
  • Removed wasted space in disassembly line
  • Generally cleaned up Debugger display
  • Skip wasn't updating instruction list with new location. Fixed
  • First cut at VGC. Supports 40 column text with C022 text/background color support
  • Implemented VBL with close to correct timings (standard Java won't do fractions of a millisecond, so is slightly longer than normal VBL. Could be refactored later to rectify using odd/even averaging)
  • Emulator now exits when main Apple IIgs window is closed
  • We now have a running Apple IIgs! Time for bed...

1.0d14 - 24th August 2001
  • Rewrote Debugger in Swing with custom JComponents. Improved speed of Debugger x10. (no shit!)

1.0d13 - 21st August 2001
  • JMP indirect was JMP absolute. Fixed
  • Debugger special trigger was stepping an extra instruction. Fixed
  • Now times execution blocks to nearest millisecond, although timings vary due to JVM having to deal with varying operating systems. For reset to $FC58 (on clock failure):
    • Win98 = 5930ms (5.93s) -- Varies between 5880ms and 6100ms
    • MacOSX = 410ms (0.41s) -- Initial execution (pre-HotSpot) = 599ms (0.59s)
  • SBC was setting borrow around the wrong way. Fixed
  • Added simple step over support to Debugger
  • Adjusted some Debugger controls now that I've seen the layout on four platforms

1.0d12 - 20th August 2001
  • Debugger can now stop traces and step outs
  • For some reason PER was stack relative. Fixed
  • Initial implementation of dummy ADB GLU
  • Now fully traces from power on until GS startup failure "sliding apple" screen

1.0d11 - 10th August 2001
  • Fixed bug where multi-byte operands were big endian
  • Added "Skip" to Debugger
  • Added trace to "Debugger/console/both/none" option
  • Ten more instructions -- all main instructions complete
  • All opcodes implemented
  • All addressing modes implemented
  • Fixed bug where most N flag setters were setting Z

1.0d10 - 6th August 2001
  • Some performance improvements in addressing modes and non-critical MMU use
  • Now correctly touches 65816 address lines in read/write/read-modify-write modes
  • Fixed console output prefixes to be more consistent
  • Fixed "ROM not found message" to display correct ROM name

1.0d9 - 31st July 2001
  • Debugger now displays registers, stack, pre and post execution disassembly

1.0d8 - 30th July 2001
  • CPU engine now runs in its own dedicated thread
  • Debugger now runs in its own dedicated thread

1.0d7 - 28th July 2001
  • Initial cut at optional AWT based interactive debugger. Required now that the CPU engine can trace deep into the ROM.
    • Step / Trace / Trace out / Reset / Stop
    • Optional step/trace disassembly

1.0d6 - 27th July 2001
  • 6 more addressing modes
  • 1 more instruction
  • Improved Debugger
    • optional step disassembly
    • step out support
    • optional mmu monitor
    • configurable break watch point

1.0d5 - 26th July 2001
  • 4 more instructions
  • First implementation of clock
  • MMU support for observer watchpoints (to implement I/O switches)
  • Fixed direct page indexed wrap problem
  • Debugger improvements

1.0d4 - 25th July 2001
  • 2 more addressing modes
  • 9 more instructions
  • Fixed offset problem in relative mode
  • Fixed roll bug in ASL

1.0d3 - 24th July 2001
  • 5 more addressing modes

1.0d2 - 23rd July 2001
  • 3 more addressing modes
  • 16 more instructions
  • Improvements to disassembler
  • Bug fixes for two earlier addressing modes
  • Bug fixes for stack misplacement problems

1.0d1 - 22nd July 2001
  • Coding of initial CPU engine singleton
    • 7 addressing modes
    • 37 instructions
    • stack implemented
    • hardware reset and interrupt dispatching implemented
    • all registers implemented
  • Initial coding at MMU w/shadowing singleton
  • Coding of interactive disassembler for CPU engine
  • User selectable ROM

20th July 2001
  • Initial class design

 Features
  • Interactive debugger -- Works like a hardware logic analyser, able to step/trace/stop/disassemble at the hardware level. Programmer functionality which is impossible to provide on a real machine. Watchpoints can accurately monitor I/O addresses for example.
  • External TCP/IP -- The ability for Marinetti or non-Marinetti applications to use TCP/IP functionality of the host platform, no longer depending upon network hardware required by a real machine.
  • Platform independence -- Runs on most platforms supporting Java 1.3. Already tested on Win32 (Windows 98/2000), Mac OS X and Linux.
  • Scalable performance -- Various areas of hardware and software emulation are multithreaded, automatically improving performance on multiprocessor CPUs, particularly Mac OS, where Java threads are directly mapped to OS X CPU processes.
  • Pluggable interface card emulation -- Third parties may emulate Apple II interface cards by developing Java plugin modules which conform to a common slot emulation API. Samples provided.
  • Escapes legacy environments -- Runs on multiple platforms, scales with hardware architectures, and is easily ported to C#/.NET, providing out of the box scalable Apple II emulation far into the future.



Alien Rain on an iMac G5 2GHhz

DOS 3.3 screen
Boot to DOS 3.3 (under Mac OS X 10.1.3)

Boot screen
Slot scan waiting for boot disk

Debugger
Debugger (under OS X 10.1)

ADB failure
Failure intialising ADB

Desktop screen shots
VersionDatePlatformSize
1.0d2824-Mar-2002 Mac OS X 10.1.3 34K
1.0d2311-Nov-2001 Mac OS X 10.1 199K
1.0d1526-Aug-2001 Mac OS X 10.0.4 196K
1.0d1424-Aug-2001 Mac OS X 10.0.4 196K
1.0d1321-Aug-2001 Windows 98 200K
1.0d1220-Aug-2001 Windows 2000 192K
KDE2 for Red Hat Linux 386 196K
1.0d931-Jul-2001 Windows 98 72K
Mac OS X 10.0.4 164K
1.0d830-Jul-2001 Windows 98 96K
Mac OS X 10.0.4 160K