home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
620.lha
/
APipe_v37.4
/
child.asm
< prev
next >
Wrap
Assembly Source File
|
1992-02-21
|
5KB
|
212 lines
********************************************************************************
*
* child.asm --- child process entry point for ExecCommand()
*
* Copyright (C) 1991 by Per Bojsen. All Rights Reserved.
*
* Permission is granted to any individual or institution to use, copy,
* modify, and distribute this software, provided that this complete
* copyright and permission notice is maintained, intact, in all copies
* and supporting documentation.
*
* This software is provided on an "as is" basis without express or
* implied warranty.
*
* Main entry point is `__ChildProcess', referred to as
* `int _ChildProcess(void)' from C.
*
* $Id: child.asm,v 1.2 91/10/12 14:47:06 bojsen Exp Locker: bojsen $
*
* $Log: child.asm,v $
* Revision 1.2 91/10/12 14:47:06 bojsen
* Changed name of ChildProcess() to _ChildProcess() to avoid possible
* collisions with client code.
*
* Revision 1.1 91/10/12 14:39:53 bojsen
* Initial revision
*
INCLUDE 'exec/types.i'
INCLUDE 'exec/libraries.i'
INCLUDE 'exec/ports.i'
INCLUDE 'dos/dos.i'
INCLUDE 'dos/dosextens.i'
INCLUDE 'dos/dostags.i'
*
* ChildMsg structure
*
* C equivalent:
*
* struct ChildMsg
* {
* struct Message ExecMsg;
* char *CmdLine;
* LONG StackSize;
* BPTR PathList;
* ULONG Flags;
* LONG RC;
* };
*
STRUCTURE CHM,MN_SIZE
APTR CHM_CmdLine ; command line to execute
LONG CHM_StackSize ; use this stacksize for the child
BPTR CHM_PathList ; path to install for child
ULONG CHM_Flags ; various flags
LONG CHM_RC ; child's return code
LABEL CHM_Size
BITDEF CHM,PIPE,0
BITDEF CHM,PATH,1
ABSEXECBASE EQU 4
LIBVERSION EQU 37
SECTION butility.lib_text,CODE
*
* Entry point
*
* Register usage:
*
* A6 Current library
* A5 Process pointer; process port; Child message pointer
* A4 CLI pointer
* A0 scratch
*
* D4 Old path list of process
* D2
xdef __ChildProcess
_LVOOpenLibrary EQU -552
_LVOCloseLibrary EQU -414
_LVOFindTask EQU -294
_LVOForbid EQU -132
_LVOWaitPort EQU -384
_LVOGetMsg EQU -372
_LVOReplyMsg EQU -378
_LVOSystemTagList EQU -606
_LVOInput EQU -54
_LVORead EQU -42
__ChildProcess:
movem.l D1-D4/A1/A4-A6,-(A7)
move.l ABSEXECBASE.w,A6
sub.l A1,A1
jsr _LVOFindTask(A6)
move.l D0,A5
; Get CLI pointer
move.l pr_CLI(A5),D3
; Get startup message
lea.l pr_MsgPort(A5),A5
move.l A5,A0
jsr _LVOWaitPort(A6)
move.l A5,A0
jsr _LVOGetMsg(A6)
move.l D0,A5
; Open dos.library
lea DOSLibraryName(PC),A1
move.l #LIBVERSION,D0
jsr _LVOOpenLibrary(A6)
tst.l D0
bne.s PrepSystem
moveq #-1,D0
move.l D0,CHM_RC(A5)
bra FinishUp
PrepSystem:
; Switch path if one was passed in
move.l CHM_Flags(A5),D1
btst #CHMB_PATH,D1
bne.s CheckCLI
move.l #0,D3 ; clear CLI pointer so the path is not patched
CheckCLI:
lsl.l #2,D3 ; convert BPTR to CLI
move.l D3,A4
beq.s DoSystem ; was there a CLI?
move.l CHM_PathList(A5),D1
move.l cli_CommandDir(A4),D4 ; install the path that was passed
move.l D1,cli_CommandDir(A4) ; in in the startup message
DoSystem:
; Build tag list for SystemTagList() on stack
pea TAG_DONE
move.l CHM_StackSize(A5),-(A7)
pea NP_StackSize
; Now call SystemTagList() to run child
move.l A7,D2
move.l CHM_CmdLine(A5),D1
move.l D0,A6
jsr _LVOSystemTagList(A6)
lea $C(A7),A7
move.l D0,CHM_RC(A5)
move.l A4,D1 ; did we have a CLI?
beq.s FlushInput
move.l D4,cli_CommandDir(A4) ; OK, reinstall the old path
FlushInput:
; Flush stdin if it's a pipe (look for PIPE flag)
move.l CHM_Flags(A5),D0
btst #CHMB_PIPE,D0 ; D0 is CHM_Flags(A5) at this point
beq.s CloseDOS
jsr _LVOInput(A6)
move.l D0,D4
beq.s CloseDOS
BUFFERSZ EQU 512
lea -BUFFERSZ(A7),A7
move.l A7,D2
move.l #BUFFERSZ,D3
FlushIn:
move.l D4,D1
jsr _LVORead(A6)
neg.l D0
bmi.s FlushIn
lea BUFFERSZ(A7),A7
CloseDOS:
; Close dos.library
move.l A6,A1
move.l ABSEXECBASE.w,A6
jsr _LVOCloseLibrary(A6)
FinishUp:
jsr _LVOForbid(A6) ; Forbid() so the parent doesn't unload us too early
move.l A5,A1
jsr _LVOReplyMsg(A6)
move.l #0,D0
movem.l (A7)+,D1-D4/A1/A4-A6
rts
DOSLibraryName
dc.b 'dos.library',0
end