
PROGRAM LISTING: 89-10a/CNTANL.M65
10 ;BASIC PROFILER COUNT ANALYZER
20 ; XE VERSION BY ERIC WOODRUFF
30 ; (c) 1989, ANTIC PUBLISHING
40 ;
50 ; DEFINITIONS:
60 ;The buffer is a string address passed to the routine (BTNK).
70 ; 4 bytes per entry:
80 ; Lo, Hi of line number (counter).
90 ; Lo, Hi of count.
0100 ;
0110 MEMPTR = $CB ;Memory pointer.
0120 SRCH = $CD ;Search pointer.
0130 AMOUNT = $CF ;Number to bottlenecks to get.
0140 PBSAV = $D0 ;PORTB save location.
0150 LAST = $D4 ;Last highest bottleneck.
0160 COUNT = $DA ;Line # counter.
0170 ADSAV = $DC ;Search address save location.
0180 BTNK = $DE ;Bottleneck string address pointer.
0190 MAYB = $E0 ;Holder for a possibility.
0200 PORTB = $D301 ;For bank selection.
0210 ;
0220 *= $9A00
0230 ;
0240 ; This sorts through all the
0250 ; counters in extended RAM and
0260 ; send the specified number of
0270 ; entries to the buffer for a
0280 ; report to the user.
0290 ;
0300 PLA
0310 PLA ;Get the passed
0320 STA BTNK+1 ;string address.
0330 STA ADSAV+1 ;For search.
0340 PLA
0350 STA BTNK
0360 STA ADSAV
0370 PLA ;Get number of
0380 PLA ;bottlenecks to
0390 STA AMOUNT ;find.
0400 LDA PORTB ;Save PORTB.
0410 STA PBSAV
0420 ANALYZE
0430 LDA #0 ;Start from 0
0440 STA COUNT ;and go through
0450 STA COUNT+1 ;32767.
0460 STA LAST+2 ;Clear last
0470 STA LAST+3 ;bottleneck.
0480 CHECK
0490 LDA COUNT ;Move counter
0500 STA MEMPTR ;to pointer.
0510 LDA COUNT+1
0520 ASL A ;Multiply by
0530 CLC ;two to get
0540 ASL MEMPTR ;address in
0550 ADC #0 ;extended RAM.
0560 CMP #$40
0570 BCS SB1 ;Select bank 0?
0580 LDY #0
0590 BEQ SELC
0600 SB1 CMP #$80 ;Select bank 1?
0610 BCS SB2
0620 LDY #1
0630 BNE SELC
0640 SB2 CMP #$C0 ;Select bank 2?
0650 BCS SB3
0660 LDY #2
0670 BNE SELC
0680 SB3 LDY #3 ;Select bank 3.
0690 SELC AND #$3F
0700 ORA #$40 ;Find counter
0710 STA MEMPTR+1 ;in RAM.
0720 TYA
0730 ASL A ;Bank * 4 + 193.
0740 ASL A
0750 CLC
0760 ADC #193
0770 STA PORTB
0780 LDY #1
0790 LDA (MEMPTR),Y ;Check count.
0800 BNE NOTZ
0810 DEY ;Equal zero?
0820 LDA (MEMPTR),Y
0830 BEQ NEXT ;If so, ignore.
0840 INY
0850 NOTZ
0860 LDA (MEMPTR),Y ;Is this
0870 STA MAYB+3 ;counter greater
0880 CMP LAST+3 ;than the last?
0890 BCC NEXT
0900 BNE SEEK ;Yes.
0910 DEY
0920 LDA (MEMPTR),Y ;Check lo
0930 CMP LAST+2 ;byte.
0940 BCC NEXT ;No.
0950 SEEK LDY #0 ;Load lo byte
0960 LDA (MEMPTR),Y ;if not done.
0970 STA MAYB+2
0980 LDA COUNT+1
0990 STA MAYB+1 ;Store counter.
1000 LDA COUNT
1010 STA MAYB ;Save it.
1020 LDA PBSAV ;Switch back to
1030 STA PORTB ;normal memory.
1040 LDA ADSAV ;Restore search
1050 STA SRCH ;address.
1060 LDA ADSAV+1
1070 STA SRCH+1 ;See if counter
1080 LOOK LDY #0 ;is already in
1090 LDA (SRCH),Y ;the string.
1100 CMP MAYB ;Lo bytes =?
1110 BNE FAIL
1120 INY
1130 LDA (SRCH),Y
1140 CMP MAYB+1 ;Hi bytes =?
1150 BEQ NEXT
1160 FAIL
1170 LDA #4 ;Check next
1180 CLC ;entry.
1190 ADC SRCH
1200 STA SRCH
1210 BCC *+4
1220 INC SRCH+1
1230 LDY #0 ;End of string?
1240 LDA #$FF
1250 CMP (SRCH),Y
1260 BNE LOOK
1270 INY
1280 CMP (SRCH),Y
1290 BNE LOOK
1300 LDX #3 ;Move MAYB to
1310 MML LDA MAYB,X ;LAST.
1320 STA LAST,X
1330 DEX
1340 BPL MML
1350 NEXT LDA PBSAV ;Switch back to
1360 STA PORTB ;normal memory.
1370 INC COUNT ;Increment to
1380 BNE NXT ;the next
1390 INC COUNT+1 ;counter.
1400 BMI *+5 ;Count=32768?
1410 NXT JMP CHECK
1420 LDY #3 ;Store the
1430 STR LDA LAST,Y ;counter and
1440 STA (BTNK),Y ;number to the
1450 DEY ;string.
1460 BPL STR
1470 LDA BTNK ;Add four to
1480 CLC ;bottleneck
1490 ADC #4 ;string address.
1500 STA BTNK
1510 BCC *+4
1520 INC BTNK+1
1530 DEC AMOUNT
1540 BEQ *+5 ;Done?
1550 JMP ANALYZE ;Find next one.
1560 RTS ;All done, exit.
Back to previous page