0100 ; SNAIL 1.0 0110 ; ATARI DISK DRIVE TACHOMETER 0120 ; (C)1983 ANALOG COMPUTING 0130 ; 0140 ; SYNTAX: X=USR(ML,B1,B2) 0150 ; ML=addr of this routine 0160 ; B1=addr of dummy disk buffer 0170 ; B2=addr of 32-byte work buffer 0180 ; 0190 ; Program equates 0200 ; 0210 BASIC = $D4 ; BASIC return addr 0220 POINTER = $CB ; pointer to workbuffer 0230 TEMP = $CD ; temporary variable 0240 SYSTIM = $14 ; system jiffy timer 0250 CONSOLE = $D01F ; console key status 0260 DISKIO = $E453 ; disk handler entry 0270 DBUF = $0304 ; disk buffer addr 0280 ; 0290 PLA ; # arguments 0300 PLA ; msb of disk buffer addr 0310 STA DBUF+1 0320 PLA ; lsb 0330 STA DBUF 0340 PLA ; msb of work buffer addr 0350 STA POINTER+1 0360 PLA ; lsb 0370 STA POINTER 0380 CLD ; clear decimal mode 0390 LDA #$00 0400 STA BASIC 0410 STA BASIC+1 ; clear BASIC return 0420 JSR DISKIO ; bring drive up to speed! 0430 ; 0440 ; Read sector #1 32 times 0450 ; 0460 LDA #$1F 0470 STA TEMP ; initialize index 0480 AGAIN 0490 LDA #$00 0500 STA SYSTIM ; reset timer 0510 JSR DISKIO ; read sector 0520 LDA SYSTIM ; obtain access time 0530 LDY TEMP ; and index 0540 STA (POINTER),Y ; save in buffer 0550 DEY 0560 BMI SUM ; exit if buffer full 0570 STY TEMP ; otherwise update index 0580 LDA CONSOLE 0590 CMP #$06 ; START key pressed? 0600 BNE AGAIN ; no; get another sector 0610 RTS ; otherwise exit 0620 ; 0630 ; Add up the timer readings 0640 ; 0650 ; BASIC return addr serves double duty 0660 ; as a temporary sum buffer 0670 ; 0680 SUM 0690 LDY #$1F ; initialize index 0700 NEXTADD 0710 CLC 0720 LDA (POINTER),Y 0730 ADC BASIC 0740 STA BASIC 0750 BCC OKAY 0760 INC BASIC+1 0770 OKAY 0780 DEY 0790 BPL NEXTADD ; keep adding 0800 RTS ; give sum to BASIC