Der MOS 6567/6569 Videocontroller (VIC-II) und seine Anwendung im Commodore 64
Inhalt 3. Funktionsweise des VIC
3.11. Lightpen |
Bei einer negativen Flanke am LP-Eingang wird die aktuelle Position des Rasterstrahls in den Registern LPX ($d013) und LPY ($d014) gelatcht. LPX enthält die oberen 8 Bit (von 9) der X-Position und LPY die unteren 8 Bit (ebenfalls von 9) der Y-Position. Daher ist die horizontale Auflösung des Lightpens auf 2 Pixel begrenzt. Es wird pro Bild nur eine einzige negative Flanke an LP registriert. Treten mehrere Flanken an LP auf, werden alle nachfolgenden ignoriert. Erst in der nächsten vertikalen Austastlücke wird die Triggerung wieder freigegeben. Da der LP-Eingang des VIC wie alle Leitungen der Joystick-Ports an die Tastaturmatrix angeschlossen ist, läßt er sich auch per Software steuern. Dazu dient Bit 4 von Port B von CIA-A ($dc01/$dc03). Dies gibt die Möglichkeit, die aktuelle X-Position des Rasterstrahls durch Auslösen einer LP-Flanke und anschließendem Lesen von LPX zu ermitteln (der VIC besitzt kein Register, aus dem man die X-Position direkt auslesen könnte). Damit kann man z.B. Rasterinterrupt-Routinen zyklusgenau synchronisieren. Die Werte, die man im LPX-Register erthält kann man aus den Sprite-Koordinaten der Timing-Diagramme in Abschnitt 3.6.3. ermitteln. Man muß sich jeweils am Ende des Zyklus, in dem die LP-Leitung gesetzt wird, orientieren. Triggert man LP z.B. in Zyklus 20, so erhält man in LPX den Wert $1e, der der Sprite-Koordinate $03c entspricht (LPX enthält die oberen 8 Bit der 9-Bit-X-Koordinate). Der VIC kann auch zusätzlich einen Interrupt beim Auftreten einer negativen Flanke am LP-Pin auslösen (siehe nächsten Abschnitt), ebenfalls nur einmal pro Strahldurchlauf.