The most impressive thing to me was the inbuilt BBC Basic, and the availability of <i>every</i> system function to basic with SWI calls.<p>This contrasts with languages like GW Basic or even commercial QuickBasic (QBX) or Visual Basic: second class citizens when it came to accessing system calls under Windows (or dos).<p>In fact, I wrote simple basic code to access the undocumented random number generator within the BCM2835 chip - it worked perfectly under RiscOS and even a dedicated BBC Basic emulutor for the Pico.<p>This is what the code looks like for those that are interested:<p>REM MAP MEMORY<p>SYS "OS_Memory",13,&20104000,32 TO ,,,RNG_CTRL%<p>SYS "OS_Memory",13,&20104004,32 TO ,,,RNG_STATUS%<p>SYS "OS_Memory",13,&20104008,32 TO ,,,RNG_DATA%<p>SYS "OS_Memory",13,&2010400C,32 TO ,,,RNG_FF_THRES%<p>SYS "OS_Memory",13,&20104010,32 TO ,,,RNG_INT_MASK%<p>REM CHECK WHERE THE REGISTERS ARE MAPPED<p>PRINT “RNG_CTRL MAPPED AT &”;STR$~(RNG_CTRL%)<p>PRINT “RNG_STATUS MAPPED AT &”;STR$~(RNG_STATUS%)<p>PRINT “RNG_DATA MAPPED AT &”;STR$~(RNG_DATA%)<p>PRINT “RNG_FF_THRES MAPPED AT &”;STR$~(RNG_FF_THRES%)<p>PRINT “RNG_INT_MASK MAPPED AT &”;STR$~(RNG_INT_MASK%)<p>REM THESE INTS BECOME REGISTERS R0-R7 RESPECTIVELY<p>A%=1<p>B%=RNG_DATA%<p>C%=RNG_INT_MASK%<p>D%=RNG_STATUS%<p>E%=RNG_CTRL%<p>F%=&1<p>G%=&4000000<p>REM GET A RANDOM NUMBER FROM THE RNG<p>DIM RNG% 30<p>P% = RNG%<p>[ OPT 1<p>SWI “OS_EnterOS”<p>LDR R0,[R1]<p>SWI “OS_LeaveOS”<p>MOV PC,R14<p>ALIGN<p>]<p>REM INIT THE RNG<p>DIM INIT% 30<p>P% = INIT%<p>[ OPT 1<p>SWI “OS_EnterOS”<p>STR R5,[R4]<p>STR R6,[R3]<p>SWI “OS_LeaveOS”<p>MOV PC,R14<p>ALIGN<p>]<p>REM LETS INIT…<p>CALL INIT%<p>A%=0<p>X%=0<p>FIRST%=0<p>REM KEEP READING RANDOM NUMBERS UNTIL THEY ACTUALLY BECOME RANDOM<p>REPEAT<p><pre><code> X%=A%
A% = USR (RNG%)
PRINT “WARMING UP &”;STR$~(A%)
IF FIRST%<50 THEN X%=A%:FIRST%=FIRST%+1
</code></pre>
UNTIL X%<>A%<p>REM DISPLAY RANDOM NUMBERS (RETURNED FROM R0)<p>REPEAT<p><pre><code> A%=USR (RNG%)
PRINT “&”;STR$~(A%);" ";
</code></pre>
UNTIL 1=0