BASIC: byte value to bits...

Hardware Hacking, Programming and Game Solutions/Cheats
jedie
Posts: 655
Joined: Wed Aug 14, 2013 12:23 pm
Location: germany
Contact:

BASIC: byte value to bits...

Post 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?
... too many ideas and too little time ... Related stuff written in Python:
Dragon 32 emulator / PyDC - Python Dragon 32 converter: https://github.com/jedie/DragonPy
DWLOAD server / Dragon-Lib and other stuff: https://github.com/6809
Rink
Posts: 236
Joined: Mon Sep 05, 2011 7:01 pm

Re: BASIC: byte value to bits...

Post by Rink »

I have a thread on this somewhere, it started with me complaining about the lack of shift operators in Dragon BASIC.
sixxie
Posts: 1346
Joined: Fri Jul 18, 2008 8:36 am
Location: Hertfordshire
Contact:

Re: BASIC: byte value to bits...

Post 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
zephyr
Posts: 1474
Joined: Mon Jul 21, 2008 1:18 am

Re: BASIC: byte value to bits...

Post 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
Attachments
ZEPHYR-BITS1.zip
(506 Bytes) Downloaded 298 times
JEDIE-BITS2.zip
(452 Bytes) Downloaded 284 times
Last edited by zephyr on Fri Oct 11, 2013 2:34 pm, edited 4 times in total.
jedie
Posts: 655
Joined: Wed Aug 14, 2013 12:23 pm
Location: germany
Contact:

Re: BASIC: byte value to bits...

Post 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"
... too many ideas and too little time ... Related stuff written in Python:
Dragon 32 emulator / PyDC - Python Dragon 32 converter: https://github.com/jedie/DragonPy
DWLOAD server / Dragon-Lib and other stuff: https://github.com/6809
zephyr
Posts: 1474
Joined: Mon Jul 21, 2008 1:18 am

Re: BASIC: byte value to bits...

Post 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
Attachments
ZEPHYR-BITS2.zip
(488 Bytes) Downloaded 299 times
ZEPHYR-BITS2-DEC.zip
(554 Bytes) Downloaded 287 times
jedie
Posts: 655
Joined: Wed Aug 14, 2013 12:23 pm
Location: germany
Contact:

Re: BASIC: byte value to bits...

Post by jedie »

Yes, looks good!
... too many ideas and too little time ... Related stuff written in Python:
Dragon 32 emulator / PyDC - Python Dragon 32 converter: https://github.com/jedie/DragonPy
DWLOAD server / Dragon-Lib and other stuff: https://github.com/6809
zephyr
Posts: 1474
Joined: Mon Jul 21, 2008 1:18 am

Re: BASIC: byte value to bits...

Post 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
Attachments
ZEPHYR-BITS3.zip
(405 Bytes) Downloaded 287 times
ZEPHYR-BITS3D.zip
(472 Bytes) Downloaded 299 times
Rink
Posts: 236
Joined: Mon Sep 05, 2011 7:01 pm

Re: BASIC: byte value to bits...

Post by Rink »

Hahahah. Is this becoming a bit of an obsession for you mate? :)

Great work though.
zephyr
Posts: 1474
Joined: Mon Jul 21, 2008 1:18 am

Re: BASIC: byte value to bits...

Post by zephyr »

Rink wrote:Hahahah. Is this becoming a bit of an obsession for you mate? :)

Great work though.
Thanks! :)
Post Reply