;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.3 (4-Sep-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 dos/dostags.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               ;Intuition Lib. Addr.
	APTR    DOSBase                 ;Dos Lib. Addr.
	APTR    GADBase                 ;GadTools Lib. Addr.
	APTR    GFXBase                 ;Graphics Lib. Addr.
	APTR    WindowHandle            ;Fenster Addr.
	APTR    ScreenHandle            ;ScreenAddr.
	APTR    VisualInfo              ;VisualInfo Addr.
	APTR    WinRPort                ;Window RasrPort Addr.
	APTR    PrefsFileHandle         ;File Addr.
	APTR    FileSpeicher            ;File Speicher
	APTR    FontAddr                ;TextAttr-Struktur
	APTR    meinTask                ;Task Addr.
	APTR    alterTask               ;alter Task Addr.
	APTR    AnGad                   ;Angewählte Gadget Addr.
	APTR    MsgPortAddr             ;Addr. des Message Port
	APTR    PrefsLoadKey            ;Para: PrefsFilename
	APTR    MonitorKey              ;Para: MonitorTreiber
	APTR    MoniID                  ;Para: MonitorID Nr.
	APTR    NOKEYArray              ;Para: NOKEY
	APTR    RDArgs                  ;Resultat von ReadArgs/dos
	APTR    MenuPtr                 ;Menu Addr
	APTR    PrintMarkTab            ;Text Marker für die Seiten beim erstellen
	APTR    ProgrammDir             ;aktuelles Verzeichnis des Auszuführenden Prog.
	APTR    AltesDir                ;altes Verzeichnis
	STRUCT  FIB,[fib_SIZEOF]        ;FIB=FileInfoBlock Struktur
	STRUCT  TastenIBlock,[IO_SIZE]  ;Addr. IORequest
	STRUCT  MenuData,[BaM_SIZEOF*50] ;Daten des BangerMenu aufbau
	STRUCT  PrintData,[it_SIZEOF*20] ;IntuiText Struktur für die Textausgabe der SpaltenTitle
	STRUCT  VirtualMenu,[gnm_SIZEOF*55] ;unabhängiges ScreenMenu
	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             ;Filegröße
	WORD    HoeheWin                ;Fenster Höhe
	WORD    BreiteWin               ;Fenster Breite
	WORD    AlteHoeheWin            ;Alte Fenster Höhe
	WORD    AlteBreiteWin           ;Alte Fenster Breite
	WORD    SCHoehe                 ;Screen Höhe
	WORD    SCBreite                ;Screen Breite
	WORD    AnPage                  ;Momentaniges Angewählte Seite
	WORD    MaxSpaltenZahl          ;Max. Anzahl in einer Spalte
	WORD    JetztigeSeite           ;GadgetAnzahl der jetzigen Seite
	WORD    VorigeSeitenLaenge      ;Vorige Seiten GadgetAnzahl
	WORD    LetzteSPLaenge          ;Letzte Spalten Länge
	WORD    ErsteSPLaenge           ;ErsteSpaltenLänge
	WORD    VorigeSPLaenge          ;VorigeSpaltenLänge
	WORD    JetztigeSPLaenge        ;JetzigeSpaltenLänge
	WORD    NaechsteSPLaenge        ;NächsteSpaltenLänge
	WORD    RelativeGDPos           ;GadgetPostion in der Spalte
	BYTE    VorigeSPSeiten          ;keine Neue Seite bei voriger Spalte
	BYTE    NaechsteSPSeiten        ;keine Neue Seite bei nächster Spalte
	BYTE    TextUOFlag              ;Spalte-Text unter/ober Flag
	BYTE    SpalteOhneTitle         ;Spalte Ohne Titel
	BYTE    MenuEintragAnzahl       ;Anzahl der Menu Einträge im Screen-Menu
	BYTE    ZweitePage              ;Zweite Seite Vorhanden
	BYTE    ScreenSignal            ;SignalNr
	BYTE    RelativeTopC            ;Relative Ecke von Oben
	BYTE    RelativeLeftC           ;Relative Ecke von Links
	BYTE    MenuAnGe                ;Momentaniges Angewähltes Menu
	LABEL   Int_SIZEOF
;;
** Hauptprog
	moveq   #0,d7            ;Error Code = 0
	move.l  4.w,a6           ;EXECBase
	move.l  #Int_SIZEOF,d0   ;Internal-Struktur
	move.l  #MEMF_PUBLIC!MEMF_CLEAR,d1  ;Speicher Type: zuerst FAST MEM
	jsr     _LVOAllocMem(a6) ;Speicher für Variablen reservieren
	move.l  d0,a5            ;a5 Basis Addr. für alle Variablen
	bne.s   LibraryO         ;Speicher OK!
	moveq   #21,d7           ;21 = kein Speicher
	bra.w   Ende             ;beenden
LibraryO
	bsr.w   InitRelative     ;Init Relative (kein Reloc Tabelle)
	bsr.w   LibOeffne        ;Libraries öffnen
	tst.w   d7               ;Fehler Code 0=OK
	bne.w   SchliesseLibrary ;Error Beende
	bsr.w   Parameter        ;Parameter abfragen
	tst.w   d7               ;Parameter fehler
	bne.s   SchliesseLibrary ;Schliesse Libraries
	bsr.w   WaitOnCaps       ;CAPS-Lock Abfrage
	cmp.w   #10,d7           ;Error wenn d7>10
	bhi.s   ParameterFree    ;Ende wegen Error
	tst.w   d7               ;d7=0
	beq.s   Menuerscheine    ;BangerMenu Start
	moveq   #0,d7            ;kein Fehler trotzdem Ende
	bra.s   ParameterFree
Menuerscheine
	bsr.w   PubScreenOeffne  ;Öffne Screen
	tst.w   d7               ;Fehler beim Screen Öffnen
	bne.s   ParameterFree    ;gebe Parameter frei
	bsr.w   LadePrefs        ;Lade Prefs
	tst.w   d7               ;Fehler beim Laden des Prefs Files?
	bne.s   SchliesseScreen  ;JA Schliesse Screen
	bsr.w   WertePrefsAus    ;Prefs Auswerten
	tst.w   d7               ;Prefs Fehler
	bne.s   FreiSPrefs       ;Speicher Frei vom PrefsFile
	bsr.b   InitMenu         ;Screen Menu Init
	tst.b   d7               ;Fehler im Menu
	bne.s   MenuRemove       ;Entferne Menu
	bsr.w   InitGadget       ;Gadget Init
	tst.w   d7               ;Fehler beim Gadget erschaffen ?
	bne.s   MenuRemove       ;Entferne Menus
	bsr.w   FensterOeffne    ;Fenster öffenen
	tst.w   d7               ;Fehler beim Fenster Öffnen
	bne.s   RemGad           ;Entferne Gadgets
	bsr.w   SetAndLayout     ;Menu aufbau
	tst.b   d7
	bne.s   SchliesseFenster ;Schliesse Fenster
	move.w  #0,d5            ;erstes Menu
	bsr.w   PrintIUnter      ;Text Ausgabe
	bsr.w   GadAktivieren    ;erstes Gadget aktivieren
	bsr.w   RefreshWin       ;Fenster neuaufbau
	bsr.w   MessageAbFragen  ;Fenster verwaltung
	bsr.w   ClearMenu        ;Entferne Menu
SchliesseFenster
	bsr.w   FensterSchliesse ;Schliesse Fenster
RemGad
	bsr.w   RemoveGadget     ;Entferne Gadgets
MenuRemove
	bsr.w   RemoveMenu       ;Entferne Menu
FreiSPrefs
	bsr.w   SpeicherPrefs    ;Speicher vom Prefs File freigeben
SchliesseScreen
	bsr.w   ScreenSchliesse  ;Schliesse Screen
ParameterFree
	bsr.w   FreePara         ;Read Args wieder freigeben
SchliesseLibrary
	bsr.w   LibSchliesse     ;schliesse Libraries
	move.l  a5,a1            ;Speicher Addr.
	move.l  #Int_SIZEOF,d0   ;Größe
	jsr     _LVOFreeMem(a6)  ;Speicher freigeben
Ende
	move.l  d7,d0            ;Error Code
ende
	rts                      ;Ende
;;
** InitMenu
InitMenu
	lea     UniGad(pc),a1           ;Universal NewGadget Struktur
	move.b  RelativeTopC(a5),d4     ;Relative Ecke Oben
	move.b  RelativeLeftC(a5),d5    ;Relative Ecke Links
	add.b   d4,gng_TopEdge+1(a1)    ;Eintrag in die NewGadget Struktur
	add.b   d5,gng_LeftEdge+1(a1)   ;Eintrag in die NewGadget Struktur
	move.l  VisualInfo(a5),gng_VisualInfo(a1) ;VisualInfo eintrag
	move.l  FontAddr(a5),gng_TextAttr(a1) ;TextAttr Struktur eintrag
	lea     PageGads(pc),a1         ;Seiten umblätter Gadgets
	add.b   d4,gng_TopEdge+1(a1)    ;Init
	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      ;TextString eintrag
	move.l  a2,gng_GadgetText(a1)
	lea     Page2Gads(pc),a1        ;Zweites Seiten umblätter Gadget
	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      ;unabhängiges Screen Menu
	move.b  #NM_TITLE,gnm_Type(a0)  ;Titel
	lea     ProjektName(pc),a1      ;Projekt String
	move.l  a1,gnm_Label(a0)
	lea     gnm_SIZEOF(a0),a0       ;Vorspringen
	move.b  #NM_ITEM,gnm_Type(a0)   ;Über
	lea     InfoName(pc),a1         ;Über String
	move.l  a1,gnm_Label(a0)
	lea     InfoTaste(pc),a1        ;Über Taste
	move.l  a1,gnm_CommKey(a0)
	lea     gnm_SIZEOF(a0),a0
	move.b  #NM_ITEM,gnm_Type(a0)   ;Beenden
	lea     QuitName(pc),a1         ;Beenden String
	move.l  a1,gnm_Label(a0)
	lea     QuitTaste(pc),a1        ;Beenden Taste
	move.l  a1,gnm_CommKey(a0)
	move.b  MenuEintragAnzahl(a5),d0 ;Screen Menu Anzahl
	tst.b   d0
	beq.s   keinGrossesMenu         ;gar kein UserMenu
	lea     gnm_SIZEOF(a0),a0
	move.b  #NM_TITLE,gnm_Type(a0)  ;BangerMenu
	lea     WindowTitle(pc),a1      ;BangerMenu String
	move.l  a1,gnm_Label(a0)
	subq    #1,d0
	lea     MenuData(a5),a1         ;BangerMenu Daten
MenuInitLoop
	lea     gnm_SIZEOF(a0),a0       ;Vorspringen zum nächsten Menu
	move.b  #NM_ITEM,gnm_Type(a0)   ;Titel
	move.l  BaM_MenuTitleText(a1),gnm_Label(a0) ;Titel String
	move.l  BaM_MenuKey(a1),gnm_CommKey(a0) ;Menu Taste
	lea     BaM_SIZEOF(a1),a1       ;BangerMenu Struktur vorspringen zum nächsten
	dbra    d0,MenuInitLoop
keinGrossesMenu
	move.l  GADBase(a5),a6          ;GadTools Base
	lea     VirtualMenu(a5),a0      ;NewMenu Struktur
	lea     MenuTags(pc),a1         ;Menu TAGS
	jsr     _LVOCreateMenusA(a6)    ;Menu Struktur erschaffen
	move.l  d0,MenuPtr(a5)          ;Menu Addr.
	beq.s   MenuError               ;Fehler ?
	move.l  d0,a0
	move.l  VisualInfo(a5),a1       ;VisualInfo Addr.
	suba.l  a2,a2                   ;keine TAGS
	jsr     _LVOLayoutMenusA(a6)    ;Menu Aufbauen
	move.l  d0,d1                   ;alles geklappt
	bne.s   MenuOK                  ;JA
MenuError
	moveq   #38,d7                  ;38=Menu Fehler
MenuOK
	rts
RemoveMenu
	move.l  GADBase(a5),a6          ;GadTools Base
	move.l  MenuPtr(a5),a0          ;Menu Addr.
	jsr     _LVOFreeMenus(a6)       ;Gebe Speicher der Menu Struktur frei
	rts
;;
** SetAndLayout ClearMenu PrintIUnter
SetAndLayout
	move.l  INTUIBase(a5),a6        ;Intuition Base
	move.l  WindowHandle(a5),a0     ;Fenster Addr.
	move.l  MenuPtr(a5),a1          ;Menu Addr.
	jsr     _LVOSetMenuStrip(a6)    ;Setze Menu
	move.l  d0,d1                   ;Fehler ?
	bne.s   SetLayOK                ;NEIN
	moveq   #38,d7                  ;Menu Fehler
SetLayOK
	rts
ClearMenu
	move.l  INTUIBase(a5),a6        ;Intuition Base
	move.l  WindowHandle(a5),a0     ;Fenster Addr.
	jsr     _LVOClearMenuStrip(a6)  ;Entferne Menu
	rts
PrintIUnter
	lea     PrintPage(a5),a1        ;PrintIText Addr
	lea     (a1,d5.w),a1            ;welches Menu
	move.l  (a1),a1
	lea     it_SIZEOF(a1),a1
	move.l  WinRPort(a5),a0         ;Fenster RastPort Addr.
	moveq   #0,d0
	moveq   #0,d1
	move.b  RelativeTopC(a5),d1     ;Relative
	move.b  RelativeLeftC(a5),d0
	move.l  INTUIBase(a5),a6        ;Intuition Base
	jsr     _LVOPrintIText(a6)      ;Schreibe Text
	rts
;;
** WertePrefsAus
WertePrefsAus
	move.w  SCHoehe(a5),d0          ;Screen Höhe
	sub.w   #20,d0                  ;Höhe-20
	moveq   #10,d1
	divu.w  d1,d0                   ;Höhe/10
	move.w  d0,MaxSpaltenZahl(a5)   ;Max. Anzahl in einer Spalte
	move.l  FileSpeicher(a5),a1     ;PrefsFile anfang
	move.l  Filegroesse(a5),d0      ;PrefsFile größe
	move.l  a1,a2                   ;PrefsFile -->a2
	add.l   d0,a2                   ;PrefsFile Ende
MenuDochNoch
	cmp.l   #'MENU',(a1)            ;MENU vorhanden
	beq.s   MenuEintrag             ;JA!
keinMenuReturn
	cmp.b   #10,(a1)+               ;Suche Return
	bne.s   keinMenuReturn
	cmp.l   a1,a2                   ;PrefsFile schon Ende
	bgt.s   MenuDochNoch            ;NEIN dann nach MENU suchen
	lea     MenuData(a5),a3         ;BangerMenu Struktur
	move.l  FileSpeicher(a5),a1     ;PrefsFile
	bra.w   UnterMenuGefunden
MenuEintrag
	lea     MenuData(a5),a3         ;BangerMenu Struktur
	moveq   #0,d0
EintragMenuSLoop
	cmp.b   #10,(a1)+               ;Suche Return
	bne.s   EintragMenuSLoop
EintragMenu2Loop
	move.b  #0,-1(a1)               ;NULL Byte als Terminierung
	cmp.l   #'ENDM',(a1)            ;Vergleiche ENDM
	beq.s   AlleMenuEintrage        ;JA alle Menu einträge gefunden
	cmp.l   a1,a2                   ;Schon Ende
	bls.w   PrefsWerteError         ;JA dann Fehler in den Prefs
	lea     1(a1),a1                ;ein Leerzeichen bevor Menuname Anfängt
	move.l  a1,(a3)                 ;MenuName in BangerMenu Struktur eintragen
weiterSuchenMKey
	move.b  (a1)+,d1
	cmp.l   #'MKEY',(a1)            ;vergleiche MKEY vorhanden
	beq.s   TasteFuerMenu           ;JA Menu hat eine Taste
	cmp.b   #10,d1                  ;Menuname Ende ?
	bne.s   weiterSuchenMKey        ;Nein
MKeyGefunden    
	lea     BaM_SIZEOF(a3),a3       ;nächste Struktur für ein neues Menu
	addq    #1,d0                   ;Zähle Menus
	cmp.b   #50,d0                  ;schon 50 ?
	beq.s   AlleMenuEintrage        ;JA dann abschliessen
	bra.s   EintragMenu2Loop        ;Ansonsten nächstes Menu extrahieren
TasteFuerMenu
	move.b  #0,-1(a1)               ;MeunName NULL Byte Termieren
	lea     5(a1),a1                ;Vorspringen zum Zeichen
	move.l  a1,BaM_MenuKey(a3)      ;Zeichen eintragen in BangerMenu
EintragMenu3Loop    
	cmp.b   #10,(a1)+               ;Return ?
	bne.s   EintragMenu3Loop        ;NEIN
	bra.s   MKeyGefunden            ;JA und zurück
AlleMenuEintrage
	move.b  d0,MenuEintragAnzahl(a5) ;Anzahl der Menu Einträge im Screen-Menu
	lea     MenuData(a5),a3          ;BangerMenu Struktur
NaechstesUnterM 
	move.l  BaM_MenuTitleText(a3),a0 ;MenuTitel
	move.l  FileSpeicher(a5),a1     ;PrefsFile Anfang
	move.b  (a0),d0                 ;Erstes Zeichen vom MenuTitel --> d0
TestUnterMenuLoop
	cmp.b   (a1),d0                 ;Vergleiche PrefsFile mit d0
	beq.s   MenuBezeich             ;gleich
keinMenuBezReturn
	cmp.b   #10,(a1)+               ;Suche Return
	bne.s   keinMenuBezReturn
	cmp.l   a1,a2                   ;PrefsEnde
	bgt.s   TestUnterMenuLoop       ;nächste Zeile im PrefsFile
	bra.w   PrefsWerteError         ;Menu Eintrag Leer
MenuBezeich
	move.l  a0,a4                   ;MenuTitel
MenuBezeichLoop
	move.b  (a0)+,d1                ;Buchstabe --> d1
	tst.b   d1                      ;MenuTitle Ende ?
	beq.s   UnterErstGefunden       ;JA --> MenuDaten gefunden
	cmp.b   (a1)+,d1                ;Vergleiche Prefs mit MenuTitel
	beq.s   MenuBezeichLoop         ;Noch gleich
	move.l  a4,a0                   ;Zurück setzen des MenuTitels
	bra.s   keinMenuBezReturn       ;und weiter suchen
UnterErstGefunden   
	move.b  #0,(a1)+          ;Prefs MenuTitel Null Terimiert
UnterMenuGefunden
	moveq   #0,d5
	moveq   #0,d4             ;d4=SpaltenAnzahl
UnterMenu2Loop
	moveq   #0,d0             ;Anzahl der Gadgets
	moveq   #0,d2             ;Längste Gadget
	moveq   #0,d3             ;0/1
UnterMenuLoop
	moveq   #0,d1             ;Aktuell Gadgetlänge
	cmp.l   a1,a2             ;PrefsEnde ?
	beq.w   Unter2MenuFertig   ;JA Daten für Menu fertig
	cmp.l   #'END ',(a1)      ;END vorhanden
	beq.w   UnterMenuFertig   ;JA Daten für Menu fertig
	cmp.l   #'COLT',(a1)      ;COLT vorhanden
	beq.s   SpaltenTitle      ;Neu Spalte
	lea     1(a1),a1          ;Ein Vorrücken da ein Space vor den Daten liegt
	cmp.l   a1,a2             ;PrefsEnde ?
	beq.w   Unter2MenuFertig   ;JA Daten für Menu fertig
keinReturn
	addq    #1,d1             ;länge GadgetName aus der Prefs
	cmp.b   #10,(a1)+         ;Return suchen
	bne.s   keinReturn
	move.b  #0,-1(a1)         ;das Return ersetzen mit NullByte
	tst.b   d3                ;d3 0/1 entweder Gadgetname oder Programm bzw. Batchdatei
	beq.s   BreiteZaehlen     ;GadgetName
	moveq   #0,d3             ;nächste Zeile ist wieder ein Gadgetname
	bra.s   UnterMenuLoop     ;nächste Zeile bearbeiten
BreiteZaehlen
	moveq   #1,d3             ;nächste Zeile ist Programm bzw. Batchdatei
	addq    #1,d0             ;d0=Anzahl der Gadgets
	cmp.b   d2,d1             ;d2 enthält den längsten Gadgetnamen
	bls.s   UnterMenuLoop     ;nächste Zeile bearbeiten
	move.b  d1,d2             ;neue länge war größer als alte
	bra.s   UnterMenuLoop     ;nächste Zeile bearbeiten
SpaltenTitle
	cmp.b   #50,d4            ;SpaltenAnzahl=50 ?
	beq.w   MenuIstVoll       ;JA keine Spalte mehr
	lea     9(a1),a1          ;Vorsprung zum SpaltenTitle
	tst.b   d4                ;erste Spalte ?
	beq.s   keineBaMDaten     ;JA
	bsr.s   Spalteninit       ;Spalten Daten eintragen
	tst.l   d7                ;Gadget über dem Max. Check
	bne.s   MenuGadgetzuviel  ;JA zu viele
	bra.s   BaMDatenDA
keineBaMDaten
	lea     BaM_SpaltenTitleText(a3),a0 ;SpaltenTitel eintrag in BangerMenu Struktur
BaMDatenDA  
	move.l  a1,(a0)                     ;PrefsSpaltenTitel
SpaltenTitleLoop
	cmp.b   #10,(a1)+                   ;Suche Return
	bne.s   SpaltenTitleLoop
	move.b  #0,-1(a1)                   ;Mit NULL Byte Terimieren
	addq    #1,d4                       ;SpaltenAnzahl erhöhen
	bra.s   UnterMenu2Loop              ;Nächste Zeile
MenuGadgetzuviel
	sub.w   d0,d5                       ;Wieder alte Gadgets Anzahl herstellen
	moveq   #0,d7                       ;d7 korrigieren
	bra.w   MenuIstVoll                 ;diese Menu zu voll
Spalteninit
	moveq   #-1,d7                      ;Error wenn Gadget zu viel sind
	add.w   d0,d5                       ;GadgetAnzahl der vorigen Spalte addieren
	cmp.w   #2560,d5                    ;gesamt Gadgets Anzahl über 2560 ?
	bge.s   keineSpaltemehrMoeg         ;JA - dann keine weiteren Gadgets mehr
	move.w  d4,d6                       ;SpaltenAnzahl --> d6
	subq    #1,d6                       ;SpaltenAnzahl-1
	lea     BaM_GadgetLaenge(a3),a6     ;Längste Gadget in der Spalte
	lea     (a6,d6.w),a6
	lea     BaM_SpaltenLaenge(a3),a4    ;Spalten Länge
	lea     (a4,d6.w),a4
	add.w   d6,d6                       ;SpaltenAnzahl*4, weil long
	add.w   d6,d6
	lea     BaM_SpaltenTitleText(a3),a0 ;auf Aktuellen SpaltenTitle setzen
	lea     (a0,d6.w),a0
	move.l  (a0),d7                     ;SpaltenTitel Addr. d7
SpaltenCheck
	cmp.w   MaxSpaltenZahl(a5),d0       ;Max. Anzahl an Gadget pro Spalte
	bls.s   nurnocheineSpalte           ;weniger noch ein Spalte
	sub.w   MaxSpaltenZahl(a5),d0       ;Max. Anzahl an Gadget pro Spalte abziehen von Anzahl der Gadgets
	move.b  MaxSpaltenZahl+1(a5),(a4)+  ;Spaltenlänge = max.
	move.b  d2,(a6)+                    ;Längsten GadgetNamen
	move.l  d7,(a0)+                    ;Spalte besitzt den gleichen SpaltenTitel
	tst.b   SpalteOhneTitle(a5)         ;Spalte Ohne Titel?
	bne.s   NaechstenSPTitleKoor         ;JA
SPTitleKorrFertig
	addq    #1,d4                       ;Spalten Anzahl erhöhen
	cmp.b   #50,d4                      ;50 Spalten erreicht ?
	beq.s   keineSpaltemehrMoeg         ;JA genug Spalten
	bra.s   SpaltenCheck                ;Ansonsten weitere Erzeugen
NaechstenSPTitleKoor
	move.l  d7,a1                       ;a1=Gadgetname aus Konfig
	move.w  MaxSpaltenZahl(a5),d1       ;d1=Max. Anzahl an Gadgets/Spalte
	add.w   d1,d1                       ;*2 weil GadgetName + ProgrammName
SPTitle1Korr
	tst.b   (a1)+                       ;NULL Byte suche
	bne.s   SPTitle1Korr
	subq    #1,d1                       ;Schon alle Gadgets
	bne.s   SPTitle1Korr                ;Nein
	move.l  a1,d7                       ;d7=Addr. der Gadget der nächsten Spalte
	bra.s   SPTitleKorrFertig
nurnocheineSpalte
	move.b  d0,(a4)                     ;Spaltenlänge
	move.b  d2,(a6)                     ;Längsten GadgetNamen
	move.l  d7,(a0)+                    ;Spalte besitzt den gleichen SpaltenTitel
	moveq   #0,d7                       ;d7 wieder löschen
keineSpaltemehrMoeg
	rts
Unter2MenuFertig
	move.l  FileSpeicher(a5),a1         ;PrefsFile anfang
	moveq   #1,d4                       ;Eine Spalte
	bra.s   AltePrefsOhneSpalten
UnterMenuFertig
	tst.b   d4                          ;Spalten ?
	bne.s   JauEinSpalt                 ;JA
	addq    #1,d4                       ;Spalten Anzahl +1
	tst.b   d0                          ;keine Gadgets ?
	beq.s   JauEinSpalt                 ;JA
	move.w  d0,d1                       ;Gadgets Anzahl --> d1
	add.w   d1,d1                       ;d1*2 (GadgetNamen + Programm/Batch)
	addq    #1,d1                       ;d1+1
EndeVonMenu
	tst.b   -(a1)                       ;Suche NULL Byte (Ende einer Zeile)
	bne.s   EndeVonMenu
	subq    #1,d1                       ;Gefunden d1-1
	bne.s   EndeVonMenu
EinVorRueck
	lea     1(a1),a1                    ;Nächste Zeile
	cmp.b   #' ',(a1)                   ;Leerzeichen
	beq.s   EinVorRueck                 ;JA
AltePrefsOhneSpalten
	lea     BaM_SpaltenTitleText(a3),a0 ;SpaltenTitel --> in diesem Fall nicht
	move.l  a1,(a0)                     ;darum wird das SpalteOhneTitle Flag gesetzt
	move.b  #-1,SpalteOhneTitle(a5)     ;Spalte Ohne Titel
JauEinSpalt 
	bsr.w   Spalteninit                 ;Spalten Daten init
	tst.b   d7                          ;Zu viele Gadgets
	bne.w   MenuGadgetzuviel            ;Gadgets Anzahl wieder herstellen
	tst.b   SpalteOhneTitle(a5)         ;Spalte Ohne Titel
	beq.s   MenuIstVoll                 ;NEIN
	neg.b   d4                          ;SpaltenAnzahl wieder korrigieren
	move.b  #0,SpalteOhneTitle(a5)      ;Flag zurück setzen für nächstes Menu
MenuIstVoll
	lea     BaM_SpaltenAnzahl(a3),a4    ;Spalten Anzahl eintragen
	move.b  d4,(a4)
	lea     BaM_GadgetAnzahl(a3),a4     ;Gadgets Anzahl Insgesamt pro Menu eintragen
	move.w  d5,(a4)
	lea     BaM_SIZEOF(a3),a3           ;Nächstes Menu
	tst.l   (a3)                        ;vorhanden ?
	bne.w   NaechstesUnterM             ;JA
	rts
PrefsWerteError
	moveq   #37,d7                      ;37=Fehler im Einstellungsfile
	rts
;;
** Parameter
Parameter
	move.l  DOSBase(a5),a6      ;DOS Befehle
	lea     ParaTemplate(pc),a1 ;Parameter String
	move.l  a1,d1
	lea     PrefsLoadKey(a5),a1 ;Speicher für die 4 Parameter
	move.l  a1,d2
	moveq   #0,d3               ;rdargs keine
	jsr     _LVOReadArgs(a6)    ;Parameter einlesen und parsen
	move.l  d0,RDArgs(a5)       ;Resultat nach RDArgs
	bne.s   ParaOK              ;Parameter OK!
	jsr     _LVOIoErr(a6)       ;Error Routine
	move.l  d0,d1               ;Error Nr.
	moveq   #0,d2               ;keine Überschrift
	jsr     _LVOPrintFault(a6)  ;FehlerAusgabe im Con-Fenster
	moveq   #32,d7              ;32=falsche Parameter angabe
ParaOK
	rts
FreePara
	move.l  RDArgs(a5),d1       ;ReadArgs Resultat
	move.l  DOSBase(a5),a6      ;wieder Freigeben
	jsr     _LVOFreeArgs(a6)
	rts
;;
** Warte auf Caps Lock
WaitOnCaps
	tst.l   NOKEYArray(a5)          ;kein CAPS-Lock
	bne.s   NOKeyJA                 ;ja weiter
	move.l  4.w,a6                  ;EXECBase
	jsr     _LVOCreateMsgPort(a6)   ;Neuen Message Port init
	move.l  d0,MsgPortAddr(a5)      ;Addr. des Message Port
	bne.s   MsgPortOK               ;Message Port vorhanden
	moveq   #29,d7                  ;29=kein MsgPort
	rts
MsgPortOK
	move.l  d0,a0
	move.l  #IOSTD_SIZE,d0          ;normale IORequest-Struktur
	jsr     _LVOCreateIORequest(a6) ;Init IORequest
	move.l  d0,TastenIBlock(a5)     ;Addr. IORequest
	bne.s   OeffneDev               ;kein Fehler
	moveq   #30,d7                  ;30=konnte kein IORequest init
	bra.s   FreiMsgP
OeffneDev
	lea     inputname(pc),a0        ;input.device
	move.l  d0,a1                   ;IORequest Addr.
	moveq   #0,d0                   ;Unit 0
	move.l  #IOF_QUICK,d1           ;Flags
	jsr     _LVOOpenDevice(a6)      ;Öffnen des Input.device
	tst.l   d0                      ;Fehler ?
	beq.s   DevOK                   ;Nein
	moveq   #31,d7                  ;31=konnte Device nicht öffnen
	bra.s   IOReqDel
DevOK
	move.l  TastenIBlock(a5),a0     ;IORequest Struktur
	move.l  IO_DEVICE(a0),a6        ;Device Node name
	jsr     _LVOPeekQualifier(a6)   ;Tastaturstatus
	move.w  d0,d1                   ;d1=InputEvent-Struktur
	and.w   #IEQUALIFIER_LEFTBUTTON,d1 ;Bit Maske für Linken Mouse Knopf
	cmp.w   #IEQUALIFIER_LEFTBUTTON,d1 ;gleich Linke Mouse Knopf
	beq.s   CAPSgedrueckt
	and.w   #IEQUALIFIER_CAPSLOCK,d0 ;Bit Maske für CAPSLock
	cmp.w   #IEQUALIFIER_CAPSLOCK,d0 ;CAPSLock gedrückt
	beq.s   CAPSgedrueckt            ;JA
	moveq   #10,d7                  ;Beenden
CAPSgedrueckt
	move.l  4.w,a6                  ;EXECBase
	lea     TastenIBlock(a5),a1     ;IORequest
	jsr     _LVOCloseDevice(a6)     ;SchliesseDevice
IOReqDel
	move.l  TastenIBlock(a5),a0     ;IORequest
	jsr     _LVODeleteIORequest(a6) ;Gib Speicher Frei
FreiMsgP
	move.l  MsgPortAddr(a5),a0      ;Message Struktur
	jsr     _LVODeleteMsgPort(a6)   ;Gib Message Struktur frei
NOKeyJA
	rts
;;
** GadAktivieren
GadAktivieren
	move.l  GadgetAddr(a5),a3   ;GadgetList Addr
	lea     GadgetPage(a5),a4   ;Gadget Anfang einer Seite
	lea     (a4,d5.w),a4        ;welches Menu
	move.l  (a4),a4
	move.l  (a4),a4
	moveq   #1,d6               ;Aktiviere
	bsr.w   SelGK               ;Setze Gadget
	lea     GadgetPage(a5),a4   ;Gadget Anfang einer Seite
	lea     (a4,d5.w),a4
	move.l  (a4),a4
	move.l  a4,AnGad(a5)        ;Angewählte Gadget Addr.
	rts
;;
** InitRelative
InitRelative
	lea     topazFName8(pc),a0      ;FontName Addr.
	lea     topaz8(pc),a1           ;TextAttr-Struktur
	move.l  a0,(a1)                 ;Init Addr. in der Struktur
	move.l  a1,FontAddr(a5)         ;Varibale für TextAttr-Struktur
	rts
;;
** MessageAbFragen  MsgVerarbeitung Sprung
MessageAbFragen
	move.l  WindowHandle(a5),a0    ;a0=FensterAddr.
	move.l  wd_UserPort(a0),a0     ;a0=Fenster UserPort
	move.l  4.w,a6                 ;a6=EXECBase
	jsr     _LVOWaitPort(a6)       ;Auf Nachricht warten für das Fenster
nocheine
	move.l  GADBase(a5),a6         ;a6=GadTools Base
	move.l  WindowHandle(a5),a0    ;a0=FensterAddr.
	move.l  wd_UserPort(a0),a0     ;a0=Fenster UserPort
	jsr     _LVOGT_GetIMsg(a6)     ;Hole Nachricht
	move.l  d0,a1                  ;a1=Nachricht
	tst.l   d0                     ;keine Nachricht mehr da?
	beq.s   MessageAbFragen        ;JA
	move.w  im_Qualifier(a1),d2    ;d2=Qualifier Tasten
	move.l  im_Class(a1),d3        ;d3=Nachrichten Klasse
	move.w  im_Code(a1),d4         ;d4=Nachrichten Code
	move.l  im_IAddress(a1),a4     ;a4=Addresse
	jsr     _LVOGT_ReplyIMsg(a6)   ;Antwort
	cmpi.l  #IDCMP_CLOSEWINDOW,d3  ;Fenster schliessen
	beq.w   ende                   ;dann ende
	cmpi.l  #IDCMP_REFRESHWINDOW,d3 ;Fenster neu zeichen
	beq.w   RefreWin
	cmpi.l  #IDCMP_GADGETUP,d3     ;Gadget losgelassen
	beq.w   GadAuswertung
	cmpi.l  #IDCMP_VANILLAKEY,d3   ;normaler Tasten druck
	beq.w   VanTaste
	cmpi.l  #IDCMP_RAWKEY,d3       ;Spezial Tasten
	beq.w   RAWTaste
	cmp.l   #IDCMP_MENUPICK,d3     ;Menu
	beq.s   MenuAuswertung
	bra.s   nocheine
** MenuAuswertung
MenuAuswertung
	cmpi.w  #MENUNULL,d4           ;kein Menu aus gewählt
	beq.b   nocheine
	cmp.w   #$F800,d4              ;Über
	beq.w   About
	cmp.w   #$F820,d4              ;Beeenden
	beq.w   ende
	moveq   #0,d6
	sub.w   #$F801,d4              ;d4=vielfaches von 20
MenuErmittelLoop
	tst.w   d4                     ;d4=0?
	beq.s   MenuWeiterWert         ;JA
	sub.w   #$20,d4                ;d4-20
	addq    #1,d6                  ;d6=Menuzähler
	bra.s   MenuErmittelLoop
MenuWeiterWert
	cmp.b   MenuAnGe(a5),d6        ;Angewähltes Menu=d6
	beq.w   nocheine               ;JA
	bsr.w   ReGadList              ;Entferne Gadget Liste
	bsr.w   RemoveGadget           ;gebe Gadget speicher frei
	move.b  d6,MenuAnGe(a5)        ;neues Angewähltes Menu
	move.w  HoeheWin(a5),AlteHoeheWin(a5) ;Alte Fenster Höhe
	move.w  BreiteWin(a5),AlteBreiteWin(a5) ;Alte Fenster Breite
	bsr.w   InitGadget             ;Gadget erschaffen
	tst.b   d7                     ;Fehler
	beq.s   NeuMenuGadgetOK        ;Nein
	rts
NeuMenuGadgetOK 
	moveq   #0,d5
	move.w  d5,AnPage(a5)         ;erste Seite ist angewählt
	move.w  AlteHoeheWin(a5),d0   ;d0=alte Fenter Höhe
	cmp.w   HoeheWin(a5),d0       ;vergleiche mit jetziger Fenster Höhe
	bls.s   VergroesserWin        ;Verändere Fenster
	move.w  AlteBreiteWin(a5),d0  ;d0=alte Fenter Breite
	cmp.w   BreiteWin(a5),d0      ;vergleiche mit jetziger Fenster Breite
	bgt.s   keinVergroessern      ;Fenster nicht verändern
VergroesserWin
	move.l  WindowHandle(a5),a0   ;a0=Fenster Addr.
	move.w  BreiteWin(a5),d0      ;d0=FensterBreite
	sub.w   AlteBreiteWin(a5),d0  ;d0-alte FensterBreite
	lsr.w   #1,d0                 ;d0/2
	neg.w   d0                    ;-d0
	move.w  HoeheWin(a5),d1       ;d1=FensterHöhe
	sub.w   AlteHoeheWin(a5),d1   ;d1-alte FensterHöhe
	lsr.w   #1,d1                 ;d1/2
	neg.w   d1                    ;-d1
	move.l  INTUIBase(a5),a6      ;a6=Intuition Base
	jsr     _LVOMoveWindow(a6)    ;Verschiebe Fenster
	move.l  WindowHandle(a5),a0   ;a0=Fenster Addr.
	move.w  BreiteWin(a5),d0      ;d0=FensterBreite
	sub.w   AlteBreiteWin(a5),d0  ;d0-alte FensterBreite
	move.w  HoeheWin(a5),d1       ;d1=FensterHöhe
	sub.w   AlteHoeheWin(a5),d1   ;d1-alte FensterHöhe
	jsr     _LVOSizeWindow(a6)    ;Vergrößere Fenster
keinVergroessern
	bsr.w   AddGadList            ;GadgetListe anfügen
	bsr.w   PrintIUnter           ;Text Ausgeben
	bsr.w   GadAktivieren         ;erstes Gadget aktivieren
	bra.w   nocheine
;;
** About
About
	move.l  WindowHandle(a5),a0     ;a0=Fenster Addr.
	lea     AbReqTi(pc),a2          ;a2=RequesterTitel
	lea     AbReqTxt(pc),a3         ;a3=RequesterText
	lea     AbGadTxt(pc),a4         ;a4=RequesterGadgetText
	lea     EndeReq(pc),a1          ;a1=EasyRequesterStruktur
	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        ;a6=Intuition Base
	jsr     _LVOEasyRequestArgs(a6) ;Requester aufrufen
	bra.w   nocheine
;;
** RefreWin
RefreWin
	bsr.w   RefreshWin ;Fenster Neuzeichen
	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         ;Return
	beq.s   Auswahl
	cmp.b   #$1b,d4         ;Esc
	beq.w   ende
	cmp.b   #'<',d4         ;vorige Seite
	beq.s   PfeilLinks
	cmp.b   #'>',d4         ;nächste Seite
	beq.s   PfeilRechts
	bclr    #5,d4           ;bit 5 löschen Groß und Kleinschreibung gleich
	cmp.b   #'Q',d4         ;q/Q
	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    ;a4=Angewählte GadgetAddr.
	move.l  (a4),a4
	bra.s   GadExe
PfeilLinks
	tst.w   AnPage(a5)      ;erste Seite
	beq.w   nocheine        ;JA
	bra.w   PageLGAn
PfeilRechts
	bsr.s   MenuDataInit    ;Daten zur jetzigen Seite heraussuchen
	moveq   #0,d0
	move.b  BaM_SeitenAnzahl(a4),d0 ;d0=Seiten Anzahl
	cmp.w   AnPage(a5),d0   ;vergleiche mit angewählter Seite
	beq.w   nocheine        ;letzte Seite
	bra.w   PageRGAn
MenuDataInit
	lea     MenuData(a5),a4 ;BangerMenu Struktur
	moveq   #0,d0
	moveq   #0,d1
	move.b  MenuAnGe(a5),d0 ;Angewähltes Menu
	move.w  #BaM_SIZEOF,d1  ;BangerMenu Struktur Größe
	mulu.w  d0,d1
	lea     (a4,d1.w),a4    ;BangerMenuData
	rts
;;
;;
** GadAuswertung
GadAuswertung
	lea     PageLAddr(a5),a0    ;a0=GadgetAddr. vorige Seiten Gadget
	move.w  AnPage(a5),d5       ;d5=Angewählte Seite
	lea     (a0,d5.w),a0
	move.l  (a0),a0
	cmp.l   a0,a4               ;vergleiche mit Addresse
	beq.w   PageLGAn            ;vorige Seite gewählt
	lea     PageRAddr(a5),a0    ;a0=GadgetAddr. nächste Seiten Gadget
	lea     (a0,d5.w),a0
	move.l  (a0),a0
	cmp.l   a0,a4               ;vergleiche mit Addresse
	beq.w   PageRGAn            ;nächste Seite gewählt
GadExe
	move.l  gg_UserData(a4),a1  ;a1=Addr. des GadgetNamen aus der Konfig
SucheAnfangExe
	tst.b   (a1)+               ;Suche Null Bye
	bne.s   SucheAnfangExe
	cmp.b   #' ',(a1)           ;Leerzeichen
	bne.s   keinLeerCom         ;keins
	lea     1(a1),a1            ;sonst ein weiter
keinLeerCom
	move.l  DOSBase(a5),a6      ;a6=DOS Base
	move.l  a1,a4               ;a4=Addr. des Auszuführenden Strings
ComCDTest
	move.b  (a1)+,d0            ;d0=ein Buchstabe
	tst.b   d0                  ;Null Byte?
	beq.s   ComEnde             ;JA
	cmp.b   #'[',d0             ;suche Klammer
	bne.s   ComCDTest           ;keine
	cmp.w   #'C]',(a1)          ;dannach C]
	bne.s   ComCDTest           ;Nein
	move.b  #0,-2(a1)           ;vor der Klammer mit NULL abschließen
	move.l  a4,d1               ;d1=Ausführbarer String
	jsr     _LVOFilePart(a6)    ;Filename suchen
	move.l  a4,d1               ;d1=Pfad
	move.l  d0,a4               ;a4=Filename
	move.b  #0,-1(a4)           ;Null Byte zwischen Pfad und Filenamen
	move.l  #ACCESS_READ,d2     ;d2=Lesend
	jsr     _LVOLock(a6)        ;Besetzen
	move.l  d0,ProgrammDir(a5)  ;Lock Addr. des Programm Dir
	move.l  d0,d1               ;d1=Lock Addr. des Programm Dir
	jsr     _LVOCurrentDir(a6)  ;wechseln des Verzeichnisses
	move.l  d0,AltesDir(a5)     ;Addr. des alten Verzeichnisses
ComEnde
	lea     AysnchOut(pc),a0    ;a0=AusgabeFenster Daten
	move.l  a0,d1               ;d1=Fenster
	move.l  #MODE_OLDFILE,d2    ;d2=AcessMode
	jsr     _LVOOpen(a6)        ;Fenster Öffnen
	lea     SystemExeTags(pc),a0 ;a0=SystemTags
	move.l  d0,4(a0)            ;FileHandle eintragen als SYS_input
	move.l  a0,d2               ;d2=Tags
	move.l  a4,d1               ;d1=Commando
	jsr     _LVOSystemTagList(a6) ;Commando ausführen
	move.l  AltesDir(a5),d1     ;d1=altes Verzeichnis
	tst.l   d1                  ;Überhaupt vorhanden
	beq.s   KeinVerzWechsle     ;NEIN
	jsr     _LVOCurrentDir(a6)  ;wechsel zum alten Verzeichnis
	move.l  ProgrammDir(a5),d1  ;d1=Programm Dir
	jsr     _LVOUnLock(a6)      ;wieder freigeben
KeinVerzWechsle
	moveq   #10,d7              ;10=Startup warn Meldung
	rts
;;
** TastenAuswertung
UpTaste
	move.l  AnGad(a5),a4             ;a4=Angewähltes Gadget
	move.w  AnPage(a5),d5            ;d5=Angewählte Seite
	lea     GadgetPage(a5),a3        ;a3=GadgetListe Addr. abhängig von der Seite
	lea     (a3,d5.w),a3
	move.l  (a3),a3
	cmp.l   a3,a4                    ;vergleiche
	beq.w   DownShift                ;erstes Gadget der Seite
	lea     -4(a4),a3                ;a3=voriges Gadget
	bra.s   GadAnwaehlen             ;und anwählen
DownTaste
	move.l  AnGad(a5),a4             ;a4=Angewähltes Gadget
	move.w  AnPage(a5),d5            ;d5=Angewählte Seite
	lea     4(a4),a3                 ;a3=nächstes Gadget
	cmp.l   #0,(a3)                  ;keins mehr?
	beq.w   UpShift                  ;JA
GadAnwaehlen
	move.l  (a4),a4                  ;Addr. Angewähltes Gadget
	moveq   #0,d6                    ;d6=nicht aktive
	bsr.w   SelGK                    ;Gadget bearbeiten
	moveq   #1,d6                    ;d6=aktive
	move.l  (a3),a4                  ;a4=jetzige Gadget
	bsr.w   SelGK                    ;Gadget bearbeiten
	move.l  a3,AnGad(a5)             ;neues angewähltes Gadget Addr.
	bra.w   nocheine
rechteBank
	bsr.w   NummerGad                ;Daten anlegen
	tst.w   NaechsteSPLaenge(a5)     ;Nächste Spalten Länge=0?
	beq.s   letztesGDAnw             ;Letztes Gadget anwählen
	move.w  NaechsteSPLaenge(a5),d0  ;d0=Nächste Spalten Länge
	move.w  RelativeGDPos(a5),d1     ;d1=Relative Gadget Position vom Anfang der Spalte
	tst.b   NaechsteSPSeiten(a5)     ;Nächste Spalte neue Seite?
	bne.s   NeueSeitebeiRechts       ;JA
	cmp.w   d0,d1                    ;vergleiche
	bgt.s   RechteSpalteKleiner      ;nächste Spalte kürzer
	move.w  JetztigeSPLaenge(a5),d0  ;d0=Jetzige Spalten länge
	add.w   d4,d0                    ;d4=Anzahl der Gadgets bis ausgewähltem
	bra.s   DieSelbigeSeite          ;d0=Anzahl der Gadgets bis Nächste Spalte
RechteSpalteKleiner
	add.w   d0,d4                    ;d4=Nächste Spalte irgendwo in der Mitter
	move.w  JetztigeSPLaenge(a5),d0  ;d0=Jetzige Spalten länge
	sub.w   d1,d0                    ;d0=Rest der jetzigen Spalte
	add.w   d4,d0                    ;d0=Am Ende der Nächsten Spalte
	bra.s   DieSelbigeSeite 
NeueSeitebeiRechts
	moveq   #4,d5                    ;d5=Nächste Seite
	cmp.w   d0,d1                    ;Nächste Spalte größer ?
	bgt.s   SpaltePasst              ;JA
	move.w  d1,d0                    ;d0=Nächste Spalten Länge
SpaltePasst
	bra.b   NeueSeite                ;Neu Seite init
letztesGDAnw
	move.w  JetztigeSeite(a5),d0     ;d0=Jetzige Seiten länge
DieSelbigeSeite
	subq    #1,d0                    ;d0=Gadget Anzahl vom Anfang bis zum angewähltem
DieSelbige2Seite    
	add.w   d0,d0                    ;*4
	add.w   d0,d0
	move.w  AnPage(a5),d5            ;d5=Angewählte Seite
	move.l  AnGad(a5),a4             ;a4=Angewähltes Gadget
	lea     GadgetPage(a5),a3        ;a3=GadgetList für die angebene Seite
	lea     (a3,d5.w),a3
	move.l  (a3),a3
	lea     (a3,d0.w),a3             ;a3=Addr. des anzuwählenden Gadgets
	bra.b   GadAnwaehlen
linkeBank
	bsr.w   NummerGad                ;Längen init
	tst.w   VorigeSPLaenge(a5)       ;Vorige Spalten Länge=0?
	beq.s   erstesGDAnw              ;JA erstes Gadget anwählen
	tst.b   VorigeSPSeiten(a5)       ;Vorige Spalte neue Seite?
	bne.s   NeueSeitebeiLinks        ;JA
	move.w  VorigeSPLaenge(a5),d0    ;d0=Vorige Spalten Länge
	move.w  RelativeGDPos(a5),d1     ;d1=Relative Gadget Position vom Anfang der Spalte
	cmp.w   d0,d1                    ;Jetzige Spalte länger
	bhi.s   LinkeSpalteKleiner       ;Vorige Spalte kleiner
	sub.w   d0,d4                    ;d4=aktuelle Position-vorige Spalten länge
	move.w  d4,d0                    ;d0=neues Gadget
	bra.b   DieSelbigeSeite
LinkeSpalteKleiner
	move.w  d4,d0                    ;d0=aktuelle Position
	sub.w   d1,d0                    ;d0=aktuelle Position-relative Position
	bra.b   DieSelbigeSeite
erstesGDAnw
	moveq   #1,d0                    ;erstes Gadget
	bra.b   DieSelbigeSeite
NeueSeitebeiLinks
	moveq   #-4,d5                   ;vorige Seite
	move.w  VorigeSeitenLaenge(a5),d0 ;d0=Vorige Seiten Länge
	move.w  VorigeSPLaenge(a5),d1    ;d1=Vorige Spalten Länge
	move.w  RelativeGDPos(a5),d2     ;d2=relative Position
	cmp.w   d1,d2                    ;vorige Spalte kleiner als jetzige Position
	bgt.s   NeueSeite                ;JA
	sub.w   d1,d0
	add.w   d2,d0                    ;d0=neue Gadget Position
** NeueSeite
* d0 = Neues Angewähltes GadgetNr. relative zum Anfang
* d5 = Neue SeitenNummer
NeueSeite
	subq    #1,d0                    ;d0=GadgetAnzahl-1
NeueSeite2  
	add.w   AnPage(a5),d5            ;d5=Angewählte Seite
NeueSeite3
	move.l  AnGad(a5),a4             ;a4=Angewähltes Gadget
	cmp.b   #36,d5                   ;10. Seite
	bgt.w   nocheine                 ;JA
	move.w  d0,d7                    ;d7=neue Gadget Position
	move.l  (a4),a4                  ;a4=Gadget Addr.
	moveq   #0,d6                    ;d6=nichtangewählt
	bsr.w   SelGK                    ;Gadget Status setzen
	bsr.w   ReGadList                ;GadgetListe entfernen
	move.w  d5,AnPage(a5)            ;neue Seite
	bsr.w   AddGadList               ;GadgetListe hinzufügen
	add.w   d7,d7                    ;d7*4
	add.w   d7,d7
	lea     GadgetPage(a5),a3        ;a3=GadgetListe Addr.
	lea     (a3,d5.w),a3
	move.l  (a3),a3                  ;a3=Gadgets
	lea     (a3,d7.w),a3             ;a3=neues anzuwählendes Gadget
	moveq   #0,d7                    ;d7=0 (damit keine Fehler vorliegt)
	moveq   #1,d6                    ;d6=Gadget anwählen
	move.l  (a3),a4                  ;a4=GadgetAddr.
	bsr.w   SelGK                    ;Gadgetanwählen
	move.l  a3,AnGad(a5)             ;Angewähltes Gadget
	bsr.w   PrintIUnter              ;TextAusgabe
	bra.w   nocheine
;;
** NummerGad
NummerGad
	move.l  AnGad(a5),a4             ;a4=Angewähltes Gadget
	move.l  (a4),a3                  ;a3=Gadget Addr.
	move.w  gg_GadgetID(a3),d6       ;d6=GadgetID Nr.
	bsr.w   MenuDataInit             ;BangerMenuStruktur->a4
	lea     BaM_SpaltenLaenge(a4),a3 ;a3=SpaltenLängeAddr.
	lea     BaM_GadgetLaenge(a4),a2  ;a2=GadgetLängeAddr.
	moveq   #0,d5
	move.b  BaM_SpaltenAnzahl(a4),d5 ;d5=SpaltenAnzahl
	tst.b   d5                       ;Spalten Ohne Title ?
	bpl.s   keineUnsinnigeSpalte     ;Nein
	neg.b   d5
keineUnsinnigeSpalte
	subq    #1,d5                    ;d5=SpaltenAnzahl-1
	move.w  #0,VorigeSPLaenge(a5)    ;VorigeSpaltenLänge
	moveq   #0,d0
	moveq   #20,d2                   ;d2=Breite der Gadgets insgesamt
	move.w  d6,d4                    ;d4=GadgetID Nr.
	move.b  (a3),d0                  ;d0=SpaltenLänge
	move.w  d0,ErsteSPLaenge(a5)     ;ErsteSpaltenLänge
SpaltenHochZLoop
	bsr.w   SCBreiteBestimmen        ;GadgetLänge in Breite umwandeln
	cmp.w   SCBreite(a5),d2          ;mit ScreenBreite vergleichen
	bhi.w   SeiteNeuBeiSpalte        ;d2 höher neue Seite
	move.b  #0,VorigeSPSeiten(a5)    ;keine Neue Seite bei voriger Spalte
VorigeSeiteKoori
	sub.w   d0,d6                    ;d6=GadgetNr.-SpaltenLänge
	cmp.w   #1,d6                    ;vergleich mit 1
	blt.s   GadgetSpalteGef          ;Spalte gefunden wo Gadget sich befindet
	move.w  d0,VorigeSPLaenge(a5)    ;vorigeSpaltenLänge Koorigieren
	add.w   #20,d2                   ;d2=Breite der Gadget insgesamt
	dbra    d5,SpaltenHochZLoop      ;solange bis keine Spalten mehr vorhanden sind
GadgetSpalteGef
	add.w   #20,d2                   ;d2=Breite der Gadgets insgesamt
	move.w  d0,JetztigeSPLaenge(a5)  ;JetzigeSpaltenLänge
	add.w   d6,d0
	move.w  d0,RelativeGDPos(a5)
	tst.b   d5                       ;Noch Spalten vorhanden
	beq.s   keineSpaltenLaengen      ;Nein
	subq    #1,d5                    ;Spaltenanzahl koorigieren
	moveq   #0,d0
	bsr.s   SCBreiteBestimmen        ;GadgetLänge in Breite umwandeln
	move.w  d0,NaechsteSPLaenge(a5)  ;NächsteSpaltenLänge
	cmp.w   SCBreite(a5),d2          ;Neue Seite?
	bhi.s   SeiteNeuBeiNaechster     ;JA
	move.b  #0,NaechsteSPSeiten(a5)  ;keine Neue Seite bei nächster Seite
	subq    #1,d5                    ;Spaltenanzahl koorigieren
	bmi.s   Korri1KeineSpalten
NaechsteSeiteKoori
	add.w   #20,d2                   ;d2=GadgetBreite
	sub.w   d0,d6                    ;d6=negtive GadgetAnzahl
	bsr.s   SCBreiteBestimmen        ;GadgetLänge in Breite umwandeln
	cmp.w   SCBreite(a5),d2          ;Breiter als Screen ?
	bhi.s   SeiteNeuBei2Naechster    ;JA
	dbra    d5,NaechsteSeiteKoori    ;solange bis keine Spalten mehr da sind
Korri1KeineSpalten
	sub.w   d0,d6                    ;d6=negtive GadgetAnzahl
KorriKeineSpalten
	move.b  -(a3),d0                 ;d0=Letzte Spalten Länge
	move.w  d0,LetzteSPLaenge(a5)    ;Letzte Spalten Länge
SeiteRueckKorr
	neg.w   d6                       ;d6=GadgetAnzahl seit angewähltes Gadget
	add.w   d4,d6                    ;d6=GadgetAnzahl der Seite
	move.w  d6,JetztigeSeite(a5)     ;GadgetAnzahl der jetzigen Seite
	rts
keineSpaltenLaengen
	move.b  #0,NaechsteSPSeiten(a5)  ;Nächste Spalte neue Seite: Nein
	move.w  #0,NaechsteSPLaenge(a5)  ;NächsteSpaltenLänge=0
	bra.s   KorriKeineSpalten
SCBreiteBestimmen
	move.b  (a3)+,d0                 ;d0=SpaltenLänge
	moveq   #0,d1
	move.b  (a2)+,d1                 ;d1=GadgetLänge
GadgetLaengeBerechne
	asl.w   #3,d1                    ;d1*8 (Pixelgröße)
	add.w   #10,d1                   ;d1+10
	add.w   d1,d2                    ;d2=Breite bislang
	rts
SeiteNeuBeiSpalte
	moveq   #20,d2
	moveq   #0,d1
	move.b  -1(a2),d1                ;d1=GadgetLänge
	bsr.s   GadgetLaengeBerechne
	sub.w   d6,d4                    ;d4=VorigeGadgetAnzahl
	move.w  d4,VorigeSeitenLaenge(a5) ;VorigeGadgetAnzahl
	move.w  d6,d4                    ;d4=noch vorhandene Gadgets bis angewähltes
	move.b  #1,VorigeSPSeiten(a5)
	move.w  d0,ErsteSPLaenge(a5)     ;ErsteSpaltenLänge koorigieren
	bra.w   VorigeSeiteKoori
SeiteNeuBeiNaechster
	move.b  #1,NaechsteSPSeiten(a5)  ;Nächste Spalte neue Seite
SeiteNeuBei2Naechster
	move.b  -2(a3),d0                ;d0=Letzte Spalten Länge
	move.w  d0,LetzteSPLaenge(a5)    ;Letzte Spalten Länge
	bra.s   SeiteRueckKorr
;;
** Auswertung PageLeft/PageRight Ctrl Shift
PageLGAn
	moveq   #-4,d5                   ;d5=vorige Seite
NeueSeiteLeft
	moveq   #0,d0                    ;erstes Gadget
	bra.w   NeueSeite2
PageRGAn
	moveq   #4,d5                    ;d5=nächste Seite
	bra.s   NeueSeiteLeft
rechtsCtrl
	bsr.w   MenuDataInit             ;BangerMenu Struktur init
	moveq   #0,d1
	move.b  BaM_SeitenAnzahl(a4),d1  ;Seiten Anzahl
	tst.b   d1                       ;nur eine Seite?
	beq.w   letztesGDAnw             ;JA
	cmp.w   AnPage(a5),d1            ;Angewählte Seite=letzte Seite?
	bne.s   PageRGAn                 ;Nein
	moveq   #0,d5                    ;erste Seite
	moveq   #0,d0                    ;erstes Gadget
	bra.w   NeueSeite3
linkeCtrl
	bsr.w   MenuDataInit             ;BangerMenu Struktur init
	tst.w   AnPage(a5)               ;Angewählte Seite=0
	bne.s   PageLGAn                 ;Nein
	moveq   #0,d0                    ;erstes Gadget
	moveq   #0,d5
	move.b  BaM_SeitenAnzahl(a4),d5  ;d5=letzte Seite
	tst.b   d5                       ;nur eine Seite?
	beq.w   DieSelbige2Seite         ;JA
	bra.w   NeueSeite3
UpShift
	bsr.w   NummerGad                ;Längen init
	move.w  RelativeGDPos(a5),d1     ;d1=Relative Gadget Position
	sub.w   d1,d4                    ;d4=Spalten Anfang
	move.w  d4,d0                    ;d0=Spalten Anfang
	bra.w   DieSelbige2Seite
DownShift
	bsr.w   NummerGad                ;Längen init
	move.w  JetztigeSPLaenge(a5),d0  ;d0=Jetzige Spalten Länge
	move.w  RelativeGDPos(a5),d1     ;d1=Relative Gadget Position
	sub.w   d1,d0                    ;d0=Rest der Spalte
	add.w   d4,d0                    ;d0=ende der Spalte
	bra.w   DieSelbigeSeite
linkeShift
	bsr.w   NummerGad                ;Längen init
	move.w  RelativeGDPos(a5),d0     ;d0=Relative Position
	move.w  ErsteSPLaenge(a5),d1     ;d1=Erste Spalten Länge
	cmp.w   d0,d1                    ;erste Spalte Länger?
	bgt.s   ShiftLinksPasst          ;JA
	move.w  d1,d0                    ;ende der ersten Spalte
ShiftLinksPasst
	bra.w   DieSelbigeSeite
rechtsShift
	bsr.w   NummerGad                ;Längen init
	move.w  JetztigeSeite(a5),d0     ;d0=Jetzige Seiten länge
	move.w  LetzteSPLaenge(a5),d1    ;d1=Letzte Spalten Länge
	sub.w   RelativeGDPos(a5),d1     ;d1=Relative Position abgezogen
	bmi.s   ShiftRechtsPasst         ;negative dann zu kurz
	sub.w   d1,d0                    ;d0=letzte Spalte
ShiftRechtsPasst
	bra.w   DieSelbigeSeite
;;
**SelGK Selektiert Gadget also ein oder aus
SelGK
	bsr.b   RemoveGSuche          ;Entferne Gadget
	tst.l   d6                    ;d6=0/1
	beq.s   DisSel                ;nicht aktivieren
	or.w    #GFLG_SELECTED,gg_Flags(a4) ;angewählt Flag setzen
	bra.s   NunSel
DisSel
	eor.w   #GFLG_SELECTED,gg_Flags(a4) ;nicht angewählt Flag setzen
NunSel
	bsr.b   AddGSuche             ;Gadget wieder einfügen
	rts
RemoveGSuche
	move.l  WindowHandle(a5),a0   ;a0=Fenster Addr.
	move.l  a4,a1                 ;a1=Gadget Addr.
	move.l  INTUIBase(a5),a6      ;a6=Intuition Base
	jsr     _LVORemoveGadget(a6)  ;Entferne Gadget
	rts
AddGSuche
	move.l  WindowHandle(a5),a0   ;a0=Fenster Addr.
	move.l  a4,a1                 ;a1=Gadget Addr.
	moveq   #-1,d0                ;d0=als letztes
	jsr     _LVOAddGadget(a6)     ;Gadget Einfügen
	move.l  a4,a0                 ;a0=Gadget Addr.
	move.l  WindowHandle(a5),a1   ;a1=Fenster Addr.
	suba.l  a2,a2                 ;a2=keine TAGS
	jsr     _LVORefreshGadgets(a6) ;Zeichne Gadget neu
	rts
ReGadList
	move.l  WindowHandle(a5),a0   ;a0=Fenster Addr.
	lea     GadgetListe(a5),a1    ;a1=Gadget Liste für alle 10 Seiten
	move.w  AnPage(a5),d4         ;d4=angewählte Seite
	lea     (a1,d4.w),a1
	move.l  (a1),a1
	moveq   #-1,d0                ;d0=alle
	move.l  INTUIBase(a5),a6      ;a6=Intuitions Base
	jsr     _LVORemoveGList(a6)   ;Entferne GadgetListe
	move.l  WinRPort(a5),a1       ;a1=Fenster RastPort
	moveq   #0,d0                 ;d0=Hintergrund Farbe
	move.l  GFXBase(a5),a6        ;a6=GFX Base
	jsr     _LVOSetAPen(a6)       ;Zeichenstift auf Hintergrundfarbe setzen
	move.l  WinRPort(a5),a1       ;a1=Fenster RastPort
	moveq   #2,d0                 ;d0=Linke Ecke
	moveq   #2,d1                 ;d1=Obere Ecke
	add.b   RelativeLeftC(a5),d0  ;+Relative Linke Koordinate
	add.b   RelativeTopC(a5),d1   ;+Relative Obere Koordinate
	move.w  BreiteWin(a5),d2      ;d2=Fenster Breite
	subq    #5,d2                 ;Fenster Breite-5
	move.w  HoeheWin(a5),d3       ;d3=Fenster Höhe
	subq    #5,d3                 ;Fenster Höhe-5
	jsr     _LVORectFill(a6)      ;Fülle Rechteck aus
	rts
AddGadList
	move.l  WindowHandle(a5),a0   ;a0=Fenster Addr.
	lea     GadgetListe(a5),a3    ;a3=Gadget Liste für alle 10 Seiten
	lea     (a3,d5.w),a3          ;d5=angewählte Seite
	move.l  (a3),a1               ;a1=GadgetListe
	moveq   #2,d0                 ;d0=ab 2. Position
	moveq   #-1,d1                ;d1=alle Gadgets
	suba.l  a2,a2                 ;a2=keine RequesterGadgets
	move.l  INTUIBase(a5),a6      ;a6=Intuition Base
	jsr     _LVOAddGList(a6)      ;Füge Gadgets hinzu
	move.l  (a3),a0               ;a0=GadgetListe
	move.l  WindowHandle(a5),a1   ;a1=Fenster Addr.
	suba.l  a2,a2                 ;a2=keine Requestergadgets
	moveq   #-1,d0                ;d0=alle Gadgets
	jsr     _LVORefreshGList(a6)  ;Zeichne GadgetListe neu
	bsr.s   RefreshWin            ;Zeichne Fenster neu
	rts
;;
;;
** Refresh Fenster
RefreshWin
	move.l  GADBase(a5),a6          ;GadTools Base
	move.l  WindowHandle(a5),a0     ;Fenster Addr.
	suba.l  a1,a1                   ;keine TAGS
	jsr     _LVOGT_RefreshWindow(a6) ;Neu Zeichnen des Fenster
	move.l  WindowHandle(a5),a0     ;Fenster Addr.
	jsr     _LVOGT_BeginRefresh(a6) ;Beginne mit dem Zeichnen
	move.l  WindowHandle(a5),a0     ;Fenster Addr.
	moveq   #DOSTRUE,d0
	jsr     _LVOGT_EndRefresh(a6)   ;Beende Zeichen
	rts 
;;
** Fenster Öffnen
FensterOeffne
	move.l  INTUIBase(a5),a6        ;Intuition Base
	lea     Fenster_Tags(pc),a1     ;Fenster Tags
	move.l  GadgetListe(a5),12(a1)  ;Gadget Liste
	move.l  ScreenHandle(a5),60(a1) ;Screen Addr.
	lea     WindowTitle(pc),a0      ;Fenster Titel
	move.l  a0,4(a1)
	lea     ScreenTitle(pc),a0      ;Screen Titel
	move.l  a0,20(a1)
	move.w  BreiteWin(a5),d0        ;Breite des Fensters
	move.w  d0,30(a1)
	sub.w   SCBreite(a5),d0         ;-Screen Breite
	neg.w   d0                      ;negieren
	asr.w   #1,d0                   ;/2
	move.w  d0,54(a1)
	move.w  HoeheWin(a5),d4         ;Höhe Fenster
	move.w  d4,38(a1)
	move.w  SCHoehe(a5),d0          ;Screen Höhe
	add.w   #50,d0                  ;+50
	sub.w   d4,d0                   ;Höhe Fenster - Screen Höhe
	asr.w   #1,d0                   ;/2
	move.w  d0,46(a1)
	suba.l  a0,a0                   ;keine NewFenster Struktur
	jsr     _LVOOpenWindowTagList(a6) ;Fenster Öffnen
	move.l  d0,WindowHandle(a5)     ;Fenster Addr.
	beq.b   ErrorWindow             ;Fehler ?
	move.l  d0,a0
	move.l  wd_RPort(a0),WinRPort(a5) ;Window RasrPort Addr.
	move.l  4.w,a6                  ;EXECBase
	suba.l  a1,a1                   ;eigenen Task finden
	jsr     _LVOFindTask(a6)        ;Finde Task
	move.l  d0,meinTask(a5)         ;Task Addr.
	beq.s   ErrorTask               ;Fehler
	move.l  d0,a0
	move.l  pr_WindowPtr(a0),alterTask(a5) ;Alten Task sichern
	move.l  WindowHandle(a5),pr_WindowPtr(a0) ;eigenes Fenster einsetzen
	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         ;Task Addr.
	move.l  alterTask(a5),pr_WindowPtr(a0) ;wieder alten Task einsetzen
keinTask
	move.l  INTUIBase(a5),a6        ;Intuition Base
	move.l  WindowHandle(a5),a0     ;Fenster Addr.
	jsr     _LVOCloseWindow(a6)     ;Schliesse Fenster
	rts 
;;
** GadgetListeInit
* d0=WelcheSeite
* a3=GadgetAddr
*    a0=Pointer für CreateGadget
GadgetListeInit
	lea     PrintPage(a5),a1            ;Text Ausgabe Data für welche Seite
	move.l  PrintMarkTab(a5),(a1,d0.w)  ;TextMarke
	lea     GadgetPage(a5),a1           ;Gadget Liste für welche Seite
	move.l  a3,(a1,d0.w)                ;GadgetAddr
	lea     GadgetListe(a5),a0          ;GadgetList für welche Seite
	lea     (a0,d0.w),a0
	move.l  GADBase(a5),a6
	jsr     _LVOCreateContext(a6)       ;Erschaffe Gadget Grundgerüst
	move.l  d0,a0
	beq.w   ErrorGadget                 ;Fehler ?
	rts
;;
** InitGadget
InitGadget
	lea     PrintData(a5),a1            ;Spalten Text Data
	move.l  a1,PrintMarkTab(a5)         ;Text Marke
	moveq   #it_SIZEOF*5,d0
LoescheTextData
	move.l  #0,(a1)+                    ;Lösche Speicher
	dbra    d0,LoescheTextData
	move.b  #0,SpalteOhneTitle(a5)
	bsr.w   MenuDataInit                ;MenuDaten holen
	moveq   #0,d6
	move.b  #0,BaM_SeitenAnzahl(a4)     ;Seiten Anzahl = 0
	move.b  BaM_SpaltenAnzahl(a4),d6    ;Spalten Anzahl --> d6
	tst.b   d6
	bpl.s   NormalSpaltenMitTitle       ;d6 positive --> Spalte mit Title
	neg.b   d6                          ;jetzt richtige Spaltenanzahl
	move.b  #1,SpalteOhneTitle(a5)      ;Erkennung Spalte ohne Title
NormalSpaltenMitTitle
	subq    #1,d6
	lea     GadgetAddr(a5),a3           ;GadgetAddrListe
	moveq   #0,d0                       ;Seite 0
	bsr.s   GadgetListeInit             ;Erste Seite Init
	moveq   #0,d3
SpaltenLoop
* a0=GadgetCreatepointer
* a3=GadgetAddressen 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    ;Spalten Anzahl
	tst.b   d0                          ;positive
	bpl.s   NormalSpalten2MitTitle      ;JA
	neg.b   d0                          ;sonst 1 Spalte
NormalSpalten2MitTitle
	sub.b   d6,d0
	subq    #1,d0
	lea     BaM_SpaltenLaenge(a4),a1    ;Addr. Spalten Länge
	lea     (a1,d0.w),a1
	moveq   #0,d5
	move.b  (a1),d5                     ;Spalten Länge-->d5
	move.w  d5,d2                       ;d2=Spalten Länge
	moveq   #10,d1
	mulu.w  d1,d2                       ;GadgetHöhe=10 * Länge
	add.w   #60,d2                      ;+60
	cmp.w   HoeheWin(a5),d2             ;vergleiche Höhe Fenster
	bls.s   WinGroesseBeh               ;Fenster ist kleiner
	move.w  d2,HoeheWin(a5)             ;Fenster verkleinern
WinGroesseBeh
	tst.b   d5                          ;Gadgets vorhanden ?
	beq.w   COLOhne                     ;keine
	subq    #1,d5
	lea     BaM_GadgetLaenge(a4),a1     ;Addr. Gadgetlänge
	lea     (a1,d0.w),a1
	moveq   #0,d4
	move.b  (a1),d4                     ;Gadgetlänge
	asl.w   #3,d4                       ;*8
	add.w   #10,d4                      ;+10
	lea     UniGad(pc),a1               ;Universal NewGadget Struktur
	move.w  gng_LeftEdge(a1),d1         ;d1=LinkeEcke
	move.w  d4,gng_Width(a1)            ;Gadgetlänge-->Gadgetbreite
	add.w   d4,d1                       ;LinkeEcke+Gadgetbreite
	cmp.w   SCBreite(a5),d1             ;vergleiche Screenbreite
	bhi.w   NeueSeiteInit               ;größer Neue Seite
SeitenRueckkehr
	lea     BaM_SpaltenTitleText(a4),a1 ;Addr. SpaltenTitelText
	add.w   d0,d0                       ;*4 (long)
	add.w   d0,d0
	lea     (a1,d0.w),a1
	move.l  (a1),a1                     ;SpaltenTitelText
	tst.b   SpalteOhneTitle(a5)         ;Spalte keinen Titel ?
	bne.s   GSNameRichtig               ;JA
	bsr.w   TextInit                    ;Spalten Titel Text Init
	tst.b   d3
	beq.s   ErsterGadNameFind           ;GadgetName einstellen
	move.l  d3,a2                       ;a2=GadgetName
	cmp.b   #$20,-1(a2)                 ;Leerzeichen davor ?
	beq.s   TauscheReg                  ;JA
ErsterGadNameFind
	tst.b   (a1)+                       ;im Prefs Text suchen
	bne.s   ErsterGadNameFind           ;noch nicht ende
	lea     1(a1),a1                    ;ein Zeichen über Springen
GSNameRichtig
	move.l  a1,d3                       ;d3=Addr. GadgetName
TauscheReg
	exg     a4,d3                       ;a4=Addr. GadgetName
InitGadloop
* a0=GadgetCreatepointer
* a3=GadgetAddressen speicher
* a4=GadgetText (aus der Konfig)
* d3=BangerMenuStruct
* d5=GadgetAnzahl pro Spalte
* d6=Spalten Anzahl
	moveq   #BUTTON_KIND,d0         ;Gadget Type:Knopf
	lea     UniGad(pc),a1           ;Universal NewGadgetStruktur
	move.l  a4,gng_GadgetText(a1)   ;GadgetText eintragen
	add.w   #10,gng_TopEdge(a1)     ;ObereEcke+10
	add.w   #1,gng_GadgetID(a1)     ;GadgetID Nr. +1
	suba.l  a2,a2                   ;keine TAGS
	move.l  GADBase(a5),a6          ;Gadtools Base
	jsr     _LVOCreateGadgetA(a6)   ;Gadget erschaffen
	move.l  d0,(a3)+                ;Addr. in GadgetAddressenliste eintragen
	beq.w   ErrorGadget             ;Fehler
	move.l  d0,a0                   ;a0=Addr. für nächste Gadget Erschaffung
	move.l  a4,gg_UserData(a0)      ;Addr. des GadgetNamen aus der Konfig
	bsr.w   Return2Find             ;Nächster Gadget String
	dbra    d5,InitGadloop          ;Alle Gadgets aus der Spalte
	lea     UniGad(pc),a1           ;Universal NewGadget Struktur
	move.w  #20,gng_TopEdge(a1)     ;ObereEcke=20
	move.b  RelativeTopC(a5),d0     ;Relative Obere Koordinate
	add.b   d0,gng_TopEdge+1(a1)    ;hinzu addieren
	move.w  gng_Width(a1),d0        ;d0=Gadgetbreite
	add.w   d0,gng_LeftEdge(a1)     ;LinkeEcke+Gadgetbreite
	add.w   #20,gng_LeftEdge(a1)    ;+Abstand(20)
	exg     d3,a4                   ;d3=GadgetText a4=BangerMenuStruktur
COLOhne 
	dbra    d6,SpaltenLoop          ;bis alle Spalen abgearbeitet sind
	lea     UniGad(pc),a1           ;Universal GadgetStruktur
	move.w  gng_LeftEdge(a1),d1     ;d1=LinkeEcke
	move.w  #20,gng_LeftEdge(a1)    ;LinkeEcke+20
	move.b  RelativeLeftC(a5),d0    ;d0=Relative Linke Koordinate
	add.b   d0,gng_LeftEdge+1(a1)   ;LinkeEcke+Relative Linke Koordinate
	move.w  #0,gng_GadgetID(a1)     ;GadgetIDNr.=0
	cmp.w   BreiteWin(a5),d1        ;vergleiche Fenster Breite
	bls.s   WinBreite2Beh           ;FensterBreite kleiner
	move.w  d1,BreiteWin(a5)        ;neue Fensterbreite
WinBreite2Beh
	tst.b   BaM_SeitenAnzahl(a4)    ;SeitenAnzahl=0?
	beq.s   GadgetEndeInit          ;JA
	bsr.w   SeitenGadgetInit        ;Seitengadgets einrichten
GadgetEndeInit
	move.b  #0,ZweitePage(a5)       ;keine Zweite Seite
	move.l  #0,(a3)                 ;GadgetListe abschließen
	rts
;;
** TextInit
* a0=GadgetCreatepointer
* a1=Zeiger auf Col Title Text
* a3=GadgetAddressen 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)                  ;Register sichern
	move.w  d0,d4                           ;d4=Spalte
	lea     UniGad(pc),a2                   ;Univeral NewGadgetStruktur
	move.w  gng_LeftEdge(a2),d7             ;d7=Linke Ecke
	move.w  gng_Width(a2),d2                ;d2=Gadgetbreite
	move.l  PrintMarkTab(a5),a2             ;a2=Text Marke
	lea     it_SIZEOF(a2),a3                ;a3=Addr. Nächste IntuiTextStruktur
	move.l  a3,it_NextText(a2)              ;Nächste IntuiTextStruk eintragen
	move.l  #$02000100,(a3)                 ;Texte Attribute setzen
	move.w  #19,it_TopEdge(a3)              ;ObereEcke=19
	move.l  FontAddr(a5),it_ITextFont(a3)   ;Zeichensatz eintragen
	move.l  a1,it_IText(a3)                 ;TextString eintragen
	move.l  a1,a0                           ;a0=SpaltenTitelText
TextEndeLoop
	tst.b   (a1)+                           ;Suche Null Byte
	bne.s   TextEndeLoop
	sub.l   a0,a1
	move.l  a1,d0                           ;d0=TextLänge
	subq    #1,d0                           ;Textlänge-1
	lsl.w   #3,d0                           ;Textlänge*8 in Pixeln
	sub.w   d0,d2                           ;Gadgetbreite-Textlänge
	bmi.s   TextZuLang                      ;Textlänge zu lang
	lsr.w   #1,d2                           ;Restlänge/2
TextKorritur
	add.w   d2,d7                           ;d7=LinkeEcke+Restlänge
	move.b  RelativeLeftC(a5),d2            ;Relative Koordinate abziehen
	sub.w   d2,d7
	bpl.s   nichtFensterRand                ;Noch positive Koordinate
	moveq   #0,d7                           ;Ansonsten LinkeEcke=0
nichtFensterRand
	move.w  d7,it_LeftEdge(a3)              ;LinkeEcke eintragen
	move.l  a3,PrintMarkTab(a5)             ;Text Marker setzen
	movem.l (sp)+,a0-a4/d7                  ;Alte Register wiederherstellen
	rts
TextZuLang
	neg.w   d2                              ;d2=wieder positive Länge
	lsr.w   #1,d2                           ;Länge zu viel /2
	neg.w   d2                              ;d2=negative RestLänge
	tst.b   d4                              ;erste Spalte
	beq.s   TextKorritur                    ;JA
	sub.b   d4,TextUOFlag(a5)               ;Spalte-Text unter/ober Flag
	beq.s   TextKorritur                    ;gleich Null
	addq    #1,d4                           ;Nächste Spalte
	move.b  d4,TextUOFlag(a5)               ;Markiere Nächste Spalte
	sub.w   #10,it_TopEdge(a3)              ;ObereEcke-10
	bra.s   TextKorritur
;;
** NeueSeiteInit
* a0=GadgetCreatepointer
* a3=GadgetAddressen 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)               ;d0 sichern
	bsr.s   SeitenGadgetInit       ;SeitenGadgets einrichten
	tst.b   d7                     ;Fehler ?
	beq.s   SeitenGadgOK           ;Nein
	rts
SeitenGadgOK    
	lea     UniGad(pc),a1          ;a1=Universal GadgetStruktur
	move.w  gng_LeftEdge(a1),d0    ;d0=LinkeEcke
	cmp.w   BreiteWin(a5),d0       ;vergleiche mit Fensterbreite
	bls.s   WinBreiteBeh           ;größer
	move.w  d0,BreiteWin(a5)       ;neue Fensterbreite,da kleiner
WinBreiteBeh
	move.w  #20,gng_LeftEdge(a1)   ;LinkeEcke=20
	move.b  RelativeLeftC(a5),d0   ;d0=Relative Linke Koordinate
	add.b   d0,gng_LeftEdge+1(a1)  ;LinkeEcke+Relative Linke Koordinate
	move.l  #0,(a3)+               ;GadgetListe abschliessen
	add.b   #4,BaM_SeitenAnzahl(a4) ;SeitenAnzahl+4 (=1 neue Seite)
	move.l  PrintMarkTab(a5),a1    ;a1=TextMarker
	move.l  #0,it_NextText(a1)     ;keine weiteren Texte mehr
	lea     it_SIZEOF(a1),a1       ;a1=Nächste Freie IntuiTextStruktur
	move.l  a1,PrintMarkTab(a5)    ;neue TextMarke
	moveq   #0,d0
	move.b  BaM_SeitenAnzahl(a4),d0 ;d0=jetzige Seite
	bsr.w   GadgetListeInit        ;Addr. für neue Seite einrichten
	tst.b   d7                     ;Fehler
	beq.s   NeueGadListeOK         ;Nein
	rts
NeueGadListeOK  
	movem.l (sp)+,d0               ;d0 wieder hergestellt
	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 ;d4=SeitenAnzahl
	moveq   #BUTTON_KIND,d0         ;Gadget Typ:Knopf
	lea     PageGads(pc),a1         ;SeitenGadgetStruktur
	tst.b   ZweitePage(a5)          ;Ist das die Zeite Seite?
	beq.s   kein1Seite              ;NEIM
	lea     PaGadTags2(pc),a2       ;Gadget Wählbar Tags
	bra.s   doch1Seite
kein1Seite
	lea     PaGadTags(pc),a2        ;Gadget NichtWählbar Tags
doch1Seite
	jsr     _LVOCreateGadgetA(a6)   ;Gadgeterschaffen
	tst.l   d0                      ;Fehler
	beq.b   ErrorGadget             ;JA
	move.l  d0,a0                   ;a0=SeitenGadgetAddr.
	lea     PageLAddr(a5),a1        ;vorige SeitenGadgetAddr. Liste
	lea     (a1,d4.w),a1            ;für diese Seite eintragen
	move.l  d0,(a1)
	moveq   #BUTTON_KIND,d0         ;GadgetTyp:Knopf
	lea     Page2Gads(pc),a1        ;Nächste Seite Gadget Struktur
	tst.b   d6                      ;Noch eine Spalte in bearbeitung ?
	bmi.s   kein2Seite              ;NEIN
	cmp.b   #36,d4                  ;10. Seite ?
	beq.s   kein2Seite              ;keine Neue Seite mehr
	lea     PaGadTags2(pc),a2       ;Gadget Wählbar Tags
	bra.s   doch2Seite
kein2Seite
	lea     PaGadTags(pc),a2        ;Gadget NichtWählbar Tags
doch2Seite
	jsr     _LVOCreateGadgetA(a6)   ;Gadgeterschaffen
	tst.l   d0                      ;Fehler
	beq.b   ErrorGadget             ;JA
	move.l  d0,a0
	lea     PageRAddr(a5),a1        ;nächste SeitenGadgetAddr. Liste
	lea     (a1,d4.w),a1
	move.l  d0,(a1)
	move.b  #1,ZweitePage(a5)       ;ZweiteSeite vorhanden
	rts
;;
** ErrorGadget
ErrorGadget
	bsr.s   RemoveGadget        ;Entferne Gadgets
	moveq   #25,d7              ;25 = Gadget init Fehler
	rts
RemoveGadget
	move.l  GADBase(a5),a6      ;GadTools Base
	bsr.w   MenuDataInit        ;a4=BangerMenuData Struktur laden
	moveq   #0,d4
	move.b  BaM_SeitenAnzahl(a4),d4 ;d4=SeitenAnzahl
GadListeFLoop   
	lea     GadgetListe(a5),a0  ;GadgetListe der einzelnen Seiten
	lea     (a0,d4.w),a0
	move.l  (a0),a0
	jsr     _LVOFreeGadgets(a6) ;Freigeben
	subq    #4,d4               ;Vorige Seite
	bpl.s   GadListeFLoop       ;Noch eine Seite
	rts 
Return2Find
	tst.b   (a4)+            ;Null Byte suchen
	bne.s   Return2Find
Return1Mal
	tst.b   (a4)+            ;Nochmal Null Byte suchen
	bne.s   Return1Mal
	cmp.b   #$20,(a4)        ;Leerzeichen ?
	bne.s   AltesKonfigFile  ;Nein so lassen
	lea     1(a4),a4         ;noch ein Zeichen
AltesKonfigFile 
	rts
;;
** Speicher freigeben von den Einstellungen
SpeicherPrefs
	move.l  FileSpeicher(a5),a1 ;Prefs File Speicher
	move.l  Filegroesse(a5),d0  ;Prefs File größe
	move.l  4.w,a6              ;EXECBase
	jsr     _LVOFreeMem(a6)     ;Gebe Speicher Frei
	rts
;;
** Lade Einstellungen
LadePrefs
	move.l  PrefsLoadKey(a5),d1     ;PrefsFilename
	tst.l   d1                      ;vorhanden
	bne.s   EigenesPrefsFile        ;JA!
	lea     PrefsFile1(pc),a3       ;Sonst im eigenem Verzeichnis suchen
	move.l  a3,d1
EigenesPrefsFile
	move.l  #MODE_OLDFILE,d2        ;nur lesend
	move.l  DOSBase(a5),a6          ;DOS
	jsr     _LVOOpen(a6)            ;Öffne File
	move.l  d0,PrefsFileHandle(a5)  ;File Addr.
	bne.s   OpenPrefsFile           ;JA!
	lea     PrefsFileName(pc),a3    ;Suche im S: Verzeichnis
	move.l  a3,d1
	move.l  #MODE_OLDFILE,d2        ;nur lesend
	jsr     _LVOOpen(a6)            ;Öffne File
	move.l  d0,PrefsFileHandle(a5)  ;File Addr.
	beq.s   OpenFileError           ;NEIN!
OpenPrefsFile
	move.l  d0,d1                   ;File Addr.
	lea     FIB(a5),a3              ;FIB=FileInfoBlock Struktur
	move.l  a3,d2
	jsr     _LVOExamineFH(a6)       ;FileInfoBlock Struktur füllen
	move.l  fib_Size(a3),d0         ;Filegröße
	addq    #1,d0                   ;+1
	move.l  d0,Filegroesse(a5)      ;Filegröße
	cmp.l   #1,d0                   ;Vergleiche mit 1
	beq.s   nixPrefs                ;Prefs Leer
	tst.l   d0                      ;=0
	beq.s   nixPrefs                ;PrefsLeer
	move.l  #MEMF_PUBLIC!MEMF_CLEAR,d1 ;Speicher Type
	move.l  4.w,a6                  ;EXECBase
	jsr     _LVOAllocMem(a6)        ;Reserviere Speicher
	move.l  d0,FileSpeicher(a5)     ;File Speicher
	beq.s   ErrorFiSp               ;kein Speicher
	move.l  d0,a0                   ;File Speicher
	move.l  PrefsFileHandle(a5),d1  ;File Addr.
	move.l  a0,d2                   ;Buffer, wo das eingelesen wird
	move.l  Filegroesse(a5),d3      ;wieviel Bytes
	move.l  DOSBase(a5),a6          ;DOS
	jsr     _LVORead(a6)            ;File Lesen
SchliesseFile
	move.l  PrefsFileHandle(a5),d1  ;File Addr.
	move.l  DOSBase(a5),a6          ;DOS
	jsr     _LVOClose(a6)           ;File schliessen
	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               ;Intuition Vari.
	lea     intname(pc),a1      ;Intuition String
	bsr.s   OeffneLib           ;Routine OpenLibrary
	lea     dosname(pc),a1      ;Dos String
	bsr.s   OeffneLib
	lea     gadname(pc),a1      ;Gadtools String
	bsr.s   OeffneLib
	lea     gfxname(pc),a1      ;Graphics String
	bsr.s   OeffneLib
	rts
OeffneLib
	moveq   #37,d0              ;Ver. 37 (Kick 2.04)
	jsr     _LVOOpenLibrary(a6) ;Öffne Library
	move.l  d0,(a4)+            ;Addr. Speichern
	beq.s   LibError            ;Fehler ?
	rts
LibError
	moveq   #22,d7              ;22 = konnte Library nicht öffnen
	rts
LibSchliesse
	move.l  4.w,a6              ;ExecBase
	moveq   #4-1,d2             ;4 Libraries Schliessen
	lea     WindowHandle(a5),a4
SchliesseLib
	move.l  -(a4),a1            ;Angefangen mit GfxBase
	cmp.l   #0,a1               ;Addr. gleich 0
	beq.s   notOpened           ;Ja dann Lib war nicht geöffnet
	jsr     _LVOCloseLibrary(a6) ;Schliesse Library
notOpened
	dbra    d2,SchliesseLib     ;Solange bis alle 4 Libraries geschlossen
	rts
;;
** PubScreenOeffne
PubScreenOeffne
	tst.l   MonitorKey(a5)      ;MonitorTreiber
	beq.w   StdPal              ;Nein dann PAL
	tst.l   MoniID(a5)          ;MonitorID nr. vorhanden
	bne.s   IDistDa             ;ja
	moveq   #32,d7              ;32=fehlender Parameter
	rts
IDistDa
	move.l  MonitorKey(a5),d1   ;MonitorTreiber Name
	moveq   #0,d2               ;kein Input
	moveq   #0,d3               ;kein Output
	move.l  DOSBase(a5),a6      ;DOS Library Funktion
	jsr     _LVOExecute(a6)     ;Programm Ausführen
	tst.l   d0                  ;Programm OK ?
	bne.s   NeuenMonitor        ;JA
	moveq   #34,d7              ;34=konnte MonitorTreiber Datei nicht laden
	rts
NeuenMonitor
	move.l  MoniID(a5),a4       ;MonitorID Nr.
	move.l  (a4),d0
	move.l  GFXBase(a5),a6      ;Graphics Base Funktion
	jsr     _LVOFindDisplayInfo(a6) ;Finde DisplayInfoHandle zur IDNr.
	tst.l   d0                  ;Auflösung gefunden ?
	bne.s   MonitorDa           ;JA!
	moveq   #35,d7              ;35=Monitor mit angebenen ID nicht gefunden
	rts
MonitorDa
	move.l  4.w,a6              ;EXECBase
keinSignal
	moveq   #-1,d0              ;Irgenein freies Signal
	jsr     _LVOAllocSignal(a6) ;Besetze Signal
	move.b  d0,ScreenSignal(a5) ;SignalNr
	bmi.b   keinSignal          ;kein Siganlfrei warte
	lea     MyScreenTags(pc),a1 ;ScreenTags
	lea     PubScTitle(pc),a0   ;ScreenTitel eintragen
	move.l  a0,4(a1)
	move.l  MoniID(a5),a4       ;Auflösung eintragen
	move.l  (a4),12(a1)
	moveq   #0,d0
	move.b  ScreenSignal(a5),d0 ;ScreenSignal eintragen
	move.l  d0,20(a1)
	lea     PenArray(pc),a0     ;PenArray Struktur eintragen
	move.l  a0,28(a1)
	suba.l  a0,a0               ;kein NewScreen Struktur
	move.l  INTUIBase(a5),a6    ;Intuition Base Funktion
	jsr     _LVOOpenScreenTagList(a6) ;Öffne neuen Screen
	move.l  d0,ScreenHandle(a5) ;ScreenAddr.
	bne.s   Pubvorgucken        ;Screen OK!
	moveq   #36,d7              ;36=konnte Screen nicht öffnen
	rts
Pubvorgucken
	move.l  d0,a0               ;ScreenAddr.
	moveq   #0,d0               ;Public Screen
	jsr     _LVOPubScreenStatus(a6) ;Screen Status setzen
	move.w  d0,d1               ;erfolgreich ?
	beq.b   keinPubScreen       ;NEIN
	lea     PubScTitle(pc),a0   ;ScreenTitel
	bra.s   Pubgucken
StdPal
	suba.l  a0,a0               ;StartScreen (Workbench)
Pubgucken
	move.l  INTUIBase(a5),a6    ;Intuition Base Funktion
	jsr     _LVOLockPubScreen(a6) ;Lock Screen
	tst.l   d0                  ;Fehler ?
	beq.s   keinPubScreen       ;JA
	move.l  d0,ScreenHandle(a5) ;ScreenAddr.
	move.l  d0,a0
	move.w  sc_Height(a0),SCHoehe(a5) ;Screen Höhe
	move.w  sc_Width(a0),SCBreite(a5) ;Screen Breite
	sub.w   #20,SCBreite(a5)    ;Höhe-32
	sub.w   #50,SCHoehe(a5)     ;Breite-80
	move.l  sc_Font(a0),a1      ;FontAttr Struktur
	move.w  ta_YSize(a1),d2     ;Font Größe
	add.b   sc_WBorTop(a0),d2   ;+ ScreenTitleBorder Größe
	addq    #1,d2               ;+1
	move.b  d2,RelativeTopC(a5) ;Relative Ecke von Oben
	move.b  sc_WBorTop(a0),RelativeLeftC(a5) ;Relative Ecke von Links
	suba.l  a1,a1               ;keine Tags
	move.l  GADBase(a5),a6      ;GadTools Base Funktion
	jsr     _LVOGetVisualInfoA(a6) ;Besorge VisualInfo
	move.l  d0,VisualInfo(a5)   ;VisualInfo Addr.
	bne.s   VisualOK            ;OK!
keinPubScreen
	moveq   #23,d7              ;23=GetVisualInfo Fehler
VisualOK
	rts
ScreenSchliesse
	move.l  GADBase(a5),a6      ;GadTools Base Funktion
	move.l  VisualInfo(a5),a0   ;VisualInfo Addr.
	jsr     _LVOFreeVisualInfo(a6) ;Gebe VisualInfo frei
ScrSchliesse
	move.l  INTUIBase(a5),a6    ;Intuition Base Funktion
	suba.l  a0,a0               ;kein Name
	move.l  ScreenHandle(a5),a1 ;Screen Struktur
	jsr     _LVOUnlockPubScreen(a6) ;Unlock Screen
	cmp.b   #10,d7              ;BangerMenu führt Batchdatei aus
	beq.s   ScreenBleibt
	move.l  ScreenHandle(a5),a0 ;ScreenAddr.
	jsr     _LVOCloseScreen(a6) ;Schliesse Screen
ScreenBleibt
	rts
;;
** LONG Daten
SystemExeTags
		dc.l    SYS_Input,0
		dc.l    SYS_Output,0
		dc.l    SYS_Asynch,-1
		dc.l    SYS_UserShell,-1
		dc.l    TAG_DONE
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 'FN=PREFSFILENAME/K,MT=MONITORTREIBER/K,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
				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
				dc.b    'Homepage: demnächst',10,10
				dc.b    'Greeting all how sent me a EMail about BangerMenu',10
				dc.b    '        and all 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.3 (4-Sep-96) © by Andre´ Trettin',0
AysnchOut       dc.b    'CON:0/0/640/200/BangerMenu Ausgabe/auto/wait/close',0
;;
