From d11e0d2d91ecd05d692b099fbd7352650726f9a8 Mon Sep 17 00:00:00 2001 From: Richard Russell Date: Tue, 4 Jun 2024 13:41:35 +0100 Subject: [PATCH] v5beta4: Array Arithmetic improved compatibility --- WHATSNEW.TXT | 7 ++- bin/cpm/BBCBASIC.COM | Bin 18944 -> 18944 bytes src/EVAL.Z80 | 102 +++++++++++++++++++++---------------------- src/MAIN.Z80 | 2 +- 4 files changed, 57 insertions(+), 54 deletions(-) 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 3541e8bc89aee66760f2d742bb8a027d62ecf45f..228e967416caf3c0f916eb99521836f2e332e66b 100644 GIT binary patch delta 2740 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' 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'