Page 1 of 2

BASIC: byte value to bits...

Posted: Tue Oct 08, 2013 8:52 pm
by jedie

Code: Select all

1 GOTO 100
5 ' CREATE BITS
10 DIM BI(9)
20 TMP = BY
30 FOR BP = 7 TO 0 STEP -1
40      BV = INT(2 ^ BP)
50      IF TMP>=BV THEN TMP=TMP-BV : BI(BP)=1 ELSE BI(BP)=0
60 NEXT BP
70 RETURN
99 ' START
100 INPUT "START BYTE:";BY$
105 IF BY$ = "" THEN 170 ELSE BY=VAL(BY$)-1
110 FOR X = 1 TO 14
120     BY = BY + 1
130     GOSUB 20
140     PRINT BY;BI(7);BI(6);BI(5);BI(4);BI(3);BI(2);BI(1);BI(0)
150 NEXT X
160 GOTO 100
170 PRINT "BYE"
It worked. But it's very slow :(

Any hints and tips to make is faster or something else?

Re: BASIC: byte value to bits...

Posted: Tue Oct 08, 2013 9:09 pm
by Rink
I have a thread on this somewhere, it started with me complaining about the lack of shift operators in Dragon BASIC.

Re: BASIC: byte value to bits...

Posted: Tue Oct 08, 2013 9:57 pm
by sixxie
How about borrowing a recently discussed technique?

Code: Select all

10 FOR V=0 TO 255
20 PRINT CHR$(48-((V AND 128)=128));CHR$(48-((V AND 64)=64));CHR$(48-((V AND 32)=32));CHR$(48-((V AND 16)=16));CHR$(48-((V AND 8)=8));CHR$(48-((V AND 4)=4));CHR$(48-((V AND 2)=2));CHR$(48-((V AND 1)=1))
30 NEXT V

Re: BASIC: byte value to bits...

Posted: Thu Oct 10, 2013 12:22 am
by zephyr
There is an error in line 20 of your program. It should be as follows.

Code: Select all

1 CLS:GOTO 100
5 ' CREATE BITS
10 DIM BI(9)
20 TMP = PEEK(BY)
30 FOR BP = 7 TO 0 STEP -1
40 BV = INT(2 ^ BP)
50 IF TMP>=BV THEN TMP=TMP-BV : BI(BP)=1 ELSE BI(BP)=0
60 NEXT BP
70 RETURN
99 ' START
100 INPUT "START BYTE:";BY$
105 IF BY$ = "" THEN 170 ELSE BY=VAL(BY$)-1
110 FOR X = 1 TO 15
120 BY = BY + 1
130 GOSUB 20
140 PRINT BY;BI(7);BI(6);BI(5);BI(4);BI(3);BI(2);BI(1);BI(0)
150 NEXT X
160 GOTO 100
170 PRINT "BYE"
jedie wrote: It worked. But it's very slow :(

Any hints and tips to make is faster or something else?
The following code is faster.

Code: Select all

10 CLS
20 LINE INPUT"START ADDRESS (HEX) >";M$
30 IF M$="" THEN 10
40 M=VAL("&H"+M$):E$=CHR$(10):X=0:FOR L=1TO15
50 IF M+X=65536 THEN M=0:X=0
60 P$="":A$=HEX$(M+X):T=PEEK(M+X):IF LEN(A$)<4 THEN FOR Z=1TO 4-LEN(A$):P$=P$+"0":NEXT Z
70 B7=0:IF T=>128 THEN B7=1:T=T-128
80 B6=0:IF T=>64 THEN B6=1:T=T-64
90 B5=0:IF T=>32 THEN B5=1:T=T-32
100 B4=0:IF T=>16 THEN B4=1:T=T-16
110 B3=0:IF T=>8 THEN B3=1:T=T-8
120 B2=0:IF T=>4 THEN B2=1:T=T-4
130 B1=0:IF T=>2 THEN B1=1:T=T-2
140 B0=T:PRINT P$;A$;" ";B7;B6;B5;B4;B3;B2;B1;B0;E$:X=X+1:NEXT L
150 GOTO20

Re: BASIC: byte value to bits...

Posted: Thu Oct 10, 2013 8:19 am
by jedie
Thanks! Yes, it's faster. But why?

Are Arrays slow?

My test script looks now:

Code: Select all

120 CLS
130 LINE INPUT "START ADDRESS (DEZ) >";BY$
140 IF BY$ = "" THEN 1000
145 BY=VAL(BY$)
146 IF BY<0 OR BY>255 THEN 120
150 CLS
160 FOR X = 1 TO 15
180 ' CREATE BITS
190 T = BY
200 B0=0:B1=0:B2=0:B3=0:B4=0:B5=0:B6=0:B7=0
210 IF T=>128 THEN B7=1:T=T-128
220 IF T=>64 THEN B6=1:T=T-64
230 IF T=>32 THEN B5=1:T=T-32
240 IF T=>16 THEN B4=1:T=T-16
250 IF T=>8 THEN B3=1:T=T-8
260 IF T=>4 THEN B2=1:T=T-4
270 IF T=>2 THEN B1=1:T=T-2
280 IF T=>1 THEN B0=1:T=T-1
290 PRINT RIGHT$(" "+STR$(BY),3);":";B7;B6;B5;B4;B3;B2;B1;B0
300 BY = BY + 1
310 IF BY>255 THEN BY=0
320 NEXT X
330 GOTO 130
1000 PRINT "BYE"

Re: BASIC: byte value to bits...

Posted: Fri Oct 11, 2013 2:38 pm
by zephyr
The following method is slightly faster than my original code.

Hexadecimal example

Code: Select all

10 CLS
20 LINE INPUT"START ADDRESS (HEX) >";M$
30 IF M$="" THEN 10
40 M=VAL("&H"+M$):E$=CHR$(10):X=0:FOR L=1TO15
50 IF M+X=65536 THEN M=0:X=0
60 P$="":A$=HEX$(M+X):T=PEEK(M+X):IF LEN(A$)<4 THEN FOR Z=1TO 4-LEN(A$):P$=P$+"0":NEXT Z
70 B7=0:IF T AND 128 THEN B7=1
80 B6=0:IF T AND 64 THEN B6=1
90 B5=0:IF T AND 32 THEN B5=1
100 B4=0:IF T AND 16 THEN B4=1
110 B3=0:IF T AND 8 THEN B3=1
120 B2=0:IF T AND 4 THEN B2=1
130 B1=0:IF T AND 2 THEN B1=1
140 B0=T AND 1:PRINT P$;A$;" ";B7;B6;B5;B4;B3;B2;B1;B0;E$:X=X+1:NEXT L
150 GOTO20
Decimal example

Code: Select all

10 CLS
20 LINE INPUT"START ADDRESS (DEC) >";M$
30 L=LEN(M$):IF L<1 OR L>5 THEN 10
40 FORI=1TOL:M=ASC(MID$(M$,I,1)):IF M<48 OR M>57 THEN 10 ELSE NEXT
50 M=VAL(M$):IF M<0 OR M>65535 THEN 10
60 E$=CHR$(10):X=0:FOR L=1TO15
70 IF M+X=65536 THEN M=0:X=0
80 P$="":M$=STR$(M+X):A$=RIGHT$(M$,LEN(M$)-1)+"  ":T=PEEK(M+X):IF M+X <10000 THEN FOR Z=1TO 6-LEN(M$):P$=P$+"0":NEXT Z
90 B7=0:IF T AND 128 THEN B7=1
100 B6=0:IF T AND 64 THEN B6=1
110 B5=0:IF T AND 32 THEN B5=1
120 B4=0:IF T AND 16 THEN B4=1
130 B3=0:IF T AND 8 THEN B3=1
140 B2=0:IF T AND 4 THEN B2=1
150 B1=0:IF T AND 2 THEN B1=1
160 B0=T AND 1:PRINT P$;A$;B7;B6;B5;B4;B3;B2;B1;B0;E$:X=X+1:NEXT L
170 GOTO20

Re: BASIC: byte value to bits...

Posted: Fri Oct 11, 2013 3:04 pm
by jedie
Yes, looks good!

Re: BASIC: byte value to bits...

Posted: Sun Oct 13, 2013 2:02 pm
by zephyr
The following method is now considerably faster than my original code. The .CAS files are attached.

Hexadecimal example

Code: Select all

10 CLS
20 LINE INPUT"START ADDRESS (HEX) >";M$
30 IF M$="" THEN 10
40 M=VAL("&H"+M$):E$=CHR$(10):X=0:FOR L=1TO15
50 IF M+X=65536 THEN M=0:X=0
60 P$="":A$=HEX$(M+X):T=PEEK(M+X):IF LEN(A$)<4 THEN FOR Z=1TO 4-LEN(A$):P$=P$+"0":NEXT Z
70 PRINT P$;A$;" ";SGN(T AND 128);SGN(T AND 64);SGN(T AND 32);SGN(T AND 16);SGN(T AND 8);SGN(T AND 4);SGN(T AND 2);(T AND 1);E$:X=X+1:NEXT L
80 GOTO20
Decimal example

Code: Select all

10 CLS
20 LINE INPUT"START ADDRESS (DEC) >";M$
30 L=LEN(M$):IF L<1 OR L>5 THEN 10
40 FORI=1TOL:M=ASC(MID$(M$,I,1)):IF M<48 OR M>57 THEN 10 ELSE NEXT
50 M=VAL(M$):IF M<0 OR M>65535 THEN 10
60 E$=CHR$(10):X=0:FOR L=1TO15
70 IF M+X=65536 THEN M=0:X=0
80 P$="":M$=STR$(M+X):A$=RIGHT$(M$,LEN(M$)-1)+"  ":T=PEEK(M+X):IF M+X <10000 THEN FOR Z=1TO 6-LEN(M$):P$=P$+"0":NEXT Z
90 PRINT P$;A$;SGN(T AND 128);SGN(T AND 64);SGN(T AND 32);SGN(T AND 16);SGN(T AND 8);SGN(T AND 4);SGN(T AND 2);(T AND 1);E$:X=X+1:NEXT L
100 GOTO20

Re: BASIC: byte value to bits...

Posted: Sun Oct 13, 2013 5:08 pm
by Rink
Hahahah. Is this becoming a bit of an obsession for you mate? :)

Great work though.

Re: BASIC: byte value to bits...

Posted: Sun Oct 13, 2013 5:49 pm
by zephyr
Rink wrote:Hahahah. Is this becoming a bit of an obsession for you mate? :)

Great work though.
Thanks! :)