
SBC6502 + PROM 74188 programmer
/už aj s vynovenou "kapotážou"/
S touto verziou (1.09, 1.09p) programového vybavenia ako vidieť som si už dal dlhšiu pauzu. Medzitým som si povedal že tu prevediem niektoré veci ktoré som síce chcel už vyskúšať aj predtým, ale akosi som sa k tomu nedostal. Teraz už áno a pretože bolo dosť času na jej skúšanie a otestovanie - tak tie zmeny sú v tejto verzii už prevedené a uplatnené.
Program - verzia 1.09 je pre x-tal:
1.8432MHz
2.4576MHz
3.6864MHz
4.0000MHz
4.5000MHz
4.9152MHz
5.0000MHz
6.0000MHz

version 1.09.zip (35,09 kb)
Verzia 1.09 lite: - je prevedených množstvo ďalších úprav, tu som si dovolil nasadiť aj niektoré doteraz nepoužité úpravy
- previedol som presun pamäťových adries na nové miesto, uvoľnilo to viac miesta pre program - i keď toto naozaj nebolo nutné, jednoducho skúšam čo to dá
- jedná sa o upravenú verziu pôvodnej verzie "lite" 1.07, pracovná verzia 1.08 bola zase iba neverejná, v nej sa robili potrebné úpravy a zmeny až z toho vyšla táto stabilná verzia 1.09 lite
- vlastné menu je teraz "roztiahnuté" na obrazovke na celú šírku, väčšia šírka menu podľa mňa na displeji vyzerá lepšie (už to nebude pripomínať niečo ako VIC-20), cena za túto inováciu ? - v konečnom dôsledku je to iba o pár byte (cca 20) dlhší program, za to to stojí

Menu - verzia 1.09
- zápis programu používa teraz príkaz ? = PRINT, pri nahratí programu sa automaticky ? zmení na PRINT, vďaka tejto drobnosti je vlastný zápis programu kratší o vyše 500 byte (šikovné, ale tak isto to nie je pre prácu nevyhnutné)
- pri tejto verzii som prišiel na to že automatické mazanie obsahu premenných pri štarte programu akosi nemusí byť vždy celkom samozrejmosťou, vyhodil som skúšobne CLEAR pretože som si myslel že mazanie premenných zbehne pri štarte programu aj tak, ale ukázalo sa že CLEAR v prvom riadku je skutočne potrebné zachovať, boli situácie kedy sa mazanie premenných nepreviedlo pri novom štarte programu. Síce si už nepamätám za akých okolností to bolo, ale CLEAR sa ukázal ako potrebný, vyhol som sa dodatočným problémom. Kto neverí - môže si to vyskúšať na vlastnej koži ... za starosti ktoré môžu nastať tých pár byte navyše ak tam nedám spomenutý príkaz do programu to naozaj nestojí.
- hodnota premennej LG=1.5 je tu v programe trvale nastavená na uvedenú hodnotu, odstránil som v programe jej kontrolu (ukázalo sa že LG=1.5 vyhovuje pre naozaj všetky prípady). Napríklad: nastavenie PGM pulzu v prvom kole na =50msec. dá potom v druhom kole PGM pulz =75msec., čo sa ukázalo viac ako dostatočná hodnota (overené priamo v prevádzke počas dlhšej doby), ak s takýmito PGM pulzami ani tak nedokážete Vašu PROM napáliť tak je naozaj vhodná iba na jednu vec - a to do koša. A to už s uvedenými parametrami PGM pulzu ideme hodne mimo datasheetových údajov.
- je prepracovaný Line Data generator, teraz je pod názvom Rows Data generator
- vo verzii 1.09 a 1.09.p je použitá zvuková signalizácia ako vo verzii 1.07 a to cez PC speaker
- vlastné spracovanie dávky 8 byte v Rows Data generátore tu zbieha v podprograme, ten sa potom 4x vyvolá, program je vďaka tejto úprave zase o kus kratší
- v príkazoch programu napr. POKE X,(Y+Z) boli odstránené zátvorky, teda teraz je zápis v podobe POKE X,Y+Z, program v SBC6502 zátvorky nevyžaduje
- oddeľovač v menu (riadok kde sú samé ---) bol nahradený jednoduchým generovaním postupnosti znaku priamo v jednom podprograme
- pribudol oznam pri zápise dát cez (D),(H) a (R) aby ste si zapli odchytávanie textu v Hypertermináli, už nemusíte na to dopredu myslieť, ak ste na to predtým zabudli tak sa musel program nanovo spustiť a potrebný obsah sa musel odznova pekne-krásne ručne nadlapať ... (ručné spustenie odchytávania sa Vám ale aj tak nevyhne, toto je len upozornenie na to že ho treba spustiť a dá sa pokračovať ďalej). Po voľbe (R) príde po výpise k ukončeniu programu.
Riešením bez oznamu by bolo spustenie Capture hneď pri štarte programu, alebo pre "tvrďasov" je tu stále možnosť prepísanie Data riadkov priamo z printscreenu ...
- následne po vypísaní Data riadkov cez Rows Data generator Vás program vyzve na ukončenie odchytávania textu (potrebné údaje sú už odchytené, treba zápis cez Capture ukončiť)

Animácia výpisu pre zapnutie a vypnutie odchytávania textu.
- ďalšie úpravy vzhľadu a textu v menu, tu som mimo iného koketoval s verziou voľby dĺžky PGM pulzu pomocou klávesy (P) - chvíľu som to aj tak mal, ale nakoniec som ponechal výber cez už "zabehanú" klávesu (L)
- zmena v menu, pribudol nový riadok - výpis obsahu Data riadkov - je tu v dec forme a aj v hex forme, voľba sa prevedie stlačením (C). Výpis prebehne vždy, teda aj pri prázdnom obsahu Data riadkov /ak sú tam samé nuly/.

výpis konkrétneho obsahu Data riadkov - voľba (C)
- úprava vzhľadu výpisu pre 2 kolo programovania (PGM pulz)
- úprava pozície výpisu v Data rows file name
- dtto sa týka pozície výpisu platné, alebo neplatné Data v datových riadkoch
- zarovnanie výpisu vlastného kontrolného súčtu (CRC),
- zarovnanie výpisu bolo prevedené aj v chybových hláškach
- kontrola správnosti ID teraz zbieha v tej istej sekvencii ako kontrola CRC
- je "prekopaný" vzhľad hlavičky v Igi´s byte to bit analyzéri

Igi´s byte to bit analyzér, tu konkrétne porovnaný obsah Data riadkov s čistou, nenapálenou PROM
- zarovnanie výpisu pri voľbe (W)rite
- použitý nový príkaz v programe, teraz je napr.: PRINT SPC(5)"text" v programe namiesto pôvodného PRINT TAB(5)"text", nahradené všetky príkazy kde to bolo možné, na kritických miestach kde je to potrebné PRINT TAB zostáva, viď napr. programový riadok č.2990
- z programu vyhodené bodkočiarky za PRINT TAB(X);"text" zistil som že ich netreba, teda teraz je zápis PRINT TAB(X)"text"
- slučky napr.: FOR F=0 TO 10:NEXT F majú skrátený zápis na FOR F=0 TO 10:NEXT ktorému SBC6502 tak isto dokonale rozumie
- posunul som umiestnenie údajov z Data riadkov z adresy 31000d na novú adresu 32500d, dtto sa týka rozkladu byte na jednotlivé bity, presunuté z adresy 31032d na adresu 32532d (o tomto podrobnejšie na konci článku)
- nakoniec som rozšíril program aj pre ďalšie hodnoty použitého x-talu a to pre: 3.6864MHz, 4.9152MHz a 6.000MHz
Tu len upozorním že v prípade práce dosky SBC6502 s x-talmi 4.91524MHz, 5.0000MHz a 6.0000MHz asi už bude potrebné použiť rýchlu verziu 82C55A (tá ide do 10MHz), alebo je možné že bude treba už vyberať aj z 5MHz verzií 8255A (ak máte šťastie tak vyberať netreba). Problém môže byť v tom, že procesor 65C02 poskytuje kratšie impulzy pre zýpis a čítanie ako potrebuje pre svoju činnosť obvod 8255A, takže čip nemusí potom na spomenutých x-taloch korektne fungovať. 5MHz verzie 8255A spoľahlivo idú na 4MHz clocku procesoru, takže asi bude treba trochu experimentovať. Ak nemáte chuť, potom 4MHz clock je tá najlepšia voľba vlastného taktu procesoru.
Záverom:
Týmto práce na programovom vybavení verzie 1.09 a 1.09p považujem za ukončené. Vyrobil som pre programátor PROM 74188 viacero verzií programového vybavenia, snahou bolo v každej ďalšej verzii niečo pridať do ovládania a poskytnúť čo najviac doplnkových funkcií. Či sa mi to podarilo - tak to už ponechám na Vaše posúdenie. Dĺžka programu sa teraz dostala na približne polovicu pôvodnej veľkosti, pritom z možností programu "vypadla" iba jedna vec a to reprogramovanie a zároveň pribudla nová možnosť výpisu obsahu, takže to skrátenie dĺžky programu považujem za celkom slušný úspech. Významným obmedzením pri tvorbe je to, že nie je možný zápis priamo do obrazovky (teda niečo ako PRINT AT a podobne), t.j. ak sa zapíše riadok tak to čo tam už je nie je možné prepísať, iba ak sa zmaže celá obrazovka. Za posledné mesiace som sa v programe vcelku dosť "vŕtal" a hľadal možnosti skrátenia celkovej dĺžky programu. A zadarilo sa.
__________________________________________________________
09.08.2022
Dnes uvoľnená verzia 1.09p (=patch, jedná sa o úpravy a skrátenie niektorých zápisov programových riadkov /ukázalo sa že zápis sa ešte stále dá skrátiť/, je tu oprava v riadku 1630, kde bola v zápise použitá dvojitá dvojbodka /moja chyba, ale program fungoval bez problémov/. Ostatné úpravy sa týkajú viacerých programových riadkov, pretože sa dal ich zápis ďalej zjednodušiť. Spomenutá chyba verzie 1.09 je už priamo v programe opravená.
Zdôrazňujem - pôvodná verzia 1.09 bola plne funkčná aj bez patchu a opravy spomenutého riadku.
Vrelo odporúčam poslednú verziu 1.09p programového vynavenia.

menu - verzia 1.09p
Uvediem názorný príklad pôvodného zápisu programového riadku vo verzii 1.09:
1105 GOSUB 2995:? " U=";U;"DV=";DV;"PP=";PP;"LG=";LG;
Nový zápis toho istého programového riadku vo verzii 1.09p:
1105 GOSUB 2995:? " U="U"DV="DV"PP="PP"LG="LG;
Program - verzia 1.09patch je pre x-tal:
1.8432MHz
2.4576MHz
3.6864MHz
4.0000MHz
4.5000MHz
4.9152MHz
5.0000MHz
6.0000MHz

version 1.09patch.zip (34,89 kb)
Poznámka (25.10.2022):
Pretože som tu robil opravu tak som priamo do tejto verzie ešte urobil úpravu zobrazenia pri použití výberu (L), je to teraz prehľadnejšie.

SBC6502 + doska programátoru PROM74188 v jednom celku
Listing programu - verzia 1.09p pre x-tal = 4.9152MHz:
1000 CLEAR:POKE 15,80:PD=32500:PE=32532:U=3.13:DV=6:PP=17*U:LG=1.5
1004 B$="0123456789ABCDEF":R$="09.08.2022, x-tal = 4.9152MHz"
1006 Q$="2022_ver.1.09/patch/ ------------"
1010 PA=32768:PB=32769:PC=32770:CWR=32771:POKE CWR,137
1014 ? CHR$(12):?:? SPC(27)"SBC6502 (32kB RAM + 8255A)"
1065 ? SPC(15)"Turn ON (+ PC sound) the power to the programmer !"
1066 NS=1.5:PG=0:DD=0:? SPC(25)R$:GOSUB 2000
1090 GOSUB 2400:Z=0:X=0:Y=0:VP=0:IG=0:GH=0:NS=1:GOSUB 9000
1100 ? CHR$(12):GOSUB 1700:?:IF ID<>32 THEN 8900
1101 ?" ----------- Best 74188 PROM programmer,Igi(c)"Q$
1105 GOSUB 2995:? " U="U"DV="DV"PP="PP"LG="LG;
1106 GOSUB 2990:GOSUB 8781
1108 GOSUB 2995:? "(L)enght PGM pulse ="PP/U"msec";:GOSUB 2990
1110 GOSUB 2995:? " pulse for 2 round ="PP/U*LG"msec";
1112 GOSUB 2990:GOSUB 8781
1113 GOSUB 2995:? "(C)ontent Data Rows";:GOSUB 2990
1114 GOSUB 2995:? "(D)ec input data";:GOSUB 2997:GOSUB 2990
1116 GOSUB 2995:? "(H)ex input data";:GOSUB 2997:GOSUB 2990
1118 GOSUB 2995:? "(R)ead P R O M ";:GOSUB 2997:GOSUB 2990
1120 GOSUB 2995:? "(T)est P R O M"SPC(10)"/is empty ?/";:GOSUB 2990
1122 GOSUB 2995:? "(V)erification PROM against Data rows";:GOSUB 2990
1124 GOSUB 2995:? "(W)riting Data direct into P R O M/";:GOSUB 2990
1126 GOSUB 2995:? "(Q)uit program";:GOSUB 2990:GOSUB 8781
1128 GOSUB 2995:? " Data /rows/ file name:";:GOSUB 2990
1130 GOSUB 2995:? " "C$;TAB(78)"-":GOSUB 8776:?
1140 ? SPC(31)"Your choice:";:INPUT A$:IF A$="L" THEN DD=1:GOTO 1600
1141 IF A$="C" THEN Z=3:GOTO 3500
1142 FG=1:IF A$="D" THEN 4300
1144 IF A$="H" THEN 4200
1146 IF A$="R" THEN IG=2:GOTO 5000
1148 FG=0:IF A$="T" THEN 6000
1150 IF A$="V" THEN VP=1:GOTO 8000
1152 IF A$="W" THEN VP=9:GOTO 7000
1154 IF A$="Q" THEN END
1200 GOTO 1090
1600 GOSUB 5500:? " Duration of PGM pulse:"PP/U;"msec (normal max.20)"
1610 INPUT " New lenght PGM pulse (allowed range: 1-50msec)";PG:?
1620 IF PG<1 OR PG>50 THEN GOSUB 2200:GOTO 1600
1630 IF PG>20 THEN ? " At your own risk ...":GOSUB 2302:NS=1.5
1640 ? " PGM pulse for 2 rounds=";PG*LG;"msec"
1650 PG=PG*U:GOSUB 1700:GOSUB 2000:GOTO 1090
1700 IF PG=0 THEN 1730
1720 PP=PG
1730 RETURN
1999 ? SPC(3)"Wrong input !":GOSUB 2302:RETURN
2000 FOR F=0 TO DV*2000*NS:NEXT:RETURN
2050 FOR F=0 TO DV*20:NEXT:RETURN
2100 FOR F=0 TO DV*100:NEXT:RETURN
2200 NS=0.6:FOR GI=1 TO 3:GOSUB 2302:GOSUB 2000:NEXT
2300 GOSUB 2500
2301 ? SPC(18)"--> No valid data !"SPC(8)"CRC="CRC;:GOSUB 2990
2302 ? CHR$(7);:RETURN
2400 POKE PA,0:POKE PB,0:RETURN
2500 ? " -";:RETURN
2990 ? TAB(78)"-":RETURN
2995 ? " -"SPC(20);:RETURN
2997 ? " + generate Data rows";:RETURN
3010 ? CHR$(12);:T=0:Q=0:X=0:Y=0:A=0:Y=0:OK=0:ER=0
3015 ? SPC(25)"Igi"CHR$(39)"s byte to bit analyzer:"
3020 ? SPC(15)"by Data Ve PROM by Data Ve PROM"
3022 ? SPC(15)"te: bit: ri bit: te: bit: ri bit:"
3025 ? SPC(18)"76543210 fy: 76543210 76543210 fy: 76543210"
3030 GOSUB 8781
3055 GOSUB 3200:Q=Q+1:T=T+1:GOSUB 3200:Q=Q+1:IF Q=2 THEN ?:Q=0
3082 T=T+1:IF T=32 THEN POKE PA,0:GOTO 3100
3090 GOTO 3055
3100 IF IG=3 THEN 8210
3200 POKE PA,128:GOSUB 2050:IF T<10 THEN ? TAB(14)" "T;
3220 IF T>=10 THEN ? TAB(14)T;
3230 X=PEEK(PD+T):GOSUB 3400:IF IG=3 THEN 3237
3237 POKE PA,128+T:U1=PEEK(PC):U2=PEEK(PD+T):X=PEEK(PC)
3239 IF U1=U2 THEN ? " === ";:OK=OK+1
3240 IF U1<U2 THEN ? " >>> ";
3242 IF U1>U2 THEN ? " <<< ";
3249 GOSUB 3400
3250 RETURN
3400 Y=128
3412 A=INT(X/Y):IF A=0 THEN 3416
3414 ? "1";:X=X-Y:GOTO 3418
3416 ? "0";
3418 Y=Y/2
3420 IF INT(Y)=0 THEN 3424
3422 GOTO 3412
3424 RETURN
3500 GOSUB 5500:? SPC(12)"Name: "C$:I=PD
3501 ? SPC(12)"CRC :"L"(dec)";
3503 IF L=0 THEN ?"=no active PROM"
3505 ?:IF L>0 THEN ?
3506 ? SPC(12)"Data":? SPC(12)"hex :":? SPC(12)"0000: ";
3508 FOR F=PD TO PD+15:N=PEEK(F):GOSUB 3720:NEXT
3510 ?:? SPC(12)"0010: ";
3512 FOR F=PD+16 TO PD+31:N=PEEK(F):GOSUB 3720:NEXT
3514 ?:?:? SPC(12)"Data":?SPC(12)"dec :"
3516 ? SPC(12)"9001 DATA";:GOSUB 8970
3518 ? SPC(12)"9002 DATA";:GOSUB 8970
3520 ? SPC(12)"9003 DATA";:GOSUB 8970
3522 ? SPC(12)"9004 DATA";:GOSUB 8970:GOTO 7046
3720 L=N AND 15:H=(N-L)/16
3730 ? MID$(B$,H+1,1)MID$(B$,L+1,1);" ";
3740 RETURN
4100 RESTORE:L=0:FOR G=PD TO PD+31:READ M:POKE G,M
4140 L=L+PEEK(G):NEXT:RETURN
4200 GOSUB 5500:GOSUB 4900:DF=PD:N=0
4203 ? "Adress: data:":? "(hex) (hex)"
4206 L=N AND 15:H=(N-L)/16
4207 ?" :";MID$(B$,H+1,1)MID$(B$,L+1,1);" ";:INPUT A$
4209 IF LEN (A$)<>2 THEN GOSUB 1999:GOTO 4207
4210 H$=LEFT$(A$,1):L$=RIGHT$(A$,1):QQ=1
4212 IF QQ=17 THEN GOSUB 1999:GOTO 4207
4213 IF MID$(B$,QQ,1)=H$ THEN QQ=1:GOTO 4217
4214 QQ=QQ+1:GOTO 4212
4216 IF QQ=17 THEN GOSUB 1999:GOTO 4207
4217 IF MID$(B$,QQ,1)=L$ THEN 4225
4218 QQ=QQ+1:GOTO 4216
4225 IF H$="F" THEN HI=15:GOTO 4244
4226 IF H$="E" THEN HI=14:GOTO 4244
4227 IF H$="D" THEN HI=13:GOTO 4244
4228 IF H$="C" THEN HI=12:GOTO 4244
4229 IF H$="B" THEN HI=11:GOTO 4244
4230 IF H$="A" THEN HI=10:GOTO 4244
4231 HI=VAL(H$)
4244 IF L$="F" THEN LO=15:GOTO 4270
4245 IF L$="E" THEN LO=14:GOTO 4270
4246 IF L$="D" THEN LO=13:GOTO 4270
4247 IF L$="C" THEN LO=12:GOTO 4270
4248 IF L$="B" THEN LO=11:GOTO 4270
4249 IF L$="A" THEN LO=10:GOTO 4270
4250 LO=VAL(L$)
4270 POKE DF,HI*16+LO:N=N+1:DF=DF+1
4279 IF DF=PD+32 THEN GOSUB 8700:?:GOTO 8800
4280 GOTO 4206
4300 GOSUB 5500:GH=PD:S=0:GOSUB 4900
4302 ? "Adress:"SPC(6)"data:":? "(dec)"SPC(8)"(dec)"
4303 IF S<10 THEN ? " "S,
4304 IF S>=10 THEN ? S,
4305 INPUT Q:IF Q>255 THEN GOSUB 1999:GOTO 4302
4308 POKE GH,Q:GH=GH+1:S=S+1
4309 IF GH=PD+32 THEN GOSUB 8700:?:GOTO 8800
4310 GOTO 4303
4900 ? SPC(19)"(..File name = lenght max.40 characters..)"
4910 ? SPC(3)"PROM DATA NAME:";:INPUT C$
4930 IF LEN (C$)>40 THEN GOSUB 1999:GOTO 4900
4940 ?:RETURN
5000 GOSUB 5500:? SPC(16)"Read PROM and Write to Data rows ";
5001 CRC=0:NS=0.2:GOSUB 2000:R=50:IF IG=2 THEN R=0
5010 POKE PB,0:QW=0:A=0:POKE PA,128:GOSUB 2050
5035 QW=128+A:POKE PA,QW:OC=PEEK(PC):POKE PD+A+R,OC:CRC=CRC+OC:A=A+1
5095 IF A=32 AND IG=1 THEN 3010
5100 IF A=32 THEN 5120
5110 GOTO 5035
5120 IF CRC=0 THEN ? " BLANK PROM !":GOTO 5160
5130 IF CRC>0 THEN ? " ACTIVE PROM !"
5140 GOSUB 2400
5150 IF CRC>0 THEN GOSUB 4900:GOSUB 8700:?:GOSUB 8800:END
5160 GOSUB 2400:NS=0.5:GOSUB 2200:GOTO 1090
5500 ? CHR$(12):? " Your choice - "A$:?:RETURN
6000 GOSUB 5500:? SPC(15)"Test - read blank PROM ";
6010 QW=0:A=0:POKE PB,0:POKE PA,128:GOSUB 2050
6035 QW=128+A:POKE PA,QW:OC=PEEK(PC):IF OC=0 THEN 6070
6060 ? "- Not a blank PROM"SPC(26)"Insert blank PROM!"
6065 GOSUB 2400:GOSUB 2200:GOTO 1090
6070 A=A+1:IF A=32 THEN 6100
6090 GOTO 6035
6100 ? " Good, blank PROM !":GOSUB 2400:IF Z=1 THEN 7020
6110 NS=1.5:GOSUB 2000:GOTO 1090
7000 GOSUB 5500
7012 ? SPC(30)"Writing PROM 74188 ...":?:Z=1:GOTO 6000
7020 GOSUB 9000:?:? SPC(17)" Name Data file: "C$
7030 GOSUB 9005:? SPC(34)"CRC="CRC
7035 IF CRC=0 THEN ? SPC(29)" No valid data !":GOSUB 2200:GOTO 1090
7042 IF 32-OK<>0 AND VP=1 THEN GOSUB 2000:GOTO 1090
7046 ?:? SPC(32)"CONTINUE Y/N";:INPUT A$
7047 IF A$="N" AND Z=3 THEN END
7048 IF A$="N" THEN 1090
7049 IF A$="Y" AND Z=3 THEN 1090
7050 IF A$="Y" THEN 7070
7055 GOSUB 1999:GOTO 7042
7070 QW=0:A=0
7100 RESTORE:FOR G=PD TO PD+31:READ M:POKE G,M:NEXT G:POKE PA,128
7200 POKE PB,0:GOSUB 2050:? TAB(29)"Programming bytes ..."
7201 ? SPC(30)"PGM pulse =";
7206 IF Z=2 AND DD=1 THEN ? PG/U*LG;:GOTO 7217
7208 IF Z=1 AND DD=0 THEN ? PP/U;:GOTO 7217
7210 IF Z=1 THEN ? TAB(30)PP/U;:GOTO 7217
7212 IF Z=2 AND DD=0 THEN ? PP/U*LG;
7217 ? "msec":?:? TAB(8);
7225 FOR G=PD TO PD+31:IF A<10 THEN ? " "A;
7227 IF A>=10 AND A=<15 THEN ? A;
7229 IF A=15 THEN ?:?:? TAB(8);
7230 IF A>15 THEN ? A;
7240 K=PEEK(G):FOR F=PE TO PE+7:POKE F,0:NEXT
7260 IF K>=128 THEN POKE PE+7,128:K=K-128
7270 IF K>=64 THEN POKE PE+6,64:K=K-64
7280 IF K>=32 THEN POKE PE+5,32:K=K-32
7290 IF K>=16 THEN POKE PE+4,16:K=K-16
7300 IF K>=8 THEN POKE PE+3,8:K=K-8
7310 IF K>=4 THEN POKE PE+2,4:K=K-4
7320 IF K>=2 THEN POKE PE+1,2:K=K-2
7330 IF K>=1 THEN POKE PE+0,1:K=K-1
7365 FOR QW=0 TO 7:S=PEEK(PE+QW):IF S=0 THEN 7480:GOSUB 1700
7420 PP=17*U:POKE PA,128:GOSUB 2050:IF Z=2 AND DD=1 THEN PP=PG*LG
7424 IF Z=2 THEN PP=PP*LG
7430 POKE PA,A+128:POKE PB,S:POKE PA,A+224
7450 POKE PA,A+192:FOR F=0 TO PP:NEXT:POKE PA,A+160
7470 POKE PA,128:GOSUB 2400:GOSUB 2050
7480 NEXT:A=A+1:GOSUB 2050:NEXT:?:?:A=0:G=0
7980 ? SPC(23)"End of the round no."Z"of programming":Z=Z+1
7990 GOSUB 2400:A=0:QW=0:GOSUB 2000
8000 RESTORE
8012 POKE PA,128:POKE PB,0:GOSUB 2050:A=0:L=0:QW=0
8013 ? CHR$(12):OK=0:ER=0
8014 ? TAB(29);"Verifying PROM <-> DATA:"
8020 FOR G=PD TO PD+31
8030 READ M:POKE G,M:Q=PEEK(G):L=L+Q:NEXT G
8080 A=0:FOR G=PD TO PD+31:QW=128+A
8085 POKE PA,QW:Q=PEEK(PC):R=PEEK(G)
8100 IF Q=R THEN OK=OK+1:GOTO 8104
8102 X=1:ER=ER+1
8104 A=A+1:NEXT G
8106 ?:? TAB(26)"Pass ="OK"byte, Error="ER"byte"
8108 POKE PA,0:OK=0:ER=0:?
8121 IF Y=1 AND X=1 THEN 8200
8122 IF Y=1 AND X=2 THEN 8130
8123 IF X=1 AND VP=1 AND Y=0 THEN 8200
8125 IF L=0 THEN ? " Blank PROM!":POKE PA,0:GOSUB 2200:GOTO 1090
8126 IF X=1 THEN 8150
8127 IF X=1 THEN Y=0:POKE PA,0:GOSUB 2000:X=X+1
8128 IF X=2 THEN Y=1:POKE PA,0:GOSUB 2000:GOTO 7070
8130 POKE PA,0:?:? SPC(33)"Verification O.K. !"
8140 NS=2:GOSUB 2000:GOTO 1090
8150 ? SPC(18)"New attempt to burn round no."Z;
8160 ? "- please wait.":POKE PA,0:GOTO 8127
8200 POKE PA,0:GOSUB 2050:IG=3:GOTO 3010
8210 ? SPC(27)"Pass="OK"byte, Error="32-OK"byte"
8211 IF OK=32 AND VP=9 THEN 7046
8212 IF OK=32 AND VP=1 THEN 8500
8214 ? SPC(34)"- bad PROM ...";:GOSUB 2200:GOSUB 2400:GOTO 7042
8500 ? SPC(32)"- good verifying !";: GOSUB 2302:NS=2.5:GOSUB 2000
8502 GOTO 1090
8700 ?:? "Now it's time to start capturing text in ";
8702 ? "HyperTerminal."
8704 ?" Press (C) to continue ...";:INPUT A$
8710 ?:? "Rows data generator:":?:I=PD:L=0
8711 ? "9000 C$=";CHR$(34);C$;CHR$(34);":ID=32:RETURN"
8712 ? "9001 DATA";:GOSUB 8970:? "9002 DATA";:GOSUB 8970
8714 ? "9003 DATA";:GOSUB 8970:? "9004 DATA";:GOSUB 8970
8715 FOR G=PD TO PD+31:Q=PEEK(G):L=L+Q:NEXT
8716 ? "9005 CRC="L":RETURN:REM CRC(dec!)":?
8740 IF FG=1 THEN 8800
8776 GOSUB 4100:IF L=0 THEN 8780
8777 GOSUB 9005:IF L<>CRC THEN 8900
8778 GOSUB 2500:? SPC(18)"--> Valid data in memory ! CRC="CRC;
8779 GOSUB 2990:GOTO 8781
8780 GOSUB 2300
8781 ? " -";:FOR GI=2 TO 77:? "-";:NEXT:GOSUB 2990:RETURN
8800 ? " Save this data rows (9000-9005) in the specified"
8802 ? " rows positions and then run the program again!"
8804 ?:? "You can now stop writing to the file in ";
8806 ? "Hyperterminal.":GOSUB 2302:END
8900 ? CHR$(12)
8901 ? SPC(8)"Problem ...":? "Bad verification result or ID"
8904 ? SPC(5)"difference in:":? " computer"SPC(8)"Data"
8905 ? SPC(4)"data"SPC(10)"rows":? SPC(4)"CRC: < > CRC:"
8906 ? SPC(4)L;TAB(18)CRC:? SPC(9)"ID ="ID:GOSUB 2200:END
8970 FOR G=I TO I+6:? PEEK(G)",";:NEXT:? PEEK(I+7):I=I+8
8975 RETURN
9000 C$="All DATA bytes =0":ID=32:RETURN
9001 DATA 0,0,0,0,0,0,0,0
9002 DATA 0,0,0,0,0,0,0,0
9003 DATA 0,0,0,0,0,0,0,0
9004 DATA 0,0,0,0,0,0,0,0
9005 CRC=0:RETURN:REM CRC in dec form !
_____________________________________________________________
Táto sekcia je určená už len pre tých ktorí radi vedia čo sa deje vovnútri ...
(Pre vlastnú prácu to ale nie je potrebné vedieť.)
Použité adresy pre prácu s čipom 8255A /3x 8-bitová brána/, tu sa v adresácii nič nemenilo:
___________________
riadiaci register PCW:adresa 32771d /8003h/, 137 - nastaví porty A a B port ako výstupné, port C je vstupný
(POKE 32771,137)
___________________
adresa:32768d /8000h/, výstup
port A - bity 0,1,2,3,4 - vývody adries A,B,C,D,E vlastnej PROM 74188
bit 5 - ovládanie CS(neg.) PROM
bit 6 - ovládanie prog.pulzu z 5V/10.5V/5V
bit 7 - ovládanie relé na On/Off pre pin 16 (Ucc) PROM 74188
ovládanie sa prevádza pomocu príkazu POKE
___________________
adresa:32769d /8001h/, výstup:
port B - bity 0,1,2,3,4,5,6,7
ovládanie tranzistorov T1÷T8, ktoré spínajú výstupy portu B do 0 pri programovaní,
pamäť PROM 74188 sa programuje postupne v rámci bytu vždy iba po bitoch, vždy
je zopnutý v jednom okamžiku iba jeden bit, v jednom momente spína iba jeden
tranzistor BS170, ovládanie sa prevádza pomocu príkazu POKE
___________________
adresa:32770d /8002h/, vstup:
port C - bity 0,1,2,3,4,5,6,7
čítanie obsahu PROM, čítanie obsahu PROM po naprogramovaní
ovládanie sa prevádza pomocu príkazu PEEK
___________________
Verzie 1.09 a 1.09p programového vybavenia používajú nové
pamäťové miesta:
Staré umiestnenie - verzia 1.01 až 1.07:
Umiestnenie pamäťových pozícií je nastavené v prvom programovom riadku:
adresy 31000÷31031d a 32032÷32039d
uveďme si príklady:
verzia 1.04:
1000 CLEAR:PD=31000:PE=31032:POKE 15,80:REM 80 column.
verzia 1.05:
1000 CLEAR:PD=31000:PE=31032:POKE 15,80:B$="0123456789ABCDEF"
verzia 1.07:
1000 CLEAR:PD=31000:PE=31032:POKE 15,80:U=1:DV=2.25:PP=17*U:LG=1.5
(tieto adresy som historicky udržiaval, pôvodne tam bola rezerva na spracovávanie 256 bitov naraz /rozloženie 32byte na jednotlivé bity, bolo by treba 256 byte/, ale od toho som už dávno upustil, zvolené umiestnenie pritom nerobilo problém ani v jednej doterajšej verzii a tak som to ponechal ako to bolo, to že som to riešil v premenných /vďaka tomu je to relokovateľné/ tak to bola príprava na možné uvoľnenie zvoleného pamäťového priestoru - a dnes na to došlo)
Nové umiestnenie pamäťových miest - verzia 1.09 a 1.09p:
Hodnota je posunutá smerom nahor a to o celých 1500 byte, teda používajú sa nové adresy 32500÷32531d a 32532÷32539d.
1000 CLEAR:POKE 15,80:PD=32500:PE=32532:U=2.53:DV=5:PP=17*U:LG=1.5
(na funkčnosť programu premiestnenie týchto adries nemá vplyv, ide to cez použité premenné, takže táto zmena je veľmi jednoduchá, zmenia sa čísla len v 2 premenných - ale uvoľní sa týmto posunom 1500 byte RAM, síce to nie je z hľadiska funkčnosti potrebné, ale urobil som to - je to posledná úprava v programe, nakoniec ak to funguje tomu kto sa v tom nechce vŕtať je to jedno, program funguje aj pôvodnom stave - a aj v novom
, kto neverí môže skúsiť zadať pôvodné hodnoty umiestnenia, program stále pobeží bez najmenších problémov)
(Použité ukážky riadkov sú vždy pre konkrétny použitý x-tal = 4.000MHz)
Prišlo k zmene dôležitých adries RAM pre programátor PROM 74188 verzií 1.09 a 1.09p - tak tu je ich prehľad:
adresa: obsah:
32500(d) ; 32 byte - obsah = Data riadky 9001 ÷ 9004
... ; rozsah 32500d÷32531d
... ; Vždy sú tu uložené iba údaje z týchto Data riadkov !
... ; Údaje sú vždy nanovo načítané ak je na displeji
... ; zobrazené MENU. Tu sa vždy nachádzajú DATA
32531(d) ; pre napálenie do PROM 74188.
_____________________________________________
; nasleduje rozsah 32532÷32539d,
; tu je umiestnená rozložená
; bitová postupnosť obsahu jedného byte,
; takto to bit po bite napaľuje programátor
_____________________________________________
32532(d) ; rozklad - one byte to bit, pozícia bitu 0
32533(d) ; rozklad - one byte to bit, pozícia bitu 1
32534(d) ; rozklad - one byte to bit, pozícia bitu 2
32535(d) ; rozklad - one byte to bit, pozícia bitu 3
32536(d) ; rozklad - one byte to bit, pozícia bitu 4
32537(d) ; rozklad - one byte to bit, pozícia bitu 5
32538(d) ; rozklad - one byte to bit, pozícia bitu 6
32539(d) ; rozklad - one byte to bit, pozícia bitu 7
Iné adresy ako tu uvedené sa vo verziách 1.09 a 1.09p nevyužívajú.
Pripomeniem čo nastavujú premenné použité v riadku 1000:
U - konštanta pre prepočet rýchlosti ktorá platí pre hodnotu dĺžku pulzu =1msec,
(konštanta platí vždy pre konkrétny použitý x-tal), využíva sa aj pri voľbe (L)
DV - konštanta, ktorá prepočítava všetky čakacie programové slučky (okrem vlastného PGM pulzu),
(hodnota zase platí pre konkrétny použitý x-tal)
PP - premenná, ktorá nastavuje štandartne dĺžku PGM pulzu v 1.kole na 17ms (vzorec: PP=17*U)
(platí vždy pre konkrétny použitý x-tal)
LG - premenná, (new PGM pulse) ktorá určuje dĺžku PGM pulzu pre druhé kolo programovania, je to
výsledok PP=PP*LG, teda v druhom kole bude výsledný PGM pulz 1.5x dlhší
Upozornenie:
Pri testoch sa ukázalo že posun až na úplný koniec RAM (skúsil som použiť adresy 32700 a 32732d) nie je celkom dobrý nápad (pri testoch sa prepisovali údaje, aby som bol konkrétny) a preto som to umiestnil takto a nechal na konci dostupnej RAM ešte nejaký voľný priestor (jedná sa o 228 byte voľnej RAM), pri takto nastavenom využití RAM to stále beží korektne a bez najmenších problémov. Ako sa ukázalo nejakú RAM úplne na konci pamäťového priestoru využíva Basic pri niektorých veciach, takže ak s tým počítam tak sa žiadne problémy nekonajú
- možno tento poznatok bude niekomu užitočný.
Ďalšia vec ktorá sa objavila - riadok 8704 vo verziách 1.09 a 1.09p nekontroluje či ste skutočne stlačili "C", ak zadám riadok v programe nasledovne:
8704 ?" Press (C) to continue ...";:INPUT A$:IF A$<>"C" THEN 8704
tak ho nedokáže správne spracovať, jednoducho tú podmienku odignoruje, nedokáže ani vypísať ak zadám v riadku ? A$. Zjavne som sa dostal počtom premenných a stringov na "doraz" pre použitý interpreter jazyku BASIC a tak sa tu nekontroluje či je skutočne stlačené "C", berie akúkoľvek klávesu, možno by tam malo byť presnejšie "press any key + Enter". Takže toto je jedna vec čo vyskočila pri testovaní, riadok 8704 teda vyzerá takto:
8704 ?" Press (C) to continue ...";:INPUT A$
Potvrdilo sa mi to keď som chcel do programu vložiť ďalšiu položku do menu - už to začalo vo veľkom robiť chyby na miestach kde to bolo dovtedy bez najmenších problémov chodivé - výsledok ? Už som ďalšiu položku do menu nezabudoval /dodatčoné riadky som vyhodil/ - a všetko funguje tak ako má. Jednoducho už som chcel programovo po tejto "mašinke" príliš veľa.
Overil som si to tiež tak že som v testovacej verzii kde si celý program "šijem" na mieru pre vlastné použitie /má označenie 1.10, táto verzia sa ešte vyvíja, takže zatiaľ nie je uvoľnená/, niektoré premenné som z programu vypustil a aha ! - riadok 8704 zrazu už môže byť v plnej verzii a bezproblémovo funguje. Napríklad bez zmenšenia programu zrazu nebola správna hodnota dĺžky pulzu pre 2 programové kolo, akonáhle som vyhodil nové, dodatočné riadky tak všetko bolo zase O.K.
Takže na kritickú hranicu zaplnenia premennými pozor !
Ničím to na seba neupozorní - leda tým že veci v programe prestávajú robiť to čo doteraz bezproblémovo robili.
Dost obmedzujúcim faktorom je malá povolená dĺžka programového riadku - iba 72 znakov, inak by sa program program dal napísať aj omnoho efektívnejšie. Napriek tomuto obmedzeniu som si práve preto povedal že urobím program práve na takomto počítači - že aj tu sa dajú robiť veci a že tento stroj na to má.
Ešte malá štatistika:
V budovanej verzii programu 1.10 je napríklad volanie príkazov GOSUB použité 111x, GOTO 61x, IF THEN 98x, PRINT /?/ 149x, FOR - NEXT 16x, tieto údaje sa nebudú veľmi líšiť od verzií 1.09 a 1.09p, ak áno tak len veľmi mierne.
____________________________________________________________
Záverečná poznámka:
Síce neviem koľko hodín som nad výslednými programovými verziami odsedel (radšej to ani nechcem vedieť ...), ale viem že dohromady to bolo skutočne pekných "pár hodín", len dúfam že výsledok úsilia stojí za ten strávený čas. To že v tom budem nakoniec toľko sedieť ma na úplnom začiatku roboty ani vo sne nenapadlo, zase na druhú stranu ma to skutočne bavilo - a hlavne som sa vďaka tomu naučil celkom slušne programovať vlastný SBC6502. Všetko programové vybavenie (teda zápisy v Basicu a aj nasledovné úpravy) bolo napísané priamo v Notepade a odtiaľ to išlo priamo cez Hyperterminál do SBC6502 - ani raz som nepoužil výpis listingu na tlačiarni, všetko sa to spracovalo priamo v notebooku.
Želám príjemnú zábavu pri napaľovaní PROM !
____________________________________________________________
Nakoniec sa ukázalo že je záujem (i keď som veľmi s tým už nepočítal) aby boli naďalej dostupné aj staršie verzie programu (čo ma naozaj potešilo, vďaka za maily !), takže som všetky doteraz vydané verzie programového vybavenia pre programátor PROM 74188 zabalil do jedného, nasledovného balíčku (ponechal som jednotlivé verzie aj v pôvodných článkoch v tej-ktorej verzie):
Dátumy vydania jednotlivých verzií:
verzia 1.01 - 22.12.2019
verzia 1.02 - 08.01.2020
verzia 1.03 - 04.01.2021
verzia 1.04 - 02.02.2021
verzia 1.04e - 20.03.2021
verzia 1.04g - 18.05.2021
verzia 1.05a - 02.06.2021
verzia 1.05b - 02.08.2021
verzia 1.07 - 10.12.2021
verzia 1.09 - 02.06.2022
verzia 1.09p - 09.08.2022

Prom programmer all versions.zip (290,19 kb)
(Ono asi najzaujímavejšie je to že v starších verziách je v REM riadkoch kompletný popis toho čo sa práve deje, v novších verziách v rámci úspory celkovej dĺžky programu je popis vynechaný a REM riadky sú z programu odstránené. Z toho plynie že v starších verziách sa dá celkom dobre "vŕtať" a upravovať. V novších verziách "samodomo" úpravy programu už veľmi neodporúčam, bez popisu sa dá ľahko v programe "stratiť".

Doska samotného programátoru PROM 74188.
_____________________________________________________
25.10.2022
V programových verziách rady 1.07 až 1.09, 1.09p bola chyba ktorá spôsobovala že po naprogramovaní pamäte sa automaticky priamo spúšťalo druhé kolo programovania s následne predĺženým PGM pulzom- síce tento stav nespôsobuje poškodenie správneho obsahu už napálenej PROM, ale nebolo to určite to čo sa od programu očakávalo. Chyba je už opravená, na webe sú už opravené programy týchto verzií. Nastalo to po vypadnutí jedného programového riadku z programu pri prepise častí programu do nových verzií programu - moja chyba, ospravedlňujem sa. Tiež je to opravené aj v súhrne programových verzií.
Ak sa objavia nejaké "drobotiny", ktoré stoja za úpravu tak sú automaticky do uvedených verzií premietnuté.
____________________________________________________________
Vaše hodnotenie, Rate post: