PWID 136
PLEN 90
*      SchrumpfCLI V2.0     *
* (C) 1988 by Stefan Kemeny *

ExecBase     =        4
OldOpenLib   = -30 -378
CloseLib     = -30 -384

OpenScreen   = -30 -168
CloseScreen  = -30 - 36
SizeWindow   = -30 -258
WindowLimits = -30 -288
MoveWindow   = -30 -138

Start:
 cmpi.l #1,d0		;Falls Parameter übergeben,
 bne.S NameGegeben	;als Fensternamen übernehmen
 move.l #WinName,a0	;sonst "AmigaDOS" als Vorein-
 move.l #9,d0		;stellung sezten
NameGegeben:
 subq.l #1,d0
 move.l a0,WinPointer	;Startaddresse des Parameters
 move.b #0,(a0,d0)	;Name muss mit \NULL enden
 addq.l #1,d0
 add.l a0,d0
 move.l d0,WinPoinEnd	;Endaddresse des Parameters
 bsr.L OpenInt		;INTUITION muss her...
 bsr.L FindeScreenHandle  ;Screen-Struktur suchen
 bsr.L FindeFensterHandle ;Suche nach Fenster-Struktur
Module:			;Die Struktur ist gefunden !!!
 bsr.S FensterGrenzen	;einige Elemente, gänzlich
 bsr.S FensterKleiner	;ersetzbar, weglaßbar und
 bsr.S FensterBewegen	;veränderbar
 bsr.L CloseInt		;Bye, INTUITION
 move.l #0,d0		;Schon Ende, zurück ins DOS
rts

FensterGrenzen:		;Window-Handle ist in
 move.l IntBase,a6	;"WindowHandle:" abgelegt,
 move.l WindowHandle,a0	;dieses Modul kann verändert,
 move.l #124,d0		;werden, da es keinen Wert
 move.l #29,d1		;zurückgibt und weil die Aktion
 move.l #640,d2		;nicht zwingend nötig ist für
 move.l #72,d3		;weitere Module
 jsr WindowLimits(a6)	;VERÄNDERT MIN/MAX Größe
rts

FensterKleiner:		;Man sollte bei der
 move.l IntBase,a6	;Programmierung dieser Module
 move.l WindowHandle,a0	;darauf achten, daß kein absoluter
 clr.l d0		;Wert vorausgesetzt wird (z.B. eine
 move.w 8(a0),d0	;bestimme Höhe, man sollte diese
 clr.l d1		;Daten eher aus der Window-Struktur
 move.w 10(a0),d1	;herauslesen, dann geht alles
 move.w 16(a0),d2	;klar
 move.w 18(a0),d3
 sub.l d2,d0		;Hier wird auf die Minimalgröße
 sub.l d3,d1		;verkleinert, die aus der
 neg.l d0		;Struktur gelesen wurde
 neg.l d1
 jsr SizeWindow(a6)
rts

FensterBewegen:		;Dieses Modul bewegt das Fenster
 move.l IntBase,a6	;in die linke untere Ecke.
 move.l WindowHandle,a0
 clr.l d0		;Dabei wird die Höhe des Fensters
 clr.l d1		;mit einberechnet, damit es nicht
 move.w 4(a0),d0	;aus dem Screen ragt (und dabei
 move.w 6(a0),d1	;eifrig zum Meditieren anregt...)
 move.w #$e3,d2
 sub.l d2,d1
 neg.l d0		;Fügen Sie ruhig eigene Module
 neg.l d1		;ein, vielleicht ein ZOOM-Gadget ?!?
 jsr MoveWindow(a6)
rts

FindeScreenHandle:	;Hauptroutine #01, ermittelt
 move.l IntBase,a6	;die Handle des Workbench-Screens aus
 lea DummyScreen,a0	;einem Dummy-Screen, der so gut wie
 jsr OpenScreen(a6)	;keinen Speicher braucht und eh
 move.l d0,a0		;sofort geschlossen wird...
 move.l (a0),-(sp)
 jsr CloseScreen(a6)
 move.l (sp)+,a0
NextScreen:		;Falls mehrere Screens existieren,
 cmpi.l #0,a0		;eine kleine Sicherung:
 bne.S ScreenVorhanden	;Jeder Screen wird mit Namen
 move.l (sp)+,a0	;überprüft,
 bsr.L CloseInt		;falls der Workbench-Screen
 move.l #60,d0		;nicht gefunden wird,
rts			;springt das Programm mit
ScreenVorhanden:	;Error #60 zurück
 move.l $16(a0),a1	;(Irgendwie paradox, wo kam denn
 lea.l ScrName,a2	; dann der CLI-Befehl
ScreenLoop1:		; SchrumpfCLI her ???)
 move.l #ScrEnd,d1
 cmp.l d1,a2
 beq.S ScreenFound	;Augenmerk auf die VERGLEICH-
 move.b (a1)+,d1	;Routine richten, es muß
 move.b (a2)+,d2	;byteweise verglichen werden,
 cmp.b d1,d2		;da eine ungerade Addresse
beq.S ScreenLoop1	;den Guru holt...
 move.l $0(a0),a0
 bra.S NextScreen
ScreenFound:
 move.l a0,ScreenHandle
rts

FindeFensterHandle:
 move.l ScreenHandle,a0	;Siehe Oben
 move.l $4(a0),a0	;(Dies ist prinzipiell die
NextWindow:		; selbe Routine wie für
 cmpi.l #0,a0		; Screens, nur wird diesmal
 bne.S WindowVorhanden	; von der ermittelten
 move.l (sp)+,a0	; Screen-Handle ausgegangen,
 bsr.S CloseInt		; nicht von der eines
 move.l #80,d0		; DUMMY-Screens !)
rts
WindowVorhanden:
 move.l $20(a0),a1
 move.l WinPointer,a2
WindowLoop1:
 move.l WinPoinEnd,d1
 cmp.l d1,a2
 beq.S WindowFound
 move.b (a1)+,d1
 move.b (a2)+,d2
 cmp.b d1,d2
beq.S WindowLoop1
 move.l $0(a0),a0
 bra.S NextWindow
WindowFound:
 move.l a0,WindowHandle
rts

OpenInt:		;Ohne INTUITION läuft
 move.l ExecBase,a6	;hier schon gar nichts
 lea.l IntName,a1
 jsr OldOpenLib(a6)
 move.l d0,IntBase
 tst.l d0
 beq.S KeinINTUITION
rts
KeinINTUITION:		;Nun, schade .
 move.l (sp)+,d0	;Zurück ins DOS
rts

CloseInt:		;INTUITION ade
 move.l ExecBase,a6
 move.l IntBase,a1
 jsr CloseLib(a6)
rts

align 4			;Es folgen Daten
IntBase:	dc.l 0
ScreenHandle:	dc.l 0
WindowHandle:	dc.l 0
WinPointer:	dc.l 0
WinPoinEnd:	dc.l 0
IntName:	dc.b 'intuition.library',0
ScrName:	dc.b 'Workbench Screen',0
ScrEnd:	;Hier der Name des Screens, wo gesucht werden soll
WinName:	dc.b 'AmigaDOS',0
WinEnd: ;Der voreingestellte Wert, kann geändert werden

even ;Vergessen Sie bei den Namen ein NULL-Byte am Ende nicht !!
DummyScreen:		;ULTRA-MINI, man
 dc.w 0,1024,10,10,1	;braucht ihn ja nur
 dc.b 0,1		;für Bruchteile einer
 dc.l 15,0,0,0,0	;Sekunde
