Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.sys.apple2.programmer > #1384
| 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 |
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
Re: ONERR recovery question ivan@ivanx.com - 2014-11-02 13:16 -0800
csiph-web