10 PRINT "VERSION 1.6 04/10/87" 20 STRING (((12+1)*10)+1),12 30 A=GET 40 A=(9*13)-1 : B=024H : C=12 50 BASEA=6000H : BASEC=7000H 60 AA=BASEA : AB=BASEA+1 : AC=BASEA+2 : AX=BASEA+3 70 CA=BASEC : CB=BASEC+1 : CC=BASEC+2 : CX=BASEC+3 80 DIM E(A),L(B),G(C),T(9) 90 GOSUB 3910 100 XBY(AX)=80H : XBY(CX)=88H 110 GOSUB 3510 120 G(8)=(G(8).AND.3FH).OR.80H : XBY(CA)=(G(8).OR.07H) 130 GOSUB 3580 140 IF G(1)<>0 THEN 170 150 L1=0EH : L2=0 : GOSUB 3780 160 GOTO 130 170 L=G(0) : GOSUB 3710 180 MODE=0 190 IF GET<>0 THEN 220 200 A=XBY(CC) : IF (A.AND.90H)<>90H THEN 570 210 GOTO 190 220 FOR X=1 TO 24 : PRINT : NEXT X 230 MODE=1 240 PRINT " CIRCUIT CELLAR SERIAL EPROM PROGRAMMER" 250 PRINT " COPYRIGHT 1986, CIRCUIT CELLAR INC." : PRINT 260 XBY(CX)=80H 270 GOSUB 3510 280 L=0 : GOSUB 3710 290 G(10)=G(10).AND.0DFH : XBY(CC)=G(10) 300 XBY(CA)=(XBY(CA).AND.3FH).OR.47H 310 L=G(0) : GOSUB 3710 320 PRINT : PRINT " PLEASE CHOOSE :" : PRINT 330 PRINT " 1 - READ EPROM DATA INTO MEMORY" 340 PRINT " 2 - COMPARE RAM MEMORY BUFFER DATA TO EPROM" 350 PRINT " 3 - PROGRAM RAM MEMORY BUFFER DATA INTO EPROM" 360 PRINT " 4 - VERIFY EPROM IS ERASED" 370 PRINT " 5 - DISPLAY (DUMP) RAM MEMORY BUFFER " 380 PRINT " 6 - CHANGE RAM MEMORY BUFFER CONTENTS" 390 PRINT " 7 - DOWNLOAD INTEL HEX FILE FROM TERMINAL" 400 PRINT " 8 - UPLOAD INTEL HEX FILE TO TERMINAL" 410 PRINT " 9 - SET EPROM TYPE " 420 PRINT " 10 - SET RAM MEMORY BUFFER STARTING ADDRESS" 430 PRINT : PRINT " CURRENT SETTINGS" 440 PRINT "EPROM TYPE ",$(G(0)+1)," SIZE ", 450 IF E((G(0)*G(3))+1)>=100H THEN PRINT "10000H", : GOTO 470 460 PH1. E((G(0)*G(3))+1)*100H, 470 PRINT " (", : PRINT E((G(0)*G(3))+1)*100H,") BYTES" 480 PRINT "RAM BUFFER STARTING ADDRESS ", 490 PH1. G(2), : PRINT " , WITH ", 500 IF G(1)>=100H THEN PRINT "10000H", : GOTO 520 510 PH1. G(1)*100H, 520 PRINT " (", : PRINT G(1)*100H,") BYTES AVAILABLE" 530 PRINT : PRINT "ENTER YOUR CHOICE :", 540 INPUT C : IF C<1.OR.C>10 THEN 530 550 C=C-1 : ON C GOSUB 890,4140,1370,2940,2100,2390,2790,4790,3390,4730 560 GOTO 290 570 A=XBY(CC) 580 IF (A.AND.80H)<>80H THEN 610 590 IF (A.AND.10H)<>10H THEN 670 600 GOTO 570 610 G(0)=G(0)+1 : IF G(0)>(G(11)-1) THEN G(0)=0 620 GOSUB 3510 630 G(8)=(G(8).AND.3FH).OR.80H : XBY(CA)=(G(8).OR.07H) 640 L=G(0) : GOSUB 3710 650 FOR X=1 TO 200 : NEXT X 660 GOTO 570 670 G(8)=(G(8).AND.3FH).OR.40H : XBY(CA)=(G(8).OR.07H) 680 G(2)=0 : S=0 690 I=G(0)*G(3) 700 E1=G(2)+((G(1)*100H)-1) : IF E1>0FFFFH THEN E1=0FFFFH 710 E2=(E(I+1)*100H)-1 720 IF E1<=E2 THEN E=E1 730 IF E1>E2 THEN E=E2 740 L1=22H : L2=0 : GOSUB 3780 750 GOSUB 890 760 FOR X=1 TO 200 : NEXT X 770 L1=22H : L2=0CH : GOSUB 3780 780 L=23H : GOSUB 3710 790 GOSUB 1370 800 FOR X=1 TO 200 : NEXT X 810 L=0CH : GOSUB 3710 820 GOSUB 4140 830 FOR X=1 TO 200 : NEXT X 840 IF DBY(1EH)<>0 THEN L1=0EH : L2=2 : GOSUB 3780 850 IF E=(E(I+1)*100H)-1 THEN 870 860 G(2)=E+1 : S=E+1 : GOTO 690 870 L=G(0) : GOSUB 3710 880 GOTO 570 890 L=20H : GOSUB 3710 900 IF MODE=0 THEN 1140 910 PRINT : PRINT "READ EPROM INTO MEMORY BUFFER" : PRINT 920 A=GET 930 PRINT "PRESS 'ENTER' TO READ EPROM INTO RAM MEMORY BUFFER," 940 PRINT "USING THE CURRENT BUFFER ADDRESS SETTINGS." 950 PRINT "ANY OTHER KEY TO SPECIFY START/END ADDRESSES" : PRINT 960 A=GET : IF A=0 THEN 960 970 IF A<>0DH THEN 1040 980 I=G(0)*G(3) : S=G(2) 990 E1=(S+(G(1)*256)-1) : IF E1>0FFFFH THEN E1=0FFFFH 1000 E2=(E(I+1)*256)-1 1010 IF E1<=E2 THEN E=E1 1020 IF E1>E2 THEN E=E2 1030 GOTO 1140 1040 PRINT "ENTER START ADDRESS IN EPROM TO BE READ :", : INPUT S 1050 PRINT "ENTER END ADDRESS IN EPROM TO BE READ :", : INPUT E 1060 S1=G(2) : E1=(G(2)+G(1)*100H)-1 1070 IF S>E THEN PRINT "START NOT LESS OR EQUAL TO END" : GOTO 1310 1080 IF SE1 THEN PRINT "HIGH ADDRESS NOT WITHIN RAM RANGE" : GOTO 1310 1100 IF S<=(E((G(0)*G(3))+1)*100H)-1 THEN 1120 1110 PRINT "LOW ADDRESS NOT WITHIN ROM RANGE" : GOTO 1310 1120 IF E<=(E((G(0)*G(3))+1)*100H)-1 THEN 1140 1130 PRINT "HIGH ADDRESS NOT WITHIN ROM RANGE" : GOTO 1310 1140 I=G(0)*G(3) 1150 G(8)=(G(8).AND.3FH).OR.80H : XBY(CA)=(G(8).OR.07H) 1160 G(9)=E(I+4) : G(10)=E(I+5) 1170 GOSUB 5210 1180 IF E(I+2)=26 THEN DBY(18H)=DBY(18H).AND.0DFH 1190 IF E(I+2)=28 THEN G(8)=G(8).AND.0F7H : DBY(1FH)=G(8) 1200 G(6)=DBY(18H) : G(5)=DBY(19H) 1210 XBY(CA)=G(8) : XBY(CB)=G(9) : XBY(CC)=G(10) 1220 XBY(AX)=89H : XBY(AA)=G(5) : XBY(AB)=G(6) : XBY(AC)=G(7) 1230 CALL 59B0H 1240 G(5)=0 : G(6)=0E8H : G(7)=0 1250 G(8)=E(I+3) : G(9)=E(I+4) : G(10)=E(I+5) 1260 XBY(CA)=G(8) : XBY(CB)=G(9) : XBY(CC)=G(10) 1270 XBY(AX)=80H : XBY(AA)=G(5) : XBY(AB)=G(6) : XBY(AC)=G(7) 1275 XBY(CA)=(G(8).OR.07H) 1280 IF MODE=0 THEN 1360 1290 PRINT : PRINT "READ COMPLETE" : PRINT 1300 GOTO 1320 1310 PRINT : PRINT "CAN'T READ EPROM AS YOU REQUESTED" : PRINT 1320 A=GET 1330 PRINT "PRESS 'ENTER' TO READ AGAIN, ANY OTHER KEY FOR MAIN MENU" 1340 A=GET : IF A=0 THEN 1340 1350 IF A=0DH THEN 890 1360 RETURN 1370 IF MODE=0 THEN M1=0 : GOTO 1750 1380 PRINT : PRINT "PROGRAM MEMORY BUFFER INTO EPROM" : PRINT 1390 A=GET 1400 PRINT "PRESS 'ENTER' TO PROGRAM THE WHOLE EPROM " 1410 PRINT "ANY OTHER KEY TO SPECIFY START/END ADDRESSES" : PRINT 1420 A=GET : IF A=0 THEN 1420 1430 IF A<>0DH THEN 1510 1440 IF G(2)<>0 THEN PRINT "RAM BUFFER DOES NOT START AT 0" : GOTO 2040 1450 IF (G(1)*100H)-1<(E((G(0)*G(3))+1)*100H)-1 THEN 1470 1460 S=0 : E=(E((G(0)*G(3))+1)*100H)-1 : GOTO 1570 1470 PRINT "RAM BUFFER NOT BIG ENOUGH TO PROGRAM WHOLE EPROM" 1480 PRINT "USE MULTIPLE PASSES, CHANGING THE RAM MEMORY STARTING" 1490 PRINT "ADDRESS AND SPECIFYING THE RANGES TO BE PROGRAMMED." 1500 GOTO 2040 1510 PRINT "ENTER START ADDRESS IN EPROM TO BE PROGRAMMED :", : INPUT S 1520 PRINT "ENTER END ADDRESS IN EPROM TO BE PROGRAMMED :", : INPUT E 1530 S1=G(2) : E1=(G(2)+(G(1)*100H))-1 1540 IF S>E THEN PRINT "START NOT LESS OR EQUAL TO END" : GOTO 2040 1550 IF SE1 THEN PRINT "HIGH ADDRESS NOT WITHIN RAM RANGE" : GOTO 2040 1570 IF S<=(E((G(0)*G(3))+1)*100H)-1 THEN 1590 1580 PRINT "LOW ADDRESS NOT WITHIN ROM RANGE" : GOTO 2040 1590 IF E<=(E((G(0)*G(3))+1)*100H)-1 THEN 1610 1600 PRINT "HIGH ADDRESS NOT WITHIN ROM RANGE" : GOTO 2040 1610 IF E((G(0)*G(3))+10)=0 THEN M1=0 : GOTO 1650 1620 PRINT : PRINT "ENTER 0 FOR NORMAL PROGRAMMING MODE, 1 FOR FAST MODE :" 1630 INPUT A : IF (A<>0).AND.(A<>1) THEN 1620 1640 M1=A 1650 PRINT : PRINT "ENTER 0 TO VERIFY BEFORE PROGRAMMING, 1 TO SKIP :", 1660 INPUT A 1670 IF (A<>0).AND.(A<>1) THEN 1650 1680 IF A=1 THEN GOTO 1750 1690 GOSUB 3130 1700 IF DBY(1EH)=0 THEN GOTO 1750 1710 PRINT : PRINT "ROM IS NOT ERASED IN AREA TO BE PROGRAMMED" 1720 PRINT "ENTER 0 TO STOP PROGRAMMING, 1 TO CONTINUE" 1730 INPUT A : IF (A<>0).AND.(A<>1) THEN 1710 1740 IF A=0 THEN 2040 1750 I=G(0)*G(3) 1760 G(8)=(E(I+3).AND.3FH).OR.80H 1770 G(9)=E(I+7) : G(10)=E(I+6) 1780 IF E(I+8)=1 THEN G(8)=G(8).OR.4 1790 L=23H : GOSUB 3710 1800 GOSUB 5210 1810 IF E(I+2)=26 THEN DBY(18H)=DBY(18H).AND.0DFH 1820 IF E(I+2)=28 THEN G(8)=G(8).AND.0F7H : DBY(1FH)=G(8) 1830 IF M1=0 THEN 1860 1840 G(9)=G(9).OR.8H 1850 DBY(1EH)=(E(I+12)*32)+E(I+11) 1860 G(6)=DBY(18H) : G(5)=DBY(19H) 1870 XBY(AX)=80H : XBY(AB)=G(6) : XBY(AA)=G(5) 1880 XBY(CA)=G(8) : XBY(CB)=G(9) : XBY(CC)=G(10) 1890 IF MODE=0 THEN GOTO 1910 1900 PRINT : PRINT "PROGRAMMING" 1910 IF M1=0 THEN CALL 59B3H 1920 IF M1=1 THEN CALL 59B6H 1930 G(5)=0 : G(6)=0E8H : G(7)=0 1940 G(8)=E(I+3) : G(9)=E(I+4) : G(10)=E(I+5) 1950 XBY(CB)=G(9) : XBY(CC)=G(10) : XBY(CA)=G(8) 1960 XBY(AX)=80H : XBY(AA)=G(5) : XBY(AB)=0E8H : XBY(AC)=G(7) 1965 XBY(CA)=(G(8).OR.07H) 1970 L=20H : GOSUB 3710 1980 IF MODE=0 THEN 2090 1990 PRINT "PROGRAMMING COMPLETE" 2000 GOSUB 4390 2010 L=20H : GOSUB 3710 2020 IF DBY(1EH)<>0 THEN 2040 2030 GOTO 2050 2040 PRINT : PRINT "CAN'T PROGRAM EPROM AS YOU REQUESTED" : PRINT 2050 A=GET 2060 PRINT "PRESS 'ENTER' FOR MORE PROGRAMMING, ANY OTHER KEY FOR MAIN MENU" 2070 A=GET : IF A=0 THEN 2070 2080 IF A=0DH THEN 1370 2090 RETURN 2100 PRINT "ENTER START ADDRESS TO BE DUMPED :", : INPUT S 2110 PRINT "ENTER END ADDRESS TO BE DUMPED :", : INPUT E 2120 S1=G(2) : E1=(G(2)+(G(1)*100H))-1 2130 IF S>E THEN PRINT "START NOT LESS OR EQUAL TO END" : GOTO 2100 2140 IF SE1 THEN PRINT "HIGH ADDRESS NOT WITHIN RAM RANGE" : GOTO 2100 2160 PRINT : S=8*INT(S/8) 2170 IF E<>(8*INT(E/8)) THEN E=(8*INT(E/8))+7 2180 FOR X=S TO E STEP 8 : PH1. X, 2190 FOR Y=0 TO 7 2200 H(Y)=XBY(G(12)+(X-G(2))+Y) 2210 PH0. H(Y), 2220 NEXT Y 2230 PRINT " - ", 2240 FOR Y=0 TO 7 2250 IF (H(Y)<20H).OR.(H(Y)>7EH) THEN PRINT ". ", : GOTO 2270 2260 PRINT CHR(H(Y))," ", 2270 NEXT Y 2280 PRINT 2285 A=GET : IF A=0DH THEN X=E 2290 NEXT X 2300 PRINT "ENTER D TO DUMP, C TO CHANGE, M FOR MAIN MENU" 2310 A=GET 2320 A=GET : IF A=0 THEN 2320 2330 IF (A=44H).OR.(A=64H) THEN GOTO 2100 2340 IF (A=6DH).OR.(A=4DH) THEN GOTO 2380 2350 IF (A<>43H).AND.(A<>63H) THEN GOTO 2300 2360 GOSUB 2450 2370 GOTO 2300 2380 RETURN 2390 PRINT "ENTER START ADDRESS TO BE CHANGED :", : INPUT S 2400 PRINT "ENTER END ADDRESS TO BE CHANGED :", : INPUT E 2410 S1=G(2) : E1=(G(2)+(G(1)*100H))-1 2420 IF S>E THEN PRINT "START NOT LESS OR EQUAL TO END" : GOTO 2390 2430 IF SE1 THEN PRINT "HIGH ADDRESS NOT WITHIN RAM RANGE" : GOTO 2390 2450 PRINT " + TO SKIP, - TO BACK UP, Q TO QUIT " : PRINT 2460 FOR X=S TO E 2470 PH1. X, 2480 H=XBY(G(12)+(X-G(2))) 2490 PH0. H, 2500 PRINT " ", 2510 IF (H<20H).OR.(H>7EH) THEN PRINT ". - ", : GOTO 2530 2520 PRINT CHR(H)," - ", 2530 A=GET 2540 A=GET : IF A=0 THEN 2540 2550 IF (A=51H).OR.(A=71H) THEN PRINT CHR(A), : X=E : GOTO 2700 2560 IF A=2DH THEN PRINT CHR(A), : X=X-2 : GOTO 2700 2570 IF A=2BH THEN PRINT CHR(A), : GOTO 2700 2580 IF (A<30H).OR.(A>46H) THEN 2530 2590 PRINT CHR(A), 2600 A=A-30H : IF A>0FH THEN A=A-7 2610 N1=A*16 2620 A=GET : IF A=0 THEN 2620 2630 IF (A=51H).OR.(A=71H) THEN PRINT CHR(A), : X=E : GOTO 2700 2640 IF A=2DH THEN PRINT CHR(A), : X=X-2 : GOTO 2700 2650 IF A=2BH THEN PRINT CHR(A), : GOTO 2700 2660 IF (A<30H).OR.(A>46H) THEN 2620 2670 PRINT CHR(A), 2680 A=A-30H : IF A>0FH THEN A=A-7 2690 XBY(G(12)+(X-G(2)))=N1+A 2700 PRINT : IF X<0 THEN X=0 2710 NEXT X 2720 PRINT "C TO CHANGE, M FOR MAIN MENU" 2730 A=GET 2740 A=GET : IF A=0 THEN 2740 2750 IF (A=43H).OR.(A=63H) THEN GOTO 2390 2760 IF (A=6DH).OR.(A=4DH) THEN GOTO 2780 2770 GOTO 2720 2780 RETURN 2790 I=G(0)*G(3) : S=G(2) 2800 E=(S+(G(1)*256)-1) : IF E>0FFFFH THEN E=0FFFFH 2810 GOSUB 5210 2820 CALL 59BFH 2830 IF DBY(1EH)=0 THEN 2880 2840 IF (DBY(1EH).AND.1H)<>0 THEN PRINT "BYTES OUT OF RANGE WERE IGNORED" 2850 IF (DBY(1EH).AND.2H)<>0 THEN PRINT "UNEXPECTED CARRAGE RETURN" 2860 IF (DBY(1EH).AND.4H)<>0 THEN PRINT "INVALID HEX DIGIT DETECTED" 2870 IF (DBY(1EH).AND.8H)<>0 THEN PRINT "BAD CRC CHECK" 2880 PRINT "LOAD ENDED" 2890 PRINT "PRESS 'ENTER' TO LOAD AGAIN, ANY OTHER KEY TO EXIT" 2900 A=GET 2910 A=GET : IF A=0 THEN 2910 2920 IF A=0DH THEN 2790 2930 RETURN 2940 MODE2=0 2950 A=GET 2960 PRINT "PRESS 'ENTER' TO VERIFY THE ENTIRE EPROM" 2970 PRINT "ANY OTHER KEY TO SPECIFY START/END ADDRESSES" : PRINT 2980 A=GET : IF A=0 THEN 2980 2990 IF A<>0DH THEN 3030 3000 I=G(0)*G(3) : S=0 3010 E=(E((G(0)*G(3))+1)*100H)-1 3020 GOTO 3120 3030 PRINT "ENTER START ADDRESS IN EPROM TO BE VERIFIED :", : INPUT S 3040 PRINT "ENTER END ADDRESS IN EPROM TO BE VERIFIED :", : INPUT E 3050 IF S>E THEN PRINT "START NOT LESS OR EQUAL TO END" : GOTO 3320 3060 IF S<=(E((G(0)*G(3))+1)*100H)-1 THEN 3080 3070 PRINT "LOW ADDRESS NOT WITHIN ROM RANGE" : GOTO 3320 3080 IF E<=(E((G(0)*G(3))+1)*100H)-1 THEN 3100 3090 PRINT "HIGH ADDRESS NOT WITHIN ROM RANGE" : GOTO 3320 3100 IF MODE=0 THEN 3120 3110 PRINT : PRINT "VERIFYING EPROM ERASED" 3120 GOTO 3140 3130 MODE2=1 3140 I=G(0)*G(3) 3150 G(8)=(E(I+3).AND.3FH).OR.80H 3160 G(9)=E(I+4) : G(10)=E(I+5) 3165 Q=G(2) : G(2)=S 3170 GOSUB 5210 3175 G(2)=Q 3180 IF E(I+2)=26 THEN DBY(18H)=DBY(18H).AND.0DFH 3190 IF E(I+2)=28 THEN G(8)=G(8).AND.0F7H : DBY(1FH)=G(8) 3200 G(6)=DBY(18H) : G(5)=DBY(19H) : G(7)=0 3210 XBY(CA)=G(8) : XBY(CB)=G(9) : XBY(CC)=G(10) 3220 XBY(AX)=89H : XBY(AA)=G(5) : XBY(AB)=G(6) 3230 CALL 59BCH 3240 G(5)=0 : G(6)=0E8H : G(7)=0 3250 G(8)=E(I+3) : G(9)=E(I+4) : G(10)=E(I+5) 3260 XBY(CA)=G(8) : XBY(CB)=G(9) : XBY(CC)=G(10) 3270 XBY(AX)=80H : XBY(AA)=G(5) : XBY(AB)=G(6) : XBY(AC)=G(7) 3275 XBY(CA)=(G(8).OR.07H) 3280 IF MODE=0 THEN 3380 3290 IF DBY(1EH)<>0 THEN PRINT "NOT ", 3300 PRINT "ERASED" : PRINT 3310 GOTO 3330 3320 PRINT : PRINT "CAN'T VERIFY EPROM AS YOU REQUESTED" : PRINT 3330 IF MODE2=1 THEN 3380 3340 PRINT "PRESS 'ENTER' TO VERIFY AGAIN, ANY OTHER KEY TO EXIT" 3350 A=GET 3360 A=GET : IF A=0 THEN 3360 3370 IF A=0DH THEN 2940 3380 RETURN 3390 FOR X=1 TO 3 : PRINT : NEXT X 3400 PRINT "SELECT AN EPROM" 3410 PRINT 3420 FOR X=0 TO G(11)-1 3430 PRINT X," - ",$(X+1) 3440 NEXT X 3450 PRINT : PRINT " ENTER CHOICE (0 TO ",G(11)-1,") :", 3460 INPUT A 3470 IF A<0.OR.A>(G(11)-1).OR.A<>INT(A) THEN 3390 3480 G(0)=A : GOSUB 3510 3490 L=G(0) : GOSUB 3710 3500 RETURN 3510 I=G(0)*G(3) 3520 XBY(CA)=(E(I+3).OR.07H) : XBY(CB)=E(I+4) : XBY(CC)=E(I+5) 3530 G(8)=E(I+3) : G(9)=E(I+4) : G(10)=E(I+5) 3540 XBY(AA)=0 : XBY(AB)=0E8H : XBY(AC)=0 3550 G(5)=0 : G(6)=0 : G(7)=0 3560 L=20H : GOSUB 3710 3570 RETURN 3580 G(1)=0 : G(12)=08000H : A=08000H 3590 GOSUB 3620 3600 IF G(1)=0 THEN G(12)=1000H : A=1000H : GOSUB 3620 3610 RETURN 3620 FOR X=A TO 0FC00H STEP 00400H 3630 B=XBY(X) : XBY(X)=55H 3640 IF XBY(X)<>55H THEN X=0FC00H : GOTO 3680 3650 XBY(X)=0AAH 3660 IF XBY(X)<>0AAH THEN X=0FC00H : GOTO 3680 3670 G(1)=G(1)+4H 3680 XBY(X)=B 3690 NEXT X 3700 RETURN 3710 L=L(L) 3720 FOR X=0 TO 9 : T(X)=DBY(18H+X) : NEXT X 3730 DBY(18H)=L 3740 DBY(1FH)=(G(8).OR.07H) 3750 CALL 59C2H 3760 FOR X=0 TO 9 : DBY(18H+X)=T(X) : NEXT X 3770 RETURN 3780 GOTO 3810 3790 A=GET : IF A<>0 THEN 3900 3800 IF (XBY(CC).AND.10H)<>10H THEN 3900 3810 L=L1 : GOSUB 3710 3820 FOR X=1 TO 200 : NEXT X 3830 L=20H : GOSUB 3710 3840 FOR X=1 TO 50 : NEXT X 3850 L=L2 : GOSUB 3710 3860 FOR X=1 TO 200 : NEXT X 3870 L=20H : GOSUB 3710 3880 FOR X=1 TO 400 : NEXT X 3890 GOTO 3790 3900 RETURN 3910 FOR X=0 TO B : READ L(X) : NEXT X 3920 DATA 3FH,6,5BH,4FH,66H,6DH,7DH,7 3930 DATA 7FH,67H,77H,7CH,39H,5EH,79H,71H 3940 DATA 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H 3950 DATA 0EFH,0F7H,0E7H,0ECH,0B9H,0DEH,0F9H,0F1H 3960 DATA 0,76H,38H,73H,3EH 3970 FOR X=0 TO A : READ E(X) : NEXT X 3980 DATA 02716,008H,26,78H,66H,0CEH,0CEH,0D6H,1,50,0,00,0 3990 DATA 02732,010H,26,78H,66H,0CEH,0C7H,0E6H,0,50,0,00,0 4000 DATA 02732,010H,26,78H,66H,0CEH,0CBH,0E6H,0,50,0,00,0 4010 DATA 02764,020H,28,78H,26H,0CEH,0CEH,023H,0,50,1,25,3 4020 DATA 02764,020H,28,78H,26H,0CEH,0CEH,025H,0,50,1,25,3 4030 DATA 27128,040H,28,78H,26H,0CEH,0CEH,023H,0,50,1,15,4 4040 DATA 27128,040H,28,78H,26H,0CEH,0CEH,025H,0,50,1,15,4 4050 DATA 27256,080H,28,78H,66H,0CEH,0CEH,0E5H,0,50,1,25,3 4060 DATA 27512,100H,28,78H,66H,0CEH,0CDH,0E6H,0,50,1,25,3 4070 $(1)="2716 25V " : $(2)="2732 25V " : $(3)="2732A 21V " 4080 $(4)="2764 21V " : $(5)="2764A 12.5V" : $(6)="27128 21V " 4090 $(7)="27128A 12.5V" : $(8)="27256 12.5V" : $(9)="27512 12.5V" 4100 FOR X=0 TO C : READ G(X) : NEXT X 4110 DATA 0,0,0,13,20,0,0,0,0,0,0,0,0 4120 G(11)=(A+1)/G(3) 4130 RETURN 4140 MODE2=0 4150 IF MODE=0 THEN 4390 4160 PRINT : PRINT "COMPARE MEMORY BUFFER WITH EPROM" : PRINT 4170 A=GET 4180 PRINT "PRESS 'ENTER' TO COMPARE ALL AVAILABLE RAM TO EPROM" 4190 PRINT "ANY OTHER KEY TO SPECIFY START/END ADDRESSES" : PRINT 4200 A=GET : IF A=0 THEN 4200 4210 IF A<>0DH THEN 4280 4220 I=G(0)*G(3) : S=G(2) 4230 E1=(S+(G(1)*256)-1) : IF E1>0FFFFH THEN E1=0FFFFH 4240 E2=(E(I+1)*256)-1 4250 IF E1<=E2 THEN E=E1 4260 IF E1>E2 THEN E=E2 4270 GOTO 4400 4280 PRINT "ENTER START ADDRESS IN EPROM TO BE COMPARED :", : INPUT S 4290 PRINT "ENTER END ADDRESS IN EPROM TO BE COMPARED :", : INPUT E 4300 S1=G(2) : E1=(G(2)+(G(1)*100H))-1 4310 IF S>E THEN PRINT "START NOT LESS OR EQUAL TO END" : GOTO 4660 4320 IF SE1 THEN PRINT "HIGH ADDRESS NOT WITHIN RAM RANGE" : GOTO 4660 4340 IF S<=(E((G(0)*G(3))+1)*100H)-1 THEN 4360 4350 PRINT "LOW ADDRESS NOT WITHIN ROM RANGE" : GOTO 4660 4360 IF E<=(E((G(0)*G(3))+1)*100H)-1 THEN 4380 4370 PRINT "HIGH ADDRESS NOT WITHIN ROM RANGE" : GOTO 4660 4380 GOTO 4400 4390 MODE2=1 4400 I=G(0)*G(3) 4410 G(8)=(E(I+3).AND.03FH).OR.080H 4420 G(9)=E(I+4) : G(10)=E(I+5) 4430 GOSUB 5210 4440 IF E(I+2)=26 THEN DBY(18H)=DBY(18H).AND.0DFH 4450 IF E(I+2)=28 THEN G(8)=G(8).AND.0F7H : DBY(1FH)=G(8) 4460 G(6)=DBY(18H) : G(5)=DBY(19H) 4470 XBY(CA)=G(8) : XBY(CB)=G(9) : XBY(CC)=G(10) 4480 XBY(AX)=89H : XBY(AB)=G(6) : XBY(AA)=G(5) 4490 IF MODE=0 THEN 4520 4500 PRINT : PRINT "COMPARING EPROM TO RAM BUFFER" 4510 L=0CH : GOSUB 3710 4520 CALL 59B9H 4530 G(5)=0 : G(6)=0E8H : G(7)=0 4540 G(8)=E(I+3) : G(9)=E(I+4) : G(10)=E(I+5) 4550 XBY(CA)=G(8) : XBY(CB)=G(9) : XBY(CC)=G(10) 4560 XBY(AX)=80H : XBY(AA)=G(5) : XBY(AB)=G(6) : XBY(AC)=G(7) 4565 XBY(CA)=(G(8).OR.07H) 4570 IF MODE=0 THEN 4630 4580 PRINT "COMPARE ", 4590 IF DBY(1EH)<>0 THEN PRINT "IS NOT ", 4600 PRINT "GOOD" : PRINT 4610 L=20H : GOSUB 3710 4620 GOTO 4670 4630 IF DBY(1EH)=0 THEN 4720 4640 L1=0EH : L2=2 : GOSUB 3780 4650 GOTO 4720 4660 PRINT : PRINT "CAN'T COMPARE EPROM AS YOU REQUESTED" : PRINT 4670 A=GET 4680 IF MODE2=1 THEN 4720 4690 PRINT "PRESS 'ENTER' FOR MORE COMPARING, ANY OTHER KEY TO EXIT" 4700 A=GET : IF A=0 THEN 4700 4710 IF A=0DH THEN 4140 4720 RETURN 4730 PRINT : PRINT "MEMORY SIZE - ", : PH0. G(1)*100H 4740 PRINT "CURRENT RAM MEMORY BUFFER STARTING ADDRESS - ", : PH0. G(2) 4750 PRINT "ENTER NEW STARTING ADDRESS - ", : INPUT A 4760 IF A<0.OR.A>65535 THEN PRINT "BAD ADDRESS" : GOTO 4740 4770 G(2)=A 4780 RETURN 4790 PRINT : PRINT "UPLOAD HEX FILE TO TERMINAL " 4800 PRINT "ENTER STARTING RAM ADDRESS TO UPLOAD :", : INPUT S 4810 PRINT "ENTER ENDING RAM ADDRESS TO UPLOAD :", : INPUT E 4820 S1=G(2) : E1=G(2)+(G(1)*100H)-1 : IF E1>0FFFFH THEN E1=0FFFFH 4830 IF S>E THEN PRINT "START NOT LESS OR EQUAL TO END" : GOTO 5150 4840 IF SE1 THEN PRINT "HIGH ADDRESS NOT WITHIN RAM RANGE" : GOTO 5150 4860 IF (S+10H)>E THEN 4890 4870 S1=S : E1=S+0FH : S=S+10H : GOSUB 4920 4880 GOTO 4860 4890 S1=S : E1=E : GOSUB 4920 4900 PRINT ":00000001FF" : PRINT 4910 GOTO 5130 4920 PRINT ":", 4930 BYTE=1+(E1-S1) : CHECK=BYTE : GOSUB 5060 4940 BYTE=INT(S1/100H) : CHECK=CHECK+BYTE : GOSUB 5060 4950 BYTE=S1-(100H*(INT(S1/100H))) : CHECK=CHECK+BYTE : GOSUB 5060 4960 BYTE=0 : CHECK=CHECK+BYTE : GOSUB 5060 4970 FOR X=S1 TO E1 4980 BYTE=XBY(G(12)+(X-G(2))) 4990 CHECK=CHECK+BYTE : GOSUB 5060 5000 NEXT X 5010 CHECK=CHECK.AND.0FFH 5020 CHECK=(1000H-CHECK).AND.0FFH 5030 BYTE=CHECK : GOSUB 5060 5040 PRINT 5045 A=GET : IF A=0DH THEN S=E 5050 RETURN 5060 N1=INT(BYTE/10H) 5070 N2=BYTE-10H*N1 5080 IF N1>9 THEN N1=N1+7 5090 IF N2>9 THEN N2=N2+7 5100 N1=N1+30H : N2=N2+30H 5110 PRINT CHR(N1),CHR(N2), 5120 RETURN 5130 PRINT "UPLOAD COMPLETE" : PRINT 5140 GOTO 5160 5150 PRINT "CAN'T UPLOAD EPROM AS YOU REQUESTED" : PRINT 5160 A=GET 5170 PRINT "PRESS 'ENTER' FOR MORE UPLOADING, ANY OTHER KEY TO EXIT" 5180 A=GET : IF A=0 THEN 5180 5190 IF A=0DH THEN 4790 5200 RETURN 5210 DBY(18H)=INT(S/256) 5220 DBY(19H)=S-(256*DBY(18H)) 5230 DBY(1AH)=INT(E/256) : DBY(1BH)=E-(256*DBY(1AH)) 5240 DBY(1CH)=INT((G(12)+(S-G(2)))/256) 5250 DBY(1DH)=(G(12)+(S-G(2)))-(256*DBY(1CH)) 5260 DBY(1EH)=E((G(0)*G(3))+9) 5270 DBY(1FH)=G(8) 5280 DBY(20H)=E((G(0)*G(3))+1)-1