Code archives/Miscellaneous/Bank peek/poke/read/write 1-32 bits using all math
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| These functions would be useful for compression algos, as well as simply more compact file formats. Write numbers that are odd numbers of bits, like 3 bits, 4 bits. And it doesn't use the slow bin$() function. | |||||
;Bank peek/poke/read/write bit by bit functions by Bot Builder
;The main use for these are in compression algos, or compact file formats.
Const resize=1 ;Whether or not to resize bank when trying to write out of bounds
Function peekbit(bank,pos)
Return (PeekByte(bank,Floor(pos/8.0)) Shr (pos Mod 8))>0
End Function
Function pokebit(bank,pos,val)
bpos=Floor(pos/8.0)
If resize Then
If bpos+1>BankSize(bank) Then ResizeBank bank,bpos+1
EndIf
If peekbit(bank,pos)=val Then Return Else PokeByte bank,bpos,PeekByte(bank,bpos)+(val*2-1)*2^(pos Mod 8)
End Function
Function peekdata(bank,start,count)
For po=0 To count-1
If peekbit(bank,po+start) Then ret=ret+2^po
Next
Return ret
End Function
Function pokedata(bank,start,count,val)
For po=0 To count-1
PokeBit bank,po+start,(val Shr po) Mod 2
Next
End Function
Function PeekShortString$(bank,start) ;Keep in mind these only support 65535 chars, a-z, A-Z, 0-9, space, and . . You gain 2 bytes+(2 bits*number of letters) over blitz strings
l=PeekShort(bank,start)
If l=0 Then Return ""
start=start+10
For a=1 To l
r=peekdata(bank,start+6*a,6)
Select r
Case 0
ret$=ret$+" "
Case 1
ret$=ret$+"."
Default
If r<12 Then
ret$=ret$+(r-2)
ElseIf r<37 Then
ret$=ret$+Chr$(r+53)
Else
ret$=ret$+Chr$(r+59)
End If
End Select
Next
Return ret$
End Function
Function PokeShortString(bank,start,strin$) ;Keep in mind these only support 65535 chars, a-z, A-Z, 0-9, space, and . . You gain 2 bytes+(2 bits*number of letters) over blitz strings
Pokedata bank,start,16,Len(strin$)
start=start+10
For a=1 To Len(strin$)
let$=Mid$(strin$,a,1)
Select let$
Case " "
pokedata bank,start+6*a,6,0
Case "."
pokedata bank,start+6*a,6,1
Default
as=Asc(let$)
If as>47 Then
If as<58 Then
pokedata bank,start+6*a,6,as-46
ElseIf as>64 Then
If as<91 Then
pokedata bank,start+6*a,6,as-53
ElseIf as>96 Then
If as<123 Then pokedata bank,start+6*a,6,as-59 Else pokedata bank,start+6*a,6,0
EndIf
EndIf
EndIf
End Select
Next
End Function
Global cpos=0
;The current position in a bank being read from,
;an important thing to note that this system will
;work differently than the blitz system, in that
;you can't use the convenience read/write functions
;on multiple banks because I can't keep track of
;the current position in multiple banks. Or at least,
;if I did it would be really slow. To change the
;position of read/write, set cpos to whatever
;you like (measured in absolute bits).
Function readbit(bank)
Return peekbit(bank,cpos)
cpos=cpos+1
End Function
Function writebit(bank,val)
pokebit bank,cpos,val
cpos=cpos+1
End Function
Function readdata(bank,length)
cpos=cpos+length
Return peekdata(bank,cpos-length,length)
End Function
Function writedata(bank,val,length)
pokedata bank,cpos,length,val
cpos=cpos+length
End Function
Function ReadShortString$(bank)
strin$=PeekShortString$(bank,cpos)
cpos=cpos+16+6*PeekShort(bank,cpos)
Return strin$
End Function
Function WriteShortString(bank,strin$)
PokeShortString bank,cpos,strin$
cpos=cpos+16+6*Len(strin$)
End Function
;Demo:
Graphics 640,480
b=CreateBank(0) ;only 29 bytes for a 36 charachter string along with length storage!
WriteShortString b,"Hello. I am stored in a compact way."
cpos=0
Print ReadShortString$(b)
Print ""
cpos=0
b2=CreateBank(0)
in$=Input$("String you would like to store?")
ResizeBank b2,Ceil((15+6*Len(in$))/8.0)+1
WriteShortString b2,in$
ResizeBank b2,Ceil((3+cpos)/8.0)
DebugLog cpos
WriteData b2,Input("3-bit (0-7) integer you would like to store?"),3
ResizeBank b2,Ceil((5+cpos)/8.0)
WriteData b2,Input("5-bit (0-31) integer you would like to store?"),5
ResizeBank b2,Ceil((6+cpos)/8.0)
WriteData b2,Input("6-bit (0-63) integer you would like to store?"),6
Print ""
Print "Total size in bits:"+cpos
Print "Total size in bytes:"+(cpos/8.0)
Print ""
cpos=0
Print "String:"+ReadShortString$(b2)
DebugLog cpos
Print "3-bit:"+ReadData(b2,3)
Print "5-bit:"+ReadData(b2,5)
Print "6-bit:"+ReadData(b2,6) |
Comments
None.
Code Archives Forum