С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
BASIC был первым языком который я изучил (хотя неполностью; я не знал DEF FN, FN и DIM, как минимум). Изучал в основном исследуя чужие системные программы написанные на нём. Немного помогли книги, но хороших книг у меня не было. Написал на нём даже коммандер. На нём я научился программировать, если это так можно назвать, примерно за 3-4 месяца в возрасте 12 лет. После этого интерес к нему пропал из-за его низкой скорости и ограниченных возможностей. На нём нельзя было сделать то что я хотел, и я понимал что это не из-за моей неспособности, а именно из-за ограничений языка. Например я не мог сделать плавную бегущую строку на бейсике (можно было сделать сдвигающуюся на одно знакоместо; я потом сделал и сдвигающуюся на 1 бит, но для этого пришлось выдрать чужой машинный код который делает этот сдвиг и вызывать его из бейсика в цикле, подставляя символы уже бейсиком). Ну и многие другие эффекты которые я видел на Спектруме и хотел сделать что-то своё аналогичное, но на бейсике это было невозможно. Помню сколько мучений стоило научиться запрещать прерывание программы по BREAK (мне хотелось достичь недоступности исходного кода для пользователя, как это у программ на асме). Короче, бейсик по сравнению с ассемблером был шлаком. Спектрум я тогда бросил практически на год, возможно и потому что изучить ассемблер тогда не удалось - не было хороших книг у меня по нему, а интерес к бейсику пропал из-за исчерпания его возможностей. Ассемблер нельзя изучить просто экспериментами, без литературы, по крайней мере мне не удалось. Бейсик был хорош тем что его легко видеть в чужих программах и его я смог изучить практически не имея литературы, потому что исходный код доступен и легко читаем, в отличие от асма. Сами чужие програмы на бейсике и есть литература по программированию. Спустя год я стал общаться с Diavol (он потом через год станет участником OHG), который меня очень быстро научил ассемблеру (а вот как он его изучил я не знаю). Тогда я помню еще по-началу какое-то время писал алгоритмы на бейсике и потом переводил на асм, потому что это было проще чем писать сразу на асме, но это длилось не долго и потом я научился писать на асме непосредственно. После этого я к бейсику не возвращался никогда и воспоминания у меня о нём, сформированные еще в 12 лет, негативные из-за его скорости и ограниченности. Хотя сейчас понимаю что некоторые его недостатки, такие как доступность исходного кода всем, помогли мне легко освоить программирование практически не имея литературы.
В 1989 (или 90?) году Леонид Ермаков (автор кода для NEXT ROM VIDEO) переделывал для некоторых игр кассетные загрузчики на дисковые. Одна из игрушек (?) стартовала очень интересно: после загрузки блока кода она делала несколько POKE и PEEK в область Бейсика и "сама-собой" запускалась. На мой вопрос, а разве нельзя понять, что же она делает, он грустно ответил: как работает интерпретатор Бейсика никто толком не знает... (полного дизассемблера в тот момент еще удалось найти).
Barmaley_m(29.03.2023)
По-моему в переменных бейсика где-то есть адрес следующей бейсик-инструкции. Может он его и поменял, передав управление на скрытый бейсик (или налету написанный, раз в область кода писалось там), который уже вызвал код через USR. Ну это как бы я попытался сделать если бы мне заказали такое.
Вообще, такого рода вещи были самыми интересными для меня тогда. Интересны потому что загадочны, и эта загадочность манила. Это уже защита по существу. Но конкретно такой я не встречал.
там надо было всего лишь знать что содержится в системных переменных которые меняются.
подменялся адрес обработки ошибки и когда она встречалась происходил переход на тот адрес что подставил пользователь.
....
примерно так работают и все расширения бейсика (beta/mega/laser и.т.д.) собственный обработчик ошибок позволяет добавлять новые команды.
Barmaley_m(29.03.2023), CPLx(24.03.2023)
Совершенно справедливо сказано: после того как Леонид Ермаков вместе со мной собрал свой "Пентагон 48", большим продвижением в изучении Бейсика и TR-DOS стало короткое (буквально одна страничка) описание системных переменных, которое удалось найти через знакомых на радиорынке. Описание (полное) Бейсика и дизассемблер ПЗУ появилось в доступе позднее.
Вероятно, речь идет о защите Bill Gilbert, которая встречалась во многих играх. Там бейсик-загрузчик состоит из двух бейсик-блоков, один короче, второй длиннее. Второй обычно назывался "* Loader *". Там было несколько "невидимых" нулевых строк, состоящих из команд POKE и PEEK, и больше ничего. Понять, как запускается машинный код, для начинающего непросто, но при наличии таблицы системных переменных (у меня она поставлялась в инструкции к компьютеру "Орель БК-08") было возможно.
Команды POKE и PEEK содержали "ложные" адреса - там в тексте стояли одни числа, но бейсик воспринимал другие. После восстановления истинных адресов становится понятно, что из переменной ERR-SP (23613) считывался адрес, где подменялся адрес обработчика ошибок на точку запуска машинного кода. Когда бейсик заканчивал исполнение программы "ошибкой" 0 OK, 0:1, то машинный код и запускался. Ведь с этой точки зрения OK ничем не отличается от прочих ошибок.
Сам машинный код в бейсик-части виден не был, он размещался в области бейсик-переменных.
Но этот трюк был лишь первой ступенью весьма непростой защиты, применявшейся в том загрузчике. Где-то мелькала информация, что эта защита была пародией или развитием знаменитой Speedlock Protection, но я точно не знаю, оригинальный Speedlock никогда не ломал. А по сложности взлома эта защита была для меня самой трудной. Даже загрузчики от Nicolas Rodionov были проще.
Машинный код в этом "* Loader *" содержал сначала несколько сот команд запутанного ассемблера, а потом там была ксорка с регистром R, реализованная примерно так:
LD A,R
XOR (HL)
LD (HL),A
LDI
RET PO
DEC SP
DEC SP
RET PE
Сам цикл крутился по команде RET PE - адрес "возврата" указывал на первую команду цикла. Чисто технически, когда ломал это, я не имел в распоряжении монитора, корректно работающего с регистром R, а инициализировался этот регистр в самом начале "мусорного" кода, расположенного перед циклом. Поэтому было трудно вернуться в бейсик после расксорки.
После первой расксорки была вторая примерно такая же, но попроще, за ней третья. И только после третьей был уже "голый" машинный код собственно загрузчика.
В конце концов в конце 1992г мне удалось практически полностью понять эту защиту, немного усилить ее и сделать на ее базе свой загрузчик для одной из игр.
Отдельного внимания заслуживает первый, более короткий бейсик-блок, который идет на кассете перед "* Loader *". Если просто задать команду LOAD "" и загрузить только "* Loader *" - то он не запустится, а произойдет сбой. Что делает первая бейсик-программа, после которой запускается "* Loader *"? Это очень трудный вопрос. В первой бейсик-программе тоже содержится машинный код. Он запускается явно, но разобраться в нем мне так в те годы и не удалось. Помог случай - попалась более ранняя версия защиты, у которой первый бейсик-блок машинного кода не содержал, но там была команда CLEAR 65535. Как выяснилось, исполнение этой команды позволяет после сброса запускать "* Loader *" непосредственно. Очевидно, машинный код, содержащийся в первом блоке, фактически делал то же самое, что CLEAR 65535, но каким-то странным образом. Как именно - я в те годы так и не разобрался.
В 91-м году добрался я до Спектрума. И да, бейсик - это было интересно. Естественно, PRINT - первый оператор. Потом захотелось сделать титры из Терминатора-1, когда титры печатаются неким курсором, а потом мерцающий фейдаут. Потом подключали гирлянды к порту бордера и управляли из бейсика
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)