Спасибо тебе и твоему эмулятору ;) Феликсу тоже спасибо большое: не давал мне продохнуть, выдавал идеи пачками и про SWAB-ы сразу сказал, но я пропустил мимо ушей.
А искал примерно так же, как доктор Флойд диагностировал HAL. Я почутьчуть сравнивал прогресс в выполнении "PRINT PI" в эмуляторе и в своем компьютере. Сделал брейкпойнты и доступ к R0-R7 и PS через JTAG и сравнивал понемногу. Дело дошло до UNPCK, а в нем SWAB-ы начинаются довольно быстро. Так что основное время ушло на преодоление лени перед реализацией нормальных брехтпунктов и инспектора.
Кстати об эмуляторе, может быть сделать ему клавиатурный ввод с маппингом от писишной клавиатуры? А то совершенно непонятно, как набирать некоторые символы. А вообще -- зачот! Отладочные окна просто супер.
Больше игр нет
Вопрос есть к специалистам по программированию ВМ1: после исполнения каких команд не возникает исключение при нечётном регистре PC? Судя по нескольким программам (тесты, демка Disco Club, Bolder) нечётность PC не проверяется как минимум после JMP. Тоже вопрос: а при всех ли режимах адресации? И как дела обстоят в команде JSR?
---------- Post added at 19:26 ---------- Previous post was at 18:54 ----------
Кажется я понял, в чём дело: на БК вообще не проверялось, чётный ли адрес в регистре PC. Убрал проверку, и всё заработало как надо, и Bolder, и Disco Club. В демке, кстати, эта фича используется для организации цикла с количеством повторений 2 раза. А я-то блин думал!!? Зачем там используется команда INC PC? И как это работает?
А я-то наивно надеялся, что эти хаксоры хотя бы БК оставили в покое.
И что именно происходит, когда выполняется переход по нечетному адресу?
Больше игр нет
Ничего особенного. Считываются же слова, а при этом младший бит не используется. Интересно получается, когда INC PC второй раз исполняется - следующее за ней слово пропускается
Как это -- "второй раз"?
Больше игр нет
Например в цикле, или просто в программе несколько команд INC PC. В той же деме Disko Club есть такой код: сначала идёт тело цикла, потом INC PC, затем переход на начало цикла. Первый раз выполнится переход, а второй раз INC PC перепрыгнет команду перехода
Я никак не могу понять, как INC PC отличает первый раз от второго. Есть какое-то скрытое внутреннее состояние?
Больше игр нет
При чтении слова не учитывается самый младший бит в адресе, т.е. чтение по адресу 1000 и 1001 - читается одна и та же ячейка.
А теперь пример кода:
Когда код исполняется первый раз, то адреса четные. Процессор читает по адресу 1020 команду INC PC. После чтения команды счетчик команд становится равным 1022. При исполнении команды счетчик команда уже будет равен 1023. Но по чтению 1023 и 1022 - одно и то же. Читается команда BR 1000, сначала счетчик команд после чтения команды равен 1025, а после исполнения - 1001. Команды перехода осуществляют переход вперед/назад на +127/-128 слов максимум. Переход осуществляется словами, а в команде записано смещение. В данном примере ее код 766, т.е. переход на -12(8) слов, исполняется команда 1025-12*2=1001, поэтому переход происходит в данном случае по нечетному адресу. Далее весь код исполняется в нечетных адресах, но т.к. по чтению четные и нечетные адреса равны, то ничего особенного не происходит до исполнения команды INC PC. При чтении этой команды счетчик команд становится равным 1023 и указывает на команду BR 1000. Но вот при исполнении счетчик команд увеличивается на единицу и становится равным 1024, а этот адрес уже указывает на команду после BR 1000. Вот таким хитрым способом удается сделать двойной цикл.Код:1000: ... ... 1020: INC PC 1022: BR 1000 1024: ...
Всё, понял. Спасибо за развернутое объяснение!
Больше игр нет
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)