Browse Source

Update BBC BASIC

- Updated BBC BASIC (Z80) source from R.T.Russell's repository.
pull/503/head
Wayne Warthen 12 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 parameter of the INKEY(n) function will not be observed (will never
timeout). timeout).
What follows is some basic information on BBCBASIC from the What follows is some basic information on BBCBASIC from the
distribution. Note that it starts with the v3.00 information and 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 198 Disk full 254 Bad command
200 Close error 255 CP/M error 200 Close error 255 CP/M error
204 Bad name 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 1. BASIC V statements
@ -408,9 +413,9 @@ New features in BBC BASIC (Z80) version 5.00, May 2024:
2.3 REPORT$ 2.3 REPORT$
2.4 Binary constants 2.4 Binary constants
2.5 LEFT$ & RIGHT$ with last parameter omitted 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 2.9 GET$#file
3. BASIC V whole array operations 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.8 Make a whole array LOCAL
3.9 DIM a LOCAL array (on the stack) + 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 + 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: 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$() = "" 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.1 Bit-shifts <<, >>, >>>
4.2 Floating-point indirection (|) 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. Extensions to Acorn's BASIC V, compatible with BB4W, BBCSDL and BBCTTY
5.1 EXIT REPEAT / WHILE / FOR [var] 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.4 'BY len' and 'TO term' qualifiers to GET$#file
5.5 ELSE IF <condition> THEN; (trailing semicolon) 5.5 ELSE IF <condition> THEN; (trailing semicolon)
5.6 == synonymous with = in comparisons 5.6 == synonymous with = in comparisons
5.7 DIM a global array inside a FN/PROC (use RETURN) 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. 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 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. 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 FREE
EXTRN HIMEM EXTRN HIMEM
EXTRN CURLIN EXTRN CURLIN
EXTRN AUTONO
EXTRN USER EXTRN USER
EXTRN VERMSG EXTRN VERMSG
; ;
@ -440,14 +441,14 @@ INCRDF: CALL INCSEC
; ;
READ: CALL SETDMA READ: CALL SETDMA
LD A,33 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 BDOS0: PUSH BC
PUSH DE PUSH DE
@ -456,8 +457,8 @@ BDOS0: PUSH BC
PUSH IY PUSH IY
LD C,A LD C,A
CALL BDOS CALL BDOS
INC H ;* TEST H
DEC H ;* CP/M 3 ONLY
INC H
DEC H
POP IY POP IY
POP IX POP IX
POP HL POP HL
@ -883,10 +884,10 @@ DIR1: CALL LTRAP
LD HL,DSKBUF+1 LD HL,DSKBUF+1
ADD HL,DE ADD HL,DE
PUSH HL PUSH HL
LD DE,8 ;**
LD DE,8
ADD HL,DE ADD HL,DE
LD E,(HL) ;**
INC HL ;**
LD E,(HL)
INC HL
BIT 7,(HL) ;SYSTEM FILE? BIT 7,(HL) ;SYSTEM FILE?
POP HL POP HL
LD C,18 LD C,18
@ -899,13 +900,13 @@ DIR1: CALL LTRAP
ADD A,'A' ADD A,'A'
CALL OSWRCH CALL OSWRCH
LD B,8 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 DIR3: CALL CPTEXT
LD B,3 LD B,3
LD A,' ' ;**
LD A,' '
CALL SPTEXT CALL SPTEXT
POP BC POP BC
DJNZ DIR2 DJNZ DIR2
@ -1046,11 +1047,11 @@ COMDS: DEFM 'BY'
; B = number of characters to print ; B = number of characters to print
; Destroys: A,B,H,L,F ; Destroys: A,B,H,L,F
; ;
CPTEXT: PUSH AF ;**
CPTEXT: PUSH AF
LD A,':' LD A,':'
CALL OSWRCH CALL OSWRCH
POP AF ;**
SPTEXT: CALL OSWRCH ;**
POP AF
SPTEXT: CALL OSWRCH
PTEXT: LD A,(HL) PTEXT: LD A,(HL)
AND 7FH AND 7FH
INC HL INC HL
@ -1257,7 +1258,8 @@ WRCH1: CALL BDOS0
SET 1,(HL) SET 1,(HL)
RET RET
; ;
TOGGLE: LD A,(FLAGS)
TOGGLE: LD BC,0
LD A,(FLAGS)
XOR 00000100B XOR 00000100B
LD (FLAGS),A LD (FLAGS),A
RET RET
@ -1320,6 +1322,8 @@ LIMIT: CALL Z,KEYGET ;READ KEYBOARD
OR A ;TEST FOR ESCAPE OR A ;TEST FOR ESCAPE
LD A,C LD A,C
JP M,OSEXIT JP M,OSEXIT
CP 'P' AND 1FH
JP Z,TOGGLE
CP (IX-11) ;CURSOR UP (IX-11) CP (IX-11) ;CURSOR UP (IX-11)
JP Z,LEFT JP Z,LEFT
CP (IX-10) ;CURSOR DOWN (IX-10) CP (IX-10) ;CURSOR DOWN (IX-10)
@ -1329,13 +1333,11 @@ LIMIT: CALL Z,KEYGET ;READ KEYBOARD
JR Z,BACK JR Z,BACK
CP (IX-9) ;START OF LINE (IX-9) CP (IX-9) ;START OF LINE (IX-9)
JR Z,LEFT JR Z,LEFT
CP (IX-7) ;CLEAR RIGHT (IX-7)
JR Z,DELETE
CP (IX-8) ;END OF LINE (IX-8) CP (IX-8) ;END OF LINE (IX-8)
JP Z,RIGHT JP Z,RIGHT
CP (IX-7) ;CLEAR RIGHT (IX-7)
JR Z,DELETE
LD C,0 ;INHIBIT REPEAT LD C,0 ;INHIBIT REPEAT
CP 'P' AND 1FH
JP Z,TOGGLE
CP (IX-1) ;INSERT / OVR (IX-1) CP (IX-1) ;INSERT / OVR (IX-1)
JP Z,INSERT JP Z,INSERT
CP (IX-6) ;DELETE LEFT (IX-6) CP (IX-6) ;DELETE LEFT (IX-6)
@ -1360,10 +1362,15 @@ OSEXIT: LD A,(HL)
JP NZ,ABORT ;ESCAPE JP NZ,ABORT ;ESCAPE
LD A,LF LD A,LF
CALL OSWRCH CALL OSWRCH
LD DE,(CURLIN)
XOR A XOR A
LD L,A LD L,A
LD (EDPTR),HL LD (EDPTR),HL
LD DE,(CURLIN)
CP D
RET NZ
CP E
RET NZ
LD DE,(AUTONO)
CP D CP D
RET NZ RET NZ
CP E 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') NAME ('EVAL')
; ;
;BBC BASIC INTERPRETER - Z80 VERSION ;BBC BASIC INTERPRETER - Z80 VERSION
;EVALUATE EXPRESSION MODULE - "EVAL" ;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 ;THE NAME BBC BASIC IS USED WITH THE PERMISSION
;OF THE BRITISH BROADCASTING CORPORATION AND IS ;OF THE BRITISH BROADCASTING CORPORATION AND IS
@ -11,7 +11,9 @@
; ;
;VERSION 2.3, 07-05-1984 ;VERSION 2.3, 07-05-1984
;VERSION 3.0, 08-03-1987 ;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: ;BINARY FLOATING POINT REPRESENTATION:
; 32 BIT SIGN-MAGNITUDE NORMALIZED MANTISSA ; 32 BIT SIGN-MAGNITUDE NORMALIZED MANTISSA
@ -368,6 +370,11 @@ EXPR4B: CALL SAVE
CALL DOIT CALL DOIT
JR EXPR4A JR EXPR4A
; ;
EXPR45: LD A,E
CP '+'
JR Z,EXPR4
CP '-'
JR Z,EXPR4
EXPR5: CALL ITEM EXPR5: CALL ITEM
OR A ;TEST TYPE OR A ;TEST TYPE
EX AF,AF' ;SAVE TYPE EX AF,AF' ;SAVE TYPE
@ -396,6 +403,9 @@ EXPRS: CALL EXPR
RET M RET M
JR MISMAT JR MISMAT
; ;
BADHEX: LD A,28
ERROR2: JP ERROR ;"Bad HEX or binary"
;
NEGATE: EXX NEGATE: EXX
LD A,H LD A,H
CPL CPL
@ -420,9 +430,6 @@ ADD1: EXX
INC HL INC HL
RET RET
; ;
BADHEX: LD A,28
ERROR2: JP ERROR ;"Bad HEX or binary"
;
ITEMI: CALL ITEM ITEMI: CALL ITEM
OR A OR A
JP P,SFIX JP P,SFIX
@ -635,7 +642,7 @@ CONS2: LD A,(IY)
RET RET
; ;
ARRAY: LD A,14 ;'Bad use of array' ARRAY: LD A,14 ;'Bad use of array'
JP ERROR
JR ERROR0
; ;
; ARRLEN - Get start address and number of elements of an array ; ARRLEN - Get start address and number of elements of an array
; Inputs: HL addresses array descriptor ; Inputs: HL addresses array descriptor
@ -719,20 +726,21 @@ LOADS: LD DE,ACCS
EXX EXX
OR A OR A
LD C,A LD C,A
LD A,80H ;STRING MARKER
REPDUN: LD A,80H ;STRING MARKER
RET Z RET Z
LD B,0 LD B,0
LDIR LDIR
RET RET
; ;
LOADS2: LD A,(HL)
LOADS2: PUSH IX
POP HL
LOADS3: LD A,(HL)
LD (DE),A LD (DE),A
INC HL INC HL
CP CR CP CR
REPDUN: LD A,80H ;STRING MARKER
RET Z
JR Z,REPDUN
INC E INC E
JR NZ,LOADS2
JR NZ,LOADS3
RET ;RETURN NULL STRING RET ;RETURN NULL STRING
; ;
; Version 5 extensions: ; Version 5 extensions:
@ -1522,9 +1530,8 @@ GET5: LD D,0
GET6: PUSH BC GET6: PUSH BC
CALL OSBGET CALL OSBGET
POP BC POP BC
JR C,GET9 ;EOF
BIT 1,B BIT 1,B
JR Z,GET8
JR Z,GET10
CP C CP C
JR Z,GET9 ;NUL (or supplied term) JR Z,GET9 ;NUL (or supplied term)
BIT 7,B BIT 7,B
@ -1535,9 +1542,11 @@ GET6: PUSH BC
JR Z,GET9 ;LF JR Z,GET9 ;LF
GET7: CP CR GET7: CP CR
JR Z,GET9 ;CR JR Z,GET9 ;CR
GET8: LD (HL),A
GET8: OR A
GET10: LD (HL),A
INC L INC L
DEC D DEC D
JR C,GET9 ;EOF
JR NZ,GET6 JR NZ,GET6
GET9: EX DE,HL GET9: EX DE,HL
LD A,80H LD A,80H
@ -1915,20 +1924,6 @@ RELOPQ: CP '>'
CP '<' CP '<'
RET 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 SAVE: INC IY
AND 0FH AND 0FH
SAVE1: EX AF,AF' SAVE1: EX AF,AF'
@ -1967,6 +1962,20 @@ DOIT: EX AF,AF'
LD A,(IY) LD A,(IY)
RET 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 DISPT2: PUSH HL
LD HL,SOPTBL LD HL,SOPTBL
JR DISPT0 JR DISPT0
@ -2045,17 +2054,17 @@ LETARR: RES 6,D ;Lose array marker
; allocate space on stack and zero it: ; allocate space on stack and zero it:
; ;
XOR A ;Clear carry and zero error code XOR A ;Clear carry and zero error code
LD HL,0
SBC HL,HL
ADD HL,SP ;HL = SP ADD HL,SP ;HL = SP
SBC HL,BC SBC HL,BC
JP C,ERROR ;'No room'
JR C,ERROR1 ;'No room'
PUSH BC PUSH BC
LD BC,(FREE) LD BC,(FREE)
INC B ;Safety margin INC B ;Safety margin
SBC HL,BC SBC HL,BC
ADD HL,BC ADD HL,BC
POP BC POP BC
JP C,ERROR ;'No room'
JR C,ERROR1 ;'No room'
LD SP,HL LD SP,HL
LETA0: LD (HL),0 LETA0: LD (HL),0
INC HL INC HL
@ -2095,8 +2104,7 @@ EXPRA1: INC IY
PUSH BC PUSH BC
PUSH HL PUSH HL
PUSH IX PUSH IX
LD E,A ;For unary minus
CALL NXT
LD E,A ;Operator
CALL ITEMA CALL ITEMA
POP IX POP IX
POP HL POP HL
@ -2172,16 +2180,20 @@ EXPRA8: ADD HL,BC ;Skip remaining elements
RET RET
; ;
; ITEMA: evaluate and operate on array item ; 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 ; BC = number of elements
; HL = pointer to destination on stack ; HL = pointer to destination on stack
; IY = text pointer ; IY = text pointer
; Outputs: IY updated ; Outputs: IY updated
; Destroys: Everything except SP ; 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 JR NZ,ITEMA1 ;Not unary minus
LD A,E LD A,E
CP '=' CP '='
@ -2189,16 +2201,14 @@ ITEMA: CP '-'
INC IY ;Bump past '-' INC IY ;Bump past '-'
CALL NXT CALL NXT
LD E,'-' ;Unary minus 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 CALL GETVAR
POP DE ;Type & operator
JR NZ,ITEMA4 ;Non-array expression JR NZ,ITEMA4 ;Non-array expression
BIT 6,A BIT 6,A
JR Z,ITEMA4 ;Not a whole array JR Z,ITEMA4 ;Not a whole array
POP BC ;Junk saved original op
POP BC ;Junk saved text pointer POP BC ;Junk saved text pointer
POP DE ;Type & operator
RES 6,A RES 6,A
CP D CP D
JP NZ,MISMAT ;'Type mismatch' JP NZ,MISMAT ;'Type mismatch'
@ -2259,10 +2269,12 @@ ITEMA3: EX DE,HL ;DE = destination
; ;
; Process numeric non-array item: ; 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 BIT 7,D
JR NZ,ITEMA5 JR NZ,ITEMA5
CALL EXPR4 ;; should be EXP345
PUSH DE
CALL EXPR45 ;; should be EXP345
LD A,C ;Exponent LD A,C ;Exponent
POP DE ;Type / operator POP DE ;Type / operator
POP BC ;Count POP BC ;Count
@ -2303,8 +2315,7 @@ ITEMA5: CALL EXPRS
LD C,A LD C,A
LD B,0 LD B,0
LDIR LDIR
ITEMA0: POP DE
POP BC
ITEMA0: POP BC
POP IX POP IX
EXX EXX
LD L,A LD L,A
@ -2362,13 +2373,11 @@ ARRDOT: INC IY ;Bump past dot
JR Z,ARR1D JR Z,ARR1D
LD H,(IY-1) LD H,(IY-1)
LD L,(IY-2) 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 DE
POP AF
LD B,(IX-1) LD B,(IX-1)
LD C,(IX-2) LD C,(IX-2)
; ;
@ -2519,9 +2528,7 @@ INNER: PUSH DE ;6
ADD IY,BC ADD IY,BC
PUSH AF PUSH AF
PUSH HL PUSH HL
EX DE,HL
CALL MUL16
EX DE,HL
CALL X14OR5
POP BC POP BC
CALL MOD16 CALL MOD16
POP AF POP AF
@ -2541,12 +2548,9 @@ INNER: PUSH DE ;6
SBC HL,DE SBC HL,DE
PUSH HL PUSH HL
POP IY 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 ADD IX,DE
POP HL POP HL
POP DE 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') NAME ('EXEC')
; ;
;BBC BASIC INTERPRETER - Z80 VERSION ;BBC BASIC INTERPRETER - Z80 VERSION
;STATEMENT EXECUTION MODULE - "EXEC" ;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 ;THE NAME BBC BASIC IS USED WITH THE PERMISSION
;OF THE BRITISH BROADCASTING CORPORATION AND IS ;OF THE BRITISH BROADCASTING CORPORATION AND IS
@ -11,7 +11,10 @@
; ;
;VERSION 2.1, 22-01-1984 ;VERSION 2.1, 22-01-1984
;VERSION 3.1, 11-06-1987 ;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 XEQ
GLOBAL RUN0 GLOBAL RUN0
@ -59,6 +62,8 @@
EXTRN BYE EXTRN BYE
EXTRN NXT EXTRN NXT
EXTRN NLIST EXTRN NLIST
EXTRN CSRON
EXTRN CSROFF
; ;
EXTRN OSWRCH EXTRN OSWRCH
EXTRN OSLINE EXTRN OSLINE
@ -84,7 +89,7 @@
EXTRN PLOT EXTRN PLOT
EXTRN COLOUR EXTRN COLOUR
EXTRN CIRCLE EXTRN CIRCLE
EXTRN ELLIPSE
EXTRN ELLIPS
EXTRN FILL EXTRN FILL
EXTRN MOUSE EXTRN MOUSE
EXTRN ORIGIN EXTRN ORIGIN
@ -242,7 +247,7 @@ CMDTAB: DEFW LEFTSL
DEFW CLI ;OSCLI DEFW CLI ;OSCLI
DEFW REM ;NUL DEFW REM ;NUL
DEFW CIRCLE DEFW CIRCLE
DEFW ELLIPSE
DEFW ELLIPS
DEFW FILL DEFW FILL
DEFW MOUSE DEFW MOUSE
DEFW ORIGIN DEFW ORIGIN
@ -359,6 +364,16 @@ CLI: CALL EXPRS
CALL OSCLI CALL OSCLI
JR XEQ 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, * ;REM, *
; ;
EXT: PUSH IY EXT: PUSH IY
@ -373,14 +388,6 @@ REM: PUSH IY
POP IY POP IY
JP XEQ0 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$ ;ERROR num,string$
; ;
THROW: CALL EXPRI THROW: CALL EXPRI
@ -431,7 +438,7 @@ SWAP1: LD C,(HL)
INC DE INC DE
INC HL INC HL
DJNZ SWAP1 DJNZ SWAP1
JR XEQR
JR XEQGO4
; ;
;[LET] var = expr ;[LET] var = expr
; ;
@ -447,14 +454,13 @@ LET: CALL ASSIGN
JR C,SYNTAX ;"Syntax error" JR C,SYNTAX ;"Syntax error"
JP P,LETARR ;Numeric array JP P,LETARR ;Numeric array
JP PE,LETARR ;String array JP PE,LETARR ;String array
LD A,D ;Type
PUSH DE PUSH DE
PUSH HL PUSH HL
CALL EXPRS CALL EXPRS
POP IX POP IX
POP HL POP HL
CALL MODIFS CALL MODIFS
XEQR: JP XEQ
XEQGO4: JP XEQ
; ;
; GETSTR - Get string variable ; GETSTR - Get string variable
; Inputs: IY = text pointer ; Inputs: IY = text pointer
@ -499,7 +505,7 @@ ASM: LD (CURLIN),IY
AND 0FH AND 0FH
OR 30H OR 30H
LD (HL),A LD (HL),A
JR XEQR
JR XEQGO4
; ;
;= ;=
; ;
@ -626,9 +632,11 @@ DIM3: PUSH HL
BIT 0,A BIT 0,A
JR Z,ARRCHK ;NOT LOCAL JR Z,ARRCHK ;NOT LOCAL
LD HL,0 LD HL,0
ADD HL,SP
SBC HL,DE SBC HL,DE
OR A
SBC HL,BC SBC HL,BC
ADD HL,SP
JR Z,ARRCHK ;RESERVE NOTHING
LD SP,HL LD SP,HL
PUSH DE PUSH DE
PUSH BC PUSH BC
@ -832,7 +840,9 @@ XEQGO3: JP XEQ
;ON ERROR [LOCAL] statement [:statement...] ;ON ERROR [LOCAL] statement [:statement...]
;ON ERROR [LOCAL] OFF ;ON ERROR [LOCAL] OFF
; ;
ON: CP TERROR
ON: CALL TERMQ
JP Z,CSRON
CP TERROR
JR Z,ONERR ;"ON ERROR" JR Z,ONERR ;"ON ERROR"
CALL EXPRI CALL EXPRI
LD A,(IY) LD A,(IY)
@ -890,8 +900,10 @@ ON4: LD A,(IY)
JP Z,IF1 ;ELSE CLAUSE JP Z,IF1 ;ELSE CLAUSE
CP CR CP CR
JR NZ,ON4 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 ONPROC: LD A,TON
JP PROC JP PROC
@ -962,9 +974,6 @@ XEQGO2: JP XEQ
; ;
;FOR var = expr TO expr [STEP expr] ;FOR var = expr TO expr [STEP expr]
; ;
FORVAR: LD A,34
JR ERROR2 ;"FOR variable"
;
FOR: CALL ASSIGN FOR: CALL ASSIGN
JR NZ,FORVAR ;"FOR variable" JR NZ,FORVAR ;"FOR variable"
PUSH AF ;SAVE TYPE PUSH AF ;SAVE TYPE
@ -1368,7 +1377,7 @@ ENDPRO: POP BC
JP ERROR ;"No PROC" JP ERROR ;"No PROC"
; ;
ENDPR1: POP IY ENDPR1: POP IY
JP XEQ
XEQGO6: JP XEQ
; ;
;INPUT #channel,var,var... ;INPUT #channel,var,var...
; ;
@ -1429,7 +1438,7 @@ INPUT: CP '#'
INPUT0: LD HL,BUFFER INPUT0: LD HL,BUFFER
LD (HL),CR ;INITIALISE EMPTY LD (HL),CR ;INITIALISE EMPTY
INPUT1: CALL TERMQ INPUT1: CALL TERMQ
JP Z,XEQ ;DONE
JR Z,XEQGO6 ;DONE
INC IY INC IY
CP ',' CP ','
JR Z,INPUT3 ;SKIP COMMA JR Z,INPUT3 ;SKIP COMMA
@ -1604,8 +1613,8 @@ MELSE: LD BC,-3
LD BC,TENDIF LD BC,TENDIF
LD DE,TENDIF*256+TTHEN LD DE,TENDIF*256+TTHEN
CALL NSCAN CALL NSCAN
JP Z,XEQ
JR NENDIF
JR NZ,NENDIF
XEQGO7: JP XEQ
; ;
; WHEN and OTHERWISE: ; WHEN and OTHERWISE:
; ;
@ -1614,7 +1623,7 @@ WHEN: LD BC,-3
LD BC,TENDCASE LD BC,TENDCASE
LD DE,TENDCASE*256+TOF LD DE,TENDCASE*256+TOF
CALL NSCAN CALL NSCAN
JP Z,XEQ
JR Z,XEQGO7
LD A,47 LD A,47
JR ERROR4 ;"Missing ENDCASE" JR ERROR4 ;"Missing ENDCASE"
; ;
@ -1708,12 +1717,12 @@ CASE2: LD A,(IY)
;Finished, level stack if string: ;Finished, level stack if string:
; ;
CASE9: BIT 0,B CASE9: BIT 0,B
JR Z,CASE8
JR Z,XEQGO5
LD H,0 LD H,0
LD L,C LD L,C
ADD HL,SP ADD HL,SP
LD SP,HL LD SP,HL
CASE8: JP XEQ
JR XEQGO5
; ;
;Matched, so skip any more expressions: ;Matched, so skip any more expressions:
; ;
@ -1791,7 +1800,7 @@ ENDWH1: PUSH IY
CLS: CALL CLRSCN CLS: CALL CLRSCN
XOR A XOR A
LD (COUNT),A LD (COUNT),A
JP XEQ
JR XEQGO5
; ;
;STOP ;STOP
; ;
@ -1808,7 +1817,7 @@ STOP: CALL TELL
;REPORT ;REPORT
; ;
REPOR: CALL REPORT REPOR: CALL REPORT
JP XEQ
JR XEQGO5
; ;
;CLEAR ;CLEAR
; ;
@ -1816,32 +1825,30 @@ CLR: CALL CLEAR
LD HL,(PAGE) LD HL,(PAGE)
JR RESTR1 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 CALL RESLOC
JP NZ,XEQ
LD A,54 ;'DATA not LOCAL'
JR NZ,XEQGO5
EX AF,AF' ;Get error code
DEFB 21H DEFB 21H
NOLINE: LD A,41 ;'No such line' NOLINE: LD A,41 ;'No such line'
JR ERROR5
ERROR5: JP ERROR
; ;
;RESTORE [line]
;RESTORE [line | +n | DATA | ERROR | LOCAL]
; ;
RESTOR: CP TERROR RESTOR: CP TERROR
JR Z,RESERR
LD BC,200H + 53 ;'ON ERROR not LOCAL'
JR Z,RESDEL
CP TDATA 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 '+' CP '+'
JR Z,RESREL JR Z,RESREL
LD HL,(PAGE) LD HL,(PAGE)
@ -1968,13 +1975,17 @@ TRACE0: DEC HL
TRACE1: LD (TRACEN),HL TRACE1: LD (TRACEN),HL
JR XEQGO1 JR XEQGO1
; ;
;VDU expr,expr;....
;VDU expr,expr;....[|]
; ;
VDU: CALL EXPRI VDU: CALL EXPRI
EXX EXX
LD A,L LD A,L
CALL OSWRCH
LD B,1
VDU1: CALL OSWRCH
DJNZ VDU1
LD A,(IY) LD A,(IY)
CP '|'
JR Z,VDU4
CP ',' CP ','
JR Z,VDU2 JR Z,VDU2
CP ';' CP ';'
@ -1986,6 +1997,11 @@ VDU3: CALL TERMQ
JR NZ,VDU JR NZ,VDU
JR XEQGO1 JR XEQGO1
; ;
VDU4: INC IY
XOR A
LD B,9
JR VDU1
;
;CLOSE channel number ;CLOSE channel number
; ;
CLOSE: CALL CHANEL CLOSE: CALL CHANEL
@ -2005,25 +2021,25 @@ BPUT: CALL CHANEL ;CHANNEL NUMBER
EXX EXX
LD A,L LD A,L
POP DE POP DE
CALL OSBPUT
BPUT1: CALL OSBPUT
BPUTX: JR XEQGO1 BPUTX: JR XEQGO1
; ;
BPUTS: LD A,E BPUTS: LD A,E
POP DE POP DE
LD D,A LD D,A
LD HL,ACCS LD HL,ACCS
OR A
JR Z,BPUTS0
BPUTS1: LD A,(HL) BPUTS1: LD A,(HL)
INC HL INC HL
CALL OSBPUT CALL OSBPUT
DEC D DEC D
JR NZ,BPUTS1 JR NZ,BPUTS1
CALL NXT
BPUTS0: CALL NXT
CP ';' CP ';'
INC IY
JR Z,BPUTX
LD A,LF LD A,LF
CALL OSBPUT
DEC IY
JR NZ,BPUT1
INC IY
JR BPUTX JR BPUTX
; ;
;CALL address[,var[,var...]] ;CALL address[,var[,var...]]
@ -2347,7 +2363,7 @@ MODIFY: LD A,E
CALL FPP CALL FPP
POP IX POP IX
POP DE POP DE
JP C,ERROR
JR C,ERRORC
STORE0: LD A,D ;Type STORE0: LD A,D ;Type
STOREN: CP 5 STOREN: CP 5
JR Z,STORE5 JR Z,STORE5
@ -2384,14 +2400,17 @@ MODIFS: LD A,L ;Operator
CP '+' CP '+'
LD A,H ;Type LD A,H ;Type
JR NZ,STACCS JR NZ,STACCS
PUSH IY
PUSH IX PUSH IX
POP IY
EX (SP),IY
CALL PUSHS CALL PUSHS
PUSH IY PUSH IY
POP IX POP IX
CALL LOADS CALL LOADS
POP BC POP BC
LD A,E
ADD C
LD A,19 ;String too long
ERRORC: JR C,ERROR6
LD A,B ;Type LD A,B ;Type
INC C INC C
DEC C DEC C
@ -2464,7 +2483,7 @@ CHECK: PUSH HL
POP HL POP HL
RET C RET C
XOR A XOR A
JP ERROR ;"No room"
ERROR6: JP ERROR ;"No room"
; ;
STORS3: LD C,E STORS3: LD C,E
PUSH IX PUSH IX
@ -2728,6 +2747,7 @@ RESARR: POP BC
ADD HL,SP ADD HL,SP
CALL NZ,FREESA ;Free string array CALL NZ,FREESA ;Free string array
RESAR1: LD SP,HL RESAR1: LD SP,HL
INC IX ;Flag something restored
JR RESLO1 JR RESLO1
; ;
; RESLOC - Restore local variables/arrays or DATA/ERROR status from stack ; RESLOC - Restore local variables/arrays or DATA/ERROR status from stack

8
Source/Apps/BBCBASIC/hook.z80

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

49
Source/Apps/BBCBASIC/math.z80

@ -5,7 +5,7 @@
;(C) COPYRIGHT R.T.RUSSELL 1986-2024 ;(C) COPYRIGHT R.T.RUSSELL 1986-2024
;VERSION 0.0, 26-10-1986 ;VERSION 0.0, 26-10-1986
;VERSION 0.1, 14-12-1988 (BUG FIX) ;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: ;BINARY FLOATING POINT REPRESENTATION:
; 32 BIT SIGN-MAGNITUDE NORMALIZED MANTISSA ; 32 BIT SIGN-MAGNITUDE NORMALIZED MANTISSA
@ -388,16 +388,7 @@ IMUL: LD A,H
JP NEGATE JP NEGATE
; ;
IMUL1: DEC C 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 JP P,IMUL1 ;NORMALISE
EX AF,AF' EX AF,AF'
RET M RET M
@ -2178,30 +2169,12 @@ SQR2: INC A
RET P RET P
SQRA: SLA C SQRA: SLA C
RL B RL B
INC C
EXX EXX
RL C RL C
RL B 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 EXX
JP NC,SQR1 JP NC,SQR1
SQR3: OR A SQR3: OR A
@ -2231,6 +2204,18 @@ SQRB: ADD HL,HL
DEC C DEC C
RET 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) DIGITQ: LD A,(IX)
CP '9'+1 CP '9'+1
CCF 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 The table below clarifies where each of the applications may be
found. It is not an exhaustive list, with further applications existing 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 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 | | Application | ROM Disk | Boot Disks |
| ----------- | :------: | :--------: | | ----------- | :------: | :--------: |
| ASSIGN | Yes | Yes | | ASSIGN | Yes | Yes |
| BBCBASIC | No | Yes |
| CLRDIR | Yes | Yes | | CLRDIR | Yes | Yes |
| COPYSL | No | Yes | | COPYSL | No | Yes |
| CPUSPD | Yes | Yes | | CPUSPD | Yes | Yes |
@ -1020,14 +1021,17 @@ incuded within RomWBW may be found with in the Binary/Apps directory.
| SURVEY | Yes | Yes | | SURVEY | Yes | Yes |
| SYSCOPY | Yes | Yes | | SYSCOPY | Yes | Yes |
| TALK | Yes | Yes | | TALK | Yes | Yes |
| TBASIC | No | Yes |
| TIMER | Yes | Yes | | TIMER | Yes | Yes |
| TUNE | No | Yes | | TUNE | No | Yes |
| VGMPLAY | No | Yes | | VGMPLAY | No | Yes |
| WDATE | No | Yes | | WDATE | No | Yes |
| XM | Yes | 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 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, 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 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 The `ASSIGN` command is an original product and the source code is
provided in the RomWBW distribution. provided in the RomWBW distribution.
`\clearpage`{=latex}
## BBCBASIC
| BBCBASIC | |
| --------------------|---|
| ROM-based |No |
| Disk-based |Yes|
#### Syntax
#### Usage
#### Notes
#### Etymology
`\clearpage`{=latex} `\clearpage`{=latex}
## CLRDIR ## 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 The `TALK` command is an original product and the source code is
provided in the RomWBW distribution. provided in the RomWBW distribution.
`\clearpage`{=latex}
## TBASIC
| TBASIC | |
| --------------------|---|
| ROM-based |No |
| Disk-based |Yes|
#### Syntax
#### Usage
#### Notes
#### Etymology
`\clearpage`{=latex} `\clearpage`{=latex}
## TIMER ## TIMER
@ -2630,7 +2682,7 @@ control is fully functional (end to end).
The `XM` application provided in RomWBW is an adaptation of a The `XM` application provided in RomWBW is an adaptation of a
pre-existing XModem application. Based on the source code comments, it pre-existing XModem application. Based on the source code comments, it
was originally adapted from Ward Christensen's MODEM2 by Keith 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 The original source of the application was found in the Walnut Creek
CD-ROM and is called XMDM125.ARK dated 7/15/86. 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. The source code is provided in the RomWBW distribution.
`\clearpage`{=latex} `\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