;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 1.210 (30-Aug-95)

** INCLUDE Struktur Variablen
* Fehler Codes: 21=kein Speicher
*               22=konnte Library (oder Libraries) nicht öffnen
*               23=GetVisualInfo Fehler
*               24=konnte File S:Banger.Prefs nicht öffnen
*               25=bei der Gadgeterschaffung trat ein Fehler auf
*               26=konnte Fenster nicht öffnen oder Task nicht Finden
*               27=Einstellungen sind Leer
*               28=kein Speicher für die Einstellungen
*               29=kein MsgPort
*               30=konnte kein IORequest create
*               31=konnte Device nicht öffnen
*               32=falsche Parameter angabe
*               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/input_lib.i

    STRUCTURE Internal,0
    APTR    INTUIBase
    APTR    DOSBase
    APTR    GADBase
    APTR    WindowHandle
    APTR    OutputHandle
    APTR    ScreenHandle
    APTR    VisualInfo
    APTR    PrefsFileHandle
    APTR    FileSpeicher
    APTR    FontAddr
    APTR    GadgetListe
    APTR    meinTask
    APTR    alterTask
    APTR    AnGad
    APTR    MsgPortAddr
    APTR    RDArgs
    STRUCT  FIB,[fib_SIZEOF]
    STRUCT  GadgetAddr,[68*4]
    STRUCT  TastenIBlock,[IO_SIZE]
    LONG    Filegroesse
    LONG    NOKEYArray
    WORD    BreiteGADs
    WORD    BreiteWin
    WORD    CAPS
    BYTE    AnzahlGADs
    BYTE    RelativeTopC
    BYTE    RelativeLeftC
    LABEL   Int_SIZEOF
;;
** Hauptprog
    moveq   #0,d7
    move.l  4.w,a6
    move.l  #Int_SIZEOF,d0
    move.l  #MEMF_PUBLIC!MEMF_CLEAR,d1
    jsr     _LVOAllocMem(a6)
    move.l  d0,a5
    bne.s   LibraryO
    moveq   #21,d7           ;21 = kein Speicher
    bra.s   Ende
LibraryO
    bsr.w   InitRelative
    bsr.w   LibOeffne
    tst.w   d7
    bne.s   SchliesseLibrary
    bsr.s   Parameter
    tst.w   d7
    bne.s   SchliesseLibrary
    bsr.s   WaitOnCaps
    cmp.w   #10,d7
    bhi.s   SchliesseLibrary
    tst.w   d7
    beq.s   Menuerscheine
    moveq   #0,d7
    bra.s   SchliesseLibrary
Menuerscheine
    bsr.w   PubScreenOeffne
    tst.w   d7
    bne.s   SchliesseLibrary
    bsr.w   LadePrefs
    tst.w   d7
    bne.s   SchliesseScreen
    bsr.w   InitGadget
    tst.w   d7
    bne.s   FreiSPrefs
    bsr.w   FensterOeffne
    tst.w   d7
    bne.s   RemGad
    bsr.w   GadAktivieren
    bsr.w   RefreshWin
    bsr.w   MessageAbFragen
    bsr.w   FensterSchliesse
RemGad
    bsr.w   RemoveGadget
FreiSPrefs
    bsr.w   SpeicherPrefs
SchliesseScreen
    bsr.w   ScreenSchliesse
SchliesseLibrary
    bsr.w   LibSchliesse
    move.l  a5,a1
    move.l  #Int_SIZEOF,d0
    jsr     _LVOFreeMem(a6)
Ende
    move.l  d7,d0
ende
    rts
;;
** Parameter
Parameter
    move.l  DOSBase(a5),a6
    lea     ParaTemplate(pc),a1
    move.l  a1,d1
    lea     NOKEYArray(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
    rts
ParaOK
    move.l  RDArgs(a5),d1
    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),a4
    moveq   #1,d6
    bsr.w   SelGK
    lea     GadgetAddr(a5),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
;;
** Message Auswertung
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.l  im_Class(a1),d4
    move.w  im_Code(a1),d5
    move.l  im_IAddress(a1),a4
    jsr     _LVOGT_ReplyIMsg(a6)
    cmpi.l  #IDCMP_CLOSEWINDOW,d4
    beq.w   ende
    cmpi.l  #IDCMP_REFRESHWINDOW,d4
    beq.s   RefreWin
    cmpi.l  #IDCMP_GADGETUP,d4
    beq.w   GadAuswertung
    cmpi.l  #IDCMP_VANILLAKEY,d4
    beq.w   VTastendruck
    cmpi.l  #IDCMP_RAWKEY,d4
    beq.w   RTastendruck
    bra.s   nocheine
RefreWin
    bsr.w   RefreshWin
    bra.s   nocheine
UpTaste
    move.l  AnGad(a5),a4
    lea     GadgetAddr(a5),a3
    cmp.l   a3,a4
    beq.s   DownTEnde
    lea     -4(a4),a3
    bra.s   GadAnwaehlen
DownTaste
    move.l  AnGad(a5),a4
    lea     4(a4),a3
    cmp.l   #0,(a3)
    beq.s   DownTEnde
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
DownTEnde
    bra.w   nocheine
rechteBank
    bsr.s   NummerGad
    add.w   #17,d0
    cmp.b   AnzahlGADs(a5),d0
    bls.s   rechtsOK
    sub.b   AnzahlGADs(a5),d0
    neg.w   d0
    add.w   #17,d0
    bra.s   rechtsweiter
rechtsOK
    moveq   #17,d0
rechtsweiter
    asl.w   #2,d0
    lea     (a4,d0.w),a3            
    bra.s   GadAnwaehlen
NummerGad
    move.l  AnGad(a5),a4    
    move.l  (a4),a3
    move.w  gg_GadgetID(a3),d0
    rts
linkeBank
    bsr.s   NummerGad
    sub.w   #18,d0
    tst.w   d0
    bgt.s   linksOk
    moveq   #0,d0
linksOk
    asl.w   #2,d0
    lea     GadgetAddr(a5),a3
    lea     (a3,d0.w),a3                            
    bra.s   GadAnwaehlen
RTastendruck
    cmp.b   #$4e,d5         ;rechts
    beq.b   rechteBank
    cmp.b   #$4f,d5         ;links
    beq.s   linkeBank
    cmp.b   #$4d,d5         ;Down
    beq.w   DownTaste
    cmp.b   #$4c,d5         ;Up
    beq.w   UpTaste
    bra.w   nocheine
VTastendruck
    cmp.b   #$0d,d5
    beq.s   Auswahl
    cmp.b   #$1b,d5
    beq.w   ende
    bclr    #5,d5
    cmp.b   #'Q',d5
    beq.w   ende
    bra.w   nocheine
GetGAddr
    lea     GadgetAddr(a5),a4
FindeGAdd
    cmp.l   (a4)+,a3
    beq.s   RichtGAdd
    bra.s   FindeGAdd
RichtGAdd
    lea     -4(a4),a4
    move.l  a4,AnGad(a5)
    rts
SelGK
    move.l  WindowHandle(a5),a0
    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
    move.l  WindowHandle(a5),a0
    bsr.b   AddGSuche
    rts
RemoveGSuche
    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
Auswahl
    move.l  AnGad(a5),a4
    move.l  (a4),a4
GadAuswertung
    move.w  gg_GadgetID(a4),d6
    asl.b   #1,d6
    subq    #2,d6
    move.l  FileSpeicher(a5),a1
SucheExloop
    cmp.b   #0,(a1)+
    bne.s   SucheExloop
    dbra    d6,SucheExloop
    move.l  a1,d1
    moveq   #0,d2
    moveq   #0,d3
    move.l  DOSBase(a5),a6
    jsr     _LVOExecute(a6)
    moveq   #10,d7
    rts
;;
** 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)
    lea     WindowTitle(pc),a0
    move.l  a0,4(a1)
    lea     ScreenTitle(pc),a0
    move.l  a0,20(a1)
    move.w  BreiteGADs(a5),d0
    add.w   #40,d0
    move.w  d0,30(a1)
    sub.w   #640,d0
    neg.w   d0
    asr.w   #1,d0
    move.w  d0,54(a1)
    move.w  BreiteWin(a5),d4
    bne.s   BreiteresWin
    move.b  AnzahlGADs(a5),d4
BreiteresWin    
    move.w  d4,d6
    move.w  d6,d5
    add.w   d6,d5
    asl.w   #3,d4
    add.w   d5,d4
    add.w   #36,d4
    move.w  d4,38(a1)
    move.w  #252,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  4.w,a6
    suba.l  a1,a1
    jsr     _LVOFindTask(a6)
    move.l  d0,meinTask(a5)
    beq.s   ErrorTask
    move.l  d0,a0
    move.l  pr_WindowPtr(a0),alterTask(a5)
    move.l  WindowHandle(a5),pr_WindowPtr(a0)
    rts
ErrorTask
    bsr.s   keinTask
ErrorWindow
    moveq   #26,d7           ;26 = konnte Fenster nicht öffnen oder Task nicht finden
    rts
FensterSchliesse
    move.l  meinTask(a5),a0
    move.l  alterTask(a5),pr_WindowPtr(a0)
keinTask
    move.l  INTUIBase(a5),a6
    move.l  WindowHandle(a5),a0
    jsr     _LVOCloseWindow(a6)
    rts 
;;
** Init Gadgets
InitGadget
    move.l  ScreenHandle(a5),a0
    move.l  sc_Font(a0),a1
    move.w  ta_YSize(a1),d2
    add.b   sc_WBorTop(a0),d2
    addq    #1,d2
    move.b  d2,RelativeTopC(a5)
    move.b  sc_WBorTop(a0),RelativeLeftC(a5)
    move.l  FileSpeicher(a5),a1
    move.l  Filegroesse(a5),d0
    move.l  a1,a2
    add.l   d0,a2
    moveq   #0,d0
    moveq   #0,d1
    moveq   #0,d2
    moveq   #0,d3
Suchenloop
    addq    #1,d1
    move.b  (a1)+,d4
    bclr    #5,d4
    cmp.b   #'E',d4
    beq.s   VielleichtENDE
einReturn
    cmp.b   #10,-1(a1)
    bne.s   keinReturn
    move.b  #0,-1(a1)
    tst.b   d3
    beq.s   BreiteZaehlen
    moveq   #0,d3
    bra.s   wortkleiner
BreiteZaehlen
    moveq   #1,d3   
    addq    #1,d0
    cmp.b   d2,d1
    bls.s   wortkleiner
    move.b  d1,d2
wortkleiner
    moveq   #0,d1
keinReturn
    cmp.l   a1,a2
    beq.s   PrefsEnde
    bra.s   Suchenloop
VielleichtENDE
    move.b  (a1)+,d4
    bclr    #5,d4
    cmp.b   #'N',d4
    bne.s   einReturn
    move.b  (a1)+,d4
    bclr    #5,d4
    cmp.b   #'D',d4
    bne.s   einReturn
    move.b  (a1)+,d4
    bclr    #5,d4
    cmp.b   #'E',d4
    bne.s   einReturn
PrefsEnde
    tst.b   d0
    beq.w   PrefsNull
    move.b  d0,AnzahlGADs(a5)
    asl.w   #3,d2
    add.w   #10,d2
    move.w  d2,BreiteGADs(a5)
    lea     GadgetListe(a5),a0
    move.l  GADBase(a5),a6
    jsr     _LVOCreateContext(a6)
    move.l  d0,a0
    beq.w   ErrorGadget
    lea     UniGad(pc),a1
    move.b  RelativeTopC(a5),d2
    move.b  RelativeLeftC(a5),d3
    add.b   d2,gng_TopEdge+1(a1)
    add.b   d3,gng_LeftEdge+1(a1)
    move.w  BreiteGADs(a5),gng_Width(a1)
    move.l  VisualInfo(a5),gng_VisualInfo(a1)
    move.l  FontAddr(a5),gng_TextAttr(a1)
    move.l  FileSpeicher(a5),a4
    moveq   #0,d6
    move.b  AnzahlGADs(a5),d6
    subq    #1,d6
    lea     GadgetAddr(a5),a3
InitGadloop
    moveq   #BUTTON_KIND,d0
    lea     UniGad(pc),a1
    move.l  a4,gng_GadgetText(a1)
    bsr.s   Return2Find
    cmp.w   #180,gng_TopEdge(a1)
    bge.s   GadgetCorritur
GadgetCoOK      
    add.w   #10,gng_TopEdge(a1)
    add.w   #1,gng_GadgetID(a1)
    suba.l  a2,a2
    jsr     _LVOCreateGadgetA(a6)
    move.l  d0,(a3)+
    beq.s   ErrorGadget
    move.l  d0,a0
    dbra    d6,InitGadloop
    rts
GadgetCorritur
    clr.w   gng_TopEdge(a1)
    move.b  RelativeTopC(a5),d2
    add.b   d2,gng_TopEdge+1(a1)
    move.w  BreiteGADs(a5),d2
    add.w   #20,d2
    add.w   d2,BreiteGADs(a5)
    add.w   d2,gng_LeftEdge(a1)
    move.w  #17,BreiteWin(a5)      
    bra.s   GadgetCoOK                      
ErrorGadget
    bsr.s   RemoveGadget
    moveq   #25,d7           ;25 = Gadget init Fehler
    rts
RemoveGadget
    move.l  GADBase(a5),a6
    move.l  GadgetListe(a5),a0
    jsr     _LVOFreeGadgets(a6)
    rts 
Return2Find
    cmp.b   #0,(a4)+
    bne.s   Return2Find
Return1Mal
    cmp.b   #0,(a4)+
    bne.s   Return1Mal
    rts
PrefsNull
    moveq   #27,d7           ;27 = Prefs sind Null
    rts
;;
** Speicher freigeben von den Einstellungen
SpeicherPrefs
    move.l  FileSpeicher(a5),a1
    move.l  Filegroesse(a5),d0
    move.l  4.w,a6
    jsr     _LVOFreeMem(a6)
    rts
;;
** Lade Einstellungen
LadePrefs
    lea     PrefsFile1(pc),a3
    move.l  a3,d1
    move.l  #MODE_OLDFILE,d2
    move.l  DOSBase(a5),a6
    jsr     _LVOOpen(a6)
    move.l  d0,PrefsFileHandle(a5)
    bne.s   OpenPrefsFile
    lea     PrefsFileName(pc),a3
    move.l  a3,d1
    move.l  #MODE_OLDFILE,d2
    jsr     _LVOOpen(a6)
    move.l  d0,PrefsFileHandle(a5)
    beq.s   OpenFileError
OpenPrefsFile
    move.l  d0,d1
    lea     FIB(a5),a3
    move.l  a3,d2
    jsr     _LVOExamineFH(a6)
    move.l  fib_Size(a3),Filegroesse(a5)
    move.l  Filegroesse(a5),d0
    cmp.l   #1,d0
    beq.s   nixPrefs
    tst.l   d0
    beq.s   nixPrefs
    move.l  #MEMF_PUBLIC!MEMF_CLEAR,d1
    move.l  4.w,a6
    jsr     _LVOAllocMem(a6)
    move.l  d0,FileSpeicher(a5)
    beq.s   ErrorFiSp
    move.l  PrefsFileHandle(a5),d1
    move.l  d0,d2
    move.l  Filegroesse(a5),d3
    move.l  DOSBase(a5),a6
    jsr     _LVORead(a6)
SchliesseFile
    move.l  PrefsFileHandle(a5),d1
    jsr     _LVOClose(a6)
    rts
ErrorFiSp
    moveq   #28,d7           ;28 = kein Speicher für Prefs
    bra.s   SchliesseFile
OpenFileError
    moveq   #24,d7           ;24 = konnte File BangerMenu.prefs nicht öffnen
    rts
nixPrefs
    moveq   #27,d7           ;27 = Prefs vorhanden aber leer
    bra.s   SchliesseFile
;;
** Library Öffnen + Schliessen
LibOeffne
    move.l  a5,a4
    lea     intname(pc),a1
    bsr.s   OeffneLib
    lea     dosname(pc),a1
    bsr.s   OeffneLib
    lea     gadname(pc),a1
    bsr.s   OeffneLib
    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   #3-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
    move.l  INTUIBase(a5),a6
    suba.l  a0,a0
    jsr     _LVOLockPubScreen(a6)
    move.l  d0,ScreenHandle(a5)
    move.l  d0,a0
    suba.l  a1,a1
    move.l  GADBase(a5),a6
    jsr     _LVOGetVisualInfoA(a6)
    move.l  d0,VisualInfo(a5)
    beq.s   VisualError
    rts
VisualError
    moveq   #23,d7                  ;23 = GetVisualInfo Fehler
    bra.s   ScrSchliesse
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)
    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_IDCMP,IDCMP1!IDCMP2
        dc.l    WA_Flags,W_Flags1!W_Flags2
        dc.l    WA_NewLookMenus,-1
        dc.l    WA_AutoAdjust,-1
        dc.l    TAG_DONE
W_Flags1        equ     WFLG_ACTIVATE!WFLG_SMART_REFRESH
W_Flags2        equ     WFLG_DRAGBAR!WFLG_DEPTHGADGET!WFLG_CLOSEGADGET
IDCMP1          equ     BUTTONIDCMP!RAWKEY
IDCMP2          equ     IDCMP_CLOSEWINDOW!IDCMP_VANILLAKEY!IDCMP_REFRESHWINDOW
UniGad
        dc.w    20,0,0,10
        dc.l    0,0
        dc.w    0
        dc.l    PLACETEXT_IN,0,0 
topaz8:
        dc.l    0
        dc.w    8
        dc.b    0,1
;;
** BYTE Daten
ParaTemplate    dc.b 'NOKEY/S',0
intname         INTUITIONNAME
dosname         DOSNAME
gadname         GADTOOLSNAME
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    'Banger',0
                dc.b    '$VER: '
ScreenTitle     dc.b    'BangerMenu 1.210 (30-Aug-1995) © BY Andre´'
        dc.b    ' Trettin',10,0
;;
