	opt d-,l-
	
	incdir "sys:include/"
	include "iff/iff.i"
	include "exec/exec_lib.i"
	include "intuition/intuition.i"
	include "intuition/intuition_lib.i"			
	include "graphics/graphics_lib.i"
	include "libraries/dos_lib.i"
	
	Section programm,code
		
	move.l a0,text		;Zeiger auf nachfolgetext speichern
	move.b #1,erc		;Fehler 1 (move ...
	cmp.l #1,d0			;anzahl Zeichen
	blo error			;kleiner -> Fehler
	jsr tloop			;chr$(10) am Ende durch chr$(0) ersetzen
	lea iff,a1			;Ifflib Name
	move.l #15,d0		;Version
	CALLEXEC OpenLibrary	;und öffnen		
	move.l d0,_IFFBase	;Sichern
	move.b #2,erc		;Fehler 2 (Keine IFF ....
	cmp.l #0,d0			;ok ?
	beq error			;mist und tschüss
	lea int,a1			;das gleiche wie oben
	clr.l d0
	CALLEXEC OpenLibrary
	move.l d0,_IntuitionBase
	move.b #3,erc		;Fehler 3 (Keine Intui ...
	cmp.l #0,d0
	beq error
	lea dos,a1			
	clr.l d0			;Dos wird nich abgefragt 
	CALLEXEC OpenLibrary	;da sie nur für ausgabe im CLI gebraucht wird		
	move.l d0,_DOSBase
	lea gra,a1
	clr.l d0
	CALLEXEC OpenLibrary
	move.l d0,_GfxBase
	move.b #4,erc		;Fehler 4 (Keine Gra ...
	cmp.l #0,d0
	beq error
	move.l text,a0		;Zeiger auf Bildnamen
	CALLIFF OpenIFF		;und in Speicher laden
	move.l d0,ifffile		;sichern
	move.b #5,erc		;Fehler 5 (Bild nicht gefunden oder nicht iff
	cmp.l #0,d0			;Test ob ok
	beq error			;tschüss
	move.l ifffile,a1		;Handler (Startadresse) des Iff Files
	CALLIFF GetBMHD		;Bit Map Header Laden (Breite, Höhe ...
 	move.l d0,a0		;Für ausbeute in Adressregister schreiben
	lea screen1,a2		;Platz für Neuer Screen Structur
	move.w 16(a0),ns_Width(a2)	;breite eintragen
	move.w 18(a0),ns_Height(a2)	;höhe eintragen
	move.w 16(a0),b		;und beide Werte zum Rechnen sichern
	move.w 18(a0),h
	clr.l d0			;löschen
	move.b 8(a0),d0		;und Anzahl Bitplanes
	move.w d0,depth		;in Tiefe schreiben
	CALLIFF GetViewModes	;View Modes (HAM,EHB) holen
	move.w d0,viewmodes	;sichern
	lea screen1,a0		;Adresse des 1. Schirms holen
	jsr screenparameter	;und Werte in Tabelle für Schirm eintragen
	lea screen2,a0		;Adresse des 2. Schirms
	cmp.w #352,b		;Bildbreite > 352
	bgt k1			;dann vieleicht Hires
	cmp.w #160,b		;Bildbreite < 160
	blt k4			;Witzlos!! -> gleich zum Test
	move.w #352,x		;dann 352 für Overscann
	bra k2			;und weiter mit der höhe
k1:
	cmp.w #704,b		;Schirm >704
	bgt k4			;Größer als Overscann -> Test
	move.w #704,x		;Bilbreite = 704
k2:
	cmp.w #292,h		;Bildhöhe > 292		
	bhi k3			;dann vileicht Lace
	cmp.w #128,h		;kleiner 128
	blt k4			;zu klein -> Test
	move.w #292,y		;Bildhöhe = 292
	bra k4			;auf jeden Fall zum Test
k3:
	cmp.w #548,h		;größer als Hires Overscann ?
	bgt k4			;dann Test
	move.w #584,y		;Bildhöhe = 548
k4:
	move.b #7,erc		;Fehler 7 (Bildformat ...
	cmp.w #0,x			;Wurde ein außergewöhnliches Format gefunden
	beq error			;so sind x oder y oder beide = 0
	cmp.w #0,y			;wenn einer von beiden 0 -> Fehler
	beq error
	move.w x,ns_Width(a0)	;Werte in New Screen eintragen (a0 = Zeiger
	move.w y,ns_Height(a0)	; auf ns_Screen
	jsr screenparameter	;und restliche Werte eintragen
	jsr clr			;alle Datenregister löschen
	move.w x,d0			;Overscann Breite d0
	move.w b,d1			;Breite des geladenen Bildes
	jsr divs			;und Werte für Verdopplungen errechnen
	move.l d0,xcount		;Rückgabewerte (Hi Word + Lo Word) sichern
	jsr clr			;und das selbe für Höhe
	move.w y,d0			;Overscann Höhe
	move.w h,d1			;existierene Höhe
	jsr divs			;Zahlen errechnen
	move.l d0,ycount		;und merken
	lea screen1,a0		;Normaler Schirm
	CALLINT OpenScreen	;Öffnen
	move.l d0,screenhd	;Rückgabewert (Screenhandler) sichern
	move.b #6,erc		;Fehler 6 (Kann Screen ....
	cmp.l #0,d0			;Test ob ok
	beq error			;nein dann Tschüss
	lea screen2,a0		;Overscann Schirm
	CALLINT OpenScreen	;Öffnen
	move.l d0,screenhd1	;sichern
	cmp.l #0,d0			;ok ?
	beq error
	move.l screenhd,d0	;Normaler Schirm
	add.l #sc_BitMap,d0	;Zeiger auf Bit-Map
	move.l d0,a0		;und in Adressregister
	move.l ifffile,a1		;Zeiger auf IFF-Daten
	CALLIFF DecodePic		;und Bild auf Schirm
	lea coltab,a0		;Speicher fuer Farbtabelle
	move.l ifffile,a1		;IFF-Daten
	CALLIFF GetColorTab	;und Farbtabelle fuellen
	move.l ifffile,a1		;Iff-Daten
	CALLIFF CloseIFF		;und Speicher freimachen
	move.l #0,ifffile		;0 fuer Test bei Fehlern
	move.l screenhd,a0	;Schirm 1
	adda.l #sc_ViewPort,a0	;jetzt a0=Zeiger auf ViewPort
	lea coltab,a1		;Adresse der Farbtabelle
	move.l #32,d0		;Anzahl Farben (alle)
	CALLGRAF LoadRGB4		;und Farbe ins Spiel
	move.l screenhd1,a0	;Overscann Schirm
	adda.l #sc_ViewPort,a0	;und dasselbe noch einmal
	lea coltab,a1
	move.l #32,d0
	CALLGRAF LoadRGB4

xverg:					;Bild in X -Richtung strecken
	jsr clr			;alle Datenregister löschen
	move.l xcount,d7		;Beide Zähler nach d7
	move.l screenhd,a0	;adresse des Screens
	adda.l #sc_RastPort,a0	;umwandeln in RP
	move.l screenhd1,a1	;und das gleiche fuer den 2. Schirm
	adda.l #sc_RastPort,a1
	move.l #1,d4		;Breite 1 Zeile
	move.w h,d5			;Höhe ganze höhe
	move.b #$c0,d6		;Blittermodus nur Quelle
	sub.w #1,b			;für vergleich ob ende -1
	sub.w #1,x
go:
	movem.l d0-d7/a0-a1,-(sp)	;Register retten da ClipBlit d0 und
	CALLGRAF ClipBlit			;d1 verändert
	movem.l (sp)+,d0-d7/a0-a1	;nach ausführung nochmal zurück
	cmp.w b,d0				;Breite schon erreicht
	beq go1				;nur nicht größer werden lassen
	add.w #1,d0				;andernfalls 1 zu source x Coord
go1:	
	cmp.w x,d2			;sollBreite erreicht
	beq yverg			;Prima fast fertig
	add.w #1,d2			;x coordinate 1 Zeile zu dest x Coord
	swap d7			;beide Zähler tauschen
	sub.w #1,d7			;2. Zähler -1
	beq go2			;=0 dann muß man wohl 1 Zeile doppelt schreiben
	swap d7			;Zähler tauschen
	dbra d7,go			;1. Zähler testen ob 0
	sub.w #1,d0			;nächste Zeile = letzte Zeile
	move.w xcount1,d7		;Zähler wieder neu laden
	bra go			;und weiter am anfang
go2:
	sub.w #1,d0			;nächste Zeile = letzte Zeile
	move.w xcount,d7		;Zähler neu laden
	swap d7			;und Zähler tauschen
	bra go			;weiter im Text
yverg:					;Bild in Y Höhe streken		
	add.w #1,b			;sub von vorhin wider Rückgängig machen
	add.w #1,x
	jsr clr			;Datenregister löschen
	move.l ycount,d7		;Zähler in d7
	move.l screenhd1,a0	;Adresse des Schirms
	move.w y,d3			;Dest Höhe = Overscann
	sub.w #1,d3			;1 weniger (Computer zählt auch die 0 mit)
	move.w x,d4			;Breite = Maximale Breite
	adda.l #sc_RastPort,a0	;Rastport
	move.l a0,a1		;Surce Rastport = Destrastport
	move.l #$c0,d6		;miniterm
	move.w h,d1			;y start (source)
	sub.w #1,d1			;-1
	move.w #1,d5		:höhe 1 Zeile
go3:
	movem.l d0-d7/a0-a1,-(sp)	;Wie oben
	CALLGRAF ClipBlit
	movem.l (sp)+,d0-d7/a0-a1
	cmp.w #0,d1			;Schon 0
	beq go4			;darf nich negativ werden
	sub.w #1,d1			;andernfalls Sourcezeile = Sourcezeile -1
go4:
	cmp.w #0,d3			;Schon oben
	beq zeige			;Fast vertig
	sub.w #1,d3			;Destzeile = Destzeile -1
	swap d7			;Zähler tauschen
	sub.w #1,d7			;Zähler2 -1
	cmp.w #0,d7			; 0 ?
	beq go5			;ja dann Zeile verdoppeln
	swap d7			;Zähler tauschen
	dbra d7,go3			;Zähler 1 = Doppelte Zeile ?
	add #1,d1			;dann wieder 1 dazu
	move.w ycount1,d7		;Zähler neu laden
	bra go3			;und noch einmal
go5:
	add.w #1,d1			;1 Zeile dazu
	move.w ycount,d7		;Zähler laden
	swap d7			;Zähler in urzustand drehen
	bra go3	 		;und weiter

zeige:
	move.l screenhd1,a0		;Screenhander
	move.l	88(a0),d6		; BitMap
	move.l	48(a0),a1		; struct ColorTable
	move.l	4(a1),d7		; struct Colormap
	lea	44(a0),a1			; sc_ViewPort
	move.w	32(a1),d1		; vp_Modes
	moveq	#1,d0				; Cruncher-Flag setzen
	btst	#11,d1			; Hold And Modify ?
	beq.s	NoHam				; no --->
	bset	#7,d0				; Set HAM-Flag for iff.lib
NoHam:
	move.l text,a0			; Name of file to save
	move.l	d6,a1			; Pointer to BitMap
	move.l	d7,a2			; Pointer to ColorMap
	CALLIFF SaveBitMap		; und Speichern
	move.b #8,erc			;Fehler 8 (Fehler beim Speichern..
	cmp.l #0,d0				;Fehler ?
	beq error				;ja dann in fehlerrutine
erro:	
	move.b #0,erc			;Kein Fehler
error:
	cmp.l #0,_DOSBase			;Dos Lib vorhanden ?
	beq exit				;nein (Kriegt man hier garnichts)
	CALLDOS Output			;Handle des Cli Fensters holen
	cmp.l #0,d0				;ok ?
	beq exit				;wenn kein Fenster -> keine Meldung
	clr.l d7				;löschen weil multiplikation
	move.b erc,d7			;Fehler
	mulu #25,d7				;*25 Buchstaben pro Meldung
	lea fehler,a0			;Anfang der Meldungen
	adda.l d7,a0			;und zueinander addieren
	move.l d0,d1			;Handle
	move.l a0,d2			;Zeiger auf Meldung
	move.l #25,d3			;25 Zeichen ausgeben
	CALLDOS Write			;und schick sie auf den Schirm

exit:	
	move.l screenhd1,a0		;Test ob Schirm da und wenn ja
	cmp.l #0,a0				;schließen
	beq exit1
	CALLINT CloseScreen
	move.l screenhd,a0
exit1:	
	cmp.l #0,a0
	beq exit2
	CALLINT CloseScreen
	move.l _IFFBase,a1		;Test ob iFF library da
exit2:
	cmp.l #0,a1
	beq exit3
	move.l ifffile,a1			;Iff file noch geöffnet ?
	cmp.l #0,a1
	bne exit7				;nein dann nur iff library schließen
	CALLIFF CloseIFF
exit7:
	move.l _IFFBase,a1	
	CALLEXEC CloseLibrary
	move.l _IntuitionBase,a1
exit3:
	cmp.l #0,a1				;und nun die librarys schließen
	beq exit4
	CALLEXEC CloseLibrary
	move.l _GfxBase,a1
exit4:
	cmp.l #0,a1
	beq exit5	
	CALLEXEC CloseLibrary	
	move.l _DOSBase,a1
exit5:	
	cmp.l #0,a1
	beq exit6
	CALLEXEC CloseLibrary
exit6:
	rts
	
tloop:				
	move.b (a0)+,d1		;Zeichen nach d1 und adresszeiger erhöhen
	cmpi.b #10,(a0)		;ist = Return
	bne tloop			;nein dann weiter
	move.b #0,(a0)		;Return durch chr$(0) ersetzen
	rts				;und zurück

divs:
	;d0 = größere Zahl	d1 = kleinere Zahl
	clr.l d6
	clr.l d7
	move.w d0,d6		;Register zum Rechnen sichern
	move.w d1,d7		
	sub.w d1,d0			;Breite des 2. Schirms - 1. Schirm
	divs.w d0,d1		;Breite durch Rest Pixel
	swap d1			;ergebnis umdrehen das Rest im unteren Word steht
	cmp.w #0,d1			;Rest ?
	bne divs1			;ja dann zweiten Zähler ausrechnen
	move.w #$7fff,d1		;damit wird 2. Zähler nie erreicht
	swap d1			;ergebnis wieder umdrehen 
	move.l d1,d0		;und in d0 für Rückgabe
	rts
divs1:
	swap d1			; ergebnis ins untere Word
	add.w #1,d1			; 1 + anzahl
	move.w d7,d0		; Kleinster Wert
	divs.w d1,d0		; Durch Anzahl der Verdopplungen
	move.w d0,d4		; =Anzahl der Beim 1. Mal Kopierten Daten
	sub.w d4,d6		 	; - Größter Wert - ^
	sub.w d7,d6			; - Kleinste Zahl
	divs.w d6,d7		; Kleinste Zahl / Rest
	move.w d1,d0		; und richtig setzen
	add.w #1,d0			; eins dazu 
	swap d0			; umdrehen
	move.w d7,d0		; 2.Zähler dazu
	swap d0			; und wieder richtig stellen
	rts
	
screenparameter:
	move.w #15,ns_Type(a0)			;Workbench Screen
	move.l #titel,ns_DefaultTitle(a0)	;Titeltext
	move.w depth,ns_Depth(a0)		;Tiefe (Anz. Bitplanes)
	move.w viewmodes,ns_ViewModes(a0)	;Hires,Lace,EHB,HAM
	move.b #0,ns_DetailPen			;Stiftfarbe
	move.b #1,ns_BlockPen			;Hintergrund
	rts

clr:
	clr.l d0			;alle Register löschen
	clr.l d1
	clr.l d2
	clr.l d3
	clr.l d4
	clr.l d5
	clr.l d6
	clr.l d7
	rts

	section Texte,data

depth:     dc.w 2			;voreinstellung
viewmodes: dc.w $8000

gra: GRAFNAME			;Namen der Libraries
int: INTNAME
dos: DOSNAME
iff: IFFNAME

titel:   	dc.b "Overscann (©) 1990 by Uwe Jenal",0

fehler:
	dc.b "(©) 1990 Uwe Jenal      ",10
	dc.b "Over Bildname           ",10
	dc.b "Keine Iff.library       ",10
	dc.b "Keine Intuition.library ",10
	dc.b "Keine Graphics.library  ",10
	dc.b "nicht gefunden/kein IFF ",10
	dc.b "Kann Screen nicht öffnen",10
	dc.b "Bildformat zu groß/klein",10
	dc.b "Fehler beim Speichern   ",10
	cnop 0,4
	
	section leerplatz,bss
	
screen1: 		dcb.b 32,0		;Platz für Structur NewScreen
screen2: 		dcb.b 32,0

text: 		dcb.l 1,0		;hier wird die Adresse des Filnames hingeschrieben

ifffile: 		dcb.l 1,0		;Zeiger auf IFFfile von OpenIFF
screenhd: 		dcb.l 1,0		;Adressen der Screens
screenhd1: 		dcb.l 1,0

_IntuitionBase: 	dcb.l 1,0		;Adressen der Librarys
_GfxBase: 		dcb.l 1,0
_DOSBase: 		dcb.l 1,0
_IFFBase: 		dcb.l 1,0

coltab: 		dcb.b 64,0		;Platz für Farbtabelle

b:			dcb.w 1,0		;speicherstellen für höhe und breite
h:			dcb.w 1,0
x:			dcb.w 1,0
y:			dcb.w 1,0

xcount:		dcb.w 1,0		;Zähler für Vergrößerungen
xcount1:		dcb.w 1,0
ycount:		dcb.w 1,0
ycount1:		dcb.w 1,0

erc:			dcb.b 1,0		;enthält Fehlercode
	 
