;*************************************************************************
;*
;* Dieses Programm ist Public Domain und wurde mit dem Profimat-Assembler
;* von Data Becker erstellt. Das Kopieren für den privaten
;* Gebrauch ist erlaubt. Sollen das Programm oder Teile daraus für
;* kommerzielle Zwecke verwendet werden, bitte ich darum, sich mit
;* mir in Verbindung zu setzen.
;*
;* © 1988 Richard Englert, Flößaustraße 160, 8510 Fürth, Tel.:0911/708255
;*
;* letzte Änderung: 06-06-1988
;*
;* Achtung: Beim Assemblieren werden das Ladeprogramm WBStart und das
;*          Icon WBStart.info benötigt. Deshalb zuerst WBStart.ASM
;*          assemblieren und eine beliebige .info Datei unter dem 
;*          Namen WBStart.info auf die RAM-Disk kopieren.
;*
;* Nach dem Start von CLI4WB wird zuerst nach dem Namen des CLI-Programms
;* gefragt, das von WB gestartet werden soll. Man sollte hier den genauen
;* Pfadnamen angeben, damit das Programm auch später gefunden wird.
;* Achtung: nicht mehr als 256 Zeichen eingeben !!
;*
;* Danach wird gefragt, ob ein Window geöffnet werden soll, in das dann
;* die Programmausgaben geleitet werden sollen (z.B. bei CLI-Befehlen
;* wie LIST oder DIR benötigt; bei ED nicht nötig).
;*
;* Als nächstes wird gefragt, ob CLI4WB nachdem das CLI-Programm ausge-
;* führt worden ist, warten soll, bis die RETURN-Taste gedrückt wurde,
;* oder ob sofort beendet werden soll (warten ist sinnvoll bei LIST, um
;* sich das Directory genau anzusehen; bei ED wäre es wohl kaum sinnvoll
;* noch zu warten, nachdem ED bereits verschwunden ist)
;*
;* Die letzte Frage bestimmt, ob noch Argumente eingegeben werden sollen
;* die dann an das CLI-Programm übergeben werden (z.B. muß bei ED als
;* Argument der Filename angegeben werden). Gibt man einfach RETURN ein
;* wird das Programm beendet.
;*
;* Zum Schluß wird dann noch nach dem Namen gefragt unter dem das Start-
;* programm gesichert werden soll (genauer Pfadname). Zusätzlich wird
;* natürlich noch das Icon mit abgespeichert, das beim Assemblieren unter
;* dem Namen WBStart.info auf der RAM-Disk gesichert war.
;* Jetzt ist es möglich das Startprogramm von der Workbench zu starten,
;* das wiederum das CLI-Programm lädt und startet.
;*
;* Will man nicht nur ein CLI-Programm laden so gibt es zwei Möglich-
;* keiten:
;*         · man stellt sich eine Batch-Datei zusammen, die alle Pro-
;*           grammaufrufe enthält und gibt als CLI-Befehl
;*           EXECUTE «Batchfile» an.
;*         · man gibt die einzelenen Programmaufrufe nacheinander ein,
;*           drückt allerdings nicht RETURN nach den einzelnen Befehlen
;*           sondern CTRL-J und erst nach dem letzten Programmaufruf
;*           RETURN.
;*
;* Bitte unbedingt Hinweise im Programm WBStart.ASM beachten.
;*
;*************************************************************************

 INCLUDE 'ram:Amiga.ASM'

; AmigaDOS-Funktionen definieren:

_LVOOpenLibrary   EQU -552
_LVOCloseLibrary  EQU -414
_LVOOutput        EQU -60
_LVOWrite         EQU -48
_LVOOpen          EQU -30
_LVOClose         EQU -36
_LVORead          EQU -42
_LVOAllocMem      EQU -198
_LVOFreeMem       EQU -210
_LVOLock          EQU -84
_LVOExamine       EQU -102
_LVOUnLock        EQU -90
_LVODeleteFile    EQU -72
_LVOWaitForChar   EQU -204

; einige Konstanten:

MODE_OLD          EQU 1005
MODE_NEW          EQU 1006
MEMF_PUBLIC       EQU 1<<0
MEMF_CLEAR        EQU 1<<16

;*****************************************************************
;Hauptprogramm:
;*****************************************************************

 INIT_AMIGA

; Dos-Library öffnen:

 LEA DosName,A1
 MOVEQ #0,D0
 CALLSYS OpenLibrary
 MOVE.L D0,DosBase
 BEQ EXIT

; Speicher für Tastatureingabepuffer

 MOVE.L #256,D0
 MOVE.L #(MEMF_PUBLIC|MEMF_CLEAR),D1
 LINKSYS AllocMem,ExecBase
 TST.L D0                         ;D0 = 0 ,kein Speicher mehr, Ende
 BEQ EXIT
 MOVE.L D0,CmdBuf                 ;Adresse des Blocks in 'CmdBuf' sichern

; CON:-Window für Benutzer-Dialog öffnen:

 MOVE.L #WName,D1
 MOVE.L #MODE_OLD,D2
 LINKSYS Open,DosBase
 TST.L D0
 BEQ EXIT1
 MOVE.L D0,WHandle                ;Handle in 'WHandle' sichern

; Text für Frage nach CLI-Kommando ausgeben:

 LEA GetCmd,A1
 BSR OutPut

 MOVE.L #EndCom,D0
 SUB.L #272,D0
 MOVE.L D0,CLICmdBuf

 MOVE.L D0,D2
 MOVE.L WHandle,D1
 MOVE.L #256,D3                   ;maximal 256 Zeichen eingeben
 LINKSYS Read,DosBase
 CMP.L #1,D0
 BEQ EXIT2
 MOVE.L D0,InpLen                 ;wirkliche Eingabelänge in
                                  ;InpLen sichern

 MOVE.L CLICmdBuf,A0
 MOVE.B #' ',-1(A0,D0)            ;SPACE und CR anhängen
 MOVE.B #$0a,0(A0,D0)

; Text für Frage nach Window ausgeben:

 LEA AskWnd,A1                    ;Stringadresse nach A1
 BSR OutPut                       ;String ausgeben

; Eingabe von einem Buchstaben:

 MOVEQ #2,D3
 MOVE.L CmdBuf,D2
 MOVE.L WHandle,D1
 LINKSYS Read,DosBase
 MOVE.L CmdBuf,A0
 MOVE.B (A0),D0
 CMP.B #'n',D0                    ;wenn 'n' oder 'N' eingegeben
 BEQ W1                           ;dann weitermachen
 CMP.B #'N',D0
 BEQ W1

 MOVE.L CLICmdBuf,A0              ;Windowflag setzen
 MOVE.W #$ffff,-6(A0)

; Text für Frage nach WaitFlag ausgeben:

W1:
 LEA AskWait,A1                   ;Stringadresse nach A1
 BSR OutPut                       ;String ausgeben

; Eingabe von einem Buchstaben:

 MOVEQ #2,D3
 MOVE.L CmdBuf,D2
 MOVE.L WHandle,D1
 LINKSYS Read,DosBase
 MOVE.L CmdBuf,A0
 MOVE.B (A0),D0
 CMP.B #'n',D0                    ;wenn 'n' oder 'N' eingegeben
 BEQ W2                           ;dann weitermachen
 CMP.B #'N',D0
 BEQ W2

 MOVE.L CLICmdBuf,A0              ;Waitflag setzen
 MOVE.W #$ffff,-4(A0)

; Text für Frage nach Argumenteneingabe ausgeben:

W2:
 LEA AskArg,A1                    ;Stringadresse nach A1
 BSR OutPut                       ;String ausgeben

; Eingabe von einem Buchstaben:

 MOVEQ #2,D3
 MOVE.L CmdBuf,D2
 MOVE.L WHandle,D1
 LINKSYS Read,DosBase
 MOVE.L CmdBuf,A0
 MOVE.B (A0),D0
 CMP.B #'n',D0                    ;wenn 'n' oder 'N' eingegeben
 BEQ W3                           ;dann weitermachen
 CMP.B #'N',D0
 BEQ W3

 MOVE.L CLICmdBuf,A0              ;Argumenteneingabeflag setzen
 MOVE.W #$ffff,-2(A0)

; Text für Frage nach Filenamen ausgeben:

W3:
 LEA GetName,A1                   ;Stringadresse nach A1
 BSR OutPut                       ;String ausgeben

; Filenamen eingeben:

 MOVE.L CmdBuf,D2
 MOVE.L WHandle,D1
 MOVE.L #256,D3                   ;maximal 256 Zeichen eingeben
 LINKSYS Read,DosBase
 CMP.W #1,D0
 BEQ EXIT2

 MOVE.L D0,CmdLen                 ;wirkliche Eingabelänge in
                                  ;'CmdLen' sichern

; CR durch NULL ersetzen

 MOVE.L CmdBuf,A0
 MOVE.B #0,-1(A0,D0)

; File öffnen:

 MOVE.L CmdBuf,D1                 ;Filename in CmdBuf
 MOVE.L #MODE_NEW,D2              ;neues File
 LINKSYS Open,DosBase
 TST.L D0
 BEQ EXIT2

 MOVE.L D0,PrgHandle              ;Handle in 'PrgHandle' sichern

; File auf Disk schreiben:

WrtToDsk:
 MOVE.L #EndCom,D3                ;Filelänge in D3
 SUB.L #Com,D3
 MOVE.L PrgHandle,D1              ;Handle in D1
 MOVE.L #Com,D2                   ;Adresse des Puffers in D2
 LINKSYS Write,DosBase            ;auf Disk schreiben

; File schließen:

 MOVE.L PrgHandle,D1              ;Handle in D1
 LINKSYS Close,DosBase            ;und schließen

; .info-Datei schreiben:

 MOVE.L CmdLen,D0                 ;.info an Filename anhängen
 MOVE.L CmdBuf,A0
 MOVE.B #'.',-1(A0,D0)
 MOVE.B #'i',0(A0,D0)
 MOVE.B #'n',1(A0,D0)
 MOVE.B #'f',2(A0,D0)
 MOVE.B #'o',3(A0,D0)
 MOVE.B #0,4(A0,D0)

; .info-File öffnen:

 MOVE.L CmdBuf,D1                 ;gleiche Prozedur wie beim
 MOVE.L #MODE_NEW,D2              ;Speichern des Files
 LINKSYS Open,DosBase
 TST.L D0
 BEQ EXIT2

 MOVE.L D0,InfoHandle             ;Handle in 'InfoHandle' sichern

; .info-File auf Disk schreiben:

WrtInfoToDsk:
 MOVE.L #EndComInfo,D3
 SUB.L #ComInfo,D3
 MOVE.L InfoHandle,D1
 MOVE.L #ComInfo,D2
 LINKSYS Write,DosBase

; .info-File schließen:

 MOVE.L InfoHandle,D1
 LINKSYS Close,DosBase

; Window schließen:

EXIT2:
 MOVE.L WHandle,D1                ;Windowhandle in D1
 LINKSYS Close,DosBase            ;und schließen

; Speicher für CmdBuf und freigeben:

EXIT1:
 MOVE.L CmdBuf,A1                 ;Adresse des Bereichs in A1
 MOVE.L #256,D0                   ;Länge des belegten Bereichs
 LINKSYS FreeMem,ExecBase         ;Speicher freigeben

; Dos-Library schließen:

EXIT:
 MOVE.L DosBase,D0
 BEQ.S No_Dos
 MOVE.L D0,A1
 CALLSYS CloseLibrary
No_Dos:
 EXIT_AMIGA

; String (Pointer in A1) ausgeben:

OutPut:
 CLR.L D3                         ;Stringlänge in ersten zwei
 MOVE.W (A1),D3                   ;Bytes des Strings nach D3
 ADD.L #2,A1
 MOVE.L A1,D2                     ;Adresse nach D2
 MOVE.L WHandle,D1                ;Windowhandle in D1
 LINKSYS Write,DosBase            ;String in Window ausgeben

 RTS

; Datenbereiche:

 DATA
DosName:    DC.B 'dos.library',0
XT:         DC.B '.CR',0
GetCmd:     DC.B 0,24,$0a,'Name des CLI-Befehls : '
GetName:    DC.B 0,18,$0c,$0a,'Name des Files: '
AskWnd:     DC.B 0,16,$0a,'Window ? (J/N) '
AskWait:    DC.B 0,16,$0a,'Warten ? (J/N) '
AskArg:     DC.B 0,28,$0a,'Argumente eingeben ? (J/N) '
WName:      DC.B 'CON:100/50/400/120/CLI4WB by R.Englert © 1988',0

 ALIGN
ComInfo:                          ;Icon für Ladeprogramm von RAM-Disk
 IBYTES "ram:WBStart.info"        ;laden
EndComInfo:

 ALIGN
Com:                              ;Ladeprogramm von RAM-Disk laden
 IBYTES "ram:WBStart"
EndCom:

 ALIGN

 BSS
DosBase:    DS.L 1
CmdLen:     DS.L 1
PrgHandle:  DS.L 1
CBuf:       DS.L 1
PrgLen:     DS.L 1
PrgBuf:     DS.L 1
OldLock:    DS.L 1
WHandle:    DS.L 1
CmdBuf:     DS.L 1
FIB:        DS.L 1
InpLen:     DS.L 1
CLICmdBuf   DS.L 1
InfoHandle  DS.L 1
 END

