SBC6502 - 17 - software. Basic programs. Prevody-konverzie.

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

PREVODY ... Prevody ... prevody ...

a dôkazy o tom že optimalizácie programov sa oplatia.

 

SBC6502 + 8255A

 

Nasledujú ďalšie Basic programy pre počítač SBC6502. Čo si budeme nahovárať - bez prevodov to v programoch jednoducho a proste nejde ...

___________________________________________________________

Program pre prevod  dec2hex, 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

dĺžka programu: 123byte

 

Teraz si pozrieme ten istý výpočet ako by vyzeral keby sa nepoužili niektoré programové pomôcky - takto som začínal na SBC6502 aj ja ...


1000 ? CHR$(12): REM CLS
1010 CLEAR
1020 ? " Dec to Hex:";: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 1010

dĺžka programu: 1056byte

Toto je trošku iný "bumbrlíček" vo výsledku, že ?

______________________________________________________________________________

Program pre prevod hex2dec2hex:

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

Hex-dec-hex-conv.zip

___________________________________________________________

Doplnil som sem ešte 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é sú upravené priamo pre menší vstupný 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

dĺžka programu: 410byte


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

dĺžka programu: 286byte

___________________________________

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

 dĺžka programu: 369byte


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

 dĺžka programu: 309byte

______________________________________________________________________________

Program pre prevod - dec2bin, vstupný rozsah čísiel = 0÷255d:


10 ?
12 ? "Dec2bin converter, input range 0-255d"
14 ?:INPUT X:IF X>255 OR X<0 THEN 40
16 ? "bit: 7 6 5 4 3 2 1 0"
18 ? "  X=";
20 Y=128
22 A=INT(X/Y)
24 IF A=0 THEN 32
26 ? " 1";
28 X=X-Y
30 GOTO 34
32 ? " 0";
34 Y=Y/2
36 IF INT(Y)=0 THEN 14
38 GOTO 22
40 ? "Out of range !":GOTO 14

dĺžka programu: 273byte


DEC2BIN - ukážka.

Iná verzia:

10 PRINT
11 PRINT "Dec2bin converter, input range 0-255d"
12 PRINT:INPUT X:IF X>255 OR X<0 THEN 40
13 PRINT "     1"
14 PRINT "     2 6 3 1"
15 PRINT "     8 4 2 6 8 4 2 1"
16 PRINT "--------------------"
17 PRINT "bit: 7 6 5 4 3 2 1 0"
18 PRINT "  X=";
20 Y=128
22 A=INT(X/Y)
24 IF A=0 THEN 32
26 PRINT " 1";
28 X=X-Y
30 GOTO 34
32 PRINT" 0";
34 Y=Y/2
36 IF INT(Y)=0 THEN 12
38 GOTO 22
40 PRINT "Out of range !":GOTO 12

dĺžka programu: 366byte

 

Tu som si to napísal sám, po svojom, priamo pre 8bit verziu a aj pre 16 bit verziu:

 

10 ? "Conversion - 8bit dec2bin"
11 K=0:G=128:INPUT " Dec=";K
12 IF K<0 OR K>255 THEN ? "Error !":GOTO 11
13 ? SPC(10)"76543210":? " Binary  =";
20 FOR A=1 TO 8:GOSUB 40:?A$;:G=G/2:NEXT
22 ?:GOTO 10
40 IF K=G OR K>G THEN K=K-G:A$="1":RETURN
42 A$="0":RETURN

dĺžka programu: 226byte

 

10 ? "Conversion - 16bit dec2bin"
11 K=0:G=32768:INPUT " Dec=";K
12 IF K<0 OR K>65535 THEN ? "Error !":GOTO 11
12 ? SPC(10)"111111"
13 ? SPC(10)"5432109876543210":? " Binary  =";
20 FOR A=1 TO 16:GOSUB 40:?A$;:G=G/2:NEXT
22 ?:GOTO 10
40 IF K=G OR K>G THEN K=K-G:A$="1":RETURN
42 A$="0":RETURN

dĺžka programu: 220byte

____________________________________________________________

Zaujímavé je to že prevod bin2dec som akosi v literatúre nenašiel, takže som si ho tak isto napísal sám a je tu pekne krásne vidieť ako sa program postupne môže vyvíjať /a zmenšovať/.


8-bitová konverzia binary2dec:

 
10 ? "Conversion - 8bit binary2dec":REM V.1.0
11 ? SPC(10)"8x 0 or 1"
12 ? SPC(10)"76543210"
14 K=0:INPUT " Binary=";G$
16 IF LEN (G$)<>8 THEN ? "Error !":GOTO 10
20 IF MID$(G$,1,1)="1" THEN K=K+128
21 IF MID$(G$,2,1)="1" THEN K=K+64
22 IF MID$(G$,3,1)="1" THEN K=K+32
23 IF MID$(G$,4,1)="1" THEN K=K+16
24 IF MID$(G$,5,1)="1" THEN K=K+8
25 IF MID$(G$,6,1)="1" THEN K=K+4
26 IF MID$(G$,7,1)="1" THEN K=K+2
27 IF MID$(G$,8,1)="1" THEN K=K+1
30 ? " Dec=";K:CLEAR:GOTO 10

dĺžka programu. 402byte

 

Tento program sa dá urobiť aj mierne odlišným riešením:

 

10 ? "Conversion - 8bit binary2dec":REM V.1.1
11 ? SPC(10)"8x 0 or 1"
12 ? SPC(10)"76543210"
14 A=0:K=0:INPUT " Binary=";G$
16 IF LEN (G$)<>8 THEN ? "Error !":GOTO 10
20 A=A+1:G=128:GOSUB 40:A=A+1:G=64:GOSUB 40
22 A=A+1:G=32:GOSUB 40:A=A+1:G=16:GOSUB 40
24 A=A+1:G=8:GOSUB 40:A=A+1:G=4:GOSUB 40
26 A=A+1:G=2:GOSUB 40:A=A+1:G=1:GOSUB 40
30 ? " Dec=";K:CLEAR:GOTO 12
40 IF MID$(G$,A,1)="1" THEN K=K+G
42 RETURN

dĺžka programu: 352byte

 

Máte pocit že by sa to tu dalo optimalizovať ?  Súhlasím:

 
10 ? "Conversion - 8bit binary2dec"
:REM V.1.2
11 ? SPC(10)"8x 0 or 1"
12 ? SPC(10)"76543210"
14 K=0:G=128:INPUT " Binary=";G$
16 IF LEN (G$)<>8 THEN ? "Error !":GOTO 12
20 FOR A=1 TO 8:GOSUB 40:G=G/2:NEXT
30 ? " Dec=";K:CLEAR:GOTO 12
40 IF MID$(G$,A,1)="1" THEN K=K+G
42 RETURN

dĺžka programu: 240byte

 

A uvedený programček verzie 1.02 v akcii.

___________________________________________________________

16 bitová konverzia binary2dec:


10 ? "Conversion - 16bit binary2dec":REM V.1.3
11 ? SPC(10)"16x 0 or 1"
12 ? SPC(10)"111111"
13 ? SPC(10)"5432109876543210"
14 K=0:INPUT " Binary=";G$
16 IF LEN (G$)<>16 THEN ? "Error !":GOTO 10
20 IF MID$(G$,1,1)="1" THEN K=K+32768
21 IF MID$(G$,2,1)="1" THEN K=K+16384
22 IF MID$(G$,3,1)="1" THEN K=K+8192
23 IF MID$(G$,4,1)="1" THEN K=K+4096
24 IF MID$(G$,5,1)="1" THEN K=K+2048
25 IF MID$(G$,6,1)="1" THEN K=K+1024
26 IF MID$(G$,7,1)="1" THEN K=K+512
27 IF MID$(G$,8,1)="1" THEN K=K+256
28 IF MID$(G$,9,1)="1" THEN K=K+128
29 IF MID$(G$,10,1)="1" THEN K=K+64
30 IF MID$(G$,11,1)="1" THEN K=K+32
31 IF MID$(G$,12,1)="1" THEN K=K+16
32 IF MID$(G$,13,1)="1" THEN K=K+8
33 IF MID$(G$,14,1)="1" THEN K=K+4
34 IF MID$(G$,15,1)="1" THEN K=K+2
35 IF MID$(G$,16,1)="1" THEN K=K+1
36 ? " Dec=";K:CLEAR:GOTO 10

dĺžka programu: 687byte

 

Toto bola základná verzia bez optimalizácie, je to celkom dlhý programček, takže ho upravíme tiež a vďaka tomu sa jeho dĺžka významne zmenší:

 

10 ? "Conversion - 16bit binary2dec":REM V.1.4
11 ? SPC(10)"16x 0 or 1"
12 ? SPC(10)"111111"
13 ? SPC(10)"5432109876543210"
14 K=0:G=32768:INPUT " Binary=";G$
16 IF LEN (G$)<>16 THEN ? "Error !":GOTO 10
20 FOR A=1 TO 16:GOSUB 40:G=G/2:NEXT
30 ? " Dec=";K:CLEAR:GOTO 12
40 IF MID$(G$,A,1)="1" THEN K=K+G
42 RETURN

dĺžka programu: 273byte

 

Conversion - 16bit binary2dec, verzia 1.04

___________________________________________________________

Negácia (inverzia) dát:

Toto je veľmi jednoduché, stačí nasledovné - stačí na danú adresu posielať namiesto POKE (adresa),data nový príkaz POKE (adresa), 255-data - a je to.

(data majú možný rozsah 0÷255)

___________________________________________________________

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

5. 11. 2018 18:46:29 #

trackback

11_2018 Blog, Notes.

11_2018 Blog, Notes.

Igi blog |

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: