10 REM > PrgEnvUniSrc 1.05 19Apr2020
   20 :
   30 A$=FNOS_GetEnv
   40 PRINT"run$=>"run$"<"
   50 PRINT"A$  =>"A$"<"
   60 PRINT"os% =";os%
   70 END
   80 :
   90 REM Universal Program Environment Functions
  100 REM =======================================
  110 :
  120 REM Return command line tail, sets run$ to execution filename
  130 REM Nearly universal version (exc. PDP11,32000)
  140 REM Works on BBCIO,BBC09,T6502,T6809,TZ80,ZX80,PDP11,ARMEval,ARMCoPro,RISCOS,DOS,Windows,Brandy
  150 REM -------------------------------------------------------------------------------------------
  160 DEFFNOS_GetEnv
  170 LOCAL A$,A%,X%,Y%
  180 X%=1:os%=((USR&FFF4)AND&FF00)DIV256:REM Get host
  190 :
  200 REM Brandy: (returns trailing space)
  210 IF !PAGE=&D7C1C7C5:run$=ARGV$(0):FORA%=0TOARGC:A$=A$+ARGV$(A%)+" ":NEXT:=MID$(A$,LENrun$+1)
  220 :
  230 REM Windows:
  240 IFos%>31:IFPAGE>&FFFFF:DIMX%LOCAL256:SYS"GetModuleFileName",0,X%,255:run$=$$X%:=@cmd$
  250 :
  260 IF?(TOP-3)<>0:A%=&600:IF HIMEM>&FFFF:A%=PAGE-&E00:IF PAGE>&C000:A%=PAGE-&500
  270 IF?(TOP-3)<>0:IF !(PAGE-&100)=@%:A%=PAGE-&200
  280 :REM Crunched to:
  290 IF?(TOP-3)<>0:A%=&600-&7B00*(PAGE>&8000)-&3F00*(PAGE>&C000)
  300 IF?(TOP-3)<>0:IF !(PAGE-&100)=@%:A%=PAGE-&200
  310 :REM Crunched to:
  320 IF?(TOP-3)<>0:A%=&600-&7B00*(PAGE>&8000)-&3F00*(PAGE>&C000):IF!(PAGE-&108)=@%:A%=PAGE-&208
  330 REM 6502:   A%=&0600
  340 REM 6809:   A%=&0600
  350 REM PDP11:  A%=PAGE-&208
  360 REM ARMdev: A%=&C000
  370 REM ARM:    A%=&8100
  380 REM 32016:  A%=&0600
  390 :
  400 IF?(TOP-3)=0 :A%=PAGE-&300                                    :REM Z80 with low workspace
  410 IF?(TOP-3)=0 :IF HIMEM<&FFFF:IF !(HIMEM+512)=@%:A%=HIMEM      :REM Z80 with high workspace
  420 IF?(TOP-3)=0 :IF HIMEM>&FFFF:A%=&100                          :REM 80x86
  430 REM Crunched to:
  440 IF?(TOP-3)=0:A%=&100:IFHIMEM<&FFFF:A%=PAGE-&300:IF!(HIMEM+512)=@%:A%=HIMEM
  450 REM Z80:   A%=PAGE-&300
  460 REM Z80:   A%=HIMEM
  470 REM 80x86: A%=&100 (PAGE movable if font included)
  480 
  490 REM Combined and crunched to:
  500 A%=&600-&7B00*(PAGE>&8000)-&3F00*(PAGE>&C000):IF!(PAGE-&100)=@%:A%=PAGE-&200
  510 IF?(TOP-3)=0:A%=&100:IFHIMEM<&FFFF:A%=PAGE-&300:IF!(HIMEM+512)=@%:A%=HIMEM
  520 REM 6502:   A%=&0600
  530 REM 6809:   A%=&0600
  540 REM ARMdev: A%=&C000
  550 REM ARM:    A%=&8100
  560 REM PDP11:  A%=PAGE-&200
  570 REM 32016:  A%=&0600 (wrong)
  580 REM 80x86:  A%=&100
  590 REM Z80lo:  A%=PAGE-&300
  600 REM Z80hi:  A%=HIMEM
  610 A$=$A%
  620 :
  630 REM Running from RISC OS command line drops command line
  640 IFPAGE=&8F00:run$=A$:SYS16TOA$,,A%:SYS72,"",A%:A$=MID$(A$,1+INSTR(A$+" "," ",1+INSTR(A$," "))):IFLENA$=0:A$=run$
  650 FORY%=-1TO0
  660   A$=" "+A$:REPEATA$=MID$(A$,2):UNTILASCA$<>32                       :REM Strip leading spaces
  670   IFASCA$=34:A%=INSTR(A$,"""",2)+1 ELSE A%=INSTR(A$+" "," ")         :REM Look for quote or space seperator
  680   IFY%:run$=MID$(A$,1-(ASCA$=34),A%-1+2*(ASCA$=34)):A$=MID$(A$,A%+1) :REM Strip first part into run$
  690 NEXT:=A$
  700 :
  710 REM Run a program, passing it a command line
  720 REM If program is *Command, called with OSCLI, else CHAINed
  730 REM -------------------------------------------------------
  740 DEFPROCos(A$):IFASCA$=42:OSCLIA$ ELSE IFA$<>"":CHAINA$
  750 ENDPROC
  760 :
  770 REM Exit program, setting return value
  780 REM ----------------------------------
  790 DEFPROCexit(A%):OSCLI"FX1,"+STR$(A%AND255):quit$=quit$:A$=quit$:quit$="":PROCos(A$)
  800 IFPAGE>&FFFFF:QUIT A%
  810 IFos%<6:END ELSE *Quit
  820 ENDPROC
  830 :