mono napisał/a:Już dawno rozwiązano, nazywa się to CMI08.
ChatGPT
Gdyby celem było płynne sterowanie myszą bez obciążania 6502, to najskuteczniejszym rozwiązaniem byłby inteligentny kontroler myszy w kartridżu (lub PBI/ECI) z własnym mikrokontrolerem albo małym CPLD/FPGA. Co ciekawe, architektura Atari XL/XE bardzo temu sprzyja: POKEY obsługuje wejścia potencjometrów i IRQ, ANTIC już i tak przejmuje magistralę przez DMA, a cartridge może generować przerwania do CPU.
Najlepsze rozwiązanie: "Smart Mouse Controller"
Taki układ robiłby całą "brudną robotę":
- odczytuje mysz USB lub PS/2 z częstotliwością 125-1000 Hz,
- akumuluje ruchy ΔX i ΔY,
- zapisuje je do rejestrów dostępnych pod np. $D5xx,
- generuje IRQ tylko wtedy, gdy pojawi się nowy ruch.
Dla 6502 obsługa sprowadza się do kilku instrukcji:
IRQ:
LDA MOUSE_DX
CLC
ADC CURSOR_X
STA CURSOR_X
LDA MOUSE_DY
CLC
ADC CURSOR_Y
STA CURSOR_Y
RTI
To zajmuje kilkadziesiąt cykli zamiast ciągłego odpytywania urządzenia.
Jeszcze lepiej: sprzętowy generator współrzędnych
Można pójść krok dalej i zbudować układ podobny do Amigi CIA + Paula albo kontrolera Atari ST.
Układ utrzymywałby aktualne współrzędne kursora w sprzętowych licznikach. 6502 tylko czytałby:
LDA MOUSE_X
LDA MOUSE_Y
Nie trzeba nawet dodawać ΔX i ΔY.
Wersja "retro" z układami TTL
Dałoby się to zbudować wyłącznie z logiki z epoki:
- dwa liczniki 74HC193 (X i Y),
- dekoder kwadraturowy LS7084,
- zatrzaski 74HC573,
- generator IRQ.
To byłoby całkowicie zgodne technologicznie z połową lat 80.
A może drugi procesor?
Ponieważ wcześniej rozmawialiśmy o procesorze w kartridżu współdzielącym magistralę Atari, można wykorzystać tę samą ideę.
Drugi 65C02 mógłby:
- obsługiwać USB/PS2,
- filtrować drgania,
- robić akcelerację kursora,
- przekazywać gotowe współrzędne głównemu SALLY przez rejestry współdzielone.
Co byłoby najbardziej "atarowskie"?
Moim zdaniem najciekawsze byłoby rozwiązanie w stylu Atari ST w kartridżu:
- CPLD/FPGA podłączone do magistrali cartridge,
- sprzętowe liczniki X/Y,
- własny sprite kursora nakładany na sygnał GTIA,
- IRQ przy zmianie położenia.
Wtedy kursor poruszałby się całkowicie niezależnie od 6502, nawet gdy gra zajmuje niemal 100% czasu procesora.
Jest jeszcze ciekawsza możliwość: sprzętowy kursor bez udziału GTIA
Da się zbudować rozszerzenie wykorzystujące sygnały ANTIC/GTIA (HSYNC, VSYNC, HALT) i własny układ w FPGA/CPLD, który dokleja sprite kursora do sygnału wideo już po wyjściu GTIA. W praktyce byłby to odpowiednik sprzętowego kursora znanego z Atari ST czy kart VGA.
Taki układ:
- śledzi bieżącą pozycję wiązki obrazu,
- porównuje ją z rejestrami MouseX i MouseY,
- nakłada 16×16 lub 32×32 piksele kursora w locie,
- nie zużywa ani jednego cyklu 6502 na rysowanie kursora.
To rozwiązanie jest szczególnie interesujące dla dem i gier, bo kursor pozostaje idealnie płynny nawet podczas pełnego obciążenia procesora i intensywnego DMA ANTIC.