	opt	l-			;nicht linken				
	
* ZScrollASCII V1.00
* 1991-09-03 by Markus Zeindlinger
* Sprache: DEVPAC-Assembler

_ExecBase		equ	4	;Basisadresse EXEC-Lib

_LVOOpenLibrary		equ	-552	;Offsets EXEC-Library
_LVOCloseLibrary	equ	-414
_LVOGetMsg		equ	-372
_LVOReplyMsg		equ	-378
_LVOAllocMem		equ	-198
_LVOFreeMem		equ	-210

_LVOOpenWindow		equ	-204	;Offsets INTUITION-Library
_LVOCloseWindow		equ	-72

_LVOMove		equ	-240	;Offsets GRAPHICS-Library
_LVOText		equ	-60
_LVOScrollRaster	equ	-396
_LVOSetAPen		equ	-342

_LVOOpen		equ	-30	;Offsets DOS-Library
_LVOClose		equ	-36
_LVORead		equ	-42
_LVOLock		equ	-84
_LVOUnLock		equ	-90
_LVOExamine		equ	-102
_LVODelay		equ	-198
_LVOOutput		equ	-60
_LVOWrite		equ	-48

Begin	movem.l	d0-d7/a0-a6,-(sp)	;Alle Regs retten (sauber, sauber!!)
	move.l	a0,Parameter		;Adresse d. CLI Params retten
	subq	#1,d0			;Parameterlaenge minus 1
	add.l	d0,a0			;Parameterende --> a0
	move.b	#" ",(a0)		;Steuerzeichen durch Space ersetzen
	
	move.l	Parameter,a0		;Parameteradresse --> a0
Loop	cmp.b	#" ",(a0)+		;Leerzeichen => Filename Ende ?
	bne.s	Loop			;Nein? => weitersuchen
	move.b	#0,-(a0)		;Ja! => mit Null stopfen
	addq.l	#1,a0			;Eine Stelle weiter
	cmp.b	#"-",(a0)+		;Ist Zeichen ein "-"?
	bne.s	FixSpeed		;Nein? => Default-Geschwindigkeit
SetSpeed
	sub.b	#48,(a0)		;ASCII Zahl in Geschw. umrechnen 
	cmp.b	#-1,(a0)		;Kleiner als -1?
	blt.s	FixSpeed		;Ja! => Default-Geschw. setzen
	cmp.b	#9,(a0)			;Groesser als 9?
	bgt.s	FixSpeed		;Ja! => Default-Geschw. setzen
	move.b	(a0),Speed		;Geschw. setzen (0-9)
	bra.s	OpenLibs
FixSpeed
	move.b	#1,Speed		;Default-Geschwindigkeit = 1
	
OpenLibs	
	move.l	_ExecBase,a6		;Exec-Basis -> a6
	lea	intname(pc),a1		;Adresse d. Lib-Namen -> a1
	moveq	#0,d0			;Version is uns wurst...
	jsr	_LVOOpenLibrary(a6)	;Library oeffnen
	tst.l	d0			;Was hamma in d0?
	beq	close			;Keine Lib => Ende
	move.l	d0,_IntuitionBase	;Library-Basis sichern
	
	lea	gfxname(pc),a1		;wie oben, nur Graphics-Lib
	moveq	#0,d0
	jsr	_LVOOpenLibrary(a6)
	tst.l	d0
	beq	intclose
	move.l	d0,_GfxBase
	
	lea	dosname(pc),a1		;und weil`s so schoen war...
	moveq	#0,d0			;(Dos-Lib)
	jsr	_LVOOpenLibrary(a6)
	tst.l	d0
	beq	gfxclose
	move.l	d0,_DosBase
	
	move.l	#260,d0			;260 Bytes reservieren
	moveq	#2,d1			;Chip-Ram
	jsr	_LVOAllocMem(a6)	;Speicher allokieren
	tst.l	d0			;Hat alles geklappt?
	beq	dosclose		;Nein? => Ende
	move.l	d0,FileInfoBlock	;Startadresse d. Speichers retten
	
	move.l	_DosBase,a6		;Dos-Basis -> a6
	move.l	Parameter,d1		;Zu ladendes File -> d1
	moveq	#-2,d2			;Lesezugriff
	jsr	_LVOLock(a6)		;Lock auf Datei holen
	tst.l	d0			;Gefunden?
	beq	errlock			;Nein? => Fehlermeldung
	move.l	d0,TextLock		;Ja! => Sichern
	
	move.l	d0,d1			;Lock auf Datei -> d1
	move.l	FileInfoBlock,d2	;Speicherbereich f. fib -> d2
	jsr	_LVOExamine(a6)		;FileInfoBlock holen
	tst.l	d0			;Gefunden?
	beq	fibclose		;Nein? => Ende
	
	move.l	TextLock,d1		;Lock auf Datei -> d1
	jsr	_LVOUnLock(a6)		;Datei entLOCKen...
	
	move.l	FileInfoBlock,a0	;Adresse d. fib -> a0
	move.l	124(a0),TextLength	;Dateilaenge ermitteln
	addq	#4,TextLength		;plus 4 - als Reserve
	
	move.l	_ExecBase,a6		;Dat kenne ma aber jetz...
	move.l	TextLength,d0		;Dateilaenge -> d0
	move.l	#$10000,d1		;Geloeschten Speicherbereich
	jsr	_LVOAllocMem(a6)	;Speicher f. Text anfordern
	tst.l	d0			;Bekommen?
	beq	errmem			;Nein? => Fehlermeldung
	move.l	d0,TextMem		;Ja! => Adresse sichern
	
	move.l	_DosBase,a6		;...
	move.l	Parameter,d1		;Dateiname -> d1
	move.l	#1005,d2		;Bestehendes File oeffnen
	jsr	_LVOOpen(a6)		;Textdatei oeffnen
	tst.l	d0			;Geklappt?
	beq	errfile			;Nein? => Fehlermeldung
	move.l	d0,TextHandle		;Datei-Identifikation sichern
	
	move.l	d0,d1			;Datei-Identifikation -> d1
	move.l	TextMem,d2		;Reservierter Speicher -> d2
	move.l	TextLength,d3		;Zu lesende Bytes (Textlaenge) -> d3
	jsr	_LVORead(a6)		;Endlich!! Text einlesen
	tst.l	d0			;Alles OK?
	bmi	errread			;Nein? => Fehlermeldung
	
	bsr	CloseText		;Ja! => Textdatei schliessen
	
	move.l	_IntuitionBase,a6	;...
	lea	Display(pc),a0		;Adresse d. Fensterdaten -> a0
	jsr	_LVOOpenWindow(a6)	;Scrollfenster oeffnen
	tst.l	d0			;Fenster offen?
	beq	memclose		;Nein? => Ende
	move.l	d0,WindowPtr		;Ja! => Zeiger auf Fenster sichern
	
	move.l	WindowPtr,a0		;Zeiger auf Fenster -> a0
	move.l	50(a0),_RastPort	;Adresse d. RastPort ermitteln
	move.l	86(a0),a5		;UserPort ermitteln und -> a5

	move.l	TextMem,TextPointer	;Textbeginn -> TextPointer
	
	move.l	_GfxBase,a6		;...
	move.l	_RastPort,a1		;RastPort -> a1
	moveq	#1,d0			;Farbregister Nr.1 verwenden
	jsr	_LVOSetAPen(a6)		;Farbe setzen

Heart					;das Herzstückl
	move.l	_ExecBase,a6		;...
	move.l	a5,a0			;UserPort -> a0
	jsr	_LVOGetMsg(a6)		;Checken, ob jemand Message schickt
	tst.l	d0			;Is Post da?
	bne	Message			;Ja! => Message auswerten

	move.l	_GfxBase,a6		;...
	move.l	_RastPort,a1		;RastPort -> a1
	move.l	#619,d0			;X-Position v. Grafikcursor
	move.l	#18,d1			;Y-Position v. Gc (relativ zum Window)
	jsr	_LVOMove(a6)		;Grafikcursor setzen
	
	move.l	TextPointer,a0		;Zeiger auf aktuelle Textposition -> a0
	tst.l	(a0)			;Ist noch Text da?
	beq	SetPointer		;Nein? => Zeiger auf Textbeginn
	move.w	(a0),d2			;2 Zeichen -> d2
	bsr	Check			;Zeichen ueberpruefen
	
	move.l	TextPointer,a0		;Zeiger auf aktuelle Textpos -> a0
	moveq	#2,d0			;Textlaenge = 2 Zeichen
	jsr	_LVOText(a6)		;2 Zeichen ausgeben
	addq.l	#2,TextPointer		;Zeiger um 2 erhoehen
	
Scroll
	move.l	#15,d6			;Schleife: 15 x 1 Pixel scrollen
	
DoIt	move.l	_GfxBase,a6
	move.l	_RastPort,a1		;RastPort -> a1
	moveq	#1,d0			;1 Pixel nach links
	moveq	#0,d1			;0 Pixel nach oben/unten
	moveq	#6,d2			;linke obere Ecke
	moveq	#12,d3			;des Scrollbereichs
	move.l	#637,d4			;rechte untere Ecke
	move.l	#19,d5			;des Scrollbereichs
	jsr	_LVOScrollRaster(a6)	;Es rollt und rollt und rollt...
	
	move.l	_DosBase,a6
	moveq	#0,d1			;d1 loeschen
	move.b	Speed,d1		;Geschwindigkeit/Pause -> d1
	jsr	_LVODelay(a6)		;Bitte Warten! - Verzoegerung
	
	dbf	d6,DoIt			;wenn nicht -1 => weiterscrollen
	bra	Heart			;weiter Zeichen schreiben

Check
	ror.w	#8,d2			;Zeichen in d2 vertauschen
	bsr	Splunch			;Ueberpruefen	
	addq	#1,a0			;Ein Zeichen im Text weiter
	rol.w	#8,d2			;Wieder vertauschen
	bsr	Splunch			;Zweites Zeichen vertauschen
	rts				;All right -> back again!
Splunch					;Dedicated to RAY!
	cmp.b	#31,d2			;ASCII-Code < 32?
	bls.s	SetSpace		;Ja! => Durch Space ersetzen
	cmp.b	#159,d2			;ASCII-Code > 159?
	bhi.s	Jump			;Ja! => Ruecksprung
	cmp.b	#127,d2			;ASCII-Code > 127?
	bhi.s	SetSpace		;Ja! => Durch Space ersetzen
Jump	rts				

SetSpace
	move.b	#32,(a0)		;mit ASCII fuer Space ersetzen
	bra.s	Jump
		
SetPointer
	move.l	TextMem,TextPointer	;Textanfang -> Textpointer
	bra	Heart

Message
	move.l	d0,a1			;Anfangsadr. Message -> a1
	jsr	_LVOReplyMsg(a6)	;Msg zurueckschicken
	
wndclose				;Window schliessen
	move.l	_IntuitionBase,a6
	move.l	WindowPtr,a0
	jsr	_LVOCloseWindow(a6)
	bra.s	memclose
txtclose				;Textdatei (bei Fehler) schliessen
	bsr	CloseText
memclose				;Textspeicher freigeben
	move.l	_ExecBase,a6
	move.l	TextMem,a1
	move.l	TextLength,d0
	jsr	_LVOFreeMem(a6)
fibclose				;FileInfoBlock-Speicher freigeben
	move.l	_ExecBase,a6
	move.l	FileInfoBlock,a1
	move.l	#240,d0
	jsr	_LVOFreeMem(a6)	
dosclose				;DOS-Lib schliessen
	move.l	_ExecBase,a6
	move.l	_DosBase,a1
	jsr	_LVOCloseLibrary(a6)
gfxclose				;Grafics-Lib schliessen
	move.l	_GfxBase,a1
	jsr	_LVOCloseLibrary(a6)
intclose				;Intuition-Lib schliessen
	move.l	_IntuitionBase,a1
	jsr	_LVOCloseLibrary(a6)
close
	movem.l	(sp)+,d0-d7/a0-a6	;Alle Regs. zurückschreiben
	moveq	#0,d0			;evtl. Fehlercode loeschen
	rts				;Finito. Schluss. Aus. Basta.	

* --------------------------------------------------------------

errlock					;Keinen Lock bekommen
	move.l	#locktxt,d2		;Adr. Fehlertext -> d2		
	moveq	#23,d3			;Textlaenge -> d3
	bsr	GetHandle		;Ausgabe-Handle holen
	bra.s	fibclose		;alles Geoeffnete schliessen

locktxt		dc.b	"--- File not found ---",10
		even
errmem					;Kein Speicher fuer Text
	move.l	#memtxt,d2
	moveq	#26,d3
	bsr	GetHandle
	bra	fibclose
	
memtxt		dc.b	"--- Not enough memory ---",10	
		even
errfile					
	move.l	#filetxt,d2
	moveq	#32,d3
	bsr	GetHandle
	bra	memclose
	
filetxt		dc.b	"--- Opening textfile failed ---",10	
		even
errread
	move.l	#readtxt,d2
	moveq	#19,d3
	bsr	GetHandle
	bra	txtclose
	
readtxt		dc.b	"--- Read error ---",10	
		even

* --------------------------------------------------------------

CloseText
	move.l	_DosBase,a6
	move.l	TextHandle,d1
	jsr	_LVOClose(a6)
	rts
	
* --------------------------------------------------------------

GetHandle
	move.l	_DosBase,a6		
	jsr	_LVOOutput(a6)		;Ausgabe-Handle ermitteln
	move.l	d0,d1
Print	jsr	_LVOWrite(a6)		;Text ins CLI schicken
	rts
			
* --------------------------------------------------------------

intname		dc.b	"intuition.library",0
gfxname		dc.b	"graphics.library",0
dosname		dc.b	"dos.library",0

_IntuitionBase		dc.l	0
_DosBase		dc.l	0
_GfxBase		dc.l	0

_RastPort		dc.l	0
TextPointer		dc.l	0
FileInfoBlock		dc.l	0
TextLock		dc.l	0
TextMem			dc.l	0
TextHandle		dc.l	0
TextLength		dc.l	0
Parameter		dc.l	0
WindowPtr		dc.l	0	
Speed			dc.b	0
			even
SignalBit		dc.b	0
			even
		
DisplayTitle	dc.b	"ZScrollASCII V1.00E",0
		even

Display		dc.w	0,234
		dc.w	640,22
		dc.b	-1,-1
		dc.l	512
		dc.l	4110
		dc.l	0,0
		dc.l	DisplayTitle
		dc.l	0,0
		dc.w	640,22
		dc.w	640,22
		dc.w	$0001
		even

* -------------- End of Z --------------------------------------

