Занятная находка, авторам защит понравилась бы в свое время. Вместе с находкой про готовность клавиатуры (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-а в документе при описании алгоритмов есть ошибки
Возможно какие-то ошибки. Ну бывает.
Последний раз редактировалось BlaireCas; 04.10.2025 в 16:42.
Шедевр портирования на УКНЦ - игра Highway Encounter
Эмуляторы: UKNCBTL, EmuStudio (респект авторам)
Правильный алгоритм регистровых команд 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, происходит ожидание завершения чтения команды, установка флагов и переход на исполнение только что прочитанной команды. Но счётчик команд стоит не после прочитанной команды, а на ней. В итоге команда исполняется и запускается ещё раз её чтение, ну и исполнение второй раз. Если команда многословная, то сама команда уже является вторым словом.
gid(05.10.2025)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
К вопросу о том мол "да вообще зачем нужен этот movb PC, R0 - судя по сообщениям в телеграме
- а я в демке использовал
- черт понятно демка-то работала только на эмуляторе
Возможно у демомейкеров которые экономят каждое слово такая команда может быть вполне себе востребована. Допустим надо занести в регистр число 10 - ну напиши ты mov #10, R0 - так тут два слова-же. А мы экономим "каждый байт!". И подбором адреса запуска демки и через movb PC, R0 можно занести нужное число в регистр через однословную команду. Но увы, смотря что за ней будет стоять - оно заработает только на эмуляторе.
Шедевр портирования на УКНЦ - игра Highway Encounter
Эмуляторы: UKNCBTL, EmuStudio (респект авторам)
gid(05.10.2025)
Эту тему просматривают: 3 (пользователей: 0 , гостей: 3)