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 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.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$() = ""
Binary file not shown.
+51 -51
View File
@@ -10,7 +10,7 @@
; ;
;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
; ;
;BINARY FLOATING POINT REPRESENTATION: ;BINARY FLOATING POINT REPRESENTATION:
; 32 BIT SIGN-MAGNITUDE NORMALIZED MANTISSA ; 32 BIT SIGN-MAGNITUDE NORMALIZED MANTISSA
@@ -367,6 +367,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
@@ -395,6 +400,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
@@ -419,9 +427,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
@@ -1914,20 +1919,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'
@@ -1966,6 +1957,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
@@ -2044,17 +2049,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
@@ -2094,8 +2099,7 @@ EXPRA1: INC IY
PUSH BC PUSH BC
PUSH HL PUSH HL
PUSH IX PUSH IX
LD E,A ;For unary minus LD E,A ;Operator
CALL NXT
CALL ITEMA CALL ITEMA
POP IX POP IX
POP HL POP HL
@@ -2171,16 +2175,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 ; Inputs: D = type
; D = type ; E = operator ('=' for first item)
; E = operator
; 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 '='
@@ -2188,16 +2196,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 ITEMA1: PUSH DE ;Type and operator
PUSH BC ;Number of elements
PUSH DE ;Type and previous operator
PUSH IY ;In case normal expression
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'
@@ -2258,10 +2264,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
@@ -2302,8 +2310,7 @@ ITEMA5: CALL EXPRS
LD C,A LD C,A
LD B,0 LD B,0
LDIR LDIR
ITEMA0: POP DE ITEMA0: POP BC
POP BC
POP IX POP IX
EXX EXX
LD L,A LD L,A
@@ -2361,13 +2368,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 ARR1D: PUSH DE
PUSH DE EX DE,HL
LD C,A CALL X14OR5
LD B,0 EX DE,HL
CALL MUL16
POP DE POP DE
POP AF
LD B,(IX-1) LD B,(IX-1)
LD C,(IX-2) LD C,(IX-2)
; ;
@@ -2518,9 +2523,7 @@ INNER: PUSH DE ;6
ADD IY,BC ADD IY,BC
PUSH AF PUSH AF
PUSH HL PUSH HL
EX DE,HL CALL X14OR5
CALL MUL16
EX DE,HL
POP BC POP BC
CALL MOD16 CALL MOD16
POP AF POP AF
@@ -2540,12 +2543,9 @@ INNER: PUSH DE ;6
SBC HL,DE SBC HL,DE
PUSH HL PUSH HL
POP IY POP IY
LD L,A LD D,B
LD H,0 LD E,C
PUSH AF CALL X14OR5
CALL MUL16
POP AF
EX DE,HL
ADD IX,DE ADD IX,DE
POP HL POP HL
POP DE POP DE
+1 -1
View File
@@ -174,7 +174,7 @@ 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 5beta3' VERMSG: DEFM 'BBC BASIC (Z80) Version 5beta4'
DEFB CR DEFB CR
DEFB LF DEFB LF
NOTICE: DEFM '(C) Copyright R.T.Russell 2024' NOTICE: DEFM '(C) Copyright R.T.Russell 2024'