Kokeilinpa lukea hieman tuon kuvan osoittaman osoitteen lähistöltä ja haistella mahdollisia uusia osoittimia toisiin paikkoihin. Näin sain ainakin tietooni kuvan koon. Huomasin myös että ohjelman tekemät kuvat (makeimage) ja lataamat kuvat toimivat hieman eri tavoin.
Tässä pieni testikoodi, jossa ensin luetaan kuvan osoittamasta muistipaikasta kuvan osoittimen kohdalta jonka jälkeen seurataan tätä osoitinta toiseen paikkaan ja luetaan sieltä hieman lisää.
Koitin katsoa josko näistä löytyisi mitään järjellistä dataa ja toisaalta jotain merkkejä siitä mistä kohtaa nämä muistipalat voisivat loppua. Koitin myös helpottaa muistin sisällön visualisointia lukemalla muistia tavu kerrallaan sekä kokonaisluvuittain neljän tavun välein ja vielä myös muuntaen luetut tavut ascii merkeiksi.
Code: Select all
img = LoadImage("media/cow.bmp")
If (FileExists ("imagedata.txt")) Then DeleteFile "imagedata.txt"
Dim bVal(4) As Byte
//Dim recPntr(100) As Integer
//Global recursionPointers
readMemory(img,img,4,"image")
toImage = PeekInt(img,0)
//these two are the only thing that is certain for sure
getWidth = PeekInt(img,toImage-img+20)
getHeight = PeekInt(img,toImage-img+24)
fLog = OpenToEdit("imagedata.txt")
SeekFile fLog,FileSize("imagedata.txt")
WriteLine fLog, "Found image @ "+toImage+" having "+getWidth+"x"+getHeight+" pixels"
WriteLine fLog, ""
CloseFile fLog
readMemory(img,toImage,88,"image")
toSomePoint = PeekInt(img,toImage-img+64)
readMemory(img,toSomePoint,60,"something")
toPalette = PeekInt(img,toImage-img+68)
readMemory(img,toPalette,128,"maybe palette?")
Execute "notepad imagedata.txt"
Function readMemory(mem,from,amount,name$)//,recursive=0)
fLog = OpenToEdit("imagedata.txt")
SeekFile fLog,FileSize("imagedata.txt")
//recursions = 0
WriteLine fLog, "Mem dump "+amount+" bytes @ "+(from)+" named: "+name$
For i = from To from+amount-4 Step 4
txt$ = PadString(i,12)+PadString(i-from,4)+":"
For o=0 To 3
bVal(o)=PeekByte(mem,(i-mem)+o)
txt$ = txt$+PadString(bVal(o),4)
Next o
iVal = PeekInt(mem,i-mem)
txt$ = txt$+" Int:"+PadString(iVal,12)
txt$ = txt$+" String: "
For o=0 To 3
txt$ = txt$+PadString(Chr(bVal(o)),1)
Next o
If ( Abs(iVal-(from)) < 20000 And iVal>(from) ) Then
txt$ = txt$+" Pointer?"
remstart
If (recursive <> 0 And recursionPointers < 100) Then
recPntr(recursionPointers) = iVal
recursionPointers = recursionPointers + 1
recursions = recursions +1
txt$ = txt$+" followed in "+recursions
EndIf
remend
EndIf
WriteLine fLog, txt$
Next i
WriteLine fLog, ""
CloseFile fLog
remstart
If (recursive <> 0 And recursions>0) Then
For i=1 To recursions
readMemory(mem,recPntr(i),4,name$+"->"+i,False)
Next i
EndIf
remend
End Function
Function PadString(txt$,amount)
l = Max(amount-Len(txt$),0)
While (l>0)
txt$ = " "+txt$
l=l-1
Wend
Return txt$
End Function
elmo123 wrote:IMAGE()-funktio käytäytyy omituisesti. Jos siitä otetaan arvo ja tulostetaan se, seuraavalla lukukerralla ohjelma MAVittaa!
Huomasin että ongelma oli nimenomaan tulostuksessa, arvoja voi nätisti kyllä tallentaa tiedostoon. Voi olla siis että vaikka arvoja löytäisi ja saisi luettua ja ehkä jopa muutettua niin silti tämän jälkeen ei voisi kuitenkaan tulostaa ruutua ilman että MAV läjähtää ruudulle.