Page 2 of 2
Posted: Sat May 30, 2009 7:25 pm
by Wladek
Meaby some this:
Code: Select all
Procedure Odbierz(liczba.b, numer) ;32-Bit
;value-range liczba: 0-255, value-range numer: 1-8
!MOVZX eax,byte[p.v_liczba]
!CMP dword[p.v_numer],8 ;if numer is long
!JNE @f
!SHR eax,7
!NOT eax
!AND eax,1
ProcedureReturn ;integer!
!@@:
!MOV cl,[p.v_numer]
!DEC cl
!SHR eax,cl
!AND eax,1
ProcedureReturn ;integer!
EndProcedure
Procedure goodOdbierz(liczba.b, numer)
a=Odbierz(liczba.b, numer)
if numer = 8
a=a~
endif
ProcedureReturn a
EndProcedure
Posted: Sat May 30, 2009 7:43 pm
by Helle
@Michael: I get 1 0 1 0 1 0 1
1 
.
My test-routine:
Code: Select all
Procedure OdbierzOriginal(liczba.b,numer)
liczba.b+128
a1.d=liczba.b/2
a2.d=Round(a1, #PB_Round_Down)/2
a3.d=Round(a2, #PB_Round_Down)/2
a4.d=Round(a3, #PB_Round_Down)/2
a5.d=Round(a4, #PB_Round_Down)/2
a6.d=Round(a5, #PB_Round_Down)/2
a7.d=Round(a6, #PB_Round_Down)/2
a8.d=Round(a7, #PB_Round_Down)/2
Select numer
Case 1
a=Round(a1, #PB_Round_Up)-Round(a1, #PB_Round_Down)
Case 2
a=Round(a2, #PB_Round_Up)-Round(a2, #PB_Round_Down)
Case 3
a=Round(a3, #PB_Round_Up)-Round(a3, #PB_Round_Down)
Case 4
a=Round(a4, #PB_Round_Up)-Round(a4, #PB_Round_Down)
Case 5
a=Round(a5, #PB_Round_Up)-Round(a5, #PB_Round_Down)
Case 6
a=Round(a6, #PB_Round_Up)-Round(a6, #PB_Round_Down)
Case 7
a=Round(a7, #PB_Round_Up)-Round(a7, #PB_Round_Down)
Case 8
a=Round(a8, #PB_Round_Up)-Round(a8, #PB_Round_Down)
EndSelect
ProcedureReturn a
EndProcedure
Procedure OdbierzASM(liczba.b, numer) ;32-Bit
;value-range liczba: 0-255, value-range numer: 1-8
!MOVZX eax,byte[p.v_liczba]
!CMP dword[p.v_numer],8 ;if numer is long
!JNE @f
!SHR eax,7
!NOT eax
!AND eax,1
ProcedureReturn ;integer!
!@@:
!MOV cl,[p.v_numer]
!DEC cl
!SHR eax,cl
!AND eax,1
ProcedureReturn ;integer!
EndProcedure
For numer = 1 To 8
For liczba = 0 To 255
Debug numer
Debug liczba
x = OdbierzOriginal(liczba, numer)
y = OdbierzASM(liczba, numer)
Debug x
Debug y
If x <> y
Debug "Error!"
Delay(1000)
EndIf
Debug "==========="
Next
Next
I get no errors! PB 4.31 Beta2 (x64).
Gruss
Helle
Posted: Sat May 30, 2009 8:09 pm
by Wladek
Helle- you right
Thanks
Posted: Sun May 31, 2009 7:27 am
by Michael Vogel
Helle wrote:@Michael: I get 1 0 1 0 1 0 1
1 
.
The only error can be seen(?) in my brain, I haven't read careful enough

and thought, something like that has to be found...
Code: Select all
liczba=25
numer=3
Debug Asc(Mid(RSet(Bin(liczba),8,"0"),9-numer))-'0'
But the first bit has to be inverted, so now I got it (hopefully;)...
Even when Helles code is the best solution for the given problem, I'll try to add one additional idea for optimizing similar problems, it may be useful (especially when slow math functions are involved) to create a result table at the beginning...
Code: Select all
Procedure OdbierzASM(liczba.b, numer) ;32-Bit
;value-range liczba: 0-255, value-range numer: 1-8
!MOVZX eax,byte[p.v_liczba]
!CMP dword[p.v_numer],8 ;if numer is long
!JNE @f
!SHR eax,7
!NOT eax
!AND eax,1
ProcedureReturn ;integer!
!@@:
!MOV cl,[p.v_numer]
!DEC cl
!SHR eax,cl
!AND eax,1
ProcedureReturn ;integer!
EndProcedure
Global Dim SBits.b(255,8)
For l = 0 To 255
s.s=RSet(Bin(l),8,"0")
PokeB(@s,'0'+'1'-PeekB(@s))
For i=1 To 8
SBits(l,i)=Asc(mid(s,9-i,1))-'0'
Next i
Next l
For liczba = 0 To 255
a.s=""
b.s=""
For numer = 1 To 8
a=Str(OdbierzASM(liczba, numer))+a
b=Str(Sbits(liczba,numer))+b
Next numer
If a<>b
Debug Str(liczba)+": "+a+"~"+b
EndIf
Next
Posted: Sun May 31, 2009 10:28 am
by Wladek
Meaby, I 'm make mistake in my code.
Thanks all ,who help me.