*************************************
* LISTING 1:
* 
* Horizontal es Fein—Scrolling
* in Maschinensprache
* 
* Peter Finzel 85
*************************************
* 
* Konstante
* 
BASIS 	EQU $7000
HSMAX 	EQU 7 		;Maximal verschiebung Feinscrolling
ZEILE 	EQU 256 	;Zeilenlaenge in Byte
ZZAHL 	EQU 10 		;Anzahl der Zeilen am Schirm
GRBMAX 	EQU 233 	;rechtes Zeilenende
MOD 	EQU 7+$50 	;ANTIC Modus 7, Hscrol und LMS
* 
* Operating System
* 
SDLSTL	EQU $0230 	;Schattenreg. Display-Listadresse
STICKO	EQU $0278 	;Schattenreg. f. Joystick Nr. 0
SETVBV	EQU $E45C 	;Routine f. Interruptvekoren
XITVBV	EQU $E462 	;Abschluss des VBI
*
* Hardware
*
HSCROL	EQU $D404 	;Register hor.Verschiebung
*
*************************************
* Programm-Einsprung
*************************************
*
	ORG $0600 	;wie immer in Page 6
*
 	PLA 		;BASIC Einsprung X=USR(1536)
	JMP HSINIT 	;Sprung zum MP-Anfang
*
*************************************
* Display-List fuer horizontal
* scrollendes 'GRAPHICS 2'-Display
* 10 Zeilen ANTIC-Modus 7
*************************************
*
DLIST	DFB $70,$70,$70	;3 Leerzeilen
 	DFB MOD		;ANTIC—Befehl
LMSADR	DFW BASIS	;Adresse Bildspeicher
 	DFB MOD
	DFW BASIS+ZEILE
	DFB MOD
	DFW BASIS+(ZEILE*2)
	DFB MOD
	DFW BASIS+(ZEILE*3)
	DFB MOD
	DFW BASIS+(ZEILE*4)
	DFB MOD
	DFW BASIS+(ZEILE*5)
	DFB MOD
	DFW BASIS+(ZEILE*6)
	DFB MOD
	DFW BASIS+(ZEILE*7)
	DFB MOD
	DFW BASIS+(ZEILE*8)
	DFB MOD
	DFW BASIS+(ZEILE*9)
	DFB $41 	;ANTIC—JMP—Befehl
	DFW DLIST 	;zum Anfang der Disp.-List
*
*************************************
* Interne Variable
*************************************
*
 SHSCR	DFB 0		;Schattenregister HSCROL
 GRBSCR	DFB 0		;Zaehler fuer Grobscrolling
*
*************************************
* Initialisierungsroutine zum
* Einrichten der neuen Disp.-List
* und der VBI -Routine
*************************************
*
HSINIT	LDA #0		;Grobscrolling
	STA GRBSCR	;auf Null
	JSR SETLMS	;und Displaylist vorbereiten
	LDA #DLIST:L	;neue Disp.-List
	STA SDLSTL	;einschalten
	LDA #DLIST:H
	STA SDLSTL+1
	LDA #0		;Fein-Scrolling in Ausgangs-
	STA HSCROL	;position setzen
	STA SHSCR	;auch Schattenregister!
	LDY #HSVBI:L	;Scroll-Routine in
	LDX #HSVBI:H	;den VBI einfuegen
	LDA #7		;deferred VBI genuegt
	JSR SETVBV	;ohne Kommentar...
	RTS
*
*************************************
* VBI-Routine f. hor. Scrolling
*************************************
*
HSVBI	CLD		;6502 rechnet binaer
	LDA STICK0	;Joystick 0
	AND #8		;nach rechts?
	BNE TLINKS	;nein, versuche links — >
*
 	JSR RECHTS	;Bildschirm nach rechts
	JMP VBIEND	;Fertig !===>
*
TLINKS	LDA STICK0
	AND #4		;nach links gezogen?
	BNE VBIEND	;nein, kein Scrolling!
*
	JSR LINKS	;nach links scrollen
*
VBIEND	LDA SHSCR	;Schattenregister Feinscroll
	STA HSCROL	;in Hardwarereg. uebertragen
	JMP XITVBV	;Schluss fuer heute!
*
*************************************
* UP Bildschirm nach LINKS
*************************************
*
LINKS	LDA SHSCR	;Zeichengrenze erreicht?
	BNE LNK1	;nein — >
*
	LDA GRBSCR	;Weiteres Scrolling
	CMP #GRBMAX	;nach links moeglich?
	BCS LNKEND	;nein, kein Scrolling ->
LNK1	DEC SHSCR	;Ein Pixel nach links
	LDA SHSCR	;reicht Feinscrolling?
	BPL LNKEND	;jawohl, dann fertig
*
	LDA #HSMAX	;Feinverschiebung zurueck
	STA SHSCR
	INC GRBSCR	;Grobposition weiter
	JSR SETLMS	;in Displaylist eintragen
LNKEND	RTS
*
*************************************
* UP Bildschirm nach RECHTS
*************************************
*
RECHTS	LDA SHSCR	;Zeichengrenze erreicht?
	BNE RHT1	;nein — >
*
	LDA GRBSCR	;Rand erreicht?
	BEQ RHTEND	;ja, kein Scrolling ->
RHT1	INC SHSCR	;ein Pixel rechts
	LDA SHSCR	;Feinscrolling ausreichend?
	CMP #HSMAX+1
	BCC RHTEND
*
	LDA #0		;Feinscrolling
	STA SHSCR	;ruecksetzen
	DEC GRBSCR	;Grob-Pos. zurueck
	JSR SETLMS	;in Disp.—List eintragen
RHTEND	RTS
*
*************************************
* UP Eintragen der LMS Adresse
*************************************
*

SETLMS	LDX #0		;Index in Disp.—List
	LDA GRBSCR	;Grobscroll—Position
NXTLMS	STA LMSADR,X	;in zweiten Byte
	INX		;jeder ANTIC-Anweisung
	INX		;eintragen
	INX
	CPX #ZZAHL*3	;alle Zeilen bearbeitet?
	BCC NXTLMS	;noch nicht — >
	RTS
