; Grow & Shrink Off
; Geschrieben von Laurenz Pruessner
; Sprache : 680xx-Assembler
; Compiler: MAS/68K

trap_2	EQU $88	; Trap #$02-Vektor
id		EQU 'GOFF'	; XBRA-ID

TEXT

anfang:
	bra.w	xbra_inst

; Sprung zur Installation und
; Schalter Programm ein/aus

switch:
	dc.w	-$01
	dc.l	'XBRA'	; XBRA-Kopf
	dc.l	id	; XBRA-Kennung
oldadr:
	dc.l	$00	; Alter Vektor

new_trap_2:
	cmp.w	#$C8, d0	; AES-Aufruf?
	bne.w	trap_sprung	; Nein -> Durchsprung

	tst.w	switch
	bne.w	aes

trap_sprung:
	move.l	oldadr(pc), -(sp)
	rte		; Durchsprung ohne Aktion

aes:
	movem.l	a0-a1, -(sp)
	movea.l	d1, a0	; Zeiger auf den Parameterblock
			; nach a0
	movea.l	(a0), a1	; Zeiger auf contrl in a1
	cmpi.w	#$33, (a1)	; form_dial()?
	beq.w	draw_unterb
	cmpi.w	#$48, (a1)	; graf_growbox()?
	beq.w	unterbinden
	cmpi.w	#$49, (a1)	; graf_shrinkbox()?
	beq.w	unterbinden
cont:
	movem.l	(sp)+, a0-a1
	bra.w	trap_sprung

draw_unterb:
	movea.l	$08(a0), a1
	cmpi.w	#$01, (a1)	;	FMD_GROW oder
	beq.w	unterbinden
	cmpi.w	#$02, (a1)	; FMD_SHRINK als Parameter?
	bne.w	cont	; Nein -> TOS aufrufen
unterbinden:
	movea.l	$0C(a0), a0	; Zeiger auf int_out in a0
	st	$01(a0)	; return-Wert setzen
	movem.l	(sp)+, a0-a1	; unverrichteter Dinge
	rte		; zurück zum Programm.

; Der folgende Programmteil bleibt nicht resident. er dient nur der
; Installation.

xbra_inst:
	lea	meldung(pc), a0
	bsr.w	cconws
	pea	xbra(Pc)	; XBRA-Installation im
	move.w	#$26, -(sp)	; Supervisormodus durchführen
	trap	#14	; Supexec
	addq.l	#$06, sp

	clr.w	-(sp)	; Entscheidung Pterm0 / Ptermres
	tst.w	d0	; resident halten / löschen
	beq.w	abgang
	pea	$100 + xbra_inst - anfang.w
	move.w	#$31, -(sp)
abgang:
	trap	#1

xbra:
	lea	trap_2.w, a0
	lea	new_trap_2(pc), a1
kette:
	move.l	(a0), a2
	cmpi.l	#'XBRA', -$0c(a2)	; XBRA-Struktur gefunden?
	bne.w	install	; Wenn nicht, dann installieren
	move.l	-$08(a1), d1	; Ist es die gleiche Routine?
	cmp.l	-$08(a2), d1
	beq.w	found	; Ja!
	lea	-$04(a2), a0
	bra.w	kette

install:
	lea	trap_2.w, a0	; Routine installieren
	move.l	(a0), -$04(a1)	
	move.l	a1, (a0)
	bsr.w	inst_aus
	moveq	#$01, d0
	rts

found:
	lea	angescha1tet(pc), a0
	not.w	switch - new_trap_2(a2)	; ein/aus-Schalter umlegen
	beq.w	aus

inst_aus:
	lea	abgeschaltet(pc), a0
aus:
	bsr.w	cconws
	moveq	#$00, d0
	rts

cconws:
	move.l	a0, -(sp)
	move.w	#$09, -(sp)
	trap	#1
	addq.l	#$06, sp
	rts

meldung:
	dc.b	'Grow- und Shrinkboxen', $0
abgeschaltet:	
	dc.b	'abgeschaltet.', $0d, $0e, $00
EVEN
angeschaltet:
	dc.b	'zugeschaltet.', $0d, $0e, $0

END
