Commit b55421a9 authored by Steve Revill's avatar Steve Revill
Browse files

Lots of code improvements but no changes to the built binary.

This update replaces lots of hard-wired definitions of things such as SWI
names with the ones from the main exports in the build environment. It
should build a binary-identical module to the previous revision.

Author: Rob Sprowson

Version 1.40. Tagged as 'BASIC-1_40'
parent c6217381
hdr/** gitlab-language=armasm linguist-language=armasm linguist-detectable=true
s/** gitlab-language=armasm linguist-language=armasm linguist-detectable=true s/** gitlab-language=armasm linguist-language=armasm linguist-detectable=true
*,ffb gitlab-language=bbcbasic linguist-language=bbcbasic linguist-detectable=true *,ffb gitlab-language=bbcbasic linguist-language=bbcbasic linguist-detectable=true
...@@ -11,13 +11,13 @@ ...@@ -11,13 +11,13 @@
GBLS Module_HelpVersion GBLS Module_HelpVersion
GBLS Module_ComponentName GBLS Module_ComponentName
GBLS Module_ComponentPath GBLS Module_ComponentPath
Module_MajorVersion SETS "1.39" Module_MajorVersion SETS "1.40"
Module_Version SETA 139 Module_Version SETA 140
Module_MinorVersion SETS "" Module_MinorVersion SETS ""
Module_Date SETS "04 Oct 2008" Module_Date SETS "24 Apr 2009"
Module_ApplicationDate SETS "04-Oct-08" Module_ApplicationDate SETS "24-Apr-09"
Module_ComponentName SETS "BASIC" Module_ComponentName SETS "BASIC"
Module_ComponentPath SETS "castle/RiscOS/Sources/Programmer/BASIC" Module_ComponentPath SETS "castle/RiscOS/Sources/Programmer/BASIC"
Module_FullVersion SETS "1.39" Module_FullVersion SETS "1.40"
Module_HelpVersion SETS "1.39 (04 Oct 2008)" Module_HelpVersion SETS "1.40 (24 Apr 2009)"
END END
/* (1.39) /* (1.40)
* *
* This file is automatically maintained by srccommit, do not edit manually. * This file is automatically maintained by srccommit, do not edit manually.
* Last processed by srccommit version: 1.1. * Last processed by srccommit version: 1.1.
* *
*/ */
#define Module_MajorVersion_CMHG 1.39 #define Module_MajorVersion_CMHG 1.40
#define Module_MinorVersion_CMHG #define Module_MinorVersion_CMHG
#define Module_Date_CMHG 04 Oct 2008 #define Module_Date_CMHG 24 Apr 2009
#define Module_MajorVersion "1.39" #define Module_MajorVersion "1.40"
#define Module_Version 139 #define Module_Version 140
#define Module_MinorVersion "" #define Module_MinorVersion ""
#define Module_Date "04 Oct 2008" #define Module_Date "24 Apr 2009"
#define Module_ApplicationDate "04-Oct-08" #define Module_ApplicationDate "24-Apr-09"
#define Module_ComponentName "BASIC" #define Module_ComponentName "BASIC"
#define Module_ComponentPath "castle/RiscOS/Sources/Programmer/BASIC" #define Module_ComponentPath "castle/RiscOS/Sources/Programmer/BASIC"
#define Module_FullVersion "1.39" #define Module_FullVersion "1.40"
#define Module_HelpVersion "1.39 (04 Oct 2008)" #define Module_HelpVersion "1.40 (24 Apr 2009)"
#define Module_LibraryVersionInfo "1:39" #define Module_LibraryVersionInfo "1:40"
; Copyright 2009 Castle Technology Ltd
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
; http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
;
;> Definitions
TTL Definitions used by BASIC
; BASIC's stack structure [SP,SP+4,SP+8...]:
;
; GOSUB.RETURN is TRETURN, ADDR
; REPEAT.UNTIL is TUNTIL, ADDR
; WHILE.ENDWHILE is TENDWH, block start ADDR, expr start ADDR
; integer FOR.NEXT is TNEXT, varaddr, ADDR, step, limit
; fp FOR.NEXT is TFOR, varaddr, ADDR, step (8), limit (8)
; FN is n words on stack, the bottom being TFN
; PROC is n words on stack, the bottom being TPROC
; LOCAL A(X) is 256+{4,5,128}, linklist, address, numbytes, arraylist
; LOCAL ERROR is TERROR, !ERRSTK, !ERRORH
; DIM var LOCAL expr is TDIM, bytes (rounded upto whole multiple of 4), linklist (going up the stack)
; BASIC VCache structure:
;
; variable IACC, MOVEBY, CHECK, TYPE
; number IACC, MOVEBY, CHECK, TYPE
; GOTO R1, MOVEBY, CHECK
; THENline R1, , CHECK
; FN/PROC IACC, MOVEBY, CHECK, ( or not
[ FPOINT=0
FACC RN R0
FACCX RN R1
FGRD RN R2
FSIGN RN R3
FWACC RN R4
FWACCX RN R5
FWGRD RN R6
FWSIGN RN R7
|
FACC FN 0
F1 FN 1
F2 FN 2
F7 FN 7
]
IACC RN R0 ;pointer to some data (i.e. a variable's value)
CLEN RN R2 ;actually contains STRACC+CLEN
ARGP RN R8 ;workspace pointer
TYPE RN R9 ;type of a variable/expression
AELINE RN R11 ;pointer to some interesting part of the current line
LINE RN R12 ;pointer to the current position in the program (i.e. for errors)
SOURCE RN R1
DEST RN R2
MODE RN R3
CONSTA RN R4 ;0 for none, tconst for allowed
SMODE RN R5
; Types...
TINTEGER * &40000000 ;string TYPE is 0
TFP * &80000000
TEFP * &20000000
[ FPOINT=0
TFPLV * 5
|
TFPLV * 8
]
; Macros...
;pull and junk n items from stack
MACRO
$L PULLJ $N
$L ADD SP,SP,#4*$N
MEND
;allow space for n items from stack
MACRO
$L PUSHJ $N
$L SUB SP,SP,#4*$N
MEND
;load misaligned word using 2 other registers $DEST MUST BE < $W2
;$DEST may be $ADDR
MACRO
$L LOAD $DEST,$ADDR,$W1,$W2
$L BIC $W2,$ADDR,#3
AND $W1,$ADDR,#3
LDMIA $W2,{$DEST,$W2}
MOVS $W1,$W1,LSL #3
MOVNE $DEST,$DEST,LSR $W1
RSBNE $W1,$W1,#32
ORRNE $DEST,$DEST,$W2,LSL $W1
MEND
[ FPOINT=0
;save fp acc to address in TYPE [Format 2 only]
MACRO
$L FSTA $ADDR
$L ORR FGRD,FSIGN,FACCX
STMIA $ADDR,{FACC,FGRD}
MEND
MACRO
$L FPUSH
$L ORR FGRD,FSIGN,FACCX
STMFD SP!,{FACC,FGRD}
MEND
MACRO
$L FLDA $ADDR
$L LDMIA $ADDR,{FACC,FACCX}
AND FSIGN,FACCX,#&80000000
AND FACCX,FACCX,#255
MEND
|
MACRO
$L FPUSH
$L STFD FACC,[SP,#-8]!
MEND
]
;do an expression
MACRO
EXPRCALL
ADR R4,AJ7
[ DO32BIT = 1
BIC R14,R10,#&FF000000
ADD PC,R4,R14,LSL #2
|
ADD PC,R4,R10,LSL #2
]
MEND
END
; Copyright 2009 Castle Technology Ltd
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
; http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
;
;> Tokens
TTL Tokens used by BASIC
^ &7F ;single byte tokens
TOTHER # 1
TAND # 1 ;expression binary operators
TDIV # 1
TEOR # 1
TMOD # 1
TOR # 1
TERROR # 1 ;miscellaneous words
TLINE # 1
TOFF # 1
TSTEP # 1
TSPC # 1
TTAB # 1
TELSE # 1
TTHEN # 1
TCONST # 1 ;(8D)
TOPENU # 1
TPTR # 1 ;polymorphics as functions
TPAGE # 1
TTIME # 1
TLOMEM # 1
THIMEM # 1
TABS # 1 ;expression class of unary operators
TACS # 1
TADC # 1
TASC # 1
TASN # 1
TATN # 1
TBGET # 1
TCOS # 1
TCOUNT # 1
TDEG # 1
TERL # 1
TERR # 1
TEVAL # 1
TEXP # 1
TEXT # 1
TFALSE # 1
TFN # 1
TGET # 1
TINKEY # 1
TINSTR # 1
TINT # 1
TLEN # 1
TLN # 1
TLOG # 1
TNOT # 1
TOPENI # 1
TOPENO # 1
TPI # 1
TPOINT # 1
TPOS # 1
TRAD # 1
TRND # 1
TSGN # 1
TSIN # 1
TSQR # 1
TTAN # 1
TTO # 1
TTRUE # 1
TUSR # 1
TVAL # 1
TVPOS # 1
TCHRD # 1 ;string expression class of unary operators
TGETD # 1
TINKED # 1
TLEFTD # 1
TMIDD # 1
TRIGHTD # 1
TSTRD # 1
TSTRND # 1
TEOF # 1
TESCFN # 1 ;Escape for Functions
TESCCOM # 1 ;Escape for Commands
TESCSTMT # 1 ;Escape for Statements
TWHEN # 1 ;statements
TOF # 1
TENDCA # 1
TELSE2 # 1
TENDIF # 1
TENDWH # 1
TPTR2 # 1 ;polymorphic again
TPAGE2 # 1
TTIME2 # 1
TLOMM2 # 1
THIMM2 # 1
TBEEP # 1
TBPUT # 1
TCALL # 1
TCHAIN # 1
TCLEAR # 1
TCLOSE # 1
TCLG # 1
TCLS # 1
TDATA # 1
TDEF # 1
TDIM # 1
TDRAW # 1
TEND # 1
TENDPR # 1
TENVEL # 1
TFOR # 1
TGOSUB # 1
TGOTO # 1
TGRAPH # 1
TIF # 1
TINPUT # 1
TLET # 1
TLOCAL # 1
TMODE # 1
TMOVE # 1
TNEXT # 1
TON # 1
TVDU # 1
TPLOT # 1
TPRINT # 1
TPROC # 1
TREAD # 1
TREM # 1
TREPEAT # 1
TREPORT # 1
TRESTORE # 1
TRETURN # 1
TRUN # 1
TSTOP # 1
TTEXT # 1
TTRACE # 1
TUNTIL # 1
TWIDTH # 1
TOSCL # 1 ;this must be <=&FF (!)
^ &8E ;Two byte function tokens
TSUM # 1
TBEAT # 1
TTWOFUNCLIMIT # 0
^ &8E ;Two byte Statement tokens
TCASE # 1
TCIRCLE # 1
TFILL # 1
TORGIN # 1
TPSET # 1
TRECT # 1
TSWAP # 1
TWHILE # 1
TWAIT # 1
TMOUSE # 1
TQUIT # 1
TSYS # 1
TINSTALLBAD # 1 ;a silly blunder
TLIBRARY # 1
TTINT # 1
TELLIPSE # 1
TBEATS # 1
TTEMPO # 1
TVOICES # 1
TVOICE # 1
TSTEREO # 1
TOVERLAY # 1
TTWOSTMTLIMIT # 0
^ &8E ;Two byte Command tokens
TAPPEND # 1
TAUTO # 1
TCRUNCH # 1
TDELET # 1
TEDIT # 1
THELP # 1
TLIST # 1
TLOAD # 1
TLVAR # 1
TNEW # 1
TOLD # 1
TRENUM # 1
TSAVE # 1
TTEXTLOAD # 1
TTEXTSAVE # 1
TTWIN # 1
TTWINO # 1
TINSTALL # 1
TTWOCOMMLIMIT # 0
END
; Copyright 2009 Castle Technology Ltd
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
; http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
;
;> Workspace
TTL Workspace used by BASIC
VARS * &8700 ;allocation of the data pointer itself
;allocation relative to vars/ARGP
^ -&700
ERRORS # 256
STRACC # 256
OUTPUT # 512
FREELIST # 256 ;one word for sizes 4..252(3,4,5) bytes
PROCPTR # 4
VARPTR # 4*("z"+1-"A") ;arranged s.t. 4*(ch-"@") is right
FNTEMPLOC * PROCPTR+4*("["-"@") ;4 words for the secret use of FN/PROC
;these four words must be zero for lvar to work!
RECPTR # 4
FNPTR # 4
DATAP # 4
TALLY # 4
WIDTHLOC # 4 ;immediately before intvar
INTVAR # 4*27 ;-&100 from ARGP
ASSPC * 4*("P"-"@")+INTVAR
PAGE # 4 ;ALWAYS immediately after INTVAR
TOP # 4
FSA # 4
LOMEM # 4
HIMEM # 4
ERRNUM # 4
ERRORH # 4
ERRSTK # 4
ERRLIN # 4
ESCWORD # 4
ESCFLG * ESCWORD
TRCFLG * ESCWORD+1
TRCNUM # 4
TRACEFILE # 4
LOCALARLIST # 4
INSTALLLIST # 4
LIBRARYLIST # 4
OVERPTR # 4 ;pointer to array of overlay information
MEMLIMIT # 4
OLDERR # 4*9
SWICODE # 8
OS_Exit_ABEX * SWICODE
OS_Exit_RetCode * SWICODE+4
DIMLOCAL # 4 ;pointer to head of DIM LOCAL list
SEED # 5
LISTOP # 1
BYTESM # 1
MEMM # 1
; <- Insert new bits here
CALLEDNAME # 0-(MEMM+1) ;needs to be /at least/ one byte for -quit flag
[ FPOINT=0
CACHESIZE * 128
CACHEMASK * 2_11111110
CACHESHIFT * 3
CACHECHECK * 4*2 ;address where check value held
|
CACHESIZE * 256
CACHEMASK * 2_11111111
CACHESHIFT * 4
CACHECHECK * 4*2 ;address where check value held
]
VCACHE # CACHESIZE*16
FREE # 0 ;start of everything else
END
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
; limitations under the License. ; limitations under the License.
; ;
;> Array Operations ;> Array Operations
LETARRAY LETARRAY
LDRB R10,[AELINE],#1 LDRB R10,[AELINE],#1
CMP R10,#" " CMP R10,#" "
...@@ -56,7 +57,7 @@ ARRAYARRAYASSIGNSIZE ...@@ -56,7 +57,7 @@ ARRAYARRAYASSIGNSIZE
SUB TYPE,TYPE,#256 SUB TYPE,TYPE,#256
CMP TYPE,#TFPLV CMP TYPE,#TFPLV
BHI ARRAYARRAYASSIGNSTRING BHI ARRAYARRAYASSIGNSTRING
[ FP=0 [ FPOINT=0
ADDEQ AELINE,AELINE,AELINE,LSL #2 ADDEQ AELINE,AELINE,AELINE,LSL #2
ADDEQ AELINE,AELINE,#3 ADDEQ AELINE,AELINE,#3
BICEQ AELINE,AELINE,#3 BICEQ AELINE,AELINE,#3
...@@ -148,7 +149,7 @@ ARRAYBINARYADDINT ...@@ -148,7 +149,7 @@ ARRAYBINARYADDINT
B NXT B NXT
ARRAYBINARYADDFP ARRAYBINARYADDFP
[ FP=0 [ FPOINT=0
STMFD SP!,{R8,R10} ;save pointers STMFD SP!,{R8,R10} ;save pointers
MOV R10,R4 MOV R10,R4
MOV R8,R1 MOV R8,R1
...@@ -220,7 +221,7 @@ ARRAYBINARYSUBINT ...@@ -220,7 +221,7 @@ ARRAYBINARYSUBINT
B NXT B NXT
ARRAYBINARYSUBFP ARRAYBINARYSUBFP
[ FP=0 [ FPOINT=0
STMFD SP!,{R8,R10} ;save pointers STMFD SP!,{R8,R10} ;save pointers
MOV R10,R4 MOV R10,R4
MOV R8,R1 MOV R8,R1
...@@ -263,7 +264,7 @@ ARRAYBINARYMULINT ...@@ -263,7 +264,7 @@ ARRAYBINARYMULINT
B NXT B NXT
ARRAYBINARYMULFP ARRAYBINARYMULFP
[ FP=0 [ FPOINT=0
STMFD SP!,{R8,R10} ;save pointers STMFD SP!,{R8,R10} ;save pointers
MOV R10,R4 MOV R10,R4
MOV R8,R1 MOV R8,R1
...@@ -304,7 +305,7 @@ ARRAYBINARYDIVINT ...@@ -304,7 +305,7 @@ ARRAYBINARYDIVINT
B NXT B NXT
ARRAYBINARYDIVFP ARRAYBINARYDIVFP
[ FP=0 [ FPOINT=0
STMFD SP!,{R8,R10} ;save pointers STMFD SP!,{R8,R10} ;save pointers
MOV R10,R4 MOV R10,R4
MOV R8,R1 MOV R8,R1
...@@ -354,7 +355,7 @@ ARRAYBINARYCONSTRV ...@@ -354,7 +355,7 @@ ARRAYBINARYCONSTRV
TEQ TYPE,#0 TEQ TYPE,#0
BEQ ERTYPEARRAYB BEQ ERTYPEARRAYB
RSBPL IACC,IACC,#0 RSBPL IACC,IACC,#0
[ FP=0 [ FPOINT=0
EORMI FSIGN,FSIGN,#&80000000 EORMI FSIGN,FSIGN,#&80000000
TEQ FACC,#0 TEQ FACC,#0
MOVEQ FSIGN,#0 MOVEQ FSIGN,#0
...@@ -413,14 +414,14 @@ ARRAYBINARYCONSTDIVFP ...@@ -413,14 +414,14 @@ ARRAYBINARYCONSTDIVFP
STMFD SP!,{R8,R10} STMFD SP!,{R8,R10}
MOV R10,R4 ;D MOV R10,R4 ;D
MOV R8,R6 ;S MOV R8,R6 ;S
[ FP=0 [ FPOINT=0
BL FPUSH BL FPUSH
TEQ FACC,#0 TEQ FACC,#0
| |
CMF FACC,#0 CMF FACC,#0
] ]
BEQ ZDIVOR BEQ ZDIVOR
[ FP=0 [ FPOINT=0
ARRAYBINARYCONSTDIVFP1 ARRAYBINARYCONSTDIVFP1
MOV TYPE,R8 MOV TYPE,R8
ADD R8,R8,#5 ADD R8,R8,#5
...@@ -441,7 +442,7 @@ ARRAYBINARYCONSTDIVFP1 ...@@ -441,7 +442,7 @@ ARRAYBINARYCONSTDIVFP1
] ]
SUBS AELINE,AELINE,#1 SUBS AELINE,AELINE,#1
BNE ARRAYBINARYCONSTDIVFP1 BNE ARRAYBINARYCONSTDIVFP1
[ FP=0 [ FPOINT=0
LDMFD SP!,{R0,R1,R8,R10} LDMFD SP!,{R0,R1,R8,R10}
| |
LDMFD SP!,{R8,R10} LDMFD SP!,{R8,R10}
...@@ -510,7 +511,7 @@ ARRAYNEGATE ...@@ -510,7 +511,7 @@ ARRAYNEGATE
BEQ ERTYPEINT BEQ ERTYPEINT
RSBPL IACC,IACC,#0 ;negate integer RSBPL IACC,IACC,#0 ;negate integer
BPL ARRAYFACTRV BPL ARRAYFACTRV
[ FP=0 [ FPOINT=0
TEQ FACC,#0 TEQ FACC,#0
EORNE FSIGN,FSIGN,#&80000000 ;negate floating point EORNE FSIGN,FSIGN,#&80000000 ;negate floating point
| |
...@@ -553,7 +554,7 @@ ARRAYCONSTASSIGN1 ...@@ -553,7 +554,7 @@ ARRAYCONSTASSIGN1
B NXT B NXT
ARRAYCONSTASSIGNFP ARRAYCONSTASSIGNFP
BL FLOATY ;make sure of FP BL FLOATY ;make sure of FP
[ FP=0 [ FPOINT=0
BIC FACC,FACC,#&80000000 BIC FACC,FACC,#&80000000
ORR FACC,FACC,FSIGN ;fsign only 0 or &80000000! ORR FACC,FACC,FSIGN ;fsign only 0 or &80000000!
ORR FACCX,FACCX,FACC,LSL #8 ORR FACCX,FACCX,FACC,LSL #8
...@@ -674,7 +675,7 @@ ARRAYCONSTBINARYADDINT ...@@ -674,7 +675,7 @@ ARRAYCONSTBINARYADDINT
ARRAYCONSTBINARYADDFP ARRAYCONSTBINARYADDFP
BL PULLTYPE BL PULLTYPE
BL FLOATY BL FLOATY
[ FP=0 [ FPOINT=0
STMFD SP!,{R8,R10} STMFD SP!,{R8,R10}
MOV R10,R4 ;D MOV R10,R4 ;D
MOV R8,R6 ;S MOV R8,R6 ;S
...@@ -744,7 +745,7 @@ ARRAYCONSTBINARYMINUSINT ...@@ -744,7 +745,7 @@ ARRAYCONSTBINARYMINUSINT
ARRAYCONSTBINARYMINUSFP ARRAYCONSTBINARYMINUSFP
BL PULLTYPE BL PULLTYPE
BL FLOATY BL FLOATY
[ FP=0 [ FPOINT=0
STMFD SP!,{R8,R10} STMFD SP!,{R8,R10}
MOV R10,R4 ;D MOV R10,R4 ;D
MOV R8,R6 ;S MOV R8,R6 ;S
...@@ -786,7 +787,7 @@ ARRAYCONSTBINARYMULINT ...@@ -786,7 +787,7 @@ ARRAYCONSTBINARYMULINT
ARRAYCONSTBINARYMULFP ARRAYCONSTBINARYMULFP
BL PULLTYPE BL PULLTYPE
BL FLOATY BL FLOATY
[ FP=0 [ FPOINT=0
STMFD SP!,{R8,R10} STMFD SP!,{R8,R10}
MOV R10,R4 ;D MOV R10,R4 ;D
MOV R8,R6 ;S MOV R8,R6 ;S
...@@ -829,7 +830,7 @@ ARRAYCONSTBINARYDIVINT ...@@ -829,7 +830,7 @@ ARRAYCONSTBINARYDIVINT
ARRAYCONSTBINARYDIVFP ARRAYCONSTBINARYDIVFP
BL PULLTYPE BL PULLTYPE
BL FLOATY BL FLOATY
[ FP=0 [ FPOINT=0
STMFD SP!,{R8,R10} STMFD SP!,{R8,R10}
MOV R10,R4 ;D MOV R10,R4 ;D
MOV R8,R6 ;S MOV R8,R6 ;S
...@@ -900,7 +901,7 @@ MATRIXMULTIPLYDESTSIZE ...@@ -900,7 +901,7 @@ MATRIXMULTIPLYDESTSIZE
LDR R7,[R6],#4 LDR R7,[R6],#4
CMP TYPE,#4 CMP TYPE,#4
MOVEQ R7,R7,LSL #2 MOVEQ R7,R7,LSL #2
[ FP=0 [ FPOINT=0
ADDNE R7,R7,R7,LSL #2 ;number of bytes to move ADDNE R7,R7,R7,LSL #2 ;number of bytes to move
| |
MOVNE R7,R7,LSL #3 MOVNE R7,R7,LSL #3
...@@ -978,7 +979,7 @@ MATRIXMULTIPLYINT3 ...@@ -978,7 +979,7 @@ MATRIXMULTIPLYINT3
B NXT B NXT
MATRIXMULTIPLYFP MATRIXMULTIPLYFP
[ FP=0 [ FPOINT=0
ADD R5,R5,R5,LSL #2 ;LIMJ'=LIMJ*5 ADD R5,R5,R5,LSL #2 ;LIMJ'=LIMJ*5
STMFD SP!,{R0,R1,R2,R4,R5} STMFD SP!,{R0,R1,R2,R4,R5}
SUB SP,SP,#8 SUB SP,SP,#8
...@@ -1099,12 +1100,12 @@ SUM STR R14,[SP,#-4]! ...@@ -1099,12 +1100,12 @@ SUM STR R14,[SP,#-4]!
BCC ERARRY BCC ERARRY
BL GETARRAYSIZE BL GETARRAYSIZE
CMP R1,#TFPLV CMP R1,#TFPLV
[ FP=0 [ FPOINT=0
BL FCLR BL FCLR
] ]
BEQ SUMFP BEQ SUMFP
BHI SUMSTRING BHI SUMSTRING
[ FP=1 [ FPOINT=1
MOV IACC,#0 MOV IACC,#0
] ]
SUMINT LDR R1,[TYPE],#4 SUMINT LDR R1,[TYPE],#4
...@@ -1112,7 +1113,7 @@ SUMINT LDR R1,[TYPE],#4 ...@@ -1112,7 +1113,7 @@ SUMINT LDR R1,[TYPE],#4
SUBS R10,R10,#1 SUBS R10,R10,#1
BNE SUMINT BNE SUMINT
B PSINSTK B PSINSTK
[ FP=0 [ FPOINT=0
SUMFP BL F1ADD SUMFP BL F1ADD
ADD TYPE,TYPE,#5 ADD TYPE,TYPE,#5
SUBS R10,R10,#1 SUBS R10,R10,#1
...@@ -1164,12 +1165,12 @@ MODULUS STR R14,[SP,#-4]! ...@@ -1164,12 +1165,12 @@ MODULUS STR R14,[SP,#-4]!
BCC ERARRY BCC ERARRY
BL GETARRAYSIZE BL GETARRAYSIZE
CMP R1,#TFPLV CMP R1,#TFPLV
[ FP=0 [ FPOINT=0
BL FCLR BL FCLR
] ]
BEQ MODULUSFP BEQ MODULUSFP
BHI ERTYPENUMARRAY BHI ERTYPENUMARRAY
[ FP=1 [ FPOINT=1
MOV IACC,#0 MOV IACC,#0
] ]
MODULUSINT MODULUSINT
...@@ -1178,7 +1179,7 @@ MODULUSINT ...@@ -1178,7 +1179,7 @@ MODULUSINT
ADD IACC,IACC,R2 ADD IACC,IACC,R2
SUBS R10,R10,#1 SUBS R10,R10,#1
BNE MODULUSINT BNE MODULUSINT
[ FP=0 [ FPOINT=0
BL IFLT BL IFLT
BL FSQRT BL FSQRT
| |
...@@ -1188,7 +1189,7 @@ MODULUSINT ...@@ -1188,7 +1189,7 @@ MODULUSINT
B FSINSTK B FSINSTK
MODULUSFP MODULUSFP
[ FP=0 [ FPOINT=0
STMFD SP!,{R0-R3} STMFD SP!,{R0-R3}
BL F1LDA BL F1LDA
BL FSQR BL FSQR
...@@ -1237,4 +1238,5 @@ GETARRAYSIZE1 ...@@ -1237,4 +1238,5 @@ GETARRAYSIZE1
BNE GETARRAYSIZE1 BNE GETARRAYSIZE1
LDR R10,[TYPE],#4 LDR R10,[TYPE],#4
MOV PC,R14 MOV PC,R14
LNK s.Assembler LNK s.Assembler
...@@ -12,7 +12,8 @@ ...@@ -12,7 +12,8 @@
; See the License for the specific language governing permissions and ; See the License for the specific language governing permissions and
; limitations under the License. ; limitations under the License.
; ;
; > Assembler ;> Assembler
ASS MOV R10,#3 ASS MOV R10,#3
STRB R10,[ARGP,#BYTESM] STRB R10,[ARGP,#BYTESM]
CASM MOV AELINE,LINE CASM MOV AELINE,LINE
...@@ -221,7 +222,7 @@ CASMKET MVN R10,#0 ;deal with ] ...@@ -221,7 +222,7 @@ CASMKET MVN R10,#0 ;deal with ]
MOV LINE,AELINE MOV LINE,AELINE
MOV R10, R0 MOV R10, R0
MOV R0, #0 MOV R0, #0
SWI XOSSYNCHRONISECODEAREAS SWI XOS_SynchroniseCodeAreas
MOV R0, R10 MOV R0, R10
B STMT B STMT
...@@ -885,7 +886,7 @@ CASMSWI STR R1,[SP,#-4]! ...@@ -885,7 +886,7 @@ CASMSWI STR R1,[SP,#-4]!
MOV R0,#0 MOV R0,#0
STRB R0,[CLEN] STRB R0,[CLEN]
ADD R1,ARGP,#STRACC ADD R1,ARGP,#STRACC
SWI SWINUMBERFROMSTRING SWI OS_SWINumberFromString
B CASMSWI2 B CASMSWI2
CASMSWI1 CASMSWI1
...@@ -1148,12 +1149,12 @@ CASMFPIMM ...@@ -1148,12 +1149,12 @@ CASMFPIMM
BLPL IFLT BLPL IFLT
ADR R4,CASMFPIMMTBEND ADR R4,CASMFPIMMTBEND
MOV R5,#7 MOV R5,#7
[ FP=0 [ FPOINT=0
ORR FGRD,FSIGN,FACCX ORR FGRD,FSIGN,FACCX
] ]
CASMFPIMM1 CASMFPIMM1
[ FP=0 [ FPOINT=0
LDMDB R4!,{R6,R7} LDMDB R4!,{R6,R7}
TEQ R6,FACC TEQ R6,FACC
TEQEQ R7,FGRD TEQEQ R7,FGRD
...@@ -1175,7 +1176,7 @@ CASMFPGOTIMM ...@@ -1175,7 +1176,7 @@ CASMFPGOTIMM
B CASMICHK B CASMICHK
CASMFPIMMTB CASMFPIMMTB
[ FP=0 [ FPOINT=0
& &00000000 & &00000000
= &00,0,0,0 ; 0 = &00,0,0,0 ; 0
& &80000000 & &80000000
...@@ -1512,7 +1513,7 @@ CASMXPLACED ...@@ -1512,7 +1513,7 @@ CASMXPLACED
STR R10,[SP,#-4]! STR R10,[SP,#-4]!
MOV R10,R3 MOV R10,R3
BL WORDHX BL WORDHX
SWI WRITEI+" " SWI OS_WriteI+" "
MOV R10,R1 MOV R10,R1
CMP R2,#5 CMP R2,#5
BCS CASMBYTPRINT BCS CASMBYTPRINT
...@@ -1526,7 +1527,7 @@ CASMXPLACED ...@@ -1526,7 +1527,7 @@ CASMXPLACED
CASMXPAD1 CASMXPAD1
BEQ CASMX1 BEQ CASMX1
SWI WRITEI+" " SWI OS_WriteI+" "
SUBS R0,R0,#1 SUBS R0,R0,#1
B CASMXPAD1 B CASMXPAD1
CASMXCOM CASMXCOM
...@@ -1535,13 +1536,13 @@ CASMXCOM ...@@ -1535,13 +1536,13 @@ CASMXCOM
B CASMX B CASMX
CASMBYTPRINT CASMBYTPRINT
SWI WRITES SWI OS_WriteS
= " ",0 = " ",0
ALIGN ALIGN
;print bytes ;print bytes
CASMX1 LDR R10,[SP],#4 CASMX1 LDR R10,[SP],#4
MOV TYPE,#0 MOV TYPE,#0
SWI WRITEI+" " SWI OS_WriteI+" "
LDRB R0,[LINE],#1 LDRB R0,[LINE],#1
CMP R0,#"." CMP R0,#"."
BNE CASMXT BNE CASMXT
...@@ -1564,7 +1565,7 @@ CASMXL BL TOKOUT ...@@ -1564,7 +1565,7 @@ CASMXL BL TOKOUT
CASMXT CMP R0,#":" CASMXT CMP R0,#":"
CMPNE R0,#13 CMPNE R0,#13
BEQ CASMX3 BEQ CASMX3
SWI WRITES SWI OS_WriteS
= " ",0 = " ",0
ALIGN ALIGN
SUB LINE,LINE,#1 SUB LINE,LINE,#1
...@@ -1579,7 +1580,7 @@ CASMX2 MOV R7,#0 ...@@ -1579,7 +1580,7 @@ CASMX2 MOV R7,#0
LDRB R0,[LINE],#1 LDRB R0,[LINE],#1
CMP LINE,AELINE CMP LINE,AELINE
BCC CASMX2 BCC CASMX2
CASMX3 SWI NEWLINE CASMX3 SWI OS_NewLine
CASMXN ADD R3,R3,R2 CASMXN ADD R3,R3,R2
STR R3,[ARGP,#ASSPC] STR R3,[ARGP,#ASSPC]
MOV LINE,AELINE MOV LINE,AELINE
...@@ -1706,7 +1707,7 @@ CASMDCF LDRB R10,[AELINE],#1 ...@@ -1706,7 +1707,7 @@ CASMDCF LDRB R10,[AELINE],#1
BNE ERASSFP1 BNE ERASSFP1
CASMDCFS CASMDCFS
[ FP=0 [ FPOINT=0
ASSERT FACCX=R1 ASSERT FACCX=R1
SUBS FACCX,FACCX,#2 SUBS FACCX,FACCX,#2
BLE CASMDCFSSMALL BLE CASMDCFSSMALL
...@@ -1729,7 +1730,7 @@ CASMDCFSSMALL ...@@ -1729,7 +1730,7 @@ CASMDCFSSMALL
CASMDCFD CASMDCFD
ADD R2,ARGP,#STRACC ADD R2,ARGP,#STRACC
[ FP=0 [ FPOINT=0
ASSERT FACCX=R1 ASSERT FACCX=R1
ASSERT FGRD=R2 ASSERT FGRD=R2
TEQ FACC,#0 TEQ FACC,#0
...@@ -1750,7 +1751,7 @@ CASMDCFD ...@@ -1750,7 +1751,7 @@ CASMDCFD
CASMDCFE CASMDCFE
ADD R2,ARGP,#STRACC ADD R2,ARGP,#STRACC
[ FP=0 [ FPOINT=0
TEQ FACC,#0 TEQ FACC,#0
MOVEQ FACCX,#0 MOVEQ FACCX,#0
ADDNE FACCX,FACCX,#&4000 ADDNE FACCX,FACCX,#&4000
......
...@@ -14,6 +14,6 @@ ...@@ -14,6 +14,6 @@
; ;
;> BASIC105 ;> BASIC105
FP * 0 ;1 for ARM FP instruction set FPOINT * 0 ;1 for ARM FP instruction set
LNK ModHead.s LNK ModHead.s
...@@ -14,6 +14,6 @@ ...@@ -14,6 +14,6 @@
; ;
;> BASIC64 ;> BASIC64
FP * 1 ;1 for ARM FP instruction set FPOINT * 1 ;1 for ARM FP instruction set
LNK ModHead.s LNK ModHead.s
This diff is collapsed.
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
; limitations under the License. ; limitations under the License.
; ;
;> Command ;> Command
APPEND BL AEEXPR APPEND BL AEEXPR
BL OSSTRI BL OSSTRI
BL AEDONE BL AEDONE
...@@ -34,7 +35,7 @@ APPENDNO ...@@ -34,7 +35,7 @@ APPENDNO
SUB R2,LINE,#2 SUB R2,LINE,#2
BL OSFILELOAD BL OSFILELOAD
BL ENDER BL ENDER
[ FP=0 [ FPOINT=0
MOV FACC,R7 MOV FACC,R7
BL IFLT BL IFLT
MOV FGRD,#0 MOV FGRD,#0
...@@ -107,7 +108,7 @@ HELP BL SPACES ...@@ -107,7 +108,7 @@ HELP BL SPACES
BL LEXTABADR ;R2=Lexical Table BL LEXTABADR ;R2=Lexical Table
SUB R0,LINE,#1 ;R1=characters to interpret SUB R0,LINE,#1 ;R1=characters to interpret
ADR R1,HELPNAME ADR R1,HELPNAME
SWI BASICTrans_HELP SWI XBASICTrans_HELP
ADR LINE,HELPTXT ADR LINE,HELPTXT
CMP R1,#0 CMP R1,#0
BNE STMT BNE STMT
...@@ -117,10 +118,10 @@ HELPNAME ...@@ -117,10 +118,10 @@ HELPNAME
= "$Name.",0 = "$Name.",0
HELPTXT = "!(",THIMEM,"-4)=@%:",TPRINT,"""" HELPTXT = "!(",THIMEM,"-4)=@%:",TPRINT,""""
= "ARM BBC BASIC V" = "ARM BBC BASIC V"
[ FP=1 [ FPOINT=1
= "I (64 bit fp)" = "I (64 bit fp)"
] ]
= " assembled on $CurrentDate.."":" = " assembled on $Module_Date.."":"
= TESCSTMT,TSYS,"&62c82,25,",TTO,"P-",TPAGE,",",TEND,"-",TLOMEM,",",THIMEM,"-",TEND,TTO,";@%:" = TESCSTMT,TSYS,"&62c82,25,",TTO,"P-",TPAGE,",",TEND,"-",TLOMEM,",",THIMEM,"-",TEND,TTO,";@%:"
= TIF,"@%",TAND,"1:@%=&900:",TPRINT,"""The program size is """,TTO,"P-",TPAGE,""" bytes," = TIF,"@%",TAND,"1:@%=&900:",TPRINT,"""The program size is """,TTO,"P-",TPAGE,""" bytes,"
...@@ -157,7 +158,7 @@ TEXTLOAD ...@@ -157,7 +158,7 @@ TEXTLOAD
LOADFILEFINAL LOADFILEFINAL
MOV R0,#5 MOV R0,#5
ADD R1,ARGP,#STRACC ADD R1,ARGP,#STRACC
SWI FILE SWI OS_File
SUB R7,SP,#1024 SUB R7,SP,#1024
CMP R0,#1 CMP R0,#1
SUBEQ R7,R7,R4 SUBEQ R7,R7,R4
...@@ -168,7 +169,7 @@ LOADFILEFINAL ...@@ -168,7 +169,7 @@ LOADFILEFINAL
MOV R2,R7 MOV R2,R7
MOV R3,#0 MOV R3,#0
MOV R0,#&FF MOV R0,#&FF
SWI FILE SWI OS_File
MOV R0,#13 MOV R0,#13
LDR R1,[ARGP,#PAGE] LDR R1,[ARGP,#PAGE]
STRB R0,[R1],#1 STRB R0,[R1],#1
...@@ -221,9 +222,9 @@ LOADFILEENTRYDONE ...@@ -221,9 +222,9 @@ LOADFILEENTRYDONE
MOV R5,#10 MOV R5,#10
BL RENUM1 BL RENUM1
MOV R0,#7 MOV R0,#7
SWI BASICTrans_Message SWI XBASICTrans_Message
LDRVC PC,[SP],#4 LDRVC PC,[SP],#4
SWI WRITES SWI OS_WriteS
= "Program renumbered",10,13,0 = "Program renumbered",10,13,0
LDR PC,[SP],#4 LDR PC,[SP],#4
LOADFILETOKENCOPY LOADFILETOKENCOPY
...@@ -278,9 +279,9 @@ FNDTOP LDRB R1,[R0] ...@@ -278,9 +279,9 @@ FNDTOP LDRB R1,[R0]
ADDCS R0,R0,R1 ADDCS R0,R0,R1
BCS FNDTOP BCS FNDTOP
BADPRO MOV R0,#8 BADPRO MOV R0,#8
SWI BASICTrans_Message SWI XBASICTrans_Message
BVC CLRSTK BVC CLRSTK
SWI WRITES SWI OS_WriteS
= 13,10,"Bad program",10,13,0 = 13,10,"Bad program",10,13,0
B CLRSTK B CLRSTK
SETTOP ADD R0,R0,#2 SETTOP ADD R0,R0,#2
...@@ -354,9 +355,9 @@ CHOUT TST R7,#128 ...@@ -354,9 +355,9 @@ CHOUT TST R7,#128
CMP TYPE,SP CMP TYPE,SP
MOVCC PC,R14 MOVCC PC,R14
MOV R0,#9 MOV R0,#9
SWI BASICTrans_Message SWI XBASICTrans_Message
BVC FSASET BVC FSASET
SWI WRITES SWI OS_WriteS
= 10,13,"Not enough room to convert this program to text",10,13,0 = 10,13,"Not enough room to convert this program to text",10,13,0
B FSASET B FSASET
CHOUTTRACE CHOUTTRACE
...@@ -364,12 +365,12 @@ CHOUTTRACE ...@@ -364,12 +365,12 @@ CHOUTTRACE
LDR R1,[ARGP,#TRACEFILE] LDR R1,[ARGP,#TRACEFILE]
TEQ R1,#0 TEQ R1,#0
BEQ CHOUTS2 BEQ CHOUTS2
SWI BPUT+&20000 ;xosbput SWI XOS_BPut
LDMVCFD SP!,{R0,R1} LDMVCFD SP!,{R0,R1}
MOVVC PC,R14 MOVVC PC,R14
MOV R0,#0 MOV R0,#0
STR R0,[ARGP,#TRACEFILE] STR R0,[ARGP,#TRACEFILE]
SWI OPEN+&20000 ;xosfind=close SWI XOS_Find ;close
LDMFD SP!,{R0,R1} LDMFD SP!,{R0,R1}
MOV PC,R14 MOV PC,R14
CHOUTS STMFD SP!,{R0,R1} CHOUTS STMFD SP!,{R0,R1}
...@@ -377,15 +378,15 @@ CHOUTS2 LDR R0,[ARGP,#WIDTHLOC] ...@@ -377,15 +378,15 @@ CHOUTS2 LDR R0,[ARGP,#WIDTHLOC]
LDR R1,[ARGP,#TALLY] LDR R1,[ARGP,#TALLY]
CMP R0,R1 CMP R0,R1
MOVCC R1,#0 MOVCC R1,#0
SWICC NEWLINE SWICC OS_NewLine
ADD R1,R1,#1 ADD R1,R1,#1
STR R1,[ARGP,#TALLY] STR R1,[ARGP,#TALLY]
LDMFD SP!,{R0,R1} LDMFD SP!,{R0,R1}
CHOUTS1 SWI WRITEC CHOUTS1 SWI OS_WriteC
MOV PC,R14 MOV PC,R14
EDIT BL OSCLIREGS EDIT BL OSCLIREGS
ADR R0,EDITTXT ADR R0,EDITTXT
SWI CLI SWI OS_CLI
LDR R0,[ARGP,#TOP] LDR R0,[ARGP,#TOP]
CMP R0,#0 CMP R0,#0
BPL CLRSTK BPL CLRSTK
...@@ -461,7 +462,7 @@ GOTCFF CMP R10,#TIF ...@@ -461,7 +462,7 @@ GOTCFF CMP R10,#TIF
ENDLN MOV R0,#10 ENDLN MOV R0,#10
BL CHOUTNOCOUNT BL CHOUTNOCOUNT
CMP R7,#128 CMP R7,#128
SWICC WRITEI+13 ;write out return as well if to screen etc. SWICC OS_WriteI+13 ;write out return as well if to screen etc.
MOV R0,#0 MOV R0,#0
STR R0,[ARGP,#TALLY] STR R0,[ARGP,#TALLY]
GETNEW LDRB R0,[R2,#3] ;R2 has initial LINE in it GETNEW LDRB R0,[R2,#3] ;R2 has initial LINE in it
...@@ -506,7 +507,7 @@ TWINCOPYCALL ...@@ -506,7 +507,7 @@ TWINCOPYCALL
BNE TWINCOPYCALL BNE TWINCOPYCALL
ADD R0,ARGP,#STRACC ADD R0,ARGP,#STRACC
BL OSCLIREGS BL OSCLIREGS
SWI CLI SWI OS_CLI
TWINTXT = "Twin" TWINTXT = "Twin"
TWINHX MOV R2,#32-4 ;covert TYPE to string ptd to by r1 TWINHX MOV R2,#32-4 ;covert TYPE to string ptd to by r1
TWINLP MOV R0,TYPE,LSR R2 TWINLP MOV R0,TYPE,LSR R2
...@@ -633,7 +634,7 @@ LP LDRB R0,[LINE],#1 ...@@ -633,7 +634,7 @@ LP LDRB R0,[LINE],#1
TST R7,#8 TST R7,#8
BEQ LP BEQ LP
CMP R7,#128 CMP R7,#128
SWICC NEWLINE SWICC OS_NewLine
B USESLINENUMBERS B USESLINENUMBERS
LPSIMP CMP R0,#TREM LPSIMP CMP R0,#TREM
MOVEQ R4,#4 ;no more expansion after this MOVEQ R4,#4 ;no more expansion after this
...@@ -642,51 +643,51 @@ LPSIMP CMP R0,#TREM ...@@ -642,51 +643,51 @@ LPSIMP CMP R0,#TREM
LVAR ROUT LVAR ROUT
BL DONES BL DONES
MOV R0,#10 MOV R0,#10
SWI BASICTrans_Message SWI XBASICTrans_Message
BVC LVAR1 BVC LVAR1
SWI WRITES SWI OS_WriteS
= "Static Integer variables: @% = """,0 = "Static Integer variables: @% = """,0
ALIGN ALIGN
LVAR1 ADD R7,ARGP,#INTVAR LVAR1 ADD R7,ARGP,#INTVAR
LDR R5,[R7],#4 LDR R5,[R7],#4
CMP R5,#&1000000 CMP R5,#&1000000
SWICS WRITEI+"+" SWICS OS_WriteI+"+"
AND R4,R5,#&F0000 AND R4,R5,#&F0000
CMP R4,#&10000 CMP R4,#&10000
SWICC WRITEI+"g" SWICC OS_WriteI+"g"
SWIEQ WRITEI+"e" SWIEQ OS_WriteI+"e"
SWIHI WRITEI+"f" SWIHI OS_WriteI+"f"
AND R0,R5,#&FF AND R0,R5,#&FF
MOV TYPE,#0 MOV TYPE,#0
BL POSITE BL POSITE
TST R5,#&800000 TST R5,#&800000
SWIEQ WRITEI+"." SWIEQ OS_WriteI+"."
SWINE WRITEI+"," SWINE OS_WriteI+","
AND R0,R5,#&FF00 AND R0,R5,#&FF00
MOV R0,R0,LSR #8 MOV R0,R0,LSR #8
BL POSITE BL POSITE
SWI WRITEI+"""" SWI OS_WriteI+""""
MOV R6,#"A" MOV R6,#"A"
MOV R5,#3 MOV R5,#3
10 ADD R10,R0,#5 10 ADD R10,R0,#5
ADD R5,R5,#1 ADD R5,R5,#1
TST R5,#3 TST R5,#3
SWIEQ NEWLINE SWIEQ OS_NewLine
BEQ %12 BEQ %12
13 SWI WRITEI+" " 13 SWI OS_WriteI+" "
ADD R10,R10,#1 ADD R10,R10,#1
CMP R10,#20 CMP R10,#20
BCC %13 BCC %13
12 MOV R0,R6 12 MOV R0,R6
SWI WRITEC SWI OS_WriteC
SWI WRITES SWI OS_WriteS
= "% = ",0 = "% = ",0
LDR IACC,[R7],#4 LDR IACC,[R7],#4
BL LVRPINT BL LVRPINT
ADD R6,R6,#1 ADD R6,R6,#1
TEQ R6,#"Z"+1 TEQ R6,#"Z"+1
BNE %10 BNE %10
SWI NEWLINE SWI OS_NewLine
MOV R0,#0 MOV R0,#0
STR R0,[ARGP,#FNTEMPLOC] STR R0,[ARGP,#FNTEMPLOC]
STR R0,[ARGP,#FNTEMPLOC+4] STR R0,[ARGP,#FNTEMPLOC+4]
...@@ -703,9 +704,9 @@ LVAR1 ADD R7,ARGP,#INTVAR ...@@ -703,9 +704,9 @@ LVAR1 ADD R7,ARGP,#INTVAR
BEQ %21 BEQ %21
MOV R11,#256 MOV R11,#256
MOV R0,#11 MOV R0,#11
SWI BASICTrans_Message SWI XBASICTrans_Message
BVC %20 BVC %20
SWI WRITES SWI OS_WriteS
= "Dynamic variables:",0 = "Dynamic variables:",0
B %20 B %20
22 LDR R4,[R5],#4 ;head of chain 22 LDR R4,[R5],#4 ;head of chain
...@@ -714,7 +715,7 @@ LVAR1 ADD R7,ARGP,#INTVAR ...@@ -714,7 +715,7 @@ LVAR1 ADD R7,ARGP,#INTVAR
20 RSBS R0,R11,#20 20 RSBS R0,R11,#20
RSBLSS R0,R11,#40 RSBLSS R0,R11,#40
RSBLSS R0,R11,#60 RSBLSS R0,R11,#60
SWILS NEWLINE SWILS OS_NewLine
MOVLS R11,#0 MOVLS R11,#0
BLS LVRDFF BLS LVRDFF
ADD R11,R11,R0 ADD R11,R11,R0
...@@ -723,11 +724,11 @@ LVAR1 ADD R7,ARGP,#INTVAR ...@@ -723,11 +724,11 @@ LVAR1 ADD R7,ARGP,#INTVAR
LVRDFF MOV R2,R4 LVRDFF MOV R2,R4
LDR R4,[R2],#4 ;next in chain LDR R4,[R2],#4 ;next in chain
MOV R0,R6 MOV R0,R6
SWI WRITEC SWI OS_WriteC
LVRDNO ADD R11,R11,#1 LVRDNO ADD R11,R11,#1
LDRB R0,[R2],#1 LDRB R0,[R2],#1
TEQ R0,#0 TEQ R0,#0
SWINE WRITEC SWINE OS_WriteC
BNE LVRDNO BNE LVRDNO
MOV R0,R2 MOV R0,R2
LDRB R2,[R0,#-2] LDRB R2,[R0,#-2]
...@@ -738,7 +739,7 @@ LVRDNO ADD R11,R11,#1 ...@@ -738,7 +739,7 @@ LVRDNO ADD R11,R11,#1
TEQ R2,#"%" TEQ R2,#"%"
MOVEQ TYPE,#4 MOVEQ TYPE,#4
MOVNE TYPE,#TFPLV MOVNE TYPE,#TFPLV
[ FP=0 [ FPOINT=0
ADDEQ R0,R0,#3 ADDEQ R0,R0,#3
BICEQ R0,R0,#3 BICEQ R0,R0,#3
| |
...@@ -746,7 +747,7 @@ LVRDNO ADD R11,R11,#1 ...@@ -746,7 +747,7 @@ LVRDNO ADD R11,R11,#1
BIC R0,R0,#3 BIC R0,R0,#3
] ]
BL VARIND BL VARIND
SWI WRITES SWI OS_WriteS
= " = ",0 = " = ",0
ADD R11,R11,#3 ADD R11,R11,#3
STR R4,[SP,#-4]! STR R4,[SP,#-4]!
...@@ -766,23 +767,23 @@ LVRDAP SUB R0,R0,#1 ...@@ -766,23 +767,23 @@ LVRDAP SUB R0,R0,#1
LDR R0,[R2],#4 LDR R0,[R2],#4
ADD R11,R11,#1 ADD R11,R11,#1
TEQ R0,#0 TEQ R0,#0
SWINE WRITEI+"," SWINE OS_WriteI+","
BNE LVRDAP BNE LVRDAP
SWI WRITEI+")" SWI OS_WriteI+")"
B %23 B %23
LVRDAN CMP R2,#1 LVRDAN CMP R2,#1
BEQ LVRDAN2 BEQ LVRDAN2
SWI WRITES SWI OS_WriteS
= "undimensioned)",0 = "undimensioned)",0
ADD R11,R11,#14 ADD R11,R11,#14
B %23 B %23
LVRDAN2 SWI WRITES LVRDAN2 SWI OS_WriteS
= "local)",0 = "local)",0
ADD R11,R11,#6 ADD R11,R11,#6
B %23 B %23
25 MOV TYPE,#128 25 MOV TYPE,#128
BL VARIND BL VARIND
SWI WRITES SWI OS_WriteS
= " = """,0 = " = """,0
ADD R11,R11,#5 ADD R11,R11,#5
ADD R1,ARGP,#STRACC ADD R1,ARGP,#STRACC
...@@ -792,57 +793,57 @@ LVRDAN2 SWI WRITES ...@@ -792,57 +793,57 @@ LVRDAN2 SWI WRITES
TEQ R0,#127 TEQ R0,#127
CMPNE R0,#" "-1 CMPNE R0,#" "-1
MOVLS R0,#"." MOVLS R0,#"."
SWI WRITEC SWI OS_WriteC
ADD R11,R11,#1 ADD R11,R11,#1
TEQ R1,CLEN TEQ R1,CLEN
BNE %27 BNE %27
28 SWI WRITEI+"""" 28 SWI OS_WriteI+""""
B %23 B %23
29 ADD R6,R6,#1 29 ADD R6,R6,#1
TEQ R5,R7 TEQ R5,R7
BNE %22 BNE %22
SWI NEWLINE SWI OS_NewLine
LVARDX LDR R1,[ARGP,#PROCPTR] LVARDX LDR R1,[ARGP,#PROCPTR]
TEQ R1,#0 TEQ R1,#0
BEQ LVARPX BEQ LVARPX
MOV R11,#0 MOV R11,#0
MOV R0,#12 MOV R0,#12
SWI BASICTrans_Message SWI XBASICTrans_Message
BVC LVARP1 BVC LVARP1
SWI WRITES SWI OS_WriteS
= "Procedures:",10,13,0 = "Procedures:",10,13,0
ALIGN ALIGN
LVARP1 BL LVARFMT LVARP1 BL LVARFMT
SWI WRITES SWI OS_WriteS
= "PROC",0 = "PROC",0
ADD R11,R11,#3 ADD R11,R11,#3
BL LVARFN BL LVARFN
BNE LVARP1 BNE LVARP1
SWI NEWLINE SWI OS_NewLine
LVARPX LDR R1,[ARGP,#FNPTR] LVARPX LDR R1,[ARGP,#FNPTR]
TEQ R1,#0 TEQ R1,#0
BEQ LVARLIB BEQ LVARLIB
MOV R11,#0 MOV R11,#0
MOV R0,#13 MOV R0,#13
SWI BASICTrans_Message SWI XBASICTrans_Message
BVC LVARF0 BVC LVARF0
SWI WRITES SWI OS_WriteS
= "Functions:",10,13,0 = "Functions:",10,13,0
ALIGN ALIGN
LVARF0 BL LVARFMT LVARF0 BL LVARFMT
SWI WRITES SWI OS_WriteS
= "FN",0 = "FN",0
ADD R11,R11,#1 ADD R11,R11,#1
BL LVARFN BL LVARFN
BNE LVARF0 BNE LVARF0
SWI NEWLINE SWI OS_NewLine
LVARLIB LDR R1,[ARGP,#LIBRARYLIST] LVARLIB LDR R1,[ARGP,#LIBRARYLIST]
TEQ R1,#0 TEQ R1,#0
BEQ LVARINST BEQ LVARINST
MOV R0,#14 MOV R0,#14
SWI BASICTrans_Message SWI XBASICTrans_Message
BVC LVARLIB0 BVC LVARLIB0
SWI WRITES SWI OS_WriteS
= "Libraries:",10,13,0 = "Libraries:",10,13,0
ALIGN ALIGN
LVARLIB0 LVARLIB0
...@@ -856,9 +857,9 @@ LVARINST ...@@ -856,9 +857,9 @@ LVARINST
TEQ R1,#0 TEQ R1,#0
BEQ LVAROVER BEQ LVAROVER
MOV R0,#15 MOV R0,#15
SWI BASICTrans_Message SWI XBASICTrans_Message
BVC LVARILIB0 BVC LVARILIB0
SWI WRITES SWI OS_WriteS
= "Installed libraries:",10,13,0 = "Installed libraries:",10,13,0
ALIGN ALIGN
LVARILIB0 LVARILIB0
...@@ -876,9 +877,9 @@ LVAROVER ...@@ -876,9 +877,9 @@ LVAROVER
CMN R2,#1 CMN R2,#1
BEQ LVARDONE BEQ LVARDONE
MOV R0,#16 MOV R0,#16
SWI BASICTrans_Message SWI XBASICTrans_Message
BVC LVARCUROVERLAY BVC LVARCUROVERLAY
SWI WRITES SWI OS_WriteS
= "Current Overlay (from """,0 = "Current Overlay (from """,0
ALIGN ALIGN
LVARCUROVERLAY LVARCUROVERLAY
...@@ -887,8 +888,8 @@ LVARCUROVERLAY ...@@ -887,8 +888,8 @@ LVARCUROVERLAY
BL VARSTR BL VARSTR
ADD R0,ARGP,#STRACC ADD R0,ARGP,#STRACC
SUB R1,CLEN,R0 SUB R1,CLEN,R0
SWI WRITEN SWI OS_WriteN
SWI WRITES SWI OS_WriteS
= """):",10,13,0 = """):",10,13,0
ALIGN ALIGN
ADD LINE,R7,#12+4 ADD LINE,R7,#12+4
...@@ -903,13 +904,13 @@ LVARLINE ...@@ -903,13 +904,13 @@ LVARLINE
MOVEQ PC,R14 MOVEQ PC,R14
STMFD SP!,{R1,R14} STMFD SP!,{R1,R14}
BL LISTLINE BL LISTLINE
SWI NEWLINE SWI OS_NewLine
LDMFD SP!,{R1,PC} LDMFD SP!,{R1,PC}
;list functions or procedures ;list functions or procedures
LVARFN STMFD SP!,{R14,R8} LVARFN STMFD SP!,{R14,R8}
LDR R10,[R1],#4 LDR R10,[R1],#4
MOV R0,R1 MOV R0,R1
SWI WRITE0 SWI OS_Write0
SUB R1,R0,R1 SUB R1,R0,R1
ADD R11,R11,R1 ADD R11,R11,R1
ADD R0,R0,#3 ADD R0,R0,#3
...@@ -917,58 +918,58 @@ LVARFN STMFD SP!,{R14,R8} ...@@ -917,58 +918,58 @@ LVARFN STMFD SP!,{R14,R8}
LDMFD R7!,{R0,R1} LDMFD R7!,{R0,R1}
TEQ R0,#0 TEQ R0,#0
BEQ LVARF1 BEQ LVARF1
SWI WRITEI+"(" SWI OS_WriteI+"("
ADD R11,R11,#2 ADD R11,R11,#2
LVARFA TST R1,#&100 LVARFA TST R1,#&100
BEQ %41 BEQ %41
TST R1,#&8000 TST R1,#&8000
BNE %41 BNE %41
SWI WRITES SWI OS_WriteS
= "RETURN ",0 = "RETURN ",0
ADD R11,R11,#7 ADD R11,R11,#7
41 ANDS R2,R1,#255 41 ANDS R2,R1,#255
BNE %42 BNE %42
SWI WRITES SWI OS_WriteS
= "byte",0 = "byte",0
ADD R11,R11,#4 ADD R11,R11,#4
42 TEQ R2,#4 42 TEQ R2,#4
BNE %43 BNE %43
SWI WRITES SWI OS_WriteS
= "integer",0 = "integer",0
ADD R11,R11,#7 ADD R11,R11,#7
43 TEQ R2,#TFPLV 43 TEQ R2,#TFPLV
BNE %44 BNE %44
SWI WRITES SWI OS_WriteS
= "real",0 = "real",0
ADD R11,R11,#4 ADD R11,R11,#4
44 TEQ R2,#128 44 TEQ R2,#128
BNE %45 BNE %45
SWI WRITES SWI OS_WriteS
= "string",0 = "string",0
ADD R11,R11,#6 ADD R11,R11,#6
45 CMP R2,#129 45 CMP R2,#129
BCC %46 BCC %46
SWI WRITES SWI OS_WriteS
= "$ string",0 = "$ string",0
ADD R11,R11,#8 ADD R11,R11,#8
46 TST R1,#&8000 46 TST R1,#&8000
BEQ %49 BEQ %49
SWI WRITES SWI OS_WriteS
= " array",0 = " array",0
ADD R11,R11,#6 ADD R11,R11,#6
49 LDMFD R7!,{R0,R1} 49 LDMFD R7!,{R0,R1}
TEQ R0,#0 TEQ R0,#0
ADDNE R11,R11,#1 ADDNE R11,R11,#1
SWINE WRITEI+"," SWINE OS_WriteI+","
BNE LVARFA BNE LVARFA
SWI WRITEI+")" SWI OS_WriteI+")"
LVARF1 MOVS R1,R10 LVARF1 MOVS R1,R10
LDMFD SP!,{R8,PC} LDMFD SP!,{R8,PC}
LVARFMT STR R14,[SP,#-4]! LVARFMT STR R14,[SP,#-4]!
TEQ R11,#0 TEQ R11,#0
BEQ LVRFMX BEQ LVRFMX
RSBS R0,R11,#40 RSBS R0,R11,#40
SWILS NEWLINE SWILS OS_NewLine
MOVLS R11,#0 MOVLS R11,#0
BLS LVRFMX BLS LVRFMX
ADD R11,R11,R0 ADD R11,R11,R0
...@@ -983,7 +984,7 @@ LVRPRT MOV R4,#&900 ;TEMPORARY! ...@@ -983,7 +984,7 @@ LVRPRT MOV R4,#&900 ;TEMPORARY!
ADD R0,ARGP,#STRACC ADD R0,ARGP,#STRACC
MOV R5,#0 MOV R5,#0
STRB R5,[TYPE] STRB R5,[TYPE]
SWI WRITE0 SWI OS_Write0
ADD R0,ARGP,#STRACC ADD R0,ARGP,#STRACC
SUB R0,TYPE,R0 SUB R0,TYPE,R0
ADD R11,R11,R0 ADD R11,R11,R0
...@@ -1085,17 +1086,17 @@ NUMBH LDRB R10,[R5,#1] ...@@ -1085,17 +1086,17 @@ NUMBH LDRB R10,[R5,#1]
NUMBJ MOV R1,R0 NUMBJ MOV R1,R0
MOV R2,R7 MOV R2,R7
MOV R0,#23 MOV R0,#23
SWI BASICTrans_Message SWI XBASICTrans_Message
BVC NUMBF BVC NUMBF
SWI WRITES SWI OS_WriteS
= "Failed with ",0 = "Failed with ",0
MOV R0,R1 MOV R0,R1
BL POSITE BL POSITE
SWI WRITES SWI OS_WriteS
= " on line ",0 = " on line ",0
MOV R0,R7 MOV R0,R7
BL POSITE BL POSITE
SWI NEWLINE SWI OS_NewLine
B NUMBF B NUMBF
SAVE BL SPACES SAVE BL SPACES
TEQ R10,#13 TEQ R10,#13
...@@ -1113,17 +1114,17 @@ SAVEFIL LDR R4,[ARGP,#PAGE] ...@@ -1113,17 +1114,17 @@ SAVEFIL LDR R4,[ARGP,#PAGE]
;save date stamped file [R1] of type R2 from R4 to R5 ;save date stamped file [R1] of type R2 from R4 to R5
SAVEFILECLRSTK SAVEFILECLRSTK
STR R1,[SP,#-4]! STR R1,[SP,#-4]!
MOV R0,#14 ;fetch date stamp MOV R0,#OsWord_ReadRealTimeClock
SUB R1,SP,#8 SUB R1,SP,#8
MOV R3,#3 MOV R3,#3
STR R3,[R1] STR R3,[R1]
STR R2,[R1,#4] STR R2,[R1,#4]
SWI WORD SWI OS_Word
MOV R0,#0 MOV R0,#0
LDR R2,[R1,#4] LDR R2,[R1,#4]
LDR R3,[R1] LDR R3,[R1]
LDR R1,[SP],#4 LDR R1,[SP],#4
SWI FILE SWI OS_File
B CLRSTK B CLRSTK
SAVEIC BL ENDER SAVEIC BL ENDER
LDR R1,[ARGP,#PAGE] LDR R1,[ARGP,#PAGE]
...@@ -1148,11 +1149,12 @@ OSFILELOAD ...@@ -1148,11 +1149,12 @@ OSFILELOAD
MOV R0,#255 MOV R0,#255
MOV R3,#0 MOV R3,#0
OSFILERETURN OSFILERETURN
SWI FILE SWI OS_File
MOV PC,R14 MOV PC,R14
OSFILEINFOSTRACC OSFILEINFOSTRACC
ADD R1,ARGP,#STRACC ADD R1,ARGP,#STRACC
OSFILEINFO OSFILEINFO
MOV R0,#5 MOV R0,#5
B OSFILERETURN B OSFILERETURN
LNK s.ErrorMsgs
LNK ErrorMsgs.s
...@@ -12,58 +12,60 @@ ...@@ -12,58 +12,60 @@
; See the License for the specific language governing permissions and ; See the License for the specific language governing permissions and
; limitations under the License. ; limitations under the License.
; ;
; > ErrorMsgs ;> ErrorMsgs
[ 1=0 ;debug code
[ {FALSE}
;debug code
FSHOW STMFD SP!,{R14,R0,R10,R9} FSHOW STMFD SP!,{R14,R0,R10,R9}
SWI WRITES SWI OS_WriteS
= "AA ",0 = "AA ",0
MOV R10,R0 MOV R10,R0
BL WORDHX BL WORDHX
SWI WRITES SWI OS_WriteS
= " AX ",0 = " AX ",0
MOV R10,R1 MOV R10,R1
BL WORDHX BL WORDHX
SWI WRITES SWI OS_WriteS
= " AG ",0 = " AG ",0
MOV R10,R2 MOV R10,R2
BL WORDHX BL WORDHX
SWI WRITES SWI OS_WriteS
= " AS ",0 = " AS ",0
MOV R10,R3 MOV R10,R3
BL WORDHX BL WORDHX
SWI NEWLINE SWI OS_NewLine
SWI WRITES SWI OS_WriteS
= "WA ",0 = "WA ",0
MOV R10,R4 MOV R10,R4
BL WORDHX BL WORDHX
SWI WRITES SWI OS_WriteS
= " WX ",0 = " WX ",0
MOV R10,R5 MOV R10,R5
BL WORDHX BL WORDHX
SWI WRITES SWI OS_WriteS
= " WG ",0 = " WG ",0
MOV R10,R6 MOV R10,R6
BL WORDHX BL WORDHX
SWI WRITES SWI OS_WriteS
= " WS ",0 = " WS ",0
MOV R10,R7 MOV R10,R7
BL WORDHX BL WORDHX
SWI NEWLINE SWI OS_NewLine
SWI WRITES SWI OS_WriteS
= "SP ",0 = "SP ",0
MOV R10,R13 MOV R10,R13
BL WORDHX BL WORDHX
SWI WRITES SWI OS_WriteS
= " AELINE ",0 = " AELINE ",0
MOV R10,R11 MOV R10,R11
BL WORDHX BL WORDHX
SWI WRITES SWI OS_WriteS
= " LINE ",0 = " LINE ",0
MOV R10,R12 MOV R10,R12
BL WORDHX BL WORDHX
SWI NEWLINE SWI OS_NewLine
LDMFD SP!,{R0,R10,R9,PC} LDMFD SP!,{R0,R10,R9,PC}
WORDSP SWI WRITEI+" " WORDSP SWI OS_WriteI+" "
] ]
;print R10 ;print R10
WORDHX STMFD SP!,{R0,R9} WORDHX STMFD SP!,{R0,R9}
...@@ -73,7 +75,7 @@ WORDLP MOV R0,R10,LSR R9 ...@@ -73,7 +75,7 @@ WORDLP MOV R0,R10,LSR R9
CMP R0,#9 CMP R0,#9
ORRLS R0,R0,#"0" ORRLS R0,R0,#"0"
ADDHI R0,R0,#"A"-10 ADDHI R0,R0,#"A"-10
SWI WRITEC SWI OS_WriteC
SUBS R9,R9,#4 SUBS R9,R9,#4
BPL WORDLP BPL WORDLP
LDMFD SP!,{R0,R9} LDMFD SP!,{R0,R9}
...@@ -511,7 +513,7 @@ FOVR BL MSG ...@@ -511,7 +513,7 @@ FOVR BL MSG
= "Number too big",0 = "Number too big",0
] ]
ALIGN ALIGN
[ FP=0 [ FPOINT=0
FOVR1 BL MSG FOVR1 BL MSG
= 20,67 = 20,67
[ OWNERRORS=1 [ OWNERRORS=1
......
...@@ -13,19 +13,10 @@ ...@@ -13,19 +13,10 @@
; limitations under the License. ; limitations under the License.
; ;
;> Expr ;> Expr
;lookup takes r10=1st char, r3=2nd char, r4=start of rest, aeline=end ;lookup takes r10=1st char, r3=2nd char, r4=start of rest, aeline=end
;returns with iacc at dataitem if eq else neq ;returns with iacc at dataitem if eq else neq
MACRO
EXPRCALL
ADR R4,AJ7
[ DO32BIT = 1
BIC R14,R10,#&FF000000
ADD PC,R4,R14,LSL #2
|
ADD PC,R4,R10,LSL #2
]
MEND
LOOKUP SUB R1,R10,#"@" LOOKUP SUB R1,R10,#"@"
ADD R0,ARGP,#PROCPTR ADD R0,ARGP,#PROCPTR
...@@ -107,7 +98,7 @@ CREAND STR TYPE,[SP,#-4]! ...@@ -107,7 +98,7 @@ CREAND STR TYPE,[SP,#-4]!
MOVCS TYPE,#4 ;ref arrays are integers MOVCS TYPE,#4 ;ref arrays are integers
ADDCS AELINE,AELINE,#1 ;and need an extra character to be ignored ADDCS AELINE,AELINE,#1 ;and need an extra character to be ignored
TEQ TYPE,#4 ;word align if integer TEQ TYPE,#4 ;word align if integer
[ FP=1 [ FPOINT=1
TEQNE TYPE,#8 ;word align if floating point TEQNE TYPE,#8 ;word align if floating point
] ]
ADDEQ R2,R2,#3 ADDEQ R2,R2,#3
...@@ -380,7 +371,7 @@ LOOKA2 ADD R0,R0,#1 ;adjust by -2 ...@@ -380,7 +371,7 @@ LOOKA2 ADD R0,R0,#1 ;adjust by -2
LOOKA3 TST R5,#&FF ;Check list entry has ended LOOKA3 TST R5,#&FF ;Check list entry has ended
BNE LOOKU1 ;Otherwise loop BNE LOOKU1 ;Otherwise loop
TEQ TYPE,#4 ;found TEQ TYPE,#4 ;found
[ FP=1 [ FPOINT=1
TEQNE TYPE,#8 TEQNE TYPE,#8
] ]
SUBNE R0,R0,#3 ;adjust by -3 but add 3 if type=4, 8 SUBNE R0,R0,#3 ;adjust by -3 but add 3 if type=4, 8
...@@ -393,7 +384,7 @@ LOOKU5 MOVS R0,R1 ;pointer in different register ...@@ -393,7 +384,7 @@ LOOKU5 MOVS R0,R1 ;pointer in different register
TST R5,#&FF ;Is this the correct entry? TST R5,#&FF ;Is this the correct entry?
BNE LOOKU5 ;Loop if not BNE LOOKU5 ;Loop if not
TEQ TYPE,#4 TEQ TYPE,#4
[ FP=1 [ FPOINT=1
TEQ TYPE,#8 TEQ TYPE,#8
] ]
SUBNE R0,R0,#3 ;adjust by -3 SUBNE R0,R0,#3 ;adjust by -3
...@@ -554,7 +545,7 @@ ARREND LDR R3,[R4],#8 ;step past number of entries ...@@ -554,7 +545,7 @@ ARREND LDR R3,[R4],#8 ;step past number of entries
BNE ERRSB2 BNE ERRSB2
MOV R1,IACC,LSL #2 ;multiply by 4 MOV R1,IACC,LSL #2 ;multiply by 4
LDMFD SP!,{TYPE,R14} LDMFD SP!,{TYPE,R14}
[ FP=0 [ FPOINT=0
CMP TYPE,#5 CMP TYPE,#5
ADDCS R1,R1,IACC ;multiply by 5 for type=5 and 128 ADDCS R1,R1,IACC ;multiply by 5 for type=5 and 128
| |
...@@ -594,7 +585,7 @@ SPUSHL LDR R4,[R0],#4 ...@@ -594,7 +585,7 @@ SPUSHL LDR R4,[R0],#4
SPUSHX STR CLEN,[SP,#-4]! SPUSHX STR CLEN,[SP,#-4]!
MOV PC,R14 MOV PC,R14
FPUSH FPUSH
[ FP=0 [ FPOINT=0
ORR FGRD,FSIGN,FACCX ORR FGRD,FSIGN,FACCX
STMFD SP!,{FACC,FGRD} STMFD SP!,{FACC,FGRD}
| |
...@@ -620,7 +611,7 @@ SPULLL LDR R3,[SP],#4 ...@@ -620,7 +611,7 @@ SPULLL LDR R3,[SP],#4
MOV PC,R14 MOV PC,R14
;load fp acc from stack ;load fp acc from stack
FPULL FPULL
[ FP=0 [ FPOINT=0
LDMFD SP!,{FACC,FACCX} LDMFD SP!,{FACC,FACCX}
AND FSIGN,FACCX,#&80000000 AND FSIGN,FACCX,#&80000000
AND FACCX,FACCX,#255 AND FACCX,FACCX,#255
...@@ -671,7 +662,7 @@ COMPR TEQ TYPE,#0 ...@@ -671,7 +662,7 @@ COMPR TEQ TYPE,#0
CMP R1,IACC CMP R1,IACC
MOV IACC,#0 ;initial FALSE MOV IACC,#0 ;initial FALSE
MOV PC,R14 MOV PC,R14
[ FP=0 [ FPOINT=0
FCOMPS LDR R4,[SP],#4 FCOMPS LDR R4,[SP],#4
STMFD SP!,{FACC,FACCX,FSIGN} STMFD SP!,{FACC,FACCX,FSIGN}
MOV FACC,R4 MOV FACC,R4
...@@ -903,7 +894,7 @@ EXPRADD TEQ TYPE,#0 ...@@ -903,7 +894,7 @@ EXPRADD TEQ TYPE,#0
CMP R7,R10,LSR #28 CMP R7,R10,LSR #28
LDRCS PC,[SP],#4 ;musn't do operation at the moment (also exits if R5=0) LDRCS PC,[SP],#4 ;musn't do operation at the moment (also exits if R5=0)
EXPRCALL EXPRCALL
[ FP=0 [ FPOINT=0
FPLUS STMFD SP!,{FACC,FACCX,FSIGN,R7} FPLUS STMFD SP!,{FACC,FACCX,FSIGN,R7}
BL EXPRRECUR ;R10 BL EXPRRECUR ;R10
TEQ TYPE,#0 TEQ TYPE,#0
...@@ -927,7 +918,7 @@ EXPRPULLNEXT ...@@ -927,7 +918,7 @@ EXPRPULLNEXT
CMP R7,R10,LSR #28 CMP R7,R10,LSR #28
LDRCS PC,[SP],#4 LDRCS PC,[SP],#4
EXPRCALL EXPRCALL
[ FP=0 [ FPOINT=0
FMINUT TEQ FACC,#0 FMINUT TEQ FACC,#0
EORNE FSIGN,FSIGN,#&80000000 EORNE FSIGN,FSIGN,#&80000000
FPLUST LDR FWACC,[SP],#4 FPLUST LDR FWACC,[SP],#4
...@@ -993,7 +984,7 @@ EXPRMUL TEQ TYPE,#0 ...@@ -993,7 +984,7 @@ EXPRMUL TEQ TYPE,#0
CMP R7,R10,LSR #28 CMP R7,R10,LSR #28
LDRCS PC,[SP],#4 ;musn't do operation at the moment (also exits if R5=0) LDRCS PC,[SP],#4 ;musn't do operation at the moment (also exits if R5=0)
EXPRCALL EXPRCALL
[ FP=0 [ FPOINT=0
FTIMEL BL FLOATB FTIMEL BL FLOATB
FTIMET LDR FWACC,[SP],#4 FTIMET LDR FWACC,[SP],#4
STMFD SP!,{FACC,FACCX,FSIGN} STMFD SP!,{FACC,FACCX,FSIGN}
...@@ -1028,7 +1019,7 @@ FTIMES MUFD FACC,F1,FACC ...@@ -1028,7 +1019,7 @@ FTIMES MUFD FACC,F1,FACC
CMP R7,R10,LSR #28 CMP R7,R10,LSR #28
LDRCS PC,[SP],#4 ;musn't do operation at the moment (also exits if R5=0) LDRCS PC,[SP],#4 ;musn't do operation at the moment (also exits if R5=0)
EXPRCALL EXPRCALL
[ FP=0 [ FPOINT=0
EXPRDIV BL FLOATY EXPRDIV BL FLOATY
STMFD SP!,{FACC,FACCX,FSIGN,R7} STMFD SP!,{FACC,FACCX,FSIGN,R7}
BL EXPRRECUR ;R10 BL EXPRRECUR ;R10
...@@ -1124,7 +1115,7 @@ EXPRLSHIFT ...@@ -1124,7 +1115,7 @@ EXPRLSHIFT
MOV IACC,R1,LSL IACC MOV IACC,R1,LSL IACC
B EXPRNONRIGHT B EXPRNONRIGHT
EXPRPOW STR R7,[SP,#-4]! EXPRPOW STR R7,[SP,#-4]!
[ FP=0 [ FPOINT=0
BL FLOATY BL FLOATY
FPUSH FPUSH
BL FACTOR ;shortcut! BL FACTOR ;shortcut!
...@@ -1237,4 +1228,5 @@ CHANNL STR R14,[SP,#-4]! ...@@ -1237,4 +1228,5 @@ CHANNL STR R14,[SP,#-4]!
BL INTEGZ BL INTEGZ
MOV R1,IACC ;right reg for most swi's MOV R1,IACC ;right reg for most swi's
LDR PC,[SP],#4 LDR PC,[SP],#4
LNK s.Factor
LNK Factor.s
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
; limitations under the License. ; limitations under the License.
; ;
;> Factor ;> Factor
;UNMIN1 BEQ UNMINS ;UNMIN1 BEQ UNMINS
; CMP R10,#"""" ; CMP R10,#""""
; BEQ QSTR ; BEQ QSTR
...@@ -20,6 +21,7 @@ ...@@ -20,6 +21,7 @@
;UNPLUS LDREQB R10,[AELINE],#1 ;eq state maintained through jump table! ;UNPLUS LDREQB R10,[AELINE],#1 ;eq state maintained through jump table!
; B DOPLUS ; B DOPLUS
;Factors must return valid condition codes! ;Factors must return valid condition codes!
FACTOR LDRB R10,[AELINE],#1 FACTOR LDRB R10,[AELINE],#1
; CMP R10,#" " ; CMP R10,#" "
; BEQ FACTOR ; BEQ FACTOR
...@@ -372,7 +374,7 @@ WIDTHFN LDR IACC,[ARGP,#WIDTHLOC] ...@@ -372,7 +374,7 @@ WIDTHFN LDR IACC,[ARGP,#WIDTHLOC]
TRACEFN LDR IACC,[ARGP,#TRACEFILE] TRACEFN LDR IACC,[ARGP,#TRACEFILE]
B SINSTK B SINSTK
MODEFN MOV R0,#&87 MODEFN MOV R0,#&87
SWI BYTE SWI OS_Byte
MOV IACC,R2 MOV IACC,R2
B SINSTK B SINSTK
VDUFN STR R14,[SP,#-4]! VDUFN STR R14,[SP,#-4]!
...@@ -384,18 +386,18 @@ VDUFN STR R14,[SP,#-4]! ...@@ -384,18 +386,18 @@ VDUFN STR R14,[SP,#-4]!
STMFD SP!,{R0-R2} STMFD SP!,{R0-R2}
MOV R0,SP MOV R0,SP
ADD R1,SP,#8 ADD R1,SP,#8
SWI READVDUVARIABLES SWI OS_ReadVduVariables
LDR IACC,[R1] LDR IACC,[R1]
ADD SP,SP,#12 ADD SP,SP,#12
B SINSTK B SINSTK
BEAT MOV R0,#0 BEAT MOV R0,#0
SWI SOUNDEVENTQBEAT SWI Sound_QBeat
B SINSTK B SINSTK
RBEATS MVN R0,#0 RBEATS MVN R0,#0
SWI SOUNDEVENTQBEAT SWI Sound_QBeat
B SINSTK B SINSTK
RTEMPO MOV R0,#0 RTEMPO MOV R0,#0
SWI SOUNDEVENTTEMPO SWI Sound_QTempo
B SINSTK B SINSTK
UNMINS STR R14,[SP,#-4]! UNMINS STR R14,[SP,#-4]!
; BL UNPLUS ; BL UNPLUS
...@@ -403,7 +405,7 @@ UNMINS STR R14,[SP,#-4]! ...@@ -403,7 +405,7 @@ UNMINS STR R14,[SP,#-4]!
BEQ ERTYPEINT BEQ ERTYPEINT
VALCMP RSBPL IACC,IACC,#0 ;negate integer VALCMP RSBPL IACC,IACC,#0 ;negate integer
LDRPL PC,[SP],#4 LDRPL PC,[SP],#4
[ FP=0 [ FPOINT=0
TEQ FACC,#0 TEQ FACC,#0
EORNE FSIGN,FSIGN,#&80000000 ;negate floating point EORNE FSIGN,FSIGN,#&80000000 ;negate floating point
TEQ TYPE,#0 TEQ TYPE,#0
...@@ -470,7 +472,7 @@ VARIND CMP TYPE,#4 ...@@ -470,7 +472,7 @@ VARIND CMP TYPE,#4
CMP TYPE,#128 CMP TYPE,#128
BCS VARNOTNUM BCS VARNOTNUM
VARFP VARFP
[ FP=0 [ FPOINT=0
BIC FSIGN,IACC,#3 BIC FSIGN,IACC,#3
; AND FGRD,FACC,#3 ; AND FGRD,FACC,#3
MOVS FGRD,IACC,LSL #31 MOVS FGRD,IACC,LSL #31
...@@ -548,7 +550,7 @@ TSTN AND R1,AELINE,#CACHEMASK ...@@ -548,7 +550,7 @@ TSTN AND R1,AELINE,#CACHEMASK
ADD AELINE,AELINE,R1 ADD AELINE,AELINE,R1
MOVPL PC,R14 MOVPL PC,R14
SUB AELINE,AELINE,#TFP SUB AELINE,AELINE,#TFP
[ FP=0 [ FPOINT=0
AND FACCX,TYPE,#255 AND FACCX,TYPE,#255
AND FSIGN,TYPE,#TFP AND FSIGN,TYPE,#TFP
| |
...@@ -563,7 +565,7 @@ TSTNNOTCACHE ...@@ -563,7 +565,7 @@ TSTNNOTCACHE
BCC FACERR BCC FACERR
LDMFD SP!,{R6,R14} LDMFD SP!,{R6,R14}
TEQ TYPE,#0 TEQ TYPE,#0
[ FP=0 [ FPOINT=0
ORRMI TYPE,FACCX,FSIGN ORRMI TYPE,FACCX,FSIGN
| |
STFMID FACC,[SP,#-8]! STFMID FACC,[SP,#-8]!
...@@ -624,7 +626,7 @@ BINIP LDRB R10,[AELINE],#1 ...@@ -624,7 +626,7 @@ BINIP LDRB R10,[AELINE],#1
RPTR STR R14,[SP,#-4]! RPTR STR R14,[SP,#-4]!
BL CHAN BL CHAN
MOV R0,#0 MOV R0,#0
RPTRA SWI ARGS RPTRA SWI OS_Args
MOV IACC,R2 MOV IACC,R2
B PSINSTK B PSINSTK
RPAGE LDR IACC,[ARGP,#PAGE] RPAGE LDR IACC,[ARGP,#PAGE]
...@@ -633,10 +635,10 @@ RTIME ADD R1,ARGP,#STRACC ...@@ -633,10 +635,10 @@ RTIME ADD R1,ARGP,#STRACC
LDRB R10,[AELINE] LDRB R10,[AELINE]
CMP R10,#"$" CMP R10,#"$"
BEQ RTIMED BEQ RTIMED
MOV R0,#1 MOV R0,#OsWord_ReadSystemClock
SWI WORD SWI OS_Word
LDR IACC,[R1] LDR IACC,[R1]
[ 1=0 [ {FALSE}
LDR R1,[ARGP,#TIMEOF] LDR R1,[ARGP,#TIMEOF]
SUB FACC,FACC,R1 ;subtract the offset SUB FACC,FACC,R1 ;subtract the offset
] ]
...@@ -644,8 +646,8 @@ RTIME ADD R1,ARGP,#STRACC ...@@ -644,8 +646,8 @@ RTIME ADD R1,ARGP,#STRACC
RTIMED ADD AELINE,AELINE,#1 RTIMED ADD AELINE,AELINE,#1
MOV R0,#0 MOV R0,#0
STR R0,[R1] ;long time STR R0,[R1] ;long time
MOV R0,#14 MOV R0,#OsWord_ReadRealTimeClock
SWI WORD SWI OS_Word
SUB CLEN,R1,#1 ; measure length SUB CLEN,R1,#1 ; measure length
RTIMED1 RTIMED1
LDRB R0,[CLEN,#1]! LDRB R0,[CLEN,#1]!
...@@ -659,7 +661,7 @@ RHIMEM LDR IACC,[ARGP,#HIMEM] ...@@ -659,7 +661,7 @@ RHIMEM LDR IACC,[ARGP,#HIMEM]
ABS STR R14,[SP,#-4]! ABS STR R14,[SP,#-4]!
BL FACTOR BL FACTOR
BEQ ERTYPEINT BEQ ERTYPEINT
[ FP=0 [ FPOINT=0
MOVMI FSIGN,#0 MOVMI FSIGN,#0
| |
ABSMID FACC,FACC ABSMID FACC,FACC
...@@ -675,7 +677,7 @@ ADC STR R14,[SP,#-4]! ...@@ -675,7 +677,7 @@ ADC STR R14,[SP,#-4]!
MOV R1,R0 MOV R1,R0
MOV R2,R0,LSR #8 MOV R2,R0,LSR #8
MOV R0,#&80 MOV R0,#&80
SWI BYTE SWI OS_Byte
AND IACC,R1,#255 AND IACC,R1,#255
; AND R2,R2,#255 ;removed since GStark claims its OK ; AND R2,R2,#255 ;removed since GStark claims its OK
ORR IACC,IACC,R2,LSL #8 ORR IACC,IACC,R2,LSL #8
...@@ -693,7 +695,7 @@ TRUE MVN IACC,#0 ...@@ -693,7 +695,7 @@ TRUE MVN IACC,#0
ACS STR R14,[SP,#-4]! ACS STR R14,[SP,#-4]!
BL FACTOR BL FACTOR
BLPL FLOATQ BLPL FLOATQ
[ FP=0 [ FPOINT=0
MOV R10,#1 MOV R10,#1
B ASN1 B ASN1
| |
...@@ -703,7 +705,7 @@ ACS STR R14,[SP,#-4]! ...@@ -703,7 +705,7 @@ ACS STR R14,[SP,#-4]!
] ]
BBGET STR R14,[SP,#-4]! BBGET STR R14,[SP,#-4]!
BL CHAN BL CHAN
SWI BGET SWI OS_BGet
B PSINSTK B PSINSTK
COUNT LDR IACC,[ARGP,#TALLY] COUNT LDR IACC,[ARGP,#TALLY]
B SINSTK B SINSTK
...@@ -733,7 +735,7 @@ EVAL STR R14,[SP,#-4]! ...@@ -733,7 +735,7 @@ EVAL STR R14,[SP,#-4]!
EXP STR R14,[SP,#-4]! EXP STR R14,[SP,#-4]!
BL FACTOR BL FACTOR
BLPL FLOATQ BLPL FLOATQ
[ FP=0 [ FPOINT=0
BL FEXP BL FEXP
| |
EXPD FACC,FACC EXPD FACC,FACC
...@@ -750,7 +752,7 @@ RQUIT LDRB R0,[ARGP,#CALLEDNAME] ...@@ -750,7 +752,7 @@ RQUIT LDRB R0,[ARGP,#CALLEDNAME]
FALSE MOV IACC,#0 FALSE MOV IACC,#0
SINSTK MOVS TYPE,#TINTEGER SINSTK MOVS TYPE,#TINTEGER
MOV PC,R14 MOV PC,R14
GET SWI READC GET SWI OS_ReadC
B SINSTK B SINSTK
INKEY STR R14,[SP,#-4]! INKEY STR R14,[SP,#-4]!
BL FACTOR BL FACTOR
...@@ -758,7 +760,7 @@ INKEY STR R14,[SP,#-4]! ...@@ -758,7 +760,7 @@ INKEY STR R14,[SP,#-4]!
MOV R1,IACC MOV R1,IACC
MOV R2,IACC,LSR #8 MOV R2,IACC,LSR #8
MOV R0,#&81 MOV R0,#&81
SWI BYTE SWI OS_Byte
LDR R14,[SP],#4 LDR R14,[SP],#4
ANDS R2,R2,#255 ANDS R2,R2,#255
BNE TRUE BNE TRUE
...@@ -823,7 +825,7 @@ INT STR R14,[SP,#-4]! ...@@ -823,7 +825,7 @@ INT STR R14,[SP,#-4]!
BL FACTOR BL FACTOR
BEQ ERTYPEINT BEQ ERTYPEINT
LDRPL PC,[SP],#4 LDRPL PC,[SP],#4
[ FP=0 [ FPOINT=0
TEQ FSIGN,#0 TEQ FSIGN,#0
BPL INTF BPL INTF
MOVS FWACC,FACC MOVS FWACC,FACC
...@@ -857,7 +859,7 @@ PSINSTK MOVS TYPE,#TINTEGER ...@@ -857,7 +859,7 @@ PSINSTK MOVS TYPE,#TINTEGER
LN STR R14,[SP,#-4]! LN STR R14,[SP,#-4]!
BL FACTOR BL FACTOR
BLPL FLOATQ BLPL FLOATQ
[ FP=0 [ FPOINT=0
BL FLOG BL FLOG
| |
LGND FACC,FACC LGND FACC,FACC
...@@ -866,7 +868,7 @@ LN STR R14,[SP,#-4]! ...@@ -866,7 +868,7 @@ LN STR R14,[SP,#-4]!
LOG STR R14,[SP,#-4]! LOG STR R14,[SP,#-4]!
BL FACTOR BL FACTOR
BLPL FLOATQ BLPL FLOATQ
[ FP=0 [ FPOINT=0
BL FLOG BL FLOG
ADR TYPE,RPLN10 ADR TYPE,RPLN10
B FMULFSINSTK B FMULFSINSTK
...@@ -884,7 +886,7 @@ RAD STR R14,[SP,#-4]! ...@@ -884,7 +886,7 @@ RAD STR R14,[SP,#-4]!
BL FACTOR BL FACTOR
BLPL FLOATQ BLPL FLOATQ
ADR TYPE,FPID180 ADR TYPE,FPID180
[ FP=0 [ FPOINT=0
FMULFSINSTK FMULFSINSTK
BL FMUL BL FMUL
MOVS TYPE,#TFP MOVS TYPE,#TFP
...@@ -918,7 +920,7 @@ F STMFD SP!,{R0,R14} ...@@ -918,7 +920,7 @@ F STMFD SP!,{R0,R14}
BL FACTOR BL FACTOR
BL OSSTRI BL OSSTRI
LDMFD SP!,{R0,R14} LDMFD SP!,{R0,R14}
SWI OPEN SWI OS_Find
B SINSTK B SINSTK
POINTB STR R14,[SP,#-4]! POINTB STR R14,[SP,#-4]!
BL EXPR BL EXPR
...@@ -930,7 +932,7 @@ POINTB STR R14,[SP,#-4]! ...@@ -930,7 +932,7 @@ POINTB STR R14,[SP,#-4]!
BL INTEGZ BL INTEGZ
MOV R1,R0 MOV R1,R0
LDMFD SP!,{R0,R14} LDMFD SP!,{R0,R14}
SWI READPOINT SWI OS_ReadPoint
MOV R0,R2 MOV R0,R2
B SINSTK B SINSTK
RTINT LDRB R10,[AELINE],#1 RTINT LDRB R10,[AELINE],#1
...@@ -946,11 +948,11 @@ RTINT LDRB R10,[AELINE],#1 ...@@ -946,11 +948,11 @@ RTINT LDRB R10,[AELINE],#1
BL INTEGZ BL INTEGZ
MOV R1,R0 MOV R1,R0
LDMFD SP!,{R0,R14} LDMFD SP!,{R0,R14}
SWI READPOINT SWI OS_ReadPoint
MOV R0,R3 MOV R0,R3
B SINSTK B SINSTK
POS MOV R0,#&86 POS MOV R0,#&86
SWI BYTE SWI OS_Byte
AND IACC,R1,#255 AND IACC,R1,#255
B SINSTK B SINSTK
RND STR R14,[SP,#-4]! RND STR R14,[SP,#-4]!
...@@ -966,7 +968,7 @@ RND STR R14,[SP,#-4]! ...@@ -966,7 +968,7 @@ RND STR R14,[SP,#-4]!
BEQ FRND BEQ FRND
TEQ IACC,#1 TEQ IACC,#1
BEQ FRND1 BEQ FRND1
[ FP=0 [ FPOINT=0
BL IFLT BL IFLT
FPUSH FPUSH
BL DORANDOM BL DORANDOM
...@@ -996,7 +998,7 @@ SIMPLE BL DORANDOM ...@@ -996,7 +998,7 @@ SIMPLE BL DORANDOM
B PSINSTK B PSINSTK
;convert IACC to FACC ;convert IACC to FACC
FRNDAA FRNDAA
[ FP=0 [ FPOINT=0
MOV FSIGN,#0 MOV FSIGN,#0
MOV FACCX,#&80 ;exponent in range 1/2-1 MOV FACCX,#&80 ;exponent in range 1/2-1
MOV FGRD,#0 MOV FGRD,#0
...@@ -1055,7 +1057,7 @@ SGN STR R14,[SP,#-4]! ...@@ -1055,7 +1057,7 @@ SGN STR R14,[SP,#-4]!
LDR R14,[SP],#4 LDR R14,[SP],#4
BEQ ERTYPEINT BEQ ERTYPEINT
BPL SGNINT BPL SGNINT
[ FP=0 [ FPOINT=0
TEQ FACC,#0 TEQ FACC,#0
BEQ SINSTK BEQ SINSTK
TEQ FSIGN,#0 TEQ FSIGN,#0
...@@ -1073,7 +1075,7 @@ SGNINT TEQ IACC,#0 ...@@ -1073,7 +1075,7 @@ SGNINT TEQ IACC,#0
B INTONE B INTONE
TAN STR R14,[SP,#-4]! TAN STR R14,[SP,#-4]!
BL FACTOR BL FACTOR
[ FP=0 [ FPOINT=0
BLPL FLOATQ BLPL FLOATQ
CMP FACCX,#&98 CMP FACCX,#&98
BCS FRNGQQ BCS FRNGQQ
...@@ -1235,7 +1237,7 @@ TAN2A TST R10,#1 ...@@ -1235,7 +1237,7 @@ TAN2A TST R10,#1
SQR STR R14,[SP,#-4]! SQR STR R14,[SP,#-4]!
BL FACTOR BL FACTOR
BLPL FLOATQ BLPL FLOATQ
[ FP=0 [ FPOINT=0
BL FSQRT BL FSQRT
| |
SQTD FACC,FACC SQTD FACC,FACC
...@@ -1250,7 +1252,7 @@ USR STR R14,[SP,#-4]! ...@@ -1250,7 +1252,7 @@ USR STR R14,[SP,#-4]!
BL FACTOR BL FACTOR
BL INTEGY BL INTEGY
MOV TYPE,IACC MOV TYPE,IACC
[ FP=0 [ FPOINT=0
BL EMUMOS BL EMUMOS
LDRNE PC,[SP],#4 LDRNE PC,[SP],#4
] ]
...@@ -1280,7 +1282,7 @@ VALMIN LDRB R10,[AELINE],#1 ...@@ -1280,7 +1282,7 @@ VALMIN LDRB R10,[AELINE],#1
LDR AELINE,[SP],#4 LDR AELINE,[SP],#4
B VALCMP B VALCMP
VPOS MOV R0,#&86 VPOS MOV R0,#&86
SWI BYTE SWI OS_Byte
AND IACC,R2,#255 AND IACC,R2,#255
B SINSTK B SINSTK
CHRD STR R14,[SP,#-4]! CHRD STR R14,[SP,#-4]!
...@@ -1295,7 +1297,7 @@ GETDH1 ADD R0,ARGP,#STRACC ...@@ -1295,7 +1297,7 @@ GETDH1 ADD R0,ARGP,#STRACC
SUB R0,CLEN,R0 SUB R0,CLEN,R0
CMP R0,#255 CMP R0,#255
BCS LEFTX BCS LEFTX
SWI BGET SWI OS_BGet
MOVCS R0,#10 MOVCS R0,#10
TEQ R0,#10 TEQ R0,#10
TEQNE R0,#13 TEQNE R0,#13
...@@ -1306,7 +1308,7 @@ GETDH1 ADD R0,ARGP,#STRACC ...@@ -1306,7 +1308,7 @@ GETDH1 ADD R0,ARGP,#STRACC
GETD LDRB R0,[AELINE] GETD LDRB R0,[AELINE]
TEQ R0,#"#" TEQ R0,#"#"
BEQ GETDH BEQ GETDH
SWI READC SWI OS_ReadC
SINSTR ADD CLEN,ARGP,#STRACC SINSTR ADD CLEN,ARGP,#STRACC
STRB IACC,[CLEN],#1 STRB IACC,[CLEN],#1
MOVS TYPE,#0 MOVS TYPE,#0
...@@ -1317,7 +1319,7 @@ INKED STR R14,[SP,#-4]! ...@@ -1317,7 +1319,7 @@ INKED STR R14,[SP,#-4]!
MOV R1,IACC MOV R1,IACC
MOV R2,IACC,LSR #8 MOV R2,IACC,LSR #8
MOV R0,#&81 MOV R0,#&81
SWI BYTE SWI OS_Byte
LDR R14,[SP],#4 LDR R14,[SP],#4
AND IACC,R1,#255 AND IACC,R1,#255
ANDS R2,R2,#255 ANDS R2,R2,#255
...@@ -1466,8 +1468,9 @@ STRNLP LDRB R5,[R4],#1 ...@@ -1466,8 +1468,9 @@ STRNLP LDRB R5,[R4],#1
EOF STR R14,[SP,#-4]! EOF STR R14,[SP,#-4]!
BL CHAN BL CHAN
MOV R0,#&7F MOV R0,#&7F
SWI BYTE SWI OS_Byte
ANDS IACC,R1,#255 ANDS IACC,R1,#255
MVNNE IACC,#0 MVNNE IACC,#0
B PSINSTK B PSINSTK
LNK s.Funct
LNK Funct.s
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
; limitations under the License. ; limitations under the License.
; ;
;> Funct ;> Funct
FNTRC TST R5,#&80 FNTRC TST R5,#&80
BNE ESCAPE BNE ESCAPE
TST R5,#&8000 TST R5,#&8000
...@@ -51,24 +52,24 @@ FNTRC4 TEQ R10,#TPROC ...@@ -51,24 +52,24 @@ FNTRC4 TEQ R10,#TPROC
TRCSTART TRCSTART
TST R5,#TINTEGER TST R5,#TINTEGER
SWIEQ WRITEI+"[" SWIEQ OS_WriteI+"["
SWINE WRITEI+"{" SWINE OS_WriteI+"{"
MOV PC,R14 MOV PC,R14
TRCEND LDR R0,[ARGP,#TRACEFILE] TRCEND LDR R0,[ARGP,#TRACEFILE]
CMP R0,#0 CMP R0,#0
BNE TRCEND0 BNE TRCEND0
TST R5,#TINTEGER TST R5,#TINTEGER
SWIEQ WRITEI+"]" SWIEQ OS_WriteI+"]"
SWINE WRITEI+"}" SWINE OS_WriteI+"}"
SWI WRITEI+" " SWI OS_WriteI+" "
B TRCEND1 B TRCEND1
TRCEND0 STR R14,[SP,#-4]! TRCEND0 STR R14,[SP,#-4]!
MOV R0,#10 MOV R0,#10
BL CHOUTTRACE BL CHOUTTRACE
LDR R14,[SP],#4 LDR R14,[SP],#4
TRCEND1 TST R5,#TINTEGER TRCEND1 TST R5,#TINTEGER
SWINE READC SWINE OS_ReadC
MOV PC,R14 MOV PC,R14
; routines to output trace information about the exit point ; routines to output trace information about the exit point
...@@ -629,7 +630,7 @@ GTARGRETRESTRVSTR2 ...@@ -629,7 +630,7 @@ GTARGRETRESTRVSTR2
LDMFD SP!,{R6,R7} LDMFD SP!,{R6,R7}
B GTARGRETRESTRV2 B GTARGRETRESTRV2
GTARGRETRESTRVFP GTARGRETRESTRVFP
[ FP=0 [ FPOINT=0
LDMFD AELINE!,{FACC,FACCX} LDMFD AELINE!,{FACC,FACCX}
AND FSIGN,FACCX,#&80000000 AND FSIGN,FACCX,#&80000000
AND FACCX,FACCX,#255 AND FACCX,FACCX,#255
...@@ -673,7 +674,7 @@ RETSTK TEQ R6,#TDIM ;DIM LOCAL just pops off the list ...@@ -673,7 +674,7 @@ RETSTK TEQ R6,#TDIM ;DIM LOCAL just pops off the list
TST R6,#3 TST R6,#3
STREQ R7,[R6] STREQ R7,[R6]
MOVEQ PC,R14 MOVEQ PC,R14
[ FP=0 [ FPOINT=0
B RETWORD B RETWORD
RETFP LDMFD SP!,{R7,R8} RETFP LDMFD SP!,{R7,R8}
STRB R8,[R6,#4] STRB R8,[R6,#4]
...@@ -690,7 +691,7 @@ RETWORD STRB R7,[R6],#1 ...@@ -690,7 +691,7 @@ RETWORD STRB R7,[R6],#1
MOV R7,R7,ROR #8 MOV R7,R7,ROR #8
RETBYTE STRB R7,[R6] RETBYTE STRB R7,[R6]
MOV PC,R14 MOV PC,R14
[ FP=1 [ FPOINT=1
RETFP LDMFD SP!,{R7,R8} RETFP LDMFD SP!,{R7,R8}
STMIA R6,{R7,R8} STMIA R6,{R7,R8}
MOV ARGP,#VARS MOV ARGP,#VARS
...@@ -724,4 +725,5 @@ RETRP1 LDRB R8,[SP],#1 ...@@ -724,4 +725,5 @@ RETRP1 LDRB R8,[SP],#1
RETRPN MOV R7,#13 RETRPN MOV R7,#13
STRB R7,[R6] STRB R7,[R6]
MOV PC,R14 MOV PC,R14
LNK s.Stmt
LNK Stmt.s
...@@ -12,7 +12,8 @@ ...@@ -12,7 +12,8 @@
; See the License for the specific language governing permissions and ; See the License for the specific language governing permissions and
; limitations under the License. ; limitations under the License.
; ;
; > Lexical ;> Lexical
;get line number to r0. EQ if succeed, NE otherwise ;get line number to r0. EQ if succeed, NE otherwise
;uses r0,r1,r10 ;uses r0,r1,r10
SPTSTN LDRB R10,[LINE],#1 SPTSTN LDRB R10,[LINE],#1
...@@ -102,15 +103,15 @@ CQCCLEAR ...@@ -102,15 +103,15 @@ CQCCLEAR
MOV PC,R14 MOV PC,R14
| |
WORDCQ CMP R0,#"z" WORDCQ CMP R0,#"z"
BICHIS PC,R14,#CFLAG BICHIS PC,R14,#C_Flag
CMP R0,#"_" CMP R0,#"_"
MOVCS PC,R14 MOVCS PC,R14
CMP R0,#"Z" CMP R0,#"Z"
BICHIS PC,R14,#CFLAG BICHIS PC,R14,#C_Flag
CMP R0,#"A" CMP R0,#"A"
MOVCS PC,R14 MOVCS PC,R14
NUMBCP CMP R0,#"9" NUMBCP CMP R0,#"9"
BICHIS PC,R14,#CFLAG BICHIS PC,R14,#C_Flag
CMP R0,#"0" CMP R0,#"0"
MOV PC,R14 MOV PC,R14
NUMBCQ CMP R0,#"." NUMBCQ CMP R0,#"."
...@@ -775,4 +776,5 @@ PWHEN = "WHEN",TWHEN,2 ...@@ -775,4 +776,5 @@ PWHEN = "WHEN",TWHEN,2
PWAIT = "WAIT",TWAIT,64+8+1 PWAIT = "WAIT",TWAIT,64+8+1
PWIDTH = "WIDTH",TWIDTH,2 PWIDTH = "WIDTH",TWIDTH,2
PUNLIST = " unlistable token ",&FF PUNLIST = " unlistable token ",&FF
LNK s.Command
LNK Command.s
...@@ -14,333 +14,43 @@ ...@@ -14,333 +14,43 @@
; ;
;> Module header ;> Module header
RELEASEVER * 1 ;1 for release version: no MANDEL or Roger GET VersionASM
OWNERRORS * 0 ;1 for error messages in module GET Hdr/WorkSpace
CHECKCRUNCH * 1 ;1 for BASIC$Crunch check on -quit and LIBRARY, INSTALL etc. GET Hdr/Tokens
LOOKUPHELP * 1 ;1 for lookup command help syntax in Global.Messages file. GET Hdr/Definitions
DO32BIT * 1 ;1 for 32-bit (and hence not ARM 2/3) compatible GET Hdr:ListOpts
GET Hdr:Macros
GET VersionASM GET Hdr:System
GBLS CurrentDate GET Hdr:Modhand
CurrentDate SETS Module_Date GET Hdr:Services
GBLS ShortDate GET Hdr:FSNumbers
ShortDate SETS Module_Date GET Hdr:NewErrors
GBLS Version GET Hdr:PaletteV
Version SETS Module_FullVersion GET Hdr:Wimp
GET Hdr:ColourTran
VARS * &8700 ;allocation of the data pointer itself GET Hdr:BASICTrans
GET Hdr:Territory
GBLS Name GET Hdr:PublicWS
[ FP=0 GET Hdr:Sound
Name SETS "BASIC" GET Hdr:OsWords
|
Name SETS "BASIC64" RELEASEVER * 1 ;1 for release version: no MANDEL or Roger
] OWNERRORS * 0 ;1 for error messages in module
;> &.Hdr.System CHECKCRUNCH * 1 ;1 for BASIC$Crunch check on -quit and LIBRARY, INSTALL etc.
SAFECRUNCH * 15 ;15 is a nice safe looking number
;*********************************** LOOKUPHELP * 1 ;1 for lookup command help syntax in Resources messages file.
;*** C h a n g e L i s t *** DO32BIT * 1 ;1 for 32-bit (and hence not ARM 2/3) compatible
;***********************************
GBLS Name
;Date Name Description [ FPOINT=0
;---- ---- ----------- Name SETS "BASIC"
;28-Apr-87 APT Added ticker event SWIs
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;SWI names are exported in three forms:
;1) with OS_ 'OS_DoThingToOtherThing' as N
;2) with XOS_ 'XOS_DoThingToOtherThing' as N + Auto_Error_SWI_bit
;3) as is 'DoThingToOtherThing' as N ;But not for long !!
;***************************************************
;*** Generate SWI labels assuming ^ type defs ***
;*** Also assumes the global variable SWIClass ***
;***************************************************
GBLS SWIClass
MACRO
AddSWI $SWIName,$value
[ "$value" = ""
$SWIClass._$SWIName # 1
| |
$SWIClass._$SWIName * $value Name SETS "BASIC64"
] ]
X$SWIClass._$SWIName * $SWIClass._$SWIName + Auto_Error_SWI_bit
MEND
Auto_Error_SWI_bit * 1:SHL: 17
SWIClass SETS "OS"
^ 0 ;Base for Arthur SWIs
AddSWI WriteC ;&00
AddSWI WriteS ;&01
AddSWI Write0 ;&02
AddSWI NewLine ;&03
AddSWI ReadC ;&04
AddSWI CLI ;&05
AddSWI Byte ;&06
AddSWI Word ;&07
AddSWI File ;&08
AddSWI Args ;&09
AddSWI BGet ;&0A
AddSWI BPut ;&0B
AddSWI GBPB ;&0C
AddSWI Find ;&0D
AddSWI ReadLine ;&0E
AddSWI Control ;&0F
AddSWI GetEnv ;&10
AddSWI Exit ;&11
AddSWI SetEnv ;&12
AddSWI IntOn ;&13
AddSWI IntOff ;&14
AddSWI CallBack ;&15
AddSWI EnterOS ;&16
AddSWI BreakPt ;&17
AddSWI BreakCtrl ;&18
AddSWI UnusedSWI ;&19
AddSWI UpdateMEMC ;&1A
AddSWI SetCallBack ;&1B
AddSWI Mouse ;&1C
AddSWI Heap ;&1D ;Our new ones start here
AddSWI Module ;&1E
AddSWI Claim ;&1F ;PMF's vector handling
AddSWI Release ;&20 ;routines
AddSWI ReadUnsigned ;&21 ;Read an unsigned number
AddSWI GenerateEvent ;&22
AddSWI ReadVarVal ;&23 ;read variable value & type
AddSWI SetVarVal ;&24 ;set variable value & type
AddSWI GSInit ;&25
AddSWI GSRead ;&26
AddSWI GSTrans ;&27
AddSWI BinaryToDecimal ;&28
AddSWI FSControl ;&29
AddSWI ChangeDynamicArea ;&2A
AddSWI GenerateError ;&2B
AddSWI ReadEscapeState ;&2C
AddSWI EvaluateExpression ;&2D
AddSWI SpriteOp ;&2E
AddSWI ReadPalette ;&2F ;(was FontManager)
AddSWI ServiceCall ;&30 ;was Claim_Release_FIQ
AddSWI ReadVduVariables ;&31
AddSWI ReadPoint ;&32
AddSWI UpCall ;&33
AddSWI CallAVector ;&34 ;was ReadCurrentError
AddSWI ReadModeVariable ;&35
AddSWI RemoveCursors ;&36
AddSWI RestoreCursors ;&37
AddSWI SWINumberToString ;&38
AddSWI SWINumberFromString ;&39
^ &C0
AddSWI ConvertStandardDateAndTime ;&C0
AddSWI ConvertDateAndTime ;&C1
AddSWI WriteI,&100
AddSWI UserSWI,&200
;Allocation of Operating System SWI Chunks
^ 3
StringConvSWI # 1
^ 8 ;OS chunk allocation starts at &200
FileSwitchSWI # 1
;Allocation of System extension SWI Chunks
^ 0
EconetSWI # 1
NetFSSWI # 1
FontSWI # 1
WimpSWI # 1
TubeSWI # 1
Sound0SWI # 1
Sound1SWI # 1
Sound2SWI # 1
NetPrintSWI # 1
ADFSSWI # 1
ROMPoduleSWI # 1
;Allocation of Application SWI Chunks
^ 0
MailSWI # 1
NetMonitorSWI # 1
ConmputerConcepts # 1
MinervaSystemD # 1
ResourceNH01 # 1
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;CMOS RAM allocation
ReadCMOS * &A1 ;The OS_Byte call to read CMOS
WriteCMOS * &A2 ;The OS_Byte call to write CMOS
NetStnCMOS * &00 ;One byte
NetFSIDCMOS * &01 ;Two bytes
NetPSIDCMOS * &03 ;Two bytes
FileLangCMOS * &05 ;One byte
FrugalCMOS * &06 ;Two bytes
EDITCMOS * &08 ;One byte
TelcomCMOS * &09 ;One byte
MODETVCMOS * &0A ;One byte
StartCMOS * &0B ;One byte
KeyDelCMOS * &0C ;One byte
KeyRepCMOS * &0D ;One byte
PigCMOS * &0E ;One byte
PSITCMOS * &0F ;One byte
DBTBCMOS * &10 ;One byte
ANFSCMOS * &11 ;One byte
UserCMOS * &1E ;Sixteen bytes
FreeCMOS * &2E
MOSCMOS * &80 ;&80-&EF now being allocated ... sign here!
YearCMOS * &80 ;Two Bytes of year info (HEX)
MonthCMOS * &82 ;The last month we were in (HEX)
LeapCMOS * &83 ;The we've-had-the-29th-of-feb-this-year-already flag
TutuCMOS * &84 ;For nefarious porpoises
VduCMOS * &85
SyncBit * 1 ;Composite sync or not
ModeExtraBit * 2
FontCMOS * &86
NewADFSCMOS * &87 ;Three bytes (consult Nick)
;* &88
;* &89
CatalogCMOS * &8A ;Two bytes
ExamineCMOS * &8C ;Two bytes
TwinCMOS * &8E
ScreenSizeCMOS * &8F
RAMDiscCMOS * &90
SysHeapCMOS * &91
RMASizeCMOS * &92
SpriteSizeCMOS * &93
SoundCMOS * &94
ABE0 * &95 ;4 Bytes for the BASIC Editor.
ABE1 * &96 ;
ABE2 * &97 ;
ABE3 * &98 ;
PSNameCMOS * &DB ;5 bytes for 6 char name,one byte in NetPSId + 1
FSNameCMOS * &E0 ;15 bytes for 16 char name,one byte in NetFSId + 1
CheckSumCMOS * &EF ;One byte for CMOS RAM checksum
;Note that CMOS RAM ends at F0 where the clock starts
;> &.Hdr.ModHand
;***********************************
;*** C h a n g e L i s t ***
;***********************************
;Date Name Description
;---- ---- -----------
;23-Apr-87 APT Help-is-code flag moved into high byte
ModHandReason_Run * 0
ModHandReason_Load * 1
ModHandReason_Enter * 2
ModHandReason_ReInit * 3
ModHandReason_Delete * 4
ModHandReason_RMADesc * 5
ModHandReason_Claim * 6
ModHandReason_Free * 7
ModHandReason_Tidy * 8
ModHandReason_Clear * 9
ModHandReason_AddArea * 10
ModHandReason_CopyArea * 11
ModHandReason_GetNames * 12
ModHandReason_ExtendBlock * 13
;Real module offsets
^ 0
Module_Start # 4
Module_Init # 4
Module_Die # 4
Module_Service # 4
Module_Title # 4
Module_HelpStr # 4
Module_HC_Table # 4 ;help and command table.
;optional SWI handler offsets
Module_SWIChunk # 4
Module_SWIEntry # 4
Module_NameTable # 4
Module_NameCode # 4
;Magic number for RM load addr
Module_LoadAddr * &FFFFFA00 ;magic number from Stu/Bruce standard the two zeroes are ignored.
Module_SWIChunkSize * 2_1000000
Module_SWISystemBase * 1:SHL: 18
Module_SWIApplicationBase * 2:SHL: 18
Module_SWIUserBase * 3:SHL: 18
;flags for the information word:
FS_Command_Flag * 1:SHL: 31
Status_Keyword_Flag * 1:SHL: 30
Help_Is_Code_Flag * 1:SHL: 29
R0 RN 0
R1 RN 1
R2 RN 2
R3 RN 3
R4 RN 4
R5 RN 5
R6 RN 6
R7 RN 7
R8 RN 8
R9 RN 9
R10 RN 10
R11 RN 11
R12 RN 12
R13 RN 13
R14 RN 14
R15 RN 15
PC RN R15
;> &.Hdr.Services
;28-Apr-87 TMD Added a few more service codes
;All the service call reason codes
Service_Serviced * &00
Service_UKCommand * &04
Service_Error * &06 ;not quite the same: only for workspace tidying.
;If you want to claim the error, sit on ErrorV
Service_UKByte * &07 ;Unknown OSBYTEs go thru here
Service_UKWord * &08 ;Unknown OSWORDs go thru here
Service_Help * &09 ;Issued at the start of the *Help command:
;claim if replacing the MOS *Help
Service_ReleaseFIQ * &0B
Service_ClaimFIQ * &0C
Service_Memory * &11
Service_StartUpFS * &12
Service_Tube * &FE ;Means "Tube changing state"
;R2 = 0 for Tube not there
; <> 0 means Tube alive: may contain more info.
;Master OS ones:
Service_Post_Help * &18 ;Passed round at the end of the *Help code
Service_Reset * &27
Service_UKConfig * &28
Service_UKStatus * &29
PaletteV * &23
paletteV_Set * 2
AREA |BASIC$$Code|, CODE, READONLY, PIC AREA |BASIC$$Code|, CODE, READONLY, PIC
Module_BaseAddr * . Module_BaseAddr * .
Basic_ModuleStart Basic_ModuleStart
DCD MODULEMAIN-Module_BaseAddr DCD MODULEMAIN-Module_BaseAddr
...@@ -355,53 +65,40 @@ Basic_ModuleStart ...@@ -355,53 +65,40 @@ Basic_ModuleStart
DCD 0 DCD 0
DCD 0 DCD 0
[ LOOKUPHELP=1 [ LOOKUPHELP=1
DCD message_filename-Module_BaseAddr DCD Basic_MessageFile-Module_BaseAddr
| |
DCD 0 DCD 0
] ]
DCD Basic_ModuleFlags-Module_BaseAddr DCD Basic_ModuleFlags-Module_BaseAddr
MACRO
Command $cmd
DCB "$Name",0
ALIGN
DCD $cmd._Code -Module_BaseAddr
[ LOOKUPHELP=1
DCD &10FF0000
|
DCD &FF0000
]
DCD $cmd._Syntax-Module_BaseAddr
DCD $cmd._Help -Module_BaseAddr
MEND
Basic_HC_Table Basic_HC_Table
Command Basic
DCB 0
ALIGN
[ LOOKUPHELP=1 [ LOOKUPHELP=1
message_filename Command $Name, 255, 0, International_Help, Basic
Basic_MessageFile
DCB "Resources:$.Resources.BASIC.Messages",0 DCB "Resources:$.Resources.BASIC.Messages",0
Basic_Help Basic_Help
DCB "HBASBAS",0 DCB "HBASBAS",0
Basic_Syntax Basic_Syntax
DCB "SBASBAS",0 DCB "SBASBAS",0
| |
Basic_Help Command $Name, 255, 0, 0, Basic
DCD 0
Basic_Help
DCB "$Name. is the ARM BBC BASIC interpreter." DCB "$Name. is the ARM BBC BASIC interpreter."
DCB 13 DCB 13
Basic_Syntax Basic_Syntax
DCB "Syntax: *$Name. [-help|-chain|-load|-quit] <filename>",0 DCB "Syntax: *$Name. [-help|-chain|-load|-quit] <filename>",0
] ]
Basic_Title
Basic_Title
DCB "$Name.",0 DCB "$Name.",0
Basic_HelpStr Basic_HelpStr
[ FP=0 [ FPOINT=0
DCB "BBC BASIC V",9,"$Module_HelpVersion", 0 DCB "BBC BASIC V",9,"$Module_HelpVersion", 0
| |
DCB "BBC BASIC VI",9,"$Module_HelpVersion", 0 DCB "BBC BASIC VI",9,"$Module_HelpVersion", 0
...@@ -417,7 +114,6 @@ Basic_ModuleFlags ...@@ -417,7 +114,6 @@ Basic_ModuleFlags
] ]
Basic_ServicesTable Basic_ServicesTable
DCD 0 DCD 0
DCD Basic_ServicesBody-Module_BaseAddr DCD Basic_ServicesBody-Module_BaseAddr
DCD Service_Memory DCD Service_Memory
...@@ -435,13 +131,13 @@ Basic_Code ...@@ -435,13 +131,13 @@ Basic_Code
MOV PC,R3 MOV PC,R3
DCD Basic_ServicesTable-Module_BaseAddr DCD Basic_ServicesTable-Module_BaseAddr
Basic_Services
Basic_Services
MOV R0,R0 MOV R0,R0
CMP R1,#Service_Memory CMP R1,#Service_Memory
MOVNE PC,R14 MOVNE PC,R14
Basic_ServicesBody
Basic_ServicesBody
ADR R12,Basic_ModuleStart ADR R12,Basic_ModuleStart
CMP R2,R12 ;R2 contains the address of the currently active object CMP R2,R12 ;R2 contains the address of the currently active object
ADRHSL R12,Basic_End ADRHSL R12,Basic_End
......
; Copyright 2001 Pace Micro Technology plc
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
; http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
;
ADD R0,ARGP,#STRACC
BL OSCLIREGS
SWI CLI
B NXT
SYSNAME ADD R1,ARGP,#STRACC
MOV R0,#0
STRB R0,[CLEN]
SWI SWINUMBERFROMSTRING
B SYSGOTSWINUMB
SYS0STRING
MOV R0,#0
STRB R0,[CLEN],#1
LDR R7,[ARGP,#FSA]
LDMFD SP!,{R0,R4,R5,R6}
STMIA R7!,{R0,R4,R5,R6}
LDMFD SP!,{R0,R4,R5,R6}
STMIA R7!,{R0,R4,R5,R6}
LDMFD SP!,{R0,R4,R5,R6}
STMIA R7!,{R0,R4,R5,R6} ;move 12 words from stack to free memory
BL SPUSH
LDMDB R7!,{R0,R4,R5,R6} ;move 12 words back from free memory
STMFD SP!,{R0,R4,R5,R6}
LDMDB R7!,{R0,R4,R5,R6}
STMFD SP!,{R0,R4,R5,R6}
LDMDB R7!,{R0,R4,R5,R6}
STMFD SP!,{R0,R4,R5,R6}
ADD IACC,SP,#11*4+4+4 ;11 words on stack plus string length plus R4
B SYS0PUSH
SYS BL AEEXPR
TEQ TYPE,#0
BEQ SYSNAME
BLMI SFIX
SYSGOTSWINUMB
MOV TYPE,SP ;initial SP in R9/TYPE
STR IACC,[SP,#-4]! ;save action
MOV R4,#0
MOV R5,#0
MOV R6,#0
MOV R7,#0
STMFD SP!,{R4-R7,R9} ;R9=TYPE
STMFD SP!,{R4-R7}
STMFD SP!,{R4,R5} ;save 10 register holes and old sp
CMP R10,#","
BNE SYSCALL
;note R4 (SYS register index) already 0
SYS0 CMP R4,#10
BCS ERSYSINPUTS
SYS0SPACES
LDRB R10,[AELINE],#1
CMP R10,#" "
BEQ SYS0SPACES
CMP R10,#","
BEQ SYS0END
STR R4,[SP,#-4]!
SUB AELINE,AELINE,#1
BL EXPR
TEQ TYPE,#0
BEQ SYS0STRING
BLMI SFIX
SYS0PUSH
LDR R4,[SP],#4
STR IACC,[SP,R4,LSL #2]
SYS0END ADD R4,R4,#1
CMP R10,#","
BEQ SYS0
SYSCALL MOV LINE,AELINE
ADD AELINE,ARGP,#STRACC
LDR R4,[SP,#10*4] ;old sp
LDR R5,[R4,#-4] ;SWI call value
BIC R5,R5,#&FF000000
LDR R6,SYSDATA
ORR R6,R6,R5
STR R6,[AELINE]
LDR R6,SYSDATA+4
STR R6,[AELINE,#4]
CMP R10,#TTO
;Do IMB here to make SYS StrongARM compatible
MOV R0,#0
SWI XOSSYNCHRONISECODEAREAS
;----
BEQ SYSCALLTO
BL DONE
LDMFD SP!,{R0-R9} ;get parameters from stack
MOV R14,PC
MOV PC,AELINE
MOV ARGP,#VARS
LDR SP,[SP] ;pop stack and continue
B NXT
SYSCALLTO
LDMFD SP!,{R0-R9} ;get parameters from stack
MOV R14,PC
MOV PC,AELINE
STMFD SP!,{R0-R9,PC} ;write parameters back to stack
MOV ARGP,#VARS
MOV R7,#0
SYS1 CMP R7,#10
BCS ERSYSOUTPUTS
STR R7,[SP,#-4]!
BL CRAELV
LDR R7,[SP],#4
BEQ SYS1COMMA
MOV R4,IACC
MOV R5,TYPE
LDR IACC,[SP,R7,LSL #2]
MOV TYPE,#TINTEGER
CMP R5,#128
BCC SYS1END
MOV TYPE,#0
ADD CLEN,ARGP,#STRACC
ADD R3,CLEN,#256
SYS1STRING
LDRB R1,[IACC],#1
STRB R1,[CLEN],#1
TEQ CLEN,R3
TEQNE R1,#13
TEQNE R1,#0
TEQNE R1,#10
BNE SYS1STRING
TEQ CLEN,R3
SUBEQ CLEN,CLEN,#255
SUB CLEN,CLEN,#1
SYS1END STR R7,[SP,#-4]!
BL STOREA
LDR R7,[SP],#4
SYS1ENDA
ADD R7,R7,#1
MOV LINE,AELINE
SYS1SPACES
LDRB R10,[LINE],#1
CMP R10,#" "
BEQ SYS1SPACES
CMP R10,#","
BEQ SYS1
CMP R10,#";"
BNE SYSEXIT
BL CRAELV
BEQ ERSYNT
MOV R4,IACC
MOV R5,TYPE
LDR IACC,[SP,#10*4]
MOV IACC,IACC,LSR #28
MOV TYPE,#TINTEGER
BL STOREA
MOV LINE,AELINE
BL SPACES
SYSEXIT LDR SP,[SP,#11*4] ;recover old SP
B DONEXT
SYS1COMMA
BL SPACES
CMP R10,#","
CMPNE R10,#";"
SUBEQ AELINE,LINE,#1
BEQ SYS1ENDA
B ERSYNT
SYSDATA SWI 0
MOV PC,R14
CALL BL AEEXPR
BL INTEGY
CMP R10,#","
BEQ CALLARM
BL AEDONE
MOV TYPE,IACC
[ FP=0
BL EMUMOS
BNE NXT
]
MOV R4,TYPE
MOV R5,#0
B CALLARMGO
CALLARM MOV R4,IACC
MOV R5,#0
CALLARMP
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
; limitations under the License. ; limitations under the License.
; ;
;> Stmt ;> Stmt
CASE ROUT CASE ROUT
BL AEEXPR BL AEEXPR
TEQ R10,#TOF TEQ R10,#TOF
...@@ -60,7 +61,7 @@ CASEWH STR R7,[SP,#-4]! ;rqd if go back to %00 ...@@ -60,7 +61,7 @@ CASEWH STR R7,[SP,#-4]! ;rqd if go back to %00
BEQ CASES BEQ CASES
TEQ TYPE,#0 TEQ TYPE,#0
BEQ ERTYPEINT BEQ ERTYPEINT
[ FP=0 [ FPOINT=0
BLPL IFLT BLPL IFLT
ORR FGRD,FSIGN,FACCX ORR FGRD,FSIGN,FACCX
TEQ FACC,R5 TEQ FACC,R5
...@@ -289,7 +290,7 @@ RDLOOM MOVS R7,R7,LSR #1 ...@@ -289,7 +290,7 @@ RDLOOM MOVS R7,R7,LSR #1
TEQ TYPE,#4 ;test type TEQ TYPE,#4 ;test type
MOVEQ R5,R1,LSL #2 ;if integer than number of bytes is 4* number of entries MOVEQ R5,R1,LSL #2 ;if integer than number of bytes is 4* number of entries
ADDNE R5,R1,R1,LSL #2 ;if real/string then 5* ADDNE R5,R1,R1,LSL #2 ;if real/string then 5*
[ FP=1 [ FPOINT=1
TEQ TYPE,#8 TEQ TYPE,#8
MOVEQ R5,R1,LSL #3 MOVEQ R5,R1,LSL #3
] ]
...@@ -372,7 +373,7 @@ ENDCHANGE1 ...@@ -372,7 +373,7 @@ ENDCHANGE1
;change memory size ;change memory size
MOV R0,R7 MOV R0,R7
MOV R1,#-1 MOV R1,#-1
SWI WIMPSLOT SWI Wimp_SlotSize
ADD R0,R0,#&8000 ;add start of world ADD R0,R0,#&8000 ;add start of world
SUB R7,R0,SP ;remember difference - how far the world moved! SUB R7,R0,SP ;remember difference - how far the world moved!
MOV SP,R0 MOV SP,R0
...@@ -461,8 +462,8 @@ ENVELP STR R1,[SP,#-4]! ...@@ -461,8 +462,8 @@ ENVELP STR R1,[SP,#-4]!
BL EXPRDN BL EXPRDN
STRB IACC,[SP,#13] STRB IACC,[SP,#13]
MOV R1,SP MOV R1,SP
MOV R0,#8 MOV R0,#OsWord_DefineSoundEnvelope
SWI WORD SWI OS_Word
ADD SP,SP,#16 ADD SP,SP,#16
B NXT B NXT
FOR BL CRAELV FOR BL CRAELV
...@@ -501,7 +502,7 @@ FFOR MOV R0,#TFOR ;floating point FOR ...@@ -501,7 +502,7 @@ FFOR MOV R0,#TFOR ;floating point FOR
STMFD SP!,{R0,R4,R5,R6,R7,R8,R9} ;TFOR got, VAR got, ADDR, STEP(8), LIMIT(8) STMFD SP!,{R0,R4,R5,R6,R7,R8,R9} ;TFOR got, VAR got, ADDR, STEP(8), LIMIT(8)
BL EXPR BL EXPR
BL FLOATY BL FLOATY
[ FP=0 [ FPOINT=0
ADD TYPE,SP,#20 ADD TYPE,SP,#20
FSTA TYPE ;write limit into stack FSTA TYPE ;write limit into stack
BL FONE BL FONE
...@@ -513,14 +514,14 @@ FFOR MOV R0,#TFOR ;floating point FOR ...@@ -513,14 +514,14 @@ FFOR MOV R0,#TFOR ;floating point FOR
BNE FORSTA BNE FORSTA
BL EXPR BL EXPR
BL FLOATY BL FLOATY
[ FP=0 [ FPOINT=0
TEQ FACC,#0 TEQ FACC,#0
| |
CMF FACC,#0 CMF FACC,#0
] ]
BEQ FORSTEP BEQ FORSTEP
FORSTA FORSTA
[ FP=0 [ FPOINT=0
ADD TYPE,SP,#12 ;step offset on stack ADD TYPE,SP,#12 ;step offset on stack
FSTA TYPE FSTA TYPE
| |
...@@ -587,11 +588,11 @@ SIGHT LDRB R2,[R1,#1] ...@@ -587,11 +588,11 @@ SIGHT LDRB R2,[R1,#1]
CMPEQ R2,R3 CMPEQ R2,R3
BCC LOOKR BCC LOOKR
MOVEQ PC,R14 ;cs if found MOVEQ PC,R14 ;cs if found
[ DO32BIT = 1 [ DO32BIT = 1
CMN PC,#0 ;return cc CMN PC,#0 ;return cc
MOV PC,R14 MOV PC,R14
| |
BICS PC,R14,#CFLAG ;return cc BICS PC,R14,#C_Flag ;return cc
] ]
IF BL AEEXPR IF BL AEEXPR
TEQ TYPE,#0 TEQ TYPE,#0
...@@ -729,7 +730,7 @@ INPHP CMP R10,#"," ...@@ -729,7 +730,7 @@ INPHP CMP R10,#","
TEQ R5,#0 TEQ R5,#0
BNE INGOT BNE INGOT
INGET TST R4,#&80 INGET TST R4,#&80
SWINE WRITEI+"?" SWINE OS_WriteI+"?"
BL INLINE BL INLINE
SUB CLEN,R1,#1 SUB CLEN,R1,#1
INLEN LDRB R0,[CLEN,#1]! INLEN LDRB R0,[CLEN,#1]!
...@@ -927,7 +928,7 @@ SLONXT BIC R3,R4,#3 ...@@ -927,7 +928,7 @@ SLONXT BIC R3,R4,#3
NEXSF TEQ IACC,R5 NEXSF TEQ IACC,R5
BNE NEXP2 BNE NEXP2
FNEXT FNEXT
[ FP=0 [ FPOINT=0
BIC FGRD,R5,#3 BIC FGRD,R5,#3
LDMFD FGRD,{FACC,FACCX} LDMFD FGRD,{FACC,FACCX}
AND FGRD,R5,#3 AND FGRD,R5,#3
...@@ -1174,7 +1175,7 @@ PRINTS ADD R1,ARGP,#STRACC ...@@ -1174,7 +1175,7 @@ PRINTS ADD R1,ARGP,#STRACC
BNE PRLOP2 BNE PRLOP2
ADD R0,ARGP,#STRACC ADD R0,ARGP,#STRACC
SUB R1,CLEN,R0 SUB R1,CLEN,R0
SWI WRITEN SWI OS_WriteN
LDR R0,[ARGP,#TALLY] LDR R0,[ARGP,#TALLY]
ADD R0,R0,R1 ADD R0,R0,R1
STR R0,[ARGP,#TALLY] STR R0,[ARGP,#TALLY]
...@@ -1225,12 +1226,12 @@ TAB STMFD SP!,{R4,R5,R14} ...@@ -1225,12 +1226,12 @@ TAB STMFD SP!,{R4,R5,R14}
TAB2 STR IACC,[SP,#-4]! TAB2 STR IACC,[SP,#-4]!
BL BRA BL BRA
BL INTEGZ BL INTEGZ
SWI WRITEI+31 SWI OS_WriteI+31
MOV R1,IACC MOV R1,IACC
LDR IACC,[SP],#4 LDR IACC,[SP],#4
SWI WRITEC SWI OS_WriteC
MOV R0,R1 MOV R0,R1
SWI WRITEC SWI OS_WriteC
MOV LINE,AELINE MOV LINE,AELINE
B PRSPEX B PRSPEX
PROC MOV AELINE,LINE ;AELINE -> start of identifier PROC MOV AELINE,LINE ;AELINE -> start of identifier
...@@ -1449,14 +1450,14 @@ RUNNER BL SETFSA ...@@ -1449,14 +1450,14 @@ RUNNER BL SETFSA
STMFD SP!,{R0-R9} STMFD SP!,{R0-R9}
B STMT B STMT
BEATS BL AEEXDN BEATS BL AEEXDN
SWI SOUNDEVENTQBEAT SWI Sound_QBeat
B NXT B NXT
VOICES BL AEEXDN VOICES BL AEEXDN
MOV R1,#0 MOV R1,#0
MOV R2,#0 MOV R2,#0
MOV R3,#0 MOV R3,#0
MOV R4,#0 MOV R4,#0
SWI SOUNDCONFIGURE SWI Sound_Configure
B NXT B NXT
VOICE BL INTEXA VOICE BL INTEXA
STR IACC,[SP,#-4]! STR IACC,[SP,#-4]!
...@@ -1468,17 +1469,17 @@ VOICE BL INTEXA ...@@ -1468,17 +1469,17 @@ VOICE BL INTEXA
ADD R1,ARGP,#STRACC ADD R1,ARGP,#STRACC
MOV R4,#0 MOV R4,#0
STRB R4,[CLEN] STRB R4,[CLEN]
SWI SOUNDVOICE SWI Sound_AttachNamedVoice
B NXT B NXT
TEMPO BL AEEXDN TEMPO BL AEEXDN
SWI SOUNDEVENTTEMPO SWI Sound_QTempo
B NXT B NXT
STEREO BL INTEXA STEREO BL INTEXA
STR IACC,[SP,#-4]! STR IACC,[SP,#-4]!
BL EXPRDN BL EXPRDN
MOV R1,IACC MOV R1,IACC
LDR R0,[SP],#4 LDR R0,[SP],#4
SWI SOUNDSTEREO SWI Sound_Stereo
B NXT B NXT
SOUND BL SPACES SOUND BL SPACES
CMP R10,#TOFF CMP R10,#TOFF
...@@ -1508,14 +1509,14 @@ SOUND BL SPACES ...@@ -1508,14 +1509,14 @@ SOUND BL SPACES
BL EXPRDN ;time parameter in R0 as required BL EXPRDN ;time parameter in R0 as required
MOV R1,#0 MOV R1,#0
LDMFD SP!,{R2,R3} LDMFD SP!,{R2,R3}
SWI SOUNDEVENTQSCHEDULE SWI Sound_QSchedule
B NXT B NXT
SOUNDFOUR SOUNDFOUR
BL AEDONE BL AEDONE
ADD R1,ARGP,#STRACC ADD R1,ARGP,#STRACC
STMIA R1,{R2,R3} STMIA R1,{R2,R3}
MOV R0,#7 MOV R0,#OsWord_GenerateSound
SWI WORD SWI OS_Word
B NXT B NXT
SOUNDOFF SOUNDOFF
MOV R0,#1 MOV R0,#1
...@@ -1523,7 +1524,7 @@ SOUNDOFF ...@@ -1523,7 +1524,7 @@ SOUNDOFF
SOUNDON MOV R0,#2 SOUNDON MOV R0,#2
SOUNDENABLEON SOUNDENABLEON
BL DONES BL DONES
SWI SOUNDENABLE SWI Sound_Enable
B NXT B NXT
STOP BL DONES STOP BL DONES
B ERSTOP B ERSTOP
...@@ -1641,17 +1642,17 @@ TRACETO BL AEEXPR ...@@ -1641,17 +1642,17 @@ TRACETO BL AEEXPR
TEQ R1,#0 TEQ R1,#0
MOV R0,#0 MOV R0,#0
STR R0,[ARGP,#TRACEFILE] ;kill handle! STR R0,[ARGP,#TRACEFILE] ;kill handle!
SWINE OPEN SWINE OS_Find
ADD R1,ARGP,#STRACC ADD R1,ARGP,#STRACC
MOV R0,#&80 MOV R0,#&80
SWI OPEN SWI OS_Find
STR R0,[ARGP,#TRACEFILE] STR R0,[ARGP,#TRACEFILE]
CMP R0,#0 CMP R0,#0
MOV R0,#&12 ;set type MOV R0,#&12 ;set type
MOV R2,#&FF MOV R2,#&FF
ORR R2,R2,#&F00 ORR R2,R2,#&F00
SWINE FILE+&20000 SWINE XOS_File
SWIEQ FILE SWIEQ OS_File
B NXT B NXT
TRACECLOSE TRACECLOSE
BL DONES BL DONES
...@@ -1659,7 +1660,7 @@ TRACECLOSE ...@@ -1659,7 +1660,7 @@ TRACECLOSE
TEQ R1,#0 TEQ R1,#0
MOV R0,#0 MOV R0,#0
STR R0,[ARGP,#TRACEFILE] ;kill handle! STR R0,[ARGP,#TRACEFILE] ;kill handle!
SWINE OPEN SWINE OS_Find
B NXT B NXT
UNTIL BL AEEXDN UNTIL BL AEEXDN
LDR R4,[ARGP,#ESCWORD] LDR R4,[ARGP,#ESCWORD]
...@@ -1718,4 +1719,5 @@ EWHILP LDRB R10,[LINE],#1 ...@@ -1718,4 +1719,5 @@ EWHILP LDRB R10,[LINE],#1
PULLJ 1 PULLJ 1
BL DONES BL DONES
B NXT B NXT
LNK s.Stmt2
LNK Stmt2.s
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment