Ой! не знаю, что это такое, поэтому пока СТОП!Yason wrote:Отладчик (mtdbg), в помощь.
Спасибо за помощь! Сейчас рассмотрю чего мне Pathoswithin за код кинул.
Ой! не знаю, что это такое, поэтому пока СТОП!Yason wrote:Отладчик (mtdbg), в помощь.
Pathoswithin, как я этот код только не примудривал, - ошибку выдает Extr_KlbrInWinPathoswithin wrote: По поводу производительности, в простейшем случае, чтобы вызывать цикл 50 раз в секунду, можно добавить в него такой код:
mov eax, 26
mov ebx, 9
int 40
mov ebx, eax
shr ebx, 1
inc ebx
shl ebx, 1
sub ebx, eax
mov eax, 5
int 40
Всё то же. Это частичные аналоги функций API, в одной нехорошей системе: HeapAlloc, HeapRealloc и т.д.ALEXS1983 wrote:Да и вообще, я ничего не понял с теми процедурами. Я думал это как-то проще. А как потом доступатся к той памяти ? Ну к нормальной понятно например mov [ebx+VideoDirtyM],al или mov bl,[VideoDirtyM+eax] А быстродеqствие такое же как и в обычной размеченной, типа VideoDirtyM rb 16384 ?
Code: Select all
include "proc32.inc" ; макросы облегчают жизнь ассемблерщиков!
include "memory.inc" ; макросы облегчают жизнь ассемблерщиков!
Code: Select all
; например, нужен очищенный буфер, размером в 64кб (на выходе: eax=адрес буфера).
stdcall memory.initialize_allocate_reallocate_and_clear, 64000
Code: Select all
; например, нужен доступ к 100-ому элементу в буфере (адрес буфера, в регистре eax).
mov [eax+100], dword 0x12345678
Code: Select all
; например, нужно удалить выделенный буфер (eax=адрес буфера).
stdcall memory.free, eax
Code: Select all
1. m: array of integer; // определение динамического массива.
2. SetLength(m, 4096); // перераспределение динамического массива.
3. MemFree(m); // удаление динамического массива.
Code: Select all
1. stdcall memory.initialize_and_allocate, 1024 ; определение динамического массива.
; проверяем, хватает ли памяти в ОЗУ, для выделения динамического массива (0-неуспех, иначе размер созданной кучи).
test eax, eax
jz error.not_enough_memory
2. stdcall memory.reallocate, 4096, eax ; перераспределение динамического массива.
3. stdcall memory.free, eax ; удаление динамического массива.
Code: Select all
БЫЛО:
VideoDirtyM rb 16385
…......................
…......................
mov [ebx+VideoDirtyM],al
…......................
…......................
mov [eax+VideoDirtyM],bl
…......................
…......................
mov cl,[VideoDirtyM+ebx]
…......................
…......................
ЗАМЕНИЛ ВЕЗДЕ ВОТ ТАК (СООТВЕТСВЕННО)
СТАЛО:
VideoDirtyMa rd 1
…......................
…......................
INITuMem: ; заупскается при старте
stdcall memory.initialize_allocate_reallocate_and_clear, 16385
mov[VideoDirtyMa],eax
ret
…......................
…......................
add ebx,[VideoDirtyMa]
mov [ebx],al
…......................
…......................
add eax,[VideoDirtyMa]
mov [eax],bl
….....................
….....................
add ebx,[VideoDirtyMa]
mov cl,[ebx]
….....................
….....................
Мои процедуры, работают как часы - проверил. Просто ты, что-то не так делаешь. Адресуешься наверно, не верно. Твой код, вообще компилируется?ALEXS1983 wrote:Yason,
Ну вот смотри как было и как я заменил. А НЕ РАБОТАЕТ ВЕДЬ!
"Адресуешься наверно, не верно"Yason wrote:Мои процедуры, работают как часы - проверил. Просто ты, что-то не так делаешь. Адресуешься наверно, не верно. Твой код, вообще компилируется?
Code: Select all
opcodes_to_run: dd 55000 ; 68500
TimerNumber: dd 3 ; номер движка таймера
TimerDelay: dd 2 ; задержка
;---------------------------------------------------------------------
EmulEngineTimer0: ; основной движок без таймера
mov eax,[opcodes_to_run]
mov [i8080_do_opcodes_nb_cycles],eax
call i8080_do_opcodes
call draw_screen
ret
EmulEngineTimer1:
Call EmulEngineTimer0
call Timer1
ret
EmulEngineTimer2:
Call Timer2
mov eax,[Timer2_result]
Cmp eax, [PlatoonTimer2T]
jb EmulEngineTimer2_ret
call PlatoonTimer2 ; взвод таймера
Call EmulEngineTimer0
EmulEngineTimer2_ret: ret
EmulEngineTimer3:
Call EmulEngineTimer0
call Timer3
ret
…..........................
…..........................
macro INT0x40 { int 0x40 }
Timer1:
mov eax, 23 ; - номер функции
mov ebx, [TimerDelay];ebx = таймаут (в сотых долях секунды)
INT0x40;
ret
;---------------------------------------------------------------------
Timer2_result rd 1
Timer2:
mov eax,26
mov ebx,9
int 0x40
mov [Timer2_result],eax ;= число сотых долей секунды, прошедших с момента
ret
PlatoonTimer2T rd 1
PlatoonTimer2: ; взвод таймера (для блока комманд)
Call Timer2;
mov eax,[Timer2_result]
add eax,2
mov [PlatoonTimer2T],eax
ret
;---------------------------------------------------------------------
Timer3:
mov eax, 26 ; Функция 26, подфункция 9 - получить значение счётчика времени.
mov ebx, 9 ;
mcall ;int 40 Возвращаемое значение: * eax = число сотых долей секунды, прошедших с момента запуска системы
mov ebx, eax
shr ebx,1
inc ebx
shl ebx,1 ; ebx = время в сотых долях секунды
sub ebx,eax ; eax = 5 - номер функции
mov eax,5 ; Функция 5 - пауза
mcall;int 40
ret
Так и есть. KlbrInWin очень сильно устарел и многих новых функций API Колибри, в нём нет. Поэтому, нефиг его использовать. Хотя процедуры выделения и удаления массива работают - проверил (никаких ошибок).ALEXS1983 wrote:после запуска в KlbrInWin выдаёт табличку, вот такую, как тут viewtopic.php?f=43&t=3253&start=30#p64936 ну понятное дело, что с другими цифрами.
Я предполагаю, что ты можешь сказать, что в KlbrInWin нефиг запускать и проверять что-то....