;Programm: BangerMenu bietet eine grafische Oberfläche zum Anwählen von Programmen
;          die beim Starten in der Startup-Sequence aufgerufen werden sollen.
;Autor   : Andre´ Trettin
;Codename: Banger
;Begin   : 31-Mai-95 17:08:28
;$VER    : BangerMenu.Asm 2.01 (15-Dez-95)

** INCLUDE Struktur Variablen
* Fehler Codes: 21=kein Speicher
*               22=konnte Library (oder Libraries) nicht öffnen
*               23=GetVisualInfo Fehler
*               24=konnte File S:Banger.Prefs nicht öffnen
*               25=bei der Gadgeterschaffung trat ein Fehler auf
*               26=konnte Fenster nicht öffnen oder Task nicht Finden
*               27=Einstellungen sind Leer
*               28=kein Speicher für die Einstellungen
*               29=kein MsgPort
*               30=konnte kein IORequest create
*               31=konnte Device nicht öffnen
*               32=falsche Parameter angabe
*               33=zu viele Gadget (>2560)
*               34=konnte MonitorTreiber Datei nicht laden
*               35=Monitor mit angebenen ID nicht gefunden
*               36=konnte Screen nicht öffnen
*               10=Return Code für die Startup-Sequence

	incdir  INCLUDE:
	include exec/exec.i
	include exec/io.i
	include devices/input.i
	include devices/inputevent.i
	include dos/dos.i
	include dos/dosextens.i
	include intuition/intuition.i
	include libraries/gadtools.i
	include lvo/exec_lib.i
	include lvo/dos_lib.i
	include lvo/intuition_lib.i
	include lvo/gadtools_lib.i
	include lvo/graphics_lib.i
	include lvo/input_lib.i

	STRUCTURE Internal,0
	APTR    INTUIBase
	APTR    DOSBase
	APTR    GADBase
	APTR    GFXBase
	APTR    WindowHandle
	APTR    OutputHandle
	APTR    ScreenHandle
	APTR    VisualInfo
	APTR    WinRPort
	APTR    PrefsFileHandle
	APTR    FileSpeicher
	APTR    FontAddr
	APTR    meinTask
	APTR    alterTask
	APTR    AnGad
	APTR    MsgPortAddr
	APTR    MonitorKey
	APTR    MoniID
	APTR    NOKEYArray
	APTR    RDArgs
	STRUCT  FIB,[fib_SIZEOF]
	STRUCT  TastenIBlock,[IO_SIZE]
	STRUCT  GadgetAddr,[2600*4]     ;Alle GadgetsAddressen max 2600
	STRUCT  GadgetListe,[11*4]      ;Einzelnen GadgetListe (Window)
	STRUCT  PageLAddr,[11*4]        ;eine Seite zurück
	STRUCT  PageRAddr,[11*4]        ;eine Seite vor
	STRUCT  GadgetPage,[11*4]       ;Gadgetanfang einer Seite
	LONG    Filegroesse
	LONG    GadUniLang
	WORD    BreiteGPos
	WORD    BreiteGADs
	WORD    HoeheWin
	WORD    CAPS
	WORD    SCHoehe
	WORD    SCBreite
	WORD    AnzahlGADs
	WORD    MaxZeile
	WORD    MaxSeite
	WORD    AnPage
	BYTE    AnzahlPage
	BYTE    PageJa
	BYTE    ZweitePage
	BYTE    ScreenSignal
	BYTE    RelativeTopC
	BYTE    RelativeLeftC
	LABEL   Int_SIZEOF
;;
** Hauptprog
	moveq   #0,d7
	move.l  4.w,a6
	move.l  #Int_SIZEOF,d0
	move.l  #MEMF_PUBLIC!MEMF_CLEAR,d1
	jsr     _LVOAllocMem(a6)
	move.l  d0,a5
	bne.s   LibraryO
	moveq   #21,d7           ;21 = kein Speicher
	bra.s   Ende
LibraryO
	bsr.w   InitRelative
	bsr.w   LibOeffne
	tst.w   d7
	bne.s   SchliesseLibrary
	bsr.s   Parameter
	tst.w   d7
	bne.s   SchliesseLibrary
	bsr.w   WaitOnCaps
	cmp.w   #10,d7
	bhi.s   ParameterFree
	tst.w   d7
	beq.s   Menuerscheine
	moveq   #0,d7
	bra.s   ParameterFree
Menuerscheine
	bsr.w   PubScreenOeffne
	tst.w   d7
	bne.s   ParameterFree
	bsr.w   LadePrefs
	tst.w   d7
	bne.s   SchliesseScreen
	bsr.w   InitGadget
	tst.w   d7
	bne.s   FreiSPrefs
	bsr.w   FensterOeffne
	tst.w   d7
	bne.s   RemGad
	move.w  #0,d5
	bsr.w   GadAktivieren
	bsr.w   RefreshWin
	bsr.w   MessageAbFragen
	bsr.w   FensterSchliesse
RemGad
	bsr.w   RemoveGadget
FreiSPrefs
	bsr.w   SpeicherPrefs
SchliesseScreen
	bsr.w   ScreenSchliesse
ParameterFree
	bsr.s   FreePara
SchliesseLibrary
	bsr.w   LibSchliesse
	move.l  a5,a1
	move.l  #Int_SIZEOF,d0
	jsr     _LVOFreeMem(a6)
Ende
	move.l  d7,d0
ende
	rts
;;
** Parameter
Parameter
	move.l  DOSBase(a5),a6
	lea     ParaTemplate(pc),a1
	move.l  a1,d1
	lea     MonitorKey(a5),a1
	move.l  a1,d2
	moveq   #0,d3
	jsr     _LVOReadArgs(a6)
	move.l  d0,RDArgs(a5)
	bne.s   ParaOK
	jsr     _LVOIoErr(a6)
	move.l  d0,d1
	moveq   #0,d2
	jsr     _LVOPrintFault(a6)
	moveq   #32,d7
ParaOK
	rts
FreePara
	move.l  RDArgs(a5),d1
	move.l  DOSBase(a5),a6
	jsr     _LVOFreeArgs(a6)
	rts
;;
** Warte auf Caps Lock
WaitOnCaps
	tst.l   NOKEYArray(a5)
	bne.s   NOKeyJA
	move.l  4.w,a6
	jsr     _LVOCreateMsgPort(a6)
	move.l  d0,MsgPortAddr(a5)
	bne.s   MsgPortOK
	moveq   #29,d7                  ;29 = kein MsgPort
	addq    #4,a7
	pea     SchliesseLibrary(pc)
	rts
MsgPortOK
	move.l  d0,a0
	move.l  #IOSTD_SIZE,d0
	jsr     _LVOCreateIORequest(a6)
	move.l  d0,TastenIBlock(a5)
	bne.s   OeffneDev
	moveq   #30,d7                  ;30=konnte kein IORequest create
	bra.s   FreiMsgP
OeffneDev
	lea     inputname(pc),a0
	move.l  d0,a1
	moveq   #0,d0
	move.l  #IOF_QUICK,d1
	jsr     _LVOOpenDevice(a6)
	tst.l   d0
	beq.s   DevOK
	moveq   #31,d7                   ;31=konnte Device nicht öffnen
	bra.s   IOReqDel
DevOK
	move.l  TastenIBlock(a5),a0
	move.l  IO_DEVICE(a0),a6
	jsr     _LVOPeekQualifier(a6)
	and.w   #IEQUALIFIER_CAPSLOCK,d0
	cmp.w   #IEQUALIFIER_CAPSLOCK,d0
	beq.s   CAPSgedrueckt
	moveq   #10,d7
CAPSgedrueckt
	move.l  4.w,a6
	lea     TastenIBlock(a5),a1
	jsr     _LVOCloseDevice(a6)
IOReqDel
	move.l  TastenIBlock(a5),a0
	jsr     _LVODeleteIORequest(a6)
FreiMsgP
	move.l  MsgPortAddr(a5),a0
	jsr     _LVODeleteMsgPort(a6)
NOKeyJA
	rts
;;
** GadAktivieren
GadAktivieren
	move.l  GadgetAddr(a5),a3
	lea     GadgetPage(a5),a4
	lea     (a4,d5.w),a4
	move.l  (a4),a4
	move.l  (a4),a4
	moveq   #1,d6
	bsr.w   SelGK
	lea     GadgetPage(a5),a4
	lea     (a4,d5.w),a4
	move.l  (a4),a4
	move.l  a4,AnGad(a5)
	rts
;;
** Relative Init
InitRelative
	lea     topazFName8(pc),a0
	lea     topaz8(pc),a1
	move.l  a0,(a1)
	move.l  a1,FontAddr(a5)
	rts
;;
** MessageAbFragen  MsgVerarbeitung Sprung
MessageAbFragen
	move.l  WindowHandle(a5),a0
	move.l  wd_UserPort(a0),a0
	move.l  4.w,a6
	jsr     _LVOWaitPort(a6)
nocheine
	move.l  GADBase(a5),a6
	move.l  WindowHandle(a5),a0
	move.l  wd_UserPort(a0),a0
	jsr     _LVOGT_GetIMsg(a6)
	move.l  d0,a1
	tst.l   d0
	beq.s   MessageAbFragen
	move.w  im_Qualifier(a1),d2
	move.l  im_Class(a1),d3
	move.w  im_Code(a1),d4
	move.l  im_IAddress(a1),a4
	jsr     _LVOGT_ReplyIMsg(a6)
	cmpi.l  #IDCMP_CLOSEWINDOW,d3
	beq.w   ende
	cmpi.l  #IDCMP_REFRESHWINDOW,d3
	beq.s   RefreWin
	cmpi.l  #IDCMP_GADGETUP,d3
	beq.w   GadAuswertung
	cmpi.l  #IDCMP_VANILLAKEY,d3
	beq.w   VanTaste
	cmpi.l  #IDCMP_RAWKEY,d3
	beq.w   RAWTaste
	bra.s   nocheine
RefreWin
	bsr.w   RefreshWin
	bra.s   nocheine
RAWTaste
	move.b  d2,d1
	and.b   #IEQUALIFIER_CONTROL,d1
	bne.s   CtrlTaste
	and.b   #IEQUALIFIER_LSHIFT!IEQUALIFIER_RSHIFT,d2
	bne.s   ShiftTaste
	cmp.b   #$4e,d4         ;rechts
	beq.w   rechteBank
	cmp.b   #$4f,d4         ;links
	beq.w   linkeBank
	cmp.b   #$4d,d4         ;Down
	beq.w   DownTaste
	cmp.b   #$4c,d4         ;Up
	beq.w   UpTaste
	bra.w   nocheine
VanTaste
	cmp.b   #$0d,d4
	beq.s   Auswahl
	cmp.b   #$1b,d4
	beq.w   ende
	cmp.b   #'<',d4
	beq.s   PfeilLinks
	cmp.b   #'>',d4
	beq.s   PfeilRechts
	bclr    #5,d4
	cmp.b   #'Q',d4
	beq.w   ende
	bra.w   nocheine
ShiftTaste
	cmp.b   #$4e,d4         ;rechts+shift
	beq.w   rechtsShift
	cmp.b   #$4f,d4         ;links+shift
	beq.w   linkeShift
	cmp.b   #$4d,d4         ;Down+shift
	beq.w   DownShift
	cmp.b   #$4c,d4         ;Up+shift
	beq.w   UpShift
	bra.w   nocheine
CtrlTaste
	cmp.b   #$4e,d4         ;rechts+shift
	beq.w   rechtsCtrl
	cmp.b   #$4f,d4         ;links+shift
	beq.w   linkeCtrl
	bra.w   nocheine
Auswahl
	move.l  AnGad(a5),a4
	move.l  (a4),a4
	bra.s   GadExe
PfeilLinks
	tst.w   AnPage(a5)
	beq.w   nocheine
	bra.s   PageLGAn
PfeilRechts
	moveq   #0,d0
	move.b  AnzahlPage(a5),d0
	cmp.w   AnPage(a5),d0
	beq.w   nocheine
	bra.s   PageRGAn
GadAuswertung
	lea     PageLAddr(a5),a0
	move.w  AnPage(a5),d5
	lea     (a0,d5.w),a0
	move.l  (a0),a0
	cmp.l   a0,a4
	beq.s   PageLGAn
	lea     PageRAddr(a5),a0
	move.w  AnPage(a5),d5
	lea     (a0,d5.w),a0
	move.l  (a0),a0
	cmp.l   a0,a4
	beq.s   PageRGAn
GadExe
	move.w  gg_GadgetID(a4),d6
	asl.b   #1,d6
	subq    #2,d6
	move.l  FileSpeicher(a5),a1
SucheExloop
	cmp.b   #0,(a1)+
	bne.s   SucheExloop
	dbra    d6,SucheExloop
	move.l  a1,d1
	moveq   #0,d2
	moveq   #0,d3
	move.l  DOSBase(a5),a6
	jsr     _LVOExecute(a6)
	moveq   #10,d7
	rts
;;
** MouseAuswertung PageLeft / PageRight
PageLGAn
	moveq   #-4,d5
NeueSeiteLeft
	move.l  AnGad(a5),a4
	add.w   AnPage(a5),d5
	moveq   #0,d0
	bra.w   NeueSeite
PageRGAn
	moveq   #4,d5
	bra.s   NeueSeiteLeft
UpShift
	bsr.w   NummerGad
	move.w  AnPage(a5),d5
	tst.w   d5
	beq.s   Nur1Seite
SeitenAb1Loop
	sub.w   MaxSeite(a5),d0      ;Anzahl einer Seite abziehen
	subq    #4,d5
	bne.s   SeitenAb1Loop
Nur1Seite
	move.w  d0,d1
SpalteBeLoop    
	sub.w   MaxZeile(a5),d1
	tst.w   d1
	bgt.s   SpalteBeLoop
	add.w   MaxZeile(a5),d1
	subq    #1,d1
	sub.w   d1,d0
	bra.w   DieSelbigeSeite
DownShift
	bsr.w   NummerGad
	move.w  d0,d2
	move.w  AnPage(a5),d5
	tst.w   d5
	beq.s   Nur2Seite
SeitenAb2Loop
	sub.w   MaxSeite(a5),d0      ;Anzahl einer Seite abziehen
	subq    #4,d5
	bne.s   SeitenAb2Loop
Nur2Seite
	move.w  d0,d1
	move.w  d0,d3
SpalteBe2Loop
	sub.w   MaxZeile(a5),d1
	tst.w   d1
	bgt.s   SpalteBe2Loop
	neg.w   d1
	add.w   d1,d0
	add.w   d2,d1
	cmp.w   AnzahlGADs(a5),d1
	bls.w   DieSelbigeSeite
	move.w  AnzahlGADs(a5),d0   
	sub.w   d2,d0
	add.w   d3,d0
	bra.w   DieSelbigeSeite
linkeShift
	bsr.w   NummerGad
	move.w  AnPage(a5),d5
	tst.w   d5
	beq.s   Nur3Seite
SeitenAb3Loop
	sub.w   MaxSeite(a5),d0      ;Anzahl einer Seite abziehen
	subq    #4,d5
	bne.s   SeitenAb3Loop
Nur3Seite
	sub.w   MaxZeile(a5),d0
	tst.w   d0
	bgt.s   Nur3Seite
	neg.w   d0
	move.w  MaxZeile(a5),d1
	sub.w   d0,d1
	move.w  d1,d0
	bra.w   DieSelbigeSeite
rechtsShift
	bsr.w   NummerGad
	move.w  d0,d2
	move.w  AnPage(a5),d5
	tst.w   d5
	beq.s   Nur4Seite
SeitenAb4Loop
	sub.w   MaxSeite(a5),d0      ;Anzahl einer Seite abziehen
	subq    #4,d5
	bne.s   SeitenAb4Loop
Nur4Seite
	move.w  d0,d1
SpalteBe4Loop
	sub.w   MaxZeile(a5),d1
	tst.w   d1
	bgt.s   SpalteBe4Loop
	neg.w   d1
	move.w  MaxSeite(a5),d0
	sub.w   d1,d0
	move.w  d0,d3
	bsr.s   GadNrBere
	add.w   d1,d3
	cmp.w   AnzahlGADs(a5),d3
	bls.w   DieSelbigeSeite
	move.w  AnzahlGADs(a5),d0
	sub.w   d1,d0
	bra.w   DieSelbigeSeite
GadNrBere
	move.w  AnPage(a5),d4
GadNrBere2  
	lea     GadgetPage(a5),a0
	lea     (a0,d4.w),a0
	move.l  (a0),a0
	move.l  (a0),a0
	move.w  gg_GadgetID(a0),d1
	subq    #1,d1
	rts
;;
** TastenAuswertung
rechtsCtrl
	move.l  AnGad(a5),a4
	bsr.w   NummerGad
	move.w  AnPage(a5),d5
	tst.w   d5
	beq.s   Nur7Seite
SeitenAb7Loop
	sub.w   MaxSeite(a5),d0      ;Anzahl einer Seite abziehen
	subq    #4,d5
	bne.s   SeitenAb7Loop
Nur7Seite
	move.w  AnPage(a5),d5
	cmp.b   AnzahlPage(a5),d5
	beq.s   Seite1Nun
	addq    #4,d5
PageCtrl    
	move.w  d5,d4
	bsr.s   GadNrBere2
	add.w   d0,d1
	subq    #1,d0
	cmp.w   AnzahlGADs(a5),d1
	bls.w   NeueSeite
	move.w  AnzahlGADs(a5),d0
	move.w  d5,d4
	bsr.s   GadNrBere2
	sub.w   d1,d0
	subq    #1,d0
	bra.w   NeueSeite
Seite1Nun
	moveq   #0,d5
	subq    #1,d0
	bra.w   NeueSeite
linkeCtrl
	move.l  AnGad(a5),a4
	bsr.w   NummerGad
	move.w  AnPage(a5),d5
	tst.w   d5
	beq.s   Nur8Seite
SeitenAb8Loop
	sub.w   MaxSeite(a5),d0      ;Anzahl einer Seite abziehen
	subq    #4,d5
	bne.s   SeitenAb8Loop
Nur8Seite
	move.w  AnPage(a5),d5
	tst.w   d5
	beq.s   LastPage
	subq    #4,d5
	subq    #1,d0
	bra.w   NeueSeite
LastPage
	move.b  AnzahlPage(a5),d5
	bra.s   PageCtrl    
UpTaste
	move.l  AnGad(a5),a4
	move.w  AnPage(a5),d5
	lea     GadgetPage(a5),a3
	lea     (a3,d5.w),a3
	move.l  (a3),a3
	cmp.l   a3,a4
	beq.w   DownShift
	lea     -4(a4),a3
	bra.s   GadAnwaehlen
DownTaste
	move.l  AnGad(a5),a4
	move.w  AnPage(a5),d5
	lea     4(a4),a3
	cmp.l   #0,(a3)
	beq.w   UpShift
GadAnwaehlen
	move.l  (a4),a4
	moveq   #0,d6
	bsr.w   SelGK
	moveq   #1,d6
	move.l  (a3),a4
	bsr.w   SelGK
	move.l  (a3),a3
	bsr.w   GetGAddr
	bra.w   nocheine
rechteBank
	bsr.s   NummerGad            ;GadgetIDNummer ermitteln
	move.w  d0,d2                ;-->d2 zu Sicherung
	add.w   MaxZeile(a5),d0      ;+ Anzahl in einer Spalte
	cmp.w   AnzahlGADs(a5),d0    ;vergleiche mit Max. Gadgetsanzahl
	bls.s   rechtsOK             ;kleiner o. gleich dieser
	move.w  AnzahlGADs(a5),d0    ;ansonsten letzte Gadget
rechtsOK
	move.w  AnPage(a5),d5        ;Momentanige Seite
	tst.w   d5                   ;Seite 0 ?
	beq.s   SeiteNrEinge         ;ja
SeitenAbzugLoop
	sub.w   MaxSeite(a5),d0      ;Anzahl einer Seite abziehen
	subq    #4,d5
	bne.s   SeitenAbzugLoop
SeiteNrEinge
	cmp.w   MaxSeite(a5),d0      ;vergleiche mit Max einer Seite
	bls.s   DieSelbigeSeite      ;kleiner o. gleich
	move.w  AnPage(a5),d5
	addq    #4,d5                ;Seite erhöhen
	sub.w   MaxSeite(a5),d0      ;Index von der Neuen Seite bestimmen
	subq    #1,d0                ;Indexkorrektur
	bra.s   NeueSeite
DieSelbigeSeite
	subq    #1,d0
	add.w   d0,d0                ;*4
	add.w   d0,d0
	move.w  AnPage(a5),d5
	lea     GadgetPage(a5),a3
	lea     (a3,d5.w),a3
	move.l  (a3),a3
	lea     (a3,d0.w),a3
	bra.w   GadAnwaehlen
NummerGad
	move.l  AnGad(a5),a4
	move.l  (a4),a3
	move.w  gg_GadgetID(a3),d0
	rts
linkeBank
	bsr.s   NummerGad
	move.w  d0,d2
	sub.w   MaxZeile(a5),d2
	tst.w   d2
	bgt.s   linksOk
	moveq   #1,d2
	move.w  MaxZeile(a5),d0
	add.w   #1,d0
linksOk
	move.w  AnPage(a5),d5        ;Momentanige Seite
	tst.w   d5                   ;Seite 0 ?
	beq.s   SeiteNr2Einge         ;ja
Seiten2AbzugLoop
	sub.w   MaxSeite(a5),d0 
	subq    #4,d5                
	bne.s   Seiten2AbzugLoop
SeiteNr2Einge
	sub.w   MaxZeile(a5),d0      ;- Anzahl in einer Spalte (links)
	tst.w   d0                   ;vergleiche mit Max einer Seite
	bgt.s   DieSelbigeSeite      ;kleiner o. gleich
	move.w  AnPage(a5),d5
	subq    #4,d5
	add.w   MaxSeite(a5),d0      ;Index von der Neuen Seite bestimmen
	subq    #1,d0
NeueSeite
* d0 = Neues Angewähltes GadgetNr. relative zum Anfang
* d5 = Neue SeitenNummer
* a4 = Alte GadgetAddr
	cmp.b   #36,d5
	bgt.w   nocheine
	move.w  d0,d7
	move.l  (a4),a4
	moveq   #0,d6
	bsr.w   SelGK
	bsr.w   ReGadList
	move.w  d5,AnPage(a5)
	bsr.w   AddGadList
	add.w   d7,d7                ;*4
	add.w   d7,d7
	lea     GadgetPage(a5),a3
	lea     (a3,d5.w),a3
	move.l  (a3),a3
	lea     (a3,d7.w),a3
	moveq   #0,d7
	moveq   #1,d6
	move.l  (a3),a4
	bsr.w   SelGK
	move.l  (a3),a3
	bsr.w   GetGAddr
	bra.w   nocheine
GetGAddr
* a3 = Neue GadgetAddr
	lea     GadgetPage(a5),a4
	lea     (a4,d5.w),a4
	move.l  (a4),a4
FindeGAdd
	cmp.l   (a4)+,a3
	bne.s   FindeGAdd
	lea     -4(a4),a4
	move.l  a4,AnGad(a5)
	rts
Fenster2Error
	rts
;;
**SelGK Selektiert Gadget also ein oder aus
SelGK
	bsr.b   RemoveGSuche
	tst.l   d6
	beq.s   DisSel
	or.w    #GFLG_SELECTED,gg_Flags(a4)
	bra.s   NunSel
DisSel
	eor.w   #GFLG_SELECTED,gg_Flags(a4)
NunSel
	bsr.b   AddGSuche
	rts
RemoveGSuche
	move.l  WindowHandle(a5),a0
	move.l  a4,a1
	move.l  INTUIBase(a5),a6
	jsr     _LVORemoveGadget(a6)
	rts
AddGSuche
	move.l  WindowHandle(a5),a0
	move.l  a4,a1
	moveq   #-1,d0
	jsr     _LVOAddGadget(a6)
	move.l  a4,a0
	move.l  WindowHandle(a5),a1
	suba.l  a2,a2
	jsr     _LVORefreshGadgets(a6)
	rts
ReGadList
	move.l  WindowHandle(a5),a0
	lea     GadgetListe(a5),a1
	move.w  AnPage(a5),d4
	lea     (a1,d4.w),a1
	move.l  (a1),a1
	moveq   #-1,d0
	move.l  INTUIBase(a5),a6
	jsr     _LVORemoveGList(a6)
	move.l  WinRPort(a5),a1
	moveq   #0,d0
	move.l  GFXBase(a5),a6
	jsr     _LVOSetAPen(a6)
	move.l  WinRPort(a5),a1
	moveq   #2,d0
	moveq   #2,d1
	add.b   RelativeLeftC(a5),d0
	add.b   RelativeTopC(a5),d1
	move.w  BreiteGPos(a5),d2
	move.w  HoeheWin(a5),d3
	add.w   #20,d3
	jsr     _LVORectFill(a6)
	rts
AddGadList
	move.l  WindowHandle(a5),a0
	lea     GadgetListe(a5),a3
	lea     (a3,d5.w),a3
	move.l  (a3),a1
	moveq   #2,d0
	moveq   #-1,d1
	suba.l  a2,a2
	move.l  INTUIBase(a5),a6
	jsr     _LVOAddGList(a6)
	move.l  (a3),a0
	move.l  WindowHandle(a5),a1
	suba.l  a2,a2
	moveq   #-1,d0
	jsr     _LVORefreshGList(a6)
	bsr.s   RefreshWin
	rts
;;
** Refresh Fenster
RefreshWin
	move.l  GADBase(a5),a6
	move.l  WindowHandle(a5),a0
	suba.l  a1,a1
	jsr     _LVOGT_RefreshWindow(a6)
	move.l  WindowHandle(a5),a0
	jsr     _LVOGT_BeginRefresh(a6)
	move.l  WindowHandle(a5),a0
	moveq   #DOSTRUE,d0
	jsr     _LVOGT_EndRefresh(a6)
	rts 
;;
** Fenster Öffnen
FensterOeffne
	move.l  INTUIBase(a5),a6
	lea     Fenster_Tags(pc),a1
	move.l  GadgetListe(a5),12(a1)
	move.l  ScreenHandle(a5),60(a1)
	lea     WindowTitle(pc),a0
	move.l  a0,4(a1)
	lea     ScreenTitle(pc),a0
	move.l  a0,20(a1)
	move.w  BreiteGPos(a5),d0
	add.w   #20,d0
	move.w  d0,30(a1)
	sub.w   SCBreite(a5),d0
	neg.w   d0
	asr.w   #1,d0
	move.w  d0,54(a1)
	move.w  HoeheWin(a5),d4
	add.w   #30,d4
	move.w  d4,38(a1)
	move.w  SCHoehe(a5),d0
	add.w   #50,d0
	sub.w   d4,d0
	asr.w   #1,d0
	move.w  d0,46(a1)
	suba.l  a0,a0
	jsr     _LVOOpenWindowTagList(a6)
	move.l  d0,WindowHandle(a5)
	beq.b   ErrorWindow
	move.l  d0,a0
	move.l  wd_RPort(a0),WinRPort(a5)
	move.l  4.w,a6
	suba.l  a1,a1
	jsr     _LVOFindTask(a6)
	move.l  d0,meinTask(a5)
	beq.s   ErrorTask
	move.l  d0,a0
	move.l  pr_WindowPtr(a0),alterTask(a5)
	move.l  WindowHandle(a5),pr_WindowPtr(a0)
	rts
ErrorTask
	bsr.s   keinTask
ErrorWindow
	moveq   #26,d7           ;26 = konnte Fenster nicht öffnen oder Task nicht finden
	rts
FensterSchliesse
	move.l  meinTask(a5),a0
	move.l  alterTask(a5),pr_WindowPtr(a0)
keinTask
	move.l  INTUIBase(a5),a6
	move.l  WindowHandle(a5),a0
	jsr     _LVOCloseWindow(a6)
	rts 
;;
** Init Gadgets
InitGadget
	move.l  ScreenHandle(a5),a0
	move.l  sc_Font(a0),a1
	move.w  ta_YSize(a1),d2
	add.b   sc_WBorTop(a0),d2
	addq    #1,d2
	move.b  d2,RelativeTopC(a5)
	move.b  sc_WBorTop(a0),RelativeLeftC(a5)
	move.l  FileSpeicher(a5),a1
	move.l  Filegroesse(a5),d0
	move.l  a1,a2
	add.l   d0,a2
	moveq   #0,d0
	moveq   #0,d1
	moveq   #0,d2
	moveq   #0,d3
Suchenloop
	addq    #1,d1             ;länge GadgetName aus der Prefs
	move.b  (a1)+,d4          ;Prefs daten nach d4
einReturn
	cmp.b   #10,d4            ;schon ein Return ?
	bne.s   keinReturn
	move.b  #0,-1(a1)         ;das Return mit NullByte abschliessen
	tst.b   d3                ;d3 0/1 entweder Gadgetname oder Programm bzw. Batchdatei
	beq.s   BreiteZaehlen
	moveq   #0,d3
	bra.s   wortkleiner
BreiteZaehlen
	moveq   #1,d3   
	addq    #1,d0             ;d0=Anzahl der Gadgets
	cmp.b   d2,d1             ;d2 enthält den längsten Gadgetnamen
	bls.s   wortkleiner
	move.b  d1,d2             ;neue länge war größer als alte
wortkleiner
	moveq   #0,d1
keinReturn
	cmp.l   a1,a2             ;a2=a1 dann PrefsEnde
	bne.s   Suchenloop
PrefsEnde
	tst.w   d0
	beq.w   PrefsNull
	cmp.w   #2560,d0
	bls.s   GadZahlOK
	moveq   #33,d7
	rts
GadZahlOK
	move.w  d0,AnzahlGADs(a5)
	asl.w   #3,d2
	add.w   #10,d2
	move.w  d2,BreiteGADs(a5)
	sub.w   #20,SCBreite(a5)
	sub.w   #50,SCHoehe(a5)
	lea     UniGad(pc),a1
	move.b  RelativeTopC(a5),d4
	move.b  RelativeLeftC(a5),d5
	add.b   d4,gng_TopEdge+1(a1)
	add.b   d5,gng_LeftEdge+1(a1)
	move.w  BreiteGADs(a5),gng_Width(a1)
	move.l  VisualInfo(a5),gng_VisualInfo(a1)
	move.l  FontAddr(a5),gng_TextAttr(a1)
	move.l  (a1),GadUniLang(a5)
	lea     PageGads(pc),a1
	add.b   d4,gng_TopEdge+1(a1)
	add.b   d5,gng_LeftEdge+1(a1)
	move.l  VisualInfo(a5),gng_VisualInfo(a1)
	move.l  FontAddr(a5),gng_TextAttr(a1)
	lea     PageLeftTxt(pc),a2
	move.l  a2,gng_GadgetText(a1)
	lea     Page2Gads(pc),a1
	add.b   d4,gng_TopEdge+1(a1)
	add.b   d5,gng_LeftEdge+1(a1)
	move.l  VisualInfo(a5),gng_VisualInfo(a1)
	move.l  FontAddr(a5),gng_TextAttr(a1)
	lea     PageRightTxt(pc),a2
	move.l  a2,gng_GadgetText(a1)
	move.l  FileSpeicher(a5),a4
	moveq   #0,d5
	moveq   #0,d6
	move.w  AnzahlGADs(a5),d6
	subq    #1,d6
	lea     GadgetAddr(a5),a3
AlleSeiten
	move.w  BreiteGADs(a5),BreiteGPos(a5)
	add.w   #20,BreiteGPos(a5)
	lea     GadgetPage(a5),a1
	lea     (a1,d5.w),a1
	move.l  a3,(a1)
	lea     GadgetListe(a5),a0
	lea     (a0,d5.w),a0
	bsr.s   PageGad
	tst.w   MaxSeite(a5)
	bne.s   MaxSErmittelt
	bsr.s   MaxZaehlen
	move.w  d1,MaxSeite(a5)
MaxSErmittelt
	tst.b   PageJa(a5)
	beq.s   SeitenEnde
	move.l  #0,(a3)+
	lea     UniGad(pc),a1
	move.l  GadUniLang(a5),(a1) 
	clr.b   PageJa(a5)
	move.b  #1,ZweitePage(a5)
	addq    #4,d5
	cmp.b   #37,d5
	bgt.s   SeitenVorEnde
	bra.s   AlleSeiten
SeitenVorEnde
	subq    #4,d5
SeitenEnde  
	move.b  d5,AnzahlPage(a5)
	rts
MaxZaehlen
	move.w  AnzahlGADs(a5),d1
	sub.w   d6,d1
	subq    #1,d1
	rts
;;
**PageGad
* a0 = GadgetListe 0-9
* a3 = GadgetAddr
* a4 = Prefs-Namen (Gadget bzw. Execute)
* a5 = Interne Structur
* a6 = LibBase
* d4 = Relative Oben
* d5 = Anzahl der Seiten *4
* d6 = Anzahl der Gadgets
PageGad
	move.l  GADBase(a5),a6
	jsr     _LVOCreateContext(a6)
	move.l  d0,a0
	beq.w   ErrorGadget
InitGadloop
	moveq   #BUTTON_KIND,d0
	lea     UniGad(pc),a1
	move.w  SCHoehe(a5),d1
	move.w  gng_TopEdge(a1),d2
	cmp.w   d1,d2
	bge.w   GadgetCorritur
GadgetCoOK  
	move.l  a4,gng_GadgetText(a1)
	bsr.w   Return2Find
	add.w   #10,gng_TopEdge(a1)
	add.w   #1,gng_GadgetID(a1)
	suba.l  a2,a2
	jsr     _LVOCreateGadgetA(a6)
	move.l  d0,(a3)+
	beq.w   ErrorGadget
	move.l  d0,a0
	dbra    d6,InitGadloop
PageGadEnde
	moveq   #BUTTON_KIND,d0
	lea     PageGads(pc),a1
	tst.b   ZweitePage(a5)
	beq.s   kein1Seite
	lea     PaGadTags2(pc),a2
	bra.s   doch1Seite
kein1Seite
	lea     PaGadTags(pc),a2
doch1Seite
	jsr     _LVOCreateGadgetA(a6)
	move.l  d0,a0
	beq.w   ErrorGadget
	lea     PageLAddr(a5),a1
	lea     (a1,d5.w),a1
	move.l  d0,(a1)
	moveq   #BUTTON_KIND,d0
	lea     Page2Gads(pc),a1
	tst.b   PageJa(a5)
	beq.s   kein2Seite
	cmp.b   #36,d5
	beq.s   kein2Seite
	lea     PaGadTags2(pc),a2
	bra.s   doch2Seite
kein2Seite
	lea     PaGadTags(pc),a2
doch2Seite
	jsr     _LVOCreateGadgetA(a6)
	move.l  d0,a0
	beq.s   ErrorGadget
	lea     PageRAddr(a5),a1
	lea     (a1,d5.w),a1
	move.l  d0,(a1)
	tst.w   HoeheWin(a5)
	bne.s   HoeheWindowbe
	lea     UniGad(pc),a1
	move.w  gng_TopEdge(a1),HoeheWin(a5)
	bsr.w   MaxZaehlen
	move.w  d1,MaxZeile(a5)
HoeheWindowbe       
	rts
GadgetCorritur
	move.w  SCHoehe(a5),HoeheWin(a5)
	tst.w   MaxZeile(a5)
	bne.s   MaxZErmittelt
	bsr.w   MaxZaehlen
	move.w  d1,MaxZeile(a5)
MaxZErmittelt   
	move.w  #20,gng_TopEdge(a1)
	add.b   d4,gng_TopEdge+1(a1)
	move.w  BreiteGADs(a5),d3
	move.w  #20,d2
	add.w   BreiteGPos(a5),d2
	add.w   d2,d3
	move.w  SCBreite(a5),d1
	cmp.w   d1,d3
	bge.w   GadgetVorEnde
	move.w  d2,gng_LeftEdge(a1)
	move.w  d3,BreiteGPos(a5)
	move.w  SCHoehe(a5),HoeheWin(a5)      
	bra.w   GadgetCoOK                      
GadgetVorEnde
	move.b  #1,PageJa(a5)
	bra.w   PageGadEnde
;;
** ErrorGadget
ErrorGadget
	bsr.s   RemoveGadget
	moveq   #25,d7           ;25 = Gadget init Fehler
	rts
RemoveGadget
	move.l  GADBase(a5),a6
	moveq   #0,d5
	move.b  AnzahlPage(a5),d5
GadListeFLoop   
	lea     GadgetListe(a5),a0
	lea     (a0,d5.w),a0
	move.l  (a0),a0
	move.l  GadgetListe(a5),a1
	jsr     _LVOFreeGadgets(a6)
	subq    #4,d5
	bpl.s   GadListeFLoop
	rts 
Return2Find
	cmp.b   #0,(a4)+
	bne.s   Return2Find
Return1Mal
	cmp.b   #0,(a4)+
	bne.s   Return1Mal
	rts
PrefsNull
	moveq   #27,d7           ;27 = Prefs sind Null
	rts
;;
** Speicher freigeben von den Einstellungen
SpeicherPrefs
	move.l  FileSpeicher(a5),a1
	move.l  Filegroesse(a5),d0
	move.l  4.w,a6
	jsr     _LVOFreeMem(a6)
	rts
;;
** Lade Einstellungen
LadePrefs
	lea     PrefsFile1(pc),a3
	move.l  a3,d1
	move.l  #MODE_OLDFILE,d2
	move.l  DOSBase(a5),a6
	jsr     _LVOOpen(a6)
	move.l  d0,PrefsFileHandle(a5)
	bne.s   OpenPrefsFile
	lea     PrefsFileName(pc),a3
	move.l  a3,d1
	move.l  #MODE_OLDFILE,d2
	jsr     _LVOOpen(a6)
	move.l  d0,PrefsFileHandle(a5)
	beq.s   OpenFileError
OpenPrefsFile
	move.l  d0,d1
	lea     FIB(a5),a3
	move.l  a3,d2
	jsr     _LVOExamineFH(a6)
	move.l  fib_Size(a3),Filegroesse(a5)
	move.l  Filegroesse(a5),d0
	cmp.l   #1,d0
	beq.s   nixPrefs
	tst.l   d0
	beq.s   nixPrefs
	move.l  #MEMF_PUBLIC!MEMF_CLEAR,d1
	move.l  4.w,a6
	jsr     _LVOAllocMem(a6)
	move.l  d0,FileSpeicher(a5)
	beq.s   ErrorFiSp
	move.l  PrefsFileHandle(a5),d1
	move.l  d0,d2
	move.l  Filegroesse(a5),d3
	move.l  DOSBase(a5),a6
	jsr     _LVORead(a6)
SchliesseFile
	move.l  PrefsFileHandle(a5),d1
	jsr     _LVOClose(a6)
	rts
ErrorFiSp
	moveq   #28,d7           ;28 = kein Speicher für Prefs
	bra.s   SchliesseFile
OpenFileError
	moveq   #24,d7           ;24 = konnte File BangerMenu.prefs nicht öffnen
	rts
nixPrefs
	moveq   #27,d7           ;27 = Prefs vorhanden aber leer
	bra.s   SchliesseFile
;;
** Library Öffnen + Schliessen
LibOeffne
	move.l  a5,a4
	lea     intname(pc),a1
	bsr.s   OeffneLib
	lea     dosname(pc),a1
	bsr.s   OeffneLib
	lea     gadname(pc),a1
	bsr.s   OeffneLib
	lea     gfxname(pc),a1
	bsr.s   OeffneLib
	rts
OeffneLib
	moveq   #37,d0
	jsr     _LVOOpenLibrary(a6)
	move.l  d0,(a4)+
	beq.s   LibError
	rts
LibError
	moveq   #22,d7                   ;22 = konnte Library nicht öffnen
	rts
LibSchliesse
	move.l  4.w,a6
	moveq   #4-1,d2
	lea     WindowHandle(a5),a4
SchliesseLib
	move.l  -(a4),a1
	cmp.l   #0,a1
	beq.s   notOpened
	jsr     _LVOCloseLibrary(a6)
notOpened
	dbra    d2,SchliesseLib
	rts
;;
** PubScreenOeffne
PubScreenOeffne
	tst.l   MonitorKey(a5)
	beq.s   StdPal
	tst.l   MoniID(a5)
	bne.s   IDistDa
	moveq   #32,d7
	rts
IDistDa
	move.l  MonitorKey(a5),d1
	moveq   #0,d2
	moveq   #0,d3
	move.l  DOSBase(a5),a6
	jsr     _LVOExecute(a6)
	tst.l   d0
	bne.s   NeuenMonitor
	moveq   #34,d7
	rts
NeuenMonitor
	move.l  MoniID(a5),a4
	move.l  (a4),d0
	move.l  GFXBase(a5),a6
	jsr     _LVOFindDisplayInfo(a6)
	tst.l   d0
	bne.s   MonitorDa
	moveq   #35,d7
	rts
MonitorDa
	move.l  4.w,a6
keinSignal
	moveq   #-1,d0
	jsr     _LVOAllocSignal(a6)
	move.b  d0,ScreenSignal(a5)
	bmi.b   keinSignal
	lea     MyScreenTags(pc),a1
	lea     PubScTitle(pc),a0
	move.l  a0,4(a1)
	move.l  MoniID(a5),a4
	move.l  (a4),12(a1)
	moveq   #0,d0
	move.b  ScreenSignal(a5),d0
	move.l  d0,20(a1)
	lea     PenArray(pc),a0
	move.l  a0,28(a1)
	suba.l  a0,a0
	move.l  INTUIBase(a5),a6
	jsr     _LVOOpenScreenTagList(a6)
	move.l  d0,ScreenHandle(a5)
	bne.s   Pubvorgucken
	moveq   #36,d7
	rts
Pubvorgucken
	move.l  d0,a0
	moveq   #0,d0
	jsr     _LVOPubScreenStatus(a6)
	move.w  d0,d1
	beq.w   keinPubScreen
	lea     PubScTitle(pc),a0
	bra.s   Pubgucken
StdPal
	suba.l  a0,a0
Pubgucken
	move.l  INTUIBase(a5),a6
	jsr     _LVOLockPubScreen(a6)
	tst.l   d0
	beq.s   keinPubScreen
	move.l  d0,ScreenHandle(a5)
	move.l  d0,a0
	move.w  sc_Height(a0),SCHoehe(a5)
	move.w  sc_Width(a0),SCBreite(a5)
	suba.l  a1,a1
	move.l  GADBase(a5),a6
	jsr     _LVOGetVisualInfoA(a6)
	move.l  d0,VisualInfo(a5)
	bne.s   VisualOK
keinPubScreen
	moveq   #23,d7
VisualOK
	rts
ScreenSchliesse
	move.l  GADBase(a5),a6
	move.l  VisualInfo(a5),a0
	jsr     _LVOFreeVisualInfo(a6)
ScrSchliesse
	move.l  INTUIBase(a5),a6
	suba.l  a0,a0
	move.l  ScreenHandle(a5),a1
	jsr     _LVOUnlockPubScreen(a6)
	cmp.b   #10,d7
	beq.s   ScreenBleibt
	move.l  ScreenHandle(a5),a0
	jsr     _LVOCloseScreen(a6)
ScreenBleibt
	rts
;;
** LONG Daten
Fenster_Tags
		dc.l    WA_Title,0
		dc.l    WA_Gadgets,0
		dc.l    WA_ScreenTitle,0
		dc.l    WA_Width,0
		dc.l    WA_Height,0
		dc.l    WA_Top,11
		dc.l    WA_Left,0
		dc.l    WA_PubScreen,0
		dc.l    WA_IDCMP,IDCMP1!IDCMP2
		dc.l    WA_Flags,W_Flags1!W_Flags2
		dc.l    WA_NewLookMenus,-1
		dc.l    WA_AutoAdjust,-1
		dc.l    TAG_DONE
W_Flags1        equ     WFLG_ACTIVATE!WFLG_SMART_REFRESH
W_Flags2        equ     WFLG_DRAGBAR!WFLG_DEPTHGADGET!WFLG_CLOSEGADGET
IDCMP1          equ     BUTTONIDCMP!RAWKEY
IDCMP2          equ     IDCMP_CLOSEWINDOW!IDCMP_VANILLAKEY!IDCMP_REFRESHWINDOW
MyScreenTags
		dc.l    SA_PubName,0
		dc.l    SA_DisplayID,0
		dc.l    SA_PubSig,0
		dc.l    SA_Pens,0
		dc.l    SA_Type,WBENCHSCREEN
		dc.l    SA_Width,STDSCREENWIDTH
		dc.l    SA_Height,STDSCREENHEIGHT
		dc.l    SA_Depth,2
		dc.l    SA_SysFont,1
		dc.l    SA_Overscan,OSCAN_TEXT
		dc.l    TAG_DONE
UniGad
		dc.w    20,20,0,10
		dc.l    0,0
		dc.w    0
		dc.l    PLACETEXT_IN,0,0 
PageGads
		dc.w    20,5,28,17
		dc.l    0,0
		dc.w    10000
		dc.l    PLACETEXT_IN,0,0
Page2Gads
		dc.w    55,5,28,17
		dc.l    0,0
		dc.w    10001
		dc.l    PLACETEXT_IN,0,0
PaGadTags
		dc.l    GA_Disabled,1
PaGadTags2
		dc.l    GT_Underscore,'_'
		dc.l    TAG_DONE
topaz8:
		dc.l    0
		dc.w    8
		dc.b    0,1
PenArray
		dc.w    -1
;;
** BYTE Daten
ParaTemplate    dc.b 'MONITORTREIBER,MONITORID/K/N,NOKEY/S',0
intname         INTUITIONNAME
dosname         DOSNAME
gadname         GADTOOLSNAME
gfxname         GRAFNAME
PubScTitle      dc.b    'Workbench Screen',0
PageLeftTxt     dc.b    '_<',0
PageRightTxt    dc.b    '_>',0
inputname       dc.b    'input.device',0
PrefsFileName   dc.b    'S:'
PrefsFile1      dc.b    'BangerMenu.prefs',0
topazFName8     dc.b    'topaz.font',0
WindowTitle     dc.b    'BangerMenu',0
				dc.b    '$VER: '
ScreenTitle     dc.b    'BangerMenu 2.01 (15-Dec-95) © BY Andre´ Trettin',0
;;
