[comp.binaries.atari.st] v02i059: timecode -- Determine 68000 code speed

koreth@ssyx.ucsc.edu (Steven Grimm) (09/07/88)

Submitted-by: uunet!mcvax!philmds!leo (Leo de Wit)
Posting-number: Volume 2, Issue 59
Archive-name: timecode

The following program, timecode, is mainly meant for the programmer crowd.
It lets you time a series of 68000 instructions (entered as short hex numbers)
which of course should constitute valid (and sensible) code; the result is
displayed as a number of clock ticks. The posting consists of a uuencoded
program and a manual page.

The corresponding source has been sent to the moderator of
comp.sources.atari.st.
Compiled with the Lattice C compiler; I used a different startup.bin to
obtain a smaller program (not included).

For correspondence conceirning this program (bugs, questions etc.) try

      L. J. M. de Wit
      Nachtegaallaan 7
      5731XP Mierlo
      Holland
      e-mail: ..!mcvax!philmds!leo
              (or perhaps  ..!hp4nl!philmds!leo)

The manual page:

------------------------- S t a r t s  h e r e ------------------------------
******************************************************************************
*                                                                            *
*    timecode.c version 1.0 of 27 August 1988   (C) L.J.M. de Wit 1988       *
*                                                                            *
* This software may be used and distributed freely if not used commercially  *
* and the originator (me) is mentioned.                                      *
*                                                                            *
******************************************************************************
 
   NAME
      timecode - time execution of MC68000 code
  
   SYNTAX
      timecode [-repeat] <shorthex1> <shorthex2> ...
  
   DESCRIPTION
      Timecode times the time needed to execute a series of MC68K instructions.
      The time taken is expressed in clock ticks.
      The repeat flag is optional; it is a number indicating how many times
      the series will be repeated (default 100000) so that timing can be
      accurate; a lower repeat count will fasten the execution but leads to
      less accuracy.
  
      One of the advantages of timecode is that timings can be calculated
      online.
  
   RESTRICTIONS
      1) Up to 32 codes can be timed at once. This is generally no objection,
         since most of the time one times only one instruction at a time.
      2) When using opcodes that read from or write to memory the pointers
         used will have to be prepared correctly. A convenient way is to
         time the instruction to load the address register, then time both
         the address register load and the instruction that references
         memory via that pointer. Subtract the first from the second to
         obtain the actual number of ticks for the 'mem-ref' instruction.
         This whole story applies to whatever code needs proper
         initialization. A safe place for memory references is the screen
         memory.
      3) Take care when using branches and stuff like jsr, rts etc.
         Your code should handle that one way or another.
      4) All registers may be used except the stack pointer. SP may be
         used if it restored also. The items currently on the stack must
         be left undisturbed; if you need to access (SP), first lower SP,
         and increment it afterwards.
  
      DERIVATION OF TIMING FORMULA.
  
      The formula used for the calculation of the number of ticks is
      (using integer division):
         ticks = (7791*total + (repeat / 2))/repeat - 32;
      where
         ticks : # of ticks one execution of the series takes
         total : # of milliseconds the complete test takes
         repeat: # of repetitions of the series
  
      This has been derived as follows:
         total # of effective ticks for the test =
         (total - call) * eff * 8000 =
         repeat * (ticks + extra)
      where
         call  : # of milliseconds lost by calling the test function
                 and saving registers. This is negligable.
         eff   : a coefficient (max. 1) that indicates how many ticks of
                 the processor are really used - the others are lost in
                 interrupt handling. Measuring gave 0.9739 as value; if the
                 vbl semaphore was set it increased to 0.9863. The former
                 value has been used.
         extra : # of ticks needed to handle each repetition.
                 For this program its value is 32.
      The 8000 is in fact due to the processor's clock frequency (8Mhz);
      a factor 1000 can be found in the number total, which is expressed
      in milliseconds instead of seconds.
      Filling in eff and extra and adding (repeat / 2) to the nominator
      to achieve rounding of the integer division rather than truncating
      yields the formula used.
   

   Because stdio and memory allocation were not needed, the module was
   linked with a different startup.bin that does not load unnecessary code.
   In this way the program size has decreased from 12666 to 3391.
   
------------------------- E n d s      h e r e ------------------------------

The binary:

------------------------- S t a r t s  h e r e ------------------------------
begin 640 timecode.ttp
M8!H   SJ                             $Y6__P@;@ (("@ # :    !
M -"H !30J  <!H   !$ +4#__"(Y   +VK* ;Q9#[O_\( F0K@ (+4#__+* 
M; 0M0?_\+R[__"\N  A"IW!*+P!.N0  !\I/[P 00?D   H.(FX "-/N__PO
M"4Z06(\O+@ (8098CTY>3G5.5OWF(&X "")H "PM2?WPL_P     9@9"+OWT
M8"!![OWT+4C]["!N_>Q2KOWL(F[]\! 1$(!2KOWP2@!FZ"!N  @O2   T/P 
M@")O  "QZ0 @9@  _D'N_W23R2U)_W1"+OWK< $M0/_\+4C_]"U)__@,K@  
M "#__&P  )P@;@ ($"@ @$B 2, B+O_XLH!D  "&!H$   "!T<$0$$H 9R0,
M   @9QX,   )9Q@@+O_X!H    "!(&X "-' $! ,   *9B!*+OWK9T1P "(N
M__@&@0   ($@;@ (T<$0@!U _>M@*DHN_>MF)!U\  ']ZR N__SE@%*N__Q!
M[O]TT< B;@ (TOP @=/N__@@B5*N__A@ /]<("[_^ :     @2!N  C1P$(0
M#*X    @__QF2$AY   *%G )+P!.N0  !\I0CW !+P!A  $,6(]@*B!N  @M
M:  @__1"KO_\(&[_]$J09PI2KO_\6*[_]&#N(&X ""UH "#_]$(N_>M"KO_X
M0>[]]"U(_? ,K@   "#_^&Q6(&[]\! 02@!G3 P  "!G# P   EG!@P   IF
M%$HN_>MG+G  (&[]\!" '4#]ZV @2B[]ZV8:'7P  ?WK("[_^.6 4J[_^$'N
M_O31P""N_?!2KOWP8* ,K@   "#_^&8:2'D   HU< DO $ZY   'RE"/< $O
M &%*6(]![O[T(\@   SB("[__.6 0>[_=-' D\D@B2 N__CE@$'N_O31P"")
M2&[^]$AN_W0O+O_\3KD   +L3^\ #$*G8098CTY>3G5.5@  +RX "'!,+P!.
MN0  !\I0CTY>3G5.5O_P+7P  8:@__AP 2U __ ,K@    $ "&\D(FX #"!I
M  00$ P  "UF%%*N__!2B"\(3KD   9"6(\M0/_X("[_\"(N  B2@.6 (&X 
M#-' +R[_^"\(+P%A7D_O  PM0/_\(CP  !YO3KD   E*(CP  0 ")"[_^.*J
MT((B+O_X3KD   BZ!(     @+P M0/_T80 !N%B/2'D   I@< DO $ZY   '
MRE"/0J=.N0  !\I8CTY>3G5.5O^<#*X    @  AO#D*G2'D   II80 " %"/
M0>[_I#"\2.=4B#"\__Y4B#"\+R]4B#"\ $!4B$*N__PM2/^@("[__+"N  AL
M)B!N_Z!4KO^@Y8 B;@ ,T\ O$2](  1A9EB/(&\  #" 4J[__&#0(&[_H#"\
M4Y=4B" N  CC@"(\  !F_)* ,(%4B#"\6(]4B#"\3-]4B#"\?_]4B#"\3G54
MB"U(_Z!A  $L0>[_I"\N ! M0/_X3I!8CV$  1B0KO_X3EY.=4Y6__1";O_^
M+6X "/_X0J[_]"!N__@0$$H 9P  J RN    !/_T9A O+@ (2'D   IX80 !
M'%"/(&[_^! 02(!2KO_X/4#__ Q  #EO%@Q  $%L$"\N  A(>0  "HMA  #P
M4(\P+O_\#$  86T,#$  >FX&!F[_X/_\,"[__ Q  $%M!%]N__PP+O_\!$  
M,#U __Q*0&L&#$  #V\0+RX "$AY   *GF$  *90CS N__[I0-!N__P]0/_^
M4J[_]&  _U P+O_^3EY.=4Y6   @+@ (#(     *90YR"DZY   (NB\ 8>18
MCR N  AR"DZY   (N@:!    ,"\!< (O $ZY   'RE"/3EY.=4Y6__A"IW @
M+P!.N0  !\I0CR!\   $NBU __@@$'(%3KD   E*+R[_^'(@+P$M0/_\3KD 
M  ?*4(\@+O_\3EY.=4Y6_[!(>0  "K%(;O^P3KD   F"4(\O+@ (2&[_L$ZY
M   '0E"/2JX #&<B2'D   J\2&[_L$ZY   '0E"/+RX #$AN_[!.N0  !T)0
MCTAY   *OTAN_[!.N0  !T)0CTAN_[!P"2\ 3KD   ?*4(]P 2\ <$PO $ZY
M   'RE"/3EY.=4Y6__PO+@ (3KD   <26(](;O_\+P M0  (3KD   9N4(\@
M+O_\3EY.=0  3E;_\'  (&X "!(0+4#_^"U __ M0/_\# $ +68,< $M0/_X
M+4#_\& 2(&X "! 0#   *V8&< $M0/_X("[_^"!N  C1P!(02(%(P5*!($'1
M_   "]X2$ @!  )G+" N__QR"DZY   (^B!N  C1[O_X4J[_^!(02(%(P02!
M    ,-"!+4#__&"R2J[_\&<$1*[__"!N  P@KO_\("[_^$Y>3G5.5@  (&X 
M"! 02(!(P%* (D#3_   "]X0$0@   -G!E*N  A@WB N  A.7DYU  !.5O_\
M+RX "$ZY   )ZEB/(&X "-' +4C__"!N__Q2KO_\(FX #! 1$(!2K@ ,2@!F
MZ" N  A.7DYU3E;__"\N  A.N0  ">I8CR!N  C1P"U(__P@+@ 04ZX $$J 
M;QH@;@ ,$! B;O_\$H!2K@ ,2@!G!E*N__Q@VB!N__Q"$" N  A.7DYU0_D 
M  K"(\\   SF($\P+P &XT 2,0  $#$  6<  ")(@%- - !40N5")# @  $!
M9P  ""\"8   !#\"4T!JY#\H  9.02YY   ,YDYU0_D   MR(\\   SF($\P
M+P &XT 2,0  $#$  6<  ")(@%- - !40N5")# @  $!9P  ""\"8   !#\"
M4T!JY#\H  9.32YY   ,YDYU0_D   N*(\\   SF($\P+P &XT 2,0  $#$ 
M 6<  ")(@%- - !40N5")# @  $!9P  ""\"8   !#\"4T!JY#\H  9.3BYY
M   ,YDYU       0+P(O TJ!9R)*@&<<0H)V'^. XY*T@64(E($&@     %1
MR__N(@)@!$*!0H F'R0?3G4                 %$CG>  H +.$2H!G,&H"
M1( D $J!9@1"@& B:@)$@28 QL%(0L3!2$)"0M:"2$' P4A 0D#0@TJ$:@)$
M@$S? !Y.=0                 /2.=P "0 9R!*@68$0H!@&"8 QL%(0L3!
M2$)"0M:"2$' P4A 0D#0@TS?  Y.=0            !.5O_\+6X "/_\(&[_
M_%*N__PB;@ ,$!$0@%*N  Q* &;H("X "$Y>3G5.5O_\+6X "/_\2JX $&\@
M(&X #! 0(F[__!* 4JX #$H 9PQ2KO_\3G%3K@ 08-H@;O_\0A @+@ (3EY.
M=4Y6__Q"KO_\(&X "-'N__P0$$H 9P92KO_\8.P@+O_\3EY.=2!7+F\ !$[0
M;F5W<W1A<G0Z('1O;R!M86YY(&%R9W5M96YT<PT* &YE=W-T87)T.B!T;V\@
M;6%N>2!E;G9I<F]N;65N="!V87)I86)L97,-"@ @=&EC:W,-"@!T;V\@;6%N
M>2!C;V1E<P!I;G9A;&ED(&AE>"!N=6UB97( :6YV86QI9"!H97@@;G5M8F5R
M &EN=F%L:60@:&5X(&YU;6)E<@!T:6UE8V]D93H@ #H@  T*         0  
M  $  0 !      $! 0$          0                             !
M 0             ! 0                            $    !        
M 0(           $"      $! 0$! 0$" 0(  08#!@,! 0$# 0,    !  (!
M @$! 0$& PX$ 0$   $"                   & P(# 0$  0 !  ("!0("
M     0 !  $    !!@,  0        ,# 0$  @,' P<      @(" @ !  8'
M P   P0#!P    (! 0     " @ !  $  @ !  $(! $!  $    "      $!
M         " @(" @(" @("@H*"@H(" @(" @(" @(" @(" @(" @2! 0$! 0
M$! 0$! 0$! 0$(2$A(2$A(2$A(00$! 0$! 0@8&!@8&! 0$! 0$! 0$! 0$!
M 0$! 0$! 0$0$! 0$!""@H*"@H(" @(" @(" @(" @(" @(" @(" A 0$! @
M(" @(" @(" @*"@H*"@@(" @(" @(" @(" @(" @("!($! 0$! 0$! 0$! 0
M$! 0A(2$A(2$A(2$A! 0$! 0$!"!@8&!@8$! 0$! 0$! 0$! 0$! 0$! 0$!
M 1 0$! 0$(*"@H*"@@(" @(" @(" @(" @(" @(" @("$! 0$"          
M         "8N"@%6"K@*%# @0#88& H*'.0L2CP2$A86$A0*$ X*$ @*$! 4
0$F(44B8Z1@9 " 9 " 9     
 
end
------------------------- E n d s      h e r e ------------------------------