RosettaCodeData/Task/Image-noise/Action-/image-noise.action
2023-07-01 13:44:08 -04:00

109 lines
1.5 KiB
Text

INCLUDE "D2:REAL.ACT" ;from the Action! Tool Kit
DEFINE TEXT_SIZE="40"
BYTE ARRAY text(TEXT_SIZE)
CARD FUNC GetFrame()
BYTE RTCLOK1=$13,RTCLOK2=$14
CARD res
BYTE lsb=res,msb=res+1
lsb=RTCLOK2
msb=RTCLOK1
RETURN (res)
PROC CalcFPS(CARD frames REAL POINTER fps)
BYTE PALNTSC=$D014
REAL ms,r1000
IF PALNTSC=15 THEN
frames==*60
ELSE
frames==*50
FI
IntToReal(1000,r1000)
IntToReal(frames,ms)
RealDiv(r1000,ms,fps)
RETURN
PROC FillNoise()
BYTE POINTER ptr
BYTE x,y,rnd=$D20A
ptr=PeekC(88)
FOR y=0 TO 191
DO
FOR x=0 TO 39
DO
ptr^=rnd
ptr==+1
OD
OD
RETURN
PROC PrepareScreen()
BYTE COLOR1=$02C5,COLOR2=$02C6
CARD SDLSTL=$0230,ptr
BYTE i,v
BYTE ARRAY dlist(205)
Graphics(8+16)
COLOR1=$0F
COLOR2=$00
;prepare text
FOR i=0 TO TEXT_SIZE-1
DO
text(i)=0
OD
text(6)='F-32
text(7)='P-32
text(8)='S-32
;modify display list to add one row with text on the top
dlist(0)=$70
dlist(1)=$70
dlist(2)=$42
PokeC(dlist+3,text)
ptr=SDLSTL
ptr==+3
FOR i=5 TO 202
DO
dlist(i)=Peek(ptr)
ptr==+1
OD
PokeC(dlist+203,dlist)
SDLSTL=dlist
RETURN
PROC PrintFPS(REAL POINTER fps)
CHAR ARRAY tmp(20)
BYTE i
StrR(fps,tmp)
FOR i=1 TO 5
DO
text(i-1)=tmp(i)-32
OD
RETURN
PROC Main()
BYTE CH=$02FC
CARD beg,end
REAL fps
PrepareScreen()
beg=GetFrame()
DO
FillNoise()
end=GetFrame()
CalcFPS(end-beg,fps)
PrintFPS(fps)
beg=end
UNTIL CH#$FF
OD
CH=$FF
RETURN