RosettaCodeData/Task/Rate-counter/Action-/rate-counter.action
2023-07-01 13:44:08 -04:00

104 lines
1.7 KiB
Text

INCLUDE "D2:REAL.ACT" ;from the Action! Tool Kit
DEFINE PTR="CARD"
CARD FUNC GetFrame()
BYTE RTCLOK1=$13,RTCLOK2=$14
CARD res
BYTE lsb=res,msb=res+1
lsb=RTCLOK2
msb=RTCLOK1
RETURN (res)
CARD FUNC FramesToMs(CARD frames)
BYTE PALNTSC=$D014
CARD res
IF PALNTSC=15 THEN
res=frames*60
ELSE
res=frames*50
FI
RETURN (res)
CARD FUNC ItersPerSecond(CARD timeMs,iters)
REAL rTime,rIters,r1000,tmp
CARD res
IntToReal(timeMs,tmp)
IntToReal(iters,rIters)
IntToReal(1000,r1000)
RealDiv(tmp,r1000,rTime)
RealDiv(rIters,rTime,tmp)
res=RealToInt(tmp)
RETURN (res)
;jump addr is stored in X and A registers
PROC Action=*(PTR jumpAddr)
DEFINE STX="$8E"
DEFINE STA="$8D"
DEFINE JSR="$20"
DEFINE RTS="$60"
[STX Action+8
STA Action+7
JSR $00 $00
RTS]
PROC Benchmark(PTR ARRAY actions,times BYTE count CARD iters)
BYTE i
CARD j,beg,end,diff,diffMs
PTR act
FOR i=0 TO count-1
DO
act=actions(i)
beg=GetFrame()
FOR j=0 TO iters-1
DO
Action(act)
OD
end=GetFrame()
diff=end-beg
times(i)=FramesToMs(diff)
OD
RETURN
PROC Action1()
RETURN
PROC Action2()
INT a=[12345],b=[23456],c
c=a+b
RETURN
PROC Action3()
INT i=[12345]
CHAR ARRAY s(6)
StrI(i,s)
RETURN
PROC Main()
DEFINE COUNT="3"
DEFINE ITERS="10000"
PTR ARRAY actions(COUNT)
CARD ARRAY times(COUNT),prec,rate
BYTE i
Put(125) PutE() ;clear the screen
prec=FramesToMs(1)
PrintF("Iteration count: %U%E",ITERS)
PrintF("Clock precision: %U ms%E%E",prec)
actions(0)=Action1
actions(1)=Action2
actions(2)=Action3
Benchmark(actions,times,COUNT,ITERS)
FOR i=0 TO COUNT-1
DO
rate=ItersPerSecond(times(i),iters)
PrintF("Action%B: %U ms, %U times per sec%E",i+1,times(i),rate)
OD
RETURN