+ addition
- notes/change
= bugfix
# botch

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.7 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
= Sometimes reports Broken Directory when mounting a floppy


To do:

- Allow filenames with spaces in them (some file systems allow them)
- 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
- RMClear needs recoding to not kill ourself or required modules
  (temporarily disabled)
- RMTidy is killing ADFFS Filer and dismounting the image
  (temporarily disabled)
- Emulator 1772 / 710/11 behaviour, ie errors returned and DiscOp3 behaviour
= 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
+ Add a FileCore filesystem to view appended Boot script (also allowing
  additional files)
= May not be compatible with Alexander Thoukydides/APDL Virtualise
+ Option to force LCDGameModes on, for VIDC20
= Can't change floppies in Apocalypse on RO4
+ Save machine state so games can be resumed
= Zarch not appearing on Kinetic
= Reloading ADFFS, then mounting a floppy sometimes results in
  a Broken Directory error
= Caverns scrolling isn't quite correct
+ Pause VideoRemapping when at the desktop
+ ZIP extraction using ZLib see:
    https://www.pkware.com/documents/casestudies/APPNOTE.TXT
= OS_FSControl etc should only be intercepted if its called from a task
  we've spawned
+ SWI dispatch handler at 1F033C0
= Booting a floppy whilst holding CTRL doesn't work on the Pi
+ hv_OS_AddCallBack and hv_OS_CallAfter need to clean the vector entry after
  they've been called, currently they remain and are reused if seen again
= swapping to a floppy that doesn't exist either hangs ADFFS or leaves the
  hourglass on
+ JIT needs to alter R14 when PC is set outside of appspace
  (this will fix Speedball 2)
  Move PC/R14 code to a central function and get the CODELET to branch to
  it, once they've constructed the new PC
- Need to paravirtualize CPU modes to support IRQ / SVC
+ OS_SetEnv needs hypervising, OS version doesn't work on RO3.5+
= change M_DIV and DIV to use our own divide routine as extASM's version
  alters the first two bits of R13
- Make use of OS_PlatformFeature 0 on the Pi?
= BASIC is crashing when reinitialized as the JIT shuts down
+ OS_Claim needs recoding so it doesn't require a codelet
= JIT codelet re-use needs to track re-use addresses
= page_zero_abort STM handler only supports STMIA

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
