SBC6502 - 17 - software. Basic programs.

By Administrator at November 05, 2018 18:40
Filed Under: SBC6502

 

 

Nasledujú ďalšie Basic programy pre počítač SBC6502. Prvý program je kratučký a prevádza dekadické čísla na ich hexa hodnoty, potom je tam klasika (druhý program) ako sa to dá napísať bez znalostí konkrétneho jazyku Basic - druhý program je rozsiahlejší a prevádza to isté. Tretí program robí hex-dec-hex konverziu. Štvrtý program dokáže vypočítať viacero paralelne radených odporov alebo viacero sériovo radených kapacít.

___________________________________________________________

Program pre prevod  dec - hex, rozsah 0÷255d:


2000 A$="0123456789ABCDEF"
2010 ? "(dec)";:INPUT N
2020 L=N AND 15:H=(N-L)/16
2030 ?"(hex): ";:? MID$(A$,H+1,1)MID$(A$,L+1,1)
2040 GOTO 2010


Komu sa to nechce "dlapať" - tak si to môže tu stiahnuť:

conv_dec_to_hex.txt (146,00 bytes)

 

Pozrieme sa na to isté, tak isto funkčné - ale riešené "klasicky" - a teda je to o poznanie väčšie (cca 10x !):


(rozsah 0÷255d)


1000 ? CHR$(12): REM CLS
1010
CLEAR:?"Dec to hex conversion"

1020 ?  "range 0-255d:";:INPUT X:Y=X
1030 IF X<0 OR X>255 THEN 1010
1100 IF X>=240 THEN A$="F":X=X-(16*15):GOTO 1500
1110 IF X>=224 THEN A$="E":X=X-(16*14):GOTO 1500
1120 IF X>=208 THEN A$="D":X=X-(16*13):GOTO 1500
1130 IF X>=192 THEN A$="C":X=X-(16*12):GOTO 1500
1140 IF X>=176 THEN A$="B":X=X-(16*11):GOTO 1500
1150 IF X>=160 THEN A$="A":X=X-(16*10):GOTO 1500
1160 IF X>=144 THEN A$="9":X=X-(16*9):GOTO 1500
1170 IF X>=128 THEN A$="8":X=X-(16*8):GOTO 1500
1180 IF X>=112 THEN A$="7":X=X-(16*7):GOTO 1500
1190 IF X>=96 THEN A$="6":X=X-(16*6):GOTO 1500
1200 IF X>=80 THEN A$="5":X=X-(16*5):GOTO 1500
1210 IF X>=64 THEN A$="4":X=X-(16*4):GOTO 1500
1220 IF X>=48 THEN A$="3":X=X-(16*3):GOTO 1500
1230 IF X>=32 THEN A$="2":X=X-(16*2):GOTO 1500
1240 IF X>=16 THEN A$="1":X=X-(16*1):GOTO 1500

1250 A$="0"
1500 IF X=15 THEN B$="F"
1510 IF X=14 THEN B$="E"
1520 IF X=13 THEN B$="D"
1530 IF X=12 THEN B$="C"
1540 IF X=11 THEN B$="B"
1550 IF X=10 THEN B$="A"
1560 IF X=9 THEN B$="9"
1570 IF X=8 THEN B$="8"
1580 IF X=7 THEN B$="7"
1590 IF X=6 THEN B$="6"
1600 IF X=5 THEN B$="5"
1610 IF X=4 THEN B$="4"
1620 IF X=3 THEN B$="3"
1630 IF X=2 THEN B$="2"
1640 IF X=1 THEN B$="1"
1650 IF X=0 THEN B$="0"
1700 C$=A$+B$
1780 ? "Dec:","Hex:":? Y,C$:?
1900 GOTO 1020

 

Takže dá sa to aj tak, aj tak. Rozdiel v použití (a využití) Basic príkazov je evidentný.


Ako na to inak si pozrite na ďalšom programe.

______________________________________________________________________________

 

Program pre prevod hex-dec-hex:

(Tento si ale musíte "nadlapať" z priloženej predlohy sami ...)

Hex-dec-hex-conv.zip

____________________________________________________


Program pre výpočet pre viacero paralelne radených odporov, tak isto je to program pre výpočet sériovo radených kapacít:

 

Je to taká moja blbinka. Už som síce napísal programy pre 2 radené odpory a kondenzátory, ale toto umožňuje radiť a vypočítať väčší počet súčiastok v zapojení. Momentálne nastavený výpočet funguje v rozsahu 2÷10 radených odporov (alebo kapacít).

Táto horná hranica je daná iba kontrolou max. vstupnej hodnoty na riadku 204, ak tento riadok zrušíte tak sa rozsah zvýši - ale počítať už s takým veľkým počtom súčiastok fakt zaváňa psychiatriou ...


Uvedený program by mal bez problémov bežať aj na iných 8 bitových počítačoch a na ich Basicu - akurát treba vynechať riadok č.10, ktorý je skutočne špecifický iba pre SBC6502 - maže sa ním obrazovka - ? CHR$(12) - je to vlastne iba ekvivalent príkazu CLS a a príkaz POKE 15,80 nastavuje výstup cez terminál na hodnotu = 80 znakov v riadku.

 

Listing programu:


6 REM  Single Board Computer 6502
10 ? CHR$(12):POKE 15,80
11 CLEAR
12 ? " __________________________"
13 ? "       Calculator for"
14 ? "    x parallel resistor"
15 ? "            or"
16 ? "     x serial capacity
17 ? "        (c) 2018 Igi"
18 ? " __________________________"
20 ?:? " R=to resist  C=to capacity":?
40 ? " ";:INPUT A$
44 IF A$="R" THEN B$="parallel resist":C$="resistor no.":GOTO 100
48 IF A$="C" THEN B$="serial capacity":C$="capacity no.":GOTO 100
52 ? "             R or C !"
55 GOTO 20                                                                       
100 ?:? "          Input=0=End !":?
200 ? " Number of ";:? B$
202 ? " Range (2-10) :";:INPUT I
204 IF I=1 OR I>10 THEN ? " Call your psychiatrist ...":END
205 IF I=0 THEN 500
210 T=T+1:IF T=I+1 THEN GOTO 11
211 IF T=1 THEN ? " Value:"
212 ? " ";:? C$;T;:INPUT W
215 IF T=1 THEN A=W:GOTO 210
217 IF T=2 THEN B=W:GOSUB 400:GOTO 210
218 IF T>=3 THEN A=Q
219 IF T>=3 THEN B=W:GOSUB 400:GOTO 210
220 STOP
400 REM -------------------------------
405 IF A=0 THEN 500
410 IF B=0 THEN 500
430 C=A*B:D=A+B:Q=(C/D)
445 IF T=I THEN ? "":? " Result=";:? Q:? " __________________________"
460 RETURN
500 ?:? " -- END program --":END


Výpočet prebieha postupne počas zadávania vstupných čísiel, nie až po načítaní všetkých hodnôt.

 

Potrebné je dodržať túto filozofiu - zadávanie hodnôt sa riadi najmenšou zadávanou hodnotou, potom pri výpočte nebude žiaden problém.


Príklady:

 

Potrebujeme vypočítať 3 paralelne zapojené odpory - 100Ω, 10kΩ a 100kΩ.

Zadáme číslo 1 - 100 (Ohm)

           číslo 2 - 10000 (Ohm)

           číslo 3 - 100000 (Ohm)

Čiže zadávame všetko v Ohm - výsledok bude v hodnotách Ohm.


Potrebujeme vypočítať 3 paralelne zapojené odpory - 10k, 27k, 3k3.

Zadáme číslo 1- 10

           číslo 2 - 27

           číslo 3 - 3.3

Zadávame v kOhm - výsledok bude potom v hodnotách kOhm.

 

Potrebujeme vypočítať 3 sériovo zapojené kondenzátory 6.8pF, 100pF a 1nF.

Zadáme číslo 1 - 6.8 (pF)

           číslo 2 - 100 (pF)

           číslo 3 - 1000 (pF)

Zadávame všetko v pF -výsledok bude v pF.


Analogicky to platí aj pre výpočty iných hodnôt, len si treba pri zadávaní uvedomiť aké hodnoty treba vkladať.

 

Teraz ešte vlastný program priamo na stiahnutie:

X-paralel resistor-serial-capacity_bas.txt (1,16 kb)


Jasne, dá sa to urobiť aj inak - a  asi aj lepšie. Nie je tu nejaký rozpis prečo je to tu tak a tam tak, tento program nemá slúžiť na výuku. K takémuto výsledku som dospel pri jednej dlhej jesennej večeri na chalupe. Počíta to, dostanete správne výsledky a mňa baví že to beží na SBC6502. Zadanie nulovej hodnoty odporu alebo nulovej kapacity počas zadávania údajov má za následok okamžité ukončenie programu.


Ak chcete tento program vylepšiť, no problem !

Mimochodom - na riadok 220 by sa to v programe nemalo dostať ani náhodou, t.j. je možné ho zmazať. Bol použitý pri vývoji programu, potreboval som program v istej fázi stopnúť a skontrolovať si čo práve robil (obsah premenných).


___________________________________________________________

10÷12.01.2020

Doplnil som sem ešte tieto 4 programy, ktoré tak isto dokážu robiť DEC-TO-HEX prevod - a to aj v plnom rozsahu 0÷65536d. Tak isto môžeme plniť programy číslami aj od 0÷255, nemajú s tým problém. Niektorý je upravený priamo pre menší rozsah 0÷255d.


Program  DEC-TO-HEX - range 0÷65535d:


2000 ? CHR$(12):? "=== DEC TO HEX ==="
2010 CLEAR:INPUT "DEC NO.:";A$
2020 A = ABS( VAL(A$) )  
2030 B = INT(A/16)
2040 A = A - (B*16)
2050 IF A=10 THEN C$ =C$ +"A"
2060 IF A=11 THEN C$ =C$ +"B"
2070 IF A=12 THEN C$ =C$ +"C"
2080 IF A=13 THEN C$ =C$ +"D"
2090 IF A=14 THEN C$ =C$ +"E"
2100 IF A=15 THEN C$ =C$ +"F"
2110 IF A<10 THEN C$ =C$ +MID$(STR$(A),2,1 )
2120 A = B : IF B<>0 THEN 2030
2130 FOR X = LEN(C$) TO 1 STEP -1
2140 B$ = B$ + MID$(C$,X,1)
2150 NEXT X : ? "HEX:" B$
2160 ?:GOTO 2010

 

Program  DEC-TO-HEX - range 0÷65535d iná verzia:


3000 ? CHR$(12):? "=== DEC TO HEX 2 ==="
3010 CLEAR:INPUT "DEC NO.:";A$
3020  A = ABS( VAL(A$) )  
3030 B = INT(A/16)
3040 A = A - (B*16)
3050 IF A>9 THEN C$=C$+CHR$(55+A)
3060 IF A<10 THEN C$=C$+MID$(STR$(A),2,1 )
3070 A = B : IF B<>0 THEN 3030
3080 FOR X = LEN(C$) TO 1 STEP -1
3090 B$ = B$ + MID$(C$,X,1)
3100 NEXT X : ? "HEX:" B$
3110 ?:GOTO 3010

___________________________________

A ďalšia verzia prevodu Dec2Hex - rozsah 0÷65536d:


 100 DIM D$(16):D$="0123456789ABCDEF"
 105 PRINT :PRINT "Dec number ";
 110 INPUT DEC:NUM=DEC:GOSUB 8500
 130 PRINT DEC;" Dec = ";N$;" Hex"
 140 GOTO 105
 8500 REM Conversion Dec to Hex
 8510 DIV=4096
 8520 FOR I=1 TO 4
 8530 N=INT(NUM/DIV)
 8535 IF I=1 THEN I$=MID$(D$,N+1,1)
 8536 IF I=2 THEN G$=MID$(D$,N+1,1)
 8537 IF I=3 THEN O$=MID$(D$,N+1,1)
 8538 IF I=4 THEN R$=MID$(D$,N+1,1)
 8540 NUM=NUM-DIV*N:DIV=DIV/16
 8550 NEXT I
 8555 N$=I$+G$+O$+R$
 8560 RETURN


Ak postačí Dec2Hex prevod pre rozsah 0÷255d:


 
100 DIM D$(16):D$="0123456789ABCDEF"
 105 PRINT :PRINT "Dec number ";
 110 INPUT DEC:NUM=DEC:GOSUB 8500
 130 PRINT DEC;" Dec = ";N$;" Hex"
 140 GOTO 105
 8500 REM Conversion Dec TO Hex
 8510 DIV=4096
 8520 FOR I=1 TO 4
 8530 N=INT(NUM/DIV)
 8537 IF I=3 THEN O$=MID$(D$,N+1,1)
 8538 IF I=4 THEN R$=MID$(D$,N+1,1)
 8540 NUM=NUM-DIV*N:DIV=DIV/16
 8550 NEXT I
 8555 N$=O$+R$
 8560 RETURN

___________________________________________________________

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

11/5/2018 6:46:29 PM #

trackback

11_2018 Blog, Notes.

11_2018 Blog, Notes.

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 - som už na dôchodku, predtým som pracoval ako IT špecialista na počítačové siete a redakčné systémy vo viacerých denníkoch - až som pred rokmi nakoniec zakotvil v jednom denníku kde som to potiahol až do konca mojej profesnej kariéry.