Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.sys.apple2.programmer > #1384

Re: ONERR recovery question

Newsgroups comp.sys.apple2.programmer
Date 2014-11-02 13:16 -0800
References <850d0151-ff60-4a1c-9cfe-fd58f56a676b@z11g2000yqz.googlegroups.com> <d8904315-2793-4e82-ad89-042ac1491385@s22g2000prd.googlegroups.com>
Message-ID <b9fd6a0d-9d74-4a95-a08f-70f3142a8f2b@googlegroups.com> (permalink)
Subject Re: ONERR recovery question
From ivan@ivanx.com

Show all headers | View raw


On Thursday, April 22, 2010 12:10:34 AM UTC-4, mmphosis wrote:
> Pasted below is a program that attempts to throw every Applesoft
> error, DOS errors not included.

I just uncovered this again and it was extremely helpful in helping troubleshoot a project I am working on. If you see this all this time later, thanks!

> > ?FORMULA TOO COMPLEX ERROR IN 860
> 
> In the last case, the error thrown is not handled by the error
> handler.  When I remove the REM on line 850 and run the program, it
> hangs on the "FORMULA TOO COMPLEX" error.  I don't know why it does
> this.  Any ideas?
> 
> 850 ONERR GOTO 70

I checked this out. It appears that there's an Applesoft bug, in which after the ?FORMULA TOO COMPLEX error has been caught by ONERR GOTO, *another* ?FORMULA TOO COMPLEX error happens when the program next attempts to output a string. This causes an endless loop back to line 70 when the error handler was attempting to print out the error description in line 90. The fix is to add this line to the error handler, which prevents the second error from happening.

75 IF E = 191 THEN POKE 82,85

In addition, I extended the program to also generate all the DOS 3.3 and PRODOS errors as well (except for NOT DIRECT ERROR, which by definition doesn't happen within a program, and FILE(S) STILL OPEN, which can't be trapped by ONERR GOTO). You're advised to use it with a 140K floppy (or disk image), or otherwise use a disk that doesn't have a ton of free space, so the DISK FULL test doesn't take forever. Also, the WRITE PROTECTED and I/O error tests are out of sequence at the end, since they require fussing with the disk.

Here it is:

5 REM adapted from https://groups.google.com/d/msg/comp.sys.apple2.programmer/CsNawW_KQBk/RMDEbW0KaWoJ

10  GOSUB 890 : REM INIT

19  REM ERROR TRIGGER LOOP
20  FOR I = S TO 38
30  LET R = 1
40  ON I GOSUB 140,200,240,300,340,380,420,460,500,540,590,630,670,850,710,750,800,10100,10200,10300,10500,10600,10700,10900,11000,11100,11200,11300,11400,11500,11600,11700,11800,11900,12000,12100,10400,10800
50  NEXT I
60  END

69  REM ERROR HANDLER
70  LET E =  PEEK (222)
75  IF E = 191 THEN POKE 82,85
80  IF E = 255 THEN  PRINT " "
90  PRINT I; TAB( 4);
100  PRINT E; TAB( 8);
110  PRINT E$(E%(E))
120  LET R = 0
130  RESUME

135 REM APPLESOFT ERRORS

139 REM 0 ?NEXT WITHOUT FOR
140  ONERR GOTO 70
150  IF R THEN  NEXT J
160  POKE 216,0
170  RETURN
180  POP
190  GOTO 20

199 REM 16 ?SYNTAX
200  ONERR GOTO 70
210  IF R THEN BAD
220  POKE 216,0
230  RETURN

239 REM 22 ?RETURN WITHOUT GOSUB
240  POP
250  ONERR GOTO 70
260  IF R THEN  RETURN
270  POKE 216,0
280  LET S = 4
290  GOTO 20

299 REM 42 ?OUT OF DATA
300  ONERR GOTO 70
310  IF R THEN  READ A
320  POKE 216,0
330  RETURN

339 REM 53 ?ILLEGAL QUANITITY
340  ONERR GOTO 70
350  IF R THEN A% = 32768
360  POKE 216,0
370  RETURN

379 REM 69 ?OVERFLOW
380  ONERR GOTO 70
390  IF R THEN A=170141183460000000000000000000000000000
400  POKE 216,0
410  RETURN

419 REM 77 ?OUT OF MEMORY
420  ONERR GOTO 70
430  IF R THEN  DIM A(99,99,99)
440  POKE 216,0
450  RETURN

459 REM 90 ?UNDEFINED STATEMENT
460  ONERR GOTO 70
470  IF R THEN 59
480  POKE 216,0
490  RETURN

499 REM 107 ?BAD SUBSCRIPT
500  ONERR GOTO 70
510  IF R THEN A(11) = 0
520  POKE 216,0
530  RETURN

539 REM 120 ?REDIMENSIONED ARRAY
540  DIM X(0)
550  ONERR GOTO 70
560  IF R THEN  DIM X(0)
570  POKE 216,0
580  RETURN

589 REM 133 ?DIVIDE BY ZERO
590  ONERR GOTO 70
600  IF R THEN A = 1 / 0
610  POKE 216,0
620  RETURN

629 REM 163 ?TYPE MISMATCH
630  ONERR GOTO 70
640  IF R THEN A = "BAD"
650  POKE 216,0
660  RETURN

669 REM 176 ?STRING TOO LONG
670  ONERR GOTO 70
680  IF R THEN A$ = A$ + "X"
690  POKE 216,0
700  RETURN

709 REM 224 ?UNDEFINED FUNCTION
710  ONERR GOTO 70
720  IF R THEN A =  FN UF(0)
730  POKE 216,0
740  RETURN

749 REM 254 ?REENTER
750  PRINT "     PRESS RETURN >>>";
760  ONERR GOTO 70
770  IF R THEN  INPUT "";A
780  POKE 216,0
790  RETURN

799 REM 255 ?BREAK
800  PRINT "     PRESS CONTROL-C >>>";:FLASH:PRINT " " CHR$(8);:NORMAL
810  ONERR GOTO 70
820  IF R THEN WAIT -16384,128:A=PEEK(-16368):PRINT " "
830  POKE 216,0
840  RETURN

849 REM 191 ?FORMULA TOO COMPLEX
850  ONERR GOTO 70
860  IF R THEN A = "X" = "X"
870  POKE 216,0
880  RETURN

889  REM INIT
890  DIM E%(255),E$(36)
895  DV=PEEK(48896):D=(DV=211 OR DV=34):P=(DV=76)
896  D$=CHR$(4)
900  FOR I = 0 TO 36
910  READ E
920  LET E%(E) = I
930  READ E$(I)
940  NEXT
950 A$ = "X"
960  GOSUB 990: GOSUB 1000: GOSUB 970: GOSUB 980
970  GOSUB 1010
980  GOSUB 1010
990 A$ = A$ + B$:B$ = A$: RETURN
1000  GOSUB 1010
1010 A$ = A$ + A$: RETURN
1020  DATA0,"NEXT WITHOUT FOR"
1030  DATA16,"SYNTAX"
1040  DATA22,"RETURN WITHOUT GOSUB"
1050  DATA42,"OUT OF DATA"
1060  DATA53,"ILLEGAL QUANTITY"
1070  DATA69,"OVERFLOW"
1080  DATA77,"OUT OF MEMORY"
1090  DATA90,"UNDEFINED STATEMENT"
1100  DATA107,"BAD SUBSCRIPT"
1110  DATA120,"REDIMENSIONED ARRAY"
1120  DATA133,"DIVISION BY ZERO"
1130  DATA163,"TYPE MISMATCH"
1140  DATA176,"STRING TOO LONG"
1150  DATA191,"FORMULA TOO COMPLEX"
1160  DATA224,"UNDEFINED FUNCTION"
1170  DATA254,"BAD RESPONSE TO INPUT STATEMENT"
1180  DATA255,"CTRL C INTERRUPT ATTEMPTED"
1190  DATA1,"LANGAUGE NOT AVAILABLE"
1200  DATA2,"RANGE ERROR"
1210  DATA3,"NO DEVICE CONNECTED"
1220  DATA4,"WRITE PROTECTED"
1230  DATA5,"END OF DATA"
1240  DATA6,"FILE NOT FOUND/PATH NOT FOUND"
1250  DATA7,"VOLUME MISMATCH"
1260  DATA8,"I/O ERROR"
1270  DATA9,"DISK FULL"
1280  DATA10,"FILE LOCKED"
1290  DATA11,"SYNTAX ERROR/INVALID PARAMETER"
1300  DATA12,"NO BUFFERS AVAILABLE"
1310  DATA13,"FILE TYPE MISMATCH"
1320  DATA14,"PROGRAM TOO LARGE"
1330  DATA15,"NOT DIRECT COMMAND"
1340  DATA17,"DIRECTORY FULL"
1350  DATA18,"FILE NOT OPEN"
1360  DATA19,"DUPLICATE FILE NAME"
1370  DATA20,"FILE BUSY"
1380  DATA21,"FILE(S) STILL OPEN"

10000 REM DOS/PRODOS ERRORS

10100 REM 1 LANGUAGE NOT AVAILABLE (D)
10110  IF P THEN RETURN
10120  ONERR GOTO 70
10130  IF R THEN PRINT D$;"INT"
10140  POKE 216,0
10150  RETURN

10200 REM 2 RANGE ERROR (D/P)
10201  ONERR GOTO 70
10210  IF R THEN PRINT D$;"CATALOG,S23"
10220  POKE 216,0
10230  RETURN

10300 REM 3 RANGE ERROR (D)
10301 REM 3 NO DEVICE CONNECTED (P)
10302  IF P THEN 10350
10310  ONERR GOTO 70
10320  REM RESERVED FOR DOS 3.3 ERROR 3. HOW???
10340  POKE 216,0
10349  RETURN
10350  ONERR GOTO 70
10360  IF R THEN PRINT D$;"CAT,S1,D2"
10370  POKE 216,0
10380  RETURN

10400 REM 4 WRITE PROTECTED (D/P)
10410  ONERR GOTO 70
10420  IF R THEN PRINT D$;"BSAVE ONERR.BINFILE,A$4000,L20": PRINT D$;"DELETE ONERR.BINFILE": PRINT "     WRITE-PROTECT YOUR DISK": INPUT "     AND PRESS RETURN >>>";X$: GOTO 10420
10430  POKE 216,0
10450  RETURN

10500 REM 5 END OF DATA (D/P)
10501  ONERR GOTO 10506
10505  PRINT D$;"BSAVE ONERR.BINFILE,A$4000,L20": GOTO 10507
10506  PRINT "     UN-WRITE-PROTECT YOUR DISK": INPUT "     AND PRESS RETURN >>>";X$: GOTO 10505
10507  POKE 216,0 : CALL -3288
10508  PRINT D$;"DELETE ONERR.BINFILE"
10510  PRINT D$;"OPEN ONERR.TEXTFILE"
10520  ONERR GOTO 70
10530  IF R THEN PRINT D$;"POSITION ONERR.TEXTFILE,R10"
10540  POKE 216,0
10545  PRINT D$;"CLOSE ONERR.TEXTFILE"
10550  PRINT D$;"DELETE ONERR.TEXTFILE"
10560  RETURN

10600 REM 6 FILE NOT FOUND (D)
10601 REM 6 PATH NOT FOUND (P)
10602  ONERR GOTO 70
10610  IF R THEN PRINT D$;"BLOAD NOFILE,A$7000"
10620  POKE 216,0
10630  RETURN

10700 REM 7 VOLUME MISMATCH (D)
10701 REM 7 PATH NOT FOUND (P)
10702  IF P THEN 10750
10705  PRINT D$;"OPEN ONERR.TEXTFILE": PRINT D$;"CLOSE ONERR.TEXTFILE"
10710  ONERR GOTO 70
10720  IF R THEN PRINT D$;"EXEC ONERR.TEXTFILE,V29"
10730  POKE 216,0
10735  PRINT D$;"DELETE ONERR.TEXTFILE"
10740  RETURN
10750  ONERR GOTO 70
10760  REM RESERVED FOR PRODOS ERROR 7 (HOW?)
10770  POKE 216,0
10780  RETURN

10800 REM 8 I/O ERROR
10810  PRINT "     REMOVE THE DISK"
10820  INPUT "     AND PRESS RETURN >>>";X$
10825  ONERR GOTO 70
10830  IF R THEN PRINT D$;"CATALOG"
10840  POKE 216,0
10850  RETURN

10900 REM 9 DISK FULL
10910  B=1
10915  ONERR GOTO 70
10920  IF R THEN PRINT D$;"BSAVE ONERR.BIG";B;",A2048,L32767" : B=B+1 : GOTO 10920
10930  POKE 216,0
10935  ONERR GOTO 10945
10940  PRINT D$;"DELETE ONERR.BIG";B
10945  B=B-1 : IF B>0 THEN 10940
10950  POKE 216,0 : CALL -3288
10960  RETURN

11000 REM 10 FILE LOCKED
11005  PRINT D$;"BSAVE ONERR.BINFILE,A$4000,L20"
11010  PRINT D$;"LOCK ONERR.BINFILE"
11015  ONERR GOTO 70
11020  IF R THEN PRINT D$;"DELETE ONERR.BINFILE"
11030  POKE 216,0
11040  PRINT D$;"UNLOCK ONERR.BINFILE"
11050  PRINT D$;"DELETE ONERR.BINFILE"
11060  RETURN

11100 REM 11 SYNTAX ERROR (D)
11101 REM 11 INVALID OPTION (P)
11102  IF P THEN 11150
11110  ONERR GOTO 70
11120  IF R THEN PRINT D$;"CATALOG,X1"
11130  POKE 216,0
11140  RETURN
11150  ONERR GOTO 70
11160  IF R THEN PRINT D$;"CAT,B0"
11170  POKE 216,0
11180  RETURN

11200 REM 12 NO BUFFERS AVAILABLE (D/P)
11210  IF P THEN 11250
11220  PRINT D$;"MAXFILES 1"
11230  PRINT D$;"OPEN ONERR.TEXTFILE"
11234  ONERR GOTO 70
11235  IF R THEN PRINT D$;"CATALOG"
11236  POKE 216,0
11237  PRINT D$;"CLOSE ONERR.TEXTFILE"
11238  PRINT D$;"MAXFILES 3"
11239  PRINT D$;"DELETE ONERR.TEXTFILE"
11240  RETURN
11250  PRINT D$;"BSAVE ONERR.BINFILE,A$4000,L20"
11260  ONERR GOTO 70
11270  IF R THEN PRINT D$;"BLOAD ONERR.BINFILE,A65535"
11280  POKE 216,0
11285  PRINT D$;"DELETE ONERR.BINFILE"
11290  RETURN

11300 REM 13 FILE TYPE MISMATCH (D/P)
11305  PRINT D$;"BSAVE ONERR.BINFILE,A$4000,L20"
11310  ONERR GOTO 70
11320  IF R THEN PRINT D$;"LOAD ONERR.BINFILE"
11330  POKE 216,0
11340  PRINT D$;"DELETE ONERR.BINFILE"
11350  RETURN

11400 REM 14 PROGRAM TOO LARGE (D/P)
11410  PRINT D$;"SAVE ONERR.TEST.TMP"
11420  IF P THEN 11450
11425  HL=PEEK(115): HH=PEEK(116) 
11430  POKE 115,PEEK(105): POKE 116,PEEK(106)
11432  ONERR GOTO 70
11435  IF R THEN PRINT D$;"LOAD ONERR.TEST.TMP"
11440  POKE 216,0
11441  POKE 115,HL: POKE 116,HH
11442  PRINT D$;"DELETE ONERR.TEST.TMP"
11445  RETURN
11450  POKE 103,PEEK(115): POKE 104,PEEK(116)
11455  ONERR GOTO 70
11460  IF R THEN PRINT D$;"LOAD ONERR.TEST.TMP"
11470  POKE 216,0
11475  POKE 103,1: POKE 104,8
11480  PRINT D$;"DELETE ONERR.TEST.TMP"
11490  POKE 216,0
11499  RETURN

11500 REM 15 NOT DIRECT COMMAND (D/P)
11510  ONERR GOTO 70
11520  REM NOT IMPLMENTED BECAUSE CAN
11525  REM ONLY BE TRIGGERED IN IMMEDIATE MODE
11530  POKE 216,0
11540  RETURN

11600 REM 16 SYNTAX ERROR (P)
11601  IF D THEN RETURN
11610  ONERR GOTO 70
11620  IF R THEN PRINT D$;"CAT,X0"
11630  POKE 216,0
11640  RETURN

11700 REM 17 DIRECTORY FULL (P)
11701  IF D THEN RETURN
11710  B=1
11715  PRINT D$;"PREFIX /"
11720  ONERR GOTO 70
11730  IF R THEN PRINT D$;"CREATE ONERR.SMALL";B;",T$00" : B=B+1 : GOTO 11730
11740  POKE 216,0
11750  B=B-1: PRINT D$;"DELETE ONERR.SMALL";B: IF B>1 THEN 11750
11760  RETURN

11800 REM 18 FILE NOT OPEN (P)
11801  IF D THEN RETURN
11805  PRINT D$;"CREATE ONERR.TEXTFILE,TTXT"
11810  ONERR GOTO 70
11820  IF R THEN PRINT D$;"READ ONERR.TEXTFILE"
11830  POKE 216,0
11840  PRINT D$;"DELETE ONERR.TEXTFILE"
11850  RETURN

11900 REM 19 DUPLICATE FILE NAME (P)
11901  IF D THEN RETURN
11905  PRINT D$;"CREATE ONERR.TEXTFILE,TTXT"
11910  ONERR GOTO 70
11920  IF R THEN PRINT D$;"CREATE ONERR.TEXTFILE,T$00"
11930  POKE 216,0
11940  PRINT D$;"DELETE ONERR.TEXTFILE"
11950  RETURN

12000 REM 20 FILE BUSY (P)
12001  IF D THEN RETURN
12010  PRINT D$;"OPEN ONERR.TEXTFILE"
12020  ONERR GOTO 70
12030  IF R THEN PRINT D$;"RENAME ONERR.TEXTFILE,ONERR.ERRFILE"
12040  POKE 216,0
12050  PRINT D$;"CLOSE ONERR.TEXTFILE"
12060  PRINT D$;"DELETE ONERR.TEXTFILE"
12070  RETURN

12100 REM 21 FILE(S) STILL OPEN (P)
12101  IF D THEN RETURN
12110  ONERR GOTO 70
12120  REM NOT IMPLEMENTED BECAUSE
12125  REM NOT TRAPPED BY ONERR GOTO
12130  POKE 216,0
12140  RETURN

Back to comp.sys.apple2.programmer | Previous | Next | Find similar


Thread

Re: ONERR recovery question ivan@ivanx.com - 2014-11-02 13:16 -0800

csiph-web