kkaempf@rmi.UUCP (Klaus Kaempf) (01/22/88)
Wanna call a CLI-command in your own application? Maybe you
don't have "RUN" in your "C:" directory? Or it's "PROMPT",
"STACK", "CD" or the like? So forget "Execute()"! But it's
one of these BCPL programs - darn!
Try this one!
This small program can be used to execute CLI-commands, even
the ones that rely on the correct BCPL setup.
Two restrictions:
"System0()" must be called from a CLI-PROCESS (or SHELL or
whatever). You cannot call it from WorkBench, a simple task
or interrupt (argh!).
"EXECUTE" (the CLI-command) will not loop through the
batchfile itself, but rather change the "cli_CurrentInput",
so the shell will execute the incoming lines until "EOF" is
encountered and then restore "cli_CurrentInput". So this is
not a restriction, if you return to the input-loop directly
after "System0()" has been called (normally true in shell
program). Batchfiles called this way may be nested, but do
not try to "EXECUTE" several batch-files ...
System0("Execute", seglist, "first");
System0("Execute", seglist, "second");
System0("Execute", seglist, "third");
... without returning to the input-loop first.
"System0()" WON'T handle loading and unloading of the code,
I/O-redirection or whatever, but this is fairly simple.
Commands should be checked in the following order:
built-in commands of the shell
resident commands ("NetHand")
current directory (WindowPtr = -1)
path list ("CommandDir", WindowPtr = -1)
"C:" (WindowPtr = 0)
As an option for shells: Try to execute it as a batchfile
(current directory or "S:"), if everything else fails (but
use "WindowPtr = -1" for "C:" then).
I/O-redirection should save the values of "pr_CIS" and
"pr_COS", put the new ones into these fields and restore
them after the command has finished. That's why "EXECUTE" is
not that much impressed if you supply it with ">" or "<".
"System0()" returns the return code (register D0 or
"Exit()"-parameter) of the program called (not the same as
"Execute()"!), or an internal error code:
-1: process not a CLI
-2: not enough memory for stack
It does not rely on some strange undocumented data
structures the way Aztec's "fexec#?()" does. You do not need
a special startup code to save the registers (Csh 2.04). I
still have to find the command, that cannot be called this
way, but you will certainly manage this. :-)
Two non-standard include files are used. "extern/exec.i"
contains the "_LVO" equates for "exec", you can use
"amiga.lib" instead. "extras/asm.i" provides ...
AbsExecBase equ 4
REG_SysBase equr a6
callsys macro
jsr _LVO\1(REG_SysBase)
endm
The uuencoded object file has been created using the
Metacomco Macro Assembler. A new release (11.1) of this one
has been announced for the ST, does anybody have further
information about an Amiga-version?
multam salutem omnibus
!ralph
P.S.: If someone would be as kind as to mail me a disk with
the latest version of Matt's shell for Lattice-C? Thanks!
################
*
* System0.asm - invoke system's command processor
*
* Copyright (C) by Ralph Babel, Guru Meditation Network,
* Falkenweg 3, D-6204 Taunusstein, West-Germany
*
* This piece of code may be used as part of any product as
* long as the source code for the complete program can be
* obtained free of charge (except for a small copying fee)
* and this copyright notice is left unchanged.
*
* Bug reports and improved versions appreciated.
*
* 20-Jul-1987 created original version
* 11-Jan-1988 now based on "official" information only
*
nolist
include "exec/types.i"
include "libraries/dos.i"
include "libraries/dosextens.i"
include "extern/exec.i"
include "extras/asm.i"
list
*
* LONG System0(name, seglist, args)
* char *name;
* BPTR seglist;
* char *args;
*
xdef _System0
xref _DOSBase
* parameter offsets & stack
SAVED_REGS reg a2-a6/d2-d3
DELTA equ 7*4
ARG_NAME equ 4+DELTA
ARG_SEGLIST equ 8+DELTA
ARG_ARGS equ 12+DELTA
* additional return codes
NO_CLI equ -1
NO_MEM equ -2
* local constants
MAXBSTR equ 255
LF equ 10
* register usage
REG_Result equr d3
REG_Process equr a2 ;may not be A4, see below!
REG_CLI equr a3
REG_CIS equr a4 ;may not be A3, see below!
REG_PrevStack equr a5
* local stack frame
STRUCTURE StackFrame,0
STRUCT sf_CommandName,MAXBSTR+1 ;BSTR, length byte!
STRUCT sf_CommandArgs,MAXBSTR+1 ;not a BSTR, LF-terminated!
APTR sf_PrevStack
APTR sf_SaveReturnAddr
BPTR sf_SaveModule
BPTR sf_SaveCommandName
APTR sf_StackBase
LONG sf_StackSize
LONG sf_PushSize
APTR sf_Process
APTR sf_CLI
APTR sf_CIS
BPTR sf_SCB_Buf
LONG sf_SCB_Pos
LONG sf_SCB_End
LABEL sf_SIZEOF
* entry point
_System0:
movem.l SAVED_REGS,-(sp)
moveq #NO_CLI,REG_Result ;ERROR - not a CLI task
movea.l AbsExecBase,REG_SysBase
suba.l a1,a1
callsys FindTask ;find own task
movea.l d0,REG_Process
move.l pr_CLI(REG_Process),d0
beq quit0
* build local stack frame & save some values
lsl.l #2,d0 ;BPTR to machine pointer
movea.l d0,REG_CLI
movea.l sp,REG_PrevStack ;save old stack pointer
move.l sp,d0
andi.b #$fc,d0 ;make SP longword-aligned for BPTRs
movea.l d0,sp
suba.w #sf_SIZEOF,sp
move.l REG_PrevStack,sf_PrevStack(sp)
move.l REG_Process,sf_Process(sp)
move.l REG_CLI,sf_CLI(sp)
move.l pr_ReturnAddr(REG_Process),sf_SaveReturnAddr(sp)
* allocate space for stack
moveq #NO_MEM,REG_Result ;ERROR - no memory for STACK
move.l cli_DefaultStack(REG_CLI),d0 ;in longwords for "VEC"
lsl.l #2,d0
move.l d0,sf_PushSize(sp)
addq.l #4,d0 ;one additional longword
move.l d0,sf_StackSize(sp)
moveq #0,d1 ;intentionally NOT "MEMF_PUBLIC"!
callsys AllocMem
tst.l d0
beq quit1
move.l d0,sf_StackBase(sp) ;save result
* save old command pointer, build new BCPL command name
move.l cli_CommandName(REG_CLI),sf_SaveCommandName(sp)
movea.l ARG_NAME(REG_PrevStack),a0 ;first parameter to "System0()"
lea sf_CommandName+1(sp),a1 ;first char location for BSTR
move.l a1,d0
lsr.l #2,d0 ;will ignore (+1), BPTR as result
move.l d0,cli_CommandName(REG_CLI)
move.w #MAXBSTR,d0
bra.s 2$
1$ move.b d1,(a1)+
2$ move.b (a0)+,d1
dbeq d0,1$
suba.l ARG_NAME(REG_PrevStack),a0 ;subtract original source
move.l a0,d0
subq.l #1,d0 ;terminating null-byte
move.b d0,sf_CommandName(sp) ;to first location in BSTR
* save contents of Current Input Stream
move.l pr_CIS(REG_Process),d0
lsl.l #2,d0
movea.l d0,REG_CIS ;contains APTR to CIS
move.l REG_CIS,sf_CIS(sp)
move.l fh_Buf(REG_CIS),sf_SCB_Buf(sp)
move.l fh_Pos(REG_CIS),sf_SCB_Pos(sp)
move.l fh_End(REG_CIS),sf_SCB_End(sp)
* convert argument to LF-terminated string
movea.l ARG_ARGS(REG_PrevStack),a0 ;third argument to "System0()"
lea sf_CommandArgs(sp),a1 ;first buffer location
move.l a1,d0
lsr.l #2,d0 ;make buffer pointer a BPTR
move.l d0,fh_Buf(REG_CIS)
move.w #MAXBSTR,d0 ;leave some room for terminating LF
bra.s 4$
3$ move.b d1,(a1)+
4$ move.b (a0)+,d1
dbeq d0,3$
move.b #LF,(a1)
suba.l ARG_ARGS(REG_PrevStack),a0 ;subtract first position
move.l a0,d0 ;do NOT subtract, LF need this byte
* setup start/end indices in Stream Control Block
clr.l fh_Pos(REG_CIS)
move.l d0,fh_End(REG_CIS)
* misc setup
clr.l pr_Result2(REG_Process) ;clear secondary result
moveq #0,d0
move.l #SIGBREAKF_CTRL_C,d1
callsys SetSignal ;clear CTRL-C flag
* handle seglist and start address
move.l cli_Module(REG_CLI),sf_SaveModule(sp)
move.l ARG_SEGLIST(REG_PrevStack),d0 ;second argument to "System0()"
move.l d0,cli_Module(REG_CLI)
lsl.l #2,d0
movea.l d0,a3 ;make it a machine pointer in A3
* setup processor registers & C-interface
lea sf_CommandArgs(sp),a0
move.l fh_End(REG_CIS),d0
* setup processor registers, BCPL-interface, stack & return address for "Exit()"
movea.l sf_StackBase(sp),a1 ;BCPL stack, low end
move.l sf_PushSize(sp),d2
lea 4(a1,d2.l),a4 ;must not destroy REG_Process!
move.l sp,-(a4) ;previous stack frame
move.l d2,-(a4) ;stack size in bytes
move.l a4,pr_ReturnAddr(REG_Process)
movea.l a4,sp
movea.l _DOSBase,a4 ;large data memory model!
movem.l dl_A2(a4),a2/a5/a6
* now call the command at its entry point
jsr 4(a3) ;code starts one longword behind segment pointer
move.l d0,REG_Result ;save return code
* get old stackframe & reload old register contents
movea.l 4(sp),sp ;old stack frame
movea.l sf_Process(sp),a0
move.l sf_SaveReturnAddr(sp),pr_ReturnAddr(a0)
movea.l sf_CLI(sp),a0
move.l sf_SaveCommandName(sp),cli_CommandName(a0)
move.l sf_SaveModule(sp),cli_Module(a0)
* restore original contents of Current Input Stream
movea.l sf_CIS(sp),a0
lea sf_CommandArgs(sp),a1
move.l a1,d0
lsr.l #2,d0
cmp.l fh_Buf(a0),d0 ;still the same?
bne.s 5$ ;no: don't restore
move.l sf_SCB_Buf(sp),fh_Buf(a0)
5$ move.l sf_SCB_Pos(sp),fh_Pos(a0)
tst.l fh_End(a0) ;end index set?
beq.s 6$ ;no: don't restore
move.l sf_SCB_End(sp),fh_End(a0)
* free temporary stack
6$ movea.l AbsExecBase,REG_SysBase
movea.l sf_StackBase(sp),a1
move.l sf_StackSize(sp),d0
callsys FreeMem
quit1 movea.l sf_PrevStack(sp),sp ;UNLINK local variables
quit0 move.l REG_Result,d0
movem.l (sp)+,SAVED_REGS
rts
end
################
begin 777 System0.obj
M```#YP````````/I````94CG,#YV_RQX``23R4ZN_MHD0"`J`*QG``%TY8@FN
M0"I/(`\"``#\+D">_`(T+TT"`"]*`APO2P(@+VH`L`($=OX@*P`TY8@O0`(8-
M6(`O0`(4<@!.KO\Z2H!G``$N+T`"$"]K`!`"#"!M`"!#[P`!(`GDB"=``!`PY
M/`#_8`(2P1(85\C_^I'M`"`@"%.`'T```"`J`)SEB"A`+TP")"]L``P"*"]LR
M`!`"+"]L`!0","!M`"A#[P$`(`GDB"E```PP/`#_8`(2P1(85\C_^A*\``J1<
M[0`H(`A"K``0*4``%$*J`)1P`"(\```0`$ZN_LXO:P`\`@@@+0`D)T``/.6(_
M)D!![P$`("P`%")O`A`D+P(82?$H!"D/*0(E3`"P+DPH>0````!,[&0``"I.@
MJP`$)@`N;P`$(&\"'"%O`@0`L"!O`B`A;P(,`!`A;P((`#P@;P(D0^\!`"`)O
MY(BPJ``,9@8A;P(H``PA;P(L`!!*J``49P8A;P(P`!0L>``$(F\"$"`O`A1.7
MKO\N+F\"`"`#3-]\#$YU```#[P$```)?4WES=&5M,`````"!```"7T1/4T)A'
2<V4````!```!(`````````/RO
``
end
################
Ralph Babel | sys64824
Falkenweg 3 | (!#X3F0001)()
D-6204 Taunusstein | (**((void (**)(void))0xfc0004))();lphillips@lpami.wimsey.bc.ca (Larry Phillips) (08/27/90)
In <1990Aug28.092026.322@darwin.ntu.edu.au>, caldwell_t@darwin.ntu.edu.au writes: >I am looking for a program that does everything that EXECUTE does except WRTIE >TO THE DISK. > >Let me explain. I have a non-autobooting hard disk. So I have a >startup-sequence that does a few things and then EXECUTE dh0:s/ss > >To do this EXECUTE writes a copy of ss to t: . If this is on the boot floppy >then there is a large delay while the copy is written to its T directory. >If I assign t: to RAM: then i have to load in the ram-handler. If I assign t: >to hd0: there is a major problem If there is a validation happening. (It >happens every now and again). Well, there are a couple of things you can do. The first is to assign T: to RAM:, which will not (better not) have any sort of validation problems. You can assign it elsewhere later if you must. The second is to not use Execute at all, but to use something like: NewCLI CON:0/0/640/100 FROM dh0:s/ss This will give you a window about half the height of the screen (so you can still see what's going on in the first window), and will execute dh0:s/ss using the new window for IO, but without writing a temp file to T: >I think that this is what caused all validations from then on to hang. If validation on bootup is causing a problem for your s-s script(s), press CTRL-D on boot to break the script, then wait for the validation to finish, then reboot normally. >BTW: could anyone help me with the problem with the endless validation? We'd need more details. Validation can be caused by incomplete writes to disk (reset or power off or crash while writing), or by a bug in the trackdisk.device in version 1.2 of the OS. The bug shows up when a floppy is exactly full. Get rid of the writes to the temp file, delete any in the T: directory, and see if your problem still occurs. -larry -- It is not possible to both understand and appreciate Intel CPUs. -D.Wolfskill +-----------------------------------------------------------------------+ | // Larry Phillips | | \X/ lphillips@lpami.wimsey.bc.ca -or- uunet!van-bc!lpami!lphillips | | COMPUSERVE: 76703,4322 -or- 76703.4322@compuserve.com | +-----------------------------------------------------------------------+
caldwell_t@darwin.ntu.edu.au (08/28/90)
I am looking for a program that does everything that EXECUTE does except WRTIE TO THE DISK. Let me explain. I have a non-autobooting hard disk. So I have a startup-sequence that does a few things and then EXECUTE dh0:s/ss To do this EXECUTE writes a copy of ss to t: . If this is on the boot floppy then there is a large delay while the copy is written to its T directory. If I assign t: to RAM: then i have to load in the ram-handler. If I assign t: to hd0: there is a major problem If there is a validation happening. (It happens every now and again). I think that this is what caused all validations from then on to hang. There is no reason for the extra copy in T: as there is no need for substitutions in the script. BTW: could anyone help me with the problem with the endless validation? Any ideas, Malcolm Caldwell
jmeissen@ogicse.ogi.edu (John Meissen) (08/28/90)
In article <1990Aug28.092026.322@darwin.ntu.edu.au> caldwell_t@darwin.ntu.edu.au writes: > >There is no reason for the extra copy in T: as there is no need for >substitutions in the script. > Execute will also create a new copy if there are IF statements in the script -- John Meissen .............................. Oregon Advanced Computing Institute jmeissen@oacis.org (Internet) | "That's the remarkable thing about life; ..!sequent!oacis!jmeissen (UUCP) | things are never so bad that they can't jmeissen (BIX) | get worse." - Calvin & Hobbes
lphillips@lpami.wimsey.bc.ca (Larry Phillips) (08/29/90)
In <20523.26dbd2db@psuecl.bitnet>, d6b@psuecl.bitnet writes: >In article <1901@lpami.wimsey.bc.ca>, lphillips@lpami.wimsey.bc.ca (Larry Phillips) writes: >> >> We'd need more details. Validation can be caused by incomplete writes to disk >> (reset or power off or crash while writing), or by a bug in the >> trackdisk.device in version 1.2 of the OS. The bug shows up when a floppy is >> exactly full. Get rid of the writes to the temp file, delete any in the T: >> directory, and see if your problem still occurs. >> > >Do you really mean trackdisk, or are you referring to some file system? >If the latter, which file system has this bug? Thanks! Hmmm... really not sure. Since I only ever saw the bug on floppies, perhaps it was the OFS. -larry -- It is not possible to both understand and appreciate Intel CPUs. -D.Wolfskill +-----------------------------------------------------------------------+ | // Larry Phillips | | \X/ lphillips@lpami.wimsey.bc.ca -or- uunet!van-bc!lpami!lphillips | | COMPUSERVE: 76703,4322 -or- 76703.4322@compuserve.com | +-----------------------------------------------------------------------+
Joseph P. Hillenburg (joseph@valnet.UUCP) (08/29/90)
Gee...you mean people at MicroSoft actually USE Amigas? Can you tell us
if MS has any Amiga stuff planned?
-Joseph Hillenburg (Sultan of Asm)
INET: joseph@valnet.uucp |MAIL: 1709 West Gray
UUCP: ...!iuvax!valnet!joseph |MAIL: Bloomington, IN 47401
AT&T: 1-812-336-2969 |MAIL: United States
CompSci BBS: 3/12/24 1-812-876-4407 9:30 pm-7:30 am |Mail replies requested
Those aren't bugs! Just undesirable features!d6b@psuecl.bitnet (08/30/90)
In article <1901@lpami.wimsey.bc.ca>, lphillips@lpami.wimsey.bc.ca (Larry Phillips) writes: > > We'd need more details. Validation can be caused by incomplete writes to disk > (reset or power off or crash while writing), or by a bug in the > trackdisk.device in version 1.2 of the OS. The bug shows up when a floppy is > exactly full. Get rid of the writes to the temp file, delete any in the T: > directory, and see if your problem still occurs. > Do you really mean trackdisk, or are you referring to some file system? If the latter, which file system has this bug? Thanks! -- Dan Babcock