
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/Directory-SBC6502.aspx
____________________________________________________________
Vaše hodnotenie, Rate post: