Всем привет !
Очень простой вопрос, кто скажет не исполняя данный код , что произойдет ?
#8000 LD HL,#8000
LD DE,#8001
LD BC,#FFFF
LD (HL),L
LDIR
RET
PS. Александр Макеев точно знает - пусть не говорит ;)
Вид для печати
Всем привет !
Очень простой вопрос, кто скажет не исполняя данный код , что произойдет ?
#8000 LD HL,#8000
LD DE,#8001
LD BC,#FFFF
LD (HL),L
LDIR
RET
PS. Александр Макеев точно знает - пусть не говорит ;)
я тоже знаю. ну и в чём прикол?
да, в чем прикол? это все знают.
да, и потом ret, то-есть фактически успеет очистится только 11 байт. Какие мы тут все умные самому противно... Так какой эмуль то неправильно отрабатывет это чтобы с ним не связываться?
Не работает к примеру Z80Stealth 1.17.
Остальные можно быстро проверить - уверен ZX-MAK будет один из не многих кто правильно рабоатет :)
А так конечно да , порвали меня как тузика на грелку :D Ну отлично что все все помнят и знают .
Да уж. Я этот эмуль даже не запускал никогда, более того не знал о его существовании.
А серьезно - ты знаешь хоть один современный эмуль, который это не отрабатывает?
В разделе Эмуляторов он есть , тред живой :
http://zx.pk.ru/showthread.php?t=13310
А уверенность может прийти только когда проверишь .
Или все пользуются ZX-MAK ? Про оригинал не говорю :)
Путешественник во времени детектет. Ждем тему "почему эмуляция AY через midi и adlib так хреново звучит."
Поскольку тема скатывается к флейму... спрошу что-нибудь дельное.
Spinoza, у тебя дискеты или кассеты сохранились?
Кассет точно нет :(
Штук 30-40 дискет лежит, живые или нет не знаю . Возможно даже есть что-то интересное, но не уверен что кому то будут интересны какие то дисковые загрущики и тд. и тп. Вообще конечно нужно в trd все перегнать , вроде есть народ рядом нужно только с силами собираться - раз ностальгия накатила :)
http://zxpress.ru/article.php?id=728
Код:3. "Самоуничтожение команды LDIR"
Теория : Грубая эмуляция команд LDIR,LDDR
Эмулятор : Z80, UKV (наверное... точно не помню)
Комментарии: В Z80 неверно обрабатываются команды блочных
операций. Там считается, что, например, LDIR выполняется "за
один проход", то есть процессор извлекает код операции (два
байта), затем выполняет команду, а потом переходит к следующей.
В реальности же (даже в книгах Родионова/Ларченко про это
написано!) выполнение LDIR/LDDR работает циклически - перед
каждой пересылкой процессор читает код операции. Если настроить
параметры в HL, DE и BC так, чтобы LDIR заполнял область памяти,
в которой он сам находится, например, нулями, то на реальном Z80
выполнение LDIR произойдёт досрочно - уничтожится команда,
вернее её "половинка" префикс #ED, и дальше "заработает" другая
половинка (#B0 = OR B). Естественно, после этого никакого LDIRа
не будет.
*Z80 - здесь - эмулятор "Z80" by G.LunterКод:MEMTST EQU #4000
LD HL,CNTLDR
LD DE,MEMTST
LD BC,3+ELDR-CNTLDR
PUSH DE
LDIR;Переносим тестирующий фрагмент в "ненужное"
;место ( для многократного тестирования )
RET ;Переходим на тест
CNTLDR LD HL,MEMTST
LD DE,MEMTST+1
LD BC,ELDR-CNTLDR-1; Длина взята с таким расчётом,
;чтобы в глюкавом эмуляторе "убилась" команда перехода
;JP NO_LDR - выход, если реальный Z80
LD (HL),0
LDIR
JP NO_LDR; в итоге на эмуляторе после LDIR
;выполятся 3 NOP и мы узнаем, что у нас эмуль.
ELDR JP EMUL
NO_LDR ....
2Лас
Спасибо за инфу .
Честно говоря не помню ничего про LDIR в книгах Ларченко/Родионова про это , а они были настольными книгами любого спектрумиста.
А так я раньше 1998г прекратил спектрумом заниматься , поэтому в прессе по ZX не читал про это. Да и эмуляторов на тот момент практически не было.
Кстати я использовал данную особенность работы LDIR , как защиту против автоматической трассировки диззасемблерами :) Как все это давно было ..... :)
Ну я попытаюсь перевести в trd , или могу диски все дать кто в Питере первести в trd , так как у меня ничего не осталось от ZX.
vtcd@mail.ru
Пиши, переведу.
А разве для очистки не LDDR использовали?
Вы,надеюсь,знаете стандартную процедуру
очистки памяти через LDIR:
LD HL,addr ;адрес очищаемой области
LD DE,addr+1
LD BC,len-1 ;len:длина этой области
LD (HL),0 ;заполнение её нулём
LDIR ; (очистка)
Но эта процедура довольно медленна, и,
например, за счёт неё, очистить экран за
один фрейм (71680t) не удастся.
Для этого можно воспользоваться стеком.
http://alonecoder.nedopc.com/zx/books/zxg4html/asm4.htm
---------- Post added at 12:45 ---------- Previous post was at 12:36 ----------
А вот почему затирается 0м
Repeats LDI (LD (DE),(HL), then increases DE, HL, and decreases BC) until BC=0. Note that if BC=0 before this instruction is called, it will loop around until BC=0 again.
Перевожу на асм
met1 LD (DE), (HL)
INC DE
INC HL
DEC BC
LD a,b
OR C
JR NZ, met1
т.е. оно последовательно переносить один байт сначала (#8000) записываем 0, потом из 8000, в 8001 переносим его, потом из 8001 в 8002 и так дальше, потому и затирается.
ранние эмули часто ловили на возможности записи/чтения в rom.
а ещё на недокументированных флагах.
что-то типа
ld r,a
jp po,#...
посмотрите kolobokZoom2 так есть такое