PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF *-------------------------------------- * Y,A -> Command line (formatted & not empty) *-------------------------------------- Cmd.ExecYA stz Cmd.Exec.Mode Cmd.ExecYA.1 >SYSCALL SYS.ExpandPStrYA bcs .99 stx hCmdLine >STYA ZPPtr1 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 lda hCmdLine Discard Expanded Cmd Line >SYSCALL SYS.FreeMemA >LDYA L.CMDS >STYA ZPPtr2 ldx #0 .1 lda (ZPPtr2) beq Cmd.Exec.EXT Ending 0, must be an external Cmd.... cmp CMD bne .4 tay .2 lda CMD,y .3 cmp (ZPPtr2),y bne .4 dey bne .2 jmp (J.INTCMDS,x) Found an internal Cmd... .4 inx inx lda ZPPtr2 sec adc (ZPPtr2) sta ZPPtr2 bcc .1 inc ZPPtr2+1 bra .1 .99 rts *-------------------------------------- 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 SYS.GetEnvYA get value for ENV=PATH bcs .1 No PATH, try in CD >PUSHYA push search list >PUSHW L.CMD >SYSCALL SYS.FileSearch bcc .2 .1 ldy #S.PS.hPREFIX not found, try in CD lda (pPs),y >SYSCALL SYS.GetMemPtrA >PUSHYA push search list >PUSHW L.CMD >SYSCALL SYS.FileSearch bcs .99 .2 phx save X=hMem, Y,A = Filename >PUSHYA >PUSHW L.CMD replace CMD in TmpBuffer with full path >SYSCALL SYS.PStrCpy pla >SYSCALL SYS.FreeMemA Discard this string... .3 stz TmpBuffer256 reset TmpBuffer256 for final CMDLINE >LDYA L.CMD >SYSCALL SYS.MLIGetFileInfoYA bcs .99 >STYA ZPPtr2 ldy #1 Get File Type lda (ZPPtr2),y 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 SYS.GetArgA >PUSHYA >PUSHWI TmpBuffer256 >SYSCALL SYS.PStrCpy inc TmpBuffer256 Add a space.... ldy TmpBuffer256 lda #' ' sta TmpBuffer256,y *-------------------------------------- * BIN : Launch "/PATH/CMD ARGS" *-------------------------------------- Cmd.Exec.EXT.BIN >PUSHW L.CMD >PUSHWI TmpBuffer256 >SYSCALL SYS.PStrCat lda ARGS beq .1 inc TmpBuffer256 Add a space.... ldy TmpBuffer256 lda #' ' sta TmpBuffer256,y >PUSHW L.ARGS >PUSHWI TmpBuffer256 >SYSCALL SYS.PStrCat .1 >LDYAI TmpBuffer256 bit Cmd.Exec.Mode bmi .2 startproc >SYSCALL SYS.ExecProcessNewEnvYA rts .2 >SYSCALL SYS.CreateProcessYA rts *-------------------------------------- * Internal Commands *-------------------------------------- Cmd.Exec.CD lda ARGS bne Cmd.Exec.CD1 ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL SYS.GetMemPtrA >SYSCALL SYS.PStrOutYA bcs .9 lda #13 >SYSCALL SYS.COutA .9 rts Cmd.Exec.CD1 lda ARGS+1 cmp #'/' Full Path? bne .1 >LDYA L.ARGS bra Cmd.Exec.CD.Change .1 ldy #S.PS.hPREFIX no, init target prefix with actual lda (pPs),y >SYSCALL SYS.GetMemPtrA >PUSHYA >PUSHWI TmpBuffer256 >SYSCALL SYS.PStrCpy lda ARGS+1 cmp #'.' ".." ? bne .3 cmp ARGS+2 ".." ? bne .9 ldy TmpBuffer256 remove last dir component in actual prefix .2 dey beq .9 nothing to remove, synerr lda TmpBuffer256,y cmp #'/' bne .2 sty TmpBuffer256 >LDYAI TmpBuffer256 bra Cmd.Exec.CD.Change .9 lda #SYSMGR.ERRSYN sec rts .3 >PUSHW L.ARGS Append ARG to buffer >PUSHWI TmpBuffer256 >SYSCALL SYS.PStrCat ldx TmpBuffer256 lda #'/' Ending with '/'? cmp TmpBuffer256,x beq .4 sta TmpBuffer256+1,x inc TmpBuffer256 .4 >LDYAI TmpBuffer256 Cmd.Exec.CD.Change >STYA ZPPtr1 >SYSCALL SYS.CheckPrefixYA bcs .9 >LDYA ZPPtr1 >SYSCALL SYS.NewPStrYA bcs .9 phx ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL SYS.FreeMemA pla ldy #S.PS.hPREFIX sta (pPs),y clc .9 rts *-------------------------------------- Cmd.Exec.STARTPROC lda ARGS beq Cmd.Exec.ERRSYN sec ror Cmd.Exec.Mode >LDYA L.ARGS jmp Cmd.ExecYA.1 Cmd.Exec.ERRSYN lda #SYSMGR.ERRSYN sec rts *-------------------------------------- Cmd.Exec.SET lda ARGS bne Cmd.Exec.SETVAR ldy #S.PS.hENV lda (pPs),y >SYSCALL SYS.GetMemPtrA >STYA ZPPTR1 .1 lda (ZPPTR1) beq .8 Ending 0 ? >LDYA ZPPTR1 >SYSCALL SYS.PStrOutYA bcs .9 lda ZPPTR1 sec adc (ZPPTR1) Add len+1 to PTR sta ZPPTR1 bcc .2 inc ZPPTR1+1 .2 lda #'=' >SYSCALL SYS.COutA bcs .9 >LDYA ZPPTR1 >SYSCALL SYS.PStrOutYA bcs .9 lda #13 >SYSCALL SYS.COutA bcs .9 lda ZPPTR1 sec adc (ZPPTR1) Add len+1 to PTR sta ZPPTR1 bcc .1 inc 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 Cmd.Exec.ERRSYN syntax error >LDYA L.ARGS String is VAR=VALUE... >SYSCALL SYS.PutEnvYA rts .2 dec ARGS String is "VAR=", Remove endig '=' >LDYA L.ARGS String is "VAR"... >SYSCALL SYS.UnsetEnvYA rts .3 >LDYA L.ARGS String is VAR... >SYSCALL SYS.PStrOutYA bcs .9 lda #'=' >SYSCALL SYS.COutA bcs .9 >LDYA L.ARGS >SYSCALL SYS.GetEnvYA bcs .8 >SYSCALL SYS.PStrOutYA Y,A = VALUE .8 lda #13 >SYSCALL SYS.COutA .9 rts *-------------------------------------- Cmd.Exec.DATE >LDYA L.TIME >SYSCALL SYS.TimeYA >PUSHWI TmpBuffer256 >PUSHW L.FMT.DATE >PUSHW L.TIME >SYSCALL SYS.StrFTime >LDYAI TmpBuffer256 >SYSCALL SYS.PStrOutYA bcs .9 lda #13 >SYSCALL SYS.COutA .9 rts *-------------------------------------- Cmd.Exec.TIME >LDYA L.TIME >SYSCALL SYS.TimeYA >PUSHWI TmpBuffer256 >PUSHW L.FMT.TIME >PUSHW L.TIME >SYSCALL SYS.StrFTime >LDYAI TmpBuffer256 >SYSCALL SYS.PStrOutYA bcs .9 lda #13 >SYSCALL SYS.COutA .9 rts *-------------------------------------- Cmd.Exec.ECHO lda ARGS beq .9 >LDYA L.ARGS >SYSCALL SYS.PStrOutYA lda #13 >SYSCALL SYS.COutA clc rts .9 lda #SYSMGR.ERRSYN sec rts *-------------------------------------- Cmd.Exec.TYPE lda ARGS beq .98 >LDYA L.ARGS >SYSCALL SYS.LoadFileYA bcs .99 >STYA ZPPTR2 store file len phx txa >SYSCALL SYS.GetMemPtrA >STYA ZPPTR1 .1 lda ZPPTR2 bne .2 lda ZPPTR2+1 beq .3 dec ZPPTR2+1 .2 dec ZPPTR2 lda (ZPPTR1) >SYSCALL SYS.COutA inc ZPPTR1 bne .1 inc ZPPTR1+1 bra .1 .3 pla >SYSCALL SYS.FreeMemA clc rts .98 lda #SYSMGR.ERRSYN sec .99 rts *-------------------------------------- Cmd.Exec.READ clc 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 SBIN/SHELL.S.CMD LOAD SBIN/SHELL.S ASM