PR#3 PREFIX /A2OSX.BUILD NEW INC 1 AUTO 6 .LIST OFF *-------------------------------------- * Y,A -> Command line (formatted & not empty) *-------------------------------------- Cmd.ExecYA stz Cmd.Exec.Mode Cmd.ExecYA.1 >SYSCALL ExpandPStrYA >STYA ZPPtr1 phx ldy #1 ldx #0 ARGS len lda (ZPPtr1),y .10 * cmp #'a' * bcc .11 * cmp #'z'+1 * bcs .11 * eor #$20 to Uppercase .11 sta CMD,y Store Cmd in Buffer sty CMD update CMD len tya cmp (ZPPtr1) beq .13 end of string iny lda (ZPPtr1),y cmp #' ' bne .10 .12 tya cmp (ZPPtr1) beq .13 end of string iny lda (ZPPtr1),y inx sta ARGS,x bra .12 .13 stx ARGS update ARGS len pla >SYSCALL FreeMemA >LDYA L.CMDS >STYA ZPPtr2 ldx #0 .1 lda (ZPPtr2) beq Cmd.Exec.EXT Ending 0, must be an external Cmd.... cmp CMD Same Len ? bne .4 tay .2 lda CMD,y cmp #'a' To Uppercase bcc .21 cmp #'z'+1 bcs .21 eor #$20 .21 cmp (ZPPtr2),y bne .4 dey bne .2 jsr .5 Found an internal Cmd... bcs .3 lda #0 .3 ldy #S.PS.RC sta (pPS),y rts .5 jmp (J.INTCMDS,x) .4 inx inx lda ZPPtr2 sec adc (ZPPtr2) sta ZPPtr2 bcc .1 inc ZPPtr2+1 bra .1 *-------------------------------------- Cmd.Exec.EXT ldy #1 lda CMD,y cmp #'/' Command line is already full path, no search beq .3 >LDYA L.ENV.PATH push ENVNAME=PATH for search >SYSCALL GetEnvYA get value for ENV=PATH bcs .1 No PATH, try in CD >PUSHYA push search list >PUSHW L.CMD >SYSCALL FileSearch bcc .2 .1 ldy #S.PS.hPREFIX not found, try in CD lda (pPs),y >SYSCALL GetMemPtrA >PUSHYA push search list >PUSHW L.CMD >SYSCALL FileSearch bcs .99 .2 phx save X=hMem, Y,A = Filename >PUSHYA >PUSHW L.CMD replace CMD in TmpBuffer with full path >SYSCALL PStrCpy pla >SYSCALL FreeMemA Discard this string... .3 stz UsrBuf256 reset UsrBuf256 for final CMDLINE >PUSHW L.STAT >PUSHW L.CMD >SYSCALL STAT bcs .99 lda STAT+S.STAT.P.TYPE cmp #$04 TXT File ? beq Cmd.Exec.EXT.TXT cmp #$06 BIN File ? beq Cmd.Exec.EXT.BIN cmp #$ff SYS File ? bne .9 bra * .9 lda #SYSMGR.ERRSYN sec .99 rts *-------------------------------------- * TXT : Launch "/PATH/SHELL /PATH/CMD ARGS" *-------------------------------------- Cmd.Exec.EXT.TXT lda #0 Get arg[0] = /PATH/SHELL >SYSCALL GetArgA >PUSHYA >PUSHWI UsrBuf256 >SYSCALL PStrCpy inc UsrBuf256 Add a space.... ldy UsrBuf256 lda #' ' sta UsrBuf256,y *-------------------------------------- * BIN : Launch "/PATH/CMD ARGS" *-------------------------------------- Cmd.Exec.EXT.BIN >PUSHW L.CMD >PUSHWI UsrBuf256 >SYSCALL PStrCat lda ARGS beq .1 inc UsrBuf256 Add a space.... ldy UsrBuf256 lda #' ' sta UsrBuf256,y >PUSHW L.ARGS >PUSHWI UsrBuf256 >SYSCALL PStrCat .1 >LDYAI UsrBuf256 bit Cmd.Exec.Mode bmi .2 startproc >SYSCALL ExecProcessNewEnvYA rts .2 >SYSCALL CreateProcessYA rts *-------------------------------------- * Internal Commands *-------------------------------------- Cmd.Exec.CD lda ARGS bne Cmd.Exec.CD1 Cmd.Exec.PWD ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL GetMemPtrA >SYSCALL PPrintFYA bcs .9 lda #13 >SYSCALL PutCA lda #10 >SYSCALL PutCA .9 rts Cmd.Exec.CD1 stz UsrBuf256 lda ARGS+1 cmp #'/' Full Path? beq .1 ldy #S.PS.hPREFIX no, init target prefix with actual prefix lda (pPs),y >SYSCALL GetMemPtrA >PUSHYA >PUSHWI UsrBuf256 >SYSCALL PStrCpy .1 >PUSHW L.ARGS Append ARG to buffer >PUSHWI UsrBuf256 >SYSCALL PStrCat lda #'/' ldx UsrBuf256 cmp UsrBuf256,x Ending '/' ? beq .2 sta UsrBuf256+1,x no, add one... inc UsrBuf256 .2 ldx #0 path is something like : /dir1/../dir2/ .3 ldy #0 reset char counter .4 cpx UsrBuf256 beq .8 inx lda UsrBuf256,x cmp #'/' beq .5 iny char=char+1!!! bra .4 .5 tya any char count? beq .4 no, start counting... cpy #2 do we have /xx/? bne .3 no, skip this token lda #'.' cmp UsrBuf256-1,x /yy/x./ ? bne .3 cmp UsrBuf256-2,x /yy/../ ? bne .3 cpx #4 /../ ? beq Cmd.Exec.ERRSYN illegal txa tay save end of /../ sec sbc #3 remove ../ tax .6 dex lda UsrBuf256,x Found beginning of dir before /../ cmp #'/' bne .6 .7 lda UsrBuf256,y strip dir/../ sta UsrBuf256,x cpy UsrBuf256 beq .71 iny inx bra .7 .71 stx UsrBuf256 bra .2 Start over... .8 cpx #1 beq .80 we have '/' go change prefix >PUSHW L.STAT >PUSHWI UsrBuf256 >SYSCALL STAT bcs .9 lda STAT+S.STAT.P.TYPE cmp #$0F Directory ? bne Cmd.Exec.ERRSYN .80 >LDYAI UsrBuf256 >SYSCALL NewPStrYA bcs .9 phx ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL FreeMemA pla ldy #S.PS.hPREFIX sta (pPs),y jsr SetPWD clc .9 rts *-------------------------------------- Cmd.Exec.ERRSYN lda #SYSMGR.ERRSYN sec rts *-------------------------------------- Cmd.Exec.STARTPROC lda ARGS beq Cmd.Exec.ERRSYN sec ror Cmd.Exec.Mode >LDYA L.ARGS jmp Cmd.ExecYA.1 *-------------------------------------- Cmd.Exec.SET lda ARGS bne Cmd.Exec.SETVAR ldy #S.PS.hENV lda (pPs),y >SYSCALL GetMemPtrA >STYA ZPPTR1 * No arg, print all ENV .1 lda (ZPPTR1) beq .8 Ending 0 ? lda ZPPTR1 get next for value sec adc (ZPPTR1) Add len+1 to PTR sta ZPPTR2 lda ZPPTR1+1 adc #0 sta ZPPTR2+1 lda (ZPPTR2) just in case... beq .8 >PUSHW ZPPTR2 Push value >PUSHW ZPPTR1 Push name >LDYA L.MSG.PRINTENV >SYSCALL PPrintFYA bcs .9 lda ZPPTR2 sec adc (ZPPTR2) Add len+1 to PTR sta ZPPTR1 lda ZPPTR2+1 adc #0 sta ZPPTR1+1 bra .1 .8 clc .9 rts Cmd.Exec.SETVAR tax lda ARGS,x cmp #'=' ARGS ends with =, UnsetEnv beq .2 .1 dex beq .3 no =, GetEnv lda ARGS,x cmp #'=' ARGS contains =, PutEnv bne .1 cpx #1 string is '=value' ? beq .99 syntax error >LDYA L.ARGS String is VAR=VALUE... >SYSCALL PutEnvYA rts .2 dec ARGS String is "VAR=", Remove endig '=' >LDYA L.ARGS String is "VAR"... >SYSCALL UnsetEnvYA rts * Print requested VAR .3 >LDYA L.ARGS >SYSCALL GetEnvYA bcs .8 >PUSHYA push value >PUSHW L.ARGS push name >LDYA L.MSG.PRINTENV >SYSCALL PPrintFYA .8 clc .9 rts .99 jmp Cmd.Exec.ERRSYN *-------------------------------------- Cmd.Exec.DATE sec .HS 90 bcc Cmd.Exec.TIME clc php >LDYA L.TIME >SYSCALL TimeYA >PUSHWI UsrBuf256 plp bcc .1 >PUSHW L.FMT.DATE bra .2 .1 >PUSHW L.FMT.TIME .2 >PUSHW L.TIME >SYSCALL PStrFTime >LDYAI UsrBuf256 >SYSCALL PPrintFYA bcs .9 lda #13 >SYSCALL PutCA lda #10 >SYSCALL PutCA .9 rts *-------------------------------------- Cmd.Exec.ECHO lda ARGS beq .1 >LDYA L.ARGS >SYSCALL PPrintFYA bcs .9 .1 lda #13 >SYSCALL PutCA lda #10 >SYSCALL PutCA .9 rts *-------------------------------------- Cmd.Exec.READ lda ARGS beq .9 lda #0 ldy #bSecureRead sta (pData),y lda pData clc adc #VarBuffer sta ZPPTR1 lda pData+1 adc #0 sta ZPPTR1+1 ldx #0 .1 cpx ARGS beq .8 inx lda ARGS,x cmp #' ' beq .1 cmp #'-' bne .7 cpx ARGS beq .9 inx lda ARGS,x cmp #'S' bne .2 ldy #bSecureRead lda #$80 sta (pData),y bra .1 .2 cmp #'P' bne .9 cpx ARGS beq .9 inx lda ARGS,x cmp #' ' bne .9 cpx ARGS beq .9 inx lda ARGS,x cmp #'"' bne .9 .3 cpx ARGS beq .9 inx lda ARGS,x cmp #'"' beq .1 phx >SYSCALL PutCA plx bcs .99 bra .3 .9 jmp Cmd.Exec.ERRSYN .70 inx lda ARGS,x cmp #' ' beq .1 .7 lda (ZPPTR1) cmp #VarLen.MAX beq .9 inc sta (ZPPTR1) tay lda ARGS,x sta (ZPPTR1),y cpx ARGS bne .70 .8 lda (ZPPTR1) No var name ? SYNERR beq .9 clc .99 rts *-------------------------------------- Cmd.Exec.PAUSE ldy #bPause lda #$80 sta (pData),y clc rts *-------------------------------------- Cmd.Exec.EXIT ldy #bEXIT lda #$FF sta (pData),y clc rts *-------------------------------------- MAN SAVE /A2OSX.SRC/SBIN/SHELL.S.CMD LOAD /A2OSX.SRC/SBIN/SHELL.S ASM