Testujesz i sterujesz rejestry cienie, które są aktualizowane na przerwaniu VBLK. To powoduje, że od fizycznej zmiany stanu joysticka do aktualizacji rejestru PTRIG może minąć prawie cała ramka czyli 312 linii skanningowych (PAL). Następnie na podstawie cienia ustawiasz stan rejestru cienia dla koloru COLOR2 - zostanie on zaktualizowany dopiero przy następnym VBLK - czyli po kolejnych prawie 312 liniach skanningowych. Co więcej sterujesz COLPF2 a więc obszar tła w trybie GR.0 a więc kolor zieniany jest w ograniczonym obszarze. Więc przy Twojej metodzie pomiaru miną min 1 a max 2 ramki ekranu w reakcji na wychylenie joystickiem.
Ile to może zabrać czasu? 114 cykli na linię * 312 linii skanningowych / 1773447 Hz = 20 ms. To jest czas trwania ramki w PAL.
Proponuję użyć rejestrów hardwareowych, wtedy na natychmiastową zmianę stanu joysticka będzie można natychmiast zmienić kolor tła ekranu. Proponuję też wyświetlać ekran pusty i zmieniać kolor ramki ekranu w reakcji nie na wychylenie joysticka, ale na stan przycisku.
RTCLOK = $12
TRIG0 = $D010
COLBAK = $D01A
DMACTL = $D400
NMIEN = $D40E
NMIRES = $D40F
lda RTCLOK+2
sync:
cmp RTCLOK+2
beq sync
lda #$00
sta DMACTL
sta NMIEN
sta NMIRES
loop:
ldx #$00
lda TRIG0
bne skip
ldx #$0F
skip:
stx COLBAK
jmp loop
Monitor CRT powinien dać opóźnienie od 0 do 20 ms, ponieważ fotorezystor bada punkt na ekranie, przez który przebiegnie plamka (pewnie jakiś obszar) a przecież wciśnięcie przycisku mogło się zdarzyć w pierwszej linii skanningowej, a badanie plamki w ostatniej. Reakcja na zmianę stanu przycisku odbywa się w ciągu 12 cykli CPU więc w ok. 7us i to właściwie powinien być najkrótszy obserwowalny czas reakcji CRT.
Wydaje mi się, że w ten sposób dałoby się precyzyjniej określić opóźnienie LCD, ale cudów nie oczekiwałbym - podejrzewam, że czas reakcji skróci się o 20..50 ms.
Przerwania NMI wyłączam ze względu na odświeżanie rejestrów hardwareowych na podstawie rejestrów cieni na VBLK.
Edit: Może nie prościej, ale czy nie lepiej byłoby zamiast testować stan joysticka badać skok sygnału luminancji a element światłoczuły ustawić na górze ekranu? I mrugać wtedy ekranem co np. 1s?