* CRTC CHECK
;SPECIAL EFFECTS - Listing #2
;CRTC Test Routine -Kommentierter Quellcode
;(C)1992 by ELMSOFT and CPC AMSTRAD INTERNATIONAL
ORG &4000 ;Programmstart bei 16384.
DI ;Zuerst alle Interrupts aus.
LD HL,(&38) ;Teil des JPs zur Interruptroutine
LD (STORE+1),HL ;bei &38 sichern,
LD HL,&C9FB ;dann ein EI
;RET (=&FB,&C9) an Adresse &38,
LD (&38),HL ;ein auftretender Interrupt hat
;so keine Wirkung, kann aber zur
;Synchronisation verwendet werden.
LD B,&F5 ;Auf das vertikale
FRAME1 IN A,(C) ;Synchronisations-
RRCA ;signal (=VSYNC)
JP NC,FRAME1 ;warten...
FRAME2 IN A,(C) ;Zweite Abfrage
RRCA ;zur absoluten
JP NC,FRAME2 ;Sicherheit.
EI ;Interrupts wieder zulassen,
HALT ;und auf ersten Interrupt warten.
LD HL,&4B ;Einfache,
WAIT DEC HL ;genau
LD A,H ;bestimmte
OR L ;Warte-
JP NZ,WAIT ;schleife.
IN A,(C) ;Ist VSYNC Signal jetzt noch
;immer aktiv?
RRCA ;Ja?
JP C,CONT1 ;Dann liegt kein CRTC Typ 0 vor.
XOR A:JR ENDE ;Sonst A=Typ 0,Test erledigt.
CONT1 HALT ;Warten,bis der Elektronenstrahl
HALT ;die Bildschirmmitte erreicht
HALT ;und die VSYNC Periode
;verlassen hat.
DI ;Jetzt Interrupts wieder aus
FRAME3 IN A,(C) ;und auf den
RRCA ;naechsten Frame-Fly
JP NC,FRAME3 ;warten...
LD BC,&BC02 ;CRTC Register 2
OUT (C),C ;mit &32 laden, ein Wert,
LD BC,&BD32 ;den CRTC Typ 2 nicht
OUT (C),C ;verkraftet.
EI ;Interrupt wieder ein
HALT ;und
HALT ;einen
HALT ;Bild-
HALT ;aufbau
HALT ;abwarten.
HALT
HALT
LD B,&F5 ;Ist jetzt der Frame-Fly NICHT
;aktiv,
IN A,(C) ;so ist ein CRTC Typ 2 vorhanden,
RRCA ;der durch den Wert &32 in
;Register 2
JP NC,CONT2 ;ganz aus dem Konzept gebracht
;wurde.
LD A,1:JR ENDE ;Sonst A=CRTC Typ 1 und Ende...
CONT2 LD A,2 ;CRTC Typ 2 steht fest.
ENDE LD BC,&BC02;Register 2
OUT (C),C ;wieder mit
LD BC,&BD2E ;Normalwert
OUT (C),C ;laden.
LD (&AF00),A ;CRTC Typ fuer Basicprogramm nach
;&AF00 schreiben.
STORE LD HL,0 ;Wieder die beiden urspruenglichen
LD (&38),HL ;Bytes nach &38 zurueckpoken.
EI ;Interrupts ein
RET ;und gesch ;Interrupts ein
RET ;und geschafft.