diff --git a/WHATSNEW.TXT b/WHATSNEW.TXT index a2cf451..2f96ea4 100644 --- a/WHATSNEW.TXT +++ b/WHATSNEW.TXT @@ -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$() = "" diff --git a/bin/cpm/BBCBASIC.COM b/bin/cpm/BBCBASIC.COM index 3541e8b..228e967 100644 Binary files a/bin/cpm/BBCBASIC.COM and b/bin/cpm/BBCBASIC.COM differ diff --git a/src/EVAL.Z80 b/src/EVAL.Z80 index 28b63d5..d3eaf2f 100644 --- a/src/EVAL.Z80 +++ b/src/EVAL.Z80 @@ -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 diff --git a/src/MAIN.Z80 b/src/MAIN.Z80 index 341655f..1753333 100644 --- a/src/MAIN.Z80 +++ b/src/MAIN.Z80 @@ -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'