PDA

Просмотр полной версии : ZX Spectrum: аппаратная реализация на восьми микросхемах



Страницы : 1 [2] 3 4

Lisitsin
01.03.2011, 21:50
С меня много литров пива. Правда я живу в Рязани.

Higgins
01.03.2011, 22:28
Все та же "BIT 1, (IY +1)" по #0B03 -- упорно взводит SF.

Но прогресс есть, теперь даже без игнорирования флагов 3 и 5 доходим до 695-й строки.

Lisitsin
01.03.2011, 23:01
Все та же "BIT 1, (IY +1)" по #0B03 -- упорно взводит SF.


Она у меня на него не влияет. До этого SF сброшен? Если установлен до этой инструкции - она его и не трогает:
SBR F,1<<HH
CBR F,(1<<NN)|(1<<ZZ)|(1<<PP); 87
SBRS BUF,1 ; 88
SBR F,(1<<ZZ)|(1<<PP); 89
BST RES,7 ; SAVE FLAG S 90
MOV RES,TMPH; SAVE BITS 3, 5 FROM HIGH ADDRESS 91
BLD RES,7 ; RESTORE S FLAG 92
JMP DONEM24 ; 95

В BUF у меня тестируемый бит;
RES - регистр флагов S, 5, 3 (результат)
Перед тем как скопировать в RES биты 3 и 5 я запоминаю FS, а потом его восстанавливаю.

На всякий случай повторил ещё раз:

Higgins
01.03.2011, 23:47
Она у меня на него не влияет. До этого SF сброшен? Если установлен до этой инструкции - она его и не трогает:

Должна сбрасывать. Логика такая: SF = (тестируется бит 7 И бит 7 взведен). Если n не равно 7, SF всегда будет сброшен.

Lisitsin
01.03.2011, 23:55
Должна сбрасывать. Логика такая: SF = (тестируется бит 7 И бит 7 взведен). Если n не равно 7, SF всегда будет сброшен.

А-а-а ............ понял!

Higgins
02.03.2011, 09:58
TRACE15_0.zip

Все строки прошли. Надо больше. :)

Lisitsin
02.03.2011, 18:11
Все строки прошли. Надо больше. :)

Ура - а - а - а - а !!!

Higgins
02.03.2011, 19:20
TRACE16_0.zip

И это прошли все. Надо еще больше. :)

Lisitsin
02.03.2011, 20:13
Ну ни уже ли прогресс? Теперь в геометрической попрёт ...
Может что по-сложнее задать? Там DAA failed ...
Трейсинг со слов 9523 5483 0000 C9D4 0005 2000 2000.

Higgins
02.03.2011, 20:39
Ну ни уже ли прогресс? Теперь в геометрической попрёт ...
Может что по-сложнее задать? Там DAA failed ...
Трейсинг со слов 9523 5483 0000 C9D4 0005 2000 2000.

Прогресс. Здесь тоже все проходим. Давайте пропустим еще строк и в этот раз соберите строк побольше, они хорошо жмутся архиватором.

Lisitsin
02.03.2011, 21:32
Медленно она крутится. Попробую ускорить.

Higgins
02.03.2011, 21:45
TRACE16_2.zip

И здесь проходим все.

Какая первая инструкция в тесте дает "failed"?

Lisitsin
02.03.2011, 22:00
И здесь проходим все.

Какая первая инструкция в тесте дает "failed"?

DAA !!!

Higgins
02.03.2011, 22:03
Тогда хорошо бы следующее условие для начала трейсинга:

PC=#8920 и 16-разрядное значение по адресу (#8929)=#86E7.

Это начало теста на DAA. Сможете?

Lisitsin
02.03.2011, 22:06
Попробую ... А можно по какой-то одной тетраде, например 86 по адресу 8929 или E7 по адресу 892A?

Higgins
02.03.2011, 22:15
Попробую ... А можно по какой-то одной тетраде, например 86 по адресу 8929 или E7 по адресу 892A?

Должно быть можно. Тогда так:

PC=#8920 и 8-разрядное значение по адресу (#8929)=#E7.

Lisitsin
03.03.2011, 00:16
Должно быть можно. Тогда так:

PC=#8920 и 8-разрядное значение по адресу (#8929)=#E7.
Да, чё это я?
Поймал. Но разогнаться не получается - появляются сбои.

Higgins
03.03.2011, 10:13
TRACE1_DAA.zip

"DAA" при AF=#0002 дает AF=#0044. Должна давать AF=#0046, т.е. не должна сбрасывать NF. "DAA" не должна менять этот флаг.

Lisitsin
03.03.2011, 17:22
"DAA" при AF=#0002 дает AF=#0044. Должна давать AF=#0046, т.е. не должна сбрасывать NF. "DAA" не должна менять этот флаг.

Исправил

Higgins
03.03.2011, 18:09
Исправил

Не похоже. Все то же самое.

Lisitsin
03.03.2011, 19:31
Не похоже. Все то же самое.

Ой !!! прошу прощения ...

Higgins
03.03.2011, 19:40
TRACE16_4.zip

Не-а, все то же. Смотрите строку 94. У вас там:


86e8 0002 0000 0000 0044 2000 2000

Должно быть:


86e8 0002 0000 0000 0046 2000 2000

Lisitsin
03.03.2011, 20:04
А - а - а !!! перепутал с H флагом. Исправляю. А Н флаг DAA тоде не трогает?

Higgins
03.03.2011, 20:12
А - а - а !!! перепутал с H флагом. Исправляю. А Н флаг DAA тоде не трогает?

Трогает. Смотрите код:


case 0x27: /* DAA: f(4) */
d = 0x0000;
if((Z80_AF & Z80_CF) || Z80_AF >= 0x9a00) d |= 0x6000, Z80_AF |= Z80_CF;
if((Z80_AF & Z80_HF) || ((Z80_AF & 0x0f00) >= 0x0a00)) d |= 0x0600;

if(!(Z80_AF & Z80_NF)) Z80_AF = ((Z80_AF + d) & 0xff00) |
(((Z80_AF & 0x0f00) >= 0x0a00) << HF_BIT) | (Z80_AF & Z80_CF);
else Z80_AF = ((Z80_AF - d) & 0xff00) |
(((Z80_AF & Z80_HF) && (Z80_AF & 0x0f00) <= 0x0500) << HF_BIT) | Z80_NF | (Z80_AF & Z80_CF);

r = (Z80_AF >> 8);
Z80_AF |= PF_LOG(r) | (!r << ZF_BIT) | (r & (Z80_SF | Z80_XF | Z80_YF));

Lisitsin
03.03.2011, 20:23
Трогает. Смотрите код:


case 0x27: /* DAA: f(4) */
d = 0x0000;
if((Z80_AF & Z80_CF) || Z80_AF >= 0x9a00) d |= 0x6000, Z80_AF |= Z80_CF;
if((Z80_AF & Z80_HF) || ((Z80_AF & 0x0f00) >= 0x0a00)) d |= 0x0600;

if(!(Z80_AF & Z80_NF)) Z80_AF = ((Z80_AF + d) & 0xff00) |
(((Z80_AF & 0x0f00) >= 0x0a00) << HF_BIT) | (Z80_AF & Z80_CF);
else Z80_AF = ((Z80_AF - d) & 0xff00) |
(((Z80_AF & Z80_HF) && (Z80_AF & 0x0f00) <= 0x0500) << HF_BIT) | Z80_NF | (Z80_AF & Z80_CF);

r = (Z80_AF >> 8);
Z80_AF |= PF_LOG(r) | (!r << ZF_BIT) | (r & (Z80_SF | Z80_XF | Z80_YF));

Ва-а-а-а-ще ничего не понимаю.

Higgins
03.03.2011, 20:28
Ва-а-а-а-ще ничего не понимаю.

А в каком формате у вас табличка? Может быть, будет проще, если я ее для вас сгенерирую? :)

Lisitsin
03.03.2011, 20:51
А табличка-то у меня в виде файла EEPROM (вложение).
Весом она 4К. Адреса такие: I:N:H:C:A
где I - идентификатор. I=0 для данных (результата DAA) и I=1 для флагов в результате DAA. N, H, C - флаги до выполнения DAA. A - 8 бит ОПЕРАНДА DAA. Сначала читаю данные при I=0, затем устанавливаю I=1 и читаю флаги.
Там в принципе остался только Н флаг. Может можно что-то почитать про него и я сам смогу?

Higgins
03.03.2011, 21:24
Там в принципе осталсятолько Н флаг. Может можно что-то почитать про него и я сам смогу?

Строку 94 прошли. Теперь ошибка действительно во флаге H: строка 696, до "DAA" AF=#0010, после -- AF=#0614 вместо правильного AF=#0604, т.е. HF ошибочно взведен.

Логика HF в "DAA" такая:

1) Если NF сброшен, тогда:
1a) Если регистр A до исполнения больше или равен 10, тогда после исполнения HF должен быть взведен.
1b) Иначе A меньше 10 и HF должен быть сброшен.

2) Иначе NF взведен, и тогда:
2a) Если флаг H до исполнения был взведен и регистр A меньше или равен 5, тогда после исполнения HF должен быть взведен.
2b) Иначе либо флаг H до исполнения сброшен, либо регистр A больше 5, и тогда HF после исполнения должен быть сброшен.

Строка 696 с AF=#0010 до исполнения, проходит по пункту 1b), и значит HF должен быть сброшен.

Lisitsin
03.03.2011, 23:15
Поднаписал вроде бы.

Higgins
03.03.2011, 23:34
Поднаписал вроде бы.

Ага, исполняется по написанному выше, но я наврал с регистром A: в обоих случаях следует сранивать только четыре младших регистра A. То есть:

1) Если NF сброшен, тогда:
1a) Если четыре младших разряда A до исполнения больше или равны 10, тогда после исполнения HF должен быть взведен.
1b) Иначе четыре младших разряда A меньше 10 и HF должен быть сброшен.

2) Иначе NF взведен, и тогда:
2a) Если флаг H до исполнения был взведен и четыре младших разрядов регистра A меньше или равны 5, тогда после исполнения HF должен быть взведен.
2b) Иначе либо флаг H до исполнения сброшен, либо четыре младших разряда регистра A больше 5, и тогда HF после исполнения должен быть сброшен.

Надеюсь, это будет не большая правка. :)

Lisitsin
04.03.2011, 00:10
Поднаписал. Но всё равно failed (как мне уже надоело это слово)

Lisitsin
04.03.2011, 22:51
Ну не хочет ROBOCOP ходить.
http://dl.dropbox.com/u/12408899/CVBS%20%28110304-224102%29ROBOCOP1.zip

Higgins
04.03.2011, 23:08
Но всё равно failed

При AF=#0012 дает AF=#FAAE вместо #FABE, т.е. ошибочно сбрасывается HF.

#12 значит взведены HF и NF, A=#00. Значит, идем по пункту 2a):

2a) Если флаг H до исполнения был взведен и четыре младших разряда регистра A меньше или равны 5, тогда после исполнения HF должен быть взведен.

Смотреть нужно на значение регистра A как оно было до исполнения инструкции. Может быть, в этом ошибка?

Lisitsin
05.03.2011, 00:09
При AF=#0012 дает AF=#FAAE вместо #FABE, т.е. ошибочно сбрасывается HF.



Эту нашёл, но всё равно failed

Higgins
05.03.2011, 00:10
TRACE16_8.zip

Здесь все прошли. Нужно больше строк.

Lisitsin
05.03.2011, 18:51
Здесь все прошли. Нужно больше строк.

Столько хватит?

Higgins
05.03.2011, 21:16
RACE16_9.zip

Что-то со стеком или с памятью вообще.

Смотрите со строки 6284:


8928 0092 0000 0000 0092 2000 2000

Здесь вызывается подпрограмма обновления контрольной суммы по адресу #94fd. Это подпрограмма у вас вызывается успешно много раз. Но в очередной раз, начиная вызов со строки 6284, подпрограмма доходит до строки


9526 0092 0000 0000 fabe 2000 2000

соответствующей инструкции RET, но возвращает управление не по адресу #8928 + 3 = #892B (адрес инструкции CALL + ее размер), а по адресу #8900.

Если сразу ошибку не найдете, давайте попробуем сделать тот же трейсинг добавив в него значения регистра SP. Может быть, это наведет на нужную мысль.

Lisitsin
06.03.2011, 10:05
Что-то со стеком или с памятью вообще.
Если сразу ошибку не найдете, давайте попробуем сделать тот же трейсинг добавив в него значения регистра SP. Может быть, это наведет на нужную мысль.

Вообще у меня тут сбои какие-то последнее время наблюдались. Попробую вместе с SP.

Да ещё я ввёл MEMPTR и стал его прописывать, но по ходу где-то поднакосячил. Исправляю.

Lisitsin
06.03.2011, 15:11
Исправил. Добавил SPH:SPL в конце строки.

Higgins
06.03.2011, 16:15
TRACE16_10.zip

Прошли все. Если "DAA" все еще "failed", значит нужно еще строк.

Вызов на строке 6284 нормально вернулся к адресу #892B. Возможно, были проблемы с памятью.

Lisitsin
06.03.2011, 19:45
Пока failed. Прошли меньше 0,5% от DAA. Может исключить IX, IY, SP? И ещё: я тут подумал, если ошибка при возникновении накапливается, может найти где она начинается? могу запуститься по содержимому BC сразу с половины, четверти/трёх четвёртых и т д трейсинга.

Lisitsin
06.03.2011, 20:04
Начиная с BC=8000:

Higgins
06.03.2011, 21:01
TRACE_DAA_00A2.zip

Здесь проходим все.


TRACE_DAA_8000.zip

К моменту BC=#8000 контрольная сумма уже отличается, то есть ошибка где-то раньше.

Предложение такое: мы уже занем, что оснастка работает как положено. В каждой итерации она исполняется одинаково. Поэтому можно оставить только состояние до и после "DAA". Формально условие будет такое: (PC=#86E7 ИЛИ PC=#86E8). Если объем вывода существенно влияет на время сбора трейсинга, можно оставить только значения для AF.

Lisitsin
06.03.2011, 21:11
Здесь проходим все.
Предложение такое: мы уже занем, что оснастка работает как положено. В каждой итерации она исполняется одинаково. Поэтому можно оставить только состояние до и после "DAA". Формально условие будет такое: (PC=#86E7 ИЛИ PC=#86E8). Если объем вывода существенно влияет на время сбора трейсинга, можно оставить только значения для AF.

Получается что-то типа этого: (начало с BC=0100)

Higgins
06.03.2011, 22:32
TRACE_DAA_0100.zip

Отлично, попалась на строке 1570. На входе AF=#0410, на выходе ошибочное AF=#6A2D вместо правильного AF=#0A0C.

Насчет #6A вместо #0A: #60 нужно добавлять только если CF взведен или A >= #9A. В последнем случае CF на выходе следует взвести (тогда в F получим правильное #xD вместо имеющегося #xC).

Насчет взведенного флага 5: это может быть из-за ошибочно добавленного #60 к результату. Если нет, то во флаги 3 и 5 следует скопировать соответствующие разряды результирующего значения регистра A.

Lisitsin
06.03.2011, 23:00
На входе AF=#0410, на выходе ошибочное AF=#6A2D вместо правильного AF=#0A0C.


Не понял ... На входе AF=0410, т. е. С=0, N=0, H=0. A=04 - добавлять нужно 00.

Higgins
06.03.2011, 23:08
Не понял ... На входе AF=0410, т. е. С=0, N=0, H=0. A=04 - добавлять нужно 00.

В данном случае добавляем #06 из-за взведенного HF.

Если на входе CF взведен или регистр A больше или равен #9A, то следует a) добавить #60 и b) взвести CF.

Далее, если взведен HF или четыре младших разряда A больше или равны 10, тогда добавляем #06 (возможно, к дополнение к ранее добавленным #60).

Далее, если NF взведен, тогда эти #60 и #06 следует не добавлять к A, а вычитать из A.

Как считать HF уже выяснили. Про CF сказано выше. NF не меняем. PF считаем как флаг четности. ZF взводим если результат в A получился нулевым. Про флаги 3 и 5 тоже сказано выше. Вроде бы все, что нужно.

Lisitsin
06.03.2011, 23:24
Точно. Н=1. Но тогда я вообще не понимаю. Я пользовался при генерировании DAA вложением. Так вот там эта ситуация (Н=1, С=0, N=0, А=04) - вообще не определена. Значит там где-то ошибка?

Lisitsin
06.03.2011, 23:35
В данном случае добавляем #06 из-за взведенного HF.

Если на входе CF взведен или регистр A больше или равен #9A, то следует a) добавить #60 и b) взвести CF.

Далее, если взведен HF или четыре младших разряда A больше или равны 10, тогда добавляем #06 (возможно, к дополнение к ранее добавленным #60).

Далее, если NF взведен, тогда эти #60 и #06 следует не добавлять к A, а вычитать из A.

Как считать HF уже выяснили. Про CF сказано выше. NF не меняем. PF считаем как флаг четности. ZF взводим если результат в A получился нулевым. Про флаги 3 и 5 тоже сказано выше. Вроде бы все, что нужно.

Переделаю всё заново. В документацию веры нет. Да здравствует здравая логика !!!

Lisitsin
07.03.2011, 10:38
P A S S E D !
Вот они, результаты работы с умным человеком !

Higgins
07.03.2011, 11:06
P A S S E D !

Отлично. Теперь "CPL". Условие такое: (PC=#86F4 ИЛИ PC=#86F5). Так же достаточно выводить PC и AF. По флагам "CPL" работает очень просто. SF, ZF, PF и CF не меняем. HF и NF взводим. А во флаги 3 и 5 как обычно копируем соответствующие разряды результата в A.

Lisitsin
07.03.2011, 11:33
P A S S E D !

Higgins
07.03.2011, 11:51
P A S S E D !

Ну вот. Теперь SBC8. Условие: (PC=#8772 ИЛИ PC=#8773). Здесь нужно вывести PC, AF и BC.

Lisitsin
07.03.2011, 12:35
Шлю PC BC AF;

Higgins
07.03.2011, 12:54
TRACE_SBC8_1.zip

ZF не взводится при нулевом результате. :) В остальном работает верно.

Условие для ADC16: (PC=#87AA ИЛИ PC=#87AC). Выводить нужно PC, HL, BC и AF.

Lisitsin
07.03.2011, 12:59
ZF не взводится при нулевом результате. :)

УПС !

Lisitsin
07.03.2011, 16:41
PASSED !
Да ... AVR при выполнении SBC не влияет на Z при нулевом результате, а при ненулевом сбрасывает. А я и не знал.

Higgins
07.03.2011, 18:09
PASSED !

Хорошо. Теперь ADC16. Условие для него смотрите выше.

Lisitsin
07.03.2011, 19:02
Хорошо. Теперь ADC16.

Шлю так: PC BC HL AF;

Higgins
07.03.2011, 20:43
TRACE_ADC16_1.zip

Здесь все проходим. Значит, ошибка где-то дальше.

RabidRabbit
07.03.2011, 20:49
Да ... AVR при выполнении SBC не влияет на Z при нулевом результате, а при ненулевом сбрасывает. А я и не знал.Таки грамотно сделано - не надо запоминать состояние после предыдущего SUB...

Lisitsin
08.03.2011, 12:01
Всё. Центральный процессор засбоил. Завтра пойду феном выпаивать.

Lisitsin
08.03.2011, 17:55
Перепаял вручную. Всё нормально.
ADC16 чуть по-больше:

Higgins
08.03.2011, 18:30
TRACE_ADC16_2.zip

Здесь тоже все прошли. Нужно смотреть еще дальше.

Lisitsin
09.03.2011, 07:18
Здесь сразу и ADC и SBC: (пришлось частями, всё не лезет)

Higgins
09.03.2011, 11:24
TRACE_ADC16_SBC16_PART1.zip

Попались на строке 66048. Вместо


87ac 80ff 8000 fe91

имеем


87ac 80ff 8000 fe91

то есть ошибочно взведен PF.

PF в ADC16/SBC16 считается так. Считается значение PF как для всех прочих арифметических операций, но только для старших половин результата, прежнего значения HL и операнда.

Далее делается следующее. Если сумма второго операнда (то, что добавляется) и CF вызывает переполнение (то есть, CF взведен и операнд был равен #FFFF или стал равен #0000 после сложения с CF), тогда результирующее значение PF меняется на обратное, то есть взводится если сброшен и наоборот.

Мы уже знаем, что ADC8 считается верно, значит правильно работающее вычисление PF для арифметических инструкций есть, и нужно только правильно применить его к ADC16/SBC16.

Lisitsin
09.03.2011, 17:24
То есть правильно я понимаю?
OPH:OPL - операнд. Сначала делаю ADD L,OPL, ADC H,OPH. Затем запоминаю PF. Затем если в начале C=0 - то выхожу, а если C=1 - инкрементирую HL и проверяю C, и если этот самый С=1 - значит инвертирую PF?
А флаг С я считаю как С1 or С2, где С1 - флаг переполнеия при первом сложении (старших байт), а С2 - при возможном втором (если в начале С=1).
Премного благодарен за консультацию !!!

Higgins
09.03.2011, 18:14
OPH:OPL - операнд. Сначала делаю ADD L,OPL, ADC H,OPH. Затем запоминаю PF. Затем если в начале C=0 - то выхожу, а если C=1 - инкрементирую HL и проверяю C, и если этот самый С=1 - значит инвертирую PF?
А флаг С я считаю как С1 or С2, где С1 - флаг переполнеия при первом сложении (старших байт), а С2 - при возможном втором (если в начале С=1).

Не совсем. PF нужно инвертировать не тот, который получился при сложении HL и OP, а тот, который получился при сложении HL, OP и CF. Получив его, мы смотрим на то, дает ли переполнение сложение OP и CF. Переполнение будет только если CF был взведен и OP=#FFFF. Так вот если это переполнение случилось, следует проинвертировать PF.

Не забудьте также, про случаи "ADC HL, HL" и "SBC HL, HL" -- эти инструкции модифицируют свои вторые операнды, но во время их исполнения OP (то есть, эти самые вторые операнды) должны рассматриваться равными значению HL до исполнения инструкций, как бы HL ни изменялся во время их исполнения.

Lisitsin
09.03.2011, 19:00
Есть идея сделать так:
1. Прибавить к операнду изначалое значение С.
2. Запомнить флаги P1, C1, S1, V1 - после первой операции.
2. Прибавить к HL текущее значение операнда используя компнда ADD, ADC.
3. Запомнить флаги P2, C2, S2, V2 после второго действия.
4. Вычислить флаги P, C, S результата как P=(P1ORP2)XORC1, C=C1ORC2, S=S1ORS2, V=V1ORV2, Z вычислить проверкой HL на ноль.

Higgins
09.03.2011, 20:12
Есть идея сделать так:
1. Прибавить к операнду изначалое значение С.
2. Запомнить флаги P1, C1, S1 - после первой операции.
2. Прибавить к HL текущее значение операнда используя компнда ADD, ADC.
3. Запомнить флаги P2, C2, S2 после второго действия.
4. Вычислить флаги P, C, S результата как P=P2XORC1, C=C1ORC2, S=S1ORS2, Z вычислить проверкой HL на ноль.
Правильно я думаю на этот раз?

Почти. :)

В терминах Z80, и если перекладывать на восьмиразрядные инструкции, инструкция "ADC HL, OP" эквивалентно следующему.

1) Прибавляем CF к OP:

LD A, OPL
ADC A, 0
LD OPL, A
LD A, OPH
ADC A, 0
LD OPH, A

Здесь запоминаем флаги CF1 и PF1.

Имеем в виду, что OP -- это временная копия операнда, а не сам этот регистр в правой части инструкции. То есть, сам регистр не модифицируем.

2) Прибавляем OP к HL:

LD A, L
ADD A, OPL
LD L, A
LD A, H
ADD A, OPH
LD H, A

3) Считаем PF. Он равен текущему PF (после "ADD A, OPH") в ксорке с PF1, то есть

PF = PF XOR PF1

4) Считаем CF. Он равен текущему CF (после той же инструкции) в дизъюнкции с CF1 -- как вы и написали, то есть

CF = CF OR CF1

5) Считаем ZF. Это, действительно, просто проверка HL на 0.

6) SF считать не нужно. Последняя инструкция его выставит сама.

7) А вот HF посчитать придется. То, что дает последняя инструкция будет правильным значением для инкрементированного операнда (если CF на входе взведен), а нам нужен HF для исходных операндов, то есть до инкремента.

8) MEMPTR = значение HL до исполнения.

9) Во флаги 3 и 5 копируем соответствующие разряды старшей половины резлуьтата (то есть H).

Lisitsin
09.03.2011, 20:24
То есть флаг H в конечном итоге это флаг от суммы HL и операнда (послее шага суммирования их старших байтов) без учёта изначального С?
А про MEMPTR у Янга я читал, что он равен (HL+1), где HL берётся до операции.

Higgins
09.03.2011, 20:32
То есть флаг H в конечном итоге это флаг от суммы HL и операнда (послее шага суммирования их старших байтов) без учёта изначального С?

С учетом. В Higgins Emulator есть такой простой макрос:


#define HF_ARI(r, a, b) (((r) ^ (a) ^ (b)) & Z80_HF)

Так вот для ADC16 вычислить HF можно с помощью HF_ARI(r, a, b), приняв r=(HL+OP+CF)/#100, a=HL/#100 и b=OP/#100. Во всех случаях HL, OP и CF -- значения до исполнения.


А про MEMPTR у Янга я читал, что он равен (HL+1), где HL берётся до операции.

Правильно. Я ошибся, действительно берется значение (HL + 1).

Lisitsin
09.03.2011, 20:48
#define HF_ARI(r, a, b) (((r) ^ (a) ^ (b)) & Z80_HF)

Ничего не понимаю. С H в последнем моём вопросе я немного ошибся. Исправляю:
1. Прибавить к операнду изначалое значение С.
2. Запомнить флаги P1, C1, H1 - после первой операции.
2. Прибавить к HL текущее значение операнда используя компнда ADD, ADC.
3. Запомнить флаги P2, C2, H2 после второго действия.
4. Вычислить флаги P, C, H результата как P=(P1ORP2)XORC1, C=C1ORC2, H=H1ORH2, Z вычислить проверкой HL на ноль.
То есть H взводится если он взводился хотя бы один раз - после первой операции сложения (старших байт) или же после второй операции сложения (старших байт).
(надо мне как нибудь на досуге С++ выучить ... :-) )

Higgins
09.03.2011, 21:36
То есть H взводится если он взводился хотя бы один раз - после первой операции сложения (старших байт) или же после второй операции сложения (старших байт).

Да, можно считать HF = HF1 OR HF2.

Но PF нужно считать как PF = PF1 XOR PF2.

Lisitsin
09.03.2011, 22:23
ADC16 PASSED !!!
А вот SBC16 по этому алгоритму не хочет ...

Higgins
10.03.2011, 11:11
А вот SBC16 по этому алгоритму не хочет ...

Должен работать. Покажите свой код для ADC16 и SBC16, и, может быть, обойдемся без трейсингов в этот раз. :)

Lisitsin
10.03.2011, 17:30
Шлю в приложении:

Higgins
10.03.2011, 18:13
Эмуляция команд ADC16, SBC16.zip

Вот здесь:


BST F,CC ; копируем бит С
BLD BUF,0 ; в младший разряд BUF
SUB ZL,BUF ; вычитаем флаг С, хранящийся в BUF
SBC ZH,ZERO ; к операнду (регистр ZERO==0 – всегда)

В ADC16 вы суммируете HL и CF и запоминаете флаги, а затем прибавляете получившееся к операнду и снова получаете нужные флаги, и это правильно. Это работает потому, что сложение коммутативно, и не имеет значения прибавлять ли CF к правому операнду и получить первую порцию флагов или прибавлять CF к левому и получить порцию флагов -- в любом случае последующее вычисление флагов даст правильный результат.

Когда речь идет о SBC16 (то есть, о вычитании), то отнимая CF из HL вы получаете не те флаги, которые нужны. Здесь важна последовательность вычислений: сначала нужно добавить CF к правому операнду (а не к HL) и получить порцию флагов, а уже затем из HL вычесть получившееся и вычислить результирующие флаги.

Lisitsin
10.03.2011, 18:57
Сделел как во вложении, но всё равно failed:

Lisitsin
10.03.2011, 19:06
Ой !!! не взвожу N !!!
Исправляюсь ...

Lisitsin
10.03.2011, 19:21
PASSED !

Higgins
10.03.2011, 19:39
всё равно failed

Давайте параллельно посмотрим на трейсинг. Условие такое: PC=#87BA ИЛИ #87BC.

* * *

UPDATE:


PASSED !

Ну, вот. Отлично.

Теперь RLA/RRA. Условие: PC=#87C9 ИЛИ #87CA ИЛИ #87CE ИЛИ #87CF. Регистров PC и AF будет достаточно.

Lisitsin
10.03.2011, 19:43
Всё до SLL/SRL проходит (RLA/RRA исправил):

Higgins
10.03.2011, 19:51
Всё до SLL/SRL проходит (RLA/RRA исправил):

Условие для SLL/SRL: PC=#882E ИЛИ #8830 ИЛИ #8834 ИЛИ #8836. Регистры PC и AF.

Lisitsin
10.03.2011, 20:10
Готовлю. А эмулирую так:

Lisitsin
10.03.2011, 20:43
Начало трейсинга для SLL:

Higgins
10.03.2011, 20:56
Начало трейсинга для SLL

Во второй строке:

8830 0140

Ошибочно взведен ZF.

Lisitsin
10.03.2011, 21:01
Вижу ! Читаю флаги раньше последнего действия - установки младшего бита в 1. Исправляюсь ...

Lisitsin
10.03.2011, 21:35
PASSED !!!
Дальше регистры R и I. Но с R дело сложное: я его обрабатываю в цикле M1 и во время трейсинга комментирую его инкремент и вместо него ставлю команду обращения к подпрограмме обработки трейсигна. BIT n,(HL) - пока не до конца прописан MEMPTR. На BIT n, (IX+D) Z80TESTS виснет. Может там копнуть?

Higgins
10.03.2011, 22:10
Дальше регистры R и I. Но с R дело сложное: я его обрабатываю в цикле M1 и во время трейсинга комментирую его инкремент и вместо него ставлю команду обращения к подпрограмме обработки трейсигна. BIT n,(HL) - пока не до конца прописан MEMPTR. На BIT n, (IX+D) Z80TESTS виснет. Может там копнуть?

"BIT n, (HL)" и "BIT n, (IX/IY+d)" в z80tests завязаны на "LD A, R". "LD A, I" тестируется вкупе с "LD A, R", поэтому не удивительно, что все это не проходит. Нужно найти способ икрементировать R вместе с выводом трейсинга.

Lisitsin
10.03.2011, 23:01
Нормально. Можно сделать.

Lisitsin
11.03.2011, 17:53
Добрый вечер, Higgins. Имеется ли настроение поработать? Готов запустить трейсинг с инкрементом R.

Higgins
11.03.2011, 18:44
Готов запустить трейсинг с инкрементом R.

Давайте. :)

Lisitsin
11.03.2011, 18:50
Давайте. :)

Я бы рад, но не знаю условий :smile:

Higgins
11.03.2011, 18:56
Я бы рад, но не знаю условий

Условие такое: PC=#8842 ИЛИ #8844 ИЛИ #8847 ИЛИ #8849. Регистры PC и AF.

Lisitsin
11.03.2011, 18:56
Есть. Немножко. Если нужно - сделаю больше.

Lisitsin
12.03.2011, 10:08
Чуть по-больше:

Higgins
12.03.2011, 11:32
TRACE I_A_1.zip

"LD A, I" по #8842. При I=#3F после исполнения ошибочно F=#00 вместо правильного F=#28.

Как выставлять флаги: CF не меняем. В SF и флаги 3 и 5 копируем соответствующие разряды регистра I. Взводим ZF если I=#00, иначе ZF сбрасываем. В PF кладем IFF2.

Для "LD A, R" делаем в точности то же, но вместо I берем регистр R (все восемь его разрядов).

Lisitsin
12.03.2011, 11:49
В PF кладем IFF2.



У меня IFF2 вообще не формируется. Его сложно генерировать?

Higgins
12.03.2011, 12:25
У меня IFF2 вообще не формируется. Его сложно генерировать?

Насколько мне известно, в Спектруме IFF1 и IFF2 изменяются синхронно, поэтому вместо IFF2 можно использовать IFF1.

Lisitsin
12.03.2011, 12:39
Весело. А у меня и IFF1 не формируется.

Higgins
12.03.2011, 12:54
Весело. А у меня и IFF1 не формируется.

Действительно весело. Как же вы прерывания обрабатываете? :)

Тогда так:
1) Вводим два флажка IFF1, IFF2.
2) "RETN" копирует IFF2 в IFF1.
3) Про "LD A, I" и "LD A, R" уже сказано.
4) В начале обрабтки прерывания сбрасываем IFF1 и IFF2.
5) Прерывание обрабатываем если прерывания не запрещены и текущий такт от начала фрейма в пределах длительности сигнала ~INT. У меня это 32 такта.
6) Запрещенное прерывание означает, что либо IFF1 сброшен, либо была выборка одного из оп-кодов, после которых прерывания не должно быть, либо и то, и другое вместе.
7) "DI" сбрасывает IFF1 и IFF2.
8) "EI" взводит IFF1 и IFF2.
9) Оп-коды, после которых не должно быть прерываний: #DD (префикс для IX), #FB (инструкция "EI") и #FD (префикс для IY).

Lisitsin
12.03.2011, 14:16
Что-то вроде бы сляпал, но failed:

Lisitsin
12.03.2011, 18:10
Кстати, поздравляю с новым статусом !!!

Higgins
12.03.2011, 19:10
TRACE I_A_3.zip

Во второй строке у вас A=#3F, а F=#68, то есть ZF ошибочно взведен.


Кстати, поздравляю с новым статусом !!!

Спасибо. :)

balu_dark
12.03.2011, 20:10
скоро - будет вполне возможно заменять мегой реальный Z80 осталось только недокументированные инструкции потом добавить. получится платка переходник с смдшной AVR. и кстати потреблять помоему будет меньше. только не знаю как с нагрузочной способностью.

Lisitsin
12.03.2011, 21:17
Z исправил. Failed:

Higgins
12.03.2011, 22:48
TRACE I_A_4.zip

Вижу две проблемы:

1) Инкрементировать следует только младшие семь разрядов R. Старший разряд остается неизменным.

При этом инструкция "LD R, A" загружает в R все восемь разрядов.

2) Инкрементировать R следует только в циклах выборки (fetch). Непосредственные операнды инструкций извлекаются обычными циклами чтения, которые не являются циклами выборки. например, в инструкции "LD HL, #nn" будет цикл выборки и два цикла чтения, итого R инкрементируем один раз.

Но: префиксы #CB и #ED, а также префиксы для IX/IY #DD и #FD читаются тоже циклами выборки, и значит каждый такой префикс увеличивает R.

Теперь смотрим в трейсинг. Ищем строки для PC=#8849. Эти строки отражают состояние после инструкции "LD A, R". Перед циклом тестирования R сбрасывается в ноль с помощью "LD R, A".

В первой такой строке у вас получается R=#4C. А должен быть R=#2C.

Вторая такая строка у вас говорит, что R=#DB (сразу замечаем перемену старшего разряда R, чего быть не должно). А должен быть R=#7F.

Значит, между циклами у вас R увеличивается на #DB - #4C = #8F = 143. А должен увеличиваться на #7F - #2C = #53 = 83. Итого 143 - 83 = 60 лишних циклов выборки. Для такого короткого кода (одна итерация тестирования) это очень много. Из этого я делаю вывод, что R у вас инкрементируется не только для циклов выборки.

Еще раз, кратко. Первая строка для PC=#8849 должна быть:

8849 2c28

Вторая:

8849 7f29

Третья:

8849 5200

Lisitsin
12.03.2011, 23:19
А как LD R,A влияет на флаги?

Higgins
12.03.2011, 23:39
А как LD R,A влияет на флаги?

Не влияет на флаги.


А R я инкрементирую только в цикле М1 - то есть только при чтении очередной инструкции.

Значит, нужно искать другую причину избыточного увеличения R.

Кстати, в начале обработки прерывания R следует инкрементировать тоже.

Lisitsin
13.03.2011, 00:17
Ошибку с избыточным инкрементированием нашёл.
Первые 2 строки исправились, а третья что-то не хочет:

Higgins
13.03.2011, 10:22
Первые 2 строки исправились, а третья что-то не хочет:

NF надо сбрасывать. В обеих инструкциях.

Lisitsin
13.03.2011, 12:58
Такая хорошая погода на улице. Весна: солнышко, птички ...
А слово FAILED всё настроение портит.

Higgins
13.03.2011, 13:06
А слово FAILED всё настроение портит.

HF тоже сбросьте, и настроение поднимется. :)

Lisitsin
13.03.2011, 13:27
И вправду !!! Слово PASSED на настроение влияет с обратной логикой.

Higgins
13.03.2011, 13:36
И вправду !!!

Условие для "BIT n, (HL)": PC=#8858 ИЛИ #885A ИЛИ #885D ИЛИ #885F ИЛИ #8862 ИЛИ #8864 ИЛИ #8867 ИЛИ #8869 ИЛИ #886C ИЛИ #886E ИЛИ #8871 ИЛИ #8873 ИЛИ #8876 ИЛИ #8878 ИЛИ #887B ИЛИ #887D. Регистры PC, HL, AF.

Lisitsin
13.03.2011, 14:46
Я условие сделал #8858<=PC<=#887d

Higgins
13.03.2011, 16:12
TRACE_BIT(HL)_1.zip

Во второй строке неправильно установлены флаги 3 и 5.

Как устанавливать эти флаги:
- Для "BIT n, r" -- копируются разряды 3 и 5 регистра "r".
- Для "BIT n, (HL)" -- копируются разряды 3 и 5 старшей половины MEMPTR. Сам MEMPTR при этом не меняется.
- Для "BIT n, (i+d)" -- тоже копируются разряды 3 и 5 старшей половины MEMPTR. Но поскольку это индексная инструкция, MEMPTR получает значение адреса (i+d). Копировать разряды из MEMPTR следует после присваивания ему (MEMPTR) значения адреса.

Lisitsin
13.03.2011, 18:13
А у меня MEMPTR ущё и не после каждой команды отрабатывается, после которой его нужно обрабатывать. BIT (IX/Y+d) исправил. BIT n (HL) и BIT n,r в отношении битов 3 и 5 прописаны.

Higgins
13.03.2011, 18:33
А у меня MEMPTR ущё и не после каждой команды отрабатывается, после которой его нужно обрабатывать. Я его начал прописывать по Шону Янгу, но пока только до половины документа. BIT (IX/Y+d) исправил. BIT n (HL) и BIT n,r в отношении битов 3 и 5 прописаны.

Процедура тестирования для "BIT n, (HL)" начинается по адресу #8855. Вызывается она инструкцией "CALL #8855". Эта инструкция копирует #8855 в MEMPTR, поэтому тестирование всегда начинается с этого значения MEMPTR.

Во второй строке у вас F=#38 вместо #18. Старшая половина пправильного значения MEMPTR = #88 = %10001000 -- 3-й и 5-й разряды сброшены.

Если MEMPTR для "CALL #nn" не реализован, то сейчас самое время.

Lisitsin
13.03.2011, 19:07
Так оно по-лучше?

Higgins
13.03.2011, 19:50
Так оно по-лучше?

Немножко. Чтобы увереннее определить проблему нужно в дополнение к PC, HL и AF вывести еще MEMPTR.

Lisitsin
13.03.2011, 20:18
Можно и с MEMPTR:

Higgins
13.03.2011, 20:32
Можно и с MEMPTR:

Отлично. "RET" (условный и безусловный) должны присваивать MEMPTR адрес передачи управления, т.е. то, что они извлекают из стека.

Lisitsin
13.03.2011, 21:42
Готово.

Higgins
13.03.2011, 21:54
TRACE_BIT(HL)_5.zip

Здесь все прошли. Видимо, нужно гораздо больше строк.

Lisitsin
13.03.2011, 22:40
Здесь все прошли. Видимо, нужно гораздо больше строк.

Всё. Прошло. Следующая BIT r (IX/Y+d):

Higgins
14.03.2011, 16:00
Следующая BIT r (IX/Y+d):

Условие: PC=от #888D до #88C2 включительно. Регистры PC, AF, IX.

Lisitsin
14.03.2011, 18:14
Странное дело. Он пролетает один проход и больше не возвращается:

fifan
14.03.2011, 18:42
Господа, я всё понимаю, процесс отладки. Но всё же не могли бы вы переписываться через личку, а сюда уже представить готовый результат. А то более 300 постов идёт диалог, никто в нём кроме вас двоих не участвует.

Spectramine
14.03.2011, 18:50
Этот диалог может быть полезен другим эмулеписателям.

Lisitsin
14.03.2011, 19:01
Господа, я всё понимаю, процесс отладки. Но всё же не могли бы вы переписываться через личку, а сюда уже представить готовый результат. А то более 300 постов идёт диалог, никто в нём кроме вас двоих не участвует.

Да дело к развязке. История она так и делается - чтобы все видели и знали.
Higgins помогает мне нереально. Да не забудется его труд !!!

osa
14.03.2011, 19:11
я за то, что бы оставить и продолжать сей диалог.:)

fifan
14.03.2011, 19:13
Ну хорошо... Как сказал Ewgeny7, Вы простых путей не ищите. Интересно всё же увидеть Спектрум на железной эмуляции процессора!

Lisitsin
14.03.2011, 19:28
Для Higgins: отпустил я его в свободный полёт с адреса #888D. В итоге где-то сбой: мне кажется где-то здесь у меня реальный глюк: (TRACE_GLUK.txt). Шлю PC : BC : DE : HL : AF : IX : IY : SP;

Lisitsin
14.03.2011, 19:32
Ну хорошо... Как сказал Ewgeny7, Вы простых путей не ищите. Интересно всё же увидеть Спектрум на железной эмуляции процессора!

Ещё весь мир увидит !!!
Я придумал как ещё одну микросхему из проекта выбросить вместе с обвязкой. Так что любой радиолюбитель собирать будет.

osa
14.03.2011, 19:46
z80 на atmel бы отладить, а потом выбрасывать. Слежу внимательно за развитием событий, вот только жаль, что помочь ничем не могу:(

---------- Post added at 19:46 ---------- Previous post was at 19:46 ----------

От сюда еще можно вывести на будущее все нюансы недокументированные или плохо документированные.

Higgins
14.03.2011, 20:25
TRACE.txt

Вижу проблему с инструкциями "BIT n, (IX+d)", которые исполняются в цикле тестирования. Они исполняются так, будто они размером 5 байтов вместо четырех. Вторая строка в трейсинге должна быть для PC=#8891, а у вас она для PC=#8892. В результате после проверки бита вызывается не процедура обновления контрольной суммы, а случайный код. По этой же причине не происходит выход из процедуры тестирования, которая вызывается для каждой итерации.

---------- Post added at 20:25 ---------- Previous post was at 20:23 ----------


Господа, я всё понимаю, процесс отладки. Но всё же не могли бы вы переписываться через личку, а сюда уже представить готовый результат. А то более 300 постов идёт диалог, никто в нём кроме вас двоих не участвует.

А могли бы и поучаствовать. :)

Lisitsin
14.03.2011, 20:52
А какая там конкретно команда BIT и что после неё? Прогнал в AVRStudio - всё нормально. Бейсик без этой команды просто повесился бы, вот что странно ...

Higgins
14.03.2011, 20:59
А какая там конкретно команда BIT и что после неё?

Код выглядит так:
#888D BIT 0, (IX+#00)
#8891 CALL #94FD
#8894 BIT 1, (IX+#7F)
#8898 CALL #94FD
...


Прогнал в AVRStudio - всё нормально.

Нужно найти причину, по которой во второй строке трейсинга выводится #8892 вместо #8891. Может быть оно и правильно исполняется, но по трейсингу пока этого не видно.

Lisitsin
15.03.2011, 00:32
Поймал:

Higgins
15.03.2011, 10:53
TRACE_BIT(IX_D)1.zip

В строке 16. "BIT 7, (IX - #01)" по #88BE должен взводить SF, если тестируемый бит взведен.

Lisitsin
15.03.2011, 18:48
Идёт !!! вместе с IY !!!!!!!
LDI failed.

Higgins
15.03.2011, 19:41
LDI failed.

Условие: PC=#89AE ИЛИ #89B0. Регистры PC, BC, DE, HL, AF.

Флаги для всего семейства LDI, LDD, LDIR и LDDR:
- SF, ZF и CF не меняем.
- Флаги 3 и 5. Если принять r за значение ячейки, которое читается из (HL) и пишется в (DE), то разряд 3 (считая от 0) суммы r+A (где A -- это регистр A) даст значение для флага 3, а бит 1 этой суммы даст значение для флага 5.
- PF взведен, если BC (после декремента) не равен нулю.
- HF и NF сброшены.

Если это инструкция с повторением (LDIR, LDDR) и если она должна быть повторена (то есть BC после декремента не равен нулю), тогда PC уменьшается на два, то есть, становится на начало той же инструкции, и MEMPTR получает PC+1, где PC -- это уже уменьшенное на два прежнее значение PC. MEMPTR устанавливается только в этом случае. Если это инструкция без повтора или если повтора нет, MEMPTR остается прежним.

Lisitsin
15.03.2011, 20:25
LDI, LDD, LDIR, LDDR Passed. CPI, CPD FAILED:

Higgins
15.03.2011, 23:39
CPI, CPD FAILED:

Условие: PC=#89AE ИЛИ #89B0. Регистры PC, BC, HL, AF.

Обратите внимание, что условие то же, что и для LDI. Чтобы поймать именно CPI нужно выводить трейсинг только после того, как управление пройдет по адресу PC=#8966.

Флаги:
- SF, ZF и HF выставляются так же, как в инструкции "CP n", где в роли "n" -- значение ячейки в (HL).
- Флаги 3 и 5. Вычисляем значение r = A - n - HF. Здесь "A" -- это регистр A, "n" -- значение ячейки, "HF" -- значение флага HF (0 или 1). Здесь берется не значение HF на входе, а значение этого флага уже после выполнения "CP n". Как и в случае с LDI, во флаг 3 копируем разряд 3 значения "r", а во флаг 5 -- разряд 1 того же значения.
- PF устанавливаем так же, как в LDI.
- NF нужно взвести.
- CF не меняем (то есть, он должен быть такой же, как на входе, а не такой, как после "CP n").

MEMPTR:
CPI и CPIR увеличивают MEMPTR на 1.
CPD и CPDR уменьшают MEMPTR на 1.
Но: если исполняется CPIR или CPDR и нужное значение не найдено (сравнение дало сброшенный ZF) и BC не равно 0, тогда PC уменьшается на 2, после чего MEMPTR получает значение PC+1. Во всех остальных случаях MEMPTR остается прежним.

Lisitsin
16.03.2011, 18:29
Ваши консультации бесценны !
CPI, CPD прошли. CPDR и CPIR я прописал, но следом за CPD в тесте идёт INI, которая у меня пока не реализована. Может продолжем с ввода-вывода?

Higgins
16.03.2011, 19:20
CPI, CPD прошли. CPDR и CPIR я прописал, но следом за CPD в тесте идёт INI, которая у меня пока не реализована. Может продолжем с ввода-вывода?

А CPIR и CPDR в тесте и нету, поэтому будем продолжать по списку.

Пока пишу про группу INI, несколько вопросов. Есть ли подвижки в правильности/стабильности работы Бейсика? Осталась ли проблема с загрузкой программ с ленты? Можете ли загрузить zexall? Если можете, подтверждает ли он наш прогресс? И как с загрузкой и работой игр, с которыми раньше были проблемы?

---------- Post added at 19:20 ---------- Previous post was at 18:54 ----------

Условие для INI то же, что для CPI, но для начала трассировки управление должно пройти через PC=#8976.

Для этих инструкций лучше MEMPTR посчитать до вычисления флагов. Для INI и INIR MEMPTR получает значение BC-1, для IND и INDR -- значение BC+1. Здесь BC -- это значение регистра до декремента B.

Флаги:
- SF и флаги 3 и 5 копируются из соответствующих разрядов регистра B (после его декремента).
- ZF выставляется как результат проверки регистра B (после его декремента) на равенство нулю.
- PF выставляется как флаг четности для 8-разрядного значения, которое вычисляется так. Берем младшую половину MEMPTR (после его установки как описано выше), прибавляем к нему значение, прочитанное из порта. Назовем эту промежуточную сумму "cf". Затем берем три младших разряда этой суммы и делаем XOR с регистром B (после его декремента). Вот для этого сумасшедшего числа и считаем четность, и выставляем PF.
- HF и CF. Если сумма "cf" дает переполнение (то есть, было переполнение при 8-разрядном сложении младшей половины MEMPTR с регистром B), тогда взводим HF и CF. Иначе, оба флага сброшены.
- NF копируем из старшего разряда значения, прочитанного из порта.

Lisitsin
16.03.2011, 19:28
Значит дело такое: самая большая продвижка по бейсику была последняя - страниц 15 назад. Бейсик вообще был нестабилен. Сейчас стоит как вкопанный. Есть один постоянный глюк, проявляется при загрузке с ленты: с первого раза нет автоматического старта загрузчика. Zexall вообще не грузится (приложение). ROBOCOP при старте игры или виснет или сбрасывается в бейсик. Есть простенькая игрушка - feenix - она работает.

Lisitsin
16.03.2011, 19:52
Вопрос: а куда читается при этом байт из порта? В А?

Higgins
16.03.2011, 20:14
Вопрос: а куда читается при этом байт из порта? В А?

Нет, во временную переменную.

Lisitsin
16.03.2011, 20:46
А вот ещё вопрос: цитата: Для INI и INIR MEMPTR получает значение BC-1, для IND и INDR -- значение BC+1. Здесь BC -- это значение регистра до декремента B.
Может наоборот?

Higgins
16.03.2011, 21:00
Может наоборот?

Ага. :)

Lisitsin
16.03.2011, 21:20
INI, IND PASSED. OUTI следом.
Кстати, запускал я вторую часть - тест MEMPTR - там сплошь failed. Может поэтому игрушки нге работают?

Lisitsin
16.03.2011, 22:45
Всем ожидающим результатов: пошла игрушка Manic Miner:
http://dl.dropbox.com/u/12408899/CVBS%20Manic%20Mimer.zip
http://dl.dropbox.com/u/12408899/CVBSManic%20Mimer_demo.zip
Приношу извинения от имени моего видеопроцессора за временные неудобства, связанные с формированием видеосигнала картинки в динамике. Исправимся.

osa
17.03.2011, 06:46
Lisitsin, заливай видео на youtube.

Lisitsin
17.03.2011, 07:08
Lisitsin, заливай видео на youtube.

А это как?

osa
17.03.2011, 07:22
заходим на youtube, регистрируемся, входим.
http://img12.imageshost.ru/img/2011/03/17/image_4d818d6852284.png
Потом нажимаем добавить видео:
http://img12.imageshost.ru/img/2011/03/17/image_4d818d6c81ffd.png

Higgins
17.03.2011, 11:22
OUTI следом.

Для трейсинга OUTI управление должно проходить через PC=#8986.

MEMPTR выставляется так же, как для группы INI, но берется значение BC не до декремента B, а после него.

Флаги:
- SF, ZF и NF и флаги 3 и 5 вычисляем так же, по значению регистра B после декремента.
- Для расчета значения "cf" делаем то же, но берем не младшую половину MEMPTR, а младшую половину HL (после его инкремента/декремента).
- PF, HF и CF считаем так же, но с учетом того, что "cf" вычисляется по-другому.


Кстати, запускал я вторую часть - тест MEMPTR - там сплошь failed. Может поэтому игрушки нге работают?

Вряд ли. Значения MEMPTR для разных инструкций выдаются разные или одно и то же?

Lisitsin
17.03.2011, 17:31
Вряд ли. Значения MEMPTR для разных инструкций выдаются разные или одно и то же?

Это надо посмотреть в тесте?

Higgins
17.03.2011, 17:43
Это надо посмотреть в тесте?

Да, выводимые в тесте на MEMPTR числа -- это и есть значения регистра.

Lisitsin
17.03.2011, 17:51
Ой !!! А у меня некоторые команды пошли ... И как раз те, для которых я MEMPTR прописывал:
Есть у меня предложение: пройтись трейсингом по какому-нибудь сложному процессу в бейсике. Может оно что и выплывет?

Lisitsin
17.03.2011, 20:40
Для трейсинга OUTI управление должно проходить через PC=#8986.

OUTI с наскоку взять мне не удалось. Стал запускать трейсинг по проходу через PC=#8986, но он запускается на LDI.

Higgins
17.03.2011, 21:07
OUTI с наскоку взять мне не удалось. Стал запускать трейсинг по проходу через PC=#8986, но он запускается на LDI.

Значит, есть ошибка в логике запуска трейсинга. Через PC=#8986 управление должно проходить только один раз и только в начале тестирования OUTI.

Lisitsin
17.03.2011, 22:42
Значит, есть ошибка в логике запуска трейсинга. Через PC=#8986 управление должно проходить только один раз и только в начале тестирования OUTI.

Точно. Моя ошибка:)
Поймал:

Higgins
17.03.2011, 23:17
TRACE_OUTI_1.zip

Вижу две проблемы:

1) HL должен инкрементироваться.

2) Во второй строке неправильно считается PF. Поскольку PF считается с участием младшей половины HL, видимо из-за отсутствия инкремента и возникает проблема.

Lisitsin
18.03.2011, 00:08
ELITE тормозит, а вот KOSMOS работает, но что-то я не понял как в его играть надо:
http://dl.dropbox.com/u/12408899/CVBS%20ELITE.zip
http://dl.dropbox.com/u/12408899/CVBS%20KOSMOS.zip

---------- Post added at 23:35 ---------- Previous post was at 23:30 ----------


Вижу две проблемы:

1) HL должен инкрементироваться.


Точно, блин ... :-)

---------- Post added 18.03.2011 at 00:08 ---------- Previous post was 17.03.2011 at 23:35 ----------

Звук тоже есть:
http://dl.dropbox.com/u/12408899/CVBS%20MM_Sound.zip

Lisitsin
18.03.2011, 17:58
Доброго времени.
OUTI и OUTD прошли. Остаётся совсем немножко. Сможем доделать?
Пока попробую погонять игрушки. Кстати, какие можно попробовать?

goodboy
18.03.2011, 18:49
попробую погонять игрушки. Кстати, какие можно попробовать?

а в каком формате идёт загрузка софта ?

Lisitsin
18.03.2011, 19:17
а в каком формате идёт загрузка софта ?Как с ленты только через Winamp.

---------- Post added at 19:17 ---------- Previous post was at 18:56 ----------

Что-то игрушки только простенькие работают:
http://dl.dropbox.com/u/12408899/CVBS%20%28110318-191125%29.zip

osa
18.03.2011, 19:57
Lisitsin, выкладывай сии шедевры на ютуб (http://www.youtube.com/watch?v=6ccayTJwGaw):) удобнее.

Higgins
18.03.2011, 20:18
Остаётся совсем немножко.

По тесту -- да. А в целом проблем еще хватает. :) И первая из них -- проблема с загрузкой.


Сможем доделать?

Без вас не смогу. :)


Пока попробую погонять игрушки. Кстати, какие можно попробовать?

Jumping Jack.


CVBS PART2.zip

Смотрите как интересно. У вас "EX (SP), IX" не просто не проходит, а вываливается в бейсик с какой-то неадекватной ошибкой. Это значит, что тест на этой инструкции теряет управление. Это значит, что инструкция реализована с ошибкой. И внутреннее чутье мне подсказывает, что это имеет отношение к проблеме загрузки и автостарта.

USERHOME
18.03.2011, 20:32
:v2_dizzy_roll:
Уважаемый Lisitsin попрошу Вас после "разбора полётов" в ваших начиннаниях выложить сюда на форум все ваши труды совместные с Higgins.
Я уже потерял ниточку с чего начиналось и хотелось бы вникнуть в эту разработку.
Как называют на других форумах WorkLog так сказать.:v2_dizzy_coder::v2_dizzy_coder: в описаниях действий -что -для чего......
P.S. Мне очень интересно про Z-80 на "AVR". Также недокументированные команды .....etc
P.P.S. Про "TRACE" тоже поподробнее опишите плз.
P.P.P.S. Вас просят выкладывать на YouTube, может в конце работ одним (двумя,тремя) роликом и выложете со вставленными текстовыми титрами.
(если будет время/желание). Так что своё видео и фото архивируйте на всякий случай.:v2_dizzy_king:

osa
18.03.2011, 20:54
это я прошу(один), можно меня во внимание не принимать:) не будем людей оффтопом отвлекать. Они в отличие от нас нужным и важным делом заняты:)

zorel
19.03.2011, 01:37
Как с ленты только через Winamp.

---------- Post added at 19:17 ---------- Previous post was at 18:56 ----------

Что-то игрушки только простенькие работают:
http://dl.dropbox.com/u/12408899/CVBS%20%28110318-191125%29.zip

Попробуйте погрузить игры через софтинку (http://personal.auna.com/casariche/k7zx4/k7zx4.htm) прямо из TAP, TZX. Есть функция, ускоренной загрузки, вместо 3-5 минут, можно грузить за 30-60 секунд.

---------- Post added at 00:37 ---------- Previous post was at 00:36 ----------

http://www.youtube.com/watch?v=-BAHjRsnNWA

Lisitsin
19.03.2011, 12:42
По просьбе модератора пробую выложить на You tube: игрушка KOSMOS
http://www.youtube.com/watch?v=RDrEnBNnCtI


---------- Post added at 12:25 ---------- Previous post was at 12:03 ----------



Смотрите как интересно. У вас "EX (SP), IX" не просто не проходит, а вываливается в бейсик с какой-то неадекватной ошибкой.

Да вроде бы криминала нет ... Вот как оно выглядит:

---------- Post added at 12:36 ---------- Previous post was at 12:25 ----------


Попробуйте погрузить игры через софтинку (http://personal.auna.com/casariche/k7zx4/k7zx4.htm) прямо из TAP, TZX. Есть функция, ускоренной загрузки, вместо 3-5 минут, можно грузить за 30-60 секунд.

---------- Post added at 00:37 ---------- Previous post was at 00:36 ----------

http://www.youtube.com/watch?v=-BAHjRsnNWA

Что-то я не понял как ей пользоваться. Да оно скорее всего и не получится: бейсик у меня стандартный. Если только в нём копаться и что-то изменять ...

---------- Post added at 12:42 ---------- Previous post was at 12:36 ----------



Jumping Jack.



При загрузке отдаётся бейсику с сообщением "нонсенс в бейсике"

zorel
19.03.2011, 13:12
Lisitsin, Там нет ничего сложного
Запускаете программу, выбераете модель (model 48k)
кликаете на Add blocks - выбераете файл с расширением TAP/TZX/Z80
Далее выбераете скорость загрузки - Samples 3,5 (12600 bit) впринцепи все. Нажимаете Play и загружаете.
Должно быстро грузить.
Также можно корвертнуть в WAV и MP3

Если что вот на всякий случай еще софтика (http://narod.ru/disk/7440126001/K7ZX_v_4_2.rar.html), я переводил, правда каряво :D, но разобрать можно.
Принцип работы такой же, отличается интерфейс и больше выбор ускоренной загрузки.

Higgins
19.03.2011, 13:24
Да вроде бы криминала нет ... Вот как оно выглядит:

Не вижу. :)

Lisitsin
19.03.2011, 13:31
Lisitsin, Там нет ничего сложного
Запускаете программу, выбераете модель (model 48k)
кликаете на Add blocks - выбераете файл с расширением TAP/TZX/Z80
Далее выбераете скорость загрузки - Samples 3,5 (12600 bit) впринцепи все. Нажимаете Play и загружаете.
Должно быстро грузить.

Пишет, что не может открыть .SBB файл.

Lisitsin
19.03.2011, 13:47
Не вижу. :)

Прошу прощения :)

Lisitsin
19.03.2011, 14:48
Ещё какая-то игрушка пошла - KIREL. Как играть пока не понял.
http://www.youtube.com/watch?v=z6wQkjTFCX0

BYTEMAN
19.03.2011, 14:52
Попробуйте устроить встряску Бейсику: загрузите это (ftp://ftp.worldofspectrum.org/pub/sinclair/games/d/Dominoes_2.tzx.zip)

Lisitsin
19.03.2011, 15:13
Попробуйте устроить встряску Бейсику: загрузите это (ftp://ftp.worldofspectrum.org/pub/sinclair/games/d/Dominoes_2.tzx.zip)

Не хочет ...

Higgins
19.03.2011, 15:17
Эмуляция EX (SP),IX.zip

Выглядит нормально.

Встречное предложение насчет чего-нибудь потрейсить: вот давайте возьмем этот тест MEMPTR и посмотрим на трейсинг по всем регистрам по условию #9424 <= PC <= #9435. На весь тест получается меньше тысячи строк, поэтому на регистры можно не скупиться. Это поможет понять, почему теряется управление в тесте, и это наверняка прояснит дело с автозапуском и загрузкой.

BYTEMAN
19.03.2011, 15:20
Lisitsin, может быть, загрузилось с ошибкой?

Lisitsin
19.03.2011, 15:30
Lisitsin, может быть, загрузилось с ошибкой?

Так точно. Но это у меня не аппаратная, а софтовая проблема. У меня так со многими вещами.

---------- Post added at 15:30 ---------- Previous post was at 15:29 ----------


Выглядит нормально.

Встречное предложение насчет чего-нибудь потрейсить: вот давайте возьмем этот тест MEMPTR и посмотрим на трейсинг по всем регистрам по условию #9424 <= PC <= #9435. На весь тест получается меньше тысячи строк, поэтому на регистры можно не скупиться. Это поможет понять, почему теряется управление в тесте, и это наверняка прояснит дело с автозапуском и загрузкой.

Делаю !

Lisitsin
19.03.2011, 15:57
Готово. Шлю PC : BC : DE : HL : AF : IX : IY : SP;
В конце повисает.

Higgins
19.03.2011, 18:37
TRACE_PART2.zip

Туманная история. В строке 141 регистр A должен менять свое значение на #00. У вас этого не происходит.

Менять свое значение регистр должен после исполнения инструкции "LD A, (#FFFF)". Значит, либо эта ячейка имеет неверное значение, либо оно неверно читается.

Чтобы понять, что происходит понадобится подробный трейсинг начиная с прохода управления по адресу PC=#9426 и далее. Это 112 тысяч строк со всеми регистрами. Можно это сделать?

Lisitsin
19.03.2011, 18:42
Туманная история. В строке 141 регистр A должен менять свое значение на #00. У вас этого не происходит.

Менять свое значение регистр должен после исполнения инструкции "LD A, (#FFFF)". Значит, либо эта ячейка имеет неверное значение, либо оно неверно читается.

Чтобы понять, что происходит понадобится подробный трейсинг начиная с прохода управления по адресу PC=#9426 и далее. Это 112 тысяч строк со всеми регистрами. Можно это сделать?

Ну это ещё не конец света. В ночь запущу. Кстати, FFFF - это у меня тема для размышления. Думаю.

Lisitsin
20.03.2011, 09:45
Всем доброго утра.
Трейсил в ночь: столько хватит или надо больше?

Higgins
20.03.2011, 11:46
TRACE_9426_1.zip

Мда. В строке 17131 у нас различие в регистре F. Это после исполнения "BIT 0, (HL)". Причем различие не во флагах 3 и 5, а в ZF и PF. То есть, снова что-то не то читается из памяти. В момент чтения HL равен #FF45. До строки 17131 эта ячейка ни разу не модифицируется. Значение этой ячейки до первой модификации должно быть равно #0E=%1110. Нулевой бит сброшен. У меня на эмуляторе после проверки бита ZF и PF взведены, что и должно быть, если значение ячейки равно #0E. У вас в трейсинге оба флага сброшены. При этом, судя по тесту на флаги, сама инструкция реализована верно. Остается грешить на память?

Что можно попробовать. Можно вывести тот же трейсинг, скажем, первые 18000 строк, но в каждую строку добавить текущее значение в ячейке #FF45.

Lisitsin
20.03.2011, 12:10
Попробую включить ячейку памяти ff45 в трейсинг. Как я понял, IX, IY, SP сейчас особенного значения не играют. Может сделать трейсинг такого вида: PC : BC : DE : HL : [FF45] ? И если да - то с какой точки лучше начать трейсинг ?

---------- Post added at 12:10 ---------- Previous post was at 11:55 ----------

Оппа-па !
Пишу в бейсике:
10 POKE 65349,0
20 PRINT PEEK (65349)

В ответ : 255.

Работаю ...

Higgins
20.03.2011, 12:20
Попробую включить ячейку памяти ff45 в трейсинг. Как я понял, IX, IY, SP сейчас особенного значения не играют. Может сделать трейсинг такого вида: PC : BC : DE : HL : [FF45] ? И если да - то с какой точки лучше начать трейсинг ?

Лучше с той же.


В ответ : 255.

Вот-вот. :)

Lisitsin
20.03.2011, 13:21
Прогнал тест RAM. Всё чисто. Проблемы эмуляции (приложение: экранная область заполнялась различными значениями, читаемыми из RAM. Горизонтальная граница соответствует адресу FFFF, выше - ОЗУ).
Трейсинг готовлю.

goodboy
20.03.2011, 13:37
раньше многие эмули выдавали неверное значение в HL при выполнении LD HL,(65535).

Lisitsin
20.03.2011, 13:46
раньше многие эмули выдавали неверное значение в HL при выполнении LD HL,(65535).
По-моему такой же случай.

Lisitsin
20.03.2011, 14:44
Уже в начале значение [ff45] равно 0x47.
Шлю PC: BC: DE: HL: AF: [ff46]:[ff45] ([ff46] корректна только младшая тетрада).
Если загрузить z80tests и нажать "3", затем из бейсика PRINT PEEK 65349 (0xff45) то тоже получаем 71 (0x47).
После старта бейсика непосредственно PRINT PEEK 65349 даёт 255 :v2_conf2:. А должно быть 0. Такое ощущение, что туда стек заползает. Может старт бейсика потрейсить?

Higgins
20.03.2011, 16:12
После старта бейсика непосредственно PRINT PEEK 65349 даёт 255 . А должно быть 0. Такое ощущение, что туда стек заползает. Может старт бейсика потрейсить?

Сразу после старта Бейсика значение в 65349 скачет (очевидно, во время ожидания ввода стек топчется по этой ячейке).

Значение 14 в 65349 для z80tests кладет его Бейсик-загрузчик через исполнение "CLEAR 32767". Если после старта Бейсика набрать эту команду, и затем сделать "PRINT PEEK 32767", то мы должны получить именно 14. У вас это так или нет?

Lisitsin
20.03.2011, 16:21
"CLEAR 32767". Если после старта Бейсика набрать эту команду, и затем сделать "PRINT PEEK 32767", то мы должны получить именно 14. У вас это так или нет?

В смысле потом набрать PRINT PEEK 65349?
Всё равно 71:
http://www.youtube.com/watch?v=hDMz6wEdJgI
А PRINT PEEK 32767 даёт 62 (0X3E)

Higgins
20.03.2011, 16:54
В смысле потом набрать PRINT PEEK 65349?

Да, опечатка.


Всё равно 71.

Копания показали, что ячейка модифицируется обработкой прерывания. В нее кладется старшая половина адреса возврата.

Если я правильно понимаю, длительность исполнения инструкций в тактах может быть не реализована до конца. Плюс, не реализованы задержки по памяти и портам, поэтому сейчас прерывание может быть где угодно.

Давайте вернемся к тесту на MEMPTR. Около ста тысяч строк есть. Сколько там еще до выхода в Бейсик с ошибкой? Если возможно, выкладывайте остальное.

Lisitsin
20.03.2011, 16:59
Есть ещё немножко (вложение).
Может имеет смысл запуститься по-ближе к самой ошибке?

Higgins
20.03.2011, 19:48
Может имеет смысл запуститься по-ближе к самой ошибке?

Тесты для разных инструкций копируют соответствующие фрагменты кода в одни и те же адреса, которые исполняются в цикле, поэтому поймать только по значению PC не получится. Условие получается такое: начиная с первой встретившейся инструкции "EX (SP), IX" по адресу PC=#9428 и далее все инструкции со всеми регистрами пока управление не перейдет в Бейсик.

Lisitsin
20.03.2011, 21:25
Есть немножко.

Higgins
20.03.2011, 21:54
TRACE_EX_IX_(HL)_1.zip

Имеем следующий код:


#9414 LD IX, #9439
...
#9422 PUSH IX
#9424 LD IX, #2114
#9428 EX (SP), IX ; судя по трейсингу, получаем IX=#9439 -- OK
#942A EX (SP), IX ; получаем IX=#2114 -- OK
#942C POP IX ; а здесь получаем IX=#2139 вместо #9439
#942E NOP
...
#94AC JP IX ; а здесь, естественно, вылетаем в Бейсик

То есть младшую половину POP загружает правильную, а в старшую будто ничего не загружает вообще.

Lisitsin
21.03.2011, 19:48
Прийдётся немного поэксперементировать. Глюк найден серьёзный. Уверен, что это в нём всё дело.
Моя бесконечная благодарность персонально Higgins. Разбираюсь.

Lisitsin
22.03.2011, 17:57
Всех приветствую.
Есть хорошие новости. Глюк устранён, загружается корректно, ROBOCOP научился ходить, ELITE продвинулась, но пока не летает. Jumping Jack заработал. Zexall грузится, но виснет в самом начале тестов.
ROBOCOP: http://www.youtube.com/watch?v=eWriMB0FckI
ELITE: http://www.youtube.com/watch?v=3vIRnnXrpJw
Jumping Jack: http://www.youtube.com/watch?v=wMY9tkJa6RQ

BYTEMAN
22.03.2011, 18:07
Lisitsin, Dominoes заработало?

Lisitsin
22.03.2011, 18:29
Lisitsin, Dominoes заработало?
Заработало.
http://www.youtube.com/watch?v=0GslAEOQjdk

Higgins
22.03.2011, 18:56
Глюк устранён

А в чем была проблема?


ROBOCOP научился ходить

Буква "N" на экранах рисуется с одним и тем же дефектом. При том, что другие буквы выводятся нормально. Значит, образ этой буквы в памяти испорчен. Вопрос в том, появился ли этот дефект в памяти в процессе загрузки или в процессе распаковки и/или перемещений правильно загруженной программы.

Если загрузить ROBOCOP еще раз, будет ли в точности тот же дефект с буквой "N"?

Lisitsin
22.03.2011, 19:38
Приветствую, Higgins. Без вас долго бы искал. Дело в том, что в AVR не хватает регистрового файла (32 РОН) для всех целей эмуляции и приходится использовать регистры пространства ввода-вывода, запись и чтение которых не влияет на общую работоспособность. Для регистровых пар IX и IY я чисто механически выбрал TCNT1H:TCNT1L и OCR1BH:OCR1BL - парные регистры блока таймера - счётчика, чтение которых в AVR имеет свои особенности и оптимизировано для обеспечения чтения обоих байт 16-битного устройства в одном такте. Вот на это я и напоролся. Переназначил IH и IXL на другие регистры ввода-вывода - и всё сразу закрутилось.
В ROBOCOP я замечал искажения текста и раньше. С чем это связано пока не знаю. Бейсик текст выводит нормально. ROBOCOP сейчас загружу ещё раз.

---------- Post added at 19:38 ---------- Previous post was at 19:21 ----------

Некоторые буквы в ROBOCOP с дефектом:
http://www.youtube.com/watch?v=GvnZxR84jrM

Higgins
22.03.2011, 21:27
Некоторые буквы в ROBOCOP с дефектом:

Дефекты при разных загрузках разные. Более того, при смене экранов буква "N" становится все хуже и хуже. Это значит, что скорее всего дело не в загрузке, а в исполнении кода.

Lisitsin
22.03.2011, 21:43
Это значит, что скорее всего дело не в загрузке, а в исполнении кода.
Может его ещё сильнее замучить?

BYTEMAN
22.03.2011, 21:45
Заработало.
http://www.youtube.com/watch?v=0GslAEOQjdk
Это тоже хорошо, но я скидывал ссылку на немного другую версию игры, которая полностью Бейсиковая :)
http://zx.pk.ru/showpost.php?p=367921&postcount=433

Попробуйте загрузить её (вариант 48к). Очень интересно, как заработает она :)

osa
22.03.2011, 21:53
Может его ещё сильнее замучить?
ELITE: http://www.youtube.com/watch?v=au5I39OftIg
Это видео - точная копия уже добавленного ранее видео.
Сожалеем об этом.

Lisitsin
22.03.2011, 21:54
Грузился дважды. Загружается, играет музыка, пишет что подождите, я готовлюсь, пищит и отправляется в бейсик с нулевого адреса.
http://www.youtube.com/watch?v=C96cZWhQAcw
---------- Post added at 21:54 ---------- Previous post was at 21:53 ----------

[/COLOR]
Это видео - точная копия уже добавленного ранее видео.


Упс !
Прошу прощения.

goodboy
22.03.2011, 22:07
я скидывал ссылку на немного другую версию игры, которая полностью Бейсиковая

а чем игра на бейсике отличается от той-же элиты ??? (в плане исполнения)

советую попробовать запустить игрушку mercenary - математики там навалом и всяких операций с учётом разных флагов полно.

BYTEMAN
22.03.2011, 22:12
а чем игра на бейсике отличается от той-же элиты ??? (в плане исполнения)

советую попробовать запустить игрушку mercenary - математики там навалом и всяких операций с учётом разных флагов полно.

Один раз она не загрузилась. Загрузится ли сейчас?

Lisitsin
22.03.2011, 22:21
а чем игра на бейсике отличается от той-же элиты ??? (в плане исполнения)

советую попробовать запустить игрушку mercenary

Висьнет на этом месте:

Lisitsin
22.03.2011, 22:38
Один раз она не загрузилась. Загрузится ли сейчас?

Грузиться грузится. После загрузки уходит в бейсик.

BYTEMAN
22.03.2011, 23:03
Грузиться грузится. После загрузки уходит в бейсик.
А должна запускаться игра... Press any key должно появиться.

Lisitsin
22.03.2011, 23:35
А должна запускаться игра... Press any key должно появиться.

Я там ссылочку давал на #466

BYTEMAN
22.03.2011, 23:48
Уже лучше :)

Lisitsin
23.03.2011, 19:20
Вот ещё одна игрушка - SOLDIER OF LIGHT:
http://www.youtube.com/watch?v=ZziZYG2kna8

---------- Post added at 19:20 ---------- Previous post was at 18:17 ----------

А есть среди нас кто-то, планирующий собрать сей девайс? Или может кто-то уже собирает?

osa
23.03.2011, 19:48
Жду процессора:)

solegstar
23.03.2011, 20:06
тож планирую:)

---------- Post added at 19:06 ---------- Previous post was at 18:54 ----------

печатка и схема в первом сообщении последней редакции???

Lisitsin
23.03.2011, 20:27
Прошивочки для первопроходцев:
Насчёт печати и схемы уже не помню. Скорее всего нет. Кидаю текущие

zorel
23.03.2011, 20:28
Lisitsin, я тоже планирую. Только я бы хотел использовать в качестве клавиатуры обычную спековскую. Что-бы корпус спектрума использовать.

Lisitsin
23.03.2011, 20:35
Lisitsin, я тоже планирую. Только я бы хотел использовать в качестве клавиатуры обычную спековскую. Что-бы корпус спектрума использовать.
Боюсь сие будет трудно. Опрос имеет свою специфику. Если только модифицировать команду IN, и испытания потребуются. Хотя невозможного ничего нет.

solegstar
23.03.2011, 20:35
Lisitsin, будет возможность заказать печатки с покрытием, если достаточное количество желающих наберется? впринципе фоторезистом сделаю, но интереснее было бы иметь печатку заводского производства...

Lisitsin
23.03.2011, 20:42
Lisitsin, будет возможность заказать печатки с покрытием, если достаточное количество желающих наберется? впринципе фоторезистом сделаю, но интереснее было бы иметь печатку заводского производства...

Сие будет трудно. Сам утюгом делаю. Но есть какая-то кантора, называется по-моему РЕЗОНИТ. Делают на заказ. Попробуйте в поисковике набрать ...

BYTEMAN
23.03.2011, 20:45
Lisitsin, я думаю, говорить об изготовлении плат пока что рано... Думаю, там ещё будет не одно изменение.

Lisitsin
23.03.2011, 21:08
Lisitsin, я думаю, говорить об изготовлении плат пока что рано... Думаю, там ещё будет не одно изменение.

Так это процесс очень долгий, практически бесконечный ...

---------- Post added at 21:08 ---------- Previous post was at 20:50 ----------

Вот тут ещё есть вторая часть ROBOCOPa:
http://www.youtube.com/watch?v=68EqwRTNVWs

zorel
24.03.2011, 12:18
Lisitsin, я думаю сейчас, не помешало бы убрать помехи видеопроцессора :)

balu_dark
24.03.2011, 13:36
насчет шрифта в робокопе - а гляньте где он вообще лежит. ощущение что проблема доступа к памяти в определенных адресах.

im2
24.03.2011, 16:39
насчет шрифта в робокопе - а гляньте где он вообще лежит. ощущение что проблема доступа к памяти в определенных адресах.

Шрифт похоже начинается с 5B00, конкретно буква N по адресу 5C00.

Lisitsin
24.03.2011, 17:20
насчет шрифта в робокопе - а гляньте где он вообще лежит. ощущение что проблема доступа к памяти в определенных адресах.

Аппаратно память доступна и чтение / запись корректны. При старте бейсика даже есть коротенький тест всего ОЗУ. Дело в эмуляции.

---------- Post added at 17:20 ---------- Previous post was at 17:18 ----------


Шрифт похоже начинается с 5B00, конкретно буква N по адресу 5C00.

Для выявления глюка нужна программка по-проще.

osa
24.03.2011, 17:29
пошло дело:) я не могу просмотреть, все ли инструкции проходят? или творческий перерыв?:)

Higgins
24.03.2011, 20:02
10 POKE 65349,0
20 PRINT PEEK (65349)


Сейчас эти строки работают как следуют? Если нет, изменилось ли печатаемое значение?


Дело в том, что в AVR не хватает регистрового файла (32 РОН)

Альтернативный набор регистров BC', DE', HL' и AF' тоже в регистрах храните?


я не могу просмотреть, все ли инструкции проходят? или творческий перерыв?

Нужно собраться с мыслями.

Вопрос к Lisitsin: насколько сложно убрать помехи при построении изображения? Я вижу, что помехи есть только если процессор нагружен. И, к слову, почему на разных видео разная контрасность? На скриншотах ROBOCOP, которые я выкладывал разница в контрастности очень заметная.

Lisitsin
24.03.2011, 20:33
Сейчас эти строки работают как следуют? Если нет, изменилось ли печатаемое значение?


Альтернативный набор регистров BC', DE', HL' и AF' тоже в регистрах храните?


Вопрос к Lisitsin: насколько сложно убрать помехи при построении изображения? Я вижу, что помехи есть только если процессор нагружен. И, к слову, почему на разных видео разная контрасность? На скриншотах ROBOCOP, которые я выкладывал разница в контрастности очень заметная.

PRINT PEEK (65349) как давал так и даёт 255. Альтернативный набор регистров храню в регистрах общего назначения. Помехи убрать реально, но прийдётся повозиться. Контрастность изменилась чисто из-за устранения аппаратного дефекта - просто появился красный цвет (припаял резистор). Помехи действительно зависят от частоты обращения центрального процессора к памяти (на данный момент).

Higgins
24.03.2011, 21:28
PRINT PEEK (65349) как давал так и даёт 255

Давайте разберемся с zexfix. Не помню, давал ли я пофикшенную версию или исходную, поэтому на всякий случай прилагаю архив.

Посмотрите, проходит ли управление через PC=#9BEF. Если проходит, нужно сделать трейсинг начиная с этого момента и далее со всеми регистрами. Хотя бы пару тысяч строк.

Lisitsin
24.03.2011, 23:38
Ой. У меня .z80 не конвертируется в аудиоформат. Есть у меня в .tap формате, это он или нет?

balu_dark
24.03.2011, 23:50
Аппаратно память доступна и чтение / запись корректны. При старте бейсика даже есть коротенький тест всего ОЗУ. Дело в эмуляции.

Я просто помню что был прикол с половинками адресов. типа при некоторых операциях один регистр не прогружался. вот и предположил что тут какаято похожая бяка.

Higgins
25.03.2011, 00:19
У меня .z80 не конвертируется в аудиоформат

Прилагаю в .tzx.

Lisitsin
25.03.2011, 00:21
Адрес 9BEF вижу, код в приложении:

Lisitsin
25.03.2011, 00:23
Прилагаю в .tzx.

Сверил. Это он.

Higgins
25.03.2011, 11:12
TRACE_ZEXALL.zip

Здесь прошли все.


Zexall грузится, но виснет в самом начале тестов.

Первая строка тестируется аж 12 минут. Может, вы просто не дождались?

Lisitsin
25.03.2011, 17:19
Запустил ZEXALL заново. Доходит до пятого теста и виснет (по крайней мере часа пол на нём стоит). Первые 4 теста - OK:

Lisitsin
25.03.2011, 19:01
Появилось одно странное явление: при старте бейсика вертикальные полоски (тест RAM) появляются дважды, а раньше - только один раз:

Higgins
25.03.2011, 21:46
Доходит до пятого теста и виснет (по крайней мере часа пол на нём стоит).

Судя по видео, он доходит до шестого теста. Шестой тест идет очень долго. Запускайте на ночь. :)

UPDATE: У меня получилось, что шестой тест идет около ста минут.

Lisitsin
27.03.2011, 08:21
Шестой тест идет очень долго. Запускайте на ночь. :)


Частов за десять доходт сюда: (может по-дольше подождать?)

Но бейсик реально тест памяти два раза делает. Не спроста это. Может трейсинг сделать ему? Интересно, что там после первого теста происходит ...