SBC6502 - 30 - Basic programs.

By Administrator at October 19, 2019 09:35
Filed Under: SBC6502

Tak tu mám ďalší program prevodník HEX-DEC_HEX - zvláda konverziu v rozsahu 0÷FFFFh a teda aj 0÷65535d. Pretože je napísaný v jazyku MBasic, tak by mal fungovať naprieč 8bitovými platformami bez nejakých problémov. Pochádza tak isto z časopisu Popular Electronics, len akurát odložené pdf akosi neobsahuje čitateľne uložené číslo a rok. Tento časopis je zaujímavý mimo svojho obsahu ešte jednou vecou - počas svojej existencie zmenil svoje meno - až sa nakoniec vrátil k pôvodnému. Celkom zaujímavý spôsob ako si skoro "zabiť" zavedený časopis. (Bola tam vtedy "nová metla" vo vedení ? ...)


 

Program:

Hex_dec_hex_converter2.pdf (349,79 kb)

Je to iné riešenie ako program, ktorý bol uverejnený v pokračovaní č.17 o SBC6502.

___________________________________________________________

 

No a nasleduje aj niečo z vlastnej tvorby:

 

Prevodník Hex to dec v rozsahu 0÷FFh → 0÷255d:

Je riešený inak - a funguje jedným smerom. Zjavne nie je až tak úsporný ako prvý program v dnešnom článku, ale riešenie je dané tým že som bol na chalupe (bez SBC6502 a teda aj zoznamu príkazov a možností) a vlastne som to napísal v Notepade (najčastejšie píšem programy v Basicu práve v Notepade). No a dúfal som že to po nahratí do SBC doma bude fungovať. Fungovalo. Program je myslím si prehľadný a je jasné akým spôsobom prichádza k prekladu. Program by mohol byť urýchlený doplnením skokmi GOTO (aby sa neprechádzalo po vykonaní konkrétneho riadku všetkými možnosťami), ale rýchlosť jeho vykonávania je viac ako dostatočná aj bez týchto skokov - ale zaradil som ho v úprave s GOTO príkazmi tiež.


7700 REM Converter HEX (0-FFh) to dec (0-255d)
7701 REM            Igi(c)2019
7705 ? "Input hex$,two char.:";:INPUT A$:S=0
7710 IF LEFT$ (A$,1)="F" THEN S=240
7720 IF LEFT$ (A$,1)="E" THEN S=224
7730 IF LEFT$ (A$,1)="D" THEN S=208
7740 IF LEFT$ (A$,1)="C" THEN S=192
7750 IF LEFT$ (A$,1)="B" THEN S=176
7760 IF LEFT$ (A$,1)="A" THEN S=160
7770 IF LEFT$ (A$,1)="9" THEN S=144
7780 IF LEFT$ (A$,1)="8" THEN S=128
7790 IF LEFT$ (A$,1)="7" THEN S=112
7800 IF LEFT$ (A$,1)="6" THEN S=96
7810 IF LEFT$ (A$,1)="5" THEN S=80
7820 IF LEFT$ (A$,1)="4" THEN S=64
7830 IF LEFT$ (A$,1)="3" THEN S=48
7840 IF LEFT$ (A$,1)="2" THEN S=32
7850 IF LEFT$ (A$,1)="1" THEN S=16
7860 IF LEFT$ (A$,1)="0" THEN S=0

7870 IF RIGHT$ (A$,1)="F" THEN S=S+15
7880 IF RIGHT$ (A$,1)="E" THEN S=S+14
7890 IF RIGHT$ (A$,1)="D" THEN S=S+13
7900 IF RIGHT$ (A$,1)="C" THEN S=S+12
7910 IF RIGHT$ (A$,1)="B" THEN S=S+11
7920 IF RIGHT$ (A$,1)="A" THEN S=S+10
7930 IF RIGHT$ (A$,1)="9" THEN S=S+9
7940 IF RIGHT$ (A$,1)="8" THEN S=S+8
7950 IF RIGHT$ (A$,1)="7" THEN S=S+7
7960 IF RIGHT$ (A$,1)="6" THEN S=S+6
7970 IF RIGHT$ (A$,1)="5" THEN S=S+5
7980 IF RIGHT$ (A$,1)="4" THEN S=S+4
7990 IF RIGHT$ (A$,1)="3" THEN S=S+3
8000 IF RIGHT$ (A$,1)="2" THEN S=S+2
8010 IF RIGHT$ (A$,1)="1" THEN S=S+1
8020 IF RIGHT$ (A$,1)="0" THEN S=S+0
8030 ? A$;"=";S:?: GOTO 7705


Program:


hex_to_dec_2char.txt (1,32 kb)

 

Ukážka č.1: Hex to dec program v akcii.

 

Takto vyzerá ten istý program doplnený o príkazy GOTO:

 

7700 REM Converter HEX (0-FFh) to dec (0-255d)
7701 REM            Igi(c)2019
7705 ? "Input hex$,two char.:";:INPUT A$:S=0
7710 IF LEFT$ (A$,1)="F" THEN S=240:GOTO 7870
7720 IF LEFT$ (A$,1)="E" THEN S=224:GOTO 7870
7730 IF LEFT$ (A$,1)="D" THEN S=208:GOTO 7870
7740 IF LEFT$ (A$,1)="C" THEN S=192:GOTO 7870
7750 IF LEFT$ (A$,1)="B" THEN S=176:GOTO 7870
7760 IF LEFT$ (A$,1)="A" THEN S=160:GOTO 7870
7770 IF LEFT$ (A$,1)="9" THEN S=144:GOTO 7870
7780 IF LEFT$ (A$,1)="8" THEN S=128:GOTO 7870
7790 IF LEFT$ (A$,1)="7" THEN S=112:GOTO 7870
7800 IF LEFT$ (A$,1)="6" THEN S=96:GOTO 7870
7810 IF LEFT$ (A$,1)="5" THEN S=80:GOTO 7870
7820 IF LEFT$ (A$,1)="4" THEN S=64:GOTO 7870
7830 IF LEFT$ (A$,1)="3" THEN S=48:GOTO 7870
7840 IF LEFT$ (A$,1)="2" THEN S=32:GOTO 7870
7850 IF LEFT$ (A$,1)="1" THEN S=16:GOTO 7870
7860 IF LEFT$ (A$,1)="0" THEN S=0
7870 IF RIGHT$ (A$,1)="F" THEN S=S+15:GOTO 8030
7880 IF RIGHT$ (A$,1)="E" THEN S=S+14:GOTO 8030
7890 IF RIGHT$ (A$,1)="D" THEN S=S+13:GOTO 8030
7900 IF RIGHT$ (A$,1)="C" THEN S=S+12:GOTO 8030
7910 IF RIGHT$ (A$,1)="B" THEN S=S+11:GOTO 8030
7920 IF RIGHT$ (A$,1)="A" THEN S=S+10:GOTO 8030
7930 IF RIGHT$ (A$,1)="9" THEN S=S+9:GOTO 8030
7940 IF RIGHT$ (A$,1)="8" THEN S=S+8:GOTO 8030
7950 IF RIGHT$ (A$,1)="7" THEN S=S+7:GOTO 8030
7960 IF RIGHT$ (A$,1)="6" THEN S=S+6:GOTO 8030
7970 IF RIGHT$ (A$,1)="5" THEN S=S+5:GOTO 8030
7980 IF RIGHT$ (A$,1)="4" THEN S=S+4:GOTO 8030
7990 IF RIGHT$ (A$,1)="3" THEN S=S+3:GOTO 8030
8000 IF RIGHT$ (A$,1)="2" THEN S=S+2:GOTO 8030
8010 IF RIGHT$ (A$,1)="1" THEN S=S+1:GOTO 8030
8020 IF RIGHT$ (A$,1)="0" THEN S=S+0
8030 ? A$;"=";S:?: GOTO 7705

 

Program s príkazmi GOTO:

hex_to_dec_2charn.txt (1,62 kb)


Vďaka vloženým dodatočným príkazom GOTO je táto verzia programu o poznanie dlhšia, ale rýchlejšia pri vykonávaní. Napriek tomu - v praxi asi rozdiel nespoznáte.

___________________________________________________________


 

Ďalšou vecou je basicový program  - Line Data generator:


Pretože SBC6502 nemá dostupné príkazy SAVE a LOAD a ani nepracujeme pomocou otvorenia kanálov (≠1 a pod. ako na niektorých 8bitoch) je dosť problematické ak máme nejakú oblasť pamäte a chceme jej obsah z akýchkoľvek dôvodov odložiť na opätovné použitie. Tak som si urobil Line Data generator, ktorý "zosníma" danú oblasť pamäte a vytvorí potom z toho nám potrebné Data riadky, ktoré potom v programe na svoje miesto načítame pomocou príkazov Restore a Read. Funguje to dobre, akurát musíme mať zapnutý záznam (Capture Text) v Hypertermináli aby sme potom vedeli nakopírovať riadky naspäť do programu.  

 

Ukážka č.2 - výber Capture

Zvolíme Capture Text, názov súboru, po spustení záznamu SBC6502 vygeneruje riadky a uložíme text, potom si z uloženého textu "vytiahneme" nám potrebné Data riadky. Samozrejme je to o niečo zložitejšie, ale pritom stále použiteľné, pretože neviem o tom ako inak uložiť Data riadky do vytvoreného Basic programu. Následne už potom Data riadky môžu byť súčasťou vytvoreného programu.

 

Program pre jednoduchosť načítava vždy celé násobky čísla 8, t.j. ak chceme uložiť nejakú oblasť pamäte voľte vždy dĺžku záznamu ktorý je násobkom čísla 8, čiže napríklad uloženie obsahu 256 byte RAM je naprosto v poriadku, teda 32x8 - je to číslo deliteľné :8 bezo zvyšku, teda no problem. Ako vždy je to daň za jednoduchosť takto vytvoreného programu. Najväčším problémom bolo "nasekať" výstup po 8 byte, hlavne aby na konci riadku nebola navyše čiarka. Ak na dodržanie správnej dĺžky pamätáme tak pri používaní nevzniká pri generovaní Data riadkov žiaden problém. Mne vyhovovalo pre moje použitie ak je v jednom riadku uložený obsah 8byte (pre dané použitie mi to prišlo omnoho prehľadnejšie ako ukladanie 10 byte v riadku), dá sa to zvýšiť (je možné ukladať do jedného riadku 10byte, cez túto hodnotu by som nešiel), ale stále platí:


celková dĺžka vygenerovaného DATA riadku nesmie presiahnuť 72 znakov !

(Obmedzenie je dané verziou použitého Basicu).

 

Program nie je určený na ukladanie obsahu desiatok kB (na to nie je dosť pamäte), ale nejaký ten 1kB (a určite aj viac) s ním určite uložíte. Spotreba pamäte je pri tomto spôsobe ukladania naozaj o hodne väčšia, čo sa týka veľkosti datových riadkov nie je to úsporné (majitelia ZX Spectrum by mohli rozprávať - tam ale zase môžu mať riadok dlhší), ale konečne viem ukladať potrebné údaje (u mňa sa jedná iba o uloženie pár desiatok byte, takže problém s obsadením RAM a veľkosťou na to potrebnej RAM je vcelku nezaujímavý - ale funguje to a to je najdôležitejšie. Nakoniec, ako ďalšiu možnosť môžeme najprv nahrať Data, preniesť ich do potrebnej oblasti RAM a až následne spustiť vlastný program. Síce je to zložitejšie, ale omnoho úspornejšie na obsadenie RAM.


Program generuje Data riadky od čísla 32000 smerom nahor (tam je pre istotu na začiatku v riadku 32000 - kto si po čase pamätá, že ? - uložená štartovacia adresa a dĺžka záznamu v bytoch (dec)), ukladá sa s krokom nasledujúceho ďalšieho riadku +1 (je to možné zmeniť). Tu len pripomínam že SBC6502 nemá obmedzenie čísla riadkov na maximálne číslo riadku =32767, teda riadky kľudne môžu mať aj vyššie číslovanie (SBC6502 povoľuje čísla riadkov aj niekde okolo hodnoty = 63000 !).  


Program Line Data generator:

 

31500 ? "___ Line Data generator 8  ___"
31501 ? "                Igi (c) 2019"
31502 ?:?:?:H=32001:REM H=Data line start number
31503 ? "Start adress  (dec):";:INPUT X
31504 ? "Record lenght (dec):";:INPUT Y
31508 REM ___________________________
31509 ?:? " 32000 REM Start adress=";X;", Record lenght=";Y
31510 FOR F=X TO X+Y-8 STEP 8
31520 GOSUB 31560
31530 H=H+1:REM line step (32001+1)
31540 NEXT F
31550 END
31555 --- Subprogram Data to line ---
31560 ? H;:? "DATA";:FOR G=F TO F+6:? PEEK(G);",";:NEXT G:? PEEK(F+7)
31570 RETURN
31580 REM ___________________________


Program:

Line data generator.txt (574,00 bytes)

 

 

Ukážka (obrázok č.3) - Data na ukážku sú naplnené týmto programovým riadkom:

 

10 A=0: FOR F=31000 TO 31255: POKE F,A: A=A+1: NEXT F


Príde k vygenerovania riadkov s Data údajmi (konkrétne tu snímam adresu 31000d =0 a vyššie adresy, skúšobne je to naplnené údajom zvýšeným vždy o 1 na ďalšej adrese až do rozsahu 310255d kde je obsah =255), najprv zosnímaných iba prvých 32 byte, následne potom celých 256byte.


Ukážka č.3


Ukážka č.4  - celý rozsah naplnených 256 byte, každá bunka - obsah zvýšený postupne o 1.

Je vidieť nastavenie zvyšovania čísla DATA riadkov o 1.

 

Upravený program Line Data generator pre ukladanie 10 byte v riadku, len pozor - ukladanie (dĺžka) teraz musí byť celistvým násobkom čísla 10 ! :


31500 ? " ___ Line Data generator 10  ___"
31501 ? "                   Igi (c) 2019 "
31502 ?:?:?:H=32001:REM H=Data line start number
31503 ? "Start adress  (dec):";:INPUT X
31504 ? "Record lenght (dec):";:INPUT Y
31508 REM ___________________________
31509 ?:? " 32000 REM Start adress=";X;", Record lenght=";Y
31510 FOR F=X TO X+Y-10 STEP 10
31520 GOSUB 31560
31530 H=H+1:REM line step (32001+1)
31540 NEXT F
31550 END
31555 --- Subprogram Data to line ---
31560 ? H;:? "DATA";:FOR G=F TO F+8:? PEEK(G);",";:NEXT G:? PEEK(F+9)
31570 RETURN
31580 REM ___________________________

 

Dosť mi možnosť ukladania obsahu pamäte chýbala, ale teraz som už celkom spokojný. Ak sa niekedy stretnete s týmto problémom tak mi určite porozumiete čo som tým sledoval. Mňa to naozaj v niektorých veciach na SBC6502 obmedzovalo. Možno Vás to inšpiruje tiež vytvoriť nejaké tie pomocné Basic programy - a možno ich napíšete o poznanie lepšie a aj kompaktnejšie.

Držím palce !

___________________________________________________________

Návrat do všetkých pokračovaní o SBC6502:

http://blog.3b2.sk/igi/post/SBC6502-0-UvodIntroduction.aspx

____________________________________________________________

Vaše hodnotenie, Rate post:

Comments

10/19/2019 9:38:47 AM #

trackback

Directory SBC6502

Directory SBC6502

Igi blog | Reply

Add comment


(Will show your Gravatar icon)

  Country flag

biuquote
  • Comment
  • Preview
Loading



Info o autorovi

Volám sa Igor Gramblička, bydlisko: Bratislava, Slovakia. Môj nick: Igi. Tento blog slúži na zobrazenie mojich záujmov - je to môj vlastný pohľad na veci, napriek  tomu dúfam že na mojich stránkach nájdete aj to čo hľadáte ...