1 REM > CmdLine/src
    2 REM Demo fetching the command line into local memory
    3 REM Tested on RISC OS, SprowCoPro, ARMDev, PiTubeNative
    4 REM Bug: ARMDev '*RUN CMDLINE HELLO' gives 'CMDLINE HELLO'
    5 :
    6 load%=&8000:DIM mcode% &400
    7 PC=15:LINK=14:SP=13
    8 FOR P=0 TO 1:opt%=P*3+4
    9   P%=load%:O%=mcode%
   10   [OPT opt%
   11   \ CODE HEADER
   12   \ -----------
   13   .CODESTART
   14   .L0000:B Entry
   15   .L0004:EQUW &00
   16   .L0006:EQUB &6D
   17   .L0007:EQUB &00:\EQUB CopyR-L0000
   18   .Title:EQUB &00:EQUS "ARM Command Line Test"
   19          EQUB &00:EQUS "0.01 (10 Dec 2017)"
   20   .CopyR:EQUB &00:EQUS "(C)J.G.Harston":EQUB 0
   21          EQUD load%
   22          EQUD CodeEnd-L0000
   23          ALIGN
   24   .Entry
   25   MOV R0,#1:MOV R1,#0:MOV R2,#0
   26   SWI "XOS_Args"              :\ R2=address of comand line parameters
   27   ORRS R2,R2,R2:BMI rdcmdline :\ Command line in I/O processor
   28   SWI "OS_GetEnv"             :\ Read command line from local memory
   29   .rdcmdlinelp1
   30   LDRB R1,[R0],#1:CMP R1,#ASC" "
   31   BHI rdcmdlinelp1:SUB R0,R0,#1
   32   .rdcmdlinelp2
   33   LDRB R1,[R0],#1:CMP R1,#ASC" "
   34   BEQ rdcmdlinelp2:SUB R0,R0,#1
   35   B rdcmdlinedone           :\ R0=>command line parameters
   36   :
   37   .rdcmdline
   38   ADR  R3,cmdline           :\ R3=>local buffer
   39   ADR  R1,addr              :\ Point to control block
   40   .rdcmdlp1
   41   STR  R2,addr              :\ Store address in control block
   42   MOV  R0,#5:SWI "OS_Word"  :\ Read byte from I/O memory
   43   LDRB R0,[R1,#4]           :\ Get byte read
   44   STRB R0,[R3],#1           :\ Store in local buffer
   45   ADD  R2,R2,#1             :\ Increment command line address
   46   CMP  R0,#13:BNE rdcmdlp1  :\ Loop until <cr>
   47   ADR  R0,cmdline           :\ R0=>command line parameters
   48   .rdcmdlinedone
   49   :
   50   :
   51   MOV R1,R0
   52   SWI "OS_WriteS":EQUS "CMD=>":EQUB 0:ALIGN
   53   .CommandLine
   54   LDRB R0,[R1],#1:CMP R0,#ASC" "
   55   SWIHS "OS_WriteC":BHS CommandLine
   56   SWI 256+ASC"<":SWI "OS_NewLine"
   57   SWI "OS_Exit"
   58   :
   59   .addr
   60   EQUD 0:EQUB 0 :\ addr    = 5-byte buffer to read I/O memory
   61   .cmdline      :\ cmdline = 256-byte buffer to copy command line to
   62   \EQUS STRING$(128,CHR$0)
   63   \EQUS STRING$(128,CHR$0)
   64   ALIGN
   65   .CodeEnd
   66 ]NEXT
   67 PRINT "Saving";
   68 OSCLI "SAVE CmdLine "+STR$~mcode%+" "+STR$~O%+" "+STR$~load%+" "+STR$~load%
   69 PRINT