* RASTERBALKEN
;SPECIAL EFFECTS - Listing #4
;Rasterbalken - Kommentierter Quellcode
;(C)1992 by ELMSOFT and CPC AMSTRAD INTERNATIONAL
;Geschrieben fuer MAXAM Assembler V1.13
NOLIST ;Keine Ausgaben.
ORG &4000 ;Programmstart bei 16384.
DI ;Alle,die Synchronisation stoerenden,Interrupts aus.
LD HL,TABELLE ;HL=Zeiger auf die Hintergrundfarben (Rot,Orange,Gelb etc.)
LD DE,&3000 ;Eigentliche Farbtabelle wird bei &3000 aufgebaut.
PUSH DE ;Wert &3000 auf den Stack.
LD A,10 ;Insgesamt 10 Farbwerte,Schleife 10x durchlaufen.
LOOP1 PUSH HL ;HL sichern.
LD B,(HL) ;B mit aktueller Hintergrundfarbe laden.
LD H,D ;HL=DE,also Zieladresse
LD L,E ;nach HL.
LD (HL),B ;Ersten Wert der Farbtabelle schreiben.
INC DE ;DE=HL+1
LD BC,25 ;Und jetzt den Farbwert 25x kopieren. (So wird die
LDIR ;gesamte Farbtabelle um den Faktor 26 gestreckt.)
POP HL ;Zeiger auf aktuellen Farbwert zurueck
INC HL ;und erhoehen.
DEC A ;A=A-1,wenn noch nicht 0,
JR NZ,LOOP1 ;dann wieder zu LOOP1
POP HL ;Wert &3000 vom Stapel (insgesamt ein Byte gespart).
LD DE,&3100 ;Kopie der gestrecken Farbtabelle
LD BC,&100 ;bei Adresse &3100
LDIR ;erstellen.
LD A,&C9 ;Verzoegerungsschleife initialisieren. (Mit CALL &5000
LD (&5020),A ;wartet man somit &20 NOPs ab.)
LD HL,1000 ;Rasterbalken werden 1000x angezeigt,das sind 20 Sekunden.
LOOP2 PUSH HL ;Zaehler retten.
LD B,&F5 ;Auf vertikalen
FRAME IN A,(C) ;Strahlruecklauf
RRCA ;warten...
JR NC,FRAME
LD HL,405 ;Warten,bis der
WAIT DEC HL ;Elektronenstrahl
LD A,H ;im sichtbaren
OR L ;Bereich
JR NZ,WAIT ;angekommen ist.
LD HL,&3000 ;HL=Zeiger auf Farbtabelle.
LD A,250 ;250 Pixelzeilen lang Farbwerte ausgeben.
LD BC,&7F00 ;B=Portadresse Gate Array,C=Pen 0
LD E,16 ;E=Pen 16 (Border)
LOOP LD D,(HL) ;D mit einem Farbwert laden.
OUT (C),C ;Pen 0 auswaehlen
OUT (C),D ;und mit Farbe D laden. (Also INK 0,D)
OUT (C),E ;Border auswaehlen
OUT (C),D ;und mit selber Farbe laden. (BORDER D)
INC HL ;Zeiger auf Tabelle erhoehen.
CALL &5000 ;Verzoegerung,damit Schleife genau 64Ms dauert.
DEC A ;Noch eine Pixelzeile zeichnen?
JP NZ,LOOP ;Ja-dann zurueck.
LD A,&54 ;Borderregister
OUT (C),E ;mit Farbe 0
OUT (C),A ;fuellen.
;Jetzt werden die blauen Farbbalken mit einer moeglichst
;optimierten,deshalb leider auch relativ undurchsichtigen
;Routine in die Tabelle bei &3000 eingetragen.
LD IX,POS ;IX=Zeiger auf momentane Position der Balken.
LD B,4 ;Immer vier Rasterbalken kopieren.
L4 PUSH BC ;BC=Schleifenzaehler.
LD E,(IX+0) ;E=alte Position des Balkens,also &3000+E.
LD D,&31 ;DE zeigt jetzt auf unberuehrte Kopie der Tabelle bei &3100.
LD A,(DE) ;Farbwert holen und an die gleiche Stelle in
DEC D ;der veraenderten Farbtabelle bei &3000
LD (DE),A ;zurueckschreiben.
INC E ;Position des Balkens INCrementieren
LD (IX+0),E ;und in die Tabelle zurueck.
LD HL,FARBBAL;HL=Farbdaten der blauen Balken.
LD BC,34 ;34 Bytes (=ein Balken) nach DE
LDIR ;in die Farbtabelle kopieren.
INC IX ;Naechster Balken..
POP BC ;BC zurueck,
DJNZ L4 ;Schleife bis BC=0.
POP HL ;Zaehler fuer 1000 Durchlaeufe zurueck,
DEC HL ;DECrementieren
LD A,H ;und auf Null testen.
OR L ;Nein?
JR NZ,LOOP2 ;Dann noch ein Durchlauf..
EI ;Interrupts wieder ein -
RET ;und zum Basic.
;Farbdaten fuer blaue Rasterbalken.
FARBBAL DB &44,&44,&55,&44,&55,&55,&57,&55,&57,&57,&5F,&57,&5F,&5F,&4B
DB &5F,&4B,&4B,&5F,&4B,&5F,&5F,&57,&5F,&57,&57,&55,&57,&55,&55
DB &44,&55,&44,&44
;Farbdaten fuer roten Hintergrund.
TABELLE DB &5C,&4C,&4E,&4A,&43,&4A,&4E,&4C,&5C,&54
;Positionsdaten der Rasterbalken.
POS DB 00,&40,&80,&C0