mirror of
https://github.com/GnoConsortium/gno.git
synced 2024-11-05 13:05:44 +00:00
2e0ebb5392
removed the need for p-string routines, so they were removed. Also removed alloc256/free256 and associated data structures. In removing calls, found instances in pwd & prefix commands and prompt handler where current directory name was assumed to be < 256 characters; recoded to use a flexible buffer size. Updated and expanded mmdebug.asm routines that perform error checking on memory management calls. Added macros ~NEW and ~DISPOSE that invoke either the real or debug routines. Fixed call to read $TERM variable's length to fix PR#81. Removed echo of data when setting value of $< in expandvars (expand.asm). The characters are echoed as they are typed and do not need to be reprinted on stdout after carriage-return is typed. Added error checking to the various flavors of prefix (just like cd): - Verify 2nd parameter is a valid directory before setting. - Verify 1st parameter < 32 before displaying or setting.
196 lines
3.4 KiB
NASM
196 lines
3.4 KiB
NASM
**************************************************************************
|
|
*
|
|
* The GNO Shell Project
|
|
*
|
|
* Developed by:
|
|
* Jawaid Bazyar
|
|
* Tim Meekins
|
|
*
|
|
* $Id: main.asm,v 1.6 1998/08/03 17:30:22 tribby Exp $
|
|
*
|
|
**************************************************************************
|
|
*
|
|
* MAIN.ASM
|
|
* By Tim Meekins
|
|
* Modified by Dave Tribby for GNO 2.0.6
|
|
*
|
|
* Startup portion of shell
|
|
*
|
|
* Note: text set up for tabs at col 16, 22, 41, 49, 57, 65
|
|
* | | | | | |
|
|
* ^ ^ ^ ^ ^ ^
|
|
**************************************************************************
|
|
|
|
mcopy /obj/gno/bin/gsh/main.mac
|
|
|
|
setcom 60
|
|
|
|
**************************************************************************
|
|
|
|
; Segment for direct-page and stack
|
|
|
|
stack data STACK ; ends up in main.root
|
|
kind $12
|
|
|
|
; Define direct-page/stack and fill it with question marks it can be
|
|
; examined for how much is used.
|
|
|
|
dc 128c'??' ; 256 bytes
|
|
dc 128c'??' ; 512 bytes total
|
|
dc 128c'????' ; 1024 bytes total
|
|
dc 128c'????????' ; 2048 bytes total
|
|
|
|
end
|
|
|
|
**************************************************************************
|
|
|
|
init START
|
|
|
|
; Call the code to emulate C program startup:
|
|
; store Accumulator in ~USER_ID, X- and Y- registers as ~COMMANDLINE
|
|
; start up memory manager (~MM_INIT)
|
|
; parse commandline (via ~GNO_PARSEARG) and push argc and arvg on stack
|
|
|
|
jml ~GNO_COMMAND
|
|
|
|
; Control continues with the entry point "MAIN". When MAIN returns to
|
|
; ~GNO_COMMAND via rtl, it frees argv and argc before doing its own rtl.
|
|
|
|
END
|
|
|
|
|
|
MAIN START
|
|
|
|
using global
|
|
|
|
p equ 0
|
|
arg equ p+4
|
|
space equ arg+4
|
|
|
|
subroutine (2:argc,4:argv),space
|
|
|
|
kernStatus @a
|
|
bcc ok
|
|
|
|
ErrWriteCString #str
|
|
jmp done
|
|
|
|
ok stz FastFlag
|
|
stz CmdFlag
|
|
stz ExecFlag
|
|
|
|
; Parse gsh's command-line arguments.
|
|
|
|
argloop dec argc Decrement argument count.
|
|
beq go_start If none left, ready to start working.
|
|
clc
|
|
lda argv Point to next
|
|
adc #4 argument pointer.
|
|
sta argv
|
|
ldy #2
|
|
lda [argv] Set arg to point to
|
|
sta arg the argument text.
|
|
lda [argv],y
|
|
sta arg+2
|
|
lda [arg] Get first character
|
|
and #$FF of argument.
|
|
cmp #'-' If it's a "-",
|
|
beq intoption handle as an option.
|
|
|
|
|
|
; Parse remaining args as a command to run (in ExecCmd)
|
|
|
|
inc ExecFlag
|
|
inc FastFlag
|
|
ph4 #1024
|
|
~NEW
|
|
sta ExecCmd
|
|
sta p
|
|
stx ExecCmd+2
|
|
stx p+2
|
|
|
|
cmd3 ldy #0
|
|
cmd0 lda [arg],y
|
|
and #$ff
|
|
beq cmd1
|
|
sta [p],y
|
|
iny
|
|
bra cmd0
|
|
cmd1 lda #' '
|
|
sta [p],y
|
|
sec ;inc a
|
|
tya
|
|
adc p
|
|
sta p
|
|
dec argc
|
|
beq cmd2
|
|
clc
|
|
lda argv
|
|
adc #4
|
|
sta argv
|
|
ldy #2
|
|
lda [argv]
|
|
sta arg
|
|
lda [argv],y
|
|
sta arg+2
|
|
bra cmd3
|
|
cmd2 lda #0
|
|
sta [p]
|
|
go_start bra start
|
|
|
|
|
|
; Parse an argument as an option (first character is "-")
|
|
|
|
intoption ldy #1
|
|
optloop lda [arg],y
|
|
and #$FF
|
|
beq nextarg
|
|
cmp #'f'
|
|
beq optf
|
|
cmp #'c'
|
|
beq parsec
|
|
|
|
; Option is not recognized.
|
|
showusage ErrWriteCString #usage
|
|
bra done
|
|
|
|
|
|
; Option = "-f": Skip history, gshrc
|
|
optf inc FastFlag
|
|
|
|
nextopt iny
|
|
bra optloop
|
|
|
|
nextarg cpy #1
|
|
beq showusage
|
|
jmp argloop
|
|
|
|
; Option = "-c": execute shell commands found in file named by next argument
|
|
parsec clc
|
|
lda argv
|
|
adc #4
|
|
sta argv
|
|
dec argc
|
|
beq showusage
|
|
inc CmdFlag
|
|
inc FastFlag
|
|
mv4 argv,CmdArgV
|
|
mv2 argc,CmdArgC
|
|
|
|
;
|
|
; When preliminary setup is complete, control transfers to here!
|
|
;
|
|
start case on
|
|
jsl shell
|
|
case off
|
|
|
|
done return
|
|
|
|
str dc h'0d0a0a'
|
|
dc c'Before gsh may be run, the GNO/ME system, or kernel, must be running.'
|
|
dc h'0d0a0a00'
|
|
|
|
usage dc c'Usage: gsh [-cf] [argument...]',h'0d0a00'
|
|
|
|
END
|