Code archives/Miscellaneous/PeekPoke Module for B3D/B+
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
I was using BLTZMEM.dll by zjpierre until I read jfk's post about RtlMoveMemory and wrote this. The main advantages of using this module are no need for an extra dll and shorter function names. Create a file in your userlibs folder called "peekpoke.decls" .lib "Kernel32.dll" ;Win32 Decls, Memory Management Functions Api_RtlMoveToBank(Destination*,Source,Length):"RtlMoveMemory" Api_RtlMoveToMemory(Destination,Source*,Length):"RtlMoveMemory" ;Api_RtlFillMemory(Destination,Length,Fill):"RtlFillMemory" ;Api_RtlZeroMemory(Destination,Length):"RtlZeroMemory" ;PeekPoke Module Decls PeekB%(address) PeekS%(address) PeekI%(address) PeekF#(address) PokeB(address,value) PokeS(address,value) PokeI(address,value) PokeF(address,value#) MemoryLog(address,ByteLength,filename$) Save this code entry as "peekpoke.bb" and then include it in your main program. Examples are shown below. | |||||
;PeekPoke Module for B3D/B+ ;Author: markcw, edited 15 Mar 2008 ;Allows direct memory access via Kernel32.dll ;Create a file in your userlibs folder called "peekpoke.decls" ;.lib "Kernel32.dll" ; ;;Win32 Decls, Memory Management Functions ;Api_RtlMoveToBank(Destination*,Source,Length):"RtlMoveMemory" ;Api_RtlMoveToMemory(Destination,Source*,Length):"RtlMoveMemory" ;;Api_RtlFillMemory(Destination,Length,Fill):"RtlFillMemory" ;;Api_RtlZeroMemory(Destination,Length):"RtlZeroMemory" ; ;;PeekPoke Module Decls ;PeekB%(address) ;PeekS%(address) ;PeekI%(address) ;PeekF#(address) ;PokeB(address,value) ;PokeS(address,value) ;PokeI(address,value) ;PokeF(address,value#) ;MemoryLog(address,ByteLength,filename$) ;This global has a long name to avoid a conflict Global Kernel32PeekPokeBank=CreateBank(4) ;Bank for memory access Function PeekB(address) ;PeekByte Api_RtlMoveToBank(Kernel32PeekPokeBank,address,1) Return PeekByte(Kernel32PeekPokeBank,0) End Function Function PeekS(address) ;PeekShort Api_RtlMoveToBank(Kernel32PeekPokeBank,address,2) Return PeekShort(Kernel32PeekPokeBank,0) End Function Function PeekI(address) ;PeekInteger Api_RtlMoveToBank(Kernel32PeekPokeBank,address,4) Return PeekInt(Kernel32PeekPokeBank,0) End Function Function PeekF#(address) ;PeekFloat Api_RtlMoveToBank(Kernel32PeekPokeBank,address,4) Return PeekFloat(Kernel32PeekPokeBank,0) End Function Function PokeB(address,value) ;PokeByte PokeByte Kernel32PeekPokeBank,0,value Api_RtlMoveToMemory(address,Kernel32PeekPokeBank,1) End Function Function PokeS(address,value) ;PokeShort PokeShort Kernel32PeekPokeBank,0,value Api_RtlMoveToMemory(address,Kernel32PeekPokeBank,2) End Function Function PokeI(address,value) ;PokeInteger PokeInt Kernel32PeekPokeBank,0,value Api_RtlMoveToMemory(address,Kernel32PeekPokeBank,4) End Function Function PokeF(address,value#) ;PokeFloat PokeFloat Kernel32PeekPokeBank,0,value# Api_RtlMoveToMemory(address,Kernel32PeekPokeBank,4) End Function ;MemoryLog Functions Function MemoryLog(address,ByteLength,filename$="memorylog.txt") ;Writes a memory log text file, useful if you're searching for offsets ;address -> where to start from, ByteLength -> length to copy Local file,id,value,count,array$ file=WriteFile(filename$) For id=0 To (ByteLength/4)-1 ;Write the line MemoryLogValue(file,address) : WriteByte(file,43) ;Write "address+" MemoryLogValue(file,id Shl 2) : WriteByte(file,32) ;Write "offset " WriteByte(file,123) : WriteByte(file,32) ;Write "{ " value=PeekI(address) MemoryLogValue(file,value) : WriteByte(file,32) ;Write "Int " WriteByte(file,58) : WriteByte(file,32) ;Write ": " For count=0 To 3 Step 2 ;2 shorts value=PeekS(address+count) MemoryLogValue(file,value) ;Write "Short" If count=0 Then WriteByte(file,44) ;Write "," If count=2 Then WriteByte(file,32) ;Write " " if last Next WriteByte(file,58) : WriteByte(file,32) ;Write ": " For count=0 To 3 ;4 bytes value=PeekB(address+count) MemoryLogValue(file,value) ;Write "Byte" If count<3 Then WriteByte(file,44) ;Write "," If count=3 Then WriteByte(file,32) ;Write " " if last Next WriteByte(file,58) : WriteByte(file,32) ;Write ": " For count=0 To 3 ;4 chars value=PeekB(address+count) WriteByte(file,value) ;Write "Char" Next WriteByte(file,32) : WriteByte(file,58) ;Write " :" array$=Str(PeekF(address)) WriteByte(file,32) : MemoryLogString(file,array$) ;Write " Float" WriteByte(file,32) : WriteByte(file,125) ;Write " }" WriteByte(file,13) : WriteByte(file,10) ;Write "EOL" address=address+4 ;Get the next 4 bytes Next array$="Address { Int : Short : Byte : Char : Float }" MemoryLogString(file,array$) ;Write info string WriteByte(file,13) : WriteByte(file,10) ;Write "EOL" CloseFile file End Function Function MemoryLogValue(file,value) ;Writes an ascii byte, short or integer Local stringarray$,id,char$ stringarray$=Str(value) For id=1 To Len(stringarray$) char$=Mid(stringarray$,id,1) WriteByte(file,Asc(char$)) Next End Function Function MemoryLogString(file,stringarray$) ;Writes an ascii string Local id,char$ For id=1 To Len(stringarray$) char$=Mid(stringarray$,id,1) WriteByte(file,Asc(char$)) Next End Function |
Comments
| ||
This example is for b3d. It looks at the structure of an image in memory and then pokes the pixels with random colors. I have done a speed test with this method versus WritePixelFast and it is twice as slow. I assume this is because you need to pass the value to a bank and then to memory. I also tested passing to a bank per pixel and then passing the whole image in one go with RTL_MoveMemory and it still wasn't as fast as WritePixelFast although it was very close. |
| ||
This example is for b+. It does the same as the b3d example above. You can see the structure of a b+ image is different to b3d. |
Code Archives Forum