[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
IT FOUND A VOICE... NOW IT NEEDS A BODY
Хочу высказать своё страстное пожелание. Предыстория которого состоит в том, наверное, что я не в состоянии приспособить ни 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 минут
Да дело даже и не в этом. Одна и та же вещь в разных эмуляторах может быть реализована не только на разных языках, но и совершенно разными алгоритмами. При наличии стандарта на трассировку можно было бы просто сверять результат, и в чужие исходники вовсе нет нужды заглядывать, достаточно понять, в чём ошибка у себя, и поправить свой код.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)