А где обсуждали? Я про это впервые слышу, как-то мимо меня прошло обсуждение.
Добавить эмуляцию бага смогу, если будет его точное описание, желательно на уровне микрокода.
Я ж не знаю какие команды подвержены багу, и как его реализовывать.
Вид для печати
Занятная находка, авторам защит понравилась бы в свое время. Вместе с находкой про готовность клавиатуры (https://forum.maxiol.com/index.php?s...ndpost&p=55014)
Цитата:
Сижу я значит, весьма много лет назад, клепаю на дорогой и любимой БК-шке то-то. И писал я программу для работы с клавиатурой. Проверяю разряд 6 в регистре 177716, там единичка, то есть клавиша нажата. Иду брать код в @#177662, и обламываюсь - там какая-то фигня! Проверяю @#177660 - и правда, бит, который говорит о готовности кода с клавиатуры, не установлен! И только после примерно 50-70 циклов SOB он таки появляется.
В общем, оказывается, что между нажатием клавиши (о чём тут же докладает бит в регистре 177716) и появлением готового кода проходит некоторое время, причём разное для разных экземпляров БКшек, но в пределах одного экземпляра - более-менее стабильное. Сначала об этой находке сделал анонс (Дuck Tales #4) - а потом подумал-подумал, и решил (Дuck Tales #7) не раскрывать детали - чтобы любители делать защиты не приняли это на вооружение.
Как я понимаю, величина задержки определялась конкретными экземплярами D4, R4, C3 и D2 (см. схему), установленными в конкретной машине.
P.S. Честно говоря, поскольку прошло уже 30 лет, не помню, какой из битов взводился первым - бит готовности кода, или бит нажатой клавиши - но факт в том, что между одним и другим проходило некоторое относительно стабильное время, которое можно было засечь).
Пока-что в телеграме. Увы не тут.
Описание - наверное надо идти к vslav читать реверс ВМ1. А так можно просто взять железную БК или ФПГА версию на мистере (там по реверсу сделано). Запустить собственно код, увидеть что вот такие мол дела.
Ну и надеюсь Alex_K или svinka появятся и опишут в чем проблема-с. Алексей сказал что напишет (я сам в этих микрокодах ни бум-бум).
Алексей такое в телеграме написал: У Vslav-а в документе при описании алгоритмов есть ошибки
Возможно какие-то ошибки. Ну бывает.
Правильный алгоритм регистровых команд MOV и MOVB.
Команда MOV:
Команда MOVB:Код:if (dd address mode == 0) &&
(ss address mode == 0)
{
01: A = PC
IR preload start, word read start
if (ss register == PC) ||
(dd register == PC)
01: R12 = PC + 2
else
01: PC = PC + 2;
58: Rd = Rs, assign NZV MJ[NZV]=FSEL(NZV), PSW[NZV]=FSEL(NZV)
if (dd register == PC) ||
(ss register == PC)
11: next instruction
else
{
MCIR poll, wait read
01: next instruction
}
}
else
Регистровые команды всегда запускают предвыборку следующей команды. А уже далее смотрится, если в качестве одного из регистров используется счётчик команд, то увеличение счётчика команд на два не происходит, запись уходит не в PC, а в R12. После исполнения команды так же проверяются используемые регистры, и если среди них есть счётчик команд, то осуществляется переход на чтение некэшированной инструкции (адрес 11). В противном случае проверяются прерывания и при их отсутствии осуществляется переход на исполнение следующей команды.Код:if (dd address mode == 0) && (ss address mode == 0)
{
01: A = PC
IR preload start, word read start
if (ss register == PC) ||
(dd register == PC)
01: R12 = PC + 2
else
01: PC = PC + 2;
58: Rd[7:0] = Rs[7:0], MJ[NZVC]=FSEL(NZVC), MA=MJ
51: if (N) Rd |= 177400
else Rd &= ~177400;
assign NZV MJ[NZV]=FSEL(NZV), PSW[NZV]=FSEL(NZV)
if (dd register == PC)
11: next instruction
else
{
MCIR poll, wait read
01: next instruction
}
}
else
Но в микрокоде исполнения команды MOVB присутствует ещё один шаг с номером 51, который осуществляет знаковое расширение старшего байта. И ошибка состоит в том, что на принадлежность к счётчику команд проверяется только регистр-приёмник, но не источник. В итоге в случае с командой MOVB PC,Rd, где Rd!=PC происходит такой глюк: сразу же запускается чтение в регистр предвыборки следующей команды, но при этом счётчик команд не увеличивается на два. После исполнения команды MOVB, т.к. регистр-источник не проверяется на PC, происходит ожидание завершения чтения команды, установка флагов и переход на исполнение только что прочитанной команды. Но счётчик команд стоит не после прочитанной команды, а на ней. В итоге команда исполняется и запускается ещё раз её чтение, ну и исполнение второй раз. Если команда многословная, то сама команда уже является вторым словом.
К вопросу о том мол "да вообще зачем нужен этот movb PC, R0 - судя по сообщениям в телеграме
- а я в демке использовал
- черт понятно демка-то работала только на эмуляторе
:) Возможно у демомейкеров которые экономят каждое слово такая команда может быть вполне себе востребована. Допустим надо занести в регистр число 10 - ну напиши ты mov #10, R0 - так тут два слова-же. А мы экономим "каждый байт!". И подбором адреса запуска демки и через movb PC, R0 можно занести нужное число в регистр через однословную команду. Но увы, смотря что за ней будет стоять - оно заработает только на эмуляторе.