Page 12 of 12

Re: ADFFS 2.80 public beta

Posted: Mon May 30, 2022
by Vanfanel
@Jon

Doing some tests! Will report anything I find with this new RC.

Re: ADFFS 2.80 public beta

Posted: Fri Jun 17, 2022
by JonAbbott
Assuming no feedback is good feedback, I'll aim to make the final build available over the weekend.

Re: ADFFS 2.80 public beta

Posted: Tue Jun 21, 2022
by Vanfanel
@Jon: Saw nothing strange to report in all the games I tested. Had a good play at some of them without anything to report.
Which, as you say, is a very good thing! :)

Re: ADFFS 2.80 public beta

Posted: Tue Jun 21, 2022
by JonAbbott
Thanks, I've just made the final release available via the usual channels. The only difference between it and RC3 is Null dereference checking is turned off - just in case we missed any game bugs during testing.

Re: ADFFS 2.80 public beta

Posted: Fri Jul 15, 2022
by JonAbbott
Issues noted with SWIV:
  • F1 is not pausing the game and needs holding to do anything (fixed by moving the EventV game code call into the main game loop)
    • the screen update code sits under in IRQ event (EventV originally, Device 3 under the JIT). Pressing F1 puts the code into a loop at 1415C. Ignoring the fact that IRQ code should never loop like this, the IRQ handler doesn't check for re-entrancy and subsequently fills the stack and crashes
    • the game essentially needs rewriting to run under USER or a CallBack that handles re-entrancy
  • Speed issue on physical RiscPC (fixed by adding OS_Byte 19 to main game loop)
    • possibly related to the EventV code being moved to Device 3 to avoid the game causing C based Modules to crash
  • Disc protection check can fail if the game is installed to an ADFS attached HD (fixed vicariously by decrypting Loader for game patching)
    • bug in Loader which only performs the protection check if ADFS is the Temporary Filing System
    • The disk may need reimaging as the check fails when ADFS is forced as the TFS (disk image is good, must be another protection check failing)
    • behaviour of OS_Args 0,0 changed from RISC OS 3 which needs adding to ADFFS
  • 1C1B0 Aborts writing to the screen when exited on a physical RiscPC (fixed vicariously)
    • At the point the Abort occurs, the game's EventV code hasn't been removed and the game hasn't issued OS_Exit, so possibly an Abort being reported and it's not reset the machine fully?
  • Joystick mis-detection on RiscPC (fixed by correcting code)
    • bug in the code that checks for RTFM. It's calling Joy_Read0 when it should be calling Joy_Test
  • Joysticks are being detected with USBJoystick loaded (can't currently be fixed)
    • USBJoystick emulates VTJoystick_Status, Joy_Test and Joystick_Read and there's no SWI to actually detect if a Joystick is attached, so this can't currently be fixed
  • Crashes on the high-score page under RISC OS 3.x (fixed vicariously)
    • this appears to be related to the hardware IRQ vector code that performs the palette swap mid-frame on that screen. I suspect it's corrupting the stack or not handling re-entrancy
  • T1 based palette swap code doesn't account for the pixel clock rate (fixed)
    • Palette swap Y location drifts on a RiscPC. Corrected T1 values for EGAonVGA, which ADFFS uses for MODE 9
    • Palette swap Y offset is slightly out on the highscore page on a GPU. Initial T1 offset adjusted to fix
  • StrongARM issues
    • Crashes when launched if the ADFFS400 Module isn't loaded directly before running the game. Almost certainly CPU cache or IRQ related (to be investigated)
    • Crashes when exited if a key is pressed (fixed)
    • Screen caching causing flickering (fixed by turning off screen caching)
  • ARM6/7 macrocell issues
    • hardlocks when the Event 4 code is called to set the default palette (fixed in ADFFS 2.81)
    • IRQv T1 palette swap code is not working (fixed by running code natively)
  • Title loop runs slightly too fast (fixed by implementing a PLL)

Work-in-progress !Run replacement script:
NOTE: This won't currently work on StrongARM as ADFFS 2.80 falls foul of a CPU errata
  • Updated 18/07/22 to add frame pacing into main game loop, instead of relying on ADFFS
  • Updated 23/07/22:
    • implemented a PLL to update the screen and elements so they match the original on an 8MHz ARM2
    • corrected the music fade-out pause when starting a game
    • game now runs natively on ARM610/710
    • T1 palette swap values corrected for AutoVIDC (used by ADFFS on A-series) and EGA on VGA timings (used by ADFFS on RPC)
    • Switched back to original MusMod2 on A-series to reduce T1 drift cause by QTM

Code: Select all

IF "<Obey$Dir>"="@" THEN ADFS
IF "<Obey$Dir>"="@" THEN Set Obey$Dir ADFS::0.$.!Swiv

Set Swiv$Dir <Obey$dir>
DIR <Swiv$Dir>

RMAFree 200
IF ADFFS$OSVersion>=&35000 THEN RMEnsure QTMTracker   1.43 RMLoad ADFFS:trackers.QTMModule
IF ADFFS$OSVersion>=&35000 THEN RMEnsure MusicModule2 0.06 RMLoad ADFFS:trackers.Musmod2
IF ADFFS$OSVersion>=&35000 THEN Mus2QTM_SWI_Alternative
IF ADFFS$OSVersion>=&35000 THEN Mus2QTM_Linear_Effects 0
IF ADFFS$OSVersion<&35000 THEN RMEnsure MusicModule 1.02 RMLOAD <Swiv$Dir>.MusMod2
Set JSflag 0
IF ADFFS$OSVersion<&50000 THEN RMEnsure Joystick 0.0 Set JSflag 1
IF JSflag>0 THEN RMLoad ADFFS:extras.JoyMod

WimpSlot -min 541k -max 541k
| Decrypt Loader
LOAD <Swiv$Dir>.Loader 6FCC8
LOAD <Swiv$Dir>.Loader 8000
MEMORYA 8000 6FCD0 { > null: }
MEMORYA 8004 E51F000C { > null: }
MEMORYA 8034 EF000011 { > null: }
GO 8004
MEMORYA 8000 6FD04 { > null: }
GO 8004
MEMORYA 8000 6FD38 { > null: }
GO 8004
MEMORYA 8000 6FD6C { > null: }
GO 8004
MEMORYA 8000 6FDA0 { > null: }
GO 8004
| Unpack game code
MEMORYA 7020C E28FE004 { > null: }
MEMORYA 70210 E52DE004 { > null: }
MEMORYA 70218 EF000011 { > null: }
MEMORYA 70674 E28FE004 { > null: }
MEMORYA 70678 E52DE004 { > null: }
MEMORYA 706B0 E28FE004 { > null: }
MEMORYA 706B4 E52DE004 { > null: }
MEMORYA 706C0 E28FE004 { > null: }
MEMORYA 706C4 E52DE004 { > null: }
MEMORYA 706D0 E28FE004 { > null: }
MEMORYA 706D4 E52DE004 { > null: }
MEMORYA 706F0 E28FE004 { > null: }
MEMORYA 706F4 E52DE004 { > null: }
MEMORYA 70710 E28FE004 { > null: }
MEMORYA 70714 E52DE004 { > null: }
MEMORYA 70738 E28FE004 { > null: }
MEMORYA 7073C E52DE004 { > null: }
GO 701EC

| Fix reads from unset variables
MEMORYA 19C10 EA01D4FA { > null: }
MEMORYA 8F000 E59C8374 { > null: }
MEMORYA 8F004 E3380000 { > null: }
MEMORYA 8F008 0AFE2B15 { > null: }
MEMORYA 8F00C EAFE2B00 { > null: }

MEMORYA 2163C EB01B673 { > null: }
MEMORYA 21694 EB01B65D { > null: }
MEMORYA 237F4 EB01AE05 { > null: }
MEMORYA 29D64 EB0194A9 { > null: }
MEMORYA 2A030 EB0193F6 { > null: }
MEMORYA 2A070 EB0193E6 { > null: }
MEMORYA 8F010 E59B8200 { > null: }
MEMORYA 8F014 E3380000 { > null: }
MEMORYA 8F018 11A0F00E { > null: }
MEMORYA 8F01C E20E807C { > null: }
MEMORYA 8F020 E79FF008 { > null: }
MEMORYA 8F068 21670 { > null: }
MEMORYA 8F040 216A8 { > null: }
MEMORYA 8F0A0 23808 { > null: }
MEMORYA 8F090 29D74 { > null: }
MEMORYA 8F05C 2A044 { > null: }
MEMORYA 8F09C 2A174 { > null: }

| Add a delay to the music fade-out loop
MEMORYA 12378 E3A00002 { > null: }
MEMORYA 1237C EF0593CB { > null: }

| Move game code out of EventV
MEMORYA 8618 EA021AB8 { > null: }
MEMORYA 8474 E8BD9FFF { > null: }
MEMORYA 8F100 EF000042 { > null: }
MEMORYA 8F104 E2803006 { > null: }
MEMORYA 8F108 E2804002 { > null: }
MEMORYA 8F10C E58F30EC { > null: }
MEMORYA 8F110 E58F40EC { > null: }
MEMORYA 8F114 E92D8000 { > null: }
MEMORYA 8F118 E1A00000 { > null: }
MEMORYA 8F11C EAFDE632 { > null: }
MEMORYA 8F120 E59F30D8 { > null: }
MEMORYA 8F124 E59F40D8 { > null: }
MEMORYA 8F128 EF000042 { > null: }
MEMORYA 8F12C E1500004 { > null: }
MEMORYA 8F130 2BFDE54F { > null: }
MEMORYA 8F134 E1500004 { > null: }
MEMORYA 8F138 22844002 { > null: }
MEMORYA 8F13C E1500003 { > null: }
MEMORYA 8F140 3AFFFFF8 { > null: }
MEMORYA 8F144 E2833006 { > null: }
MEMORYA 8F148 EBFDE569 { > null: }
MEMORYA 8F14C EAFFFFEB { > null: }

| Switch from IRQv to IRQ1V
MEMORYA 19B78 E51FF004 { > null: }
MEMORYA 19B80 E3A01C01 { > null: }
MEMORYA 19BB4 E1A00000 { > null: }
MEMORYA 19BBC EA000003 { > null: }
MEMORYA 19BDC E3A01C01 { > null: }

| Bugfix Key debounce code
MEMORYA 80EC E33100FF { > null: }
MEMORYA 80F0 1A000001 { > null: }

| Bugfix RTFM detection
MEMORYA 1E448 E92D0400 { > null: }
MEMORYA 1E44C E3A0A000 { > null: }
MEMORYA 1E450 E3A00000 { > null: }
MEMORYA 1E454 EF063F40 { > null: }
MEMORYA 1E458 73A0A001 { > null: }
MEMORYA 1E45C EF0A1540 { > null: }
MEMORYA 1E460 73A0A002 { > null: }
MEMORYA 1E464 E3A00001 { > null: }
MEMORYA 1E468 EF0EFFC2 { > null: }
MEMORYA 1E46C E3300000 { > null: }
MEMORYA 1E470 03A0A003 { > null: }
MEMORYA 1E474 E50CA008 { > null: }
MEMORYA 1E478 E8BD8400 { > null: }

| Correct T1 palette swap timer
IF ADFFS$LCDGM="Y" OR ADFFS$VIDC20 THEN MEMORYA 19B40 E1A0E30E { > null: }
IF ADFFS$LCDGM="Y" OR ADFFS$VIDC20 THEN MEMORYA 19C3C E1A00300 { > null: }
IF ADFFS$OSVersion>=&50000 THEN MEMORYA 19C40 E2800D6E { > null: }
IF ADFFS$VIDC20 THEN MEMORYA 19C40 E2800D9F { > null: }
IF ADFFS$LCDGM="Y" THEN MEMORYA 19C40 E2800DBF { > null: }

IF ADFFS$CPUID=&A10 THEN ADFScreenCaching Off
IF ADFFS$OSVersion>=&35000 THEN ADFRemapVideoMemory 9 160 ELSE ScreenSize 160
IF ADFFS$CPUID>=&A10 THEN GOARM3JIT 0
GO 8000
IF ADFFS$CPUID=&A10 THEN ADFScreenCaching On
IF ADFFS$CPUID>=&A10 THEN GOARM3JIT
IF ADFFS$OSVersion>=&35000 THEN ADFRemapVideoMemory
RMKill MusicModule2
IF ADFFS$OSVersion>=&35000 THEN RMKill QTMTracker
IF JSflag>0 THEN RMEnsure Joystick 0.0 Set JSflag 0
IF JSflag>0 THEN RMKill Joystick
Unset JSflag
Unset Swiv$Dir
Back