*************************************************************************
* -soft GEM-Library							*
* 1989/90 -soft, written by Markus Fritze	      24.10.1990 16:08	*
*************************************************************************
*************************************************************************
* Globale Variablen:							*
*************************************************************************
_StackSize	EQU 1024	;1k Stack fr das Programm

*************************************************************************
* Initialisierung der Library (GEMDOS & AES)				*
*************************************************************************
_gem_init:	movea.l 4(SP),A6	;Basepageadresse holen
		movea.w #$0100+_StackSize,A5 ;Gre der Basepage + Stackgre (1k)
		adda.l	12(A6),A5	;+ Gre des TEXT-Segments
		adda.l	20(A6),A5	;+ Gre des DATA-Segments
		adda.l	28(A6),A5	;+ Gre des BSS-Segments
		move.l	A5,D1		;= Gesamtlnge des Programms
		and.b	#$FE,D1 	;Lnge nun gerade
		add.l	A6,D1		;+ Programmstart (Basepageadresse)
		movea.l D1,SP		;Stack endet dort
		move.l	A5,-(SP)	;Programmlnge
		move.l	A6,-(SP)	;Adresse der Basepage
		move.l	A6,basepage	;Basepageadresse merken
		move.l	#$4A0000,-(SP)	;Funktionsnummer + Dummyword (0)
		trap	#1		;Mshrink(0,Basepageadr,Prglnge)
		lea	12(SP),SP	;Nur noch den Stack korrigieren

		move.l	#appl_init,D0
		bsr	_aes		;Programm als GEM-Applikation anmelden
		move.w	D0,ap_id
		moveq	#-1,D7		;-1: appl_init() Fehler (kann beim
		addq.w	#1,D0		;aktuellen GEM nie (!) auftreten!)
		beq	_pterm		;keine ID fr das Programm => Ende

		move.l	#graf_handle,D0
		bsr	_aes		;Handle der Bildschirm-Workstation ermitteln
		move.w	D0,vdi_handle	;Handle fr VDI-Aufrufe merken
		movem.w int_out+2(PC),D1-D4
		movem.w D1-D4,gr_hwchar

		lea	int_in(PC),A0
		movea.l A0,A1		;Zeiger merken (s.u.)
		moveq	#10,D0
_gem_init2:	move.w	#1,(A0)+	;1,1,1,1,1,1,1,1,1,1,2
		dbra	D0,_gem_init2
		addq.w	#1,-(A0)
		move.l	#v_opnvwk,D0
		bsr	_vdi		;Workstation ffnen
		moveq	#-39,D7 	;-39: kein Speicher fr VDI-Workstation
		move.w	12+control(PC),vdi_handle
		beq	_do_pterm	;kein Speicherplatz fr eine Workstation

*************************************************************************
* Hier kommt das Hauptprogramm...					*
* D0 enthlt den Exit-Code des Programms				*
*************************************************************************


;************************************************************************
;* Verlassen des Programms						*
;************************************************************************
_gem_exit:	move.w	D0,D7		;Exit-Status merken

		moveq	#v_clsvwk,D0
		bsr	_vdi		;Workstation schliessen

_do_pterm:	move.l	#appl_exit,D0
		bsr	_aes		;Applikation wieder abmelden

_pterm: 	move.w	D7,-(SP)	;Fehlercode
		move.w	#$4C,-(SP)
		trap	#1		;Pterm(Fehlercode)

*************************************************************************
* Mein eigener kleiner AES-Aufruf					*
* D0=Die ersten 4 Eintrge im control-Array (Bytebreite!)		*
*    Bit 24-31 = Der Opcode bzw. die Funktionsnummer			*
*    Bit 16-23 = Anzahl der Eintrge in int_in				*
*    Bit 8-15	= Anzahl der Eintrge in int_out			*
*    Bit 0-7	= Anzahl der Eintrge in addr_in			*
* Die Anzahl der Eintrge in addr_out ist stets 0.			*
* Ausnahme:Bei rsrc_gaddr() sollte dort eine 1 stehen (Atari hlt sich	*
*	    allerdings selbst nicht dran)				*
*************************************************************************
_aes:		movem.l D1-A6,-(SP)	;besser retten, man kann nie wissen
		lea	control(PC),A0
		clr.l	(A0)+
		clr.l	(A0)+		;control-Array lschen
		clr.w	(A0)
		movep.l D0,-7(A0)	;und die neuen Daten eintragen
		cmpi.b	#112,-7(A0)	;Ist es rsrc_gaddr()?
		bne.s	_aes1		;Nein! =>
		move.b	#1,1(A0)	;Anzahl der Eintrge in addr_out=1
_aes1:		lea	_aes_pb(PC),A0
		move.l	A0,D1
		move.w	#200,D0
		trap	#2		;AES aufrufen
		moveq	#0,D0
		move.w	int_out(PC),D0	;int_out[0]
		movem.l (SP)+,D1-A6
		rts

_aes_pb:	DC.L control	;Der AES-Parameterblock
		DC.L global
		DC.L int_in
		DC.L int_out
		DC.L addr_in
		DC.L addr_out

*************************************************************************
* Und das gleiche nochmal fr die VDI-Funktionen			*
* D0 = Die Eingabeparameter						*
*	Bit 24-31 = Opcode der Funktion 				*
*	Bit 16-23 = Lnge des Intin-Arrays				*
*	Bit 8-15  = Identifikationsnummer fr Unter-Opcodes		*
*	Bit 0-7   = Anzahl der Eintrge in ptsin			*
* Die Gertekennung wird der Variable "gr_handle" entnommen.		*
*************************************************************************
_vdi:		movem.l D1-A6,-(SP)
		lea	control+2(PC),A0
		clr.w	(A0)+		;alle Parameter lschen
		clr.l	(A0)+
		clr.w	(A0)
		move.l	D0,-(SP)
		tst.b	(SP)		;kein Opcode vorhanden? => Kurzformat
		addq.l	#4,SP
		bne.s	_vdi1
		move.b	D0,1-8(A0)	;Funktionsnummer in den Bits 0-7
		bra.s	_vdi2		;alle anderen Parameter sind 0!
_vdi1:		move.b	D0,3-8(A0)	;Anzahl der Eintrge in ptsin
		lsr.w	#8,D0
		move.w	D0,10-8(A0)	;Unter-Opcode
		swap	D0
		move.b	D0,7-8(A0)	;Anzahl der Eintrge in intin
		lsr.w	#8,D0
		move.w	D0,0-8(A0)	;Funktionsnummer
_vdi2:		move.w	vdi_handle(PC),12-8(A0) ;VDI-Handle
		lea	_vdi_pb(PC),A0
		move.l	A0,D1
		moveq	#$73,D0
		trap	#2
		moveq	#0,D0
		move.w	int_out(PC),D0	;int_out[0]
		movem.l (SP)+,D1-A6
		rts

_vdi_pb:	DC.L control	;Der VDI-Parameterblock
		DC.L int_in
		DC.L ptsin
		DC.L int_out
		DC.L ptsout

		ISYMBOL 'GEM_VARS.SYM'

*************************************************************************
* und noch ein wenig BSS-Bereich					*
*************************************************************************
		BSS
basepage:	DS.L 1		;Adresse der Basepage
control:	DS.W 16
global: 	DS.W 15
addr_in:	DS.L 3
addr_out:	DS.L 1
int_in: 	DS.W 128
int_out:	DS.W 128
ptsin:		DS.W 128
ptsout: 	DS.W 128
ap_id:		DS.W 1		;ID der Applikation
vdi_handle:	DS.W 1		;Die Handle der Bildschirm-Workstation
gr_hwchar:	DS.W 1		;Breite (in Punkten) eines Zeichens
gr_hhchar:	DS.W 1		;Hhen (in Punkten) eines Zeichens
gr_hwbox:	DS.W 1		;Mae eines Rechtecks, in das ein Standardzeichen
gr_hhbox:	DS.W 1		;komplett hineinpassen wrde
		END
