Для того, чтобы это сделать в асме, надо в асм запилить половину эмулятора :) учитывая вон вышесказанное про ноп в три такта. мало ли кто по какому режиму считать собрался.
Вид для печати
Для того, чтобы это сделать в асме, надо в асм запилить половину эмулятора :) учитывая вон вышесказанное про ноп в три такта. мало ли кто по какому режиму считать собрался.
ахаха! :)
поди включен режим с ваитами:) 3 такта блин:) чЮдаки, лол:)
когда мне надо было выравнивать по тактам куски кода, я делал примерно так:
тут ручная работа, конечно, есть, но все же проще что-то менять. padd_macro - макрос (или куча макросов), который добавляет код в нужное кол-во тактов.Код:code ;X t
code ;Y t
code ;Z t
padd_macro Tneed-X-Y-Z
было дело, даже писал автоматический такой "компилятор", который делал то же, что и макрос, но в процессе работы проги и кол-во тактов дробное(!). но в любом случае вручную надо было задавать кол-во тактов полезного кода.
в этом проверь - http://detstwo.com/pub/zemu/
зуб даю что NOP - 4 такта :)
чо-где последняя-распоследняя версия ужасма?:) с правками от 2012 года?
Реализовал еще одно решение, проще предыдущего. PureBasic.
launcher.exe запускается после окончания компиляции SjASM или, к примеру, по кнопке Run из IDE (UEStudio).
Код:;launcher.exe при запуске ищет окно UnrealSpeccy
;в случае отсутствия запущенного эмулятора - запускает его и снова ищет окно
;переводит фокус на окно Unreal и имитирует нажатие клавиш
;Alt+F3 - быстрая загрузка qsave1.sna
;если UnrealSpeccy был изначально свернут - сворачивает снова
;иначе оставляет окно активным
;--------------
;поиск главного окна UnrealSpeccy
count=0
minim=0
Repeat
count=count+1
UnrealWin=FindWindow_(0,"UnrealSpeccy") ;ищем по заголовку окна
Delay(1)
If count=1000
RunProg = WinExec_("D:\ZX\Unreal\unreal.exe", #SW_SHOWNORMAL)
Delay(1000)
EndIf
Until UnrealWin>0 ;пока не найдем окно
;фокус в окно Unreal
If GetWindowLong_(UnrealWin, #GWL_STYLE) & #WS_MINIMIZE
minim=1
ShowWindow_(UnrealWin, #SW_SHOWNORMAL)
UpdateWindow_(UnrealWin)
EndIf
actwin=GetWindowThreadProcessId_(GetForegroundWindow_(),0)
curwin=GetCurrentThreadId_()
If (actwin<>curwin)
AttachThreadInput_(actwin,curwin,#True)
EndIf
SetForegroundWindow_(UnrealWin)
If (actwin<>curwin)
AttachThreadInput_(actwin,curwin,#False)
EndIf
InvalidateRect_(UnrealWin,#Null,#True)
;эмуляция нажатия ALT+F3 (quick load qsave1.sna)
Delay (800)
keybd_event_(#VK_MENU,MapVirtualKey_(#VK_MENU,0),0,0)
keybd_event_(#VK_F3,MapVirtualKey_(#VK_F3,0),0,0)
Delay(200)
keybd_event_(#VK_MENU,MapVirtualKey_(#VK_MENU,0),#KEYEVENTF_KEYUP,0)
keybd_event_(#VK_F3,MapVirtualKey_(#VK_F3,0),#KEYEVENTF_KEYUP,0)
If minim=1
ShowWindow_(UnrealWin, #SW_SHOWMINIMIZED)
EndIf