Инструменты пользователя

Инструменты сайта


msx:basic_dialogue_programming_language:210

Первая страницаПредыдущая страницаНазад к обзоруСледующая страницаПоследняя страница

2.10. Использование ОЗУ таймера в компьютерах MSX-2

Данный материал получен при активной помощи М.В.Строгова

Когда казалось, что язык 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 хранится текущее время:

  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
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ 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 значимыми являются три младших бита. Его значение «говорит» о следующем:

  • 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
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ 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.

В заключение остается добавить, что

атом так же неисчерпаем, как и компьютер!


Первая страницаПредыдущая страницаНазад к обзоруСледующая страницаПоследняя страница

msx/basic_dialogue_programming_language/210.txt · Последние изменения: 2023-02-05 11:03 — GreyWolf