i made my way with memory addresses and size, instead making string for raw data lines. and it start work much faster, than it was before. thanks. will try to attach that variant to main code and see what happen
Code: Select all
Enumeration
#Window
#Canvas
#Scroll
#Button
EndEnumeration
DataSection
startdata:
Data.b $01, $02 ; command 01
Data.b $03, $04, $05 ; command 02
Data.b $06, $07, $08 ; command 03
Data.b $09, $00, $23 ; command 04 url to other part of code. 09 code and $0023 address value
Data.b $21 ; end of code
Data.b $12, $13, $14, $15, $16, $17, $18, $19, $20 ; some raw data, not code
; start second code again
Data.b $03, $04, $05 ; command 02 - jump should be get from 3 part
Data.b $03, $04, $05 ; command 02
Data.b $21 ; end of code
Data.b $12, $13, $14, $15, $16, $17, $18, $19, $20 ; some raw data, not code
; start third code again
Data.b $01, $02 ; command 01
Data.b $03, $04, $05 ; command 02
Data.b $06, $07, $08 ; command 03
Data.b $09, $FF, $E5 ; command 04 url to other part of code. 09 code and -27 address value
Data.b $21 ; end of code
Data.b $12, $13, $14, $15, $16, $17, $18, $19, $20 ; some raw data, not code
Data.b $12, $13, $14, $15, $16, $17, $18, $19, $20 ; some raw data, not code
Data.b $12, $13, $14, $15, $16, $17, $18, $19, $20 ; some raw data, not code
Data.b $12, $13, $14, $15, $16, $17, $18, $19, $20 ; some raw data, not code
; start fourth unknown code, that should be selectead manualy later
Data.b $01, $02 ; command 01
Data.b $03, $04, $05 ; command 02
Data.b $06, $07, $08 ; command 03
Data.b $21 ; end of code
Data.b $12, $13, $14, $15, $16, $17, $18, $19, $20 ; some raw data, not code
Data.b $12, $13, $14, $15, $16, $17, $18, $19, $20 ; some raw data, not code
Data.b $12, $13, $14, $15, $16, $17, $18, $19, $20 ; some raw data, not code
Data.b $12, $13, $14, $15, $16, $17, $18, $19, $20 ; some raw data, not code
Data.b $12, $13, $14, $15, $16, $17, $18, $19, $22 ; some raw data, not code
enddata:
EndDataSection
Global Dim AddressesArray.l(0)
Global Dim AddressesArrayB.l(0)
Global *RomFileMemImage
Global globalarraysz.l
Global Dim ReadMarkersArray.a(0)
Global Dim ReadMarkersArrayB.a(0)
Global Dim EndLinesMarkersArray.a(0)
Global Dim EndLinesMarkersArrayB.a(0)
Global outtextstring$
Structure mainoutstr
string.s
color.a
address.d
command.s
param1.s
param2.s
size.a
EndStructure
Global NewList MainOutputList.mainoutstr()
Global NewList BaseOutputList.mainoutstr()
Global BaseResaveFlag.a
Global pagelines = 8
Global MemImageSz = 6000000
*RomFileMemImage = AllocateMemory(MemImageSz)
CopyMemory(?startdata, *RomFileMemImage, ?enddata - ?startdata)
Procedure.u ReadBE16M(address.l)
Result.u
Result = PeekA(address) << 8
Result | PeekA(address + 1)
ProcedureReturn (Result)
EndProcedure
Structure pChar ; virtual CHAR-ARRAY, used as Pointer to overlay on strings
a.a[0] ; fixed ARRAY Of CHAR Length 0
c.c[0]
EndStructure
Procedure.s HexStringFromBuffer(*Buffer, Bytes)
; ============================================================================
; NAME: HexStringFromBuffer
; DESC: Converts a Buffer to a Hex-String
; DESC: Convert each Byte to a 2-char-Hex-String
; VAR(*Buffer) : Pointer to the Buffer
; VAR(Bytes) : Number of Bytes to convert
; RET.s: The String with the Bytes Hex-Values
; ============================================================================
Protected I, *src.pChar, *dest.pChar
Protected hiNibble.a, loNibble.a
Protected sRet.s
If *Buffer
sRet.s = Space(Bytes * 2) ; for each Byte we need to HEX digits 255=FFh
*dest = @sRet
*src = *Buffer
For I=0 To (Bytes-1)
hiNibble = (*src\a[I] >> 4) + '0' ; Add Ascii-Code of '0'
If hiNibble > '9' : hiNibble + 7 : EndIf ; If 'A..F', we must add 7 for the correct Ascii-Code
loNibble = (*src\a[I] & $0F) + '0'
If loNibble > '9' : loNibble + 7 : EndIf
*dest\c[I] = hiNibble
*dest\c[I+1] = loNibble
Next
ProcedureReturn sRet
EndIf
ProcedureReturn #Null$
EndProcedure
Procedure AddMemMarker(address.l)
bingo.a
sz.l
i.l
If ReadMarkersArray(address) = 0
; add only if code was not parsed before
sz = ArraySize(AddressesArray())
If sz = 0
; it just first case. add into array
ReDim AddressesArray(1)
AddressesArray(1) = address
Else
For i = 1 To sz
If AddressesArray(i) = address
; already parsed
bingo = 1
Break
EndIf
Next
If bingo = 0
; didnt see that add before. need add
globalarraysz = sz + 1
ReDim AddressesArray(globalarraysz)
AddressesArray(globalarraysz) = address
EndIf
EndIf
Else
;Debug "that address already parsed " + Hex(address)
EndIf
EndProcedure
Procedure GetAsmCode(memstart.l)
param.w ; can be negative to jump back, not only forward
For i = memstart To MemImageSz - 1
currentromlocation = i
codeid = PeekA(?startdata + i) ; read command id
ReadMarkersArray(i) = 1 ; mark - that code was parsed
commandname$ = ""
outtextstring1$ = ""
outtextstring2$ = ""
Select codeid
Case $01
i + 1 ; 1 byte param for 01
ReadMarkersArray(i) = 1
param = PeekA(?startdata + i)
commandname$ = "comand1"
outtextstring1$ = "$" + Hex(param)
;Debug "rom:" + RSet(Hex(i), 4, "0") + " comm" + RSet(Hex(codeid), 2, "0") + " $" + Hex(param, #PB_Word)
Case $03, $06
i + 1
ReadMarkersArray(i) = 1
param = ReadBE16M(?startdata + i)
commandname$ = "comand2or3"
outtextstring1$ = "$" + Hex(param, #PB_Word)
;Debug "rom:" + RSet(Hex(i), 4, "0") + " comm" + RSet(Hex(codeid), 2, "0") + " $" + RSet(Hex(param, #PB_Word), 4, "0")
i + 1 ; shift i above 2bytes param
ReadMarkersArray(i) = 1
Case $09
whereiamnow = i
i + 1
ReadMarkersArray(i) = 1
param = ReadBE16M(?startdata + i)
;Debug "rom:" + RSet(Hex(i), 4, "0") + " jumpto" + " $" + RSet(Hex(param, #PB_Word), 4, "0")
commandname$ = "jumpto"
outtextstring1$ = "$" + Hex(param, #PB_Word)
i + 1 ; shift i above 2bytes param
ReadMarkersArray(i) = 1
If param > -1
AddMemMarker(param) ; add new founded address to job list
Else
AddMemMarker(whereiamnow + param)
EndIf
Case $21
;Debug "rom:" + RSet(Hex(i), 4, "0") + " end of function"
;Debug ""
commandname$ = "endfunction"
EndLinesMarkersArray(i) = 1
breakflag = 1
EndSelect
; add parsed data to list
If commandname$
;Debug commandname$
AddElement(MainOutputList())
MainOutputList()\string = commandname$ + " " + outtextstring1$
MainOutputList()\address = currentromlocation
EndIf
If breakflag
Break
EndIf
Next
EndProcedure
Procedure ScrollUpdate()
valuetoshow.a
ystep.a = 16
scrollvalue = GetGadgetState(#Scroll)
scrollvalueto = scrollvalue + pagelines
If StartDrawing(CanvasOutput(#Canvas))
DrawingMode(#PB_2DDrawing_Transparent)
; background
Box(0, 0, 700, 500, RGB(70, 70, 70))
y = 10
x = 10
SelectElement(MainOutputList(), scrollvalue)
For l = scrollvalue To scrollvalueto
sz = MainOutputList()\size ; marker - this is raw code
If sz
; means that line not prepare to show. need to convert into string
valuetoshow = PeekA(*RomFileMemImage + MainOutputList()\address)
outputstring$ = "dc.b $" + RSet(Hex(valuetoshow), 2, "0")
sz - 1
If sz
For b = 1 To sz
valuetoshow = PeekA(*RomFileMemImage + MainOutputList()\address + b)
outputstring$ + ", $" + RSet(Hex(valuetoshow), 2, "0")
Next
EndIf
MainOutputList()\string = outputstring$
MainOutputList()\size = 0
EndIf
DrawText(x, y, MainOutputList()\string, RGB(200, 200, 200))
NextElement(MainOutputList())
y + ystep
Next
StopDrawing()
EndIf
EndProcedure
Procedure Formatlist(sz.l)
; format output list and add raw data
labelarraysize = ArraySize(AddressesArray())
; adresses as not right order, but 1, 3, 2 for example
SortArray(AddressesArray(), #PB_Sort_Ascending)
; now they are 1, 2, 3
lastAddressesArrayindex = 1
; copy parsed code, but not formated
If BaseResaveFlag = 0
BaseResaveFlag = 1
CopyList(MainOutputList(), BaseOutputList())
CopyArray(AddressesArray(), AddressesArrayB())
CopyArray(ReadMarkersArray(), ReadMarkersArrayB())
CopyArray(EndLinesMarkersArray(), EndLinesMarkersArrayB())
EndIf
; run all data from begining
For i = 0 To sz - 1
If ReadMarkersArray(i) = 1 ; if that bytes was parsed as code
; paint raw data bytes, if they exist
If outputstring$
AddElement(MainOutputList())
;MainOutputList()\string = outputstring$
MainOutputList()\address = b_start_addr
MainOutputList()\size = stringscounter
outputstring$ = ""
stringscounter = 0
EndIf
;{ add labels lines, if they exist
If labelarraysize
For l = lastAddressesArrayindex To labelarraysize
If AddressesArray(l) = i
AddElement(MainOutputList())
;MainOutputList()\string = "" ; just empty line
MainOutputList()\address = i - 0.2 ; - 0.2 make empty line above
AddElement(MainOutputList())
MainOutputList()\string = "label_" + Hex(i) + ":"
MainOutputList()\address = i - 0.1 ; - 0.1 make line with lavel above code
lastAddressesArrayindex = l
Break
EndIf
Next
EndIf
;}
;{ empty line after endofcode comand
If EndLinesMarkersArray(i)
AddElement(MainOutputList())
;MainOutputList()\string = "" ; just empty line
MainOutputList()\address = i + 0.1 ; set after endofcode command address + 0.1
EndIf
;}
Else ; this bytes raw code
;{ add labels lines, if they exist
If labelarraysize
For l = lastAddressesArrayindex To labelarraysize
If AddressesArray(l) = i
AddElement(MainOutputList())
;MainOutputList()\string = "" ; just empty line
MainOutputList()\address = i - 0.2 ; - 0.2 make empty line above
AddElement(MainOutputList())
MainOutputList()\string = "label_" + Hex(i) + ":"
MainOutputList()\address = i - 0.1 ; - 0.1 make line with lavel above code or raw data
lastAddressesArrayindex = l
Break
EndIf
Next
EndIf
;}
; 10873 for HexStringFromBuffer(*RomFileMemImage + i, 1)
;valuetoshow = PeekA(*RomFileMemImage + i)
; 6455 for PeekA and rset + hex
If stringscounter = 0
;outputstring$ = "dc.b $" + HexStringFromBuffer(*RomFileMemImage + i, 1)
;outputstring$ = "dc.b $" + RSet(Hex(valuetoshow), 2, "0")
stringscounter = 1
b_start_addr = i ; remember address of first raw byte
Else
; add new bytes into line
;outputstring$ + ",$" + HexStringFromBuffer(*RomFileMemImage + i, 1)
;outputstring$ + ",$" + RSet(Hex(valuetoshow), 2, "0")
stringscounter + 1
If stringscounter = 16
; shift to next line
AddElement(MainOutputList())
;MainOutputList()\string = outputstring$
MainOutputList()\address = b_start_addr
MainOutputList()\size = stringscounter
outputstring$ = ""
stringscounter = 0
EndIf
EndIf
EndIf
Next
; add last raw bytes
If outputstring$
AddElement(MainOutputList())
;MainOutputList()\string = outputstring$
MainOutputList()\address = b_start_addr
MainOutputList()\size = stringscounter
outputstring$ = ""
stringscounter = 0
EndIf
; sort, to make correct order of lines by address value
SortStructuredList(MainOutputList(), 0, OffsetOf(mainoutstr\address), TypeOf(mainoutstr\address))
EndProcedure
Procedure ParseCode(sz.l)
; start parse and add new finded addresses in a process
globalarraysz = ArraySize(AddressesArray())
For i = 1 To globalarraysz
currentaddr = AddressesArray(i)
If ReadMarkersArray(currentaddr) = 0
; that address is sure not parsed before
GetAsmCode(AddressesArray(i))
Else
;Debug Hex(currentaddr) + " already parsed"
EndIf
Next
Formatlist(sz)
EndProcedure
StartTime.q = ElapsedMilliseconds()
AddMemMarker($00) ; add first known address marker to start search code
ReDim ReadMarkersArray(MemImageSz) ; prepare array of flags parse or not
ReDim EndLinesMarkersArray(MemImageSz) ; endofblock lines array
ParseCode(MemImageSz)
Debug ElapsedMilliseconds() - StartTime
MessageRequester("dsdf", Str(ElapsedMilliseconds() - StartTime)) ; 3697, 3574
;ResetList(MainOutputList())
;While NextElement(MainOutputList())
; Debug MainOutputList()\string
;Wend
;- Window
If OpenWindow(#Window, 100, 100, 620, 200, "", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
CanvasGadget(#Canvas, 10, 10, 580, 140)
ScrollBarGadget(#Scroll, 590, 10, 20, 140, 0, 100, pagelines, #PB_ScrollBar_Vertical)
BindGadgetEvent(#Scroll, @ScrollUpdate())
ButtonGadget(#Button, 10, 160, 80, 30, "hotdisasm")
sz = ListSize(MainOutputList())
SetGadgetAttribute(#Scroll, #PB_ScrollBar_Maximum, sz-1)
ScrollUpdate()
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case #Button
If EventType() = #PB_EventType_LeftClick
SetGadgetState(#Scroll, 22) ; scroll to area, where that code lays inside raw data
ScrollUpdate()
; restore data like it was before formated
CopyList(BaseOutputList(), MainOutputList())
CopyArray(AddressesArrayB(), AddressesArray())
AddressesArrayCount = ArraySize(AddressesArray())
CopyArray(ReadMarkersArrayB(), ReadMarkersArray())
CopyArray(EndLinesMarkersArrayB(), EndLinesMarkersArray())
; add new address
AddMemMarker(85)
ParseCode(MemImageSz)
; set new limit for scroll, because was added new lines in main list
sz = ListSize(MainOutputList())
SetGadgetAttribute(#Scroll, #PB_ScrollBar_Maximum, sz-1)
ScrollUpdate()
EndIf
EndSelect
Case #PB_Event_CloseWindow
qiut = 1
EndSelect
Until qiut = 1
EndIf
End
ops... size count wrong