Вход

Просмотр полной версии : Как работает команда LDIR ?



Spinoza
07.05.2013, 15:33
Всем привет !

Очень простой вопрос, кто скажет не исполняя данный код , что произойдет ?

#8000 LD HL,#8000
LD DE,#8001
LD BC,#FFFF
LD (HL),L
LDIR
RET

PS. Александр Макеев точно знает - пусть не говорит ;)

breeze
07.05.2013, 15:35
я тоже знаю. ну и в чём прикол?

psb
07.05.2013, 15:39
да, в чем прикол? это все знают.

Spinoza
07.05.2013, 15:53
да, в чем прикол? это все знают.

Ну тогда простите , но никто не написал , что будет :)

Просто смотрю , что большинство эмуляторов так правильно и не работают исполняя данный код. Ну ZX-MAK правильно потому-что когда до давно про этот баг я Макееву отписывался .

Vitamin
07.05.2013, 16:08
Просто смотрю , что большинство эмуляторов так правильно и не работают исполняя данный код. Ну ZX-MAK правильно потому-что когда до давно про этот баг я Макееву отписывался .
Это какое-такое "большинство"?

psb
07.05.2013, 16:19
Это какое-такое "большинство"?
да-да!

покажите тот, который не работает правильно. всем известно с бородатых времен, что ldir и подобные команды выполняются каждый раз читаясь из памяти. в итоге выполнится
nop:or b

SoftLight
07.05.2013, 16:42
да, и потом ret, то-есть фактически успеет очистится только 11 байт. Какие мы тут все умные самому противно... Так какой эмуль то неправильно отрабатывет это чтобы с ним не связываться?

Spinoza
07.05.2013, 17:05
Не работает к примеру Z80Stealth 1.17.

Остальные можно быстро проверить - уверен ZX-MAK будет один из не многих кто правильно рабоатет :)

А так конечно да , порвали меня как тузика на грелку :D Ну отлично что все все помнят и знают .

Lion17
07.05.2013, 17:22
Не работает к примеру Z80Stealth 1.17.

Остальные можно быстро проверить - уверен ZX-MAK будет один из не многих кто правильно рабоатет :)

А так конечно да , порвали меня как тузика на грелку :D Ну отлично что все все помнят и знают .

Ну, большинство, это, конечно, да! Тут крыть нечем.

Shadow Maker
07.05.2013, 17:37
Да уж. Я этот эмуль даже не запускал никогда, более того не знал о его существовании.

А серьезно - ты знаешь хоть один современный эмуль, который это не отрабатывает?

Spinoza
07.05.2013, 17:43
Да уж. Я этот эмуль даже не запускал никогда, более того не знал о его существовании.

А серьезно - ты знаешь хоть один современный эмуль, который это не отрабатывает?

В разделе Эмуляторов он есть , тред живой :

http://zx.pk.ru/showthread.php?t=13310

А уверенность может прийти только когда проверишь .

Или все пользуются ZX-MAK ? Про оригинал не говорю :)

Vitamin
07.05.2013, 17:44
Путешественник во времени детектет. Ждем тему "почему эмуляция AY через midi и adlib так хреново звучит."

Spinoza
07.05.2013, 17:46
Путешественник во времени детектет. Ждем тему "почему эмуляция AY через midi и adlib так хреново звучит."

Нет в звуке я профан , мало того , что медведь на ухо наступил :D

Vitamin
07.05.2013, 17:56
Нет в звуке я профан , мало того , что медведь на ухо наступил
Судя по всему, в элементарнейшей статистике тоже. Современные эмули- ZXMak2, вся линейка UnrealSpeccy, Xpeccy, ZEmu (про остальные не знаю) эмулируют LDIR нормально. Ты назовешь 5 разных эмулей с проблемой?

Spinoza
07.05.2013, 18:00
Судя по всему, в элементарнейшей статистике тоже. Современные эмули- ZXMak2, вся линейка UnrealSpeccy, Xpeccy, ZEmu (про остальные не знаю) эмулируют LDIR нормально. Ты назовешь 5 разных эмулей с проблемой?

Ну все убили наповал - обновлю эмуляторы .

Vitamin
07.05.2013, 18:37
Ну все убили наповал - обновлю эмуляторы .
Ага. Если составишь свежим взглядом обзор или (даже не мечтаю!) сравнительную таблицу- респект, уважуха и почетное место в теме про эмуляторы. В ней, кстати, несколько устаревший, но путеводительно по темам эмуляторов.

newart
07.05.2013, 18:51
Поскольку тема скатывается к флейму... спрошу что-нибудь дельное.

Spinoza, у тебя дискеты или кассеты сохранились?

Spinoza
07.05.2013, 19:47
Поскольку тема скатывается к флейму... спрошу что-нибудь дельное.

Spinoza, у тебя дискеты или кассеты сохранились?

Кассет точно нет :(

Штук 30-40 дискет лежит, живые или нет не знаю . Возможно даже есть что-то интересное, но не уверен что кому то будут интересны какие то дисковые загрущики и тд. и тп. Вообще конечно нужно в trd все перегнать , вроде есть народ рядом нужно только с силами собираться - раз ностальгия накатила :)

Лас
07.05.2013, 21:00
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а
не будет.



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 ....


*Z80 - здесь - эмулятор "Z80" by G.Lunter

newart
08.05.2013, 00:13
Возможно даже есть что-то интересное, но не уверен что кому то будут интересны
Еще как будут.

Spinoza
08.05.2013, 08:56
2Лас

Спасибо за инфу .

Честно говоря не помню ничего про LDIR в книгах Ларченко/Родионова про это , а они были настольными книгами любого спектрумиста.

А так я раньше 1998г прекратил спектрумом заниматься , поэтому в прессе по ZX не читал про это. Да и эмуляторов на тот момент практически не было.
Кстати я использовал данную особенность работы LDIR , как защиту против автоматической трассировки диззасемблерами :) Как все это давно было ..... :)


Еще как будут.

Ну я попытаюсь перевести в trd , или могу диски все дать кто в Питере первести в trd , так как у меня ничего не осталось от ZX.

newart
08.05.2013, 11:23
Ну я попытаюсь перевести в trd , или могу диски все дать кто в Питере первести в trd , так как у меня ничего не осталось от ZX.
vtcd@mail.ru

Пиши, переведу.

psb
08.05.2013, 13:22
Честно говоря не помню ничего про LDIR в книгах Ларченко/Родионова про это , а они были настольными книгами любого спектрумиста.
вроде бы в zx ревю было что-то про это.

iceoflame
08.05.2013, 13:27
А разве для очистки не LDDR использовали?

psb
08.05.2013, 13:35
А разве для очистки не LDDR использовали?
что угодно можно

iceoflame
08.05.2013, 13:45
Вы,надеюсь,знаете стандартную процедуру
очистки памяти через 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 и так дальше, потому и затирается.

Destr
08.05.2013, 14:05
Вы,надеюсь,знаете стандартную процедуру
очистки памяти через LDIR:
Таким методом можно не только зачищать, но и заполнять память одинаковыми парами, тройками, четвёрками (и т.д.) байт.

goodboy
08.05.2013, 14:54
ранние эмули часто ловили на возможности записи/чтения в rom.
а ещё на недокументированных флагах.
что-то типа
ld r,a
jp po,#...

посмотрите kolobokZoom2 так есть такое