;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 3.05 (19-Feb-96)

** INCLUDE Struktur Variablen
* Fehler Codes: 21=kein Speicher
*               22=konnte Library (oder Libraries) nicht öffnen
*               23=GetVisualInfo Fehler
*               24=konnte File S:BangerMenu.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
*               37=Fehler im Einstellungsfile
*               38=Menu Fehler
*               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 BangerMenu,0
	APTR    BaM_MenuTitleText
	APTR    BaM_MenuKey
	STRUCT  BaM_SpaltenTitleText,[50*4]
	STRUCT  BaM_SpaltenLaenge,[50]
	STRUCT  BaM_GadgetLaenge,[50]
	BYTE    BaM_SpaltenAnzahl
	BYTE    BaM_SeitenAnzahl
	WORD    BaM_GadgetAnzahl
	LABEL   BaM_SIZEOF

	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
	APTR    MenuPtr
	APTR    PrintMarkTab
	STRUCT  FIB,[fib_SIZEOF]
	STRUCT  TastenIBlock,[IO_SIZE]
	STRUCT  MenuData,[BaM_SIZEOF*50]
	STRUCT  PrintData,[it_SIZEOF*20]
	STRUCT  VirtualMenu,[gnm_SIZEOF*55]
	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
	STRUCT  PrintPage,[11*4]        ;PrintIText Addr
	LONG    Filegroesse
	LONG    GadUniLang
	WORD    HoeheWin
	WORD    BreiteWin
	WORD    AlteHoeheWin
	WORD    AlteBreiteWin
	WORD    CAPS
	WORD    SCHoehe
	WORD    SCBreite
	WORD    AnzahlGADs
	WORD    MaxZeile
	WORD    MaxSeite
	WORD    AnPage
	WORD    MaxSpaltenZahl
	BYTE    JetztigeSeite
	BYTE    LetzteSPLaenge
	BYTE    ErsteSPLaenge
	BYTE    VorigeSeitenLaenge
	BYTE    VorigeSPSeiten
	BYTE    NaechsteSPSeiten
	BYTE    VorigeSPLaenge
	BYTE    RelativeGDPos
	BYTE    JetztigeSPLaenge
	BYTE    NaechsteSPLaenge
	BYTE    TextUOFlag
	BYTE    SpalteOhneTitle
	BYTE    MenuEintragAnzahl
	BYTE    ZweitePage
	BYTE    ScreenSignal
	BYTE    RelativeTopC
	BYTE    RelativeLeftC
	BYTE    MenuAnGe
	BYTE    AnzahlPage
	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.w   Ende
LibraryO
	bsr.w   InitRelative
	bsr.w   LibOeffne
	tst.w   d7
	bne.w   SchliesseLibrary
	bsr.w   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   WertePrefsAus
	tst.w   d7
	bne.s   FreiSPrefs
	bsr.w   InitMenu
	tst.b   d7
	bne.s   MenuRemove
	bsr.w   InitGadget
	tst.w   d7
	bne.s   MenuRemove
	bsr.w   FensterOeffne
	tst.w   d7
	bne.s   RemGad
	bsr.w   SetAndLayout
	tst.b   d7
	bne.s   SchliesseFenster
	move.w  #0,d5
	bsr.w   PrintIUnter
	bsr.w   GadAktivieren
	bsr.w   RefreshWin
	bsr.w   MessageAbFragen
	bsr.w   ClearMenu
SchliesseFenster
	bsr.w   FensterSchliesse
RemGad
	bsr.w   RemoveGadget
MenuRemove
	bsr.w   RemoveMenu
FreiSPrefs
	bsr.w   SpeicherPrefs
SchliesseScreen
	bsr.w   ScreenSchliesse
ParameterFree
	bsr.w   FreePara
SchliesseLibrary
	bsr.w   LibSchliesse
	move.l  a5,a1
	move.l  #Int_SIZEOF,d0
	jsr     _LVOFreeMem(a6)
Ende
	move.l  d7,d0
ende
	rts
;;
** InitMenu
InitMenu
	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.l  VisualInfo(a5),gng_VisualInfo(a1)
	move.l  FontAddr(a5),gng_TextAttr(a1)
	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)
	lea     VirtualMenu(a5),a0
	move.b  #NM_TITLE,gnm_Type(a0)
	lea     ProjektName(pc),a1
	move.l  a1,gnm_Label(a0)
	lea     gnm_SIZEOF(a0),a0
	move.b  #NM_ITEM,gnm_Type(a0)
	lea     InfoName(pc),a1
	move.l  a1,gnm_Label(a0)
	lea     InfoTaste(pc),a1
	move.l  a1,gnm_CommKey(a0)
	lea     gnm_SIZEOF(a0),a0
	move.b  #NM_ITEM,gnm_Type(a0)
	lea     QuitName(pc),a1
	move.l  a1,gnm_Label(a0)
	lea     QuitTaste(pc),a1
	move.l  a1,gnm_CommKey(a0)
	move.b  MenuEintragAnzahl(a5),d0
	tst.b   d0
	beq.s   keinGrossesMenu
	lea     gnm_SIZEOF(a0),a0
	move.b  #NM_TITLE,gnm_Type(a0)
	lea     WindowTitle(pc),a1
	move.l  a1,gnm_Label(a0)
	subq    #1,d0
	lea     MenuData(a5),a1
MenuInitLoop
	lea     gnm_SIZEOF(a0),a0
	move.b  #NM_ITEM,gnm_Type(a0)
	move.l  BaM_MenuTitleText(a1),gnm_Label(a0)
	move.l  BaM_MenuKey(a1),gnm_CommKey(a0)
	lea     BaM_SIZEOF(a1),a1
	dbra    d0,MenuInitLoop
keinGrossesMenu
	move.l  GADBase(a5),a6
	lea     VirtualMenu(a5),a0
	lea     MenuTags(pc),a1
	jsr     _LVOCreateMenusA(a6)
	move.l  d0,MenuPtr(a5)
	beq.s   MenuError
	move.l  d0,a0
	move.l  VisualInfo(a5),a1
	suba.l  a2,a2
	jsr     _LVOLayoutMenusA(a6)
	move.l  d0,d1
	bne.s   MenuOK
MenuError
	moveq   #38,d7
MenuOK
	rts
RemoveMenu
	move.l  GADBase(a5),a6
	move.l  MenuPtr(a5),a0
	jsr     _LVOFreeMenus(a6)
	rts
;;
** SetAndLayout ClearMenu PrintIUnter
SetAndLayout
	move.l  INTUIBase(a5),a6
	move.l  WindowHandle(a5),a0
	move.l  MenuPtr(a5),a1
	jsr     _LVOSetMenuStrip(a6)
	move.l  d0,d1
	bne.s   SetLayOK
	moveq   #38,d7
SetLayOK
	rts
ClearMenu
	move.l  INTUIBase(a5),a6
	move.l  WindowHandle(a5),a0
	jsr     _LVOClearMenuStrip(a6)
	rts
PrintIUnter
	lea     PrintPage(a5),a1
	lea     (a1,d5.w),a1
	move.l  (a1),a1
	lea     it_SIZEOF(a1),a1
	move.l  WinRPort(a5),a0
	moveq   #0,d0
	moveq   #0,d1
	move.b  RelativeTopC(a5),d1
	move.b  RelativeLeftC(a5),d0
	move.l  INTUIBase(a5),a6
	jsr     _LVOPrintIText(a6)
	rts
;;
** WertePrefsAus
WertePrefsAus
	move.w  SCHoehe(a5),d0
	sub.w   #20,d0
	moveq   #10,d1
	divu.w  d1,d0
	move.w  d0,MaxSpaltenZahl(a5)
	move.l  FileSpeicher(a5),a1     ;PrefsFile anfang
	move.l  Filegroesse(a5),d0
	move.l  a1,a2
	lea     1(a1),a1                ;erstes Zeichen ein Return !
	add.l   d0,a2                   ;PrefsFile Ende
MenuDochNoch
	cmp.l   #'MENU',(a1)
	beq.s   MenuEintrag
keinMenuReturn
	cmp.b   #10,(a1)+
	bne.s   keinMenuReturn
	cmp.l   a1,a2
	bne.s   MenuDochNoch
	lea     MenuData(a5),a3
	move.l  FileSpeicher(a5),a1
	lea     1(a1),a1                ;erstes Zeichen ein Return !
	bra.w   UnterMenuGefunden
MenuEintrag
	lea     MenuData(a5),a3
	moveq   #0,d0
EintragMenuSLoop
	cmp.b   #10,(a1)+
	bne.s   EintragMenuSLoop
EintragMenu2Loop
	move.b  #0,-1(a1)
	cmp.l   #'ENDM',(a1)
	beq.s   AlleMenuEintrage
	cmp.l   a1,a2
	beq.w   PrefsWerteError
	lea     1(a1),a1
	move.l  a1,(a3)
weiterSuchenMKey
	move.b  (a1)+,d1
	cmp.l   #'MKEY',(a1)
	beq.s   TasteFuerMenu
	cmp.b   #10,d1
	bne.s   weiterSuchenMKey
MKeyGefunden    
	lea     BaM_SIZEOF(a3),a3
	addq    #1,d0
	cmp.b   #50,d0
	beq.s   AlleMenuEintrage
	bra.s   EintragMenu2Loop
TasteFuerMenu
	move.b  #0,-1(a1)
	lea     5(a1),a1
	move.l  a1,BaM_MenuKey(a3)
EintragMenu3Loop    
	cmp.b   #10,(a1)+
	bne.s   EintragMenu3Loop
	bra.s   MKeyGefunden
AlleMenuEintrage
	move.b  d0,MenuEintragAnzahl(a5)
	lea     MenuData(a5),a3
NaechstesUnterM 
	move.l  BaM_MenuTitleText(a3),a0
	move.l  FileSpeicher(a5),a1
	lea     1(a1),a1                ;erstes Zeichen ein Return !
	move.b  (a0),d0
TestUnterMenuLoop
	cmp.b   (a1),d0
	beq.s   MenuBezeich
keinMenuBezReturn
	cmp.b   #10,(a1)+
	bne.s   keinMenuBezReturn
	cmp.l   a1,a2
	bne.s   TestUnterMenuLoop
	bra.w   PrefsWerteError
MenuBezeich
	move.l  a0,a4
MenuBezeichLoop
	move.b  (a0)+,d1
	tst.b   d1
	beq.s   UnterErstGefunden
	cmp.b   (a1)+,d1
	beq.s   MenuBezeichLoop
	move.l  a4,a0
	bra.s   keinMenuBezReturn
UnterErstGefunden   
	move.b  #0,(a1)+
UnterMenuGefunden
	moveq   #0,d5
	moveq   #0,d4
UnterMenu2Loop
	moveq   #0,d0
	moveq   #0,d2
	moveq   #0,d3
UnterMenuLoop
	moveq   #0,d1
	cmp.l   a1,a2
	beq.w   UnterMenuFertig
	cmp.l   #'END ',(a1)
	beq.w   UnterMenuFertig
	cmp.l   #'COLT',(a1)
	beq.s   SpaltenTitle
	lea     1(a1),a1
keinReturn
	addq    #1,d1             ;länge GadgetName aus der Prefs
	cmp.b   #10,(a1)+
	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
	bra.s   UnterMenuLoop
SpaltenTitle
	cmp.b   #50,d4
	beq.w   MenuIstVoll
	lea     9(a1),a1
	tst.b   d4
	beq.s   keineBaMDaten
	bsr.s   Spalteninit
	tst.l   d7
	bne.s   MenuGadgetzuviel
	bra.s   BaMDatenDA
keineBaMDaten
	lea     BaM_SpaltenTitleText(a3),a0
BaMDatenDA  
	move.l  a1,(a0)
SpaltenTitleLoop
	cmp.b   #10,(a1)+
	bne.s   SpaltenTitleLoop
	move.b  #0,-1(a1)
	addq    #1,d4             ;d4=SpaltenAnzahl
	bra.s   UnterMenu2Loop
MenuGadgetzuviel
	cmp.l   #-1,d7
	bne.s   NichtsGadgetAbzieh
	sub.w   d0,d5
NichtsGadgetAbzieh
	moveq   #0,d7
	bra.w   MenuIstVoll
Spalteninit
	moveq   #-1,d7
	add.w   d0,d5
	cmp.w   #2560,d5
	bge.s   keineSpaltemehrMoeg
	move.w  d4,d6
	subq    #1,d6
	lea     BaM_GadgetLaenge(a3),a6
	lea     (a6,d6.w),a6
	lea     BaM_SpaltenLaenge(a3),a4
	lea     (a4,d6.w),a4
	add.w   d6,d6
	add.w   d6,d6
	lea     BaM_SpaltenTitleText(a3),a0
	lea     (a0,d6.w),a0
	move.l  (a0),d7
SpaltenCheck
	cmp.w   MaxSpaltenZahl(a5),d0
	bls.s   nurnocheineSpalte
	sub.w   MaxSpaltenZahl(a5),d0
	move.b  MaxSpaltenZahl+1(a5),(a4)+
	move.b  d2,(a6)+
	move.l  d7,(a0)+
	addq    #1,d4
	cmp.b   #50,d4
	beq.s   keineSpaltemehrMoeg
	bra.s   SpaltenCheck
nurnocheineSpalte
	move.b  d0,(a4)
	move.b  d2,(a6)
	move.l  d7,(a0)+
	moveq   #0,d7
keineSpaltemehrMoeg
	rts
UnterMenuFertig
	tst.b   d4
	bne.s   JauEinSpalt
	move.w  d4,d6
	addq    #1,d4
	move.w  d0,d1
	add.w   d1,d1
	tst.b   d1
	beq.s   JauEinSpalt
	move.l  a1,a4
	addq    #1,d1
EndeVonMenu
	tst.b   -(a4)
	bne.s   EndeVonMenu
	subq    #1,d1
	bne.s   EndeVonMenu
EinVorRueck
	lea     1(a4),a4
	cmp.b   #' ',(a4)
	beq.s   EinVorRueck
	add.w   d6,d6
	add.w   d6,d6
	lea     BaM_SpaltenTitleText(a3),a0
	lea     (a0,d6.w),a0
	move.l  a4,(a0)
	move.b  #-1,SpalteOhneTitle(a5)
JauEinSpalt 
	bsr.w   Spalteninit
	moveq   #0,d7
	tst.b   SpalteOhneTitle(a5)
	beq.s   MenuIstVoll
	moveq   #-1,d4
	move.b  #0,SpalteOhneTitle(a5)
MenuIstVoll
	lea     BaM_SpaltenAnzahl(a3),a4
	move.b  d4,(a4)
	lea     BaM_GadgetAnzahl(a3),a4
	move.w  d5,(a4)
	lea     BaM_SIZEOF(a3),a3
	tst.l   (a3)
	bne.w   NaechstesUnterM
	rts
PrefsWerteError
	moveq   #37,d7
	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.w   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
	cmp.l   #IDCMP_MENUPICK,d3
	beq.s   MenuAuswertung
	bra.s   nocheine
** MenuAuswertung
MenuAuswertung
	cmpi.w  #MENUNULL,d4
	beq.w   nocheine
	cmp.w   #$F800,d4
	beq.w   About
	cmp.w   #$F820,d4
	beq.w   ende
	moveq   #0,d6
	sub.w   #$F801,d4
MenuErmittelLoop
	tst.w   d4
	beq.s   MenuWeiterWert
	sub.w   #$20,d4
	addq    #1,d6
	bra.s   MenuErmittelLoop
MenuWeiterWert
	cmp.b   MenuAnGe(a5),d6
	beq.w   nocheine
	bsr.w   ReGadList
	bsr.w   RemoveGadget
	move.b  d6,MenuAnGe(a5)
	move.w  HoeheWin(a5),AlteHoeheWin(a5)
	move.w  BreiteWin(a5),AlteBreiteWin(a5)
	bsr.w   InitGadget
	tst.b   d7
	beq.s   NeuMenuGadgetOK
	rts
NeuMenuGadgetOK 
	moveq   #0,d5
	move.w  d5,AnPage(a5)
	move.w  AlteHoeheWin(a5),d0
	cmp.w   HoeheWin(a5),d0
	bls.s   VergroesserWin
	move.w  AlteBreiteWin(a5),d0
	cmp.w   BreiteWin(a5),d0
	bgt.s   keinVergroessern
VergroesserWin
	move.l  WindowHandle(a5),a0
	move.w  BreiteWin(a5),d0
	sub.w   AlteBreiteWin(a5),d0
	lsr.w   #1,d0
	neg.w   d0
	move.w  HoeheWin(a5),d1
	sub.w   AlteHoeheWin(a5),d1
	lsr.w   #1,d1
	neg.w   d1
	move.l  INTUIBase(a5),a6
	jsr     _LVOMoveWindow(a6)
	move.l  WindowHandle(a5),a0
	move.w  BreiteWin(a5),d0
	sub.w   AlteBreiteWin(a5),d0
	move.w  HoeheWin(a5),d1
	sub.w   AlteHoeheWin(a5),d1
	jsr     _LVOSizeWindow(a6)
keinVergroessern
	bsr.w   AddGadList
	bsr.w   PrintIUnter
	bsr.w   GadAktivieren
	bra.w   nocheine
;;
** About
About
	move.l  WindowHandle(a5),a0
	lea     AbReqTi(pc),a2
	lea     AbReqTxt(pc),a3
	lea     AbGadTxt(pc),a4
	lea     EndeReq(pc),a1
	move.l  a2,8(a1)
	move.l  a3,12(a1)
	move.l  a4,16(a1)
	suba.l  a2,a2
	suba.l  a3,a3
	move.l  INTUIBase(a5),a6
	jsr     _LVOEasyRequestArgs(a6)
	bra.w   nocheine
;;
** RefreWin
RefreWin
	bsr.w   RefreshWin
	bra.w   nocheine
;;
** RAWTaste
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.w   PageLGAn
PfeilRechts
	bsr.s   MenuDataInit
	moveq   #0,d0
	move.b  BaM_SeitenAnzahl(a4),d0
	cmp.w   AnPage(a5),d0
	beq.w   nocheine
	bra.w   PageRGAn
MenuDataInit
	lea     MenuData(a5),a4
	moveq   #0,d0
	moveq   #0,d1
	move.b  MenuAnGe(a5),d0
	move.w  #BaM_SIZEOF,d1
	mulu.w  d0,d1
	lea     (a4,d1.w),a4
	rts
;;
** GadAuswertung
GadAuswertung
	lea     PageLAddr(a5),a0
	move.w  AnPage(a5),d5
	lea     (a0,d5.w),a0
	move.l  (a0),a0
	cmp.l   a0,a4
	beq.w   PageLGAn
	lea     PageRAddr(a5),a0
	lea     (a0,d5.w),a0
	move.l  (a0),a0
	cmp.l   a0,a4
	beq.w   PageRGAn
GadExe
	move.l  gg_UserData(a4),a1
SucheAnfangExe
	tst.b   (a1)+
	bne.s   SucheAnfangExe
	move.l  a1,d1
	moveq   #0,d2
	moveq   #0,d3
	move.l  DOSBase(a5),a6
	jsr     _LVOExecute(a6)
	moveq   #10,d7
	rts
;;
;;
** TastenAuswertung
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.w   NummerGad            
	tst.b   NaechsteSPLaenge(a5)
	beq.s   letztesGDAnw
	tst.b   NaechsteSPSeiten(a5)
	bne.s   NeueSeitebeiRechts
	move.b  NaechsteSPLaenge(a5),d0
	move.b  RelativeGDPos(a5),d1
	cmp.b   d0,d1
	bgt.s   RechteSpalteLang
	move.b  JetztigeSPLaenge(a5),d0
	add.b   d4,d0
	bra.s   DieSelbigeSeite
RechteSpalteLang
	add.b   d0,d4
	move.b  JetztigeSPLaenge(a5),d0
	sub.b   d1,d0
	add.b   d4,d0
	bra.s   DieSelbigeSeite 
NeueSeitebeiRechts
	move.l  AnGad(a5),a4
	move.w  AnPage(a5),d5
	addq    #4,d5
	move.b  RelativeGDPos(a5),d0
	move.b  NaechsteSPLaenge(a5),d1
	cmp.b   d0,d1
	bgt.s   SpaltePasst
	move.b  d1,d0
SpaltePasst
	bra.w   NeueSeite
letztesGDAnw
	move.b  JetztigeSPLaenge(a5),d0
DieSelbigeSeite
	subq    #1,d0
DieSelbige2Seite    
	add.w   d0,d0                ;*4
	add.w   d0,d0
	move.w  AnPage(a5),d5
	move.l  AnGad(a5),a4
	lea     GadgetPage(a5),a3
	lea     (a3,d5.w),a3
	move.l  (a3),a3
	lea     (a3,d0.w),a3
	bra.w   GadAnwaehlen
linkeBank
	bsr.w   NummerGad
	tst.b   VorigeSPLaenge(a5)
	beq.s   erstesGDAnw
	tst.b   VorigeSPSeiten(a5)
	bne.s   NeueSeitebeiLinks
	move.b  VorigeSPLaenge(a5),d0
	move.b  RelativeGDPos(a5),d1
	cmp.b   d0,d1
	bhi.s   LinkeSpalteLang
	sub.b   d0,d4
	move.b  d4,d0
	bra.w   DieSelbigeSeite
LinkeSpalteLang
	move.b  d4,d0
	sub.b   d1,d0
	bra.w   DieSelbigeSeite
erstesGDAnw
	moveq   #1,d0
	bra.w   DieSelbigeSeite
NeueSeitebeiLinks
	move.l  AnGad(a5),a4
	move.w  AnPage(a5),d5
	subq    #4,d5
	move.b  VorigeSeitenLaenge(a5),d0
	move.b  VorigeSPLaenge(a5),d1
	move.b  RelativeGDPos(a5),d2
	cmp.b   d1,d2
	bgt.s   NeueSeite
	sub.b   d1,d0
	add.b   d2,d0
** NeueSeite
* d0 = Neues Angewähltes GadgetNr. relative zum Anfang
* d5 = Neue SeitenNummer
* a4 = Alte GadgetAddr
NeueSeite
	subq    #1,d0
NeueSeite2  
	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
	bsr.w   PrintIUnter
	bra.w   nocheine
;;
** NummerGad
NummerGad
	move.l  AnGad(a5),a4
	move.l  (a4),a3
	move.w  gg_GadgetID(a3),d6
	bsr.w   MenuDataInit
	lea     BaM_SpaltenLaenge(a4),a3
	lea     BaM_GadgetLaenge(a4),a2
	moveq   #0,d5
	move.b  BaM_SpaltenAnzahl(a4),d5
	tst.b   d5
	bpl.s   keineUnsinnigeSpalte
	moveq   #1,d5
keineUnsinnigeSpalte
	subq    #1,d5
	move.b  #0,VorigeSPLaenge(a5)
	moveq   #0,d0
	moveq   #20,d2
	move.b  d6,d4
	move.b  (a3),d0
	move.b  d0,ErsteSPLaenge(a5)
SpaltenHochZLoop
	bsr.s   SCBreiteBestimmen
	cmp.w   SCBreite(a5),d2
	bhi.w   SeiteNeuBeiSpalte
	move.b  #0,VorigeSPSeiten(a5)
VorigeSeiteKoori
	sub.b   d0,d6
	cmp.b   #1,d6
	blt.s   GadgetSpalteGef
	move.b  d0,VorigeSPLaenge(a5)
	add.w   #20,d2
	dbra    d5,SpaltenHochZLoop
GadgetSpalteGef
	add.w   #20,d2
	move.b  d0,JetztigeSPLaenge(a5)
	move.b  d6,RelativeGDPos(a5)
	add.b   d0,RelativeGDPos(a5)
	tst.b   d5
	beq.s   keineSpaltenLaengen
	moveq   #0,d0
	bsr.s   SCBreiteBestimmen
	move.b  d0,NaechsteSPLaenge(a5)
	cmp.w   SCBreite(a5),d2
	bhi.s   SeiteNeuBeiNaechster
	move.b  #0,NaechsteSPSeiten(a5)
NaechsteSeiteKoori
	add.w   #20,d2
	sub.b   d0,d6
	bsr.s   SCBreiteBestimmen
	cmp.w   SCBreite(a5),d2
	bhi.s   SeiteNeuBei2Naechster
	dbra    d5,NaechsteSeiteKoori
	sub.b   d0,d6
KorriKeineSpalten
	neg.b   d6
	move.b  d6,d0
	add.b   d4,d0
	move.b  d0,JetztigeSeite(a5)
	move.b  -(a3),LetzteSPLaenge(a5)
SeiteKorriRueck
	rts
keineSpaltenLaengen
	move.b  #0,NaechsteSPSeiten(a5)
	move.b  #0,NaechsteSPLaenge(a5)
	bra.s   KorriKeineSpalten
SCBreiteBestimmen
	move.b  (a3)+,d0
	moveq   #0,d1
	move.b  (a2)+,d1
	asl.w   #3,d1
	add.w   #10,d1
	add.w   d1,d2
	rts
SeiteNeuBeiSpalte
	moveq   #0,d2
	sub.b   d6,d4
	move.b  d4,VorigeSeitenLaenge(a5)
	move.b  d6,d4
	move.b  #1,VorigeSPSeiten(a5)
	move.b  d0,ErsteSPLaenge(a5)
	bra.w   VorigeSeiteKoori
SeiteNeuBeiNaechster
	move.b  #1,NaechsteSPSeiten(a5)
SeiteNeuBei2Naechster
	neg.b   d6
	move.b  d6,d0
	add.b   d4,d0
	move.b  d0,JetztigeSeite(a5)
	move.b  -2(a3),LetzteSPLaenge(a5)
	bra.s   SeiteKorriRueck
;;
** GetGAddr
* a3 = Neue GadgetAddr
GetGAddr
	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
;;
** Auswertung PageLeft/PageRight Ctrl Shift
PageLGAn
	moveq   #-4,d5
NeueSeiteLeft
	add.w   AnPage(a5),d5
NeueSeite2Left  
	move.l  AnGad(a5),a4
	moveq   #0,d0
	bra.w   NeueSeite2
PageRGAn
	moveq   #4,d5
	bra.s   NeueSeiteLeft
rechtsCtrl
	bsr.w   MenuDataInit
	moveq   #0,d1
	move.b  BaM_SeitenAnzahl(a4),d1
	tst.b   d1
	beq.w   nocheine
	cmp.w   AnPage(a5),d1
	bne.s   PageRGAn
	moveq   #0,d5
	bra.s   NeueSeite2Left
linkeCtrl
	bsr.w   MenuDataInit
	tst.w   AnPage(a5)
	bne.s   PageLGAn
	moveq   #0,d5
	move.b  BaM_SeitenAnzahl(a4),d5
	bra.s   NeueSeite2Left
UpShift
	bsr.w   NummerGad
	sub.b   RelativeGDPos(a5),d4
	move.b  d4,d0
	bra.w   DieSelbige2Seite
DownShift
	bsr.w   NummerGad
	move.b  JetztigeSPLaenge(a5),d0
	sub.b   RelativeGDPos(a5),d0
	add.b   d4,d0
	bra.w   DieSelbigeSeite
linkeShift
	bsr.w   NummerGad
	move.b  RelativeGDPos(a5),d0
	move.b  ErsteSPLaenge(a5),d1
	cmp.b   d0,d1
	bgt.s   ShiftLinksPasst
	move.b  d1,d0
ShiftLinksPasst
	bra.w   DieSelbigeSeite
rechtsShift
	bsr.w   NummerGad
	move.b  JetztigeSeite(a5),d0
	move.b  LetzteSPLaenge(a5),d1
	sub.b   RelativeGDPos(a5),d1
	bmi.s   ShiftRechtsPasst
	sub.b   d1,d0
ShiftRechtsPasst
	bra.w   DieSelbigeSeite
;;
**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  BreiteWin(a5),d2
	subq    #5,d2
	move.w  HoeheWin(a5),d3
	subq    #5,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  BreiteWin(a5),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
	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 
;;
** GadgetListeInit
* d0=WelcheSeite
*    a0=Pointer für CreateGadget
GadgetListeInit
	lea     PrintPage(a5),a1
	move.l  PrintMarkTab(a5),(a1,d0.w)
	lea     GadgetPage(a5),a1
	move.l  a3,(a1,d0.w)
	lea     GadgetListe(a5),a0
	lea     (a0,d0.w),a0
	move.l  GADBase(a5),a6
	jsr     _LVOCreateContext(a6)
	move.l  d0,a0
	beq.w   ErrorGadget
	rts
;;
** InitGadget
InitGadget
	lea     PrintData(a5),a1
	move.l  a1,PrintMarkTab(a5)
	moveq   #it_SIZEOF*5,d0
LoescheTextData
	move.l  #0,(a1)+
	dbra    d0,LoescheTextData
	move.b  #0,SpalteOhneTitle(a5)
	bsr.w   MenuDataInit
	moveq   #0,d6
	move.b  #0,BaM_SeitenAnzahl(a4)
	move.b  BaM_SpaltenAnzahl(a4),d6
	tst.b   d6
	bpl.s   NormalSpaltenMitTitle
	moveq   #1,d6
	move.b  #1,SpalteOhneTitle(a5)
NormalSpaltenMitTitle
	subq    #1,d6
	lea     GadgetAddr(a5),a3
	moveq   #0,d0
	bsr.s   GadgetListeInit
	moveq   #0,d3
SpaltenLoop
* a0=GadgetCreatepointer
* a3=GadgetAddr essen speicher
* a4=BangerMenu-Struct (data)
* d3=GadgetText (später nach Schleife Ende init)
* d6=Spalten Anzahl
	moveq   #0,d0
	move.b  BaM_SpaltenAnzahl(a4),d0
	tst.b   d0
	bpl.s   NormalSpalten2MitTitle
	moveq   #1,d0
NormalSpalten2MitTitle
	sub.w   d6,d0
	subq    #1,d0
	lea     BaM_SpaltenLaenge(a4),a1
	lea     (a1,d0.w),a1
	moveq   #0,d5
	move.b  (a1),d5
	move.w  d5,d2
	moveq   #10,d1
	mulu.w  d1,d2
	add.w   #60,d2
	cmp.w   HoeheWin(a5),d2
	bls.s   WinGroesseBeh
	move.w  d2,HoeheWin(a5)
WinGroesseBeh
	tst.b   d5
	beq.w   COLOhne
	subq    #1,d5
	lea     BaM_GadgetLaenge(a4),a1
	lea     (a1,d0.w),a1
	moveq   #0,d4
	move.b  (a1),d4
	asl.w   #3,d4
	add.w   #10,d4
	lea     UniGad(pc),a1
	move.w  gng_LeftEdge(a1),d1
	move.w  d4,gng_Width(a1)
	add.w   d4,d1
	cmp.w   SCBreite(a5),d1
	bhi.w   NeueSeiteInit
SeitenRueckkehr
	lea     BaM_SpaltenTitleText(a4),a1
	add.w   d0,d0
	add.w   d0,d0
	lea     (a1,d0.w),a1
	move.l  (a1),a1
	tst.b   SpalteOhneTitle(a5)
	bne.s   GSNameRichtig
	bsr.w   TextInit
	tst.b   d3
	beq.s   ErsterGadNameFind
	move.l  d3,a2
	cmp.b   #$20,-1(a2)
	beq.s   TauscheReg
ErsterGadNameFind
	tst.b   (a1)+
	bne.s   ErsterGadNameFind
	lea     1(a1),a1
GSNameRichtig
	move.l  a1,d3
TauscheReg
	exg     a4,d3
InitGadloop
* a0=GadgetCreatepointer
* a3=GadgetAddr essen speicher
* a4=GadgetText (aus der Konfig)
* d3=BangerMenuStruct
* d5=GadgetAnzahl pro Spalte
* d6=Spalten Anzahl
	moveq   #BUTTON_KIND,d0
	lea     UniGad(pc),a1
	move.l  a4,gng_GadgetText(a1)
	add.w   #10,gng_TopEdge(a1)
	add.w   #1,gng_GadgetID(a1)
	suba.l  a2,a2
	move.l  GADBase(a5),a6
	jsr     _LVOCreateGadgetA(a6)
	move.l  d0,(a3)+
	beq.w   ErrorGadget
	move.l  d0,a0
	move.l  a4,gg_UserData(a0)
	bsr.w   Return2Find
	dbra    d5,InitGadloop
	lea     UniGad(pc),a1
	move.w  #20,gng_TopEdge(a1)
	move.b  RelativeTopC(a5),d0
	add.b   d0,gng_TopEdge+1(a1)
	move.w  gng_Width(a1),d0
	add.w   d0,gng_LeftEdge(a1)
	add.w   #20,gng_LeftEdge(a1)
	exg     d3,a4
COLOhne 
	dbra    d6,SpaltenLoop
	lea     UniGad(pc),a1
	move.w  gng_LeftEdge(a1),d1
	move.w  #20,gng_LeftEdge(a1)
	move.b  RelativeLeftC(a5),d0
	add.b   d0,gng_LeftEdge+1(a1)
	move.w  #0,gng_GadgetID(a1)
	cmp.w   BreiteWin(a5),d1
	bls.s   WinBreite2Beh
	move.w  d1,BreiteWin(a5)
WinBreite2Beh
	tst.b   BaM_SeitenAnzahl(a4)
	beq.s   GadgetEndeInit
	bsr.w   SeitenGadgetInit
GadgetEndeInit
	move.b  #0,ZweitePage(a5)
	move.l  #0,(a3)
	rts
;;
** TextInit
* a0=GadgetCreatepointer
* a1=Zeiger auf Col Title Text
* a3=GadgetAddr essen speicher
* a4=BangerMenu-Struct (data)
* d0=Spalte
* d3=GadgetText voriges Mal
* d5=GadgetAnzahl pro Spalte
* d6=Spalten Anzahl
TextInit
	movem.l a0-a4/d7,-(sp)
	move.w  d0,d4
	lea     UniGad(pc),a2
	move.w  gng_LeftEdge(a2),d7
	move.w  gng_Width(a2),d2
	move.l  PrintMarkTab(a5),a2
	lea     it_SIZEOF(a2),a3
	move.l  a3,it_NextText(a2)
	move.l  #$02000100,(a3)
	move.w  #19,it_TopEdge(a3)
	move.l  FontAddr(a5),it_ITextFont(a3)
	move.l  a1,it_IText(a3)
	move.l  a1,a0
TextEndeLoop
	tst.b   (a1)+
	bne.s   TextEndeLoop
	sub.l   a0,a1
	move.l  a1,d0
	subq    #1,d0
	lsl.w   #3,d0
	sub.w   d0,d2
	bmi.s   TextZuLang
	lsr.w   #1,d2
TextKorritur
	add.w   d2,d7
	move.b  RelativeLeftC(a5),d2
	sub.w   d2,d7
	bpl.s   nichtFensterRand
	moveq   #0,d7
nichtFensterRand
	move.w  d7,it_LeftEdge(a3)
	move.l  a3,PrintMarkTab(a5)
	movem.l (sp)+,a0-a4/d7
	rts
TextZuLang
	neg.w   d2
	lsr.w   #1,d2
	neg.w   d2
	tst.b   d4
	beq.s   TextKorritur
	sub.b   d4,TextUOFlag(a5)
	beq.s   TextKorritur
	addq    #1,d4
	move.b  d4,TextUOFlag(a5)
	sub.w   #10,it_TopEdge(a3)
	bra.s   TextKorritur
;;
** NeueSeiteInit
* a0=GadgetCreatepointer
* a3=GadgetAddr essen speicher
* a4=BangerMenu-Struct (data)
* d0=Spalte
* d3=GadgetText (später nach Schleife Ende init)
* d5=GadgetAnzahl pro Spalte
* d6=Spalten Anzahl
NeueSeiteInit
	movem.l d0,-(sp)
	bsr.s   SeitenGadgetInit
	tst.b   d7
	beq.s   SeitenGadgOK
	rts
SeitenGadgOK    
	lea     UniGad(pc),a1
	move.w  gng_LeftEdge(a1),d0
	cmp.w   BreiteWin(a5),d0
	bls.s   WinBreiteBeh
	move.w  d0,BreiteWin(a5)
WinBreiteBeh
	move.w  #20,gng_LeftEdge(a1)
	move.b  RelativeLeftC(a5),d0
	add.b   d0,gng_LeftEdge+1(a1)
	move.l  #0,(a3)+
	add.b   #4,BaM_SeitenAnzahl(a4)
	move.l  PrintMarkTab(a5),a1
	move.l  #0,it_NextText(a1)
	lea     it_SIZEOF(a1),a1
	move.l  a1,PrintMarkTab(a5)
	moveq   #0,d0
	move.b  BaM_SeitenAnzahl(a4),d0
	bsr.w   GadgetListeInit
	tst.b   d7
	beq.s   NeueGadListeOK
	rts
NeueGadListeOK  
	movem.l (sp)+,d0
	bra.w   SeitenRueckkehr
;;
** SeitenGadgetInit
* a0=GadgetCreatepointer
* d6=Spalten Anzahl (ob noche eine Seite kommt oder nicht)
SeitenGadgetInit
	moveq   #0,d4
	move.b  BaM_SeitenAnzahl(a4),d4
	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)
	tst.l   d0
	beq.w   ErrorGadget
	move.l  d0,a0
	lea     PageLAddr(a5),a1
	lea     (a1,d4.w),a1
	move.l  d0,(a1)
	moveq   #BUTTON_KIND,d0
	lea     Page2Gads(pc),a1
	tst.b   d6
	bmi.s   kein2Seite
	cmp.b   #36,d4
	beq.s   kein2Seite
	lea     PaGadTags2(pc),a2
	bra.s   doch2Seite
kein2Seite
	lea     PaGadTags(pc),a2
doch2Seite
	jsr     _LVOCreateGadgetA(a6)
	tst.l   d0
	beq.w   ErrorGadget
	move.l  d0,a0
	lea     PageRAddr(a5),a1
	lea     (a1,d4.w),a1
	move.l  d0,(a1)
	move.b  #1,ZweitePage(a5)
	rts
;;
** ErrorGadget
ErrorGadget
	bsr.s   RemoveGadget
	moveq   #25,d7           ;25 = Gadget init Fehler
	rts
RemoveGadget
	move.l  GADBase(a5),a6
	bsr.w   MenuDataInit
	moveq   #0,d4
	move.b  BaM_SeitenAnzahl(a4),d4
GadListeFLoop   
	lea     GadgetListe(a5),a0
	lea     (a0,d4.w),a0
	move.l  (a0),a0
	jsr     _LVOFreeGadgets(a6)
	subq    #4,d4
	bpl.s   GadListeFLoop
	rts 
Return2Find
	tst.b   (a4)+
	bne.s   Return2Find
Return1Mal
	tst.b   (a4)+
	bne.s   Return1Mal
	cmp.b   #$20,(a4)
	bne.s   AltesKonfigFile
	lea     1(a4),a4
AltesKonfigFile 
	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),d0
	addq    #1,d0
	move.l  d0,Filegroesse(a5)
	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  d0,a0
	move.b  #0,(a0)+
	move.l  PrefsFileHandle(a5),d1
	move.l  a0,d2
	move.l  Filegroesse(a5),d3
	move.l  DOSBase(a5),a6
	jsr     _LVORead(a6)
SchliesseFile
	move.l  PrefsFileHandle(a5),d1
	move.l  DOSBase(a5),a6
	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.w   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)
	sub.w   #20,SCBreite(a5)
	sub.w   #50,SCHoehe(a5)
	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)
	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,IDCMP_MENUPICK!IDCMP_CLOSEWINDOW!IDCMP_VANILLAKEY!IDCMP_REFRESHWINDOW!BUTTONIDCMP!RAWKEY
		dc.l    WA_Flags,WFLG_ACTIVATE!WFLG_SMART_REFRESH!WFLG_DRAGBAR!WFLG_DEPTHGADGET!WFLG_CLOSEGADGET
		dc.l    WA_NewLookMenus,-1
		dc.l    WA_AutoAdjust,-1
		dc.l    TAG_DONE
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,14,12
		dc.l    0,0
		dc.w    10000
		dc.l    PLACETEXT_IN,0,0
Page2Gads
		dc.w    40,5,14,12
		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
MenuTags
		dc.l    GTMN_NewLookMenus,1
		dc.l    TAG_END
topaz8:
		dc.l    0
		dc.w    8
		dc.b    0,1
PenArray
		dc.w    -1
EndeReq
		dc.l    EasyStruct_SIZEOF
		dc.l    0,0,0,0
;;
** BYTE Daten
ParaTemplate    dc.b 'MONITORTREIBER,MONITORID/K/N,NOKEY/S',0
intname         INTNAME
dosname         DOSNAME
gadname         GADTOOLSNAME
gfxname         GRAFNAME
AbReqTi         dc.b    'About the program',0
AbReqTxt        dc.b    'BangerMenu is giftware',10
				dc.b    'Autor: Andre´ Trettin',10,10
				dc.b    '       Duwockskamp 33',10
				dc.b    '       21029 Hamburg',10
				dc.b    '       040/7246861',10
				dc.b    '       Germany',10,10
				dc.b    'EMail: tretti-a@rzbt.fh-hamburg.de',10,10
				dc.b    'Greeting all how sent me a EMail about BangerMenu',10
				dc.b    '           and my friends',0
AbGadTxt        dc.b    'OK',0
ProjektName     dc.b    'Project',0
InfoName        dc.b    'About',0
QuitName        dc.b    'Quit',0
InfoTaste       dc.b    'A',0
QuitTaste       dc.b    'Q',0
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 3.05 (19-Feb-96) © by Andre´ Trettin',0
;;
