Code: Select all
;******************************************************************************************************************************************
;{ FindMemory Lib }
Macro _FindUnit_(UnitFunction, UnitSymbol, UnitSize, UnitSize_, StopConditionSymbol, NonStopConditionSymbol, RegisterPrefix)
Procedure FindMemory#UnitFunction(*ResearchStart, WantedValue, MaximumQuantityToBeScanned = -1)
! mov RegisterPrefix#ax, [p.v_WantedValue]
! mov RegisterPrefix#cx, [p.v_MaximumQuantityToBeScanned]
! mov RegisterPrefix#di, [p.p_ResearchStart]
! xor RegisterPrefix#bx, RegisterPrefix#bx
! shr RegisterPrefix#cx, UnitSize_
! rep#StopConditionSymbol scas#UnitSymbol
! lea RegisterPrefix#di, [RegisterPrefix#di - UnitSize]
! lea RegisterPrefix#ax, [RegisterPrefix#bx]
! cmov#NonStopConditionSymbol RegisterPrefix#ax, RegisterPrefix#di
ProcedureReturn
EndProcedure
EndMacro
Macro _FindMemory_(UnitName, UnitSymbol, UnitSize, UnitSize_)
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
CompilerIf UnitSize < 8
_FindUnit_(UnitName, UnitSymbol, UnitSize, UnitSize_, ne, e, e)
_FindUnit_(Non#UnitName, UnitSymbol, UnitSize, UnitSize_, e, ne, e)
CompilerEndIf
CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x64
_FindUnit_(UnitName, UnitSymbol, UnitSize, UnitSize_, ne, e, r)
_FindUnit_(Non#UnitName, UnitSymbol, UnitSize, UnitSize_, e, ne, r)
CompilerEndIf
EndMacro
_FindMemory_(Byte, b, 1, 0)
_FindMemory_(Unicode, w, 2, 1)
_FindMemory_(Long, d, 4, 2)
_FindMemory_(Quad, q, 8, 3)
;}
Code: Select all
DataSection
Here:
Data.A 65,33,48,0
EndDataSection
Debug "Start address :"
Debug ?Here
Debug "Character address 0:"
Debug FindMemoryByte(?Here, 0)