Mercurial > hg > Members > kono > nitros9-code
changeset 1862:25d7f19ee2e8
To be tested later
author | boisy |
---|---|
date | Sun, 24 Jul 2005 22:58:24 +0000 |
parents | f1afde44ca59 |
children | ebec41c32d7d |
files | level1/cmds/tee.a level1/cmds/touch.a level1/cmds/tsmon.a |
diffstat | 3 files changed, 486 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/level1/cmds/tee.a Sun Jul 24 22:03:19 2005 +0000 +++ b/level1/cmds/tee.a Sun Jul 24 22:58:24 2005 +0000 @@ -14,7 +14,7 @@ * Disassembled 98/09/14 23:50:52 by Disasm v1.6 (C) 1988 by RML -* use os9defs.a + use defsfile.d rev set $00 edition set 2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/cmds/touch.a Sun Jul 24 22:58:24 2005 +0000 @@ -0,0 +1,407 @@ +******************************************************************** +* Touch - Changes last modification date/time +* +* $Id$ +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------------ +* 2 2003/01/11 Boisy G. Pitre +* Rewrote touch from scratch, made almost 90% smaller than C version +* found in the OS-9 Development System. + + nam Touch + ttl Changes last modification date/time + + use defsfile.d + +* Here are some tweakable options +DOHELP set 0 1 = include help info +STACKSZ set 128 estimated stack size +PARMSZ set 256 estimated parameter size +ZOPTSIZ set 64 max size of -z option's parameter + +* Module header definitions +rev set $00 +edition set 2 + + psect touch_a,Prgrm+Objct,ReEnt+rev,edition,200,start + +* Your utility's static storage vars go here + vsect +parmptr rmb 2 pointer to our command line params +bufptr rmb 2 pointer to user expandable buffer +bufsiz rmb 2 size of user expandable buffer +* What follows are utility specific options +nocreate rmb 1 +quiterr rmb 1 +filemode rmb 1 +filecnt rmb 1 +zoptflg rmb 1 1 = this option has been processed once already +zpath rmb 1 path to -z file +cleartop equ . everything up to here gets cleared at start +zopt rmb ZOPTSIZ buffer for what follows after -c= +* Next is a user adjustable buffer with # modifier on command line. +* Some utilities won't need this, some will. +* Currently set up to be larger for Level 2 than Level 1 +* Note: this buffer must come just before the stack + IFGT Level-1 +bigbuff rmb 8*1024 8K default buffer for Level 2 + ELSE +bigbuff rmb 512 512 byte default buffer for Level 1 + ENDC + endsect + +* Place constant strings here + IFNE DOHELP +HlpMsg fcb C$LF + fcc /Use: Touch [<opts>] <path> [<path>] [<opts>]/ + fcb C$LF + fcc / -c = don't create files/ + fcb C$LF + fcc / -q = don't quit on error/ + fcb C$LF + fcc / -x = search execution directory/ + fcb C$LF + fcc / -z = get files from standard input/ + fcb C$LF + fcc / -z=<file> get files from <file>/ + fcb C$LF +CR fcb C$CR +HlpMsgL equ *-HlpMsg + ENDC +UnkOpt fcc /unknown option: / +UnkOptL equ *-UnkOpt +CantTch fcc /can't touch "/ +CantTchL equ *-CantTch +EndCant fcc /" - / +EndCantL equ *-EndCant + +* Here's how registers are set when this process is forked: +* +* +-----------------+ <-- Y (highest address) +* ! Parameter ! +* ! Area ! +* +-----------------+ <-- X, SP +* ! Data Area ! +* +-----------------+ +* ! Direct Page ! +* +-----------------+ <-- U, DP (lowest address) +* +* D = parameter area size +* PC = module entry point abs. address +* CC = F=0, I=0, others undefined + +* The start of the program is here. +* Before any command line processing is done, we clear out +* our static memory from U to cleartop, then determine the +* size of our data area (minus the stack). +start pshs u,x save registers for later + leax <cleartop,u point to end of area to zero out + IFNE H6309 + subr u,x subtract U from X + tfr x,w and put X in W + clr ,-s put a zero on the stack + tfm s,u+ and use TFM to clear starting at U + leas 1,s clean up the stack + ELSE + pshs x save end pointer on stack +clrnxt clr ,u+ clear out + cmpu ,s done? + bne clrnxt branch if not + leas 2,s else clear stack + ENDC + puls x,u and restore our earlier saved registers + leay bigbuff,u point Y to copy buffer offset in U + stx <parmptr save parameter pointer + sty <bufptr save pointer to buffer + tfr s,d place top of stack in D + IFNE H6309 + subr y,d + ELSE + pshs y save Y on stack + subd ,s++ get size of space between copybuf and X + ENDC + subd #STACKSZ+PARMSZ subtract out our stack + std <bufsiz size of our buffer + +* At this point we have determined our buffer space and saved pointers +* for later use. Now we will parse the command line for options that +* begin with - + lda ,x + cmpa #C$CR CR? + lbeq ShowHelp if so, no parameters... show help and exit +GetChar lda ,x+ get next character on cmd line + cmpa #C$CR CR? + lbeq DoTouch if so, do whatever this utility does + cmpa #'- is it an option? + beq GetDash if so, process it + inc <filecnt else must be a non-option argument (file) + lbsr SkipNSpc move past the argument +ChkDash lbsr SkipSpcs and any following spaces + bra GetChar start processing again +GetDash lda #C$SPAC get a space char + sta -1,x and wipe out the dash from the cmd line +GetDash2 ldd ,x+ load option char and char following + ora #$20 make lowercase +IsItC cmpa #'c is it this option? + bne IsItQ branch if not + sta <nocreate + lbra FixCmdLn +IsItQ cmpa #'q is it this option? + bne IsItX branch if not + inc <quiterr + lbra FixCmdLn +IsItX cmpa #'x is it this option? + bne IsItZ branch if not + lda #EXEC. + sta <filemode + bra FixCmdLn +IsItZ cmpa #'z is it this option? + bne BadOpt branch if not + tst <zoptflg was this option already specified? + bne BadOpt show help if so + sta <zoptflg else tag this option as parsed + cmpb #'= 2nd char =? + bne FixCmdLn +GetZFile ldb #C$SPAC get space + stb -$01,x write over c + stb ,x+ and = sign, inc X to dest dir +* check for valid char after -z= + lda ,x + cmpa #C$SPAC + lbeq ShowHelp + cmpa #C$COMA + lbeq ShowHelp + cmpa #C$CR + lbeq ShowHelp + leay <zopt,u point Y to parameber buffer + tfr y,d transfer Y to D + addd #ZOPTSIZ + pshs b,a save updated ptr value + ldb #C$SPAC get space +L0339 lda ,x get byte at X + stb ,x+ store space at X and inc + sta ,y+ save loaded byte at Y and inc + cmpy ,s are we at end? + beq L035D branch if so (buffer too small) + cmpa #C$SPAC else is char in A a space? + beq L0350 branch if so + cmpa #C$COMA coma? + beq L0350 branch if so + cmpa #C$CR cr? + bne L0339 get next byte if not +L0350 leax -1,x + sta ,x restore previous A + leas $02,s kill stack +* attempt to open a path to the file + pshs x + leax <zopt,u + lda #READ. + os9 I$Open + lbcs Exit + sta <zpath + puls x + lbra ChkDash +L035D leas $02,s + ldb #$BF else buffer size too small + orcc #Carry + lbra Exit +FixCmdLn lda #C$SPAC get space + sta -$01,x and wipe out option character + cmpb #'0 + lblt ChkDash start dash option processing again + lbra GetDash possibly another option following? + +* We branch here if we encounter an unknown option character +* A = bad option character +BadOpt leax UnkOpt,pcr + ldy #UnkOptL + ldb #C$CR + pshs d save bad option and CR on stack + lda #$02 stderr + os9 I$Write + leax ,s point X at option char on stack + os9 I$WritLn print option and CR + puls d clean up stack + lbra ShowHelp + + +* At this point options are processed. +* We load X with our parameter pointer and go down the command line +* looking at each file to process (options have been wiped out with +* spaces) +* +* Note, the following two instructions may not be needed, depending on +* if your utility requires a non-option on the command line. +DoTouch tst <zoptflg -z specified? + beq DoFiles no, do any files on command line +ReadZ lda <zpath + ldy #80 + os9 I$ReadLn + lbsr SkipSpcs + cmpa #C$CR + beq ClosEx + bcs TestErr + bsr ProcFile + bra ReadZ +TestErr cmpb #E$EOF + lbne Exit + tsta + lbeq ExitOk +ClosEx os9 I$Close close path to -z= file + lbra ExitOk + +DoFiles tst <filecnt we should have at least one file on cmdline + lbeq ShowHelp if not, exit with error + ldx <parmptr get our parameter pointer off stack +DoLoop lbsr SkipSpcs skip any leading spaces + cmpa #C$CR end of parameters? + beq ExitOk if so, end the utility + pshs x save pointer to arg + bsr ProcFile process file at X + puls x get arg pointer + lbsr SkipNSpc skip the argument we just processed + bra DoLoop + +* This routine processes one file at a time. +* Entry: X = ptr to argument on the command line. +* On exit, X can point to the argument or past it. +* Note that there are NO leading spaces. +* They have been skipped by the caller. +* The following code just echos the command line argument, followed +* by a carriage return. +ProcFile + lda #WRITE. + ora <filemode + pshs x + os9 I$Open + puls x + bcc CloseIt + ora #DIR. + pshs x + os9 I$Open + puls x + bcc CloseIt +* open failed... should we do create? + tst <nocreate + beq DoCreate +ChkQuit bsr CantTouch + tst <quiterr + beq ExitOK + bra ProcRTS +DoCreate ldb #PREAD.+UPDAT. + pshs x + os9 I$Create + puls x + bcs ChkQuit +CloseIt os9 I$Close +ProcRTS rts + +CantTouch + pshs x,b save pointer to file and error code + leax CantTch,pcr + lda #$02 + ldy #CantTchL + os9 I$Write + ldx 1,s + pshs x + bsr StrLen + puls x + os9 I$Write + leax EndCant,pcr + ldy #EndCantL + os9 I$Write + puls b + os9 F$PErr + puls x,pc + +ShowHelp equ * + IFNE DOHELP + leax >HlpMsg,pcr point to help message + ldy #HlpMsgL get length + lda #$02 std error + os9 I$WritLn write it + ENDC +ExitOk clrb clear carry +Exit os9 F$Exit and exit + +* This routine counts the number of non-whitespace characters +* starting at X +* +* Entry: +* X = ptr to string (space, comma or CR terminated) +* Exit: +* Y = length of string +* X = ptr to byte after string +StrLen pshs a + ldy #$0000 +StrLenLp lda ,x+ + cmpa #C$SPAC + beq StrLenEx + cmpa #C$COMA + beq StrLenEx + cmpa #C$CR + beq StrLenEx + leay 1,y + bra StrLenLp +StrLenEx puls a,pc + +* This routine copies a string of text from X to Y until +* a whitespace character or CR is encountered +* +* Entry: +* X = ptr to src string +* Y = ptr to dest string +* Exit: +* D = number of bytes copied +* X = ptr to byte after original string +* Y = ptr to byte after copied string +StrCpy pshs u + ldu #$0000 +CopyFnLp lda ,x+ + cmpa #C$SPAC + beq CopyFnEx + cmpa #C$COMA + beq CopyFnEx + cmpa #C$CR + beq CopyFnEx + sta ,y+ + leau 1,u + bra CopyFnLp +CopyFnEx tfr u,d + puls u,pc + +* This routine skip over spaces and commas +* +* Entry: +* X = ptr to data to parse +* Exit: +* X = ptr to first non-whitespace char +* A = non-whitespace char +SkipSpcs lda ,x+ + cmpa #C$SPAC + beq SkipSpcs + cmpa #C$COMA + beq SkipSpcs + leax -1,x + rts + +* This routine skips over everything but spaces, commas and CRs +* +* Entry: +* X = ptr to data to parse +* Exit: +* X = ptr to first whitespace char +* A = whitespace char +SkipNSpc lda ,x+ + cmpa #C$SPAC + beq EatOut + cmpa #C$COMA + beq EatOut + cmpa #C$CR + bne SkipNSpc +EatOut leax -1,x + rts + + endsect
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/cmds/tsmon.a Sun Jul 24 22:58:24 2005 +0000 @@ -0,0 +1,78 @@ +******************************************************************* +* Tsmon - Timesharing monitor +* +* $Id$ +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------------ +* 6 ????/??/?? +* From Tandy OS-9 Level Two VR 02.00.01. + + nam Tsmon + ttl Timesharing monitor + + use defsfile.d + +rev set $00 +edition set 8 + + psect tsmon_a,Prgrm+Objct,ReEnt+rev,edition,200,start + + vsect +childid rmb 1 +parmptr rmb 2 +parmlen rmb 2 +inbuff rmb 128 + endsect + +Login fcc "LOGIN" +LoginPrm fcb C$CR + +IcptRtn rti + +start stx <parmptr,u save parameter pointer + std <parmlen,u save parameter length + leax IcptRtn,pcr point to intercept routine + os9 F$Icpt and set it +L0024 ldx <parmptr,u get pointer to parameter + ldd <parmlen,u and length + cmpd #$0002 + bcs L0052 + lda ,x get byte at command line + cmpa #C$CR cr? + beq L0052 if so, branch + clra stdin + os9 I$Close close it + lda #UPDAT. + os9 I$Open open device on command line + bcs Exit branch if error + inca A = 1 + os9 I$Close close stdout + inca A = 2 + os9 I$Close close stderr + clra stdin path + os9 I$Dup dup to stdout + bcs Exit branch if error + os9 I$Dup dup to stderr + bcs Exit branch if error +L0052 clra stdin + leax <inbuff,u point to buffer + ldy #$0001 read 1 byte + os9 I$ReadLn read line + bcs L0024 branch if error + lda #Objct object + clrb no additional mem + leax <Login,pcr point to login + leau <LoginPrm,pcr and to parameters + ldy #$0000 parameter size + os9 F$Fork fork program + bcs L0024 branch if error + sta <childid else save process ID of child +L0072 os9 F$Wait wait for it to finish + cmpa <childid same as PID we forked? + bne L0072 if not, wait more + bra L0024 else go back +Exit os9 F$Exit exit + + endsect