home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
300-399
/
ff368.lzh
/
NewEx
/
NewEx_sw.asm
< prev
next >
Wrap
Assembly Source File
|
1990-08-15
|
16KB
|
364 lines
; 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