ZXNet эхоконференция «code.zx»


тема: Распознавание эмуляторов - исправленная версия.



от: Aleksey Malov
кому: All
дата: 01 May 2000
Приветствую тебя, All!

Исправленная версия распознавателя эмуляторов.

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,#7Bff
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,#7BfE
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



Желаю вам здоровья, счастья и творческих узбеков.
Aleksey Malov aka VIVID/Brainwave.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Железо - подвключение модема "АЛЕГРО" (C-DOS) к спектруму.
Сказочки 3 - Гоните его прочь!
Железо - Рассказ "Пофигисты".
Вуайеризм - О дырочках в заборе и школьном вуайеризме. что зачастую то, что противно привычкам и рефлексии, и возбуждает больше всего.
AD&D - Значение способностей.

В этот день...   25 апреля