In ZX81 BASIC GOTO and GOSUB can jump to non existing lines and then goes to the next existing line; this does not work in VIC20 BASIC V2.
In ZX81 BASIC FOR...NEXT doesn't execute between FOR and NEXT if the condition is unfulfilled from the start, but in BASIC V2 it always executes at least once. The ZX BASIC behavior makes it possible to write code that doesn't depend on line-numbers with relative ease, e.g. if, else, else if, while, do...while etc. can be implemented using FOR...NEXT.
E.g. the
Pascalated BASIC for ZX Spectrum can be adapted for ZX81. The example is translated automatically from ZX Spectrum BASIC to ZX81 BASIC:
Code: Select all
100 REM
103 REM (* FACTORIALS *)
106 REM (C) 1987, 2021 BY ZARSOFT
109 CLEAR
112 REM VAR - GLOBAL VARIABLES
115 GOSUB 9905
REM CALL INIT PROC ADDRS
118 LET LIMIT = 0
REM MAX ARGUMENT TO BUILD THE LIST
121 LET ARGUMENT = 0
REM ARG TO CALCULATE FACTORIAL
124 LET RESULT = 0
REM FACTORIAL OF ARG
127 LET W = 0
REM AUXILIAR LEVEL 1 VAR
130 LET Y = 0
REM AUXILIAR LEVEL 2 VAR
133 GOSUB MAIN ROUTINE
136 STOP
REM FACTORIALS
200 REM
203 REM (* MAIN ROUTINE *)
206 LET MAIN ROUTINE = 207
RETURN
REM SET PROC ADDR
209 GOSUB INTRODUCTION
212 GOSUB GET LIMIT
215 GOSUB WRITE FACTORIALS
218 RETURN
REM MAIN ROUTINE
300 REM
303 REM (* INTRODUCTION *)
306 LET INTRODUCTION = 307
RETURN
REM SET PROC ADDR
309 PRINT "FACTORIALS LIST"
312 PRINT "PASCALATED BASIC DEMONSTRATION"
315 PRINT
318 RETURN
REM INTRODUCTION
400 REM
403 REM (* GET LIMIT *)
406 LET GET LIMIT = 407
RETURN
REM SET PROC ADDR
409 FOR W = 0 TO 0.5 STEP 0
REM REPEAT
412 PRINT "MAX ARGUMENT = ";
415 INPUT LIMIT
PRINT LIMIT
418 LET Y = LIMIT >= 12
REM IF-BEGIN
421 FOR Y = Y TO 0.5 STEP -2
REM IF-BEGIN
424 PRINT
427 PRINT "MUST BE LOWER THAN 12."
430 PRINT "TRY AGAIN."
433 PRINT
436 NEXT Y
REM ENDIF
439 LET Y = (Y<0)*-1 + (Y=0)*( LIMIT < 0 )
REM ELSEIF
442 FOR Y = Y TO 0.5 STEP -2
REM ELSEIF
445 PRINT
448 PRINT "MUST BE GREATER THAN 0."
451 PRINT "TRY AGAIN."
454 PRINT
457 NEXT Y
REM ENDIF
460 LET Y = (Y=0)
REM ELSE
463 FOR Y = Y TO 0.5 STEP -2
REM ELSE
466 PRINT
469 PRINT "VALID INPUT."
472 PRINT
475 NEXT Y
REM ENDIF
478 LET W = (LIMIT >= 0) AND (LIMIT <= 11)
REM UNTIL
481 NEXT W
REM UNTIL
484 RETURN
REM GET LIMIT
500 REM
503 REM (* WRITE FACTORIALS *)
506 LET WRITE FACTORIALS = 507
RETURN
REM SET PROC ADDR
509 PRINT
512 FOR W = LIMIT TO 0 STEP -1
515 LET ARGUMENT = W
518 PRINT "FACT(";ARGUMENT;") = ";
521 GOSUB CALCULATE FACTORIAL
524 PRINT RESULT
527 NEXT W
530 RETURN
REM WRITE FACTORIALS
600 REM
603 REM (* CALCULATE FACTORIAL *)
606 LET CALCULATE FACTORIAL = 607
RETURN
REM SET PROC ADDR
609 LET RESULT = 1
612 FOR Y = NOT (ARGUMENT > 1 ) TO 0.5 STEP 0
REM WHILE
615 LET RESULT = RESULT * ARGUMENT
618 LET ARGUMENT = ARGUMENT-1
621 LET Y = NOT (ARGUMENT > 1 )
REM ENDWHILE
624 NEXT Y
REM ENDWHILE
627 RETURN
REM CALCULATE FACTORIAL
9900 REM
9902 REM (* INIT PROC ADDRS *)
9904 LET W = 9999
RETURN
9908 PRINT " "; AT 0,0;
9910 FOR W = 200 TO 9900 STEP 100
9912 GOSUB W
9914 NEXT W
9916 RETURN
REM INIT PROC ADDRS
9918 REM CONVERTED FROM
9920 REM PASCALATED BASIC
9922 REM TO STRUCTURED BASIC
9924 REM AT WWW.ARCALUSITANA.FUN/MUSEUZX
9926 REM (C) 1987, 2021 BY ZARSOFT
It was translated in Linux using:
Code: Select all
cat factorials.bas | sed 's/\(^[0-9][0-9]*\) :/\1 REM/;s/ : /\n /g' | sed 's/\\{vi}/(*/;s/\\{vn}/*)/;s/GO SUB/GOSUB/;s/FLASH 1;//;s/REM REM/REM/;s/ *$//' | tr a-z A-Z > factorials-zx81.bas
This was loaded using the emulator ZCE that can handle lines without line-numbers:
The p-file is included.
It is not impossible to translate structured language without line-numbers to BASIC V2, but that requires another, probably larger, system:
https://github.com/mobluse/ratbas2