;
start main       ; this defines the menu wich is shown automatically
                 ; at startup of the program.

;                this defines the screen colors used
;          +------------------ normattrib     , normal text
;          |    +------------- inversattrib   , active buttons and bars
;          |    |     +------- highlightattrib, enterstring
;          |    |     |    +-- frameattrib    , the frames around the window
colors (0x0f, 0x6f, 0x2f, 0x07)   ; standard set, black background
;colors (0x70, 0x0e, 0xf0, 0x3f)    ; light background, a little color
;colors (0x70, 0x0f, 0xf0, 0x7f)    ; light background, no color

; This is a comment (which I prefer)
# This also is a comment
! Last not least, this also is a comment
;
; You can chose any usual identifier for your strings, menus, actions...
; except the following keywords:
;
;     menu
;     image
;     action
;     show
;     waitkey
;     printxy
;     string
;     integer
;     start
;     call
;     goto
;     iftrue
;     iffalse
;     label
;     set
;     colors
;
; Also for the "call" action there is {currently) the following defined:
;
;     get_default_drive
;     sysinfo
;     getkey
;     enterstring
;     buttons
;     scrollbar
;     strcat
;     strprefix
;     stringequal
;     strcpyitem
;     printf
;     sprintf
;     sscanf
;     showfile
;     exit
;     system
;     rawrite
;     exec_loadlin
;
; Reserved for later:
;
;     check_loadlin
;
;

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@  DATA PART  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@



; some global strings

drive:            string    ; this will be asked from user
distribution:     string { "Deutsche Slackware 2.1.0" }
setuppath:        string { "/suse/setup" } ;here: my private test directory
chosenkernel:     string
bootmode:         string    ; "1" for loadlin, "2" for floppy (LILO)
bootpath:         string    ; prefix for the disk or zImage files

; some constant often used Texts
cancelmesg:       string { "Sie haben Die Installation abgebrochen" }


; some work string definitions
work1:            string
querystring:      string
errorstring:      string
answerstring:     string
filestr:          string
result_list:      string
menuselect:       string


; distribution definitions

bootmodes:        string {
  "Booten direkt von CD\n"
  "Booten mittels Boot/Root-Floppys\n"
}

bootmenus:        string {
  "z_kernels_main_help\n"
  "f_kernels_main_help"
}

bootdirs:        string {
  "/slack/images\n"
  "/disks"
}

;----------------------------------------------------------
; Dies ist die Liste der zImage-Kerne (LOADLIN).
; Ein Listeneintrag besteht aus drei Strings (Triple)
; Als Trennzeichen wird "\n" verwendet, die Liste wird mit
; "\0" (nicht sichtbar) abgeschlossen.
;
; Hinweise zur Bearbeitung:
;
; 1. Es ist darauf zu achten, das zwischen den Strings keine "\n"
;    verbleiben und darauf, dasz am vor dem letzen " ein Blank bleibt,
;    (der Text wird vor der Ausgabe "umgebrochen" )
; 2. Diese Liste (aus n*3 Teilstrings) darf theoretisch beliebig
;    lang sein ( Auswahl-menu "scrollt" ).
; 3. Die "\\path\\file" darf auch "/path/file" sein, das DOS kann das !
;    ( nur der COMMAND.COM nicht )
; 4. Zum Debuggen kann man in den action { } Bereichen prints einbauen
;    die auf den oberen oder unteren Rahmen schreiben, z.B;
;      printxy (0,0,answerstring)
;      printxy (0,25," yck bin as hier ")
; 5. Heap-Overflow ist zur Zeit noch nicht abgefangen, also bitte SETUP.EXE
;    nur starten wenn >200Kb DOS-Speicher verfuegbar. Der Speicher-Bedarf
;    ist wie (ueber den Daumen geschaetzt) folgt:
;      CODE, DATA, BSS  =  62 K
;      STACK            =   8 K
;      Menu-data        =  71 K ( haengt ab von SETUP.TXT )
;      Work-data        =   8 K ( haengt ab von den Benutzer-Eingaben )
;                       --------
;                         149 K
;
;

z_kernels:        string {
  "zBoot Kernel1\nhelp1\n/path1\n"
  "zBoot Kernel2\nhelp2\n/path2\n"
  "zBoot Kernel3\nhelp3\n/path3\n"
  "zBoot Kernel4\nhelp4\n/path4\n"
  "zBoot Kernel5\nhelp5\n/path5\n"
}

;----------------------------------------------------------
; Dies ist die Liste der Floppy-Kerne (LILO) aus der 11/94 CD
; Format siehe z_kernels.

f_kernels:        string {

  ;---
  "Standard Kernel mit SCSI\n"
    "Diese Diskette enthlt Support fr die normalen SCSI-Adapter. Sie untersttzt "
    "allerdings nur SCSI-CDROMs. Es sind drei Kernel vorhanden: Der erste "
    "enthlt sowohl alle Netzwerk-Treiber als auch Tapes und Busmuse (sccdall), "
    "der zweite nur Netzwerk-Treiber (sccdnet) und der dritte enthlt keine "
    "Netzwerk-Treiber (sccdstd).\n"
  "/scsi\n"


  ;---
  "Kernel ohne SCSI und Netz\n"
    "Diese Diskette enthlt weder SCSI- noch Netzwerk-Support. Es sind Kernel "
    "mit den drei gngigen CDROM-Treiber fr Mitsumi CDs (mitsumi), "
    "Soundblaster CD (sbcd) und Sony CDU31A (sony) enthalten.\n"
  "/noscsi\n"

  ;---
  "Mitsumi CDROM\n"
    "Diese Diskette enthlt Support fr die normalen SCSI-Adapter und das "
    "Mitsumi CDROM-Laufwerk. Es sind drei Kernel enthalten: Einer "
    "enthlt sowohl alle Netzwerk-Treiber als auch Tapes und Busmuse (mitsall), "
    "einer nur Netzwerk-Treiber (mitsnet) und einer keine "
    "Netzwerk-Treiber (mitsstd).\n"
  "/mitsumi\n"

  ;---
  "Sony CDU31A CDROM\n"
    "Diese Diskette enthlt Support fr die normalen SCSI-Adapter und das "
    "Sony CDROM-Laufwerk CDU31A. Es sind drei Kernel enthalten: Einer "
    "enthlt sowohl alle Netzwerk-Treiber als auch Tapes und Busmuse (sonyall), "
    "einer nur Netzwerk-Treiber (sonynet) und einer keine "
    "Netzwerk-Treiber (sonystd).\n"
  "/sony\n"


  ;---
  "Soundblaster CDROM\n"
    "Diese Diskette enthlt Support fr die normalen SCSI-Adapter und das "
    "CDROM-Laufwerk an Soundblaster-Karten. Es sind drei Kernel enthalten: Einer "
    "enthlt sowohl alle Netzwerk-Treiber als auch Tapes und Busmuse (sbcdall), "
    "einer nur Netzwerk-Treiber (sbcdnet) und einer keine "
    "Netzwerk-Treiber (sbcdstd).\n"
  "/sbcd\n"


  ;---
  "Kernel mit Linux 1.0.9\n"
    "Diese Diskette entht die alten aber stabilen Kernel der Version 1.0.9. "
    "Es werden die drei gngigen CDROM-Typen von Mitsumi, Soundblaster und "
    "Sony CDU31A untersttzt. "
    "Es sind drei Kernel enthalten: Einer "
    "enthlt sowohl alle Netzwerk-Treiber als auch Tapes und Busmuse (li109all), "
    "einer nur Netzwerk-Treiber (li109net) und einer keine "
    "Netzwerk-Treiber (li109std).\n"
  "/li109\n"


  ;---
  "Alpha SCSI-Treiber 1\n"
    "Diese Diskette enthlt drei Kernel mit ALPHA-SCSI-Treibern. "
    "Bootkernel mit Treiber fr SCSI-Chip NCR53C400 (53c400). "
    "Bootkernel mit Treiber fr SCSI-Chip NCR53C406 (53c406). "
    "Bootkernel mit SCSI-Treiber fr den Controller IN2000 (in2000).\n"
  "/al-scsi1\n"


  ;---
  "Alpha SCSI-Treiber 2\n"
    "Diese Diskette enthlt drei Kernel mit ALPHA-SCSI-Treibern. "
    "Bootkernel mit SCSI-Treiber fr den Adaptec ACB 40xx (acb40xx). "
    "Bootkernel mit SCSI-Treiber fr den Adaptec AHA 294x (aha294x). "
    "Bootkernel mit SCSI-Treiber DPT-EATA-Controller (dpteata).\n"
  "/al-scsi2\n"


  ;---
  "Alpha SCSI-Treiber 3\n"
    "Diese Diskette enthlt zwei Kernel mit ALPHA-SCSI-Treibern. "
    "Bootkernel mit SCSI-Treiber fr den Controller Always AL500 (al500). "
    "Bootkernel mit SCSI-Treiber fr den Controller IOMEGA PC2 (iompc2).\n"
  "/al-scsi3\n"


  ;---
  "Alpha CDROM-Treiber\n"
    "Diese Diskette enthlt drei Kernel mit ALPHA-CDROM-Treibern. "
    "Bootkernel mit CDROM-Treiber fr die Philips CDROMs CM205/225 (lmscd). "
    "Bootkernel mit CDROM-Treiber fr die Sony CDROMs 535/531 (sony535). "
    "Bootkernel mit CDROM-Treiber fr das NEC CDROM 260 (nec260).\n"
  "/al-cdrom\n"


  ;---
  "Alpha Disk und CDROM\n"
    "Diese Diskette enthlt drei Kernel mit ALPHA-Disk/CDROM-Treibern. "
    "Bootkernel mit Treiber fr CDROMs am IDE-Controller (ide201). "
    "Bootkernel mit Treiber fr PS/2 ESDI Platten (ps2esdi). "
    "Bootkernel mit CDROM-Treiber fr Panasonic CDROM 563B (pan563b).\n"
  "/al-disk\n"

}   ; ende f_kernels


;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@  MENU PART  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@



;===========================================================================

; Main window header line on top of screen

main: menu (0,0,80,3,0) {
  image {
    "Linux-CD Installations-Men             Copyright 1994,1995 S.u.S.E GmbH"
  }
  action {
    show ( main2 )
  }
}

; Main window body

main2: menu (0,2,80,25-2,1) {
  image {
    "CD-ROM Laufwerk:\n"
    "Distribution und Version:\n"
    "Bootmode:\n"
    "Ausgewhlter Kernel:\n"
  }
  action {

;TEST >>>>>>>>>>>>
    goto  skiptest
    show ( test_suite )
    waitkey()
    call exit("normal")
skiptest: label
;TEST <<<<<<<<<<<<<


    ; we are getting the default drive and print it on screen
    call get_default_drive(drive)
    printxy (40,4,drive)
    printxy (40,5,distribution)   ; kind of distribution

    ; Now we ask for the CDrom drive letter
    set querystring =
     "Geben Sie den Laufwerksbuchstaben des CD-ROM-Laufwerks ein, das die "
     "Linux-CD-ROM enthlt."
     "\n\nActuelles Laufwerk: "
    call strcat(querystring,drive)
    set answerstring = drive
    show ( enter_char )

    set drive = answerstring   ; and update it on screen
    call strcat(drive,":")
    printxy (40,4,drive)

    ;now update the pathes that we need later
    call strprefix(setuppath,drive)

    ; now we can show up our litle startup help file
    set filestr = setuppath
    call strcat( filestr,"/setup.hlp" )
    show ( showfile_menu )

    ; now we ask for kind of booting
    show ( loadlin_or_floppy_menu )
    printxy (40,6,answerstring)

    ; now we go to the appropriate menu-tree
    ; NOTE "menuselect" is set by loadlin_or_floppy_menu,
    ; so, it calls the menu accordingly to the users choice
    ;
    show ( menuselect )

    waitkey ()
  }
}

;===========================================================================

loadlin_or_floppy_menu: menu (6,3,80-2*6,25-2*3,0) {
  image {

; NOTE: the (hidden) line-feeds are part of the string !

"

Die Installation von Linux auf Ihrem Rechner wird mittels
Linux-Programmen unter Linux erfolgen.
Das Booten dieses 'Ur-Linux' kann  geschehen:

  A. Direkt mit LOADLIN von der CD.
  B. Indirekt durch Erstellen von Linux Boot-Disketten

Whlen Sie 'Loadlin', wenn Sie direkt booten mchten
oder 'Floppy', um die Linux Boot-Disketten zu erzeugen."

  }
  action {
    call buttons("Loadlin\nFloppy")
    iffalse exit(cancelmesg)
    set  bootmode = __lastresult__
    call strcpyitem(answerstring,bootmodes,bootmode)
    call strcpyitem(menuselect,bootmenus,bootmode)
    call strcpyitem(bootpath,bootdirs,bootmode)
    call strprefix(bootpath,drive)
  }
}

;===========================================================================

z_kernels_main_help: menu (40,7, 80-40-5, 25-8-8,0) {
  image {
    "S.u.S.E hat spezielle Kernel mit unterschiedlicher Treiberkombination "
    "generiert.\n\nWhlen Sie einen davon aus."
  }
  action {
    show ( z_kernels_help )
    ; Note we must do this HERE (and not in the scrollmenu
    ;
    call strcpyitem(answerstring,result_list,1) ; chosen kernel
    printxy (40,7,answerstring)                 ; --> main screen
    call strcpyitem(chosenkernel,result_list,3) ; remember the file name
    call strprefix(chosenkernel,bootpath)       ; prefix "which directory"
;    printxy (40,0,chosenkernel)
  }
}

z_kernels_help: menu (0,25-7, 80, 7, 1) {
  image { "" }
  action {
    show ( z_kernels_skroll )
  }
}


z_kernels_skroll: menu (5,7, 28,11, 0) {
  image { "" }
  action {
    ;       string-array[n][3]---v             v--- menu vor scroll-helps
    call scrollbar (result_list, z_kernels, 3, z_kernels_help)
    ;               ^----here the resulting array-item is copied
    iftrue goto weiter
    call exit( cancelmesg )

    weiter: label
  }
}

;===========================================================================

f_kernels_main_help: menu (40,7, 80-40-5, 25-8-8,0) {
  image {
    "Jede Boot-Diskette der Slackware- Distribution enthlt bis zu drei "
    "vorkonfigurierte Boot-Kernel.\n\nWhlen Sie eine davon aus."
  }
  action {
    show ( f_kernels_help )
    ; Note we must do this HERE (and not in the scrollmenu
    ;
    call strcpyitem(answerstring,result_list,1) ; chosen kernel
    printxy (40,7,answerstring)                 ; --> main screen
    call strcpyitem(chosenkernel,result_list,3) ; remember the file name
    call strprefix(chosenkernel,bootpath)       ; prefix "which directory"
;    printxy (40,0,chosenkernel)
  }
}

f_kernels_help: menu (0,25-7, 80, 7, 1) {
  image { "" }
  action {
    show ( f_kernels_skroll )
  }
}


f_kernels_skroll: menu (5,7, 28,11, 0) {
  image { "" }
  action {
    ;       string-array[n][3]---v             v--- menu vor scroll-helps
    call scrollbar (result_list, f_kernels, 3, f_kernels_help)
    ;               ^----here the resulting array-item is copied
    iftrue goto weiter
    call exit( cancelmesg )

    weiter: label
  }
}

xxxx: function {
  call printf("\ncccccccccccccccccc\n")
  waitkey()
}

;===========================================================================

showfile_menu: menu (6,3,80-2*6,25-2*3,0) {
  image { "" }
  action {
    call showfile(filestr)
    iftrue goto showfileok
    call sprintf(errorstring, "Die Datei %s kann nicht gefunden werden", filestr);
    show ( errfile_menu, "asdfasdfasdfasdfa", xxxx)
    goto ende

    showfileok: label
    call buttons(" Weiter ")
    iftrue goto ende
    call exit( cancelmesg )
    ende: label
  }
}

errfile_menu: menu (20,8,80-2*20,25-8-6,0) {
  image errorstring
  action {
    call buttons(" Weiter")
    iffalse exit(cancelmesg)
  }
}

;-----------------------------------------------------------------

enter_char: menu (20,8,80-2*20,25-8-6,0) {
  image querystring
  action {
    call getkey(answerstring,"abcdefghijklmnopqrstuvwxyz\r",1)
  }
}

;                                   v-- this switches the hardware cursor on
enter_string: menu (6,10, 80-2*6, 25-2*10,0,1) {
  image querystring
  action {
    ;    number of lines on bottom--v
    call enterstring (answerstring, 1)
    ;                 ^----to this inputted (or modified) result is copied
    ;                      (at input the contents of resultstring are
    ;                       offered to user to be modified )
    iffalse exit(cancelmesg)  ; exits if an empty string was entered
  }
}

DOShistory: string { "" }

exec_DOScomand: menu (6,10, 80-2*6, 25-2*10,0,1) {
  image {
    "Geben Sie den DOS-Befehl ein, den Sie ausfuehren moechten"
  }
  action {
    set answerstring = ""
    call enterstring (answerstring, 1,DOShistory)
    ;                 ^----to this inputted (or modified) result is copied
    ;                      (at input the contents of resultstring are
    ;                       offered to user to be modified )
    iffalse exit(cancelmesg)  ; exits if an empty string was entered
    call sprintf(DOShistory,"%s\n%s",DOShistory,answerstring);
    call system(answerstring)
  }
}

t1_: string
t2_: string
t3_: string

testfunc: function {
    call sysinfo(t1_)
    call printf("%s",t1_)
}
;
test_suite: menu (10,5,40,25-5-5,0,1) {
  image querystring
  action {
     call testfunc()  ; NOTE: a function defined in the menu, not a builtin


;    call sysinfo(t1_)
;    call printf("%s",t1_)

;      set t1_ = "  10  12 24"
;      call sscanf(t1_,"%*d %d %d",t2_,t3_);
;      call printf(">%s<  >%s<\n",t2_,t3_)
;      set t1_ = "1234567890abcdef"
;      call sscanf(t1_,"%*10s %2s%2s",t2_,t3_);
;      call printf(">%s<  >%s<\n",t2_,t3_)
;      set t1_ = "1.5 2.6"
;      call sscanf(t1_,"%f %lf",t2_,t3_);
;      call printf(">%s<  >%s<\n",t2_,t3_)


;     set t1_ = "3"
;     call numbercmp("<=",t1_,2)
;     iftrue goto m1
;     call printf("\nfalse");
;     goto ex
;m1:  label
;     call printf("\ntrue");


;     show ( exec_DOScomand )
;     show ( exec_DOScomand )
;     show ( exec_DOScomand )

;     call exec_loadlin("c:/loadlin","zimage_1.181","-t","root=/dev/fd0");
;    call disk_rawrite("c:/loadlin/zimage_1.181","b","","","Spur: %02d  Kopf: %2d Sektor: %2d\r")
;    waitkey()
;    call printf(">>xxx>>%s<xxx<<<<","123456");
;    waitkey()
;    call sprintf(answerstring,">>>>%s<<<<<","123456");
;    printxy(0,0,answerstring);
ex:  waitkey()
     call exit(cancelmesg)

    ;                                  v--- optional list of lines for the "history"
    call enterstring (answerstring, 1, "111\n222\n\333333")
    ;                 ^----to this inputted (or modified) result is copied
    ;                      (at input the contents of resultstring are
    ;                       offered to user to be modified )
    iffalse exit(cancelmesg)
    printxy(0,0,answerstring)
    waitkey ("yY")
    iffalse exit(cancelmesg)
;    call system(answerstring)
    ende: label
  }
}

