Данный материал получен при активной помощи М.В.Строгова
Когда казалось, что язык MSX BASIC и все аппаратные средства компьютеров MSX и MSX-2 полностью изучены и описаны, а наша книга уже готовилась к печати, один из авторов совершенно неожиданно обнаружил факты, которые еще не были описаны в советской литературе. Эти факты били обнаружены нами в результате изучения ПЗУ компьютера MSX-2.
Дело в том, что у компьютеров серии MSX-2 имеется так называемая память таймера, в которой хранится информация о том, что должно происходить во время включения или перезагрузки компьютера. (Прежде, чем продолжить дальнейшее чтение, рекомендуем изучить раздел Инициализация в языке MSX-BASIC).
Память таймера состоит из 12 ячеек ПЗУ и 52 ячеек ОЗУ. ПЗУ таймера заполнено нулями и интереса не представляет, в то время, как ОЗУ таймера хранит всю полезную информацию. Размер каждой ячейки—4 бита, т.е. полубайт. Перейдем теперь к рассмотрению содержимого ячеек ОЗУ таймера.
Всю память таймера можно разбить на 4 строки по 16 ячеек в каждой (полубайт)
Строка 0.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ s2│ s1│ m2│ m1│ r2│ r1│ │ D2│ D1│ M2│ M1│ G2│ G1│ X │ 0 │ 0 │ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ └───┬───┘ ПЗУ
В строке с номером 0 хранится текущее время:
Например:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ 8 │ 2 │ 5 │ 4 │ 7 │ 1 │ │ 9 │ 1 │ 0 │ 1 │ 2 │ 1 │ X │ 0 │ 0 │ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ └──┬──┘ └──┬──┘ └──┬──┘ └──┬──┘ └──┬──┘ └──┬──┘ 28 сек. 45 мин 17 часов 19 число 10 месяц 1992 год (октябрь) (12=1992-1980)
Изменяя содержимое этих ячеек, можно получить нестандартное время (например, 35 число 13 месяца)!
Назначение полубайтов с номерами 6 и 13 авторам неизвестно.
Строка 1.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ 0 │ 0 │m2'│m1'│r2'│r1'│ ? │d2'│d1'│ 0 │ ? │ ? │ 0 │X+1│ 0 │ 0 │ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ └───┬───┘ └─┬─┘ └─┬─┘ └───┬───┘ ПЗУ ПЗУ ПЗУ ПЗУ
В этой строке хранится фиксированное время, в которое должен зазвенеть будильник.
Например:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ 0 │ 0 │ 1 │ 5 │ 9 │ 2 │ │ 7 │ 1 │ 0 │ │ │ 0 │X+1│ 0 │ 0 │ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ └──┬──┘ └──┬──┘ └──┬──┘ 51 мин 29 часов 17 число
Назначение полубайтов с номерами 6, 10, 11 и 13 неясно. Известно лишь, что содержимое полубайта 13 на 1 больше содержимого этого же полубайта нулевой строки.
Строка 2.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ 10│adX│adY│SCR│ n2│ n1│ Ци│ Цф│ Цб│KEY│BEP│COL│ 10│x+2│ 0 │ 0 │ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ └───┬───┘ ПЗУ
Если значение ячейки с номером 0 не равно 10, то происходит полная очистка ОЗУ, и новые данные считываются из ПЗУ компьютера. В этом случае инициализация происходит так, как будто Вы вытащили батарейки из компьютера.
В ячейках adX и adY хранится информация о смещении экрана, устанавливаемом командой SET ADJUST (X,Y). При этом:
ЕСЛИ Х<=0 ЕСЛИ Y<=0 ТО adX:=│X│ ТО adY:=│Y│ ИНАЧЕ adX:=16-X ИНАЧЕ adY:=16-Y ВСЕ ВСЕ В ячейке с именем SCR находится следующая информация: 3 2 1 0 ◀── Младший бит ┌───┬───┬───┬───┐ │ │ │ ∗ │ ∗ │ └───┴───┴─▲─┴─▲─┘ └───┬───┘ │ │ │Задаются Неизвестная│ └─ Режим экрана при загрузке (SCREEN 1 или 0)│в команде информация └───── Дрожание экрана (1-дрожит, 0-не дрожит) │ SCREEN
В ячейках n1 и n2 хранится длина строки в шестнадцатеричном виде.
Например: n1=4│ n2=9│ => длина строки =49h=4·16+9=73 символа на экране.
Полубайты с номерами 6, 7 и 8 содержат информацию о цвете изображения, фона и бордюра при загрузке системы.
Ячейка KEY содержит следующую информацию:
3 2 1 0 ◀── Младший бит ┌───┬───┬───┬───┐ │ ∗ │ ∗ │ ∗ │ ∗ │ └─▲─┴─▲─┴─▲─┴─▲─┘ │ │ │ └── 1 - key on, 0 - key off │ │ └────── Отзвук клавиш: 1-есть,0-нет ┐Задаются │ └────────── Принтер: 1 - не MSX, 0 - MSX-принтер │в команде └────────────── Скорость обмена: 1 - 2400 бод, 0 - 1200 бод ┘ SCREEN Содержимое ячейки с именем BEP изменяется командой SET BEEP k1,k2; где: 3 2 1 0 ◀── Младший бит ┌───┬───┬───┬───┐ │ ∗ │ ∗ │ ∗ │ ∗ │ k1 - форма звука (от 1 до 4) └───┴───┴───┴───┘ k2 - громкость (от 1 до 4) └───┬───┘└──┬───┘ k1-1 k2-1
Содержимое ячейки COL следующее:
3 2 1 0 ◀── Младший бит ┌───┬───┬───┬───┐ │ ∗ │ ∗ │ ∗ │ ∗ │ └───┴───┴───┴───┘ └──┬──┘└───┬───┘ Неизвестная Цвет заставки без единицы информация (задается командой SET TITLE)
Назначение содержимого полубайтов с номерами 12, 13 неизвестно.
Вероятно, в строке с номером 2 должна так же хранится информация о форме и размере спрайтов (может быть, в ячейках SCR или COL?).
Строка 3.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │KOD│ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │X+3│ 0 │ 0 │ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ └───┬───┘ ПЗУ
В этой строке хранятся данные для команд
SET TITLE, SET PASSWORD, SET PROMPT
.
В полубайте KOD значимыми являются три младших бита. Его значение «говорит» о следующем:
SET TITLE
;SET PASSWORD
;SET PROMPT
;Приведем пример хранения «подсказки» (PROMPT):
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ 2 │ 15│ 4 │ 11│ 6 │ 8 │ 10│ 9 │ 2 │ 0 │ 0 │ 0 │ 0 │X+3│ 0 │ 0 │ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ └──4Fh─┘└──6Bh─┘└──A8h─┘└──29h─┘└───┬──┘└───┬───┘ ▲ ▲ ▲ ▲ ▲ ▲ │ │ │ │ │ └─── Код 6-го символа │ │ │ │ └──── Код 5-го символа │ │ │ └──── Код 4-го символа │ │ └──── Код 3-го символа │ └──── Код 2-го символа └──── Код 1-го символа
Коды символов хранятся в шестнадцатеричном виде. Если «подсказка» содержит менее 6 символов, то последние полубайты обнуляются. Аналогично,можно так же просмотреть или записать «заголовок» (TITLE
), который появляется при загрузке. Однако у Вас ничего не получится, если Вы таким способом попытаетесь прочесть «пароль» (PASSWORD
), так как он закодирован довольно хитрым способом.
Итак, мы рассказали о том, что и как хранится в памяти таймера. Перейдем теперь к рассказу о том, как получить или проверить эти сведения.
Порты ввода-вывода B4h и B5h «обслуживают ОЗУ таймера.
Думаем, что Вы заметили, что в колонке с номером 13 находится некоторый счетчик (X, X+1, X+2, X+3). Если этот счетчик Вы поместите в другую колонку (что возможно), то Вы не получите нужных данных из ОЗУ таймера.
Пример 1. Приведем теперь программу, позволяющую редактировать или считывать содержимое памяти таймера. Если Вы изменяете строку с номером 0 или 1, то эффект будет заметен после выполнения команд GET TIME
и GET DATE
. Если же Вы изменяете строку с номером 2 или 3,
то проверить результат можно, выполнив перезагрузку компьютера (нажав на кнопку «RESET»).
Если Вы изменили пароль и вдруг забыли его, то не расстраивайтесь, т.к. на этот случай есть клавиши GRAPH и STOP (их нажимают совместно).
Пример 1.
210-01.bas
210-01.bas
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
.
210-02.bas
210-02.bas
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.
В заключение остается добавить, что
атом так же неисчерпаем, как и компьютер!