home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Supreme Volume 6 #1
/
swsii.zip
/
swsii
/
178
/
JRXMODEM.ZIP
/
JRXMODEM.BAS
next >
Wrap
BASIC Source File
|
1985-12-20
|
13KB
|
432 lines
10 REM *******************************************
12 REM * PCJR XMODEM COMMUNICATIONS PROGRAM
15 REM * FOR IBM INTERNAL MODEM AT 300 BAUD
20 REM *
25 REM * JRXMODEM.BAS
30 REM *
35 REM * BY DAVID W. CARROLL
40 REM * COPYRIGHT 1984
45 REM * ALL RIGHTS RESERVED
50 REM * VERSION XMODEM X38A
55 REM * 11/07/84 3:18 pm
60 REM * FROM
65 REM * "TELECOMMUNICATIONS WITH THE PCJR"
70 REM * BY DAVID W. CARROLL
75 REM * MICRO TEXT/PRENTICE HALL - 1984
80 REM *
85 REM * USE BASICA /C:8192 TO RUN THIS
90 REM * PROGRAM
95 REM *******************************************
100 CLS
110 DEFINT A-Z
120 SCREEN 0,0
130 WIDTH 80
140 CLOSE
150 ON ERROR GOTO 7000
160 KEY OFF
170 GOSUB 1490
180 DIM A(4096)
190 DIM B$(4)
200 DISK =0
210 TER$="TERMINAL"+SPACE$(7)
220 MO$=TER$
230 FE$="LF-"
240 SEND =0
250 PAUSE1=0
260 ONLINE=-1
270 PAUSE=0
280 HALF=0
290 DU$="FULL DUPLEX"
300 ST$="ON LINE"
310 PRINT "Please wait....."
320 LOCATE,,1
330 N$=CHR$(14)
340 XON$=CHR$(17):XOFF$=CHR$(19)
350 ACK$=CHR$(6):NAK$=CHR$(21)
360 SOH$=CHR$(1):EOT$=CHR$(4):CAN$=CHR$(24)
370 BK$=CHR$(29)+CHR$(32)+CHR$(29)
380 BK1$=CHR$(32)+CHR$(29)
390 FEED=0
400 LF$=CHR$(10)
410 OPEN "COM1:300,N,8,1" AS 1
420 REM **** PUT DEFAULT TELEPHONE NUMBER IN NEXT LINE ****
430 NUM$="254-3408":REM A.B.Dick / PCMODEM NUMBER
440 PRINT #1,N$;"I "
450 PRINT "INITIALIZING MODEM..."
460 FOR I=1 TO 7000:NEXT I
470 GOSUB 1700
480 PRINT
490 PRINT "Enter phone number to call or <Enter> for default - ";
500 INPUT NX$
510 IF NX$=""THEN GOTO 540
520 NUM$=NX$
530 GOSUB 1700
540 PRINT
550 PRINT "Hit <Enter> to place call, <Esc> to quit - ";
560 X$=INKEY$:IF X$="" THEN 560
570 IF X$=CHR$(27) THEN 1440
580 GOSUB 1570
590 ON KEY(1) GOSUB 1890
600 ON KEY(2) GOSUB 1930
610 ON KEY(3) GOSUB 3000
620 ON KEY(4) GOSUB 4000
630 ON KEY(5) GOSUB 8000
640 ON KEY(6) GOSUB 6000
650 ON KEY(7) GOSUB 1200
660 ON KEY(8) GOSUB 1310
670 ON KEY(9) GOSUB 1380
680 ON KEY(10) GOSUB 1440
690 ON KEY(11) GOSUB 1570
700 PRINT #1,N$;"F 4"
710 FOR I=1 TO 500:NEXT I
720 PRINT #1,N$;"C 3"
730 FOR I=1 TO 500:NEXT I
740 PRINT #1,N$;"D ";NUM$
750 PRINT "DIALING - "
760 GOSUB 780
770 GOTO 900
780 KEY(1) ON
790 KEY(2) ON
800 KEY(3) ON
810 KEY(4) ON
820 KEY(5) ON
830 KEY(6) ON
840 KEY(7) ON
850 KEY(8) ON
860 KEY(9) ON
870 KEY(10) ON
880 KEY(11) ON
890 RETURN
900 IF EOF(1) THEN 1030
910 IF LOC(1) = 255 AND PAUSE1 = 0 THEN PRINT#1,XOFF$;:PAUSE1=-1
920 I$=INPUT$(1,1)
930 I$=CHR$(ASC(I$) AND 127)
940 IF I$>CHR$(31) THEN 1010
950 IF I$="" OR I$=CHR$(10) OR I$=CHR$(0) THEN 1030
970 IF I$<>CHR$(8) THEN 1010
980 IF POS(0)=1 THEN 1000
990 PRINT BK$;:GOTO 1020
1000 PRINT BK1$;:GOTO 1020
1010 PRINT I$;
1020 IF DISK THEN GOSUB 1120
1030 IF EOF(1) AND PAUSE1 THEN PRINT #1,XON$;:PAUSE1=0
1040 IF SEND THEN RETURN
1050 K$=INKEY$:IF K$<>"" THEN PRINT #1,K$;:IF HALF THEN GOSUB 1080
1060 IF FEED AND K$=CHR$(13) THEN PRINT #1,LF$;
1070 GOTO 900
1080 IF K$<>CHR$(8) THEN 1110
1090 IF POS(0) > 1 THEN PRINT BK$;:RETURN
1100 IF POS(0) = 1 THEN PRINT BK1$;:RETURN
1110 PRINT K$;:RETURN
1120 A(I1)=ASC(I$):I1=I1+1
1130 IF (EOF(1) AND I1>128) OR I1>512 THEN GOSUB 1150
1140 RETURN
1150 GOSUB 5000:PAUSE1=-1
1160 FOR I2=1 TO 300:NEXT I2
1170 FOR J1=0 TO I1:PRINT #3,CHR$(A(J1));:NEXT J1:I1=0
1180 GOSUB 5000:PAUSE1=0
1190 RETURN
1200 REM * FN 7
1210 GOSUB 1570
1220 PRINT "Enter new number - ";
1230 INPUT NX$
1240 IF NX$="" THEN 1270
1250 NUM$=NX$
1260 GOSUB 1700
1270 PRINT #1,N$;"D ";NUM$
1280 GOSUB 1570
1290 PRINT "DIALING -"
1300 RETURN
1310 REM * FN 8
1320 PRINT #1,N$
1330 FOR I=1 TO 500:NEXT I
1340 PRINT #1,N$;"R "
1350 PRINT
1360 PRINT "REDIALING -"
1370 RETURN
1380 REM * FN 9
1390 PRINT
1400 PRINT #1,N$;"H "
1410 PRINT "HANGING UP..."
1420 FOR I=1 TO 1000:NEXT I
1430 RETURN
1440 REM * FN 0
1450 PRINT "BACK TO BASIC NOW..."
1460 CLOSE
1470 CLS
1480 END
1490 REM * TITLE SCREEN
1500 CLS
1510 PRINT TAB(20);"IBM PCjr TERMINAL COMMUNICATIONS PROGRAM"
1520 PRINT TAB(20);" for the IBM Internal Modem"
1530 PRINT TAB(20);" Copyright (c) 1984"
1540 PRINT TAB(20);" by David W. Carroll"
1550 PRINT
1560 RETURN
1570 REM * WORK SCREEN
1580 CLS
1590 PRINT TAB(20);"IBM PCjr TERMINAL COMMUNICATIONS PROGRAM"
1610 PRINT TAB(20);"Fn 1 = Auto Line Feed Fn 2 = Echo On/Off"
1620 PRINT TAB(20);"Fn 3 = ASCII File XMT Fn 4 = ASCII File Capture ON/OFF"
1630 PRINT TAB(20);"Fn 5 = XMODEM File XMT Fn 6 = XMODEM File Recv"
1640 PRINT TAB(20);"Fn 7 = New Number Fn 8 = Start redial"
1650 PRINT TAB(20);"Fn 9 = Hang up phone Fn 0 = Quit to BASIC"
1660 PRINT TAB(20);CHR$(24);" = Display Menu"
1670 PRINT TAB(20);"<Esc> to cancel operation in progress."
1680 PRINT :PRINT
1690 MO$=TER$
1700 REM * PRINT STATUS LINE
1710 COL=POS(0)
1720 LN=CSRLIN
1730 COLOR 0,7
1740 LOCATE 25,1
1750 PRINT SPACE$(79);
1760 LOCATE 25,1
1770 PRINT "STAT: ";ST$;
1780 LOCATE 25,16
1790 PRINT FE$;
1800 LOCATE 25,20
1810 PRINT "MODE: ";MO$;
1820 LOCATE 25,45
1830 PRINT "TELE # ";NUM$;
1840 LOCATE 25,68
1850 PRINT DU$;
1860 LOCATE LN,COL,1
1870 COLOR 7,0
1880 RETURN
1890 FEED = NOT FEED
1900 IF NOT FEED THEN 1920
1910 FE$="LF+":GOSUB 1700:RETURN
1920 FE$="LF-":GOSUB 1700:RETURN
1930 HALF=NOT HALF : IF NOT HALF THEN 1950
1940 DU$="HALF DUPLEX":GOSUB 1700:RETURN
1950 DU$="FULL DUPLEX":GOSUB 1700:RETURN
3000 REM * SEND ASCII FILE
3010 MS$="DISK --> MODEM":GOSUB 1700
3020 PAUSE = 0
3030 PRINT
3040 PRINT "Send ASCII File":PRINT
3050 PRINT
3060 PRINT "Enter SEND file name: ";
3070 INPUT F$
3080 IF F$="" THEN 3320
3090 OPEN "I",#3,F$
3100 PRINT "Transmit file ";F$;
3110 INPUT "(Y/N) ";X$
3120 X$=LEFT$(X$,1)
3130 IF X$<>"Y" AND X$<>"y" THEN 3320
3140 SEND=NOT SEND
3150 WHILE NOT EOF(3) AND K$<>CHR$(27)
3160 IF PAUSE THEN 3210
3170 LINE INPUT #3,TX$
3180 PRINT #1,TX$
3190 IF FEED THEN PRINT 1,LF$;
3200 FOR I=1 TO 500:NEXT I
3210 WHILE NOT EOF(1)
3220 GOSUB 920
3230 IF I$=XOFF$ THEN PAUSE=-1
3240 IF I$=XON$ THEN PAUSE = 0
3250 WEND
3260 K$=INKEY$
3270 WEND
3280 SEND=NOT SEND
3290 CLOSE 3:DISK = 0: PRINT "File closed" : GOSUB 1690
3300 PRINT
3310 RETURN
3320 PRINT "Aborted"
3330 PRINT
3340 GOSUB 1690
3350 IF NOT ONLINE THEN GOSUB 5000
3360 DISK = 0
3370 RETURN
4000 REM * RECEIVE ASCII FILE
4010 DISK = NOT DISK
4020 IF DISK THEN 4080
4030 GOSUB 1150
4040 CLOSE 3
4050 PRINT :PRINT "File closed"
4060 GOSUB 1690
4070 RETURN
4080 I1 = 0
4090 MO$= "MODEM -->DISK ":GOSUB 1700
4100 PRINT
4110 PRINT "Capture ASCII File":PRINT
4120 GOSUB 5000
4130 INPUT "Enter RECEIVE Filename: ",F$: IF F$="" THEN 4210
4140 CLOSE 3:OPEN "I",#3,F$
4150 PRINT "File ";F$;:INPUT "Exists - Erase? (Y/N) ", X$
4160 PRINT
4170 PRINT
4180 IF LEFT$(X$,1)="Y" OR LEFT$(X$,1)="y" THEN 4200
4190 GOTO 4130
4200 CLOSE 3:OPEN "O",#3,F$:GOSUB 5000:RETURN
4210 PRINT "Aborted"
4220 PRINT
4230 CLOSE 3
4240 GOSUB 5000
4250 DISK=0
4260 RETURN
4270 REM * GET A CHARACTER - XMODEM
4280 FOR J=1 TO T:IF NOT EOF(1) THEN W$=INPUT$(1,1):RETURN
4290 NEXT J:W$="":RETURN
4300 REM * MULTI-TRY
4310 T=T1*10
4320 FOR B=1 TO 10
4330 GOSUB 4270
4340 K$=INKEY$:IF K$=CHR$(27) THEN 6450
4350 IF W$=SOH$ THEN RETURN
4360 IF W$=EOT$ THEN 6360
4370 IF W$=CAN$ THEN 6460
4380 IF W$<>""THEN GOSUB 6470 :PRINT #1,NAK$;:GOTO 4300
4390 PRINT "Timeout ";B
4400 BAD=BAD+1
4410 NEXT B
4420 GOSUB 6470
4430 GOTO 6450
5000 REM * SEND XOFF/XON
5010 ONLINE = NOT ONLINE : IF NOT ONLINE THEN 5030
5020 PRINT #1,XON$;:ST$="ON LINE ":GOSUB 1700:RETURN
5030 PRINT #1,XOFF$;:ST$="OFF LINE ":GOSUB 1700:RETURN
6000 REM * RECEIVE FILE WITH X MODEM PROTOCOL
6010 PRINT "Receive File With XMODEM Protocol":PRINT
6020 MO$="XMODEM --> DISK":GOSUB 1700
6030 GOSUB 4120
6040 V$="":SEC=1:BLK=1:BAD=0:N1=0:T1=240
6050 GOSUB 6470
6060 PRINT #1,NAK$;
6070 GOSUB 4300
6080 T=T1
6090 V$=V$+W$
6100 WHILE LEN(V$) <=131
6110 X1=0
6120 GOSUB 4270
6130 IF W$<>"" THEN 6160
6140 X1=X1+1:PRINT "Character Timeout ";X1 : BAD=BAD+1: IF X1>1 THEN 6180
6150 GOTO 6120
6160 V$=V$+W$
6170 WEND
6180 IF LEN(V$) = 132 THEN Z$=MID$(V$,4,128) :N=132:GOTO 6230
6190 IF V$=EOT$ THEN 6360
6200 IF V$=CAN$ THEN 6460
6210 GOTO 6380
6220 IF SEC=ASC(MID$(V$,2,1))+1 AND (SEC XOR 255)=ASC(MID$(V$,3,1)) THEN 6420
6230 IF SEC<> ASC(MID$(V$,2,1)) THEN 6410
6240 IF (SEC XOR 255) <> ASC(MID$(V$,3,1)) THEN 6430
6250 FOR Q=1 TO 128 : CK=CK+ASC(MID$(Z$,Q,1)):NEXT
6260 IF (CK AND 255) <> ASC(MID$(V$,N,1)) THEN 6400
6270 IF BAD = 0 THEN LOCATE CSRLIN-1,1
6280 PRINT "Received #";BLK : SEC=255 AND (SEC+1):BLK=BLK+1:BAD=0
6290 N1=N1+1:B$(N1)=Z$
6300 IF N1=4 THEN 6330
6310 PRINT #1,ACK$;
6320 V$="":CK=0:GOTO 6070
6330 PRINT #3,B$(1);B$(2);B$(3);B$(4);
6340 N1=0:GOTO 6310
6350 BAD = BAD + 1 : GOTO 6070
6360 IF N1=0 THEN 6440
6370 FOR I=1 TO N1:PRINT #3,B$(I);:NEXT I:GOTO 6440
6380 PRINT "Short Block in #" ;BLK:PRINT #1,NAK$;:GOTO 6350
6390 PRINT "Long Block in #" ;BLK:PRINT #1,NAK$;:GOTO 6350
6400 PRINT "Checksum Error in #";BLK:PRINT #1,NAK$;:GOTO 6350
6410 PRINT "Block # Error in #";BLK:PRINT #1,NAK$;:GOTO 6350
6420 PRINT "Block # Repeated in #";BLK-1 :BAD=BAD+1:GOTO 6310
6430 PRINT "Complement Error in #";BLK:PRINT #1,NAK$:GOTO 6350
6440 PRINT "File Closed.":CLOSE 3:PRINT#1,ACK$;:GOTO 6490
6450 PRINT "Transfer Canceled":CLOSE #3:KILL F$:PRINT #1,CAN$;:GOTO 6490
6460 PRINT "Transfer Aborted at Receiver":CLOSE 3:KILL F$:GOTO 6490
6470 REM * PURGE BUFFER
6480 WHILE NOT EOF(1) :JUNK$=INPUT$(1,1):WEND:RETURN
6490 PRINT:GOSUB 1690:GOSUB 780:GOTO 900
7000 REM ERROR VECTOR TABLE
7010 PRINT
7020 IF ERR=24 THEN PRINT "Device Timeout":PRINT :RESUME 6490
7030 IF ERR=27 THEN PRINT "Printer" :PRINT :RESUME 6490
7040 IF ERR=57 AND ERL=4280 THEN RESUME 4280
7050 IF ERR=57 AND ERL=920 THEN RESUME 900
7060 IF ERR=57 THEN PRINT "Device I/O Error":PRINT :RESUME 6490
7070 IF ERR=52 THEN PRINT "Bad Filename" : GOTO 7170
7080 IF ERR=61 THEN PRINT "Disk Full" : GOTO 7170
7090 IF ERR=67 THEN PRINT "Directory Full" : GOTO 7170
7100 IF ERR=70 THEN PRINT "Disk Write Protected" : GOTO 7170
7110 IF ERR=71 THEN PRINT "Drive Not Ready" : GOTO 7170
7120 IF ERR=72 THEN PRINT "Disk Media Error" : GOTO 7170
7130 IF ERR=53 AND ERL=4140 THEN RESUME 4200
7140 IF ERR=53 THEN PRINT "File Not Found" : PRINT : FILES: GOTO 7170
7150 IF ERR=58 THEN PRINT "File Already Exists": PRINT :FILES:GOTO 7170
7160 ON ERROR GOTO 0
7170 PRINT :DISK=0:CLOSE 3:IF NOT ONLINE THEN GOSUB 5000
7180 LOCATE ,,1:RESUME 6490
8000 REM * SEND FILE WITH XMODEM PROTOCOL
8010 PRINT
8020 PRINT "Send File With XMODEM Protocol":PRINT
8030 MO$="DISK --> XMODEM":GOSUB 1700
8040 IC%=INP(&H3FC)
8050 IZ%=IC% AND &HFB
8060 OUT &H3FC, IZ%
8070 PRINT #1,N$;"T 0"
8080 PRINT
8090 PRINT "Enter SEND file name: ";
8100 INPUT F$
8110 IF F$="" THEN 8200
8120 OPEN "I",#3,F$
8130 CLOSE 3
8140 OPEN F$ AS 3 LEN=128:FIELD #3,128 AS Z$
8150 PRINT "Transmit file ";F$;
8160 INPUT " (Y/N) ";X$
8170 X$=LEFT$(X$,1)
8180 IF X$<>"Y" AND X$<>"y" THEN 8200
8190 GOTO 8240
8200 PRINT
8210 IF NOT ONLINE THEN GOSUB 5000
8220 DISK = 0
8230 GOTO 8580
8240 SEC=0:GOSUB 6480
8250 EOT=0 :W$="":FL!=LOF(3):TBLK!=LOF(3)/128
8260 BKS=INT(TBLK!)
8270 IF LOF(3) MOD 128>0 THEN BKS=BKS+1
8280 PRINT "Total blocks to send: ";BKS
8290 PRINT :PRINT
8300 BLK=0:CT!=0:BAD=0
8310 WHILE NOT EOF(1)
8320 W$=INPUT$(1,1)
8330 IF W$=CAN$ THEN 8580
8340 IF W$=NAK$ THEN 8430
8350 WEND
8352 IF INKEY$=CHR$(27) THEN 8580
8354 GOTO 8310
8360 WHILE NOT EOF(1)
8370 W$=INPUT$(1,1)
8380 IF W$=ACK$ THEN CK=0 : W$="":GOTO 8420
8390 IF W$=NAK$ THEN BAD=BAD+1:GOSUB 6480:GOTO 8520
8400 IF W$=CAN$ THEN 8580
8410 WEND
8412 IF INKEY$=CHR$(27) THEN 8580
8414 GOTO 8360
8420 IF EOT THEN 8590
8430 CK=0:W$="":BLK=BLK+1:BAD=0
8440 CT!=CT!+128:GET#3,BLK
8450 IF CT!<=FL! THEN 8470
8460 Z$=MID$(Z$,1,128-(CT!-FL!))+STRING$(CT!-FL!,CHR$(0)):EOT=-1
8470 CK=0:FOR I=1 TO LEN(Z$) : CK=CK+ASC(MID$(Z$,I,1)):NEXT
8480 CK=(CK AND 255)
8490 IF CK>255 THEN CK=CK-256:GOTO 8490
8500 SEC=(255 AND BLK)
8510 A$=SOH$+CHR$(SEC)+CHR$(SEC XOR 255)+Z$+CHR$(CK)
8520 IF BAD > 9 THEN 8580
8530 PRINT #1,A$;
8540 IF BAD=0 THEN LOCATE CSRLIN-1,1
8550 PRINT "Sending #";BLK;" --- ";INT((BLK/BKS)*100);"% COMPLETE"
8560 K$=INKEY$:IF K$=CHR$(27) THEN 8580
8570 GOTO 8360
8580 PRINT "Transfer Aborted":CLOSE 3:PRINT #1,CAN$;:GOTO 8660
8590 PRINT "Transmission Ended.":CLOSE 3:PRINT #1,EOT$;
8660 IC%=INP(&H3FC)
8670 IZ%=IC% OR &H4
8680 OUT &H3FC, IZ%
8690 WHILE EOF(1)
8700 WEND
8710 I$=INPUT$(1,1)
8720 IF I$=ACK$ THEN PRINT "Transfer Acknowledged":PRINT :RETURN 900
8730 RETURN 930
8740 REM **** END OF PROGRAM ****