home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
300-399
/
ff302.lzh
/
ProgUtils
/
Signal.asm
< prev
next >
Wrap
Assembly Source File
|
1990-01-15
|
6KB
|
318 lines
opt c+,l-
;***
;Signal a task
;© J.Tyberghein (C version 30 sep 89)
;© J.Tyberghein (Conversion to ML 2 oct 89)
;***
incdir include/
include libraries/dosextens.i
include exec/execbase.i
SysBase equ 4
;ExecBase routines
_LVOOldOpenLibrary equ -408
_LVOCloseLibrary equ -414
_LVOForbid equ -132
_LVOPermit equ -138
_LVOSignal equ -324
;DosBase routines
_LVOWrite equ -48
_LVOOutput equ -60
CALLEXEC macro
move.l (SysBase).w,a6
jsr _LVO\1(a6)
endm
CALLDOS macro
move.l DosBase,a6
jsr _LVO\1(a6)
endm
;Main program
move.l a0,ArgPointer
move.l d0,ArgLen
;Open libraries
lea DosLib,a1
CALLEXEC OldOpenLibrary
move.l d0,DosBase
;Get outputhandle
CALLDOS Output
move.l d0,OutputHandle
bsr Main
;Close libraries
move.l DosBase,a1
CALLEXEC CloseLibrary
rts
;*** String length ***
;a0 = string address
;-> d0 = length
;***
StrLen:
moveq #-1,d0
LoopSL:
addq.l #1,d0
tst.b (a0)+
bne.s LoopSL
rts
;*** Put a message on the screen ***
;a0 = message
;***
Message:
movem.l a0,-(a7)
bsr StrLen
movem.l (a7)+,a0
move.l d0,d3
move.l OutputHandle,d1
move.l a0,d2
CALLDOS Write
rts
;*** Compare a BSTR with an CSTR ***
;a2 = BSTR
;a1 = CSTR
;-> d0 = 0 if equal
;***
CompareBC:
tst.b (a2)
beq.s NotEqualBC
moveq #0,d0
LoopBC:
cmp.b (a2),d0
bgt.s EqualBC
move.b (a1,d0),d1
cmp.b 1(a2,d0),d1
bne.s NotEqualBC
addq.w #1,d0
bra.s LoopBC
EqualBC:
moveq #0,d0
rts
NotEqualBC:
moveq #-1,d0
rts
;*** Search for a task ***
;d0 = Process number
;a0 = Task pointer
;-> a0 = task pointer or NULL if not found
;***
Search:
cmp.l #0,a0 ;Not the end of the tasks ?
beq.s TheEndS
cmp.b #NT_PROCESS,LN_TYPE(a0)
bne.s NextTaskS
cmp.l pr_TaskNum(a0),d0
beq.s TheEndS
NextTaskS:
move.l LN_SUCC(a0),a0
bra.s Search
TheEndS:
rts
;*** Search a task when the loaded commandname is given ***
;a1 = Pointer to name
;a0 = Task pointer
;-> a0 = task pointer or NULL if not found
;***
SearchS:
cmp.l #0,a0
beq.s TheEndSS
cmp.b #NT_PROCESS,LN_TYPE(a0)
bne.s NextTaskSS
move.l pr_CLI(a0),a2
add.l a2,a2
add.l a2,a2
cmp.l #0,a2
beq.s NextTaskSS
move.l cli_CommandName(a2),a2
add.l a2,a2
add.l a2,a2
bsr CompareBC
beq.s TheEndSS
NextTaskSS:
move.l LN_SUCC(a0),a0
bra.s SearchS
TheEndSS:
rts
;*** Skip spaces ***
;a0 = string
;-> a0 = after last space
;***
SkipSpace:
tst.b (a0)
beq.s EndOfString
cmp.b #' ',(a0)+
beq.s SkipSpace
sub.l #1,a0
EndOfString:
rts
;*** Skip non spaces ***
;a0 = string
;-> a0 = points to first space
;***
SkipNSpace:
tst.b (a0)
beq.s EndOfString
cmp.b #' ',(a0)+
bne.s SkipNSpace
sub.l #1,a0
rts
;*** Check if a byte is a digit ***
;(a0) byte to check
;-> d0 = 0 if digit
;***
IsDigit:
cmp.b #'0',(a0)
blt.s NoDigitID
cmp.b #'9',(a0)
bgt.s NoDigitID
moveq #0,d0
rts
NoDigitID:
moveq #-1,d0
rts
;***==============***
;*** Main program ***
;***==============***
Main:
move.l ArgPointer,a0
move.b #0,Number ;Assume no process number is given
bsr SkipSpace
tst.b (a0)
beq Error
bsr IsDigit
bne.s NoDigit
;A digit so a process number must be given
move.b #1,Number ;Sorry, I was wrong. It was a process number
moveq #0,d2
move.b (a0),d2
sub.b #'0',d2
lea 1(a0),a0
bsr IsDigit
bne.s NoDigitA
mulu #10,d2
add.b (a0),d2
sub.b #'0',d2 ;We stop here, maximum 2 digits
lea 1(a0),a0
NoDigitA:
move.l d2,ProcNum
cmp.b #' ',(a0)
bne Error
bra.s Contin
;No digit so a loaded command name is given
NoDigit:
move.l a0,CommAdd
bsr SkipNSpace
tst.b (a0)
beq Error
move.b #0,(a0) ;End the string here
lea 1(a0),a0
Contin:
bsr SkipSpace
tst.b (a0)
beq Error
;Now we must scan the signal number
moveq #0,d2
bsr IsDigit
bne Error
move.b (a0),d2
sub.b #'0',d2
lea 1(a0),a0
bsr IsDigit
bne.s Continue
mulu #10,d2
add.b (a0),d2
sub.b #'0',d2
lea 1(a0),a0
bsr IsDigit
bne.s Continue
mulu #10,d2
add.b (a0),d2
sub.b #'0',d2
Continue:
move.l d2,SigNum
;Search the task
CALLEXEC Forbid
tst.b Number
bne.s SearchNum
move.l CommAdd,a1
move.l (SysBase).w,a0
add.l #TaskReady,a0
bsr SearchS
cmp.l #0,a0
bne.s FoundIt
move.l (SysBase).w,a0
add.l #TaskWait,a0
bsr SearchS
cmp.l #0,a0
beq.s NotFound
bra.s FoundIt
SearchNum:
move.l ProcNum,d0
move.l (SysBase).w,a0
add.l #TaskReady,a0
bsr Search
cmp.l #0,a0
bne.s FoundIt
move.l (SysBase).w,a0
add.l #TaskWait,a0
bsr Search
cmp.l #0,a0
beq.s NotFound
FoundIt:
move.l a0,a2
CALLEXEC Permit
;Signal the task
move.l a2,a1
move.l SigNum,d0
CALLEXEC Signal
rts
NotFound:
CALLEXEC Permit
move.l OutputHandle,d1
move.l #ProcessStr,d2
move.l #ProcessStrLen,d3
CALLDOS Write
rts
Error:
move.l OutputHandle,d1
move.l #UsageStr,d2
move.l #UsageStrLen,d3
CALLDOS Write
rts
EVEN
DosBase: dc.l 0
OutputHandle: dc.l 0
ArgPointer: dc.l 0 ;Argument pointer given by DOS
ArgLen: dc.l 0 ;Length of ArgPointer
ProcNum: dc.l 0 ;Process number to search
CommAdd: dc.l 0 ;Command string to search
SigNum: dc.l 0 ;Number to signal
Number: dc.b 0 ;1 if a process number is given
;Library names
DosLib: dc.b "dos.library",0
UsageStr: dc.b "Usage: Signal <Process ID>|<Program Name> <Signal Number>",10,0
UsageStrLen equ *-UsageStr
ProcessStr: dc.b "Process does not exist !",10,0
ProcessStrLen equ *-ProcessStr
END