	opt l-,d+,s-,n+
	plen 72
	llen 80
	ttl "IFF-Fileauswahl"
	
* INCLUDE-Files laden

	include df0:include/exec/exec_lib.i
	include df0:include/intuition/intuition_lib.i
	include df0:include/graphics/graphics_lib.i
	include df0:include/libraries/dos_lib.i

* MACRO-Definitionen		
	
* Intuition-Text ausgeben

PRINTOUT    	macro
		lea \1,a1
		move.l #\2,d0
		move.l #\3,d1
		move.l windowpointer,a0
		move.l 50(a0),a0
		CALLINT PrintIText
		endm

*Struktur für Ausgabe-Text

TEXTOUT		macro
		dc.b 3,0 	 ;Farben
		dc.b  0      	 ;Farbmodus
		even
		dc.w  0     	 ;x-Koordinate 
		dc.w  0		 ;y-Koordinate
		dc.l  0      	 ;Zeichensatz
		dc.l  \1   	 ;Textpointer
		dc.l  0      	 ;Weiterer Text      
		endm

* Struktur für Windows

WINDOW       macro							
             dc.w       \1      ;Linke Ecke
             dc.w       \2	;Obere Ecke
             dc.w       \3	;Breite
             dc.w       \4	;Hoehe
             dc.b       0,1	;Farben
             dc.l       \5	;Flags für Events
             dc.l       \9      ;Window Flags
             dc.l       \6      ;Zeiger auf erstes Gadget
             dc.l       0       ;Check Mark
             dc.l       \7      ;Windowname						
\8           dc.l       0	;Screenpointer
             dc.l       0	;Bit Map
             dc.w      \3	;Mindest-Breite
             dc.w      \4 	;Mindest-Hoehe
             dc.w      \3	;Maximale Breite
             dc.w      \4	;Maximale Hoehe
             dc.w      15	;Window-Typ
	     endm

* Struktur für Screens

SCREEN		macro  
	   dc.w       0		;linke Ecke
	   dc.w       0		;obere Ecke
	   dc.w       \1	;Breite
	   dc.w       \2	;Höhe
	   dc.w       2		;Tiefe (Bitplanes)
	   dc.b       0,1	;Farben
	   dc.w       \3	;Modus
	   dc.w      15		;Screentyp
	   dc.l       0		;Zeichensatz
	   dc.l       \4	;Screentitel
	   dc.l       0		;Gadgets
	   dc.l       0		;Bitmap
		endm

* Struktur für Gadgets (alle außer Proportionalgadet)

GADGET   macro 
	 dc.l       \1   ;naechstes Gadget
	 dc.w       \2   ;obere Ecke x
	 dc.w       \3   ;obere Ecke y
	 dc.w      256   ;Breite
	 dc.w       10   ;Hoehe
	 dc.w       \4   ;Flags
	 dc.w        1   ;Activation-Flags
	 dc.w       \5   ;Gadget-Typ
	 dc.l       \6   ;Gadget-Boarder
	 dc.l        0   ;kein Select-Gadget
	 dc.l       \7   ;Gadget-Text
	 dc.l        0   ;kein Exclude
	 dc.l       \8   ;Special-Info
	 dc.w       \9   ;Gadget-ID
	 dc.l        0   ;User-Data
	 endm

* Struktur für Proportionalgadget

PROPGADGET   macro 
	 dc.l       \1   ;naechstes Gadget
	 dc.w       \2   ;obere Ecke x
	 dc.w       \3   ;obere Ecke y
	 dc.w       20   ;Breite
	 dc.w      100   ;Hoehe
	 dc.w       \4   ;Flags
	 dc.w        2   ;Activation-Flags
	 dc.w       \5   ;Gadget-Typ
	 dc.l       \6   ;Gadget-Boarder
	 dc.l        0   ;kein Select-Gadget
	 dc.l       \7   ;Gadget-Text
	 dc.l        0   ;kein Exclude
	 dc.l       \8   ;Special-Info
	 dc.w       \9   ;Gadget-ID
	 dc.l        0   ;User-Data
	 endm


* Struktur für Eingaben bei Stringgadgets

STRINF          macro 
	        dc.l  \1	;Textpuffer
	        dc.l  undo 	;Undo-Puffer
	        dc.w  0		;Cursor-Position
	        dc.w  32	;Anzahl Zeichen (max)
		dc.w  0		;Ausgabeposition Cursor
		dc.w  0		;Position Undo-Puffer
		dc.w  0		;Anzahl Zeichen im Textpuffer
		dc.w  0		;Anzahl sichtbare Zeichen
		dc.w  0         ;horizontaler Offset	
		dc.w  0		;vertikaler Offset
		dc.l  0		;Zeiger auf Rastport
		dc.l  0         ;Integer-Wert					                       
		dc.l  0		;Tastatur-Belegung
		endm

* Textstruktur für Gadgets

STRING         macro
               dc.b  1,0	;Farben
               dc.b  1		;Farbmodus
	even
               dc.w  \1,\2	;Positionen
               dc.l  0		;Zeichensatz
               dc.l  \3		;Textpointer
               dc.l  \4		;naechster Text
	       endm


	include df0:include/startup

undo	dc.l  0,0,0,0			;Undo-Puffer für Stringgadets


begin	lea intname,a1		;Intuition-Library öffnen
	clr.l d0
	CALLEXEC OpenLibrary
	tst.l d0			
	beq fini1
	move.l d0,_IntuitionBase

	lea grafname,a1		;Grafik-Library öffnen
	clr.l d0
	CALLEXEC OpenLibrary
	tst.l d0
	beq fini2
	move.l d0,_GfxBase

	lea dosname,a1		;DOS-Library öffnen
	clr.l d0
	CALLEXEC OpenLibrary
	tst.l d0
	beq fini3
	move.l d0,_DOSBase

	lea screen_defs,a0		;Screen öffnen
	CALLINT OpenScreen
	move.l d0,screenpointer		;Pointer für
	move.l d0,point1		;Windows
	move.l d0,point2

* Gadgetaufbau, Abfrage

	lea startwindow,a0		;Startwindow öffnen
	CALLINT OpenWindow
	move.l d0,windowpointer
	bsr print			;Text ausgeben				
	
wait	move.l windowpointer,a0
	bsr message			;Gadget-ID holen
	cmpi.l #$200,d6			;Ende
	beq ende
 	cmpi.w #0,d7			;Gadget-ID prüfen
        beq load			;Grafik laden
	bra save			;Grafik speichern


* Grafik laden

load	bsr holefile			;Fileauswahl treffen
	cmpi.b #255,d7			;Ausführen ?
	bne wait			;Nein
	bsr gload			;Grafik laden
	bra wait			;von vorne

* Grafik speichern

save	bsr holefile			;Fileauswahl treffen
	cmpi.b #255,d7			;Ausführen ?
	bne wait			;Nein
	bsr gsave			;Grafik speichern
	bra wait


* Fileauswahl treffen

holefile lea waehlwindow,a0		;Auswahlwindow öffnen
	 CALLINT OpenWindow
	 move.l d0,iwindowpointer
start	 clr.b  startf		
	 lea propinfo,a5		;Prop-Info-Struktur
	 clr.w  4(a5)	       		;y-Position auf Start
	 bsr read			;Files einlesen
	 move.b anzahl,d0
	 beq voll			;gar nichts gefunden
	 cmpi.b #10,d0		        ;Bei mehr als 10 Files
	 bls voll
	 clr.l d1			;muß gescrollt werden
	 move.b anzahl,d1
	 move.l #$9fff6,d0		;Propgadget-Höhe:
	 divu d1,d0			;(10*$FFFF)/Anzahl
	 bra weiter
voll	 move.w #$FFFF,d0		;Prop-Gadget gefüllt (<10 Files)
weiter	 move.w d0,8(a5)	        ;Wert in Prop-Gadget Struktur
start1	 bsr anzeige			;Gadgets anzeigen
start2	 move.l iwindowpointer,a0
	 bsr message			;Gadget-ID holen
	 cmpi.w #10,d7			;Name angeklickt ?
	 bls noname			;Nein

* Eines der 10 Filenamen-Gadgets angeklickt

name	 subi.w #100,d7			;ID auf 0-9 reduzieren
	 add.b startf,d7		;plus Bildschirmstartfile
	 mulu #32,d7			;mal 32 (Länge Textpuffer)
	 addi.l #fpuffer,d7		;plus Textpuffer-Start
	 move.l d7,a0
	 move.b 31(a0),d0		;Direktory ?
	 bmi pfad			;Ja, Pfadnamen ändern
         lea Dateiname,a1		;Zeiger auf Stringpuffer
	 move.w #31,d0	
copy4	 move.b #32,(a1)+
	 subq.w #1,d0			;Puffer mit Leerzeichen
	 bne copy4			;füllen
	 clr.b (a1)+			;Gadgets löschen
	 lea Dateiname,a1		;Start Textpuffer Dateiname
Loop1	 move.b (a0),(a1)+		;Daten kopieren
	 cmpi.b #0,(a0)+			;Bei Nullbyte Ende des Strings
	 bne Loop1	
	 bra start1			;Gadgets neu ausgeben


* Pfadname, Dateiname, Abbruch oder Ausführen angeklickt

noname   mulu #4,d7			;mal 4 wegen Langwörtern
	 addi.l #tab,d7			;plus Tabellenstart
	 move.l d7,a0
	 move.l (a0),a0			;Adresse der Routine holen
	 jmp (a0)			;Routine anspringen

tab	 dc.l pfad1,ausführen,abbrechen,propgadget,file

* Proportionalgadget angeklickt

propgadget  cmpi.b #9,anzahl		;Anzahl Files kleiner als 10
	    bls start2 			;Dann kein neuer Aufbau
	    lea propinfo,a5		;Prop-Info-Struktur
	    move.w 4(a5),d0		;y-Position holen
	    clr.w d1			;(Anzahl Files-10)
	    move.b anzahl,d1		;*Prop-Position/$FFFF
	    subi.b #10,d1
	    mulu d1,d0			
	    divu #$FFFF,d0		;= Startfile
	    move.b d0,startf
	    bra start1			;Gadgets neu ausgeben

* Dateiname angeklickt

file       bra ausführen	        ;File einlesen

* Abbruch angeklickt

abbrechen  clr.b   d7			;Flag für Abbruch
	   bra fertig

* Ausführen angeklickt

ausführen  move.b #255,d7		;Flag für Ausführen
	   bra fertig

* Pfadname angeklickt
	   
pfad	 lea Pfadname,a1		;Start Textpuffer Pfadname
	 move.b #-1,d0
Loopa	 addi.b #1,d0
	 cmpi.b #0,(a1)+			;feststellen
	 bne Loopa	
	 move.b -(a1),d1
	 cmpi.b #4,d0	 		;Bisher nur Drivename ?
	 beq Loopb			;Ja	
	 move.b #"/",(a1)+		;Sonst Trennstrich anhängen
Loopb	 move.b (a0),(a1)+		;Daten kopieren
	 cmpi.b #0,(a0)+			;Bei Nullbyte Ende des Strings
	 bne Loopb	
	 move.w #7,d0
Loopc	 clr.b   -(a1)		;"(Dir)" löschen
	 subq.w #1,d0
	 bne Loopc

pfad1	 bra start			;Neue Files einlesen


* Files zur Auswahl einlesen

read	  lea fpuffer,a1		;Zeiger auf Puffer
	  move.w #3200,d0		;3200 Bytes löschen
copy6	  clr.b (a1)+
	  subq.w #1,d0			;Puffer mit Leerzeichen
	  bne copy6
	  clr.b anzahl			;Initialisierung
	  move.l #Pfadname,d1		;Diskette untersuchen
	  move.l #-2,d2
	  CALLDOS Lock			;(Schlüssel suchen)
	  tst.l d0
 	  beq endofread			;kein Schlüssel gefunden
	  move.l d0,locksave		;merken
          move.l d0,d1
          move.l #fileinfo,d2		;Zeiger auf File-Info-Block
          CALLDOS Examine		;Diskette weiter untersuchen
          tst.l d0
          beq endofread			;nichts gefunden
          move.l #fpuffer,d5		;Zeiger auf Puffer für Filenamen
readloop  move.l locksave,d1		;Fileeinträge einlesen
	  move.l #fileinfo,d2		;in Fileinfo-Block
	  CALLDOS ExNext	
	  tst.l d0
	  beq endofread			;keine weiteren Einträge gefunden
	  lea fileinfo+8,a4		;Zeiger auf Fiel-Info-Block
	  addi.b #1,anzahl		;Anzahl der Files erhöhen
	  move.l d5,a3
trans	  move.b (a4),(a3)+		;Puffer kopieren
	  cmpi.b #0,(a4)+		;letztes Zeichen gefunden,
	  bne trans			;wenn Null
endofname move.l fileinfo+4,d0		;File oder Direktory ?
	  bmi datei			;Direktory gefunden, dann
	  move.b -(a3),d0
	  clr.l d0			;"Dir" zu Namen hinzufügen
	  lea text,a0
rloop	  move.b (a0)+,(a3)+		;Text anfügen
	  addi.b #1,d0
	  cmpi.b #6,d0
	  bne rloop
	  clr.b (a3)			;Filenamen abschließen
	  move.l d5,a3
	  move.b #$FF,31(a3)		;Kennzeichen für Direktory
datei	  addi.l #32,d5			;Zeiger in Puffer erhöhen
	  bra readloop		
endofread rts

* Gadgets in Window anzeigen

anzeige	  lea string1000,a1		;Zeiger auf ersten Stringpuffer
	  move.w #10,d3			;10*34 Bytes löschen
copy3	  move.w #33,d0	
copy2	  move.b #32,(a1)+
	  subq.w #1,d0			;Puffer mit Leerzeichen
	  bne copy2
	  clr.b (a1)+			;Alle Gadgets löschen
	  subq.w #1,d3			;löschen
	  bne copy3
          move.b anzahl,d0
	  beq full			;Keine Files vorhanden
	  clr.l d1
	  move.b #1,d2			;Zähler für angezeigte Files
	  move.b startf,d1
	  mulu #32,d1			;Position im Filenamenpuffer
	  addi.l #fpuffer,d1		;errechnen
	  move.l d1,d4			;Pointer auf Stringpuffer
	  move.b startf,d1
	  move.l #string1000,d5		;Start von Textpuffer 1.Gadget
copy1	  move.l d5,a2
	  move.l d4,a0
copy	  move.b (a0),(a2)+		;Daten kopieren
	  cmpi.b #0,(a0)+		;Bis Nullbyte gefunden
	  bne copy
	  move.b #32,-(a2)              ;Nullbyte löschen
	  move.l d5,a2
	  clr.b 31(a2)			;Abschluß mit Nullbyte
	  addi.b #1,d2			;Zahl der angezeigten Files
	  cmpi.b #10,d2			;größer als 10, dann
	  bhi full			;Bildschirm voll
	  addi.b #1,d1			;alle Files augegeben,
	  cmp.b anzahl,d1		;dann ebenfalls Ausgabestop
	  bge full
	  addi.l #34,d5
	  addi.l #32,d4			;Pointer erhöhen
	  bra copy1			;nächstes File
full	  move.l iwindowpointer,a1	;Zeiger auf Windowpointer
	  move.l $3E(a1),a0		;Zeiger auf erstes zu
	  move.l #0,a2			;refreshendes Gadget
	  CALLINT RefreshGadgets
	  rts


fertig   move.l iwindowpointer,a0	;Window schliessen
	 CALLINT CloseWindow	
	 rts

	  cnop 0,4
pointer   dc.l 0			;Pointer auf ausgewähltes File
fileinfo  ds.b 260			;Speicher für File-Info-Block
fpuffer	  ds.l 800			;Puffer für maximal 100 Filenamen
locksave  dc.l 0			;Speicher für Diskettenschlüssel
startf	  dc.b 0			;Erstes, auszugebenes File
	  even
anzahl	  dc.b 0			;Zahl der gefundenen Files
	  even
text	  dc.b " (Dir)"
	  even
altpfad	  dc.l 0			;Zeiger auf alte Lock-Struktur
rpuff     ds.l 28			;Zeiger auf Lese-Schreibpuffer
heigth	  dc.w 0			;Screen-Höhe
depth	  dc.w 0			;Screentiefe
widthd8	  dc.w 0			;Screenbreite/8
	  cnop 0,4
filepointer dc.l 0		


* Grafik laden

gload	  move.l #-2,d2			;Modus : Lesen
	  bsr newdir			;Neues Direktory setzen
	  beq loadend			;Hat nicht geklappt, Ende der Vorstellung !  
	  move.l #1005,d2		;Modus: Lesen
	  bsr open			;Datei öffnen
	  beq loadend1			;Hat nicht geklappt, altes Direktory
	  bsr clscreen			;IFF-Screen schließen
	  move.l #12,d3	
	  bsr lesen			;12 Bytes (Header) überlesen
reloop	  moveq.l #4,d3			;4 Bytes lesen
	  bsr lesen
	  beq loadend2			;Keine Daten vorhanden
	  cmpi.l #-1,d0			;Fehler ?
	  beq loadend2			;Ja, Ende
	  cmpi.l #"BMHD",rpuff 	        ;Bit-Map-Header gefunden ?
	  bne r1			;Nein
	  move.l #24,d3			;24 Bytes einlesen
	  bsr lesen	
	  lea rpuff,a1		;Zeiger auf Datenpuffer
	  lea bild,a0		;Zeiger auf NewScreen-Struktur
	  move.w 4(a1),4(a0)		;Breite des Screens eintragen
	  move.w 6(a1),6(a0)		;Höhe des Screens eintragen
	  addi.w #10,6(a0)		;+10 wegen Titelleiste
	  move.b 12(a1),9(a0)		;Low-Byte der Tiefe eintragen
	  move.w 8(a0),depth		;Tiefe im Wortformat merken
	  clr.w 12(a0)			;Darstellungsmodus normal (320*256)
	  move.w 4(a0),d0		;Breite laden
	  cmpi.w #320,d0			;Größer als 320 ?
	  bls nohires			;Nein, kein Hires-Modus
	  ori.w #$8000,12(a0)		;Hires-Flag einblenden
nohires	  lsr.w #3,d0			;Breite geteilt durch 8 merken
	  move.w d0,widthd8
	  move.w 6(a0),d0		;Höhe laden
	  cmpi.w #256,d0			;Größer als 256 ?
	  bls nointer 			;Nein, kein Interlace-Modus
	  ori.w #4,12(a0)		;Interlace-Flag einblenden
nointer   move.w d0,heigth		;Höhe merken
	  CALLINT OpenScreen		;Screen öffnen
	  move.l d0,bildpointer		;Screenpointer sichern
	  beq loadend2			;Fehler beim Öffnen
	  bra reloop			;Weitere Daten lesen

r1	  cmpi.l #"CMAP",rpuff  		;Color-Map gefunden ?
	  bne r2			;Nein
	  moveq.l #4,d3			;Anzahl Farben einlesen
	  bsr lesen
	  move.l rpuff,d7		;durch 3 dividieren 
	  divu #3,d7			
	  clr.l d6			;Zähler für Farbregisternummer
	  lea rpuff,a5 
	  move.l bildpointer,d0		;Zeiger auf Screen-Struktur
	  addi.l #$2C,d0			;Offset für View-Port
	  move.l d0,a4			;Zeiger merken
farbloop  moveq.l #3,d3			;Für jede Farbe Rot-, Grün-
	  bsr lesen			;und Blauanteil einlesen
	  move.l a4,a0			;Zeiger auf View-Port
	  move.l d6,d0			;Farbregisternummer
	  clr.l d1
	  move.b (a5),d1		;Rotanteil
	  lsr.b #4,d1			;/16
	  clr.l d2
 	  move.b 1(a5),d2		;Grünanteil
	  lsr.b #4,d2			;/16
	  clr.l d3		
	  move.b 2(a5),d3		;Blauanteil
	  lsr.b #4,d3			;/16
	  CALLGRAF SetRGB4		;Farbe setzen
	  addq.l #1,d6			;Register erhöhen
	  cmp.w d6,d7			;Nächstes Register lesen
	  bhi farbloop
	  bra reloop 			;Weitere Daten lesen

r2	  cmpi.l #"BODY",rpuff  	        ;Grafikdaten gefunden ?
	  bne r3			;Nein !
	  moveq.l #4,d3			;4 Bytes überlesen
	  bsr lesen			;(Grafikgröße in Bytes)
	  move.l bildpointer,a0		;Screenpointer holen
	  move.l $58(a0),a5		;Zeiger auf Bitmap aus Rastport
	  clr.l d5			;Zähler für Höhe
rl2	  clr.l d6			;Zähler für Tiefe
	  moveq.l #8,d4			;Zeiger auf erste Bitplane
rl1	  move.l filepointer,d1 	;Zeiger auf Filepointer
	  move.l d5,d2			;Zeile
	  addi.l #10,d2			;Ab Zeile 10 wg. Titelleiste
	  mulu widthd8,d2		;* Breite/8 = Offset
	  add.l (a5,d4.l),d2		;+ Startadresse Bitplane
	  clr.l d3
	  move.w widthd8,d3		;Breite/8 Bytes pro Zeile
	  CALLDOS Read			;Daten einlesen
	  addq.l #4,d4			;Zeiger auf nächste Bitplane
	  addq.w #1,d6			;Tiefe erhöhen
	  cmp.w depth,d6	
	  blt rl1			;Nächste Bitplane
	  addq.w #1,d5			;Höhe erhöhen
	  cmp.w heigth,d5	
	  blt rl2			;Nächste Zeile lesen
	  bra loadend2			;Fertig

r3	  cmpi.l #"CRNG",rpuff 	        ;Color-Range-Daten ?
	  bne r4			;Nein
	  move.l #12,d3			;Ja, 12 Bytes überlesen
	  bsr lesen
	  bra reloop			;Weitere Daten lesen
	  
r4	  cmpi.l #"DPPV",rpuff  	        ;Grafikcraft-Daten ?
	  bne r5			;Nein
	  move.l #108,d3		;Ja, 108 Bytes überlesen
	  bsr lesen
	  bra reloop			;Weitere Daten lesen

r5	  cmpi.l #"CAMG",rpuff  	        ;View-Port-Daten ?
	  bne r6			;Nein
	  moveq.l #8,d3			;Ja, 8 Bytes überlesen
	  bsr lesen
	  bra reloop			;Weitere Daten lesen

r6	  cmpi.l #"CCRT",rpuff  	        ;Daten zur Farbanimation ?
	  bne loadend			;Nein, fertig
	  move.l #18,d3			;Ja, 18 Bytes überlesen
	  bsr lesen
	  bra reloop			;Weitere Daten lesen

loadend2  bsr close			;Datei schließen
loadend1  bsr altdir			;Altes Direktory widerherstellen
loadend	  rts


* Grafik speichern

gsave	  move.l #-2,d2			;Modus : Lesen
	  bsr newdir			;Neues Direktory setzen
	  beq saveend			;Hat nicht geklappt, Ende der Vorstellung !  
	  move.l #1006,d2		;Modus: Schreiben
	  bsr open			;Datei öffnen
	  beq saveend1			;Hat nicht geklappt, altes Direktory
	  move.l #"FORM",rpuff 	        ;Kopf eintragen
	  lea bild,a5     	        ;Zeiger auf NewScreen-Struktur
          move.w $04(a5),d7		;Breite holen
	  lsr.w #3,d7			;durch 8 teilen
	  move.w d7,widthd8		;merken
	  subi.w #10,$06(a5)		;Höhe-10 wegen Titelleiste
	  move.w $06(a5),heigth		;Höhe merken
	  mulu heigth,d7		;(Breite/8)*Höhe
	  move.w $08(a5),depth  	;Tiefe holen
	  mulu depth,d7         	;(Breite/8)*Höhe*Tiefe=Bytes der Grafik
	  move.l d7,d4			;Größe der Grafik merken
	  clr.w  d0			;(2 hoch Tiefe) = Zahl der Farben
	  moveq.l #1,d6			;Aktuelle Farbzahl
sl1	  addq.w #1,d0			;Zähler erhöhen
	  lsl.w #1,d6			;Farben verdoppeln
	  cmp.w depth,d0		;mit Tiefe vergleichen
	  bne sl1			;erreicht, dann fertig
farboff	  move.l d6,d5			;Farbzahl merken
	  mulu #3,d6			;mal 3 nehmen
	  add.l d6,d7			;zur Größe der Datei addieren
	  addi.l #48,d7			;plus 48 für sonstige Bytes
	  move.l d7,rpuff+4    	        ;Größe der Datei in Bytes
	  move.l #"ILBM",rpuff+8 	;Datenanfang
	  move.l #"BMHD",rpuff+12	;Bit-Map-Header
	  move.l #20,rpuff+16  	        ;Wert 20
	  move.w $04(a5),rpuff+20       ;Breite des Screens
	  move.w $06(a5),rpuff+22	;Höhe des Screens
	  clr.l rpuff+24                ;Wert 0
	  move.b $09(a5),rpuff+28       ;Tiefe des Screens
	  clr.b rpuff+29  	        ;Wert 0
	  clr.l rpuff+30        	;Wert 0
	  move.b #10,rpuff+34           ;Wert 10
	  move.b #11,rpuff+35           ;Wert 11
	  move.w $04(a5),rpuff+36       ;Breite des Screens
	  move.w $06(a5),rpuff+38       ;Höhe des Screens
	  move.l #40,d3			;40 Bytes schreiben
	  bsr schreiben
	  beq saveend2			;Keine Daten vorhanden
	  cmpi.l #-1,d0			;Fehler ?
	  beq saveend2			;Ja, Ende

	  move.l #"CMAP",rpuff 	        ;Color-Map
	  move.l d6,rpuff+4		;Farbanzahl*3 eintragen
	  clr.l d7			;Zähler für Farbregisternummer
	  lea rpuff+8,a5 
	  move.l bildpointer,a4  	;Zeiger auf Screen-Struktur
	  adda.l #$2C,a4		;Offset für View-Port
	  move.l 4(a4),a4		;Zeiger auf die Color-Map 
farbloop1 move.l a4,a0			;Zeiger auf Color-Map
	  move.l d7,d0			;Farbregisternummer
	  CALLGRAF GetRGB4
	  move.b d0,d1			;Farbcode merken
	  andi.w #$0F00,d0    	        ;Rot-Bits isolieren
	  lsr.w #4,d0			;Rotanteil*16
	  move.b d0,(a5)+		;eintragen
	  move.b d1,d0
	  andi.b #$F0,d1		;Grün-Bits*16 isolieren
	  move.b d1,(a5)+		;und eintragen
	  andi.b #$0F,d0		;Blau-Bits isolieren
	  lsl.b #4,d0			;Blauanteil*16
	  move.b d0,(a5)+		;eintragen
	  addq.l #1,d7			;Register erhöhen
	  cmp.w d7,d5			;Nächstes Register lesen
	  bhi farbloop1
  	  addq.l #8,d6			;Farbzahl*3+8=Bytes zu speichern
	  move.l d6,d3	
	  bsr schreiben			;Farbdaten schreiben
	  beq saveend2			;Keine Daten vorhanden
	  cmpi.l #-1,d0			;Fehler ?
	  beq saveend2			;Ja, Ende

	  move.l #"BODY",rpuff	        ;Grafik-Bitmaps
	  move.l d4,rpuff+4		;Grafikgröße eintragen
	  moveq.l #8,d3			;8 Bytes schreiben
	  bsr schreiben
	  move.l bildpointer,a0		;Screenpointer holen
	  move.l $58(a0),a5		;Zeiger auf Bitmap aus Rastport
	  clr.l d5			;Zähler für Höhe
sa2	  clr.l d6			;Zähler für Tiefe
	  moveq.l #8,d4			;Zeiger auf erste Bitplane
sa1	  move.l filepointer,d1	        ;Zeiger auf Filepointer
	  move.l d5,d2			;Zeile
	  addi.l #10,d2			;Ab Zeile 10 wg. Titelleiste
	  mulu widthd8,d2		;* Breite/8 = Offset
	  add.l (a5,d4.l),d2		;+ Startadresse Bitplane
	  clr.l d3
	  move.w widthd8,d3		;Breite/8 Bytes pro Zeile
	  CALLDOS Write			;Daten schreiben
	  beq saveend2			;Keine Daten vorhanden
	  cmpi.l #-1,d0			;Fehler ?
	  beq saveend2			;Ja, Ende
	  addq.l #4,d4			;Zeiger auf nächste Bitplane
	  addq.w #1,d6			;Tiefe erhöhen
	  cmp.w depth,d6	
	  blt sa1			;Nächste Bitplane
	  addq.w #1,d5			;Höhe erhöhen
	  cmp.w heigth,d5	
	  blt sa2			;Nächste Zeile lesen
saveend2  bsr close			;Datei schließen
saveend1  bsr altdir			;Altes Direktory widerherstellen
saveend	  rts


* Gadget-ID aus Message-Port holen

message	move.l 86(a0),a0		;User-Port holen
  	move.l a0,a5			;Adresse retten
	move.b 15(a0),d1		;Signal-Bit holen
	moveq #0,d0			;Nummer in Maske
	bset d1,d0			;wandeln
	CALLEXEC Wait			;Auf Wiedersehen !
	move.l a5,a0	
	CALLEXEC GetMsg			;Message holen
	move.l d0,a1
	move.l $14(a1),d6		;IDCMP-Flag holen
	move.l $1C(a1),a4    		;Gadget-Adresse holen
	CALLEXEC ReplyMsg		;Message quittieren
	move.w $26(a4),d7		;Gadget-ID holen
	rts


* Neues Direktory setzen: (D2: -2=Lesen,-1=Schreiben)

newdir	move.l #Pfadname,d1		;Zeiger auf Pfadnamen
	CALLDOS Lock			;Zeiger auf Lock-Struktur ermitteln
	move.l d0,locksave		;und merken
	beq endof			;Nicht gefunden
	move.l d0,d1
	CALLDOS CurrentDir		;Pfadname=neues Direktory
	move.l d0,altpfad		;alten Pfad merken
	move.l #111,d0			;kein Fehler
endof	rts


* Altes Direktory widerherstellen

altdir	move.l altpfad,d1		;Zeiger auf Lock-Struktur
	CALLDOS CurrentDir		;altes Direktory setzen
	rts


* Datei öffnen  (D2: 1005=Lesen, 1006=Schreiben)

open	move.l #Dateiname,d1		;Zeiger auf Filenamen
	CALLDOS Open			;Datei öffnen
	move.l d0,filepointer		;Pointer sichern
	rts


* Datei schließen

close	move.l filepointer,d1		;Pointer holen
	CALLDOS Close			;Datei schließen
	rts


* Daten einlesen

lesen	move.l filepointer,d1		;Pointer holen
	move.l #rpuff,d2		;Zeiger auf Datenpuffer
	CALLDOS Read			;Daten einlesen
	rts

* Daten schreiben

schreiben move.l filepointer,d1		;Pointer holen
	  move.l #rpuff,d2		;Zeiger auf Datenpuffer
	  CALLDOS Write			;Daten schreiben
	  rts

* Screen des IFF-Bildes schließen, wenn erforderlich

clscreen  move.l bildpointer,d0	        ;Screen geöffnet ?
	  beq noscreen			;Nein !
	  move.l d0,a0
	  CALLINT CloseScreen		;Ja, Screen schließen
noscreen  rts


* E N D E   P R O G R A M M


ende	bsr clscreen			;IFF-Screen schließen

	move.l windowpointer,a0		;Window schliessen
	CALLINT CloseWindow	
				
	move.l screenpointer,a0		;Screen schliessen
	CALLINT CloseScreen

	move.l _DOSBase,a1		;Alle Librarys schliessen
	CALLEXEC CloseLibrary
fini3	move.l _GfxBase,a1
	CALLEXEC CloseLibrary
fini2	move.l _IntuitionBase,a1
	CALLEXEC CloseLibrary
fini1	rts

	cnop 0,2

		
_DOSBase  dc.l 0			;Basis-Pointer Librarys
_IntuitionBase  dc.l 0
_GfxBase dc.l 0
					
dosname  dc.b "dos.library",0		;Namen Librarys
	cnop 0,2
grafname  dc.b "graphics.library",0
	cnop 0,2
intname  dc.b "intuition.library",0
	cnop 0,2


print		PRINTOUT text1,200,20
		PRINTOUT text2,200,40
		PRINTOUT text3,200,60
		PRINTOUT text4,200,90
		PRINTOUT text5,200,110
		PRINTOUT text6,200,130
		rts

 
text1		TEXTOUT text11
text2		TEXTOUT text22
text3		TEXTOUT text33
text4		TEXTOUT text44
text5		TEXTOUT text55
text6		TEXTOUT text66
 
		even
text11          dc.b "***** Fileauswahl *****",0
		even
text22          dc.b "      (w) 1988 by   ",0
		even
text33		dc.b "   F.Riemenschneider",0
		even
text44          dc.b "   Was wünschen Sie?",0
		even
text55          dc.b "     Grafik LADEN   ",0
		even
text66		dc.b "   Grafik SPEICHERN",0
		even


* Strukturen

* a) SCREENS

screen_defs	SCREEN 640,400,$8000,titel
bild		SCREEN 0,0,0,titel1

titel   dc.b "IFF-Grafik",0
	cnop 0,4
titel1  dc.b "IFF-Bild",0
	cnop 0,4

screenpointer  dc.l 0
bildpointer    dc.l 0
  

* b) WINDOWS

waehlwindow  WINDOW 130,55,380,188,$60,igadget1,wwindowname,point1,$1006             
startwindow  WINDOW 0,20,639,235,$260,igadget111,swindowname,point2,$100E

swindowname  dc.b   "IFF-Grafik laden/speichern",0
	cnop 0,2
wwindowname  dc.b   "Fileauswahl",0
	cnop 0,4

iwindowpointer  dc.l 0
windowpointer dc.l 0
		even	

 
* b) GADGETS

boarder 
	 dc.w 0,0  	;x,y-Offset
	 dc.b 3,1	;Farben
	 dc.b   0	;Farbmodus
	 dc.b   2	;Zahl Koordinatenpaare
	 dc.l  koord1	;Koordinatenpointer
	 dc.l   0	;Nächster Boarder

koord1          

	dc.w 	 -2,10
	dc.w     265,10

boarder1 
	 dc.w 0,0  	;x,y-Offset
	 dc.b 3,1	;Farben
	 dc.b   0	;Farbmodus
	 dc.b   5	;Zahl Koordinatenpaare
	 dc.l  koord2	;Koordinatenpointer
	 dc.l   0	;Nächster Boarder

koord2          

	dc.w 	 -2,-2
	dc.w     77,-2
	dc.w 	 77,10
	dc.w     -2,10
	dc.w     -2,-2


puffer  dc.w 0,0,0,0


propinfo

	dc.w  5		;Vertikal verschieblich
	dc.w 0,0	;x,y-Position
	dc.w 0		;keine horizontale Verschiebung
	dc.w $ffff      ;Schrittweite
	dc.w 0		;Breite
	dc.w 0		;Höhe
	dc.w 0		;Schrittweite horizontal
	dc.w 0		;Schrittweite vertikal
	dc.w 0		;Linker Rand
	dc.w 0		;Rechter Rand



string11        dc.b  "Pfadname :",0
		even
string22        dc.b  "Ausführen",0
		even
string33        dc.b  "Abbrechen",0
		even
string44        dc.b  "Dateiname :",0
		even


string1000	ds.b  33
		even
string1001	ds.b  33
		even
string1002	ds.b  33
		even
string1003	ds.b  33
		even
string1004	ds.b  33
		even
string1005	ds.b  33
		even
string1006	ds.b  33
		even
string1007	ds.b  33
		even
string1008	ds.b  33
		even
string1009	ds.b  33
		even

Dateiname	dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		dc.b 0,0,0,0,0,0,0,0
	        even
Pfadname	dc.b "DF0:"
		ds.b 100
		even

string110	dc.b  "  Laden",0
	        even
string111	dc.b  "Speichern",0
		even


string1         STRING -90,0,string11,0
string2         STRING 0,0,string22,0
string3         STRING 0,0,string33,0
string4         STRING -90,0,string44,0

string100	STRING 0,0,string1000,0
string101 	STRING 0,0,string1001,0
string102	STRING 0,0,string1002,0
string103 	STRING 0,0,string1003,0
string104	STRING 0,0,string1004,0
string105	STRING 0,0,string1005,0
string106 	STRING 0,0,string1006,0
string107 	STRING 0,0,string1007,0
string108	STRING 0,0,string1008,0
string109 	STRING 0,0,string1009,0


string20	STRING 0,0,string110,0
string21	STRING 0,0,string111,0


* Fileauswahl-Gadgets

igadget1     	GADGET igadget2,100,15,0,4,boarder,string1,strinfo1,0
igadget2        GADGET igadget3,10,165,3,1,boarder1,string2,0,1
igadget3        GADGET igadget4,280,165,3,1,boarder1,string3,0,2
igadget4     	PROPGADGET igadget5,348,35,3,3,puffer,0,propinfo,3
igadget5        GADGET igadget6,10,35,0,1,0,string100,0,100
igadget6        GADGET igadget7,10,45,0,1,0,string101,0,101
igadget7        GADGET igadget8,10,55,0,1,0,string102,0,102
igadget8        GADGET igadget9,10,65,0,1,0,string103,0,103
igadget9        GADGET igadget10,10,75,0,1,0,string104,0,104
igadget10       GADGET igadget11,10,85,0,1,0,string105,0,105
igadget11       GADGET igadget12,10,95,0,1,0,string106,0,106
igadget12       GADGET igadget13,10,105,0,1,0,string107,0,107
igadget13       GADGET igadget14,10,115,0,1,0,string108,0,108
igadget14       GADGET igadget15,10,125,0,1,0,string109,0,109
igadget15       GADGET 0,100,145,0,4,boarder,string4,strinfo2,4

strinfo1        STRINF Pfadname  
strinfo2        STRINF Dateiname


* Wahl Laden/Speichern

igadget111    	GADGET igadget112,250,170,3,1,boarder1,string20,0,0
igadget112      GADGET 0,250,200,3,1,boarder1,string21,0,1

