.include "atari.inc" .export _keyclick .import _cgetc ; keyclick.s - just what you think it is. ; How do you make it possible to disable the keyclick on the 400/800? ; Don't use the OS K: handler. ;.ifdef REAL_KEYCLICK .if 1 ; used to my own STA WSYNC loop, but that didn't respect NOCLIK on ; XL/XE machines. lda #0 sta CH jsr _cgetc rts .else ; Fake keyclick. 25 bytes of code. Sounds just like the real one, but ; it won't mess up your DLIs because it's interruptible (though DLIs ; might mess it up). Loop timing assumes a GR.0 type display list ; with playfield DMA enabled and P/M DMA disabled. ; Preserves A, returns with X=$ff, Y=0, N set, Z clear. _keyclick: @wcount: ldx VCOUNT ; To make the timing consistent, wait until we're sure cpx #$10 ; that ANTIC is doing DMA. bne @wcount ldx #$7f @click: ; I tuned this by ear, then cycle-counted afterward. stx CONSOL ; 4 ldy #$07 ; 2 ;lda #0 ; 2 nop @c1: dey ; inner: 2 nop ; 2 bne @c1 ; 3 ; 7 cycles/loop, *7 = 49, -1 for failed BNE ; 48 dex ; 2 bpl @click ; 3 = 61 rts .endif