Техника - молодёжи 1991-10, страница 25![]() шестнадцатеричных чисел, поскольку бейсик-система преобразует их в целочисленные со всеми вытекающими отсюда «отрицательными» последствиями. В этом случае необходимо построить два цикла: первый —с 0 по 32767, второй™с -32767 по -1 (оба с положительным шагом). Второй «подводный камень» касается оператора РОКЕ, поскольку он будет записывать «всякую всячину» не только в экранную область, но и «куда попало» —в область интерпретатора бейсика, в текст самой программы, в ОЗУ ячеек системы. Это препятствие тоже можно обойти, если выводить стандартными средствами бейсика в одно и то же место экрана текущее значение I (25 LOCATE 10,10: PRINT I). Если ПК «завис» по одной из указанных причин, то на экране останется величина этого (или «предэтого») злополучного адреса. После перезагрузки цикл следует повторить, начиная со следующего за ним числа. Так, методом сужения поиска подберемся к экранной области. И наконец, третье: коды символов вашего ПК могут отличаться от общепринятых стандартов ASCII, КОИ-7 или КОИ-8, поэтому сначала постарайтесь определить их самостоятельно, запустив следующую программу: 10 FOR /=0 ТО 255 20 PRINT «КОД»;1;« — ЭТО БУКВА»; CHRS(I) 30 NEXT I Неплохо завести специальную тетрадь, куда вносилась бы вся эмпирически установленная информация о вашем ПК — эти записи потом помогут вам разработать программы с выходом на более быстрые машинные коды и добиться различных эффектов, невозможных в стандартном бейсике. Как уже отмечалось, данные алгоритмы применимы в основном для бытовых ПК. На профессиональных — ОЗУ организовано иначе. Например, память экрана может быть выведена за пределы пользовательского ОЗУ, и управление ею осуществляется чегКз специальный регистр или драйвер, как у ПЭВМ типа СМ. Си схемная и экранная области могут быть заблокированы от прямого доступа из бейсика. На IBM- совместимых ПК, чтобы добраться до экранной области, необходимо сначала установить адрес сегмента, доступный программе (DEF SEG = &hB800: " сегмент нулевой страницы экрана). Кстати, почти у всех профессиональных компьютеров не одна, а несколько экранных областей, и эти области разные: у той же IBM PC/AT/XT - четы ре самостоятельные символьные зоны, которые при переключении режима преобразуются в одну графическую область экрана. У СМ-совместимых — возможны несколько вариантов, например, у КУВТ —три самостоятельные зоны, каждая из которых отвечает за свой цвет, причем они напрямую недоступны пользователю. Но по профессиональным ПЭВМ почти всех типов имеется и обширная литература, поэтому там незачем заниматься подобными изысканиями. ОПРЕДЕЛЕНИЕ АДРЕСОВ ПЗУ И ПОРТОВ ВВОДА/ВЫВОДА было частью первого задания, хотя, по зрелом размышлении, представляет собой совершенно самостоятельную проблему. Но решается похожими способами. • В первую очередь необходимо определить границы ПЗУ. Сделать это можно, записывая определенные коды в различные точки адресного пространства и затем считывая содержимое этих ячеек. Здесь тоже используется цикл с оператором РОКЕ и функцией РЕЕК. Если записанный и считанный коды совпадают, значит, это ОЗУ; если не совпадают — мы наткнулись на ПЗУ. ПЗУ с зашитым в нее монитором (операционной системой), как правило, располагается в самой нижней части памяти (с &hF000 по &hFFFF). Остальная работа по поиску системных подпрограмм сводится к «вылавливанию» кодов перехода на подпрограммы и выхода из них. Нужный код для установленного в ваш ПК микропроцессора следует определить по справочнику, например, для МП580ВМ80А и Z80 код перехода на подпрограмму &hCD adr (десятичное 20: >, где adr — двухбайтовый адрес подпрограммы, а код выхода из подпрограммы — &hC9 (десятичное 201). Обнаружив искомый код, проанализируйте следующие за ним байты, ведь этот код может быть и не командой, а каким-то числом, используемым операцией и лишь случайно похожим на код операции. Рели после ко >гя с^ои^ конкретный огтрес, попа-nwTrr*r> р ючу то ок°г°е оо?го mv близки к пели. Только здегт ну^~то помнить, что двухбайтовые адреса v всех типов ПЭВМ пишутся «наоборот—сначала младший байт, затем старший, например: CD 18 F8, что на языке ассемблера выглядит так: CALL 0F818h ; переход на п/п 0F818 (п/п вывода ; текста на экран у ПЭВМ RADIO 86-RK) Для удобства работы вам понадобится соответствующей инструментарий, например, программа, выводящая DUMP ячеек ОЗУ в шестнадцате- ричном и символьном форматах: 10 INPUT «ВВЕДИТЕ СТАРТОВЫЙ АДРЕС»; А1 20 INPUT «ВВЕДИТЕ КОНЕЧНЫЙ АДРЕС»; А2 30 FOR I — А\ ТО А2 STEP 16 40 PRINT HEX$(I);TAB(5); : REM АДРЕС ОЗУ 50 FOR /=1 TO 16 60 K=PEEK{I+J) 70 PRINT ""; HEXS (K); : РЕМ ЗНАЧЕНИЕ ЯЧЕЙКИ ОЗУ 80 IF К < 32 THEN К$=К$+ " ." ELSE K$=KS + CHRS (К) 90 NEXT J 100 PRINTS " ; KS :PEM СТРОКА СИМВОЛОВ 110 KS=" " 120 NEXT I Определив адреса всех подпрограмм, используемых монитором, попробуйте понять их назначение. Можно воспользоваться «методом математического тыка», то есть запускать анализируемую подпрограмму соответствующей командой (USR adr или аналогичной), pi смотреть, что происходит, но скорее всего — резз^льтат будет нулевой. Ведь подпрограммы используют те или иные числа, находящиеся в регистрах МП или ячейках ОЗУ, а какие — мы еще не знаем. Наиболее надежный путь — продизассем-блировать «подозрительные» участки ПЗУ и разобраться в их алгоритме (вот когда пригодится программа, опубликованная в «ТМ» N 8 за 1990 год). Если в ходе дизассемблирования вы не обнаружите порты ввода/вывода (ассемблерные команды IN п и OUT п), то воспользуйтесь алгоритмом Вадима Пыльцова: 10 DIM Л(30) 20 FOR 9=0 ТО 65535 STEP 30 30 FOR 1=1 ТО 30 40 A{l)=PEEK{B+l) 50 NEXT I 60 FOR 1=1 TO 30 70 IF PEEK(B+l)oA{l) THEN PRINT B+I 80 NEXT I 90 NEXT В Перед запуском программы следует вк/^-тггь магнитофон с какой-либо чягг^гт.ю. ^ограмма проверяет содержимое ячеек и выводит адреса тех из них, содержимое которых поменялось за время прогона первого цикла. Правда, кроме «магнитофонной» ячейки, можно наткнуться и на таймер или ячейку бейсик-системы, следящей за порядком выполнения программы, по их легко отличен ь oi «магнитофонной» по закономерному изменению содержимого. Да и начинать поиск можно по конкретным «подозрительным» точкам ОЗУ. (Окончание следует) 23
|