2.10. И с п о л ь з о в а н и е ОЗУ т а й м е р а в к о м п ь ю т е р а х MSX-2 \/fe Данный материал получен при активной помощи М.В.Строгова \/fn/e Когда казалось, что язык MSX-BASIC и все аппаратные средства компьюте- ров MSX и MSX-2 полностью изучены и описаны, а наша книга уже готовилась к печати, один из авторов совершенно неожидано обнаружил факты, которые еще не были описаны в советской литературе. Эти факты били обнаружены на- ми в результате изучения ПЗУ компьютера MSX-2. Дело в том, что у компьютеров серии MSX-2 имеется так называемая па- мять таймера, в которой хранится информация о том, что должно происхо- дить во время включения или перезагрузки компьютера. (Прежде, чем продол- жить дальнейшее чтение, рекомендуем изучить раздел "Инициализация в язы- ке MSX-BASIC"). Память таймера состоит из 12 ячеек ПЗУ и 52 ячеек ОЗУ. ПЗУ таймера за- полнено нулями и интереса не представляет, в то время, как ОЗУ таймера хранит всю полезную информацию. Размер каждой ячейки - 4 бита, т.е. полу- байт. Перейдем теперь к рассмотрению содержимого ячеек ОЗУ таймера. Всю память таймера можно разбить на 4 строки по 16 ячеек в каждой (по- лубайт) С т р о к а 0. WWWWWWWWWWWWWW 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 XWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWY V s2V s1V m2V m1V r2V r1V V D2V D1V M2V M1V G2V G1V X V 0 V 0 V ZWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWW[ ZWWWRWWW[ В строке с номером 0 хранится т е к у щ е е время: ПЗУ 1) в полубайтах s1 и s2 - с е к у н д ы; 2) в полубайтах m1 и m2 - м и н у т ы; 3) в полубайтах r1 и r2 - ч а с ы; 4) в полубайтах D1 и D2 - д н и; 5) в полубайтах М1 и М2 - м е с я ц; 6) в полубайтах G1 и G2 - г о д (относительно 1980 г.). Например: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 XWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWY V 8 V 2 V 5 V 4 V 7 V 1 V V 9 V 1 V 0 V 1 V 2 V 1 V X V 0 V 0 V ZWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWW[ ZWWRWW[ ZWWRWW[ ZWWRWW[ ZWWRWW[ ZWWRWW[ ZWWRWW[ 28 сек. 45 мин 17 часов 19 число 10 месяц 1992 год (октябрь) (12=1992-1980) Изменяя содержимое этих ячеек, можно получить нестандартное время (на- пример, 35 число 13 месяца)! Назначение полубайтов с номерами 6 и 13 авторам неизвестно. С т р о к а 1. WWWWWWWWWWWWWW 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 XWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWY V 0 V 0 Vm2'Vm1'Vr2'Vr1'V ? Vd2'Vd1'V 0 V ? V ? V 0 VX+1V 0 V 0 V ZWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWW[ ZWWWRWWW[ ZWRW[ ZWRW[ ZWWWRWWW[ ПЗУ ПЗУ ПЗУ ПЗУ В этой строке хранится фиксированное время, в которое должен зазвенеть будильник. Например: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 XWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWY V 0 V 0 V 1 V 5 V 9 V 2 V V 7 V 1 V 0 V V V 0 VX+1V 0 V 0 V ZWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWW[ ZWWRWW[ ZWWRWW[ ZWWRWW[ 51 мин 29 часов 17 число Назначение полубайтов с номерами 6, 10, 11 и 13 неясно. Известно лишь, что содержимое полубайта 13 на 1 больше содержмого этого же полубайта ну- левой строки. С т р о к а 2. WWWWWWWWWWWWWWW 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 XWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWY V 10VadXVadYVSCRV n2V n1V ЦиV ЦфV ЦбVKEYVBEPVCOLV 10Vx+2V 0 V 0 V ZWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWW[ ZWWWRWWW[ ПЗУ Если значение ячейки с номером 0 не равно 10, то происходит полная очи- стка ОЗУ, и новые данные считываются из ПЗУ компьютера. В этом случае ини- циализация происходит так, как будто Вы вытащили батарейки из компьютера. В ячейках adX и adY хранится информация о смещении экрана, устанавлива- емом командой SET ADJUST (X,Y). При этом: ЕСЛИ Х<=0 ЕСЛИ Y<=0 ТО adX:=VXV ТО adY:=VYV ИНАЧЕ adX:=16-X ИНАЧЕ adY:=16-Y ВСЕ ВСЕ В ячейке с именем SCR находится следующая информация: 3 2 1 0 ░WW Младший бит XWWWRWWWRWWWRWWWY V V V O V O V ZWWWQWWWQW▌WQW▌W[ ZWWWRWWW[ V V VЗадаются НеизвестнаяV ZW Режим экрана при загрузке (SCREEN 1 или 0)Vв команде информация ZWWWWW Дрожание экрана (1-дрожит, 0-не дрожит) V SCREEN В ячейках n1 и n2 хранится длина строки в шестнадцатеричном виде. Например: n1=4V n2=9V => длина строки =49h=4G16+9=73 символа на экране. Полубайты с номерами 6, 7 и 8 содержат информацию о цвете изображения, фона и бордюра при загрузке системы. Ячейка KEY содержит следующую информацию: 3 2 1 0 ░WW Младший бит XWWWRWWWRWWWRWWWY V O V O V O V O V ZW▌WQW▌WQW▌WQW▌W[ V V V ZWW 1 - key on, 0 - key off V V ZWWWWWW Отзвук клавиш: 1-есть,0-нет YЗадаются V ZWWWWWWWWWW Принтер: 1 - не MSX, 0 - MSX-принтер Vв команде ZWWWWWWWWWWWWWW Скорость обмена: 1 - 2400 бод, 0 - 1200 бод [ SCREEN Содержимое ячейки с именем BEP изменяется командой SET BEEP k1,k2; где: 3 2 1 0 ░WW Младший бит XWWWRWWWRWWWRWWWY V O V O V O V O V k1 - форма звука (от 1 до 4) ZWWWQWWWQWWWQWWW[ k2 - громкость (от 1 до 4) ZWWWRWWW[ZWWRWWW[ k1-1 k2-1 Содержимое ячейки COL следующее: 3 2 1 0 ░WW Младший бит XWWWRWWWRWWWRWWWY V O V O V O V O V ZWWWQWWWQWWWQWWW[ ZWWRWW[ZWWWRWWW[ Неизвестная Цвет заставки без единицы информация (задается командой SET TITLE) Назначение содержимого полубайтов с номерами 12, 13 неизвестно. Вероятно, в строке с номером 2 должна так же хранится информация о фор- ме и размере спрайтов (может быть, в ячейках SCR или COL?). С т р о к а 3. WWWWWWWWWWWWWW 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 XWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWY VKODV O V O V O V O V O V O V O V O V O V O V O V O VX+3V 0 V 0 V ZWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWW[ ZWWWRWWW[ В этой строке хранятся данные для команд ПЗУ SET TITLE, SET PASSWORD, SET PROMPT . В полубайте KOD значимыми являются три младших бита. Его значение "го- ворит" о следующем: KOD=0 - была выполнена команда SET TITLE; KOD=1 - была выполнена команда SET PASSWORD; KOD=2 - была выполнена команда SET PROMPT; KOD=3 - исходное состояние (эти команды не выполнялись). Приведем пример хранения "подсказки" (PROMPT): 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 XWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWY V 2 V 15V 4 V 11V 6 V 8 V 10V 9 V 2 V 0 V 0 V 0 V 0 VX+3V 0 V 0 V ZWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWW[ ZWW4FhW[ZWW6BhW[ZWWA8hW[ZWW29hW[ZWWWRWW[ZWWWRWWW[ ▌ ▌ ▌ ▌ ▌ ▌ V V V V V ZWWW Код 6-го символа V V V V ZWWWW Код 5-го символа V V V ZWWWW Код 4-го символа V V ZWWWW Код 3-го символа V ZWWWW Код 2-го символа ZWWWW Код 1-го символа Коды символов хранятся в шестнадцатеричном виде. Если "подсказка" со- держит менее 6 символов, то последние полубайты обнуляются. Аналогично, можно так же просмотреть или записать "заголовок" (TITLE), который появля- ется при загрузке. Однако у Вас ничего не получится, если Вы таким спосо- бом попытаетесь прочесть "пароль" (PASSWORD), так как он закодирован до- вольно хитрым способом. Итак, мы рассказали о том, что и как хранится в памяти таймера. Перей- дем теперь к рассказу о том, как получить или проверить эти сведения. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWY V Порты ввода-вывода B4h и B5h "обслуживают ОЗУ таймера. V ZWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW[ Думаем, что Вы заметили, что в колонке с номером 13 находится некото- рый счетчик (X, X+1, X+2, X+3). Если этот счетчик Вы поместите в другую колонку (что возможно), то Вы не получите нужных данных из ОЗУ таймера. П р и м е р 1. Приведем теперь программу, позволяющую редактировать WWWWWWWWWWWWWWW или считывать содержимое памяти таймера. Если Вы изме- няете строку с номером 0 или 1, то эффект будет заметен после выполнения команд GET TIME и GET DATE. Если же Вы изменяете строку с номером 2 или 3, то проверить результат можно, выполнив перезагрузку компьютера (нажав на кнопку "RESET"). Если Вы изменили пароль и вдруг забыли его, то не расстраивайтесь, т.к. на этот случай есть клавиши "GRAPH" и "STOP" (их нажимают совместно). 10 PRINT"_00__01__02__03__04__05__06__07__08__09__10__11__12__13__14__ 15." 20 PRINT: FOR T=0 TO 3 'Смотрим 4 строки памяти 30 OUT &hB4,13 'Номер колонки со счетчиком 40 A=INP(&hB5) 50 A=(A AND &b1100) OR T: OUT &hB5,A 'T - номер с т р о к и 60 FOR N=0 TO 15: OUT &hB4,N 'N - номер с т о л б ц а 70 A=INP(&hB5):A=A AND 15 80 PRINT A;TAB((N+1)*4);:NEXT:PRINT:NEXT 90 INPUT"Строка(0-3),Столбик(0-15),Значение(0-15)";K,L,M 100 IF K=0 AND L=0 AND M=0 THEN END 'Выход в командный режим 110 OUT &hB4,13 120 OUT &hB5,(INP(&hB5) AND &b1100) OR K 130 OUT &hB4,L: OUT &hB5,M 140 GOTO 10 П р и м е р 2. Установка звонка, аналогичного SET BEEP 1,3 . WWWWWWWWWWWWWW 10 'Автор программы: Высотков Д. (II курс КГПИ, 21.10.90) 20 A=&HD000:DEFUSR=&HD000 30 READ A$ 40 IF A$="z" THEN A=USR(0):END 50 POKE A,(VAL("&h"+A$)) 60 A=A+1:GOTO 30 70 DATA 0E,B4:' LD C,&hB4 80 DATA 3E,0D:' LD A,&H0D 90 DATA ED,79:' OUT (C),A 100 DATA 0C :' INC C 110 DATA ED,78:' IN A,(C) 120 DATA E6,0C:' AND 1100B 130 DATA F6,02:' OR 02 140 DATA ED,79:' OUT (C),A 150 DATA 0D :' DEC C 160 DATA 3E,0A:' LD A,&h0A 170 DATA ED,79:' OUT (C),A 180 DATA 0C :' INC C 190 DATA 3E,02:' LD A,02 200 DATA ED,79:' OUT (C),A 210 DATA c9 :' RET 220 DATA z Из значений параметров оператора BEEP A,B (A=1, B=3) получаем число &b0010, где &b00 - это результат операции (A-1), а &b10 - операции (B-1). Полученное двоичное число и используется в строке 190. В заключение остается добавить, что XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWY V атом так же неисчерпаем, как и компьютер! V ZWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW[