diff --git a/basic.js b/basic.js
index 2b168b2..618c989 100644
--- a/basic.js
+++ b/basic.js
@@ -451,6 +451,16 @@ this.basic = (function() {
};
call_table = {
+ 0xD683: function() { // Clear stack
+ state.stack = [];
+ },
+ 0xF328: function() { // Pop error entry off stack
+ var stack_record = state.stack.pop();
+ if (!{}.hasOwnProperty.call(stack_record, 'resume_stmt_index')) {
+ runtime_error(ERRORS.SYNTAX_ERROR);
+ return;
+ }
+ },
0xF3E4: function() { // Reveal hi-res page 1
if (!env.hires) { runtime_error('Hires graphics not supported'); }
env.display.setState('graphics', true, 'full', true, 'page1', true, 'lores', false);
@@ -465,9 +475,6 @@ this.basic = (function() {
if (!hires) { runtime_error('Hires graphics not supported'); }
hires.clear(hires.color);
},
- 0xD683: function() { // Clear stack
- state.stack = [];
- },
0xFBF4: function() { // Move cursor right
if (env.tty.cursorRight) { env.tty.cursorRight(); }
},
@@ -563,14 +570,11 @@ this.basic = (function() {
},
'pop': function POP() {
- var stack_record;
- while (state.stack.length) {
- stack_record = state.stack.pop();
- if ({}.hasOwnProperty.call(stack_record, 'gosub_return')) {
- return;
- }
+ var stack_record = state.stack.pop();
+ if (!{}.hasOwnProperty.call(stack_record, 'gosub_return')) {
+ runtime_error(ERRORS.RETURN_WITHOUT_GOSUB);
+ return;
}
- runtime_error(ERRORS.RETURN_WITHOUT_GOSUB);
},
'for': function FOR(varname, from, to, step) {
@@ -640,8 +644,13 @@ this.basic = (function() {
},
'resume': function RESUME() {
- state.stmt_index = state.resume_stmt_index;
- state.line_number = state.resume_line_number;
+ var stack_record = state.stack.pop();
+ if (!{}.hasOwnProperty.call(stack_record, 'resume_stmt_index')) {
+ runtime_error(ERRORS.SYNTAX_ERROR);
+ return;
+ }
+ state.line_number = stack_record.resume_line_number;
+ state.stmt_index = stack_record.resume_stmt_index;
},
//////////////////////////////////////////////////////////////////////
@@ -2175,8 +2184,6 @@ this.basic = (function() {
onerr_code: 255,
onerr_handler: void 0,
- resume_stmt_index: 0,
- resume_line_number: 0,
trace_mode: false,
input_continuation: null,
@@ -2319,8 +2326,10 @@ this.basic = (function() {
if (rte instanceof basic.RuntimeError) {
state.onerr_code = rte.code || 0;
if (state.onerr_handler !== void 0) {
- state.resume_stmt_index = state.stmt_index;
- state.resume_line_number = state.line_number;
+ state.stack.push({
+ resume_stmt_index: state.stmt_index,
+ resume_line_number: state.line_number
+ });
gotoline(state.onerr_handler);
return basic.STATE_RUNNING;
} else if (rte.code === ERRORS.REENTER[0]) {
diff --git a/reference.htm b/reference.htm
index a5f1ac0..1287d06 100644
--- a/reference.htm
+++ b/reference.htm
@@ -211,10 +211,11 @@ can be literals (unquoted strings), strings, or numbers
CALL aexprCall native routine
+ CALL -3288
- pop ONERR
/RESUME
entry from stack
CALL -3100
- reveal hi-res page 1
CALL -3086
- clear current hi-res page to black
CALL -3082
- clear current hi-res page to current color
- CALL 54951
- clear stack (cancel pending FOR
-NEXT
loops and GOSUB
s)
+ CALL 54951
- clear stack (pop all FOR
/NEXT
, GOSUB
/RETURN
, and ONERR
/RESUME
entries)
CALL -1036
- move cursor right
CALL -1008
- move cursor left
CALL -998
- move cursor up
diff --git a/samples/sample.unittests.txt b/samples/sample.unittests.txt
index b1252c8..977943a 100644
--- a/samples/sample.unittests.txt
+++ b/samples/sample.unittests.txt
@@ -1,812 +1,821 @@
-
-0 GOTO 100
-
-1 REM LET T$ = "test desc" : LET S = 0 OR 1 : GOSUB 1
-2 IF S THEN PRINT ".";
+
+0 GOTO 100
+
+1 REM LET T$ = "test desc" : LET S = 0 OR 1 : GOSUB 1
+2 IF S THEN PRINT ".";
3 IF NOT S THEN INVERSE : PRINT " Test ";T$;" Failed "; : NORMAL : PRINT ""; : F = F + 1
-4 TE = TE + 1 : TS = TS + (NOT NOT S) : S = 0 : RETURN
-
-100 REM Pre-test for CLEAR
+4 TE = TE + 1 : TS = TS + (NOT NOT S) : S = 0 : RETURN
+
+100 REM Pre-test for CLEAR
110 A = 1 : A$ = "a" : A(1) = 2 : A$(1) = "b" : CLEAR
-
-200 REM Feature Detection
-210 LR = 0 : ONERR GOTO 220 : GR : LR = 1
-220 HR = 0 : ONERR GOTO 240 : HGR : HR = 1
-230 PD = 0 : ONERR GOTO 240 : X = PDL(0) : PD = 1
-240 POKE 216,0
-
+
+200 REM Feature Detection
+210 LR = 0 : ONERR GOTO 220 : GR : LR = 1
+220 HR = 0 : ONERR GOTO 240 : HGR : HR = 1
+230 PD = 0 : ONERR GOTO 240 : X = PDL(0) : PD = 1
+240 POKE 216,0
+
300 PR#3 : TEXT : HOME : PRINT "Unit Tests"
-
-1000 PRINT : PRINT "Variable Control ";
-
-1010 REM Ensure CLEAR in line 110 occurred
+
+1000 PRINT : PRINT "Variable Control ";
+
+1010 REM Ensure CLEAR in line 110 occurred
: T$ = "CLEAR"
-: S = ( A = 0 ) : GOSUB 1
-: S = ( A$ = "" ) : GOSUB 1
-: S = ( A(1) = 0 ) : GOSUB 1
-: S = ( A$(1) = "" ) : GOSUB 1
-
+: S = ( A = 0 ) : GOSUB 1
+: S = ( A$ = "" ) : GOSUB 1
+: S = ( A(1) = 0 ) : GOSUB 1
+: S = ( A$(1) = "" ) : GOSUB 1
+
1020 T$ = "Implicit LET"
-: A = 123 : S = ( A = 123 ) : GOSUB 1
-: A$ = "abc" : S = ( A$ = "abc" ) : GOSUB 1
-: A(1) = 234: S = ( A(1) = 234 ) : GOSUB 1
-: A$(1) = "bcd" : S = ( A$(1) = "bcd" ) : GOSUB 1
-
+: A = 123 : S = ( A = 123 ) : GOSUB 1
+: A$ = "abc" : S = ( A$ = "abc" ) : GOSUB 1
+: A(1) = 234: S = ( A(1) = 234 ) : GOSUB 1
+: A$(1) = "bcd" : S = ( A$(1) = "bcd" ) : GOSUB 1
+
1030 T$ = "Explicit LET"
-: LET A = 123 : S = ( A = 123 ) : GOSUB 1
-: LET A$ = "abc" : S = ( A$ = "abc" ) : GOSUB 1
-: LET A(1) = 234 : S = ( A(1) = 234 ) : GOSUB 1
-: LET A$(1) = "bcd" : S = ( A$(1) = "bcd" ) : GOSUB 1
-
+: LET A = 123 : S = ( A = 123 ) : GOSUB 1
+: LET A$ = "abc" : S = ( A$ = "abc" ) : GOSUB 1
+: LET A(1) = 234 : S = ( A(1) = 234 ) : GOSUB 1
+: LET A$(1) = "bcd" : S = ( A$(1) = "bcd" ) : GOSUB 1
+
1040 T$ = "DIM"
: DIM AR(12)
: FOR I = 0 TO 12 : AR(I) = I : NEXT
: T = 0 : U = 0
: FOR I = 0 TO 12 : T = T + I : U = U + AR(I) : NEXT
-: S = (T = U) : GOSUB 1
-
+: S = (T = U) : GOSUB 1
+
1050 T$ = "DEF FN"
-: DEF FN FA(X) = X+X : S = (FN FA(3) = 6) : GOSUB 1
-: DEF FN FB(X) = X*X : S = (FN FB(3) = 9) : GOSUB 1
-
-
-2000 PRINT : PRINT "Flow Control ";
-
-2010 T$ = "GOTO" : T = 1 : GOTO 2017 : T = T + 1
-2015 T = T + 1 : GOTO 2019 : T = T + 1
-2017 T = T + 1 : GOTO 2015
-2018 T = T + 1
-2019 S = (T=3) : GOSUB 1
-
-2020 T$ = "GOSUB/RETURN" : T = 1 : GOSUB 2025 : GOTO 2029
-2025 T = T + 1 : RETURN
-2029 S = (T=2) : GOSUB 1
-
-2030 T$ = "ON GOTO" : T = 1 : ON 2 GOTO 2031, 2032, 2033
-2031 T = T + 1
-2032 T = T + 1
-2033 T = T + 1
-2039 S = (T=3) : GOSUB 1
-
-2040 T$ = "ON GOSUB" : T = 1 : ON 2 GOSUB 2041, 2042, 2043 : GOTO 2049
-2041 T = T + 1 : RETURN
-2042 T = T + 2 : RETURN
-2043 T = T + 3 : RETURN
-2049 S = (T=3) : GOSUB 1
-
-2050 T$ = "POP" : T = 1 : GOSUB 2055 : T = T + 1 : GOTO 2059
-2055 T = T + 1 : GOSUB 2056 : T = T + 5
-2056 POP : T = T + 1 : RETURN
-2059 S = (T=4) : GOSUB 1
-
+: DEF FN FA(X) = X+X : S = (FN FA(3) = 6) : GOSUB 1
+: DEF FN FB(X) = X*X : S = (FN FB(3) = 9) : GOSUB 1
+
+
+2000 PRINT : PRINT "Flow Control ";
+
+2010 T$ = "GOTO" : T = 1 : GOTO 2017 : T = T + 1
+2015 T = T + 1 : GOTO 2019 : T = T + 1
+2017 T = T + 1 : GOTO 2015
+2018 T = T + 1
+2019 S = (T=3) : GOSUB 1
+
+2020 T$ = "GOSUB/RETURN" : T = 1 : GOSUB 2025 : GOTO 2029
+2025 T = T + 1 : RETURN
+2029 S = (T=2) : GOSUB 1
+
+2030 T$ = "ON GOTO" : T = 1 : ON 2 GOTO 2031, 2032, 2033
+2031 T = T + 1
+2032 T = T + 1
+2033 T = T + 1
+2039 S = (T=3) : GOSUB 1
+
+2040 T$ = "ON GOSUB" : T = 1 : ON 2 GOSUB 2041, 2042, 2043 : GOTO 2049
+2041 T = T + 1 : RETURN
+2042 T = T + 2 : RETURN
+2043 T = T + 3 : RETURN
+2049 S = (T=3) : GOSUB 1
+
+2050 T$ = "POP" : T = 1 : GOSUB 2055 : T = T + 1 : GOTO 2059
+2055 T = T + 1 : GOSUB 2056 : T = T + 5
+2056 POP : T = T + 1 : RETURN
+2059 S = (T=4) : GOSUB 1
+
2060 T$ = "FOR"
: T = 0 : FOR I = 1 TO 10 : T = T + I : NEXT
-: S = (T = 55) : GOSUB 1
+: S = (T = 55) : GOSUB 1
2061 T$ = "FOR STEP"
: T = 0 : FOR I = 1 TO 10 STEP 2 : T = T + I : NEXT
-: S = (T = 25) : GOSUB 1
+: S = (T = 25) : GOSUB 1
2062 T$ = "FOR STEP"
: T = 0 : FOR I = 10 TO 1 STEP -1 : T = T + I : NEXT
-: S = (T = 55) : GOSUB 1
+: S = (T = 55) : GOSUB 1
2063 T$ = "FOR STEP"
: T = 0 : FOR I = 10 TO 1 : T = T + I : NEXT
-: S = (T = 10) : GOSUB 1
-
+: S = (T = 10) : GOSUB 1
+
2070 T$ = "NEXT"
-: T = 0 : FOR I = 1 TO 10 : FOR J = 1 TO 10 : FOR K = 1 TO 10 : T = T + 1 : NEXT J, I
-: S = (T=100) : GOSUB 1
-
-2080 T$ = "IF THEN"
-: T = 1 : IF 0 THEN T = 2
-2081 S = (T=1) : GOSUB 1
-: T = 1 : IF 1 THEN T = 2 : T = 3
-2082 S = (T=3) : GOSUB 1
-
-2090 T$ = "IF GOTO"
-: T = 1 : IF 0 GOTO 2092 : T = 2
-2091 T = 3
-2092 S = (T=3) : GOSUB 1
-: T = 1 : IF 1 GOTO 2094 : T = 2
-2093 T = 3
-2094 S = (T=1) : GOSUB 1
-
-2100 T$ = "Empty String is False"
-: T = 1 : IF "" THEN T = 2
-2101 S = (T=1) : GOSUB 1
-
-2110 T$ = "Non-Empty String is True"
-: T = 1 : IF "abc" THEN T = 2
-2111 S = (T=2) : GOSUB 1
-
-
-3000 PRINT : PRINT "Error Handling ";
-
-3010 T$ = "ONERR GOTO"
+: T = 0 : FOR I = 1 TO 10 : FOR J = 1 TO 10 : FOR K = 1 TO 10 : T = T + 1 : NEXT J, I
+: S = (T=100) : GOSUB 1
+
+2080 T$ = "IF THEN"
+: T = 1 : IF 0 THEN T = 2
+2081 S = (T=1) : GOSUB 1
+: T = 1 : IF 1 THEN T = 2 : T = 3
+2082 S = (T=3) : GOSUB 1
+
+2090 T$ = "IF GOTO"
+: T = 1 : IF 0 GOTO 2092 : T = 2
+2091 T = 3
+2092 S = (T=3) : GOSUB 1
+: T = 1 : IF 1 GOTO 2094 : T = 2
+2093 T = 3
+2094 S = (T=1) : GOSUB 1
+
+2100 T$ = "Empty String is False"
+: T = 1 : IF "" THEN T = 2
+2101 S = (T=1) : GOSUB 1
+
+2110 T$ = "Non-Empty String is True"
+: T = 1 : IF "abc" THEN T = 2
+2111 S = (T=2) : GOSUB 1
+
+
+3000 PRINT : PRINT "Error Handling ";
+
+3010 T$ = "ONERR GOTO"
: T = 1 : ONERR GOTO 3015 : T = 1 / 0
-3011 T = 2
-3015 S = (T=1) : GOSUB 1
-
-3020 T$ = "RESUME"
-: T = 0 : ONERR GOTO 3025 : T = 1 / T : GOTO 3029
-3025 T = 1 : RESUME
-3029 S = (T=1) : GOSUB 1
-
-3040 T$ = "RETURN FROM LOOP"
+3011 T = 2
+3015 S = (T=1) : GOSUB 1
+
+3020 T$ = "RESUME"
+: T = 0 : ONERR GOTO 3025 : T = 1 / T : GOTO 3029
+3025 T = 1 : RESUME
+3029 S = (T=1) : GOSUB 1
+
+3040 T$ = "RETURN FROM LOOP"
: T = 1 : ONERR GOTO 3046
-: GOSUB 3045
-: GOTO 3048
-3045 FOR I = 1 TO 10 : RETURN
-3046 T = 2 : REM ONERR goes here
-3048 S = (T=1) : GOSUB 1
-
-3100 T$ = "NEXT WITHOUT FOR"
-: T = 1 : ONERR GOTO 3101
-: NEXT
-: T = 2
-3101 S = (T=1) AND (PEEK(222)=0) : GOSUB 1
-
-3110 T$ = "SYNTAX ERROR" : REM Compile time only, can't test!
-
-3120 T$ = "RETURN WITHOUT GOSUB"
-: T = 1 : ONERR GOTO 3121
-: RETURN
-: T = 2
-3121 S = (T=1) AND (PEEK(222)=22) : GOSUB 1
-
-3130 T$ = "OUT OF DATA"
-: T = 1 : ONERR GOTO 3131
-: FOR A = 1 TO 1000 : READ A$ : NEXT
-: T = 2
-3131 S = (T=1) AND (PEEK(222)=42) : GOSUB 1
-
-3140 T$ = "ILLEGAL QUANTITY"
-: T = 1 : ONERR GOTO 3141
-: A% = 32768
-: T = 2
-3141 S = (T=1) AND (PEEK(222)=53) : GOSUB 1
-
-3145 T$ = "ILLEGAL QUANTITY"
-: T = 1 : ONERR GOTO 3146
-: A = ASC("")
-: T = 2
-3146 S = (T=1) AND (PEEK(222)=53) : GOSUB 1
-
+: GOSUB 3045
+: GOTO 3048
+3045 FOR I = 1 TO 10 : RETURN
+3046 T = 2 : REM ONERR goes here
+3048 S = (T=1) : GOSUB 1
+
+3100 T$ = "NEXT WITHOUT FOR"
+: T = 1 : ONERR GOTO 3101
+: NEXT
+: T = 2
+3101 S = (T=1) AND (PEEK(222)=0) : GOSUB 1
+
+3110 T$ = "SYNTAX ERROR" : REM Compile time only, can't test!
+
+3120 T$ = "RETURN WITHOUT GOSUB"
+: T = 1 : ONERR GOTO 3121
+: RETURN
+: T = 2
+3121 S = (T=1) AND (PEEK(222)=22) : GOSUB 1
+
+3130 T$ = "OUT OF DATA"
+: T = 1 : ONERR GOTO 3131
+: FOR A = 1 TO 1000 : READ A$ : NEXT
+: T = 2
+3131 S = (T=1) AND (PEEK(222)=42) : GOSUB 1
+
+3140 T$ = "ILLEGAL QUANTITY"
+: T = 1 : ONERR GOTO 3141
+: A% = 32768
+: T = 2
+3141 S = (T=1) AND (PEEK(222)=53) : GOSUB 1
+
+3145 T$ = "ILLEGAL QUANTITY"
+: T = 1 : ONERR GOTO 3146
+: A = ASC("")
+: T = 2
+3146 S = (T=1) AND (PEEK(222)=53) : GOSUB 1
+
3150 T$ = "OVERFLOW" :
-: T = 1 : ONERR GOTO 3151
-: A = 256^256^256
-: T = 2
-3151 S = (T=1) AND (PEEK(222)=69) : GOSUB 1
-
-3160 T$ = "OUT OF MEMORY" : REM Not consistent enough across browsers
-: REM T = 1 : ONERR GOTO 3161
-: REM A$ = "x"
+: T = 1 : ONERR GOTO 3151
+: A = 256^256^256
+: T = 2
+3151 S = (T=1) AND (PEEK(222)=69) : GOSUB 1
+
+3160 T$ = "OUT OF MEMORY" : REM Not consistent enough across browsers
+: REM T = 1 : ONERR GOTO 3161
+: REM A$ = "x"
: REM FOR I = 0 TO 1 STEP 0 : A$ = A$ + A$ : NEXT
-: REM T = 2
-3161 REM S = (T=1) AND (PEEK(222)=77) : GOSUB 1
-
+: REM T = 2
+3161 REM S = (T=1) AND (PEEK(222)=77) : GOSUB 1
+
3170 T$ = "UNDEFINED STATEMENT" :
-: T = 1 : ONERR GOTO 3171
-: GOTO 3172
-: T = 2
-3171 S = (T=1) AND (PEEK(222)=90) : GOSUB 1
-
+: T = 1 : ONERR GOTO 3171
+: GOTO 3172
+: T = 2
+3171 S = (T=1) AND (PEEK(222)=90) : GOSUB 1
+
3180 T$ = "BAD SUBSCRIPT" :
-: T = 1 : ONERR GOTO 3181
-: DIM BS(3) : BS(4) = 123
-: T = 2
-3181 S = (T=1) AND (PEEK(222)=107) : GOSUB 1
-
+: T = 1 : ONERR GOTO 3181
+: DIM BS(3) : BS(4) = 123
+: T = 2
+3181 S = (T=1) AND (PEEK(222)=107) : GOSUB 1
+
3190 T$ = "REDIMENSION ARRAY" :
-: T = 1 : ONERR GOTO 3191
-: DIM RA(3) : DIM RA(3)
-: T = 2
-3191 S = (T=1) AND (PEEK(222)=120) : GOSUB 1
-
+: T = 1 : ONERR GOTO 3191
+: DIM RA(3) : DIM RA(3)
+: T = 2
+3191 S = (T=1) AND (PEEK(222)=120) : GOSUB 1
+
3200 T$ = "DIVISION BY ZERO" :
-: T = 1 : ONERR GOTO 3201
-: A = 1 / 0
-: T = 2
-3201 S = (T=1) AND (PEEK(222)=133) : GOSUB 1
-
+: T = 1 : ONERR GOTO 3201
+: A = 1 / 0
+: T = 2
+3201 S = (T=1) AND (PEEK(222)=133) : GOSUB 1
+
3210 T$ = "TYPE MISMATCH" :
-: T = 1 : ONERR GOTO 3211
-: RESTORE : FOR I = 1 TO 1000 : READ A : NEXT
-: T = 2
-3211 S = (T=1) AND (PEEK(222)=163) : GOSUB 1
-
+: T = 1 : ONERR GOTO 3211
+: RESTORE : FOR I = 1 TO 1000 : READ A : NEXT
+: T = 2
+3211 S = (T=1) AND (PEEK(222)=163) : GOSUB 1
+
3215 T$ = "TYPE MISMATCH" :
-: T = 1 : ONERR GOTO 3216
-: RESTORE : FOR I = 1 TO 1000 : READ A% : NEXT
-: T = 2
-3216 S = (T=1) AND (PEEK(222)=163) : GOSUB 1
-
-3220 T$ = "STRING TOO LONG" : REM Strings are "infinite", can't test
-
-3230 T$ = "FORMULA TOO COMPLEX"
-: REM T = 1 : ONERR GOTO 3231
-: REM DEF FN FC(x) = FN FC(x) + 1 : X = FN FC(0)
-: REM T = 2
-3231 REM S = (T=1) AND (PEEK(222)=191): GOSUB 1
-
+: T = 1 : ONERR GOTO 3216
+: RESTORE : FOR I = 1 TO 1000 : READ A% : NEXT
+: T = 2
+3216 S = (T=1) AND (PEEK(222)=163) : GOSUB 1
+
+3220 T$ = "STRING TOO LONG" : REM Strings are "infinite", can't test
+
+3230 T$ = "FORMULA TOO COMPLEX"
+: REM T = 1 : ONERR GOTO 3231
+: REM DEF FN FC(x) = FN FC(x) + 1 : X = FN FC(0)
+: REM T = 2
+3231 REM S = (T=1) AND (PEEK(222)=191): GOSUB 1
+
3240 T$ = "UNDEFINED FUNCTION" :
-: T = 1 : ONERR GOTO 3241
-: X = FN UF(0)
-: T = 2
-3241 S = (T=1) AND (PEEK(222)=224) : GOSUB 1
-
-3250 T$ = "RE-ENTER" : REM Can't test until input can be synthesized
-
+: T = 1 : ONERR GOTO 3241
+: X = FN UF(0)
+: T = 2
+3241 S = (T=1) AND (PEEK(222)=224) : GOSUB 1
+
+3250 T$ = "RE-ENTER" : REM Can't test until input can be synthesized
+
3260 T$ = "BREAK" :
-: T = 1 : ONERR GOTO 3261
-: STOP
-: T = 2
-3261 S = (T=1) AND (PEEK(222)=255) : GOSUB 1
-
-
-
-3999 POKE 216,0 : REM Disable ONERR handler
-
-
-
-4000 PRINT : PRINT "Input/Output ";
-: PRINT "UNIT TESTS NOT FULLY IMPLEMENTED ";
-
-4010 REM **********************************************
-4010 REM Do I/O as a follow-on module and introduce
-4010 REM a non-standard screen-scraping function
-4010 REM **********************************************
-
-4010 REM **********************************************
-4010 REM Test TRACE/NOTRACE as part of I/O functions
-4010 REM **********************************************
-
-
-
+: T = 1 : ONERR GOTO 3261
+: STOP
+: T = 2
+3261 S = (T=1) AND (PEEK(222)=255) : GOSUB 1
+
+3270 T$ = "CALL-3288" :
+: T = 1 : ONERR GOTO 3274
+3271 GOSUB 3272
+: T = T + 1
+: GOTO 3275
+3272 X = FN UF(0)
+: T = 10
+3274 CALL -3288
+: T = T + 1
+: RETURN
+3275 S = (T=3) : GOSUB 1
+
+
+3999 POKE 216,0 : REM Disable ONERR handler
+
+
+
+4000 PRINT : PRINT "Input/Output ";
+: PRINT "UNIT TESTS NOT FULLY IMPLEMENTED ";
+
+4010 REM **********************************************
+4010 REM Do I/O as a follow-on module and introduce
+4010 REM a non-standard screen-scraping function
+4010 REM **********************************************
+
+4010 REM **********************************************
+4010 REM Test TRACE/NOTRACE as part of I/O functions
+4010 REM **********************************************
+
+
+
4100 T$ = "HTAB" :
-: SX = PEEK(36) : SY = PEEK(37)
-: HTAB 10 : T = PEEK(36)
-: POKE 36, SX : POKE 37, SY
-: S = (T = 10 - 1) : GOSUB 1
-
+: SX = PEEK(36) : SY = PEEK(37)
+: HTAB 10 : T = PEEK(36)
+: POKE 36, SX : POKE 37, SY
+: S = (T = 10 - 1) : GOSUB 1
+
4110 T$ = "VTAB" :
-: SX = PEEK(36) : SY = PEEK(37)
-: VTAB 10 : T = PEEK(37)
-: POKE 36, SX : POKE 37, SY
-: S = (T = 10 - 1) : GOSUB 1
-
+: SX = PEEK(36) : SY = PEEK(37)
+: VTAB 10 : T = PEEK(37)
+: POKE 36, SX : POKE 37, SY
+: S = (T = 10 - 1) : GOSUB 1
+
4120 T$ = "Comma Operator" :
-: SX = PEEK(36) : SY = PEEK(37)
-: VTAB 23 : HTAB 1 : PRINT 1, : T = PEEK(36)
-: VTAB 23 : HTAB 1 : PRINT SPC(40);
-: POKE 36, SX : POKE 37, SY
-: S = (T = 16) : GOSUB 1
-
+: SX = PEEK(36) : SY = PEEK(37)
+: VTAB 23 : HTAB 1 : PRINT 1, : T = PEEK(36)
+: VTAB 23 : HTAB 1 : PRINT SPC(40);
+: POKE 36, SX : POKE 37, SY
+: S = (T = 16) : GOSUB 1
+
4130 T$ = "Semicolon Operator" :
-: SX = PEEK(36) : SY = PEEK(37)
-: VTAB 23 : HTAB 1 : PRINT "abc"; : T = PEEK(36)
-: VTAB 23 : HTAB 1 : PRINT SPC(40);
-: POKE 36, SX : POKE 37, SY
-: S = (T = 3) : GOSUB 1
-
+: SX = PEEK(36) : SY = PEEK(37)
+: VTAB 23 : HTAB 1 : PRINT "abc"; : T = PEEK(36)
+: VTAB 23 : HTAB 1 : PRINT SPC(40);
+: POKE 36, SX : POKE 37, SY
+: S = (T = 3) : GOSUB 1
+
4140 T$ = "SPC Operator" :
-: SX = PEEK(36) : SY = PEEK(37)
-: VTAB 23 : HTAB 1 : PRINT "abc";SPC(10); : T = PEEK(36)
-: VTAB 23 : HTAB 1 : PRINT SPC(40);
-: POKE 36, SX : POKE 37, SY
-: S = (T = 13) : GOSUB 1
-
+: SX = PEEK(36) : SY = PEEK(37)
+: VTAB 23 : HTAB 1 : PRINT "abc";SPC(10); : T = PEEK(36)
+: VTAB 23 : HTAB 1 : PRINT SPC(40);
+: POKE 36, SX : POKE 37, SY
+: S = (T = 13) : GOSUB 1
+
4150 T$ = "TAB Operator" :
-: SX = PEEK(36) : SY = PEEK(37)
-: VTAB 23 : HTAB 1 : PRINT "abc";TAB(10); : T = PEEK(36)
-: VTAB 23 : HTAB 1 : PRINT SPC(40);
-: POKE 36, SX : POKE 37, SY
-: S = (T = 9) : GOSUB 1
-
-
-
-
-5000 PRINT : PRINT "Miscellaneous ";
-
-5010 T$ = "REM" : T = 1 : REM T = 2 : T = 3
-5011 S = (T=1) : GOSUB 1
-
-
-
-6000 PRINT : PRINT "Inline Data ";
-
-6010 DATA 1,2,3
-6011 DATA "A","B","C"
-
-6010 T$ = "READ"
-: RESTORE
-: READ T : S = (T=1) : GOSUB 1
-: READ T,U : S = (T=2 AND U=3) : GOSUB 1
-: READ A$ : S = (A$="A") : GOSUB 1
-: READ A$,B$ : S = (A$="B" AND B$="C") : GOSUB 1
-
-6020 T$ = "RESTORE" : RESTORE
-: READ T : S = (T=1) : GOSUB 1
-: READ T,U : S = (T=2 AND U=3) : GOSUB 1
-: READ A$ : S = (A$="A") : GOSUB 1
-: READ A$,B$ : S = (A$="B" AND B$="C") : GOSUB 1
-
-
-7000 PRINT : PRINT "Lo-Res Graphics ";
-7001 IF NOT LR THEN PRINT "" : GOTO 8000
-
-7010 REM ************************************************************
-7010 REM Test GR as part of I/O (sets cursor to window bottom)
-7010 REM ************************************************************
-
-7010 POKE 49232,0 : POKE 49234,0 : POKE 49238,0
-
-7020 T$ = "COLOR="
-: T = 0 : U = 0 : FOR I = 0 TO 15 : COLOR= I : PLOT 0,0 : T = T + I : U = U + SCRN(0,0) : NEXT
-: S = (T=U) : GOSUB 1
-
-7030 T$ = "PLOT"
+: SX = PEEK(36) : SY = PEEK(37)
+: VTAB 23 : HTAB 1 : PRINT "abc";TAB(10); : T = PEEK(36)
+: VTAB 23 : HTAB 1 : PRINT SPC(40);
+: POKE 36, SX : POKE 37, SY
+: S = (T = 9) : GOSUB 1
+
+
+
+
+5000 PRINT : PRINT "Miscellaneous ";
+
+5010 T$ = "REM" : T = 1 : REM T = 2 : T = 3
+5011 S = (T=1) : GOSUB 1
+
+
+
+6000 PRINT : PRINT "Inline Data ";
+
+6010 DATA 1,2,3
+6011 DATA "A","B","C"
+
+6010 T$ = "READ"
+: RESTORE
+: READ T : S = (T=1) : GOSUB 1
+: READ T,U : S = (T=2 AND U=3) : GOSUB 1
+: READ A$ : S = (A$="A") : GOSUB 1
+: READ A$,B$ : S = (A$="B" AND B$="C") : GOSUB 1
+
+6020 T$ = "RESTORE" : RESTORE
+: READ T : S = (T=1) : GOSUB 1
+: READ T,U : S = (T=2 AND U=3) : GOSUB 1
+: READ A$ : S = (A$="A") : GOSUB 1
+: READ A$,B$ : S = (A$="B" AND B$="C") : GOSUB 1
+
+
+7000 PRINT : PRINT "Lo-Res Graphics ";
+7001 IF NOT LR THEN PRINT "" : GOTO 8000
+
+7010 REM ************************************************************
+7010 REM Test GR as part of I/O (sets cursor to window bottom)
+7010 REM ************************************************************
+
+7010 POKE 49232,0 : POKE 49234,0 : POKE 49238,0
+
+7020 T$ = "COLOR="
+: T = 0 : U = 0 : FOR I = 0 TO 15 : COLOR= I : PLOT 0,0 : T = T + I : U = U + SCRN(0,0) : NEXT
+: S = (T=U) : GOSUB 1
+
+7030 T$ = "PLOT"
: COLOR= 5 : PLOT 0,0 : PLOT 39,0 : PLOT 0,47 : PLOT 39,47
: COLOR= 6 : PLOT 0,0 : PLOT 39,0 : PLOT 0,47 : PLOT 39,47
-: S = (SCRN(0,0)=6 AND SCRN(39,0)=6 AND SCRN(0,47)=6 AND SCRN(39,47)=6) : GOSUB 1
-
-7040 T$ = "HLIN"
-: COLOR= 0 : FOR Y = 0 TO 5: FOR X = 0 TO 10 : PLOT X,Y : NEXT : NEXT
-: FOR I = 1 TO 5 : COLOR= I : HLIN I,10-I AT I : NEXT
-: T = 0 : FOR Y = 0 TO 5: FOR X = 0 TO 10 : T = T + SCRN(X,Y) : NEXT : NEXT
-: S = (T=55) : GOSUB 1
-
-7050 T$ = "VLIN"
-: COLOR= 0 : FOR Y = 0 TO 10: FOR X = 0 TO 5 : PLOT X,Y : NEXT : NEXT
-: FOR I = 1 TO 5 : COLOR= I : VLIN I,10-I AT I : NEXT
-: T = 0 : FOR Y = 0 TO 10: FOR X = 0 TO 5 : T = T + SCRN(X,Y) : NEXT : NEXT
-: S = (T=55) : GOSUB 1
-
+: S = (SCRN(0,0)=6 AND SCRN(39,0)=6 AND SCRN(0,47)=6 AND SCRN(39,47)=6) : GOSUB 1
+
+7040 T$ = "HLIN"
+: COLOR= 0 : FOR Y = 0 TO 5: FOR X = 0 TO 10 : PLOT X,Y : NEXT : NEXT
+: FOR I = 1 TO 5 : COLOR= I : HLIN I,10-I AT I : NEXT
+: T = 0 : FOR Y = 0 TO 5: FOR X = 0 TO 10 : T = T + SCRN(X,Y) : NEXT : NEXT
+: S = (T=55) : GOSUB 1
+
+7050 T$ = "VLIN"
+: COLOR= 0 : FOR Y = 0 TO 10: FOR X = 0 TO 5 : PLOT X,Y : NEXT : NEXT
+: FOR I = 1 TO 5 : COLOR= I : VLIN I,10-I AT I : NEXT
+: T = 0 : FOR Y = 0 TO 10: FOR X = 0 TO 5 : T = T + SCRN(X,Y) : NEXT : NEXT
+: S = (T=55) : GOSUB 1
+
: COLOR= 6 : PLOT 0,0 : PLOT 39,0 : PLOT 0,47 : PLOT 39,47
-: S = (SCRN(0,0)=6 AND SCRN(39,0)=6 AND SCRN(0,47)=6 AND SCRN(39,47)=6) : GOSUB 1
-
-7900 REM Something memorable
-7910 FOR I = 0 TO 15
-: COLOR= I
-: HLIN I, 39-I AT I
-: HLIN I, 39-I AT 39 - I
-: VLIN I, 39-I AT I
-: VLIN I, 39-I AT 39 - I
-: NEXT
-
-7999 TEXT
-8000 PRINT : PRINT "Hi-Res Graphics ";
-8001 IF NOT HR THEN PRINT "" : GOTO 9000
-
-8020 T$ = "HCOLOR="
-: HGR
-: T = 0 : U = 0 : FOR I = 0 TO 7 : HCOLOR= I : HPLOT 0,0 : T = T + I : U = U + HSCRN(0,0) : NEXT
-: S = (T=U) : GOSUB 1
-
-8030 T$ = "HPLOT"
-: HGR
+: S = (SCRN(0,0)=6 AND SCRN(39,0)=6 AND SCRN(0,47)=6 AND SCRN(39,47)=6) : GOSUB 1
+
+7900 REM Something memorable
+7910 FOR I = 0 TO 15
+: COLOR= I
+: HLIN I, 39-I AT I
+: HLIN I, 39-I AT 39 - I
+: VLIN I, 39-I AT I
+: VLIN I, 39-I AT 39 - I
+: NEXT
+
+7999 TEXT
+8000 PRINT : PRINT "Hi-Res Graphics ";
+8001 IF NOT HR THEN PRINT "" : GOTO 9000
+
+8020 T$ = "HCOLOR="
+: HGR
+: T = 0 : U = 0 : FOR I = 0 TO 7 : HCOLOR= I : HPLOT 0,0 : T = T + I : U = U + HSCRN(0,0) : NEXT
+: S = (T=U) : GOSUB 1
+
+8030 T$ = "HPLOT"
+: HGR
: HCOLOR= 5 : HPLOT 0,0 : HPLOT 39,0 : HPLOT 0,47 : HPLOT 39,47
: HCOLOR= 6 : HPLOT 0,0 : HPLOT 39,0 : HPLOT 0,47 : HPLOT 39,47
-: S = (HSCRN(0,0)=6 AND HSCRN(39,0)=6 AND HSCRN(0,47)=6 AND HSCRN(39,47)=6) : GOSUB 1
-
-8040 T$ = "HPLOT x1,y1 TO x2,y2"
-: HGR
-: FOR Y = 0 TO 7: HCOLOR= Y : HPLOT 0,Y TO 7,Y: NEXT
-: T = 0 : U = 0 : FOR I = 0 TO 7 : T = T + HSCRN(I,I) : U = U + I : NEXT
-: S = (T=U) : GOSUB 1
-
-8050 T$ = "HPLOT TO x2,y2"
-: HGR
-: FOR X = 0 TO 7: HCOLOR= X : HPLOT X*2,0 : HPLOT TO X*2,7 : NEXT
-: T = 0 : U = 0 : FOR I = 0 TO 7 : T = T + HSCRN(I*2,I) : U = U + I : NEXT
-: S = (T=U) : GOSUB 1
-
-8100 REM Visual Check
-
-8110 HGR
-
-8120 T$ = "HCOLOR="
-: T = 0 : U = 0 : FOR I = 0 TO 7 : HCOLOR= I : HPLOT 0,0 : T = T + I : NEXT
-
-8130 T$ = "HPLOT x,y"
-: HCOLOR= 3 : HPLOT 0,0 : HPLOT 279,0 : HPLOT 0,191 : HPLOT 279,191
-
-8140 T$ = "HPLOT TO x,y"
-: HCOLOR= 2 : HPLOT 10,10 : HPLOT TO 269,10 : HPLOT TO 269,181 : HPLOT TO 10,181 : HPLOT TO 10,10
-
-8150 T$ = "HPLOT x,y TO x,y"
-: HCOLOR= 1 : HPLOT 20,20 TO 259,20 : HPLOT 259,20 TO 259,171 : HPLOT 259,171 TO 20,171 : HPLOT 20,171 TO 20,20
-
-8160 T$ = "HPLOT x,y TO x,y TO x,y"
-: HCOLOR= 5 : HPLOT 30,30 TO 249,30 TO 249,161 TO 30,161 TO 30,30
-
-8200 HGR : REM Something visually memorable
-
-8210 W = 279 : H = 159
-8220 FOR I = 0 TO 1 STEP 0.05
-8230 HCOLOR= 1 : HPLOT 0,H * I TO W* (1-I),0
-8231 HCOLOR= 2 : HPLOT 0,H * (1-I) TO W* (1-I),H
-8232 HCOLOR= 5 : HPLOT W,H * I TO W * I,0
-8233 HCOLOR= 6 : HPLOT W,H * (1-I) TO W * I,H
-8234 NEXT
-
-8999 TEXT
-
-
-
-9000 PRINT : PRINT "POKE Compatibility Shims ";
-: PRINT "UNIT TESTS NOT YET IMPLEMENTED ";
-9001 POKE 49168,0 : POKE -16368,0 : REM Clear kbd strobe
-9002 POKE 49200,0 : POKE -16336,0 : REM Toggle speaker
-9003 POKE 49232,0 : POKE -16304,0 : REM Graphics mode
-9004 POKE 49234,0 : POKE -16302,0 : REM Full graphics mode
-9005 POKE 49235,0 : POKE -16301,0 : REM Split screen mode
-9006 POKE 49238,0 : POKE -16298,0 : REM Lores mode
-9007 POKE 49239,0 : POKE -16297,0 : REM Hires mode
-9008 POKE 49233,0 : POKE -16303,0 : REM Text mode
-9009 SPEED= 0 : SPEED= 255 : REM SPEED= (no-op)
-
-10000 PRINT : PRINT "Numeric Functions ";
-10001 DEF FN E(X) = ABS(X) < 0.001 : REM Within-Epsilon
-
-10010 T$ = "ABS()"
-: S = (ABS(1) = 1) : GOSUB 1
-: S = (ABS(-1) = 1) : GOSUB 1
-: S = (ABS(0) = 0) : GOSUB 1
-
+: S = (HSCRN(0,0)=6 AND HSCRN(39,0)=6 AND HSCRN(0,47)=6 AND HSCRN(39,47)=6) : GOSUB 1
+
+8040 T$ = "HPLOT x1,y1 TO x2,y2"
+: HGR
+: FOR Y = 0 TO 7: HCOLOR= Y : HPLOT 0,Y TO 7,Y: NEXT
+: T = 0 : U = 0 : FOR I = 0 TO 7 : T = T + HSCRN(I,I) : U = U + I : NEXT
+: S = (T=U) : GOSUB 1
+
+8050 T$ = "HPLOT TO x2,y2"
+: HGR
+: FOR X = 0 TO 7: HCOLOR= X : HPLOT X*2,0 : HPLOT TO X*2,7 : NEXT
+: T = 0 : U = 0 : FOR I = 0 TO 7 : T = T + HSCRN(I*2,I) : U = U + I : NEXT
+: S = (T=U) : GOSUB 1
+
+8100 REM Visual Check
+
+8110 HGR
+
+8120 T$ = "HCOLOR="
+: T = 0 : U = 0 : FOR I = 0 TO 7 : HCOLOR= I : HPLOT 0,0 : T = T + I : NEXT
+
+8130 T$ = "HPLOT x,y"
+: HCOLOR= 3 : HPLOT 0,0 : HPLOT 279,0 : HPLOT 0,191 : HPLOT 279,191
+
+8140 T$ = "HPLOT TO x,y"
+: HCOLOR= 2 : HPLOT 10,10 : HPLOT TO 269,10 : HPLOT TO 269,181 : HPLOT TO 10,181 : HPLOT TO 10,10
+
+8150 T$ = "HPLOT x,y TO x,y"
+: HCOLOR= 1 : HPLOT 20,20 TO 259,20 : HPLOT 259,20 TO 259,171 : HPLOT 259,171 TO 20,171 : HPLOT 20,171 TO 20,20
+
+8160 T$ = "HPLOT x,y TO x,y TO x,y"
+: HCOLOR= 5 : HPLOT 30,30 TO 249,30 TO 249,161 TO 30,161 TO 30,30
+
+8200 HGR : REM Something visually memorable
+
+8210 W = 279 : H = 159
+8220 FOR I = 0 TO 1 STEP 0.05
+8230 HCOLOR= 1 : HPLOT 0,H * I TO W* (1-I),0
+8231 HCOLOR= 2 : HPLOT 0,H * (1-I) TO W* (1-I),H
+8232 HCOLOR= 5 : HPLOT W,H * I TO W * I,0
+8233 HCOLOR= 6 : HPLOT W,H * (1-I) TO W * I,H
+8234 NEXT
+
+8999 TEXT
+
+
+
+9000 PRINT : PRINT "POKE Compatibility Shims ";
+: PRINT "UNIT TESTS NOT YET IMPLEMENTED ";
+9001 POKE 49168,0 : POKE -16368,0 : REM Clear kbd strobe
+9002 POKE 49200,0 : POKE -16336,0 : REM Toggle speaker
+9003 POKE 49232,0 : POKE -16304,0 : REM Graphics mode
+9004 POKE 49234,0 : POKE -16302,0 : REM Full graphics mode
+9005 POKE 49235,0 : POKE -16301,0 : REM Split screen mode
+9006 POKE 49238,0 : POKE -16298,0 : REM Lores mode
+9007 POKE 49239,0 : POKE -16297,0 : REM Hires mode
+9008 POKE 49233,0 : POKE -16303,0 : REM Text mode
+9009 SPEED= 0 : SPEED= 255 : REM SPEED= (no-op)
+
+10000 PRINT : PRINT "Numeric Functions ";
+10001 DEF FN E(X) = ABS(X) < 0.001 : REM Within-Epsilon
+
+10010 T$ = "ABS()"
+: S = (ABS(1) = 1) : GOSUB 1
+: S = (ABS(-1) = 1) : GOSUB 1
+: S = (ABS(0) = 0) : GOSUB 1
+
10020 T$ = "ATN()"
-: S = FN E(ATN(0) - 0.000) : GOSUB 1
-: S = FN E(ATN(1) - 0.785) : GOSUB 1
-: S = FN E(ATN(2) - 1.107) : GOSUB 1
-
-10030 T$ = "COS()"
-: S = FN E(COS(0) - 1.000) : GOSUB 1
-: S = FN E(COS(1) - 0.540) : GOSUB 1
-: S = FN E(COS(2) - -0.416) : GOSUB 1
-
-10040 T$ = "EXP()"
-: S = FN E(EXP(0) - 1.000) : GOSUB 1
-: S = FN E(EXP(1) - 2.718) : GOSUB 1
-: S = FN E(EXP(2) - 7.389) : GOSUB 1
-
-10050 T$ = "INT()"
-: S = (INT(1) = 1) : GOSUB 1
-: S = (INT(1.5) = 1) : GOSUB 1
-: S = (INT(-1.5) = -2) : GOSUB 1
-
-10060 T$ = "LOG()"
-: S = FN E(LOG(1) - 0.000) : GOSUB 1
-: S = FN E(LOG(2) - 0.693) : GOSUB 1
-: S = FN E(LOG(3) - 1.098) : GOSUB 1
-
-10070 T$ = "RND()"
-: T = RND(1) : S = (FN E(T - RND(0))) : GOSUB 1
-: T = RND(-1) : T = RND(1) : U = RND(-1) : U = RND(1) : S = (FN E(T - U)) : GOSUB 1
-
-10080 T$ = "SGN()"
-: S = (SGN(-123)=-1): GOSUB 1
-: S = (SGN( 0)= 0): GOSUB 1
-: S = (SGN( 123)= 1): GOSUB 1
-
-10090 T$ = "SIN()"
-: S = FN E(SIN(0) - 0.000) : GOSUB 1
-: S = FN E(SIN(1) - 0.841) : GOSUB 1
-: S = FN E(SIN(2) - 0.909) : GOSUB 1
-
-10100 T$ = "SQR()"
-: S = FN E(SQR(0) - 0.000) : GOSUB 1
-: S = FN E(SQR(1) - 1.000) : GOSUB 1
-: S = FN E(SQR(2) - 1.414) : GOSUB 1
-
-10110 T$ = "TAN()"
-: S = FN E(TAN(0) - 0.000) : GOSUB 1
-: S = FN E(TAN(1) - 1.557) : GOSUB 1
-: S = FN E(TAN(2) --2.185) : GOSUB 1
-
-
-11000 PRINT : PRINT "String Functions ";
-
-11010 T$ = "LEN()"
-: S = (LEN("ABC") = 3) : GOSUB 1
-: S = (LEN("") = 0) : GOSUB 1
-
-11020 T$ = "LEFT$()"
-: S = (LEFT$("ABC",0) = "") : GOSUB 1
-: S = (LEFT$("ABC",2) = "AB") : GOSUB 1
-: S = (LEFT$("ABC",4) = "ABC") : GOSUB 1
-
-11030 T$ = "MID$()"
-: S = (MID$("ABCD",2,2) = "BC") : GOSUB 1
-: S = (MID$("ABCD",3) = "CD") : GOSUB 1
-: S = (MID$("ABCD",4,3) = "D") : GOSUB 1
-
-11040 T$ = "RIGHT$()"
-: S = (RIGHT$("ABC",0) = "") : GOSUB 1
-: S = (RIGHT$("ABC",2) = "BC") : GOSUB 1
-: S = (RIGHT$("ABC",4) = "ABC") : GOSUB 1
-
-
-12000 PRINT : PRINT "Type Conversion Functions ";
-
-12010 T$ = "ASC()"
-: S = (ASC(" ") = 32) : GOSUB 1
-: S = (ASC("A") = 65) : GOSUB 1
-: S = (ASC("z") = 122) : GOSUB 1
-: S = (ASC(CHR$(4)) = 4) : GOSUB 1
-
-12020 T$ = "CHR$()"
-: S = (CHR$(32) = " ") : GOSUB 1
-: S = (CHR$(65) = "A") : GOSUB 1
-: S = (CHR$(122) = "z") : GOSUB 1
-
-12030 T$ = "STR$()"
-: S = (STR$(-1) = "-1") : GOSUB 1
-: S = (STR$(1.5) = "1.5") : GOSUB 1
-: S = (STR$(3.1415) = "3.1415") : GOSUB 1
-: S = (VAL(STR$(3.1415)) = 3.1415) : GOSUB 1
-
-12040 T$ = "VAL()"
-: S = (VAL("-1") = -1) : GOSUB 1
-: S = (VAL("1.5") = 1.5) : GOSUB 1
-: S = (VAL("3.1415") = 3.1415) : GOSUB 1
-
-
-13000 PRINT : PRINT "System Interaction Functions ";
-
-13010 T$ = "FRE()"
-: S = (FRE(0) OR 1) : GOSUB 1
-
-13020 IF NOT PD THEN PRINT ""; : GOTO 13030
-13021 T$ = "PDL()"
-: T = PDL(0) : S = (0 <= T) AND (T < 256) : GOSUB 1
-
-13030 T$ = "POS()"
-: T = POS(0) : HTAB 1 : S = (POS(0) = 0) : HTAB T + 1 : GOSUB 1
-
-13040 IF NOT LR THEN PRINT ""; : GOTO 13050
-13041 T$ = "SCRN()"
-: T = 0 : FOR I = 0 TO 15 : COLOR= I : PLOT I,I : T = T + I : NEXT
-: U = 0 : FOR I = 0 TO 15 : U = U + SCRN(I,I) : NEXT
-: S = (T=U) : GOSUB 1
-
-13050 IF NOT HR THEN PRINT ""; : GOTO 13060
-13051 T$ = "HSCRN()"
-: T = 0 : FOR I = 0 TO 7 : HCOLOR= I : HPLOT I,I : T = T + I : NEXT
-: U = 0 : FOR I = 0 TO 7 : U = U + HSCRN(I,I) : NEXT
-: S = (T=U) : GOSUB 1
-
-13060 REM (goto target)
-
-14000 PRINT : PRINT "User Defined Functions ";
-
+: S = FN E(ATN(0) - 0.000) : GOSUB 1
+: S = FN E(ATN(1) - 0.785) : GOSUB 1
+: S = FN E(ATN(2) - 1.107) : GOSUB 1
+
+10030 T$ = "COS()"
+: S = FN E(COS(0) - 1.000) : GOSUB 1
+: S = FN E(COS(1) - 0.540) : GOSUB 1
+: S = FN E(COS(2) - -0.416) : GOSUB 1
+
+10040 T$ = "EXP()"
+: S = FN E(EXP(0) - 1.000) : GOSUB 1
+: S = FN E(EXP(1) - 2.718) : GOSUB 1
+: S = FN E(EXP(2) - 7.389) : GOSUB 1
+
+10050 T$ = "INT()"
+: S = (INT(1) = 1) : GOSUB 1
+: S = (INT(1.5) = 1) : GOSUB 1
+: S = (INT(-1.5) = -2) : GOSUB 1
+
+10060 T$ = "LOG()"
+: S = FN E(LOG(1) - 0.000) : GOSUB 1
+: S = FN E(LOG(2) - 0.693) : GOSUB 1
+: S = FN E(LOG(3) - 1.098) : GOSUB 1
+
+10070 T$ = "RND()"
+: T = RND(1) : S = (FN E(T - RND(0))) : GOSUB 1
+: T = RND(-1) : T = RND(1) : U = RND(-1) : U = RND(1) : S = (FN E(T - U)) : GOSUB 1
+
+10080 T$ = "SGN()"
+: S = (SGN(-123)=-1): GOSUB 1
+: S = (SGN( 0)= 0): GOSUB 1
+: S = (SGN( 123)= 1): GOSUB 1
+
+10090 T$ = "SIN()"
+: S = FN E(SIN(0) - 0.000) : GOSUB 1
+: S = FN E(SIN(1) - 0.841) : GOSUB 1
+: S = FN E(SIN(2) - 0.909) : GOSUB 1
+
+10100 T$ = "SQR()"
+: S = FN E(SQR(0) - 0.000) : GOSUB 1
+: S = FN E(SQR(1) - 1.000) : GOSUB 1
+: S = FN E(SQR(2) - 1.414) : GOSUB 1
+
+10110 T$ = "TAN()"
+: S = FN E(TAN(0) - 0.000) : GOSUB 1
+: S = FN E(TAN(1) - 1.557) : GOSUB 1
+: S = FN E(TAN(2) --2.185) : GOSUB 1
+
+
+11000 PRINT : PRINT "String Functions ";
+
+11010 T$ = "LEN()"
+: S = (LEN("ABC") = 3) : GOSUB 1
+: S = (LEN("") = 0) : GOSUB 1
+
+11020 T$ = "LEFT$()"
+: S = (LEFT$("ABC",0) = "") : GOSUB 1
+: S = (LEFT$("ABC",2) = "AB") : GOSUB 1
+: S = (LEFT$("ABC",4) = "ABC") : GOSUB 1
+
+11030 T$ = "MID$()"
+: S = (MID$("ABCD",2,2) = "BC") : GOSUB 1
+: S = (MID$("ABCD",3) = "CD") : GOSUB 1
+: S = (MID$("ABCD",4,3) = "D") : GOSUB 1
+
+11040 T$ = "RIGHT$()"
+: S = (RIGHT$("ABC",0) = "") : GOSUB 1
+: S = (RIGHT$("ABC",2) = "BC") : GOSUB 1
+: S = (RIGHT$("ABC",4) = "ABC") : GOSUB 1
+
+
+12000 PRINT : PRINT "Type Conversion Functions ";
+
+12010 T$ = "ASC()"
+: S = (ASC(" ") = 32) : GOSUB 1
+: S = (ASC("A") = 65) : GOSUB 1
+: S = (ASC("z") = 122) : GOSUB 1
+: S = (ASC(CHR$(4)) = 4) : GOSUB 1
+
+12020 T$ = "CHR$()"
+: S = (CHR$(32) = " ") : GOSUB 1
+: S = (CHR$(65) = "A") : GOSUB 1
+: S = (CHR$(122) = "z") : GOSUB 1
+
+12030 T$ = "STR$()"
+: S = (STR$(-1) = "-1") : GOSUB 1
+: S = (STR$(1.5) = "1.5") : GOSUB 1
+: S = (STR$(3.1415) = "3.1415") : GOSUB 1
+: S = (VAL(STR$(3.1415)) = 3.1415) : GOSUB 1
+
+12040 T$ = "VAL()"
+: S = (VAL("-1") = -1) : GOSUB 1
+: S = (VAL("1.5") = 1.5) : GOSUB 1
+: S = (VAL("3.1415") = 3.1415) : GOSUB 1
+
+
+13000 PRINT : PRINT "System Interaction Functions ";
+
+13010 T$ = "FRE()"
+: S = (FRE(0) OR 1) : GOSUB 1
+
+13020 IF NOT PD THEN PRINT ""; : GOTO 13030
+13021 T$ = "PDL()"
+: T = PDL(0) : S = (0 <= T) AND (T < 256) : GOSUB 1
+
+13030 T$ = "POS()"
+: T = POS(0) : HTAB 1 : S = (POS(0) = 0) : HTAB T + 1 : GOSUB 1
+
+13040 IF NOT LR THEN PRINT ""; : GOTO 13050
+13041 T$ = "SCRN()"
+: T = 0 : FOR I = 0 TO 15 : COLOR= I : PLOT I,I : T = T + I : NEXT
+: U = 0 : FOR I = 0 TO 15 : U = U + SCRN(I,I) : NEXT
+: S = (T=U) : GOSUB 1
+
+13050 IF NOT HR THEN PRINT ""; : GOTO 13060
+13051 T$ = "HSCRN()"
+: T = 0 : FOR I = 0 TO 7 : HCOLOR= I : HPLOT I,I : T = T + I : NEXT
+: U = 0 : FOR I = 0 TO 7 : U = U + HSCRN(I,I) : NEXT
+: S = (T=U) : GOSUB 1
+
+13060 REM (goto target)
+
+14000 PRINT : PRINT "User Defined Functions ";
+
14010 T$ = "FN A()"
-: DEF FN A(X) = X + X : S = (FN A(3) = 6) : GOSUB 1
-: DEF FN A(X) = X * X : S = (FN A(3) = 9) : GOSUB 1
-
+: DEF FN A(X) = X + X : S = (FN A(3) = 6) : GOSUB 1
+: DEF FN A(X) = X * X : S = (FN A(3) = 9) : GOSUB 1
+
14020 T$ = "FN A$() [language extension]"
-: DEF FN A$(X$) = X$ + X$ : S = (FN A$("ABC") = "ABCABC") : GOSUB 1
-
-15000 PRINT : PRINT "PEEK Compatibility Shims ";
-: PRINT "UNIT TESTS NOT YET IMPLEMENTED ";
-15001 X = PEEK(49152) : X = PEEK(-16384) : REM Read keyboard
-15002 X = PEEK(49168) : X = PEEK(-16368) : REM Clear keyboard strobe
-15003 X = PEEK(49200) : X = PEEK(-16336) : REM Toggle speaker (no-op)
-15004 X = PEEK(49248) : X = PEEK(-16288) : REM Read paddle button 3
-15005 X = PEEK(49249) : X = PEEK(-16287) : REM Read paddle button 0
-15006 X = PEEK(49250) : X = PEEK(-16286) : REM Read paddle button 1
-15007 X = PEEK(49251) : X = PEEK(-16285) : REM Read paddle button 2
-15008 X = PEEK(78) + 256 * PEEK(79) : REM Entropy generator
-
-15010 REM **********************************************
+: DEF FN A$(X$) = X$ + X$ : S = (FN A$("ABC") = "ABCABC") : GOSUB 1
+
+15000 PRINT : PRINT "PEEK Compatibility Shims ";
+: PRINT "UNIT TESTS NOT YET IMPLEMENTED ";
+15001 X = PEEK(49152) : X = PEEK(-16384) : REM Read keyboard
+15002 X = PEEK(49168) : X = PEEK(-16368) : REM Clear keyboard strobe
+15003 X = PEEK(49200) : X = PEEK(-16336) : REM Toggle speaker (no-op)
+15004 X = PEEK(49248) : X = PEEK(-16288) : REM Read paddle button 3
+15005 X = PEEK(49249) : X = PEEK(-16287) : REM Read paddle button 0
+15006 X = PEEK(49250) : X = PEEK(-16286) : REM Read paddle button 1
+15007 X = PEEK(49251) : X = PEEK(-16285) : REM Read paddle button 2
+15008 X = PEEK(78) + 256 * PEEK(79) : REM Entropy generator
+
+15010 REM **********************************************
15010 REM Do as part of I/O follow-on module
-15010 REM **********************************************
-
-
-16000 PRINT : PRINT "Operators ";
-
+15010 REM **********************************************
+
+
+16000 PRINT : PRINT "Operators ";
+
16010 T$ = "="
-: S = (1 = 1.0) : GOSUB 1
-: S = ("ABC" = "ABC") : GOSUB 1
-
+: S = (1 = 1.0) : GOSUB 1
+: S = ("ABC" = "ABC") : GOSUB 1
+
16020 T$ = "<"
-: S = (1 < 2) : GOSUB 1
-: S = ("A" < "B") : GOSUB 1
-
+: S = (1 < 2) : GOSUB 1
+: S = ("A" < "B") : GOSUB 1
+
16030 T$ = ">"
-: S = (2 > 1) : GOSUB 1
-: S = ("B" > "A") : GOSUB 1
-
+: S = (2 > 1) : GOSUB 1
+: S = ("B" > "A") : GOSUB 1
+
16040 T$ = "<="
-: S = (1 <= 1) : GOSUB 1
-: S = (1 <= 2) : GOSUB 1
-: S = (1 < = 1) : GOSUB 1
-: S = (1 < = 2) : GOSUB 1
-: S = ("A" <= "A") : GOSUB 1
-: S = ("A" <= "B") : GOSUB 1
-: S = ("A" < = "A") : GOSUB 1
-: S = ("A" < = "B") : GOSUB 1
+: S = (1 <= 1) : GOSUB 1
+: S = (1 <= 2) : GOSUB 1
+: S = (1 < = 1) : GOSUB 1
+: S = (1 < = 2) : GOSUB 1
+: S = ("A" <= "A") : GOSUB 1
+: S = ("A" <= "B") : GOSUB 1
+: S = ("A" < = "A") : GOSUB 1
+: S = ("A" < = "B") : GOSUB 1
16041 T$ = "=<"
-: S = (1 =< 1) : GOSUB 1
-: S = (1 =< 2) : GOSUB 1
-: S = (1 = < 1) : GOSUB 1
-: S = (1 = < 2) : GOSUB 1
-: S = ("A" =< "A") : GOSUB 1
-: S = ("A" =< "B") : GOSUB 1
-: S = ("A" = < "A") : GOSUB 1
-: S = ("A" = < "B") : GOSUB 1
-
+: S = (1 =< 1) : GOSUB 1
+: S = (1 =< 2) : GOSUB 1
+: S = (1 = < 1) : GOSUB 1
+: S = (1 = < 2) : GOSUB 1
+: S = ("A" =< "A") : GOSUB 1
+: S = ("A" =< "B") : GOSUB 1
+: S = ("A" = < "A") : GOSUB 1
+: S = ("A" = < "B") : GOSUB 1
+
16050 T$ = ">="
-: S = (1 >= 1) : GOSUB 1
-: S = (2 >= 1) : GOSUB 1
-: S = (1 > = 1) : GOSUB 1
-: S = (2 > = 1) : GOSUB 1
-: S = ("B" >= "A") : GOSUB 1
-: S = ("B" >= "B") : GOSUB 1
-: S = ("B" > = "A") : GOSUB 1
-: S = ("B" > = "B") : GOSUB 1
+: S = (1 >= 1) : GOSUB 1
+: S = (2 >= 1) : GOSUB 1
+: S = (1 > = 1) : GOSUB 1
+: S = (2 > = 1) : GOSUB 1
+: S = ("B" >= "A") : GOSUB 1
+: S = ("B" >= "B") : GOSUB 1
+: S = ("B" > = "A") : GOSUB 1
+: S = ("B" > = "B") : GOSUB 1
16051 T$ = "=>"
-: S = (1 => 1) : GOSUB 1
-: S = (2 => 1) : GOSUB 1
-: S = (1 = > 1) : GOSUB 1
-: S = (2 = > 1) : GOSUB 1
-: S = ("B" => "A") : GOSUB 1
-: S = ("B" => "B") : GOSUB 1
-: S = ("B" = > "A") : GOSUB 1
-: S = ("B" = > "B") : GOSUB 1
-
+: S = (1 => 1) : GOSUB 1
+: S = (2 => 1) : GOSUB 1
+: S = (1 = > 1) : GOSUB 1
+: S = (2 = > 1) : GOSUB 1
+: S = ("B" => "A") : GOSUB 1
+: S = ("B" => "B") : GOSUB 1
+: S = ("B" = > "A") : GOSUB 1
+: S = ("B" = > "B") : GOSUB 1
+
16060 T$ = "<>"
-: S = (1 <> 2) : GOSUB 1
-: S = (1 < > 2) : GOSUB 1
-: S = ("A" <> "B") : GOSUB 1
-: S = ("A" < > "B") : GOSUB 1
+: S = (1 <> 2) : GOSUB 1
+: S = (1 < > 2) : GOSUB 1
+: S = ("A" <> "B") : GOSUB 1
+: S = ("A" < > "B") : GOSUB 1
16061 T$ = "><"
-: S = (1 >< 2) : GOSUB 1
-: S = (1 > < 2) : GOSUB 1
-: S = ("A" >< "B") : GOSUB 1
-: S = ("A" > < "B") : GOSUB 1
-
-16070 T$ = "AND" : S = (1 AND 1) : GOSUB 1
-16080 T$ = "OR" : S = (0 OR 1) : GOSUB 1
-16090 T$ = "NOT" : S = (NOT 0) : GOSUB 1
-
+: S = (1 >< 2) : GOSUB 1
+: S = (1 > < 2) : GOSUB 1
+: S = ("A" >< "B") : GOSUB 1
+: S = ("A" > < "B") : GOSUB 1
+
+16070 T$ = "AND" : S = (1 AND 1) : GOSUB 1
+16080 T$ = "OR" : S = (0 OR 1) : GOSUB 1
+16090 T$ = "NOT" : S = (NOT 0) : GOSUB 1
+
16100 T$ = "^"
-: S = (0^0 = 1) : GOSUB 1
-: S = (1^1 = 1) : GOSUB 1
-: S = (2^2 = 4) : GOSUB 1
-: S = (3^0 = 1) : GOSUB 1
-: S = (FN E(1.5^-2 - 0.444)) : GOSUB 1
-
+: S = (0^0 = 1) : GOSUB 1
+: S = (1^1 = 1) : GOSUB 1
+: S = (2^2 = 4) : GOSUB 1
+: S = (3^0 = 1) : GOSUB 1
+: S = (FN E(1.5^-2 - 0.444)) : GOSUB 1
+
16110 T$ = "*"
-: S = (1*0 = 0) : GOSUB 1
-: S = (1*1 = 1) : GOSUB 1
-: S = (-1*1 = -1) : GOSUB 1
-: S = (-1*-1 = 1) : GOSUB 1
-: S = (0.5*2 = 1) : GOSUB 1
-
+: S = (1*0 = 0) : GOSUB 1
+: S = (1*1 = 1) : GOSUB 1
+: S = (-1*1 = -1) : GOSUB 1
+: S = (-1*-1 = 1) : GOSUB 1
+: S = (0.5*2 = 1) : GOSUB 1
+
16120 T$ = "/"
-: S = (1/1 = 1) : GOSUB 1
-: S = (-1/1 = -1) : GOSUB 1
-: S = (-1/-1 = 1) : GOSUB 1
-: S = (2/0.5 = 4) : GOSUB 1
-
+: S = (1/1 = 1) : GOSUB 1
+: S = (-1/1 = -1) : GOSUB 1
+: S = (-1/-1 = 1) : GOSUB 1
+: S = (2/0.5 = 4) : GOSUB 1
+
16130 T$ = "+"
-: S = (0+0 = 0) : GOSUB 1
-: S = (0+1 = 1) : GOSUB 1
-: S = (-1+1 = 0) : GOSUB 1
-: S = (1.5+.5 = 2) : GOSUB 1
-: S = ("A"+"B" = "AB") : GOSUB 1
-: S = ("A"+"B"+"C" = "ABC") : GOSUB 1
-: S = (""+"" = "") : GOSUB 1
-
+: S = (0+0 = 0) : GOSUB 1
+: S = (0+1 = 1) : GOSUB 1
+: S = (-1+1 = 0) : GOSUB 1
+: S = (1.5+.5 = 2) : GOSUB 1
+: S = ("A"+"B" = "AB") : GOSUB 1
+: S = ("A"+"B"+"C" = "ABC") : GOSUB 1
+: S = (""+"" = "") : GOSUB 1
+
16140 T$ = "-"
-: S = (0-0 = 0) : GOSUB 1
-: S = (1-0 = 1) : GOSUB 1
-: S = (-1--1 = 0) : GOSUB 1
-: S = (1.5-.5 = 1) : GOSUB 1
-
+: S = (0-0 = 0) : GOSUB 1
+: S = (1-0 = 1) : GOSUB 1
+: S = (-1--1 = 0) : GOSUB 1
+: S = (1.5-.5 = 1) : GOSUB 1
+
16150 T$ = "Precedence"
-: S = (FN E((2 + 3 - 4 * 5 / 6 ^ 7) - 4.999)) : GOSUB 1
-
-17000 PRINT : PRINT "DOS Commands ";
-
-17010 PRINT CHR$(4)"OPEN TESTDATA"
-: PRINT CHR$(4)"CLOSE TESTDATA"
-: PRINT CHR$(4)"DELETE TESTDATA"
-
-17020 T$ = "Sequential Access OPEN/WRITE/READ"
-: PRINT CHR$(4)"OPEN TESTDATA"
-: PRINT CHR$(4)"WRITE TESTDATA"
-: FOR I = 1 TO 10 : PRINT I : NEXT
-: PRINT CHR$(4)"CLOSE TESTDATA"
-: PRINT CHR$(4)"OPEN TESTDATA"
-: PRINT CHR$(4)"READ TESTDATA"
-: T = 0 : FOR I = 1 TO 10 : INPUT J : T = T + J : NEXT
-: PRINT CHR$(4)"CLOSE TESTDATA"
-: S = (T = 55) : GOSUB 1
-
-17030 T$ = "Sequential Access APPEND/WRITE/READ"
-: PRINT CHR$(4)"APPEND TESTDATA"
-: PRINT CHR$(4)"WRITE TESTDATA"
-: FOR I = 1 TO 10 : PRINT -I : NEXT
-: PRINT CHR$(4)"CLOSE TESTDATA"
-: PRINT CHR$(4)"OPEN TESTDATA"
-: PRINT CHR$(4)"READ TESTDATA"
-: T = 0 : FOR I = 1 TO 20 : INPUT J : T = T + J : NEXT
-: PRINT CHR$(4)"CLOSE TESTDATA"
-: S = (T = 0) : GOSUB 1
-
-17040 T$ = "Sequential Access/ONERR"
-: PRINT CHR$(4)"OPEN JABBERWOCKY"
-: PRINT CHR$(4)"READ JABBERWOCKY"
-: ONERR GOTO 10742 : N = 0
-: FOR N = 0 TO 10 : INPUT A$ : NEXT
-10742 POKE 216,0 : PRINT CHR$(4)"CLOSE" : S = (N = 4) : GOSUB 1
-
-17050 T$ = "RENAME"
-: PRINT CHR$(4)"OPEN TESTDATA"
-: PRINT CHR$(4)"WRITE TESTDATA"
-: FOR I = 1 TO 10 : PRINT I : NEXT
-: PRINT CHR$(4)"CLOSE TESTDATA"
-: PRINT CHR$(4)"RENAME TESTDATA, DATA2"
-: PRINT CHR$(4)"OPEN DATA2"
-: PRINT CHR$(4)"READ DATA2"
-: T = 0 : FOR I = 1 TO 10 : INPUT J : T = T + J : NEXT
-: PRINT CHR$(4)"CLOSE DATA2"
-: S = (T = 55) : GOSUB 1
-
-17500 T$ = "Fixed Length OPEN/WRITE/READ"
-: F$ = "FIXEDLENTEST"
-: PRINT CHR$(4)"OPEN "F$",L16"
-: FOR I = 1 TO 20 : PRINT CHR$(4)"WRITE "F$",R";I : PRINT I * I : NEXT
-: PRINT CHR$(4)"CLOSE "F$
-: PRINT CHR$(4)"OPEN "F$",L16"
-: T = 0 : FOR I = 20 TO 1 STEP -2 : PRINT CHR$(4)"READ "F$",R";I : INPUT J : T = T + J : NEXT
-: PRINT CHR$(4)"CLOSE "F$
-: S = (T = 1540) : GOSUB 1
-
-18000 PRINT : PRINT "Regression Tests ";
-
+: S = (FN E((2 + 3 - 4 * 5 / 6 ^ 7) - 4.999)) : GOSUB 1
+
+17000 PRINT : PRINT "DOS Commands ";
+
+17010 PRINT CHR$(4)"OPEN TESTDATA"
+: PRINT CHR$(4)"CLOSE TESTDATA"
+: PRINT CHR$(4)"DELETE TESTDATA"
+
+17020 T$ = "Sequential Access OPEN/WRITE/READ"
+: PRINT CHR$(4)"OPEN TESTDATA"
+: PRINT CHR$(4)"WRITE TESTDATA"
+: FOR I = 1 TO 10 : PRINT I : NEXT
+: PRINT CHR$(4)"CLOSE TESTDATA"
+: PRINT CHR$(4)"OPEN TESTDATA"
+: PRINT CHR$(4)"READ TESTDATA"
+: T = 0 : FOR I = 1 TO 10 : INPUT J : T = T + J : NEXT
+: PRINT CHR$(4)"CLOSE TESTDATA"
+: S = (T = 55) : GOSUB 1
+
+17030 T$ = "Sequential Access APPEND/WRITE/READ"
+: PRINT CHR$(4)"APPEND TESTDATA"
+: PRINT CHR$(4)"WRITE TESTDATA"
+: FOR I = 1 TO 10 : PRINT -I : NEXT
+: PRINT CHR$(4)"CLOSE TESTDATA"
+: PRINT CHR$(4)"OPEN TESTDATA"
+: PRINT CHR$(4)"READ TESTDATA"
+: T = 0 : FOR I = 1 TO 20 : INPUT J : T = T + J : NEXT
+: PRINT CHR$(4)"CLOSE TESTDATA"
+: S = (T = 0) : GOSUB 1
+
+17040 T$ = "Sequential Access/ONERR"
+: PRINT CHR$(4)"OPEN JABBERWOCKY"
+: PRINT CHR$(4)"READ JABBERWOCKY"
+: ONERR GOTO 10742 : N = 0
+: FOR N = 0 TO 10 : INPUT A$ : NEXT
+10742 POKE 216,0 : PRINT CHR$(4)"CLOSE" : S = (N = 4) : GOSUB 1
+
+17050 T$ = "RENAME"
+: PRINT CHR$(4)"OPEN TESTDATA"
+: PRINT CHR$(4)"WRITE TESTDATA"
+: FOR I = 1 TO 10 : PRINT I : NEXT
+: PRINT CHR$(4)"CLOSE TESTDATA"
+: PRINT CHR$(4)"RENAME TESTDATA, DATA2"
+: PRINT CHR$(4)"OPEN DATA2"
+: PRINT CHR$(4)"READ DATA2"
+: T = 0 : FOR I = 1 TO 10 : INPUT J : T = T + J : NEXT
+: PRINT CHR$(4)"CLOSE DATA2"
+: S = (T = 55) : GOSUB 1
+
+17500 T$ = "Fixed Length OPEN/WRITE/READ"
+: F$ = "FIXEDLENTEST"
+: PRINT CHR$(4)"OPEN "F$",L16"
+: FOR I = 1 TO 20 : PRINT CHR$(4)"WRITE "F$",R";I : PRINT I * I : NEXT
+: PRINT CHR$(4)"CLOSE "F$
+: PRINT CHR$(4)"OPEN "F$",L16"
+: T = 0 : FOR I = 20 TO 1 STEP -2 : PRINT CHR$(4)"READ "F$",R";I : INPUT J : T = T + J : NEXT
+: PRINT CHR$(4)"CLOSE "F$
+: S = (T = 1540) : GOSUB 1
+
+18000 PRINT : PRINT "Regression Tests ";
+
18010 T$ = "global rhs in OR"
-: T = 0 : FOR I = 1 TO 4
-18011 IF I = 1 OR I = 3 GOTO 18014
-18012 IF I = 2 OR I = 4 GOTO 18014
-18013 T = 1
+: T = 0 : FOR I = 1 TO 4
+18011 IF I = 1 OR I = 3 GOTO 18014
+18012 IF I = 2 OR I = 4 GOTO 18014
+18013 T = 1
18014 NEXT
-: S = (T=0) : GOSUB 1
-
+: S = (T=0) : GOSUB 1
+
18020 T$ = "Operator Associativity"
-: S = (10 / 2 * 5 = 25): GOSUB 1
-: S = (2 ^ 3 ^ 4 = 4096): GOSUB 1
-
+: S = (10 / 2 * 5 = 25): GOSUB 1
+: S = (2 ^ 3 ^ 4 = 4096): GOSUB 1
+
18030 T$ = "VAL() on bad input"
-: S = (VAL("") = 0): GOSUB 1
-: S = (VAL("abc") = 0): GOSUB 1
-
+: S = (VAL("") = 0): GOSUB 1
+: S = (VAL("abc") = 0): GOSUB 1
+
18040 T$ = "Array Dimensions"
-: DIM A1(10) : X = A1(10)
-: S = (1): GOSUB 1
-
-18050 T$ = "Non-integer Array Indices"
-: DIM A2(10) : A2(1) = 123
-: S = (A2(1.5) = 123) : GOSUB 1
-
-18060 T$ = "Array Lower Bounds"
-: T = 1 : ONERR GOTO 18061
-: X = A2(-1) :
-: T = 2
-18061 S = (T=1) AND (PEEK(222)=53) : GOSUB 1 : POKE 216,0
-
-18070 T$ = "Array Upper Bounds"
-: T = 1 : ONERR GOTO 18071
-: X = A2(11) :
-: T = 2
-18071 S = (T=1) AND (PEEK(222)=107) : GOSUB 1 : POKE 216,0
-
-
-
-
-20000 PRINT : PRINT : PRINT "Executed tests: "; TE
-20010 PRINT "Successful tests: "; TS
-20019 IF F THEN INVERSE
-20020 PRINT "Failed tests: "; F; : NORMAL
-
-
+: DIM A1(10) : X = A1(10)
+: S = (1): GOSUB 1
+
+18050 T$ = "Non-integer Array Indices"
+: DIM A2(10) : A2(1) = 123
+: S = (A2(1.5) = 123) : GOSUB 1
+
+18060 T$ = "Array Lower Bounds"
+: T = 1 : ONERR GOTO 18061
+: X = A2(-1) :
+: T = 2
+18061 S = (T=1) AND (PEEK(222)=53) : GOSUB 1 : POKE 216,0
+
+18070 T$ = "Array Upper Bounds"
+: T = 1 : ONERR GOTO 18071
+: X = A2(11) :
+: T = 2
+18071 S = (T=1) AND (PEEK(222)=107) : GOSUB 1 : POKE 216,0
+
+
+
+
+20000 PRINT : PRINT : PRINT "Executed tests: "; TE
+20010 PRINT "Successful tests: "; TS
+20019 IF F THEN INVERSE
+20020 PRINT "Failed tests: "; F; : NORMAL