In case I haven't posted this previously, here is a 6502 1MHz dual-paddle read routine:
1 *-------------------------------
2 * 6502 single-pass GetJoyXY
3 *
4 * 10/21/2018 by John Brooks
5 *-------------------------------
7
8 org $300
9
10 TestJoy
0300: 20 58 FC 11 jsr $fc58
12 :Loop
0303: A9 00 13 lda #0
0305: 85 24 14 sta $24
0307: 20 1A 03 15 jsr GetJoyXY
030A: 8A 16 txa
030B: 20 DA FD 17 jsr $fdda
030E: A9 AC 18 lda #","
0310: 20 ED FD 19 jsr $fded
0313: 98 20 tya
0314: 20 DA FD 21 jsr $fdda
0317: 4C 03 03 22 jmp :Loop
23
24 *-------------------------------
25 * Read JoyX,Y every 11cyc on avg
26 * Returns: X=JoyX, Y=JoyY
27 GetJoyXY
031A: 08 28 php ;Save interrupt enable
031B: 78 29 sei ;Disable interrupts
30
031C: 2C 70 C0 31 bit $C070 ;Start X,Y timers. 11c to 1st read
031F: A2 01 33 ldx #1 ;2: DualCtr=0+1=1. Wraps to 0 at 3*85=255 XY reads2 ,0002
0321: A0 7F 34 ldy #$7F ;2 2 ,0004
0323: 24 00 35 bit 0 ;3: wait 3 ,0007
36 :DualXY0 ;Inc X,Y 3x in 33 cycles (1st read counts twice)
0325: CC 64 C0 37 cpy $C064 ;4: Chk JoyX. 16c to DualXY14 ,0011
0328: 2C 65 C0 39 bit $C065 ;4: Chk JoyY 4 ,0004
032B: B0 2D 40 bcs :ToSoloY ;2/3 2',0006
032D: 10 1D 41 bpl :ToSoloX ;2/3 2',0008
032F: E8 42 inx ;2: Inc XY 2 ,0010
0330: E8 43 inx ;2 2 ,0012
44 :DualXY1
0331: CC 64 C0 45 cpy $C064 ;4: Chk JoyX. 17c to DualXY04 ,0016
0334: 2C 65 C0 47 bit $C065 ;4: Chk JoyY 4 ,0004
0337: B0 21 48 bcs :ToSoloY ;2/3 2',0006
0339: 10 11 49 bpl :ToSoloX ;2/3 2',0008
033B: E8 50 inx ;2: Inc XY 2 ,0010
033C: D0 E7 51 bne :DualXY0 ;2/3 2',0012
52
53 :DualXY2 ;256th read
033E: AD 64 C0 54 lda $C064 ;3: Chk JoyX 4 ,0016
0341: 2D 65 C0 55 and $C065 ;3: Chk JoyY 4 ,0020
0344: 30 01 56 bmi :SameXY ;3 2',0022
0346: CA 57 dex ;#$FE 2 ,0024
58 :SameXY 0347: CA 59 dex ;#$FF 2 ,0026
0348: 8A 60 txa 2 ,0028
0349: A8 61 tay 2 ,0030
034A: 28 62 plp 4 ,0034
034B: 60 63 rts 6 ,0040
64
65 :ToSoloX
034C: 8A 66 txa ;2 2 ,0042
034D: A8 67 tay ;2: Y = JoyY + 1 2 ,0044
68 :SoloX ;Read every 11 cycles
034E: 2C 64 C0 69 bit $C064 ;4: Chk JoyX 4 ,0048
0351: 10 04 70 bpl :SoloXDone ;2/3 2',0050
0353: E8 71 inx ;2 2 ,0052
0354: D0 F8 72 bne :SoloX ;2/3 2',0054
0356: CA 73 dex ;Clamp to 255 2 ,0056
74 :SoloXDone
0357: 88 75 dey ;2: Correct Dual ctr starting at 12 ,0058
0358: 28 76 plp 4 ,0062
0359: 60 77 rts 6 ,0068
78
79 :ToSoloY
035A: 10 EB 80 bpl :SameXY ;2/3 2',0070
035C: 8A 81 txa ;2: X = JoyX + 1 2 ,0072
035D: A8 82 tay ;2 2 ,0074
83 :SoloY ;Read every 11 cycles
035E: 2C 65 C0 84 bit $C065 ;4: Chk JoyY 4 ,0078
0361: 10 04 85 bpl :SoloYDone ;2/3 2',0080
0363: C8 86 iny ;2 2 ,0082
0364: D0 F8 87 bne :SoloY ;2/3 2',0084
0366: 88 88 dey ;Clamp to 255 2 ,0086
89 :SoloYDone
0367: CA 90 dex ;2: Correct Dual ctr starting at 12 ,0088
0368: 28 91 plp 4 ,0092
0369: 60 92 rts 6 ,0098
93
--End assembly, 106 bytes, Errors: 0