********************************************************************
* Shell - OS-9 command line interpreter
*
* $Id$
*
* Ed.    Comments                                       Who YY/MM/DD
* ------------------------------------------------------------------
*  21    Original Tandy/Microware version
*  21r2  CHD no longer sets WRITE. permission           BGP 03/01/22

         nam   Shell
         ttl   OS-9 command line interpreter

* Disassembled 99/04/18 22:59:49 by Disasm v1.6 (C) 1988 by RML

         ifp1
         use   defsfile
         endc

tylg     set   Prgrm+Objct   
atrv     set   ReEnt+rev
rev      set   $02
edition  set   21

         mod   eom,name,tylg,atrv,start,size

         org   0
u0000    rmb   1
u0001    rmb   2
u0003    rmb   1
u0004    rmb   1
u0005    rmb   1
u0006    rmb   2
u0008    rmb   1
u0009    rmb   1
u000A    rmb   1
u000B    rmb   1
u000C    rmb   1
u000D    rmb   1
kbdsignl rmb   1
u000F    rmb   1
u0010    rmb   1
u0011    rmb   1
u0012    rmb   1
u0013    rmb   1
u0014    rmb   1
u0015    rmb   1
u0016    rmb   1
u0017    rmb   22
u002D    rmb   3
u0030    rmb   14
u003E    rmb   32
u005E    rmb   2
u0060    rmb   16
u0070    rmb   58
u00AA    rmb   85
u00FF    rmb   513
size     equ   .
name     equ   *

L000D    fcs   /Shell/
         fcb   edition

L0013    fcb   $13 
         fcs   "PascalS"
         fcb   $25 %
         fcs   "RunC"
         fcb   $22 "
         fcs   "RunB"
         fcb   $00 
         fcb   $00 
         fcb   $00 
         fcb   $00 
         fcb   $00 
         fcb   $00 
         fcb   $00 
         fcb   $00 
         fcb   $00 
Intro    fcb   C$LF
         fcc   "Shell"
         fcb   C$CR
DefPrmpt fcb   C$LF
OS9Prmpt fcc   "OS9:"
OS9PrmL  equ   *-OS9Prmpt
DefPrmL  equ   *-DefPrmpt

IcptRtn  stb   <kbdsignl
         rti

start    leas  -$05,s
         pshs  y,x,b,a
         ldb   #$6F
         lbsr  L0175
         leax  <IcptRtn,pcr
         os9   F$Icpt   
         puls  x,b,a
         std   <u0006
         beq   L005B
         lbsr  L017B
         bcs   L00C2
         tst   <u000C
         bne   L00C1
L005B    lds   ,s++
L005E    leax  <Intro,pcr
         tst   <u0012
         bne   L0076
         bsr   WriteLin
         bcs   Exit
L0069    leax  <DefPrmpt,pcr
         ldy   #DefPrmL
L0070    tst   <u0012
         bne   L0076
         bsr   WritLin2
L0076    clra  
         leax  <u0070,u
         ldy   #$00C8
         os9   I$ReadLn 
         bcc   L0094
         cmpb  #E$EOF
         beq   L00B8
L0087    tst   <u000F
         bne   L008F
         tst   <u0014
         bne   L00C2
L008F    os9   F$PErr   
         bra   L0069
L0094    cmpy  #$0001
         bhi   L00A4
         leax  >OS9Prmpt,pcr
         ldy   #OS9PrmL
         bra   L0070
L00A4    tst   <u0013
         beq   L00AA
         bsr   WriteLin
L00AA    lbsr  L017B
         bcc   L0069
         tstb  
         bne   L0087
         bra   L0069

eofmsg   fcc   "eof"
         fcb   C$CR

L00B8    tst   <u0012
         bne   L00C1
         leax  <eofmsg,pcr
         bsr   WriteLin
L00C1    clrb  
L00C2    lda   <u000F
         lbne  L0331
Exit     os9   F$Exit   

WriteLin ldy   #80
WritLin2 lda   #$02			stderr
         os9   I$WritLn 		write line
         rts   

* I=...
Immortal lbsr  L03B3
         lbcs  L02ED
         pshs  x
         ldb   #SS.DevNm
         leax  <u0016,u
         lda   #PDELIM
         sta   ,x+
         clra  				stdin
         os9   I$GetStt 		get device name
         puls  x
         lbcs  L02ED
         inc   <u000F
         inc   <u0010
         lbsr  L02ED
         clr   <u0010
         rts   

L00FB    fdb   Comment-*
         fcs   "*"
         fdb   Wait-*
         fcs   "W"
         fdb   Chd-*
         fcs   "CHD"
         fdb   Chx-*
         fcs   "CHX"
         fdb   Ex-*
         fcs   "EX"
         fdb   Kill-*
         fcs   "KILL"
         fdb   X-*
         fcs   "X"
         fdb   NOX-*
         fcs   "-X"
         fdb   Prompt-*
         fcs   "P"
         fdb   NoPrompt-*
         fcs   "-P"
         fdb   Echo-*
         fcs   "T"
         fdb   NoEcho-*
         fcs   "-T"
         fdb   SetPr-*
         fcs   "SETPR"
         fdb   Immortal-*
         fcs   "I="
         fdb   NextCmd-*
         fcs   ";"
         fdb   $0000
L013A    fdb   Pipe-*
         fcs   "!"
         fdb   NextCmd2-*
         fcs   ";"
         fdb   Backgrnd-*
         fcs   "&"
         fdb   Return-*
         fcb   $8D
L0146    fdb   AllRedir-*
         fcs   "<>>>"
         fdb   InErrRedir-*
         fcs   "<>>"
         fdb   InOutRedir-*
         fcs   "<>"
         fdb   OutErrRedir-*
         fcs   ">>>"
         fdb   ErrRedir-*
         fcs   ">>"
         fdb   InRedir-*
         fcs   "<"
         fdb   OutRedir-*
         fcs   ">"
         fdb   StkSize-*
         fcs   "#"
         fdb   $0000

L0169    fcb   $0d
         fcc   "()"
         fcb   $ff
L016D    fcb   $0d
         fcc   "!#&;<>"
         fcb   $ff

L0175    clr   b,u
         decb  
         bpl   L0175
         rts   
L017B    ldb   #$0E
         bsr   L0175
L017F    clr   <u0003
         clr   <kbdsignl
         leay  >L00FB,pcr
         lbsr  L020F
         bcs   L01DE
         cmpa  #C$CR
         beq   L01DE
         sta   <u000C
         cmpa  #'(
         bne   L01BA
         leay  >L000D,pcr
         sty   <u0004
         leax  $01,x
         stx   <u0008
L01A1    inc   <u000D
L01A3    leay  <L0169,pcr
         bsr   L0227
         cmpa  #'(
         beq   L01A1
         cmpa  #')
         bne   L01D6
         dec   <u000D
         bne   L01A3
         lda   #$0D
         sta   -$01,x
         bra   L01BE
L01BA    bsr   L01E1
         bcs   L01DE
L01BE    leay  <L016D,pcr
         bsr   L0227
         tfr   x,d
         subd  <u0008
         std   <u0006
         leax  -$01,x
         leay  >L013A,pcr
         bsr   L020F
         bcs   L01DE
         ldy   <u0004
L01D6    lbne  L0326
         cmpa  #C$CR
         bne   L017F
L01DE    lbra  L02ED
L01E1    stx   <u0004
         bsr   L01F4
         bcs   L01F3
L01E7    bsr   L01F4
         bcc   L01E7
         leay  >L0146,pcr
         bsr   L020F
         stx   <u0008
L01F3    rts   
L01F4    os9   F$PrsNam 
         bcc   L0205
         lda   ,x+
         cmpa  #C$PERD
         bne   L0209
         cmpa  ,x+
         beq   L0207
         leay  -$01,x
L0205    leax  ,y
L0207    clra  
         rts   
L0209    comb  
         leax  -$01,x
         ldb   #E$BPNAM
         rts   
L020F    bsr   L0241
         pshs  y
         bsr   L0264
         bcs   L0220
         ldd   ,y
         jsr   d,y
         puls  y
         bcc   L020F
         rts   
L0220    clra  
         lda   ,x
         puls  pc,y
L0225    puls  y
L0227    pshs  y
         lda   ,x+
L022B    tst   ,y
         bmi   L0225
         cmpa  #$22
         bne   L023B
L0233    lda   ,x+
         cmpa  #$22
         bne   L0233
         lda   ,x+
L023B    cmpa  ,y+
         bne   L022B
         puls  pc,y
L0241    pshs  x
         lda   ,x+
         cmpa  #C$SPAC
         beq   L0257
         cmpa  #C$COMA
         beq   L0257
         leax  >L016D,pcr
L0251    cmpa  ,x+
         bhi   L0251
         puls  pc,x
L0257    leas  $02,s
         lda   #C$SPAC
L025B    cmpa  ,x+
         beq   L025B
         leax  -$01,x
NextCmd  andcc #^Carry
         rts   
L0264    pshs  y,x
         leay  $02,y
L0268    ldx   ,s
L026A    lda   ,x+
         cmpa  #$61
         bcs   L0272
         suba  #$20
L0272    eora  ,y+
         lsla  
         bne   L0286
         bcc   L026A
         lda   -$01,y
         cmpa  #$C1
         bcs   L0283
         bsr   L0241
         bcs   L0286
L0283    clra  
         puls  pc,y,b,a
L0286    leay  -$01,y
L0288    lda   ,y+
         bpl   L0288
         sty   $02,s
         ldd   ,y++
         bne   L0268
         comb  
         puls  pc,y,x

Ex       lbsr  L01E1
         clra  
         bsr   L02B8
         bsr   L02B7
         bsr   L02B7
         bsr   Comment
         leax  $01,x
         tfr   x,d
         subd  <u0008
         std   <u0006
         leas  >u00FF,u
         lbsr  L0497
         os9   F$Chain  
         lbra  L00C2
L02B7    inca  
L02B8    pshs  a
         bra   L0313

Chx      lda   #DIR.+EXEC.
         bra   L02C2
*Chd      lda   #DIR.+UPDAT.		note write mode!!
* Removed WRITE. requirement above (some devices are read only)
Chd      lda   #DIR.+READ.		note write mode!!
L02C2    os9   I$ChgDir 
         rts   

Prompt   clra  
         bra   L02CB

NoPrompt lda   #$01
L02CB    sta   <u0012
         rts   

Echo     lda   #$01
         bra   L02D3
NoEcho   clra  
L02D3    sta   <u0013
         rts   

X        lda   #$01
         bra   L02DB

NOX      clra  
L02DB    sta   <u0014
         rts   
Comment  lda   #$0D
L02E0    cmpa  ,x+
         bne   L02E0
         cmpa  ,-x
         rts   
L02E7    pshs  b,a,cc

         lda   #$01
         bra   L02F1
L02ED    pshs  b,a,cc
         lda   #$02
L02F1    sta   <u0011
         clra  
L02F4    bsr   L02FF
         inca  
         cmpa  <u0011
         bls   L02F4
         ror   ,s+
         puls  pc,b,a
L02FF    pshs  a
         tst   <u0010
         bmi   L031B
         bne   L0313
         tst   a,u
         beq   L031E
         os9   I$Close  
         lda   a,u
         os9   I$Dup    
L0313    ldb   ,s
         lda   b,u
         beq   L031E
         clr   b,u
L031B    os9   I$Close  
L031E    puls  pc,a

L0320    fcc   "WHAT?"
         fcb   C$CR

L0326    bsr   L02ED
         leax  <L0320,pcr
         lbsr  WriteLin
         clrb  
         coma  
         rts   

L0331    inc   <u0010
         bsr   L02ED
         lda   #$FF
         sta   <u0010
         bsr   L02E7
         leax  <u0016,u
         bsr   L03BC
         lbcs  Exit
         lda   #$02
         bsr   L02FF
         lbsr  L03DC
         clr   <u0010
         lbra  L005E
InRedir  ldd   #$0001
         bra   L036E
ErrRedir ldd   #$020D
         stb   -$02,x
         bra   L035E

OutRedir lda   #$01
L035E    ldb   #$02
         bra   L036E
L0362    tst   a,u
         bne   L0326
         pshs  b,a
         tst   <u0010
         bmi   L0386
         bra   L0378
L036E    tst   a,u
         bne   L0326
         pshs  b,a
         ldb   #$0D
         stb   -$01,x
L0378    os9   I$Dup    
         bcs   L03A8
         ldb   ,s
         sta   b,u
         lda   ,s
         os9   I$Close  
L0386    lda   $01,s
         bmi   L0391
         ldb   ,s
         bsr   L03E1
         tsta  
         bpl   L0398
L0391    anda  #$0F
         os9   I$Dup    
         bra   L03A6
L0398    bita  #$02
         bne   L03A1
         os9   I$Open   
         bra   L03A6
L03A1    ldb   #PREAD.+READ.+WRITE.
         os9   I$Create 
L03A6    stb   $01,s
L03A8    puls  pc,b,a
L03AA    clra  
L03AB    ldb   #$03
         bra   L0362

AllRedir lda   #$0D
L03B1    sta   -$04,x
L03B3    bsr   L03BC
         bcc   L03DC
L03B7    rts   
InOutRedir
         lda   #$0D
         sta   -$02,x
L03BC    bsr   L03AA
         bcs   L03B7
         ldd   #$0180
         bra   L0362
InErrRedir
         lda   #$0D
         sta   -$03,x
         bsr   L03AA
         bcs   L03B7
         ldd   #$0280
         bra   L0362
OutErrRedir
         lda   #$0D
         sta   -$03,x
         lda   #$01
         bsr   L03AB
         bcs   L03B7
L03DC    ldd   #$0281
         bra   L0362
L03E1    pshs  x,b,a
         ldd   ,x++
         cmpd  #$2F30
         bcs   L040D
         cmpd  #$2F32
         bhi   L040D
         pshs  x,b,a
         lbsr  L0241
         puls  x,b,a
         bcs   L040D
         andb  #$03
         cmpb  $01,s
         bne   L0404
         ldb   $01,s
         ldb   b,u
L0404    orb   #$80
         stb   ,s
         puls  b,a
         leas  $02,s
         rts   
L040D    puls  pc,x,b,a

StkSize  ldb   #$0D
         stb   -$01,x
         ldb   <u0003
         lbne  L0326
         lbsr  ASC2Int
         eora  #'K
         anda  #$DF
         bne   L042C
         leax  $01,x
         lda   #$04
         mul   
         tsta  
         lbne  L0326
L042C    stb   <u0003
         lbra  L0241

Return   leax  -$01,x
         lbsr  L04CA
         bra   L043B

NextCmd2 lbsr  L04C6
L043B    bcs   L044E
         lbsr  L02ED
         bsr   L045F
L0442    bcs   L044E
         lbsr  L0241
         cmpa  #$0D
         bne   L044D
         leas  $04,s
L044D    clrb  
L044E    lbra  L02ED

Backgrnd bsr   L04C6
         bcs   L044E
         bsr   L044E
         ldb   #$26
         lbsr  L0597
         bra   L0442

Wait     clra  
L045F    pshs  a
L0461    os9   F$Wait   
         tst   <kbdsignl
         beq   L0479
         ldb   <kbdsignl
         cmpb  #$02
         bne   L0491
         lda   ,s
         beq   L0491
         os9   F$Send   
         clr   ,s
         bra   L0461
L0479    bcs   L0495
         cmpa  ,s
         beq   L0491
         tst   ,s
         beq   L0486
         tstb  
         beq   L0461
L0486    pshs  b
         bsr   L044E
         ldb   #$2D
         lbsr  L0597
         puls  b
L0491    tstb  
         beq   L0495
         coma  
L0495    puls  pc,a
L0497    lda   #Prgrm+Objct
         ldb   <u0003
         ldx   <u0004
         ldy   <u0006
         ldu   <u0008
         rts   
L04A3    lda   #EXEC.
         os9   I$Open   
         bcs   L0500
         leax  <u005E,u
         ldy   #$000D
         os9   I$Read   
         pshs  b,cc
         os9   I$Close  
         puls  b,cc
         lbcs  L0561
         lda   $06,x
         ldy   $0B,x
         bra   L04D9
L04C6    lda   #$0D
         sta   -$01,x
L04CA    pshs  u,y,x
         clra  
         ldx   <u0004
         IFGT  Level-1
         os9   F$NMLink 
         ELSE
         os9   F$Link
         ENDC
         bcs   L04A3
         ldx   <u0004
         os9   F$UnLoad 
L04D9    cmpa  #Prgrm+Objct
         beq   L0527
         sty   <u000A
         leax  >L0013,pcr
L04E4    tst   ,x
         beq   L055F
         cmpa  ,x+
         beq   L04F2
L04EC    tst   ,x+
         bpl   L04EC
         bra   L04E4
L04F2    ldd   <u0008
         subd  <u0004
         addd  <u0006
         std   <u0006
         ldd   <u0004
         std   <u0008
         bra   L0525
L0500    ldx   <u0006
         leax  $05,x
         stx   <u0006
         ldx   <u0004
         ldu   $04,s
         lbsr  InRedir
         bcs   L0561
         ldu   <u0008
         ldd   #$5820
         std   ,--u
         ldd   #$5020
         std   ,--u
         ldb   #$2D
         stb   ,-u
         stu   <u0008
         leax  >L000D,pcr
L0525    stx   <u0004
L0527    ldx   <u0004
         lda   #Prgrm+Objct
         IFGT  Level-1
         os9   F$NMLink 
         ELSE
         os9   F$Link
         ENDC
         bcc   L0535
         IFGT  Level-1
         os9   F$NMLoad
         ELSE
         os9   F$Load
         ENDC
         bcs   L0561
L0535    tst   <u0003
         bne   L0542
         tfr   y,d
         addd  <u000A
         addd  #$00FF
         sta   <u0003
L0542    lbsr  L0497
         os9   F$Fork   
         pshs  b,a,cc
         bcs   L0552
         ldx   #$0001
         os9   F$Sleep  
L0552    lda   #Prgrm+Objct
         ldx   <u0004
         clr   <u0004
         clr   <u0005
         os9   F$UnLoad 
         puls  pc,u,y,x,b,a,cc

L055F    ldb   #E$NEMod
L0561    coma  
         puls  pc,u,y,x

PipeName fcc   "/pipe"
         fcb   C$CR

Pipe     pshs  x
         leax  <PipeName,pcr
         ldd   #$0103
         lbsr  L0362
         puls  x
         bcs   L05CB
         lbsr  L04C6
         bcs   L05CB
         lda   ,u
         bne   L0589
         os9   I$Dup
         bcs   L05CB
         sta   ,u
L0589    clra  
         os9   I$Close  
         lda   #$01
         os9   I$Dup    
         lda   #$01
         lbra  L02FF
L0597    pshs  y,x,b,a
         pshs  y,x,b
         leax  $01,s
         ldb   #$2F
L059F    incb  
         suba  #100
         bcc   L059F
         stb   ,x+
         ldb   #$3A
L05A8    decb  
         adda  #$0A
         bcc   L05A8
         stb   ,x+
         adda  #$30
         ldb   #$0D
         std   ,x
         leax  ,s
         lbsr  WriteLin
         leas  $05,s
         puls  pc,y,x,b,a

* Kill a process
Kill     bsr   ASC2Int
         cmpb  #$02		compare against first user process ID
         bls   L05E7		if lower or same, 
         tfr   b,a		transfer process ID to A
         ldb   #S$Kill		load B with kill signal
         os9   F$Send   	and send to process in A
L05CB    rts   

* Entry: X = ASCII representation of number
* Exit : B = decimal value of ASCII number
ASC2Int  clrb  
L05CD    lda   ,x+
         suba  #$30
         cmpa  #$09
         bhi   L05DE
         pshs  a
         lda   #10
         mul   
         addb  ,s+
         bcc   L05CD
L05DE    lda   ,-x
         bcs   L05E5
         tstb  
         bne   L05CB
L05E5    leas  $02,s
L05E7    lbra  L0326

SetPr    bsr   ASC2Int
         stb   <u0015
         lbsr  L0241
         bsr   ASC2Int
         lda   <u0015
         os9   F$SPrior 
         rts   

         emod
eom      equ   *
         end
