REM > listphysmem
:
REM This program displays the addresses of the different areas and
REM types of physical memory under RISC OS. It lists the physical
REM address of each block it finds and the number of pages in that
REM block.
REM This program only works on RISC OS 3.5 and later.
REM It will give rubbish results under RISC OS 4.03 unless memfix
REM has been installed.
:
DIM drama%(1000),dramp%(1000),vrama%(1000),vramp%(1000),roma%(1000),romp%(1000),ioa%(1000),iop%(1000)
D%=0 :REM Number of blocks of dynamic RAM
V%=0 :REM Number of blocks of video RAM
R%=0 :REM Number of blocks of ROM
I%=0 :REM Number of blocks of I/O space
cur%=-1
addr%=0
count%=0
pageno%=0
SYS"OS_Memory",6 TO ,size%,page%
PRINT"Memory table size = ";size%;" Page size = ";page%
DIM block% size%+100
SYS"OS_Memory",7,block%
FOR P%=0 TO size%-1
B%=block%?P%
PROCidentify(B%)
PROCidentify(B%>>4)
NEXT
IF D%=0 THEN PRINT"No dynamic RAM found" ELSE PRINT D%;" blocks of DRAM found"
IF V%=0 THEN PRINT"No VRAM found" ELSE PRINT V%;" block of VRAM found"
PRINT I%;" blocks of ROM found"
IF D%=0 THEN STOP
PRINT'"Dynamic RAM:"
C%=0
FOR N%=0 TO D%-1
PRINT FNhex(drama%(N%), 8);" ";dramp%(N%);" pages"
C%+=dramp%(N%)
NEXT
PRINT;C%;" pages found"'
IF V%=0 THEN
PRINT"No video RAM found"
ELSE
PRINT"Video RAM:"
C%=0
FOR N%=0 TO V%-1
PRINT FNhex(vrama%(N%), 8);" ";vramp%(N%);" pages"
C%+=vramp%(N%)
NEXT
PRINT;C%;" pages found"''"ROM:"
ENDIF
C%=0
FOR N%=0 TO R%-1
PRINT FNhex(roma%(N%), 8);" ";romp%(N%);" pages"
C%+=romp%(N%)
NEXT
PRINT;C%;" pages found"''"IO Space:"
C%=0
FOR N%=0 TO I%-1
PRINT FNhex(ioa%(N%), 8);" ";iop%(N%);" pages"
C%+=iop%(N%)
NEXT
PRINT;C%;" pages found"
END
:
DEF PROCidentify(X%)
X%=X% AND 7
IF X%>4 THEN PRINT"Odd memory type ";X%;" at ";pageno%: STOP
IF X%<>cur% THEN
CASE cur% OF
WHEN 1:
drama%(D%)=addr%*4096
dramp%(D%)=count%
D%+=1
WHEN 2:
vrama%(V%)=addr%*4096
vramp%(V%)=count%
V%+=1
WHEN 3:
roma%(R%)=addr%*4096
romp%(R%)=count%
R%+=1
WHEN 4:
ioa%(I%)=addr%*4096
iop%(I%)=count%
I%+=1
ENDCASE
cur%=X%
addr%=pageno%
count%=0
ENDIF
count%+=1
pageno%+=1
ENDPROC
:
DEF FNhex(X%,W%)=RIGHT$(" "+STR$~X%,W%)