summaryrefslogtreecommitdiff
path: root/doc/6502_org_source_general_clockfreq.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/6502_org_source_general_clockfreq.txt')
-rw-r--r--doc/6502_org_source_general_clockfreq.txt201
1 files changed, 201 insertions, 0 deletions
diff --git a/doc/6502_org_source_general_clockfreq.txt b/doc/6502_org_source_general_clockfreq.txt
new file mode 100644
index 0000000..389d8a3
--- /dev/null
+++ b/doc/6502_org_source_general_clockfreq.txt
@@ -0,0 +1,201 @@
+ [1][Return to Main Page]
+
+ Calculation of Clock Frequency by Leo Nechaev
+ [2][Up to Source Code Repository]
+ __________________________________________________________________
+
+ This program calculates the clock frequency of 6502-based system. The
+ result is stored in location 'Ticks' to 'Ticks+3' in BCD representation
+ ('Ticks' - 2 symbols before decimal point, 'Ticks+1' to 'Ticks+3' - 6
+ symbols after point), then result is sent via UART to the host (usually
+ PC with some kind of terminal programm).
+
+ With minimal modifications (deleting 'SED' and 'CLD' instructions,
+ changing ticks constants [from BCD to binary format], deleting
+ 'terminal' subroutines) it may be used to determine real speed of
+ processor.
+rgConfig = $6000 ; write: D6=1 - NMI is off, D6=0 - NMI is on
+rgStatus = $6000 ; read: D6=0 - UART is busy
+rgTxD = $5000 ; write: data to send via UART
+
+vcNMI = $FFFA
+
+Refresh = 450 ; NMI rate in Hz
+
+ ldx #<NMI ; installing the NMI vector
+ ldy #>NMI
+ stx vcNMI
+ sty vcNMI+1
+ lda #$40 ; on start NMI is off
+ sta InUse
+
+Again
+ lda #0
+ sta Flag
+ sta Ticks ; initializing counter
+ sta Ticks+1
+ sta Ticks+2
+ sta Ticks+3
+ lda #$FE ; initializing NMI counter (zeropoint minus 2 ti
+cks)
+ sta Timer
+ lda #$FF
+ sta Timer+1
+ lda InUse ; turn on NMI
+ and #$BF
+ sta rgConfig
+ sta InUse
+
+- bit Flag ; waiting for zeropoint minus 1 tick
+ bpl -
+ lda #0
+ sta Flag
+
+- bit Flag ; waiting for true zeropoint
+ bpl -
+ lda #0
+ sta Flag
+
+Main ; main counting cycle
+;number of ticks per command sum of ticks
+; v v
+ lda Ticks ;4
+ clc ;2 6
+ sed ;2 8
+ adc #$53 ;2 10
+ sta Ticks ;4 14
+ lda Ticks+1 ;4 18
+ adc #0 ;2 20
+ sta Ticks+1 ;4 24
+ lda Ticks+2 ;4 28
+ adc #0 ;2 30
+ sta Ticks+2 ;4 34
+ lda Ticks+3 ;4 38
+ adc #0 ;2 40
+ sta Ticks+3 ;4 44
+ cld ;2 46
+ bit Flag ;4 50
+ bpl Main ;3 53
+
+ lda #0 ;2
+ sta Flag ;4 6
+ lda Ticks ;4 10
+ clc ;2 12
+ sed ;2 14
+ adc #$95 ;2 16
+ sta Ticks ;4 20
+ lda Ticks+1 ;4 24
+ adc #0 ;2 26
+ sta Ticks+1 ;4 30
+ lda Ticks+2 ;4 34
+ adc #0 ;2 36
+ sta Ticks+2 ;4 40
+ lda Ticks+3 ;4 44
+ adc #0 ;2 46
+ sta Ticks+3 ;4 50
+ cld ;2 52
+ lda Timer ;4 56
+ cmp #<Refresh ;2 58
+ bne Main ;3 61 + 34 (from NMI ISR) = 95
+ lda Timer+1 ; 4
+ cmp #>Refresh ; 2
+ bne Main ; 3
+
+ lda InUse ; turn off NMI
+ ora #$40
+ sta rgConfig
+ sta InUse
+
+ ldx #0 ; send first string to the host
+- lda Mes1,x
+ beq +
+ jsr Send
+ inx
+ jmp -
+
++ lda Ticks+3
+ pha
+ lsr
+ lsr
+ lsr
+ lsr
+ beq + ; delete non-significant zero (clock < 10MHz)
+ jsr PrintDigit
++ pla
+ and #15
+ jsr PrintDigit
+ lda #"." ; decimal point
+ jsr Send
+ lda Ticks+2
+ jsr PrintTwoDigits
+ lda Ticks+1
+ jsr PrintTwoDigits
+ lda Ticks
+ jsr PrintTwoDigits
+
+ ldx #0 ; send second string to the host
+- lda Mes2,x
+ beq +
+ jsr Send
+ inx
+ jmp -
++ jmp Again ; repeat process
+
+PrintTwoDigits
+ pha
+ lsr
+ lsr
+ lsr
+ lsr
+ jsr PrintDigit
+ pla
+ and #15
+ jsr PrintDigit
+ rts
+
+PrintDigit
+ ora #$30
+ jsr Send
+ rts
+
+Send
+ bit rgStatus
+ bvc Send
+ sta rgTxD
+ rts
+
+Mes1
+ .db 13
+ .tx "Current clock frequency is "
+ .db 0
+
+Mes2
+ .tx " MHz"
+ .db 0
+
+Ticks .br 4,0
+Timer .br 2,0
+InUse .db 0
+Flag .db 0
+
+NMI ;6
+ pha ;3 9
+ inc Timer ;6 15
+ bne + ;3 18
+ inc Timer+1 ; 5
++ lda #$80 ;2 20
+ sta Flag ;4 24
+ pla ;4 28
+ rti ;6 34
+
+ Test results:
+ * with chip oscillator "1.8432" the result is '1.843266 MHz'
+ * with chip oscillator "20.000000M" and divider by 10 the result is
+ '2.000040 MHz'
+
+ Last page update: December 27, 2000.
+
+References
+
+ 1. http://6502.org/
+ 2. http://6502.org/source