|
|
|
@ -1,9 +1,9 @@ |
|
|
|
TITLE BBC BASIC (C) R.T.RUSSELL 1981-2024 |
|
|
|
TITLE BBC BASIC (C) R.T.RUSSELL 1981-2025 |
|
|
|
NAME ('EXEC') |
|
|
|
; |
|
|
|
;BBC BASIC INTERPRETER - Z80 VERSION |
|
|
|
;STATEMENT EXECUTION MODULE - "EXEC" |
|
|
|
;(C) COPYRIGHT R.T.RUSSELL 1981-2024 |
|
|
|
;(C) COPYRIGHT R.T.RUSSELL 1981-2025 |
|
|
|
; |
|
|
|
;THE NAME BBC BASIC IS USED WITH THE PERMISSION |
|
|
|
;OF THE BRITISH BROADCASTING CORPORATION AND IS |
|
|
|
@ -11,7 +11,10 @@ |
|
|
|
; |
|
|
|
;VERSION 2.1, 22-01-1984 |
|
|
|
;VERSION 3.1, 11-06-1987 |
|
|
|
;VERSION 5.0, 19-05-2024 |
|
|
|
;VERSION 5.0, 12-07-2024 |
|
|
|
;VERSION 5.1, 28-12-2024 |
|
|
|
;VERSION 5.2, 11-01-2025 |
|
|
|
;VERSION 5.3, 31-01-2025 |
|
|
|
; |
|
|
|
GLOBAL XEQ |
|
|
|
GLOBAL RUN0 |
|
|
|
@ -59,6 +62,8 @@ |
|
|
|
EXTRN BYE |
|
|
|
EXTRN NXT |
|
|
|
EXTRN NLIST |
|
|
|
EXTRN CSRON |
|
|
|
EXTRN CSROFF |
|
|
|
; |
|
|
|
EXTRN OSWRCH |
|
|
|
EXTRN OSLINE |
|
|
|
@ -84,7 +89,7 @@ |
|
|
|
EXTRN PLOT |
|
|
|
EXTRN COLOUR |
|
|
|
EXTRN CIRCLE |
|
|
|
EXTRN ELLIPSE |
|
|
|
EXTRN ELLIPS |
|
|
|
EXTRN FILL |
|
|
|
EXTRN MOUSE |
|
|
|
EXTRN ORIGIN |
|
|
|
@ -242,7 +247,7 @@ CMDTAB: DEFW LEFTSL |
|
|
|
DEFW CLI ;OSCLI |
|
|
|
DEFW REM ;NUL |
|
|
|
DEFW CIRCLE |
|
|
|
DEFW ELLIPSE |
|
|
|
DEFW ELLIPS |
|
|
|
DEFW FILL |
|
|
|
DEFW MOUSE |
|
|
|
DEFW ORIGIN |
|
|
|
@ -359,6 +364,16 @@ CLI: CALL EXPRS |
|
|
|
CALL OSCLI |
|
|
|
JR XEQ |
|
|
|
; |
|
|
|
EXTRAS: CP TELSE-TCMD |
|
|
|
JR Z,REM ;ELSE |
|
|
|
CP TERROR-TCMD |
|
|
|
JR Z,THROW ;ERROR |
|
|
|
CP TLINE-TCMD |
|
|
|
JP Z,LINE ;LINE |
|
|
|
CP TOFF-TCMD |
|
|
|
JP Z,CSROFF ;OFF |
|
|
|
JP SYNTAX |
|
|
|
; |
|
|
|
;REM, * |
|
|
|
; |
|
|
|
EXT: PUSH IY |
|
|
|
@ -373,14 +388,6 @@ REM: PUSH IY |
|
|
|
POP IY |
|
|
|
JP XEQ0 |
|
|
|
; |
|
|
|
EXTRAS: CP TELSE-TCMD |
|
|
|
JR Z,REM ;ELSE |
|
|
|
CP TERROR-TCMD |
|
|
|
JR Z,THROW ;ERROR |
|
|
|
CP TLINE-TCMD |
|
|
|
JP Z,LINE ;LINE |
|
|
|
JP SYNTAX |
|
|
|
; |
|
|
|
;ERROR num,string$ |
|
|
|
; |
|
|
|
THROW: CALL EXPRI |
|
|
|
@ -431,7 +438,7 @@ SWAP1: LD C,(HL) |
|
|
|
INC DE |
|
|
|
INC HL |
|
|
|
DJNZ SWAP1 |
|
|
|
JR XEQR |
|
|
|
JR XEQGO4 |
|
|
|
; |
|
|
|
;[LET] var = expr |
|
|
|
; |
|
|
|
@ -447,14 +454,13 @@ LET: CALL ASSIGN |
|
|
|
JR C,SYNTAX ;"Syntax error" |
|
|
|
JP P,LETARR ;Numeric array |
|
|
|
JP PE,LETARR ;String array |
|
|
|
LD A,D ;Type |
|
|
|
PUSH DE |
|
|
|
PUSH HL |
|
|
|
CALL EXPRS |
|
|
|
POP IX |
|
|
|
POP HL |
|
|
|
CALL MODIFS |
|
|
|
XEQR: JP XEQ |
|
|
|
XEQGO4: JP XEQ |
|
|
|
; |
|
|
|
; GETSTR - Get string variable |
|
|
|
; Inputs: IY = text pointer |
|
|
|
@ -499,7 +505,7 @@ ASM: LD (CURLIN),IY |
|
|
|
AND 0FH |
|
|
|
OR 30H |
|
|
|
LD (HL),A |
|
|
|
JR XEQR |
|
|
|
JR XEQGO4 |
|
|
|
; |
|
|
|
;= |
|
|
|
; |
|
|
|
@ -626,9 +632,11 @@ DIM3: PUSH HL |
|
|
|
BIT 0,A |
|
|
|
JR Z,ARRCHK ;NOT LOCAL |
|
|
|
LD HL,0 |
|
|
|
ADD HL,SP |
|
|
|
SBC HL,DE |
|
|
|
OR A |
|
|
|
SBC HL,BC |
|
|
|
ADD HL,SP |
|
|
|
JR Z,ARRCHK ;RESERVE NOTHING |
|
|
|
LD SP,HL |
|
|
|
PUSH DE |
|
|
|
PUSH BC |
|
|
|
@ -832,7 +840,9 @@ XEQGO3: JP XEQ |
|
|
|
;ON ERROR [LOCAL] statement [:statement...] |
|
|
|
;ON ERROR [LOCAL] OFF |
|
|
|
; |
|
|
|
ON: CP TERROR |
|
|
|
ON: CALL TERMQ |
|
|
|
JP Z,CSRON |
|
|
|
CP TERROR |
|
|
|
JR Z,ONERR ;"ON ERROR" |
|
|
|
CALL EXPRI |
|
|
|
LD A,(IY) |
|
|
|
@ -890,8 +900,10 @@ ON4: LD A,(IY) |
|
|
|
JP Z,IF1 ;ELSE CLAUSE |
|
|
|
CP CR |
|
|
|
JR NZ,ON4 |
|
|
|
LD A,40 |
|
|
|
ERROR2: JP ERROR ;"ON range" |
|
|
|
LD A,40 ;'ON range' |
|
|
|
DEFB 21H |
|
|
|
FORVAR: LD A,34 ;'FOR variable' |
|
|
|
ERROR2: JP ERROR |
|
|
|
; |
|
|
|
ONPROC: LD A,TON |
|
|
|
JP PROC |
|
|
|
@ -962,9 +974,6 @@ XEQGO2: JP XEQ |
|
|
|
; |
|
|
|
;FOR var = expr TO expr [STEP expr] |
|
|
|
; |
|
|
|
FORVAR: LD A,34 |
|
|
|
JR ERROR2 ;"FOR variable" |
|
|
|
; |
|
|
|
FOR: CALL ASSIGN |
|
|
|
JR NZ,FORVAR ;"FOR variable" |
|
|
|
PUSH AF ;SAVE TYPE |
|
|
|
@ -1368,7 +1377,7 @@ ENDPRO: POP BC |
|
|
|
JP ERROR ;"No PROC" |
|
|
|
; |
|
|
|
ENDPR1: POP IY |
|
|
|
JP XEQ |
|
|
|
XEQGO6: JP XEQ |
|
|
|
; |
|
|
|
;INPUT #channel,var,var... |
|
|
|
; |
|
|
|
@ -1429,7 +1438,7 @@ INPUT: CP '#' |
|
|
|
INPUT0: LD HL,BUFFER |
|
|
|
LD (HL),CR ;INITIALISE EMPTY |
|
|
|
INPUT1: CALL TERMQ |
|
|
|
JP Z,XEQ ;DONE |
|
|
|
JR Z,XEQGO6 ;DONE |
|
|
|
INC IY |
|
|
|
CP ',' |
|
|
|
JR Z,INPUT3 ;SKIP COMMA |
|
|
|
@ -1604,8 +1613,8 @@ MELSE: LD BC,-3 |
|
|
|
LD BC,TENDIF |
|
|
|
LD DE,TENDIF*256+TTHEN |
|
|
|
CALL NSCAN |
|
|
|
JP Z,XEQ |
|
|
|
JR NENDIF |
|
|
|
JR NZ,NENDIF |
|
|
|
XEQGO7: JP XEQ |
|
|
|
; |
|
|
|
; WHEN and OTHERWISE: |
|
|
|
; |
|
|
|
@ -1614,7 +1623,7 @@ WHEN: LD BC,-3 |
|
|
|
LD BC,TENDCASE |
|
|
|
LD DE,TENDCASE*256+TOF |
|
|
|
CALL NSCAN |
|
|
|
JP Z,XEQ |
|
|
|
JR Z,XEQGO7 |
|
|
|
LD A,47 |
|
|
|
JR ERROR4 ;"Missing ENDCASE" |
|
|
|
; |
|
|
|
@ -1708,12 +1717,12 @@ CASE2: LD A,(IY) |
|
|
|
;Finished, level stack if string: |
|
|
|
; |
|
|
|
CASE9: BIT 0,B |
|
|
|
JR Z,CASE8 |
|
|
|
JR Z,XEQGO5 |
|
|
|
LD H,0 |
|
|
|
LD L,C |
|
|
|
ADD HL,SP |
|
|
|
LD SP,HL |
|
|
|
CASE8: JP XEQ |
|
|
|
JR XEQGO5 |
|
|
|
; |
|
|
|
;Matched, so skip any more expressions: |
|
|
|
; |
|
|
|
@ -1791,7 +1800,7 @@ ENDWH1: PUSH IY |
|
|
|
CLS: CALL CLRSCN |
|
|
|
XOR A |
|
|
|
LD (COUNT),A |
|
|
|
JP XEQ |
|
|
|
JR XEQGO5 |
|
|
|
; |
|
|
|
;STOP |
|
|
|
; |
|
|
|
@ -1808,7 +1817,7 @@ STOP: CALL TELL |
|
|
|
;REPORT |
|
|
|
; |
|
|
|
REPOR: CALL REPORT |
|
|
|
JP XEQ |
|
|
|
JR XEQGO5 |
|
|
|
; |
|
|
|
;CLEAR |
|
|
|
; |
|
|
|
@ -1816,32 +1825,30 @@ CLR: CALL CLEAR |
|
|
|
LD HL,(PAGE) |
|
|
|
JR RESTR1 |
|
|
|
; |
|
|
|
;RESTORE ERROR |
|
|
|
;RESTORE DATA / ERROR / LOCAL |
|
|
|
; |
|
|
|
RESERR: INC IY |
|
|
|
LD A,2 |
|
|
|
CALL RESLOC |
|
|
|
JP NZ,XEQ |
|
|
|
LD A,53 ;ON ERROR not LOCAL |
|
|
|
ERROR5: JP ERROR |
|
|
|
; |
|
|
|
;RESTORE DATA |
|
|
|
; |
|
|
|
RESDAT: INC IY |
|
|
|
LD A,1 |
|
|
|
RESDEL: INC IY ;Skip DATA / ERROR / LOCAL |
|
|
|
LD A,C ;Save error code |
|
|
|
EX AF,AF' |
|
|
|
LD A,B ;1=DATA, 2=ERROR, 0=LOCAL |
|
|
|
CALL RESLOC |
|
|
|
JP NZ,XEQ |
|
|
|
LD A,54 ;'DATA not LOCAL' |
|
|
|
JR NZ,XEQGO5 |
|
|
|
EX AF,AF' ;Get error code |
|
|
|
DEFB 21H |
|
|
|
NOLINE: LD A,41 ;'No such line' |
|
|
|
JR ERROR5 |
|
|
|
ERROR5: JP ERROR |
|
|
|
; |
|
|
|
;RESTORE [line] |
|
|
|
;RESTORE [line | +n | DATA | ERROR | LOCAL] |
|
|
|
; |
|
|
|
RESTOR: CP TERROR |
|
|
|
JR Z,RESERR |
|
|
|
LD BC,200H + 53 ;'ON ERROR not LOCAL' |
|
|
|
JR Z,RESDEL |
|
|
|
CP TDATA |
|
|
|
JR Z,RESDAT |
|
|
|
LD BC,100H + 54 ;'DATA not LOCAL' |
|
|
|
JR Z,RESDEL |
|
|
|
CP TLOCAL |
|
|
|
LD BC,12 ;'Not in a FN or PROC' |
|
|
|
JR Z,RESDEL |
|
|
|
CP '+' |
|
|
|
JR Z,RESREL |
|
|
|
LD HL,(PAGE) |
|
|
|
@ -1968,13 +1975,17 @@ TRACE0: DEC HL |
|
|
|
TRACE1: LD (TRACEN),HL |
|
|
|
JR XEQGO1 |
|
|
|
; |
|
|
|
;VDU expr,expr;.... |
|
|
|
;VDU expr,expr;....[|] |
|
|
|
; |
|
|
|
VDU: CALL EXPRI |
|
|
|
EXX |
|
|
|
LD A,L |
|
|
|
CALL OSWRCH |
|
|
|
LD B,1 |
|
|
|
VDU1: CALL OSWRCH |
|
|
|
DJNZ VDU1 |
|
|
|
LD A,(IY) |
|
|
|
CP '|' |
|
|
|
JR Z,VDU4 |
|
|
|
CP ',' |
|
|
|
JR Z,VDU2 |
|
|
|
CP ';' |
|
|
|
@ -1986,6 +1997,11 @@ VDU3: CALL TERMQ |
|
|
|
JR NZ,VDU |
|
|
|
JR XEQGO1 |
|
|
|
; |
|
|
|
VDU4: INC IY |
|
|
|
XOR A |
|
|
|
LD B,9 |
|
|
|
JR VDU1 |
|
|
|
; |
|
|
|
;CLOSE channel number |
|
|
|
; |
|
|
|
CLOSE: CALL CHANEL |
|
|
|
@ -2005,25 +2021,25 @@ BPUT: CALL CHANEL ;CHANNEL NUMBER |
|
|
|
EXX |
|
|
|
LD A,L |
|
|
|
POP DE |
|
|
|
CALL OSBPUT |
|
|
|
BPUT1: CALL OSBPUT |
|
|
|
BPUTX: JR XEQGO1 |
|
|
|
; |
|
|
|
BPUTS: LD A,E |
|
|
|
POP DE |
|
|
|
LD D,A |
|
|
|
LD HL,ACCS |
|
|
|
OR A |
|
|
|
JR Z,BPUTS0 |
|
|
|
BPUTS1: LD A,(HL) |
|
|
|
INC HL |
|
|
|
CALL OSBPUT |
|
|
|
DEC D |
|
|
|
JR NZ,BPUTS1 |
|
|
|
CALL NXT |
|
|
|
BPUTS0: CALL NXT |
|
|
|
CP ';' |
|
|
|
INC IY |
|
|
|
JR Z,BPUTX |
|
|
|
LD A,LF |
|
|
|
CALL OSBPUT |
|
|
|
DEC IY |
|
|
|
JR NZ,BPUT1 |
|
|
|
INC IY |
|
|
|
JR BPUTX |
|
|
|
; |
|
|
|
;CALL address[,var[,var...]] |
|
|
|
@ -2347,7 +2363,7 @@ MODIFY: LD A,E |
|
|
|
CALL FPP |
|
|
|
POP IX |
|
|
|
POP DE |
|
|
|
JP C,ERROR |
|
|
|
JR C,ERRORC |
|
|
|
STORE0: LD A,D ;Type |
|
|
|
STOREN: CP 5 |
|
|
|
JR Z,STORE5 |
|
|
|
@ -2384,14 +2400,17 @@ MODIFS: LD A,L ;Operator |
|
|
|
CP '+' |
|
|
|
LD A,H ;Type |
|
|
|
JR NZ,STACCS |
|
|
|
PUSH IY |
|
|
|
PUSH IX |
|
|
|
POP IY |
|
|
|
EX (SP),IY |
|
|
|
CALL PUSHS |
|
|
|
PUSH IY |
|
|
|
POP IX |
|
|
|
CALL LOADS |
|
|
|
POP BC |
|
|
|
LD A,E |
|
|
|
ADD C |
|
|
|
LD A,19 ;String too long |
|
|
|
ERRORC: JR C,ERROR6 |
|
|
|
LD A,B ;Type |
|
|
|
INC C |
|
|
|
DEC C |
|
|
|
@ -2464,7 +2483,7 @@ CHECK: PUSH HL |
|
|
|
POP HL |
|
|
|
RET C |
|
|
|
XOR A |
|
|
|
JP ERROR ;"No room" |
|
|
|
ERROR6: JP ERROR ;"No room" |
|
|
|
; |
|
|
|
STORS3: LD C,E |
|
|
|
PUSH IX |
|
|
|
@ -2728,6 +2747,7 @@ RESARR: POP BC |
|
|
|
ADD HL,SP |
|
|
|
CALL NZ,FREESA ;Free string array |
|
|
|
RESAR1: LD SP,HL |
|
|
|
INC IX ;Flag something restored |
|
|
|
JR RESLO1 |
|
|
|
; |
|
|
|
; RESLOC - Restore local variables/arrays or DATA/ERROR status from stack |
|
|
|
|