'
'The program lines that you will need to modify will be in the range from 9000 to 9999. No other changes
'should be needed.
'
'Lines 9000 through 9070 set up the RS-232C port for the correct characteristics. They set the
'baud rate to 9600, the number of data bits to 8, the number of stop bits to 2, and set odd parity.
'They also reset all of the flags and turn off any interrupt modes the port may have. Line 9010 tells
'the program that the base address of the port chip is 58H (88 decimal). You should change all of
'these lines to set up your chip. If you have an 8250 then the only change necessary should be set-
'ting P to the correct base address in line 9010. Remember that these modifications need not
'agree line for line with the sample program but only that each complete routine does its par-
'ticular task in any way possible.
'
'Some computers may require that you set up the port from hardware rather than software. In this
'case it may be necessary to move some jumpers or change a DIP switch or two. Instructions for
'this will be found in your hardware manuals.
'
'
'
'The DSR (Data Set Ready) line is checked in lines 9100 to 9130. If the DSR bit is in the proper state
'(1) then F is set to 1, otherwise it is set toO. Line 9120 does all the work here. It checks the DSR bit
'(bit 5) of the status register on the 8250 chip. To check any bit (0-7) of a register you can use the
'general statement
'
'IF (INP(REGADDR) AND (2^BIT)) = (2^BIT) THEN ...
'
'This will be true if BIT is a 1. If you want to check that a bit is 0, replace the "=" with a "< >".
'
'
'
'Lines 9200 to 9230 toggle the DTR (Data Terminal Ready) line toO and then back to 1. They do this
'by turning the DTR bit of the control register off and then back on. To turn any particular bit off
'use the statement
'
'OUT REGADDR,INP(REGADDR) AND (256-2^BIT)
'
'and to turn any bit on use
'
'OUT REGADDR,INP(REGADDR) OR (2^BIT)
'
'Change lines 9210 and 9220 to reflect your register locations and bit numbers.
'
'
'
'The CTS (Clear to Send) bit is checked in line 9320 of the CHECK CTS LINE routine. If it is correct
'(off) then F is set to 1, otherwise it is set to 0. This routine starts at line 9300 and ends at line 9330.
'Change line 9320 to reflect your chip address and bit location.
'
'
'OCR'd with TextBridge Classic 2.0 - L. Kraemer 11/16/2016
'
'
100 'JE665 RS-232C SERIAL COMMUNICATION PROGRAM
110 'BY DAVID H NELSON
120 'SEPTEMBER 14, 1983
130 GOSUB 8000 'CLEAR THE SCREEN
140 CLEAR 1000
150 PRINT TAB(26);"JAMECO ELECTRONICS":PRINT
160 PRINT TAB(20);"JE665 RS-232C INTERFACE OPTION":PRINT
170 PRINT TAB(21);"SERIAL COMMUNICATION PROGRAM":PRINT:PRINT
180 PRINT TAB(26);"SEPTEMBER 14, 1983"
190 PRINT : PRINT : PRINT : PRINT : PRINT : PRINT
200 PRINT "INITIALIZING . . ."
210 '***** INITIALIZATION *****
220 F$="GPLSVECX"
230 CS=2:SI$="16Kbit (2K x 8) EPROM active"
240 BA=28672
250 FOR X=BA TO BA+8192
260 POKE X,255
270 NEXT X
280 DEF FNH$(X) = RIGHT$("00"+HEX$(PEEK(BA+X)),2)
300 'SELECT EPROM SIZE
310 GOSUB 8000 'CLEAR SCREEN
320 PRINT TAB(10);SI$:PRINT
330 PRINT TAB(20);"1 - 8Kbit (1K x 8)"
340 PRINT TAB(20);"2 - 16Kbit (2K x 8)"
350 PRINT TAB(20);"3 - 32Kbit (4K x 8)"
360 PRINT TAB(20);"4 - 64Kbit (8K x 8)"
370 PRINT : PRINT : PRINT
380 PRINT " SELECT EPROM SIZE >";
390 A$=INPUT$(1)
400 IF A$=CHR$(13) THEN 500
410 CS=VAL(A$)
420 IF CS<1 OR CS>4 THEN 390
430 IF CS=1 THEN SI$="8Kbit (1K x 8) EPROM active"
440 IF CS=2 THEN SI$="16Kbit (2K x 8) EPROM active"
450 IF CS=3 THEN SI$="32Kbit (4K x 8) EPROM active"
460 IF CS=4 THEN SI$="64Kbit (8K x 8) EPROM active"
470 CS=INT((2^CS)*2+.5)
500 '***** MAIN PROGRAM *****
510 GOSUB 8000 'CLEAR SCREEN
520 PRINT TAB(20);"<< JE665 MAIN MENU>>":PRINT
530 PRINT TAB(20);"G - GET DATA FROM DISK"
540 PRINT TAB(20);"P - PUT DATA ON DISK"
550 PRINT TAB(20);"L - LOAD DATA FROM PROGRAMMER"
560 PRINT TAB(20);"S - SAVE DATA TO PROGRAMMER"
570 PRINT TAB(20);"V - VIEW DATA"
580 PRINT TAB(20);"E - ENTER DATA"
590 PRINT TAB(20);"C - CHANGE EPROM SIZE"
600 PRINT TAB(20);"X - EXIT THIS PROGRAM"
610 PRINT : PRINT : PRINT TAB(10);SI$ : PRINT : PRINT
620 PRINT TAB(10);"ENTER SELECTION >";
630 S$=INPUT$(1)
640 IF S$="C" THEN 300
650 FOR S=1 TO 8
660 IF S$=MID$(F$,S,1) THEN 690
670 NEXT S
680 GOTO 630
690 ON S GOSUB 1000 , 2000 , 3000 , 4000 , 5000 , 6000 , 7000 , 7000
700 GOTO 500
1000 '***** GET DATA FROM DISK *****
1010 GOSUB 8000 'CLEAR SCRPEN
1020 PRINT TAB(10);"GET DATA FROM DISK":PRINT
1030 PRINT
1040 GOSUB 8100 'GET FILENAME
1050 IF FI$="" THEN RETURN
1060 ON ERROR GOTO 8300 'ERROR ROUTINE
1070 OPEN "R",#1,FI$
1080 FIELD#1,128 AS R$
1090 ON ERROR GOTO 0 'NO MORE ERROR HANDLING
1100 PRINT
1110 PRINT "GETTING DATA . . ."
1120 PRINT "[";TAB(CS*2);"]"
1130 FOR X = 1 TO CS*2
1140 GET#1,X
1150 PRINT "*";
1160 FOR Y%=1 TO 128
1170 POKE BA+(X-1)*128+Y%-1,ASC(MID$(R$,Y%,1))
1180 NEXT Y%
1190 NEXT X
1200 PRINT : PRINT
1210 PRINT "FUNCTION COMPLETE"
1220 CLOSE 1
1230 RETURN
2000 '***** PUT DATA ON DISK *****
2010 GOSUB 8000 ' CLEAR SCREEN
2020 PRINT TAB(10);"PUT DATA ON DISK":PRINT
2030 PRINT
2040 GOSUB 8100 'GET FILENAME
2050 IF FI$="" THEN RETURN
2060 ON ERROR GOTO 8300 'ERROR ROUTINE
2070 OPEN "R",#1,FI$
2080 FIELD#1,128 AS R$
2090 ON ERROR GOTO 0
2100 PRINT
2110 PRINT "PUTTING DATA . . ."
2120 PRINT "[";TAB(CS*2);"]"
2130 FOR X=1 TO CS*2
2140 PRINT "*";:P$=""
2150 FOR Y%=1 TO 128
2160 P$=P$+CHR$(PEEK(BA+(X-1)*128+Y%-1))
2170 NEXT Y%
2180 LSET R$=P$
2190 PUT#1,X
2200 NEXT X
2210 PRINT : PRINT
2220 PRINT "FUNCTION COMPLETE"
2230 CLOSE 1
2240 RETURN
3000 '***** LOAD DATA FROM PROGRAMMER *****
3010 GOSUB 8000 'CLEAR SCREEN
3020 PRINT TAB(10);"LOAD DATA FROM PROGRAMMER":PRINT
3030 PRINT
3040 GOSUB 9000 'SET UP PORT
3050 GOSUB 9100 'CHECK DSR LINE
3060 IF F=1 THEN 3100
3070 PRINT "PRESS <RETURN> WHEN PROGRAMMER IS READY"
3080 A$=INPUT$(1):IF A$<>CHR$(13) THEN RETURN
3090 GOTO 3050
3100 GOSUB 9200 'TOGGLE DTR LINE
3110 D=161:GOSUB 9500 'SEND CONTROL WORD A1
3120 NB=CS-1 'NUMBER OF BLOCKS - 1
3130 N1=NB:IF NB=31 THEN N1=15
3140 PRINT : PRINT "LOADING DATA . . ."
3150 FOR X=0 TO N1
3160 D=168:GOSUB 9500 'SEND CONTROL WORD A8
3170 FOR Y=0 TO 255
3180 DS=255:GOSUB 9400:POKE BA+X*256+Y,DR 'GET A BYTE
3190 NEXT Y
3200 GOSUB 9300 'CHECK CTS LINE
3210 IF F=0 THEN PRINT "NO ACKNOWLEDGE FROM PROGRAMMER":A$=INPUT$(1):RETURN
3220 NEXT X
3230 IF NB<>31 THEN RETURN
3240 D=160:GOSUB 9500 'SEND CONTROL WORD A0
3250 D=169:GOSUB 9500 'SEND CONTROL WORD A9
3260 FOR X=0 TO 15
3270 FOR Y=0 TO 255
3280 DS=255:GOSUB 9400:POKE BA+4096+X*256+Y,DR 'GET A BYTE
3290 NEXT Y
3300 GOSUB 9300 'CHECK CTS LINE
3310 IF F=0 THEN PRINT "NO ACKNOWLEDGE FROM PROGRAMMER":A$=INPUT$(1):RETURN
3320 D=173:GOSUB 9500 'SEND CONTROL WORD AD
3330 NEXT X
3340 GOSUB 9200 'TOGGLE DTR LINE
3350 D=161:GOSUB 9500 'SEND CONTROL WORD A1
3360 D=168:GOSUB 9500 'SEND CONTROL WORD A8
3370 RETURN
4000 '***** SAVE DATA TO PROGRAMMER *****
4010 GOSUB 8000 'CLEAR SCREEN
4020 PRINT TAB(10);"SAVE DATA TO PROGRAMMER":PRINT
4030 PRINT
4040 GOSUB 9000
4050 GOSUB 9100 'CHECK DSR LINE
4060 IF F=1 THEN 4100
4070 PRINT "PRESS <RETURN> WHEN PROGRAMMER IS READY"
4080 A$=INPUT$(1):IF A$<>CHR$(13) THEN RETURN
4090 GOTO 4050
4100 GOSUB 9200 'TOGGLE DTR LINE
4110 D=161:GOSUB 9500 'SEND CONTROL WORD A1
4120 NB=CS-1 'NUMBER OF BLOCKS - 1
4130 N1=NB:IF NB=31 THEN N1=15
4140 PRINT : PRINT "SAVING DATA . . ."
4150 FOR X=0 TO N1
4160 D170:GOSUB 9500 'SEND CONTROL WORD AA
4170 FOR Y=0 TO 255
4180 DS=PEEK(BA+X*256+Y):GOSUB 9400
4190 IF DS<>DR THEN PRINT "VERIFY ERROR AT ";X*256+Y:A$=INPUT$(1):RETURN
4200 NEXT Y
4210 GOSUB 9300 'CHECK CTS LINE
4220 IF F=0 THEN PRINT "NO ACKNOWLEDGE FROM PROGRAMMER":A$=INPUT$(1):RETURN
4230 NEXT X
4240 IF NB<>31 THEN RETURN
4250 D=160:GOSUB 9500 'SEND CONTROL WORD A0
4260 D=171:GOSUB 9500 'SEND CONTROL WORD AB
4270 FOR X=0 TO 15
4280 FOR Y=0 TO 255
4290 DS=PEEK(BA+4096+X*256+Y):GOSUB 9400
4300 IF DS<>DR THEN PRINT "VERIFY ERROR AT ";4096+X*256+Y:A$=INPUT$(1):RETURN
4310 NEXT Y
4320 GOSUB 9300 'CHECK CTS LINE
4330 IF F=0 THEN PRINT "NO ACKNOWLEDGE FROM PROGRAMMER":A$=INPUT$(1):RETURN
4340 D=175:GOSUB 9500 'SEND CONTROL WORD AF
4350 NEXT X
4360 GOSUB 9200 'TOGGLE DTR LINE
4370 D=161:GOSUB 9500 'SEND CONTROL WORD A1
4380 D=168:GOSUB 9500 'SEND CONTROL WORD A8
4390 RETURN
5000 '***** VIEW DATA (ASCII AND HEX) *****
5010 GOSUB 8000 'CLEAR SCREEN
5020 PRINT TAB(10);"VIEW DATA (ASCII AND HEX)":PRINT
5030 SA$="O"
5040 INPUT "ENTER THE STARTING ADDRESS (0 TO 1FFF) ";SA$
5050 GOSUB 8400 'HEX TO DECIMAL
5060 IF SA>8191 THEN 5030
5070 US$="\ \ \ \ \ \ \ \ \ \ :\ \ \ \:"
5080 PRINT : PRINT
5090 PRINT "ADDR DATA HEX DATA ASCII"
5100 PRINT "---- ------------------------------------ -------------------"
5110 FOR X=1 TO 16
5120 AD$ = RIGHT$("0000"+HEX$(SA),4)
5130 H1$ = FNH$(SA)+FNH$(SA+1)+FNH$(SA+2)+FNH$(SA+3)
5140 H2$ = FNH$(SA+4)+FNH$(SA+5)+FNH$(SA+6)+FNH$(SA+7)
5150 H3$ = FNH$(SA+8)+FNH$(SA+9)+FNH$(SA+10)+FNH$(SA+11)
5160 H4$ = FNH$(SA+12)+FNH$(SA+13)+FNH$(SA+14)+FNH$(SA+15)
5170 A1$="" : A2$=""
5180 FOR Y=0 TO 7
5190 A = PEEK(BA+SA+Y)
5200 IF A<32 OR A>127 THEN A1$=A1$+"." ELSE A1$=A1$+CHR$(A)
5210 NEXT Y
5220 FOR Y=8 TO 15
5230 A = PEEK(BA+SA+Y)
5240 IF A<32 OR A>127 THEN A2$=A2$+"." ELSE A2$=A2$+CHR$(A)
5250 NEXT Y
5260 PRINT USING US$;AD$,H1$,H2$,H3$,H4$,A1$,A2$
5270 SA=SA+16
5280 IF SA>=8192 THEN PRINT:PRINT "PRESS ANY KEY FOR MENU";:A$=INPUT$(1):RETURN
5290 NEXT X
5300 PRINT : PRINT : PRINT
5310 PRINT "PRESS <RETURN> TO CONTINUE - 'A' FOR NEW ADDRESS - ANY OTHER FOR MENU";
5320 A$=INPUT$(1):IF A$=CHR$(13) THEN PRINT : GOTO 5080
5330 IF A$="A" THEN 5000
5340 RETURN
6000 '***** ENTER DATA *****
6010 GOSUB 8000 'CLEAR SCREEN
6020 PRINT TAB(10);"ENTER DATA":PRINT
6030 SA$="0"
6040 INPUT "ENTER THE STARTING ADDRESS (0 TO 1FFF) ";SA$
6050 GOSUB 8400 'HEX TO DECIMAL
6060 IF SA>8191 THEN 6030
6070 AD=SA
6080 AD$=RIGHT$("0000"+HEX$(AD),4)
6090 PRINT AD$;":";
6100 I$=""
6110 INPUT I$
6120 IF I$="" THEN 6240
6130 FOR X=1 TO LEN(I$)
6140 IF MID$(I$,X,1)=" " THEN I$=LEFT$(I$,X-1)+RIGHT$(I$,LEN(I$)-X):GOTO 6140
6150 NEXT X
6160 L=LEN(I$):IF L/2<>INT(L/2) THEN 6090
6170 FOR Z=1 TO L-1 STEP 2
6180 SA$=MID$(I$,Z,2)
6190 GOSUB 8400 'HEX TO DECIMAL
6200 IF SA>255 THEN 6080
6210 POKE BASE+AD,SA : AD=AD+1 : IF AD>8191 THEN 6030
6220 NEXT Z
6230 GOTO 6080
6240 RETURN
7000 'EXIT THIS PROGRAM
7010 PRINT: PRINT : PRINT
7020 PRINT "ARE YOU READY TO EXIT (Y/N)?";
7030 IF INPUT$(1)<>"Y" THEN RETURN
7040 GOSUB 8000 'CLEAR SCREEN
7050 PRINT TAB(55);"THANK YOU"
7060 GOTO 9999
8000 'CLEAR THE SCREEN
8010 FOR ZZ=1 TO 25
8020 PRINT
8030 NEXT ZZ
8040 RETURN
8100 'GET A FILENAME
8110 ON ERROR GOTO 8500
8120 PRINT : PRINT "DIRECTORY:" : FILES "*.ROM" : PRINT : PRINT
8130 FI$=""
8140 INPUT "ENTER THE NAME OF THE FILE ";FI$
8150 LF = LEN(FI$)
8160 CL = INSTR(FI$,":")
8170 IF CL<>0 AND CL<>2 THEN 8140
8180 IF CL=0 AND LF>8 THEN 8140
8190 IF LF>10 THEN 8140
8200 PD = INSTR(FI$,".")
8210 IF PD>0 THEN 8140
8220 IF LF<1 THEN FI$="" : RETURN
8230 FI$ = FI$+".ROM"
8240 PRINT
8250 ON ERROR GOTO 0
8260 RETURN
8300 'ERROR HANDLING
8310 IF ERR=53 THEN PRINT "**** FILE NOT FOUND ****':CLOSE 1:RESUME 1030
8320 IF ERR=61 THEN PRINT "**** DISK FULL ****":CLOSE 1:RESUME 2030
8330 IF ERR=67 THEN PRINT "**** DIRECTORY FULL ****":CLOSE 1:RESUME 2030
8340 PRINT "ERROR NUMBER ";ERR;" AT LINE ";ERL :STOP
8350 RETURN
8400 'HEX TO DECIMAL (SA$ TO SA)
8410 SA=0
8420 FOR X=1 TO LEN(SA$)
8430 FOR Y=0 TO 15
8440 IF MID$(SA$,X,1)=HEX$(Y) THEN SA=SA*16+Y
8450 NEXT Y
8460 NEXT X
8470 RETURN
8500 'HANDLE "NO FILES"
8510 IF ERR=53 THEN PRINT "NO EPROM FILES"
8520 RESUME NEXT
9000 'SET UP THE RS 232 PORT
9010 P=5*16+8 'SET P TO PORT ADDRESS
9020 OUT P+3,128+8+4+2+1 'GET READY FOR BAUD DIVISOR
9030 OUT P,12:OUT P+1,0 'SEND BAUD DIVISOR
9040 OUT P+3,8+4+2+1 'SET 8 BITS,2 STOP BITS, ODD PARITY
9050 OUT P+5,0 'RESET FLAGS
9060 OUT P+1,0 'DISABLE ALL INTERRUPTS
9070 RETURN
9100 'CHECK DSR LINE (PROGRAMMER READY)
9110 F=0
9120 IF (INP(P+6)AND 32)=32 THEN F=1 'DSR BIT IS ON
9130 RETURN
9200 'TOGGLE DTR LINE (SIGNAL "COMPUTER READY")
9210 OUT P+4,INP(P+4)AND 254 'TURN DTR BIT OFF
9220 OUT P+4,INP(P+4)OR 1 'TURN DTR BIT BACK ON
9230 RETURN
9300 'CHECK CTS LINE (PROGRAMMER ACKNOWLEDGE)
9310 F=0
9320 IF (INP(P+6)AND 16)<>16 THEN F=1 'CTS BIT IS OFF
9330 RETURN
9400 'SEND DATA BYTE
9410 'DS - DATA SEND DR - DATA RECEIVE
9420 IF (INP(P+5)AND32)<>32 THEN 9420 'WAIT FOR TX REG EMPTY
9430 OUT P,DS 'SEND THE BYTE
9440 IF (INP(P+5)AND 1)<> 1 THEN 9440 'WAIT FOR DATA READY
9450 DR = INP(P) 'GET THE ECHO
9460 RETURN
9500 'SEND CONTROL WORD
9510 'D - CONTROL WORD
9520 OUT P,D 'SEND IT OUT
9530 RETURN
9999 END