RUN Changes

Made RUN an implied command that can pass parameters to the called program.
This commit is contained in:
Peter Weingartner 2021-10-26 19:43:17 -04:00
parent 3509e83475
commit e0e900e56d
7 changed files with 8156 additions and 8140 deletions

View file

@ -425,10 +425,8 @@ short cli_exec(short channel, char * command, int argc, char * argv[]) {
} }
} }
// Built in command not found.. /* No built-in command that matched... try to run a binary file */
// TODO: search the current drive for an executable file return cmd_run(channel, argc, argv);
sys_chan_write(channel, cmd_not_found, strlen(cmd_not_found));
return -1;
} }
char * strtok_r(char * source, const char * delimiter, char ** saveptr) { char * strtok_r(char * source, const char * delimiter, char ** saveptr) {

View file

@ -1,4 +1,5 @@
#include <ctype.h> #include <ctype.h>
#include <stdio.h>
#include <string.h> #include <string.h>
#include "syscalls.h" #include "syscalls.h"
@ -153,16 +154,21 @@ short cmd_testcreate(short screen, int argc, char * argv[]) {
} }
} }
/*
* Try to run a command from storage.
*
* Command name is in argv[0].
*/
short cmd_run(short screen, int argc, char * argv[]) { short cmd_run(short screen, int argc, char * argv[]) {
TRACE("cmd_run"); TRACE("cmd_run");
if (argc > 1) { short result = proc_run(argv[0], argc, argv);
short result = proc_run(argv[1]); if (result < 0) {
if (result < 0) { print(screen, "Command not found...\n");
log_num(LOG_ERROR, "Unable to run: ", result); return -1;
return result;
}
} }
return result;
} }
/* /*
@ -249,7 +255,7 @@ short cmd_pwd(short screen, int argc, char * argv[]) {
/* /*
* Rename a file or directory * Rename a file or directory
*/ */
extern short cmd_rename(short screen, int argc, char * argv[]) { short cmd_rename(short screen, int argc, char * argv[]) {
TRACE("cmd_rename"); TRACE("cmd_rename");

File diff suppressed because it is too large Load diff

View file

@ -351,11 +351,16 @@ h_trap_15:
; a1 = location to set user stack pointer ; a1 = location to set user stack pointer
; ;
_call_user: _call_user:
move.l (4,a7),a0 move.l (4,a7),a0 ; Get the pointer to the code to start
move.l (8,a7),a1 move.l (8,a7),a1 ; Get the pointer to the process's stack
move.l (12,a7),d0 ; Get the number of parameters passed
move.l (16,a7),a2 ; Get the pointer to the parameters
andi #$dfff,sr ; Drop into user mode andi #$dfff,sr ; Drop into user mode
movea.l a1,a7 ; Set the stack movea.l a1,a7 ; Set the stack
jmp (a0)
move.l a2,-(a7) ; Push the parameters list
move.l d0,-(a7) ; Push the parameter count
jsr (a0)
_restart_cli: _restart_cli:
lea ___STACK,sp lea ___STACK,sp

11030
src/mapfile

File diff suppressed because it is too large Load diff

View file

@ -10,7 +10,7 @@
#include "log.h" #include "log.h"
#include "dev/fsys.h" #include "dev/fsys.h"
static const long k_default_stack = 0x0000ffff; /* For now... we're just going to put the user stack under 0x00010000 */ static const long k_default_stack = 0x00010000; /* For now... we're just going to put the user stack under 0x00010000 */
static int g_proc_result; static int g_proc_result;
/* /*
@ -18,7 +18,7 @@ static int g_proc_result;
*/ */
extern void restart_cli(); extern void restart_cli();
extern void call_user(long start, long stack); extern void call_user(long start, long stack, int argc, char * argv[]);
/* /*
* Start a user mode process * Start a user mode process
@ -26,15 +26,17 @@ extern void call_user(long start, long stack);
* Inputs: * Inputs:
* start = the address to start execution * start = the address to start execution
* stack = the location to start the user mode stack * stack = the location to start the user mode stack
* argc = the number of parameters
* argv = the array of parameters
*/ */
void proc_exec(long start, long stack) { void proc_exec(long start, long stack, int argc, char * argv[]) {
TRACE("proc_exec"); TRACE("proc_exec");
log_num(LOG_INFO, "proc_exec start: ", start); log_num(LOG_INFO, "proc_exec start: ", start);
log_num(LOG_INFO, "proc_exec stack: ", stack); log_num(LOG_INFO, "proc_exec stack: ", stack);
g_proc_result = 0; g_proc_result = 0;
call_user(start, stack); call_user(start, stack, argc, argv);
} }
/* /*
@ -63,11 +65,13 @@ int proc_get_result() {
* *
* Inputs: * Inputs:
* path = the path to try to load * path = the path to try to load
* argc = the number of parameters
* argv = the array of parameters
* *
* Returns: * Returns:
* returns an error code on failure, will not return on success * returns an error code on failure, will not return on success
*/ */
short proc_run(const char * path) { short proc_run(const char * path, int argc, char * argv[]) {
TRACE("proc_run"); TRACE("proc_run");
@ -79,7 +83,7 @@ short proc_run(const char * path) {
short result = fsys_load(path, 0, &start); short result = fsys_load(path, 0, &start);
if (result == 0) { if (result == 0) {
if (start != 0) { if (start != 0) {
proc_exec(start, k_default_stack); proc_exec(start, k_default_stack, argc, argv);
} else { } else {
log_num(LOG_ERROR, "Couldn't execute file: ", result); log_num(LOG_ERROR, "Couldn't execute file: ", result);
return ERR_NOT_EXECUTABLE; return ERR_NOT_EXECUTABLE;

View file

@ -15,8 +15,10 @@
* Inputs: * Inputs:
* start = the address to start execution * start = the address to start execution
* stack = the location to start the user mode stack * stack = the location to start the user mode stack
* argc = the number of parameters
* argv = the array of parameters
*/ */
extern void proc_exec(long start, long stack); extern void proc_exec(long start, long stack, int argc, char * argv[]);
/* /*
* Quit the current user process * Quit the current user process
@ -39,10 +41,12 @@ extern int proc_get_result();
* *
* Inputs: * Inputs:
* path = the path to try to load * path = the path to try to load
* argc = the number of parameters
* argv = the array of parameters
* *
* Returns: * Returns:
* returns an error code on failure, will not return on success * returns an error code on failure, will not return on success
*/ */
extern short proc_run(const char * path); extern short proc_run(const char * path, int argc, char * argv[]);
#endif #endif