10 REM ********************************************
20 REM *        (E)EPROM-Programmer V08.99        *
30 REM *  Fuer MCS-51-BASIC-Systeme mit 32KB RAM  *
40 REM * und Hardware zur (E)EPROM-Programmierung *
50 REM *       (C) H.-J. Boehling 17.08.99        *
60 REM * www.germany.net/teilnehmer/101.107378    *
70 REM * www.isis.de/members/~boehling            *
80 REM ********************************************
90 REM
100 MTOP=3FFFH :  STRING 82,80 :  REM RAM-Speicher ab 4000H sichern
110 T=1 :  GOTO 440 :  REM Type 8 Kbyte setzen
120 REM ****** Hauptmenue **************************
130 GOSUB 1360
140 PRINT "*** Hauptmenue **************************"
150 PRINT 
160 PRINT " -1- (E)EPROM Speichergroesse einstellen"
170 PRINT " -2- (E)EPROM Leertest"
180 PRINT " -3- (E)EPROM ins RAM kopieren"
190 PRINT " -4- (E)EPROM mit RAM vergleichen"
200 PRINT " -5- RAM ins (E)EPROM kopieren"
210 PRINT " -6- RAM mit 0FFH fuellen"
220 PRINT " -7- Intel HEX-File ins RAM senden"
230 PRINT " -8- Speicher betrachten"
240 PRINT " -9- Programm beenden"
250 PRINT 
260 INPUT "Ihre Wahl :",W
270 IF W=1 THEN 380
280 IF W=2 THEN 470
290 IF W=3 THEN 590
300 IF W=4 THEN 700
310 IF W=5 THEN 830
320 IF W=6 THEN 1490
330 IF W=7 THEN 1650
340 IF W=8 THEN 2080
350 IF W=9 THEN 2560
360 GOTO 130
370 REM ====== Speichergroesse abfragen ============
380 GOSUB 1360
390 PRINT "*** Speichergroesse einstellen **********" :  PRINT 
400 PRINT " -1- 8  KByte (2764, 2864)"
410 PRINT " -2- 16 KByte (27128)" :  PRINT 
420 INPUT "Ihre Wahl :",T :  IF T>2 THEN T=1 :  GOTO 380
430 REM ------ Adressen berechnen ------------------
440 S=4000H : E=3FFFH+2000H*T : P=8000H
450 GOTO 130
460 REM ====== EPROM Leertest ======================
470 GOSUB 560 :  GOSUB 1240 :  GOSUB 560
480 PRINT "Ich pruefe ob das (E)EPROM leer ist, bitte etwas Geduld !"
490 CK=0 :  REM Fehler Merker ruecksetzen
500 FOR ADDR=S+S TO E+S
510 IF XBY(ADDR)<>0FFH THEN CK=ADDR : ADDR=E+S
520 NEXT ADDR
530 IF CK=0 THEN  PRINT "Das (E)EPROM ist leer !" :  GOTO 1420
540 PH0. "Das (E)EPROM ist auf Adresse",CK," nicht leer !"
550 GOTO 1420
560 GOSUB 1360
570 PRINT "*** (E)EPROM-Leertest *******************" :  PRINT 
580 RETURN 
590 REM ====== EPROM einlesen ======================
600 GOSUB 670 :  GOSUB 1240 :  GOSUB 670
610 PRINT "Ich lese das (E)EPROM, bitte etwas Geduld !"
620 FOR ADDR=S TO E
630 XBY(ADDR)=XBY(ADDR+S)
640 NEXT ADDR
650 PRINT "Ich habe das (E)EPROM ins RAM kopiert !"
660 GOTO 1420
670 GOSUB 1360
680 PRINT "*** (E)EPROM ins RAM kopieren ***********" :  PRINT 
690 RETURN 
700 REM ====== EPROM vergleichen ===================
710 GOSUB 800 :  GOSUB 1240 :  GOSUB 800
720 PRINT "Ich vergleiche (E)EPROM mit RAM, bitte etwas Geduld !"
730 CK=0 :  REM Fehler Merker ruecksetzen
740 FOR ADDR=S TO E
750 IF XBY(ADDR+S)<>XBY(ADDR) THEN CK=1 : ADDR=E
760 NEXT ADDR
770 IF CK=0 THEN  PRINT "(E)EPROM und RAM sind gleich !" :  GOTO 1420
780 PRINT "(E)EPROM und RAM sind nicht gleich !"
790 GOTO 1420
800 GOSUB 1360
810 PRINT "*** (E)EPROM mit RAM vergleichen ********" :  PRINT 
820 RETURN 
830 REM ====== EPROM programmieren =================
840 GOSUB 1160
850 PRINT "Programmierimpulslaenge ?" :  PRINT 
860 PRINT " -1- INTELigent"
870 PRINT " -2- EEPROM (10 MSek.)"
880 PRINT " -3- Normal (50 MSek.)" :  PRINT 
890 INPUT "Ihre Wahl :",W
900 IF W=1 THEN Z=0.001 : DBY(26H)=DBY(26H).OR.8
910 IF W=2 THEN Z=0.01 : DBY(26H)=DBY(26H).AND.0F7H
920 IF W>2 THEN Z=0.05 : DBY(26H)=DBY(26H).AND.0F7H
930 PUSH (65535-(Z*XTAL/12)) :  GOSUB 1200
940 POP B : DBY(40H)=B :  POP B : DBY(41H)=B
950 REM ------ Register laden ----------------------
960 PUSH (E-S) :  GOSUB 1200 :  REM  Anzahl der Bytes 
970 POP B : DBY(1FH)=B :  POP B : DBY(1EH)=B
980 PUSH (P-1) :  GOSUB 1200 :  REM EPROM Adresse 
990 POP B : DBY(1AH)=B :  POP B : DBY(18H)=B
1000 PUSH S :  GOSUB 1200 :  REM RAM Adresse 
1010 POP B : DBY(1BH)=B :  POP B : DBY(19H)=B
1020 REM ------ Programmieren -----------------------
1030 GOSUB 1160 :  GOSUB 1240
1040 PRINT "Ich programmiere das (E)EPROM." :  PGM 
1050 REM ------ Fehler aufgetreten ? ----------------
1060 GOSUB 1160
1070 IF (DBY(30).OR.DBY(31))=0 THEN 1130
1080 PRINT "Fehler aufgetreten!"
1090 B=DBY(19H)+256*DBY(1BH) : B=B-1 : C=DBY(18H)+256*DBY(1AH)
1100 PH0. "Der Wert    ",XBY(B), :  PH1. " auf Adr. ",B
1110 PH0. "Im (E)EPROM ",XBY(C), :  PH1. " auf Adr. ",C
1120 GOTO 1420
1130 REM ------ Alles OK ----------------------------
1140 PRINT "Bei der Programmierung sind keine Fehler aufgetreten !"
1150 GOTO 1420
1160 GOSUB 1360
1170 PRINT "*** RAM ins (E)EPROM kopieren ***********" :  PRINT 
1180 RETURN 
1190 REM ------ 16-Bit Wert aufteilen ---------------
1200 POP B
1210 PUSH (B.AND.0FFH) :  REM HSB von B
1220 PUSH (INT(B/256)) :  REM LSB von B
1230 RETURN 
1240 REM ------ EPROM einsetzen ---------------------
1250 PRINT "Bitte das (E)EPROM in die Fassung einsetzen !"
1260 PWM 2095,2095,3000
1270 K=GET :  IF K>0 GOTO 1270
1280 PRINT "(E)EPROM eingesetzt ? (J/N) oder (Esc) fuer Ende :",
1290 K=GET :  IF K=0 GOTO 1290
1300 IF K>90 THEN K=K-32
1310 PRINT CHR(K)
1320 IF K=ASC(J) THEN 1350
1330 IF K=27 THEN 130 :  REM Escape 
1340 GOTO 1260
1350 RETURN 
1360 REM ------ Ueberschrift ------------------------
1370 PRINT CHR(12), :  PRINT  :  REM Bildschirm loeschen
1380 PRINT "*** (E)EPROM-Programmer *****************    ",
1390 PRINT "Speichergroesse:",T*8,"Kbyte  "
1400 RETURN 
1410 REM ------ Ereignis aufgetreten ----------------
1420 FOR I=1 TO 10 :  PWM 1761,1761,100 :  PWM 1398,1398,100 :  NEXT I
1430 GOSUB 1450 :  GOTO 130
1440 REM ------ Taste abwarten ----------------------
1450 K=GET :  IF K>0 THEN 1450
1460 PRINT " Weiter? ",
1470 K=GET :  IF K=0 THEN 1470
1480 RETURN 
1490 REM ====== RAM mit 0FFH fuellen ================
1500 GOSUB 1360
1510 PRINT "*** RAM mit 0FFH fuellen ****************" :  PRINT 
1520 K=GET :  IF K>0 GOTO 1520
1530 PRINT "RAM mit 0FFH ueberschreiben ? (J/N) :",
1540 K=GET :  IF K=0 GOTO 1540
1550 IF K>90 THEN K=K-32
1560 PRINT CHR(K)
1570 IF K=ASC(N).OR.K=27 THEN 130
1580 PRINT "Ich fuelle das RAM mit 0FFH, bitte etwas Geduld !"
1590 FOR ADDR=S TO E
1600 XBY(ADDR)=0FFH
1610 NEXT ADDR
1620 PRINT "Ich habe das RAM ueberschrieben !"
1630 GOTO 1420
1640 REM ====== HEX-File empfangen ==================
1650 GOSUB 1360
1660 PRINT "*** Intel HEX-File empfangen ************" :  PRINT 
1670 INPUT "Bitte HEX-File senden! >",$(0)
1680 IF ASC($(0),1)<>13 THEN 1670 :  REM Auf Return (Start) warten 
1690 PRINT "Empfange File !"
1700 ADDR=0 : L=L+1 :  INPUT ">",$(0)
1710 REM ------ Erstes Zeichen (:) empfangen --------
1720 C=ASC($(0),1) :  IF C<>58 THEN  GOTO 2030
1730 REM ------ Record Laenge leesen ---------------- 
1740 I=2 :  GOSUB 1960 : N=C
1750 REM ------ Adresse der Daten leesen ------------
1760 FOR I=4 TO 7 STEP 2 :  GOSUB 1960 : ADDR=(ADDR*256)+C :  NEXT 
1770 REM ------ Record Typ leesen -------------------   
1780 I=8 :  GOSUB 1960 :  IF (C<>0.AND.C<>1) THEN  GOTO 2040
1790 R=C
1800 REM ------ Checksumme berechnen ----------------
1810 CK=(ADDR/256)+(ADDR.AND.0FFH)+N+R
1820 FOR I=10 TO 10+(N*2) STEP 2 :  GOSUB 1960
1830 CK=CK+C :  REM Checksumme aufrechnen
1840 IF I>(9+N*2) THEN 1910 :  REM Checksumme nicht speichern
1850 IF R=1 THEN 1910 :  REM Ende Record nicht speichern
1860 REM ------ Adresse nach RAM setzen -------------
1870 IF ADDR<S THEN ADDR=ADDR+S
1880 IF ADDR>7FFFH THEN ADDR=ADDR-S :  GOTO 1880
1890 REM ------ Daten speichern --------------------- 
1900 XBY(ADDR)=C : ADDR=ADDR+1
1910 NEXT 
1920 REM ------ Checksumme pruefen ------------------ 
1930 CK=CK.AND.0FFH :  IF CK<>0 THEN  GOTO 2050
1940 IF R=1 THEN  GOTO 2070 :  REM HEX-File Ende?
1950 GOTO 1700 :  REM Naechste Zeile
1960 REM ------ ASCII-HEX nach DEZ wandeln ----------
1970 B=ASC($(0),I)-48 :  IF B>9 THEN B=B-7
1980 C=B*16
1990 B=ASC($(0),I+1)-48 :  IF B>9 THEN B=B-7
2000 C=C+B
2010 RETURN 
2020 REM ------ Fehlermeldungen --------------------- 
2030 PRINT "Zeile ",L,": Zeichen",I,"nicht erlaubt!" :  GOTO 2070
2040 PRINT "Zeile ",L,": Unbekannter Record Typ!",C :  GOTO 2070
2050 PRINT "Zeile ",L,": Checksummen Fehler!",
2060 PH0. ABS(CK-C)
2070 GOTO 1420
2080 REM ====== Memory Dump =========================
2090 GOSUB 1360
2100 PRINT "*** Speicher listen *********************" :  PRINT 
2110 Z=0 : CK=0
2120 REM ------ Eingabe -----------------------------
2130 PRINT "Welcher Speicher soll gelistet werden?" :  PRINT 
2140 PRINT " -1-  Interner Speicher"
2150 PRINT " -2-  Externer Speicher"
2160 PRINT " -3-  Programm Speicher" :  PRINT 
2170 INPUT "Ihre Wahl   :",W
2180 IF W=1 THEN M=0FFH ELSE M=0FFFFH
2190 IF W>3 GOTO 130
2200 INPUT "Startadresse:",ST
2210 PRINT 
2220 REM ------ Ausgabe -----------------------------
2230 PRINT CHR(12) :  PRINT " Adr.    ",
2240 IF W=3 THEN  PRINT "Code Memory   ",
2250 IF W=2 THEN  PRINT "Ext. Memory   ",
2260 IF W=1 THEN  PRINT "Int. Memory   ",
2270 PRINT "HEX                  ASCII"
2280 FOR ADDR=ST TO M STEP 8 : K=0
2290 PH1. ADDR, :  PRINT " :",
2300 REM ------ Hex-Daten ---------------------------
2310 FOR B=0 TO 7
2320 IF ADDR+B>M THEN  PRINT "    ", :  GOTO 2360
2330 IF W=3 THEN  PH0. CBY(ADDR+B),
2340 IF W=2 THEN  PH0. XBY(ADDR+B),
2350 IF W=1 THEN  PH0. DBY(ADDR+B),
2360 NEXT B
2370 REM ------ ASCII-Daten -------------------------
2380 PRINT " | ",
2390 FOR B=0 TO 7
2400 IF ADDR+B>M THEN  PRINT " ", :  GOTO 2460
2410 IF W=3 THEN C=CBY(ADDR+B)
2420 IF W=2 THEN C=XBY(ADDR+B)
2430 IF W=1 THEN C=DBY(ADDR+B)
2440 IF C<32.OR.C>126 THEN C=46
2450 PRINT CHR(C),
2460 NEXT B
2470 PRINT " | "
2480 REM ------ Weiter Abfrage ----------------------
2490 Z=Z+1
2500 IF Z=22 GOSUB 1450
2510 IF K=ASC(N).OR.K=110 THEN ADDR=M : CK=1
2520 IF Z=22 THEN Z=0 :  PRINT 
2530 NEXT ADDR
2540 IF CK=1 GOTO 130
2550 GOSUB 1450 :  GOTO 130
2560 END 
