* ONE LINE ONLY
;SPECIAL EFFECTS - Listing #6
;One Line Only - 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 A,1 ;MODE 1
CALL &BC0E ;einschalten.
LD BC,&BC02 ;Bild ganz
OUT (C),C ;nach
LD BC,&BD31 ;links
OUT (C),C ;ruecken.
LD BC,&BC07 ;Und etwas nach unten
OUT (C),C ;schieben,damit der
LD BC,&BD1C ;Elektronenstrahl den
OUT (C),C ;Scrolltext nicht zu frueh erreicht.
LD BC,&7F00 ;INK 0,0
OUT (C),C
LD C,&54
OUT (C),C
LD HL,1000 ;Wieder 20 Sekunden.
LOP2 LD B,&F5 ;Auf vertikalen
FRAME IN A,(C) ;Strahlruecklauf
RRCA ;warten...
JR NC,FRAME
PUSH HL ;Zaehler sichern.
LD HL,&C001 ;Jetzt die oberste Bildschirmzeile scrollen.
LOP5 PUSH HL ;HL=Quelladresse,
LD D,H ;DE=HL-1
LD E,L
DEC E
LD BC,100 ;100 Bytes
LDIR ;Scrollen.
POP HL ;Alte Quelladresse zurueck
LD A,H ;Und naechste Pixelzeile
ADD A,8 ;berechnen. (&C0-&C8-&D0 etc.)
LD H,A ;Wenn kein Ueberlauf (Carryflag bei &F8+8 gesetzt),
JR NC,LOP5 ;dann noch eine Pixelzeile scrollen.
LD B,100 ;Warten,bis der Elektronenstrahl die
WAIT DJNZ WAIT ;Laufschrift erreicht hat.
LD BC,&BC01 ;Dann CRTC
OUT (C),C ;Register 1
LD BC,&BD40 ;auf &40
OUT (C),C ;setzen.
FLAG LD A,1 ;Da der Text byteweise gescrollt wird,ein Buchstabe aber
XOR 1 ;in Mode 1 zwei Bytes breit ist, muss nur jedes zweite
LD (FLAG+1),A ;Mal ein neuer Buchstabe geprintet werden.
JR Z,NOPRINT ;Wenn FLAG also null,dann NOPRINT,sonst neuer Buchstabe.
LD HL,&0902 ;Cursor auf Buchstaben-
CALL &BB75 ;printposition setzen.
CHARA LD A,32 ;ASCII Code des neuen Zeichens laden,
INC A ;erhoehen,
LD (CHARA+1),A ;und zurueckschreiben.
CP 126 ;Wenn noch nicht CHR$(126),
JR NZ,PRIN ;dann Zeichen Printen,
LD A,32 ;sonst wieder bei SPACE
LD (CHARA+1),A ;=CHR$(32) beginnen.
PRIN CALL &BB5A;Zeichen an Cursorposition ausgeben.
NOPRINT DI ;Interrupts wieder abschalten.
POP HL ;Zaehler vom Stack holen,
DEC HL ;DECrementieren,
LD A,H ;und 1000x
OR L ;zu LOP2
JR NZ,LOP2 ;zurueckspringen.
;CRTC Register mit Standardwerten laden.
LD BC,&BC01:OUT (C),C
LD BC,&BD28:OUT (C),C
LD BC,&BC02:OUT (C),C
LD BC,&BD2F:OUT (C),C
LD BC,&BC07:OUT (C),C
LD BC,&BD1E:OUT (C),C
EI ;Interrupts ein -
RET ;und zum Basic.