antoine-source/appleworksgs/Macros/m16.profile

1 line
5.3 KiB
Plaintext
Raw Normal View History

2023-03-04 02:45:20 +00:00
;--------------------------------------------------------------------------- ; m16.profile - by Mike Hibbetts ; ; created 2/24/89 MRH ; updated 2/28/89 MRH (silly notational change) ; 3/1/89 KAW changed profiling routines to use jsr/rts instead ; of jsl/rtl when Profile='s' ; added call counts ; added optional suffix to allow multiple copies ; 9/29/89 KAW changed ProfileData to interleave values. ; ; The following macros aid in profiling code on the Apple IIGS by using ; tick counts to determine the amount of time that is spent in a routine. ; The macros will generate code only if the symbol 'Profile' is defined ; and has a non-zero value. (You can asmiigs with the '-d Profile' ; option to create the symbol, or define the symbol in the source.) ; ; If multiple copies of the profiling code are required (e.g. two modules ; each with profiling code, to be linked together), an optional suffix ; argument may be provided to each of the following macros. The suffix, ; which must the same in each case, will distinguish between copies of ; the profiling code ; ; ; Macros: ; ; ProfileData m[,suffix] ; - This needs to be placed in the code exactly once. ; 3*(m+1) long words will be reserved in the code at that ; location. m is the number of indices desired. ; The first long for each index is the total tick count, ; the second is the number of calls, the third is workspace. ; Indices 0<>m are valid. ; ; ProfileCode [suffix] ; - This needs to be placed in the code exactly once. ; It contains the routines needed by the profiling macros. ; ; ProfileInit [suffix] ; - This needs to be executed after the tools have been ; loaded and started, but before either of the following ; macros is executed. After this macro is executed, the ; information in ProfileData is zero-ed out, but may be ; executed as many times as is desired. ; ; ProfileIn n[,suffix] ; - These two macros need to come in pairs for meaningful ; results. ProfileIn takes the current tick count and puts ; it in the workspace for index n. It also increments ; the call count for index n. [ 0 <20> n <20> m ] ; ; ProfileOut n[,suffix] ; - ProfileOut subtracts the tick count saved by ProfileIn ; from the current tick count, and adds that to the total ; accumulated for index n. ProfileIn and ProfileOut may ; be nested with different indices. [ 0 <20> n <20> m ] ; The routines ProfileIn&suffix and ProfileOut&suffix each have a block ; of spare space at the end. This makes a handy location for punching ; code during debugging. IF &Type('Profile') = 'UNDEFINED ' THEN ; A space is really there! Profile equ 0 ENDIF ;------------------------------------- MACRO ProfileData &NumSlots,&suffix IF Profile THEN ProfileData&suffix PROC EXPORT EXPORT ProfileSize&suffix EXPORT ProfileCount&suffix EXPORT ProfileWS&suffix ProfileSize&suffix equ &NumSlots DS.L 1 ProfileCount&suffix DS.L 1 ProfileWS&suffix DS.L 1 DS.L (ProfileSize&suffix*3) ENDP ENDIF MEND ;------------------------------------- MACRO ProfileCode &suffix IF Profile THEN ProfileIn&suffix PROC EXPORT EXPORT ProfTick1&suffix EXPORT ProfTick2&suffix IMPORT ProfileCount&suffix IMPORT ProfileWS&suffix ProfTick1&suffix lda >000000 ; TickCount sta >ProfileWS&suffix,x ProfTick2&suffix lda >000000 ; TickCount+2 sta >ProfileWS&suffix+2,x lda >ProfileCount&suffix,x ina sta >ProfileCount&suffix,x bne @1 lda >ProfileCount&suffix+2,x ina sta >ProfileCount&suffix+2,x @1 IF Profile='s' THEN rts ELSE rtl ENDIF DS.B 256 ; space ENDP ProfileOut&suffix PROC EXPORT EXPORT ProfTick3&suffix EXPORT ProfTick4&suffix IMPORT ProfileData&suffix IMPORT ProfileWS&suffix ProfTick3&suffix lda >000000 ; TickCount sec sbc >ProfileWS&suffix,x sta >ProfileWS&suffix,x ProfTick4&suffix lda >000000 ; TickCount+2 sbc >ProfileWS&suffix+2,x sta >ProfileWS&suffix+2,x lda >ProfileWS&suffix,x clc adc >ProfileData&suffix,x sta >ProfileData&suffix,x lda >ProfileWS&suffix+2,x adc >ProfileData&suffix+2,x sta >ProfileData&suffix+2,x IF Profile='s' THEN