OverBug
Priskribo de la ĉi-paĝa enhavo
Ilo por esplori misfunkciadon de Beta DOS en Beta BASIC, por Sinclair ZX Spectrum.
Septembre 2010e, verkante la programon Alien-B, mi retrovis ĝenan mison de Beta DOS jam de mi konatan: La instrukcio de Beta DOS SAVE OVER
misfunkcias en Beta BASIC se uzata en proceduro, strukturo DO
... LOOP
aŭ subrutino. Ŝajne, tiu instrukcio de Beta DOS senkiale misŝanĝas la reveno-stakon de Beta BASIC.
Komence mi verkis simplan programon por testi kaj klopodi trovi la kialon de la problemo aŭ ĝiajn precizajn kondiĉojn. La fina rezulto estis OverBug, speco de montrilo pri la pluraj efikoj de la misfunkcio.
Ekranfotoj
Fontkodo
10 REM OverBug
20 REM This program tests in Beta BASIC the Beta DOS's SAVE OVER command, that has a bug even in the fixed version of Beta DOS.
30 REM It is written in Beta BASIC 4.0+D for ZX Spectrum 128 with a +D interface, on the fixed version of Beta DOS 1.3.
40
REM Copyright (C) 2010 Marcos Cruz (programandala.net)
50 REM License
programandala.net/license
60
REM 2010-09-11 First version.
70
REM Init
75 RANDOMIZE USR 58419
INPUT ""
REM Beta BASIC on
80 WINDOW ERASE
CLS #
90 LET titlewin=1,mainwin=2
100 WINDOW titlewin,0,175,255,25
WINDOW mainwin,0,143,255,143
110 LET tests=7
120 DIM t$(tests,30)
RESTORE
FOR n=1 TO tests
READ t$(n)
NEXT n
130
REM Main
140 title
WINDOW mainwin
150 CLS mainwin
160 PRINT INVERSE 1;"0"; INVERSE 0;" "; OVER 1; CSIZE 7;"About the SAVE OVER bug"
170 PRINT '"Tests to run:"''
180 FOR n=1 TO tests
PRINT INVERSE 1;n; INVERSE 0;" "; OVER 1; CSIZE 7;t$(n)
NEXT n
190 PRINT #0;"Choose an option (0-";tests;")"
200 DO
GET option
LOOP UNTIL tests>=option
210 CLS mainwin
220 IF NOT option THEN about
GO TO 150
230
REM Test dispatch
240 PRINT INVERSE 1;"Test ";option; INVERSE 0;":"'t$(option)'
250 PRINT ' INK 2;"Effect after SAVE OVER:"
260 GO TO ON option;500,560,640,730,820,920,1030
270
REM Procs
280 DEF PROC title
290 CLS titlewin
WINDOW titlewin
300 PRINT OVER 2; CSIZE 13;AT 0,0;"OverBug"
310 PRINT CSIZE 4,8;AT 0,24;"(C)2010 Marcos Cruz (programandala.net)"
320 PRINT CSIZE 6,8;AT 2,0; OVER 1;"Beta BASIC tester for Beta DOS's SAVE OVER"
330 PLOT 0,150
DRAW 255,0
340 END PROC
350 DEF PROC about
360 PRINT '"It seems the Beta DOS's SAVE"'"OVER command works fine in Beta"'"BASIC only in the main program"'"flow, but it corrupts the Beta"'"BASIC's return stack when"'"executed in a subrutine, a"'"DO...LOOP or a PROC."
370 PRINT '"I experienced that with the"'"fixed version of Beta DOS 1.3"'"and Beta BASIC 4.0+D."
380 PRINT '"In order to investigate the"'"issue I wrote this program."
390 PRINT #0;"Press any key"
PAUSE 0
400 END PROC
410 DEF PROC warning
420 LOCAL k$
430 PRINT #0;"Press ENTER to proceed;"'"any other key to cancel."
440 GET k$
IF k$<>CHR$ 13 THEN POP
GO TO 150
450 END PROC
460 DEF PROC s
470 RENUM
480 SAVE d*"OverBug" LINE 10
490 END PROC
500
REM Test 1
510 DATA "Normal"
520 PRINT "None."
530 PAPER 4
PRINT
LIST 550 TO 550
PAPER 7
540 warning
550 SAVE OVER d*"rubbish"
STOP
560
REM Test 2
570 DATA "GO SUB+RETURN"
580 PRINT "The border shows blue and cyan"'"stripes, like a turbo-loader."'"After pressing Space, the"'"stripes get red and cyan. After"'"pressing Break for a while"'"the system returns to BASIC."
590 PAPER 4
PRINT
LIST 610 TO 630
PAPER 7
600 warning
610 GO SUB 630
620 STOP
630 SAVE OVER d*"rubbish"
RETURN
640
REM Test 3
650 DATA "GO SUB+POP+GO TO"
660 PRINT "None."
670 PAPER 4
PRINT
LIST 690 TO 720
PAPER 7
680 warning
690 GO SUB 710
700 STOP
710 POP ret
PRINT "POP address:";ret
720 SAVE OVER d*"rubbish"
GO TO ret+1
730
REM Test 4
740 DATA "DO...LOOP"
750 PRINT "Error 'LOOP without DO'."
760 PAPER 4
PRINT
LIST 780 TO 810
PAPER 7
770 warning
780 DO
790 SAVE OVER d*"rubbish"
800 LOOP UNTIL 1
810 STOP
820
REM Test 5
830 DATA "DO...LOOP+GO SUB+RETURN"
840 PRINT "The border shows blue and cyan"'"stripes, like a turbo-loader."'"After pressing Space, the"'"stripes get red and cyan. After"'"pressing Break for a while"'"the system returns to BASIC."
850 PAPER 4
PRINT
LIST 870 TO 910
PAPER 7
860 warning
870 DO
880 GO SUB 910
890 LOOP UNTIL 1
900 STOP
910 SAVE OVER d*"rubbish"
RETURN
920
REM Test 6
930 DATA "DO...LOOP+GO SUB+POP+GO TO"
940 PRINT "Error 'LOOP without DO'."
950 PAPER 4
PRINT
LIST 970 TO 1020
PAPER 7
960 warning
970 DO
980 GO SUB 1010
990 LOOP UNTIL 1
1000 STOP
1010 POP ret
PRINT "POP address:";ret
1020 SAVE OVER d*"rubbish"
GO TO ret+1
1030
REM Test 7
1040 DATA "PROC"
1050 PRINT "The border shows blue and green"'"stripes, like a turbo-loader."'"Pressing some keys will change"'"the colors. "; INK 2;"Eventually, the"'"system will crash."
1060 PAPER 4
PRINT
LIST 1080 TO 1120
PAPER 7
1070 warning
1080 test7
1090 DEF PROC test7
1100 SAVE OVER d*"rubbish"
1110 END PROC
1120 STOP
Deŝutoj
La jenaj spegulkopioj de diskedoj de +D enhavas, krom la programo OverBug, jenojn:
- Beta DOS 1.3 (1990), fiksita por la programoj Betafix publikigitaj en la revuoj Format (numero 9/9, de 1996-05) kaj Outlet (numero 132, de 1998).
- Beta BASIC 4.0+D (1987), por ZX Spectrum 128 kun interfaco +D.
La komenciga dosiero Autoload enlegas ambajn Beta BASIC kaj la programon OverBug.
- overbug.mgt.zip (55.68 KiB) Spegulkopio de diskedo +D, kunpremita per zip -normo.
- overbug.mgt.gz (55.66 KiB) Spegulkopio de diskedo +D, kunpremita per gzip -normo.