mirror of
https://github.com/inexorabletash/jsbasic.git
synced 2025-05-13 03:38:15 +00:00
Fix ONERR GOTO handling - should skip to next line. Resolves #7
This commit is contained in:
parent
3542aa89e6
commit
20f302339f
2
basic.js
2
basic.js
@ -632,7 +632,6 @@ this.basic = (function() {
|
||||
throw new EndProgram();
|
||||
},
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Error Handling Statements
|
||||
@ -641,6 +640,7 @@ this.basic = (function() {
|
||||
|
||||
'onerr_goto': function ONERR_GOTO(line) {
|
||||
state.onerr_handler = line;
|
||||
throw new NextLine();
|
||||
},
|
||||
|
||||
'resume': function RESUME() {
|
||||
|
@ -10,9 +10,12 @@
|
||||
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
|
||||
210 LR = 0 : ONERR GOTO 220
|
||||
211 GR : LR = 1
|
||||
220 HR = 0 : ONERR GOTO 240
|
||||
221 HGR : HR = 1
|
||||
230 PD = 0 : ONERR GOTO 240
|
||||
231 X = PDL(0) : PD = 1
|
||||
240 POKE 216,0
|
||||
|
||||
300 PR#3 : TEXT : HOME : PRINT "Unit Tests"
|
||||
@ -122,125 +125,128 @@
|
||||
3000 PRINT : PRINT "Error Handling ";
|
||||
|
||||
3010 T$ = "ONERR GOTO"
|
||||
: T = 1 : ONERR GOTO 3015 : T = 1 / 0
|
||||
3011 T = 2
|
||||
: T = 1 : ONERR GOTO 3015
|
||||
3011 T = 1 / 0
|
||||
3012 T = 2
|
||||
3015 S = (T=1) : GOSUB 1
|
||||
|
||||
3020 T$ = "RESUME"
|
||||
: T = 0 : ONERR GOTO 3025 : T = 1 / T : GOTO 3029
|
||||
: T = 0 : ONERR GOTO 3025
|
||||
3021 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
|
||||
3041 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 = 1 : ONERR GOTO 3102
|
||||
3101 NEXT
|
||||
: T = 2
|
||||
3101 S = (T=1) AND (PEEK(222)=0) : GOSUB 1
|
||||
3102 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 = 1 : ONERR GOTO 3122
|
||||
3121 RETURN
|
||||
: T = 2
|
||||
3121 S = (T=1) AND (PEEK(222)=22) : GOSUB 1
|
||||
3122 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 = 1 : ONERR GOTO 3132
|
||||
3131 FOR A = 1 TO 1000 : READ A$ : NEXT
|
||||
: T = 2
|
||||
3131 S = (T=1) AND (PEEK(222)=42) : GOSUB 1
|
||||
3132 S = (T=1) AND (PEEK(222)=42) : GOSUB 1
|
||||
|
||||
3140 T$ = "ILLEGAL QUANTITY"
|
||||
: T = 1 : ONERR GOTO 3141
|
||||
: A% = 32768
|
||||
: T = 1 : ONERR GOTO 3142
|
||||
3141 A% = 32768
|
||||
: T = 2
|
||||
3141 S = (T=1) AND (PEEK(222)=53) : GOSUB 1
|
||||
3142 S = (T=1) AND (PEEK(222)=53) : GOSUB 1
|
||||
|
||||
3145 T$ = "ILLEGAL QUANTITY"
|
||||
: T = 1 : ONERR GOTO 3146
|
||||
: A = ASC("")
|
||||
: T = 1 : ONERR GOTO 3147
|
||||
3146 A = ASC("")
|
||||
: T = 2
|
||||
3146 S = (T=1) AND (PEEK(222)=53) : GOSUB 1
|
||||
3147 S = (T=1) AND (PEEK(222)=53) : GOSUB 1
|
||||
|
||||
3150 T$ = "OVERFLOW" :
|
||||
: T = 1 : ONERR GOTO 3151
|
||||
: A = 256^256^256
|
||||
: T = 1 : ONERR GOTO 3152
|
||||
3151 A = 256^256^256
|
||||
: T = 2
|
||||
3151 S = (T=1) AND (PEEK(222)=69) : GOSUB 1
|
||||
3152 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 T = 1 : ONERR GOTO 3162
|
||||
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
|
||||
3162 REM S = (T=1) AND (PEEK(222)=77) : GOSUB 1
|
||||
|
||||
3170 T$ = "UNDEFINED STATEMENT" :
|
||||
: T = 1 : ONERR GOTO 3171
|
||||
: GOTO 3172
|
||||
: T = 1 : ONERR GOTO 3172
|
||||
3171 GOTO 3173
|
||||
: T = 2
|
||||
3171 S = (T=1) AND (PEEK(222)=90) : GOSUB 1
|
||||
3172 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 = 1 : ONERR GOTO 3182
|
||||
3181 DIM BS(3) : BS(4) = 123
|
||||
: T = 2
|
||||
3181 S = (T=1) AND (PEEK(222)=107) : GOSUB 1
|
||||
3182 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 = 1 : ONERR GOTO 3192
|
||||
3191 DIM RA(3) : DIM RA(3)
|
||||
: T = 2
|
||||
3191 S = (T=1) AND (PEEK(222)=120) : GOSUB 1
|
||||
3192 S = (T=1) AND (PEEK(222)=120) : GOSUB 1
|
||||
|
||||
3200 T$ = "DIVISION BY ZERO" :
|
||||
: T = 1 : ONERR GOTO 3201
|
||||
: A = 1 / 0
|
||||
: T = 1 : ONERR GOTO 3202
|
||||
3201 A = 1 / 0
|
||||
: T = 2
|
||||
3201 S = (T=1) AND (PEEK(222)=133) : GOSUB 1
|
||||
3202 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 = 1 : ONERR GOTO 3212
|
||||
3211 RESTORE : FOR I = 1 TO 1000 : READ A : NEXT
|
||||
: T = 2
|
||||
3211 S = (T=1) AND (PEEK(222)=163) : GOSUB 1
|
||||
3212 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 = 1 : ONERR GOTO 3217
|
||||
3216 RESTORE : FOR I = 1 TO 1000 : READ A% : NEXT
|
||||
: T = 2
|
||||
3216 S = (T=1) AND (PEEK(222)=163) : GOSUB 1
|
||||
3217 S = (T=1) AND (PEEK(222)=163) : GOSUB 1
|
||||
|
||||
3220 T$ = "STRING TOO LONG" : REM Strings are "infinite", can't test
|
||||
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 = 1 : ONERR GOTO 3232
|
||||
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
|
||||
3232 REM S = (T=1) AND (PEEK(222)=191): GOSUB 1
|
||||
|
||||
3240 T$ = "UNDEFINED FUNCTION" :
|
||||
: T = 1 : ONERR GOTO 3241
|
||||
: X = FN UF(0)
|
||||
: T = 1 : ONERR GOTO 3242
|
||||
3241 X = FN UF(0)
|
||||
: T = 2
|
||||
3241 S = (T=1) AND (PEEK(222)=224) : GOSUB 1
|
||||
3242 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 = 1 : ONERR GOTO 3262
|
||||
3261 STOP
|
||||
: T = 2
|
||||
3261 S = (T=1) AND (PEEK(222)=255) : GOSUB 1
|
||||
3262 S = (T=1) AND (PEEK(222)=255) : GOSUB 1
|
||||
|
||||
3270 T$ = "CALL-3288" :
|
||||
: T = 1 : ONERR GOTO 3274
|
||||
@ -254,6 +260,12 @@
|
||||
: RETURN
|
||||
3275 S = (T=3) : GOSUB 1
|
||||
|
||||
3280 T$ = "ONERR GOTO skips rest of line"
|
||||
: T = 1
|
||||
: ONERR GOTO 3281
|
||||
: T = 2
|
||||
3281 S = (T=1) : GOSUB 1
|
||||
|
||||
|
||||
3999 POKE 216,0 : REM Disable ONERR handler
|
||||
|
||||
@ -748,7 +760,8 @@
|
||||
17040 T$ = "Sequential Access/ONERR"
|
||||
: PRINT CHR$(4)"OPEN JABBERWOCKY"
|
||||
: PRINT CHR$(4)"READ JABBERWOCKY"
|
||||
: ONERR GOTO 17042 : N = 0
|
||||
: ONERR GOTO 17042
|
||||
17041 N = 0
|
||||
: FOR N = 0 TO 10 : INPUT A$ : NEXT
|
||||
17042 POKE 216,0 : PRINT CHR$(4)"CLOSE" : S = (N = 4) : GOSUB 1
|
||||
|
||||
@ -801,16 +814,16 @@
|
||||
: S = (A2(1.5) = 123) : GOSUB 1
|
||||
|
||||
18060 T$ = "Array Lower Bounds"
|
||||
: T = 1 : ONERR GOTO 18061
|
||||
: X = A2(-1) :
|
||||
: T = 1 : ONERR GOTO 18062
|
||||
18061 X = A2(-1) :
|
||||
: T = 2
|
||||
18061 S = (T=1) AND (PEEK(222)=53) : GOSUB 1 : POKE 216,0
|
||||
18062 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 = 1 : ONERR GOTO 18072
|
||||
18071 X = A2(11) :
|
||||
: T = 2
|
||||
18071 S = (T=1) AND (PEEK(222)=107) : GOSUB 1 : POKE 216,0
|
||||
18072 S = (T=1) AND (PEEK(222)=107) : GOSUB 1 : POKE 216,0
|
||||
|
||||
18080 T$ = "Duplicate Lines"
|
||||
18081 T = 1
|
||||
|
Loading…
x
Reference in New Issue
Block a user