v5beta4: Array Arithmetic improved compatibility

This commit is contained in:
Richard Russell committed 2024-06-04 13:41:35 +01:00
1 parent 4b2b530017
commit d11e0d2d91
4 files changed
+57 -54

No files matched your search

+5 -2
View File
@@ -1,4 +1,4 @@
New features in BBC BASIC (Z80) version 5.00, May 2024:
New features in BBC BASIC (Z80) version 5.00, June 2024:
1. BASIC V statements
@@ -38,7 +38,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$() = ""
Binary file not shown.
+51 -51
View File
@@ -10,7 +10,7 @@
;
;VERSION 2.3, 07-05-1984
;VERSION 3.0, 08-03-1987
;VERSION 5.0, 14-05-2024
;VERSION 5.0, 31-05-2024
;
;BINARY FLOATING POINT REPRESENTATION:
; 32 BIT SIGN-MAGNITUDE NORMALIZED MANTISSA
@@ -367,6 +367,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
@@ -395,6 +400,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
@@ -419,9 +427,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
@@ -1914,20 +1919,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'
@@ -1966,6 +1957,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
@@ -2044,17 +2049,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
@@ -2094,8 +2099,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
@@ -2171,16 +2175,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 '='
@@ -2188,16 +2196,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'
@@ -2258,10 +2264,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
@@ -2302,8 +2310,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
@@ -2361,13 +2368,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)
;
@@ -2518,9 +2523,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
@@ -2540,12 +2543,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
+1 -1
View File
@@ -174,7 +174,7 @@ PURGE: LD (HL),A ;CLEAR SCRATCHPAD
CALL NEWIT
JP NZ,CHAIN0 ;AUTO-RUN
CALL TELL
VERMSG: DEFM 'BBC BASIC (Z80) Version 5beta3'
VERMSG: DEFM 'BBC BASIC (Z80) Version 5beta4'
DEFB CR
DEFB LF
NOTICE: DEFM '(C) Copyright R.T.Russell 2024'