
;            NewEx_Sw.asm   90-06-11  Version V1.1
;
;            New Executeing program
;
;            Written by Kjell Cederfeldt in June - 90.
;
ExecBase           = 4
OpenLibrary        = -408         ; exec offset       OpenLibrary(libName,version)(A1,D0)
CloseLibrary       = -414         ; exec offset       CloseLibrary(library)(a1)
FindTask           = -294         ; exec offset       FindTask(name)(a1)
WaitPort           = -384         ; exec offset       WaitPort(port)(a0)
GetMsg             = -372         ; exec offset       GetMsg(port)(a0)
ReplayMsg          = -378         ; exec offset       ReplayMsg(message)(a1)
Forbid             = -132         ; exec offset       Forbid()
Open               = -30          ; dos offset        Open(name,accessMode)(D1/D2)
Close              = -36          ; dos offset        Close(file)(D1)
Write              = -48          ; dos offset        Write(file,buffer,length)(d1/d2/d3)
OutPut             = -60          ; dos offset        OutPut()
Lock               = -84          ; dos offset!       Lock(name,mode)(d1,d2)
UnLock             = -90          ; dos offset!       UnLock(lock)(d1)
Examine            = -102         ; dos offset!       Examine(Lock,InfoBlock)(d1,d2)
CurrentDir         = -126         ; dos offset        CurrentDir(lock)(d1)
ParentDir          = -210         ; dos offset!       ParentDir(lock)(d1)
Execute            = -222         ; dos offset        Execute(string,file,file)(D1/D2/D3)
GetDiskObject      = -78          ; icon offset       GetDiskObject(name)(a0)
FindToolType       = -96          ; icon offset       FindToolType(toolTypeArray,typeName)(A0/A1)
FreeDiskObject     = -90          ; icon offset       FreeDiskObject(diskobj)(a0)
Mode_old           = 1005         ;
Mode_new           = 1006         ;
Access_read        = -2

                   move.l sp,Initial_SP               ;Spara stackpekaren
                   move.l a0,Filename                 ;CLI=true spara adress till agument
                   sub.l  #1,d0                       ;Minska längden med 1
                   add.l  d0,a0                       ;Addera längden till adressen
                   move.b #0,(a0)                     ;Nolla sista byten (CLI=0A)
                   move.l #0,RetCode                  ;Nolla Returncode

START:             move.l ExecBase,a6
                   suba.l a1,a1                       ;Hitta detta Task
                   jsr    Findtask(a6)                
                   move.l d0,a4                       ;Spara strukturen i a4
                   tst.l  $ac(a4)                     ;CLI eller WB ?
                   bne    CliStart                    ;


;       ** Detta endast om start från WB


                   move.l #49,RetCode                 ;Sätt Returncode
                   lea    $5c(a4),a0                  ;WBench message
                   jsr    WaitPort(a6)                ;vänta
                   jsr    GetMsg(a6)                  ;hämta message
                   move.l d0,Message                  ;spara pekare till WBMessage
                   beq    Slut                        ;error!

                   move.l #48,RetCode                 ;Sätt Returncode
                   move.l Message,a0                  ;Pekare till WBMessage
                   move.l $24(a0),a0                  ;Argumentlista
                   beq    Slut2                       ;inga agument

CliStart:


;   Öppna icon.library

                   move.l #47,RetCode                 ;Sätt Returncode
                   lea    Iconname(pc),a1             ;Ladda adressen för IconName i a1
                   clr.l  d0                          ;Tillåt alla versioner
                   jsr    OpenLibrary(a6)             ;öppna iconlibrary
                   move.l d0,Iconbase                 ;Spara Iconbase
                   beq    Error1                      ;Hoppa om fel!


;   Öppna dos.library

                   move.l #46,RetCode                 ;Sätt Returncode
                   lea    Dosname(pc),a1              ;Ladda adressen för DosName i a1
                   clr.l  d0                          ;Tillåt alla dosversioner
                   jsr    OpenLibrary(a6)             ;öppna doslibrary
                   move.l d0,Dosbase                  ;Spara Dosbase
                   beq    Error2                      ;Hoppa om fel!


                   jsr    PointTOCLI

                   tst.l  Message                     ;Om start från CLI
                   beq    InFileOpen                  ;Hopp till FileOpens

;   ställ Current directory

                   move.l #45,RetCode                 ;Sätt Returncode
                   move.l Message,a0                  ;Pekare till WBMessage sm_ArgList
                   move.l $24(a0),a0                  ;flytta pekaren till wa_Lock
                   beq    Error3                      ;Error!

                   move.l (a0),d1                     ;D1 => Lock
                   move.l Dosbase,a6
                   jsr    CurrentDir(a6)              ;Lås Current Dir

;   Hämta diskobject (.info fil)

                   move.l #44,RetCode                 ;Sätt Returncode
                   move.l Message,a0
                   move.l $24(a0),a0
                   move.l 4(a0),a0                    ;flytta pekaren till wa_Name
                   move.l a0,Filename
                   move.l Iconbase,a6
                   jsr    GetDiskObject(a6)           ;Hämta diskobject
                   move.l d0,Diskobj                  ;Spara undan diskobjectet
                   beq    Error3                      ;Error!
                   move.l d0,a1
                   move.l $36(a1),a1                  ;pekare till ToolType Array
                   move.l a1,toolTypeArray            ;spara pekaren



;            *** Hämta argument från tool icon (tooltype)

                   move.l Iconbase,a6
                   move.l toolTypeArray,a0
                   move.l #typeName1,a1
                   jsr    FindToolType(a6)
                   move.l d0,Inname

                   move.l toolTypeArray,a0
                   move.l #typeName2,a1
                   jsr    FindToolType(a6)
                   move.l d0,Outname


;   öppna utfil
                   move.l #43,RetCode                 ;Sätt Returncode
                   move.l DosBase,a6                  ;Hämta dosbasen
                   move.l Outname,d1                  ;Hämta filnamn
                   move.l #Mode_new,d2                ;1006=NewFile: 1005=Existing file
                   jsr    Open(a6)                    ;öppna filen
                   move.l d0,Outhandle                ;Spara filhateraren
                   beq    Error3                      ;Hoppa om fel!

;-------
;   öppna läsfil
;-------
InFileOpen:

                   move.l #42,RetCode                 ;Sätt Returncode
                   move.l Filename,d1                 ;Hämta filnamn
                   tst.l  Message                     ;Koll om Start WB el CLI?
                   beq.s  InopLab                     ;Hopp, om CLI
                   move.l Inname,d1                   ;Hämta filnamn
InOpLab:           move   #Mode_old,d2                ;1005=Existing file : 1006=NewFile
                   move.l DosBase,a6                  ;Hämta dosbasen
                   jsr    Open(a6)                    ;öppna filen
                   move.l d0,Inhandle                 ;Spara filhateraren
                   bne    BldPath                     ;Hoppa om ej fel!

                   tst.l  Message                     ;Koll om Start WB el CLI?
                   bne.s  Err                         ;Hopp, om WB
                   move.l CLIpoint,d1
                   move.l #Textfld,d2
                   move.l #84,d3
                   jsr    Write(a6)
Err:               bra    Error4


;             Hämta och bygg sökväg.

BldPath:           jsr    GetPath                     ;bygg path


Skriv:    ; Detta är bra vid buggning (används ej i programmet)
                   move.l Dosbase,a6
;                   move.l CLIpoint,d1
;                   tst.l  Message                     ;Koll om Start WB el CLI?
;                   beq.s  Skr                         ;Hopp till End om CLI
;                   move.l Outhandle,d1
;Skr:               move.l #path,d2
;                   move.l #255,d3                      ;sträng längd
;                   jsr    Write(a6)
;--------
;   anroppa Execute (dosfunktion)
;--------
                   move.l #0,RetCode                 ;Nolla Returncode
                   move.l CLIPoint,d3

                   tst.l  Message                     ;Koll om Start WB el CLI?
                   beq.s  Exlabel                     ;Hopp till End om CLI

                   move.l Outhandle,d3                ;hämta fil hanterare
Exlabel:           move.l PathStart,d1                ;hämta pekare för sträng
                   move.l InHandle,d2                 ;hämta fil hanterare
                   jsr    Execute(a6)                 ;exectue a scripfile (dos)


;---------
;   Stäng filer
;---------

Cleanup1:          move.l Inhandle,d1
                   jsr    Close(a6)

Error4:            tst.l  Message                     ;Koll om Start WB el CLI?
                   beq.s  temp                        ;Hopp till End om CLI

                   move.l Outhandle,d1
                   jsr    Close(a6)


Error3:            move.l Iconbase,a6                 ;Hämta Iconbase
                   move.l Diskobj,a0                  ;Hämta diskobject strukturen
                   jsr    FreeDiskobject(a6)          ;Frigör Diskobject

temp:              move.l Dosbase,a1                  ;Hämta Dosbase
                   move.l Execbase,a6
                   jsr    CloseLibrary(a6)            ;stäng Doslibrary:

Error2:            move.l Iconbase,a1                 ;Hämta IconBase
                   move.l Execbase,a6
                   jsr    CloseLibrary(a6)            ;Stäng Iconlibrary


Error1:            tst.l  Message                     ;Koll om Start WB el CLI?
                   beq.s  Slut                        ;Hopp till End om CLI
Slut2:             jsr    Forbid(a6)
                   move.l Message,a1
                   jsr    ReplayMsg(a6)               ;lämna tillbaka struktur

Slut:              move.l Initial_SP,sp               ;Hämta start stacken
                   clr.l  d0
                   move.l RetCode,d0                  ;Hämta returncode till D0
                   rts

;       !!    *********** System DATA **************  !!

Initial_SP:        dc.l   0
RetCode:           dc.l   0
Iconbase:          dc.l   0
Dosbase:           dc.l   0
Inhandle:          dc.l   0
Outhandle:         dc.l   0
Message:           dc.l   0
Diskobj:           dc.l   0
CLIpoint:          dc.l   0
Filename:          dc.l   0
NewLock:           dc.l   0
ParLock:           dc.l   0
Inname:            dc.l   0
Outname:           dc.l   0
Pathstart:         dc.l   0
Dosname:           dc.b   'dos.library',0
                   align
Iconname:          dc.b   'icon.library',0
                   align
TempNamn:          blk.b  32,0
                   align
Path:              blk.b  255,0
                   align
typeName1:         dc.b   "FILENAME",0,0
                   align
typeName2:         dc.b   "WINDOW",0,0
                   align
Textfld:           dc.b   27,"[33mNewEx Version 1.1 by Kjell Cederfeldt",13,10,10
                   dc.b   "No file name or file not found!",27,"[31m",13,10,10
                   align
toolTypeArray:     dc.l   0
IconText:          dc.l   0
FileInfoblock:     blk.b  260,0
                   align

;                                 ReturnCode 47 = icon.library ej öppnad
;                                 ReturnCode 46 = dos.library  ej öppnad
;                                 ReturnCode 45 = currentdir ej låst
;                                 ReturnCode 44 = diskobjekt ej hittad
;                                 ReturnCode 43 = utfil (enhet) ej funnen
;                                 ReturnCode 42 = infil (enhet) ej funnen

;********************   Subrutiner   ***************************************

PointTOCLI:

; Output funktionen är bra om man vill skriva text ut i cli-fönstret som man startade i

                   move.l Dosbase,a6                  ;doslibrary pekare till
                   jsr    OutPut(a6)                  ;hämta output pekare till Dos!
                   move.l d0,CLIpoint                 ;Spara undan pekaren
                   rts

;***************************************************************************

GetPath:
                   move.l #Path,d2                    ;peka på adressen till Path
                   add.l  #253,d2                     ;peka på slutet -2 (" + terminering)
                   move.l d2,PathStart                ;Tala om var start på path
                                                      ;stängen börjar

                   move.l Dosbase,a6                  ;Hämta dosbase
                   move.l #Filename,d1                ;hämta pekare till filnamn
                   move.l Access_read,d2              ;läs-mode endast
                   jsr    Lock(a6)                    ;lås!
                   tst.l  d0
                   beq    EndLoop                     ;Ingen Fil hittades
                   move.l d0,NewLock                  ;spara låset

MainLoop:          move.l NewLock,d1                  ;Hämta låset
                   move.l #Fileinfoblock,d2           ;hämta adress till block
                   jsr    Examine(a6)                 ;Hämta filinfo
                   tst.l  d0
                   beq    EndLoop

                   move.l #Fileinfoblock,d2
                   add.l  #8,d2                       ;Addera offset till adressen

                   clr.l  d0                          ;Nollställ räknare
                   move.l d2,a0                       ;flytta filpekaren till A0
                   move.l #Tempnamn,a1                ;flytta pathpekare till A1
Loop:              move.b (a0)+,(a1)+                 ;flytta innehåll A0 => A1
                   add.l  #1,d0                       ;öka räknaren

                   tst.b  (a0)                        ;Namnet slut? (0 terminering)
                   bne.s  Loop                        ;Nej hoppa till loop

                   move.b #47,(a1)+                   ;lägg till en '/'
                   add.l  #1,d0                       ;öka räknaren

                   move.l Pathstart,d2                ;hämta Path start
                   move.l d2,a0

Loop2:             move.b -(a1),-(a0)                 ;spara path-stukturen till Path
                   sub.l  #1,d0                       ;backa räknaren
                   bne.s  Loop2

                   move.l a0,Pathstart                ;spara nuvarade pathstart

                   move.l NewLock,d1                  ;Hämta låset
                   jsr    ParentDir(a6)               ;gå till tidigare dir
                   move.l d0,ParLock                  ;spara låset
                   move.l NewLock,d1                  ;Hämta föregående lås
                   jsr    UnLock(a6)                  ;Släpp låset
                   move.l ParLock,d0                  ;hämta nuvarnde lås
                   move.l d0,NewLock                  ;och flytta detta
                   tst.l  d0                          ;är vi i root ?
                   bne    MainLoop                    ;Nej hoppa

                   move.l PathStart,a1                ;hämta pathstart
Kolon:             cmp.b  #47,(a1)+                   ;hitta första '/'
                   bne.s  kolon
                   move.b #58,-(a1)                   ;Byt detta mot ':'

                   move.l PathStart,a1                ;hämta pathstart
                   move.b #34,-(a1)                   ;lägg till '"'
                   move.b #32,-(a1)                   ;lägg till ' '
                   move.b #68,-(a1)                   ;lägg till 'D'
                   move.b #67,-(a1)                   ;lägg till 'C'
                   move.l a1,PathStart                ;spara den nya starten
                   move.l #Path,a1
                   add.l  #253,a1
                   move.b #34,(a1)

Endloop:           rts

;***************************************************************************
                   end
