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%)