* SCREEN SPLITTING
;SPECIAL EFFECTS - Listing #9
;Screen Splitting - Kommentierter Quellcode
;(C)1992 by ELMSOFT and CPC AMSTRAD INTERNATIONAL
;Geschrieben fuer MAXAM Assembler V1.13
NOLIST ;Keine Ausgaben.
ORG &4000 ;Programmstart bei 16384.
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 poken,
LD (&38),HL ;ein auftretender Interrupt hat so keine Wirkung,
;kann aber zur Synchronisation verwendet werden.
LD HL,1000 ;Wieder 20 Sekunden lang.
LOOP PUSH HL ;Zaehler sichern.
LD B,&F5 ;Auf das vertikale
FRAME IN A,(C) ;Synchronisations-
RRCA ;signal (=VSYNC)
JP NC,FRAME ;warten...
LD BC,&7F10 ;BORDER 6
OUT (C),C
LD C,&4C
OUT (C),C
LD BC,&BC04 ;Jeder der 6 untereinander angezeigten Ausschnitte
OUT (C),C ;ist 6 Textzeilen gross, also den Wert 5
LD BC,&BD05 ;ins CRTC Register 4
OUT (C),C ;schreiben.
LD BC,&BC07 ;VSR soll bei Zeile 6 aktiviert werden, ein Wert
OUT (C),C ;den der Textzeilenzaehler durch die Register 4-
LD BC,&BD06 ;Manipulation nie erreicht,die VSR-Balken werden
OUT (C),C ;also unterdrueckt.
;Jetzt wird alle 6 Textzeilen (entspricht umgefaehr einem Interruptzyklus)
;die Bildschirmspeicherstartadresse geaendert. (SCReenADdress 1 und 2)
CALL SCRAD1:HALT:CALL SCRAD2:HALT:CALL SCRAD1:HALT
CALL SCRAD2:HALT:CALL SCRAD1:HALT:CALL SCRAD2:HALT
LD BC,&BC04 ;Der letzte Ausschnitt ist
OUT (C),C ;nur noch
LD BC,&BD03 ;4 Textzeilen
OUT (C),C ;hoch.
LD BC,&BC07 ;Dafuer wird an dessen Ende
OUT (C),C ;der VSR
LD BC,&BD03 ;ausgeloest,worauf der Monitor
OUT (C),C ;wieder ganz oben mit dem Bildaufbau beginnt.
LD HL,(ADD1) ;Die erste Videoramadresse wird erhoeht,
INC HL ;also ein Scrolling nach links.
RES 2,H ;Korrektur. Nach &33FF folgt statt &3400 wieder &3000.
LD (ADD1),HL ;Neue Adresse wieder speichern.
LD HL,(ADD2) ;Die zweite Videoramadresse wird erniedrigt,
LD DE,&3FF ;was einer Addition von &3FF entspricht-->Scrolling nach rechts.
ADD HL,DE ;Addieren,
RES 2,H ;korrigieren
LD (ADD2),HL ;und zurueckschreiben.
POP HL ;Obligatorischer Schleifendurchlauf.(1000x)
DEC HL
LD A,H
OR L
JP NZ,LOOP
;CRTC Register 4 und 7 wieder mit normalen Werten fuellen.
LD BC,&BC04:OUT (C),C
LD BC,&BD26:OUT (C),C
LD BC,&BC07:OUT (C),C
LD BC,&BD1E:OUT (C),C
STORE LD HL,0 ;Zwei Bytes nach &38
LD (&38),HL ;zurueck und
RET ;ins BASIC.
SCRAD1 LD HL,(ADD1);Videoramadresse 1 nach HL
JR SCRAD ;und zum CRTC Registerladen springen.
SCRAD2 LD HL,(ADD2);Videoramadresse 2 nach HL
SCRAD LD BC,&BC0C ;CRTC Register 12 (HIGHBYTE Videoram)
OUT (C),C ;auswaehlen
INC B ;und H ueber &BDXX
OUT (C),H ;ausgeben.
DEC B
INC C ;BC enthaelt jetzt &BC0D
OUT (C),C ;Register 13 auswaehlen
INC B ;und das Lowbyte L
OUT (C),L ;ausgeben.
RET
ADD1 DW &3000 ;Adresse 1,Linksscroll.
ADD2 DW &3000 ;Adresse 2,Rechtsscroll.