
PROGRAM LISTING: 89-04a/PROFILE.M65
0100 ; BASIC PROFILER SOURCE CODE
0110 ; BY STAN LACKEY
0120 ; (c)1988, ANTIC PUBLISHING INC.
0150 ;
0160 ; Definitions:
0180 TEMP1 = $CB ; Temps used in routines
0190 TEMP2 = $CD
0200 TEMP3 = $CF
0210 STMCUR = 138 ; Pointer into user program
0220 RAMTOP = 106
0250 ;
0260 *= $9F00
0270 ;
0280 PROFEN
0285 .BYTE 0 ; Flag to enable Profiler
0290 ;
0300 ; SAMPLE is the timer interrupt
0310 ; routine. It takes the current
0320 ; line number, divides it by 10
0330 ; and increments that 16-bit
0340 ; location in the RAM above
0345 ; RAMTOP.
0350 ;
0360 SAMPLE
0365 LDA PROFEN ; Sense enable
0370 BNE SPL1
0375 ;
0380 PLA ; It's off...
0390 RTI ; just return.
0395 ;
0400 SPL1
0401 TYA
0410 PHA ; Must save Y
0420 LDY #0
0430 LDA (STMCUR),Y ; Get line #
0440 STA TEMP1
0450 INY ; Point to high
0460 LDA (STMCUR),Y
0470 STA TEMP1+1
0480 BMI EXIT ; Exit if line
0490 ; num is neg.
0500 ; Now, divide line number by 10
0510 LDA # <20480 ; Divisor:
0520 STA TEMP2 ; #10, Shifted
0530 LDA # >20480
0540 STA TEMP2+1
0550 LDA #0
0560 STA TEMP3 ; Clear quotient
0570 STA TEMP3+1
0580 LDY #11 ; Loop count
0590 DIVLP
0595 SEC
0600 LDA TEMP1
0610 SBC TEMP2
0620 STA TEMP4 ; 16-bit subtr,
0630 LDA TEMP1+1 ; ddnd-dvsr
0640 SBC TEMP2+1
0650 STA TEMP4+1
0660 CLC ; Init.
0670 BMI NOBIT ; Shift 0 in
0680 ; dvsr > ddnd
0690 LDA TEMP4
0700 STA TEMP1 ; ddnd > dvsr
0710 LDA TEMP4+1 ; Copy new ddnd
0720 STA TEMP1+1
0730 SEC ; Shift 1 in
0740 NOBIT
0745 ROL TEMP3 ; Shift into
0750 ROL TEMP3+1 ; quotient
0760 LSR TEMP2+1 ; Shift dvsr
0770 ROR TEMP2
0780 DEY
0790 BPL DIVLP ; Loop next bit
0795 ;
0800 ; Result is left in TEMP3.
0810 ; Add that result to RAMTOP.
0820 ASL TEMP3 ; 2x result for
0830 ROL TEMP3+1 ; 2-byte access
0840 CLC
0850 LDA TEMP3+1
0860 ADC RAMTOP ; TEMP3 is now
0870 ADC #4 ; the pointer
0880 STA TEMP3+1 ; into the RAM.
0890 LDY #0
0900 CLC
0910 LDA (TEMP3),Y ; Get cell to
0920 ADC #1 ; increment
0930 STA (TEMP3),Y
0940 BNE EXIT ; If inc. to 0,
0945 ;
0950 INY
0960 CLC
0970 LDA (TEMP3),Y ; incr high
0980 ADC #1 ; half
0990 STA (TEMP3),Y
1000 BPL EXIT ; Test overflow
1005 ;
1010 LDA #0 ; Stop prof
1020 STA PROFEN ; on overflow
1030 EXIT
1035 PLA
1040 TAY ; Restore Y
1050 PLA ; and A
1060 RTI ; End of SAMPLE
1065 ;
1070 TEMP4
1075 .WORD 0 ; Temp used in division
Back to previous page