Skip to content

Crash on setting WIDTH on COM1 with no serial port connected (v1.2 only) #98

@simplecloudservlet

Description

@simplecloudservlet

Bug report

Problem

Bug detected running a sample from the documentation (Leon Peyre)
I tried the following program in PC-BASIC:

COMM.BAS

This program was written by Bill Gates, and it is available at:
http://peyre.x10.mx/GWBASIC/DOS11Samples.zip

Steps

  1. load "comm"
  2. run
  3. Press key number 1
  4. Press any other key (I tried spacebar, but others also gives errors)
  5. bug

Program

COMM.BAS

Crash log

30 WIDTH "com1:",255:DEF SEG

run.py:66, run_once
if not statements.parse_statement();
statements.py:132, parse_statement
elif c = tk.WIDTH: exec_width(ins)
statements.py:2480, exec_width
dev.set_width(w)
AttributeError: 'NoneType' object has no attribute 'set_width'

Bug screenshot is available at:
https://cdn1.imggmi.com/uploads/2019/4/7/ee0ad46f9042eb53f4b268a6e70984fb-full.png

Notes

PC-BASIC version: 1.2.14
Operating system version: VirtualBox, Linux Ubuntu 16.04 LTS

COMM.BAS source code:

1 REM The IBM Personal Computer Comm
2 REM Version 1.10 (C)Copyright IBM Corp 1981, 1982
3 REM Licensed Material - Program Property of IBM
4 REM Author - M. C. Rojas
5 CLS:GOTO 40
10 KEY OFF:SCREEN 0,0:WIDTH 40:COLOR 7,0:CLS:POKE 106,0
11 FOR I=1 TO 10:KEY I,"":NEXT
12 CLOSE:DEFINT A-Z:FALSE=0:TRUE=NOT FALSE:XOFF$=CHR$(19):XON$=CHR$(17):ON ERROR GOTO 460:T=0:ECH$=""
15 DEF SEG=0:IF (PEEK(&H410) AND &H30)=&H30 THEN WIDTH 80:T=20:MODE$="b":DEF SEG:GOTO 30
16 FOR I=1 TO 10:KEY I,"":NEXT
17 LOCATE 25,10+T/2:PRINT"F1 = 40 COLUMN F2 = 80 COLUMN"
18 DEF SEG
30 WIDTH "com1:",255:DEF SEG
40 LOCATE 2:PRINT TAB(10+T) "COMMUNICATIONS MENU"
50 LOCATE 6,3+T:PRINT "Choose one of the following:"
60 LOCATE 9,10+T:PRINT "1 Description of program"
70 PRINT TAB(10+T) "2 Dow Jones/News Retrieval"
80 PRINT TAB(10+T) "3 IBM Personal Computer"
90 PRINT TAB(10+T) "4 Series/1"
100 PRINT TAB(10+T) "5 THE SOURCE"
110 PRINT TAB(10+T) "6 Other service"
115 PRINT TAB(10+T) "7 End program"
120 LOCATE 18:PRINT SPACE$(40+T):LOCATE 18,3+T,1:PRINT "choice";
122 A$=INKEY$:IF A$="" THEN 122
123 IF LEN(A$)=1 THEN LT=VAL(A$):GOTO 130
124 IF MODE$="b" THEN LT=0:GOTO 130
125 B$=MID$(A$,2,1)
126 IF ASC(B$)=59 THEN WIDTH 40:T=0:CLS:GOTO 17 ELSE IF ASC(B$)=60 THEN WIDTH 80:T=20:CLS:GOTO 17 ELSE LT=0:GOTO 130
127 GOTO 122
130 IF LT=7 THEN CLS:PRINT TAB(10+T) "- COMMUNICATION ENDED -":END ELSE IF (LT=2 OR LT=4 OR LT=5) THEN 230 ELSE IF LT=1 THEN GOSUB 530:GOTO 10:ELSE IF (LT<1 OR LT>7) THEN FL=1:PRINT:PRINT TAB(3+T) "Invalid choice, try again"
140 IF FL=1 THEN FOR I=1 TO 2500:NEXT:LOCATE 19:PRINT SPACE$(40+T):FL=0:GOTO 120
145 CLS:LOCATE 1,10+T:PRINT "USER DEFINED LINK":IF LT=3 THEN LOCATE ,3+T:PRINT "TO ANOTHER IBM PERSONAL COMPUTER"
150 LOCATE 4,3+T,1:PRINT "BAUD RATE ";:GOSUB 465:SPEED$=B$
160 LOCATE 5,3+T,1:PRINT "PARITY ";:GOSUB 465:PARITY$=B$
170 LOCATE 6,3+T,1:PRINT "NUMBER OF BITS PER CHARACTER ";:GOSUB 465:BITS$=B$
180 LOCATE 7,3+T,1:PRINT "NUMBER OF STOP BITS ";:GOSUB 465:STP$=B$
185 LOCATE 8,3+T,1:PRINT "CHARACTERS ECHOED TO SCREEN (Y/N) ";:GOSUB 465:ECH$=B$
190 LOCATE 10,3+T,1:PRINT "Data entered correctly (Y/N) ";:GOSUB 465:CR$=B$
200 IF CR$="N" OR CR$="n" THEN 145 ELSE GOSUB 480
210 LOCATE 21,3:COMFIL$="COM1:"+SPEED$+","+PARITY$+","+BITS$+","+STP$
220 OPEN COMFIL$ AS #1
230 IF LT=4 THEN NM$="Series/1":GOSUB 470:OPEN "com1:300,e,7,2" AS 1
240 IF LT=2 THEN NM$="Dow Jones News/Retrieval":GOSUB 470:OPEN "com1:300,e,7" AS 1
250 IF LT=5 THEN NM$="THE SOURCE":GOSUB 470:OPEN "com1:300,e,7" AS 1
260 OPEN "SCRN:" FOR OUTPUT AS #2
270 LOCATE ,,1
280 PAUSE=FALSE:ON ERROR GOTO 460
290 B$=INKEY$:IF B$="" THEN 320
300 IF LEN(B$)>1 THEN IF ASC(MID$(B$,2,1))=68 THEN 450 ELSE 320 ELSE IF B$=CHR$(8) THEN LOCATE ,POS(0)-1,1:PRINT " ";:LOCATE ,POS(0)-1,1
310 PRINT #1,B$;: IF ECH$="Y" OR ECH$="y" THEN PRINT#2,B$;
320 IF EOF(1) THEN 290
330 IF LOC(1)>128 THEN PAUSE=TRUE:PRINT#1,XOFF$;
340 A$=INPUT$(LOC(1),#1)
360 FOR I=1 TO LEN(A$)
370 IF (ASC(MID$(A$,I,1))<31 AND MID$(A$,I,1)<>CHR$(13)) OR MID$(A$,I,1)=CHR$(127) THEN 410
380 IF MID$(A$,I,1)=CHR$(10) THEN MID$(A$,I,1)=" "
400 PRINT MID$(A$,I,1);
410 NEXT I
420 IF LOC(1)>0 THEN 290
430 IF PAUSE THEN PAUSE=FALSE:PRINT#1,XON$;
440 GOTO 290
450 POKE 106,0:CLOSE:ON ERROR GOTO 0:GOTO 10
460 IF ERR=68 THEN CLS:LOCATE 12,8+T:PRINT "THIS PROGRAM REQUIRES THE":PRINT TAB(3+T) "ASYNCHRONOUS COMMUNICATIONS ADAPTER.":END
461 IF ERR=24 THEN CLS:LOCATE 12,,1:PRINT "A DEVICE TIMEOUT ERROR HAS OCCURRED.":PRINT "MAKE SURE THE HARDWARE IS CORRECTLY":PRINT "SET UP, THEN PRESS ENTER.";:GOSUB 465:CLS:RESUME
462 RESUME
465 A$="":B$="":CR$="":WHILE A$<>CHR$(13)
466 A$=INKEY$:IF A$="" THEN 466 ELSE IF LEN(A$)>1 THEN IF ASC(MID$(A$,2,1))=68 THEN 450 ELSE 466:ELSE IF A$<>CHR$(8) THEN PRINT A$;:ELSE LOCATE ,POS(0)-1,1:PRINT " ";:LOCATE ,POS(0)-1,1:B$=MID$(B$,1,LEN(B$)-1)
467 IF A$<>CHR$(13) AND A$<>CHR$(8) THEN B$=B$+A$
468 WEND:RETURN
470 CLS:LOCATE 1,12+T:PRINT NM$:PRINT
480 PRINT:PRINT:PRINT TAB(3+T) "- Place your call, and insert the"
490 PRINT TAB(3+T) " phone receiver into the modem, or"
495 PRINT TAB(3+T) " switch your data set from talk to"
500 PRINT TAB(3+T) " data. Then press ENTER to begin. ":PRINT:PRINT
510 PRINT TAB(3+T) "- PRESS F10 TO GO TO MENU":PRINT
512 GOSUB 465
515 RETURN
530 CLS:LOCATE 1,15+T:PRINT "DESCRIPTION"
540 LOCATE 4,3+T:PRINT "An asynchronous communication link"
550 PRINT TAB(3+T) "will be established between the"
560 PRINT TAB(3+T) "selected service and the"
570 PRINT TAB(3+T) "IBM PERSONAL COMPUTER, as follows:"
580 LOCATE 9,3+T:PRINT "Baud rate";TAB(13+T)"300"
590 PRINT TAB(3+T) "Parity";TAB(14+T)"E"
600 PRINT TAB(3+T) "Data bits";TAB(14+T);"7
610 PRINT TAB(3+T) "Stop bits";TAB(14+T);"1 Dow Jones, THE SOURCE"
620 PRINT TAB(14+T) "2 Series/1"
630 LOCATE 15,3+T:PRINT "Options 3 and 6 allow for the above"
640 PRINT TAB(3+T) "characteristics to be supplied by"
650 PRINT TAB(3+T) "the user to define a communication"
660 PRINT TAB(3+T) "link to other services or computers."
661 IF MODE$="b" THEN 670
665 LOCATE 20,3+T:PRINT "You can select 40 column display or"
666 PRINT TAB(3+T) "80 column display by pressing F1 or"
667 PRINT TAB(3+T) "F2 before selecting menu choice."
670 LOCATE 24,3+T:PRINT "PRESS ANY KEY TO GO TO MENU";
671 CR$=INKEY$:IF CR$="" THEN 671 ELSE RETURN

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions