SBC6502 - 56 - PROM 74188 - last, best program v.1.09 lite, 1.09patch.

By Administrator at June 02, 2022 08:54
Filed Under: SBC6502

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 Laughing, 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ú Foot in mouth - 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 urbím program práve na takomto počítači - že aj tu sa dajú robiť veci a že ten stoj 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  - 02.02.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:

Comments

6/2/2022 8:57:37 AM #

trackback

Directory SBC6502

Directory SBC6502

Igi blog |

Comments are closed

Info o autorovi

Volám sa Igor Gramblička, bydlisko: Bratislava, Slovakia. Môj nick: Igi. Blog je o mojich záujmoch, predtým som pracoval ako IT špecialista na počítačové siete a redakčné systémy pre viaceré denníky - až som pred rokmi nakoniec v jednom z nich zakotvil a kde som to potiahol až do konca mojej profesnej kariéry.

Rok, mesiac, počet článkov: