Browse Source

Update BBC BASIC

- Updated BBC BASIC (Z80) source from R.T.Russell's repository.
pull/503/head
Wayne Warthen 11 months ago
parent
commit
ad7d7638d3
  1. 53
      Source/Apps/BBCBASIC/bbcbasic.txt
  2. 61
      Source/Apps/BBCBASIC/cmos.z80
  3. 128
      Source/Apps/BBCBASIC/eval.z80
  4. 146
      Source/Apps/BBCBASIC/exec.z80
  5. 8
      Source/Apps/BBCBASIC/hook.z80
  6. 19
      Source/Apps/BBCBASIC/licence.txt
  7. 131
      Source/Apps/BBCBASIC/main.z80
  8. 49
      Source/Apps/BBCBASIC/math.z80
  9. 112
      Source/Doc/Applications.md

53
Source/Apps/BBCBASIC/bbcbasic.txt

@ -1,16 +1,21 @@
This is a RomWBW HBIOS adaptation of BBCBASIC v5.00. The
cursor and screen management assumes the use of an ANSI/VT-100 terminal
which is generally correct for RomWBW. Support for a hardware system
timer is also implemented. If your system does not have a hardware
timer, the TIME function will always return 0 and the timeout
This is a RomWBW HBIOS adaptation of BBCBASIC v5.00 by R.T.Russell.
This implementation was adapted from the source code found at
https://github.com/rtrussell/BBCZ80.
The cursor and screen management assumes the use of an ANSI/VT-100
terminal which is generally correct for RomWBW. Support for a hardware
system timer is also implemented. If your system does not have a
hardware timer, the TIME function will always return 0 and the timeout
parameter of the INKEY(n) function will not be observed (will never
timeout).
What follows is some basic information on BBCBASIC from the
distribution. Note that it starts with the v3.00 information and
later on provides information on the changes in v5.00.
later on provides information on the changes in v5.00. Complete
documentation for the BBC BASIC (Z80) is found online at
https://www.bbcbasic.co.uk/bbcbasic/mancpm/index.html.
-- WBW 1:15 PM 5/30/2024
-- WBW 4:21 PM 2/17/2025
@ -383,9 +388,9 @@ later on provides information on the changes in v5.00.
198 Disk full 254 Bad command
200 Close error 255 CP/M error
204 Bad name

New features in BBC BASIC (Z80) version 5.00, May 2024:
New features in BBC BASIC (Z80) version 5.00, January 2025:
1. BASIC V statements
@ -408,9 +413,9 @@ New features in BBC BASIC (Z80) version 5.00, May 2024:
2.3 REPORT$
2.4 Binary constants
2.5 LEFT$ & RIGHT$ with last parameter omitted
2.6 MOD(array)
2.7 SUM(array)
2.8 SUMLEN(array)
2.6 MOD(array())
2.7 SUM(array())
2.8 SUMLEN(array())
2.9 GET$#file
3. BASIC V whole array operations
@ -425,7 +430,10 @@ New features in BBC BASIC (Z80) version 5.00, May 2024:
3.8 Make a whole array LOCAL
3.9 DIM a LOCAL array (on the stack) +
* String array expressions A$() = B$() + C$() are not currently supported.
* String array expressions are not currently supported, instead of using
a$() = b$() + c$() use a$() = b$() : a$() += c$()
The use of EVAL with whole-array expressions is not currently supported.
+ LOCAL string arrays should be initialised to their maximum needed length
to eliminate the risk of a memory leak each time the PROC/FN is called:
LOCAL a$() : DIM a$(size%) : a$() = STRING$(max%, "a") : a$() = ""
@ -434,22 +442,27 @@ New features in BBC BASIC (Z80) version 5.00, May 2024:
4.1 Bit-shifts <<, >>, >>>
4.2 Floating-point indirection (|)
4.3 RETURNed parameters from FN/PROC
4.4 Compound assignment (+=, -=, *=, /= etc.)
4.5 Assigning to a sub-string: LEFT$()=, MID$()= , RIGHT$()=
4.6 Hooks for CIRCLE,ELLIPSE,FILL,LINE,MOUSE,ORIGIN,RECTANGLE,TINT,SYS,WAIT
4.7 Hooks for WIDTH function, TINT function, MODE function
4.3 Additional VDU delimiter '|'
4.4 RETURNed parameters from FN/PROC
4.5 Compound assignment (+=, -=, *=, /= etc.)
4.6 Assigning to a sub-string: LEFT$()=, MID$()= , RIGHT$()=
4.7 Hooks for CIRCLE, ELLIPSE, FILL, LINE, ORIGIN, RECTANGLE (graphics)
4.8 Hooks for MOUSE, OFF, ON, SYS, TINT, WAIT (statements)
4.9 Hooks for MODE function, TINT function, WIDTH function
5. Extensions to Acorn's BASIC V, compatible with BB4W, BBCSDL and BBCTTY
5.1 EXIT REPEAT / WHILE / FOR [var]
5.2 Address-of operator ^
5.3 Byte variables and arrays (& suffix)
5.2 Address-of operator (^)
5.3 Byte (unsigned 8-bit) variables and arrays (& suffix)
5.4 'BY len' and 'TO term' qualifiers to GET$#file
5.5 ELSE IF <condition> THEN; (trailing semicolon)
5.6 == synonymous with = in comparisons
5.7 DIM a global array inside a FN/PROC (use RETURN)
5.8 DIM var LOCAL -1 returns the stack pointer, even outside a FN/PROC
5.9 RESTORE LOCAL restores local variables without exiting the FN/PROC
Note: The token for PUT has changed from &CE in version 3 to &0E in version 5.
If this token is present in existing programs it will list as ENDWHILE rather
than PUT, and the programs will need to be modified to restore functionality.


61
Source/Apps/BBCBASIC/cmos.z80

@ -40,6 +40,7 @@
EXTRN FREE
EXTRN HIMEM
EXTRN CURLIN
EXTRN AUTONO
EXTRN USER
EXTRN VERMSG
;
@ -440,14 +441,14 @@ INCRDF: CALL INCSEC
;
READ: CALL SETDMA
LD A,33
BDOS1: CALL BDOS0 ;*
JR NZ,CPMERR ;*
OR A ;*
RET ;*
CPMERR: LD A,255 ;* CP/M 3
CALL EXTERR ;* BDOS ERROR
DEFM 'CP/M Error' ;*
DEFB 0 ;*
BDOS1: CALL BDOS0
JR NZ,CPMERR
OR A
RET
CPMERR: LD A,255
CALL EXTERR
DEFM 'CP/M Error'
DEFB 0
;
BDOS0: PUSH BC
PUSH DE
@ -456,8 +457,8 @@ BDOS0: PUSH BC
PUSH IY
LD C,A
CALL BDOS
INC H ;* TEST H
DEC H ;* CP/M 3 ONLY
INC H
DEC H
POP IY
POP IX
POP HL
@ -883,10 +884,10 @@ DIR1: CALL LTRAP
LD HL,DSKBUF+1
ADD HL,DE
PUSH HL
LD DE,8 ;**
LD DE,8
ADD HL,DE
LD E,(HL) ;**
INC HL ;**
LD E,(HL)
INC HL
BIT 7,(HL) ;SYSTEM FILE?
POP HL
LD C,18
@ -899,13 +900,13 @@ DIR1: CALL LTRAP
ADD A,'A'
CALL OSWRCH
LD B,8
LD A,' ' ;**
BIT 7,E ;** READ ONLY?
JR Z,DIR3 ;**
LD A,'*' ;**
LD A,' '
BIT 7,E ;READ ONLY?
JR Z,DIR3
LD A,'*'
DIR3: CALL CPTEXT
LD B,3
LD A,' ' ;**
LD A,' '
CALL SPTEXT
POP BC
DJNZ DIR2
@ -1046,11 +1047,11 @@ COMDS: DEFM 'BY'
; B = number of characters to print
; Destroys: A,B,H,L,F
;
CPTEXT: PUSH AF ;**
CPTEXT: PUSH AF
LD A,':'
CALL OSWRCH
POP AF ;**
SPTEXT: CALL OSWRCH ;**
POP AF
SPTEXT: CALL OSWRCH
PTEXT: LD A,(HL)
AND 7FH
INC HL
@ -1257,7 +1258,8 @@ WRCH1: CALL BDOS0
SET 1,(HL)
RET
;
TOGGLE: LD A,(FLAGS)
TOGGLE: LD BC,0
LD A,(FLAGS)
XOR 00000100B
LD (FLAGS),A
RET
@ -1320,6 +1322,8 @@ LIMIT: CALL Z,KEYGET ;READ KEYBOARD
OR A ;TEST FOR ESCAPE
LD A,C
JP M,OSEXIT
CP 'P' AND 1FH
JP Z,TOGGLE
CP (IX-11) ;CURSOR UP (IX-11)
JP Z,LEFT
CP (IX-10) ;CURSOR DOWN (IX-10)
@ -1329,13 +1333,11 @@ LIMIT: CALL Z,KEYGET ;READ KEYBOARD
JR Z,BACK
CP (IX-9) ;START OF LINE (IX-9)
JR Z,LEFT
CP (IX-7) ;CLEAR RIGHT (IX-7)
JR Z,DELETE
CP (IX-8) ;END OF LINE (IX-8)
JP Z,RIGHT
CP (IX-7) ;CLEAR RIGHT (IX-7)
JR Z,DELETE
LD C,0 ;INHIBIT REPEAT
CP 'P' AND 1FH
JP Z,TOGGLE
CP (IX-1) ;INSERT / OVR (IX-1)
JP Z,INSERT
CP (IX-6) ;DELETE LEFT (IX-6)
@ -1360,10 +1362,15 @@ OSEXIT: LD A,(HL)
JP NZ,ABORT ;ESCAPE
LD A,LF
CALL OSWRCH
LD DE,(CURLIN)
XOR A
LD L,A
LD (EDPTR),HL
LD DE,(CURLIN)
CP D
RET NZ
CP E
RET NZ
LD DE,(AUTONO)
CP D
RET NZ
CP E

128
Source/Apps/BBCBASIC/eval.z80

@ -1,9 +1,9 @@
TITLE BBC BASIC (C) R.T.RUSSELL 1981-2024
TITLE BBC BASIC (C) R.T.RUSSELL 1981-2025
NAME ('EVAL')
;
;BBC BASIC INTERPRETER - Z80 VERSION
;EVALUATE EXPRESSION MODULE - "EVAL"
;(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,9 @@
;
;VERSION 2.3, 07-05-1984
;VERSION 3.0, 08-03-1987
;VERSION 5.0, 14-05-2024
;VERSION 5.0, 31-05-2024
;VERSION 5.1, 28-12-2024
;VERSION 5.2, 11-01-2025
;
;BINARY FLOATING POINT REPRESENTATION:
; 32 BIT SIGN-MAGNITUDE NORMALIZED MANTISSA
@ -368,6 +370,11 @@ EXPR4B: CALL SAVE
CALL DOIT
JR EXPR4A
;
EXPR45: LD A,E
CP '+'
JR Z,EXPR4
CP '-'
JR Z,EXPR4
EXPR5: CALL ITEM
OR A ;TEST TYPE
EX AF,AF' ;SAVE TYPE
@ -396,6 +403,9 @@ EXPRS: CALL EXPR
RET M
JR MISMAT
;
BADHEX: LD A,28
ERROR2: JP ERROR ;"Bad HEX or binary"
;
NEGATE: EXX
LD A,H
CPL
@ -420,9 +430,6 @@ ADD1: EXX
INC HL
RET
;
BADHEX: LD A,28
ERROR2: JP ERROR ;"Bad HEX or binary"
;
ITEMI: CALL ITEM
OR A
JP P,SFIX
@ -635,7 +642,7 @@ CONS2: LD A,(IY)
RET
;
ARRAY: LD A,14 ;'Bad use of array'
JP ERROR
JR ERROR0
;
; ARRLEN - Get start address and number of elements of an array
; Inputs: HL addresses array descriptor
@ -719,20 +726,21 @@ LOADS: LD DE,ACCS
EXX
OR A
LD C,A
LD A,80H ;STRING MARKER
REPDUN: LD A,80H ;STRING MARKER
RET Z
LD B,0
LDIR
RET
;
LOADS2: LD A,(HL)
LOADS2: PUSH IX
POP HL
LOADS3: LD A,(HL)
LD (DE),A
INC HL
CP CR
REPDUN: LD A,80H ;STRING MARKER
RET Z
JR Z,REPDUN
INC E
JR NZ,LOADS2
JR NZ,LOADS3
RET ;RETURN NULL STRING
;
; Version 5 extensions:
@ -1522,9 +1530,8 @@ GET5: LD D,0
GET6: PUSH BC
CALL OSBGET
POP BC
JR C,GET9 ;EOF
BIT 1,B
JR Z,GET8
JR Z,GET10
CP C
JR Z,GET9 ;NUL (or supplied term)
BIT 7,B
@ -1535,9 +1542,11 @@ GET6: PUSH BC
JR Z,GET9 ;LF
GET7: CP CR
JR Z,GET9 ;CR
GET8: LD (HL),A
GET8: OR A
GET10: LD (HL),A
INC L
DEC D
JR C,GET9 ;EOF
JR NZ,GET6
GET9: EX DE,HL
LD A,80H
@ -1915,20 +1924,6 @@ RELOPQ: CP '>'
CP '<'
RET
;
COMMA: CALL NXT
INC IY
CP ','
RET Z
LD A,5
JR ERROR1 ;"Missing ,"
;
BRAKET: CALL NXT
INC IY
CP ')'
RET Z
LD A,27
ERROR1: JP ERROR ;"Missing )"
;
SAVE: INC IY
AND 0FH
SAVE1: EX AF,AF'
@ -1967,6 +1962,20 @@ DOIT: EX AF,AF'
LD A,(IY)
RET
;
COMMA: CALL NXT
INC IY
CP ','
RET Z
LD A,5
JR ERROR1 ;"Missing ,"
;
BRAKET: CALL NXT
INC IY
CP ')'
RET Z
LD A,27
ERROR1: JP ERROR ;"Missing )"
;
DISPT2: PUSH HL
LD HL,SOPTBL
JR DISPT0
@ -2045,17 +2054,17 @@ LETARR: RES 6,D ;Lose array marker
; allocate space on stack and zero it:
;
XOR A ;Clear carry and zero error code
LD HL,0
SBC HL,HL
ADD HL,SP ;HL = SP
SBC HL,BC
JP C,ERROR ;'No room'
JR C,ERROR1 ;'No room'
PUSH BC
LD BC,(FREE)
INC B ;Safety margin
SBC HL,BC
ADD HL,BC
POP BC
JP C,ERROR ;'No room'
JR C,ERROR1 ;'No room'
LD SP,HL
LETA0: LD (HL),0
INC HL
@ -2095,8 +2104,7 @@ EXPRA1: INC IY
PUSH BC
PUSH HL
PUSH IX
LD E,A ;For unary minus
CALL NXT
LD E,A ;Operator
CALL ITEMA
POP IX
POP HL
@ -2172,16 +2180,20 @@ EXPRA8: ADD HL,BC ;Skip remaining elements
RET
;
; ITEMA: evaluate and operate on array item
; Inputs: A = operator
; D = type
; E = operator
; Inputs: D = type
; E = operator ('=' for first item)
; BC = number of elements
; HL = pointer to destination on stack
; IY = text pointer
; Outputs: IY updated
; Destroys: Everything except SP
;
ITEMA: CP '-'
ITEMA: CALL NXT
PUSH HL ;Pointer to destination
PUSH BC ;Number of elements
PUSH IY ;In case normal expression
PUSH DE ;Ditto
CP '-'
JR NZ,ITEMA1 ;Not unary minus
LD A,E
CP '='
@ -2189,16 +2201,14 @@ ITEMA: CP '-'
INC IY ;Bump past '-'
CALL NXT
LD E,'-' ;Unary minus
ITEMA1: PUSH HL ;Pointer to destination
PUSH BC ;Number of elements
PUSH DE ;Type and previous operator
PUSH IY ;In case normal expression
ITEMA1: PUSH DE ;Type and operator
CALL GETVAR
POP DE ;Type & operator
JR NZ,ITEMA4 ;Non-array expression
BIT 6,A
JR Z,ITEMA4 ;Not a whole array
POP BC ;Junk saved original op
POP BC ;Junk saved text pointer
POP DE ;Type & operator
RES 6,A
CP D
JP NZ,MISMAT ;'Type mismatch'
@ -2259,10 +2269,12 @@ ITEMA3: EX DE,HL ;DE = destination
;
; Process numeric non-array item:
;
ITEMA4: POP IY ;Restore text pointer
ITEMA4: POP DE ;Restore original operator
POP IY ;Restore original text pointer
BIT 7,D
JR NZ,ITEMA5
CALL EXPR4 ;; should be EXP345
PUSH DE
CALL EXPR45 ;; should be EXP345
LD A,C ;Exponent
POP DE ;Type / operator
POP BC ;Count
@ -2303,8 +2315,7 @@ ITEMA5: CALL EXPRS
LD C,A
LD B,0
LDIR
ITEMA0: POP DE
POP BC
ITEMA0: POP BC
POP IX
EXX
LD L,A
@ -2362,13 +2373,11 @@ ARRDOT: INC IY ;Bump past dot
JR Z,ARR1D
LD H,(IY-1)
LD L,(IY-2)
ARR1D: PUSH AF
PUSH DE
LD C,A
LD B,0
CALL MUL16
ARR1D: PUSH DE
EX DE,HL
CALL X14OR5
EX DE,HL
POP DE
POP AF
LD B,(IX-1)
LD C,(IX-2)
;
@ -2519,9 +2528,7 @@ INNER: PUSH DE ;6
ADD IY,BC
PUSH AF
PUSH HL
EX DE,HL
CALL MUL16
EX DE,HL
CALL X14OR5
POP BC
CALL MOD16
POP AF
@ -2541,12 +2548,9 @@ INNER: PUSH DE ;6
SBC HL,DE
PUSH HL
POP IY
LD L,A
LD H,0
PUSH AF
CALL MUL16
POP AF
EX DE,HL
LD D,B
LD E,C
CALL X14OR5
ADD IX,DE
POP HL
POP DE

146
Source/Apps/BBCBASIC/exec.z80

@ -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

8
Source/Apps/BBCBASIC/hook.z80

@ -11,7 +11,7 @@
GLOBAL SOUND
GLOBAL PUTIMS
GLOBAL CIRCLE
GLOBAL ELLIPSE
GLOBAL ELLIPS
GLOBAL FILL
GLOBAL MOUSE
GLOBAL ORIGIN
@ -20,6 +20,8 @@
GLOBAL TINT
GLOBAL WAIT
GLOBAL SYS
GLOBAL CSRON
GLOBAL CSROFF
;
GLOBAL ADVAL
GLOBAL POINT
@ -44,7 +46,7 @@ POINT:
GETIMS:
PUTIMS:
CIRCLE:
ELLIPSE:
ELLIPS:
FILL:
MOUSE:
ORIGIN:
@ -56,6 +58,8 @@ MODEFN:
WIDFN:
WAIT:
SYS:
CSRON:
CSROFF:
XOR A
CALL EXTERR
DEFM 'Sorry'

19
Source/Apps/BBCBASIC/licence.txt

@ -0,0 +1,19 @@
Copyright (c) 2024, Richard T. Russell, http://www.rtrussell.co.uk/
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.

131
Source/Apps/BBCBASIC/main.z80

@ -1,9 +1,9 @@
TITLE BBC BASIC (C) R.T.RUSSELL 1981-2024
TITLE BBC BASIC (C) R.T.RUSSELL 1981-2025
NAME ('MAIN')
;
;BBC BASIC INTERPRETER - Z80 VERSION
;COMMANDS AND COMMON MODULE - "MAIN"
;(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,9 @@
;
;VERSION 2.3, 07-05-1984
;VERSION 3.0, 01-03-1987
;VERSION 5.0, 27-05-2024
;VERSION 5.0, 31-05-2024
;VERSION 5.1, 10-08-2024
;VERSION 5.2, 16-02-2025
;
EXTRN XEQ
EXTRN RUN0
@ -175,10 +177,10 @@ PURGE: LD (HL),A ;CLEAR SCRATCHPAD
CALL NEWIT
JP NZ,CHAIN0 ;AUTO-RUN
CALL TELL
VERMSG: DEFM 'BBC BASIC (Z80) Version 5beta2'
VERMSG: DEFM 'BBC BASIC (Z80) Version 5.00 '
DEFB CR
DEFB LF
NOTICE: DEFM '(C) Copyright R.T.Russell 2024'
NOTICE: DEFM '(C) Copyright R.T.Russell 2025'
DEFB CR
DEFB LF
DEFB 0
@ -221,7 +223,10 @@ NOAUTO: LD HL,ACCS
JR NZ,NOTCMD
ADD A,A
LD C,A
LD B,0
LD A,H
OR L
JR NZ,INAUTO
LD B,A
LD HL,CMDTAB
ADD HL,BC
LD A,(HL) ;TABLE ENTRY
@ -232,6 +237,7 @@ NOAUTO: LD HL,ACCS
CALL NXT
JP (HL) ;EXECUTE COMMAND
;
INAUTO: LD IY,ACCS
NOTCMD: LD A,H
OR L
CALL Z,LINNUM
@ -340,8 +346,6 @@ KEYWDS: DEFB 80H
DEFM 'CHAIN'
DEFB 0BDH
DEFM 'CHR$'
DEFB 01H
DEFM 'CIRCLE' ; v5
DEFB 0D8H
DEFM 'CLEAR '
DEFB 0D9H
@ -354,6 +358,8 @@ KEYWDS: DEFB 80H
DEFM 'COS'
DEFB 9CH
DEFM 'COUNT '
DEFB 01H
DEFM 'CIRCLE' ; v5
DEFB 0DCH
DEFM 'DATA'
DEFB 9DH
@ -366,16 +372,14 @@ KEYWDS: DEFB 80H
DEFM 'DIM'
DEFB 0DFH
DEFM 'DRAW'
DEFB 02H
DEFM 'ELLIPSE' ; v5
DEFB 0CBH
DEFM 'ENDCASE ' ; v5
DEFB 0CDH
DEFM 'ENDIF ' ; v5
DEFB 0E1H
DEFM 'ENDPROC '
DEFB 0CEH
DEFM 'ENDWHILE ' ; v5
DEFB 0CBH
DEFM 'ENDCASE ' ; v5
DEFB 0CDH
DEFM 'ENDIF ' ; v5
DEFB 0E0H
DEFM 'END '
DEFB 0E2H
@ -390,16 +394,18 @@ KEYWDS: DEFB 80H
DEFM 'ERROR'
DEFB 0C5H
DEFM 'EOF '
DEFB 10H
DEFM 'EXIT ' ; v5
DEFB 82H
DEFM 'EOR'
DEFB 9FH
DEFM 'ERR '
DEFB 10H
DEFM 'EXIT ' ; v5
DEFB 0A1H
DEFM 'EXP'
DEFB 0A2H
DEFM 'EXT '
DEFB 02H
DEFM 'ELLIPSE' ; v5
DEFB 0E3H
DEFM 'FOR'
DEFB 0A3H
@ -428,12 +434,12 @@ KEYWDS: DEFB 80H
DEFM 'INKEY$'
DEFB 0A6H
DEFM 'INKEY'
DEFB 0CH
DEFM 'INSTALL' ; v5
DEFB 0A8H
DEFM 'INT'
DEFB 0A7H
DEFM 'INSTR('
DEFB 0CH
DEFM 'INSTALL' ; v5
DEFB 86H
DEFM 'LINE'
DEFB 92H
@ -456,24 +462,22 @@ KEYWDS: DEFB 80H
DEFM 'MODE'
DEFB 83H
DEFM 'MOD'
DEFB 04H
DEFM 'MOUSE' ; v5
DEFB 0ECH
DEFM 'MOVE'
DEFB 04H
DEFM 'MOUSE' ; v5
DEFB 0EDH
DEFM 'NEXT'
DEFB 0ACH
DEFM 'NOT'
DEFB 05H
DEFM 'ORIGIN' ; v5
DEFB 0CCH
DEFM 'OTHERWISE' ; v5
DEFB 0EEH
DEFM 'ON'
DEFB 87H
DEFM 'OFF '
DEFB 0CAH
DEFM 'OF ' ; v5
DEFB 05H
DEFM 'ORIGIN' ; v5
DEFB 84H
DEFM 'OR'
DEFB 8EH
@ -484,6 +488,8 @@ KEYWDS: DEFB 80H
DEFM 'OPENUP'
DEFB 0FFH
DEFM 'OSCLI'
DEFB 0CCH
DEFM 'OTHERWISE' ; v5
DEFB 0F1H
DEFM 'PRINT'
DEFB 90H
@ -496,12 +502,12 @@ KEYWDS: DEFB 80H
DEFM 'PLOT'
DEFB 0B0H
DEFM 'POINT('
DEFB 0EH
DEFM 'PUT' ; Token changed
DEFB 0F2H
DEFM 'PROC'
DEFB 0B1H
DEFM 'POS '
DEFB 0EH
DEFM 'PUT' ; Token changed
DEFB 06H
DEFM 'QUIT ' ; v5
DEFB 0F8H
@ -552,18 +558,18 @@ KEYWDS: DEFB 80H
DEFM 'SYS' ; v5
DEFB 0B7H
DEFM 'TAN'
DEFB 8CH
DEFM 'THEN'
DEFB 0B8H
DEFM 'TO'
DEFB 8AH
DEFM 'TAB('
DEFB 0FCH
DEFM 'TRACE'
DEFB 8CH
DEFM 'THEN'
DEFB 91H
DEFM 'TIME '
DEFB 0AH
DEFM 'TINT'
DEFB 0B8H
DEFM 'TO'
DEFB 0FCH
DEFM 'TRACE'
DEFB 0B9H
DEFM 'TRUE '
DEFB 0FDH
@ -576,14 +582,14 @@ KEYWDS: DEFB 80H
DEFM 'VAL'
DEFB 0BCH
DEFM 'VPOS '
DEFB 0FEH
DEFM 'WIDTH'
DEFB 0BH
DEFM 'WAIT ' ; v5
DEFB 0C9H
DEFM 'WHEN' ; v5
DEFB 0C7H
DEFM 'WHILE' ; v5
DEFB 0C9H
DEFM 'WHEN' ; v5
DEFB 0BH
DEFM 'WAIT ' ; v5
DEFB 0FEH
DEFM 'WIDTH'
;'LEFT' TOKENS:
DEFB 0CFH
DEFM 'PTR'
@ -833,7 +839,7 @@ LENSUB EQU $-TOKSUB
DELETE: CALL DLPAIR
DELET1: LD A,(HL)
OR A
JP Z,WARM
JR Z,WARMNC
INC HL
LD E,(HL)
INC HL
@ -857,7 +863,7 @@ LISTO: INC IY ;SKIP "O"
EXX
LD A,L
LD (LISTON),A
CLOOP1: JP CLOOP
JP CLOOP
;
;LIST
;LIST line
@ -1007,10 +1013,7 @@ RENUM1: LD A,(HL) ;BUILD TABLE
POP HL
EX DE,HL
JR C,RENUM1 ;CONTINUE
CALL EXTERR ;"Out of space"
DEFB 16H
DEFB 18H
DEFB 0
JP ERROR ;'No room' (A = 0)
;
RENUM2: EX DE,HL
LD (HL),-1
@ -1022,7 +1025,7 @@ RENUM2: EX DE,HL
RENUM3: LD C,(HL)
LD A,C
OR A
JP Z,WARM
JR Z,WARMNC
EXX
EX DE,HL
INC HL
@ -1115,6 +1118,15 @@ BAD: CALL TELL ;"Bad program'
NEW: CALL NEWIT
JR CLOOP0
;
;LOAD filename
;
LOAD: CALL EXPRS ;GET FILENAME
LD A,CR
LD (DE),A
CALL LOAD0
CALL CLEAR
JR WARM0
;
;OLD
;
OLD: LD HL,(PAGE)
@ -1132,15 +1144,6 @@ OLD: LD HL,(PAGE)
CALL CLEAN
CLOOP0: JP CLOOP
;
;LOAD filename
;
LOAD: CALL EXPRS ;GET FILENAME
LD A,CR
LD (DE),A
CALL LOAD0
CALL CLEAR
JR WARM0
;
;SAVE filename
;
SAVE: CALL EXPRS ;FILENAME
@ -1204,7 +1207,7 @@ ERROR2: LD SP,(HIMEM)
LD E,0
CALL C,OSSHUT ;CLOSE ALL FILES
CALL CRLF
JP CLOOP
JR CLOOP0
;
;SUBROUTINES:
;
@ -1443,12 +1446,9 @@ LOUT: BIT 0,E
CALL OUT
RET
;
INDADD: INC E
RET
;
INDSUB: DEC E
JP P,INDRET
INC E
INDADD: INC E
INDRET: RET
;
;CRLF - SEND CARRIAGE RETURN, LINE FEED.
@ -2020,13 +2020,12 @@ DLP1: EX (SP),HL
;
RANGE: LD A,(IY)
CP '$'
RET Z
CP '%'
RET Z
RET C
CP '&'+1
CCF
RET NC
CP '('
RET Z
CP '&'
RET Z
RANGE1: CP '0'
RET C
CP '9'+1
@ -2110,14 +2109,14 @@ LEXAN7: CP '*'
JR Z,LEXAN9
OR A
CALL P,LEX ;TOKENISE IF POSS.
CP TDATA
JR Z,LEXAN9
CP TOKLO
JR C,LEXAN8
CP TOKHI+1
JR NC,LEXAN8
ADD A,OFFSET ;LEFT VERSION
LEXAN8: CP TREM
JR Z,LEXAN9
CP TDATA
JR NZ,LEXANA
LEXAN9: SET 6,C ;QUIT TOKENISING
LEXANA: CP TFN

49
Source/Apps/BBCBASIC/math.z80

@ -5,7 +5,7 @@
;(C) COPYRIGHT R.T.RUSSELL 1986-2024
;VERSION 0.0, 26-10-1986
;VERSION 0.1, 14-12-1988 (BUG FIX)
;VERSION 5.0, 21-05-2024 (SHIFTS ADDED)
;VERSION 5.0, 16-06-2024 (SHIFTS ADDED)
;
;BINARY FLOATING POINT REPRESENTATION:
; 32 BIT SIGN-MAGNITUDE NORMALIZED MANTISSA
@ -388,16 +388,7 @@ IMUL: LD A,H
JP NEGATE
;
IMUL1: DEC C
EXX
SLA E
RL D
EXX
RL E
RL D
EXX
ADC HL,HL
EXX
ADC HL,HL
CALL SLA8
JP P,IMUL1 ;NORMALISE
EX AF,AF'
RET M
@ -2178,30 +2169,12 @@ SQR2: INC A
RET P
SQRA: SLA C
RL B
INC C
EXX
RL C
RL B
EXX
INC C
SLA E
RL D
EXX
RL E
RL D
EXX
ADC HL,HL
EXX
ADC HL,HL
EXX
SLA E
RL D
EXX
RL E
RL D
EXX
ADC HL,HL
EXX
ADC HL,HL
CALL SLA8
CALL SLA8
EXX
JP NC,SQR1
SQR3: OR A
@ -2231,6 +2204,18 @@ SQRB: ADD HL,HL
DEC C
RET
;
SLA8: EXX
SLA E
RL D
EXX
RL E
RL D
EXX
ADC HL,HL
EXX
ADC HL,HL
RET
;
DIGITQ: LD A,(IX)
CP '9'+1
CCF

112
Source/Doc/Applications.md

@ -1000,11 +1000,12 @@ binary executable applications are found in the Binary/Apps directory.
The table below clarifies where each of the applications may be
found. It is not an exhaustive list, with further applications existing
on both the ROM-based and disk-based versions of CP/M. All of the Applications
incuded within RomWBW may be found with in the Binary/Apps directory.
included within RomWBW may be found within the Binary/Apps directory.
| Application | ROM Disk | Boot Disks |
| ----------- | :------: | :--------: |
| ASSIGN | Yes | Yes |
| BBCBASIC | No | Yes |
| CLRDIR | Yes | Yes |
| COPYSL | No | Yes |
| CPUSPD | Yes | Yes |
@ -1020,14 +1021,17 @@ incuded within RomWBW may be found with in the Binary/Apps directory.
| SURVEY | Yes | Yes |
| SYSCOPY | Yes | Yes |
| TALK | Yes | Yes |
| TBASIC | No | Yes |
| TIMER | Yes | Yes |
| TUNE | No | Yes |
| VGMPLAY | No | Yes |
| WDATE | No | Yes |
| XM | Yes | Yes |
| ZMD | No | Yes |
| ZMP | No | Yes |
All of the CP/M applications may be found in the RomWBW Binary/Apps directory
and a user may copy those they need to their own customised disk/slice.
and a user may copy those they need to their own customized disk/slice.
Independently of whether the CP/M system was started from ROM or a boot disk,
such as a floppy disk or a slice on a CF or uSD memory card, applications
@ -1280,6 +1284,30 @@ sure to use `ASSIGN` prior to loading the RSX or after it is unloaded.
The `ASSIGN` command is an original product and the source code is
provided in the RomWBW distribution.
`\clearpage`{=latex}
## BBCBASIC
| BBCBASIC | |
| --------------------|---|
| ROM-based |No |
| Disk-based |Yes|
#### Syntax
#### Usage
#### Notes
#### Etymology
`\clearpage`{=latex}
## CLRDIR
@ -2232,6 +2260,30 @@ operating systems such as CP/M 3 is not supported.
The `TALK` command is an original product and the source code is
provided in the RomWBW distribution.
`\clearpage`{=latex}
## TBASIC
| TBASIC | |
| --------------------|---|
| ROM-based |No |
| Disk-based |Yes|
#### Syntax
#### Usage
#### Notes
#### Etymology
`\clearpage`{=latex}
## TIMER
@ -2630,7 +2682,7 @@ control is fully functional (end to end).
The `XM` application provided in RomWBW is an adaptation of a
pre-existing XModem application. Based on the source code comments, it
was originally adapted from Ward Christensen's MODEM2 by Keith
Petersen and is labelled version 12.5.
Petersen and is labeled version 12.5.
The original source of the application was found in the Walnut Creek
CD-ROM and is called XMDM125.ARK dated 7/15/86.
@ -2643,3 +2695,57 @@ appropriate driver.
The source code is provided in the RomWBW distribution.
`\clearpage`{=latex}
## ZMD
| ZMD | |
| --------------------|---|
| ROM-based |No |
| Disk-based |Yes|
#### Syntax
#### Usage
#### Notes
#### Etymology
`\clearpage`{=latex}
## ZMP
| ZMP | |
| --------------------|---|
| ROM-based |No |
| Disk-based |Yes|
#### Syntax
#### Usage
#### Notes
#### Etymology

Loading…
Cancel
Save