PocketSized
Posts: 13
Joined: Sat Sep 15, 2012 10:36 am
Location: Norway

Trying to get an algorithm to run faster on RISC than wheezy

Tue Apr 09, 2013 10:04 pm

Hei.

For a school project me and a friend has decided to use the raspberry pi in different setups to see which one will run a specific algorithm (in C) the fastest. So far we decided to try different clock speeds (duh...), building a cluster and also try to run it on different OS's.

I read about RISC and immediately became very interested. So I booted the Pi in RISC and after a couple of hours of reading and swearing I managed to install gcc and compile the algorithm.

To my surprise its half as fast as when we run it in wheezy? Even if I exit the desktop and run it there its the same time. This is my first day with RISC so noobish would probably be a nice way to describe my knowledge in RISC. But something tells me there has to be some configs to be changed somewhere? To give the program more RAM or higher priority or so?

When i open "Task" it seems that I can play around with the RAM but I don't really understand what I am doing. My brain is about to melt at this point, so if someone could point me in the right direction on how to go about I would be very thankful! :)

Other ideas what we could try to do besides the things I mentioned earlier is also most welcomed! :)
It's here!

User avatar
GavinW
Posts: 90
Joined: Tue Nov 01, 2011 8:11 pm
Location: UK
Contact: Website

Re: Trying to get an algorithm to run faster on RISC than wh

Tue Apr 09, 2013 10:13 pm

Were you compiling with the same flags for arithmetic for both operating systems?
I do not believe the C math library for RISC OS has been compiled for vfp yet, which might explain some big differences. Somebody correct me please, if I have this wrong.
otium negare negotium vanum

PocketSized
Posts: 13
Joined: Sat Sep 15, 2012 10:36 am
Location: Norway

Re: Trying to get an algorithm to run faster on RISC than wh

Tue Apr 09, 2013 10:19 pm

We compiled them with no flags, so yes, "kind of".
It's here!

sej7278
Posts: 249
Joined: Tue Jan 22, 2013 6:43 pm

Re: Trying to get an algorithm to run faster on RISC than wh

Tue Apr 09, 2013 10:24 pm

its been a while since i've used riscos in anger, but afaik there's no way to give a task a higher priority like running it as root or nice'ing it like in linux.

gcc is far from optimised on riscos, so i'd not be surprised if it was slower than linux.

what sort of algo is it, as riscos doesn't have hardware floating point, a proper 32-bit mode, true multitasking, accelerated graphics etc.

the one thing riscos does have for it is that the desktop seems a lot quicker than lxde on raspbian (which i'd say is unusable) probably as it has lower memory/disk requirements.

pygmy_giant
Posts: 1562
Joined: Sun Mar 04, 2012 12:49 am

Re: Trying to get an algorithm to run faster on RISC than wh

Tue Apr 09, 2013 10:30 pm

Maybe try Norcroft/Acorn C bundled as part of the DDE in NutPi: https://www.riscosopen.org/content/sales/nutpi - there is also a BASIC compiler too called ABC !

I've not tried it myself but have been told its beter than GCC - not sure if its 'optomised for the Pi' though - anyone?
Last edited by pygmy_giant on Tue Apr 09, 2013 10:35 pm, edited 1 time in total.

PocketSized
Posts: 13
Joined: Sat Sep 15, 2012 10:36 am
Location: Norway

Re: Trying to get an algorithm to run faster on RISC than wh

Tue Apr 09, 2013 10:33 pm

sej7278 wrote:its been a while since i've used riscos in anger, but afaik there's no way to give a task a higher priority like running it as root or nice'ing it like in linux.

gcc is far from optimised on riscos, so i'd not be surprised if it was slower than linux.

what sort of algo is it, as riscos doesn't have hardware floating point, a proper 32-bit mode, true multitasking, accelerated graphics etc.

the one thing riscos does have for it is that the desktop seems a lot quicker than lxde on raspbian (which i'd say is unusable) probably as it has lower memory/disk requirements.
It's "Tower of Hanoi-ish"

Source code here:

Code: Select all

#include <stdio.h>
#include <sys/timeb.h>

void Hanoi(int, char, char, char);

int main(int argc, char *argv[]){
    FILE *file;
    file = fopen("benchmark.txt","a+"); /* apend file (add text to a file or create a file if it does not exist.*/
	struct timeb tmb;       //time struct
    int antPieces = 25;     //number of pices
    int antLoop = 1;        //number of loops
    double average;         //average time taken
	double startTime;       //starting time
	double endTime;         //ending time
   
   
//goes for default 25 pieces and 1 loop if no argument
//sets number of pieces if it gets one argument
    if(argc == 2)
        antPieces = atoi(argv[1]);
//set number of pieces and number of loops if it gets two arguments
    else if(argc == 3){
        antPieces = atoi(argv[1]);
        antLoop = atoi(argv[2]);
    }
    
    
    //declaring loopData
    double loopData[10];
    
    //just making space to read
     printf("\n\n\n");
    
    
    //loop which run antLoop amount of time
	int i;
    for(i = 0; i < antLoop; i++){
        //sets startTime
        startTime = ftime(&tmb);
        startTime = tmb.time + (tmb.millitm/1000.0);
        
        //runs Hanoi
        Hanoi(antPieces, 'a', 'b', 'c');
        
        //sets endTime
        endTime = ftime(&tmb);
        endTime = tmb.time + (tmb.millitm/1000.0);
        
        //store the data for average time
        loopData[i] = (endTime-startTime);
        
        //print and logging out user data
        printf("start: %f\n", startTime);
        fprintf(file,"start: %f\n", startTime);
        printf("end: %f\n", endTime);
        fprintf(file,"end: %f\n", endTime);
        printf("number of pieces run: %d\n", antPieces);
        fprintf(file,"number of pieces run: %d\n", antPieces);
        printf("you used: %f in sec!\n",(endTime-startTime));
        fprintf(file,"you used: %f in sec!\n",(endTime-startTime));
        printf("---------------------%i remaining---------------------\n", (antLoop - i - 1));
        fprintf(file,"---------------------%i remaining---------------------\n", (antLoop - i - 1));
    }
    
    // gives out the result to user
    printf("\n--------------------saving result---------------------\n");
    fprintf(file,"\n--------------------saving result---------------------\n");
            
    for(i = 0; i < antLoop; i++){
        printf ("Run #%i, tok %f sec\n", (i+1), loopData[i]);
        fprintf(file,"Run #%i, tok %f sec\n", (i+1), loopData[i]); /*writes*/
        average += loopData[i]; 
    }
    printf("average time taken = %f\n\n", (average/antLoop)); // calculates average
    fprintf(file,"average time taken = %f\n\n", (average/antLoop));
    
    fclose(file);
	return 0;
}

//Hanoi function
void Hanoi(int n, char a, char b, char c){
	if(n <= 1)
		return;
	else{
		Hanoi(n-1, a, c, b);
		Hanoi(n-1, b , a, c);
	}
}
It's here!

PocketSized
Posts: 13
Joined: Sat Sep 15, 2012 10:36 am
Location: Norway

Re: Trying to get an algorithm to run faster on RISC than wh

Tue Apr 09, 2013 10:34 pm

pygmy_giant wrote:Maybe try Norcroft/Acorn C bundled as part of the DDE in NutPi: https://www.riscosopen.org/content/sales/nutpi - there is also a basic compiler too called ABC !

I've not tried it myself but have been told its beter than GCC - not sure if its 'optomised for the Pi' though - anyone?
I'll try Acorn. Thanks!
It's here!

sej7278
Posts: 249
Joined: Tue Jan 22, 2013 6:43 pm

Re: Trying to get an algorithm to run faster on RISC than wh

Wed Apr 10, 2013 7:41 am

PocketSized wrote:
pygmy_giant wrote:Maybe try Norcroft/Acorn C bundled as part of the DDE in NutPi: https://www.riscosopen.org/content/sales/nutpi - there is also a basic compiler too called ABC !

I've not tried it myself but have been told its beter than GCC - not sure if its 'optomised for the Pi' though - anyone?
I'll try Acorn. Thanks!
norcroft is fecking expensive and pretty archaic as i recall. looking at the code i suspect all the writing to file isn't helping on riscos - have you tried doing it all in memory?

NigelJK
Posts: 65
Joined: Wed Sep 05, 2012 1:44 pm

Re: Trying to get an algorithm to run faster on RISC than wh

Wed Apr 10, 2013 7:54 am

It might be nice to convert this to BBCBasic and see where you get. Even better, see if you can re-write it in ARM machine code.
This would cover the 'optimisation' angle as BBCBasic is better optimised for the ARM processor than the current 'C' compilers (never really a native language for RiscOS, but necessary for the programmer base).

PocketSized
Posts: 13
Joined: Sat Sep 15, 2012 10:36 am
Location: Norway

Re: Trying to get an algorithm to run faster on RISC than wh

Wed Apr 10, 2013 10:35 am

sej7278 wrote:
PocketSized wrote:
pygmy_giant wrote:Maybe try Norcroft/Acorn C bundled as part of the DDE in NutPi: https://www.riscosopen.org/content/sales/nutpi - there is also a basic compiler too called ABC !

I've not tried it myself but have been told its beter than GCC - not sure if its 'optomised for the Pi' though - anyone?
I'll try Acorn. Thanks!
norcroft is fecking expensive and pretty archaic as i recall. looking at the code i suspect all the writing to file isn't helping on riscos - have you tried doing it all in memory?
When i compile in RISC i comment out the the file writing. Took me a while to figure that out.. ;)
It's here!

PocketSized
Posts: 13
Joined: Sat Sep 15, 2012 10:36 am
Location: Norway

Re: Trying to get an algorithm to run faster on RISC than wh

Wed Apr 10, 2013 10:38 am

NigelJK wrote:It might be nice to convert this to BBCBasic and see where you get. Even better, see if you can re-write it in ARM machine code.
This would cover the 'optimisation' angle as BBCBasic is better optimised for the ARM processor than the current 'C' compilers (never really a native language for RiscOS, but necessary for the programmer base).
Yep, assembly is om the menu, but only "if time". The cluster is the main projekt but its very hard to keep focus on only that. Never worked wit BBCBasic but i'll have a look! :)
It's here!

PocketSized
Posts: 13
Joined: Sat Sep 15, 2012 10:36 am
Location: Norway

Re: Trying to get an algorithm to run faster on RISC than wh

Wed Apr 10, 2013 10:40 am

One more question. In "Tasks" you can adjust the amount of memory in NEXT. What exactly does this do?
It's here!

User avatar
GavinW
Posts: 90
Joined: Tue Nov 01, 2011 8:11 pm
Location: UK
Contact: Website

Re: Trying to get an algorithm to run faster on RISC than wh

Wed Apr 10, 2013 11:27 am

I do not know if this is particularly relevant, but as BASIC was mentioned in this thread about the Hanoi benchmark I thought I would give this comparison for two interpreted languages in RISC OS on the Raspberry Pi, with times in centiseconds, running in a taskwindow:
RiscLua 3654
BASIC 11025
Here is the code for each:

Code: Select all

 
-- Hanoi in RiscLua
-- GCW 10/04/2013
local clock in os
local Pieces, Loops = arg[1] or 25, arg[2] or 1
local total = 0
local Hanoi
Hanoi = \ (n, a, b, c)
   if n <= 1 then => else
   Hanoi (n-1, a, c, b); Hanoi (n-1, b, a, c)
   end -- if
   end -- Hanoi
print "starting ..."
for i = 1, Loops do
   local startTime = clock ( )
   Hanoi (Pieces, 'a', 'b', 'c')
   local endTime = clock ( )
   total = total + endTime - startTime
end -- for
print ("Average ", total/Loops, " centiseconds")
and

Code: Select all

REM Hanoi in Basic
REM GCW 10/04/2013
ON ERROR PRINT REPORT$;" at line ";ERL:END
Pieces% = 25: Loops% = 1: Total% = 0
PRINT "Starting ..."
FOR I% = 1 TO Loops%
  startTime% = TIME
  PROCHanoi (Pieces%, "a", "b", "c")
  endTime% = TIME
  Total% += endTime% - startTime%
NEXT
PRINT "Average ", Total%/Loops%, " centiseconds"
END

DEF PROCHanoi(n%,a$,b$,c$)
  IF n% <= 1 ENDPROC
  PROCHanoi(n%-1,a$,c$,b$):PROCHanoi(n%-1,b$,a$,c$)
ENDPROC
I left out the commandline argument-handling for the BASIC version because it is such a pain in BASIC.

Thanks dr_d_gee for the hint about square brackets.

If you want to see better speeds for the Hanoi benchmark in RISC OS on the Raspberry Pi try Charm or C.
Last edited by GavinW on Wed Apr 10, 2013 2:11 pm, edited 3 times in total.
otium negare negotium vanum

dr_d_gee
Posts: 84
Joined: Fri Jan 04, 2013 1:30 pm

Re: Trying to get an algorithm to run faster on RISC than wh

Wed Apr 10, 2013 1:00 pm

It uses square brackets:

Code: Select all

[code] and 
[/code]

not angle brackets.

pygmy_giant
Posts: 1562
Joined: Sun Mar 04, 2012 12:49 am

Re: Trying to get an algorithm to run faster on RISC than wh

Wed Apr 10, 2013 6:25 pm

Re: C compilers
sej7278 said:
norcroft is fecking expensive and pretty archaic as i recall.
Norcroft/Acorn C is bundled as part of the DDE in NutPi: https://www.riscosopen.org/content/sales/nutpi - the bundle costs £40. So relatively speaking that's infinately more expensive than GCC which costs £0.00 but in absolute terms a bargain. The only reason I haven't bought it is that I have not encountered performance issues with GCC on RISCOS and so haven'e felt the need. Also psychologically I have difficulty paying for software that costs more than the machine it runs on, but it is part of a huge bundle and the DDE alone also includes the ABC BASIC compiler which is tantalising in its own right for those with time to tinker. I'll count sej7278 as a thumbs down for Acorn C, but at the moment that compares to 3 x thumbs ups that I have read from other forum users elsewhere. Their experience was that because of its native origins, for advanced coding under RISCOS that strays into the realms of the occult, Acorn C produces reliable results wheras GCC sometimes fails. For simpler tasks like this benchmark, I have no idea whether it is faster.

If you doing a serious comparison you need to compare apples with apples, so for me this would include a comparison of:

compiled C code using GCC run from Raspbian command line (no desktop)
compiled C code using GCC from RISCOS command line (no desktop)
maybe also compiled C code using Acorn C from RISCOS command line (no desktop)

compiled C code using GCC on Raspbian in a desktop window
compiled C code using GCC on RISCOS in a desktop window
maybe also compiled C code using Acorn C on RISCOS in a desktop window

I would be as interested to see how Acorn C compares to GCC under RISCOS as I would be to see how RISCOS compares with Raspbian. It would also be interesting to see how these benchmarks stack up against Interpreted languages like Lua, BASIC, squeak, PHP and Python accross OS's - my money would be on Lua under RISCOS - but I could be wrong. You could even compare interpreted BASIC and Compiled C on RISCOS against BASIC compiled using ABC on RISCOS.

There has been alot of pontificating about this subject on the forums so anyone willing to put the effort into performing, documenting and sharing benchmarks for others to replicate would be illuminating things, and would perhaps alter some pre-conceptions.

In relation to the first post I have to admit that I am disappointed to read that GCC was slower on RISCOS with your experiment. My experiece with using RISCOS is that it seems to interrupt less then Raspbian, but this is based on my experience of older builds of Raspbian - perhaps the newest build has fixed some issues and it now allows programs to run faster. I've heard rumours of work on RISCOS USB drivers to speed things up a bit but this has not been completed.
Last edited by pygmy_giant on Wed Apr 10, 2013 6:48 pm, edited 1 time in total.

timrowledge
Posts: 1286
Joined: Mon Oct 29, 2012 8:12 pm
Location: Vancouver Island
Contact: Website

Re: Trying to get an algorithm to run faster on RISC than wh

Wed Apr 10, 2013 6:47 pm

I tried this out on Squeak too, just for grins; the current Squeak 4.4 system on my Pi runs this in 5100 cSec.

By way of comparison, when I was looking to see if there was already some Squeak code to save typing it in I found a usenet message on the same subject from 1999 (party!). Snipping the relevant parts-
"Pentium 233 mmx
160 mb RAM
Windows NT 4.0 with sp3
Squeak 2.6
Towers Of Hanoi=7251mSec
VisualWorks 5i (a commercial Smalltalk using a very advanced JIT execution engine)
Towers Of Hanoi=681mSecs"
Squeak will fairly soon have a similar JIT engine on the Pi so I hope to see a similar improvement ratio. Do NOT take this as a claim that that actual numbers quoted are individually relevant since I don't know how deep a stack was used; I do know that the machine quoted managed other benchmarks in Squeak at about 25% of those my Pi manages.
Making Smalltalk on ARM since 1986; making your Scratch better since 2012

AMcS
Posts: 184
Joined: Sun Jan 06, 2013 11:23 am
Location: Dublin, Ireland

Re: Trying to get an algorithm to run faster on RISC than wh

Wed Apr 10, 2013 8:48 pm

PocketSized wrote:One more question. In "Tasks" you can adjust the amount of memory in NEXT. What exactly does this do?
It sets the amount of memory available for the Next application/Task you start.

Some applications need more than the usual default amount (if so they may complain) you can then "increase" the Next Slot (dragging it to the right) and then retry.

An application will usually contain in it's !Run file a line that calls *WimpSlot to set the amount of memory required for the application prior to actually invoking it (it can set the Minimum, maximum memory allocation for the current application and can (optionally) set the "Next" Wimpslot as well).

(If you're interested in finding out more about the *WimpSlot command it's on the ROOL website at https://www.riscosopen.org/wiki/documen ... /*WimpSlot)

Sounds like an interesting project guys - best of luck with it.

sej7278
Posts: 249
Joined: Tue Jan 22, 2013 6:43 pm

Re: Trying to get an algorithm to run faster on RISC than wh

Wed Apr 10, 2013 11:43 pm

pygmy_giant wrote: I'll count sej7278 as a thumbs down for Acorn C, but at the moment that compares to 3 x thumbs ups that I have read from other forum users elsewhere. Their experience was that because of its native origins, for advanced coding under RISCOS that strays into the realms of the occult, Acorn C produces reliable results wheras GCC sometimes fails. For simpler tasks like this benchmark, I have no idea whether it is faster..
not really a thumbs down, in its day it was the de-facto, but its not been updated in at least 7 years (even then it was based on ANSI C circa 1990, with some C99 support) and just won't compile anything that uses gnu libraries. for simple maths like this or riscos-specific code it would almost definitely be faster and more reliable than the riscos gcc port though. its come down in price too, it used to be £150+

that said, has anyone tried it, i'm not even sure it would run (outside of aemulor) let alone compile code for armv6, it worked for armv5 in 32-bit mode on the iyonix i guess.

AMcS
Posts: 184
Joined: Sun Jan 06, 2013 11:23 am
Location: Dublin, Ireland

Re: Trying to get an algorithm to run faster on RISC than wh

Thu Apr 11, 2013 1:39 am

sej7278 wrote: (Acorn C) in its day it was the de-facto, but its not been updated in at least 7 years (even then it was based on ANSI C circa 1990, with some C99 support) and just won't compile anything that uses gnu libraries. for simple maths like this or riscos-specific code it would almost definitely be faster and more reliable than the riscos gcc port though. its come down in price too, it used to be £150+

that said, has anyone tried it, i'm not even sure it would run (outside of aemulor) let alone compile code for armv6, it worked for armv5 in 32-bit mode on the iyonix i guess.
Don't have it on my Pi (I want to get the updated version for that) - but I have a 6/7 year old version that runs fine on my Iyonix (I don't have Aemulor - so 32 bit compatibility is NOT an issue for it).

As it is (currently) the only compiler that is used to produce RISC OS ROM images; including those for both early Acorn machine but also quite recent ARM based machines like Raspberry Pi (an ARM v6 processor), and OMAP based ARM systems/Beagle Board/Panda Board etc., which are ARM v7 whatever it's output is seems to work on early ARMS as well as ARM v5, 6 and 7 so I'd be happy enough to use it for this.

sej7278
Posts: 249
Joined: Tue Jan 22, 2013 6:43 pm

Re: Trying to get an algorithm to run faster on RISC than wh

Thu Apr 11, 2013 9:26 am

AMcS wrote:As it is (currently) the only compiler that is used to produce RISC OS ROM images; including those for both early Acorn machine but also quite recent ARM based machines like Raspberry Pi (an ARM v6 processor), and OMAP based ARM systems/Beagle Board/Panda Board etc., which are ARM v7 whatever it's output is seems to work on early ARMS as well as ARM v5, 6 and 7 so I'd be happy enough to use it for this.
ah yes i forgot that riscos has been compiled for rpi, so it must work duh! some details here about building for armv7 even.

dr_d_gee
Posts: 84
Joined: Fri Jan 04, 2013 1:30 pm

Re: Trying to get an algorithm to run faster on RISC than wh

Thu Apr 11, 2013 3:37 pm

My figures (512MB Raspberry Pi):
Lua 3460 cs
Basic 10446 cs (no difference whether run in task window or not)
Norcroft C 160 cs

As Norcroft C doesn't come with <sys/timeb.h> I used the SWI OS_ReadMonotonicTime to do the timing instead.

Just for comparison, some PC-based figures (Core I5 first gen, Win 7, 64bit, 6GB):
BBC Basic for Windows 3473 cs
Python 2.7 900.3cs
Visual C++ 93.5 cs
VB .NET (2012) 50.3 cs

What stands out from this, for me, is the relative speed of Norcroft, and the relative slowness of Visual C++ here. Also BBCB4W is also relatively slow.

jamesh
Raspberry Pi Engineer & Forum Moderator
Raspberry Pi Engineer & Forum Moderator
Posts: 23891
Joined: Sat Jul 30, 2011 7:41 pm

Re: Trying to get an algorithm to run faster on RISC than wh

Thu Apr 11, 2013 3:56 pm

dr_d_gee wrote:My figures (512MB Raspberry Pi):
Lua 3460 cs
Basic 10446 cs (no difference whether run in task window or not)
Norcroft C 160 cs

As Norcroft C doesn't come with <sys/timeb.h> I used the SWI OS_ReadMonotonicTime to do the timing instead.

Just for comparison, some PC-based figures (Core I5 first gen, Win 7, 64bit, 6GB):
BBC Basic for Windows 3473 cs
Python 2.7 900.3cs
Visual C++ 93.5 cs
VB .NET (2012) 50.3 cs

What stands out from this, for me, is the relative speed of Norcroft, and the relative slowness of Visual C++ here. Also BBCB4W is also relatively slow.
That Norcroft result is extraordinary. What freq is the I5 running at? And I presume they are all compiled with full optimisation?
Principal Software Engineer at Raspberry Pi (Trading) Ltd.
Contrary to popular belief, humorous signatures are allowed. Here's an example...
“I think it’s wrong that only one company makes the game Monopoly.” – Steven Wright

AMcS
Posts: 184
Joined: Sun Jan 06, 2013 11:23 am
Location: Dublin, Ireland

Re: Trying to get an algorithm to run faster on RISC than wh

Thu Apr 11, 2013 8:58 pm

sej7278 wrote: some details here about building for armv7 even.
Thanks for the link Sej !

User avatar
GavinW
Posts: 90
Joined: Tue Nov 01, 2011 8:11 pm
Location: UK
Contact: Website

Re: Trying to get an algorithm to run faster on RISC than wh

Thu Apr 11, 2013 9:35 pm

To flog the Hanoi benchmark to death, here is the code in Basic and assembler. I get one centisecond:

Code: Select all

REM Hanoi in Basic and Assembler
REM GCW 11/04/2013
ON ERROR PRINT REPORT$;" at line ";ERL:END
code% = FNasm
A% = 25: Loops% = 1: Total% = 0
B% = 1:C% = 2:D% = 3
PRINT "Starting ..."
FOR I% = 1 TO Loops%
  startTime% = TIME
  CALL code%
  endTime% = TIME
  Total% += endTime% - startTime%
NEXT
PRINT "Average ", Total%/Loops%, " centiseconds"
END

DEF FNasm
  DIM P% 60
  [ OPT 2
  .entry%
  STMFD R13!, {R0-R3,R14}
  CMP R0,#1
  LDMLEFD R13!, {R0-R3,PC}
  SUB R0,R0,#1
  EOR R2,R2,R3
  EOR R3,R3,R2
  EOR R2,R2,R3
  BL entry%
  SUB R0,R0,#1
  EOR R1,R1,R2
  EOR R2,R2,R1
  EOR R1,R1,R2
  BL entry%
  LDMFD R13!, {R0-R3,PC}
  ]
  = entry%
otium negare negotium vanum

pygmy_giant
Posts: 1562
Joined: Sun Mar 04, 2012 12:49 am

Re: Trying to get an algorithm to run faster on RISC than wh

Fri Apr 12, 2013 1:08 am

1cs?! keep flogging, keep flogging...

Return to “RISCOS”