;	Finde Instrumente 'FINST' © 1990 EHJ

;	Ausgabe aller in EINEM SMUS-File
;	verwendeten Instrumente

;	Ausgabe auf Bildschirm und Drucker (wenn gewünscht)

;	Aufruf vom CLI: 'FINST' oder 'RUN FINST'
;	Aufruf von Workbench: Doppelklick auf Icon

;	Gerätenamen DF0: DF1: etc. können frei verändert
;	werden (Text oder Reihenfolge)

ExecBase=4

;---Funktionen aus exec.library
Forbid=-132
AllocMem=-198
FreeMem=-210
FindTask=-294
GetMsg=-372
ReplyMsg=-378
WaitPort=-384
OpenLib=-408
CloseLib=-414

;---Funktionen aus intuition.library
CloseWindow=-72
DisplayBeep=-96
EndRequest=-120
OpenWindow=-204
Request=-240
SetWindowTitles=-276
RefreshGList=-432	;1.3
RefreshWFrame=-456	;1.3

;---Funktionen aus dos.library
Open=-30
Close=-36
Read=-42
Write=-48
Output=-60
Lock=-84
UnLock=-90
Examine=-102
ExNext=-108

;---Funktionen aus graphics.library
ClearScreen=-48

RAM=11*1024	;RAM-Speicher-Größe 11 Kilobyte

;---Test, ob vom CLI oder von Workbench gestartet wurde
g:	move.l	a7,Stack	;Stack merken
	sub.l	a1,a1		;A1 auf 0
	move.l	ExecBase,a6
	jsr	FindTask(a6)	;eigenen Task suchen
	move.l	d0,a4		;Zeiger auf Task in A4
	tst.l	$ac(a4)		;ist 172. Byte <> 0 ?
	bne.s	vomCLI		;dann vom CLI gestartet

;---Es wurde von Workbench gestartet
	lea	$5c(a4),a0	;WB-Message
	jsr	WaitPort(a6)	;abwarten,
	jsr	GetMsg(a6)	;abholen
	move.l	d0,WBMessage	;und merken

;---Librarys, Fenster und Ausgabekanäle öffnen, Devices suchen
vomCLI:	bsr	OpenAll
	cmp.w	#4711,d0	;Fehler ?
	beq	ENDE		;ja, Programm beenden

;---RAM reservieren:
;---1200 Bytes: Adressen von 300 Filenamen (Adressen/Adr)
;---8800 Bytes: Filenamen (Files)
;--- 260 Bytes: FileInfoBlock (FIB)
;---1004 Bytes: Ausgabepuffer
	move.l	#RAM,d0		;11 KB im RAM
	bsr	Reservieren	;reservieren für
	move.l	d0,Adressen	;ab 'Adressen' im Speicher
	bne.s	Ueberg		;reservieren hat geklappt, sonst

	lea	FreiTxt,a0	;'Nicht genug Speicher'
	bsr	Schei		;ausgeben und
	bra	AlleZu		;Programm beenden

Ueberg:	bsr	AdrUeb		;Adressen-Zeiger an 'Adr' und
	add.l	#8800,a0	;Filenamen (8800 Bytes)
	move.l	a0,AusPu	;Ausgabepuffer (1004 Bytes)
	add.l	#1004,a0
	move.l	a0,FIB		;FileInfoBlock (260 Bytes)

;---CHIP-RAM reservieren:
;---80 Bytes für Images (Requester-Pfeile)
;--- 8 Bytes für Piepton-Daten
	moveq	#88,d0		;88 Bytes 
	move.l	#$10002,d1	;im CHIP-RAM löschen und
	bsr	Reservieren2	;reservieren
	move.l	d0,Images	;für Images/Töne
	beq	AdFrei		;hat nicht geklappt, PRG beenden

;---Images/Ton-Daten ins CHIP-Ram kopieren
	lea	ImageU,a0	;Daten aus Programm
	move.l	Images,a1	;ins CHIP-RAM
	moveq	#21,d7		;22 LW = 88 Bytes
ImLoop:	move.l	(a0)+,(a1)+	;kopieren
	dbra	d7,ImLoop	;alle kopiert ?

;---RAM-Adressen in Imagesstrukturen eintragen
	move.l	Images,a1
	move.l	a1,ImUp		;Adresse A1 nach ImUp
	add.l	#20,a1
	move.l	a1,ImUp2	;A1 +20 nach ImUp2
	add.l	#20,a1
	move.l	a1,ImDn		;+20 nach ImDn
	add.l	#20,a1
	move.l	a1,ImDn2	;+20 nach ImDn2
	add.l	#20,a1
	move.l	a1,Toene	;+20 nach Toene

;---Druckerausgabe ?
DruJN:	bsr	Warte		;Warte auf
	cmp.w	#$40,d7		;GADGETUP ?
	bne.s	DruJN		;nein, weiter warten

	cmp.w	#44,d6		;NEIN-Gadget ?
	beq.s	nixPRT		;also kein Drucker

	st	PRTFlag		;sonst Flag setzen

;---Ja/Nein-Gadgets löschen
nixPRT:	clr.l	ErrGad		;Zeiger auf J/N-Gadgets löschen
	move.l	Winhd,a1
	move.l	50(a1),a1	;Fenster
	move.l	GfxBase,a6
	jsr	ClearScreen(a6)	;komplett löschen
	move.l	Winhd,a0
	move.l	IntBase,a6
	jsr	RefreshWFrame(a6);Rahmen etc. wieder herstellen
;-------                -------------------------
Haupt:	lea	WahlTxt,a0	;'Filenamen...'
	bsr	ErrGadNeu	;ausgeben
	bsr	Requester	;Requester aufrufen
	cmp.w	#4711,d0	;Fehler ?
	bne.s	Haupt2		;nein, weiter

	bsr	Schei		;ße, Fehlermeldung ausgeben
	bra.s	Uups		;und Programm beenden

Haupt2:	tst.w	d6		;Wurde UUPS angeklickt ?
	beq.s	Uups		;ja, Programm beenden

	bsr 	FileLaden	;File laden
	cmp.w	#4711,d0	;Lade/Alloc/Format-Fehler ?
	bne.s	Haupt		;nein, zum Requester

	bsr	Schei		;ße, Fehlermeldung ausgeben
	bra.s	Haupt		;und von vorne
;------------------------------------------------
Uups:	move.l	Images,a1	;Images/Ton-Speicher
	moveq	#88,d0		;88 Bytes
	bsr	Freigeben	;freigeben

AdFrei:	move.l	Adressen,a1	;Adressen-Speicher
	move.l	#RAM,d0		;11 Kilobytes
	bsr	Freigeben	;freigeben

AlleZu:	bsr	CloseAll	;Librarys/Fenster schließen

;---Programm beenden
ENDE:	tst.l	WBMessage	;Workbench-Message vorhanden ?
	beq.s	TUESS		;nein, weiter

	move.l	ExecBase,a6
	jsr	Forbid(a6)	;Multitasking abschalten
	move.l	WBMessage,a1	;Message
	jsr	ReplyMsg(a6)	;zurückschicken
TUESS:	move.l	Stack,a7	;Stack wieder herstellen
	moveq	#0,d0		;D0 löschen, dann
	rts			;ENDE UND AUS
;------------------------------------------------
;**************** UNTERPROGRAMME ****************
;UP - Piepton
;------------------------------------------------
Ton:	move.l	Toene,$dff0a0	;Tondatenadresse übergeben
	move.w	#4,$dff0a4	;4 Daten-Worte
	move.w	#444,$dff0a6	;Abtastrate
	move.w	#64,$dff0a8	;Lautstärke voll
	move.w	#$8201,$dff096	;Tonkanal 0 einschalten
	move.w	#65000,d0	;Warte-
ToLoo:	dbra	d0,ToLoo	;schleife

	clr.w	$dff0a8		;Lautstärke 0
	move.w	#1,$dff096	;Ton abschalten
	rts
;------------------------------------------------
;UP - File Laden (kompletter Filename im Undopuffer)
;     Feststellen, ob SMUS oder 8SVX
;------------------------------------------------
FileLaden:
	lea	MomentTxt,a0	;'Moment...'
	bsr	ErrGadNeu	;ausgeben
	move.l	#Undo,d1	;Zeiger auf Filenamen
	move.l	#1005,d2	;Modus OLD
	move.l	DosBase,a6
	jsr	Open(a6)	;File öffnen
	move.l	d0,Filehd	;File-Header abholen
	bne.s	wLaden		;Header <> 0 ?, dann weiter laden

	lea	FileTxt,a0	;sonst Fehler
	bra	Error		;ausgeben

wLaden:	move.l	d0,d1		;Fileheader nach d1
	move.l	#Undo,d2	;Pufferadresse
	moveq	#8,d3		;8 Bytes in Puffer
	jsr	Read(a6)	;einlesen
	cmp.l	#"FORM",Undo	;die ersten 4 Bytes = 'FORM' ?
	bne.s	NoIFF		;nein, Fehler ausgeben

;---Speicher für gesamte FORM reservieren
	move.l	Undo+4,d0	;Länge der FORM nach D0
	move.l	d0,FormL	;Länge merken und 'FormL'- Bytes
	bsr	Reservieren	;im RAM reservieren
	move.l	d0,Puffer	;ab 'Puffer' im Speicher
	bne.s	wPuff		;weiter, wenn kein Fehler

;---Fehlermeldung: Irgendein Speicher wurde nicht reserviert
NoFree:	bsr	CloseF		;File schließen
NoFree2:
	lea	FreiTxt,a0	;'Nicht genug Speicher'
	bra	Error		;ausgeben

;---Gesamte Form in Puffer einlesen
wPuff:	move.l	Filehd,d1
	move.l	FormL,d3	;gesamte FORM
	move.l	d0,d2		;in Puffer
	move.l	DosBase,a6
	jsr	Read(a6)	;einlesen, in D0 Anzahl der
	cmp.l	FormL,d0	;wirklich gelesenen Bytes
	beq.s	wForm		;D0 = FormL ?, sonst

;---File hat kein IFF-Format
	bsr	FoFrei		;Formspeicher erst wieder freigeben
NoIFF:	bsr	CloseF		;File schließen
NoIFF2:	lea	IFFTxt,a0	;'Kein SMUS-File'
	bra	Error		;ausgeben

wForm:	bsr	CloseF		;File schließen
	move.l	Puffer,a5	;Ab Puffer untersuchen
	cmp.l	#"SMUS",(a5)	;'SMUS' ?
	beq.s	isSMUS		;ja, weiter

	cmp.l	#"8SVX",(a5)	;'8SVX' ?
	beq.s	is8SVX		;ja, weiter, sonst

;---'File ist kein IFF-Format' ausgeben
	bsr	FoFrei		;Formspeicher erst wieder freigeben
	bra.s	NoIFF2		;und Fehler ausgeben

;---File ist 8SVX-File
is8SVX:	bsr	FiNAus		;Filenamen in Puffer kopieren
	lea	SVXTxt,a0	;'8SVX...'-Text an Filenamen
	bsr	Kopie		;anhängen
	tst.b	-(a1)		;zurück aufs Nullbyte
	bsr	LFRET		;Linefeed und Return anhängen
INSEnd:	bra	TxtAus		;Text ausgeben, zurück in Requester

;---File ist SMUS-File
isSMUS:	bsr	FiNAus		;Filenamen in Puffer kopieren
	addq.l	#4,a5		;A5 auf ersten Chunk
	bra.s	woTRAK		;ab A5 untersuchen

;---1 Chunk weiter
Chunks:	move.l	4(a5),d0	;D0 = Chunklänge
	move.l	d0,d1		;D0 nach D1
	divu	#2,d1		;D1 : 2 (Rest wenn D1 ungerade)
	lsl.l	#1,d1		;D1 * 2
	cmp.l	d0,d1		;D1 <> D2
	beq.s	wChunk		;gleich, dann weiter

	addq.l	#1,d0		;sonst D0 auf gerade Zahl
wChunk:	add.l	d0,a5		;zu A0 addieren
	addq.l	#8,a5		;+8 für Chunkname/Chunklänge

;---Wenn TRAK gefunden, Suche beenden
woTRAK:	cmp.l	#"TRAK",(a5)	;TRAK ?
	beq.s	INSEnd		;ja, Text ausgeben, zurück

woINS1:	cmp.l	#"INS1",(a5)	;Instrument ?
	bne.s	Chunks		;nein, weiter suchen

;---Instrument gefunden, Namen im Puffer anhängen
	lea	12(a5),a0	;Name ab A0
	move.w	6(a5),d7	;Länge Instrumenten-Chunk
	subq.w	#5,d7		;-4 = Länge des Namens, -1 = Zähler
InLoop:	move.b	(a0)+,(a1)+	;1 Byte kopieren
	dbra	d7,InLoop	;bis alle kopiert

	bsr	LFRET		;Linefeed/Return anhängen
	bra.s	Chunks		;und zur Chunk-Schleife
;------------------------------------------------
;UP - Filenamen in Ausgabe-Puffer kopieren
;------------------------------------------------
FiNAus:	lea	Filename,a0	;Filenamen
	move.l	AusPu,a1	;in Ausgabepuffer
	bsr	Kopie		;kopieren
	tst.b	-(a1)		;zurück aufs Nullbyte
	move.b	#":",(a1)+	;Doppelpunkt,
LFRET:	move.b	#10,(a1)+	;Linefeed und
	move.b	#13,(a1)+	;Return anhängen
	rts
;------------------------------------------------
;Kompletten Text ausgeben, zurück in Requester
;------------------------------------------------
TxtAus:	move.b	#10,(a1)+	;Abschluß-Linefeed anhängen
	move.l	a1,d3		;Adresse A1 holen
	sub.l	AusPu,d3	;- Startadresse, D3 = Länge Text

;---Fenster öffnen
	move.l	#RAWTxt,d1	;Fenster
	move.l	#1005,d2
	move.l	DosBase,a6
	jsr	Open(a6)	;öffnen
	move.l	d0,RAWhd
	bne.s	FTxt		;kein Fehler, weiter

;---Fenster oder Drucker konnten nicht geöffnet werden
FDerr:	bsr	FoFrei		;FORM-Speicher erst freigeben
	bra	NoFree2		;Fehler ausgeben

;---Text im Fenster ausgeben
FTxt:	bsr	Txt

;---Drucker öffnen
DRKauf:	tst.b	PRTFlag		;Flag gesetzt ?
	beq.s	noDRK		;nein, weiter

	move.l	#PRTTxt,d1	;Drucker
	move.l	#1006,d2
	jsr	Open(a6)	;öffnen
	move.l	d0,PRThd
	bne.s	DTxt		;kein Fehler, weiter

	bsr	CloseFD		;Fenster schließen
	bra.s	FDerr		;Fehler ausgeben

;---Text auf Drucker ausgeben
DTxt:	bsr	Txt

;---Auf linke Maustaste warten
noDRK:	lea	MausTxt,a0	;'Maustaste...'
	bsr	ErrGadNeu	;ausgeben

;---Warten auf linke Maustaste
Maus:	btst	#6,$bfe001	;linke Taste gedrückt ?
	bne.s	Maus		;nein, weiter warten

	bsr	CloseFD		;Fenster/Drucker schließen
;-------               --------------------------
;UP - RAM-Speicher für FORM wieder freigeben
;------------------------------------------------
FoFrei:	move.l	Puffer,a1	;Puffer mit Länge
	move.l	FormL,d0	;'FormL'- Bytes
;-------                -------------------------
;UP - RAM-Speicher freigeben
;------------------------------------------------
Freigeben:
	move.l	ExecBase,a6
	jmp	FreeMem(a6)
;------------------------------------------------
;UP - Text ausgeben, Header in D0, Länge in D3
;------------------------------------------------
Txt:	move.l	d0,d1		;Fenster/Drucker
	move.l	AusPu,d2	;Pufferadresse in D2
	jmp	Write(a6)	;Text ausgeben
;------------------------------------------------
;UP - Fehlermeldung ausgeben, auf Bestätigung warten
;------------------------------------------------
Schei:	bsr	ErrGadNeu	;Gadget neu
	lea	KlickTxt,a1	;'Hier klicken'
	bsr	WinTit		;als Fensterüberschrift
	move.l	#0,a0		;alle Screens
	jsr	DisplayBeep(a6)	;blinken kurz auf
	bsr	Ton		;Piepton
;-------           ------------------------------
;UP - Warten auf CLOSEWINDOW
;------------------------------------------------
CKlick:	bsr	Warte		;ist im MsgPort
	cmp.w	#$200,d7	;CLOSEWINDOW angekommen ?
	bne.s	CKlick		;nein, weiter warten

	lea	UeberText,a1	;alte Überschrift
;-------                    ---------------------
;UP - Fensterüberschrift neu ausgeben
;------------------------------------------------
WinTit:	move.l	Winhd,a0
	move.l	#-1,a2
	move.l	IntBase,a6
	jmp	SetWindowTitles(a6)
;------------------------------------------------
;UP - Erroradget ausgeben, Textadresse in A0
;------------------------------------------------
ErrGadNeu:
	move.l	a0,ErrTxt	;Errortext in Gadget eintragen
	lea	ErrGad,a0
	moveq	#1,d0		;1 Gadget
	bra	Refresh2	;neu ausgeben
;------------------------------------------------
;UP - Requester ausgeben, Gadgets abfragen
;------------------------------------------------
Requester:
	lea	FileRequester,a0
	move.l	Winhd,a1
	move.l	IntBase,a6
	jsr	Request(a6)
	tst.l	d0		;Fehler ?
	beq	NoFree2		;ja, Fehler ausgeben

;---Adressen der Filegadget-Texte holen
	lea	GadgetTexte,a0	;Adressen
	move.l	#File0T,(a0)+	;der 6
	move.l	#File1T,(a0)+	;FileTexte
	move.l	#File2T,(a0)+	;in Tabelle ab
	move.l	#File3T,(a0)+	;'GadgetTexte'
	move.l	#File4T,(a0)+	;eintragen
	move.l	#File5T,(a0)+
	bra.s	RLoop		;Ton überspringen
;------------------------------------------------
; REQUESTER-ABFRAGE-SCHLEIFE
;------------------------------------------------
TRLoop:	bsr	Ton		;Piepton ausgeben
RLoop:	bsr	Warte		;warte auf Ereignis
	cmp.w	#$40,d7		;GADGETUP ? (Gadget losgelassen)
	bne.s 	RLoop		;nein - weiter warten

;---Keine Directory gelesen: Filegadgets nicht abfragen
	tst.w	AnzFiles	;Anzahl Files = 0 ?
	beq.s	ID11		;Filegadgetabfragen überspringen
;------------------------------------------------
;  Filename (Gadgets 0-5)
;------------------------------------------------
	cmp.w	#6,d6		;Gadget 0-5 ?
	bge.s	ID11		;nein, weiter

	lsl.b	#2,d6		;D6 * 4 für Adressensprung
	lea	GadgetTexte,a0	;Adressentabelle der 6 Gadgettexte
	move.l	(a0,d6),a0	;D6-te Adresse holen
	move.l	(a0),a0		;A0 zeigt auf den Filenamen
	cmp.b	#"(",(a0)	;ist es Directory ?
	beq.s	isDir		;ja, Unterdir holen

;---Filenamen in Filenamengadget eintragen
	lea	Filename,a1	;Filename ab A1
	bsr	Kopie		;Name (ab A0) in Filename kopieren
	bsr	RefreshFile	;File-Gadget neu ausgeben
	bra.s	RLoop		;und zur Hauptabfrage

;---Unterdirectorynamen in Pfad eintragen
isDir:	addq.l	#6,a0		;1.Buchstaben ab (A0)
	move.w	PfLang,d6	;Länge Pfadnamen nach D6
	lea	Pfad,a1		;Pfadname ab (A1)
	add.l	d6,a1		;(A1) = letztes Byte
	bsr	TestDirs	;Wieviele Dirs ?
	tst.b	d4		;Dirs = 0 (Root) ?
	beq.s	Dir0		;ja, weiter, sonst

	move.b	#'/',(a1)+	;'/' vor nächste Dir
Dir0:	bsr	Kopie		;Filenamen anhängen
	bra	Dirhol		;und neue Unterdir holen
;------------------------------------------------
;  DF0: DF1: DH0: DH1: RAM: (Gadgets 11-15)
;------------------------------------------------
ID11:	cmp.w	#11,d6		;D6 < 'DF0:'-Gadgetnummer ?
	bmi.s	ID16		;ja, weiter

	cmp.w	#16,d6		;D6 > 'RAM:'-Gadgetnummer ?
	bge.s	ID16		;ja, weiter

	sub.w	#11,d6		;D6 jetzt 0-4
	mulu	#6,d6		;D6 * 6 für Adressensprung
	lea	Laufwerke,a0	;Adressentabelle der Namen
	add.l	d6,a0		;D6-te Adresse holen
	bra	RootDir		;und Root-Directory einlesen
;------------------------------------------------
;  / (Gadget 16)
;------------------------------------------------
ID16:	cmp.w	#16,d6		;/ ?
	bne.s	ID18		;nein, weiter

	bsr	TestDirs	;wieviele Dirs ?
	tst.b	d4		;Dirs = 0 ?
	beq	TRLoop		;ja, nicht reagieren

;---Pfad von hinten nach '/' oder ':' absuchen
	move.w	PfLang,d6	;Pfadnamenlänge nach D6
	lea	Pfad,a0		;(A0) auf 1.Byte
	add.l	d6,a0		;(A0) auf letztes Byte
	subq.w	#1,d6		;D6 - 1
Strich:	move.b	-(a0),d2	;1 Byte nach D2
	cmp.b	#'/',d2		;ist es '/' ?
	beq.s	fStri		;ja, 0-Byte für Strich einsetzen

	cmp.b	#':',d2		;ist es ':' ?
	beq.s	hDopp		;ja, 0-Byte hinter ':' einsetzen

	dbra	d6,Strich	;nächstes Byte testen

;---'/' oder Zeichen nach ':' durch Nullbyte ersetzen
hDopp:	tst.b	(a0)+		;ja, (A0) hinter ':', und
fStri:	move.b	#0,(a0)		;dort Nullbyte einsetzen
	bra	Dirhol		;und neue Directory holen
;------------------------------------------------
;  UUPS! (Gadget 18)
;------------------------------------------------
ID18:	cmp.w	#18,d6		;UUPS! ?
	bne.s	ID9		;nein, weiter

	moveq	#0,d6		;ja, D6 lang löschen
	bra.s	ReqZu		;und Requester beenden
;------------------------------------------------
;  PFAD (Gadget 9 - RETURN-Taste gedrückt)
;------------------------------------------------
ID9:	cmp.w	#9,d6		;PFAD ?
	bne.s	ID17		;nein, weiter

	tst.w	PfLang		;Pfadnamenlänge = 0 ?
	beq	TRLoop		;ja, nicht reagieren

	st	RootFlag	;Flag setzen
	bra	Dirhol		;Unterdir holen
;------------------------------------------------
;  OK (Gadget 17)
;------------------------------------------------
ID17:	cmp.w	#17,d6		;OK ?
	beq.s	OK		;ja, nach OK
;-------          -------------------------------
;  FILE (Gadget 10 - RETURN-Taste gedrückt)
;------------------------------------------------
ID10:	cmp.w	#10,d6		;FILE ?
	bne	Scroll		;nein, weiter

OK:	tst.w	FiLang		;Länge Filename = 0 ?
	beq	TRLoop		;dann keine Reaktion

	tst.w	PfLang		;Länge Pfadname = 0 ?
	beq	TRLoop		;dann keine Reaktion

;---Pfadnamen in Undopuffer kopieren
	lea	Pfad,a0		;Pfadname in
	lea	Undo,a1		;Undopuffer
	bsr	Kopie		;kopieren
	tst.b	-(a1)		;1 Byte zurück wegen Nullbyte
	bsr	TestDirs	;Anzahl Dirs feststellen
	tst.b	d4		;Dirszähler = 0 ?
	beq.s	KopOK		;ja, dann ok,

	move.b	#"/",(a1)+	;sonst '/' vor Filenamen

;---Filenamen anhängen - kompletter Name nun im Undopuffer
KopOK:	lea	Filename,a0	;Filenamen im Undopuffer
	bsr	Kopie		;anhängen
;-------             ----------------------------
; Requester beenden
;------------------------------------------------
ReqZu:	lea	FileRequester,a0
	move.l	Winhd,a1
	move.l	IntBase,a6
	jmp	EndRequest(a6)	;Requester schließen
;------------------------------------------------
Scroll:	cmp.w	#7,AnzFiles	;weniger als 7 Filenamen ?
	bmi	RLoop		;ja, scrollen nicht möglich
;-------             ----------------------------
;  Pfeil Down (Gadget 7)
;------------------------------------------------
	cmp.w	#7,d6		;Pfeil Down ?
	bne.s	ID6		;nein, weiter

	move.w	AnzFiles,d0	;Anzahl Files
	subq.w	#6,d0		;-6 nach D0
	cmp.w	Zaehler,d0	;Zähler = AnzahlFiles - 6 ?
	beq	RLoop		;ja, die letzten 6 Namen bleiben

	addq.w	#1,Zaehler	;Zähler erhöhen
	move.l	Adr,a0		;Aktuelle Filenamenadresse nach A0
	addq.l	#4,a0		;eine Adresse weiter
	bra	Neue6		;und 6 Filenamen neu ausgeben
;------------------------------------------------
;  Pfeil Up (Gadget 6)
;------------------------------------------------
ID6:	cmp.w	#6,d6		;Pfeil Up ?
	bne.s	ID8		;nein, weiter testen

	tst.w	Zaehler		;Zähler = 0 ?
	beq	RLoop		;ja, dann nicht scrollen

	subq.w	#1,Zaehler	;Zähler erniedrigen
	moveq	#4,d1		;Adr auf vorherige
	bra.s	Minus		;Adresse stellen
;------------------------------------------------
;  Schieber (Gadget 8)
;------------------------------------------------
ID8:	cmp.w	#8,d6		;Schieber ?
	bne	RLoop		;nein

	moveq	#0,d0		;D0 lang löschen
	moveq	#0,d1		;D1 lang löschen
	move.w	VertPo,d0	;Schieberposition = 0 ?
	bne.s	FiNr		;nein, weiter, sonst

;---Schieber ganz oben
	clr.w	Zaehler		;Zähler auf 0 setzen
	move.l	Adressen,Adr	;Adr auf erste Adresse setzen
	bra	Sex		;und die ersten 6 Namen ausgeben

;---FileNr. errechnen
FiNr:	divu	schiebe,d0	;D0 / Schrittweite = FileNr.
	move.w	Zaehler,d1	;Zähler nach D1
	cmp.w	d1,d0		;FileNr. = Zähler ?
	beq	RLoop		;ja, nicht scrollen

	bmi.s	zuruck		;FileNr. < Zähler

;---FileNr. ist größer als aktueller Zähler
	move.w	d0,Zaehler	;Zähler auf neuen Stand
	sub.w	d1,d0		;FileNr. - Zähler = Unterschied
	mulu	#4,d0		;mal 4 (für Adressen)
	move.l	Adr,a0		;alte Adresse
	add.l	d0,a0		;+ D0 = neue Adresse
	bra.s	Neue6		;6 neue Filenamen ausgeben

;---FileNr. ist kleiner als aktueller Zähler
zuruck:	move.w	d0,Zaehler	;Zähler auf neuen Stand
	sub.w	d0,d1		;Zähler - Filenr. = Unterschied
	mulu	#4,d1		;mal 4 (für Adressen)
Minus:	move.l	Adr,a0		;alte Adresse
	sub.l	d1,a0		;- D1 = neue Adresse

;---Schieberposition neu berechnen, 6 Namen neu ausgeben
Neue6:	move.l	a0,Adr		;neue Adresse merken
	move.w	Zaehler,d0	;Zähler
	mulu	schiebe,d0	;* Schrittweite = Vertikalposition

;---Schieber ganz unten, wenn letzter Filename zu sehen ist
	move.w	AnzFiles,d1	;Anzahl Files
	subq.w	#6,d1		;-6 nach D1
	cmp.w	Zaehler,d1	;D1 = Zähler ?
	bne.s	VertOk		;nein, Vertikalposition ok,

	move.w	#$ffff,d0	;sonst Schieber nach ganz unten
VertOk:	move.w	d0,VertPo	;neue Schieberposition
	bra	Sex		;6 neue Filenamen ausgeben
;------------------------------------------------
;UP - Anzahl Dirs im Pfadnamen feststellen
;------------------------------------------------
TestDirs:
	clr.b	d4		;Unterdirszähler löschen
	move.w	PfLang,d7	;Pfadnamenlänge nach D7
	beq.s	RET2		;zurück, wenn Länge = 0

	lea	Pfad,a2		;Pfadname ab (A2)
	tst.b	4(a2)		;Nullbyte nach DFx: ?
	beq.s	RET2		;dann zurück, sonst

	addq.b	#1,d4		;Dirs-Zähler erhöhen
	subq.w	#1,d7		;D7 -1 für Loop
DiLoop:	cmp.b	#'/',(a2)+	;Byte = '/' ?
	bne.s	wTest		;nein, weiter testen

	addq.b	#1,d4		;ja, Dirszähler erhöhen
wTest:	dbra	d7,DiLoop	;nächstes Byte holen

RET2:	rts			;und fertig
;------------------------------------------------
;UP - Bytes von (A0) nach (A1) kopieren
;     bis Nullbyte kopiert wurde
;------------------------------------------------
Kopie:	move.b	(a0)+,(a1)+	;1 Byte von (A0) nach (A1) kopieren
	beq.s	RET2		;Nullbyte, dann fertig
	bra.s	Kopie		;sonst weiter kopieren
;------------------------------------------------
;UP - Root-Directory DF0:, DF1:, DH0:, DH1: oder RAM: holen
;------------------------------------------------
RootDir:			;Adresse Directoryname in A0
	lea	Pfad,a1		;und Pfadname in A1
	bsr	Kopie		;Dirname in Pfadname kopieren
;-------             ----------------------------
;UP - Unterdirectory holen
;------------------------------------------------
Dirhol:	lea	Filename,a1	;Filenamegadget
	move.b	#0,(a1)		;löschen und neu
	bsr	RefreshFile	;ausgeben
	tst.b 	RootFlag	;Flag = 0 ?
	bne.s	Pflass		;nein, Pfad lassen, sonst

	bsr	RefreshPfad	;Pfad neu ausgeben
Pflass:	sf	RootFlag	;Flag löschen
	sf	Abbruch		;Abbruch-Flag löschen
	bsr	Directory	;Directory einlesen
	tst.b	Abbruch		;Abbruch ?
	beq.s	wPfad		;nein, weiter

;---Einlesen abgebrochen
	clr.l	AnzFiles	;Anzahl Files auf 0
	lea	AbbruchTxt,a0	;'EINLESEN ABGEBROCHEN'
	bra.s	Melde		;melden

wPfad:	tst.w	AnzFiles	;Anzahl Files = 0 ?
	bne.s	Sex		;nein, sonst

;---'DIRECTORY LEER' oder 'EINLESEN ABGEBROCHEN' melden
	lea	DirLeerText,a0	;Meldung 'Directory leer'
Melde:	bsr	DirL		;im 2.Gadget ausgeben
	bra	TRLoop		;und zur Hauptabfrage
;------------------------------------------------
;UP - Sechs Filenamen ausgeben
;------------------------------------------------
Sex:	bsr	SechsFrei	;Filenamenfeld löschen
	move.l	Adr,a0		;Adressen der Filenamen
	lea	GadgetTexte,a1	;Adressen in FileGadgets für Text
	moveq	#5,d7		;6 Filetexte
TLoop:	move.l	(a1)+,a2	;Adr. von FilexT nach A2
	move.l	(a0)+,(a2)+	;Adr. aus Liste nach A2
	dbra	d7,TLoop	;alle fertig ?
	bsr	FilesRefresh	;ab File0-Gadget neu ausgeben
	bra	RLoop		;und zur Hauptabfrage
;------------------------------------------------
;UP - Aktuelles Directory einlesen
;------------------------------------------------
Directory:
	clr.l	AnzFiles	;Anzahl Files/Dirs = 0
	clr.w	Zaehler		;Zähler für Up/Down - Pfeil = 0
	bsr	SechsFrei	;Fenster löschen
	move.l	Adressen,a0	;ab 'Adressen'
	move.w	#2499,d7	;10000 Bytes (2500 L's)
FrLoop:	move.l	#0,(a0)+	;löschen
	dbra	d7,FrLoop	;alle fertig ?, dann
	bsr	AdrUeb		;Adressen neu übergeben

;---Pfadnamen lesen
PfLes:	move.l	#Pfad,d1	;Pfadname
	move.l	#-2,d2		;Modus 'lesen'
	move.l	DosBase,a6
	jsr	Lock(a6)	;Datei suchen
	move.l	d0,FileLock	;Schlüssel retten
	beq	DirEnd		;nicht gefunden

	move.l	d0,d1		;FileLock nach D1
	move.l	FIB,d2		;Adresse FileInfoBlock nach D2
	jsr	Examine(a6)	;FIB einlesen (Diskname)
	tst.l	d0		;ist da noch was ?
	beq	DirEnd		;nein, Ende

;---Einen Eintrag holen
Dir:	move.l	FileLock,d1

;---RECHTE Maustaste = Abbruch
	btst	#2,$dff016	;Taste gedrückt ?
	bne.s	NixAb		;nein, weiter

	st	Abbruch		;Flag setzen
	jsr	UnLock(a6)	;FileLock freigeben
	bra	AdrUeb		;und zurück

NixAb:	move.l	FIB,d2
	jsr	ExNext(a6)	;nächsten Eintrag holen
	tst.l	d0		;wenn D0 = 0, dann
	beq.s	DirEnd		;keiner mehr da

;---Filenamen merken
	move.l	FIB,a0		;FileInfoBlock ab (A0)
	move.l	4(a0),d0	;DirEntryType (Dir oder File)
	addq.l	#8,a0		;A0 auf File/Dirnamen
	move.l	Files,a1	;Adressen der Files nach A1
	move.l	a1,a3		;auch nach A3
	tst.l	d0		;Type (DIR oder FILE) ?
	bmi.s	File		;< 0, dann File

	move.b	#"(",(a1)+	;vor
	move.b	#"D",(a1)+	;jedes
	move.b	#"I",(a1)+	;Dir-File
	move.b	#"R",(a1)+
	move.b	#")",(a1)+	;'(DIR) '
	move.b	#" ",(a1)+	;schreiben
	addq.w	#1,AnzFiles+2	;Anzahl Dirs +1
File:	addq.w	#1,AnzFiles	;Anzahl Files + 1
	move.l	Adr,a2		;Zeiger auf Adressenspeicher
	move.l	a3,(a2)		;aktuelle Adresse eintragen
	addq.l	#4,a2		;Zeiger 4 Bytes weiter
	move.l	a2,Adr		;und Zeiger wieder merken
	bsr	Kopie		;xx Buchstaben kopieren
	move.l	a1,Files	;Adresse des nächsten Files
	bra	Dir		;nächsten Eintrag holen

;---Directory geholt
DirEnd:	move.l	FileLock,d1	;Filelock
	jsr	UnLock(a6)	;wieder freigeben
	clr.w	VertPo		;Schieberposition = 0 (ganz oben)
	move.w	AnzFiles,d0
	subq.w	#6,d0		;Anzahl Files - 6 > 0 ?
	bgt.s	Grosse		;ja, Schiebergröße berechnen, sonst

	move.w	#$ffff,SchGr	;Schieber ganz voll
	bra.s	Sort		;Directory sortieren

;---Schiebergröße berechnen
Grosse:	move.l	#$5fffa,d1	;$FFFF * 6 = $5FFFA
	divu	AnzFiles,d1	;$5FFFA / AnzFiles
	move.w	d1,SchGr	;= Schiebergröße

;---Schrittweite berechnen
	move.l	#$ffff,d1	;$FFFF = Verschiebebereich
	divu	d0,d1		;$FFFF / (AnzFiles-6)
	move.w	d1,schiebe	;= Verschiebung je File

;---Directory sortieren
Sort:	move.w	AnzFiles,d7	;Anzahl Files nach D7
	cmp.w	#2,d7		;weniger als 2 Files ?
	bmi.s	SoEnd		;dann nicht sortieren - warum auch ?

	subq.w	#2,d7		;Anzahl - 2 = Anzahl Durchgänge
SoLoop:	move.w	d7,d3		;D3 als 2.Schleifenzähler
	move.l	Adressen,Adr	;Adressen der Filenamen
SLoop:	move.l	Adr,a2		;1.Adresse in A2
	move.l	a2,a3
	addq.l	#4,a3		;2.Adresse in A3
	move.l	a3,a5		;2.Adresse merken
	move.l	(a2),a0		;1.Name ab (A0)
	move.l	(a3),a1		;2.Name ab (A1)
BuLoop:	move.b	(a0)+,d2	;1 Byte aus 1.Namen
	bsr	Gross		;in Großbuchstaben wandeln
	move.b	d2,d0		;und nach D0
	move.b	(a1)+,d2	;1 Byte aus 2.Namen
	bsr	Gross		;in Großbuchstaben wandeln
	cmp.b	d2,d0		;beide Bytes vergleichen
	beq.s	BuLoop		;beide gleich, die nächsten
				;Beiden holen und vergleichen
	bmi.s	BuOK		;Byte 1 < Byte 2, OK,

Tausch:	move.l	Adr,a1		;sonst die
	move.l	(a1),d0		;Adressen
	move.l	4(a1),(a1)	;des ersten und des
	move.l	d0,4(a1)	;zweiten Namens tauschen
BuOK: 	move.l 	a5,Adr		;Adressenzeiger auf nächste Adresse
	dbra	d3,SLoop	;und weiter vergleichen
	dbra	d7,SoLoop	;und alles von vorne
SoEnd:	bsr	ASCII		;Anzahl Files in ASCII-Text wandeln
AdrUeb:	move.l	Adressen,a0	;Die Startadressen
	move.l	a0,Adr		;der Adressen der Filenamen
	add.l	#1200,a0	;und der
	move.l	a0,Files	;Filenamen selbst übergeben
	rts			;und zurück
;------------------------------------------------
;UP - Anzahl Files in ASCII-Text umwandeln
;------------------------------------------------
ASCII:	moveq	#0,d0		;D0 löschen
	move.w	AnzFiles+2,d0	;Anzahl Dirs nach D0
	lea	DirAnzTxt,a0	;ASCII ab (A0)
	bsr	ASCII2		;eintragen
	moveq	#0,d0		;D0 löschen
	move.w	AnzFiles,d0	;Anzahl Files nach D0
	sub.w	AnzFiles+2,d0	;- Anzahl Dirs
	lea	FilAnzTxt,a0	;ab (A0) eintragen
ASCII2:	divu	#100,d0		;D0 : 100
	bsr	Ziffer		;umrechnen
	divu	#10,d0		;Rest : 10
	bsr	Ziffer		;umrechnen
Ziffer:	add.w	#"0",d0		;+ "0"
	move.b	d0,(a0)+	;ablegen
	move.w	#0,d0		;unteres Wort löschen
	swap	d0		;oberes Wort in Unteres
	rts			;und fertig
;------------------------------------------------
;UP - einen Buchstaben (in D2) in Großbuchstaben wandeln
;------------------------------------------------
Gross:	cmp.b	#"a",d2		;D2 < "a" ?
	bcs.s	RET6		;nicht wandeln

	cmp.b	#"z",d2		;D2 > "z" ?
	bhi.s	RET6		;nicht wandeln

	sub.b	#32,d2		;D2 - 32 = Großbuchstabe
RET6:	rts			;zurück
;------------------------------------------------
;UP - Anzeigebox (für 6 Filenamen) löschen
;------------------------------------------------
SechsFrei:
	lea	LeerString,a0	;Adresse des Leerstrings
	move.l	a0,File0T	;(30 Leerzeichen + 0-Byte)
	move.l	a0,File1T	;in alle
	move.l	a0,File3T	;File-
	move.l	a0,File4T	;Gadgets
	move.l	a0,File5T	;eintragen
DirL:	move.l	a0,File2T
;-------                 ------------------------
;UP - Refresh der Filenamen und des Schiebers (FilesRefresh)
;     oder anderer Gadgets (Refresh2), dann
;     Gadgetadresse des Ersten in A0 und Anzahl in D0
;------------------------------------------------
FilesRefresh:
	lea	File0,a0		;ab File0-Gadget
	moveq	#7,d0			;7 Gadgets
Refresh2:
	move.l	Winhd,a1
	lea	FileRequester,a2	;im Requester
	move.l	IntBase,a6
	jmp	RefreshGList(a6)	;neu ausgeben
;------------------------------------------------
;UP - Pfadgadget neu ausgeben
;------------------------------------------------
RefreshPfad:
	lea	PfadGad,a0
FileRe:	moveq	#1,d0
	bra.s	Refresh2
;------------------------------------------------
;UP - Filenamegadget neu ausgeben
;------------------------------------------------
RefreshFile:
	lea	FileNameGad,a0
	bra.s	FileRe
;------------------------------------------------
;UP - Speicher reservieren, Anzahl Bytes in D0
;     Reservieren2 für CHIP-RAM (#$10002 in D1)
;------------------------------------------------
Reservieren:
	move.l	#$10000,d1	;irgendwo im RAM löschen
Reservieren2:
	move.l	ExecBase,a6
	jmp	AllocMem(a6)	;und reservieren
;------------------------------------------------
;UP - Warten auf ein Ereignis im Fenster-Messageport
;------------------------------------------------
Warte:	move.l	Winhd,a0
	move.l	86(a0),a0	;Messageport nach A0
	move.l	ExecBase,a6
	jsr	WaitPort(a6)	;warte auf Message
	move.l	Winhd,a0
	move.l	86(a0),a0
	jsr	GetMsg(a6) 	;Message abholen
	tst.l	d0		;D0 = 0 (keine Message) ?
	beq.s	Warte		;dann weiter warten

	move.l	d0,a1		;Zeiger auf Message-Struktur
	move.l	20(a1),d7	;Ereignis nach D7 
	cmp.w	#$200,d7	;WINDOWCLOSE ?
	beq.s	Reply		;ja, dann fertig

	move.l	28(a1),a0	;Adresse des Gadgets
	move.w	38(a0),d6	;ID-Nummer des Gadgets nach D6
Reply:	jmp	ReplyMsg(a6)	;'Message erhalten' melden
;------------------------------------------------
;UP - Ausgabefenster und Drucker schließen
;------------------------------------------------
CloseFD:
	move.l	RAWhd,d1	;Fenster
	bsr	Close2		;schließen
	move.l	PRThd,d1	;Drucker
	beq.s	RET7		;falls geöffnet

	bsr	Close2		;schließen
RET7:	rts			;und zurück
;------------------------------------------------
;UP - File schließen
;------------------------------------------------
CloseF:	move.l	Filehd,d1
Close2:	move.l	DosBase,a6
	jmp	Close(a6)
;------------------------------------------------
;UP - Ausgabekanäle, Fenster und geöffnete Librarys schließen
;------------------------------------------------
CloseAll:
	move.l	Winhd,a0	;Fenster
	move.l	IntBase,a6
	jsr	CloseWindow(a6)	;schließen
Error4: move.l	DosBase,a1	;Dos-Library
	bsr	LibClose	;schließen
Error3:	move.l	GfxBase,a1	;Graphics-Library
	bsr	LibClose	;schließen
Error2:	move.l	IntBase,a1	;Intuition-Library
	bsr	LibClose	;schließen

;---Irgendein Fehler, 4711 in D0 zurückbringen
Error:	move.w	#4711,d0	;#4711 nach D0
RET8:	rts			;und zurück
;------------------------------------------------
;UP - Alle Librarys und das Fenster öffnen
;     Gerätenamen suchen
;------------------------------------------------
OpenAll:
	move.l	ExecBase,a6
	lea	IntName,a1	;Intuition-Library
	jsr	OpenLib(a6)	;öffnen
	move.l	d0,IntBase	;Bei Fehler:
	beq.s	Error		;4711 und zurück

	lea	GfxName,a1	;Graphics-Library
	jsr	OpenLib(a6)	;öffnen
	move.l	d0,GfxBase
	beq.s	Error2		;INT schließen, zurück

	lea	DosName,a1	;Dos-Library
	jsr	OpenLib(a6)	;öffnen
	move.l	d0,DosBase
	beq.s	Error3		;GFX und INT schließen, zurück

	move.l	IntBase,a6
	lea	WinDef,a0	;Fenster
	jsr	OpenWindow(a6)	;öffnen
	move.l	d0,Winhd	;Zeiger auf Struktur
	beq.s	Error4		;DOS,GFX und INT zu, zurück

;---Welche Laufwerke sind angeschlossen ?
;---DeviceNoden nach 'DFx', 'DHx' etc. untersuchen
	move.l	DosBase,a0	;Dos-Library ab A0
	move.l	34(a0),a0	;ab A0 RootNode
	move.l	24(a0),d0	;Zeiger auf DosInfo
	lsl.l	#2,d0		;BPTR umrechnen in APTR
	move.l	d0,a0		;ab A0 DosInfo
	move.l	4(a0),d0	;Zeiger auf DeviceNode
	lsl.l	#2,d0		;umrechnen
	move.l	d0,a0		;ab A0 DeviceNode
NoLoop:	move.l	4(a0),d0	;DeviceType = 0 (DEVICE) ?
	beq.s	Device		;<> 0 ?, dann kein Device

;---Nächste Node suchen
neuNod:	move.l	(a0),d0		;Zeiger auf nächste Node
	bne.s	wNode		;Nächste holen

	rts			;sonst zurück
wNode:	lsl.l	#2,d0		;umrechnen
	move.l	d0,a0		;und nächste Node
	bra.s	NoLoop		;untersuchen

;---Devicenamen mit Gadgetnamen vergleichen
Device:	move.l	40(a0),d0	;Zeiger auf DeviceNamen
	lsl.l	#2,d0		;umrechnen
	move.l	d0,a2		;DeviceName ab (A2)

	tst.b	(a2)+		;BSTR-Länge überlesen
	move.l	a2,a1		;Adresse 1. Buchstabe nach A1
	lea	ReaAdr,a4	;Adressen der Gadgetreaktionen
	lea	Laufwerke,a5	;zu suchende Geräte "DF1/DH0..."
	move.l	a5,d5		;Adresse merken
	moveq	#4,d6		;5 Gerätenamen suchen
NName:	moveq	#2,d7		;je 3 Buchstaben vergleichen
DevBy:	move.b	(a1)+,d0	;1 Byte aus DeviceNamen mit
	cmp.b	(a5)+,d0	;Byte aus Gerätenamen vergleichen
	bne.s	unglei		;ungleich

	dbra	d7,DevBy	;nächstes Byte vergleichen
	move.l	(a4),a3		;Adresse GadgetReaktion
	clr.w	(a3)		;Gadget anwählbar machen
unglei:	addq.l	#4,a4		;A4 auf nächstes Gadget
	addq.l	#6,d5		;ab (A5) nächster zu
	move.l	d5,a5		;suchender Name
	move.l	a2,a1		;ab (A1) wieder DeviceName
	dbra	d6,NName	;und vergleichen
	bra.s	neuNod		;nächste Node untersuchen
;------------------------------------------------
;UP - Eine Library schließen
;------------------------------------------------
LibClose:
	move.l	ExecBase,a6
	jmp	CloseLib(a6)
;------------------------------------------------
;Fenster-Definition, 640*256 auf Workbenchscreen
;------------------------------------------------
WinDef:	dc.w	0,0,640,256
	dc.b	0,1
	dc.l	$240,$100e,ErrGad,0,UeberText,0,0,0,0
	dc.w	1
;------------------------------------------------
; Requester
;------------------------------------------------
FileRequester:
	dc.l	0		;Kein Requester vorher
	dc.w	180,33		;x,y-Position im Fenster
	dc.w	279,175		;Breite, Höhe
	dc.w	0,0
	dc.l	UpPfeil		;Zeiger auf erstes Gadget
	dc.l	TitelBox	;Border (Umrandung)
	dc.l	UeberTxt	;Text
	dc.w	0		;keine Flags
	dc.b	1,0		;Füllfarbe, Dummy
	blk.l	20,0		;Speicherbytes für Intuition
;------------------------------------------------
TitelBox:			;Umrandung für Titeltext
	dc.w	5,1		;x,y-Position im Requester
	dc.b	2,1		;Schrift, Hintergrundfarbe
	dc.b	0,5		;Modus, Koordinatenpaare
	dc.l	Koord2		;Zeiger auf Koordinaten
	dc.l	TitelBox2	;weitere Borderstruktur
Koord2:	dc.w	0,0,268,0,268,14,0,14,0,0
;------------------------------------------------
TitelBox2:			;Umrandung des ganzen Requesters
	dc.w	1,1
	dc.b	2,1,0,5
	dc.l	Koord0,FileBox
Koord0:	dc.w	0,0,276,0,276,172,0,172,0,0
;------------------------------------------------
FileBox:			;Umrandung der Filenamen
	dc.w	5,21
	dc.b	2,1,0,5
	dc.l	Koord3,0
Koord3:	dc.w	0,0,249,0,249,58,0,58,0,0
;------------------------------------------------
UeberTxt:			;'SMUS...'
	dc.b	2,1		;Schrift, Hintergrundfarbe
	dc.b	0,0		;Modus, Füllbyte
	dc.w	48,5		;Koordinaten
	dc.l	0		;Standard-Font
	dc.l	UeberText	;Zeiger auf Text
	dc.l	0		;kein weiterer Text
;------------------------------------------------
;------------------------------------------------
UpPfeil:	
	dc.l	DownPfeil	;Zeiger auf nächstes Gadget
	dc.w	258,21		;Koordinaten im Requester
	dc.w	16,10		;Klickbereich
	dc.w	6		;Image (nach Klick 2.Image)
	dc.w	1,1		;RELVERIFY, Boolgadget
	dc.l	UImg,UImg2	;1.Image, Image beim Anklicken
	dc.l	0,0,0		;kein Selectgadget, Text, Spezialinfo
	dc.w	6		;ID-Nummer
	dc.l	0		;keine Funktion
;------------------------------------------------
UImg:	dc.w	0,0		;x,y-Offset für Koordinaten
	dc.w	16,10		;Breite, Höhe Klickbereich
	dc.w	1		;1 Bitplane
ImUp:	dc.l	0		;Zeiger auf Imagedaten im CHIP-Ram
	dc.b	1,0		;Hintergrundfarbe, weiß
	dc.l	0		;keine weiteren Images
;------------------------------------------------
UImg2:	dc.w	0,0,16,10,1
ImUp2:	dc.l	0
	dc.b	1,0,0,0,0,0
;------------------------------------------------
;-----------------------------------------------
DownPfeil:	
	dc.l	PfadGad
	dc.w	258,70,16,10,6,1,1
	dc.l	DImg,DImg2,0,0,0
	dc.w	7,0,0
;------------------------------------------------
DImg:	dc.w	0,0,16,10,1
ImDn:	dc.l	0
	dc.b	1,0,0,0,0,0
;------------------------------------------------
DImg2:	dc.w	0,0,16,10,1
ImDn2:	dc.l	0
	dc.b	1,0,0,0,0,0
;------------------------------------------------
;------------------------------------------------
PfadGad:	
	dc.l	FileNameGad
	dc.w	50,89,216,8,0,1,4
	dc.l	NameBox,0,PfadTxt,0,PfadStrInfo
	dc.w	9,0,0
;------------------------------------------------
NameBox:
	dc.w	-45,-4
	dc.b	2,1,0,5
	dc.l	Koord6,0
Koord6:	dc.w	0,0,268,0,268,15,0,15,0,0
;------------------------------------------------
PfadTxt:
	dc.b	2,1,0,0
	dc.w	-40,0
	dc.l	0,PfadText,0
;------------------------------------------------
PfadStrInfo:			;StringInfo-Struktur
	dc.l	Pfad		;Zeiger auf Textpuffer
	dc.l	Undo		;Zeiger auf Undo-Puffer
	dc.w	0		;Cursorposition
	dc.w	100		;99 Buchstaben und Abschlußnull
	dc.w	0		;Text ab diesem Zeichen ausgeben
	;Werte, die von Intuition eingetragen werden:
	dc.w	0		;Zeichenposition im Undopuffer
PfLang:	dc.w	0		;Anzahl Zeichen im Textpuffer
	dc.w	0		;Anz. sichtbarer Zeichen im Container
	dc.w	0,0		;x,y-Offset des Containers
	dc.l	0		;Zeiger auf Rastport
	dc.l	0		;Eingabewert (bei Integergadget)
	dc.l	0		;Tastaturbelegung
;------------------------------------------------
;------------------------------------------------
FileNameGad:	
	dc.l	DF0Gad
	dc.w	50,110,216,8,0,1,4
	dc.l	NameBox,0,FileNameTxt,0,FileStrInfo
	dc.w	10,0,0
;------------------------------------------------
FilenameTxt:
	dc.b	2,1,0,0
	dc.w	-40,0
	dc.l	0,FileText,0
;------------------------------------------------
FileStrInfo:
	dc.l	Filename,Undo
	dc.w	0,32,0,0
FiLang:	dc.w	0,0,0,0
	dc.l	0,0,0
;------------------------------------------------
;------------------------------------------------
DF0Gad:	dc.l	DF1Gad
	dc.w	5,127,39,17
DF0Rea:	dc.w	$100,1,1
	dc.l	Box,0,DF0Txt,0,0
	dc.w	11,0,0
;------------------------------------------------
DF0Txt:	dc.b	2,1,0,0
	dc.w	5,5
	dc.l	0,DF0Text,0
;------------------------------------------------
Box:	dc.w	0,0		;für DF0,DF1,DH0,DH1,RAM
	dc.b	2,1,0,5
	dc.l	Koord8,0
Koord8:	dc.w	0,0,38,0,38,16,0,16,0,0
;------------------------------------------------
;------------------------------------------------
DF1Gad:	dc.l	DH0Gad
	dc.w	55,127,39,17
DF1Rea:	dc.w	$100,1,1
	dc.l	Box,0,DF1Txt,0,0
	dc.w	12,0,0
;------------------------------------------------
DF1Txt:	dc.b	2,1,0,0
	dc.w	5,5
	dc.l	0,DF1Text,0
;------------------------------------------------
;------------------------------------------------
DH0Gad:	dc.l	DH1Gad
	dc.w	105,127,39,17
DH0Rea:	dc.w	$100,1,1
	dc.l	Box,0,DH0Txt,0,0
	dc.w	13,0,0
;------------------------------------------------
DH0Txt:	dc.b	2,1,0,0
	dc.w	5,5
	dc.l	0,DH0Text,0
;------------------------------------------------
;------------------------------------------------
DH1Gad:	dc.l	RAMGad
	dc.w	155,127,39,17
DH1Rea:	dc.w	$100,1,1
	dc.l	Box,0,DH1Txt,0,0
	dc.w	14,0,0
;------------------------------------------------
DH1Txt:	dc.b	2,1,0,0
	dc.w	5,5
	dc.l	0,DH1Text,0
;------------------------------------------------
RAMGad:	dc.l	UUPSGad
	dc.w	205,127,39,17
RAMRea:	dc.w	$100,1,1
	dc.l	Box,0,RAMTxt,0,0
	dc.w	15,0,0
;------------------------------------------------
RAMTxt:	dc.b	2,1,0,0
	dc.w	5,5
	dc.l	0,RAMText,0
;------------------------------------------------
;------------------------------------------------
UUPSGad:
	dc.l	File0
	dc.w	193,150,61,17,0,1,1
	dc.l	OKBox,0,UUPSTxt,0,0
	dc.w	18,0,0
;------------------------------------------------
UUPSTxt:
	dc.b	2,1,0,0
	dc.w	11,5
	dc.l	0,UUPSText,0
;------------------------------------------------
;------------------------------------------------
File0:	dc.l	File1
	dc.w	6,24,248,8,0,1,1
	dc.l	0,0,F0Text,0,0
	dc.w	0,0,0
;------------------------------------------------
F0Text:	dc.b	2,1,1,0
	dc.w	4,0
	dc.l	0
File0T:	dc.l	0,0
;------------------------------------------------
File1:	dc.l	File2
	dc.w	6,33,248,8,0,1,1
	dc.l	0,0,F1Text,0,0
	dc.w	1,0,0
;------------------------------------------------
F1Text:	dc.b	2,1,1,0
	dc.w	4,0
	dc.l	0
File1T:	dc.l	0,0
;------------------------------------------------
File2:	dc.l	File3
	dc.w	6,42,248,8,0,1,1
	dc.l	0,0,F2Text,0,0
	dc.w	2,0,0
;------------------------------------------------
F2Text:	dc.b	2,1,1,0
	dc.w	4,0
	dc.l	0
File2T:	dc.l	0,0
;------------------------------------------------
File3:	dc.l	File4
	dc.w	6,51,248,8,0,1,1
	dc.l	0,0,F3Text,0,0
	dc.w	3,0,0
;------------------------------------------------
F3Text:	dc.b	2,1,1,0
	dc.w	4,0
	dc.l	0
File3T:	dc.l	0,0
;------------------------------------------------
File4:	dc.l	File5
	dc.w	6,60,248,8,0,1,1
	dc.l	0,0,F4Text,0,0
	dc.w	4,0,0
;------------------------------------------------
F4Text:	dc.b	2,1,1,0
	dc.w	4,0
	dc.l	0
File4T:	dc.l	0,0
;------------------------------------------------
File5:	dc.l	SchieberGad
	dc.w	6,69,248,8,0,1,1
	dc.l	0,0,F5Text,0,0
	dc.w	5,0,0
;------------------------------------------------
F5Text:	dc.b	2,1,1,0
	dc.w	4,0
	dc.l	0
File5T:	dc.l	0,0
;------------------------------------------------
;------------------------------------------------
SchieberGad:	
	dc.l	PARENTGad
	dc.w	256,31,20,39,0,1,3
	dc.l	SImage,0,DAnTxt,0,PropInfo
	dc.w	8,0,0
;------------------------------------------------
SImage:	dc.w	0,0,0,0		;für Schieberdarstellung
;------------------------------------------------
DAnTxt:	dc.b	2,1,1,0		;Ausgabe Anzahl Dirs
	dc.w	-152,119
	dc.l	0,DirAnzTxt,FAnTxt
;------------------------------------------------
FAnTxt:	dc.b	2,1,1,0		;Ausgabe Anzahl Files
	dc.w	-152,129
	dc.l	0,FilAnzTxt,0
;------------------------------------------------
PropInfo:
	dc.w	5		;FREEVERT+AUTOKNOB
	dc.w	0		;Horizontale,
VertPo:	dc.w	0		;Vertikale Position des Schiebers
	dc.w	0		;horizontale,
SchGr:	dc.w	$ffff		;vertikale Schiebergröße
	dc.w	0,0,0,0,0,0	;von Intuition belegt
;------------------------------------------------
;------------------------------------------------
PARENTGad:	
	dc.l	OKGad
	dc.w	255,127,19,17,0,1,1
	dc.l	PARENTBox,0,ParTxt,0,0
	dc.w	16,0,0
;------------------------------------------------
PARENTBox:
	dc.w	0,0
	dc.b	2,1,0,5
	dc.l	Koord9,0
Koord9:	dc.w	0,0,18,0,18,16,0,16,0,0
;------------------------------------------------
ParTxt:	dc.b	2,1,0,0
	dc.w	5,5
	dc.l	0,PARENTText,0
;------------------------------------------------
;------------------------------------------------
OKGad:	dc.l	0	;kein weiteres Gadget
	dc.w	25,150,61,17,0,1,1
	dc.l	OKBox,0,OKTxt,0,0
	dc.w	17,0,0
;------------------------------------------------
OKBox:	dc.w	0,0	;für OK- und UUPS-Gadget
	dc.b	2,1,0,5
	dc.l	Koord4,OKBox2
Koord4:	dc.w	0,0,60,0,60,16,0,16,0,0
;------------------------------------------------
OKBox2:	dc.w	-2,-1
	dc.b	2,1,0,5
	dc.l	Koord5,0
Koord5:	dc.w	0,0,64,0,64,18,0,18,0,0
;------------------------------------------------
OKTxt:	dc.b	2,1,0,0
	dc.w	22,5
	dc.l	0,OKText,0
;------------------------------------------------
;------------------------------------------------
ErrGad:	dc.l	JaGad
	dc.w	180,16,0,0,3,1,1
	dc.l	ErrBox,0,ErTxt,0,0
	dc.w	4711,0,0
;------------------------------------------------
ErrBox:	dc.w	0,0
	dc.b	3,0,0,5
	dc.l	Koord1,0
Koord1:	dc.w	0,0,278,0,278,14,0,14,0,0
;------------------------------------------------
ErTxt:	dc.b	1,0,1,0
	dc.w	16,4
	dc.l	0
ErrTxt:	dc.l	PRTText,0
;------------------------------------------------
JaGad:	dc.l	NoGad
	dc.w	266,38,42,17,0,1,1
	dc.l	JNBox,0,JaTxt,0,0
	dc.w	33,0,0
;------------------------------------------------
JNBox:	dc.w	0,0
	dc.b	3,0,0,5
	dc.l	KoordJ,JNBox2
KoordJ:	dc.w	0,0,41,0,41,16,0,16,0,0
;------------------------------------------------
JNBox2:	dc.w	-2,-1
	dc.b	3,0,0,5
	dc.l	KoordN,0
KoordN:	dc.w	0,0,45,0,45,18,0,18,0,0
;------------------------------------------------
JaTxt:	dc.b	1,0,1,0
	dc.w	12,5
	dc.l	0,JaText,0
;------------------------------------------------
NoGad:	dc.l	0
	dc.w	330,38,42,17,0,1,1
	dc.l	JNBox,0,NoTxt,0,0
	dc.w	44,0,0
;------------------------------------------------
NoTxt:	dc.b	1,0,1,0
	dc.w	5,5
	dc.l	0,NoText,0
;------------------------------------------------
; Variablen etc.
;------------------------------------------------
Stack:		dc.l	0	;Stackpointer
WBMessage:	dc.l	0	;
Winhd:		dc.l	0	;Windowheader
Filehd:		dc.l	0	;Fileheader
FileLock:	dc.l	0	;Filelock
FIB:		dc.l	0	;FileInfoBlock
RAWhd:		dc.l	0	;Ausgabefenster-Header
PRThd:		dc.l	0	;Druckerheader
DosBase:	dc.l	0	;Dosbasis
IntBase:	dc.l	0	;Intuitionbasis
GfxBase:	dc.l	0	;Graphicsbasis
Puffer:		dc.l	0	;Filedaten-Puffer
AusPu:		dc.l	0	;AusgabePuffer
FormL:		dc.l	0	;Länge der FORM
Adressen:	dc.l	0	;Adressen der Filenamen-Adressen
Adr:		dc.l	0	;Adressen-Merker
Files:		dc.l	0	;Adressen der Filenamen selbst
AnzFiles:	dc.l	0	;Anzahl Files/Dirs (je 1 Wort)
Toene:		dc.l	0	;Zeiger auf Tondaten im CHIP-RAM
Images:		dc.l	0	;Zeiger auf Imagesdaten im CHIP-RAM
GadgetTexte:	blk.l	6,0	;Adressen der 6 File-Texte
ReaAdr:		dc.l	DF0Rea,DF1Rea,DH0Rea,DH1Rea,RAMRea
ImageU:		dc.w	$0000,$7FFE,$7E7E,$7C3E,$781E	;Pfeil Up
		dc.w	$700E,$6006,$7E7E,$7E7E,$0000
		dc.w	$0000,$7E7E,$7C3E,$781E,$700E	;Pfeil Up2
		dc.w	$6006,$7E7E,$7E7E,$7E7E,$0000
		dc.w	$0000,$7E7E,$7E7E,$6006,$700E	;Pfeil Down
		dc.w	$781E,$7C3E,$7E7E,$7FFE,$0000
		dc.w	$0000,$7E7E,$7E7E,$7E7E,$6006	;Pfeil Down2
		dc.w	$700E,$781E,$7C3E,$7E7E,$0000
		dc.b	-40,-70,-40,0,40,70,40,0	;Tondaten
schiebe:	dc.w	0	;Schieber-Schrittweite
Zaehler:	dc.w	0	;Zähler für Pfeil-Up/Down
RootFlag:	dc.b	0	;Flag für Rootdir
Abbruch:	dc.b	0	;Abbruch
PRTFlag:	dc.b	0	;Flag für Druckausgabe
JaText:		dc.b	"JA",0
NoText:		dc.b	"NEIN",0
RAWTxt:		dc.b	"RAW:180/33/279/223/",0
PRTTxt:		dc.b	"PRT:",0
KlickTxt:	dc.b 	"<< HIER KLICKEN",0
LeerString:	blk.b	30,32			;30 Leerzeichen
		dc.b	0			;und Abschlußnull
UeberText:	dc.b	"SMUS-INSTRUMENTE SUCHEN",0
PfadText:	dc.b	"PFAD",0
FileText:	dc.b	"FILE",0
PARENTText:	dc.b	"/",0
OKText:		dc.b	"OK",0
UUPSText:	dc.b	"UUPS!",0
DirLeerText:	dc.b	"     DIRECTORY IST LEER !",0
AbbruchTxt:	dc.b	"    EINLESEN ABGEBROCHEN !",0
PRTText:	dc.b	"  AUSGABEN AUCH AUF DRUCKER ?",0
WahlTxt:	dc.b	"      FILENAMEN AUSWÄHLEN    ",0
MomentTxt:	dc.b	"           MOMENT...       ",0
FileTxt:	dc.b	"     FILE NICHT GEFUNDEN ! ",0
IFFTxt:		dc.b	"       KEIN SMUS-FILE !!   ",0
FreiTxt:	dc.b	"    NICHT GENUG SPEICHER !!",0
MausTxt:	dc.b	"    LINKE MAUSTASTE DRÜCKEN",0
SVXTxt:		dc.b	"Digitalisierter Sound (8SVX)",0
DirAnzTxt:	dc.b	"000 DIR's",0
FilAnzTxt:	dc.b	"000 FILES",0
IntName:	dc.b	"intuition.library",0
DosName:	dc.b	"dos.library",0
GfxName:	dc.b	"graphics.library"

even 		;Folgende MÜSSEN an geraden Adressen stehen !
Undo:		blk.b	100,0	;99 Zeichen + Abschlußnull
Pfad:		blk.b	100,0	;99 Zeichen + Abschlußnull
Filename:	blk.b	32,0	;31 Zeichen + Abschlußnull
Laufwerke:
DF0Text:	dc.b	"DF0:",0,0	;Diese Texte
DF1Text:	dc.b	"DF1:",0,0	;können in der
DH0Text:	dc.b	"DH0:",0,0	;Reihenfolge und
DH1Text:	dc.b	"DH1:",0,0	;im Inhalt beliebig
RAMText:	dc.b	"RAM:",0,0	;verändert werden !
