[bETA]mEN, а где можно взять этот самый Emulator detecor ?
Вид для печати
[bETA]mEN, а где можно взять этот самый Emulator detecor ?
Ну не знаю почему, но у меня нагрузка на проц ниже 80% не падает (при выборе файла ниже 60%). Картинка прилагается. Наверное комп слабоват.
Sorry, не земетил.
Вот ещё исходник выложенной чуть выше эмуляторопроверялки.
Мож пригодится.
Код:org #6000
;чистим экран
di
ld hl,#5aff
ld (hl),#7
dec hl
bit 3,h
jr nz,$-5
xor a
ld (hl),a
or (hl)
dec hl
jr z,$-3
;устанавливаем im 2
ld hl,#fd00
ld de,#fd01
ld b,e
ld c,l
ld (hl),#fe
ld a,h
ld i,a
ldir
ld a,#c3 ;jp nn
ld (#fefe),a
ld hl,imob
ld (#feff),hl
im 2
;декрюнчим кучу NOP'ов
ld hl,#8000
ld de,#8001
ld bc,#7dff
ld (hl),0 ;nop
ldir
ld (hl),#c9 ;ret
ei
;матюгаемся
ld e,0
ld hl,sysmes
call prn
;заносим в счетчик начальное значение
ld a,#ff
ld (count),a
halt
ld b,20
;вызываем 20 раз кучу NOP'ов
w1 call #8000
djnz w1
di
ld a,(count)
;декрюнчим кучу команд EI (не путать с
;Eternity Industry ;) )
ld hl,#8000
ld de,#8001
ld bc,#7dfE
ld (hl),#FD ;EI
ldir
ld c,a
ld a,#ff
ld (count),a
ei
halt
ld b,20
;вызываем 20 раз кучу комад EI
w2 call #8000
djnz w2
di
;сравниваем число интов в первом
;и втором случаях с точностью до ё 1 int'a
ld a,(count)
sub c
inc a
cp 3
;если cf=1, то мы под эмулем, т.к.
;z80 во время команды EI не реагирует
;на прерывания => число интов на реальном
;спектруме в первом и втором замерах
;отличается более чем на 1
PUSH AF
ei
;также если во время прихода прерывания
;выполнялась команда ld a,i (ld a,r),
;процессор посчитает, что прерывания
;запрещены
LD E,0
ld bc,0
w3 ld a,i
jp po,real1
djnz w3
dec c
jr nz,w3
inc e
real1 push de
;снова матюгаемся
ld e,#40
ld hl,report
call prn
ld b,40
call pause
pop de
pop af
rl e
xor a
or e
;если в первом и во втором тестах
;результаты соответствуют реальному
;z80, то печатаем об этом
ld hl,realmes
jr z,real
;иначе печатаем, что нас эмулируют
ld hl,emulmes
real ld e,#60
call prn
;печатаем press any key
ld b,100
call pause
ld hl,anykey
call prn
;опрашиваем any key
key xor a
in a,(#fe)
cpl
and 31
jr z,key
;выходим в бейсик или куда-нибудь еще
di
ld a,#3f
ld i,a
im 1
ei
ret
;процедура печати стринга в верхнюю
;треть экрана методом телетайпа
;hl- asciiz-строка
;е-мл. байт
prn ld a,(hl):inc hl
or a
ret z
push hl
ld b,5
add a,a
ld l,a
cp " "*2
jr z,prn0
ld c,40
xor a
beep ld b,c
xor #18
out (#fe),a
djnz $
dec c
jr nz,beep
inc b
prn0 halt
djnz prn0
ld h,0
add hl,hl
add hl,hl
ld a,h
add a,#3c
ld h,a
ld b,4
ld d,#40
prn1 ld a,(hl)
ld (de),a
inc l
inc d
djnz prn1
ld b,4
prn2 ld a,(hl)
srl a
or (hl)
ld (de),a
inc l
inc d
djnz prn2
pop hl
inc e
jr prn
;мессаги
sysmes db " 2000 Brainwave of X-Project. "
db "System checking! Please wait... ",0
report db "System checking repot:",0
emulmes db " Warning! General failure: "
db "CPU not found! Press F1 for "
db "software emulation... ;-) ",0
realmes db "Congratulations!!! Test detected"
db "the Real ZX-Spectrum. May be. ;)",0
anykey db "Press any key to exit...",0
pause halt
djnz pause
ret
;обработчик прерываний
imob push af
ld a,#3e
count equ $-1
inc a
ld (count),a
pop af
ei
ret
не работают:
GRID PROTECTION SYSTEM 1 /2 /3
Master Copy 2.0
Format Utility 2.01
Хочу высказать своё страстное пожелание. Предыстория которого состоит в том, наверное, что я не в состоянии приспособить ни zEmu, ни unreal к тому, чтобы их можно было скомпилировать с использованием имеющегося у меня MS VC++.NET 7.1.3088. Да и фиг с ним, не люблю я эту среду, и не горю желанием вносить сам какие-либо изменения, да и сам язык С/C++ мне неприятен. А суть проблемы вот в чём. Уже давно, когда я только начал клепать EmuZWin, у меня возникла простая идея сверки эмуляторов. Но применить её я смог только к различным версиям своего собственного эмулятора. Решение крайне простое. Всё, что нужно, это режим трассировки с выдачей в лог-файл состояния процессора после каждой инструкции. Лучше, конечно, чтобы состав информации был конфигурируемый, хотя бы из ini-файла. Для скорости вовсе необязатльно выдачу в файл выполнять на каждой команде, можно копить в буфере и выдавать за раз 1000 или 100 строк. Ну вот, например:
0038: dT=11 AF=0044 BC=0100 DE=01FF HL=2233 IX=4000 IY=456E I=39 R=76
Сразу скажу: выдаются сотни мегабайт за секунды. Ну и что. Зато, при наличии такого лога можно выполнить покомандную сверку работы двух эмуляторов, начиная с некоторого места. И сверка сводится к сравнению логов трассировки, начатой с одного и того же места, после загрузки одного и того же снапшота. Сравнение может делать специально написанная утилита, которая просто построчно сравнивает два текстовых файла, и показывает их, выделяя отличающиеся строки красным цветом. У меня на сайте есть такая утилита, DiffLines. Намного тупее любой сравнивалки текстов, но позволяет достаточно быстро сравнивать и просматривать пары гигабайтных файлов.
Моё пожелание: сделайте доброе дело, добавте такой режим трассировки в отладчик. Это несложно: вам - полчаса работы, последователям вашим - огромное облегчение. Меня, в принципе, устроит любой формат строки, лишь бы он был достаточно ясен при простом взгляде на строку текста. 16-ричных значений достаточно было бы, для скорости (через тот же ини-файл) имеет смысл задавать, что выводить:
- адрес PC выводится всегда, иначе смысла мало
- опкод (можно байт, или 2 первых байта по адресу PC)
- dT - разница в тактах (время выполнения тольо что исполненной команды)
- регистры (AF, BC, DE, HL)
- IX, IY (вместе или по одному)
- I
- R
- содержимое памяти по заданному адресу (2 байта).
Чуть-чуть продвинутый вариант (его можно сделать единственным): многократное выполнение команды HALT отображается 1 раз.
Имя файла трассировки- устроит любое фиксированное имя, или конфигурируемое из ini-файла. Очередная трасиировка просто дописывает выдачу в конец файла, если он существует. По крайней мере у меня - так.
Угумс, запускаешь. И получаешь:
C:\Games\ZXEmulators\us>C.bat
C:\Games\ZXEmulators\us>rc settings.rc
'rc' is not recognized as an internal or external command,
operable program or batch file.
C:\Games\ZXEmulators\us>call compile ms emul.cpp /link settings.res
'compile' is not recognized as an internal or external command,
operable program or batch file.
C:\Games\ZXEmulators\us>
Я же говорю: с С не работаю, за исключением поковыряться в проекте, уже приспособленном к IDE MS VC++.
Добавлено через 9 минут
Да дело даже и не в этом. Одна и та же вещь в разных эмуляторах может быть реализована не только на разных языках, но и совершенно разными алгоритмами. При наличии стандарта на трассировку можно было бы просто сверять результат, и в чужие исходники вовсе нет нужды заглядывать, достаточно понять, в чём ошибка у себя, и поправить свой код.
ок, добавлю трассировку