v5beta4: Array Arithmetic improved compatibility
This commit is contained in:
1 parent
4b2b530017
commit
d11e0d2d91
4 files changed
+57
-54
No files matched your search
+5
-2
@@ -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
@@ -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
@@ -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'
|
||||||
|
|||||||
Reference in new issue
Block a user