; 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