; > Lexical
;get line number to r0. EQ if succeed, NE otherwise
;uses r0,r1,r10
SPTSTN LDRB R10,[LINE],#1
 CMP R10,#" "
 BEQ SPTSTN
 CMP R10,#TCONST
 MOVNE PC,R14
SPGETN LDRB R10,[LINE],#1
 MOV R0,R10,LSL #2
 AND R1,R0,#&C0
 LDRB R10,[LINE],#1
 EOR R1,R1,R10
 LDRB R10,[LINE],#1
 EOR R0,R10,R0,LSL #2
 AND R0,R0,#255
 ORR R0,R1,R0,LSL #8
 MOV PC,R14
SPACES LDRB R10,[LINE],#1
 CMP R10,#" "
 BEQ SPACES
 MOV PC,R14
AESPAC LDRB R10,[AELINE],#1
 CMP R10,#" "
 BEQ AESPAC
 MOV PC,R14
INTEXA MOV AELINE,LINE
INTEXC STMFD SP!,{R14}
 BL EXPR
 TEQ TYPE,#0
 BEQ ERTYPEINT
 BLMI INTEGB
 CMP R10,#","
 LDMEQFD SP!,{PC}
 B ERCOMM
EQAEEX LDRB R10,[LINE],#1
 CMP R10,#" "
 BEQ EQAEEX
 CMP R10,#"="
 BNE MISSEQ
AEEXDN MOV AELINE,LINE
EXPRDN STMFD SP!,{R14}
 BL EXPR
 TEQ TYPE,#0
 BEQ ERTYPEINT
 BLMI INTEGB
 LDMFD SP!,{R14}
AEDONE MOV LINE,AELINE
 B DONE
AEDONES MOV LINE,AELINE
DONES LDRB R10,[LINE],#1
DONE CMP R10,#" "
 BEQ DONES
 CMP R10,#":"
 CMPNE R10,#13
 MOVEQ PC,R14
 CMP R10,#TELSE
 MOVEQ PC,R14
 B ERSYNT
;make string into os string (cr on end)
OSSTRI TEQ TYPE,#0
 BNE ERTYPESTR ;fail if not a string type
 MOV R0,#13
 STRB R0,[CLEN],#1
 ADD R1,ARGP,#STRACC
 MOV PC,R14
;check if character in a word, carry set if so
;features involved conditional returns!
WORDCQ CMP R0,#"z"
 BICHIS PC,R14,#CFLAG
 CMP R0,#"_"
 MOVCS PC,R14
 CMP R0,#"Z"
 BICHIS PC,R14,#CFLAG
 CMP R0,#"A"
 MOVCS PC,R14
NUMBCP CMP R0,#"9"
 BICHIS PC,R14,#CFLAG
 CMP R0,#"0"
 MOV PC,R14
NUMBCQ CMP R0,#"."
 BNE NUMBCP
 MOV PC,R14
;insert constant into dest
CONSTI MOV CONSTA,SMODE,LSR #8
 AND CONSTA,CONSTA,#&3F
 ORR CONSTA,CONSTA,#&40
 STRB CONSTA,[DEST,#2] ;write msb and &3f or &40
 AND CONSTA,SMODE,#&3F
 ORR CONSTA,CONSTA,#&40
 STRB CONSTA,[DEST,#1] ;write lsb and &3f or &40
 MOV CONSTA,SMODE,LSR #4+8
 AND CONSTA,CONSTA,#&C ;top two bits of msb
 AND SMODE,SMODE,#&C0
 ORR CONSTA,CONSTA,SMODE,LSR #2 ;or in top two bits of lsb
 EOR CONSTA,CONSTA,#&54
 STRB CONSTA,[DEST],#3 ;write and index past other bytes
 MOV PC,R14
;match from source (r1) to destination OUTPUT (in r2)
EVMATCH MOV DEST,SP ;on stack
 STMFD SP!,{R14} ;match for EVAL
 MOV SMODE,#0
 B YMATCH ;eval is right mode, no constants
MATCH ROUT
 STMFD SP!,{R14} ;match for main command line. Uses r0-r5.
 MOV SMODE,#0
 ADD DEST,ARGP,#OUTPUT
 MOV CONSTA,#TCONST ;command is left mode, constants
 B %97
CLIENTMATCH STMFD SP!,{R14}
 MOV SMODE,#0
 B %99
AUMATCH STMFD SP!,{R14} ;match for AUTO
 ADD DEST,ARGP,#OUTPUT ;output string
 MOV SMODE,#0 ;not in a string to start with
95 MOV CONSTA,#0 ;not in constant
97 MOV MODE,#0 ;left mode
99 LDRB R0,[SOURCE],#1
 STRB R0,[DEST],#1 ;copy byte assuming not a token
00 CMP R0,#" "
 BEQ %99 ;repeat if " "
 TEQ R0,#10
 MOVEQ R0,#13
 STREQB R0,[DEST,#-1]
 CMP R0,#13
 LDMEQFD SP!,{PC} ;return if carriage return copied
 CMP R0,#""""
 EOREQ SMODE,SMODE,#1 ;if a " flip smode
 TST SMODE,#255
 BNE %99 ;if lsb smode<>0 then continue copying chars (deals with REM also)
 TEQ SMODE,#0
 BMI %05 ;permanent error in bracket level
 CMP R0,#"("
 ADDEQ SMODE,SMODE,#&1000
 CMP R0,#")"
 SUBEQ SMODE,SMODE,#&1000
05 CMP R0,#"&"
 BNE %10 ;if ch="&" then
15 LDRB R0,[SOURCE],#1 ;repeat copy ch
 STRB R0,[DEST],#1
 BL NUMBCP
 BCS %15 ;while 0-9
 CMP R0,#"A"
 BCC %00
 CMP R0,#"G"
 BCC %15 ;or while A-F. O.K. to fall through since >="G"
 CMP R0,#"a"
 BCC %10
 CMP R0,#"g"
 BCC %15
10 CMP R0,#":"
 BEQ %95 ;If : then beginning of statement
 CMP R0,#","
 BEQ %99 ;If , ignore (no state change)
 CMP R0,#"*" ;If *
 BNE %20
 TEQ MODE,#0 ;If in left mode
 ORREQ SMODE,SMODE,#4 ;set impossible string mode
 BEQ %99 ;and continue processing. Else :
YMATCH MOV CONSTA,#0 ;no constants
 MOV MODE,#1 ;mode = right
 B %99
20 CMP R0,#"."
 BEQ MATCHZ
 BL NUMBCP
 BCC %30 ;If ch 0-9
 TEQ CONSTA,#0
 BEQ MATCHZ ;not allowed to be a constant
 STMFD SP!,{SOURCE,SMODE,CONSTA,MODE} ;in case of failure
 AND SMODE,R0,#15 ;initial value for constant
24 LDRB R0,[SOURCE],#1
 BL NUMBCP
 BCC %26
 AND R0,R0,#15
 ADD SMODE,SMODE,SMODE,LSL #2;smode *5
 ADD SMODE,R0,SMODE,LSL #1;smode*2+r0
 CMP SMODE,#65280 ;maximum constant plus 1
 BCC %24
;not a constant since it is too large
 LDMFD SP!,{SOURCE,SMODE,CONSTA,MODE}
 ORR SMODE,SMODE,#256
;enter matchz with numbcq true
MATCHZ LDRB R0,[SOURCE],#1 ;not constant number : repeat copy ch
 STRB R0,[DEST],#1
 BL NUMBCQ
 BCS MATCHZ ;until numbcq false
MATCHY MOV CONSTA,#0
 MOV MODE,#1
 B %00
;more of the constant encoder
26 STRB CONSTA,[DEST,#-1] ;overwrite number with token value
 BL CONSTI
 STRB R0,[DEST],#1 ;byte as yet uncopied
 PULLJ 1 ;throw away source from stack (lowest register, hence first)
 LDMFD SP!,{SMODE,CONSTA,MODE}
 B %00 ;examine current character
MATCHW BL WORDCQ
 BCC YMATCH
 B MATCHH
MATCHG LDMFD SP!,{SMODE,R6,R7,R8} ;not found
MATCHH LDRB R0,[SOURCE],#1
 STRB R0,[DEST],#1
 BL WORDCQ
 BCS MATCHH
 B MATCHY
30 CMP R0,#"A"
 BCC YMATCH
 CMP R0,#"W"
 BHI MATCHW ;not worth bothering
 STMFD SP!,{SMODE,R6,R7,R8}
;get table start
 ADR R6,(INDEXTAB-("A"*4))
 LDR R6,[R6,R0,LSL #2]
 ADD SMODE,PC,R6
50 LDRB R6,[SMODE],#1 ;get first char from table and move on
LEXICALADR CMP R0,R6 ;first character to check against
 BNE MATCHG ;not found
 MOV R8,SOURCE ;save position j.i.c.
54 LDRB R6,[SMODE],#1
 CMP R6,#&7F
 BCS %56 ;successful match!
 LDRB R7,[SOURCE],#1
 CMP R6,R7
 BEQ %54 ;keep trying
 CMP R7,#"."
 BEQ %58 ;abbreviated
 MOV SOURCE,R8 ;failed :reset pointer
52 LDRB R6,[SMODE],#1
 CMP R6,#&7F
 BCC %52
 CMP R6,#TWIDTH ;last token in list
 BEQ MATCHG ;so give up
 ADD SMODE,SMODE,#1 ;step past job parameter
 B %50
58 LDRB R6,[SMODE],#1 ;if abbreviated find token value
 CMP R6,#&7F
 BCC %58
56 LDRB SMODE,[SMODE] ;get job
 TST SMODE,SMODE,LSR #1 ;if bit 0 of job
 BCC %60
 STMFD SP!,{R0}
 LDRB R0,[SOURCE]
 BL WORDCQ
 LDMFD SP!,{R0}
 MOVCS SOURCE,R8
 BCS MATCHG ;fail if next ch is wordc
60 TST SMODE,SMODE,LSR #4 ;if bit 3 of job
 BCC %61
 MOV R7,#TESCCOM
 TST SMODE,SMODE,LSR #7
 MOVCS R7,#TESCSTMT
 TST SMODE,SMODE,LSR #3
 MOVCS R7,#TESCFN
 BICCS SMODE,SMODE,#4
 STRB R7,[DEST,#-1]
 ADD DEST,DEST,#1 ;plant twobyte token
 B %62
61 TST SMODE,SMODE,LSR #7 ;if bit 6 of job
 BCC %62
 TEQ MODE,#0
 ADDEQ R6,R6,#TPTR2-&8F ;and mode=left increase token
62 STRB R6,[DEST,#-1] ;implant token
 TST SMODE,SMODE,LSR #2 ;if bit 1 of job
 MOVCS MODE,#1 ;then mode=right
 MOVCS CONSTA,#0 ;constant=false
 TST SMODE,SMODE,LSR #3 ;if bit 2 of job
 MOVCS MODE,#0 ;then mode=left
 MOVCS CONSTA,#0 ;constant=false
 TEQ R6,#TFN
 TEQNE R6,#TPROC ;if PROC or FN
 BNE %66
64 LDRB R0,[SOURCE],#1 ;skip while ch=wordc
 STRB R0,[DEST],#1
 BL WORDCQ
 BCS %64
 SUB SOURCE,SOURCE,#1
 SUB DEST,DEST,#1
66 TST SMODE,SMODE,LSR #5 ;if bit 4 of job
 MOVCS CONSTA,#TCONST ;constant=TRUE
 TST SMODE,SMODE,LSR #6 ;bit 5 of job to C
 TST SMODE,#128 ;bit 7 of job to N
 LDMFD SP!,{SMODE,R6,R7,R8}
 ORRCS SMODE,SMODE,#4 ;give up
 ADDNE SMODE,SMODE,#&1000 ;has bracket
 B %99
INDEXTAB & PLEXA-LEXICALADR
 & PLEXB-LEXICALADR
 & PLEXC-LEXICALADR
 & PLEXD-LEXICALADR
 & PLEXE-LEXICALADR
 & PLEXF-LEXICALADR
 & PLEXG-LEXICALADR
 & PLEXH-LEXICALADR
 & PLEXI-LEXICALADR
 & PLEXJ-LEXICALADR
 & PLEXK-LEXICALADR
 & PLEXL-LEXICALADR
 & PLEXM-LEXICALADR
 & PLEXN-LEXICALADR
 & PLEXO-LEXICALADR
 & PLEXP-LEXICALADR
 & PLEXQ-LEXICALADR
 & PLEXR-LEXICALADR
 & PLEXS-LEXICALADR
 & PLEXT-LEXICALADR
 & PLEXU-LEXICALADR
 & PLEXV-LEXICALADR
 & PLEXW-LEXICALADR
LEXTABADR ADR R2,PLEXA
 MOV PC,R14
;output character or token
;if token, then R7 contains LISTO
TOKOUT CMP R0,#&7F
 BCC CHOUT
 STMFD SP!,{R14}
 BL TOKENADDR
TOKPRT LDRB R0,[R1],#1
 CMP R0,#&7F
 LDMCSFD SP!,{PC}
 TST R7,#16
 BEQ TOKPRT1
 CMP R0,#"A"
 BCC TOKPRT1
 CMP R0,#"Z"
 ORRLS R0,R0,#" "
TOKPRT1 BL CHOUT
 B TOKPRT
TOKENADDR ADR R1,RTABLE
 TEQ R0,#TESCFN
 ADDEQ R1,R1,#RTABLETF-RTABLETC
 TEQNE R0,#TESCCOM
 ADDEQ R1,R1,#RTABLETC-RTABLETS
 TEQNE R0,#TESCSTMT
 LDREQB R0,[LINE],#1
 ADDEQ R1,R1,#RTABLETS-RTABLE
 SUBEQ R0,R0,#&8E
 SUBNE R0,R0,#&7F ;otherwise subtract base
 TST R0,#1 ;bottom bit to status
 BIC R0,R0,#1 ;clear bottom bit
 LDR R1,[R1,R0,LSL #1]
 MOVEQ R1,R1,LSL #16
 MOV R1,R1,LSR #16
 ADR R0,PLEXA
 ADD R1,R1,R0
 MOV PC,R14
RTABLE DCW POTHER-PLEXA
 DCW PAND-PLEXA
 DCW PDIV-PLEXA
 DCW PEOR-PLEXA
 DCW PMOD-PLEXA
 DCW POR-PLEXA
 DCW PERROR-PLEXA
 DCW PLINE-PLEXA
 DCW POFF-PLEXA
 DCW PSTEP-PLEXA
 DCW PSPC-PLEXA
 DCW PTAB-PLEXA
 DCW PELSE-PLEXA
 DCW PTHEN-PLEXA
 DCW PUNLIST-PLEXA
 DCW POPENU-PLEXA
 DCW PPTR-PLEXA
 DCW PPAGE-PLEXA
 DCW PTIME-PLEXA
 DCW PLOMEM-PLEXA
 DCW PHIMEM-PLEXA
 DCW PABS-PLEXA
 DCW PACS-PLEXA
 DCW PADC-PLEXA
 DCW PASC-PLEXA
 DCW PASN-PLEXA
 DCW PATN-PLEXA
 DCW PBGET-PLEXA
 DCW PCOS-PLEXA
 DCW PCOUNT-PLEXA
 DCW PDEG-PLEXA
 DCW PERL-PLEXA
 DCW PERR-PLEXA
 DCW PEVAL-PLEXA
 DCW PEXP-PLEXA
 DCW PEXT-PLEXA
 DCW PFALSE-PLEXA
 DCW PFN-PLEXA
 DCW PGET-PLEXA
 DCW PINKEY-PLEXA
 DCW PINSTR-PLEXA
 DCW PINT-PLEXA
 DCW PLEN-PLEXA
 DCW PLN-PLEXA
 DCW PLOG-PLEXA
 DCW PNOT-PLEXA
 DCW POPENI-PLEXA
 DCW POPENO-PLEXA
 DCW PPI-PLEXA
 DCW PPOINT-PLEXA
 DCW PPOS-PLEXA
 DCW PRAD-PLEXA
 DCW PRND-PLEXA
 DCW PSGN-PLEXA
 DCW PSIN-PLEXA
 DCW PSQR-PLEXA
 DCW PTAN-PLEXA
 DCW PTO-PLEXA
 DCW PTRUE-PLEXA
 DCW PUSR-PLEXA
 DCW PVAL-PLEXA
 DCW PVPOS-PLEXA
 DCW PCHRD-PLEXA
 DCW PGETD-PLEXA
 DCW PINKED-PLEXA
 DCW PLEFTD-PLEXA
 DCW PMIDD-PLEXA
 DCW PRIGHTD-PLEXA
 DCW PSTRD-PLEXA
 DCW PSTRND-PLEXA
 DCW PEOF-PLEXA
 DCW PUNLIST-PLEXA
 DCW PUNLIST-PLEXA
 DCW PUNLIST-PLEXA
 DCW PWHEN-PLEXA
 DCW POF-PLEXA
 DCW PENDCA-PLEXA
 DCW PELSE-PLEXA
 DCW PENDIF-PLEXA
 DCW PENDWH-PLEXA
 DCW PPTR-PLEXA
 DCW PPAGE-PLEXA
 DCW PTIME-PLEXA
 DCW PLOMEM-PLEXA
 DCW PHIMEM-PLEXA
 DCW PBEEP-PLEXA
 DCW PBPUT-PLEXA
 DCW PCALL-PLEXA
 DCW PCHAIN-PLEXA
 DCW PCLEAR-PLEXA
 DCW PCLOSE-PLEXA
 DCW PCLG-PLEXA
 DCW PCLS-PLEXA
 DCW PDATA-PLEXA
 DCW PDEF-PLEXA
 DCW PDIM-PLEXA
 DCW PDRAW-PLEXA
 DCW PEND-PLEXA
 DCW PENDPR-PLEXA
 DCW PENVEL-PLEXA
 DCW PFOR-PLEXA
 DCW PGOSUB-PLEXA
 DCW PGOTO-PLEXA
 DCW PGRAPH-PLEXA
 DCW PIF-PLEXA
 DCW PINPUT-PLEXA
 DCW PLET-PLEXA
 DCW PLOCAL-PLEXA
 DCW PMODE-PLEXA
 DCW PMOVE-PLEXA
 DCW PNEXT-PLEXA
 DCW PON-PLEXA
 DCW PVDU-PLEXA
 DCW PPLOT-PLEXA
 DCW PPRINT-PLEXA
 DCW PPROC-PLEXA
 DCW PREAD-PLEXA
 DCW PREM-PLEXA
 DCW PREPEAT-PLEXA
 DCW PREPORT-PLEXA
 DCW PRESTORE-PLEXA
 DCW PRETURN-PLEXA
 DCW PRUN-PLEXA
 DCW PSTOP-PLEXA
 DCW PTEXT-PLEXA
 DCW PTRACE-PLEXA
 DCW PUNTIL-PLEXA
 DCW PWIDTH-PLEXA
 DCW POSCL-PLEXA
 ALIGN
RTABLETS
 DCW PCASE-PLEXA
 DCW PCIRCLE-PLEXA
 DCW PFILL-PLEXA
 DCW PORGIN-PLEXA
 DCW PPSET-PLEXA
 DCW PRECT-PLEXA
 DCW PSWAP-PLEXA
 DCW PWHILE-PLEXA
 DCW PWAIT-PLEXA
 DCW PMOUSE-PLEXA
 DCW PQUIT-PLEXA
 DCW PSYS-PLEXA
 DCW PINSTALL-PLEXA ;list the old install
 DCW PLIBRARY-PLEXA
 DCW PTINT-PLEXA
 DCW PELLIPSE-PLEXA
 DCW PBEATS-PLEXA
 DCW PTEMPO-PLEXA
 DCW PVOICES-PLEXA
 DCW PVOICE-PLEXA
 DCW PSTEREO-PLEXA
 DCW POVERLAY-PLEXA
 ALIGN
RTABLETC
 DCW PAPPEND-PLEXA
 DCW PAUTO-PLEXA
 DCW PCRUNCH-PLEXA
 DCW PDELET-PLEXA
 DCW PEDIT-PLEXA
 DCW PHELP-PLEXA
 DCW PLIST-PLEXA
 DCW PLOAD-PLEXA
 DCW PLVAR-PLEXA
 DCW PNEW-PLEXA
 DCW POLD-PLEXA
 DCW PRENUM-PLEXA
 DCW PSAVE-PLEXA
 DCW PTEXTLOAD-PLEXA
 DCW PTEXTSAVE-PLEXA
 DCW PTWIN-PLEXA
 DCW PTWINO-PLEXA
 DCW PINSTALL-PLEXA
 ALIGN
RTABLETF
 DCW PSUM-PLEXA
 DCW PBEAT-PLEXA
 ALIGN

;  lexical tokens and name table

;  The table contains lexical tokens and an action byte
;    7 - contains own bracket
;    6 - polymorphic/two byte token is statement
;    5 - give up completely
;    4 - constant/list of constants may follow
;    3 - two byte token
;    2 - transfer to l mode/two byte token is function
;    1 - transfer to r mode
;    0 - ignore if next character is wordc
PLEXA
PAND = "AND",TAND,2 ;this table MUST be alphabetic in first char
PABS = "ABS",TABS,0
PACS = "ACS",TACS,0
PADC = "ADVAL",TADC,0
PASC = "ASC",TASC,0
PASN = "ASN",TASN,0
PATN = "ATN",TATN,0
PAUTO = "AUTO",TAUTO,16+8
PAPPEND = "APPEND",TAPPEND,8+2
PLEXB
PBGET = "BGET",TBGET,1
PBPUT = "BPUT",TBPUT,2+1
PBEATS = "BEATS",TBEATS,64+8+2
PBEAT = "BEAT",TBEAT,8+4+2
PLEXC
PTEXT = "COLOUR",TTEXT,2
PCALL = "CALL",TCALL,2
PCASE = "CASE",TCASE,64+8+2
PCHAIN = "CHAIN",TCHAIN,2
PCHRD = "CHR$",TCHRD,0
PCLEAR = "CLEAR",TCLEAR,1
PCLOSE = "CLOSE",TCLOSE,2+1
PCLG = "CLG",TCLG,1
PCLS = "CLS",TCLS,1
PCOS = "COS",TCOS,0
PCOUNT = "COUNT",TCOUNT,1
PCIRCLE = "CIRCLE",TCIRCLE,64+8+2
PCRUNCH = "CRUNCH",TCRUNCH,8+2
 = "COLOR",TTEXT,2  ;for the Yanks
PLEXD
PDATA = "DATA",TDATA,32
PDEG = "DEG",TDEG,0
PDEF = "DEF",TDEF,0
PDELET = "DELETE",TDELET,16+8
PDIV = "DIV",TDIV,0
PDIM = "DIM",TDIM,2
PDRAW = "DRAW",TDRAW,2
PLEXE
PENDPR = "ENDPROC",TENDPR,1
PEDIT = "EDIT",TEDIT,32+8
PENDWH = "ENDWHILE",TENDWH,1
PENDCA = "ENDCASE",TENDCA,1
PENDIF = "ENDIF",TENDIF,1
PEND = "END",TEND,1
PENVEL = "ENVELOPE",TENVEL,2
PELSE = "ELSE",TELSE,16+4
PEVAL = "EVAL",TEVAL,0
PERL = "ERL",TERL,1
PERROR = "ERROR",TERROR,4
PEOF = "EOF",TEOF,1
PEOR = "EOR",TEOR,2
PERR = "ERR",TERR,1
PEXP = "EXP",TEXP,0
PEXT = "EXT",TEXT,1
PELLIPSE = "ELLIPSE",TELLIPSE,64+8+2
PLEXF
PFOR = "FOR",TFOR,2
PFALSE = "FALSE",TFALSE,1
PFILL = "FILL",TFILL,64+8+2
PFN = "FN",TFN,2
PLEXG
PGOTO = "GOTO",TGOTO,16+2
PGETD = "GET$",TGETD,0
PGET = "GET",TGET,0
PGOSUB = "GOSUB",TGOSUB,16+2
PGRAPH = "GCOL",TGRAPH,2
PLEXH
PHIMEM = "HIMEM",THIMEM,64+2+1
PHELP = "HELP",THELP,8+1
PLEXI
PINPUT = "INPUT",TINPUT,2
PIF = "IF",TIF,2
PINKED = "INKEY$",TINKED,0
PINKEY = "INKEY",TINKEY,0
PINT = "INT",TINT,0
PINSTR = "INSTR(",TINSTR,128
PINSTALL = "INSTALL",TINSTALL,8+2
PLEXJ
PLEXK
PLEXL
PLIST = "LIST",TLIST,16+8 ;speed up address
PLINE = "LINE",TLINE,2
PLOAD = "LOAD",TLOAD,2+8
PLOMEM = "LOMEM",TLOMEM,64+2+1
PLOCAL = "LOCAL",TLOCAL,2
PLEFTD = "LEFT$(",TLEFTD,128
PLEN = "LEN",TLEN,0
PLET = "LET",TLET,4
PLOG = "LOG",TLOG,0
PLN = "LN",TLN,0
PLIBRARY = "LIBRARY",TLIBRARY,64+8+2
PLVAR = "LVAR",TLVAR,8+1
PLEXM
PMIDD = "MID$(",TMIDD,128
PMODE = "MODE",TMODE,2
PMOD = "MOD",TMOD,0
PMOVE = "MOVE",TMOVE,2
PMOUSE = "MOUSE",TMOUSE,64+8+2
PLEXN
PNEXT = "NEXT",TNEXT,2
PNEW = "NEW",TNEW,8+1
PNOT = "NOT",TNOT,0
PLEXO
POLD = "OLD",TOLD,8+1
PON = "ON",TON,2
POFF = "OFF",TOFF,0
POF = "OF",TOF,0
PORGIN = "ORIGIN",TORGIN,64+8+2
POR = "OR",TOR,2
POPENU = "OPENIN",TOPENU,0
POPENO = "OPENOUT",TOPENO,0
POPENI = "OPENUP",TOPENI,0
POSCL = "OSCLI",TOSCL,2
POTHER = "OTHERWISE",TOTHER,4
POVERLAY = "OVERLAY",TOVERLAY,64+8+2
PLEXP
PPRINT = "PRINT",TPRINT,2
PPAGE = "PAGE",TPAGE,64+2+1
PPTR = "PTR",TPTR,64+2+1
PPI = "PI",TPI,1
PPLOT = "PLOT",TPLOT,2
PPOINT = "POINT(",TPOINT,128
PPSET = "POINT",TPSET,64+8+2
PPROC = "PROC",TPROC,2
PPOS = "POS",TPOS,1
PLEXQ
PQUIT = "QUIT",TQUIT,64+8+1
PLEXR
PRETURN = "RETURN",TRETURN,1 ;speed up address
PREPEAT = "REPEAT",TREPEAT,0
PREPORT = "REPORT",TREPORT,1
PREAD = "READ",TREAD,2
PREM = "REM",TREM,32
PRUN = "RUN",TRUN,1
PRAD = "RAD",TRAD,0
PRESTORE = "RESTORE",TRESTORE,16+2
PRIGHTD = "RIGHT$(",TRIGHTD,128
PRND = "RND",TRND,1
PRECT = "RECTANGLE",TRECT,64+8+2
PRENUM = "RENUMBER",TRENUM,16+8
PLEXS
PSTEP = "STEP",TSTEP,0
PSAVE = "SAVE",TSAVE,8+2
PSGN = "SGN",TSGN,0
PSIN = "SIN",TSIN,0
PSQR = "SQR",TSQR,0
PBEEP = "SOUND",TBEEP,2
PSPC = "SPC",TSPC,0
PSTRD = "STR$",TSTRD,0
PSTRND = "STRING$(",TSTRND,128
PSTOP = "STOP",TSTOP,1
PSTEREO = "STEREO",TSTEREO,64+8+2
PSUM = "SUM",TSUM,8+4+2
PSWAP = "SWAP",TSWAP,64+8+2
PSYS = "SYS",TSYS,64+8+2
PLEXT
PTAN = "TAN",TTAN,0
PTAB = "TAB(",TTAB,128
PTEMPO = "TEMPO",TTEMPO,64+8+2
PTEXTLOAD = "TEXTLOAD",TTEXTLOAD,8+2
PTEXTSAVE = "TEXTSAVE",TTEXTSAVE,8+2
PTHEN = "THEN",TTHEN,16+4
PTIME = "TIME",TTIME,64+2+1
PTINT = "TINT",TTINT,64+8+2
PTO = "TO",TTO,0
PTRACE = "TRACE",TTRACE,16+2
PTRUE = "TRUE",TTRUE,1
PTWINO = "TWINO",TTWINO,8+2
PTWIN = "TWIN",TTWIN,8+1
PLEXU
PUNTIL = "UNTIL",TUNTIL,2
PUSR = "USR",TUSR,0
PLEXV
PVDU = "VDU",TVDU,2
PVAL = "VAL",TVAL,0
PVPOS = "VPOS",TVPOS,1
PVOICES = "VOICES",TVOICES,64+8+2
PVOICE = "VOICE",TVOICE,64+8+2
PLEXW
PWHILE = "WHILE",TWHILE,64+8+2
PWHEN = "WHEN",TWHEN,2
PWAIT = "WAIT",TWAIT,64+8+1
PWIDTH = "WIDTH",TWIDTH,2
PUNLIST = " unlistable token ",&FF
 LNK Command
