+ addition
- notes/change
= bugfix
# botch

2.63 = JIT Timer 0 wasn't set to the OS default value of 20000
       (fixes Labyrinth)
     = JIT Timers weren't resetting to the latched value (fixes Labyrinth)
     - ZLib_InflateInit2 now requests the ZLib version via ZLib_Version
     - ADFBootFloppy no longer reports "ADFFS:Obey" not found if obey.zip is
       removed, but continues on to try the embedded Boot script
     - Moved Debug build instruction trace to a DA and added *JITTRACE
     = JIT Wimp_ClaimFreeMemory wasn't returning 0 in R1/R2 for a
       silent fail (fixes DSymphonyPlayer DSym_Load / Wizard Apprentice)
     = On GPU based machines, DA2 was being set to the wrong size
       when switching from the GPU GraphicsV driver to the OS driver
     - Changed DA2_magic_number to an better illegal value
     = JIT OS_ChangeDynamicArea 2 wasn't resuming the debugger on IOMD
     = JIT OS_ReadDynamicArea wasn't returning the correct max size
       for RO3.50-4.x
     = JIT OS_ReadDynamicArea -1 was returning the wrong appspace end size
       when emulating RO3.5+
     = ScreenSize was limited to 480KB on RO3.5+
     = The static definition for ZLib_InflateInit2 had the wrong SWI
       number
     + Page Zero read 10C0 (VDU screen address) added (fixes
       Wizard Apprentice)
     = OS_FSControl wasn't releasing the Environment handlers before
       the FSControl_StartApplication call (fixes Wizard Apprentice -
       the UpCall Handlers was corrupting 8698 when passed to the OS)
     = GraphicsV driver wasn't asserting the hardware scroll bit when
       it takes over (fixes scrolling in Wizard Apprentice)
     = Service_ModeChange wasn't resetting the previous HCR/VCR values
       (fixes Boogie Buggie)
     - Split IOC VFLKBK into a seperate RTSupport routine
     = JIT CACHEOP_INVALIDATE_TLB_ENTRY wasn't invalidating the correct TLB
       entry on ARMv3
     = JIT hv_reset_memory_block wasn't switching subpages to readonly
       correctly on ARMv3/v4
     = JIT 26bit Module Message Filename wasn't being being set in the stub
     = JIT BASIC26 was pointing at the wrong Message file
     - JIT CACHEOP_INVALIDATE_TLB_ENTRY now only branches if a TLB flush
       is not required
     = JIT 32bit Module loads/inserts are now passed to RISCOS
     + JIT no longer flushes the cache on ARMv3
     = JIT RMLoad failed to report an error if the file doesn't exist
     = JIT 26bit Module entry would hard lock ARM6/7 macrocells
     + Implemented various fixes for ARMv3/v4 errata
     + JIT Enabled SeriousErrorV handler for RO5
     = dontexit_SWI_veneer wasn't preserving V on 26bit RISCOS
     + JIT added speed optimizations for ARMv3
     + JIT now resets appspace to read/write on shutdown
     + JIT debug mode now displays Page Zero accesses
     = JIT debug mode wasn't setting MEMC_Vinit in memc_abort or OS_Word 22
     = JIT OS_Release was corrupting R1 on exit
     - JIT implemented a quicker reg count in the LDM/STM rollback within
       the Page Zero and general Abort handlers
     = JIT Abort handler not restoring Rd to its former value if it was in
       <reglist>.  ie STMFD R0!,{R0-R1} - value at R0 was R0+8, not R0
     - Moved hv_pre_SWI_veneer to general swi code and now used in OS_Byte 113
     = JIT debug reporting is now done at OS_Byte 113, or at 50Hz if the
       game doesn't use OS_Byte 113
     - JIT stripped out some unused errors in report_abort
     = JIT RMRun could fail if no command line parameters were passed
     + JIT Added redirection of OS_Byte 166 to JIT page zero (fixes !65Host
       which is used by Zalaga)
     = JIT running on 80321 was using the wrong L2PT AP mask
     - JIT Now detects if subpages are supported by the CPU and forces
       subpage support off when run under Red Squirrel
     = JIT shutdown_interrupts was resetting L2PT for Page Zero, which was
       triggering RISC OS on the Iyonix to turn on the Compatibility Page
     = blitter wasn't flushing the data cache on ARMv5/6 CPU's (Iyonix, Pi1)
     = Service_ModeExtension wasn't preserving registers around the
       calc_VMOD_RMOD call on IOMD, which could result in a crash for type 1's
     = Service_ModeChange wasn't ignoring the next MODE change after
       Service_ModeExtension passed a VIDC3 mode to RISC OS (fixes
       Bubble Fair and others on IOMD)
     + Bubble Fair now works on IOMD
     + Added RAMFSFree to MemAlloc
     = JIT OS_FSControl now handles Modules (fixes Stunt Racer 2000 Fuzz Module
       on StrongARM)
     = JIT kill_26bit_modules wasn't supressing errors when 26bit Modules
       fail to RMKill
     = pass_SWI_on was causing FileCore crashes on StrongARM
       (fixes Stunt Racer 2000)
     + JIT Sound_InstallVoice,0,0 support added
     = JIT Hypervised OS_FSControl was intercepting 39, instead of 35 to trap
       ImageFS Modules
     + JIT OS_FSControl 12 and 35 implemented
     = JIT 26bit Module support wasn't allocating enough space for 32bit
       stub Modules

2.62 = Screen geometry was being changed unnecessarily when the VIDC20
       resolution changed (fixes flickering in Stunt Racer 2000 intro
       and Cartoon Line pt.1)
     = MRC CP15,0,Rd,C1 / C2,.. weren't returning cache status for their
       respective CPU type - ARM2/3 C2 returns cache status, ARM600+ C1
       returns cache status (fixes in-game music in Wolfenstein 3D)
     = ADFBootFloppy wasn't caching Boot scripts
     = OS_Byte 19 and 113 were being intercepted on GPU based machines
       when the blitter wasn't active
     = data_abort was using record_filename as a temp buffer
     = ADFRecord would fail if a path is specified and ADFFS$RecordingPath
       is set
     = ADFRecord now writes DiscOp's to the recording file immediately
     + Compatibility page is now disabled on recent RISC OS builds while
       the JIT is running
     + The machine state is now stored when the JIT starts and restored
       when shutdown
     - shutdown_interrupts now also removes all vector claims (fixes
       CTRL-SHIFT-F12 in Lotus Turbo Challenge 2)

2.61 = Wasn't disabling IRQ/FIQ when detecting the CPU on ARM2/3
     = Display_DiscOpValues wasn't working
     = IOC IR / IF pins weren't being set correctly
     - IOC IR pin is now brought low 1cs after going high (fixes Tactic V2)
     = Service_PreModeChange no longer unmaps screen memory for supported
       modes (fixes Rockfall, which uses video memory for sound DMA)
     = GOARM3JIT now sets CAO to point at ADFFS to prevent "Module is active"
       errors when terminating tasks (fixes BASIC not re-initialising)
     = JIT wasn't clearing down Module fixups when shutting down
     + Service_PreModeChange now checks for mode pointers using resolutions
       of 640x480x8bp or lower and assumes they're legacy requests (fixes
       flickering in Bubble Impact and Morph)
     + JIT dynamically loads localized 26bit BASIC Module and 32bitted
       BASICTrans when BASIC Module is entered
     = JIT Errors generated during loading of 26bit Modules would always
       return "No room in RMA" instead of the actual error
     - JIT removed unnesessary code from 26bit Module Run entry
     = JIT Error handler wasn't releasing handlers in SVC
     = JIT Exit handler wasn't releasing handlers before passing on
     = On 26bit IOMD, SWI's using pass_SWI_on weren't switching to SVC32
       before calling SWI dispatch
     = JIT wasn't clearing down JITMEMORYA buffers when shutting down
     + JIT OS_File now explicitly clears the JIT codelet cache
     = JIT 26bit Modules with non-aligned Command table starts would
       generate unaligned entry points in the 32bit stub Module (fixes
       Bug Hunter & Moondash)
     + JIT OS_Byte 129 no longer preserves C, as single key checks
       clear or set C if the key is up or down respectively (fixes
       Humanoids and Robotix)
     = _find_MODE wasn't returning EQ for custom MODE numbers (fixes
       Raw Power)
     = entry_GraphicsV was passing calls on when a custom MODE was
       in use (fixes Raw Power)
     = Null dereference in release_ChangeEnvironmentV
     - Moved code that sets GraphicsV 8 default values to remapvideomemory
     = Service_ModeExtension wasn't setting VIDC20 registers for type 3
       (disabled, as it's breaking Lemmings 2, Rockfall and Gribbly's Day Out)
     - GraphicsV driver now installs when the Module loads, to allow
       switching to 1/2/4bpp MODE's to work first time
     = JIT OS_Module 10 wasn't allocating a sensible stub Module Heap
       block (fixes Raw Power)
     - JIT OS_ReadLine now locally stores SPSR around the OS_ReadLine32
       call (fixes Master Break)
     - JIT 50hz ticker is now generated 1cs out of phase with the actual
       Vsync, to ensure we don't skip Vsyncs on a 50hz monitor
     = JIT claim_ChangeEnvironmentV wasn't checking if the handler
       was already pointing at ADFFS, before claiming
     - Service_ModeExtension wasn't forcing Monitor type 0 when
       reissuing the call to find VIDC type 0/1 mode extensions
       (fixes RawPower MODE 99 when emulating RISCOS 3.11)
     = JIT OS_Byte 13 / 14 weren't forwarding to the OS on IOC / IOMD
     = GOARM3JIT wasn't calling shutdown_interrupts when shutting down
       the JIT, potentially leaving rogue handlers and not RMReIniting
       the stock voices
     - JIT LDMxx Rn,{<reglist>,PC} reencoding now 2 instructions shorter
       if <reglist> contains the working register and Rn<>working register
     = Claim_ChannelHandler now checks if Sound_Configure has returned
       an invalid Channel Handler (occurs when SoundDMA is reinitialised)
     + Now reclaims the Channel Handler when SoundDMA is reinitialised
     = report_abort wasn't performing serious error recovery
     + JIT now resets function key interpretation
     = JIT CTRL-SHIFT-F12 was leaving the blitter paused

2.60 = TrackerModule wasn't releasing claimed RMA on finalize
     = JIT CMF was being incorrectly encoded (fixes Mig-29M Super Fulcrum)
     = JIT Vector_Claim_Handlers wasn't clearing OS_CallAfter's after
       they had been entered (fixes PowerBand)
     = ADFMount wasn't checking for CR as a filename terminator
     = diskswap was checking the wrong register when looking for the
       start of the filename
     = OS_Byte 19 wasn't waiting for VSync on IOC
     = OS_Byte 113 may not have added forced VSyncs on IOC
     = JIT Vector claims weren't being reused, the type check was
       corrupting the original address
     = JIT CallBacks weren't being cleared down after they're called
     = JIT OS_RemoveTickerEvent could remove non tickers
     = ADFS_DiscOp was returning the wrong error numbers for Sector CRC
       and Sector Missing, when emulating a 1772 (fixes BlowPipe)
     = OS_DynamicArea on RO3.11 wasn't allowing more than one DA
       (fixes DTT shim module on RO3.11)
     = ADFEject no longer issues *DISMOUNT to cure Ambiguous disc name
       (introduced in 2.53g to fix Flashback on RO5, but causes issues
       with The Fourth Dimension installers)
     + ADFMount now checks for an Ambiguous disc name once it knows the
       canonicalised floppy name, "adfs:dismount <discname>" is issued
       if the disc triggers an Ambigous disc error
     = Abort handler may have handled aborts above &FFFFFFF instead
       of passing them onto RISCOS
     = JIT OS_Module 18 wasn't working
     = ADFRemapVideoMemory wasn't turning off the pointer when shutting
       down (fixes running games after HeroQuest)
     = GraphicsV 11 wasn't calculating the highest palette entry correctly
     = OS_Byte 176 wasn't working correctly
     + JIT OS_PlatformFeatures now returns an error
     + JIT Page Zero RISCOSLibWord and CLibWord added
     = JIT 26bit Modules with SWI's would work if the SWI table pointer
       wasn't valid
     - JIT Moved the environment handler tracking to VMM workspace
     = JIT Environment handlers that use a register block weren't
       handing the PSR
     = JIT OS_ChangeEnvironment may not have handled handlers 6..15 correctly
     = JIT CallBack handler wasn't copying the PSR into PC before passing
       to user code (fixes Alone in the Dark, Empire Soccer '94 and Populous)
     - JIT LDM/STMxx Rn{!},{<reglist>}^ without PC no longer remove the ^
       (fixes localized CLibAPCS-R, Zarch and Chopper Force Boot scripts
        correct the unpredictable instructions)
     - JIT STM Rn{!},{<reglist>}^ with PC in reglist no longer removes ^
       (Fire & Ice Boot script updated to correct code)
     = JIT 26bit Module handler wasn't checking bits 0..5 of the SWI chunk
       were 0 (fixes Guile)
     + OS_Claim now reclaims EventV to ensure we're at the top of the call
       queue (fixes The Crystal Maze disk swapping, which broke in 2.18m)
     = JIT CTRL-SHIFT-F12 would hang on 26bit RISCOS
     + JIT Sound_QSchedule now ensures the X bit is set (fixes
       CTRL-SHIFT-F12 in Repton 3)
     = Swapping discs at an ADFS prompt to insert another disc could
       generate a "FileCore in use" error
     - Miscop PollChanged now returns "maybe changed" when the floppy
       hasn't changed to fix RO5 FileCore not detecting disc swaps
     - ADFBootFloppy now checks if a floppy has the boot options set
       before attempting to boot it
     = Didn't track MODEs 25-40
     + Screen memory is no longer remapped to the RO3.1 area when emulating
       RO3.5+ (fixes flickering in Frak! and Bubble Impact)
     = JIT 26bit Modules could replace essential Modules
     = JIT 26bit Modules now support an B instruction in the Start entry
       (fixes 65Arthur in Enthar Seven)
     = JIT 26bit Modules may not have returned an error if they failed to
       load
     + JIT RMRun implemented for 26bit Modules (fixes Enthar Seven)
     + JIT OS_ReadLine now translated to OS_ReadLine32 on 32bit OS
     = OS_Release wasn't returning an error for an invalid release
       (fixes Enthar Seven)
     = JIT CallBack handler wasn't updating physical USER R13
       (fixes Interdictor)
     = OS_ChangeDynamicArea 2 was corrupting R0
     + JIT dynamically loads localized APCS-A / APCS-R Modules when
       CLib SWI's are issued
     - Sound buffer is now non-cacheable under RO5
     = MEMC_Vinit / MEMC_Vstart now ensure they're quad-word aligned
       (fixes scrolling in Caverns, bug intruduced in 2.57s)

2.58 = JIT Error handler was copying the wrong buffer
     = JIT IRQ handler wasn't checking if the current task was supported
       before copying Codelet temp variables
     = Abort handler didn't support Codelet reuse
     = JIT Codelet reuse wasn't clearing the instruction condition
     + JIT Modules trying to add a File System or ImageFS are now reported
     = JIT CallBack and BreakPoint Environment handlers were copying the
       register buffer to the wrong location
     - IRQ_handler looks for the codelet validator when codelet reuse enabled
     - JIT debug mode now displays the originating instruction address if an
       IRQ or Abort occurs in a codelet
     = JIT FSControl 2 now takes over *GO
     = Service_PreModeChange was shutting down the GraphicsV driver if a
       non-standard MODE was requested
     - GraphicsV driver now always intercepts GraphicsV 8 (features)
       (fixes Rise in Crime and Stranded!)
     = JITMEMORYA wasn't allowing Module names with spaces in them
     = STR PC,[Rn,... was corrupting R0 (fixes Command Ship)
     = JIT Sound_InstallVoice failed if the voice name offset was negative
       (fixes BloodLust)
     - report_abort now collapses the SVC stack and exits to the Supervisor
     - JIT *GO now set R12/R13 to the end of AppSpace
     - JIT OS_Exit no longer hypervised
     - JIT MOV PC,PC now changed to B <PC> instead of being copied
     = JIT OS_FSControl wasn't clearing flags before running an app or *GO
       (fixes Pipe Mania)
     = VIDC translation was writing VIDC softcopy registers to Page Zero
       on IOMD 32bit (fixes Deeva)
     + JIT FPU instruction and now checked for encoding errors and corrected
       (fixes Blood Sport and Confusion)
     + OS_Byte 13 now prevents RO5 from locking an event on, if the event
       was already disabled (fixes Deeva and Hostages)
     + report_abort now preserves the aborting registers around the calls
       to kill 26bit Modules, Voices and interrupts
     = JIT Error Environment Handler code was triggering Aborts
       (fixes Blood Sport)
     + Added ADFFS_KeyDebounce SWI
     + JIT CLib optional language descriptor entries are how managed
     = Some CLib functions that aren't supported weren't clearing down the
       stack before generating a CLib error
     - SpriteFree changed to pass the call to SpriteSize if System Sprites
       is currently zero (fixes Kaptain Konflict on RO5)
     - JIT Unknown vector releases are now ignored
     - GOARM3JIT no longer remaps DA2
     - JIT LDR/STR Rd,[Rn,...]! where Rd=Rn now has writeback cleared (fixes
       Fish! on ARMv7)
     - *ScreenSize only changes to MODE 0 if reducing DA2's size
     + GOARM3JIT now removes 26bit Modules, Vectors, Voices and resets
       the audio system when shutdown
     - CTRL-SHIFT-F12 now follows the RISCOS serious error recovery method
     = Wasn't regulating the frame rate in games that only swapped frame
       buffers (bug introduced in 2.49i)
     - Now changes to MODE 28 when the JIT / ADFRemapVideoMemory is shutdown
       if the game was full screen
     + Added FPS, write protect and compatibilty info to the Filer current
       format dialogue
     = Boot floppy wasn't checking the JFD file version before setting
       boot options
     = ADFEject was resetting Forced VSync, CMOS/Module protection etc
       when swapping disks in set
     = JIT CLib signal wasn't providing managed entries for all 10 signals
     - OS_Byte 19 / 113 and OS_ChangeDynamicArea no longer check for
       re-entrancy
     = JIT vector claims now track the number of times a vector has been
       claimed
     - JIT LDM/STMxx Rn{!},{<reglist>}^ without PC now remove the ^
       (fixes Zarch and Chopper Force on ARMv7)
     + Added CLIV, ByteV and WordV to the tracked vectors (used by the
       protection in Chopper Force and various other Fourth Dimension titles)
     = JIT private stacks are now reset at startup
     + JIT APCS-A implemented via a localized copy of CLib 1.01
     + JIT SWP Rd,Rm,[Rn] implemented on ARMv7 (fixes localized CLibAPCS-R)
     + JIT STR Rd,[Rn],<op2> where Rd=Rn implemented on ARMv7 (fixes SWIV)
     + JIT STR Rd,[Rn,<op2>]! where Rd=Rn implemented on ARMv7
     + JIT STM Rn!,{reglist} with Rn the first register in reglist
       implemented on ARMv7 (fixes PowerBand on ARMv7)
     = JIT OS_FSControl now copies the commandline and appends .!Run if
       its a directory (fixes Empire Soccer 94)
     + JIT clears down JITMEMORYA's when the JIT is shutdown
     = JIT Error environment handler was corrupting R14
     + JIT LDR Rd,[Rn,<op2>]! where Rd=Rn changed to LDR Rd,[Rn,<op2>]
       (fixes Empire Soccer 94)
     + JIT LDR Rd,[Rn],<op2> where Rd=Rn changed to LDR Rd,[Rn,#0]
     = JIT Error environment handler now releases all handlers prior to
       OS_GenerateError, if the client doesn't have it's own handler
     = ADFBootFloppy wasn't resetting time when booting via a script
     + OS_Byte 253 now returns power-on reset (fixes Starch)
     + JIT reports Environment handlers on an Abort
     - JIT STM Rn{!},{<reglist>}^ with PC in reglist now remove the ^
       (fixes Fire & Ice on ARMv7)
     = Abort handler wasn't passing Access/Alignment errors between
       4000-8000 to the JIT Abort handler
     + JIT an app attempting to read from &3800000 will be terminated
       (fixes any app that tries to reboot, instead of exit via OS_Exit)
     = JIT OS_ReadModeVariable was returning incorrect values for
       LineLength and ScreenSize
     = IRQ handler now correctly checks for IRQ's occurring within CODELETS
     = The Abort handler would stop handling Aborts, if an Abort occurred
       within the Abort handler itself
     = JIT codelet reuse was decreasing the use counter every time a
       codelet source address was overwritten (fixes Revelation)
     + JIT Writes to a 26bit Module command line are now supported
       (fixes Stunt Racer 2000 DeComp Module)
     + JIT Error Environment handler now copies the error string one
       byte at a time, which should fix error handlers that don't
       allocate enough space (fixes MiG-29M Super Fulcrum)
     - JIT STR Rx,[PC,#-4] followed by B PC-8 now NOP both instructions
       (fixes Carnage Inc)
     + TrackerModule updated to include the * commands used by
       Bobby Blockhead and the Dark Planet

2.57 + JIT OS_CallBack Hypervised (fixes Chequered Flag)
     - When running on RO6.x, drop ADFFS$OSVersion and the internal OS
       version to 4.x
     + Now supports file extensions after the disc number, ie F1000001/jfd
       will now swap discs correctly, without removing the /jfd
     = JIT core wasn't preserving R14 around CACHEOP_INVALIDATE_TLB_ENTRY
       on 26bit build, causing BL to encode incorrectly if it was the first
       instruction in a new page
     = JIT OS_CallBack, OS_SetEnv, OS_Control, OS_ChangeEnvironment,
       OS_BreakCtrl were returning addresses above the 16MB limit.  Now
       centralized using OS_ChangeEnvironment, tracked and Hypervised
     - JIT removed most of the SWI checks when flag preservation is active
     + Now fixes TV modes on IODM when not remapping screen memory (disabled)
     + Now prevents required Environment handlers from being taken over
       whilst the JIT is running
     = ADFFS$Path macro was incorrectly using Obey$Dir instead of ADFFS$Dir
     = JIT LDR/STR Abort handler wasn't checking for LDRT/STRT (fixes
       FPEmulator writes and Chequered Flag)
     = JIT initial permitted RAM limit was wrong
     = Sound_Configure was returning a corrupt address for the previous
       ChannelHandler (fixes Overload (Paradise))
     + JIT OS_ReadMonotonicTime hypervised and enables IRQ around the call
       (fixes Overload (Paradise) and Burn Out)
     = JIT OS_Module 18 would crash if an error was returned
     - JIT MOV{S} PC,PC is now executed up to
     = CTRL-SHIFT-F10 (stop recording) wasn't working and could crash (bug
       introduced in 2.53)
     = Was using the wrong VIDC_list table on GPU's, causing games that
       palette swap, to swap at the wrong raster (bug introduced in 2.55f)
     = JIT OS_File wasn't preserving SPSR around non-Hypervised calls
       (fixes Simon the Sorcerer)
     + JIT CLib signal now managed (fixes Elite)
     = Recording buffer wasn't large enough for 1600K type F floppies when
       recording each sector individually
     = MiscOp poll changed wasn't returning "no change" after the first
       poll, following a disc change
     = MemCopy was corrupting data if the source was 2 bytes out of
       alignment (bug introduced in 2.49b)
     + JIT Event 11 (key transition) is now tracked, as ADFFS uses it
       to detect keys.  The event is only passed through if the client
       enabled it (fixes X-Fire)
     = JIT Conditional LDR's were being checked for page zero access in
       the low vector build regardless of the condition being true, if
       its the first instruction the JIT sees.  This was breaking LDR
       after a BL for example, or LDR's at a B address.  Reinstated the
       LDR condition check code from 2.48 as a failsafe (fixes
       Simon the Sorcerer)
     = OS_FSControl wasn't setting CAO when starting tasks
     - OS_FSControl Absolute launch sequence rewritten to match RO3.60
       and now initiates tracking of Environment handlers
     + JIT reports Wimp_StartTask
     = OS_FSControl 4 wasn't word aligning Utilities in the JIT RMA
     - JIT STR Rd,[PC,#-4] is now NOP'd (fixes K.V. and Elite)
     = JIT Wimp_Poll / Wimp_PollIdle no longer hypervised (fixes Elite)
     - Service_PreModeChange now reads the existing pointer palette and
       forces the pointer off via GraphicsV before taking over GraphicsV
     - Moved all GPU code from ADFRemapVideoMemory to appropriate locations
       in Service_PreModeChange and Service_ModeChange (fixes Elite)
     + Added ADFFS$50Hz Environment variable, to force the blitter to blit
       at VSync
     = IOC reads weren't returning FFFFFFFF for LDR/LDRB in IO regions
       (fixes RTFM Joystick detection in Burn Out)
     = OS_ChangeDymanicArea 2 was breaking the blitter

2.56 - Channel handler now restores the IRQ state around calls to level 1
       handlers (fixes Dune II intro)
     - EventV handler now claims the event and changing the stereo position
       is no longer handled via a CallBack
     + JIT CLib kernel_swi / kernel_swi_c now reports if *in is a NULL
       dereference (bug in Birds of War)
     + JIT OS_HeapSort hypervised (fixes Birds of War)
     - DTT2QTM shim updated to support PlayNote (fixes Birds of War SFX)
     = JIT OS_ChangeEnvironment 0 / 14, OS_SetEnv and OS_GetEnv now set and
       return the correct value for RAM limit (fixes Wonderland)
     = JIT SWI passes thru SWI's for other OS's (fixes Rick Dangerous
       TrkDriver Module)
     = JIT no longer checks 26bit SWI blocks for validity (fixes
       Rick Dangerous TrkDriver Module)
     = JIT OS_Module Free now checks if the passed block is valid (fixes
       Rick Dangerous TrkDriver Module)
     = JIT OS_RemoveTickerEvent no longer reports tickers that don't exist
     + Now identifies DOS (.IMG) and Atari (.ST) disc images
     + MiscOp_PollChanged now sets "disc is HD" for 1440KB DOS images
     + ADFFS Filer now recognizes DOS/Atari formats
     + ADFFS Filer accepts DOSDisc (FC8) files being dragged to it

2.55 = premodechange wasn't resetting VIDC20 registers (bug introduced in
       2.52k) (fixes James Pond and any use of Mode Extensions on IOMD)
     - blitter VSync moved to occur after the screen geometry has been
       calculated (fixes James Pond 2)
     = Page Zero Abort handler for High Vectors was corrupting Rd with
       writeback (bug introduced in 2.54q)
     - SetVars now sets ADFFS$HighVectors and ADFFS$ARMv7
     - Modified !Run / !Loader to check for High Vectors on RO5 and load
       ADFFS550 if unaligned loads aren't supported
     = IOC_trigger_vsync now checks if T0/T1 have triggered on flyback
     = Channel Handler was being claimed before the Sound Buffer had been
       initialized
     = JIT was using the wrong CPUOp to flush the TLB pre StrongARM
     = JIT IOC IRQ stack wasn't being claimed on ADFFS400 build
     = JIT skips cache flush ops pre StrongARM
     = No longer attempts to swap to a disc if the file doesn't exist
       when CTRL-SHIFT-F1..F9 pressed
     = map/unmap_screen_memory were issuing OS_MMUControl to flush the TLB
       below RO3.7
     = JIT codelet recycling wasn't working for BL when self-modified
     = JIT TEQP PC,.. wasn't using Rx instead of PC when reencoded
     - ADFPause now exits early if a key is pressed
     = calc_VMOD_RMOD wasn't attempting (v/r*CLK)/CK
     = Wasn't removing the IOC IRQ stack on IOMD
     = *FORMAT was being passed ADFS's private pointer instead of ADFFS's
     = JIT wasn't executing up to the instruction when OS_Exit encountered
     = JIT OS_Exit was shutting down the JIT
     = Wimp_SlotSize wasn't setting pre_JIT_wimp_slot_size
     = Wimp_GetEnv wasn't returning pre_JIT_wimp_slot_size (fixes Dune II)
     + JIT Sound_Mode and Sound_LinearHandler now hypervised (fixes
       Dune II v1.32)
     = Wimp_SlotSize current and free pool are now capped to the JIT appspace
       limit (fixes Wolfenstein 3D)

2.54 - LDM / STM now check for R13 in reglist on ARMv7
     - LDM / STR abort handler now report aborts with PC in reglist
     = JIT SharedCLib SWI handler wasn't ARMv7 safe
     = JIT Abort handler wasn't handling unaligned STM outside of
       appspace correctly (fixes Bubble Fair, Orion and many more)
     = JIT Abort handler wasn't corrupting Rd in STM in the debug builds
       (fixes Bubble Fair)
     = Two Page Zero access bugs fixed in TrackerModule (now 5.04)
       (fixes Paradroid 2000 audio on RO3.5+)
     - Now silently fails Page Zero access from 32bit Modules and RISC OS
     = Hypervised OS_File wasn't returning errors correctly (bug introduced
       in 2.53g)
     = Abort/JIT Abort handlers weren't disabling FIQ whilst restoring
       registers prior to exit
     = JIT CMP/CMN/TEQ/TST PC,#<immed> was corrupting R0
     = JIT STM Abort Handler wasn't flushing the instruction cache correctly
       for STMDA/DB (fixes Battle Chess)
     = Sound_Configure was returning the VIDC1 period in R1 instead of R2
       on exit when emulating below RO3.5
     = On initializaton, the VIDC1 sample period wasn't preset to 48
     = Sound fill code wasn't moving to the next sample when performing
       an N:1 fill (fixes Talisman)
     = Unaligned LDM with writeback were corrupting Rd in debug mode
     = LDR/STR Abort handler was't checking if LDR/STR were in Late Abort Mode
     = Hypervised OS_GBPB would corrupt the stack if the OS generated an error
     - Hypervised OS_GBPB now allows re-entry via GPBPV
     - Debug mode now displays the state of IRQ/FIQ
     = JIT SharedCLib codelet was copying one too many words (bug intruduced
       in 2.54b) (fixes Battle Chess)
     + Now relies on High Vectors to trap Page Zero reads (2.54h)
     = Unaligned Abort handler wasn't handling unaligned outside of JIT space
       (fixes Speedball 2)
     + Added support for {LD/ST}REX{H/D} (reported), LDREX{B} (reported) and
       STREX{B} (proxied) to the JIT Abort handler (adds support for
       SharedCLib 2.29+) (2.54i)
     = Abort handler now handles re-entrant Unaligned access that triggers
       another Abort due to lazy page mapping
     + Page Zero Abort handler checks for Aborting address=0 with High Vectors
       which is a Branch Through Zero error caused by a PreFetch Abort
     = Page Zero Abort handler wasn't word aligning proxied writes
     = JIT modules._load_module wasn't ensuring the OS_Heap allocation was
       word aligned
     + OS_ServiceCall now Hypervised and calls 11, 12, 71 and claimed
       (fixes Boogie Buggy)
     - OS_Byte 19 now waits for 2cs if we're generating VSync, to prevent
       Hourglass_On from hanging the system and swap_disc no longer disables
       the fake VSync whilst swapping discs
     = IOC Abort handler was using words instead of bytes when reading
       register values
     = Abort handler was passing R14+4 instead of R14 when an unaligned
       Abort occurred outside of JIT space (fixes Wolfenstein 3D)
     - Blitter now enables IRQ/FIQ
     = IOC SSBC wasn't active in the IRQB mask (fixes Zelanites)
     - JIT OS_CLI no longer preserves flags (fixes BlowPipe, Hero Quest,
       Jahangir Khan Squash, Wolfenstein 3D keyboard response)
     + Page Zero abort handler rewritten to handle writeback and LDM with
       High Vectors (fixes Lemmings 2)
     + CLib qsearch and qsort are now hypervised (fixes AITD)
     = JIT STM Abort handler was flushing the cache, prior to checking if
       the CPU pipeline was about to be overwritten (fixes Drifter)
       (bug introduced in 2.54e)
     = JIT LDR/STR Rd,[PC],#<immed> and LDR/STR Rd,[PC, #<immed>]! weren't
       being checked
     = JIT LDR/STR wasn't switching Rd=Rn with writeback/post-indexing to
       pre-indexing
     = openmount wasn't loading the private word into R12
     = MiscOp 1 wasn't returning the correct result flag, causing disc
       change detection to fail (fixes Wolfenstein installer)
     = Writes now increase the disc sequence no.
     = 26bit module loader could load modules at unaligned addresses when
       inserting to RMA and wouldn't free the heap block if the initial
       allocation was unaligned
     = VIDC20 emulation wasn't checking if RO3.11 was being emulated and
       passing the write to the VIDC1->VIDC20 translator (fixes James Pond
       2+ when emulating RO3.11)
     = Wasn't storing VIDC1_CR on GPU builds for MODE extensions

2.53 = GraphicsV 10/11 weren't passing palette changes through to RISCOS
     - GraphicsV 12 is no longer claimed and passed to RISCOS instead
     - Blitter switched to tripple buffering
     - GPU IO memory is now cacheable and bufferable
     - DA2 is now cacheable and bufferable
     + Unaligned LDR, LDM, STM, SWP now supported
     = SoundTrackers made ARMv7 compatible:
         DTT
         QTM
         TrackerMod
         TrkPly2QTM
         VoxLib
     = blit_update_VIDC was changing the GPU/IO memory when the screen width
       and height weren't changing
     = JIT Abort handler for SWP wasn't updating Rd correctly
     - CacheOp's now use OS_MMUControl 2 functions for cache cleaning on RO5.23
     - Cache line size is now acquired via OS_PlatformFeatures 33 on RO5.23
     = GOARM3JIT was crashing on RO3.71 (bug introduced in 2.52p)
     = Wasn't RMReIniting ADFS on RO3.11 (bug introduced in 2.52p)
     - ADFEject now issues *DISMOUNT to cure Ambiguous disc name issue
       (fixes Flashback)
     - Most * commands are now using relative variable addressing
     + OS_DynamicArea 2,2 now returns RO3.1 addresses if screen memory remapped
     = JITMEMORYA wasn't skipping spaces before the optional Module name
     = Managed Channel Handler wasn't setting the linear-to-log and log-scale
       tables
     + Page Zero values added to Page Zero Abort handler:
         CursorFudgeFactor
         VertAdjust
         HSWRSoftCopy
     = SWI handler wasn't detecting sound SWI's correctly (bug introduced in
       2.53g)
     = ADFFS SWI handler was corrupting R12
     = Service handler would corrupt R7 on a MODE change on IOMD (bug
       introduced in 2.53h)
     = Entry_ADFBootFloppy wasn't setting R12 correctly if called via CallBack
     = map_screen_memory / unmap_screen_memory switched back to use
       OS_MMUControl to flush the TLB's as ARMop14/15 don't seem to always
       work
     = JIT Abort Handler wasn't cleaning the cache for STM correctly
     = Abort handler wasn't correcting R14 when passing unaligned memory
       accesses in screen memory to the JIT Abort handler
     # _fifty_hz_ticker now triggers a VSync with IRQ off (fixes SWIV)
     = data_abort now checks FSR for an alignment error before forwarding
       Aborts to JIT_abort_handler
     = OS_ReadVduVariables wasn't returning the correct address if called via
       a hypervised SWI (fixes Ballarena)
     = Abort handler wasn't checking bit 10 of FSR was 0 before handling the
       Aborted instruction (fixes Axis)
     = blit_update_VIDC was corrupting the stack if the screen width and height
       hadn't changed (bug intruduced in 2.53h)

2.52 + GraphicsV 5 now claimed and cursor changes copied to 1F03800
     + Blitter now blits the mouse cursor if its enabled via GraphicsV 5
     = GraphicsV now exits immediately if in "WIMP" mode or MODE unknown
     = MEMC Sound DMA is now copied as a 1:1 copy to the sound buffer
       (fixes Diggers - may break No Excuses, Rockfall and Rotor)
     - hv_ADFFS_BASICSys and the JIT SWI interpreter now forward Wimp_*
       SWI's on untouched (fixes KerBang)
     - Moved IOC IRQ stack to a DA
     = JIT OS_Memory 9 now returns &3500000 for VIDC20 instead of the actual
       address (fixes Lemmings 2 on RO5 emulating a RO3.71 machine)
     = JIT OS_CallSWI/R12 weren't passing the SWI# on after SWI flag
       preservation was added
     = OS_Byte 19 was corrupting the CPSR (bug introduced in 2.51l)
     = JIT vector Hypervisor code wasn't allowing vectors to be claimed
       (bug introduced in 2.51h)
     + Corrects OS_SpriteOp 52 R7=-1 to R7=0
     = GOARM3JIT <addr>;... now allows multiple parameters to be passed
     = _find_MODE was ignoring shadowed MODE's
     + Service_ModeExtension now translates VIDC Type 0/1 Lists to Type 3
     = OS_UpdateMEMC wasn't being handled if raised by JIT created code
       (bug introduced in 2.51)
     + Removed LCDGameModes for VIDC20 as it wasn't correcting the video
       parameters at the correct time.  ADFFS now uses the default RO3.1
       VIDC1 parameters after a MODE change
     + JIT OS_ClaimProcessorVector now ignores vector 1 claims and reports
       all others for RO3.5+, below RO3.5 it returns the appropriate error
     = JIT CPUID now returns an ARM710 if emulating RO3.5 or above
     = swap_disc was restarting the VSync counter, instead of just
       registering the RTSupport triggered VSync
     = JIT various IOC references where using the wrong address on a GPU
     = JIT OS_ReadModeVariable was returning the wrong values
     = OS_Module was corrupting the stack when checking for essential
       Modules (bug introduced in 2.51c)
     = Replaced all MSR x_all, #<immediate> with appropriate code on ARM610/710
     = JIT OS_File was corrupting the stack (bug introduced in 2.51b)
     = GOARM3JIT was flagging the JIT as active before it was fully setup
     = GOARM3JIT was resetting memory before the CODELET pointers were setup
     - hv_reset_memory_block now actions its cache flush before exit
     = JIT OS_ReadModeVariable wasn't preserving C
     + Abort handler now passes Page Zero read/writes it can't handle to
       the OS for ZeroPain to report
     + Added power saving to OS_Byte 19 on non-IOMD
     + CTRL-SHIFT-Left/Down/Right arrows force audio left/stereo or right
     + Blitter now clips the mouse pointer at all screen edged
     = ADFRemapVideoMemory wasn't unmapping video memory on shutdown
     = map and unmap RO3.11 screen memory now flush the TLB correctly
     = JIT OS_Claim/ReleaseDeviceVector weren't allowing T0 to be claimed
     + Blitter now corrects the aspect ratio for non-square pixel modes
         eg. MODE 48 - 320 x 480 is stretched to 640 x 480
             MODE 15 - 640 x 256 is stretched to 640 x 512
     = Hardware mouse pointer is now turned off before the GraphicsV
       driver takes over
     = *POINTER 1 is issued after the GraphicsV driver takes over to reset
       the pointer palette
     - Blitter VIDC20 MODE parameters are now setup during Service_ModeChanging
     + Blitter now enables IRQ/FIQ whilst blitting
     = CLib atexit wasn't returning within 26bit address space
     = Create_Flopy_DynamicArea was hardcoded to 2048KB max, it now uses
       value from ADFFS$FileSizeLimit
     = Sound Scheduler was causing an Abort during initialization
     - Moved 26bit Module stack to a DA and unified all DA code into one place
     - Changed all LDR Rx,[Rx] to LDR Rx,[Rx,#0] for Cortex compatibility
     + JIT added compile flag to use RO5.23 ARMop's instead of direct CPU Op's
     = screen_memory_remapped wasn't being set after a MODE change correctly
     = L2PT_set_cache / L2PT_clear_cache would get stuck in an infinate loop
       of one of the L2PT entries doesn't exist

2.51 + JIT EnvTime now handled by Page Zero handler
     + OS_SynchroniseCodeAreas now flushes JIT space as well
     - JIT Wimp_SlotSize now tracks and returns the size the app is expecting
     + JIT OS_CallASWI / OS_CallASWIR12 are now hypervised
     = JIT hv_OS_CallASWI was using R9 instead of R10 for the SWI#
     + JIT writes to EnvString in page zero are now proxied
     + writes to EnvString up HIGH are now proxied on RO5
     + JIT Added 26bit Module support
     = JIT OS_FSControl wasn't managing the return of Utilities
     = ExSound wasn't playing music
     = JIT OS_File was failing if R0 bit 31 was set (flush cache)
     + JIT CLib atexit support added (used by Inferno)
     = JIT CLib _kernel_swi and _kernel_swi_c were corrupting R12
     = JIT LFD / STF were restoring R0 from the wrong location
     + JIT added basic WIMP support
     - Now tracks the current task ID, recoded most SWI handlers to check it
     - Screen memory remapping is now turned off when switching to MODEs it
       doesn't support
     - ADFRemapScreenMemory can now start in WIMP mode where it wont change
       MODE or alter DA2's size
     = OS_FSControl was corrupting the environnment string if the file being
       run was compressed
     = JIT CLib _kernel_osfile wasn't returning to the correct address
     + Added an DA for the IRQ Stack when the JIT isn't running, it's used
       when generating sound device 9 IRQ's
     + Request VecPtrTab from the OS on RO5.23+
     = Abort handler was checking against jit_appspace_end instead of
       jit_slotsize when deciding to keep the Abort or pass to the OS
       (fixes lazy task swapping under RO5)
     + JIT Copro CP15 instructions are now handled
     = JIT call_device_claimant was passing the actual IOMD base address
       instead of the RO3.11 IOC base address
     - Prefetch Abort handler now checks for prefetches in appspace and
       passes them to the OS (allows lazy page swapping)
     + ADFPause - pause N centiseconds
     + ADFVoices - sets the number of sound voice channels
     = All checks for emulating a specific RISCOS version now also check
       the current task matches is one ADFFS is covering
     + OS_SpriteOp 3 turns the cursor off when emulating pre RO3.50
     + JIT SWI flag preservation
     + JIT added IOC T0 (Zelanites alters it, used by Labyrinth)
     + Moved OS_CallASWI / OS_CallASWIR12 code out of the SWI handler
     + JIT added workaround for 80321 errata 7
     = Changed most uses of CPSR_c and CPSR_cf to CPSR_all to fix physical
       SA support
     = JIT OS_Release / OS_RemoveTickerEvent weren't clearing down the stack
       if a matching claim wasn't found
     = JIT OS_File now preserves SPSR to allow re-entrance via FileV (fixes
       The Dungeon)
     - JIT moved JITMEMORYA replacement table to an RMA claim
     + JITMEMORYA now allows Modules to be patched at runtime
     = GOARM3JIT wasn't releasing the temp heap allocation for BASIC correctly
     = dontexit_SWI_veneer was stacking R14 on the wrong stack on 26bit OS
     - Sound_InstallVoice / Sound_RemoveVoice moved from the Hypervisor SWI
       handler to the SWI Vector handler to capture uses in BASIC
       (fixes The Dungeon)
     + Added additional validation to FSControl_Run for non Absolute's
     + Added a domain ID check to the Data Abort handler for Wimp support
     = Vstart is now initialized on a MODE change
     = L format floppies now read correctly, bug introduced in 2.38b
     - JIT Modules are entered with flags cleared
     - IRQ Handler stack moved to DA
     - GOARM3JIT now clears down the stack prior to calling USER code and
       exits via OS_Exit
     - post_SWI_veneer now only sets V to preserve flags on 32bit
     = JIT OS_Byte 19 now forcibly clears C (bug in RO below 5.x)
       (fixes Cascade)
     + OS_SpriteOp 36 corrects R6=-1 to R6=0 if emulating up to RO3.8 behaviour
       (fixes The Last Ninja)
     + JIT Abort handler now preserves the next instruction if its been
       overwritten (fixes Drifter)
     + JIT BASIC SYS command now hypervised
     - JIT Vector claims no longer require a codelet and have been moved to
       an internal jump table
     = Service_ModeExtension was passing the wrong address for VIDC20 when
       translating type 0/1 Mode Extensions
     + JIT OS_Module 18 returns the 26bit Module address (fixes Hero Quest)
     = QTM updated to work if IRQ's are disabled (fixes Hero Quest)
     = swi_OS_FSControl wasn't restoring SVC C/SPSR on return from a Utility
       causing any Utility that runs a file to potentially fail
     + JIT OS_BreakCtrl, OS_Control and OS_ReadSysInfo now hypervised
     = VIDC20 palette register writes weren't updating the GPU palette correctly
     + JIT OS_ReadModeVariable 6/7 hypervised
     = Service_PreModeChange no longer changes the MODE # if a matching RO3.11
       MODE is found (fixes Alone in the Dark)
     = irq_handler was passing the actual IOC address, instead of the original
       Arc IOC address when running on RO5 SA (fixes James Pond II)
     = Slow sectors weren't checking IRQ's are enabled when waiting on
       OS_ReadMonotonicTime (fixes James Pond II+ on RO5)
     - Changed OS_Byte 19 to preserve IRQ status around its VSync delay
     = blitter now centres the image correctly on a GPU
     - OS_Word 21 0 - OS_Byte 19 now called after OS_Word 21 (fixes cursor
       in Manchester United / Europe)
     + VIDC1/20 cursor palette changes are now translated into GraphicsV 10
       on a GPU

2.50 = JIT OS_Exit now hypervised and cleans ADFFS environment
     = JIT Sound_RemoveVoice now hypervised
     = OS_FSControl wasn't setting R2=&8000 when issuing
       Service_UKCompression 0
     - BASIC now RMReInit'd after JIT closes down (previously disabled in 2.49)
     = JIT page_zero_abort._proxy_write was corrupting the destination register
       when handling STM instructions

2.49 - JIT LDMIA R13!,{PC} now replaced with LDR PC,[R13],#4
     - Reporting an Abort no longer clears the Vector and DeviceVector tables
     - JIT Vector and DeviceVector tables are initialised on startup
     = JIT hv_AddCallBack, hv_OS_RemoveTickerEvent, hv_OS_Claim, hv_OS_Release
       now report if they hit the Vector claim limit
     = JIT writes by RISCOS 3.5-3.71 to page zero are now proxied
     = JIT now reports branches to illegal addresses outside of App space
     = Exit handler now does nothing
     - JIT Sound_Configure codelet removed and code integrated into Channel
       Handler
     + Channel Handler now manages the Scheduler entry
     = JITMEMORYA replacement LDR's would get lost if an IRQ occurred that
       also has a replacement LDR, whilst its executing up to the initial LDR
       (fixes Ballarena)
     - JIT UND handler now stacks R13 on 26bit RISCOS so it can exit with LDM^
     = GOARM3JIT was corrupting vars when resetting jit_claimed_vectors
     = Sound_Configure was corrupting the returned sample period
     = OS_Byte 113 now forces a frame blit at the rate set by ADFForceVSync
       or 12.5 FPS if none set on non-IOMD (fixes Gribbly's Day Out)
     - Reduced managed Voice Generator code size, added specific code for
       the Instatiate and Free entry points and changed registers to match
       RO3.71 as per RO source code
     = OS_UpdateMEMC passed through if issued by a native Module or RISCOS
       (fixes sound cut-out on MODE change introduced in 2.48)
     = JIT hv_OS_Claim and hv_OS_AddCallBack now check for duplicate OS_Claim,
       OS_CallEvery, OS_CallAfter and OS_AddCallBack claims and re-uses the
       existing managed vector entry if one exists (fixes Fish!)
     = JIT pass_to_previous_Und wasn't restoring R13 on 26bit StrongARM
       when passing CoPro instructions on (bug in 2.48)
     - JIT now checks for CoPro instructions on entry avoiding a cache flush
     - JIT ldr_check will now exit without flushing the cache if the LDR
       its checking fails its condition and the next instruction is not a
       JIT entry instruction
     = JIT debug info now displays the correct screen resolution
     - JIT debug info now overlayed instead of overwritten to the screen
     - Reduced blitter code substantially
     = Blitter would loop if Vstart>Vend and Vend hit
       (fixes Gribbly's Day Out)
     = Blitter now adjusts Vstart to correct for left border
       (fixes Gribbly's Day Out and hwscroll_13)
     = Blitter now starts at Vstart if Vinit>Vend at start of frame
       (fixes Gribbly's Day Out)
     + JIT Aborted STR's now exit early and dont flush the cache if the value
       being written to memory hasn't changed (improves Fish!)
     - Frame pacing now off on IOC/IOMD to fix flickering in games that
       frameswap on Event 4 (Chuck Rock, Heimdall, Nebulus etc), knock on
       effect is music in games that schedule on Event 4 are wrong (Pac-mania)
     + JIT LDM that contain PC in the reglist now reuse existing codelets
     + JIT ALU / MOV that have PC only in Rd now reuse existing codelets
     + JIT LDR that have PC only in Rd now reuse existing codelets
     - JIT instructions now continue to be processed after a conditional
       branch
     = JIT Aborted STM now correctly clean the 2nd cache line when writing
       more than 7 registers on Iyonix+
     - JIT SWP now flushes a cache line on Iyonix+
     + JIT now walks unconditional Branches
     = JIT CLib_kernel_osfile wasn't clearing down the stack on exit
     - JIT now reports LDR/STR with PC in Rd eg LDR R0,[R1,PC]
     = JIT STR PC, ... wasn't storing the flags
     - Moved SetVars from !Loader to !Boot so it can be used during the OS
       boot sequence
     - Improved encoding of LDR Rx, [PC, ...
     - 50Hz check in 32bit now checks for 50-52fps (was 50/51)
     - JIT cache flushing is now batched and handled as the JIT exits
     - JIT hv_reset_memory_block rewritten to improve performance
     = JIT STR/SWP weren't correctly checking if an Aborting address being
       written to contained an instruction
     + JIT branch prediction/walker added
     = JIT was incorrectly calling the RISCOS Undefined Instruction handler
       as soon as it touched a Co-Pro instruction.  It now only passes to
       RISCOS if entered on a Co-Pro instruction
     = Stripped out more code that was erroneously getting into some of the
       builds
     = JIT hv_SharedCLibrary_Lib_InitAPCS_R wasn't resetting the memory that
       the C branch tables are written too
     = JIT BL wasn't checking for branches outside of appspace
     = JIT wasn't updating the ARM CR correctly to disable Alignment faults
       and enable rotated loads
     = JIT OS_GBPB wasn't resetting JIT appspace correctly
     = JIT CLib _kernel_osfile wasn't setting V correctly on exit
     + JIT hv_reset_memory_block moved to SWI XADFFS_ResetMemoryBlock
     = JIT CLib _kernel_osgbpb wasn't hypervised
     + Added support for additional GameModes 41-53 (fixes Cannon Fodder on SA)
     - JIT Abort handler now pre-loads an aborting write address at entry
     = Voice Generator now forcibly calls the GateOn entry if it's not been
       called prior to Fill or Update (fixes a bug introduced in RO2)
     - Sound_Configure no longer issues the SWI if the values passed are
       zeros
     + Added TrkPly2QTM module to shim Trk_Player module to QTM
     + SWI handler now traps SWI's called from BASIC whilst the JIT is running
       and passes them to the SWI hypervisor
     + OS_SpriteOp 36 corrects R7=-1 to R7=0 if emulating up to RO3.8 behaviour
     - SoundDMA is now a protected Module
     - JIT ADFS_DiscOp no longer hypervised, moved memory reset code to MemCopy
     = ChannelHandler now ignores R8 passed to it by RO3.50 thru RO3.70 as
       the value is incorrect
     = JIT writes to scratch space (&4000-&7FFF) now reset JIT memory
     + JIT reports MUL / MLA containing PC in Rn, Rm, Rs
     + JIT MUL / MLA continaing PC in Rd is NOP'dfixes Tactic)
     = JIT OS_File / OS_GBPB didn't exiting correctly if an error occured
       (fixes Tactic)
     = JIT Exit handler now disables VSync and T1 IOC IRQ's
     = hv_reset_memory_block was flushing the TLB if the entry wasn't changed
     + Added Stasis 26/32bit neutral Module
     = hv_reset_memory_block wasn't setting pages to read/write if subpages
       are being used
     = JIT shutdown_interrupts was pointing at IOC instead of the IOC register
       emulation table when stoping T1
     = JIT codelet alignment didn't match the codelet header size, causing
       the IRQ handler to fail (bug introduced in 2.48)
     = JIT codelet re-use was writing to page zero instead of the codelet
       when freeing a codelet that's no longer used
     - JIT codelet re-use temporarily turn off until its rewritten to track
       source addresses

2.48 = MEMC physical to logical was failing if the translated address was
       the end of DA2 (fixes No Excuses)
     = Abort handler was corrupting R0 when handing back an Abort to the OS
       this was causing memory corruption on the 1st write to a lazy mapped
       page (fixes Rotor)
     = Moved BASIC to JIT's translated RMA space, to prevent Aborts triggering
       the JIT Abort handler (fixes Freddy's Folly)
     = OS_UpdateMEMC now returns the full address, register and value
       matching RO3.11 (fixes No Excuses and Rotor)
     = JIT Abort handler was never reaching the check for STF
     = ADFRemapVideoMemory was pausing the blitter if called after GOARM3JIT
     - SSBC IRQ now raised before Channel Handler is called, if no DMA pending
     - Moved FLUSH_I_AND_D_CACHE to a subroutine and added support for Iyonix
     = JIT Abort handler wasn't setting C before decoding RRX
     + JIT LDR addresses are now decoded to check for page zero reads
     + JIT page_zero_abort now handles reads, IRQ and IRQ1V return suitable
       values (fixes Nebulus, Lotus Turbo Challenge 2, Gribbly's Day Out)
       &1584 returns VIDC1_CR
     + JIT IRQv now hypervised on IOMD
     + JIT IRQv and IRQ1v now treaded seperately on 32bit non-IOMD and
       passed to game before RISCOS
     + OS_Word SWI now handled in the SWI handler
     + Replaced ADFSoundConfigure with ADFEmulateRISCOS [<OS version>]
       OS_Word 21,0 behaviour and Sound_Configure settings are altered
       accordingly
       LDR PC, ... at &18 changed to B <address> on RO3.5 thru RO4.x non-SA
       (WAS COMMENTED IN 2.37), now changed to branch to the address the
       original LDR PC, ... pointer too + 4.  The +4 address is replaced
       with LDR PC, [PC, #-12]
       Sound AutoTuning is disabled when emulating RO3.x/RO4.x on RO5
     + OS_Word 21,0 now adds a VSync if ADFFS is emulating RO3.11 behaviour
       (fixes Manchester United Europe menu speed)
     - JIT OS_Memory 9 now returns an error if emulating below RO3.5 behaviour
     - JIT OS_Memory 9, 2 now returns 0, as VIDC1 doesn't exist on RO3.5+
     + JIT OS_ReadMemMapInfo now returns 8MB of RAM (fixes Manchester United
       Europe memory detection)
     + OS_Byte 129,0,&FF now returns the correct OS identifier for the OS
       ADFFS is currently emulating
     + JITMEMORYA now allows persistent values to handle code that's loaded
       and unloaded
     = JIT OS_ClaimDeviceVector is now hypervised
     = IOC call_device_claimant was corrupting SVC R14 (fixes Rockfall)
     = Sound DMA buffer fill wasn't duplicating DMA samples across all sound
       channel (fixes Rockfall)
     - if emulating RO3.11 behaviour, Sound_Configure with R2=0 will now
       use the previous value if VIDC1 Sound Frequency Register has been
       altered directly (fixes Rockfall)
     = VIDC20 Abort handler removed from IOMD 26bit build
     = Blitter now blanks screen border overlaps (fixes Rockfall)
     = BASIC CALL/USR R14 was not pointing at BASIC's function table
       (fixes Thundermonk)
     = JIT claimed vectors were not returning correctly
     + JIT IRQ vector is now hypervised and Device Vectors and IRQ1V
       paravirtualized
     = JIT IRQv, Device Vector, IRQ1V were being called in the wrong order
     = JIT hv_reset_memory_block was reading the next codelet address after
       the freeing the current, potentially resulting in the wrong address
     = Could hang RO5 after a non standard MODE change
     = USER stack is now initiliazed when GOARM3JIT <address> is used
     + ChannelHandler now supports N:1 filling (fixes Rotor)
     + JIT added Environment Handler 16 (Upcall) (partially fixes MiG-29
       Fulcrum)
     + JIT Wimp_Initialise is now reported
     + 32bit version of ExSound module added

2.47 = JIT self-modifying STR's weren't releasing codelets (fixes 2067BC)
     + JIT added 4 local vars to the codelet header structure
     - JIT changed source address in codelet header to address+8 and
           changed all codelets to use it, instead of a seperate static
     - JIT improved encoding LDMxx Rn,{<reglist>, PC}  from 21 to 14 instr.
     - JIT improved encoding LDMxx Rn,{<reglist>, PC}^ from 25 to 20 instr.
     - JIT improved encoding BL from 11 to 10 instr.
     - JIT changed codelets to use local vars in the codelet header
     = Hypervised OS_Claim codelet was writing one too many words and
       overwriting the next codelet header
     + JIT codelets are now aligned in 32 byte chunks
     + JIT claims the IRQ hardware vector whilst running, which preserves
       interrupted codelet's variables around the IRQ
     - JIT removed NOP's after MSR's in ALU instructions
     - JIT TEQP/CMNP/TSTP/CMPP PC, ... no longer applies the original
           condition to the MSR equivelant
     = abt_R13 is now setup on StrongARM (fixes STM call to free_codelet
       which was corrupting R0 - fixes Bouncer)
     + JIT claims the Branch Through Zero vector whilst running
     - JIT merged i_ALU_PC_in_Rd_and_Rn into i_ALU_PC_in_Rd
     = mouse_ptr_abort now reports instructions it can't decode
     - Abort handler no longer swaps to SVC whilst running, it remains in
       Abort32
     = Abort handler and JIT abort handler could cause register corruption
       if an interrupt occurred as the handler exited
     = JIT Abort handler wasn't using the correct PSR when proxying
       LDR Rd, [Rn, {+/-}Rm, RRX]!
     - Optimize blitter by moving border calculations outside of Y loop
     = VIDC1 translation was writing softcopy VIDC registers on RO5
     + Blitter now takes account of vertical borders
     - Re-enabled frame pacing
     + JIT IOC CR is now initialized
     + JIT IOC IR pin is now set high when VSync occurs
     - Blitter is now threaded under RTSupport on RO5 non-IOMD (fixes disc
       swapping issues)
     = JIT debug was releasing a callback that doesn't exist in ADFFS500
     + JIT SSBC IRQ now raised when the Channel Handler is called
     = disc_swap code now checks IRQsema before attempting to swap the disc
       and pauses the RTSupport blitter thread whilst swapping
     - JIT IRQ claiment call code improved
     - Merged MkADFFS311 back into MkADFFS and altered all #if's to resolve
       extASM nested #if issues
     = Blitter now checks if the backbuffer has already been blitted and drops
       the frame if a GPU frame swap is pending
     - set_DAG now claims "Set start of video display"

2.46 = ADFOpen reports errors if the Wimp is active
     + Blitter now takes account of VIDC parameters
     - Blitter recoded and optimized with STRD
     - IOC emulation disables IRQ's when emulating IRQ's
     - T1 code now clears IOC T1 flag after calling user code
     + JIT Added hypervised handlers for all OS_ChangeEnvironment handlers
     = Corrected VIDC1 translation of HBSR, HDSR, HDER, HBER to be -1
     = Corrected VSWR, VBSR, VDSR, VDER, VBER in stored VIDC1 MODE table to be
       -1 instead of -2
     = OS_Byte 19 wasn't passing the request through on RO5 if frame pacing
       was disabled

2.45 - Boot overrides are now launched when specific floppies are mounted
     = GOARM3JIT <address> was jumping to the wrong address (fixes Axis and
       BlowPipe booting on the Pi)
     = OS_ReadVduVariables now works if exit values overwrite entries
     = claim_vsync_trigger wasn't resetting it's vars, which caused the
       screen to stop refreshing on the Pi
     = Hypervised OS_Release now checks the private value matches
     = OS_ReadVduVariables now checks if the OS is requesting the address
       (fixes *POINTER 1 and BlowPipe on the Pi)
     - Changed SA JIT to use it's own stack, this prevents stack corruption
       for games that alter SVC R13
     = JIT TEQ<cond>P PC, Rn wasn't encoded correctly
     + JIT TEQP Rn, PC added (fixes No Excuses)
     = Cache flush changed to back to 32kb on StrongARM
     + JIT OS_ChangeEnvironment 10 (Event) now hypervised (fixes Ballarena)
       Reports others as unsupported
     + OS_Byte 129,0,&FF now returns A4 (RO3.11) when the JIT is running
       (fixes Ballarena)
     = JIT debug reporting - User R12 was incorrect, showing last Aborted R12
     = MEMC Vinit, Vstart and Vend were using the wrong physical base address
       for the video memory
     + JIT OS_ChangeEnvironment 11 (Exit) now hypervised (fixes Gribblys Day
       Out)
     = JIT OS_GetEnv was calling OS_SetEnv instead
     = GraphicsV 6 is now only handling R0=0 (Set start address of current
       video display).  It also checkes the address is within the DA2 range
       and ignores it (RISCOS sometimes passes addresses just below the start
       of DA2, or the DA2 end address for some reason)
     + T1 latch implemented
     - *ScreenSize no longer changes MODE on machines with GPU's
     - Corrected all ALIGN's to be ALIGN 32,4

2.44 REQUIRES RO5.21 beta from 16-09-14 or later
     + Sound_Configure now managed
     + ADFFS now sits between SoundDMA and SoundChannels to handle differences
       in what a game wants and what the system can provide
     + MEMC Sstart, SendN, Sptr now implemented
     + MEMC Cinit now set to correct value on RO5
     + OS_UpdateMEMC is now trapped and ignored
     + Sound_SampleRate will now trigger Sound_Configure to be called to
       check the sample rate the Channel Handler should be expecting
       (fixes new Tracker modules, that use Sound_SampleRate to set the period)
     + Added check for B to RO3.X SWI dispatcher - B &1F033C0 (Slappit @ 8014)
     = ALU no longer forces S bit on CMP instruction, it now changes the
       instruction to a NOP (fixes Slappit)
     = Hypervised OS_Module wasn't passing through to our OS_Module code
     + LDM/STM PC(!) now implemented (KerBang @ 9644)
     - Cache now flushed after a codelet is released
     - Cache flush changed to 16kb on StrongARM
     - Sound_InstallVoice is now hypervised without a codelet, it now uses
       a fixed block of 32 Voice Generators (fixes Bouncer)
     = OS_ReadVduVariables is now taken over when the screen is remapped
       and returns the correct address for 148 / 149.  Prior to this
       unhypervised calls would return the wrong address (fixes Fire & Ice)
     + Added override folder to prevent games from auto-booting
     = 1bit MODE code was causing corruption due to code misalignment


2.43 + Codelet recycling added
     = JITMEMORYA now reports an error if it runs out of space
     = OS_Module Free now cleans any codelets in the block being released
     = exit_handler wasn't entering SVC prior to shutting down interrupts
     = IOC register table was the wrong size
     = GOARM3JIT was clearing too many IOC registers
     = Service _modechange now recounts VSync's after a mode change
     - Translate device 9 (sound system buffer change) to device 20 (sound DMA1)
     = MEMC abort was using the bottom 16 bits of MEMC writes, instead of
       the bottom 17 bits
     = Change cache flush code to read 32kb on SA, 16kb wasn't flushing
       correctly

2.42 = Fix bug in KeyExtend module where R4 is corrupt on exit from OS_ReadLine
     = SWI handler wasn't preserving exit flags on RO3.11
     = ADFForceVSync was being set to the wrong value by both ConvRec and
       ADFFS when the floppy is mounted
     = Exit handler now forces SVCxx before passing to RISCOS
     - JFD options (FPS, Protect CMOS, Module etc) are now set when a floppy
       is booted, not when it's mounted
     - jit_codelets pointer moved to JIT appspace, in preperation for WIMP
       support
     = Sound_Configure recoded to jump into JIT space when the entry points
       are called (fixes 2067BC)
     = Sound_InstallVoice recoded to decode branch table when entry point
       is called
     = IOC call_device_claimant primary exit changed from LDR PC,[R13,#4]!
       to ADD R13,R13,#4 : LDR PC,[R13],#4
     - eventv now switched to SVC and preserves CPSR / SPSR / R14 before
       any SWI's
     - Preserves Sound_Configure previous values when a game terminates
     = RO5.x OS_ClaimDeviceVector was storing the wrong entry point in the
       Device table

2.41 = Exit handler now switches back to the entry CPU mode before passing
       the call onto RISCOS
     = IRQ1V releases are now detected
     - Improved LDR PC, ... encoding
     = <ALU> PC, ... was encoded incorrectly for conditional instructions
     = <ALU>S PC, ... was encoded incorrectly if R1 was used to encode
     = Some of the ADFF50xxx exceptions were calling the wrong handler
     = ADFOpen now opens "<discname>.$"
     + APCS_R translated to APCS_32 and various CLib functions hypervised
     = B wasn't encoding jumps outside of JIT appspace correctly
     = Co-Pro instructions in ROM weren't being passed on correctly
     - OS_ReadDynamicArea -1 now returns the correct end of appspace
     = OS_RemoveCallBack wasn't being hypervised
     + SWP added to JIT abort handler (fix for CLib - Quest for Gold)
     + OS_CallASWI, OS_CallASWIR12 hypervised
     + VoxLib 32bit
     = abort reports now use MODE 25 on Arc's and MODE 28 on non-IOMD 32bit
     - Abort handler now passes aborts generated internally to the previous
       abort handler.  This is to ensure lazy page mapping is handled further
       down the abort chain
     + LDF/LFM/STF/SFM now encoded
     - GOARM3JIT now accesses every page after creating the WimpSlot to
       workaround Abort occuring with the Abort handler, due to lazy page
       mapping on RO5.x
     = Co-Pro instructions in codelets weren't being passed on correctly
     + OS_GBPB hypervised

2.40 + MEMC Sstart, SendN, Sptr added although not implemented
     + MEMC Cinit added for IOMD
     + <ALU> Rd, Rn, PC, {<shift>} now encoded
     = JIT exit handler reinstated, no longer switches CPU modes and now
       preserves R14 before shutting down all JIT raised interrupts
     + Sound_Configure hypervised
     = ALU instructions that used R0 in Rd and PC in Rm not encoded correctly
       ie MOV R0, PC or ADD R0, R1, PC
     + Sound_InstallVoice hypervised
     = IRQ (&100) wasn't sign extending the address
     = removed post_SWI_veneer that follows all SWI XADFFS_DoNothing
     = OS_Byte 113, moved post_SWI_veneer to follow OS_Byte in
       _delay_frame_change
     = OS_ChangeDynamicArea, moved post_SWI_veneer to follow
       XOS_ChangeDynamicArea
     = OS_FSControl, removed post_SWI_veneer
     = RO5.x The blitter is now paused during GraphicsV 2
     = IOC code (IRQ / Timer 1 etc) can now return via either MOV PC,R14
       or LDR PC,[R13],#4
     + RO5.x now reports a write to IRQ (&18) or IRQ1V (&100) if there are no
       JITMEMORYA fixups
     + report_abort reports ADFF5xxx exceptions, added reports for various
       unsupported features
     = SetVars was failing on ARM2
     = OS_Byte 176 was corrupting PSR's and R14 on exit
     = OS_Byte 176 is no longer intercepted if we're not generating VSyncs
     + WFS 1.32 32bit sound module
     - all conditional code changed to support ADFFS450 (RO5 IOMD)
     - !Loader changed to support ADFFS450
     = <ALU>{S} PC, Rn, ... was corrupting the PSR if R1, R2 or R3 were used to
       encode the instruction
     - BL recoded to use 2 instructions on 26bit SA and B <address> instead of
       LDR PC, <address>
     = LDMxx Rn{!}, {reglist}  would corrupt R1 if R1 was used to encode the
       instruction
     = TSTP/TEQP/CMPP/CMNP Rn, <shift> where Rn!=PC and <shift> was immediate
       encoded incorrectly
     - Improved the entry point of OS_Claim vectors

2.39 = IOMD hardware scrolling wasn't observing Vstart/Vend restrictions
     + JIT OS_Module 13 (ExtendBlock)
     - JIT BASIC module is moved to RMA and USR/CALL changed to call
       hypervised ADFFS_BASICCall SWI instead
     - Improved STM loop performance
     - STMIx Rx! aborts were corrupting Rx if an instruction wasn't touched
     = vidc1_abort was using TEMP R9, without a matching LOCK R9
     = STMIx Rn, {<reglist>, PC} not encoded correctly
     - Added SetVars Utility and modified !Loader so loads the correct version
       of ADFFS instead of trying ADFFS400, then ADFFS500
     = MiscOp 0 no longer sets "root" on exit and treats the disc address
       as a byte offset, even if ADFS is in sector mode
     = Changed filetype in F discrec to &FCD
     = RO5.x wasn't releasing VSync trigger correctly if Vsync is already 50hz
     - OS_Byte 19, 113 and DA2_frame_buffer modified to deal with system
       generated Vsyncs
     = RO5.x vidc1_abort wasn't rounding the display width to next 32 pixels
     - JIT changes to FIQ routine between &1C and &FF are ignored

2.38 = RO5.x ADFS module, ADFS_MiscOp 1 wasn't returning "empty" when no
       floppy was mounted, causing RO5 to hang when cataloguing if a floppy
       wasn't mounted
     = MiscOp_restorePSRVS wasn't setting V
     = ADFS_MiscOp was corrupting R0 and setting V for MiscOp's we don't
       handle
     = ADFS_MiscOp 0 was copying too much to the discrec it was asked to fill
       it was also copying the discrec from the template instead of the disc
     = Fixed the botch added in 1.29 to get Zarch APD working
     + ADFS_MiscOp 1 now returns density sensing and checks the sequence no.
     = Now turns off the JIT and screen mapping when entering a non game MODE
     + JIT CTRL-SHIFT-F12 to quit back to the desktop (experimental)
     + JIT now enables rotated loads and disables fault checking in ADFFS500
     = Clears down vector and device vector tables when not in debug mode
     - SWI early exit now checks for a pending disc change (fixes
       disc swapping issues on Burn 'Out and helps with Xenon 2: Megablast)
     = disc swap would try to change disc on every SWI entry if no disc
       was mounted and a swap requested
     = On IOMD the MEMC abort handler is now used
     = RO3.1x pressing CTRL would corrupt SVC 14, eventv now enters SVC
       and saves R14 prior to any SWI's (fixes Pesky Muskrats)
     = IOMD hardware scrolling fixed
     = Service_PreModeChange now translates mode specifiers back to their
       original RO3.1 MODE for modes below 25

2.37 - RO5.x dropped HAL timers and modified the blitter to raise the IOC T1
       interrupt
     = IRQA is now initialised with bits 2, 3 and 5 set
     - JIT forces S bit on TST, TEQ, CMP and CMN (fixes BlowPipe)
     = JIT OS_File was corrupting flags on exit
     + JIT OS_File / ADFS_DiscOp now mark complete pages as read/write when
       loading
     = JIT LDR PC, ... wasn't setting IPUBW correctly (introduced in 2.35f)
     + JIT OS_Module 6,7
     = JIT OS_Release wasn't matching the vector number and was corrupting
       R0-R1
     - Moved L1/L2PT location code to module startup
     + LDR PC, ... at &18 changed to B <address> on RO3.5 thru RO4.x
                    *** CURRENTLY COMMENTED OUT ***
     = JIT OS_FSControl 4 Absolute's return to an SWI OS_Exit in JIT space
     = GOARM3JIT wasn't going into the correct CPU mode and wasnt setting
       IRQA mask to the correct initial value
     # ADFS_DiscOp 3 now clears 20Kb of JIT space
     + JIT / OS_File now work with subpages on StrongARM (1KB instead of 4KB)
     = RO5.x T1 IRQ is now trigged once when enabled and low/high values are 0
     = JIT STM's that generate aborts now only flush the cache if they
       overwrite an instruction
     - JIT STR / SWP now flush an individual instruction cache line instead
       the whole cache on 80321 and newer

2.36 + JIT IOC device 3 (VSync pulse) and 6 (Timer 1) added
     - dropped all CPU mode swapping from eventv
     = disc_swap was going into the wrong CPU mode on ARM610
     = JIT TEQP PC, ... wasn't encoded correctly
     + JITMEMORYA added to allow code fix-ups
     = JIT OS_FSControl 4 now sets up the environment prior to calling the
       program being run
     = Service_ModeExtension now calls translate_VIDC1_to_VIDC20 instead of
       writing to VIDC1
     - RO5.x Removed VMOD/RMOD/FIFO/HVsync code
     - JIT CMP Rd, ... - some compilers incorrectly set Rn<>0, Rn is
       now cleared (fixes Cannon Fodder eg &11df90)
     = JIT Coprocessor instructions are now passed thru
     = JIT OS_Exit hypervised
     + Exit handler added to clear down the JIT
     = Claim_DataAbort_Vector wasn't storing the previous Abort handler
     - data_abort changed to set CPU mode based on compile version
     - VIDC1/20 palette writes now write directly to the palette table

2.35 = OS_FSControl passes on unknown filetypes
     = <alu>S PC, Rn, ... not encoded correctly
     + JIT 1.5mb of JIT RMA heap added at end of appspace
         jit_code_start lowered by 1.5mb to match
         data_abort adjusted to include RMA memory
         OS_GetEnv adjusted to return jit_allocate_memory (currently 8mb)
     + OS_FSControl Utility file support
     + OS_FSControl 2 (*GO) now taken over
     + JIT Wimp_SlotSize hypervised
     + RO5.x if the monitor is running at 50Hz, it stops generating its own
       VSyncs
     - disc_swap seperated 26/32bit code
     = discop/miscop now preserve flags on all CPU
     = IOC exit_SWI_veneer wasn't setting V
     = JIT LDR PC, [R1, R0, ...] wasn't encoded correctly
     = JIT LDR PC, [R2, R3, ...] wasn't encoded correctly
     - JIT core, no longer clears the PSR from R14 - it shouldn't contain PSR

2.34 = RO5.x post_SWI_veneer wasn't pulling flags for CPSR, spotted by
       Jeffrey Lee
     - RO5.x now works if the GPU doesn't get VSync from the hardware
     - openmount now uses OS_File 19 to generate file errors
     = 32bit OS/CPU checks now set PC flags before checking if PC=PC:
         goarm3jit
         module
         SWI
         disc_swap
         adfs.code
     = ADFFormat changed to Format with same parameters as ADFS
       (fixes adfs:Format)
     - changed errors to use OS numbers where possible
     - Now enabled CMOSProtect, ModuleProtect and HideHourglass is JFD
       requires it
     = JIT OS_File wasn't taking account of any specified load address
     + JIT ADFS_DiscOp now hypervised
     = get_screen_start wasn't exiting
     - Ejecting a floppy now turns off forced VSyncs
     - OS_ReadVDUVariables switched to being hypervised
     + OS_FSControl 4 now taken over by ADFFS if the JIT is running
     = jit_appspace_end changed to equal jit_allocate_memory to prevent
       Norcroft stack being outside JIT space
     = JIT LDR PC, [Rn, Rm ...] wasn't being decoded correctly
     - JIT OS_EnterOS now NOP'd (fixes Xenon 2), additional changes to match:
       - IOMD IOC read/writes now proxied
       - IOMD VIDC20 writes now proxied
       *** currently turned off ***
     = OS_Byte 13 / 14 were exiting in the wrong CPU mode
     + OS_Mouse now adjusts the time it returns if booted outside the WIMP
     = JIT LDMxx Rn{!}, {<reglist>} not encoded correct if Rn was in reglist
     = Init code now clears V on exit
     = STR PC, ... not encoded correctly

2.33 - RO5.x recoded blitter to use a 32bit MODE to avoid delays when palette
       and frame swapping at the same time
     - RO5.x Service_ModeChange now sets MEMC Vinit
     - RO5.x DA2 blitting now done independently of GPU frame swapping

2.32 = report_abort now checks if the address is valid before disassembling
     = OS_File (non load operations), OS_GetEnv and OS_ChangeEnvironment
       weren't performing the SWI
     + OS_ReadVduVariables returns RO3.1 screen addresses when it's remapped
     + JIT now corrects some unpredictable instructions (as found in
       Fire & Ice):
         LDR R0, [R0], #0    -> LDR R0, [R0, #0]
         LDMIA R1!, {R0, R1} -> LDMIA R1, {R0, R1}
     + RO5.x GPU blitter now frameswaps to remove shearing
     = IRQ1v vector claim commented out as its causing issues
     - Aborts are now reported by ADFFS when they happen in JIT space
     - Updated !Loader to set BCMVideo$ScreenBanksEnabled to 2 if running
       on RO5.21 or above
     - RO5.x Recoded 4-bit palette ready for mid-frame palette change code
     - Removed 4bit palette copying code
     - MusMod2 module updated to 1.01 to fix register corruption on exit from
       Mus_Instruments (fixes Chuck Rock titles)

2.31 + RO5.x IOC writes now decode the writes into controllers
     = Updated TrackerMod to 5.02 which adjusts for sample rate and buffer
       length
     - Removed MusMod, no longer required
     = ADFS shim module was corrupting PC on exit
     + JoyMod module added, although it's not need update for the HAL yet
     = DTT module now 32bit compatible

2.30 = _trigger_event_4 now stacks R0-R9 as EventV 4 seems to corrupt more than
       just R0 and R9
     = Fixed Ambigious disc errors when in the WIMP
     = IOC writes weren't being stored correctly
     - OS_Byte 19 now marks the frame as dirty
     = Can now slow down Pac-mania
     = JIT ADDS PC, PC, ... wasn't checking Rm or Rs to find a register to use
     = JIT switched STM to use R0-R2 instead of Rn, to avoid R13 corruption
       when an interrupt occurs
     - JIT TEQP etc are now copied on StrongARM
     = JIT hypervised interrupts were not stacking a hypervised claim exit
       handler
     + RO5.x claims the IRQ vector to hypervise IRQ1V
     + JIT OS_GetEnv / OS_SetEnv hypervised
     = map/unmap_screen_memory now disable JIT debugging whilst updating
     = rewritten pre/post SWI veneer to pass-thru flags
     - all SWI code rewritten to use new SWI veneers
     - RO3.11 discop/miscop no longer use MSR/MRS

2.29 = RO5.x Hardware scrolling was using IOMD / DA2 code round the wrong way
     - ADFIgnoreVSync removed, no longer required on the Pi
     - Frame pacing code moved from OS_Byte 113 to OS_Byte 19
     = detect_VIDC20 was not setting ADFFS$VIDC20 to 0 on RO3.11
     = !Loader was trying to load ADFFS500 on VIDC1 machines
     + OS_Byte 176 abstraction so it ticks at 50Hz
     = Hardware scrolling now accounts for RAM type and size
     + Below RO5.x OS_Byte 13 / 14 now supress event 4 (VSync) and we
       generate our own 50Hz VSync
     = ADFRemapVideoMemory wasn't going to the correct mode below RO5
     + RO5.x GraphicsV 1 is suppressed and we generate our own 50Hz VSync


2.28 = our_* debug code now uses GPU buffer on Pi and screenstart on IOMD
     + JIT additional SWI's added
     + QTMModule updated to 2.45
     + MusMod2 to QTM shim module updated to 1.00
     - JIT Hypervised SWI's added
     - ADFCacheOff removed, no longer required with the JIT
     + AutoVIDC updated to 2.11

2.27 = RO5.x 2bpp blit code was pulling too many registers off the stack on
       exit.  Thanks go to Jeffrey Lee for spotting this
     + RO5.x Added support for Debug breakpoints to the JIT
     = release_DataAbort_Vector was trying to unmap RO3.1 screen memory when
       it wasn't mapped
     - cpuid changed to support additional processors, OMAP / ARM11 etc
     = GOARM3JIT now exit via an address below 28mb
     + JIT OS_WriteS

2.26 + OS_ReadDynamicArea now returns the RO3.1 address for DA2 if the
       abort handler is running
     + RO5.x MEMC Vinit support added for IOMD
     + >RO3.11 GOARM3JIT added
     + MusMod2 to QTM shim module updated to 0.10
     = pre_SWI_veneer wasn't turning off FIQ/IRQ in SVC SPSR

2.25 + RO5.x MEMC emulation

2.24 - RO5.x IOC emulation shell code
     + RO5.x Support for screen widths that aren't multiples of 32 pixels
       in 4/8 bpp

2.23 - RO5.x Now blits frames to the GPU at the games FPS, or 50 FPS if its
       unknown
     + RO5.x PLD pre-fetching in MemCopy
     = RO5.x A frame update is now forced if CTRL-SHIFT-PgDn is used to
       set ForceVSync to zero

2.22 - RO5.x Removed screen bank tracking, as unreliable.  Uses
       OS_ReadVduVariables instead
     + RO5.x 1 and 2 bpp MODE support
     + RO5.x PLD pre-fetching in MODE translation blits and memcopy
     + Loading a JFD now auto-sets ForceVSync

2.21 - Started adding compiler options for RO3.11 RO3.5 RO4.x and RO5.x
     + RO5.x mode translation
     - RO5.x Service_ModeChange and OS_Byte 113 now track the current
       screen bank
     - RO5.x Service_ModeChange changes the palette for 4-bit MODES

2.20 + 32bit QTeM module, thanks to Jeffrey Lee for letting us use this
     + 32bit TrackerMod module
     - MusMod2 to QTM shim module extended to support most Krisalis games
     - report_abort now releases abort vectors at end instead of start
     = Wasn't releasing the DA on exit if memory was reserved
     = ADFFS_Info 5 wasn't returning 0 if the disc format is unknown
     = Swapping discs caused a crash if the floppy image was smaller than
       the reserved memory
     = ADFBootFloppy was resetting MonotonicTime when the WIMP was active
     = !ConvRec / !APDtoJFD now set the WimpSlot size
     = MiscOp mount was corrupting log2secsize when checking F format
     = MiscOp Identify Disc was corrupt log2secsize when identifying
       the disc format
     = DiscOp 3 now sets the exit discrec to match the expected values
       for the OS it's running on
     = Slow sectors now take account of the ADFS retry count and seek
       time (fixes Fire & Ice)

2.19 = swi_OS_ChangeDynamicArea was corrupting SVC R12
     + Added *ADFScreenCaching to turn off screen caching on RO4 / SA
     - Changed vidc_abort to use 14 bits instead of 15 for fractions, to
       reduce ALU auto-expansion
     - Changed the following commands to be in the format *xxx [<ON / OFF>],
       the default with no parameter is ON, for backward compatibility
        ADFProtectCMOS
        ADFProtectModules
        ADFWriteProtect
        ADFHideHourglass
     - Removed all of the stacked auto-expansion
     - SWI ADFFS_BootFloppy removed, no longer required
     - ADFBootFloppy:
        Monotonic time, the file system and directories are only reset if
        booting from outside the WIMP to prevent WIMP filer issues.
     = "Boot Floppy" in filer now uses Wimp_StartTask to issue *ADFBootFloppy
       (fixes Alderbaran)

2.18n
     - optimized mouse_ptr_abort check for CursorData

2.18m
     - SWI handler further optimized
     - Removed VIDC20_debug code
     - insV replaced with eventV to track key presses, added code to
       prevent CTRL toggling by auto-repeat (fixes Manchester United disc
       swapping)
     = OS_ChangeDynamicArea (RO3.1x) wasn't using the correct CPU mode
     + Added SWI pre-veneer, now used by:
        swi_OS_Byte_113
        swi_OS_ChangeDynamicArea
        swi_OS_ReadMonotonicTime
        swi_Filecore_Create
     - vector_handler_trap now uses LDMFD Rx!, {}^

2.18l
     - SWI handler optimized
     = enable_cache was restoring CPSR / SPSR in the wrong order
     - Removed AutoVIDC SWI code, no longer required
     = BootOnWIMPShutdown was corrupting R14

2.18k
     + ADFRemapVideoMemory now unmaps the RO3.1 screen memory when turned off
     - OS_ChangeDynamicArea now recalculates DA2 size
     - Service_MemoryMoved removed, not longer required

2.18j
     + Added support for RO3.5 thru 3.71 to ADFRemapVideoMemory

2.18i
     + DesktopTracker>QTM shim module added
     - ADFRemapVideoMemory now directly manipulates L1/L2PT

2.18g
     - When running on RO4.x with a StrongARM, the abort handler now hands off
       aborts in DA2 address space to RiscOS
     = Early abort check code now reports an error if memory is in the RO3.1x
       screen space 1F88000-2000000
     - ADFCacheOff re-written to use OS_MMUControl and is now restricted to
       StrongARM or above, SWI handler now turns the cache back on (fixes
       Zarch crashing when OS_Release is called)
     - Service entry now implements the revised entry for RO4+
     + Added pass-thru writing to CursorData for RO4/SA support
     + Service_ValidateAddress implemented to validate RO3.1 screen addresses,
       OS_File code removed

2.18e
     - LDR Rd, [Rn, {+/-}Rm, <shift>]! abort handler recoded

2.18 - Abort handler disables screen memory caching if a StrongARM is present
     - Changed !Loader to an Obey file
     - ADFRemapVideoMemory attempts to remap the DA before and after a MODE
       change
     - Filer "Boot floppy" now remains within the WIMP unless CTRL is held
     + Added SWI ADFFS_BootFloppy
     = mouse_ptr_abort wasn't using AbortI_decoded to exit
     = Abort handler wasn't restoring ABT R14 correctly when handing back to
       the OS
     = ADFRemapVideoMemory wasn't putting the screen memory back before
       releasing the abort vectors
     - removed debug code from RO31_OS_ChangeDynamicArea
     + Service_MemoryMoved added to track DA 2 size (required for RO4/SA)
     - Changed all swi_ handlers to use local temp var references

2.17 + VIDC20 / IOMD detection
     + FSIZE set during VIDC1 to VIDC20 translation
     + ADFFS_Info (8) added
     + LCDgm VIDC20 version added
     - !Boot, !Loader, !Run updated to autoload the correct version of LCDgm
     - Removed all LCDgm code
     = ADFRemapVideoMemory now claims the abort vectors, before changing mode
       to allow LCDgm to take over immediately
     = _modeextension wasn't passing the VIDC list type to the callback
     = service / insv code wasn't using the VIDC20 address provided by the OS
     = Data Abort code wasn't moving the screen memory back before reporting
       an abort
     = ADFRemapVideoMemory no longer fails if the screensize is currently
       below the minimum required for the MODE requested
     = Page Zero abort handler changed to check for <&8000
     = ADFRemapVideoMemory wasn't releasing all the processor vectors
     = swi_OS_Byte_113 wasn't preserving the calling CPU mode R14

2.16 - Added in emulation of AutoVIDC_ClockAvailable and AutoVIDC_SetClock
       for LCDGameModes RiscPC support
     - Removed code that sets VIDC20 to VIDC1 defaults after a MODE change
     - Duplicated VIDC20 palette bits to lower nibbles
     + Service_ModeExtension translation from VIDC1 to VIDC20
     + SWI ADFFS_VIDCCR to return a psydo VIDC1 Control Register for LCDgm
     - premodechange code was using LDR instead of LDRB when forcing video
       memory to remap
     + Sets VIDC20 monitor H/V Sync to match VIDC1 during translation
     + Flags added in make file to turn debug code on/off

2.15 - Commented out LCDGameModes related code as we've released as a
       seperate module
     - Added LCDGameModes 0.21b module
     = OS_Byte 113 wasn't preserving R1 on exit, causing flickering when
       forcing delays to slow games down
     = ReduceDynamicArea was exiting before reducing the memory allocation
     - Removed FPEmulator completely
     - Updated AutoVIDC module to 2.10
     - Now looks for <ADFFS$Dir>.obey.Fxxxxxnn when booting floppies, if
       found it will be used in preference to the Obey file in a JFD image
     = Pre-mode change handler could go over the end of the screen memory
       when the Abort handler was active
     - Boot floppy now increases the RMA to allow ZLib to allocate space
       when swapping discs

2.14 - Extended OS_DynamicArea on RO3.1 to support more than one DA
     = APD was reducing the buffer size too much after reading the file
     = OpenMount wasn't blanking the disc name correctly if it failed
       to determine it

2.13 = Moved floppy erase code to Format, as that's the only command that
       requires the floppy memory to be erased
     + Filer now shows memory allocated to ADFFS
     + Added SWI block and ADFFS_Info so the filer can request information
       about the current state of ADFFS
     - Wimp Poll loop changed to every 10 seconds as we don't need to talk
       to the Wimp
     - Changed head advance code to use OS_ReadMonotonicTime instead of
       OS_Word 1 and DIV instead of M_DIV macro
     + Implements OS_DynamicArea on RO3.1
     + Now uses a DynamicArea instead of RMA space
     - Loading ADF's now uses OS_GBPB instead of OS_File to work around the
       "No writable memory at that address" error
     - ADFBootFloppy now uses OS_GBPB to get around the OS_File issue above
     = JFD file size check was going by data table, not the file size
     + The following SWI's added to ADFFS and the Filer modified to use them
         ADFFS_Info
         ADFFS_Mount
         ADFFS_Save
         ADFFS_BootOnWIMPShutdown
     = ADFFS Filer quits on startup if the WIMP isn't active
     = ADFFS would crash if an error occurred whilst loading a JFD file
     + Hands back unused memory after an APD is mounted
     + ADFReserveMemory added (fixes BlowPipe)
     - Tidied up the * command help

2.12 + Merged LCDGameModes 0.09 into ADFFS source tree
     + "*LCDgm Y/N" added to turn LCDGameModes on or off
     = LCDgm wasn't checking if VIDC translation is enabled before enabling
       LCDgm to be active
     + OS_File will now allow loads to the RO3.1 screen address range (fix for
       Kaptain Konflict, Deeva)
     + Support for Remapping 2000000 +480k for video wrapping (No Excuses)
     + Added "trackers" folder for sound related modules
     = Moved all floppy image memory allocation / release code to "global"
       in preperation for OS_DynamicArea

2.11 + VIDC1>20 translation dynamically calculates VMOD / RMOD based on RCLK
       and required pixel rate
     = Wasn't remapping screen memory on an abort
     + Skips aborts caused by write to <&1000 (not sure its working yet)
     = Was corrupting R8, R9 when passing an abort to RO
     - Removed some unneeded code from abort handler
     = VIDC1>20 now calculates FIFO size
     - Moved generic code for writing conreg and fsynreg to _calc_VMOD_RMOD

2.10 + ADFIgnoreVSync added for Pi/OMAP
     = The time for slow sectors was being calculated incorrectly
     - optimized miscop format checking
     + added ADFFS$RecordingPath to make recording easier, this is
       used as the default path for ADFRecord if it exists
     = Display start address wasn't being updated after a mode change
     + VIDC1 > VIDC20 translation coded added
     - Moved DiscOp monitoring debug code to record_discop to allow MiscOps
       to be covered
     - report_abort now enters SVCxx with FIQ/IRQ disabled
     + Added small icon for !ADFFS
     - Screen memory remap now calculates the physical page number, instead
       of asking the OS.  This is to get around a bug where some pages
       mysteriously disappear (commented out, as not Pi compatible)
     - ADFStop and debug code for realtime recording have been modified
       to reset the key IO vectors before and after, to get around games
       that take over the vectors, preventing recording from taking place
     - FIQ no longer disabled during VSync waits

2.09 = ADFEject wasn't clearing the Obey file flag used to boot JFD files
     = ADFEject was clearing the JFD header before checking if MiscOp
       was requesting a disc eject
     - Changed screen memory abort code to handle any memory address,
       previously it only supported memory mapped to <5000000
     - Abort vector code now passes aborts in the Application memory
       space to the OS, to allow virtual memory to work correctly
     - Abort vector code now hands back a terminal abort via OS_Exit
     - Abort code disables doubly mapped pages when remapping DA 2
       (this works around an issue in RO5)
     - ScreenSize now attempts to resize on RO4+
     = SpriteFree would error if the sprite area was zero bytes
     - ADFForceVSync now changes the frame first and then waits with FIQ's
       disabled (fixes Inferno) for <n> centiseconds since the last frame
       swap, and only forces a VSync if it didn't see one since the
       last frame change
     - moved SWI specific code from "swi" to their own files
     + CTRL-SHIFT-PG UP / PG DOWN now alter the delay between frame changes
       to change game speed

2.08 - Optimized APD oddbits with Jeffrey Lee's code
     - Removed last_hz_counter from ForceVsync code
     - vector_handler_trap reduced to "MOVS PC, R14" which should work
       for both 26bit and 32bit CPU's
     - ADFBootFloppy now sets USD/CSD if a JFD has an Obey file
     + Abort Handler now handles re-entry correctly
     = Release_DataAbort_Vector didn't release Prefetch or Address
       exception
     - OS_ReadMonotonicTime is only captured if ADFFS has been asked to
       boot a floppy (fixes incompatibility with 16bit SimTec IDE card)
     - Software vector table copy is now restricted to the list ADFFS tracks
     = ADFEject code to clear JFD header was overwriting the first
       word of the vector table, breaking Catacylsm

2.07 = ADFRemapVideoMemory wasn't reading the memory size correctly
     = ADFRemapVideoMemory failed if alternate mode mapping takes place
     + MemAlloc commands implemented internally
     + Stub MemAlloc module added to validate RMEnsure
     = Now preserves R14 around a vector driven disc swap, stores CPSR
       locally and uses "<C/S>PSR_all" instead of "<C/S>PSR" which would
       compile incorrectly for older machines
     = ADFEject now clears the JFD header, instead of the JFD loader,
       this fixes a problem where discs may remain write protected after
       swapping disc or formatting
     - Changed all LDM Rx[!], {Rn} references to LDR Rn, [Rx][, #4]
     - Changed all STM Rx[!], {Rn} references to STR Rn, [Rx[, #4]][!]
     - Optimized Little endian conversion macro (M_APDRW)
     + ADFRemapVideoMemory now includes a Data Abort reporter

2.06 = ADFDoNothing wasn't working, as it wasn't clearing flags on exit
     + Added BGetV to the Vectors that are tracked, this fixes
       Chocks Away Extra Missions
     = Disc changing via hot keys wasn't changing the CPU state on exit
       on the ARM3
     - OS_Byte 112 / OS_Word 22 / OS_ReadDynamicArea / Service_ModeChange
       code removed to be replaced by Data Abort handler
     - OS_Byte 113 code stripped of all screen memory remapping
     + Data Abort handler added, implementing dynamic video memory mapping
     - ADFCacheOff made 32bit compliant
     - CPU detection now treats the SA-1110 as SA-110 (ie ID: &A10)
     - Service_PreModeChange code changed to ensure VDU memory is where
       RISC OS is expecting it if we'e remapping video memory
     + ADFEmulateFDC added to switch emulation between 71x/1772
       this fixes Fire & Ice and Slappit

2.05 + added extra bits for DiscOp 3 data and slow sectors
     + added read_slow_sector
     + DiscOp 3 now sets secspertrack (to match RO3.1 behaviour)
     - modularized and switched to extASM
     = ADFStop would corrupt the stack if it fails to create the
       record file
     = capture_DiscOp_read had debug code turned on
     + DiscOp 3 now returns data if requested (it has to explicitly be
       in the JFD file though and a special sector) this fixes Slappit
       but will break Fire & Ice

2.04 = OS_ReadMonotonicTime was failing on SA, due to re-entrancy
     - JFD loading code changed to detect the JFD header size
       (Offset to Track Table - 28)
     = XOS_WriteI didn't have X set
     + ADFFS$OSVersion created during loading, set to the BCD value of the
       OS version.  eg &37000 for 3.70
     + Obey file can now be embedded in JFD file, to boot a game
     = Bad Parameters error was causing FileCore to crash
     + JFD file write protect bit now supported
     + ADFWriteProtect / ADFWriteUnprotect added
     + ADFFS$CPUID created during loading, set to the CPU ID:
       3 / &610 / &700 / &710 / &A10 (ARM 3 / 610 / 700 / 710 / StrongARM)
     = ADFRemapVideoMemory failed if the video memory was already the
       correct size
     - ADFForceVSync changed to work at 100Hz, actual value can be
       calculated by 100/FPS.  eg 20FPS would be 5
     + ADFCacheOff to disable the cache for a set period

2.03 + ADFRemapVideoMemory to move the screen memory to <2000000
       Only suitable for RO3.5 > RO 3.71 - use with caution
     = Trapping CMOS writes wasn't working
     + ADFForceVSync to force a minimum number for VSyncs when changing
       the hardware display buffer
     - APD oddbits recoded to process two bits at a time, reducing
       the function by 5 cycles (15% quicker)
     + Stub ADFS module for modern RISC OS builds that don't include it

2.02 + Checks min version of ADFFS required for JFD files
     = Left some debug code in ADFRecord that would cause problems imaging
     = DiscOp 3 was returning an invalid head in the sector ID's for ADF's
     = DiscOp 3 was returning only one sector ID for JFD's

2.01 + ADFProtectModules added, to prevent OS_Module 4 from removing essential
       modules:

       SharedCLibrary
       FPEmulator
       ZLib
       CallASWI
       ADFFS
       ADFS
       FileCore%Base
       FileCore%ADFS
       FileSwitch
       MessageTrans
       Messages
       ResourceFS
       UtilityModule

     + ADFUnprotectModules added
     - Filer modified to issue ADFUnprotectModules before quiting
     = Monotonic time wasn't being reset during a simulated boot
     - Change "Boot floppy" in Filer to broadcast Message_PreQuit
       / Message_Shutdown (fixes Arcade 3)
     - ADFBootFloppy re-written to use OS_FSControl
     + ADFShowHourglass and ADFHideHourglass added, the hourglass is on by
       default and should be turned off for Sensible Soccer
     + ADFProtectCMOS added to prevent poorly coded games from corrupting the
       CMOS (fixes Arcade 3)

2.00 - Removed secondary check for disc change in MiscOp 1, not required now
       the SWI vector is handling disc changes
     + ID's with fixed cylinder values (fixes Slappit)
     = Generated an error if ADFFS$VecPtrTab wasn't set
     = Filer wasn't marking itself as shut down
     - Filer now initialises and shuts down correctly when the desktop
       requests it
     = ADFMount wasn't terminating the discname before ".$"

1.39 + Filer displays JFD info under Format/Current format
     = Preserves SPSR when changing discs (fixes crash in Sensible Soccer)
     - No longer displays the Hourglass when changing disc
       (fixes hang in Sensible Soccer)
     = SWI vector now checks for IRQs being enabled before
       attempting to change discs (fixes crash in Heimdall)

1.38 + ADFBootFloppy and menu option for it added to the Filer

1.37 - Dismount from ADFS no longer ejects the floppy image (fixes Silver Ball
       which dismounts before requesting the next disc)
     + Added Eject option back into Filer
     = ADFMount was corrupting the stack if an error occurred when opening a
       GZ file
     + Added specific MiscOp 5 code
     + RMKills ZLib when you exit the File System from the Filer
     + RMClear and RMTidy now do nothing
     + OS_Byte 201 is now forced into read mode to prevent the keyboard from
       being disabled (fixes Oh No! More Lemmings)
     = Hot keys now work after a soft-reset (broke in 1.36)

1.36 - Hot key disc changes now change during an SWI event and not via
       CallBack, this is to stop the RMA memory leak when CLib releases its
       RMA allocations

1.35 = Key checks in MiscOp 0 and capture_DiscOp_read were causing the CAPS
       lock to turn on
     = MemAlloc_APD_Erase loop was looping to MemAlloc_Erase!
     = Mounting a JFD was allocating 900K, releasing and then allocating the
       correct amount of memory
     = JFD was allocating track/sector table space twice
     = ADFEject is causing Filecore to crash randomly when calling
       adfs:dismount
     = Changed the way ADFMount reports errors when opening a GZ file, to exit
       instead of GenerateError


1.34 - Head is now advanced for DiscOp 0/1/2 only
     = Data CRC and Sector/ID not found errors were returning the wrong values
     = DiscOp 3 was updating the discrec (as per docs) however ADFS has a bug
       where it doesn't update the discrec correctly
     = R3/R4 were incorrect if an ID CRC error occured
     = *ADFStop crashed if not recording
     = R2 was incorrect if a CRC error occured part way through a read
     = R4 wasn't corrected for non-background reads
     = Changed head advance code to move a min of 1ms (fixes Gribbly's Day Out
       which tries for a duplicate sector before the head has advanced enough)
     = RISC OS wasn't recognising disc changes within the GUI added a
       Service_DiscDismounted call after adfs:dismount
     = ADFFlush wasn't reporting an error for JFD's
     = ADFFlush wasn't working
     = Flush in the Filer wasn't recognising mounted images
     + ADFDoNothing command added to alias RMClear too
     + Reclaims the InsV vector after a reset has occurred

1.33 = Was corrupting R1 whilst blocking background transfers during recording

1.32 = Wasn't mounting type D / L floppies correctly

1.31 - now blocks background transfers whilst recording
     = no longer hangs if a disc error occurs during a background transfer
     + tracks changes to the following software vectors:
       FileV, ArgsV, BPutV, GBPBV, FindV and resets them back to the OS when
       loading a disc if a protection method has claimed them (fixes Cataclysm)

1.30 - Optimized DiscOp 1/2 code
     = Wasn't returning the correct value in R4 if an error occurred during a
       DiscOp
     = MemCopy was corrupting R2 on exit for small copies
     = Filer_DiscInfo wasn't checking if an image was mounted before trying
       to identify the format
     - MiscOp 0 / Identify_disc modified to support APD / JFD
     + DiscOp 3 ADF support added
     = DiscOp 3 was corrupting R2, R3 on exit
     = DiscOp 3 wasn't setting the head and cylinder correctly

1.29 = ADFRecord was corrupting the length of scatterlists
     # Added an addition check to the Zarch botch, so it's only implemented
       on an APD file
     = "Bad Parameters" error was broken in 1.28
     = Was returning "Bad Parameters" instead of "Sector not Found"
     = Was returning the wrong buffer address when an error
       occured during a non-scatterlist DiscOp

1.28 + Disc error code is now "new error style" aware
     = Head advance code was crashing Darkwood
     - DiscOp 1 code modified to also perform DiscOp 0
     = DiscOp 3 was broken in 1.26

1.27 + head is now advanced based on time since last DiscOp (fixes
       Sensible Soccer and Wolfenstein)
     + ADFRecord now captures scatterlists
     + added support for JFD files

1.26 = The Filer was corrupting the stack if an error occurred
       during startup and when closing down via the menu option
     + MiscOp 1 also perform a check for Ctrl-Shift-F?
     - If a disc change is pending for 40 calls to MiscOp 1, it cancels the
       callback request and manually changes disc This probably won't work on
       physical machines due to FileCore re-entrancy
     = DiscOp code now works in bytes, only converting back to sectors for
       sector checking and exit, when ADFS is in sector mode.  This fixes the
       write issue in 1.25 when ADFS is in byte mode and an ADF is mounted

1.25 - Changed MemCopy_SmallCopy order, so a copy is three instructions shorter
     - Filer now self terminates when asked to quit by the user
     - Filer now requests the filename from ADFFS, instead of taking over
       loading
     - ADFFS now sets "Alias$@RunType_FCE" during initialisation
     - Reduced insV_disk_loader down to bare minimum stack use
     - insV preserves R14 around the callback SWI, to prevent the random
       crashing when changing discs
     - added limit check to MFM track decode, to ensure APD's don't go over
       895kb when decoded

1.24 - Changed sector ID word to make room for sector timing info
     - DiscOp now advanced head one sector on entry
     - Sector seek code now only advances one sector
     - Moved all variables to top of code, except:
         ADFS_DiscOp
         ADFS_MiscOp
       as we need to load them directy into PC
     - Changed code where needed to ADRL / LDRL / STRL
     - Format now calls FileCore_LayoutStructure via XOS_CallASWI
     = MemCopy was corrupting the 4 byte when the source address was 1 byte
       out of word alignment and the destination was word aligned
     + Added a small MemCopy routine for <47 bytes, which pushes R14 only,
       onto the stack

1.23 + Added core code to record DiscOp's, needs scatter list adding before it
       can be made public
     = DiscOp 1/2 were returning an incorrect value in R3 and R4 when a sector
       CRC occured
     - Sector seek code now advances two sectors on exit

1.22 + InsV handler to detect F1-F9 key presses and changes disc accordingly.
       Files must be named XXX1 XXX2 XXX3 ...
     = ADFMount was corrupting the filename of mounted APD's
     = FM/MFM sector decoder was terminating sectors incorrectly if the sector
       loops to the start of the track
     = Sector address conversion code was corrupting R11
     = DiscOp 1/2 were returning an incorrect value for R3
     = Added foreground scatter list end check for DiscOp 1 (fixes Zarch)
     - ADFMount checks the request file exists before ejecting the currently
       mounted one
     = ADFMount was allocating 900kb for ADF, 900kb should only
       be used for APD's as the size is unknown until its decoded
     # Sequential disc track number is only doubled for track 40 a botch for
       Zarch to work

1.21 - Sequential disc handler now only doubles the track number for even
       track requests.  This is a botch for Zarch and may break untested
       games, works with Sensible Soccer and Magic Pockets though

1.20 - removed sector re-ordering code as DiscOp now searches for each sector
       during a read/write/verify operation
     - moved track initiation and sector list termination into the main APD
       decoding loop
     + SD and QD track/sector support
     = stack was being corrupt if request disc address was beyond the limit
       in the disc rec
     = disk limit check was being performed incorrectly on APD's
     - changed DiscOp 2 to match DiscOp 1
     = scatter list writes now check for foreground requests and finish
       accordingly
     + Added MemAlloc module for patching older games
     + Flush now reports an error if an APD is mounted

1.19 = rewritten nested sector code, to handle multiple nested sectors
       (fixes Wolfenstein)
     + vector handler is now compatible with RISC OS versions below 3.5
     + added pre-req modules for ZLib, namely:
        CallASWI 0.03 (which ADFFS will require later as well)
        CLib 5.53
        FPEmulator 4.19
     - Changed "MSR CPSR_flg, #1<<28" to "MOV R14, #1<<31 : ADDS R14, R14, R14"
       to ensure compatibility on ARM 3 machines

1.18 - DiscOp/MiscOp entry/exits preserve the flags via MSR / MRS
     = DiscOp was checking the CRC of the sector after the read, causing false
       CRC errors
     = MiscOp 0 was copying 60 bytes of disc sig, causing ADFS to
       report errors on ADFS:4 - reduced to 32 to fix
     + DiscOp 0 (Verify) now check sector by sector on APD images
     = DiscOp was incorrectly exiting if passed a 0 byte length request

1.17 + Scatter read now requests logical address on floppy for every scatter
       list entry
     - added zlib code to handle native APD files
     = ADFEject entry point was corrupt
     = ADFEject wasn't notifying ADFS correctly

1.16 = sector within sector now works
     + added code to reorder discs with sector rotation
     - rewritten CRC code to mirror 1772 behaviour
     = initial address check was using our internal address, not the original
       disc address

1.15 - Head position is now remembered when reading from the same track, this
       should cover duplicate sectors (Gribbly)
     + first attempt at sector within sector
     = DiscOp 1/2 were returning the wrong end address in R2
     = ADFS Dismount no longer crashes FileCore

1.14 - removed sections from Filer that are now provided by ADFS
     - removed unnecessary templates
     - rewritten MFM decode to pre-stage each track in memory, to speed up APD
       loading
     - merged big endian conversion and read word into a single function
     + sector ID and sector data CRC checking
     + track compensation for single sided disc sigs

1.13 = ADFEject now correctly dismounts the disc, to avoid Ambigious disc
       errors
     = RMkill no longer locks the machine

1.12 - recoded DiscOp Read/Write and FileCore_Create to support background
       transfers
     - changed *Format to *ADFFormat and altered respective code in Filer

1.11 - changed code to capture ADFS_xxx SWI's to FileCore_xxx SWI
     = fixed vector exit code on 26bit OS's

1.10 + added code to load (pre-inflated) APD files

1.03 + added code to redirect ADFS::0 calls to us
     = MemAlloc hung if the file length wasn't word aligned

1.02 - additional references to PRM's added to code
     - remove redundant code from ADFFlush
     + File Size limit can now be changed via ADFFS$FileSizeLimit
     + Added checked to DiscOp to ensure we don't try to read/write beyond the
       limit of the ADF image
     = Fixed crash when drag/dropping a file onto the filer.

1.01 = ADFFS would hang OS when disc is unidentified
     = D/L format detection wasn't working for some discs
     - If disc is unidentified, it now reports an error
     + Quit menu option added

1.00 = !boot and !run filetype actions were the wrong way round
     + "Format\Current format" now displays the current mounted disc image info

0.88 - Recoded format detection to allow for additional formats
     = F format now works
     + L format support added

0.87 - *Format recoded to match what ADFS does

0.86 - DragASprite implemented in save as window

0.85 - division code rewritten to an unrolled 3 instruction loop

0.84 + Format now sets the disc name to DAY_DD_YY if no name specified
     + Save As now implemented in Filer
     + Added ADFFSFiler_Open so we can track open ADF files
     + Drag/drop onto filer to open, now implemented
     + Drag/drop out of Save As implemented
     + Free indicator bars implemented

0.83 - ADFEject now releases memory
     - Add core menu code to filer
     = Introduced a bug in format, trying to fix F
     = WIMP poll code was pointing at the wrong data structure and overwriting
       the icon bar icon block
     = ADFSave was corrupting errors from the save action
     = V wasn't being cleared correctly on MiscOp FileCore actions

0.82 - Word aligned MemCopy now exits immediately, if no trailing bytes
     - Filing System number now defaults to 9
     - Added a variable to !Boot to allow for the Filing System number to be
       changed
     = Format D was using new map, instead of old
     = Now reports "File not found" when trying to open a file that doesn't
       exit
     = 32-bit compatible entry was in the wrong place in the module header

0.81 - Recoded disc name identification to use OS_FSControl(37)

0.80 + Filer module
     = When copying the source filename/path on an ADFOpen/Mount it now
       ensures its always zero terminated
     - Re-wrote the MemCopy code, optimizing for word mis-alignment
     + Small icon for FCE file type
     - Changed filetype name from "FileCoreFloppyImage" to "Floppy" due to 8
       char restriction on file type descriptions

0.70 - Initial public release


Known issues:
= Hangs when shelling from the desktop if an HD floppy is mounted on RO3.5+
  ARM710, under RedSquirrel


To do:

- Allow filenames with spaces in them (convert to hard spaces)
- Grey out menu options when floppy not mounted
- Add DiscOp 4 (write track)
- Stop "RMKill FileCore%ADFS" from killing the ADFFS module
- Need to alias RMFaster and re-implement silently via OS_Module 11 (PRM1-242)
- Store disc name, whilst recording for multi-disc support
= DiscOp 3 code needs to check that the sector found has the DiscOp 3 flag
  set, if it's been asked to return the complete track
= disc size check in Convert_Sector_to_Addr needs to calculate
  the actual address before comparing with DR_discsize
+ CDROM emulation
+ Change filer icon if floppy is bootable
= May not be compatible with Alexander Thoukydides/APDL Virtualise
= Can't change floppies in Apocalypse on RO4
+ Save machine state so games can be resumed
= Zarch not appearing on Kinetic
= Caverns scrolling isn't quite correct on RiscPC
+ SWI dispatch handler at 1F033C0
= Booting a floppy whilst holding CTRL doesn't work on the Pi
- Need to paravirtualize CPU modes to support IRQ / SVC
- change M_DIV and DIV to use our own divide routine as extASM's version
  alters the first two bits of R13
= JIT codelet re-use needs to track reuse addresses
= Zelanites not working if MonitorType 0
= IOC Abort handler isn't performing write-back
= Low Vector Page Zero Abort handler isn't performing write-back
  and only supports STMIA
= _modechange needs to check if LCDGamesModes is enabled to deterimine the
  Mode table
= DTT Tracker Module is not compatible with RO3 - it uses a DA
  (possibly resolved - a bug in the DA code was preventing user DA's)
+ Hypervised Sound Linear Handler needs removing when JIT it shutdown
+ Use FilterManager to track Wimp tasks and possibly Message_TaskInitialise
  / Message_TaskShutDown to track task handles
= OS_Module outside of the JIT, allows essential Modules to be overwritten
  (MemAlloc in The Olmpics)
+ Detect if error is returning to the desktop and shutdown JIT
= seriousErrorV_handler doesn't exit
= RMLoad doesn't work with VProtect active
+ LDR R0,[R1],R1 is deprecated Rn=Rm
= Stunt Racer 2000 (RO3.1 version) no cursor on StrongARM
= 26bit Modules, if bit 29 in Command flags=1 then the Help offset
  points to a code entry point
+ 26bit Modules, if bit 31 set in Init address, the Module is Squashed
  and Init specifies the size of the Module

To do ADF:

- Add support for capturing ADF image of a floppy

To do JFD:

- Add "Save As JFD" file
+ Delta writes
= JFD's aren't saving the header / Can't load a previously saved JFD
