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

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


msx:msx2_technical_handbook:oleg_shamshura:oleg_shamshura

MSX2 Technical Handbook, перевод Олега Шамшура

MSX2 Technical Handbook , перевод Олега Шамшура, 1989-1990.

Исходные файлы

Глава 1

MSX2 TECHNICAL HANDBOOK, CHAPTER 1



               О Б З О Р   С И С Т Е М Ы   M S X

     Стандарт MSX2 был спроектирован с учетом полной совместимос-
ти с MSX1, однако в MSX2 немало усовершенствований. Глава 1  зна-
комит с новыми понятиями MSX2 и демонстрирует его блочную  струк-
туру и стандартные таблицы. Хотя эта информация носит обобщенный,
концептуальный характер, она необходима для правильного понимания
того, о чем будет говориться в томе 2 и далее.



1. ОТ MSX1 К MSX2

     Начнем с того, что вспомним исходные цели и задачи стандарта
MSX, а затем подведем итоги пути от MSX1 к MSX2.



1.1 Что такое MSX ?

     MSX был объявлен осенью 1983 как новый стандарт для  8-бито-
вых компьютеров. В те времена термин "совместимость" понимался не
совсем верно, что приводило к недоразумениям, будто MSX  способен
исполнять программы, предназначенные для других компьютеров. Пос-
кольку MSX мог работать только с программами для MSX, стали появ-
ляться утверждения, что он ничем не отличается от серий PC  (NEC)
или FM (Fujitsu), которые тоже могли работать с программами толь-
ко в своем собственном формате.

     Персональные компьютеры стали популярными всего за несколько
лет. Если сначала лишь искушенные энтузиасты покупали себе компь-
ютеры (которые были сложны в эксплуатации и, конечно, несовмести-
мы между собой), паяли в них что-то и удовлетворялись их изучени-
ем, то теперь применение компьютеров значительно расширилось, ох-
ватив различные классы пользователей. Иными словами, персональный
компьютер превратился в "предмет повседневности", подобно телеви-
зору или кассетной магнитоле. Следствием этого и явилась проблема
совместимости. Действительно, только представьте: если бы  каждой
телевизионной станции требовался какой-то особенный телевизор или
каждый магнитофон работал только с собственной лентой, - стали бы
они популярными ? Очевидно, компьютерные программы, как и  всякие
домашние электрические изделия, должны быть совместимыми.

     Этой проблемой занялась группа разработчиков MSX.  Поскольку
мощность компьютера напрямую зависит от его гибкости и способнос-
ти к расширению, "полная и окончательная" стандартизация  формата
была признана непрактичной: слишком многое пришлось бы узаконить,
да и "железо" постоянно улучшается. По этой причине MSX фиксирует
наиболее фундаментальные аспекты аппаратуры и программного  обес-
печения, такие как DOS, BASIC и аппаратная шина, служащая основой
для расширения системы. Пока компьютер используется самостоятель-
но и не взаимодействует с другими машинами, проблема невелика. Но
если предполагается, что он будет подключен к периферии  для  на-
копления и обработки данных, все основные форматы необходимо  за-
фиксировать. К счастью, стандарт MSX был одобрен многими компани-
ями, производящими домашнее электрооборудование, и укрепился дос-
таточно быстро. Это сделало систему широко известной, так что те-
перь достаточно широкий круг фирм получил  возможность  выпускать
периферийное оборудование, совместимое с MSX.

     К наиболее полезным особенностям, включенным в систему  MSX,
можно отнести BCD-арифметику удвоенной точности и формат  файлов,
заимствованный у MS-DOS. Реальная совместимость MSX-машин базиру-
ется на использовании ряда внутренних полей (таблиц,  описывающих
конфигурацию конкретной машины - прим.перев.).



1.2 Среда MSX

     К декабрю 1985 было продано свыше миллиона MSX-машин,  кото-
рые используются, главным образом, для игр или ознакомления в на-
чальной школе. Однако применение MSX постепенно  распространяется
и на такие области, как обработка японских текстов, автоматизация
производства, коммуникационные терминалы, аудиовизуальное  управ-
ление. Для развития возможностей MSX подготовлена дисковая систе-
ма MSX-DOS, разработаны языки LOGO, FORTH, C.
     Были развиты BIOS, которая представляет собой набор подпрог-
рамм ввода-вывода в BASIC-ROM, и BDOS, которая расположена в  ROM
дискового интерфейса и совместима с системными вызовами CP/M. Та-
ким образом, созданы все необходимые условия для разработки вели-
колепного программного обеспечения. Ввод иероглифов, световое пе-
ро, мышь и интерфейс RS-232C  уже  стандартизованы;  продолжается
работа над стандартизацией остальной периферии. Клавиатура и сим-
вольный набор совпадают с международным стандартом, с минимальны-
ми вариациями для удовлетворения нужд отдельных стран.

     Разработана всевозможная периферия:  стандартные  устройства
(принтеры, дисководы, мыши), аудиовизуальные устройства (лазерные
дисководы, видеомагнитофоны,  контроллеры  синтезаторов,  системы
приема телесигнала), приборы для автоматизации производства (кон-
троллеры роботов, датчики температуры, разнообразные адаптеры для
модемов и телефонных линий). Разработан даже контроллер здоровья,
объединенный с измерителем кровяного давления. Таким образом,  Вы
сами можете убедиться, что потенциал MSX-компьютеров действитель-
но возрос.

     Не только игры, но и многие серьезные разработки поставляют-
ся на дисках и находят все большее применение. В их числе и япон-
ские текстовые процессоры с форматированием, и базы данных, кото-
рые могут обмениваться информацией с системами высокого уровня, и
всевозможные CAI и CAD.



1.3 Расширение MSX2

     Стандарт MSX2 был анонсирован в мае 1985 как система,  кото-
рая обладает полной совместимостью с MSX снизу вверх.  Программы,
разработанные в среде MSX, можно исполнять на MSX2 без какой-либо
модификации, даже на уровне ассемблера. Любые данные и программы,
сохраненные на кассетах и дисках, могут использоваться без  изме-
нений. Возможности, развитые в системе MSX2, - это высокая разре-
шающая способность дисплея, богатая цветовая палитра и ускоренная
графика. Добавлены энергонезависимые часы и RAM-диск. В этом  ру-
ководстве обозначение "MSX2" относится к компьютерам, выполненным
в стандарте MSX2, а обозначение "MSX1" относится к компьютерам  в
стандарте MSX.

     Конфигурация системы показана на рисунках 1.1 и 1.2 и в таб-
лице 1.1, которые демонстрируют различия между MSX1 и MSX2.  Раз-
личия следующие:


     Таблица 1.1 Сравнение стандартов MSX2/MSX1
                 ┌─────────────────────────┬─────────────────────────┐
                 │          MSX2           │           MSX1          │
┌────────────────┼─────────────────────────┴─────────────────────────┤
│ Процессор      │       Z80A или эквивалент (3.579545 МГц ± 1%)     │
├────────┬───────┼─────────────────────────┬─────────────────────────┤
│        │       │ 48K (MSX-BASIC ver 2.0) │ 32K (MSX-BASIC ver 1.0) │
│        │  ПЗУ  │       MAIN-ROM 32K      │       MAIN-ROM 32K      │
│        │       │        SUB-ROM 16K      │                         │
│ Память ├───────┼─────────────────────────┼─────────────────────────┤
│        │  ОЗУ  │ 64K и более             │ 8K и более              │
│        ├───────┼─────────────────────────┼─────────────────────────┤
│        │ Видео │ 64К или 128К            │ 16К                     │
├────────┴───────┼─────────────────────────┼─────────────────────────┤
│ Видеопроцессор │ V-9938 (MSX-VIDEO)      │ TMS9918 или эквивалент  │
├────────────────┼─────────────────────────┴─────────────────────────┤
│ Кассета        │            Скорость обмена 1200/2400 бод          │
├────────────────┼───────────────────────────────────────────────────┤
│ Звукогенератор │      8-октав 3-канала (совместим с AY-3-8910)     │
├────────────────┼───────────────────────────────────────────────────┤
│ Клавиатура     │     Алфавитно-цифровые и графические символы      │
├────────────────┼───────────────────────────────────────────────────┤
│ Диск (∙)       │           Базируется на формате MS-DOS            │
├────────────────┼─────────────────────────┬─────────────────────────┤
│ Принтер        │ 8-битовый параллельный  │ (∙)                     │
├────────────────┼─────────────────────────┴─────────────────────────┤
│ Сменные ПЗУ    │   Шина ввода-вывода, Слоты для игр и расширения   │
├────────────────┼─────────────────────────┬─────────────────────────┤
│ Джойстик       │ 2                       │ 1 или 2 (∙)             │
├────────────────┼─────────────────────────┼─────────────────────────┤
│ Часы           │ Стандартно              │ (∙)                     │
├────────────────┼─────────────────────────┼─────────────────────────┤
│ RAM-диск       │ Стандартно              │ Зависит от изготовителя │
└────────────────┴─────────────────────────┴─────────────────────────┘
(∙) - необязательно



     Рисунок 1.1 Конфигурация системы MSX2


1. Минимальная

Звук вв/выв┐ Видео вв/выв  Принтер вв/выв  Слот катриджа x 1
           │ ┌─┴──────────────┴─────────────│───┐
           └─┤ Z80A                         │   │
Джойстик x 2 ┤ ROM 48K                      ┌┐  │
             │ RAM 64K                      ││  │
             │ VDP V9938 VRAM 64К           ││  │
┌──────────┐ │ PPI PSG ┌────────────┐       ││  │
│ Кассета  ├─┤         │ Клавиатура │       └┘  │
└──────────┘ └─────────┴────────────┴───────────┘


2. Поддерживается программным обеспечением

                                      ┌ Свет.перо,Наложение, Оцифровка
Звук вв/выв┐Видео вв/выв Принтер вв/выв Слот катриджа x 3
           │ ┌─┴──────────────┴───────┴─────│───┐
           └─┤ Z80A                       ┌ ┼ ┐ │ Расширенный слот x 4
Джойстик x 2 ┤ ROM 48K                    ┌┐┌┐┌┐│ ┌┐┌┐┌┐┌┐
Трекбол      │ RAM 64K                    │││││││ ││││││││
Мышь         │ VDP V9938 VRAM 128K        │││││││ ││││││││
┌──────────┐ │ PPI PSG ┌────────────┐     │││││││ ││││││││
│ Кассета  ├─┤         │ Клавиатура │     └┘└┘└┘│ └┘└┘└┘└┘
└──────────┘ └─────────┴────────────┴───────────┘



     Рисунок 1.2 Конфигурация системы MSX1


1. Минимальная

Звук вв/выв┐  Видео вв/выв              Слот катриджа x 1
           │ ┌─┴────────────────────────────│───┐
           └─┤ Z80A                         │   │
Джойстик x 1 ┤ ROM 32K                      ┌┐  │
             │ RAM 8K                       ││  │
             │ VDP TMS9918 VRAM 16K         ││  │
┌──────────┐ │ PPI PSG ┌────────────┐       ││  │
│ Кассета  ├─┤         │ Клавиатура │       └┘  │
└──────────┘ └─────────┴────────────┴───────────┘


2. Поддерживается программным обеспечением

Звук вв/выв┐ Видео вв/выв Принтер вв/выв Слот катриджа x 3
           │ ┌─┴──────────────┴─────────────│───┐
           └─┤ Z80A                       ┌ ┼ ┐ │ Расширенный слот x 4
Джойстик x 2 ┤ ROM 32K                    ┌┐┌┐┌┐│ ┌┐┌┐┌┐┌┐
             │ RAM 64K                    │││││││ ││││││││
             │ VDP TMS9918 VRAM 16K       │││││││ ││││││││
┌──────────┐ │ PPI PSG ┌────────────┐     │││││││ ││││││││
│ Кассета  ├─┤         │ Клавиатура │     └┘└┘└┘│ └┘└┘└┘└┘
└──────────┘ └─────────┴────────────┴───────────┘



* MSX-BASIC

     BASIC тоже был расширен с версии 1.0 до версии 2.0, чтобы он
мог обслуживать новый видеопроцессор, увеличенное ОЗУ, часы и пр.
Совместимость с MSX1 полностью сохранена. При работе с новыми ре-
жимами экрана будьте внимательны, указывая координаты,  поскольку
в MSX2 они слегка отличаются.


* Память (ПЗУ, ОЗУ, Видео)

     MSX2 имеет три типа памяти: ROM, RAM, VRAM (постоянную, опе-
ративную и видео), которые описаны ниже.


* ROM

     Стандартный размер ROM 48К. ROM MSX занимает только 32К. До-
бавочные 16 Кбайт в MSX2 содержат процедуры, поддерживающие новые
функции.
     "MAIN-ROM" состоит из 32К и включает интерпретатор языка BA-
SIC, a "расширенная ROM" (или "SUB-ROM") состоит из 16 килобайт и
содержит процедуры для новых функций.


* RAM

     Стандартный размер RAM 64К, что достаточно для  функциониро-
вания MSX-DOS. В MSX размер RAM колеблется от 8К до 64К, т.е. за-
частую работать с большими программами без расширения RAM  невоз-
можно. В MSX2 такой проблемы нет.


* VRAM

     Чтобы эффективно использовать вновь добавленные функции гра-
фики, необходимы по меньшей мере 64 К видеопамяти, что  в  четыре
раза больше, чем на MSX1, который имел только 16 К. На  самом  же
деле, на многих компьютерах устанавливается VRAM размером 128К, а
это уже в восемь раз больше! Такие машины способны высветить  256
цветов одновременно.

     MSX-машины, которые имеют VRAM 64К и не могут быть расширены
до 128К, маркируются в каталогах или на упаковках "VRAM 64K".


* VDP (Видеопроцессор)

     На компьютерах серии MSX для управления экраном используется
видеопроцессор (микросхема типа LSI). На MSX1 применялся TMS9918;
на MSX2 установлен MSX-VIDEO V-9938, который полностью  совместим
с TMS9918 и может исполнять его программы без всякой модификации.

     В таблице 1.2 приведен стандарт VDP, в  таблице  1.3  описан
каждый режим экрана. V9938 - это превосходная микросхема, способ-
ная производить оцифровку, совмещение и аппаратный скроллинг изо-
бражения. Все это подробно описано в главе 4.


     Таблица 1.2 Спецификации VDP
                   ┌──────────────────┬──────────────────┐
                   │      V-9938      │      TMS9918     │
┌──────────────────┼──────────────────┼──────────────────┤
│ Режимы экрана    │ 10 (таблица 1.3) │ 4                │
├──────────────────┼──────────────────┼──────────────────┤
│ Количество точек │  512 x 212 макс  │                  │
│ (горизонтальное x│ 428 по вертикали │  256 x 192 макс  │
│   вертикальное)  │в режиме interlace│                  │
├─────┬────────────┼──────────────────┼──────────────────┤
│     │  на выбор  │   512 максимум   │    16 максимум   │
│Цвета├────────────┼──────────────────┼──────────────────┤
│     │одновременно│   256 максимум   │    16 максимум   │
├─────┴────────────┼──────────────────┴──────────────────┤
│ Набор символов   │       256 символов 8x8 точек        │
├──────────────────┼──────────────────┬──────────────────┤
│ Цвета спрайтов   │ 16 на спрайт макс│ 1 на спрайт      │
├──────────────────┼──────────────────┼──────────────────┤
│ Смена палитры    │       есть       │        нет       │
└──────────────────┴──────────────────┴──────────────────┘


     Таблица 1.3 Экранные режимы V9938
┌──────────────┬─────────┬───────────┬────────────┬─────────┐
│ Режим        │ Символы │   Точки   │    Цвета   │ Спрайты │
├──────────────┼─────────┼───────────┼────────────┼─────────┤
│∙Текст 1      │ 40 x 24 │           │   2 из 512 │ нет     │
├──────────────┼─────────┼───────────┼────────────┼─────────┤
│ Текст 2      │ 80 x 24 │           │   4 из 512 │ нет     │
├──────────────┼─────────┼───────────┼────────────┼─────────┤
│∙Многоцветный │         │  64 x 48  │  16 из 512 │ режим 1 │
├──────────────┼─────────┼───────────┼────────────┼─────────┤
│∙Графика 1    │ 32 x 24 │           │  16 из 512 │ режим 1 │
├──────────────┼─────────┼───────────┼────────────┼─────────┤
│∙Графика 2    │         │ 256 x 192 │  16 из 512 │ режим 1 │
├──────────────┼─────────┼───────────┼────────────┼─────────┤
│ Графика 3    │         │ 256 x 192 │  16 из 512 │ режим 2 │
├──────────────┼─────────┼───────────┼────────────┼─────────┤
│ Графика 4    │         │ 256 x 212 │  16 из 512 │ режим 2 │
├──────────────┼─────────┼───────────┼────────────┼─────────┤
│ Графика 5    │         │ 512 x 212 │   4 из 512 │ режим 2 │
├──────────────┼─────────┼───────────┼────────────┼─────────┤
│ Графика 6    │         │ 512 x 212 │  16 из 512 │ режим 2 │
├──────────────┼─────────┼───────────┼────────────┼─────────┤
│ Графика 7 ∙∙ │         │ 256 x 212 │ 256 из 256 │ режим 2 │
└──────────────┴─────────┴───────────┴────────────┴─────────┘
∙  Возможен в MSX1 (но палитра - только в V9938)
∙∙ Смена палитры невозможна



* Энергонезависимые часы

     Питаемая от батареи память, подключенная к порту ввода-выво-
да, служит для хранения долгосрочных установок и для отслеживания
даты и времени. Установочная информация задает цвет и режим экра-
на при сбросе или включении компьютера. Это позволяет указать же-
лаемый режим при загрузке системы.
     Микросхема часов работает независимо от  основного  питания,
поэтому единожды установленное время не требует  корректировки  в
дальнейшем.


* RAM-диск

     На машинах MSX1, которые имеют 64К RAM, в режиме BASICа  ис-
пользуются всего 32К. Остальные 32К не работают, поскольку их ад-
ресное пространство занято интерпретатором. На машинах серии MSX2
неиспользованное пространство можно рассматривать  как  RAM-диск.
Эта возможность может оказаться весьма ценной для  пользователей,
не имеющих дисковода.
MSX2 TECHNICAL HANDBOOK, CHAPTER 1


2. ОБЗОР СИСТЕМЫ MSX2

     В этом разделе дается простейший обзор программной  и  аппа-
ратной частей системы MSX2. Чтобы помочь Вам понять основную кон-
цепцию, в ПРИЛОЖЕНИИ находятся диаграммы и таблицы, которые  при-
годятся  при  разработке  программ:  карта   видеопамяти,   карта
ввода/вывода, интерфейсный стандарт и пр.



2.1 Обзор аппаратной части

     Прежде всего, ознакомьтесь с блочной диаграммой  на  рисунке
1.3 для усвоения аппаратной конфигурации MSX2, как целого.



2.1.1 Карта адресов

* Карта памяти

     MSX2 имеет три вида памяти: MAIN-ROM, SUB-ROM и RAM.  Каждый
вид располагается в отдельном, независимом адресном пространстве,
как показано на рис.1.4 (1) (такое 64-Кбайтное пространство назы-
вается СЛОТ и состоит из четырех "страниц" по 16К). На  рис.  1.4
(2) и (3) демонстрируется использование памяти в режимах BASIC  и
MSX-DOS соответственно.
     Кроме того, существуют стандарты VRAM  и  ввода/вывода.  Они
находятся в ПРИЛОЖЕНИИ.


     Рисунок 1.3  Блочная диаграмма MSX2

┌────────────────────────────┐
│ Центральный процессор Z80A │
└────┬───────────────────────┘
     │ ┌───┐ ┌─────────────────────────────┐
     ├─┤   ├─┤ ПЗУ 48K (MSX-BASIC ver 2.0) │
     │ │ С │ └─────────────────────────────┘
     │ │   │ ┌──────────────────┐
     │ │ Л ├─┤ Основное ОЗУ 64K │
     │ │   │ └──────────────────┘
     │ │ О │ ┌ ─ ─ ─ ─ ┐ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
     │ │   ├─┤  Мэппер ├─┤ Дополнительное ОЗУ от 64K до 4M │
     │ │ Т │ └ ─ ─ ─ ─ ┘ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘
     │ │   │ ┌ ─ ─ ─ ─ ─ ┐ Ввод / вывод (Диск, RS-232C)
     │ │   ├─┤  катридж  │ Дополнительное ОЗУ
     │ └───┘ └ ─ ─ ─ ─ ─ ┘ Сменное ПЗУ
     │                     Блок расширения слота, и т.д.
     │
     │ ┌──────────────────────────────┐ ┌──── Джойстик (ввод)
     ├─┤ Звукогенератор PSG AY-3-8910 ├─┤
     │ └──────────────────────────────┘ └──── Звук (вывод)
     │ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
     ├─┤ Синтезатор  MSX-AUDIO ├─┤ Аудио-ОЗУ до 256K │
     │ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘
     │ ┌─────────────────────┐
     ├─┤ Кассетный Интерфейс ├ ─ ─ ─ Кассета
     │ └─────────────────────┘
     │ ┌────────────────────┐
     ├─┤ Интерфейс Принтера ├ ─ ─ ─  Принтер
     │ └────────────────────┘
     │ ┌───────────────────────┐
     ├─┤ Батарейное ОЗУ + часы │
     │ └───────────────────────┘
     │ ┌───────────┐   ┌────────────┐
     ├─┤ PPI 8255A ├─┬─┤ Клавиатура │
     │ └───────────┘ │ └────────────┘
     │               │ ┌────────────────────┐
     │               └─┤ Управление Слотами │
     │                 └────────────────────┘
┌────┴─────────────────────┐
│ Видеопроцессор MSX-VIDEO ├──────────── RGB/Video/RF Выход
└────┬─────────────────────┘
     │ ┌──────────┬ ─ ─ ─ ─ ┬ ─ ─ ─ ─ ─ ─ ─ ─ ┐
     ├─┤ VRAM 64K │ VRAM 64K│ Расширение  RAM │
     │ └──────────┴ ─ ─ ─ ─ ┴ ─ ─ ─ ─ ─ ─ ─ ─ ┘
     │ ┌ ─ ─ ─ ─ ─ ┐
     ├─┤ Наложение ├────┬──────── Ввод Видео
     │ └ ─ ─ ─ ─ ─ ┘    │
     │ ┌ ─ ─ ─ ─ ─ ┐    │
     └─┤ Оцифровка ├────┘
       └ ─ ─ ─ ─ ─ ┘

ПРИМЕЧАНИЕ: Пунктирные линии представляют дополнительные  устрой-
	    ства.



     Рисунок 1.4  Стандарт памяти MSX2

(1) Физическое расположение стандартных фрагментов памяти

           (a)          (b)          (c) 
        MAIN-ROM      SUB-ROM      64K-RAM  |    Режим   |   Режим
          СЛОТ         СЛОТ         СЛОТ    |    BASIC   |   MSXDOS
0000H ┌──────────┐ ┌──────────┐ ┌──────────┐|┌──────────┐|┌──────────┐ 
      │          │ │          │ │          │|│          │|│          │
Стр.0 │ MAIN-ROM │ │  SUB-ROM │ │    RAM   │|│ MAIN-ROM │|│    RAM   │
      │    [1]   │ │    [3]   │ │    [4]   │|│    [1]   │|│    [4]   │
4000H ├──────────┤ ├──────────┤ ├──────────┤|├──────────┤|├──────────┤ 
      │          │ │          │ │          │|│          │|│          │
Стр.1 │ MAIN-ROM │ │          │ │    RAM   │|│ MAIN-ROM │|│    RAM   │
      │    [2]   │ │          │ │    [5]   │|│    [2]   │|│    [5]   │
8000H ├──────────┤ ├──────────┤ ├──────────┤|├──────────┤|├──────────┤ 
      │          │ │          │ │          │|│          │|│          │
Стр.2 │          │ │          │ │    RAM   │|│    RAM   │|│    RAM   │
      │          │ │          │ │    [6]   │|│    [6]   │|│    [6]   │
C000H ├──────────┤ ├──────────┤ ├──────────┤|├──────────┤|├──────────┤ 
      │          │ │          │ │          │|│          │|│          │
Стр.3 │          │ │          │ │    RAM   │|│    RAM   │|│    RAM   │
      │          │ │          │ │    [7]   │|│    [7]   │|│    [7]   │
FFFFH └──────────┘ └──────────┘ └──────────┘|└──────────┘|└──────────┘ 

ПРИМЕЧАНИЕ: а) Четыре страницы RAM (с 4 по 7) не всегда
               находятся в одном слоте.
            б) В определенных случаях в режиме BASIC [1]
               заменяется на [3] (на SUB-ROM).


Рисунок 1.5  Карта MAIN-ROM       Рисунок 1.6  Карта SUB-ROM

0000H ┌────────────┐              0000H ┌────────────┐
      │ Входы BIOS │                    │ Входы BIOS │
015CH ├────────────┤              01FDH ├────────────┤
      │ Добавочные │                    │ Управление │
      │ входы BIOS │                    │   слотами  │
017AH ├────────────┤              0336H ├────────────┤
      │    пусто   │                    │BASIC и BIOS│
01B5H ├────────────┤              3FFFH └────────────┘
      │    BASIC   │
7FFDH ├────────────┤
      │ Входы BDOS │
      ├────────────┤


Рисунок 1.7  Карта области MAIN-RAM

0000H ┌──────────────────────────┐
      │ Пространство под RAMDISK │
8000H ├──────────────────────────┤
      │ Пользовательская область │
F380H ├──────────────────────────┤
      │     Системная область    │
FD9AH ├──────────────────────────┤
      │  Область ловушек (HOOKs) │
FFCAH ├──────────────────────────┤
      │ Вызов расширенного BIOSа │
FFCFH ├──────────────────────────┤
      │    ловушки управления    │
FFD4H ├       прерываниями       ┤
      │    для диска и RS-232C   │
FFD9H ├──────────────────────────┤
      │ Рабочая область  RS-232C │
FFE7H ├──────────────────────────┤
      │ Зона новых регистров VDP │
FFF7H ├──────────────────────────┤
      │   Адрес слота MAIN-ROM   │
FFF8H ├──────────────────────────┤
      │          резерв          │
FFFCH ├──────────────────────────┤
      │   Регистр выбора слота   │
FFFFH └──────────────────────────┘




2.1.2 Стыковка с периферией

     Стыковка MSX2 с периферией стандартизована до мелочей.

     Ниже следует список стандартных интерфейсов:

	* Дисплейный интерфейс
	* Звуковой интерфейс
	* Кассетный интерфейс
	* Многоцелевой интерфейс ввода/вывода
	* Интерфейс принтера

     Интерфейс принтера был необязательным в MSX, однако он стан-
дартен для MSX2.

     Интерфейс дисковода остается пока дополнительным, хотя может
рассматриваться как элемент стандартных  спецификаций,  поскольку
MSX2 имеет 64К RAM.

     Подробную информацию о спецификациях катриджей см. в  ПРИЛО-
ЖЕНИИ.



2.2 Обзор программного обеспечения

     MSX2 имеет две программных среды: режим BASIC и  режим  DOS.
MSX-BASIC значительно облегчает разработку и исполнение  программ
и применяется большинством пользователей. Основной мотив все воз-
растающей популярности компьютеров - легкость в эксплуатации.

     DOS обеспечивает различные языки, утилиты и прочие разработ-
ки. Под управлением DOS большинство программ может исполняться на
разных машинах, поскольку аппаратные различия компьютеров компен-
сируются программным путем. Это позволяет пользователю эффективно
работать с накопленными программными ресурсами. MSX-DOS использу-
ет тот же формат дисков, что и популярная на 16-битовых ЭВМ  сис-
тема MS-DOS. Вам следует помнить о том, что программное обеспече-
ние, созданное под CP/M и занимающее большую долю всех разработок
для 8-битовых ЭВМ, может использоваться только после преобразова-
ния файла.

     Наиболее примечательно то, что BASIC и DOS используют один и
тот же формат, что способствует распределению ресурсов. Обе среды
строятся на унифицированном софте, который имеет в качестве обще-
го базиса BIOS (рис. 1.8). BDOS, являющийся основой всех дисковых
операций, тоже конструируется на базе BIOS. MSX обеспечивает еди-
ную программную среду для BASICа и DOSа посредством BDOS и BIOS.

     Рисунок 1.8  Иерархия software на MSX1 и MSX2

	┌──────────────────────────┬───────────┐
	│            ┬             │           │
	│   BASIC    │  DISK-BASIC │  MSX-DOS  │ ┐
	│            │             │           │ │
	│            │      ┌──────┴───────────┤ ├─ Межслотовый
	│            │      │       BDOS       │ │     вызов
	├────────────┴──────┴──────────────────┤ │
	│                  BIOS                │◀┘
	│~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~│
	│                hardware              │
	└──────────────────────────────────────┘
MSX2 TECHNICAL HANDBOOK, CHAPTER 2



                           B A S I C

     BASIC MSX2 в значительной степени расширился, его новая вер-
сия называется MSX-BASIC version 2.0. Используя дисковую систему,
можно задействовать MSX DISK-BASIC, который состоит из  MSX-BASIC
version 2.0 и ряда дополнительных инструкций для дисковых  опера-
ций. В данном разделе описаны обе версии.



1. СПИСОК ИНСТРУКЦИЙ

     Прежде всего, в перечне представлены вид и назначение каждой
инструкции языка в следующем формате:

     Рисунок 2.1  Формат списка инструкций

┌──────────────────────────────────────────────────────────┐
│		     ФОРМАТ  ИНСТРУКЦИИ			   │
├─ ─ ─ ─ ─ ─ ─ ─ ┬ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ ТИП ИНСТРУКЦИИ │     ФУНКЦИЯ ИЛИ ДЕЙСТВИЕ ИНСТРУКЦИИ	   │
└────────────────┴─────────────────────────────────────────┘

(а) Синтаксис инструкции

     Если перед ключевым словом указан знак '∙', это значит,  что
синтаксис модифицирован по сравнению с MSX-BASIC version 1.0, или
данная инструкция введена вновь.

     Описание операторов подчиняется ряду соглашений:

     [нечто]		- необязательный параметр
     [,нечто...]	- перечисляются несколько параметров
     {нечто1|нечто2}	- выбор одного параметра из двух

     В ряде операторов используется параметр <имя_файла> - строка
символов, которая адресует устройства или файлы. Формат ее следу-
ющий:
     Кассетное <имя_файла> может содержать 6 любых символов.
     Дисковое <имя_файла> состоит из <имени> (8 символов) и <рас-
ширения> (3 символа). Сюда же входит параметр <устройство>:

     "CAS:" - Кассета
     "MEM:" - RAM-диск
     "CRT:" - Текстовый дисплей
     "GRP:" - Графический дисплей
     "LPT:" - Принтер
     "A:"-"H:" - Дисковод (в зависимости от их количества)


б) Тип инструкции

     Существует четыре типа инструкций:

     ФУНКЦИЯ - возвращает значение, в зависимости от заданных па-
раметров;
     СИСТЕМНАЯ ПЕРЕМЕННАЯ - допустимая в BASICе переменная  (раз-
решено, главным образом, только присвоение);
     ОПЕРАТОР - выполняет некоторое действие;
     КОМАНДА - дает инструкции самому BASICу.


в) Назначение и действие инструкций

     Список, приведенный ниже, дает лишь поверхностное  представ-
ление об инструкциях. Более подробное описание всех  нововведений
см. в разделе 2.


1.1 Инструкции MSX-BASIC version 2.0


A

ABS (выражение)
Функция: возвращает абсолютное значение выражения

ASC (строка)
Функция: возвращает код первого байта строки

ATN (выражение)
Функция: возвращает арктангенс выражения в радианах

AUTO [номер_строки,[приращение]]
Команда: автоматически генерирует номер строки при наборе


B

∙BASE (выражение)
Системная переменная: содержит адреса таблиц VRAM

BEEP
Оператор: генерирует звук "бип" на разъеме аудио

BIN$ (выражение)
Функция: превращает значение выражения в строку двоичных
	 знаков и возвращает результат

BLOAD "имя_файла",[R[,смещение]]
Команда: загружает (и стартует) программу на ассемблере

BSAVE "имя_файла",начало,конец[,старт]
Команда: сохраняет программу на ассемблере


C

CALL имя_оператора[(аргумент[,аргумент...])]
Оператор: вызывает расширенный оператор из катриджа

∙CALL MEMINI [(верхний_предел_RAM-диска)]
Оператор: указывает предельный объем RAM-диска

∙CALL MFILES
Оператор: выдает список имен файлов, хранящихся
	  на RAM-диске

∙CALL MKILL ("имя_файла")
Оператор: удаляет файлы с RAM-диска

∙CALL MNAME ("старое_имя" AS "новое_имя")
Оператор: переименовывает файл на RAM-диске

CDBL (выражение)
Функция: превращает значение выражения в действительное
	 число двойной точности и возвращает результат

CHR$ (выражение)
Функция: возвращает символ, код которого равен значению
	 выражения

CINT (выражение)
Функция: превращает значение выражения в целое и
	 возвращает результат

∙CIRCLE {(X,Y)|STEP (X,Y)},радиус[,цвет[,нач.угол
	[,кон.угол[,пропорции]]]]
Оператор: рисует окружность с центром в точке (X,Y),
	  размер которой зависит от радиуса

CLEAR [размер_строковой_области[,верхний_предел_памяти]]
Оператор: инициализирует переменные и устанавливает
	  размер пользовательской области ОЗУ

CLOAD ["имя_файла"]
Команда: загружает программу с кассеты

CLOAD? ["имя_файла"]
Команда: сравнивает программу на кассете с программой в ОЗУ

CLOSE [[#]номер_файла[,[#]номер_файла...]]
Команда: закрывает файл, представленный номером_файла

CLS
Оператор: очищает экран

∙COLOR [цвет_переднего_плана[,цвет_фона[,цвет_рамки]]]
Оператор: задает цвета для каждой части экрана

∙COLOR [=NEW]
Оператор: восстанавливает палитру

∙COLOR = (цвет,яркость_красного,яркость_зеленого,
	  яркость_синего)
Оператор: задает цвет палитры

∙COLOR = RESTORE
Оператор: пересылает содержимое таблицы, хранящей цвета
	  палитры, в регистры палитры VDP

∙COLOR SPRITE (плоскость) = цвет
Оператор: устанавливает цвет спрайта на плоскости
	  в указанный цвет

∙COLOR SPRITE$ (плоскость) = строковое_выражение
Оператор: устанавливает цвет каждой горизонтальной линии
	  спрайта с использованием строкового_выражения

CONT
Команда: возобновляет работу программы, которая была
	 приостановлена

∙COPY источник TO приемник
Оператор: пересылает экранные данные между экраном,
	  массивом и дисковым файлом

∙COPY SCREEN [режим]
Оператор: записывает данные с цветовой шины во VRAM

COS (выражение)
Функция: возвращает косинус выражения (в радианах)

CSAVE ["имя_файла"[,скорость_обмена]]
Команда: сохраняет программу на кассете

CSNG (выражение)
Функция: превращает значение выражения в действительное
	 число одинарной точности и возвращает результат

CRSLIN
Системная переменная: содержит вертикальную экранную
	  координату курсора. Присвоение недопустимо


D

DATA константа[,константа...]
Оператор: готовит данные для чтения оператором READ

DEF FNимя [(аргумент[,аргумент...])]=функция_определение
Оператор: задает определяемую пользователем функцию

DEFINT символ[,символ...]
Оператор: объявляет указанные переменные целыми

DEFSNG символ[,символ...]
Оператор: объявляет указанные переменные одинарной точности

DEFDBL символ[,символ...]
Оператор: объявляет указанные переменные двойной точности

DEFSTR символ[,символ...]
Оператор: объявляет указанные переменные символьными

DEF USR [номер]=стартовый_адрес
Оператор: определяет стартовый адрес для исполнения
	  подпрограммы на ассемблере, вызываемой с
	  помощью функции USR

DELETE {нач.номер-кон.номер|номер|-кон.номер}
Команда: удаляет указанный фрагмент программы

DIM имя_переменной(макс.значение_индекса
    [,макс.значение_индекса...])
Оператор: определяет массив переменных и размещает
	  его в памяти

DRAW строковое_выражение
Оператор: рисует линии на экране в соответствии со
	  строковым_выражением (макроязык DRAW)


E

END
Оператор: завершает работу, закрывает все файлы,
	  возвращает в командный режим

EOF (номер_файла)
Функция: проверяет, закончился ли файл и возвращает
	 -1, если да

ERASE имя_массива[,имя_массива...]
Оператор: уничтожает массив переменных

ERR
Системная переменная: содержит код предыдущей ошибки.
	  Присвоение недопустимо

ERL
Системная переменная: содержит номер строки, в которой
	  произошла предыдущая ошибка. Присвоение недопустимо

ERROR код_ошибки
Оператор: переводит программу в состояние ошибки

EXP (выражение)
Функция: возвращает экспоненту выражения


F

FIX (выражение)
Функция: возвращает значение выражения
	 без десятичных долей

FOR имя_переменной=нач.значение TO кон.значение
    [STEP приращение]
Оператор: повторяет исполнение фрагмента между FOR и NEXT
	  указанное число раз

FRE ({выражение|строковое_выражение)
Функция: возвращает размер свободного пользовательского
	 или строкового пространства


G

∙GET DATE имя_строковой_переменной[,A]
Оператор: присваевает переменной текущую дату

∙GET TIME имя_строковой_переменной[,A]
Оператор: присваевает переменной текущее время

GOSUB номер_строки
Оператор: вызывает подпрограмму по номеру_строки

GOTO номер_строки
Оператор: переходит к номеру_строки


H

HEX$ (выражение)
Функция: превращает значение выражения в строку
	 шестнадцатиричных знаков и возвращает результат


I

IF условие THEN {оператор|номер_строки}
	[ ELSE {оператор|номер_строки}]
Оператор: проверяет условие. Истина, если условие не равно нулю

IF условие GOTO номер_строки
	[ ELSE {оператор|номер_строки}]
Оператор: проверяет условие. Истина, если условие не равно нулю

INKEY$
Функция: если нажата клавиша, возвращает соответствующий
	 символ, иначе - пустую строку

INP (номер_порта)
Функция: читает значение из указанного порта

INPUT ["подсказка";]имя_переменной[,имя_переменной...]
Оператор: присваивает вводимые с клавиатуры данные
	  указанным переменным

INPUT #номер_файла,имя_переменной[,имя_переменной...]
Оператор: читает данные из файла и присваивает их
	  указанным переменным

INPUT$ (количество_символов[,[#]номер_файла])
Функция: читает строку указанного размера с клавиатуры
	 или из файла

INSTR ([выражение],строка_1,строка_2)
Функция: ищет строку_2 в строке_1, начиная слева, и возвращает
	 ее позицию (если найдена), иначе - нуль. Выражение
	 задает начальную позицию для поиска

INT (выражение)
Функция: возвращает наибольшее целое, не превосходящее
	 значение выражения

INTERVAL { ON | OFF | STOP }
Оператор: разрешает, подавляет или приостанавливает
	  прерывания по таймеру


K

KEY номер_клавиши,строка
Команда: переопределяет функциональную клавишу

KEY LIST
Команда: демонстрирует содержание функциональных клавиш

KEY (номер_клавиши) { ON | OFF | STOP }
Оператор: разрешает, подавляет или приостанавливает
	  прерывания по функциональной клавише

KEY { ON | OFF }
Оператор: указывает, будут ли высвечиваться значения
	  функциональных клавиш в нижней строке экрана


L

LEFT$ (строковое_выражение,выражение)
Функция: возвращает подстроку строкового выражения,
	 начиная слева, с количеством символов,
	 заданным выражением

LEN (строковое_выражение)
Функция: возвращает количество символов в строке

[LET] имя_переменной = выражение
Оператор: присваивает значение выражения переменной

∙LINE [{(X1,Y1)|STEP(X1,Y1)}]-{(X2,Y2)|STEP(X2,Y2)}[,цвет
      [,{B|BF}[,логическая_операция]]]
Оператор: рисует линию или прямоугольник на экране

LINE INPUT ["подсказка";]имя_строковой_переменной
Оператор: присваивает целиком строку, введенную с клавиатуры,
	  символьной переменной

LINE INPUT #номер_файла,имя_строковой_переменной
Оператор: читает построчно данные из файла и присваивает
	  символьной переменной

LIST [[номер_строки]-[номер_строки]]
Команда: демонстрирует текст программы на экране

LLIST [[номер_строки]-[номер_строки]]
Команда: посылает текст программы из памяти на принтер

LOAD "имя_файла"[,R]
Команда: загружает программу, записанную в формате ASCII

∙LOCATE [координата_X[,координата_Y[,переключение_курсора]]]
Оператор: позиционирует курсор на текстовом экране

LOG (выражение)
Функция: возвращает натуральный логарифм выражения

LPOS (выражение)
Системная переменная: содержит позицию головки принтера.
	  Присвоение недопустимо

LPRINT [выражение[{;|,}выражение...]]
Оператор: выводит символы или числовые значения на принтер

LPRINT USING формат; выражение[{;|,}выражение...]
Оператор: выводит символы или числовые значения на принтер
	  в соответствии с заданным форматом


M

MAXFILES = число_файлов
Оператор: задает количество файлов, которые будут открыты

MERGE "имя_файла"
Команда: сливает программу в памяти с программой, записанной
	 в формате ASCII (с внешнего запоминающего устройства)

MID$ (строковое_выражение,выражение_1[,выражение_2])
Функция: возвращает подстроку строкового выражения,
	 начиная с позиции, заданной выражением_1,
	 с количеством символов, заданным выражением_2

MID$ (строковая_переменная,выражение_1[,выражение_2])
	 = строковое_выражение
Функция: заменяет подстроку в строковой переменной
	 начиная с позиции, заданной выражением_1
	 и количеством символов, заданным выражением_2
	 на значение строкового выражения

MOTOR [{ ON | OFF }]
Оператор: включает и выключает мотор кассетного накопителя


N

NEW
Команда: удаляет программу из памяти и уничтожает переменные

NEXT [имя_переменной[,имя_переменной...]]
Оператор: завершает оператор FOR


O

OCT$ (выражение)
Функция: превращает значение выражения в строку
	 восьмиричных знаков и возвращает результат

ON ERROR GOTO номер_строки
Оператор: определяет начальную строку процедуры
	  обработки ошибок

ON выражение GOSUB номер_строки[,номер_строки...]
Оператор: выполняет подпрограмму, соответствующую значению
	  выражения

ON выражение GOTO номер_строки[,номер_строки...]
Оператор: переходит на строку, соответствующую значению
	  выражения

ON INTERVAL = время GOSUB номер_строки
Оператор: задает интервал прерываний по таймеру и начальную
	  строку процедуры обработки прерываний

ON KEY GOSUB номер_строки[,номер_строки...]
Оператор: задает начальную строку процедуры обработки
	  прерываний по функциональным клавишам

ON SPRITE GOSUB номер_строки
Оператор: задает начальную строку процедуры обработки
	  прерываний по столкновению спрайтов

ON STOP GOSUB номер_строки
Оператор: задает начальную строку процедуры обработки
	  прерываний по нажатию CTRL+STOP

ON STRIG GOSUB номер_строки[,номер_строки...]
Оператор: задает начальную строку процедуры обработки
	  прерываний по нажатию кнопок триггеров

OPEN "имя_файла" [ FOR режим ] AS #номер_файла
Оператор: открывает файл в указанном режиме

OUT номер_порта,выражение
Оператор: посылает данные в порт вывода


P

∙PAD (выражение)
Функция: проверяет состояние планшета, мыши, светового пера
	 или трекбола, указанного выражением, и возвращает
	 результат

∙PAINT {(X,Y)|STEP(X,Y)}[,цвет[,цвет_границы]]
Оператор: окрашивает область, очерченную цветом_границы
	  в заданный цвет

PDL (номер_ручки)
Функция: возвращает состояние ручки игрового манипулятора

PEEK (адрес)
Функция: возвращает содержимое одного байта памяти
	 по заданному адресу

PLAY строка_1[,строка_2[,строка_3]]
Оператор: играет музыку, заданную в макро-формате

PLAY (канал)
Функция: проверяет, играет ли указанный канал и возвращает
	 -1, если да

POINT (X,Y)
Функция: возвращает цвет точки экрана, заданной координатами

POKE адрес,данные
Оператор: записывает один байт данных в память по адресу

POS (выражение)
Системная переменная: содержит горизонтальную координату
	  курсора на текстовом экране. Присвоение запрещено

∙PRESET {(X,Y)|STEP(X,Y)}[,цвет[,логическая_операция]]
Оператор: стирает точку с графического экрана

PRINT [выражение[{;|,}выражение...]]
Оператор: выводит символы или числовые значения на экран

PRINT USING формат; выражение[{;|,}выражение...]
Оператор: выводит символы или числовые значения на экран
	  в соответствии с заданным форматом

PRINT #номер_файла,[выражение[{;|,}выражение...]]
Оператор: записывает символы или числа в файл

PRINT #номер_файла,USING формат; выражение[{;|,}выражение...]
Оператор: записывает символы или числа в файл
	  в соответствии с заданным форматом

∙PSET {(X,Y)|STEP(X,Y)}[,цвет[,логическая_операция]]
Оператор: ставит точку на графическом экране

∙PUT KANJI [(X,Y)],код_иероглифа[,цвет[,логич.операция[,режим]]]
Оператор: изображает катакану на экране (требуется KANJI-ROM)

∙PUT SPRITE плоскость,[,{(X,Y)|STEP(X,Y)}[,цвет[,номер_спрайта]]]
Оператор: изображает спрайт


R

READ имя_переменной[,имя_переменной...]
Оператор: читает данные из оператора DATA и присваивает
	  переменным

REM
Оператор: вставляет комментарий в программу

RENUM [новый_номер[,старый_номер[,приращение]]]
Команда: нумерует заново строки программы

RESTORE [номер_строки]
Оператор: указывает строку с оператором DATA перед
	  чтением данных оператором READ

RESUME [[0]|NEXT|номер_строки]
Оператор: завершает обработку ошибки и возобновляет
	  исполнение программы

RETURN [номер_строки]
Оператор: возвращение из подпрограммы

RIGHT$ (строковое_выражение,выражение)
Функция: возвращает подстроку строкового выражения,
	 начиная справа, с количеством символов,
	 заданным выражением

RND [(выражение)]
Функция: возвращает случайное число в диапазоне 0...1

RUN [номер_строки]
Команда: исполняет программу, начиная с заданной строки


S

SAVE "имя_файла"[,A]
Команда: сохраняет программу в формате ASCII

∙SCREEN режим_экрана[,размер_спрайта[,щелчок_клавиши
[,скорость_обмена[,опция_принтера[,чересстрочная_развертка]]]]]
Оператор: устанавливает режим экрана и т.д.

∙SET ADJUST (смещение_по_X,смещение_по_Y)
Оператор: изменяет положение экрана. Диапазон -7...8

∙SET BEEP звучание,громкость
Оператор: выбирает звук BEEP. Диапазон 1...4

∙SET DATE строковое_выражение[,A]
Оператор: устанавливает дату. "А" указывает аларм

∙SET PAGE изображаемая_страница,активная_страница
Оператор: задает экранную страницу для вывода и
	  для чтения-записи

∙SET PASSWORD строковое_выражение
Оператор: назначает пароль

∙SET PROMPT строковое_выражение
Оператор: задает подсказку (до 6 символов)

∙SET SCREEN
Оператор: сохраняет текущие установки SCREEN
	  в энергонезависимой памяти

∙SET TIME строковое_выражение[,A]
Оператор: устанавливает время. "А" указывает аларм

∙SET TITLE строковое_выражение[,цвет]
Оператор: задает титульное сообщение цвет экрана при сбросе

∙SET VIDEO [режим[,Ym[,CB[,синхро[,голос[,в_вход[,AV_упр]]]]]]]
Оператор: обработка данных с видеошины (дополнительно)

SGN (выражение)
Функция: проверяет знак выражения и возвращает результат
	 (положительное = 1; нуль = 0; отрицательное = -1)

SIN (выражение)
Функция: возвращает синус выражения (в радианах)

SOUND регистр,данные
Оператор: записывает данные в регистр PSG

SPACE$ (выражение)
Функция: возвращает строку, состоящую из заданного
	 количества пробелов

SPC (выражение)
Функция: генерирует заданное число пробелов; используется
	 преимущественно в операторе PRINT

SPRITE { ON | OFF | STOP }
Оператор: разрешает, подавляет или приостанавливает
	  прерывания по столкновению спрайтов

SPRITE$ (номер_образа)
Системная переменная: содержит описание образа спрайта

SQR (выражение)
Функция: возвращает значение квадратного корня выражения

STICK (номер_джойстика)
Функция: проверяет направление наклона ручки джойстика
	 и возвращает результат

STOP
Оператор: останавливает работу программы

STOP { ON | OFF | STOP }
Оператор: разрешает, подавляет или приостанавливает
	  прерывания по CTRL+STOP

STRIG (номер_джойстика)
Функция: проверяет состояние кнопки джойстика
	 и возвращает результат

STRIG (номер_джойстика) { ON | OFF | STOP }
	 и возвращает результат
Оператор: разрешает, подавляет или приостанавливает
	  прерывания по нажатию кнопки джойстика

STR$ (выражение)
Функция: превращает значение выражения в строку десятичных
	 знаков и возвращает результат

STRING$ (выражение_1,{строковое_выражение|выражение_2})
Функция: превращает первый символ строкового выражения
	 или символ, код которого равен выражению_2 в
	 строку, длина которой задается выражением_1

SWAP имя_переменной,имя_переменной
Оператор: обменивает между собой значения двух переменных


T

TAB (выражение)
Функция: генерирует указанное количество пробелов
	 в операторе PRINT

TAN (выражение)
Функция: возвращает тангенс выражения (в радианах)

TIME
Системная переменная: содержит значение таймера

TRON
Команда: устанавливает режим демонстрации номеров строк,
	 которые исполняются в данный момент

TROFF
Команда: отменяет TRON и прекращает демонстрацию номеров


U

USR [номер](аргумент)
Функция: вызывает подпрограмму на ассемблере


V

VAL (строка)
Функция: превращает строку в числовое значение
	 и возвращает результат

VARPTR (имя_переменной)
Функция: возвращает адрес указанной переменной

VARPTR (#номер_файла)
Функция: возвращает адрес FCB (блока управления файлом)

∙VDP (номер_регистра)
Системная переменная: читает/пишет из/в регистр VDP

∙VPEEK (адрес)
Функция: читает данные из видеопамяти

∙VPOKE адрес,данные
Оператор: пишет данные в видеопамять


W

WAIT номер_порта,выражение_1[,выражение_2]
Оператор: приостанавливает работу программы до тех пор, пока
	  данные из порта не достигнут требуемого значения

∙WIDTH число
Оператор: указывает количество символов в строке
	  (в текстовом режиме)
1.2 Инструкции MSX DISK BASIC


B

∙BLOAD "имя_файла"[{[,R]|[,S]}[,смещение]]
Команда: загружает программу на ассемблере или экранные
	 данные из файла

∙BSAVE "имя_файла",нач.адрес,кон.адрес[,{старт.адрес|S}]
Команда: записывает программу на ассемблере или экранные
	 данные в файл


C

CLOSE [[#]номер_файла[,[#]номер_файла...]]
Оператор: закрывает файл с указанным номером

CALL FORMAT
Команда: форматирует флоппи-диск

CALL SYSTEM
Команда: возвращает в MSX-DOS

COPY "имя_файла_1"[TO "имя_файла_2"]
Команда: копирует содержимое файла_1 в файл_2

CVD (8-байтовая_строка)
Функция: превращает строку в число двойной точности

CVI (2-байтовая_строка)
Функция: превращает строку в целое

CVS (4-байтовая_строка)
Функция: превращает строку в число одинарной точности


D

DSKF (номер_дисковода)
Функция: возвращает объем свободной части диска в кластерах


E

EOF (номер_файла)
Функция: проверяет, завершился ли файл. Возвращает -1, если да


F

FIELD [#]номер_файла,ширина_поля AS строковая_переменная
      [,ширина_поля AS строковая_переменная...]
Оператор: присваивает имена строковых переменных буферам
	  произвольного доступа

FILES ["маска"]
Команда: выводит на экран имена файлов, соответствующие маске


G

GET [#]номер_файла[,номер_записи]
Оператор: читает одну запись из файла прямого доступа в буфер


I

INPUT #номер_файла,имя_переменной[,имя_переменной...]
Оператор: читает данные из файла

INPUT$ (число_символов[,[#]номер_файла])
Функция: получает строку нужной длины из файла


K

KILL "маска"
Команда: удаляет файлы с учетом маски


L

LFILES ["маска"]
Команда: посылает соответствующие имена файлов на принтер

LINE INPUT #номер_файла,имя_строковой_переменной
Оператор: читает строку данных из файла в строковую переменную

LOAD "имя_файла"[,R]
Команда: читает программу в память

LOC (номер_файла)
Функция: возвращает номер записи, к которой произведен доступ

LOF (номер_файла)
Функция: возвращает размер указанного файла в байтах

LSET имя_строковой_переменной = строковое_выражение
Оператор: сохраняет данные, выровненные по левому краю
	  буфера произвольного доступа


M

MAXFILES = количество_файлов
Оператор: объявляет максимальное количество файлов,
	  которые могут быть открыты

MERGE "имя_файла"
Команда: сливает программу в памяти с программой,
	 сохраненной в формате ASCII

MKD$ (действительное_значение_двойной_точности)
Функция: превращает действительное_значение_двойной_точности
	 в символьные коды соответственно внутреннему представлению

MKI$ (целое_значение)
Функция: превращает целое_значение в символьные коды
	 соответственно внутреннему представлению

MKS$ (действительное_значение_одинарной_точности)
Функция: превращает действительное_значение_одинарной_точности
	 в символьные коды соответственно внутреннему представлению


N

NAME "имя_файла_1" AS "имя_файла_2"
Команда: переименовывает файл


O

OPEN "имя_файла" [FOR режим] AS #номер_файла [LEN = длина_записи]
Оператор: открывает файл


P

PRINT #номер_файла,[выражение[{;|,}выражение...]]
Оператор: посылает данные в файл последовательного доступа

PRINT #номер_файла,USING формат; выражение[{;|,}выражение...]
Оператор: посылает данные в файл последовательного доступа
	  в соответствии с форматом

PUT [#]номер_файла[,номер_записи]
Оператор: посылает данные из буфера файла произвольного
	  доступа

R

RSET имя_строковой_переменной = строковое_выражение
Оператор: сохраняет данные, выровненные по правому краю
	  буфера произвольного доступа

RUN "имя_файла"[,R]
Команда: загружает программу с диска и исполняет ее


S

SAVE "имя_файла"[,A]
Команда: записывает программу. Программа пишется в формате
	 ASCII, если указан параметр "A"

V

VARPTR (#номер_файла)
Функция: возвращает стартовый адрес FCB (блока управления
	 файлом)

Глава 2

MSX2 TECHNICAL HANDBOOK, CHAPTER 2



2. ОТЛИЧИЯ MSX BASIC VERSION 2.0

     Сравнивая две версии языка, нетрудно заметить, что MSX BASIC
version 2.0 значительно изменился. Солидная часть инструкций под-
верглась расширению, многое добавлено впервые: поддержка RAM-дис-
ка, часов, мэппера; особенно сильно изменились графические опера-
торы, в связи с усовершенствованием VDP.

     Эти и подобные им операторы представлены в данном разделе. В
дальнейшем MSX1 будет обозначать MSX BASIC version 1.0, а MSX2  -
MSX BASIC version 2.0, соответственно.



2.1 Добавления и изменения в экранном режиме

∙SCREEN режим[,размер_спрайта[,отзвук_клавиши[,скорость_обмена
	[,опция_принтера[,режим_interlace]]]]]]

Модифицированы: режим_экрана и режим_interlace.

     Теперь режим_экрана можно задавать в диапазоне 0...8. Режимы
0...3 - те же самые, что и в MSX1; остальные введены вновь. Номер
режима в BASICе называется "режимом экрана" и несколько отличает-
ся от собственного "режима экрана" VDP. В таблице 2.1 показано их
соответствие и назначение. Различие между режимами 2 и 4 заключа-
ется только в функциях спрайтов.

     Режим_interlace (чересстрочная развертка) позволяет включить
соответствующую возможность VDP (таблица 2.2). Номер отображаемой
страницы (см. SET PAGE) должен быть нечетным, тогда на экран  бу-
дут поочередно выводиться заданная страница и страница с номером,
на 1 меньшим.


       Таблица 2.1  Соответствие между экранными режимами
			  BASIC и VDP
┌─────────────────┬──────────┬─────────────────────────────────────┐
│		  │	     │		   Значение		   │
│   Режим BASIC   │ Режим VDP├───────┬──────────┬──────────────────┤
│		  │	     │ Размер│ Цветность│      Формат	   │
├─────────────────┼──────────┼───────┼──────────┼──────────────────┤
│SCREEN 0:WIDTH 40│TEXT 1    │ 40x24∙│  2 из 512│Текст		   │
│SCREEN 0:WIDTH 80│TEXT 2    │ 80x24∙│  4 из 512│Текст		   │
│SCREEN 1	  │GRAPHIC 1 │ 32x24∙│ 16 из 512│Текст		   │
│SCREEN 2	  │GRAPHIC 2 │256x192│ 16 из 512│Высокое разрешение│
│SCREEN 3	  │MULTICOLOR│ 64x48 │ 16 из 512│Низкое  разрешение│
│SCREEN 4	  │GRAPHIC 3 │256x192│ 16 из 512│Высокое разрешение│
│SCREEN 5	  │GRAPHIC 4 │256x212│ 16 из 512│Бит-мэп	   │
│SCREEN 6	  │GRAPHIC 5 │512x212│  4 из 512│Бит-мэп	   │
│SCREEN 7	  │GRAPHIC 6 │512x212│ 16 из 512│Бит-мэп	   │
│SCREEN 8	  │GRAPHIC 7 │256x212│256 из 256│Бит-мэп	   │
└─────────────────┴──────────┴───────┴──────────┴──────────────────┘
∙ размер экрана дан в символах



Таблица 2.2  Различия дисплейных функций в режиме interlace
			(чересстрочной развертки)
	┌───────────────┬──────────────────────────────────┐
	│   interlace	│	   Функция дисплея	   │
	├───────────────┼──────────────────────────────────┤
	│	0	│ нормальный режим (по умолчанию)  │
	│	1	│ interlace                        │
	│	2	│ чередование страниц без interlace│
	│	3	│ чередование страниц с   interlace│
	└───────────────┴──────────────────────────────────┘


∙SET PAGE отображаемая_страница, активная_страница

     Это новый оператор. Он позволяет задавать страницу VRAM  для
демонстрации на экране и (независимо) для записи данных. Это воз-
можно лишь в режимах 5...8, если заданные номера страниц соответ-
ствуют емкости VRAM.
     Карту видеопамяти см. в ПРИЛОЖЕНИИ.

    Таблица 2.3  Номера страниц, в зависимости
		от режима экрана и емкости VRAM

	┌──────────────┬───────────┬───────────┐
	│ Режим экрана │ VRAM 64 K │ VRAM 128K │
	├──────────────┼───────────┼───────────┤
	│   SCREEN 5   │  0 ... 1  │  0 ... 3  │
	│   SCREEN 6   │  0 ... 1  │  0 ... 3  │
	│   SCREEN 7   │    ---    │  0 ... 1  │
	│   SCREEN 8   │    ---    │  0 ... 1  │
	└──────────────┴───────────┴───────────┘


∙WIDTH число

     Если режим экрана равен 0, ширина экранной строки может дос-
тигать 80 знаков.


2.2 Добавления и изменения в спецификации цвета

∙COLOR [цвет_переднего_плана[,цвет_фона[,цвет_рамки]]]

     В системе MSX2, с ее возможностями регулировки палитры,  ди-
апазон и смысл цветовых параметров отличается в каждом режиме эк-
рана (см. таблицу 2.4). Цвет_фона изменяется только после  сраба-
тывания оператора CLS (кроме текстовых режимов). В режиме 0 пара-
метр цвет_рамки игнорируется.

     Цвет_рамки в экранном режиме 6 имеет особое значение. На ри-
сунке 2.2 изображены битовые поля цвета_рамки в этом режиме.  Из-
менением флага (бит 4) можно добиться раздельной установки цветов
четных и нечетных вертикальных линий экрана.
     Если флаг равен 0 (значение цвета_рамки - одно из чисел от 0
до 15), раздельная установка запрещена, и реальный цвет рамки со-
ответствует цвету нечетных линий. Если же флаг равен 1 (цвет_рам-
ки - в диапазоне от 16 до 31), цвета могут  быть  различными  для
четных и нечетных вертикалей; при этом экран будет расчерчен  пе-
ремежающимися вертикальными линиями.


     Рисунок 2.2 Битовый формат цвета_рамки для режима 6

        7     6     5     4     3     2     1     0
     ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
     │		       │     │    цвет   │    цвет   │
     │ не используется │ флаг│   четных  │  нечетных │
     │		       │     │ вертикалей│ вертикалей│
     └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘


∙COLOR = (номер_палитры,яркость_красного,яркость_зеленого,
	 яркость_синего)

     Этот оператор настраивает цвет указанной палитры. Для  опре-
деления номера палитры см. таблицу 2.4. Имейте в  виду,  что  при
выполнении этого оператора в режиме 8,  где  регулировка  палитры
отсутствует, сообщение об ошибке не возникает.
     Номер_палитры 0 обычно фиксирован как прозрачный (это  озна-
чает, что сквозь него будет "просвечивать" цвет  рамки),  но  его
можно задействовать тем же путем, что и остальные, если  скоррек-
тировать регистр VDP:

VDP(9)=VDP(9) OR  &H20 (задействован, как и остальные)
VDP(9)=VDP(9) AND &HDF (фиксируется как прозрачный)


   Таблица 2.4  Спецификация цвета для экранных режимов
	┌────────────┬──────────────────┬───────────────┐
	│    Режим   │	 Спецификация	│   Диапазон	│
	├────────────┼──────────────────┼───────────────┤
	│  SCREEN 0  │	 Номер палитры	│    0...15	│
	│  SCREEN 1  │	 Номер палитры	│    0...15	│
	│  SCREEN 2  │	 Номер палитры	│    0...15	│
	│  SCREEN 3  │	 Номер палитры	│    0...15	│
	│  SCREEN 4  │	 Номер палитры	│    0...15	│
	│  SCREEN 5  │	 Номер палитры	│    0...15	│
	│  SCREEN 6  │	 Номер палитры	│    0...3	│
	│  SCREEN 7  │	 Номер палитры	│    0...15	│
	│  SCREEN 8  │	 Номер цвета	│    0...255	│
	└────────────┴──────────────────┴───────────────┘

     Яркость каждой составляющей может изменяться от 0 до 7, а их
сочетание позволяет получить 512 цветов и оттенков: 8 (красный) x
8 (зеленый) x 8 (синий).


∙COLOR = RESTORE

     Этот оператор засылает информацию о палитре из таблицы  VRAM
в регистры VDP (см. КАРТУ VRAM в ПРИЛОЖЕНИИ). Его назначение про-
ще всего объяснить на примере:
     - если записать при помощи BSAVE изображение с нестандартной
палитрой, то при его загрузке оператором BLOAD исходные цвета  не
будут восстановлены, поскольку BLOAD не изменяет состояния регис-
тров палитры. Вот почему желательно вместе с изображением записы-
вать и таблицу палитры. Тогда для восстановления исходных  цветов
достаточно будет выполнить COLOR = RESTORE.


∙COLOR [= NEW]

     Этот оператор инициализирует цветовую палитру, как при вклю-
чении питания (см. таблицу 2.5). Целесообразно помещать его в на-
чале и в конце каждой программы.

      Таблица 2.5 Начальное значение цветовой палитры
	┌───────┬───────────────┬─────┬─────┬─────┐
	│ Номер │      Цвет	│ Крс │ Син │ Зел │
	├───────┼───────────────┼─────┼─────┼─────┤
	│   0	│ прозрачный	│  0  │  0  │  0  │
	│   1	│ черный	│  0  │  0  │  0  │
	│   2	│ зеленый	│  1  │  1  │  6  │
	│   3	│ светло-зеленый│  3  │  3  │  7  │
	│   4	│ синий		│  1  │  7  │  1  │
	│   5	│ светло-синий	│  2  │  7  │  3  │
	│   6	│ темно-красный	│  5  │  1  │  1  │
	│   7	│ голубой	│  2  │  7  │  6  │
	│   8	│ красный	│  7  │  1  │  1  │
	│   9   │ светло-красный│  7  │  3  │  3  │
	│  10	│ желтый	│  6  │  1  │  6  │
	│  11	│ светло-желтый	│  6  │  3  │  6  │
	│  12	│ темно-зеленый	│  1  │  1  │  4  │
	│  13	│ сиреневый	│  6  │  5  │  2  │
	│  14	│ серый		│  5  │  5  │  5  │
	│  15	│ белый		│  7  │  7  │  7  │
	└───────┴───────────────┴─────┴─────┴─────┘

2.3 Добавления и изменения в символьном режиме

∙LOCATE [координата_X[,координата_Y[,выключатель_курсора]]]

     Этот оператор указывает место для вывода очередного символа.
     Поскольку в режиме 0 есть возможность выводить до 80  симво-
лов в строке, значение координаты_X можно задавать от 0 до 79.



2.4 Добавления и изменения в графическом режиме

∙LINE [{(X1,Y1)|STEP(X1,Y1)}]-{(X2,Y2)|STEP(X2,Y2)}[,цвет
     [,{B|BF}[,логическая_операция]]]
∙PSET {(X,Y)|STEP(X,Y)}[,цвет[,логическая_операция]]
∙PRESET {(X,Y)|STEP(X,Y)}[,цвет[,логическая_операция]]

     Допустимые координаты в этих операторах варьируются в  зави-
симости от экранного режима (см. таблицу 2.6).

     Таблица 2.6 Диапазон координат для каждого режима
	┌──────────┬──────────────┬─────────────┐
	│  Режим   │ Координата X │ Координата Y│
	├──────────┼──────────────┼─────────────┤
	│ SCREEN 2 │   0...255	  │   0...191	│
	│ SCREEN 3 │   0... 63	  │   0... 47	│
	│ SCREEN 4 │   0...255	  │   0...191	│
	│ SCREEN 5 │   0...255	  │   0...211	│
	│ SCREEN 6 │   0...512	  │   0...211	│
	│ SCREEN 7 │   0...512	  │   0...211	│
	│ SCREEN 8 │   0...255	  │   0...211	│
	└──────────┴──────────────┴─────────────┘

     К числу нововведений относится параметр логическая_операция.
Если логическая_операция указана, она выполняется над цветом опе-
ратора и исходным цветом точки экрана, а  результат  используется
при рисовании. Типы логических операций перечислены в таблице 2.7
Цвет всюду указывает номер палитры, кроме режима 8.


              Таблица 2.7 Логические операции
┌─────────────────┬─────────────────────────────────────┐
│ Логическая опер │	   Действие при рисовании	│
├─────────────────┼─────────────────────────────────────┤
│ PSET,	  TPSET	  │ указанный цвет			│
│ PRESET, TPRESET │ NOT (указанный цвет)		│
│ XOR,	  TXOR	  │ (фоновый цвет) XOR (указанный цвет)	│
│ OR,	  TOR	  │ (фоновый цвет) OR (указанный цвет)	│
│ AND,	  TAND	  │ (фоновый цвет) AND (указанный цвет)	│
└─────────────────┴─────────────────────────────────────┘
Примечание: если перед логической операцией указано T, с прозрач-
	    ным цветом ничего не происходит.


∙CIRCLE {(X,Y)|STEP(X,Y)},радиус[,цвет[,нач.угол[,кон.угол
     [,пропорции]]]]

     Допустимый диапазон координат зависит от режима экрана  (см.
таблицу 2.6). Цвет задает номер палитры, кроме режима 8.


∙PAINT {(X,Y)|STEP(X,Y)}[,цвет[,цвет_границы]]

     Допустимый диапазон координат зависит от режима экрана  (см.
таблицу 2.6). Цвет задает номер палитры, кроме режима 8. В  режи-
мах 2 и 4 нельзя задавать цвет_границы.



2.5 Добавления и изменения в доступе к видеопроцессору


∙BASE (выражение)

     Эта системная переменная опеспечивает доступ к адресу каждой
из таблиц, размещенных во VRAM. Значение выражения соотносится  с
режимом экрана, как показано в таблице 2.8.

     Начальный адрес таблицы можно читать при любом значении  вы-
ражения, однако писать - только при значениях 0...19 (режимы  эк-
рана 0...3).

     Помните также: меняя адрес какой-либо таблицы для SCREEN  2,
Вы одновременно изменяете соответствующий адрес для SCREEN 4.

     Адреса, возвращаемые в режимах 5...8, есть ни что иное,  как
смещение относительно начального адреса активной страницы.


   Таблица 2.8 Соответствие между BASE и таблицами VRAM
	┌─────────┬───────┬───────────────────┐
	│Выражение│ Режим │	 Таблица      │
	├─────────┼───────┼───────────────────┤
	│    0	  │   0	  │ экранного буфера  │
	│    1	  │   0	  │	   ---	      │
	│    2	  │   0	  │ знакогенератора   │
	│    3	  │   0	  │	   ---	      │
	│    4	  │   0	  │	   ---	      │
	├─────────┼───────┼───────────────────┤
	│    5	  │   1	  │ экранного буфера  │
	│    6	  │   1	  │ цветов	      │
	│    7	  │   1	  │ знакогенератора   │
	│    8	  │   1	  │ атрибутов спрайтов│
	│    9	  │   1	  │ шаблонов спрайтов │
	├─────────┼───────┼───────────────────┤
	│   10	  │   2	  │ экранного буфера  │
	│   11	  │   2	  │ цветов	      │
	│   12	  │   2	  │ знакогенератора   │
	:   ::	  :   :	  :       : : :       :
	│   43	  │   8	  │ атрибутов спрайтов│
	│   44	  │   8	  │ шаблонов спрайтов │
	└─────────┴───────┴───────────────────┘


∙VDP (n)

     Эта инструкция позволяет обмениваться значениями с регистра-
ми VDP. Число "n" несколько отличается от реального номера регис-
тра VDP. Их соответствие указано в таблице 2.9.

		Таблица 2.9 Соответствие регистров
	┌─────────┬───────────────────────┬───────────────┐
	│    n	  │  номер регистра VDP   │ режим доступа │
	├─────────┼───────────────────────┼───────────────┤
	│  0...7  │ 0...7 (как для MSX1)  │ чтение/запись │
	│    8	  │ регистр статуса 0	  │ только чтение │
	│  9...24 │       8...23	  │ чтение/запись │
	│ 33...47 │      32...46	  │ только запись │
	│ -1...-9 │ регистр статуса 1...9 │ только чтение │
	└─────────┴───────────────────────┴───────────────┘


∙VPEEK (адрес)
∙VPOKE адрес,данные

     В экранных режимах 5...8 в качестве адреса  следует  ставить
смещение относительно начала активной страницы  видеопамяти.  До-
пустимый диапазон для адреса - 0...65535, для данных - 0...255.



2.6 Добавления и изменения в хранении экранных данных

∙BSAVE "имя_файла",нач.адрес,кон.адрес,S
∙BLOAD "имя_файла",S

     Эти известные операторы DISK BASICа модифицированны для  об-
мена данными между VRAM и диском. Оба могут использоваться в  лю-
бом режиме экрана, однако в режимах 5...8 открыт доступ только  к
активной странице. Кассетные файлы невозможны. Допустимый  диапа-
зон адресов: от -32768 до -2, или 0...65534 (&HFFFE)


∙COPY (X1,Y1)-(X2,Y2)[,страница_источник] TO (X3,Y3)
	[,страница_приемник[,логическая_операция]]
∙COPY (X1,Y1)-(X2,Y2)[,страница_источник] TO
	{имя_массива|имя_файла}
∙COPY {имя_массива|имя_файла}[,направление] TO (X3,Y3)
	[,страница_приемник[,логическая_операция]]
∙COPY имя_файла TO имя_массива
∙COPY имя_массива TO имя_файла

     Операторы COPY занимаются перемещением экранных данных и ра-
ботают только в режимах экрана 5...8. В этих операторах могут фи-
гурировать VRAM, массив или дисковый файл, то есть, данные  могут
произвольно пересылаться между ними.

     (X1,Y1)-(X2,Y2) обозначает прямоугольный фрагмент, диагональ
которого определяется двумя этими  точками.  Страница_источник  и
страница_приемник показывают, откуда и куда  переносятся  данные;
если эти параметры не указаны, по умолчанию  подразумевается  ак-
тивная страница. "Направление" характеризует порядок вывода  дан-
ных на экран и указывается числом от 0 до 3 (см. рисунок 2.3).


     Рисунок 2.3 Направления для записи экранных данных

		Направление = 0		Направление = 1
 Исходное	┌─────┐			┌─────┐
изображение	│  ○  │			│  ○  │
 ┌─────┐	├─────┘			└─────┤
 │  ○  │	│			      │
 ├─────┘
 │		Направление = 2		Направление = 3
		│			      │
		├─────┐			┌─────┤
		│  ○  │			│  ○  │
		└─────┘			└─────┘

     Массив - целого или действительного типа. Его размеры должны
быть достаточными для размещения графических данных. Размеры мож-
но вычислить, пользуясь выражением 1, приведенным ниже.  Экранные
данные сохраняются в массиве согласно  формату,  приведенному  на
рисунке 2.4. Размер_пикселя показывает количество битов для пред-
ставления одной точки экрана: четыре для режимов 5 и 7,  два  для
режима 6, восемь для режима 8.

     Выражение 1

INT ((размер_пикселя*(ABS(X2-X1)+1)*(ABS(Y2-Y1)+1)+7)/8+4)

	   Рисунок 2.4 Формат экранных данных
	┌───────────────────────────────────────┐
	│  Горизонтальный размер (младший байт)	│ 0
	├───────────────────────────────────────┤
	│  Горизонтальный размер (старший байт)	│ 1
	├───────────────────────────────────────┤
	│   Вертикальный размер (младший байт)	│ 2
	├───────────────────────────────────────┤
	│   Вертикальный размер (старший байт)	│ 3
	├───────────────────────────────────────┤
	│					│ 4
	│	   Экранные данные(°)		│ :
	│					│ n
	└───────────────────────────────────────┘

(°)  Если длина данных не сводится к целому числу байтов,  лишние
     биты зануляются.

     Логическая_операция определяет действие над цветовыми данны-
ми источника и приемника. См. таблицу 2.7 для уяснения  необходи-
мых параметров.

     Если перед логической_операцией указано Т, прозрачные  фраг-
менты источника не переносятся.
2.7 Добавления и изменения спрайтов

     Режим спрайтов, используемый в SCREEN 4...8, называется "ре-
жимом 2"; он значительно расширен, по сравнению с MSX1.
     На MSX1, например, спрайт мог быть  окрашен  в  единственный
цвет, в то время как MSX2 позволяет окрасить каждую  горизонталь-
ную линию спрайта, так что даже одиночный спрайт может  представ-
лять многоцветные символы. Ко всему прочему, удачно задумано  на-
ложение двух спрайтов, позволяющее добиться трех цветов в  каждой
линии.
     И это еще не все: если на одной горизонтали экрана MSX1 раз-
мещалось пять или более спрайтов, то, начиная с  пятого,  спрайты
не высвечивались; на MSX2 их может быть до восьми  штук  в  одной
строке, что обеспечивает машине гораздо  большую  изобразительную
мощность.

     Цвета, в которые можно окрасить спрайты, перечислены в  таб-
лице 2.4. Исключение составляет режим SCREEN 8, в котором палитра
игнорируется, и спрайты поддерживают только 16 стандартных цветов
(см. таблицу 2.10).

       Таблица 2.10 Цвета спрайтов в режиме экрана 8

	 0 - черный		 8 - светло-оранжевый
	 1 - темно-синий	 9 - синий
	 2 - темно-красный	10 - красный
	 3 - темно-сиреневый	11 - сиреневый
	 4 - темно-зеленый	12 - зеленый
	 5 - серо-зеленый	13 - светло-синий
	 6 - оливковый		14 - желтый
	 7 - серый		15 - белый


∙PUT SPRITE номер_плана[,[STEP](X,Y)[,цвет[,номер_образа]]]

     В режимах SCREEN 1...3 для гашения спрайта применялась коор-
дината Y = 209, а координата Y = 208 использовалась для  удаления
с экрана заданного спрайта и всех последующих. В режимах 4...8, в
которых предел вертикальной координаты увеличен до 212, аналогич-
ные назначение имеют координаты 217 и 216 соответственно.


∙COLOR SPRITE$ (номер_плана) = строковое_выражение

     Этот оператор задает цвет каждой горизонтальной линии спрай-
та (см. рисунок 2.5).

     "Строковое_выражение" содержит от одного до шестнадцати сим-
волов. Биты 0...3 символьного ASCII-кода используются для задания
цвета, а биты 4...7 применяются для указания функции каждой стро-
ки спрайта (см. таблицу 2.11). Эти спецификации допускаются толь-
ко в режимах 4...8.


  Рисунок 2.5 Соответствие спрайта и строкового выражения

  CHR$(цвет_верхней_строки)+CHR$(цвет_следующей_строки)+ ...
  +CHR$(цвет_нижней_строки)

     Таблица 2.11 Битовый формат строкового выражения
┌─────────┬──────────────────────────────────────────────┐
│    b7	  │ если 1, спрайт сдвигается влево на 32 точки	 │
│    b6	  │ если 1, приоритеты и конфликты спрайтов	 │
│	  │  игнорируются; при наложении спрайтов над их │
│	  │  цветами выполняется операция OR (∙).	 │
│    b5	  │ если 1, конфликт спрайтов игнорируется	 │
│    b4	  │ не используется				 │
│ b0...b3 │ номер палитры				 │
└─────────┴──────────────────────────────────────────────┘
(∙)  ПРИМЕР: Предположим, что бит 6 спрайта 1 равен "0", а бит  6
спрайта 2 равен "1"; только при движении спрайта 1 спрайт 2 будет
демонстрироваться покрытым в том же месте (???).


∙COLOR SPRITE (номер_плана) = выражение

     Этот оператор устанавливает общий цвет спрайта равным значе-
нию выражения. Там, где COLOR SPRITE$, описанный выше, использует
строковое_выражение, данный оператор использует число, формат ко-
торого - тот же, что и в таблице 2.11, но с запрещенным битом  7.
Оба оператора доступны только в режимах с 4 по 8.



2.8 Дополнительные возможности

∙SET VIDEO режим[,Ym[,CB[,синхро[,голос[,видео_вход
     [,AV_управление]]]]]]

     Этот новый оператор предназначен для обработки  видеосигнала
при помощи суперимпозера (наложение) и диджитайзера  (оцифровка),
поэтому он может работать только на машинах, оборудованных упомя-
нутыми устройствами.

     "Режим" включает наложение и может принимать значения, кото-
рые приведены в таблице 2.12.

     Если Ym равно 1, яркость телесигнала делится пополам.

     Если CB равно 1, цветовая шина готовится к приему,  если  0,
то к передаче.

     Если "синхро" равняется 1, выбирается внешняя синхронизация,
если 0, внутренняя.

     "Голос" задает режимы смешения внешних сигналов, значения  -
в таблице 2.13.

     "Видео_вход" используется для изменения входа внешних  виде-
осигналов. Если он равен 0, выбирается разъем RGB, если 1,  внеш-
ний разъем видеосигнала.

     "AV_управление" задает управление контактом AV разъема  RGB.
Если он равен 1, выход включен, если 0, - выключен.

             Таблица 2.12 Режимы SET VIDEO
	┌─────┬────┬────┬────┬───────────────┐
	│Режим│	S1 │ S0	│ TP │ Экран дисплея │
	├─────┼────┼────┼────┼───────────────┤
	│  0  │	 0 │  0	│  0 │ компьютер     │
	│  1  │	 0 │  1	│  1 │ компьютер     │
	│  2  │	 0 │  1	│  0 │ суперимпозер  │
	│  3  │	 1 │  0	│  1 │ телевидение   │
	└─────┴────┴────┴────┴───────────────┘
Примечание: Если выбран режим 0, внешняя синхронизация  не  может
использоваться. В остальных режимах композитный выход VDP не раз-
решен. S1, S0 и TP - названия битов регистров VDP.

   Таблица 2.13 Значения параметра "голос" для SET VIDEO
	┌─────┬─────────────────────────────────┐
	│Голос│  Действие над внешним сигналом	│
	├─────┼─────────────────────────────────┤
	│  0  │	 нет смешения			│
	│  1  │	 смешивается правый канал	│
	│  2  │	 смешивается левый канал	│
	│  3  │	 смешиваются оба канала		│
	└─────┴─────────────────────────────────┘


∙COPY SCREEN режим

     Этот оператор применяется для записи данных с цветовой  шины
во VRAM, например,  после  оцифровки  (только  в  режимах  экрана
5...8).
     Если режим равен 0, происходит оцифровка только одного полу-
кадра, который записывается на видимую страницу. В режиме  1  два
полукадра (один кадр) записываются на видимую страницу и на стра-
ницу, номер которой на 1 меньше номера  видимой.  Таким  образом,
необходимо, чтобы видимой была нечетная  страница.  По  умолчанию
принят режим 0.



2.9 Добавления, связанные с таймером

∙GET DATE строковая_переменная[,A]

     Этот оператор предназначен для чтения даты и  присвоения  ее
строковой переменной. Формат даты следующий:

     YY/MM/DD (YY-два младших знака года, MM-месяц, DD-день)

Пример: 85/03/23 = 23 марта 1985

     Если поставлена опция "А", читается дата аларма.


∙SET DATE строковое_выражение[,A]

     Этот оператор устанавливает дату таймера. Формат параметра и
опции тот же, что и в GET DATA.

Пример: SET DATE "85/03/23"


∙GET TIME строковая_переменная[,A]

     Этот оператор предназначен для чтения времени из  таймера  и
присвоения его строковой переменной. Формат времени следующий:

     HH:MM:SS (HH-часы, MM-минуты, SS-секунды)

Пример: 22:15:00 = 22 часа 15 минут 0 секунд

     Если поставлена опция "А", читается время аларма.


∙SET TIME строковое_выражение[,A]

     Этот оператор устанавливает время таймера. Формат  параметра
и опции тот же, что и в GET TIME.

Пример: SET TIME "22/15/00"


∙ АЛАРМ

     Поскольку аларм - функция дополнительная, действия, предпри-
нимаемые при наступлении времени аларма,  зависят  от  конкретной
машины (обычно ничего не происходит).

     Если необходимо выставить и дату, и время аларма, то сначала
нужно устанавливать время (иначе SET TIME сотрет из памяти  дату,
введенную SET DATE).

     При установке времени аларма секунды игнорируются.


2.10 Добавления, связанные с энергонезависимой RAM

     Используя инструкцию "SET", можно заносить в батарейное  ОЗУ
разнообразную информацию, которая перечислена ниже. Размещенные в
нем настройки выполняются автоматически при старте системы (когда
система включается или сбрасывается).
     Следует помнить, что операторы "SET TITLE", "SET PASSWORD" и
"SET PROMPT" используют один и тот же фрагмент энергонезависимого
ОЗУ, поэтому сохраняется настройка, заданная последней.


∙SET ADJUST (сдвиг_по_X, сдвиг_по_Y)

     Этот оператор корректирует расположение экрана в целом. Сме-
щения по координатам - в диапазоне -7...8.


∙SET BEEP тембр, громкость

     Этот оператор задает звучание BEEP. "Тембр" и "громкость" из
диапазона 1...4.

     В таблице 2.14 демонстрируется соответствие "тембра" и полу-
чаемого звука.

	Таблица 2.14 Входные значения тембра BEEP
	┌───────┬───────────────────────────────┐
	│ Тембр	│ 	      Звук		│
	├───────┼───────────────────────────────┤
	│   1	│ высокий (тот же, что в MSX1)	│
	│   2	│ низкий			│
	│   3	│ двухтональный			│
	│   4	│ трехтональный			│
	└───────┴───────────────────────────────┘

∙SET TITLE строковое_выражение[,цвет]

     Этот оператор устанавливает "титульное сообщение" и цвет эк-
рана при запуске системы. "Сообщение" может содержать до 6 симво-
лов. "Цвет" - один из перечисленных в таблице  2.15.  Если  длина
"титульного сообщения" равна 6 символам, после его вывода  клави-
атура ждет нажатия.

	Таблица 2.15 Допустимые цвета для SET TITLE
	┌───────┬───────┬─────────┬─────────┬───────────┐
	│ Число	│   1	│    2	  │    3    │	  4     │
        ├───────┼───────┼─────────┼─────────┼───────────┤
	│ Цвет  │ синий │ зеленый │ красный │ оранжевый │
	└───────┴───────┴─────────┴─────────┴───────────┘

∙SET PROMPT подсказка

     Этот оператор определяет подсказку. "Подсказка" может содер-
жать до 6 символов.


∙SET PASSWORD пароль

     Этот оператор объявляет пароль (строку максимально из 6 сим-
волов), который будет запрашиваться перед  пуском  системы.  Если
пароль назван верно, система продолжает подготовку, как обычно; в
противном случае ожидается правильный пароль. Если запустить сис-
тему с нажатыми клавишами GRAPH и STOP,  запроса  не  происходит.
Пароль можно отменить, указав пустую строку в SET TITLE.


∙SET SCREEN

     Этот оператор запоминает текущие параметры оператора SCREEN.
При запуске системы они выставляются автоматически.  Запоминается
следующее:

Номер экрана для текстового режима
Ширина экрана для текстового режима
Цвета переднего, заднего планов и рамки экрана
Флаг отображения функциональных клавиш
Отзвук клавиш
Опция принтера
Скорость обмена с кассетой
Режим дисплея


2.11 Добавления, связанные с RAM-диском

     На MSX1 адресное пространство 0000H...7FFFH можно  было  ис-
пользовать только в режиме DOS, но на MSX2 этот фрагмент способен
работать как RAM-диск 32К. Формат имени файла описан ниже. Имейте
в виду, что двоеточие, точка, управляющие символы с  ASCII-кодами
00h...1Fh, а также графические символы, коды которых  состоят  из
двух байтов, не могут быть использованы.

     MEM:имя_файла.расширение

С RAM-диском могут работать следующие операции:

     1. Загрузка / запись BASIC-программ (всегда в формате ASCII)

     SAVE, LOAD, RUN, MERGE

Если любая из этих инструкций вызывается из программы, управление
возвращается в командный режим.

     2. Запись / чтение последовательного файла:

     OPEN, CLOSE,
     PRINT #, PRINT USING #
     INPUT #, LINE INPUT #, INPUT$
     EOF, LOC, LOF

RAM-диск не поддерживает следующие процессы:

     1. Чтение/запись файлов произвольного доступа
     2. BLOAD, BSAVE
     3. COPY



∙CALL MEMINI [(размер)]

     Этот оператор отводит заданный объем ОЗУ под RAM-диск,  ини-
циализирует RAM-диск и удаляет все файлы. Всякий "сеанс" работы с
RAM-диском должен начинаться с исполнения данного оператора.

     "Размер" - это "объем памяти для RAM-диска минус  один".  По
умолчанию создается RAM-диск максимального размера.
     "CALL MEMINI (0)" отключает RAM-диск.


∙CALL MFILES

     Этот оператор выводит список файлов, находящихся на RAM-дис-
ке.


∙CALL MKILL ("имя_файла")

     Этот оператор удаляет указанный файл.


∙CALL MNAME ("старое_имя" AS "новое_имя")

     Этот оператор переименовывает указанный файл.



2.12 Другие дополнения


∙PAD (выражение)

     Эта функция возвращает статус  тач-панели,  светового  пера,
мыши или трекбола.

     Если выражение лежит в диапазоне 0...7, возвращается  статус
тач-панели, как и на MSX1; если 8...11, - состояние светового пе-
ра. Поскольку статус кнопки и координаты пера определяются в  мо-
мент срабатывания PAD(8), остальные данные  следует  читать  лишь
после того, как получено подтверждение, что PAD(8) = -1 (см. таб-
лицу 2.16).

	Таблица 2.16 Статус пера, возвращаемый по значению
	┌───────────┬─────────────────────────────────────┐
	│ Выражение │	    Возвращаемое значение	  │
	├───────────┼─────────────────────────────────────┤
	│     8	    │ -1, если данные пера верны, иначе 0 │
	│     9	    │ координата X пера                   │
	│    10	    │ координата Y пера                   │
	│    11	    │ -1, если кнопка пера нажата, иначе 0│
	└───────────┴─────────────────────────────────────┘

     Эта функция возвращает статус мыши или трекбола,  подключен-
ного к порту 1, если выражение равно 12...15, и к порту  2,  если
16...19 (см. таблицу 2.17). Мышь и трекбол различаются  автомати-
чески.

	Таблица 2.17 Статус мыши или трекбола
	┌───────────┬─────────────────────────┐
	│ Выражение │ Возвращаемое значение   │
	├───────────┼─────────────────────────┤
	│  12,16    │ -1 для запроса значений │
	│  13,17    │ координата X	      │
	│  14,18    │ координата Y	      │
	│  15,19    │ 0 (не используется)     │
	└───────────┴─────────────────────────┘

     Данные о координатах читаются после срабатывания PAD(12) или
PAD(16). Для определения состояния  кнопок  используется  функция
STRIG, как и в случае с джойстиком.

Глава 3

MSX2 TECHNICAL HANDBOOK, CHAPTER 3


3. ВНУТРЕННЯЯ СТРУКТУРА ИНТЕРПРЕТАТОРА BASIC

     Чтобы эффективно использовать MSX-BASIC, полезно знать,  как
интерпретатор управляет выполнением программ. Внутренняя структу-
ра BASICа обсуждается ниже.



3.1 Область пользователя

     Нижний адрес пользовательской области  был  непостоянен  для
машин MSX1, объем ОЗУ которых варьировался (8,16,32,64К). В стан-
дарте MSX2 он всегда равен 8000H (т.к. MSX2 имеет, по крайней ме-
ре, 64К памяти); этот адрес указан в ячейке BOTTOM (FC48H).
     Верхний адрес области пользователя без драйверов диска равен
F380H; при активных драйверах (DISK BASIC) он зависит от их коли-
чества и емкости дисков. Этот адрес можно получить из ячейки  HI-
MEM (FC4AH) сразу после запуска системы, прежде чем будет  выпол-
нен первый оператор CLEAR.

Рисунок 2.6 показывает состояние памяти при запуске MSX

	0000┌─────────────────────┐
	    │                     │
	    │ BASIC интерпретатор │
	    │                     │
	8000├─────────────────────┤
	    │       область       │
	    │     пользователя    │
	    ├─────────────────────┤
	    │   дисковая область  │
	F380├─────────────────────┤
	    │  системная область  │
	FFFF└─────────────────────┘

ПРИМЕЧАНИЕ: BASIC непосредственно использует только 32К имеющейся
	    памяти. Остальная память работает как RAM-диск.

     Мы рекомендуем Вам разрабатывать программы в интервале адре-
сов 8000H...DE3FH, резервируя место для двух драйверов 2DD. Помня
о том, что рабочее пространство драйверов может еще  увеличиться,
нужно перед загрузкой программы проверять HIMEM,  чтобы  избежать
катастрофы. Ниже предлагаются пути ее предотвращения:

     1. Делать рабочее пространство перемещаемым
     2. Начинать рабочее пространство от (BOTTOM)
     3. Уменьшать количество дисководов

     Система MSX предоставляет возможность отключить один или оба
дисковода, удерживая при запуске системы  соответственно  клавишу
CTRL и SHIFT. Следует помнить, что даже при наличии единственного
дисковода рабочее пространство все равно отводится под два (симу-
лятор второго диска).



3.2 Подробный обзор области пользователя

     Рисунок 2.7 демонстрирует деление области пользователя, а  в
таблице 2.18 перечислена информация о начальных  адресах  рабочей
области. Эта информация предназначена только для чтения (ее  нас-
траивает процедура инициализации), так что при  ее  корректировке
никаких гарантий Вам не предоставляется.


     Рисунок 2.7 Состояние области пользователя

BOTTOM┌────────────────────────┐ 8000H для MSX2
TXTAB ├────────────────────────┤
      │     BASIC-программа    │
VARTAB├────────────────────────┤ зависит от величины текста
      │   простые переменные   │
ARYTAB├────────────────────────┤
      │   массивы переменных   │
STREND├────────────────────────┤ зависит от числа переменных
      │        свободно        │
[SP]  ├────────────────────────┤ определяется регистром SP Z80A
      │        с т е к         │
STKTOP├────────────────────────┤
      │    строковая область   │ устанавливается CLEAR
MEMSIZ├────────────────────────┤
      │ блок управления файлом │
HIMEM ├────────────────────────┤ устанавливается CLEAR
      │   область ассемблера   │
      └────────────────────────┘ зависит от числа драйверов


Таблица 2.18 Рабочие области с начальными и конечными адресами

┌───────────────┬──────────────────┬────────────────────┐
│    Область	│  Начальный адрес │   Конечный адрес   │
├───────────────┼──────────────────┼────────────────────┤
│ Пользователя	│ (BOTTOM = FC48H) │ (HIMEM  = FC4AH)-1 │
│		│		   │ (после RESET)      │
│ Программная	│ (TXTAB  = F676H) │ (VARTAB = F6C2H)-1 │
│ Простых перем.│ (VARTAB = F6C2H) │ (ARYTAB = F6C4H)-1 │
│ Массивов	│ (ARYAB  = F6C4H) │ (STREND = F6C6H)-1 │
│ Свободная	│ (STREND = F6C6H) │ [SP]-1             │
│ Стек		│ [SP]		   │ (STKTOP = F674H)-1 │
│ Строковая	│ (STKTOP = F674H) │ (MEMSIZ = F672H)-1 │
│ (неиспольз.)	│ (FRETOP = F69BH) │                    │
│ FCB		│ (MEMSIZ = F672H) │ (HIMEM  = FC4AH)-1 │
│ Ассемблера	│ (HIMEM  = FC4AH) │ до конца           │
└───────────────┴──────────────────┴────────────────────┘
     Роль каждой области описывается ниже.



* Область BASIC-программы

     Размер этой области зависит от размеров  программы,  которая
располагается в памяти, начиная с нижнего адреса пользовательско-
го пространства (8000H в MSX2).


* Область переменных

     Область переменных размещается сразу вслед за областью прог-
раммы. Она предназначена для хранения имен и значений переменных,
используемых в программе. Формат их хранения дан на рисунках  2.8
(простые переменные) и 2.9 (массивы). Использование массива,  ко-
торый не был объявлен в операторе DIM вызывает автоматическое вы-
деление памяти под массив с 10 элементами на каждую  размерность.
Но массивы с размерностью больше 4 все-таки нужно объявлять.


     Рисунок 2.8 Формат хранения простых переменных

		 ┌ тип
		┌▼─┬──┬──┬──┬──┐
целые		│02│ имя │число│
		└──┴──┴──┴──┴──┘
одинарной	┌──┬──┬──┬──┬──┬──┬──┐
точности	│04│ имя │   число   │
		└──┴──┴──┴──┴──┴──┴──┘
двойной		┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
точности	│08│ имя │         число         │
		└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
		┌──┬──┬──┬──┬──┬──┐
строковые	│03│     │▲ │     │◀─ адрес строки
		└──┴──┴──┴│─┴──┴──┘
			 ▲└── количество символов
			 │
	адрес, возвращаемый функцией VARPTR



     Рисунок 2.9 Формат хранения массивов

пример: DEFINT A: DIM AA (2,3)	    ┌── значащая часть ──┐
				    │                    │
02  41 41  1D 00  02  04 00  03 00  00 00  00 00 ... 00 00
└┤  └─┬─┘  └─┬─┘  └┤  └─┬─┘  └─┬─┘  └─┬─┘  └─┬─┘     └─┬─┘
тип  имя     │ двумерный│      │    (0,0)  (1,0)     (2,3)
    массива  │   массив │      └ 2 + 1 (первая размерность)
             │          └─────── 3 + 1 (вторая размерность)
	длина значащей
	части в байтах



* Свободная область

     Если свободное пространство исчерпано (область программы или
переменных сильно разрослись, стек переполнен), возникает  ошибка
"OUT OF MEMORY". Объем свободной области можно  проконтролировать
оператором PRINT FRE(0), использующим функцию FRE().


* Область стека

     Эта область используется BASICом в качестве аппаратного сте-
ка. Она заполняется, начиная со старших адресов, по мере срабаты-
вания операторов GOSUB или FOR.


* Строковая область

     Эта область RAM предназначена для хранения символьных  пере-
менных и заполняется, начиная с верхних адресов. Размер этой  об-
ласти указывают в первом параметре оператора CLEAR. По  умолчанию
выделяется 200 байт. Исчерпание свободного места вызывает  ошибку
"OUT OF STRING SPACE". Объем свободной части области можно прове-
рить оператором PRINT FRE(" ").


* FCB (Блок Управления Файлами)

     Здесь хранятся данные о файлах, по 267 байт на  каждый.  Па-
мять под них выделяется с помощью оператора MAXFILES. При запуске
системы резервируется пространство для одного (MAXFILES = 1) фай-
ла. Кроме того, всегда отводится  место  для  инструкций  SAVE  и
LOAD, то есть в действительности отводится область для двух  фай-
лов. В таблице 2.19 показан формат FCB.

		Таблица 2.19 Формат FCB
	┌────────┬────────┬─────────────────────────────┐
	│Смещение│ Метка  │ Назначение			│
	├────────┼────────┼─────────────────────────────┤
	│   +0   │ FL.MOD │ Тип открытого файла		│
	│   +1	 │ FL.FCA │ Указатель (мл.) на FCB BDOS │
	│   +2	 │ FL.LCA │ Указатель (ст.) на FCB BDOS │
	│   +3	 │ FL.LSA │ Резервный символ		│
	│   +4	 │ FL.DSK │ Номер драйвера		│
	│   +5	 │ FL.SLB │ Внутр.использование		│
	│   +6	 │ FL.BPS │ Позиция FL.BUF		│
	│   +7	 │ FL.FLG │ Флаг для различн.информации	│
	│   +8	 │ FL.OPS │ Позиция виртуальной головки	│
	│   +9	 │ FL.BUF │ Буфер (256 байт)		│
	└────────┴────────┴─────────────────────────────┘


* Область процедур на языке ассемблера

     Эту область можно использовать для размещения подпрограмм на
ассемблере или для непосредственного доступа к памяти. Перед  тем
как это сделать, нужно зарезервировать область оператором CLEAR.


* Рабочая область для драйвера диска

     Рисунок 2.10 демонстрирует разметку данной области  при  ак-
тивном драйвере (напоминаем, что этой области попросту нет,  если
дисковод отсутствует). Метки соответствуют адресам.


     Рисунок 2.10 Рабочая область диска

                   │  область пользователя  │
BLDCHK + 1 (F377H) ├────────────────────────┤
                   │ процедуры BLOAD, BSAVE │
                   │       (19H байт)       │
   FCBBASE (F353H) ├────────────────────────┤
                   │        вход  FCB       │ резервируется при
                   │  (25H * (FILMAX) байт) │ подключенном диске
    HIMSAV (F349H) ├────────────────────────┤
                   │    область дискового   │
                   │       интерфейса       │
            F380H  ├────────────────────────┤
                   │    системная область   │



3.3 Формат хранения BASIC-программы

     Программы хранятся в памяти, как показано на  рисунке  2.11;
смысл составляющих формата описан ниже.


     Рисунок 2.11 Формат хранения текста программы

стартовый код текста (8000H)
┌────┐
│ 00 │
└────┘
указатель  номер
сборки    строки     текст      код конца строки (EOL)
┌───────┬───────┬──────────────┬────┐
│ XX XX │ XX XX │ XX XX ... XX │ 00 │
└───────┴───────┴──────────────┴────┘
    :       :           :         :
    :       :           :         :
код конца текста (EOT)
┌───────┐
│ 00 00 │
└───────┘

Примечание: В указателе сборки и номере строки младший байт пред-
	    шествует старшему.


* Указатель сборки

     Указатель на следующую строку текста, представленный в форме
абсолютного адреса.


* Номер строки

     Хранит номер строки программы; нормальное значение от  0  до
65529 (0000H...FFF9H). Можно задать номера 65530 и более, но  ко-
манда LIST не будет их выводить.


* Текст

     Тело программы хранится во  внутреннем  промежуточном  коде.
Резервированные слова, операторы и числовые значения преобразуют-
ся в промежуточные коды, остальные слова (такие, как имена  пере-
менных или строковые константы) имеют вид цепочки ASCII-символов.
В таблице 2.20 представлен список внутренних кодов, а на  рисунке
2.12 показаны числовые форматы в тексте BASIC-программы.

     См. ASCII-коды символов в приложении в конце  книги.  Графи-
ческие символы хранятся в виде двух байтов: CHR$(1) + (код симво-
ла + 64), так что будьте внимательны, когда обрабатываете  графи-
ческие символы.


     Таблица 2.20 Список внутренних промежуточных кодов
	┌───────────────┬───────┐┌──────────────┬───────┐
	│ >		│    EE ││ LIST		│    93 │
	│ =		│    EF ││ LLIST	│    9E │
	│ <		│    F0 ││ LOAD		│    B5 │
	│ +		│    F1 ││ LOC		│ FF AC │
	│ -		│    F2 ││ LOCATE	│    D8 │
	│ *		│    F3 ││ LOF		│ FF AD │
	│ /		│    F4 ││ LOG		│ FF 8A │
	│ ^		│    F5 ││ LPOS		│ FF 9C │
	│ $		│    FC ││ LPRINT	│    9D │
	│ ABS		│ FF 86 ││ LSET		│    B8 │
	│ AND		│    F6 ││ MAX		│    CD │
	│ ASC		│ FF 95 ││ MERGE	│    B6 │
	│ ATN		│ FF 8E ││ MID$		│ FF 83 │
	│ ATTR$		│    E9 ││ MKD$		│ FF B0 │
	│ AUTO		│    A9 ││ MKI$		│ FF AE │
	│ BASE		│    C9 ││ MKS$		│ FF AF │
	│ BEEP		│    C0 ││ MOD		│    FB │
	│ BIN$		│ FF 9D ││ MOTOR	│    CE │
	│ BLOAD		│    CF ││ NAME		│    D3 │
	│ BSAVE		│    D0 ││ NEW		│    94 │
	│ CALL		│    CA ││ NEXT		│    83 │
	│ CDBL		│ FF A0 ││ NOT		│    E0 │
	│ CHR$		│ FF 96 ││ OCT$		│ FF 9A │
	│ CINT		│ FF 9E ││ OFF		│    EB │
	│ CIRCLE	│    BC ││ ON		│    95 │
	│ CLEAR		│    92 ││ OPEN		│    B0 │
	│ CLOAD		│    9B ││ OR		│    F7 │
	│ CLOSE		│    B4 ││ OUT		│    9C │
	│ CLS		│    9F ││ PAD		│ FF A5 │
	│ CMD		│    D7 ││ PAINT	│    BF │
	│ COLOR		│    BD ││ PDL		│ FF A4 │
	│ CONT		│    99 ││ PEEK		│ FF 97 │
	│ COPY		│    D6 ││ PLAY		│    C1 │
	│ COS		│ FF 8C ││ POINT	│    ED │
	│ CSAVE		│    9A ││ POKE		│    98 │
	│ CSNG		│ FF 9F ││ POS		│ FF 91 │
	│ CSRLIN	│    E8 ││ PRESET	│    C3 │
	│ CVD		│ FF AA ││ PRINT	│    91 │
	│ CVI		│ FF A8 ││ PSET		│    C2 │
	│ CVS		│ FF A9 ││ PUT		│    B3 │
	│ DATA		│    84 ││ READ		│    87 │
	│ DEF		│    97 ││ REM		│ 3A 8F │
	│ DEFDBL	│    AE ││ RENUM	│    AA │
	│ DEFINT	│    AC ││ RESTORE	│    8C │
	│ DEFSNG	│    AD ││ RESUME	│    A7 │
	│ DEFSTR	│    AB ││ RETURN	│    8E │
	│ DELETE	│    A8 ││ RIGHT$	│ FF 82 │
	│ DIM		│    86 ││ RND		│ FF 88 │
	│ DRAW		│    BE ││ RSET		│    B9 │
	│ DSKF		│ FF A6 ││ RUN		│    8A │
	│ DSKI$		│    EA ││ SAVE		│    BA │
	│ DRAW		│    BE ││ SCREEN	│    C5 │
	│ DSKF		│ FF A6 ││ SET		│    D2 │
	│ DSKI$		│    EA ││ SGN		│ FF 84 │
	│ DSKO$		│    D1 ││ SIN		│ FF 89 │
	│ ELSE		│ 3A A1 ││ SOUND	│    C4 │
	│ END		│    81 ││ SPACE$	│ FF 99 │
	│ EOF		│ FF AB ││ SPC		│    DF │
	│ EQV		│    F9 ││ SPRITE	│    C7 │
	│ ERASE		│    A5 ││ SQR		│ FF 87 │
	│ ERL		│    E1 ││ STEP		│    DC │
	│ ERR		│    E2 ││ STICK	│ FF A2 │
	│ ERROR		│    A6 ││ STOP		│    90 │
	│ EXP		│ FF 8B ││ STR$		│ FF 93 │
	│ FIELD		│    B1 ││ STRIG	│ FF A3 │
	│ FILES		│    B7 ││ STRING$	│    E3 │
	│ FIX		│ FF A1 ││ SWAP		│    A4 │
	│ FN		│    DE ││ TAB(		│    DB │
	│ FOR		│    82 ││ TAN		│ FF 8D │
	│ FPOS		│ FF A7 ││ THEN		│    DA │
	│ FRE		│ FF 8F ││ TIME		│    CB │
	│ GET		│    B2 ││ TO		│    D9 │
	│ GOSUB		│    8D ││ TROFF	│    A3 │
	│ GOTO		│    89 ││ TRON		│    A2 │
	│ HEX$		│ FF 9B ││ USING	│    E4 │
	│ IF		│    8B ││ USR		│    DD │
	│ IMP		│    FA ││ VAL		│ FF 94 │
	│ INKEY$	│    EC ││ VARPTR	│    E7 │
	│ INP		│ FF 90 ││ VDP		│    C8 │
	│ INPUT		│    85 ││ VPEEK	│ FF 98 │
	│ INSTR		│    E5 ││ VPOKE	│    C6 │
	│ INT		│ FF 85 ││ WAIT		│    96 │
	│ IPL		│    D5 ││ WIDTH	│    A0 │
	│ KEY		│    CC ││ XOR		│    F8 │
	│ KILL		│    D4 │└──────────────┴───────┘
	│ LEFT$		│ FF 81 │
	│ LEN		│ FF 92 │
	│ LET		│    88 │
	│ LFILES	│    BB │
	│ LINE		│    AF │
	└───────────────┴───────┘



     Рисунок 2.12 Формат чисел в тексте

			┌────┬───────┐
Восьмиричное (&O)	│ 0B │ XX XX │
			└────┴───────┘
			┌────┬───────┐
Шестнадцатиричное (&H)	│ 0C │ XX XX │
			└────┴───────┘
			┌────┬───────┐
Номер строки после RUN	│ 0D │ XX XX │
			└────┴───────┘
(Абсолютный адрес строки-источника для процедуры ветвления)

			┌────┬───────┐
Номер строки до RUN	│ 0Е │ XX XX │
			└────┴───────┘
(Номер строки-источника в инструкции ветвления. После RUN код
превращается в 0DH и номер строки меняется на абсолютный адрес)

			┌────┬────┐
Целое от 10 до 255 (%)	│ 0F │ XX │
			└────┴────┘
			┌───────┐
Целое от 0 до 9 (%)	│ 11-1A │
			└───────┘
			┌────┬───────┐
Целое от 256 до 32767	│ 1C │ XX XX │
			└────┴───────┘
			┌────┬─────────────┐
Одинарной точности (!)	│ 1D │ XX XX XX XX │
			└────┴─────────────┘
			┌────┬─────────────────────────┐
Двойной точности (#)	│ 1F │ XX XX XX XX XX XX XX XX │
			└────┴─────────────────────────┘
			┌───┬───┬─ ─ ─ ─ ─ ─ ─ ─ ─ ─┐
Двоичное (&B)		│"&"│"B"│ символы "0" и "1" │
			└───┴───┴─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘

     Чтобы отличать числа от резервированных слов и имен перемен-
ных, им присвоены "идентификационные коды"; кроме того, обращени-
ем к этим кодам можно распознать тип числа.

     Старший и младший байты двухбайтовых чисел хранятся в обрат-
ном порядке. Числа со знаком имеют внутренний код "+" или "-" пе-
ред идентификационным кодом, в то время как  собственно  цифровая
часть всегда хранится как положительное число.  Нотация  чисел  с
плавающей точкой большей частью та же, что и в Математическом Па-
кете ПРИЛОЖЕНИЯ, с единственным отличием: цифровая  часть  всегда
хранится как положительное число. Двоичные числа  (&B)  не  имеют
идентификационного кода и хранятся в виде цепочки ASCII-символов.
MSX2 TECHNICAL HANDBOOK, CHAPTER 2



4. СТЫКОВКА С ПРОЦЕДУРАМИ НА АССЕМБЛЕРЕ

     Из предшествующего описания должно быть ясно, что MSX  BASIC
располагает достаточной мощностью для большинства задач,  однако,
если Вам захочется ускорить работу программы или полнее использо-
вать аппаратные возможности MSX2, Вам следует применить язык  ас-
семблера. В следующем разделе рассказано, как вызывать ассемблер-
ные подпрограммы из BASICa; здесь же сообщается  другая  полезная
информация, которая Вам при этом понадобится.


4.1 Функция USR

     Чтобы вызвать из BASICа подпрограмму на ассемблере, выполни-
те последовательно описанные ниже действия. Значение, указанное в
скобках после USR, передается в подпрограмму как аргумент.  Аргу-
мент может быть как числовым, так и строковым.

     1. Укажите стартовый адрес подпрограммы в DEF USR.
     2. Вызовите подпрограмму при помощи функции USR.
     3. Чтобы вернуться в BASIC, выполните RET (C9H).

Пример: Чтобы вызвать ассемблерную процедуру, адрес которой равен
	C000H, выполните:

     DEF USR = &HC000
     A = USR (0)


4.2 Обмен данными с процедурой на ассемблере через  аргумент
              и возврат значения функции USR.

     При передаче аргумента из BASICа в подпрограмму на ассембле-
ре тип аргумента можно распознать, проверив регистр A (см. табли-
цу 2.21). Поскольку значение передается в той же форме, что и  на
рисунке 2.13, Вы всегда сможете расшифровать аргумент,  зная  его
формат. Например, листинг 2.1 представляет пример программы,  ко-
торая получает аргумент строкового типа.

  Таблица 2.21 Типы аргумента, передаваемые в регистре A
	┌─────┬──────────────────────────────────┐
	│  2  │ 2-байтовый целый		 │
	│  3  │ строковый			 │
	│  4  │ действительный однарной точности │
	│  8  │ действительный двойной точности  │
	└─────┴──────────────────────────────────┘

     Рисунок 2.13  Как передаются аргументы

2-байтовый целый:
	  +0   +1   +2   +3
	┌────┬────┬────┬────┐
	│ xx │ xx │ Мл.│ Ст.│  "xx" - все, что угодно
	└────┴────┴────┴────┘
	└─ адрес в регистре HL

действительный (любой точности):
	  +0   +1   ...
	┌────┬─ ─ ─ ─ ─ ─ ─ ┐
	│Эксп│   Мантисса   │
	└────┴─ ─ ─ ─ ─ ─ ─ ┘
	└─ адрес в регистре HL

строковый:
	  +0   +1   +2
	┌────┬────┬────┐ Эти три байта обычно
	│Длина Мл.│ Ст.│ называются дескриптором
	└────┴────┴────┘ строки
	▲    └────┬────┘
	│	указатель на адрес строки
	└─ адрес в регистре DE


;=====================================================
; Листинг 2.1	печать строки с помощью USR
; для вызова выполнить DEFUSR=&HB000: A$=USR("строка")
;=====================================================
CHPUT	EQU	00A2H		; вывод одного символа

	ORG	0B000H

RDARG:	CP	3
	RET	NZ		; параметр - не строка

	PUSH	DE
	POP	IX		; IX <- дескриптор
	LD	A,(IX+0)	; взять длину строки
	LD	L,(IX+1)
	LD	H,(IX+1)	; взять указатель
	OR	A
	RET	Z		; если длина = 0

RD1:	PUSH	AF
	LD	A,(HL)		; взять символ
	CALL	CHPUT		; напечатать символ
	POP	AF
	DEC	A
	RET	Z
	INC	HL
	JR	RD1

	END
;=====================================================

     С другой стороны, эти значения, переданные в качестве  аргу-
ментов, могут быть возвращены в BASIC как результаты функции USR,
после некоторой их обработки в подпрограмме. В  этом  случае  тип
возвращаемого значения должен быть приведен в соответствие  путем
корректировки ячейки VALTYP (F663H). Помните, что количество сим-
волов в строке менять нельзя.


4.3 Создание новых команд

     На MSX резервные слова CMD и IPL пока не заняты, поэтому из-
меняя их внутренние указатели (FE0DH и FE03H) таким образом, что-
бы выполнялся переход на  Вашу  собственную  подпрограмму,  можно
построить новые команды языка. Листинг 2.2 демонстрирует  простой
пример:

;=========================================================
; Листинг 2.2  создание команды CMD (вкл / выкл CAPS LOCK)
; для инициализации команды: DEFUSR=&HB000:A=USR(0)
; для использования команды: CMD
;=========================================================
CHGCAP	EQU	0132H		; вкл/выкл лампы CAPS 
CAPST	EQU	0FCABH		; статус CAPS LOCK
HCMD	EQU	0FE0D		; hook (ловушка) CMD

	ORG	0B000H

; ----- Инициализация CMD ----- Исполнение этого фрагмента
;       			активизирует команду CMD
	LD	BC,5
	LD	DE,HCMD
	LD	HL,HDAT
	LDIR
	RET

; ----- Новые данные для hook -----

HDAT:	POP	AF
	JP	CAPKEY
	NOP

; ----- Срабатывает по CMD ----- Фактически CMD

CAPKEY:	CALL	CHGCAP
	LD	A,(CAPST)
	CPL
	LD	(CAPST),A
	RET

	END
;=====================================================

     Первый POP AF, записанный в указатель, в нашем случае устра-
няет адрес обработки ошибки, помещаемый в стек перед  исполнением
команды CMD, иначе команда RET сделает переход на процедуру обра-
ботки ошибки, вместо того, чтобы вернуться в BASIC. В этом состо-
ит один из путей печати ошибки внутри пользовательской процедуры.
     Оба указателя зарезервированы для будущего  расширения,  по-
этому их не рекомендуется использовать в разработках,  предназна-
ченных для продажи.


4.4 Расширение команды CMD

     Чтобы еще больше повысить "интеллект" нашего оператора, было
бы полезным научиться передавать ему аргументы. Поскольку регистр
HL при вызове подпрограммы указывает на позицию, следующую в тек-
сте программы непосредственно за CMD, передачу можно  осуществить
путем дальнейшего разбора строки. Ниже дан список полезных  внут-
ренних подпрограмм:

∙CHRGTR (4666H/MAIN)

     Выделить один символ из текста (см.рисунок 2.14)
     ВХОД: адрес в HL
     ВЫХОД: в HL - адрес выделенного символа
     в A - выделенный символ
     флаг Z - выставлен, если конец строки (":" или 00H)
     флаг C - выставлен для цифр 0...9
     НАЗНАЧЕНИЕ: берет один байт по адресу (HL+1), пробелы  игно-
рируются


∙FRMEVL (4C64H/MAIN)

     Вычислить выражение, встретившееся в тексте
     ВХОД: адрес выражения в HL
     ВЫХОД: в HL - адрес после вычисления выражения
     [VALTYP(F663H)]  -  2,3,4,8  в  зависимости   от   типа
результата
     [DAC(F7F6H)] - результат вычисления
     НАЗНАЧЕНИЕ: вычислить выражение в соответствии с его типом


∙FRMQNT (542FH/MAIN)

     Вычислить выражение 2-байтового целого типа
     ВХОД: в HL - начальный адрес выражения
     ВЫХОД: в HL - адрес после выражения
     в DE - результат вычислений
     НАЗНАЧЕНИЕ: вычислить выражение и превратить результат в це-
лый тип. Если результат превышает диапазон 2-байтового целого ти-
па, возникает ошибка "Overflow" (переполнение), и система возвра-
щается в командный режим BASIC


∙GETBYT (521CH/MAIN)

     Вычислить выражение 1-байтового целого типа
     ВХОД: в HL - начальный адрес выражения
     ВЫХОД: в HL - адрес после выражения
     в A и E - результат вычислений (одно и то же значение)
     НАЗНАЧЕНИЕ: вычислить выражение и превратить результат в це-
лый тип. Если результат превышает диапазон 1-байтового целого ти-
па, возникает ошибка "Illegal function call" (недопустимый  вызов
функции), и система возвращается в командный режим BASIC
     

∙FRESTR (67D0H/MAIN)

     Зарегистрировать строку
     ВХОД: [VALTYP(F663H)] - тип (если не строка,  возникает
ошибка)
     [DAC(F7F6H)] - указатель на дескриптор строки
     ВЫХОД: в HL - указатель на дескриптор строки
     НАЗНАЧЕНИЕ: зарегистрировать результат строкового типа,  вы-
численный с помощью FRMEVL и получить его  строковый  дескриптор.
При обработке строки эта подпрограмма обычно сочетается с FRMEVL,
описанной выше, следующим образом:

	 :
	CALL	FRMEVL
	PUSH	HL	; сохранить текстовый указатель
	CALL	FRESTR
	EX	DE,HL	; получить строковый дескриптор
	POP	HL
	LD	A,(DE)	; получить длину строки
	 :


∙PTRGET (5EA4H/MAIN)

     Получить адрес для хранения переменной
     ВХОД: в HL - начальный адрес имени переменной в тексте
     [SUBFLG(F6A5H)] = 0, если  простая  переменная,  не  0,
если массив
     ВЫХОД: в HL - адрес после имени переменной
     в DE - адрес, где хранится значение переменной
     НАЗНАЧЕНИЕ: получить адрес  хранения  переменной  (массива).
Если переменная не была размещена, выполняется ее размещение. Ес-
ли значение SUBFLG установлено не равным нулю, получается старто-
вый адрес всего массива в целом, иначе - отдельного элемента мас-
сива.


∙NEWSTT (4601H/MAIN)

     Исполнить текст
     ВХОД: в HL -  начальный  адрес  текста,  который  нужно
выполнить
     ВЫХОД: ---
     НАЗНАЧЕНИЕ: выполнить текст. Вид текста должен  быть  таким,
как показано на рисунке 2.17


	Рисунок 2.14 Состояние на входе и выходе CHRGTR

На входе
─┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─ Текст на BASICе
 │ A │ _ │ = │ 0 │ : │ _ │ B │ = │ 0 │  в промежуточном
─┴─▲─┴───┴───┴───┴───┴───┴───┴───┴───┴─     формате
   └─ HL

Первый проход: A◀─ [=]
─┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─
 │ A │ _ │ = │ 0 │ : │ _ │ B │ = │ 0 │  пробелы пропущены
─┴───┴───┴─▲─┴───┴───┴───┴───┴───┴───┴─
	   └─ HL

Второй проход: A◀─ [0] CY◀─ 1
─┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─ CY выставлен, если
 │ A │ _ │ = │ 0 │ : │ _ │ B │ = │ 0 │  прочитано число
─┴───┴───┴───┴─▲─┴───┴───┴───┴───┴───┴─
	       └─ HL

Третий проход: A◀─ [:] Z◀─ 1
─┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─ Z выставлен, если
 │ A │ _ │ = │ 0 │ : │ _ │ B │ = │ 0 │  прочитан конец
─┴───┴───┴───┴───┴─▲─┴───┴───┴───┴───┴─ строки
	   	   └─ HL


	Рисунок 2.15 Состояние на входе и выходе FRMEVL

На входе
─┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─
 │ B │ = │ A │ * │ 3 │ + │ 1 │ 0 │ 0 │ / │ 2 │ 0 │ 0 │ : │ C │ = │ 0 │
─┴───┴───┴─▲─┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴─
	   └─ HL
На выходе
─┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─
 │ B │ = │ A │ * │ 3 │ + │ 1 │ 0 │ 0 │ / │ 2 │ 0 │ 0 │ : │ C │ = │ 0 │
─┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴─▲─┴───┴───┴───┴─
	   └────────────────────┬──────────────────┘   └─ HL
DAC◀─ [вычисленный результат]◀──┘
VALTYP◀── тип результата


	Рисунок 2.16 Состояние на входе и выходе PTRGET

На входе: SUBFLG = 0
─┬───┬───┬───┬───┬───┬─
 │ A │ A │ = │ B │ B │
─┴─▲─┴───┴───┴───┴───┴─
   └─ HL

На выходе: DE◀─ [xx xx] - адрес переменной AA
─┬───┬───┬───┬───┬───┬─
 │ A │ A │ = │ B │ B │
─┴───┴───┴─▲─┴───┴───┴─
	   └─ HL


На входе: SUBFLG = 0
─┬───┬───┬───┬───┬───┬───┬───┬───┬─
 │ A │ A │ ( │ 3 │ ) │ = │ B │ B │
─┴─▲─┴───┴───┴───┴───┴───┴───┴───┴─
   └─ HL

На выходе: DE◀─ [xx xx] - адрес переменной AA(3)
─┬───┬───┬───┬───┬───┬───┬───┬───┬─
 │ A │ A │ ( │ 3 │ ) │ = │ B │ B │
─┴───┴───┴───┴───┴───┴─▲─┴───┴───┴─
		       └─ HL

На входе: SUBFLG = 1
─┬───┬───┬───┬───┬───┬───┬───┬───┬─
 │ A │ A │ ( │ 3 │ ) │ = │ B │ B │
─┴─▲─┴───┴───┴───┴───┴───┴───┴───┴─
   └─ HL

На выходе: DE◀─ [xx xx] - адрес всего массива AA()
─┬───┬───┬───┬───┬───┬───┬───┬───┬─
 │ A │ A │ ( │ 3 │ ) │ = │ B │ B │
─┴───┴───┴───┴───┴───┴─▲─┴───┴───┴─
		       └─ HL



     Рисунок 2.17 Настройка памяти для NEWSTT

здесь содержатся внутренние коды BASICа
         │
┌────────┴────────┐
  3AH   94H   00H
┌─────┬─────┬─────┬─
│  :  │ NEW │ STOP│
└─────┴─────┴─────┴─
   ▲
   └─ HL


     Поскольку все эти подпрограммы предназначены для  текста  на
BASICе, при возникновении ошибок производится аналогичная их  об-
работка. В этом случае, измененив ловушку H.ERRO (FFB1H), пользо-
ватель может обработать ошибку самостоятельно (регистр E содержит
номер ошибки) (см. Листинг 2.3)

; =========================================================
; Листинг 2.3  Ваша собственная обработка ошибки
; для использования выполнить: DEFUSR=&HB000:A=USR(0)
; =========================================================

HERR	EQU	0FFB1H		; ловушка ошибки
SYNERR	EQU	2		; код синтаксической ошибки
CHPUT	EQU	0A2H		; вывод символа
NEWSTT	EQU	4601H		; run
READYR	EQU	409BH

	ORG	0B000H

; ----- инициализация команды ----- измененяется процедура
;				    обработки ошибок
	LD	BC,5
	LD	DE,HERR
	LD	HL,HDAT
	LDIR
	RET

HDAT:	JP	ERROR
	NOP
	NOP

; ----- процедура обработки ----- тело процедуры

ERROR:	LD	A,E		; E содержит номер ошибки
	CP	SYNERR		; синтаксическая ?
	RET	NZ		; нет

	LD	HL,DATA1	; да
LOOP:	LD	A,(HL)		; вывести сообщение
	CP	'$'
	JR	Z,EXIT
	PUSH	HL
	CALL	CHPUT
	POP	HL
	INC	HL
	JR	LOOP

EXIT:	JP	READYR		; теплый старт BASICа

DATA1:	DEFM	"Оп-ля!!"	; новое сообщение
	DEFB	07H,07H,07H,'$'

	END
; =========================================================


4.5 Использование прерываний

     Микропроцессор Z80 имеет входы прерываний INT и  NMI,  но  в
MSX применяется только вход INT. На него подается сигнал с часто-
той 60 Hz, поэтому прерывания по таймеру происходят 60 раз в  се-
кунду. Поскольку режим Z80 выставлен в 1, по прерыванию вызывает-
ся адрес 38H, и затем управление передается процедуре  обработки,
поддерживающей разнообразные операции (например, ввод с клавиату-
ры).
     Процедура обработки прерываний совершает переход  к  ловушке
H.TIMI (FD9FH), что дает возможность подключать к ней  Ваши  соб-
ственные функции. Хотя ловушка чаще всего  содержит  только  RET,
будьте внимательны: если к машине подключена периферия (например,
дисковод), эта ловушка может оказаться занятой. В  таких  случаях
неосторожное вмешательство способно вызвать сбои в работе перифе-
рии, поэтому нужна корректная предварительная подготовка машины.

     Листинг 2.4 дает соответствующий пример:
; =========================================================
; Листинг 2.4 Как безопасно использовать HOOK
; Эта подпрограмма использует таймер для мигания лампой CAPS
; Для начала: DEFUSR=&HB000:A=USR(0)
; Для остановки: DEFUSR=&HB030:A=USR(0)
; =========================================================

CHGCAP	EQU	0132H		; вкл/выкл CAPS
CAPST	EQU	0FCABH		; статус CAPS
TIMI	EQU	0FD9FH		; ловушка прерываний
JPCODE	EQU	0C3H
TIMER	EQU	020H

	ORG	0B000H

; ----- включить прерывания -----

INTON:	DI
	LD	HL,TIMI
	LD	DE,HKSAVE
	LD	BC,5
	LDIR			; сохранить старый HOOK

	LD	A,JPCODE
	LD	(TIMI),A
	LD	HL,INT
	LD	(TIMI+1),HL	; поставить новый HOOK
	EI
	RET

; ----- выключить прерывания -----

INTOFF:	DI
	LD	HL,HKSAVE	; восстановить старый HOOK
	LD	DE,TIMI
	LD	BC,5
	LDIR
	EI
	RET

; ----- процедура обработки -----

INT:	PUSH	AF
	LD	A,(CAPST)
	OR	A
	JR	Z,CAPON

CAPOFF:	LD	A,(COUNT1)
	DEC	A
	LD	(COUNT1),A
	JR	NZ,FIN
	LD	A,TIMER
	LD	(COUNT1),A
	XOR	A
	LD	(CAPST),A
	LD	A,0FFH
	CALL	CHGCAP
	JR	FIN

CAPON:	LD	A,(COUNT2)
	DEC	A
	LD	(COUNT2),A
	JR	NZ,FIN
	LD	A,TIMER
	LD	(COUNT2),A
	LD	A,0FFH
	LD	(CAPST),A
	XOR	A
	CALL	CHGCAP
	JR	FIN

FIN:	POP	AF
	CALL	HKSAVE
	RET

COUNT1:	DEFB	TIMER
COUNT2:	DEFB	TIMER

HKSAVE:	NOP
	NOP
	NOP
	NOP
	RET

	END
MSX2 TECHNICAL HANDBOOK, CHAPTER 2


5. ЗАМЕЧАНИЯ ПО РАЗРАБОТКЕ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

     Существует несколько соображений, которые рекомендуется учи-
тывать, чтобы обеспечить работоспособность Ваших программ на  лю-
бом MSX-компьютере. Данный раздел описывает эти вопросы и сообща-
ет прочую полезную информацию, которая поможет Вам в работе.


∙ BIOS

     Задача BIOS - отделить программную часть компьютера от аппа-
ратной и сделать так, чтобы различия в аппаратуре не  сказывались
на работе программ. Разработки, предназначенные для распродажи, в
обязательном порядке должны использовать BIOS (исключение состав-
ляет VDP).

     BIOS вызывается через таблицу переходов, которая  начинается
в MAIN-ROM с адреса 0000H. Кроме того, MSX2 имеет подобную табли-
цу в SUB-ROM, для вызова расширенных функций. Фактические  адреса
и содержимое подпрограмм BIOS могут изменяться в связи с  модифи-
кацией аппаратуры или расширением функций, поэтому Ваша программа
не должна обращаться к ним напрямую. И хотя в этой книге  присут-
ствуют примеры, противоположные сказанному, принимайте их к  све-
дению, но не следуйте им (см. список входных точек BIOS в  ПРИЛО-
ЖЕНИИ). Вместе с тем, программам  разрешается  напрямую  вызывать
Математический Пакет и внутренние процедуры, которые были описаны
выше, поскольку в будущем они не изменятся.


∙ Рабочая область

     Адреса F380H...FFFFH не могут использоваться, так как  здесь
расположена рабочая область BIOS и BASIC-интерпретатора.  Свобод-
ное пространство в этой области тоже нельзя применять, потому что
оно приготовлено для будущего расширения. Смотрите также "3.1 Об-
ласть пользователя" о дисковом пространстве.


∙ Инициализация RAM и указателя стека

     Когда машина включается, состояние RAM непредсказуемо, и все
области, кроме системной, не инициализированы.  Программы  должны
производить инициализацию сами. На этот факт нужно обратить  осо-
бое внимание, потому что встречались экземпляры программ, которые
ожидали, что память будет содержать только нули, и по этой причи-
не оказывались неработоспособными.

     Значение указателя стека после вызова процедуры INIT в  кат-
ридже непредсказуемо (раздел 7 главы 5). По этой причине програм-
мы, которые не настраивают стек, получают непредсказуемые резуль-
таты. Это означает, что программы, которые запускаются процедурой
INIT и продолжают работу без доступа к периферии (драйверам,  ин-
терпретатору) должны самостоятельно настраивать указатель стека.


∙ Рабочая область для расширенной BIOS

     Если используются вызовы расширенной BIOS, стек должен  раз-
мещаться над C000H, чтобы процессор мог обращаться к рабочей  об-
ласти в момент переключения слота. По тем же соображениям FCB RS-
232C должен занимать адрес над 8000H.


∙ Рабочая область драйверов устройств и пр.

     Особое внимание следует уделить размещению рабочих  областей
тех программ, которые располагаются в памяти одновременно с  дру-
гими программами, - таких как драйверы устройств или подпрограммы
BASICа на машинном языке.

     Процедура катриджа INIT изменяет BOTTOM (FC48H), резервирует
область между старым BOTTOM и новым BOTTOM под свою рабочую  зону
и записывает ее адрес в 2-байтовую ячейку SLTWRK  (FD09H),  выде-
ленную для каждого слота. Подробнее см. раздел 7 главы 5.


∙ HOOK (ловушка)

     При использовании катриджа RS-232C требуется изменить ловуш-
ку (hook) прерываний; но если другой катридж уже занял эту ловуш-
ку, RS-232C не может использовать ее только "для себя". Для выхо-
да из такой ситуации скопируйте имеющееся значение ловушки в дру-
гое место RAM и обеспечьте передачу управления по прерыванию обо-
им катриджам. Подробнее см. раздел 7 главы 5.

     Рисунок 2.18 Инициализация HOOK
	┌──────┐     ┌─────────────┐
	│ HOOK ├────▶│ программа 1 │
	│      │◀────│             │
	└──────┘     └─────────────┘
	┌──────┐     ┌─────────────┐     ┌─────────────┐
	│ HOOK ├────▶│ программа 1 ├────▶│ программа 2 │
	│      │◀────│             │◀────│             │
	└──────┘     └─────────────┘     └─────────────┘



∙ Инициализация VRAM

     VRAM нужно инициализировать, поскольку ее содержимое при за-
пуске программы непредсказуемо.


∙ Емкость VRAM

     Емкость VRAM можно определить по битам 1  и  2  ячейки  MODE
(FAFCH) (см. таблицу 2.22).

     Таблица 2.22 Получение информации о емкости VRAM
	┌───────────┬─────────────┐
	│  [FAFCH]  │   Емкость   │
	├─────┬─────┤		  │
	│Бит 1│Бит 2│		  │
	├─────┼─────┼─────────────┤
	│  0  │  0  │  16K (MSX1) │
	│  0  │  1  │  64K (MSX2) │
	│  1  │  0  │ 128K (MSX2) │
	└─────┴─────┴─────────────┘


∙ Номер версии BASICа

     Чтобы определить в программе номер версии BASICа, можно вос-
пользоваться следующими методами:
     1. Прочтите содержимое ячейки 002DH MAIN-ROM  (00H  означает
версию 1.0, 01H - версию 2.0)
     2. В версии 2.0 и более поздних, EXBRSA (FAF8H) содержит но-
мер слота SUB-ROM. Если его нет (00H), версия 1.0


∙ Международный MSX

     Существуют различные MSX для разных стран. Для каждой страны
свои:
     - оформление клавиатуры
     - набор символов
     - формат PRINT USING
     - частота таймера

     Версия машины может быть определена чтением идентификатора в
ROM (рисунок 2.19); соответсвие машины каждой стране можно узнать
из таблицы 2.23.

     Рисунок 2.19 Содержимое идентификатора

┌─────┐ b0 ┐ знакогенератор:
│ 2BH │ b1 │ 0:Япония, 1:США, 2:СССР, и т.д.
└─────┘ b2 │
	b3 ┘
	b4 ┐ формат даты:
	b5 │ 0:Y/M/D, 1:M/D/Y, 2:D/M/Y
	b6 ┘
	b7 ─ частота прерываний: 0:60Hz, 1:50Hz

┌─────┐ b0 ┐ клавиатура:
│ 2CH │ b1 │ 0:Япония, 1:США, 2:Франция,
└─────┘ b2 │ 3:Англия, 4:Германия, 5:СССР
	b3 ┘ 6:Испания
	b4 ┐
	b5 │ сведения о PRINT USING и пр.
	b6 │
	b7 ┘


     Таблица 2.23 MSX-формат для каждой страны
┌────────┬───────────┬───────────┬─────────┬──────────────────────┐
│	 │	     │		 │Начальный│	  PRINT USING	  │
│ Страна │ТВ стандарт│Формат даты│  режим  │указание│символ│символ│
│	 │	     │		 │ экрана  │ длины  │замены│валюты│
│	 │	     │		 │	   │строки  │	   │	  │
├────────┼───────────┼───────────┼─────────┼────────┼──────┼──────┤
│Япония  │NTSC (60Hz)│  ГГ/ММ/ДД │ Screen 1│   &    │  @   │ йена │
│Англия  │PAL  (50Hz)│  ДД/ММ/ГГ │ Screen 0│   \    │  &   │ фунт │
│Междунар│PAL  (50Hz)│  ММ/ДД/ГГ │ Screen 0│   \    │  &   │доллар│
│США     │NTSC (60Hz)│  ММ/ДД/ГГ │ Screen 0│   \    │  &   │доллар│
│Франция │SECAM(50Hz)│  ДД/ММ/ГГ │ Screen 0│   \    │  &   │доллар│
│Германия│PAL  (60Hz)│  ДД/ММ/ГГ │ Screen 0│   \    │  &   │доллар│
│СССР    │NTSC (50Hz)│  ММ/ДД/ГГ │ Screen 0│   \    │  &   │доллар│
│Испания │PAL  (50Hz)│  ММ/ДД/ГГ │ Screen 0│   \    │  &   │доллар│
└────────┴───────────┴───────────┴─────────┴────────┴──────┴──────┘


∙ ESCAPE-последовательность

     MSX может управляться через код ESCAPE, который используется
при выводе на консоль оператором PRINT и процедурами BIOS и  BDOS
(MSX-DOS). ESCAPE-последовательности являются подмножествами тер-
миналов DEC VT52 и Heathkit H19.

┌─────────────────────────────────────────────────┐
│ ∙ Перемещение курсора				  │
├─────────────────────────────────────────────────┤
│ <ESC>A	сдвиг курсора вверх		  │
│ <ESC>B	сдвиг курсора вниз		  │
│ <ESC>C	сдвиг курсора вправо		  │
│ <ESC>D	сдвиг курсора влево		  │
│ <ESC>H	установка в левый верхний угол	  │
│ <ESC>Y<Y+20H><X+20H>	установка в позицию (X,Y) │
├─────────────────────────────────────────────────┤
│ ∙ Редактирование, удаление			  │
├─────────────────────────────────────────────────┤
│ <ESC>j	очистка экрана			  │
│ <ESC>E	очистка экрана			  │
│ <ESC>K	удаление до конца строки	  │
│ <ESC>J	удаление до конца экрана	  │
│ <ESC>L	вставка строки			  │
│ <ESC>M	удаление строки			  │
├─────────────────────────────────────────────────┤
│ ∙ Дополнительно				  │
├─────────────────────────────────────────────────┤
│ <ESC>x4	блочный курсор			  │
│ <ESC>x5	спрятать курсор			  │
│ <ESC>y4	подчеркивающий курсор		  │
│ <ESC>y5	высветить курсор		  │
└─────────────────────────────────────────────────┘


∙ Возврат в BASIC


* Теплый старт

     Выбрав слот MAIN-ROM, сделайте переход на 409BH. Если  рабо-
чие области BASICа не пострадали, высветится  обычная  подсказка.
Состояние стека и регистров игнорируется.

     Другой путь заключается в использовании следующей  конструк-
ции с NEWSTT (см.4.4 главы 4):

	  3AH	94H    00H
	┌─────┬─────┬─────┬─
	│  :  │ END │ STOP│
	└──▲──┴─────┴─────┴─
	   └─ HL


* Автостарт

     Простые игровые катриджи, которые не используют рабочие  об-
ласти BIOS или BASIC, могут запускаться сами, если в их ROM-заго-
ловке задан адрес процедуры INIT. Однако такой метод не позволяет
запустить несколько катриджей (например, предварительно не сможет
настроиться драйвер дисковода).

     Для решения этой проблемы по адресу FEDAH предусмотрена  ло-
вушка H.STKE; процедура INIT, которая находится в катридже,  дол-
жна записать в нее межслотовый адрес нужной программы, после чего
вернуться в систему по RET. Тогда, после запуска  всех  катриджей
(в том числе и дисководов, если они есть) система вызовет ловушку
и запустит желаемую программу. Естественно, этот метод работает и
при отсутствии драйверов дисковода (см. ПРИЛОЖЕНИЕ).
MSX2 TECHNICAL HANDBOOK, CHAPTER 2


                   СПИСОК КОДОВ ОШИБОК

     01. NEXT without FOR (NEXT без FOR)
     Нет оператора FOR, который соответствует обнаруженному  опе-
ратору NEXT

     02. Syntax error (Синтаксическая ошибка)
     Ошибка в синтаксисе

     03. RETURN without GOSUB (RETURN без GOSUB)
     Оператор RETURN не соответствует оператору GOSUB

     04. Out of DATA (Выход из блока данных)
     Отсутствуют данные, которые должны читаться оператором READ

     05. Illegal function call (Вызов недопустимой функции)
     Ошибка в функции или указании числового значения

     06. Overflow (Переполнение)
     Числовое значение переполнилось

     07. Out of memory (Выход за пределы памяти)
     Свободное пространство исчерпано

     08. Undefined line number (Неопределенный номер строки)
     Строка с таким номером отсутствует в программе

     09. Subscript out of range (Индекс вышел из диапазона)
     Значение индекса массива превысило объявленный диапазон

     10. Redimensioned array (Переопределенный массив)
     Массив объявлен дважды

     11. Division by zero (Деление на нуль)
     Сделана попытка деления на нуль. Нуль возведен в отрицатель-
ную степень

     12. Illegal direct (Недопустимое прямое обращение)
     Оператор, который не может быть исполнен в командном режиме,
вызывается напрямую

     13. Type mismatch (Несоответствие типа)
     Конфликт между типами данных

     14. Out of string space (Выход из строковой области)
     Строковое пространство исчерпано

     15. String too long (Строка слишком длинная)
     Строка длиннее, чем 255 символов

     16. String formula too complex  (Строковая  формула  слишком
сложна)
     Указанная строка слишком сложна

     17. Can't CONTINUE (Невозможно продолжить по CONTINUE)
     Команда CONT не может быть исполнена

     18. Undefined user function (Неопределенная функция  пользо-
вателя)
     Сделана попытка обращения к пользовательской функции,  кото-
рая не была определена в операторе DEF FN

     19. Device I/O error (Ошибка устройства ввода/вывода)
     Ошибка произошла в устройстве ввода/вывода

     20. Verify error (Ошибка верификации)
     Программа на кассете и в памяти не совпадают

     21. No RESUME (Нет RESUME)
     В процедуре обработки ошибок нет оператора RESUME

     22. RESUME without error (RESUME без ошибки)
     Оператор RESUME использован иначе, чем в процедуре обработки
ошибок

     23. Не определено

     24. Missing operand (Отсутсвующий операнд)
     Не указан необходимый параметр

     25. Line buffer overflow (Переполнение буфера строк)
     Слишком много символов в данных, которые вводятся

     26.

     | Не определено

     49.

     50. FIELD overflow (Переполнение поля FIELD)
     Размер поля, определяемого в операторе FIELD,  превысил  256
байт

     51. Internal error (Внутренняя ошибка)
     Ошибка произошла внутри BASICа

     52. Bad file number (Неверный номер файла)
     Указан номер файла, который не был открыт в OPEN.  Указанный
номер превысил число, заданное в MAXFILES

     53. File not found (Файл не найден)
     Указанный файл не найден

     54. File already open (Файл уже открыт)
     Файл был уже открыт в OPEN

     55. Input past end (Ввод после окончания)
     Сделана попытка чтения из файла после обнаружения метки кон-
ца файла

     56. Bad file name (Неверное имя файла)
     Ошибка в указании имени файла

     57. Direct statement (Оператор прямого доступа)
     При загрузке программы в формате ASCII  обнаружен  не  текст
программы, а данные

     58. Sequential I/O only (Только последовательный ввод/вывод)
     Произвольный доступ к последовательному файлу

     59. File not OPEN (Файл не открыт в OPEN)
     Указанный файл еще не открыт в OPEN

     60. Bad FAT (Плохая таблица размещения файлов)
     Необычный формат диска

     61. Bad file mode (Неправильный режим файла)
     Выполнена некорректная операция ввода/вывода в OPEN

     62. Bad drive name (Неверное имя дисковода)
     Ошибка в указании имени дисковода

     63. Bad sector number (Неверный номер сектора)
     Ошибка в номере сектора

     64. File still open (Файл все еще открыт)
     Файл не был закрыт

     65. File already exists (Файл уже существует)
     Имя, указанное в операторе NAME, уже существует на диске

     66. Disk full (Диск заполнен)
     Свободное пространство на диске исчерпано

     67. Too many files (Слишком много файлов)
     Количество файлов превысило 112 (область каталога исчерпана)

     68. Disk write protected (Дисковая запись защищена)
     Диск защищен от записи

     69. Disk I/O error (Ошибка дискового ввода/вывода)
     Сбой при вводе/выводе с диска

     70. Disk offline (Диск отключен)
     Дискета не вставлена

     71. Rename across disk (Переименовать "вразнобой")
     Оператор NAME должен взять старое имя с одного диска, а  но-
вое записать на другой
MSX2 TECHNICAL HANDBOOK, CHAPTER 3


                         M S X - D O S

     Для серьезных разработок необходимы устройства с большой ем-
костью памяти и высокоскоростным доступом - вот почему МSX-машины
были оснащены дисковой операционной системой. Наряду с этим,  DOS
требуется для эффективной обработки больших информационных масси-
вов на диске. MSX-DOS берет начало от MS-DOS, которая широко рас-
пространена на 16-битовых машинах. Таким образом, она представля-
ет собой мощнейшую операционную среду для машин,  построенных  на
Z80. В главе 3 описываются основные операции MSX-DOS и  системные
вызовы.


1. ОБЩИЙ ОБЗОР

     Что вообще такое MSX-DOS? Какие возможности она предоставля-
ет пользователям? В последующих разделах дается описание  возмож-
ностей, функций и программной конфигурации MSX-DOS.



1.1 Возможности MSX-DOS

* Базисный характер дисковой операционной среды

     MSX-DOS предназначена для компьютеров системы MSX. Она рабо-
тает без каких-либо затруднений с любой версией MSX: MSX1 и MSX2.
На MSX любая операция с диском всегда производится через MSX-DOS.
Это в полной мере относится и к DISK-BASICу, который тоже исполь-
зует системные вызовы BDOSa. MSX-DOS и MSX DISK BASIC поддержива-
ют один и тот же формат диска. Это значительно повышает оператив-
ность работы и позволяет эффективно распределять файловые ресурсы
при разработке программ в среде MSX-DOS.


* Совместимость с MS-DOS

     MSX-DOS, созданная на основе MS-DOS (ver. 1.25),  имеет  тот
же формат диска. Она совместима с MS-DOS на уровне файлов, следо-
вательно, она способна считывать и записывать файлы, созданные на
дисках MS-DOS (и наоборот). Обе дисковые системы имеют схожие ко-
манды, поэтому пользователи, знакомые с MSX-DOS, смогут без труда
освоить MS-DOS, когда пересядут за 16-битовые машины.


* Использование разработок под CP/M

     Системные вызовы MSX-DOS совместимы с вызовами CP/M, поэтому
большая часть разработок, созданных под CP/M, может исполняться в
MSX-DOS, и наоборот. Это существенно расширяет фонд  программного
обеспечения, которое можно исполнять на MSX.



1.2 СРЕДА MSX-DOS

* Минимальные требования к системе

     Чтобы использовать MSX-DOS в минимальной конфигурации, необ-
ходимы: RAM емкостью 64К, символьный дисплей, один дисковод и ROM
с дисковым интерфейсом; если RAM меньше 64К, работать с DOS нель-
зя. Поскольку машины MSX2 оснащаются памятью, объем которой всег-
да не менее 64К, любой компьютер серии MSX2 может работать с DOS.
На тех машинах MSX1, чья память меньше названной, применяется ог-
раниченный дисковый BASIC. ROM дискового интерфейса  поставляется
вместе с дисководом и на компьютерах со  встроенными  дисководами
размещается внутри корпуса машины.


* Максимальная поддерживаемая конфигурация

     MSX-DOS поддерживает максимально до 8дисководов. В  системе
с единственным дисководом она организует симулятор второго  диска
(использует один дисковод как два,  попеременно  чередуя  диски).
Кроме этого, она обеспечивает клавиатурный ввод, вывод на экран и
принтер.


* Допустимые форматы дисков
     	
     MSX-DOS, которая снабжена гибким файловым менеджером, не за-
висящим от конкретной физической  структуры  диска,  поддерживает
различные форматы и использует в качестве стандарта  3.5-дюймовые
флоппи-диски двойной точности. Диски применяются как  односторон-
ние 1DD, так и двустронние 2DD. Каждый из них имеет либо восьми-,
либо девятисекторный трек; таким образом, различаются четыре типа
форматов. Структуры, предложенные фирмой Microsoft для каждого из
этих типов, приведены ниже:

        Таблица 3.1 Форматы, поддерживаемые MSX-DOS
       ┌───────────────────┬─────┬─────┬─────┬─────┐
       │                   │1DD/9│2DD/9│1DD/8│2DD/8│
       ├───────────────────┼─────┼─────┼─────┼─────┤
       │идентификатор      │ F8H │ F9H │ FAH │ FBH │
       │сторон             │   1 │   2 │   1 │   2 │
       │треков на стороне  │  80 │  80 │  80 │  80 │
       │секторов в треке   │   9 │   9 │   8 │   8 │
       │байтов в секторе   │ 512 │ 512 │ 512 │ 512 │
       │секторов в кластере│   2 │   2 │   2 │   2 │
       │секторов в FATе    │   2 │   3 │   1 │   2 │
       │FATов              │   2 │   2 │   2 │   2 │
       │файлов в каталоге  │ 112 │ 112 │ 112 │ 112 │
       └───────────────────┴─────┴─────┴─────┴─────┘
     ∙ Значение терминов см. в главе 3




1.3 СИСТЕМНЫЕ РЕСУРСЫ MSX-DOS


* Карта памяти

     MSX-DOS состоит из трех модулей: COMMAND.COM,  MSXDOS.SYS  и
ROM дискового интерфейса. В процессе работы они  располагаются  в
памяти, согласно рисунку 3.1. COMMAND.COM и MSXDOS.SYS - это дис-
ковые файлы, которые в момент загрузки системы считываются в RAM.
Интерфейсное ПЗУ включает в себя драйвер диска, ядро DOS и интер-
претатор DISK-BASICа.

0000H┌────────────────────┐	   4000H┌───────────────┐
     │ помеченная область │		│ драйвер диска │
0100H├────────────────────┤┐		│ ядро DOS      │
     │			  ││		│ DISK-BASIC    │
     │			  ││		│ интерпретатор │
     │			  │├─ TPA  7FFFH└───────────────┘
     ├────────────────────┤│
     │	   COMMAND.COM	  ││
     ├────────────────────┤┘
     │	   MSXDOS.SYS	  │
     ├────────────────────┤
     │   рабочая область  │
FFFFH└────────────────────┘

     Зона RAM 00H...0FFH называется помеченной системной областью
и используется MSX-DOS для обмена данными с другими  программами;
она очень важна для функционирования системных вызовов, описанных
ниже. Область, которая начинается адресом 0100H, а  заканчивается
там, куда указывает ячейка RAM  0006H,  называется  TPA  (Область
Транзитных Программ) и доступна пользователю. MSXDOS.SYS размеща-
ется всегда после TPA (при искажении результат будет непредсказу-
емым!), а COMMAND.COM располагается в TPA.


* COMMAND.COM

     Основная задача DOS заключается в том, чтобы получать с кла-
виатуры команды и выполнять их. COMMAND.COM, собственно, и  отве-
чает за процесс приема, интерпретации  и  исполнения  строки,  то
есть за организацию пользовательского интерфейса. Программы,  вы-
полняемые COMMAND.COM, состоят из внутренних команд, пакетных ко-
манд и внешних команд.

     Внутренние команды вшиты непосредственно в COMMAND.COM. Наб-
ранная с клавиатуры внутренняя команда немедленно исполняется.

     В случае вызова внешней команды, COMMAND.COM загружает соот-
ветствующую процедуру с диска, помещает ее по адресу 0100H и  пе-
редает ей управление (исполнение внешней команды начинается всег-
да с адреса 0100H). При этом допускается, что достаточно  длинная
процедура может достичь верхней границы TPA и уничтожить COMMAND,
поскольку когда она закончит работу по "RET", MSXDOS.SYS проверит
сохранность COMMAND.COM по контрольной сумме,  при  необходимости
загрузит его снова и передаст ему управление. Если же внешняя ко-
манда невелика и не достигает границы TPA, COMMAND.COM не  разру-
шается.

     Команды пакетной обработки выполняются путем ввода командных
строк не с клавиатуры, а и из специального файла. На каждом  шаге
пакетного файла исполняется одна внутренняя или внешняя  команда.
Можно указать внутри одной пакетной команды другую  пакетную  ко-
манду, помня при этом, что управление возвращено не будет.


* MSXDOS.SYS

     MSXDOS.SYS, сердцевина MSX-DOS, управляет доступом к перифе-
рии и межпрограммными коммуникациями. Эти функции оформлены в ви-
де процедур BDOS, и пользователь может применять их по своему ус-
мотрению. Каждая такая процедура, называемая "системным вызовом",
незаменима при создании программ, работающих с диском (см.  главу
4). Однако MSXDOS.SYS не делает всего этого сам, он только  явля-
ется посредником, который систематизирует запросы  COMMAND.COM  и
внешних команд и передает их ядру DOS.

     MSXDOS.SYS содержит фрагмент, названный BIOS и  отличный  от
BDOS (как показано на рисунке 3.2). BIOS, который был подготовлен
с учетом совместимости с CP/M, обычно не используется.

	     Рисунок 3.2  MSXDOS.SYS
		┌───────────────┐
		│      BDOS	│
		├───────────────┤
		│      BIOS	│
		└───────────────┘


* Ядро DOS

     Ядро DOS - это фундаментальная процедура ввода/вывода, кото-
рая располагается в ROM дискового интерфейса и выполняет все фун-
кции BDOS. В принципе, любой системный вызов можно отработать не-
посредственно через ядро DOS. DISK-BASIC так и поступает.


* Процедура запуска MSX-DOS

     MSX-DOS стартует следующим образом:

     1. Перезапуск MSX вызывает проверку всех слотов, и тот слот,
в заголовке которого обнаружены два байта: 41H и 42H, интерпрети-
руется как подключенный к некоторому катриджу. Если это так,  вы-
полняется процедура INIT (инициализации), адрес которой выставлен
в заголовке катриджа. В случае дисковой ROM прежде всего размеща-
ется рабочая область для каждого из имеющихся дисководов.

     2. Когда все слоты проверены, происходит обращение к ловушке
H.STKE (FEDAH). Если по этому адресу находится не C9H (то есть, в
процессе работы INIT в ловушке был выставлен адрес некоторой про-
цедуры), производится настройка системы под DISK-BASIC, и  управ-
ление передается по H.STKE.

     3. Если при проверке оказывается, что значение H.STKE  равно
C9H, начинается поиск катриджа, который имеет  в  заголовке  вход
TEXT, после чего настраивается DISK-BASIC, и из  найденного  кат-
риджа вызывается BASIC-программа.

     4. Затем содержимое boot-сектора (логический сектор 0) пере-
сылается в область памяти C000H...C0FFH. Если в этот момент  воз-
никла ошибка DRIVE NOT READY (дисковод не готов) или  READ  ERROR
(ошибка чтения), или же заголовок сектора  оказался  отличным  от
EBH или E9H, запускается DISK-BASIC.

     5. После этого вызывается процедура по адресу C01EH со сбро-
шенным флагом CY. Поскольку обычно по этому  адресу  записан  код
"RET NC", ничего не происходит, и управление возвращается; однако
любая размещенная здесь программа на  языке  ассемблера  стартует
автоматически.

     6. Проверяется емкость RAM (содержимое RAM остается  в  сох-
ранности). Если она меньше, чем 64К, стартует DISK-BASIC.

     7. Производится настройка оборудования под MSX-DOS, и проце-
дура C01EH вызывается снова, но с выставленным флагом CY. По  ад-
ресу 100H загружается файл MSXDOS.SYS, которому и передается  уп-
равление. MSXDOS.SYS перемещает себя в старшие адреса  RAM.  Если
же этот файл не существует на диске, запускается DISK-BASIC.

     8. MSXDOS.SYS загружает COMMAND.COM по адресу 100H и переда-
ет управление на его начало. COMMAND.COM также переносит  себя  в
старшие адреса RAM и начинает работать. Если же он отсутствует на
диске, появляется сообщение INSERT A DISKETTE (Вставьте диск),  и
работа приостанавливается в ожидании, пока не будет вставлен пра-
вильный диск.

     9. Если MSX-DOS загружается впервые, и на диске  есть  файл,
названный "AUTOEXEC.BAT", он автоматически начнет выполняться как
пакетный. Если же MSX-DOS не запустилась, а стартовал DISK-BASIC,
и при этом на диске оказалась программа с именем  "AUTOEXEC.BAS",
она выполнится.
MSX2 TECHNICAL HANDBOOK, CHAPTER 3


2. ОПЕРАЦИИ

     В этом разделе описано, как набирать на клавиатуре командную
строку. На этом основано любое взаимодействие с MSX-DOS. Для каж-
дой команды будут даны примеры конкретного использования с объяс-
нениями.


2.1 Основные операции

* Стартовое сообщение

     При запуске MSX-DOS на экране появляется следующее сообщение

      Рисунок 3.3 Состояние экрана при старте системы
	┌───────────────────────────────────────┐
	│	MSX-DOS version 1.03		│
	│	Copyright 1984 by Microsoft	│
	│					│
	│	COMMAND version 1.11		│
	└───────────────────────────────────────┘

     Две верхние строчки демонстрируют версию MSXDOS.SYS и автор-
ское право. Последняя строка показывает версию COMMAND.COM.


* Приглашение (prompt)

     Вслед за описанием версии появляется приглашение, запрашива-
ющее ввод команды. В MSXDOS приглашение состоит из двух символов:
"имя_текущего_дисковода" плюс ">".


* Текущий дисковод (дисковод по умолчанию)

     Термин "текущий_дисковод", как первый символ в  приглашении,
обозначает устройство, к которому автоматически производится дос-
туп, если имя дисковода в команде пропущено. Например, когда  те-
кущим объявлен диск А, для обращения к файлу "BEE" с диска B тре-
буется набрать "B:BEE". Но при этом файл  "ACE",  находящийся  на
диске A, может быть набран как "ACE" с пропущеным именем дисково-
да.

     A>DIR B:BEE (относится к BEE на диске B:)
     A>DIR ACE   (относится к ACE на текущем диске A:)


* Смена текущего дисковода

     Если используется система с двумя и более  дисководами,  ко-
манда "B:" вызывает смену текущего дисковода на B. При объявлении
дисководов с C по H, нужна, соответственно, буква "C:", и т.д.

     A>B:
     B>		(текущий дисковод изменен на B)

     A>K:
     Invalid Drive Specification (неверно указан дисковод)
     A>		(дисковод K не существует, текущий остался)


* Ввод команды

     Приглашение подсказывает, что MSXDOS запрашивает ввод коман-
ды. Указания DOS дают, печатая команды на клавиатуре.

     Как показано в таблице 3.2, существует 3 вида команд. Их ин-
терпретирует и исполняет программа COMMAND.COM. Работа с  MSX-DOS
повторяется по формуле

     "задается команда -> COMMAND.COM ее выполняет".

               Таблица 3.2 Три формы команд

     1) ВНУТРЕННЯЯ КОМАНДА
     Команда внутри COMMAND.COM. Процедура на ассемблере  в  RAM.
Предусмотрены тринадцать внутренних команд (см.ниже).

     2) ВНЕШНЯЯ КОМАНДА
     Ассемблерная процедура на диске. Для выполнения  загружается
с диска. Имя ее файла имеет расширение ".COM".

     3) ПАКЕТНАЯ КОМАНДА (BATCH)
     Текстовый файл, содержащий одну или  более  команд.  Команды
выполняются по порядку (пакетная обработка). Имена  файлов  имеют
расширение ".BAT"


* Соглашение по поводу имени файла

     Файлы, которые обрабатывает MSX-DOS, задают с помощью  "спе-
цификации_файла", описанной ниже.

     1) "Спецификация_файла" выражается в форме
                 "<дисковод>:<имя_файла>"

     2) <Дисковод> - это символ от A до H. Если речь идет о теку-
щем дисководе, его имя можно пропустить вместе с последующим дво-
еточием ":".

     3) <Имя_файла> выражается в форме
              "<собственно_имя>.<расширение>"

     4) <Собственно_имя> - строка, содержащая один или более  (до
8) символов. Если символов указано больше, чем 8, девятый и  пос-
ледующие игнорируются.

     5) <Расширение> - строка, содержащая до 3 символов  (включая
и полное их отсутствие). Если символов  указано  больше,  чем  3,
четвертый и последующие игнорируются.

     6) <Расширение> можно пропускать вместе с предыдущей точкой

     7) Допустимые символы перечислены в таблице 3.3.

     8) Регистры клавиатуры не играют роли - заглавные и строчные
буквы имеют одно и то же значение.


       Таблица 3.3 Символы, допустимые в имени файла

     ДОПУСТИМЫЕ: A...Z 0...9 $ & # % ' ( ) @ ^ { } ~ !
     а также: символы с кодами 80H...FEH

     НЕДОПУСТИМЫЕ: " . + , / : ; = ? [ ]
     а также: символы с кодами 00H...20H, 7FH, FFH



* Символы маскирования
     
     Используя специальные символы в имени или расширении,  можно
задавать имена файлов, которые содержат общие фрагменты.
     Такими "маскирующими" символами являются "?" и "*".

     "?" олицетворяет один (любой) символ:

     "TEXT", "TEST", "TENT" <- "TE?T"
     "F1-2.COM", "F2-6.COM" <- "F?-?.COM"

     "*" может означать строчку любой длины:

     "A", "AB", "ABC" <- "A*"
     "все файлы с расширением .COM" <- "*.COM"
     "вообще все файлы" <- "*.*"

     При сравнении реальных имен файлов с заданными короткие име-
на и расширения дополняются пробелами до максимальной длины (8  и
3 символа). Поэтому спецификация "A???.??" не может относиться  к
имени "ABCDE.123", но соответствует имени "AZ.9", как это показа-
но на рисунке 3.4.

	Рисунок 3.4 Маскирование имени файла
	     ┌───┬───┬───┬───┬───┬───┬───┬───┐┌───┬───┬───┐
ABCDE.123 ─▶ │ A │ B │ C │ D │ E │   │   │   ││ 1 │ 2 │ 3 │
	     └─▲─┴─▲─┴─▲─┴─▲─┴─▲─┴─▲─┴─▲─┴─▲─┘└─▲─┴─▲─┴─▲─┘
	       o   o   o   o   x   o   o   o    o   o   x
	     ┌─▼─┬─▼─┬─▼─┬─▼─┬─▼─┬─▼─┬─▼─┬─▼─┐┌─▼─┬─▼─┬─▼─┐
A???.??   ─▶ │ A │ ? │ ? │ ? │   │   │   │   ││ ? │ ? │   │
	     └─▲─┴─▲─┴─▲─┴─▲─┴─▲─┴─▲─┴─▲─┴─▲─┘└─▲─┴─▲─┴─▲─┘
	       o   o   o   o   o   o   o   o    o   o   o
	     ┌─▼─┬─▼─┬─▼─┬─▼─┬─▼─┬─▼─┬─▼─┬─▼─┐┌─▼─┬─▼─┬─▼─┐
AZ.9	  ─▶ │ A │ Z │   │   │   │   │   │   ││ 9 │   │   │
	     └───┴───┴───┴───┴───┴───┴───┴───┘└───┴───┴───┘

     Звездочка * всегда интерпретируется как восемь или три знака
вопроса "?" (в зависимости от расположения в имени или расширении
файла). Это означает, что имя "A*B" не может рассматриваться  как
"любая строка, которая начинается с A и заканчивается на B".  Она
воспримется как "любая строка, которая начинается с A", и вот по-
чему:

     A*B		("*" разворачивается как 8 "?")
     A????????B		(символы после восьмого удаляются)
     A???????		(результат)


* Имя устройства

     MSX-DOS не нуждается в каких-либо особых командах для обмена
данными с периферией: она рассматривает каждое  реальное  устрой-
ство как некий файл, и все действия по вводу и выводу выполняются
как чтение из этого "файла" и запись в него. Это позволяет  поль-
зователю обращаться с устройствами ввода/вывода  точно  таким  же
образом, как и с дисковыми файлами. Стандартно MSX-DOS  поддержи-
вает пять устройств, перечисленных в таблице 3.4,  которые  имеют
собственные имена. Очевидно, такие же имена нельзя использовать в
качестве названий для дисковых файлов: они все равно будут  трак-
товаться как периферийные устройства, даже если их снабдить  рас-
ширениями или наименованиями дисководов.

                Таблица 3.4 Имена устройств

     AUX - резервное имя для расширения ввода/вывода, обычно име-
ет тот же эффект, что и NUL
     CON - консоль (клавиатура для ввода, экран для вывода)
     LST - принтер (только вывод)
     PRN - принтер (то же, что и LST)
     NUL - особое устройство, применяемое как заглушка, если  не-
желательны ни вывод на экран, ни запись в файл. При чтении всегда
EOF (маркер конца файла)


              Таблица 3.5 Специальные клавиши

^C	- прерывает выполнение текущей команды
^S	- приостанавливает вывод на экран до нажатия клавиши
^P	- включает одновременный вывод на экран и на принтер
^N	- отменяет вывод на принтер
^J	- переводит строку


* Ввод с использованием эффекта запаздывания

     "Запаздывание" - это строковый буфер, который содержит стро-
ку, введенную ранее. Его применяют, чтобы облегчить процесс ввода
команд. Используя эффект запаздывания, можно легко повторить пре-
дыдущую команду полностью либо с частичными изменениями. При этом
оказываются полезными клавиши, перечисленные в таблице 3.6.


          Таблица 3.6 Функции режима запаздывания

Название	Клавиша			Функция

COPY1		-▶ ^\		Берет один символ  из буфера
				и демонстрирует его в коман-
				дной строке

COPYUP		SELECT ^X	Берет символы, стоящие перед
				тем символом,  который будет
				напечатан вслед с клавиатуры
				и демонстрирует их в команд-
				ной строке

COPYALL		│ ^_		Берет все символы из буфера,
		▼		начиная с текущей позиции до
				конца и выводит их в команд-
				ной строке

SKIP1		DEL		Пропускает один символ в бу-
				фере

SKIPUP		CLS ^L		Пропускает символы,  стоящие
				перед тем символом,  который
				будет вслед введен с клавиа-
				туры

VOID		▲ ESC ^^	Уничтожает введенную строку,
		│ ^U ^[		не затрагивая буфер

BS		◀─ BS ^H ^]	Уничтожает один символ и во-
				звращает   указатель  буфера
				на одну позицию назад

INSERT		INS ^R		Переключает  режим  вставки-
				замены.  При вставке  фикси-
				рует указатель буфера

NEWLINE		HOME ^K		Переносит  текущую командную
				строку в буфер  без выполне-
				ния

	Клавиша RETURN		Переводит строку  на экране,
				но не прерывает ввода. Пере-
				носит текущую командную стро-
				ку в буфер и исполняет ее

	Другие клавиши,		Вводят  соответствующие коды
	отличные от этих	и сдвигают  указатель буфера
				на одну позицию



* Другие специальные клавиши

     В дополнение к обработке запаздывания, имеется еще несколько
управляющих клавиш (таблица 3.5). Эти специальные клавиши поддер-
живают некоторые из системных вызовов, данных ниже.

     Таблица 3.7 Пример операций ввода с запаздыванием

Клавиша		Командная строка	Буфер запаздывания

DIR ABCDE	A>DIR ABCDE		- - - - -

[RETURN]	A>			DIR ABCDE
						 ^
│		A>DIR ABCDE		DIR ABCDE
▼						 ^
◀─◀─◀─		A>DIR AB		DIR ABCDE
					      ^
[INS] XYZ	A>DIR ABXYZ		DIR ABCDE
					      ^
─▶─▶─▶		A>DIR ABXYZCDE		DIR ABCDE
▲						 ^
│		A>			DIR ABCDE
					^
│		A>DIR ABCDE		DIR ABCDE
▼						 ^
▲		A>			DIR ABCDE
│					^
XXX		A>XXX			DIR ABCDE
					   ^
│		A>XXX ABCDE		DIR ABCDE
▼						 ^
[HOME]		A>XXX ABCDE@		XXX ABCDE
					^


* Дисковые ошибки

     Если во время работы с диском возникает сбой,  MSX-DOS  нес-
колько раз пытается повторить процедуру. Устойчивые ошибки вынуж-
дают MSX-DOS вывести на экран запрос, что ей с ними делать.  Наж-
мите одну из клавиш: A, R или I.

               Рисунок 3.5 Индикация ошибки

     <тип_ошибки> error <действие> drive <имя_дисковода>
	   │		    │		       │
	   │		    │		     A...H
	   │		reading (чтение)
	   │		writing (запись)
Write protect (защита записи)
Not ready     (не готов)
Disk          (диск)

     Abort, Retry, Ignore ?


Abort	- прекращает доступ к диску и заканчивает выполнение  ко-
	манды
Retry	- пытается еще раз
Ignore	- прекращает доступ к диску, продолжив выполнение команды

     А эта ошибка возникает иначе, нежели перечисленные выше. Она
сообщает, что элемент FAT указывает на кластер, который не сущес-
твует. Если она обнаруживается, это означает, что диск нельзя ис-
пользовать:

     Bad FAT (Плохая Таблица Расположения Файлов)



2.2 Внутренние команды

     Внутренние команды - это подпрограммы на ассемблере, собран-
ные вместе в файле COMMAND.COM. Они выполняются довольно  быстро,
поскольку их не нужно загружать с диска. Ниже приводятся 13 внут-
ренних команд. В этом разделе описывается их использование.

	BASIC	- выходит в DISK-BASIC
	COPY	- копирует файл
	DATE	- выводит или изменяет дату
	DEL	- удаляет файл
	DIR	- выводит список файлов
	FORMAT	- размечает диск
	MODE	- меняет количество символов в строке экрана
	PAUSE	- приостанавливает пакетную обработку
	REM	- вставляет комментарий в пакетную команду
	REN	- изменяет имя файла
	TIME	- выводит или изменяет время
	TYPE	- печатает содержимое файла
	VERIFY	- включает/выключает режим верификации


* BASIC

формат: BASIC [файл]

     Запускает DISK-BASIC. Процедура выполняется не путем загруз-
ки BASICа с диска в RAM, а посредством переключения слотов, чтобы
выставить BASIC-ROM по адресам 0000H-7FFFH, и поэтому срабатывает
немедленно. Если указан "файл", с диска автоматически считывается
соответствующая программа, которая начинает выполняться. Для воз-
врата из BASICа в состояние MSX-DOS наберите "CALL SYSTEM".


* COPY

     Эта команда копирует содержимое одного файла в другой. Варь-
ируя параметры, можно добиться различных дополнительных эффектов.

1) Дублирование файлов

формат: COPY файл_1 файл_2

     Копирует файл, указанный как "файл_1" в  файл  "файл_2".  На
одном и том же диске нельзя создать несколько файлов с одинаковы-
ми именами. На разных дисках одно и то же имя, естественно, впол-
не допустимо.

Примеры:

     A>COPY ABC XYZ - создает файл XYZ и копирует в него ABC
     A>COPY B:ABC XYZ - копирует файл ABC с дисковода B:
     A>COPY B:ABC C:XYZ - копирует с дисковода B: на C:

     При копировании можно избрать режим ASCII или двоичный. Ключ
"/A" задает ASCII-режим, ключ "/B" - двоичный. По умолчанию выби-
рается двоичный (исключая комбинированные случаи, о которых будет
сказано ниже, когда по умолчанию  устанавливается  режим  ASCII).
Таблица 3.8 показывает различия между этими режимами.


            Таблица 3.8 Режимы ASCII и двоичный

			Чтение файла		Запись файла

ASCII		Отбрасывает после 1AH	Добавляет в конце 1AH
Двоичный	Читает всю физич.длину	Пишет без изменений


Примеры:

     A>COPY/A ABC XYZ - оба файла в режиме ASCII
     A>COPY ABC/A XYZ/B - читает в ASCII, пишет в двоичном


2) Дублирование файлов с диска на диск

формат: COPY файл [диск_приемник]

     Копирует файл на диск_приемник под тем же именем. Если диск_
приемник не задан, файл копируется на текущий дисковод. Дисковод,
указанный в имени файла, не должен совпадать с  дисководом_прием-
ником.

     Дублирование более чем одного файла возможно благодаря  сим-
волам маскирования. В этом случае имя каждого  копируемого  файла
выводится на экран.

Примеры:

     A>COPY *.COM B: - копирует все файлы с расширением .COM
с текущего диска на диск B
     A>COPY B:ABC - копирует файл с диска B на текущий


3) Одновременное дублирование многих файлов

формат: COPY маска_1 маска_2

     Если файл_приемник описан с использованием маски,  то  фраг-
менты имени файла_2, которые соответствуют маскирующим  символам,
будут заменены на символы из имени файла_1. Например, при  выпол-
нении команды:

     COPY AB-07.021 FL?X*.V??

она проинтерпретируется, как на рисунке 3.6, и будет создан  файл
"FL-X7.V21"


      Рисунок 3.6 Маскирование имени файла_приемника

     F L ? X * . V ? ? - маска_2
     A B - 0 7 . 0 2 1 - файл_1
     F L - X 7 . V 2 1 - заменяются только "*" и "?"

     Используя маскирование файла_1,  можно  продублировать  нес-
колько файлов одновременно:

     A>COPY *.ASM *.MAC - создает файлы с расширением ".MAC"
вместо ".ASM"
     A>COPY A*.* B:Z*.* - копируются все файлы,  начинающиеся  на
"A" на диск B с одновременной заменой первой буквы на "Z"


4) Сцепка файлов

формат: COPY файлы файл_приемник

     Если один файл принимает более одного  файла_источника,  со-
держимое всех источников сцепляется  и  сохраняется  в  указанном
файле как единое целое.  Задавая  источники,  можно  пользоваться
маскированием и знаком "+".

     При сцепке по умолчанию выбирается режим ASCII, и  байт  1AH
рассматривается как признак конца файла. По этой причине в двоич-
ных файлах будут утеряны данные, которые следуют за первым встре-
ченным байтом 1AH. Для предотвращения этого используйте ключ /B.

     Если в спецификации источников встречается более одного сим-
вола маскирования, второй и последующие заменяются по первому,  в
соответствии с действительным именем файла (см. параграф 3).  Это
позволяет сцеплять одновременно целый ряд файлов.

Примеры:

     A>COPY X+Y+Z XYZ - сцепляет X, Y и Z и сохраняет в XYZ
     A>COPY *.LST ALL - сцепляет все файлы с расширением ".LST" и
сохраняет в файле "ALL"
     A>COPY/B *.DAT ALL - сцепляет все "*.DAT" как двоичные
     A>COPY ASC/A+BIN/B AB/B - сцепляет  ASCII-файл  и  двоичный,
сохраняет в двоичном файле
     A>COPY *.LST+*.REF *.PRN - сцепляет файлы, одинаково назван-
ные, и создает файл с тем же именем и расширением .PRN


* DATE

формат: DATE [месяц-день-год]
     допускаются также "." и "/"

     Устанавливает дату на внутренних энергонезависимых часах. На
MSX-машинах без таких часов дата пишется в специально  отведенную
рабочую область. Создание или коррекция файлов в MSX-DOS вызывает
запись информации о дате в каталог (для каждого файла).

     DATE без параметров высвечивает текущую дату с запросом  но-
вой, как показано ниже. Нажатие клавиши RETURN оставляет эту дату
неизменной.

     Current date is <день недели> <месяц-день-год>
     Enter new date: (Введите новую дату)

     В формате даты присутствуют три поля: год, месяц и день. По-
ля разделяются знаком "-", "." или "/". Каждое поле  может  иметь
следующие числовые значения:

     год: 1980...2079

     00...79 рассматриваются как 2000...2079
     80...99 рассматриваются как 1980...1999

     месяц: 1...12

     день: 1...31

     Иностранные версии DOS имеют другой формат: "год-месяц-день"
или "день-месяц-год".


* DEL

формат: DEL файл (допускается также ERASE)

     Удаляет указанный файл. Для указания более, чем одного файла
можно применить маскирование.

     Поскольку "DEL *.*" вызывает уничтожение всех файлов на дис-
ке, для такой команды требуется подтверждение.

     A>DEL *.*
     Are you sure (Y/N)? (Вы уверены?)

     Нажатие "Y" или "y" удостоверяет удаление всех файлов.

     Вместо DEL можно использовать ERASE.


* DIR

формат: DIR [файл][/W][/P]

     В каждой строке перечисляется следующая информация  об  ука-
занных файлах (слева направо):

     <имя_файла><размер><дата><время>

     Поля <дата> и <время> показывают момент создания или послед-
ней модификации файла. Если информация не умещается в одной стро-
ке, данные пропускаются (начиная справа).

     В дополнение к обычным приемам  маскирования  файловых  имен
можно применять сокращенные варианты масок:

     Сокращение:	Обычный формат:

     DIR		= DIR *.*
     DIR <диск>:	= DIR <диск>:*.*
     DIR <имя_файла>	= DIR <имя_файла>.*
     DIR .<расширение>	= DIR *.<расширение>

     Если указан ключ "/W", в каждой строке будут помещены только
имена файлов. Если задан ключ "/P", список файлов будет  приоста-
навливаться после вывода каждой дисплейной  страницы  до  нажатия
произвольной клавиши.

Примеры:

     A>DIR	- информация обо всех файлах диска А
     A>DIR B:	- информация обо всех файлах диска B
     A>DIR TEST	- информация обо всех файлах с именем "TEST"
     A>DIR /W	- только имена всех файлов с диска A


* FORMAT

формат: FORMAT

     Размечает диск в формате MSX-DOS. Иными словами, формируются
каталог и FATы, а все файлы стираются. Так как MSX-DOS имеет  тот
же формат, что и MS-DOS, отформатированный диск  подходит  и  для
MS-DOS.

     При выполнении команды FORMAT появляется запрос имени диско-
вода, содержащего диск, который нужно форматировать:

     Drive name ? (A, B)

     (Перечень имен зависит от количества дисководов). Ответ  "A"
или "B" вызывает меню, которое позволяет  выбирать  одностороннее
или двустроннее форматирование. После указания типа формата  выс-
вечивается

     Strike a key when ready (Если готов, нажми клавишу)

     и DOS ждет нажатия любой клавиши. Нажатие запускает формати-
рование. Меню форматов можно найти в руководстве к дисководу.


* MODE

формат: MODE число_символов_в_строке

     Устанавливает количество символов, которое может отображать-
ся в одной экранной строке. Оно может иметь значение от 1 до  80,
причем от этого зависит режим экрана.

     01...32 - GRAPHIC 1 (SCREEN 1)
     33...40 - TEXT 1 (SCREEN 0:WIDTH 40)
     41...80 - TEXT 2 (SCREEN 0:WIDTH 80)


* PAUSE

формат: PAUSE [комментарий]

     MSX-DOS имеет возможность выполнять пакетные операции, когда
автоматически обрабатывается серия команд, записанных в текстовом
файле. Во время пакетной обработки Вы  можете  пожелать  временно
приостановить выполнение команды. Только один пример: пользовате-
лю может потребоваться сменить диски. В таких случаях и  применя-
ется PAUSE.

     При исполнении этой команды высвечивается сообщение

     Strike a key when ready

     и DOS останавливается в ожидании нажатия клавиши. Любая кла-
виша, кроме Ctrl-C, заканчивает PAUSE и переходит к следующей ко-
манде. Нажатие Ctrl-C прерывает пакетную операцию. Вслед  за  ко-
мандой PAUSE может идти комментарий, объясняющий цель остановки.


* REM

формат: REM [комментарий]

     REM используют для вставки комментария в пакетный файл.  Как
команда, она ничего не делает. Между REM и комментарием необходим
пробел.


* REN

формат: REN файл новое_имя (допускается также RENAME)

     REN меняет имя файла на новое_имя.  Маскирование  можно  ис-
пользовать как в старом, так и в новом имени. Маска в новом имени
заменяется на соответствующие символы старого имени (см. COPY).

     Всякая попытка изменить имя файла на имя, которое уже задей-
ствовано, вызывает ошибку.

Примеры:

     A>REN ABC XYZ - меняет имя "ABC" на "XYZ"
     A>REN B:ABC XYZ - меняет имя на диске B:
     A>REN *.BIN *.COM - меняет все расширения .BIN на .COM


* TIME

формат: TIME [часы [:минуты [:секунды]]]

     TIME устанавливает время на внутренних часах. Если машина не
имеет часов, ничего не происходит. Когда  MSX-DOS  создает  файл,
информация о времени записывается в дисковый каталог (для каждого
файла).

     Ввод TIME без параметров высвечивает текущее время, как  по-
казано ниже. Затем следует запрос нового времени. Нажатие  только
клавиши RETURN текущего времени не меняет.

Current time is <часы>:<минуты>:<секунды>.<сотые><p или a>
Enter new time: (Введите новое время)

     Разделительный символ ":" разграничивает три поля: часы, ми-
нуты и секунды. Поля минут или секунд можно пропускать, считая их
равными 0. Каждое поле может иметь следующие значения:

часы:
     0...23
     12A - (представляет полночь)
     0A...11A - (представляет утро)
     12P - (представляет полдень)
     1P...11P - (представляет вечер)

минуты:
     0...59

секунды:
     0...59

Примеры:

     A>TIME 12 - устанавливает 12:00:00
     A>TIME 1:16P - устанавливает 13:16:00


* TYPE

формат: TYPE файл

     Команда TYPE выводит содержимое указанного файла.  Использо-
вание маски вызывает печать первого и последующих файлов. Эта ко-
манда предназначена только для ASCII-файлов, поскольку при выводе
двоичных файлов на дисплей будут посылаться непечатаемые  (управ-
ляющие) символы.


* VERIFY

формат: VERIFY [ON | OFF]

     VERIFY устанавливает и сбрасывает  режим  верификации.  Если
верификация включена, после каждой записи данных  на  диск  будет
производиться их чтение, с тем чтобы убедиться в правильности за-
писи. Кстати, по этой причине обмен с диском несколько замедляет-
ся. По умолчанию выставляется "VERIFY OFF".



2.3 Использование команд пакетной обработки (Batch)

     MSX-DOS имеет пакетный режим, который позволяет автоматичес-
ки обрабатывать серию команд, перечисленных в порядке исполнения.
Файл, содержащий такую процедуру, называется "пакетным", а  серии
операций, определенных в нем, называются "пакетными командами".

     Batch-файлы используют расширение ".BAT". Ввод с  клавиатуры
имени файла (расширение .bat не вводится) в командную строку  вы-
зывает исполнение пакетной команды строка за строкой.

     Рассмотрим, например, следующую операцию:

     1. Скопировать все файлы, имеющие расширение ".COM", с диска
А на диск В.
     2. Вывести список всех ".COM"-файлов с диска B.
     3. Удалить все ".COM"-файлы на диске А.

     Результата этой операции можно достичь, перечислив следующие
команды MSX-DOS:

     A>COPY *.COM B:
     A>DIR B:.COM /W
     A>DEL *.COM

     Если все три строки объединить в пакетном файле "MV.BAT", то
ввод команды "MV" автоматически выполнит нашу операцию. Следующий
листинг иллюстрирует сказанное:

     A>COPY CON MV.BAT
     COPY A:*.COM B:
     DIR B:*.COM /W
     DEL A:*.COM	- создает файл MV.BAT
     ^Z			- вводится Ctrl-Z и RETURN

     A>TYPE MV.BAT
     COPY A:*.COM B:
     DIR B:*.COM /W
     DEL A:*.COM	- проверка содержимого файла MV.BAT

     A>MV		- запускает пакетную команду MV

     Пакетную команду можно прервать нажатием Ctrl-C. Если Ctrl-C
введена во время пакетной операции, на экране появляется запрос:

	Рисунок 3.7 Прерывание пакетной операции

     Terminate batch file (Y/N)? (Завершить пакетный файл ?)

     Выбор "Y" завершает пакетную обработку и возвращает управле-
ние MSX-DOS. Выбор "N" вызывает чтение очередной строки BAT-файла
и продолжает выполнение пакетной команды.


* Пакетные переменные

     Для обеспечения большей гибкости в batch-файлы можно переда-
вать параметры из командной строки. Параметры соотносятся с  сим-
волами "%n", где "n" - число в диапазоне 0...9. Эти символы назы-
ваются пакетными переменными.

     Переменные %1, %2, ... и т.д. соответствуют параметрам, ука-
занным в командной строке, слева направо, а символ %0 олицетворя-
ет имя самого batch-файла.

     Рисунок 3.8 Примеры использования пакетных переменных

     A>COPY CON TEST.BAT - создает batch-команду
     REM %0 %1 %2 %3
     ^Z

     1 file copied

     A>TYPE TEST.BAT
     REM %0 %1 %2 %3 - команда для демонстрации 3 аргументов

     A>TEST ONE TWO THREE FOUR - передача параметров команде
     A>REM TEST ONE TWO THREE FOUR
     A>

     
* AUTOEXEC.BAT

     Пакетный файл, названный  "AUTOEXEC.BAT",  используется  как
специальная программа, которая автоматически стартует при запуске
MSX-DOS. После первой загрузки COMMAND.COM проверяет, есть ли  на
диске файл AUTOEXEC.BAT, и, разыскав, выполняет его.


2.4 Внешние команды

     Внешние команды существуют на диске в виде файлов с расшире-
нием ".COM"; при вводе с клавиатуры только имени (без расширения)
команда выполняется следующим образом:

     1. Команда загружается по адресу 100H
     2. Адрес 100H вызывается как подпрограмма


* Разработка внешних команд

     Процедуры на ассемблере, созданные в памяти, начиная с адре-
са 100H, и сохраненные на диске в файлах  с  расширением  ".COM",
могут исполняться как внешние команды MSX-DOS.

     Рассмотрим пример программы для генерации управляющего  кода
0CH и очистки экрана посредством процедуры  однобайтового  вывода
(см. системные вызовы). Это 8-байтовая программа:

     Листинг 3.1 Содержимое CLS.COM

	LD	E,0CH
	LD	C,02H
	CALL	0005H
	RET

     Записав эти 8 байт в файл CLS.COM, мы получим внешнюю коман-
ду CLS для очистки экрана. Следующая примерная программа  исполь-
зует файл последовательного доступа для создания этой команды  из
BASICа. Заметим, однако, что созданная команда CLS будет работать
только по возвращении в MSX-DOS.

     100 ' ==== Эта программа создает CLS.COM ====
     110 '
     120 OPEN "CLS.COM" FOR OUTPUT AS #1
     130 '
     140 FOR I=1 TO 8
     150  READ D$
     160  PRINT #1,CHR$(VAL("&H"+D&));
     170 NEXT I
     180 '
     190 CLOSE
     200 '
     210 DATA 1E,0C,0E,02,CD,05,00,C9


* Передача аргументов во внешнюю команду

     Существует два варианта  передачи  параметров  из  командной
строки во внешнюю команду. Первый, когда передаются имена файлов,
использует адреса 5CH и 6CH помеченной области. COMMAND.COM,  ко-
торый всегда расценивает первый и второй параметры как имена фай-
лов, разворачивает их в виде: номер дисковода (1 байт) + имя фай-
ла (8 байт) + расширение (3 байта), и сохраняет их по адресам 5CH
и 6CH. Короче говоря, они преобразуются к тому же формату, что  и
первые 12 байт FCB, так что, объявляя эти адреса как  FCB,  можно
производить различные операции.

     Однако следует иметь в виду, что адреса 5CH и 6CH различают-
ся всего на 16 байт, поэтому только один из них может служить на-
чалом полного FCB. Далее, для передачи  параметров,  отличающихся
от имен файлов, (допустим, чисел), или для создания процедур, ко-
торые обрабатывают три и более имен файлов, COMMAND.COM сохраняет
целую командную строку, с помощью которой вызывалась внешняя  ко-
манда, за вычетом имени самой команды. Формат: количество  байтов
+ тело командной строки, так что возможна непосредственная ее ин-
терпретация во внешней ассемблерной процедуре. См. листинг 3.3  в
главе 4 как пример передачи аргументов посредством области DMA.
MSX2 TECHNICAL HANDBOOK, CHAPTER 3


3. СТРУКТУРА ДИСКОВЫХ ФАЙЛОВ

     При работе с диском посредством системных вызовов чрезвычай-
но важна информация о структуре данных на диске и о том, как  она
обрабатывается. Этот раздел начинается описанием "логических сек-
торов", которые являются основными единицами MSX-DOS  для  обмена
данными с диском, и завершается методом обработки данных при  по-
мощи "файлов", который более привычен для программистов.


3.1 Единицы данных на диске

* Сектора

     MSX-DOS может обслуживать большинство вариантов  дисководов,
включая 3.5" 2DD и жесткие диски. Для обеспечения единого подхода
к обработке разнообразных дисковых структур, в  качестве  базовых
информационных единиц приняты "логические сектора", которые обоз-
начаются номерами, начиная с 0.


* Кластеры

     На уровне системных вызовов в качестве базовой единицы  дан-
ных можно рассматривать сектор (см.выше). Но фактически  дисковые
данные обрабатываются "кластерами", каждый из которых состоит  из
нескольких секторов. Как описано далее в разделе о FAT,  кластеры
задаются последовательными номерами, начиная с 2, и начало облас-
ти данных соответствует положению кластера #2. Чтобы получить ин-
формацию о количестве секторов в одном кластере, используйте сис-
темную функцию 1BH (запрос данных о диске).


* Переход от кластеров к секторам

     В каталоге и в FCB, описанных ниже, расположение  информации
на диске дано в кластерах. При  использовании  системных  вызовов
необходимо вычислять соответствие между кластерами  и  секторами.
Поскольку кластер #2 и начало данных размещаются в одном и том же
месте, это можно сделать следующим образом:

     1. Примем, что заданный номер кластера равен C.
     2. Проверим первый сектор области данных (читая DPB) и  при-
мем его равным S0.
     3. Проверим количество секторов, эквивалентное одному  клас-
теру (используя функцию 1BH) и примем его равным n.
     4. Используем формулу  S=S0+(C-2)*n  для  вычисления  номера
сектора.

     Сектора в MSX-DOS подразделяются на четыре области, как  по-
казано в таблице 3.9. Сами данные сохраняются в "области данных".
Остальные три содержат сопроводительную информацию.  Рисунок  3.9
показывает расположение этих областей. Номер boot-сектора (загру-
зочного) всегда равен 0, но начальные сектора FAT, каталога и об-
ласти данных различны в зависимости от типа диска, поэтому для их
определения следует обращаться к DPB.


     Таблица 3.9 Содержание диска

     Boot-сектор - загрузочная программа MSX-DOS и  информация  о
диске.
     FAT - информация о физическом расположении данных.
     Каталог - управляющая информация о файлах на диске.
     Область данных - собственно файловые данные.


     Рисунок 3.9 Соответственные положения элементов диска

       ┌─────────────┐
       │ Boot-сектор │ сектор 0
       ├─────────────┤          ┐
диск в │     FAT     │ сектор ? │
целом  ├─────────────┤          │  начальные сектора этих
       │   каталог   │ сектор ? ├─ областей можно получить,
       ├─────────────┤          │  обратившись к DPB.
       │   данные    │ сектор ? │
       └─────────────┘          ┘


* DPB (Блок Параметров Дисковода)

     Для каждого из имеющихся дисководов MSX-DOS выделяет в памя-
ти область DPB, в которой содержится индивидуальная информация об
этом дисководе. MSX-DOS способна работать  с  большинством  типов
дисководов, поскольку различия в их структуре могут быть скомпен-
сированы программным путем.

     Информация, хранящаяся в DPB, первоначально содержится в bo-
ot-секторе (сектор #0) на диске и считывается при старте MSX-DOS.
Имейте в виду, что между содежимым boot-сектора и DPB есть разли-
чия, что показано на рисунках 3.10 и 3.11. Данные в  boot-секторе
и DPB оформляются по-разному.


     Рисунок 3.10 Информация boot-сектора

     0B
     0C - Размер сектора (в байтах)
     0D - Размер кластера (в секторах)
     0E
     0F - Число секторов, неиспользуемых MSX-DOS
     10 - Количество FATов
     11
     12 - Количество входов каталога (как много файлов?)
     13
     14 - Число секторов на диске
     15 - Идентификатор структуры
     16
     17 - Размер FAT в секторах
     18
     19 - Число треков на сектор
     1A
     1B - Число используемых сторон (одна или две)
     1C
     1D - Число скрытых секторов


     Рисунок 3.11 Структура DPB

     BASE - номер дисковода
     +01 - идентификатор структуры
     +02
     +03 - размер сектора
     +04 - маска каталога
     +05 - сдвиг каталога
     +06 - маска кластера
     +07 - сдвиг кластера
     +08
     +09 - начальный сектор FAT
     +10 - количество FATов
     +11 - число входов каталога
     +12
     +13 - начальный сектор области данных
     +14
     +15 - количество кластеров + 1
     +16 - число секторов на 1 FAT
     +17
     +18 - начальный сектор области каталога
     +19
     +20 - адрес FAT в памяти


     Для доступа к DPB используйте системный вызов 1BH (получение
информации о диске). Этот вызов возвращает адрес DPB и прочую ин-
формацию о каждом дисководе, записанную в boot-сектор (см. раздел
4 "Использование системных вызовов" о более подробном его  приме-
нении).


* FAT (Таблица Размещения Файлов)

     В MSX-DOS основной единицей записи на диск является кластер.
Файлы, которые превосходят объем одного кластера,  сохраняются  в
нескольких. Однако эти кластеры не обязательно соседние:  обычно,
после многократного создания и удаления  файлов  неиспользованные
кластеры разбросаны по всему диску, и длинный файл пишется  туда,
где есть свободное место. Чтобы файл можно было впоследствии вос-
создать, сборочная информация сохраняется, в этом - основная фун-
кция FAT.

     Кроме того, FAT служит для пометки сбойных кластеров,  чтобы
доступ к ним никогда больше не производился. Сборочная информация
и сведения о сбойных секторах необходимы для дискового менеджмен-
та. Без них диск вообще не пригоден к работе. По этим соображени-
ям всегда готовится более чем один FAT, на случай аварийного сти-
рания.

     На рисунке 3.12 показан пример FATа. Первый байт,  именуемый
"Идентификатором FATа", содержит значение, которое показывает тип
структуры (значение, как в таблице 3.2). Два следующих байта  со-
держат "холостые" значения. Действительная  сборочная  информация
пишется, начиная с четвертого байта (базовый адрес + 3) в нерегу-
лярном формате, по 12 бит на кластер. Каждая  12-битовая  область
содержит информацию, называемую "входом FAT". Заметьте, что нуме-
рация входов FAT начинается числом 2. Количество входов  является
одновременно количеством соответствующих кластеров.  FAT  следует
расшифровывать, как показано на рисунке 3.13.

	      Рисунок 3.12 Пример FATа

		  4 бита   4 бита
   Адрес FAT ─▶ ┌─────────────────┐
		│   F	      B	  │ Идентификатор FAT
		├─────────────────┤┐
	     + 1│   F	      F	  ││
		├─────────────────┤├─ "холостые" значения
	     + 2│   F	      F	  ││
		├─────────────────┤┘
	     + 3│   0	      3	  │
		├────────┐	  │ Вход FAT 2: 003H ┐
	     + 4│   4	 │    0	  │	 ┌───────────┘
		│	 └────────┤	 ▼
	     + 5│   0	      0	  │ Вход FAT 3: 004H ┐
		├─────────────────┤	 ┌───────────┘
	     + 6│   F	      F	  │	 ▼
		├────────┐	  │ Вход FAT 4: FFFH (конец)
	     + 7│   6	 │    F	  │
		│	 └────────┤
	     + 8│   0	      0	  │ Вход FAT 5: 006H ┐
		├─────────────────┤	 ┌───────────┘
	     + 9│   F	      F	  │	 ▼
		├────────┐	  │ Вход FAT 6: FFFH (конец)
	     +10│	 │    F	  │
		│	 └────────┤

     Сборочная информация - это значение, которое показывает  но-
мер следующего кластера. FFFH означает, что файл в этом  кластере
заканчивается. Пример на рисунке 3.12 демонстрирует файл из  трех
кластеров (номер 2 -> номер 3 -> номер 4), и файл из двух класте-
ров (номер 5 -> номер 6). Сборка по возрастанию номеров  показана
только для большей наглядности. На практике числа не  обязательно
упорядочены.

              Рисунок 3.13 Чтение FATа

		├─────────────────┤
		│   2	      1	  │
		├────────┐	  │ 321H
		│   4	 │    3	  │
		│	 └────────┤
		│   6	      5	  │ 654H
		├─────────────────┤

* Каталог

     Как описано выше, FAT соотносит данные с их физическим  рас-
положением на диске, но при этом не объясняет смысла этих данных.
Действительно, нужен другой источник информации, нежели FAT, что-
бы знать, какого характера данные находятся в файле. Этот  источ-
ник называется "каталог". Каждый вход каталога скомпонован из  32
байт и содержит имя файла, атрибуты, дату создания, время  созда-
ния, номер начального кластера и размер файла,  как  показано  на
рисунке 3.14.

     Байт атрибутов используется для задания "невидимости".  Ука-
зывая 1 во втором (младшем) бите этого байта,  можно  в  каталоге
защитить файл от обработки его системными вызовами (рисунок 3.15)
MS-DOS имеет и другие атрибуты, но MSX-DOS не поддерживает  такой
возможности.

     Дата и время регистрируются таким образом, что 2 байта  каж-
дого разделены на три битовых поля, как показано на рисунке  3.16
и 3.17. Поскольку под поле "время" отведены только 5  бит,  время
хранится с точностью до 2 секунд. Год указывается в 7 битах -  от
00 до 99 (1980...2079).

     Рисунок 3.14 Структура каталога

Вход каталога

     +00 - имя файла (8 символов)
     :::
     +07

     +08 - расширение (3 символа)
     +09
     +10

     +11 - атрибуты файла

     ::: - пространство для совместимости с MS-DOS (MSX-DOS
           не используется)

     +22 - время создания
     +23

     +24 - дата создания
     +25

     +26 - начальный кластер файла
     +27

     +28 - размер файла
     +29
     +30
     +31


     Рисунок 3.15 Атрибут невидимости файла

             11-й байт каталога
     ┌───┬───┬───┬───┬───┬───┬───┬───┐
     │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ x │ ∙ │
     └───┴───┴───┴───┴───┴───┴─│─┴───┘
                               │┌─ 0: разрешает доступ
                               └┤
                                └─ 1: запрещает доступ


     Рисунок 3.16 Битовые поля, представляющие время

        23-й байт каталога       22-й байт каталога
    ┌──┬──┬──┬──┬──┬──┬──┬──┐ ┌──┬──┬──┬──┬──┬──┬──┬──┐
    │h4│h3│h2│h1│h0│m5│m4│m3│ │m2│m1│m0│s4│s3│s2│s1│s0│
    └──┴──┴──┴──┴──┴──┴──┴──┘ └──┴──┴──┴──┴──┴──┴──┴──┘
    └─ час 00-23 ─┘ └── минуты 00-59 ─┘ └─ секунды/2 ─┘
                                              │
  "секунды" получаются после умножения на 2 ──┘


     Рисунок 3.17 Битовые поля, представляющие дату

        25-й байт каталога       24-й байт каталога
    ┌──┬──┬──┬──┬──┬──┬──┬──┐ ┌──┬──┬──┬──┬──┬──┬──┬──┐
    │y6│y5│y4│y3│y2│y1│y0│m3│ │m2│m1│m0│d4│d3│d2│d1│d0│
    └──┴──┴──┴──┴──┴──┴──┴──┘ └──┴──┴──┴──┴──┴──┴──┴──┘
    └── год 1980-2079 ──┘ └ месяц 1-12 ┘└─ день 1-31 ─┘


     Место на диске, где фактически хранится эта информация,  это
область каталога (см. рисунок 3.9). Ее начальный сектор занесен в
DPB. Входы каталога устроены через каждые 32 байта этой  области,
как показано на рисунке 3.18. Когда файл создается,  используется
ближайший свободный вход каталога. При уничтожении файла в первый
байт входа записывается E5H, и вход становится пустым.  Если  все
входы каталога исчерпаны, создать новый файл невозможно, даже при
наличии достаточного места в области  данных.  Количество  входов
каталога, или, что то же самое, максимальное число файлов,  кото-
рое можно создать на диске, также указано в DPB.


     Рисунок 3.18 Организация области каталога

     +00 - MSXDOS.SYS
     +32 - COMMAND.COM
     +64 - E5H - вход каталога, первый  байт  которого  E5H,
пока не используется
     +96 - TEST
     :::
     +32*n - 00H - вход каталога, первый байт которого  00H,
ни разу не использовался.



3.2 Доступ к файлу

* FCB (Блок Управления Файлом)

     Использование информации, которая хранится в каталоге,  поз-
воляет трактовать данные как единый "файл".  Преимущество  такого
метода заключается в том, что отпадает необходимость представлять
положение файла неким абсолютным адресом -  номером  сектора  или
кластера; вместо этого  программисту  достаточно  указать  только
"имя" файла, и система выполнит всю работу, связанную с его адре-
сацией. Иными словами, программисту не нужно понимать  в  подроб-
ностях, какие сектора занимает файл. В таких случаях наряду с ка-
талогом важную роль играет FCB.

     FCB - это область для хранения информации, которая нужна при
обработке файлов с помощью системных вызовов.  Обработка  каждого
файла требует 37 байт памяти, как показано на рисунке 3.19.  Нес-
мотря на то, что FCB может размещаться в памяти где угодно, обыч-
но используется адрес 005CH для унификации режимов MSX-DOS.


     Рисунок 3.19 Организация FCB

     +00 - номер дисковода

     +01 - имя файла 8 байт + расширение 3 байта
     :::
     +11

     +12 - текущий блок
     +13 

     +14 - размер записи (1...65535)
     +15

     +16 - размер файла (1...4294967296)
     :::
     +19

     +20 - дата (как и в каталоге)
     +21

     +22 - время (как и в каталоге)
     +23

     +24 - идентификатор устройства

     +25 - положение в каталоге

     +26 - номер первого кластера файла
     +27

     +28 - последний обработанный кластер
     +29

     +30 - число кластеров от первого до обработанного
     +31

     +32 - текущая запись

     +33 - произвольная запись
     :::
     +36

ПРИМЕЧАНИЕ: Использование FCB различно, в  зависимости  от  того,
применены ли системные вызовы, совместимые с  CP/M  или  дополни-
тельные. Подробности см. ниже.


∙ Номер дисковода (00H)
     Показывает дисковод, который содержит файл.
     (0 - текущий, 1 - A:, 2 - B:, ...).

∙ Имя файла (01H...08H)
     Имя файла может иметь максимально до  8  символов.  Если  их
меньше 8, остаток заполняется пробелами (20H).

∙ Расширение (09H...0BH)
     Расширение может иметь максимально до 3  символов.  Если  их
меньше 3, остаток заполняется пробелами (20H).

∙ Текущий блок (0CH...0DH)
     Показывает номер текущего блока при последовательном доступе
(см. функции 14H, 15H в разделе 4).

∙ Размер записи (0EH...0FH)
     Указывает размер единицы данных (записи),  которая  читается
или пишется за один прием, в байтах (см. функции 14H,  15H,  21H,
27H, 28H).

∙ Размер файла (10H...13H)
     Показывает длину файла в байтах.

∙ Дата (14H...15H)
     Показывает дату последней записи в файл. Тот же формат,  что
и в каталоге.

∙ Время (16H...17H)
     Показывает время последней записи в файл. Тот же формат, что
и в каталоге.

∙ Идентификатор устройства (18H)
     Если периферия открыта как файл, в этом поле задается значе-
ние, показанное в таблице 3.10. Для обычных дисковых файлов  зна-
чение этого поля равно 40H + номер дисковода, например, для диска
A: 41H. (В программах для продажи использовать этот идентификатор
не рекомендуется.)

     Таблица 3.10. Идентификатор устройства.

	CON (Консоль)	0FFH
	PRN (Принтер)	0FBH
	LST (=PRN)	0FCH
	AUX (Дополн.)	0FEH
	NUL (Пусто)	0FDH

∙ Положение в каталоге (19H)
     Показывает порядковый номер входа в каталоге.

∙ Начальный кластер (1AH...1BH)
     Показывает первый кластер файла на диске.

∙ Последний обработанный кластер (1CH...1DH)
     Показывает последний обработанный кластер.

∙ Смещение последнего обработанного кластера относительно первого
кластера (1EH...1FH)
     Показывает смещение последнего обработанного кластера  отно-
сительно первого кластера.

∙ Текущая запись (20H)
     Показывает запись, к которой было обращение  при  последова-
тельном доступе (см. функции 14H, 15H).

∙ Произвольная запись (21H...24H)
     Указывает запись при прямом доступе. Если значение длины за-
писи равно 1...63, используются все четыре байта, тогда  как  при
длине записи 64 байта и более -  только  первые  три  (21H...23H)
(См. функции 14H, 15H, 21H, 22H, 27H, 28H).



* Открытие файла

     Перед использованием FCB требуется особая процедура открытия
файла. "Открыть файл" означает (на уровне системных вызовов) пре-
образовать неполный FCB, в котором определено только поле  имени,
в заполненный FCB, опираясь при этом на информацию  из  каталога.
На рисунке 3.20 демонстрируется  различие  между  "неоткрытым"  и
"открытым" FCB.

     Рисунок 3.20 До и после открытия FCB

До открытия заданы:
     номер дисковода и имя файла

После открытия определены:
     текущий дисковод преобразован в реальный номер 01H, 02H
     размер файла
     дата
     время
     идентификатор устройства
     положение в каталоге
     первый кластер файла
     последний обработанный кластер
     смещение обработанного кластера относительно первого


* Закрытие файла

     Если файл открыт, и произведена запись в него, значение каж-
дого поля FCB (размер файла, например), тоже  меняется.  Если  не
вернуть обновленную информацию в каталог, при  следующем  доступе
может обнаружиться несовпадение между фактическим состоянием дан-
ных и сведениями о них в каталоге. Такая  процедура  по  возврату
информации из FCB в каталог соответствует  "закрытию"  файла  (на
уровне системных вызовов).


* Прямой (произвольный) блочный доступ (управление файлами с  по-
мощью записей)

     MSX-DOS располагает двумя системными вызовами, которые имеют
дело с прямым доступом: "RANDOM BLOCK READ"  (чтение)  и  "RANDOM
BLOCK WRITE" (запись). Благодаря этим функциям, файл можно  поде-
лить на информационные единицы любого размера, которыми можно уп-
равлять по номеру: 0, 1, 2 и т.д., считая от начала. Такая инфор-
мационная единица называется "записью". Размер записи может  быть
любым числом. Так, например, можно трактовать  как  одну  запись:
целиком весь файл (предельно последовательный доступ), каждый от-
дельный байт данных (предельно прямой  доступ),  или  каждые  128
байт (как это делает CP/M).

     В этом случае используют поля "размер записи" и "номер  про-
извольной записи". Значение "размера записи" - это число  байтов,
приходящихся на одну запись. Поле номера записи  может  содержать
любое число (подробнее см. описание каждого системного вызова).

                Рисунок 3.21 Файл и запись
	┌──────▶┌──────▶┌───────────┐
	│ размер записи │ запись #0 │
	│	└──────▶├───────────┤
	│		│ запись #1 │◀─ произвольная запись
	│		├───────────┤	указывает на текущую
файл как целое		│ запись #2 │		запись
	│		├───────────┤
	│		:           :
	│		├───────────┤
	│		│ запись #n │
	└──────▶	└───────────┘

* Последовательный доступ (управление файлом  с  помощью  записей
фиксированной длины + поля текущей записи + поля текущего блока)

     Из соображений совместимости MSX-DOS может обрабатывать фай-
лы теми же путями, что и CP/M. Первый путь заключается в  исполь-
зовании последовательных файлов, которые  управляются  с  помощью
поля "текущей записи" и "текущего блока". В качестве единицы  об-
мена с диском принята запись фиксированной длины 128 байт. Доступ
всегда ведется последовательно от начала файла, причем количество
обработанных записей подсчитывается в поле FCB "текущая  запись".
Достигнув 128, текущая запись сбрасывается в 0, а перенос подсчи-
тывается в поле "текущего блока".


* Прямой доступ (управление файлом с помощью записи фиксированной
длины + поля произвольной записи)

     Второй метод,  включенный  для  сохранения  совместимости  с
CP/M, - это прямой доступ с использованием поля "произвольной за-
писи". Он позволяет обращаться к записи, которая находится в  лю-
бом месте, но размер записи фиксирован (128 байт).
MSX2 TECHNICAL HANDBOOK, CHAPTER 3


4. ИСПОЛЬЗОВАНИЕ СИСТЕМНЫХ ВЫЗОВОВ

     Системные вызовы представляют собой набор подпрограмм общего
назначения, которые обеспечивают основные  операции  ввода/вывода
MSX-DOS. То, что эти вызовы скомпонованы вместе  заранее  опреде-
ленным образом, открывает свободный доступ  к  основным  функциям
дисковой системы MSX.

     Перед системными вызовами стоят две задачи: первая - сэконо-
мить время программирования путем предварительной подготовки  ба-
зовых функций; вторая -  повысить  переносимость,  поскольку  все
программы создаются в расчете на одни и те же функции.  Выделение
системных вызовов в отдельную группу сокращает  время  разработки
программ и делает их максимально переносимыми.

     Чтобы выполнить системный вызов, введите определенный  номер
функции в регистр C микропроцессора Z80 и вызовите один из следу-
ющих адресов:

     0005H - MSX-DOS
     F37DH - MSX DISK-BASIC

     Например, если номер функции равен 1FH, и для вызова  требу-
ется, чтобы в регистре A находилось число 00H, можно использовать
следующий ассемблерный код:

	LD	A,00H
	LD	C,1FH
	CALL	0005H

     CALL используется также в операциях, которые возвращают зна-
чения или выставляют регистры по содержимому памяти. Кроме  того,
системные вызовы можно отрабатывать из DISK-BASICа,  обращаясь  к
адресу F37DH. Для этого поместите машинные коды в область,  огра-
ниченную оператором CLEAR, и вызовите их начальный адрес операто-
ром USR.


* Формат описания системного вызова

     Этот раздел знакомит с использованием  системных  вызовов  в
следующей нотации:

∙ Функция
     Для идентификации системного вызова используется номер  фун-
кции. Его нужно поместить перед обращением в регистр C.

∙ Настройка
     Здесь показаны значения, которые следует установить  в  наз-
ванных регистрах или ячейках памяти, прежде чем вызывать функцию.

∙ Возвращаемое значение
     Результат, полученный функцией, обычно помещается в  регистр
или ячейку памяти.

     Очень важно помнить, что при использовании системных вызовов
разрушается значение тех регистров, которые  не  были  упомянуты;
поэтому регистры, изменение которых нежелательно,  перед  вызовом
функции сохраняйте в RAM (допустим, в стеке).

     Существует сорок два системных вызова MSX-DOS. Они  перечис-
лены в таблице 3.11 и описаны в данном разделе. Их можно  подраз-
делить на четыре категории:

     ∙ Периферийный ввод/вывод
     ∙ Установка оборудования
     ∙ Абсолютная ЗАПИСЬ/ЧТЕНИЕ (прямой доступ к секторам)
     ∙ Доступ к файлам через FCB


     Таблица 3.11 Список системных вызовов

00H - сброс (переустановка) системы
01H - получает один символ с консоли (ожидание ввода,  эхо,  про-
верка управляющих кодов)
02H - посылает один символ на консоль
03H - получает один символ с устройства AUX
04H - посылает один символ на устройство AUX
05H - посылает один символ на принтер
06H - получает один символ с консоли (без ожидания, без эха,  без
проверки управляющих кодов)/выводит один символ
07H - получает один символ с консоли (с ожиданием, без  эха,  без
проверки управляющих кодов)
08H - получает один символ с консоли (с  ожиданием,  без  эха,  с
проверкой управляющих кодов)
09H - посылает строку
0AH - получает строку
0BH - проверяет, был ли ввод с консоли
0CH - получает номер версии
0DH - переустанавливает диск
0EH - выбирает текущего дисковода
0FH - открывает файл
10H - закрывает файл
11H - ищет первое вхождение в каталог по маске
12H - ищет последующие вхождения в каталог
13H - удаляет файл
14H - читает последовательный файл
15H - пишет последовательный файл
16H - создает файл
17H - переименовывает файл
18H - получает вектор состояния
19H - получает имя текущего дисковода
1AH - устанавливает адрес DMA
1BH - возвращает информацию о диске
1CH-20H - нет функции
21H - пишет файл прямого доступа
22H - читает файл прямого доступа
23H - получает размер файла
24H - устанавливает поле произвольной записи
25H - нет функции
26H - пишет произвольный блок
27H - читает произвольный блок
28H - пишет файл прямого доступа (незанятые байты = 00H)
29H - нет функции
2AH - получает дату
2BH - устанавливает дату
2CH - получает время
2DH - устанавливает время
2EH - устанавливает флаг верификации
2FH - читает логический сектор
30H - пишет логический сектор


∙ ПРИМЕЧАНИЕ
     Номера системных функций лежат в диапазоне 00H...30H; следу-
ющие семь номеров пусты:

     1CH...20H, 25H, 29H

     Вызов этих пустых функций не производит ничего, кроме  уста-
новки 00H в регистре A. Системные вызовы, начиная с 31H, не опре-
делены вовсе, поэтому обращение к ним может вызвать  непредсказу-
емые (нежелательные) последствия.

     Листинг 3.3 Полезные подпрограммы

; =================================================
; Листинг 3.3 UTILITY.MAC
; Данные процедуры используются в других программах
; GETARG, STOHEX, PUTHEX, PUTCHR, DUMP8B
; =================================================
	PUBLIC	GETARG	; Примечание: процедуры из этого файла
	PUBLIC	STOHEX	; будут использованы в дальнейших примерах
	PUBLIC	PUTHEX
	PUBLIC	PUTCHR
	PUBLIC	DUMP8B

BDOS	EQU	0005H
DMA	EQU	0080H

; ----- DE := адрес копии аргументов ----

GETARG:	PUSH	AF	; "Энный" параметр (N указано в рег. A)
	PUSH	BC	; командной строки, хранящейся в DMA,
	PUSH	HL	; загружается в память, и его начальный
			; адрес помещается в DE
	LD	C,A
	LD	HL,DMA
	LD	B,(HL)
	INC	HL
	INC	B

SKPARG:	DEC	B
	JR	Z,NOARG
SKP1:	LD	A,(HL)
	INC	HL
	CALL	TRMCHK
	JR	NZ,SKP1
SKP2:	LD	A,(HL)
	INC	HL
	CALL	TRMCHK
	JR	Z,SKP2
	DEC	HL
	DEC	C
	JR	SKPARG

CPYARG:	LD	DE,BUFMEM
CPY1:	LD	A,(HL)
	LD	(DE),A
	INC	HL
	INC	DE
	CALL	TRMCHK
	JR	NZ,CPY1

	DEC	DE
	LD	A,'$'
	LD	(DE),A
	LD	DE,BUFMEM
	JR	EXIT

NOARG:	LD	DE,BUFMEM
	LD	A,'$'
	LD	(DE),A

EXIT:	POP	HL
	POP	BC
	POP	AF
	RET

TRMCHK:	CP	09H
	RET	Z
	CP	0DH
	RET	Z
	CP	' '
	RET	Z
	CP	':'
	RET

; ------- HL := шестнадцатиричное значение DE

STOHEX:	PUSH	AF	; 16-ричная строка, на к-рую указывает
	PUSH	DE	; DE, превращается в 2-байтовое число,
	LD	HL,0	; которое помещается в HL
	CALL	STOH1
	POP	DE
	POP	AF
	RET

STOH1:	LD	A,(DE)
	INC	DE
	SUB	'0'
	RET	C
	CP	10
	JR	C,STOH2
	SUB	'A'-'0'
	RET	C
	CP	6
	RET	NC
	ADD	A,10

STOH2:	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	OR	L
	LD	L,A
	JR	STOH1

; ------ печать A в 16-ричном виде (00-FF)

PUTHEX:	PUSH	AF	; Значение регистра A выводится
	RR	A	; в виде двух знаков
	RR	A
	RR	A
	RR	A
	CALL	PUTHX1
	POP	AF
PUTHX1:	PUSH	AF
	AND	0FH
	CP	10
	JR	C,PUTHX2
	ADD	A,'A'-10-'0'
PUTHX2:	ADD	A,'0'
	CALL	PUTCHR
	POP	AF
	RET

; ------- печать символа

PUTCHR:	PUSH	AF
	PUSH	BC
	PUSH	DE
	PUSH	HL
	LD	E,A
	LD	C,02H
	CALL	BDOS
	POP	HL
	POP	DE
	POP	BC
	POP	AF
	RET

; ---- вывод 8 байтов [HL]~[HL+7] в 16-ричном и ASCII виде

DUMP8B:	PUSH	HL	; содержимое 8 байтов, начиная с адреса,
	LD	B,8	; указанного в HL, распечатывается
DUMP1:	LD	A,(HL)	; одновременно в 16-ричном и символьном
	INC	HL	; виде
	CALL	PUTHEX
	LD	A,' '
	CALL	PUTCHR
	DJNZ	DUMP1
	POP	HL
	LD	B,8
DUMP2:	LD	A,(HL)
	INC	HL
	CP	20H
	JR	C,DUMP3
	CP	7FH
	JR	NZ,DUMP4
DUMP3:	LD	A,'.'
DUMP4:	CALL	PUTCHR
	DJNZ	DUMP2
	LD	A,0DH
	CALL	PUTCHR
	LD	A,0AH
	CALL	PUTCHR
	RET

; ----- рабочая область

BUFMEM:	DS	256
	END



4.1 Периферийный Ввод/Вывод

     Следующие системные вызовы предназначены для операций ввода-
вывода. Примерами таких операций могут служить обмен  с  консолью
(экран + клавиатура), дополнительный ввод/вывод (внешнее  устрой-
ство), обмен с принтером и т.д. Поскольку  такие  процедуры,  как
ввод данных с клавиатуры или управление принтером  необходимы  во
многих программах, Вы скоро придете к выводу, что функции из это-
го раздела весьма полезны для самых общих приложений.


* Ввод с консоли

     Функция: 01H
     Настройка: нет
     Возвращает: Регистр А◀─ один символ с консоли

     Если ввода нет (клавиши не нажаты, входной буфер пуст), фун-
кция ждет символов, которые сразу посылаются обратно  на  консоль
("эхо"). Функция реагирует на ряд управляющих кодов: Ctrl-C  пре-
рывает программу и возвращает систему на командный  уровень  DOS;
Ctrl-P обеспечивает вывод на принтер всякого  успешно  введенного
сообщения, пока не будет принят символ Ctrl-N; Ctrl-S приостанав-
ливает вывод на экран до нажатия любой клавиши.


* Вывод на консоль

     Функция: 02H
     Настройка: Регистр E◀─ код символа для вывода
     Возвращает: нет

     Этот системный вызов выводит символ из регистра E на экран и
аналогично реагирует на четыре управляющих символа, перечисленных
выше.


* Внешний ввод

     Функция: 03H
     Настройка: нет
     Возвращает: Регистр A◀─ символ с устройства AUX

     Этот вызов реагирует на четыре управляющих кода.


* Внешний вывод

     Функция: 04H
     Настройка: Регистр E◀─ код символа для вывода на AUX
     Возвращает: нет

     Этот вызов реагирует на четыре управляющих кода.


* Вывод на принтер

     Функция: 05H
     Настройка: Регистр A◀─ код символа с консоли

     Этот системный вызов не возвращает эха. Он трактует управля-
ющие символы точно так же, как и 01H.


* Обмен символом с консолью

     Функция: 06H
     Настройка: Регистр E◀─ код. Если код 00H...FEH, то вывод  на
экран символа с этим кодом; если код равен FFH, то  опрос  клави-
атуры.
     Возвращает: Если в регистре E выставлено FFH, результат вво-
да находится в регистре А. Значение регистра A равно коду нажатой
клавиши; если нет нажатия - 00H. При остальных значениях регистра
E ничего не возвращается.
     
     Этот системный вызов не поддерживает управляющих кодов и  не
возвращает "эха", но реагирует на четыре управляющих символа.


* Непосредственный консольный ввод - 1

     Функция: 07H
     Настройка: нет
     Возвращает: Регистр А◀─ один символ с консоли 

     Этот системный вызов не поддерживает управляющие коды  и  не
возвращает эха.


* Непосредственный консольный ввод - 2

     Функция: 08H
     Настройка: нет
     Возвращает: Регистр А◀─ один символ с консоли 

     Этот системный вызов не возвращает эха и  трактует  управля-
ющие символы точно так же, как и 01H.


* Вывод строки

     Функция: 09H
     Настройка: DE◀─ стартовый адрес строки в памяти
     Возвращает: нет

     К строке добавляется 24H ("$") как признак конца. Этот  сис-
темный вызов реагирует на управляющие символы, как было упомянуто
перед этим.


* Ввод строки

     Функция: 0АH
     Настройка: в регистре DE следует указать  адрес  памяти,  по
которому предварительно помещается число,  ограничивающее  макси-
мальное количество символов (1...255)  в  строке,  которое  можно
ввести.
     Возвращает: Количество символов, фактически введенных с кон-
соли, записывается по адресу DE+1; введенная строка  сохраняется,
начиная с адреса DE+2.

     Ввод с консоли завершается по нажатию клавиши RETURN; однако
он заканчивается и в том случае, когда количество введенных  сим-
волов превышает заданное (числом по адресу DE).  Лишние  символы,
включая и код клавиши RETURN, игнорируются. Вводимую строку можно
редактировать, используя запаздывание. Системный вызов  проверяет
и исполняет четыре управляющих символа, перечисленные ранее.


* Проверка состояния консоли

     Функция: 0BH
     Настройка: нет
     Возвращает: если нажата клавиша, регистр А получает значение
FFH, в противном случае 00H.

     Этот системный вызов реагирует на управляющие символы,  опи-
санные ранее.


4.2 Проверка и настройка оборудования

     Следующие системные вызовы настраивают оборудование MSX: ме-
няют, например, текущий дисковод или устанавливают  разнообразные
значения для использования их "по умолчанию".


* Перезапуск системы

     Функция: 00H
     Настройка: нет
     Возвращает: нет

     Если вызвать эту функцию из режима MSX-DOS, система  переза-
пустится (путем передачи управления по адресу  0000H).  Если  она
вызвана из DISK-BASICа, выполнится "теплый" старт. Это  означает,
что система вернется в командный  режим  BASICа  без  уничтожения
программы, которая находится в памяти.


* Получение номера версии

     Функция: 0CH
     Настройка: нет
     Возвращает: в регистре HL◀─ 0022H

     Этот системный вызов предназначен для уточнения номеров мно-
гочисленых версий CP/M; на MSX же он всегда возвращает 0022H.


* Переустановка диска

     Функция: 0DH
     Настройка: нет
     Возвращает: нет

     Если имеется сектор, который был изменен, но не  записан  на
диск, этот системный вызов записывает его, затем текущим дисково-
дом объявляет A и устанавливает DMA по адресу 0080H.


* Установка номера текущего дисковода

     Функция: 0EH
     Настройка: регистр E◀─ новый номер текущего дисковода  (A  =
		00H, B = 01H, ... )
     Возвращает: нет

     Системные вызовы осуществляют доступ к дисководу, номер  ко-
торого (если не указано иначе) задается  "текущим  номером".  За-
метьте, что "текущий номер" игнорируется, если в FCB номер диско-
вода отличается от 00H.


* Получение вектора состояния

     Функция: 18H
     Настройка: нет
     Возвращает: в HL◀─ информация об "активных" дисководах

     "Активным" (online) считается дисковод, подключенный к MSX в
процессе загрузки системы. Выполнение этой системной функции  вы-
зывает проверку каждого дисковода, находится ли  он  в  состоянии
"online" ("на связи"), а результаты проверки возвращаются  в  ре-
гистре HL, как показано на рисунке 3.22. Если бит равен 1,  соот-
ветствующий дисковод "активен", иначе нет.

               Рисунок 3.22 Вектор состояния
┌────────────────┬─────────────────────┬────────────────────┐
│ имя регистра	 │	    H	       │	  L	    │
├────────────────┼─────────────────────┼────────────────────┤
│ номер бита	 │   7 6 5 4 3 2 1 0   │   7 6 5 4 3 2 1 0  │
│ имя дисковода  │ в MSXDOS незначащие │   H G F E D C B A  │
├────────────────┼─────────────────────┴────────────────────┤
│ online/offline │	     1 = online,  0 = offline       │
└────────────────┴──────────────────────────────────────────┘


* Получение номера текущего дисковода

     Функция: 19H
     Настройка: нет
     Возвращает: регистр A◀─ номер текущего дисковода (A = 00H, B
= 01H, ...)


* Установка адреса для пересылки данных

     Функция: 1AH
     Настройка: регистр DE◀─ адрес пересылки данных (DMA)
     Возвращает: ничего

     Хотя изначально адрес DMA (Области Прямого Доступа) при  за-
пуске системы инициализируется значением 0080H, с  помощью  этого
системного вызова его можно изменить.


* Получение информации о диске

     Функция: 1BH
     Настройка: регистр E◀─ номер дисковода (текущий = 00H,  A  =
01H, B = 02H, ...)
     Возвращает: регистр A◀─ количество логических секторов в од-
ном кластере (или FFH, если дисковод выбран неверно).
     регистр BC◀─ размер логического сектора
     регистр DE◀─ общее количество кластеров
     регистр HL◀─ количество неиспользованных кластеров
     регистр IX◀─ начальный адрес DPB
     регистр IY◀─ начальный адрес FAT в памяти

     Этот системный вызов возвращает информацию о диске,  находя-
щемся в указанном дисководе. Номер 00H обозначает текущий  диско-
вод. Для остальных: 01H = A:, 02H = B: и т.д.

     Этот вызов создан для MSX-DOS, и несовместим с CP/M.


* Запрос даты

     Функция: 2AH
     Настройка: нет
     Возвращает: регистр HL◀─ год
     регистр D◀─ месяц
     регистр E◀─ день месяца
     регистр A◀─ день недели

     Этот вызов создан для MSX-DOS, и несовместим с CP/M.


* Установка даты

     Функция: 2BH
     Настройка: регистр HL◀─ год
     регистр D◀─ месяц
     регистр E◀─ день месяца
     Возвращает: регистр A индицирует, успешно ли выполнен вызов.
Если успешно, регистр получает значение 00H, иначе FFH.

     Этот вызов создан для MSX-DOS, и несовместим с CP/M.


* Запрос времени

     Функция: 2CH
     Настройка: нет
     Возвращает: регистр H◀─ час
     регистр L◀─ минуты
     регистр D◀─ секунды
     регистр E◀─ 1/100 секунд

     Этот вызов создан для MSX-DOS, и несовместим с CP/M.


* Установка времени

     Функция: 2DH
     Настройка: регистр H◀─ час
     регистр L◀─ минуты
     регистр D◀─ секунды
     регистр E◀─ 1/100 секунд
     Возвращает: Если обращение успешно, регистр получает  значе-
ние 00H, иначе FFH

     Этот вызов создан для MSX-DOS, и несовместим с CP/M.


* Установка флага верификации

     Функция: 2EH
     Настройка: регистр E◀─ 00H, если сброс флага
	        регистр E◀─ не 00H, если установка флага
     Возвращает: нет

     Установка флага верификации обеспечивает безошибочную запись
на диск, то есть, производится проверка правильности записи путем
повторного считывания и сравнения результата с  тем,  что  должно
быть записано.

     Этот вызов создан для MSX-DOS, и несовместим с CP/M.



4.3 Абсолютная ЗАПИСЬ/ЧТЕНИЕ (прямой доступ к секторам)

     MSX управляет дисками посредством "логических секторов"  как
минимальных информационных единиц. Логический сектор определяется
независимо от физических секторов на диске, и нумеруется от 0  до
максимального номера (который зависит от типа диска).

     Логические сектора позволяют пользователям  MSX-DOSа  и  MSX
DISK-BASICа работать с диском без привязки к количеству  физичес-
ких  секторов  на  трек,  которое  зависит  от  структуры  диска.
Вообще-то в действительности, благодаря тому, что в системе  пре-
дусмотрены вызовы, которые опираются на FCB,  пользователь  имеет
доступ ко всем тонкостям обработки файлов без какого бы то ни бы-
ло знания о логических секторах. Но для  некоторых  задач  прямой
доступ к секторам чрезвычайно желателен, и поэтому MSX-DOS и  MSX
DISK-BASIC предоставляют такую возможность.

     В этом разделе описаны системные вызовы, которые работают  с
диском непосредственно через логические сектора.


* Чтение с диска с использованием логических секторов

     Функция: 2FH
     Настройка: номер логического сектора, откуда будет  произве-
дено чтение (если нужно прочесть  несколько  секторов,  то  номер
первого из них) нужно поместить в регистр DE. Количество секторов
должно находиться в регистре H, а номер дисковода (00H для A,  01
для B, и т.д. То же самое верно и для функции 30H) -  в  регистре
L.
     Возвращает: содержимое прочитанных секторов помещено в буфер
DMA

     Этот системный вызов считывает с указанного дисковода задан-
ное количество последовательных логических  секторов,  начиная  с
указанного сектора, и помещает их содержимое по адресу DMA. С по-
мощью функции 1AH (которая задает адрес пересылки  данных)  нужно
обеспечить в памяти достаточное пространство для приема считанных
данных.

     Этот вызов создан для MSX-DOS, и несовместим с CP/M.


* Запись на диск с использованием логических секторов

     Функция: 30H
     Настройка: данные для записи нужно разместить в области  па-
мяти, начиная с адреса DMA. Номер логического сектора, с которого
начинается запись, следует поместить в регистр DE. Число  записы-
ваемых секторов должно находиться в регистре H, а номер дисковода
- в регистре L
     Возвращает: ничего

     Этот вызов создан для MSX-DOS, и несовместим с CP/M.


     Листинг 3.4 Распечатка кластера

; ================================================
;  Листинг 3.4 ДАМП КЛАСТЕРА
;  Эту программу нужно слинковать с листингом 3.3
; ================================================
	EXTRN	GETARG	; Примечание: распечатываются первые
	EXTRN	STOHEX	; 128 байт кластера, указанного в
	EXTRN	PUTHEX	; командной строке
	EXTRN	PUTCHR
	EXTRN	DUMP8B

BDOS	EQU	0005H

; ----- начало программы -----

	LD	A,1
	CALL	GETARG	; [DE]:= 1-й аргумент командной строки
	CALL	STOHEX	; HL := вычисленное значение [DE]
			; 	(номер искомого кластера)
	PUSH	HL
	LD	E,00H	; запрос текущего дисковода
	LD	C,1BH	; получить информацию о диске
	CALL	BDOS
	POP	HL
	CP	0FFH	; неудача?
	JR	NZ,L2	; если нормально, A:= сектор/кластер

	LD	DE,ERMSG1	; DE:= сообщение об ошибке
	LD	C,09H	; функция вывода строки
	CALL	BDOS
	RET		; возврат, если была ошибка

L2:	LD	E,(IX+12)
	LD	D,(IX+13)	; DE:= 1-й сектор данных
	DEC	HL
	DEC	HL	; HL:= номер кластера - 2
	LD	B,H
	LD	C,L	; BC:= номер кластера - 2
LOOP:	DEC	A	; повторить N раз
	JR	Z,RESULT
	ADD	HL,BC
	JR	LOOP

RESULT:	ADD	HL,DE	; HL:= сектор искомого кластера
	PUSH	HL	; сохранить
	LD	DE,NEWDMA	; мы зарезервировали 1024
	LD	C,1AH		; байта для нового DMA
	CALL	BDOS
	LD	C,19H
	CALL	BDOS	; текущий дисковод ?
	LD	L,A
	POP	DE	; DE:= номер искомого кластера
	LD	H,1	; H:= 1 (прочитать только 1 сектор)
	LD	C,2FH	; функция абсолютного чтения
	CALL	BDOS	; данные будут размещены в DMA

DUMP:	LD	HL,NEWDMA	; HL:= адрес DMA
	LD	DE,0000H	; DE:= смещение
	LD	B,16		; 16 линий
DLOOP:	PUSH	BC
	LD	A,D
	CALL	PUTHEX
	LD	A,E
	CALL	PUTHEX
	LD	A,' '
	CALL	PUTCHR
	PUSH	HL
	LD	HL,8
	ADD	HL,DE
	EX	DE,HL	; DE:= DE + 8
	POP	HL
	CALL	DUMP8B	; эта подпрограмма в другом файле
	POP	BC
	DJNZ	DLOOP
	RET		; работа выполнена полностью

; ----- рабочая область -----

NEWDMA:	DS	1024	; область DMA
ERMSG1:	DB	"Cannot get Disk information.$"

	END


4.4 Доступ к файлам с использованием FCB

     Исходя из того, что обработка  файлов  затруднительна,  если
использовать системные вызовы,  описанные  в  предыдущем  разделе
(которые читают/пишут логические сектора напрямую), нужны систем-
ные вызовы, использующие FCB, чтобы облегчить доступ к диску  пу-
тем простого указания имен файлов.

     Существует три категории системных вызовов через FCB. Первая
категория - последовательный доступ к файлам, вторая - произволь-
ный (оба предоставляются для сохранения  полной  совместимости  с
CP/M). Третий метод недоступен в CP/M; это  произвольный  блочный
доступ, который обеспечивает следующие возможности:

     ∙ Можно указать любой размер записи
     ∙ Можно обратиться напрямую сразу к группе записей
     ∙ Можно контролировать размер файла в байтах

     Этот раздел описывает системные вызовы для обработки  файлов
посредством FCB, включая произвольный блочный  доступ.  Имейте  в
виду, что три функции будут работать некорректно, если FCB распо-
ложить в диапазоне адресов 4000H...7FFFH:

     1. Функция 11H
     2. Функция 12H
     3. Обмен с устройствами CON, PRN, NUL, AUX


* Открытие файлов

     Функция: 0FH
     Настройка: регистр DE◀─ адрес неоткрытого FCB
     Возвращает: если файл открыт успешно, регистр A имеет значе-
ние 00H, в противном случае FFH. При успешном открытии файла  ус-
танавливаются поля FCB

     Если в качестве номера дисковода указан 0, используется "те-
кущий" номер, который установлен функцией 0EH. Чтобы открыть файл
на другом дисководе, для дисковода А следует указывать 01H, для B
- 02H и т.д.

     Когда файл открывается, на основе данных из  каталога  уста-
навливаются все поля FCB, за исключением  полей  размера  записи,
текущего блока, текущей записи и произвольной записи. Перечислен-
ные поля пользователь должен задать сам, если нужно, после сраба-
тывания функции. Состояние каждого поля FCB соответствует "состо-
янию открытого файла", и все дальнейшие  системные  вызовы  могут
работать с FCB.


* Закрытие файлов

     Функция: 10H
     Настройка: регистр DE◀─ адрес открытого FCB
     Возвращает: если файл закрыт успешно, регистр A имеет значе-
ние 00H, в противном случае FFH.

     Информация о текущем состоянии файла сохраняется путем запи-
си данных из FCB обратно в каталог. Однако если файл не корректи-
ровался, закрывать его при помощи данной функции нет необходимос-
ти.


* Поиск файла - 1

     Функция: 11H
     Настройка: регистр DE◀─ адрес неоткрытого FCB
     Возвращает: если файл найден, регистр A имеет значение  00H,
и соответствующий вход каталога (32 байта) этого файла копируется
с диска в DMA, с добавлением номера дисковода (итого 33 байта). В
противном случае A = FFH.

     В имени файла можно применять символы маскирования.  Скажем,
спецификация "????????.c" вызывает поиск любого имени с  расшире-
нием ".c", и информация о первом обнаруженном файле  записывается
в область DMA. Чтобы разыскать все подходящие файлы,  используйте
функцию 12H, которая описана ниже.


* Поиск файла - 2

     Функция: 12H
     Настройка: нет
     Возвращает: если файл найден, регистр A имеет значение  00H,
и соответствующий вход каталога (32 байта) этого файла копируется
с диска в DMA, с добавлением номера дисковода (итого 33 байта). В
противном случае A = FFH.

     Этот системный вызов следует использовать  для  поиска  нес-
кольких файлов, имена которых совпадают с маской функции 11H, по-
этому функцию 12H нельзя использовать саму по себе.

     Этот системный вызов позволяет получить информацию из  ката-
лога точно так же, как и 11H, один к одному.


* Удаление файлов

     Функция: 13H
     Настройка: регистр DE◀─ адрес открытого FCB
     Возвращает: если файл успешно удален, регистр A имеет значе-
ние 00H, в противном случае FFH.

     Используя маскирование имени, можно удалить два и более фай-
лов, поэтому будьте предельно внимательны.


* Последовательное чтение

     Функция: 14H
     Настройка: регистр DE◀─ адрес открытого FCB
     текущий блок FCB◀─ начальный блок для чтения
     текущая запись FCB◀─ начальная запись для чтения
     Возвращает: если чтение успешно, регистр A равен 00H, в про-
тивном случае 01H. Если чтение прошло успешно, одна запись, кото-
рая была прочитана, помещается в область DMA

     Поля FCB "текущий блок" и "текущая запись" после чтения уве-
личатся автоматически. Это значит, что нет нужды задавать их  за-
ново при каждом обращении. Размер записи  при  чтении  фиксирован
(128 байт).


* Последовательная запись на диск

     Функция: 15H
     Настройка: регистр DE◀─ адрес открытого FCB
     текущий блок FCB◀─ начальный блок для записи
     текущая запись FCB◀─ начальная запись
     область DMA◀─ 128 байт данных для записи
     Возвращает: если запись успешна, регистр A равен 00H, в про-
тивном случае 01H.

     Поля FCB "текущий блок" и "текущая запись" после чтения уве-
личатся автоматически.


* Создание файлов

     Функция: 16H
     Настройка: регистр DE◀─ адрес неоткрытого FCB
     Возвращает: если файл создан успешно, регистр A имеет значе-
ние 00H, в противном случае FFH.

     Размер записи, текущие блок и запись, а также  номер  записи
для произвольного доступа должны быть указаны в FCB после  выпол-
нения этого системного вызова.


* Смена имени файлов

     Функция: 17H
     Настройка: новое имя файла (11 байт) следует разместить  на-
чиная с 18-го байта FCB (2-й байт размера файла в FCB =  16  байт
после старого имени) в соответствии со старым  именем  (то  есть,
оно должно находиться с 18 по 28 байт), а адрес FCB нужно  помес-
тить в регистр DE
     Возвращает: если файл переименован успешно, регистр A  имеет
значение 00H, в противном случае FFH.

     И в старом, и в новом имени можно применять символы маскиро-
вания.  Например,  задание  "????????.o"  для  старого  имени   и
"????????.obj" для  нового  вызывает  смену  расширения  ".o"  на
".obj" у всех подходящих файлов.


* Произвольное чтение с диска

     Функция: 21H
     Настройка: регистр DE◀─ адрес открытого FCB
     произвольная запись FCB◀─ номер записи
     Возвращает: если чтение успешно, регистр A равен 00H, в про-
тивном случае 01H. Если чтение прошло успешно, одна запись, кото-
рая была прочитана, помещается в область DMA

     Длина записи фиксирована (128 байт).


* Произвольная запись на диск

     Функция: 22H
     Настройка: регистр DE◀─ адрес открытого FCB
     произвольная запись FCB◀─ номер записи
     область DMA◀─ 128 байт данных для записи
     Возвращает: если чтение успешно, регистр A равен 00H, в про-
тивном случае 01H.

     Длина записи фиксирована (128 байт).


* Запрос размера файла

     Функция: 23H
     Настройка: регистр DE◀─ адрес открытого FCB
     Возвращает: если успешно, регистр A равен 00H,  в  противном
случае 01H. Если функция  сработала  успешно,  размер  указанного
файла, округленный с точностью до 128, будет помещен в первые три
байта поля произвольной записи.

     Размер файла вычисляется с избытком с точностью до 128 байт.
Это означает, что для файлов, длина  которых  лежит  в  диапазоне
129...256 байт, будет получено число 2, но уже для файла размером
257 байт возвратится значение 3.


* Установка поля произвольной записи

     Функция: 24H
     Настройка: регистр DE◀─ адрес открытого FCB
     текущий блок FCB◀─ требуемый блок
     текущая запись FCB◀─ требуемая запись
     Возвращает: позиция требуемой записи, вычисленная по  значе-
ниям полей текущего блока и текущей записи FCB, помещается в поле
произвольной записи


* Произвольная блочная запись на диск - 2

     Функция: 26H
     Настройка: регистр DE◀─ начальный адрес FCB
     размер записи FCB◀─ требуемый размер записи
     произвольная запись FCB◀─ номер записи
     регистр HL◀─ число сохраняемых записей
     область DMA◀─ данные для записи
     Возвращает: если запись успешна, регистр A равен 00H, в про-
тивном случае 01H.

     После срабатывания функции значение поля произвольной записи
автоматически возрастает и указывает на следующую запись.  Размер
одной записи может быть установлен от 1 до 65535 байт, путем ука-
зания желаемого значения в поле размера записи FCB. При  количес-
тве записей, равном 0, вычисляется длина  файла  путем  умножения
номера записи на ее длину. Остаток отбрасывается.

     Этот вызов создан для MSX-DOS, и несовместим с CP/M.


* Произвольное блочное чтение с диска - 2

     Функция: 27H
     Настройка: регистр DE◀─ начальный адрес FCB
     размер записи FCB◀─ требуемый размер записи
     произвольная запись FCB◀─ номер записи
     регистр HL◀─ число читаемых записей
     Возвращает: если чтение успешно, регистр A равен 00H, в про-
тивном случае 01H. Количество реально прочитанных записей переда-
ется обратно в регистре HL

     После срабатывания функции значение поля произвольной записи
автоматически возрастает и указывает на следующую  запись.  Число
реально прочитанных записей возвращается в регистре HL. Это озна-
чает, что если достигнут конец файла до того  как  прочитаны  все
требуемые записи, число тех, что действительно уже прочитаны, ус-
тановится в регистре HL.

     Этот вызов создан для MSX-DOS, и несовместим с CP/M.


* Произвольная запись на диск - 3

     Функция: 28H
     Настройка: регистр DE◀─ адрес открытого FCB
     произвольная запись FCB◀─ номер записи
     область DMA◀─ 128 байт данных для записи
     Возвращает: если запись успешно, регистр A равен 00H, в про-
тивном случае 01H.

     Длина записи фиксирована (128 байт).

     Этот системный вызов делает то же самое, что и 22H,  за  не-
большим исключением: если файл увеличивается, то перед  указанной
записью добавляются записи из нулей 00H.


     Листинг 3.5 Распечатка файла
; =========================================================
; Листинг 3.5 ДАМП ФАЙЛА
; Эту программу необходимо слинковать с листингом 3.3
; =========================================================
	EXTRN	GETARG	; Примечание: получает дамп файла,
	EXTRN	STOHEX	; указанного в командной строке
	EXTRN	PUTCHR
	EXTRN	PUTHEX
	EXTRN	DUMP8B

BDOS	EQU	0005H
FCB	EQU	005CH	; имя файла из командной строки
			; сохраняется по умолчанию с 005CH
; ----- начало программы -----

	LD	DE,FCB	; DE:= адрес FCB
	LD	C,0FH	; открыть файл
	CALL	BDOS
	OR	A	; успешно ?
	JR	Z,READ	; если так, переход к READ

	LD	DE,ERMSG1	; DE:= сообщение об ошибке
	LD	C,09H	; вывод строки
	CALL	BDOS
	RET

READ:	LD	A,2
	CALL	GETARG	; взять 2-й аргумент командной строки
	CALL	STOHEX	; HL:= значение аргумента
	LD	(ADRS),HL	; сохранить счетчик адреса

	LD	DE,NEWDMA
	LD	C,1AH	; установить новый адрес DMA
	CALL	BDOS

	LD	HL,8
	LD	(FCB+14),HL	; размер записи := 8 байт

	LD	HL,0
	LD	(FCB+33),HL
	LD	(FCB+35),HL	; номер записи := 0

RD1:	LD	HL,NEWDMA	; почистить DMA
	LD	B,8
RD2:	LD	(HL),' '
	INC	HL
	DJNZ	RD2

	LD	HL,1	; читать 1 запись
	LD	DE,FCB
	LD	C,27H	; чтение произвольного блока
	CALL	BDOS
	OR	A	; успешно ?
	JR	Z,DUMP	; если да, то распечатать

	LD	DE,ERMSG2	; [DE]:= "Ok"
	LD	C,09H	; вывод строки
	CALL	BDOS
	RET

DUMP:	LD	HL,(ADRS)
	LD	A,H
	CALL	PUTHEX
	LD	A,L
	CALL	PUTHEX
	LD	A,' '
	CALL	PUTCHR
	LD	DE,8
	ADD	HL,DE
	LD	(ADRS),HL

	LD	HL,NEWDMA
	CALL	DUMP8B	; дамп 8 байтов
	JR	RD1

; ----- рабочая область -----

ADRS:	DS	2
NEWDMA:	DS	8

; ----- сообщения об ошибках -----

ERMSG1:	DB	"Cannot open that file.$"
ERMSG2:	DB	"Ok.$"
	END

Глава 4

MSX2 TECHNICAL HANDBOOK, CHAPTER 4

              ВИДЕОПРОЦЕССОР (VDP) И ЭКРАН ДИСПЛЕЯ

     В машине MSX2 для обработки изображений используется сложный
видеопроцессор (VDP) V9938 MSX-VIDEO. Эта микросхема обеспечивает
целый ряд новых графических возможностей, оставаясь при этом пол-
ностью совместимой с TMS9918A, которая применена в MSX1.

     Глава 4 описывает, как использовать видеопроцессор. Здесь же
объясняются функции, которые недоступны из BASICа. Более подробно
об аппаратных спецификациях см. V9938  MSX-VIDEO  Technical  Data
Handbook (ASCII).


1. КОНФИГУРАЦИЯ MSX-VIDEO.

     MSX-VIDEO, в сравнении с TMS9918A, улучшен по следующим нап-
равлениям:

     ∙ 512 цветов благодаря 9-битовой цветовой палитре
     ∙ Макс. разрешение 512x424 (чересстрочная развертка)
     ∙ Макс. 256 цветов одновременно
     ∙ Полный бит-мэп, упрощающий графические операции
     ∙ Текстовый режим с 80 символами в строке
     ∙ Аппаратно реализованные LINE, SEARCH, AREA-MOVE
     ∙ До 8 спрайтов на одной горизонтали
     ∙ Отдельный цвет для каждой строки спрайта
     ∙ Встроенная возможность оцифровки видеосигнала
     ∙ Встроенная возможность наложения видеосигнала


1.1 Регистры

     Для управления экранными операциями предусмотрены  49  внут-
ренних регистров, которые так и названы в этой книге  "регистрами
VDP". По своему назначению они классифицируются  на  три  группы,
как описано далее. К группе управляющих регистров и группе регис-
тров статуса можно обращаться из BASICа посредством системной пе-
ременной VDP (n).

(1) Группа управляющих регистров (R#0...R#23, R#32...R#46)

     Это группа 8-битовых регистров, предназначенных  только  для
записи, которая управляет действиями MSX-VIDEO. Регистры  обозна-
чаются в нотации R#n. R#0...R#23 используются для установки режи-
ма экрана, R#32...R#48 предназначены для активизации команд  VDP,
детально описанных в разделе 5. Управляющие регистры с #24 по #31
не существуют. Назначение различных регистров перечислено в  таб-
лице 4.1.

     Таблица 4.1 Список управляющих регистров

R#0   VDP(0)   регистр режима #0
R#1   VDP(1)   регистр режима #1
R#2   VDP(2)   таблица ссылок на образы
R#3   VDP(3)   таблица цветов (мл.)
R#4   VDP(4)   таблица генератора образов
R#5   VDP(5)   таблица атрибутов спрайтов (мл.)
R#6   VDP(6)   таблица генератора спрайтов
R#7   VDP(7)   цвет рамки / цвет символов в текстовом режиме
R#8   VDP(9)   регистр режима #2
R#9   VDP(10)  регистр режима #3
R#10  VDP(11)  таблица цветов (ст.)
R#11  VDP(12)  таблица атрибутов спрайтов (ст.)
R#12  VDP(13)  цвет символов при мерцании
R#13  VDP(14)  период мерцания
R#14  VDP(15)  адрес доступа к VRAM (ст.)
R#15  VDP(16)  косвенная адресация регистра статуса S#n
R#16  VDP(17)  косвенная адресация регистра палитры P#n
R#17  VDP(18)  косвенная адресация регистра управления R#n
R#18  VDP(19)  коррекция положения экрана
R#19  VDP(20)  номер строки при прерывании
R#20  VDP(21)  сигнал цветовой вспышки 1
R#21  VDP(22)  сигнал цветовой вспышки 2
R#22  VDP(23)  сигнал цветовой вспышки 3
R#23  VDP(24)  аппаратный скролл

R#32  VDP(33)
R#33  VDP(34)  SX: координата X пересылаемого участка
R#34  VDP(35)
R#35  VDP(36)  SY: координата Y пересылаемого участка
R#36  VDP(37)
R#37  VDP(38)  DX: координата X участка-приемника
R#38  VDP(39)
R#39  VDP(40)  DY: координата Y участка-приемника
R#40  VDP(41)
R#41  VDP(42)  NX: ширина пересылаемого участка
R#42  VDP(43)
R#43  VDP(44)  NY: высота пересылаемого участка
R#44  VDP(45)  CLR: для обмена данными с CPU
R#45  VDP(46)  ARG: выбор основной и расширенной VRAM
R#46  VDP(47)  CMR: указание команды VDP



(2) Группа регистров статуса (S#0...S#9)

     Это группа 8-битовых регистров, предназначенных  только  для
чтения, которая позволяет получать информацию  от  VDP.  Регистры
обозначаются в нотации S#n. Функции регистров приводятся в табли-
це 4.2.

     Таблица 4.2 Список регистров статуса

S#0   VDP(8)   информация о прерываниях
S#1   VDP(-1)  информация о прерываниях
S#2   VDP(-2)  информация о выполнении команд VDP и т.д.
S#3   VDP(-3)  обнаруженная координата (мл.)
S#4   VDP(-4)  обнаруженная координата (ст.)
S#5   VDP(-5)  обнаруженная координата (мл.)
S#6   VDP(-6)  обнаруженная координата (ст.)
S#7   VDP(-7)  данные, полученные командой VDP
S#8   VDP(-8)  координата, полученная командой поиска (мл.)
S#9   VDP(-9)  координата, полученная командой поиска (ст.)



(3) Группа регистров палитры (P#0...P#15)

     Эти регистры используются для настройки цветовой  палитры  и
обозначаются в нотации P#n, где n означает номер  палитры,  пред-
ставляющий один из 512 цветов. Каждый регистр имеет 9  битов  (по
три бита на составляющую RGB).


1.2 ВИДЕОПАМЯТЬ (VRAM)

     К MSX-VIDEO можно подключить 128К видеопамяти (VRAM)  и  64К
расширенной памяти. MSX-VIDEO  располагает  17-битовым  счетчиком
адреса для доступа к адресному пространству 128К. Следует иметь в
виду, что эта память относится только к MSX-VIDEO и не может  ис-
пользоваться CPU напрямую.

     Расширенная RAM на может непосредственно отображаться на эк-
ране, как это делает VRAM, но с ней можно обращаться точно также,
как и с VRAM, когда речь идет о командах VDP. При  обработке  эк-
ранной информации весьма полезно  иметь  такое  обширное  рабочее
пространство. Однако следует помнить, что стандарт MSX2 не  вклю-
чает в себя инструкции, расчитанные на расширенную  RAM,  поэтому
совместимость программ, опирающихся в работе на расширенную  RAM,
проблематична при переходе на другие MSX-машины.

            Рисунок 4.1 VRAM и расширенная RAM

	┌───────────────┐ 00000 ┌───────────────┐
	│		│	│		│
	│		│	│		│
	├───────────────┤ 0FFFF └───────────────┘
	│		│	   ERAM (данные)
	│		│
	└───────────────┘ 1FFFF
	   VRAM (экран)



1.3 ПОРТЫ ВВОДА/ВЫВОДА

     Для пересылки данных между CPU и MSX-VIDEO в прямом и обрат-
ном направлении существует четыре порта. Их назначение  приведено
в таблице 4.3. Доступ к портам производится по их адресам n и n',
указанным в ячейках 6 и 7 MAIN-ROM. Несмотря на то, что обычно n=
n'= 98h, на некоторых машинах возможны отклонения, поэтому адреса
портов следует уточнять.

     В большинстве случаев для обеспечения совместимости операций
ввода/вывода рекомендуется использовать BIOS. Но, с другой сторо-
ны, зачастую требуется высокая скорость обмена с экраном, поэтому
допускается и прямой доступ к этим портам.

     Таблица 4.3 Порты MSX-VIDEO

     Порт #0 (чтение) - n
     Порт #0 (запись) - n'
     Порт #1 (чтение) - n + 1
     Порт #1 (запись) - n'+ 1
     Порт #2 (запись) - n'+ 2
     Порт #3 (запись) - n'+ 3

Примечание: значение n  следует читать из ячейки 6 MAIN-ROM
            значение n' следует читать из ячейки 7 MAIN-ROM
MSX2 TECHNICAL HANDBOOK

                     2. ДОСТУП К MSX-VIDEO

     Видеопроцессором можно управлять, минуя BIOS. В главе 2 опи-
сано, как это делается.


2.1 Доступ к регистрам


2.1.1 Запись данных в управляющие регистры

     Управляющие регистры предназначены только для  записи.  Хотя
выше и было упомянуто, что значения некоторых из них  (с  R#0  по
R#23) можно получить, вызвав в BASICе функцию VDP(n), это не сов-
сем так: в действительности, VDP(n) просто читает значения, кото-
рые были сохранены в системной области RAM одновременно с их  за-
сылкой в VDP (ячейки F3DFH...F3E6H и FFE7H...FFF6H).

     Существует три способа записи данных в управляющие регистры.
Поскольку MSX постоянно обращается к MSX-VIDEO  внутри  процедуры
обработки прерываний (на случай обнаружения конфликта  спрайтов),
правильно спроектированная процедура доступа к регистрам не  дол-
жна запрещать прерывания.


(1) Прямой доступ

     Первый вариант - напрямую указать и данные, и регистр. Рису-
нок 4.2 иллюстрирует эту процедуру. Сначала в  порт  #1  засылают
байт данных, после чего в шести младших битах этого же порта ука-
зывают номер регистра-приемника. Самый старший бит устанавливает-
ся в 1, а второй - в 0. Таким образом, в двоичной нотации  значе-
ние будет представлено байтом 10xxxxxx, где xxxxxx - номер регис-
тра-приемника.

     Рисунок 4.2 Прямой доступ к регистру R#n

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│	      Данные		│ Порт #1
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 1 │ 0 │ R5│ R4│ R3│ R2│ R1│ R0│ Порт #1
	└───┴───┴───┴───┴───┴───┴───┴───┘
	└───┬───┘└──────────┬───────────┘
	фиксировано   номер регистра

     Порт #1 - 1. Устанавливает данные
     Порт #1 - 2. Затем устанавливает номер регистра со  старшими
битами "10".

     Поскольку порт #1, кроме этого, используется и для установки
адреса VRAM (как описано в разделе 2.2), старший бит второго бай-
та играет роль флажка "адрес/регистр" и указывает операцию, кото-
рая в данный момент имеет место.


(2) Косвенный доступ (без увеличения номера регистра)

     Второй путь заключается в том, чтобы посылать данные  в  ре-
гистр, заданный косвенно (в регистре R#17). Начните с  того,  что
запишите номер регистра, к которому собираетесь производить  дос-
туп, в регистр R#17, как было описано выше. Выполнив  это,  можно
писать данные в требуемый регистр, посылая их в  порт  #3.  Такой
метод полезен, когда необходима непрерывная запись данных в  один
и тот же регистр. Примером может служить работа с командами VDP.

     Рисунок 4.3 Косвенный доступ к R#n

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 1 │ 0 │ R5│ R4│ R3│ R2│ R1│ R0│ R#17
	└───┴───┴───┴───┴───┴───┴───┴───┘
	└───┬───┘└──────────┬───────────┘
	фиксировано   номер регистра
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│	      Данные		│ Порт #3
	└───┴───┴───┴───┴───┴───┴───┴───┘
следующий байт:
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│	      Данные		│ Порт #3
	└───┴───┴───┴───┴───┴───┴───┴───┘

     R#17 1. Установить номер регистра n в регистре R#17
     Порт #3. Посылать данные. Они будут сохранены в R#n
     Порт #3. Посылать данные. Они будут сохранены в R#n


(3) Косвенный доступ (с автоматическим увеличением номера)

     Третий способ также основан на записи данных посредством ре-
гистра R#17, но при этом номер регистра-приемника в R#17  автома-
тически увеличивается на 1 после засылки очередного байта в  порт
#3. Запишите в регистр R#17 начальный номер серии  регистров-при-
емников, но сташие биты при этом должны быть равны нулю. В двоич-
ной нотации значение выглядит так: 00xxxxxx, где xxxxxx  -  номер
регистра.

     Этот подход наиболее эффективен, если требуется  одновремен-
ная корректировка целой серии соседних регистров. Примером  может
служить смена экранного режима.

     Рисунок 4.4 Косвенный доступ к R#n

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │ 0 │ R5│ R4│ R3│ R2│ R1│ R0│ R#17
	└───┴───┴───┴───┴───┴───┴───┴───┘
	└───┬───┘└──────────┬───────────┘
	фиксировано   номер регистра
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│	      Данные		│ Порт #3
	└───┴───┴───┴───┴───┴───┴───┴───┘
следующий байт:
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│	      Данные		│ Порт #3
	└───┴───┴───┴───┴───┴───┴───┴───┘

     R#17 1. Установить номер регистра n в регистре R#17
     Порт #3. Посылать данные. Они будут сохранены в R#n
     Порт #3. Посылать данные. Они будут сохранены в R#n



2.1.2 Настройка палитры

     Чтобы настроить регистры палитры (P#0...P#15), укажите номер
желаемого регистра в четырех младших битах регистра R#16  (указа-
тель палитры), а затем посылайте данные в порт #2. Поскольку  ре-
гистры палитры имеют 9-битовую длину,  данные  придется  засылать
дважды: сначала яркость красного и синего, потом - яркость  зеле-
ного. Яркость задается в трех младших  битах  каждого  полубайта.
Для уяснения деталей обратитесь к рисунку 4.5.

     После двукратной засылки данных в порт #2 регистр R#16 авто-
матически увеличивается на 1. Это облегчает настройку всей палит-
ры.

   Рисунок 4.5 Установка регистра цветовой палитры

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │ 0 │ 0 │ 0 │ R3│ R2│ R1│ R0│ R#16
	└───┴───┴───┴───┴───┴───┴───┴───┘
	└───────┬───────┘└──────┬──────┘
	   фиксировано    номер палитры
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│   │  красный	│   │   синий	│ Порт #2
	└───┴───┴───┴───┴───┴───┴───┴───┘
            └─── 0-7 ───┘   └─── 0-7 ───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│		    │  зеленый	│ Порт #2
	└───┴───┴───┴───┴───┴───┴───┴───┘
			    └─── 0-7 ───┘			

     R#16 1. Установить номер в R#16, старшие биты 0000
     Порт #2. Яркость красного + Яркость синего
                                 Яркость зеленого


2.1.3 Чтение регистров статуса

     Регистры статуса предназначены только для чтения. Их  содер-
жимое можно получить из порта #1 после установки номера  регистра
статуса в четырех младших битах регистра R#15. Четыре старших би-
та должны быть равны нулю. В двоичной нотации номер выглядит  так
0000xxxx. Перед обращением к регистру статуса  следует  запретить
прерывания, по окончании чтения регистр R#15 нужно установить в 0
и возобновить прерывания.

     Рисунок 4.6 Доступ к регистрам статуса

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │ 0 │ 0 │ 0 │ R3│ R2│ R1│ R0│ R#15
	└───┴───┴───┴───┴───┴───┴───┴───┘
	└───────┬───────┘└──────┬───────┘
	   фиксировано    номер регистра
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│	      Данные		│ Порт #1
	└───┴───┴───┴───┴───┴───┴───┴───┘

     R#15 1. Установить номер в R#16, старшие биты 0000
     Порт #1 2. Читать данные из порта #1.


2.2 Доступ CPU к VRAM

     Если нужно осуществить доступ CPU к какому-либо адресу VRAM,
придерживайтесь указаний, предлагаемых ниже.

     (1) Переключение банков VRAM

     С точки зрения MSX-VIDEO, первые 64К  VRAM  (0000...FFFF)  и
64К расширенной RAM размещаются в одном и том же  адресном  прос-
транстве. Чтобы пресечь одновременное их подключение, использует-
ся выбор банков при помощи бита 6 регистра R#45. Поскольку в MSX2
расширенная RAM отсутствует, всегда включен банк VRAM.

     Рисунок 4.7 Переключение банка VRAM/ERAM

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ x │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ R#4
	└───┴─│─┴───┴───┴───┴───┴───┴───┘
	      ├─ 0: VRAM
	      └─ 1: ERAM


     (2) Выбор страницы VRAM (три старших бита адреса)

     17 - разрядный адрес, позволяющий обращаться к любой  ячейке
128-килобайтной VRAM, устанавливают в счетчике адреса (A16...A0).
Регистр R#14 содержит три старших бита счетчика (A16...A14),  по-
этому его можно трактовать как переключатель 16К страниц VRAM.

     Рисунок 4.8 Установка страницы VRAM (3 старших бита)

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │ 0 │ 0 │ 0 │ 0 │A16│A15│A14│ R#14
	└───┴───┴───┴───┴───┴───┴───┴───┘


     (3) Установка адреса VRAM (в пределах страницы)

     14 младших битов адреса следует переслать в порт #1  в  виде
последовательности из двух байтов. На рисунке  4.9  все  подробно
изображено. Проследите, чтобы старший бит второго байта был равен
0, это настраивает VDP на прием адреса. Второй значащий бит игра-
ет роль флажка чтения/записи. "1" означает запись во VRAM, "0"  -
чтение.

     Рисунок 4.9 Установка 14 младших битов адреса

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ A7│ A6│ A5│ A4│ A3│ A2│ A1│ A0│ Порт #1
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │ x │A13│A12│A11│A10│ A9│ A8│ Порт #1
	└───┴─│─┴───┴───┴───┴───┴───┴───┘
	      ├─ 0: чтение VRAM
	      └─ 1: запись VRAM



     (4) Чтение / запись VRAM

     После установки счетчика адреса можно читать или писать дан-
ные через порт #0. Выше упомянуто, что флаг, отличающий запись от
чтения, посылается в VDP одновременно с битами A13...A8 адреса.

     После записи/чтения байта через порт #0 счетчик адреса авто-
матически увеличивается на 1. Эта возможность незаменима при дос-
тупе к протяженным областям VRAM.

     Рисунок 4.10 Доступ к VRAM через порт #0

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ D7│ D6│ D5│ D4│ D3│ D2│ D1│ D0│ Порт #0
	└───┴───┴───┴───┴───┴───┴───┴───┘
MSX2 TECHNICAL HANDBOOK, CHAPTER 4


3. ЭКРАННЫЕ РЕЖИМЫ MSX2

     MSX2 располагает десятью различными экранными режимами  (см.
таблицу 4.4), причем шесть из них, помеченные значком "∙"  (ТЕКСТ
2 и ГРАФИКА 3...7) были включены в MSX2 впервые. Остальные режимы
были усовершенствованы благодаря отказу от TMS9918A и переходу  к
MSX-VIDEO.

     Таблица 4.4 Список экранных режимов MSX2
┌──────────────┬──────────┬─────────────────────────────┐
│  название    │   режим  │	      Описание		│
├──────────────┼──────────┼─────────────────────────────┤
│ ТЕКСТ 1      │ SCREEN 0 │ 40 символов в строке текста	│
│	       │ WIDTH 40 │ один цвет для всех символов	│
├──────────────┼──────────┼─────────────────────────────┤
│ ТЕКСТ 2∙     │ SCREEN 0 │ 80 символов в строке текста	│
│	       │ WIDTH 80 │ выбор мерцания символов	│
├──────────────┼──────────┼─────────────────────────────┤
│ МНОГОЦВЕТНЫЙ │ SCREEN 3 │ псевдографика, один знак	│
│	       │	  │ делится на 4 блока		│
├──────────────┼──────────┼─────────────────────────────┤
│ ГРАФИКА 1    │ SCREEN 1 │ 32 символа в строке текста	│
│	       │	  │ возможны цветные символы	│
├──────────────┼──────────┼─────────────────────────────┤
│ ГРАФИКА 2    │ SCREEN 2 │ 256 x 192 единый цвет для	│
│	       │	  │ каждых 8 соседних точек	│
├──────────────┼──────────┼─────────────────────────────┤
│ ГРАФИКА 3∙   │ SCREEN 4 │ ГРАФИКА 2 с возможностью	│
│	       │	  │ многоцветных спрайтов	│
├──────────────┼──────────┼─────────────────────────────┤
│ ГРАФИКА 4∙   │ SCREEN 5 │ 256 x 212, 16 цветов	│
│	       │	  │ независимо для каждой точки │
├──────────────┼──────────┼─────────────────────────────┤
│ ГРАФИКА 5∙   │ SCREEN 6 │ 512 x 212, 4 цвета		│
│	       │	  │ независимо для каждой точки │
├──────────────┼──────────┼─────────────────────────────┤
│ ГРАФИКА 6∙   │ SCREEN 7 │ 512 x 212, 16 цветов	│
│	       │	  │ независимо для каждой точки │
├──────────────┼──────────┼─────────────────────────────┤
│ ГРАФИКА 7∙   │ SCREEN 8 │ 256 x 212, 256 цветов	│
└──────────────┴──────────┴─────────────────────────────┘

3.1 Режим ТЕКСТ 1

     В режиме ТЕКСТ 1 есть следующие возможности:
Экран:
     40 (гориз.) x 24 (верт.) символов
     цвет для фона/текста можно выбрать из 512 цветов
Символы:
     набор из 256 знаков
     размер знакоместа: 6 (гориз.) x 8 (верт.)
     возможна смена очертаний любого символа
Ресурсы памяти:
     для шрифта 2048 байт (8 байт x 256 знаков)
     для дисплея 960 байт (40 колонок x 24 строки)
BASIC:
     совпадает со SCREEN 0: WIDTH 40


3.1.1 Настройка режима

     Экранные режимы MSX-VIDEO настраиваются посредством пяти би-
тов в R#0 и R#1. На рисунке 4.11  показаны  необходимые  значения
регистров.

     Рисунок 4.11 Настройка режима TEXT 1

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ ∙ │ 0 │ 0 │ 0 │ ∙ │ R#0
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ 1 │ 0 │ ∙ │ ∙ │ ∙ │ R#1
	└───┴───┴───┴───┴───┴───┴───┴───┘


3.1.2 Структура экрана

∙ Таблица знакогенератора

     Таблицей знакогенератора называется область, в которой  хра-
нятся очертания текущего шрифта. Она располагается во  VRAM.  Два
младших бита каждой строки знакоместа на экране не  отображаются,
поэтому символ имеет размеры 6 x 8 точек. Каждый символьный набор
включает в себя 256 знаков, пронумерованных от 0 до 255. Эти коды
можно использовать для высвечивания символа в заданном месте  эк-
рана.

     Положение таблицы знакогенератора  указывается  в  R#4.  При
этом следует помнить, что указываются только 6 старших битов  ад-
реса (A16...A11), остальные биты всегда равны 0.  Таким  образом,
закогенератор способен располагаться лишь по адресам, кратным 2К,
начиная с 00000H. Этот адрес можно найти в  системной  переменной
BASE(2) BASICа. На рисунке 4.12 показана структура знакогенерато-
ра.

          Рисунок 4.12 Структура знакогенератора

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │ 0 │A16│A15│A14│A13│A12│A11│ R#4 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     │     76543210
     └─▶ 0 ··◘····· ┐
	 1 ·◘·◘···· │
	 2 ◘···◘··· │
	 3 ◘···◘··· │ шаблон #0
	 4 ◘◘◘◘◘··· │
	 5 ◘···◘··· │ ◘ = 1, · = 0
	 6 ◘···◘··· │
	 7 ········ ┘
	 8 ◘◘◘◘···· ┐
	 9 ·◘··◘··· │
	10 ·◘··◘··· │
	11 ·◘◘◘···· │ шаблон #1
	12 ·◘··◘··· │
	13 ·◘··◘··· │
	14 ◘◘◘◘···· │
	15 ········ ┘



∙ Таблица "имен" (ссылок на знакогенератор)

     Таблица имен хранит символы для каждой позиции  экрана.  Под
каждый символ занят один байт. На рисунке 4.13 показано  соответ-
ствие между ячейками памяти и знакоместами на экране.
     Адрес таблицы имен указывается в R#2. При этом следует  пом-
нить, что указываются только 7 старших битов адреса  (A16...A10),
остальные биты всегда равны 0. Таким образом, закогенератор  спо-
собен располагаться  лишь  по  адресам,  кратным  1К,  начиная  с
00000H. Этот адрес можно найти в системной переменной BASE(0) BA-
SICа.

          Рисунок 4.13 Структура таблицы имен

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │A16│A15│A14│A13│A12│A11│A10│ R#2 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     └─▶├───────┤	┌────────────────---────┐
	│ (0,0) │	│ 000 001 002 003   039 │
	├───────┤	│ 040 041 042 043   079 │
	│ (1,0) │	:			:
	├───────┤	│ 880 881	    919 │
	│ (2,0) │	│ 920 921	    959 │
	├───────┤	└────────-----------────┘
	:	:	Соотношение со знакоместами
	├───────┤
	│ (39,0)│
	├───────┤
	│ (0,1) │
	├───────┤
	:	:
	├───────┤
	│(39,23)│
	├───────┤

∙ Указание цвета экрана

     Цвет экрана указывается через регистр R#7. Младший  полубайт
относится к цвету фона, старший - к цвету  переднего  плана  (см.
рисунок 4.14). Это значит, что "нули" в описании  знакогенератора
высвечиваются в фоновом цвете, а "единицы" -  в  цвете  переднего
плана. Имейте также в виду, что цвет рамки экрана в  ТЕКСТ  1  не
может устанавливаться независимо  и  всегда  совпадает  с  цветом
фона.

     Рисунок 4.14 Указание цвета в TEXT 1

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│		│		│ R#7
	└───┴───┴───┴───┴───┴───┴───┴───┘
	└ цвет "единиц" ┘└ цвет "нулей" ┘




3.2 Режим ТЕКСТ 2

     В режиме ТЕКСТ 2 есть следующие возможности:
Экран:
     80 (гориз.) x 24 или 26.5 (верт.) символов
     цвет для фона/текста можно выбрать из 512 цветов
Символы:
     набор из 256 знаков
     размер знакоместа: 6 (гориз.) x 8 (верт.)
     возможна смена очертаний любого символа
     возможно мерцание любого символа
Ресурсы памяти:
24 строки:
     для шрифта 2048 байт (8 байт x 256 знаков)
     для дисплея 1920 байт (80 колонок x 24 строки)
     для атрибутов мерцания 240 байт (= 1920 бит)
26.5 строки:
     для шрифта 2048 байт (8 байт x 256 знаков)
     для дисплея 2160 байт (80 колонок x 27 строк)
     для атрибутов мерцания 270 байт (= 2160 бит)
BASIC:
     совпадает со SCREEN 0: WIDTH 80


3.2.1 Настройка режима

     Установка режима показана на рисунке 4.15.

     Рисунок 4.15 Настройка режима TEXT 2

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ ∙ │ 0 │ 1 │ 0 │ ∙ │ R#0
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ 1 │ 0 │ ∙ │ ∙ │ ∙ │ R#1
	└───┴───┴───┴───┴───┴───┴───┴───┘

∙ Выбор количества строк (24 строки / 26.5 строки)

     Высота экрана ТЕКСТ 2 может изменяться в зависимости от сос-
тояния бита 7 регистра R#9. Обратите внимание: если  экран  уста-
новлен в состояние 26.5 строки, в самой нижней строке видна толь-
ко верхняя половина каждого символа. Кстати, такой режим  BASICом
не поддерживается.

     Рисунок 4.16 Переключение количества строк

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ LN│ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ R#9
	└─│─┴───┴───┴───┴───┴───┴───┴───┘
	  ├─ 0: 24 строки
	  └─ 1: 26.5 строк


3.2.2 Структура экрана

∙ Таблица знакогенератора

     Знакогенератор имеет точно такую же структуру, что и в режи-
ме ТЕКСТ 1. См. описание выше.

∙ Таблица ссылок на знакогенератор

     Поскольку формат экрана был увеличен до 2160 символов,  таб-
лица "имен" теперь занимает тоже 2160 байт.

     Расположение таблицы имен задается в  R#2,  при  этом  можно
указать только 5 старших битов адреса (А16...А12);  остальные  12
битов (А9...А0) всегда равны 0. Таким образом, таблица имен  спо-
собна размещаться, начиная с 00000h, через каждые 4 К.

          Рисунок 4.17 Структура таблицы имен

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │A16│A15│A14│A13│A12│ 1 │ 1 │ R#2 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     └─▶├───────┤	┌────────────────────---─────┐
	│ (0,0) │	│ 0000 0001 0002 0003   0079 │
	├───────┤	│ 0080 0081 0082 0083   0159 │
	│ (1,0) │	:			     :
	├───────┤	│ 2000 2001	    	2079 │
	│ (2,0) │	│ 2080 2081	    	2159 │
	├───────┤	└──────────-------------─────┘
	:	:	Соотношение со знакоместами
	├───────┤
	│ (39,0)│
	├───────┤
	│ (0,1) │
	├───────┤
	:	:
	├───────┤
	│(79,26)│
	├───────┤


∙ Таблица мерцания

     В режиме ТЕКСТ 2 можно устанавливать  атрибут  мерцания  для
любого символа, расположенного на экране. Для этого предусмотрена
таблица, каждый бит которой соответствует одному экранному знако-
месту (или, что то же самое, одному байту таблицы  "имен").  Бит,
установленный в "1", разрешает мерцание, в "0" - запрещает.

     Рисунок 4.18 Структура таблицы мерцаний режима ТЕКСТ 2

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│A13│A12│A11│A10│ A9│ 1 │ 1 │ 1 │ R#3 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
	┌───┬───┬───┬───┬───┬───┬───┬───┐      │
	│ 0 │ 0 │ 0 │ 0 │ 0 │A16│A15│A14│ R#10 ┤
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     └─▶┌───┬───┬───┬───┬───┬───┬───┬───┐
	│0,0│1,0│2,0│3,0│4,0│5,0│6,0│7,0│ +0
	├───┼───┼───┼───┼───┼───┼───┼───┤
	│8,0│9,0│...                    │ +1
	├───┼───┼───┼───┼───┼───┼───┼───┤

     Положение таблицы мерцаний указывается  в  регистрах  R#3  и
R#10, куда пересылаются только 8 старших битов адреса.  Остальные
8 битов всегда равны 0. Следовательно, адрес таблицы всегда  кра-
тен 512.


3.2.3 Указание цвета экрана и характера мерцания

     Цвет текста задают в старшем полубайте  регистра  R#7,  цвет
фона - в младшем полубайте того  же  регистра.  Символы,  которые
должны мерцать, поочередно получают свой цвет из регистра  R#7  и
регистра R#12.

     Рисунок 4.19 Установка цвета экрана и мерцания

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│		│		│ R#7
	└───┴───┴───┴───┴───┴───┴───┴───┘
	└ цвет "единиц" ┘└ цвет "нулей" ┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│		│		│ R#12
	└───┴───┴───┴───┴───┴───┴───┴───┘
	└ цвет "единиц" ┘└ цвет "нулей" ┘
	  при мерцании	   при мерцании

     Период мерцания устанавливают в регистре R#13, старший полу-
байт которого задает время свечения основного  цвета,  а  младший
полубайт определяет время альтернативного  цвета.  Оба  интервала
задаются в единицах, примерно равных 1/6 секунды.

     Рисунок 4.20 Установка диапазона мерцания

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│      T 1	│      T 0	│ R#13
	└───┴───┴───┴───┴───┴───┴───┴───┘
	└ время свечения┘└время свечения┘
	  цветом из R#12   цветом из R#7

	┌───────┐	┌─────── --- цвет из R#7
	│ T0/6с │ T1/6с	│
────────┘	└───────┘ ---------- цвет из R#12
	исходный мерцание


     Листинг 4.1 Пример мерцания

1000 ' ==========================================
1010 ' пример мерцания
1020 ' ==========================================
1030 '
1040 SCREEN 0:WIDTH 80	' режим ТЕКСТ 2
1050 ADR=BASE(1)	' адрес таблицы цветов
1060 '
1070 FOR I=0 TO 2048/8
1080  VPOKE ADR+I,0	' почистить таблицу мерцания
1090 NEXT I
1100 '
1110 VDP(7)=&HF1	' текст белый, фон черный
1120 VDP(13)=&H1F	' текст черный, фон белый
1130 VDP(14)=&H22	' установить интервал
1140 '
1150 PRINT "Введи любой символ : ";
1160 '
1170 K$=INPUT$(1)
1180 IF K$<CHR$(28) THEN 1230
1190 IF K$>" " THEN 1280
1200 PRINT K$;
1210 GOTO 1170
1220 '
1230 VDP(14)=0		' выключить мерцание
1240 END
1250 '
1260 ' ---- установка режима мерцания ----
1270 '
1280 X=POS(0):Y=CRSLIN
1290 A=(Y*80+X)\8
1300 B=X MOD 8
1310 M=VAL("&B"+MID$("000000010000000",8-B,8))
1320 VPOKE ADR+A,VPEEK(ADR+A) XOR M
1330 RETURN



3.3 МНОГОЦВЕТНЫЙ режим

     МНОГОЦВЕТНЫЙ режим описан ниже:

Экран:
     64 (гориз.) x 48 (верт.) блоков
     одновременно на экране могут находиться 16 цветов из
     512 возможных
Блоки:
     размер блока: 4 (гориз.) x 4 (верт.) точки
     возможно указание цвета для любого блока
Ресурсы памяти:
     для установки цветов 2048 байт
     для указания положения 768 байт
Спрайты:
     режим 1
BASIC:
     совпадает со SCREEN 3


3.3.1 Настройка режима МНОГОЦВЕТНЫЙ

     Установка режима показана на рисунке 4.21.


     Рисунок 4.21 Настройка режима МНОГОЦВЕТНЫЙ

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ ∙ │ 0 │ 0 │ 0 │ ∙ │ R#0
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ 0 │ 1 │ ∙ │ ∙ │ ∙ │ R#1
	└───┴───┴───┴───┴───┴───┴───┴───┘


3.3.2 Структура экрана

∙ Таблица шаблонов

     В этом режиме шаблон состоит из четырех блоков (2 x 2),  по-
этому одно "имя" распространяется одновременно на 4 блока.  Цвета
блока описываются двумя байтами таблицы. Появление на экране того
или иного блока зависит от того, в какую именно строку  выводится
данный шаблон. Начальный адрес  таблицы  шаблонов  указывается  в
R#4. Поскольку можно задать только 6 старших  битов  (А16...А11),
таблица может размещаться с интервалом 2 К (см. рисунок 4.22).

          Рисунок 4.22 Структура таблицы шаблонов

			  7   6   5   4   3   2   1   0
	┌───┬───┐------▶┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ A │ B │	│  цвет точки A │  цвет точки B │
	├───┼───┤------▶├───┼───┼───┼───┼───┼───┼───┼───┤
	│ C │ D │	│  цвет точки C │  цвет точки D │
	└───┴───┘------▶└───┴───┴───┴───┴───┴───┴───┴───┘

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │ 0 │A16│A15│A14│A13│A12│A11│ R#4 ┐
	└───┴───┴───┴───┴───┴───┴───┴───┘     │
┌─────────────────────────────────────────────┘
└▶├───────────┤ ┐	┌─────┐     ФОРМАТ ШАБЛОНА (8 БАЙТ)
  │ шаблон #1 │ ├-----▶ │ A B │\ 2 байта; эта часть выводится,
  ├───────────┤	┘	│ C D │/ если Y = 0, 4, 8, 12, 16 или 20
  │ шаблон #2 │		├─────┤ 
  ├───────────┤		│ E F │\ 2 байта; эта часть выводится,
  :	      :		│ G H │/ если Y = 1, 5, 9, 13, 17 или 21
  ├───────────┤		├─────┤
  │шаблон #255│		│ I J │\ 2 байта; эта часть выводится,
  ├───────────┤		│ K L │/ если Y = 2, 6, 10, 14, 18 или 22
			├─────┤
			│ M N │\ 2 байта; эта часть выводится,
			│ O P │/ если Y = 3, 7, 11, 15, 19 или 23
			└─────┘


     Рисунок 4.24 Структура таблицы имен

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │A16│A15│A14│A13│A12│A11│A10│ R#2 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     └─▶├───────┤	┌────────────────---────┐
	│ (0,0) │	│ 000 001 002 003   031 │
	├───────┤	│ 032 033 034 035   063 │
	│ (1,0) │	:			:
	├───────┤	│ 704 705	    735 │
	│ (2,0) │	│ 736 737	    767 │
	├───────┤	└────────-----------────┘
	:	:	Соотношение со знакоместами
	├───────┤
	│ (39,0)│
	├───────┤
	│ (0,1) │
	├───────┤
	:	:
	├───────┤
	│(31,23)│
	├───────┤

3.3.3 Указание цвета экрана

     Цвет фона может быть задан в регистре R#7 (рис.4.25)

     Рисунок 4.25 Указание цвета в МНОГОЦВЕТНОМ режиме

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│		│		│ R#7
	└───┴───┴───┴───┴───┴───┴───┴───┘
			└─ цвет экрана ─┘


3.4 Режим ГРАФИКА 1

     Режим ГРАФИКА 1 описан ниже:

Экран:
     32 (гориз.) x 24 (верт.) шаблонов
     одновременно 16 цветов из 512 возможных
Образ:
     возможны 256 различных шаблонов
     размер шаблона: 8 (гориз.) x 8 (верт.) точек
     каждый шаблон может представлять любое изображение
     каждые 8 шаблонов имеют собственный цвет
Ресурсы памяти:
     для изображений 2048 байт
     для цветов 32 байта
Спрайты:
     режим 1
BASIC:
     совпадает со SCREEN 1


3.4.1 Настройка режима

     Установка режима показана на рисунке 4.26.

     Рисунок 4.26 Настройка режима ГРАФИКА 1

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ ∙ │ 0 │ 0 │ 0 │ ∙ │ R#0
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ 0 │ 0 │ ∙ │ ∙ │ ∙ │ R#1
	└───┴───┴───┴───┴───┴───┴───┴───┘

3.4.2 Структура экрана

∙ Таблица генератора шаблонов

     В этом режиме на экран можно вывести 256 различных шаблонов,
соответствующих номерам 0...255. Изображения для каждого  опреде-
ляются таблицей генератора (см. рисунок  4.27).  Начальный  адрес
таблицы указывается регистром R#4, причем задаются только 6 стар-
ших битов адреса (А16...А11).

     Рисунок 4.27 Структура знакогенератора

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │ 0 │A16│A15│A14│A13│A12│A11│ R#4 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     │     76543210
     └─▶ 0 ··◘◘◘··· ┐
	 1 ·◘···◘·· │
	 2 ◘·····◘· │
	 3 ◘·····◘· │ шаблон #0
	 4 ◘◘◘◘◘◘◘· │
	 5 ◘·····◘· │ ◘ = 1, · = 0
	 6 ◘·····◘· │
	 7 ········ ┘
	 8 ◘◘◘◘◘◘·· ┐
	 9 ·◘····◘· │
	10 ·◘····◘· │
	11 ·◘◘◘◘◘·· │ шаблон #1
	12 ·◘····◘· │
	13 ·◘····◘· │
	14 ◘◘◘◘◘◘·· │
	15 ········ ┘

∙ Таблица цветов

     Распределение цветов для каждых восьмерки шаблонов  выполня-
ется при помощи таблицы цветов, которая задает  цвета  "нулей"  и
"единиц" каждого шаблона (см. рисунок 4.28). Начальный адрес таб-
лицы указывается в регистрах R#3 и R#10.  (Следует  помнить,  что
можно задать только 11 старших битов.)


∙ Таблица "имен" шаблонов

     Таблица "имен" имеет размер 768 байт и соответствует  знако-
местам экрана один к одному (рисунок 4.29). Начальный адрес  таб-
лицы указывается в регистре R#2, причем имеют значение  только  7
старших битов адреса (А16...А10).


     Рисунок 4.28 Структура таблицы цветов

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│A13│A12│A11│A10│ A9│ A8│ A7│ A6│ R#3 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
	┌───┬───┬───┬───┬───┬───┬───┬───┐      │
	│ 0 │ 0 │ 0 │ 0 │ 0 │A16│A15│A14│ R#10 ┤
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     └─▶┌───┬───┬───┬───┬───┬───┬───┬───┐
	│FC3│FC2│FC1│FC0│BC3│BC2│BC1│BC0│ шаблоны 0-7
	├───┼───┼───┼───┼───┼───┼───┼───┤
	│FC3│FC2│FC1│FC0│BC3│BC2│BC1│BC0│ шаблоны 8-15
	├───┼───┼───┼───┼───┼───┼───┼───┤
	▲		▲▲		▲
	└ цвет "единиц" ┘└ цвет "нулей" ┘


     Рисунок 4.29 Структура таблицы имен

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │A16│A15│A14│A13│A12│A11│A10│ R#2 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     └─▶├───────┤	┌────────────────---────┐
	│ (0,0) │	│ 000 001 002 003   031 │
	├───────┤	│ 032 033 034 035   063 │
	│ (1,0) │	:			:
	├───────┤	│ 704 705	    735 │
	│ (2,0) │	│ 736 737	    767 │
	├───────┤	└────────-----------────┘
	:	:	Соотношение со знакоместами
	├───────┤
	│ (39,0)│
	├───────┤
	│ (0,1) │
	├───────┤
	:	:
	├───────┤
	│(31,23)│
	├───────┤



3.4.3 Указание цвета экрана

     Фоновый цвет можно задать в регистре R#7 (рисунок 4.30)

	Рисунок 4.30 Указание цвета экрана

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│		│		│ R#7
	└───┴───┴───┴───┴───┴───┴───┴───┘
			└─ цвет экрана ─┘


3.5 Режимы ГРАФИКА 2, 3

     Режимы ГРАФИКА 2 и 3 описаны ниже:

Экран:
     32 (гориз.) x 24 (верт.) шаблонов
     одновременно 16 цветов из 512 возможных
Образ:
     возможны 768 различных шаблонов
     размер шаблона: 8 (гориз.) x 8 (верт.) точек
     каждый шаблон может представлять любое изображение
     каждые 8 горизонтальных точек шаблона могут иметь
     только 2 цвета
Ресурсы памяти:
     для изображений 6144 байт
     для цветов 6144 байт
Спрайты:
     режим 1 для ГРАФИКИ 2
     режим 2 для ГРАФИКИ 3
BASIC:
     ГРАФИКА 2 совпадает со SCREEN 2
     ГРАФИКА 3 совпадает со SCREEN 4

3.5.1 Настройка режимов

     Установка режимов показана на рисунке 4.31.

     Рисунок 4.31 Настройка режимов ГРАФИКА 2 и 3

ГРАФИКА 2:
	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ ∙ │ 0 │ 0 │ 1 │ ∙ │ R#0
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ 0 │ 0 │ ∙ │ ∙ │ ∙ │ R#1
	└───┴───┴───┴───┴───┴───┴───┴───┘
ГРАФИКА 3:
	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ ∙ │ 0 │ 1 │ 0 │ ∙ │ R#0
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ 0 │ 0 │ ∙ │ ∙ │ ∙ │ R#1
	└───┴───┴───┴───┴───┴───┴───┴───┘


3.5.2 Структура экрана


∙ Таблица генератора шаблонов (изображений)

     В этих режимах существуют три таблицы  шаблонов,  каждая  из
которых совместима с ГРАФИКОЙ 1, так что  одновременно  на  экран
можно вывести 768 различных образов. "Зоны влияния" таблиц не мо-
гут пересекаться, - это позволяет  имитировать  точечную  графику
256x192, манипулируя изображением шаблонов. Начальный адрес  таб-
лицы указывает регистр R#4, причем имеют смысл только  4  старших
бита адреса (A16...A13). Таким образом, адрес может располагаться
с интервалом 8 К.

     Рисунок 4.32 Структура знакогенератора

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │ 0 │A16│A15│A14│A13│ 1 │ 1 │ R#4 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     │
     └─▶┌──────────────┐ структура каждого блока
	│    Блок 1    │  аналогична структуре
	├──────────────┤ знакогенератора режима
	│    Блок 2    │	ГРАФИКА 1
	├──────────────┤
	│    Блок 3    │
	└──────────────┘


∙ Таблица цветов

     Размер таблицы цветов тот же, что у таблицы шаблонов.  Здесь
можно указать цвет для "нулей" и "единиц"  каждой  горизонтальной
строки шаблона (рисунок 4.33). Начальный адрес таблицы можно ука-
зать в регистрах R#3 и R#10; задаются 4 старших бита (А16...А13).

     Рисунок 4.33 Структура таблицы цветов

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│A13│ 1 │ 1 │ 1 │ 1 │ 1 │ 1 │ 1 │ R#3 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
	┌───┬───┬───┬───┬───┬───┬───┬───┐      │
	│ 0 │ 0 │ 0 │ 0 │ 0 │A16│A15│A14│ R#10 ┤
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     └─▶┌──────────────┐
	│    Блок 1    │ ─┐ все три блока имеют
	├──────────────┤  │ одинаковую структуру
	│    Блок 2    │  │
	├──────────────┤  │
	│    Блок 3    │  │
	└──────────────┘  │
     ┌────────────────────┘
     └─▶┌───┬───┬───┬───┬───┬───┬───┬───┐
	│FC3│FC2│FC1│FC0│BC3│BC2│BC1│BC0│ строка 0 шаблона 0
	├───┼───┼───┼───┼───┼───┼───┼───┤
	│FC3│FC2│FC1│FC0│BC3│BC2│BC1│BC0│ строка 1 шаблона 0
	├───┼───┼───┼───┼───┼───┼───┼───┤
	▲		▲▲		▲
	└ цвет "единиц" ┘└ цвет "нулей" ┘


∙ Таблица "имен" (ссылок на генератор шаблонов)

     Таблица имен разделена на три уровня -  верхний,  средний  и
нижний; каждый отображает 256 шаблонов из своей таблицы. Этот ме-
тод позволяет получить на экране  одновременно  768  шаблонов  из
разных наборов.

     Рисунок 4.34 Структура таблицы имен

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │A16│A15│A14│A13│A12│A11│A10│ R#2 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     └─▶┌──────────────┐
	│    Блок 1    │ ─┐ все три блока имеют
	├──────────────┤  │ одинаковую структуру
	│    Блок 2    │  │
	├──────────────┤  │
	│    Блок 3    │  │
	└──────────────┘  │
     ┌────────────────────┘
     └─▶├───────┤	┌──────────────────────┐
	│ (0,0) │	│(0,0)		(31,0) │
	├───────┤	│(0,7)		(31,7) │
	│ (1,0) │	├──────────────────────┤
	├───────┤	│(0,8)		(31,8) │
	│ (2,0) │	│(0,15)		(31,15)│
	├───────┤	├──────────────────────┤
	:	:	│(0,16)		(31,16)│
	├───────┤	│(0,23)		(31,23)│
	│ (39,0)│	└──────────────────────┘
	├───────┤	Соответствие знакоместам
	│ (0,1) │
	├───────┤
	:	:
	├───────┤
	│(31,23)│
	├───────┤

3.5.3 Указание цвета экрана

     Цвет фона можно указать в регистре R#7 (рисунок 4.35)

	Рисунок 4.35 Указание цвета экрана

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│		│		│ R#7
	└───┴───┴───┴───┴───┴───┴───┴───┘
			└─ цвет экрана ─┘
3.6 Режим ГРАФИКА 4

     Режим ГРАФИКА 4 описан ниже:

Экран:
     256 (гориз.) x 192 или 212 (верт.) точек
     одновременно 16 цветов из 512 возможных
Команды:
     допускаются скоростные команды VDP
Ресурсы памяти:
для 192 точек:
     бит-мэп - 24 К (6000h байт)
для 212 точек:
     бит-мэп - 26.5 К (6A00h байт)
Спрайты:
     режим 2
BASIC:
     совпадает со SCREEN 5


3.6.1 Настройка режима

     Установка режима показана на рисунке 4.36.

     Рисунок 4.36 Настройка режима ГРАФИКА 4

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ ∙ │ 0 │ 1 │ 1 │ ∙ │ R#0
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ 0 │ 0 │ ∙ │ ∙ │ ∙ │ R#1
	└───┴───┴───┴───┴───┴───┴───┴───┘



3.6.2 Структура экрана

∙ Таблица имен

     В режиме ГРАФИКА 4 один байт таблицы имен соответствует двум
точкам на экране. Информация о цвете каждой точки представлена  4
битами, что позволяет выбирать один из 16 цветов (рисунок  4.37).
Стартовый адрес таблицы указывается в регистре R#2, причем значе-
ние имеют только 2 старших бита (А16 и А15); остальные  15  битов
рассматриваются как 0, так что адрес может иметь одно из  четырех
значений: 00000h, 08000h, 10000h или 18000h.

          Рисунок 4.37 Структура таблицы имен

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │A16│A15│ 1 │ 1 │ 1 │ 1 │ 1 │ R#2 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     │	  7   6   5   4   3   2   1   0
     └─▶┌───┬───┬───┬───┬───┬───┬───┬───┐
	│     (0,0)	│     (1,0)	│ +0
	├───┼───┼───┼───┼───┼───┼───┼───┤
	│     (2,0)	│     (3,0)	│ +1
	├───┴───┴───┴───┴───┴───┴───┴───┤
	:				:
	├───┬───┬───┬───┬───┬───┬───┬───┤
	│   (254,0)	│   (255,0)	│ +127
	├───┼───┼───┼───┼───┼───┼───┼───┤
	│     (0,1)	│     (1,1)	│ +128
	├───┴───┴───┴───┴───┴───┴───┴───┤
	:				:
	├───┬───┬───┬───┬───┬───┬───┬───┤
	│   (252,211)	│   (253,211)	│ +27134
	├───┼───┼───┼───┼───┼───┼───┼───┤
	│   (253,211)	│   (254,211)	│ +27135
	├───┴───┴───┴───┴───┴───┴───┴───┤

     Доступ к точке с координатами (x, y)  можно  получить,  вос-
пользовавшись выражением 4.1. Программа 4.2 иллюстрирует примене-
ние выражения 4.1:

     ADR = X / 2 + Y * 128 + базовый адрес таблицы имен

     ПРИМЕЧАНИЕ: если X четно, цвет нужно располагать  в  старшем
полубайте, если X нечетно - в младшем.


Листинг 4.2 PSET для режима ГРАФИКА 4, написанный на BASICе
100 ' =================================================
110 ' Доступ к точкам в режиме ГРАФИКА 4
120 ' =================================================
130 '
140 SCREEN 5:BA=0
160 FOR I=0 TO 255
170  X=I:Y=I\2:COL=15:GOSUB 1000
200 NEXT I
210 END
220 '
1000 ' ==============================================
1010 ' PSET (X,Y),COL, BA - базовый адрес
1020 ' ==============================================
1040 '
1050 ADR = X\2+Y*128+BA
1060 IF X AND 1 THEN BIT=&HF0:C=COL ELSE BIT=&HF:C=COL*16
1070 VPOKE ADR,(VPEEK(ADR) AND BIT) OR C
1100 RETURN



3.6.3 Указание цвета экрана

     Цвет рамки экрана можно задать в регистре R#7 (рисунок 4.38)

     Рисунок 4.38 Указание цвета экрана

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│		│		│ R#7
	└───┴───┴───┴───┴───┴───┴───┴───┘
			└─ цвет экрана ─┘



3.7 Режим ГРАФИКА 5

     Режим ГРАФИКА 5 описан ниже:

Экран:
     512 (гориз.) x 192 или 212 (верт.) точек
     одновременно 4 цвета из 512 возможных
Команды:
     допускаются скоростные команды VDP
Ресурсы памяти:
для 192 точек:
     бит-мэп - 24 К (6000h байт)
для 212 точек:
     бит-мэп - 26.5 К (6A00h байт)
Спрайты:
     режим 2
BASIC:
     совпадает со SCREEN 6


3.7.1 Настройка режима

     Установка режима показана на рисунке 4.39.

	Рисунок 4.39 Настройка режима ГРАФИКА 5

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ ∙ │ 1 │ 0 │ 0 │ ∙ │ R#0
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ 0 │ 0 │ ∙ │ ∙ │ ∙ │ R#1
	└───┴───┴───┴───┴───┴───┴───┴───┘

3.7.2 Структура экрана

∙ Таблица имен

     В режиме ГРАФИКА 5 один байт таблицы имен соответствует  че-
тырем точкам на экране. Информация о цвете каждой точки представ-
лена 2 битами, что позволяет выбирать один из 4 цветов. Как  и  в
режиме ГРАФИКА 4, стартовый адрес таблицы указывается в  регистре
R#2, причем значение имеют только 2 старших бита (А16 и А15); ад-
рес может быть: 00000h, 08000h, 10000h или 18000h.

          Рисунок 4.40 Структура таблицы имен

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │A16│A15│ 1 │ 1 │ 1 │ 1 │ 1 │ R#2 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     │	  7   6   5   4   3   2   1   0
     └─▶┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ (0,0) │ (1,0) │ (2,0) │ (3,0) │ +0
	├───┼───┼───┼───┼───┼───┼───┼───┤
	│ (4,0) │ (5,0) │ (6,0) │ (7,0) │
	├───┴───┴───┴───┴───┴───┴───┴───┤
	:				:
	├───┬───┬───┬───┬───┬───┬───┬───┤
	│(508,0)│(509,0)│(510,0)│(511,0)│ +127
	├───┼───┼───┼───┼───┼───┼───┼───┤
	│ (0,1) │ (1,1) │ (2,1) │ (3,1) │ +128
	├───┴───┴───┴───┴───┴───┴───┴───┤
	:				:
	├───┬───┬───┬───┬───┬───┬───┬───┤
	│	│	│	│511,211│ +27135
	├───┼───┼───┼───┼───┼───┼───┼───┤

     Таким образом, доступ к точке с координатами  (x,  y)  можно
получить, воспользовавшись выражением 4.2. Программа 4.3 подтвер-
ждает выражение 4.2:

     ADR = X / 4 + Y * 128 + базовый адрес таблицы имен

     ПРИМЕЧАНИЕ: если (X MOD 4) равно 0, 1, 2 или 3, соответству-
ющие цветовые биты: 7 и 6, 5 и 4, 3 и 2, 1 и 0.


Листинг 4.3 PSET для режима ГРАФИКА 5, написанный на BASICе
100 ' =================================================
110 ' Доступ к точкам в режиме ГРАФИКА 5
120 ' =================================================
130 '
140 SCREEN 5
150 BA=0
160 FOR I=0 TO 511
170  X=I:Y=I\2
180  COL=15
190  GOSUB 1000
200 NEXT I
210 END
220 '
1000 ' ==============================================
1010 ' PSET (X,Y),COL, BA - базовый адрес
1020 ' ==============================================
1040 '
1050 ADR = X\4+Y*128+BA
1060 LP=X MOD 4
1070 IF LP=0 THEN BIT=&H3F:C=COL * &H40
1080 IF LP=1 THEN BIT=&HCF:C=COL * &H10
1090 IF LP=2 THEN BIT=&HF3:C=COL * &H4
1100 IF LP=3 THEN BIT=&HFC:C=COL
1110 D=VPEEK(ADR)
1120 D=(D AND BIT) OR C
1130 VPOKE ADR,D
1140 RETURN



3.7.3 Указание цвета экрана

     В режиме ГРАФИКА 5 выполняется аппаратное различение  цветов
для четных и нечетных вертикалей экрана и спрайтов. Как и все ос-
тальные, эти цвета пакуются в 4 бита: 2 старших бита представляют
окраску четных линий, 2 младших, - соответственно, нечетных  (ри-
сунок 4.41).

     Рисунок 4.41 Указание цвета экрана

  7   6   5   4   3   2   1   0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│	    │ x │		│ R#7
└───┴───┴───┴─│─┴───┴───┴───┴───┘
	      │	└───┬───┘└──────┴─ цвет   четных вертикалей
	      │	    └───────────── цвет нечетных вертикалей
	      └─────────────────┬─ 0: выключено
				└─ 1: раздельная установка

     Каждая точка спрайта распадается на левую и правую половины,
цвета которых также могут устанавливаться раздельно:

	┌─┬─┬─┬─┬─┬─┬─┬─┐ цвет строки спрайта
	└───────┴───────┘
	 правая    левая
	половина половина




3.8 Режим ГРАФИКА 6

     Режим ГРАФИКА 6 описан ниже:

Экран:
     512 (гориз.) x 192 или 212 (верт.) точек
     одновременно 16 цветов из 512 возможных
Команды:
     допускаются аппаратные команды VDP
Ресурсы памяти:
для 192 точек:
     бит-мэп - 48 К (C000h байт)
для 212 точек:
     бит-мэп - 53 К (D400h байт)
Спрайты:
     режим 2
BASIC:
     совпадает со SCREEN 7


3.8.1 Настройка режима

     Установка режима показана на рисунке 4.42.

	Рисунок 4.42 Настройка режима ГРАФИКА 6

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ ∙ │ 1 │ 0 │ 1 │ ∙ │ R#0
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ 0 │ 0 │ ∙ │ ∙ │ ∙ │ R#1
	└───┴───┴───┴───┴───┴───┴───┴───┘


3.8.2 Структура экрана

∙ Таблица имен

     В режиме ГРАФИКА 6 один байт таблицы имен соответствует двум
точкам на экране. Информация о цвете каждой точки представлена  4
битами, что позволяет выбирать один из 16 цветов. Как и в  режиме
ГРАФИКА 4, стартовый адрес таблицы указывается  в  регистре  R#2,
причем адрес может быть только 00000h или 10000h. Доступ к  точке
с координатами (x, y) можно получить, воспользовавшись выражением
4.3. Программа 4.4 иллюстрирует это:

     ADR = X / 2 + Y * 256 + базовый адрес таблицы имен

     ПРИМЕЧАНИЕ: если X четно, цвет нужно располагать  в  старшем
полубайте, если X нечетно - в младшем.

          Рисунок 4.43 Структура таблицы имен

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │ 0 │A16│ 1 │ 1 │ 1 │ 1 │ 1 │ R#2 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
Бит A16 используется для переключения страниц. │
Его положение отличается в режимах ГРАФИКА 6,7 │
     ┌─────────────────────────────────────────┘
     │	  7   6   5   4   3   2   1   0
     └─▶┌───┬───┬───┬───┬───┬───┬───┬───┐
	│     (0,0)	│     (1,0)	│ +0
	├───┼───┼───┼───┼───┼───┼───┼───┤
	│     (2,0)	│     (3,0)	│ +1
	├───┴───┴───┴───┴───┴───┴───┴───┤
	:				:
	├───┬───┬───┬───┬───┬───┬───┬───┤
	│   (510,0)	│   (511,0)	│ +255
	├───┼───┼───┼───┼───┼───┼───┼───┤
	│     (0,1)	│     (1,1)	│ +256
	├───┴───┴───┴───┴───┴───┴───┴───┤
	:				:
	├───┬───┬───┬───┬───┬───┬───┬───┤
	│   (508,211)	│   (509,211)	│ +54270
	├───┼───┼───┼───┼───┼───┼───┼───┤
	│   (510,211)	│   (511,211)	│ +54271
	├───┴───┴───┴───┴───┴───┴───┴───┤


Листинг 4.4 PSET для режима ГРАФИКА 6, написанный на BASICе
100 ' =================================================
110 ' Доступ к точкам в режиме ГРАФИКА 6
120 ' =================================================
130 '
140 SCREEN 5:BA=0
160 FOR I=0 TO 512
170  X=I:Y=I\2:COL=15:GOSUB 1000
200 NEXT I
210 END
220 '
1000 ' ==============================================
1010 ' PSET (X,Y),COL, BA - базовый адрес
1020 ' ==============================================
1040 '
1050 ADR = X\2+Y*256+BA
1060 IF X AND 1 THEN BIT=&HF0:C=COL ELSE BIT=&HF:C=COL*16
1070 VPOKE ADR,(VPEEK(ADR) AND BIT) OR C
1100 RETURN



3.8.3 Указание цвета экрана

     Цвет фона можно указать в регистре R#7 (рисунок 4.44)

     Рисунок 4.44 Указание цвета экрана

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│		│		│ R#7
	└───┴───┴───┴───┴───┴───┴───┴───┘
			└─ цвет экрана ─┘


3.9 Режим ГРАФИКА 7

     Режим ГРАФИКА 7 описан ниже:

Экран:
     256 (гориз.) x 192 или 212 (верт.) точек
     одновременно 256 цветов
Команды:
     допускаются аппаратные команды VDP
Ресурсы памяти:
для 192 точек:
     бит-мэп - 48 К (C000h байт)
для 212 точек:
     бит-мэп - 53 К (D400h байт)
Спрайты:
     режим 2
BASIC:
     совпадает со SCREEN 8


3.9.1 Настройка режима

     Установка режима показана на рисунке 4.45.

	Рисунок 4.45 Настройка режима ГРАФИКА 7

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ ∙ │ 1 │ 1 │ 1 │ ∙ │ R#0
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ 0 │ 0 │ ∙ │ ∙ │ ∙ │ R#1
	└───┴───┴───┴───┴───┴───┴───┴───┘


3.9.2 Структура экрана

∙ Таблица имен

     Конфигурация режима ГРАФИКА 7 - простейшая среди всех  режи-
мов; каждая точка экрана соответствует отдельному  байту  таблицы
имен, который может представлять любой из 256 независимых цветов.
Начальный адрес таблицы располагается в  регистре  R#2.  Возможны
всего два адреса: 00000h или 10000h.

     Каждый байт данных содержит 3 бита интенсивности для зелено-
го, 3 бита для красного и 2 бита для синего, как показано на  ри-
сунке 4.47. Доступ к точке (x, y) обеспечивается выражением 4.4.

     ADR = X + Y * 256 + базовый адрес таблицы имен


          Рисунок 4.46 Структура таблицы имен

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │ 0 │A16│ 1 │ 1 │ 1 │ 1 │ 1 │ R#2 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
Бит A16 используется для переключения страниц. │
Его положение отличается в режимах ГРАФИКА 6,7 │
     ┌─────────────────────────────────────────┘
     │	  7   6   5   4   3   2   1   0
     └─▶┌───┬───┬───┬───┬───┬───┬───┬───┐
	│	      (0,0)		│ +0
	├───┼───┼───┼───┼───┼───┼───┼───┤
	│	      (1,0)		│ +1
	├───┴───┴───┴───┴───┴───┴───┴───┤
	:				:
	├───┬───┬───┬───┬───┬───┬───┬───┤
	│	     (255,0)		│ +255
	├───┼───┼───┼───┼───┼───┼───┼───┤
	│	      (0,1)		│ +256
	├───┴───┴───┴───┴───┴───┴───┴───┤
	:				:
	├───┬───┬───┬───┬───┬───┬───┬───┤
	│	    (254,211)		│ +54270
	├───┼───┼───┼───┼───┼───┼───┼───┤
	│	    (255,211)		│ +54271
	├───┴───┴───┴───┴───┴───┴───┴───┤


        Рисунок 4.47 RGB цветояркостная информация

	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│  зеленый  │  красный	│ синий	│
	└───┴───┴───┴───┴───┴───┴───┴───┘


3.9.3 Указание цвета экрана

     Цвет фона можно указать в регистре R#7 (рисунок 4.48)

     Рисунок 4.48 Задание цвета экрана

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│		│		│ R#7
	└───┴───┴───┴───┴───┴───┴───┴───┘
			└─ цвет экрана ─┘
MSX2 TECHNICAL HANDBOOK, CHAPTER 4


4. ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ ДИСПЛЕЯ

     Существует ряд более тонких возможностей, чем описанные  ра-
нее: например, гашение дисплея и корректировка положения картинки
на экране. Эти и подобные им функции описаны ниже.


∙ Включение/гашение экрана

     Функция включения/гашения экрана управляется битом 6  регис-
тра R#1 (рисунок 4.49). Если выбрано гашение, пустой экран  окра-
шивается в цвет, заданный младшим полубайтом (байтом в ГРАФИКЕ 7)
регистра R#7. Кстати, гашение экрана значительно ускоряет  работу
команд VDP.

     Рисунок 4.49 Гашение экрана

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ x │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ R#1
	└───┴─│─┴───┴───┴───┴───┴───┴───┘
	      ├─ 0: экран погашен
	      └─ 1: экран включен



∙ Коррекция положения картинки на экране

     Регистр R#18 используется для уточнения расположения картин-
ки на экране монитора. В MSX BASICе этим занимается оператор  SET
ADJUST.

     Рисунок 4.50 Вертикальная и горизонтальная коррекция

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ V3│ V2│ V1│ V0│ H3│ H2│ H1│ H0│ R#18
	└───┴───┴───┴───┴───┴───┴───┴───┘
	└─ кооррекция ─┘└─ коррекция ──┘
	  по вертикали   по горизонтали
	   (-8...+7)	   (-8...+7)

		┌───────────────┐ V=7
		│		│  |
		│     экран	│  |
		│    дисплея	│  |
		│		│  |
		└───────────────┘ V=-8
		H=7 -------- H=-8


∙ Переключение дискретности в направлении Y

     Количество точек, отображаемых в направлении Y,  может  быть
переключено с 192 на 212 и обратно установкой бита 7 регистра R#9
в 0 или 1. Эта функция работает только в режимах ТЕКСТ 2 и ГРАФИ-
КА 4...7. При выборе 212 строк в режиме ТЕКСТ 2 в 27 строке изоб-
ражаются только верхние половины символов.

     Рисунок 4.51 Выбор количества строк

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ x │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ R#9
	└─│─┴───┴───┴───┴───┴───┴───┴───┘
	  ├─ 0: 192 точки (24 строки)
	  └─ 1: 212 точек (26.5 строк)


∙ Переключение страниц дисплея

     В режимах ГРАФИКА 4...7 можно легко выбирать желаемую  стра-
ницу дисплея путем смены стартового адреса таблицы имен  (регистр
R#2). В самом деле, второй параметр оператора SET PAGE  поступает
именно так.

	Рисунок 4.52 Переключение страниц дисплея

     ГРАФИКА 4 и 5 (страницы 0-3):

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │ x │ x │ 1 │ 1 │ 1 │ 1 │ 1 │ R#2
	└───┴───┴───┴───┴───┴───┴───┴───┘

     ГРАФИКА 6 и 7 (страницы 0-1):
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │ 0 │ x │ 1 │ 1 │ 1 │ 1 │ 1 │ R#2
	└───┴───┴───┴───┴───┴───┴───┴───┘



∙ Автоматическая смена страниц дисплея

     В режимах ГРАФИКА 4...7 существует возможность  периодически
менять отображаемую страницу: 0 или 1, 2 или 3.

     Начните с того, что выберите страницу с нечетным номером  (1
или 3), используя регистр R#2, и задайте период смены в  регистре
R#13. Старший полубайт R#13 представляет время демонстации четной
страницы, младший - нечетной. Время задается в единицах  1/6  се-
кунды. Установка обоих нулей вызовет демонстрацию только нечетной
страницы.

     Рисунок 4.20 Установка диапазона мерцания

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ четная (EVEN)	│ нечетная (ODD)│ R#13
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌─────────┐	  ┌─────── --- показ четной страницы
	│ EVEN/6с │ ODD/6с│
 ───────┘	  └───────┘ ---------- показ нечетной страницы



∙ Установка режима чересстрочной развертки

     Режим "чересстрочная развертка" (interlace) позволяет увели-
чить вертикальную дискретность вдвое, по сравнению с  нормальной:
можно получить разрешение 424 точки! Это достигается  при  помощи
быстрой смены двух картинок - обычной и смещенной по вертикали на
половину строки развертки. В MSX2 такой режим управляется битом 3
регистра R#9. Изображения сменяются с частотой 60 раз в секунду.

     Комбинируя этот режим с режимом смены страниц, можно добить-
ся кажущегося возрастания дискретности вдвое.

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ ∙ │ x │ x │ ∙ │ ∙ │ R#9
	└───┴───┴───┴───┴─│─┴─│─┴───┴───┘
			  │   ├─ 0: показ одной страницы
			  │   └─ 1: поочередный показ двух
			  ├───── 0: нормальный режим
			  └───── 1: чересстрочная развертка
     Листинг 4.5 Пример
1000 ;============================================
1010 ; Режим interlace
1020 ;=============================================
1030 '
1040 COLOR 15,0,0:SCREEN 5,,,,,0 ' выключено
1050 '
1060 SET PAGE 0,0:CLS
1070 LINE (32,0)-(64,120),15,BF
1080 SET PAGE 1,1:CLS
1090 LINE (192,91)-(224,211),15,BF
1100 '
1110 VDP(10)=VDP(10) OR &00001100 ' включить
1120 '
1130 FOR I=32 TO 192
1140  SET PAGE 1,0
1150  LINE (I,0)-STEP(0,120),0
1160  LINE (I+33,0)-STEP(0,120),15
1170  SET PAGE 1,1
1180  LINE (256-I,91)-STEP(0,120),0
1190  LINE (223-I,91)-STEP(0,120),15
1200 NEXT I
1210 '
1220 VDP(10)=VDP(10) AND &B11110011



∙ Вертикальный скролл экрана

     Регистр R#23 используется для указания  экранной  строки,  с
которой начинается вывод изображения. Меняя значение в  этом  ре-
гистре, можно добиться эффекта скроллирования. Помните, однако, о
том, что скролл выполняется по всем 256 вертикальным линиям,  по-
этому  таблицы  спрайтов  рекомендуется   перенести   на   другую
страницу. Листинг 4.6 демонстрирует пример.

     Листинг 4.6 Пример вертикального скроллинга
1000 '================================================
1010 ' Аппаратный Сколлинг
1020 '================================================
1030 '
1040 SCREEN 5,2:COLOR 15,0,0:CLS
1050 COPY (0,0)-(255,48) TO (0,212),,PSET
1060 '
1070 FOR I=1 TO 8:D(I)=VAL(MID$("00022220",1,1))-1:NEXT
1080 '
1090 OPEN "GRP:" AS #1
1100 FOR I=0 TO 3
1110  PRESET (64,I*64):PRINT #1,"Нажми клавишу курсора"
1120 NEXT I
1130 '
1140 J=STICK(0)
1150 P=(P+D(J)) AND &HFF
1160 VDP(24)=P
1170 GOTO 1140



∙ Установка функций нулевого цвета

     Среди всех 16 цветовых кодов только код 0 может быть превра-
щен в "прозрачный" цвет (это значит, что сквозь него будет  виден
цвет бордюра). Установив бит 5 регистра R#8 в "1", можно  превра-
тить код 0 в равноправный цвет, задаваемый палитрой P#0.

     Рисунок 4.55 Функции цвета 0

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ x │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ R#8
	└───┴───┴─│─┴───┴───┴───┴───┴───┘
		  ├─ 0: прозрачный разрешен
		  └─ 1: прозрачный запрещен


∙ Генерация прерываний по положению строки развертки

     MSX-VIDEO способен генерировать запрос прерывания сразу пос-
ле того, как CRT закончил  отображение  указанной  строки.  Номер
этой строки задается в регистре R#19, и в  регистре  R#4  следует
выставить бит 4 в "1" (см. рисунок 4.56).
     (Подтверждение запроса содержится в  старшем  бите  регистра
статуса S#0 - прим.перев.).

     Рисунок 4.56 Генерация прерывания при сканировании

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │IE1│ ∙ │ ∙ │ ∙ │ ∙ │ R#0
	└───┴───┴───┴─│─┴───┴───┴───┴───┘
		      ├─ 0: нормальное состояние
		      └─ 1: прерывания включены

Номер строки прерывания:

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│IL7│IL6│IL5│IL4│IL3│IL2│IL1│IL0│ R#19
	└───┴───┴───┴───┴───┴───┴───┴───┘
MSX2 TECHNICAL HANDBOOK


5. СПРАЙТЫ

     Спрайты предназначены для вывода на экран подвижных  изобра-
жений, имеющих размер 8x8 или 16x16 точек,  что  бывает  особенно
полезно при программировании игр.

     Для управления спрайтом достаточно иметь всего четыре  пара-
метра: две координаты, номер шаблона и его цвет, поскольку спрайт
появляется на экране сразу после записи этих данных в  специально
предусмотренную таблицу атрибутов.

     Спрайты MSX2 могут существовать в двух режимах. Режим 1 сов-
местим с TMS9918, который был использован на MSX. Режим 2  содер-
жит ряд нововведений. В этом разделе оба режима собраны и описаны
вместе.


5.1 Функция "спрайт"

     Одновременно на экране может находиться до 32 спрайтов.

     Спрайты имеют два размера, 8x8 и 16x16; их  нельзя  включить
одновременно. Размер точки спрайта обычно равен размеру точки фо-
на, хотя в режимах 5 и 6, где разрешение достигает 512x212, точки
спрайтов оказываются вдвое шире по горизонтали, чем фоновые.

     Режим спрайтов (1 или 2) зафиксирован за каждым из  экранных
режимов аппаратно.


5.2 Режим 1

     Режим спрайтов 1 располагает теми же  возможностями,  что  и
единственный режим MSX1, следовательно, соответствующие программы
могут свободно исполняться и на MSX1.

5.2.1 Количество изображаемых спрайтов

     Существует 32 спрайта, пронумерованных от 0 то 31. Спрайты с
меньшим номером имеют больший приоритет. Если спрайты  располага-
ются близко к одной горизонтальной линии, то высвечиваются только
4 из них, которые имеют наивысший приоритет.

  Рисунок 4.57 Количество изображаемых спрайтов (режим 1)
	┌───────────────────────────────┐
	│				│
	│				│
	│				│
	│				│
	│	┌──┐ ┌──┐	┌──┐	│
	│ ┌──┐	│#2│ │#3│ ┌──┐   #5 	│
	│ │#1│	└──┘ └──┘ │#4│	    #6	│
	│ └──┘		  └──┘	   └──┘	│
	│				│
	│				│
	│				│
	│				│
	└───────────────────────────────┘


5.2.2 Настройка дисплея

     Следующие описатели настраивают дисплей на режим 1.


∙ Установка размера спрайтов

     Можно выбрать 8x8 или 16x16 (см. рисунок 4.58). По умолчанию
принято 8x8.

     Рисунок 4.58 Установка размера спрайтов

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ R#1
	└───┴───┴───┴───┴───┴───┴─│─┴───┘
				  ├─ 0: размер 8x8
8 x 8		16x16		  └─ 1: размер 16x16
┌┬┬┬┬┬┬┬┐	┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
├┼┼┼┼┼┼┼┤	├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┤	├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┤	├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┤	├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┤	├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┤	├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┤	├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
└┴┴┴┴┴┴┴┘	├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
		├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
		├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
		├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
		├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
		├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
		├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
		├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
		└┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘


∙ Увеличение спрайтов

     На рисунке 4.59 показано, как выбрать, будет ли каждая точка
спрайта соответствовать по размерам точке фона или она увеличится
вдвое (по вертикали и горизонтали). По умолчанию принято "один  к
одному".

     Рисунок 4.59 Установка размера спрайтов

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ R#1
	└───┴───┴───┴───┴───┴───┴───┴─│─┘
				      ├─ 0: нормальный размер
нормальный	увеличенный	      └─ 1: увеличенный
┌┬┬┬┬┬┬┬┐	┌─┬─┬─┬─┬─┬─┬─┬─┐
├┼┼┼┼┼┼┼┤	│ │ │ │ │ │ │ │ │
├┼┼┼┼┼┼┼┤	├─┼─┼─┼─┼─┼─┼─┼─┤
├┼┼┼┼┼┼┼┤	│ │ │ │ │ │ │ │ │
├┼┼┼┼┼┼┼┤	├─┼─┼─┼─┼─┼─┼─┼─┤
├┼┼┼┼┼┼┼┤	│ │ │ │ │ │ │ │ │
├┼┼┼┼┼┼┼┤	├─┼─┼─┼─┼─┼─┼─┼─┤
├┼┼┼┼┼┼┼┤	│ │ │ │ │ │ │ │ │
└┴┴┴┴┴┴┴┘	├─┼─┼─┼─┼─┼─┼─┼─┤
		│ │ │ │ │ │ │ │ │
		├─┼─┼─┼─┼─┼─┼─┼─┤
		│ │ │ │ │ │ │ │ │
		├─┼─┼─┼─┼─┼─┼─┼─┤
		│ │ │ │ │ │ │ │ │
		├─┼─┼─┼─┼─┼─┼─┼─┤
		│ │ │ │ │ │ │ │ │
		└─┴─┴─┴─┴─┴─┴─┴─┘


∙ Настройка таблицы генератора шаблонов

     Изображения, представляемые спрайтами, определяются в табли-
це генератора шаблонов, которая расположена во VRAM. Можно задать
максимально 256 шаблонов для случая 8 x 8 и 64 шаблона для случая
16 x 16. Каждый шаблон номеруется и располагается в таблице,  как
показано на рисунке 4.60. Спрайт 16 x 16 складывается из четверки
спрайтов 8 х 8, поэтому указание номера любого  из  них  вызывает
вывод одного и того же спрайта. Регистр R#6 используется для  ус-
тановки адреса таблицы, как показано на рисунке 4.60.


     Рисунок 4.60 Структура генератора шаблонов (режим 1)

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ 0 │ 0 │A16│A15│A14│A13│A12│A11│ R#6 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     └─▶├───────┤ ┐
	├───────┤ │
	├───────┤ │
	├───────┤ │
	├───────┤ ├─ шаблон #0 (8 байт)
	├───────┤ │
	├───────┤ │
	├───────┤ │
	├───────┤ ┘
	│	│    шаблон #1 
	:	:



∙ Настройка таблицы атрибутов

     Каждый спрайт высвечивается на своем отдельном плане, и сос-
тояние каждого плана записано в отдельных  4-х  байтах.  Область,
содержащая эту информацию, называется таблицей атрибутов. Ее  на-
чальный адрес устанавливают в регистрах R#5 и R#11  как  показано
на рисунке 4.61

     Каждые четыре байта таблицы содержат следующее:

     Координата Y: Имейте в виду, что верхняя строка  экрана
                   имеет координату 255, а  не  0!  Значение
                   координаты 209  запрещает  вывод  данного
                   спрайта, а значение 208 - данного и  всех
                   последующих.
     Координата X:
     Номер шаблона: 
     Цвет спрайта: Указывает цвет "единиц" шаблона.
     EC:           Установка этого бита в "1" вызывает сдвиг
		   спрайта на 32 точки влево.  Использование
		   этой функции помогает постепенно выводить
		   спрайт из-за левой границы.

     Рисунок 4.61 Структура таблицы атрибутов спрайтов

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│A14│A13│A12│A11│A10│ 1 │ 1 │ 1 │ R#5 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
	┌───┬───┬───┬───┬───┬───┬───┬───┐      │
	│ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │A16│A15│ R#11 ┤
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     └─▶┌───┬───┬───┬───┬───┬───┬───┬───┐ ┐
	│     координата Y (0...255)	│ │
	├───┼───┼───┼───┼───┼───┼───┼───┤ │
	│     координата X (0...255)	│ │
	├───┼───┼───┼───┼───┼───┼───┼───┤ ├─ атрибуты
	│     номер шаблона (0...255)	│ │ спрайта #0
	├───┼───┼───┼───┼───┼───┼───┼───┤ │
	│ EC│ 0	│ 0 │ 0	│   код цвета	│ │
	├───┼───┼───┼───┼───┼───┼───┼───┤ ┘
	:				:

	┌───────────────┐	┌───────────────┐
	│	     ┌──┤     ┌─├┐		│
	│	     │	│     │	││		│
	│	     └──┤     └─├┘		│
	│	      ┌─┤┐     ┌├─┐		│
	│	      │	││     ││ │		│
	│	      └─┤┘     └├─┘		│
	├──┐	       ┌┤─┐	├──┐	     ┌──┤
	│  │	       ││ │	│  │	     │	│
	├▲─┘	       └┤─┘	├──┘	     └▲─┤
	└│──────────────┘	└─────────────│─┘
Спрайт выводится отсюда		Спрайт выводится досюда
	EC = "0"			EC = "1"



5.2.3 Разрешение конфликтов спрайтов

     Если два спрайта конфликтуют, об этом информирует бит 5  ре-
гистра S#0. Термин "конфликт" означает, что  произошло  наложение
непрозрачных частей изображений в одной и той же координате.

     Рисунок 4.62 Конфликт спрайтов (режим 1)

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ x │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ S#0
	└───┴───┴─│─┴───┴───┴───┴───┴───┘
		  ├─ 0: обычное состоние
		  └─ 1: обнаружен конфликт спрайтов


Эти два спрайта		Эти два спрайта конфликтуют
не конфликтуют		(перекрылись значащими частями)
┌────┐----┐		┌────┐----┐
│    │    |		│    │    |
│    │    |		│    │    |
│    │    |		│  ┌────┐----┐
│    │┌────┐----┐	│  │▧│  │ |  |
└────┘│   |│	|	└──│─┘  │ |  |
|     │   |│	|	|  │    │ |  |
|     │   |│	|	|  │    │ |  |
|     │   |│	|	|  └────┘ |  |
|     └────┘	|	|  |      |  |
└-----|---┘	|	└--|------┘  |
      |		|	   |	     |
      |		|	   |	     |
      |		|	   └---------┘
      └---------┘

     Если на одной линии расположено более 4 спрайтов, бит 6  ре-
гистра S#0 устанавливается в "1", а номер "лишнего" спрайта можно
прочитать в 5 младших битах того же регистра.

             Рисунок 4.63 Разрешение конфликта

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ x │ ∙ │   │   │   │   │   │ S#0
	└───┴─│─┴───┴───┴───┴───┴───┴───┘
	      │     └─ номер 5 спрайта ─┘
	      ├─ 0: обычное состояние
	      └─ 1: обнаружен конфликт спрайтов


5.3 Режим спрайтов 2

     Режим 2 является новшеством, он несовместим с TMS9918 и  от-
сутствует на машинах MSX1.


5.3.1 Количество изображаемых спрайтов

     Общее количество одновременно изображаемых спрайтов осталось
по-прежнему 32, однако теперь в заданной строке можно вывести  до
8 шаблонов. Распределение приоритетов - то же, что и в режиме  1:
меньший номер имеет больший приоритет.

  Рисунок 4.64 Количество изображаемых спрайтов (режим 2)
	┌───────────────────────────────┐
	│				│
	│				│
	│				│
	│			 #8	│
	│┌──┐  ┌──┐┌──┐┌──┐     ┌─▼┐    │
	││#0├──┤#2├┴┐4││#5├─┐┌──┐	│
	│└──┤#1├─┬┘3├─┘└─┬┘6││#7│   │#9││
	│   └──┘ └──┘    └──┘└──┘   └──┘│
	│				│
	│				│
	│				│
	│				│
	└───────────────────────────────┘


5.3.2 Настройка режима

∙ Размеры спрайтов - как и в режиме 1

∙ Увеличение - как и в режиме 1

∙ Запрет отображения спрайтов

     В режиме 2 можно запретить вывод спрайтов, изменив бит 1 ре-
гистра R#8. Если он равен "1", спрайты на экране не появляются.

     Рисунок 4.65 Спецификация отображения спрайтов

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ x │ ∙ │ R#8
	└───┴───┴───┴───┴───┴───┴─│─┴───┘
				  ├─ 0: спрайты разрешены
				  └─ 1: спрайты запрещены

∙ Таблица генератора шаблонов - как и в режиме 1

∙ Таблица атрибутов

     Поскольку в режиме 2 каждая строка шаблона может иметь неза-
висимый цвет, из каждых четырех байтов таблицы атрибутов значение
имеют только три:

     Координата Y: соответственные координаты 217 и 216
     Координата X:
     Номер шаблона:

     Рисунок 4.66 Структура таблицы атрибутов спрайтов

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│A14│A13│A12│A11│A10│ 1 │ 1 │ 1 │ R#5 ─┐
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
	┌───┬───┬───┬───┬───┬───┬───┬───┐      │
	│ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │A16│A15│ R#11 ┤
	└───┴───┴───┴───┴───┴───┴───┴───┘      │
     ┌─────────────────────────────────────────┘
     └─▶┌───┬───┬───┬───┬───┬───┬───┬───┐ ┐
	│     координата Y (0...255)	│ │
	├───┼───┼───┼───┼───┼───┼───┼───┤ │
	│     координата X (0...255)	│ │
	├───┼───┼───┼───┼───┼───┼───┼───┤ ├─ атрибуты
	│     номер шаблона (0...255)	│ │ спрайта #0
	├───┼───┼───┼───┼───┼───┼───┼───┤ │
	│	не используется		│ │
	├───┼───┼───┼───┼───┼───┼───┼───┤ ┘
	:				:

∙ Таблица цветов спрайтов

     Адрес таблицы цветов на 512 байт меньше адреса таблицы  шаб-
лонов (это устанавливается автоматически). Под каждый план  выде-
ляется 16 байт. Здесь выполняются следующие установки:

     цвет: для каждой отдельной линии спрайта
     EC: то же, что и в режиме 1, но  для  каждой  отдельной
         линии
     CC: если CC = 1, то в случае перекрытия  данной линии и
	 линии, принадлежащей спрайту  с большим приоритетом
	 над цветами обеих линий  выполняется операция OR, и
	 цвет результата  присваивается перекрывшейся части.
	 (Бит CC  более приоритетной линии должен быть "0"!)
	 Таким образом, можно с  помощью двух спрайтов иметь
	 3 цвета в одной линии.  Конфликт не регистрируется.
     IC: если 1,  эта  линия  не  конфликтует  с  остальными
         спрайтами.

	Рисунок 4.67 Структура таблицы цветов спрайтов

	├───┬───┬───┬───┬───┬───┬───┬───┤ ┐
	│ EC│ CC│ IC│ 0	│ цвет строки 0	│ │
	├───┼───┼───┼───┼───┼───┼───┼───┤ │
	│ EC│ CC│ IC│ 0	│ цвет строки 1	│ │
	├───┴───┴───┴───┴───┴───┴───┴───┤ ├─ спрайт #0
	:				: │
	├───┬───┬───┬───┬───┬───┬───┬───┤ │
	│ EC│ CC│ IC│ 0	│ цвет строки 15│ │
	├───┴───┴───┴───┴───┴───┴───┴───┤ ┘
	:				:

	Рисунок 4.68 Определение бита CC

		спрайт 1	спрайт 2	наложение

		▨▨▨▨▨···	▧▧▧·····	███▨▨···
		▨▨▨▨▨···	▧▧▧·····	███▨▨···
▨▨▨ - цвет 4	▨▨▨▨▨···	▧▧▧·····	███▨▨···
		▨▨▨▨▨···	▧▧▧·····	███▨▨···
▧▧▧ - цвет 8	▨▨▨▨▨···	▧▧▧▧▧▧▧▧	█████▧▧▧
		▨▨▨▨▨···	▧▧▧▧▧▧▧▧	█████▧▧▧
███ - цвет 12	▨▨▨▨▨···	▧▧▧▧▧▧▧▧	█████▧▧▧
		▨▨▨▨▨···	▧▧▧▧▧▧▧▧	█████▧▧▧

		 CC = 0		 CC = 1	       12 = 8 or 4


5.3.3 Разрешение конфликтов спрайтов

     В режиме 2 конфликт возникает тогда, когда произошло  перек-
рытие непрозрачных фрагментов спрайтов, бит CC которых равен 0. В
момент конфликта бит 5 регистра S#0 получает  значение  "1"  (так
можно обнаружить конфликт). В отличие от режима  1,  в  режиме  2
предоставляется возможность определить координату, где  произошел
конфликт. Для этого служат регистры S#3...S#6,  как  показано  на
рисунке 4.70. Небольшая сложность состоит в том, что  в  перечис-
ленных регистрах появляется не совсем то, что хотелось бы, поэто-
му истинную координату конфликта можно получить, лишь  воспользо-
вавшись формулами 4.5. Регистры S#3...S#6 сбрасываются при  проч-
тении регистра S#5.

             Рисунок 4.69 Разрешение конфликта

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ x │   │   │   │   │   │ S#0
	└───┴───┴─│─┴───┴───┴───┴───┴───┘
		  ├─ 0: обычное состояние
	          └─ 1: обнаружен конфликт спрайтов

     Рисунок 4.70 Получение координат точки конфликта

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ X7│ X6│ X5│ X4│ X3│ X2│ X1│ X0│ S#3 ┐
	└───┴───┴───┴───┴───┴───┴───┴───┘     │ координата X
	┌───┬───┬───┬───┬───┬───┬───┬───┐     │
	│ 1 │ 1 │ 1 │ 1 │ 1 │ 1 │ 1 │ X8│ S#4 ┘
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ Y7│ Y6│ Y5│ Y4│ Y3│ Y2│ Y1│ Y0│ S#5 ┐
	└───┴───┴───┴───┴───┴───┴───┴───┘     │ координата Y
	┌───┬───┬───┬───┬───┬───┬───┬───┐     │
	│ 1 │ 1 │ 1 │ 1 │ 1 │ 1 │ Y9│ Y8│ S#6 ┘
	└───┴───┴───┴───┴───┴───┴───┴───┘

     Выражение 4.5 Вычисление действительных координат

     X = (координата из S#4 и S#3) - 12
     Y = (координата из S#5 и S#6) - 8


     При попытке расположить на одной горизонтали девять или  бо-
лее спрайтов бит 6 регистра S#0 получает значение  "1",  а  номер
"лишнего" спрайта фиксируется в 5 младших битах S#0.

             Рисунок 4.71 Конфликт спрайтов (режим 2)

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ x │ ∙ │   │   │   │   │   │ S#0
	└───┴─│─┴───┴───┴───┴───┴───┴───┘
	      │     └─ номер 9 спрайта ─┘
	      ├─ 0: обычное состояние
	      └─ 1: обнаружен конфликт спрайтов
MSX2 TECHNICAL HANDBOOK, CHAPTER 4


6. ИСПОЛЬЗОВАНИЕ КОМАНД ВИДЕОПРОЦЕССОРА

     MSX-VIDEO способен исполнять ряд основных графических опера-
ций, которые называются "командами VDP". Эти команды  реализованы
аппаратно и разрешены только в режимах ГРАФИКА  4...7.  Их  вызов
максимально упрощен и сводится к пересылке требуемых параметров в
специальные регистры VDP. В этом разделе описываются команды VDP.


6.1 Система координат

     Чтобы выполнить команду VDP, необходимо задавать  координаты
источника и приемника информации, как показано на  рисунке  4.72.
Для команд VDP не существует деления на страницы, то есть все 128
Килобайт VRAM расположены в одной большой координатной системе.


     Рисунок 4.72 Координатная система VRAM

ГРАФИКА 4 (SCREEN 5)		ГРАФИКА 5 (SCREEN 6)
┌──────────────────┐   00000H	┌──────────────────┐
│0,0	      255,0│		│0,0	      511,0│
│		   │ страница 0 │		   │
│0,255	    255,255│		│0,255	    511,255│
├──────────────────┤   08000H	├──────────────────┤
│0,256	    255,256│		│0,256	    511,256│
│		   │ страница 1 │		   │
│0,511	    255,511│		│0,511	    511,511│
├──────────────────┤   10000H	├──────────────────┤
│0,512	    255,512│		│0,512	    511,512│
│		   │ страница 2 │		   │
│0,767	    255,767│		│0,767	    511,767│
├──────────────────┤   18000H	├──────────────────┤
│0,768	    255,768│		│0,768	    511,768│
│		   │ страница 3 │		   │
│0,1023	   255,1023│		│0,1023	   511,1023│
└──────────────────┘   1FFFFH	└──────────────────┘

ГРАФИКА 7 (SCREEN 8)		ГРАФИКА 6 (SCREEN 7)
┌──────────────────┐   00000H	┌──────────────────┐
│0,0	      255,0│		│0,0	      511,0│
│		   │ страница 0 │		   │
│0,255	    255,255│		│0,255	    511,255│
├──────────────────┤   10000H	├──────────────────┤
│0,256	    255,256│		│0,256	    511,256│
│		   │ страница 1 │		   │
│0,511	    255,511│		│0,511	    511,511│
└──────────────────┘   1FFFFH	└──────────────────┘



6.2 Команды VDP

     MSX-VIDEO может выполнять 12 видов команд, которые сведены в
Таблицу 4.5:

               Таблица 4.5 Список команд VDP
┌──────────┬──────────┬──────────┬─────────┬───────────┬──────┐
│ Название │ Приемник │ Источник │ Единицы │ Мнемоника │ R#46 │
├──────────┼──────────┼──────────┼─────────┼───────────┼──────┤
│ пересылки│   VRAM   │   CPU	 │  байты  │   HMMC    │ 1111 │
│ с высокой│   VRAM   │   VRAM	 │  байты  │   YMMM    │ 1110 │
│ скоростью│   VRAM   │   VRAM	 │  байты  │   HMMM    │ 1101 │
│	   │   VRAM   │   VDP	 │  байты  │   HMMV    │ 1100 │
├──────────┼──────────┼──────────┼─────────┼───────────┼──────┤
│	   │   VRAM   │   CPU	 │  точки  │   LMMC    │ 1011 │
│логические│   CPU    │   VRAM	 │  точки  │   LMCM    │ 1010 │
│ пересылки│   VRAM   │   VRAM	 │  точки  │   LMMM    │ 1001 │
│	   │   VRAM   │   VDP	 │  точки  │   LMMV    │ 1000 │
├──────────┼──────────┼──────────┼─────────┼───────────┼──────┤
│ вектор   │   VRAM   │   VDP	 │  точки  │   LINE    │ 0111 │
├──────────┼──────────┼──────────┼─────────┼───────────┼──────┤
│ поиск	   │   VRAM   │   VDP	 │  точки  │   SRCH    │ 0110 │
├──────────┼──────────┼──────────┼─────────┼───────────┼──────┤
│ точка	   │   VRAM   │   VDP	 │  точки  │   PSET    │ 0101 │
├──────────┼──────────┼──────────┼─────────┼───────────┼──────┤
│ цвет	   │   VDP    │   VRAM	 │  точки  │   POINT   │ 0100 │
├──────────┼──────────┼──────────┼─────────┼───────────┼──────┤
│ стоп	   │	      │		 │	   │   STOP    │ 0000 │
└──────────┴──────────┴──────────┴─────────┴───────────┴──────┘
     Если записать данные в регистр R#46  (командный),  MSX-VIDEO
установит бит 0 (CE) регистра S#2 в "1" и начнет  выполнение  ко-
манды.  Необходимые  параметры  следует  задaвать   в   регистрах
R#32...45 перед исполнением команды.
     Когда команда выполнена, CE сбрасывается в "0".
     Остановить выполнение можно, подав команду STOP.
     Работоспособность команд  обеспечивается  только  в  режимах
"бит-мэп".


6.3 Логические операции

     Во время исполнения команды видеопроцессор способен произво-
дить разнообразные операции над  данными  в  видеопамяти.  Каждая
операция выполняется согласно правилам Таблицы 4.6.

          Таблица 4.6 Список логических операций
	┌───────┬───────────────────────────────┬──────┐
	│  Имя	│ Операция			│ R#46 │
	├───────┼───────────────────────────────┼──────┤
	│  IMP	│ DC = SC			│ 0000 │
	│  AND	│ DC = SC x DC			│ 0001 │
	│  OR	│ DC = SC + DC	      ──	│ 0010 │
	│  EOR	│ DC = SC x DC + SC x DC	│ 0011 │
	│	│      ──			│      │
	│  NOT	│ DC = DC			│ 0100 │
	├───────┼───────────────────────────────┼──────┤
	│ TIMP	│ если SC=0, то DC=DC, иначе IMP│ 1000 │
	│ TAND	│ если SC=0, то DC=DC, иначе AND│ 1001 │
	│ TOR	│ если SC=0, то DC=DC, иначе OR	│ 1010 │
	│ TEOR	│ если SC=0, то DC=DC, иначе EOR│ 1011 │
	│ TNOT	│ если SC=0, то DC=DC, иначе NOT│ 1100 │
	└───────┴───────────────────────────────┴──────┘

     В таблице приняты обозначения: SC представляет цвет источни-
ка, DC - цвет приемника; IMP, AND, OR, EOR и NOT  записывают  ре-
зультат операции в приемник. В операциях, "имя" которых начинает-
ся с "T", цвет SC = 0 не обрабатывается,  и  соответствующий  ему
цвет DC остается без изменений. Это позволяет перекрывать изобра-
жения, оставляя прозрачные участки, что выглядит весьма  эффектно
при анимации.

Листинг 4.7 Пример использования логической операции с T

1000 ' ============================
1010 ' Логическая операция с T
1020 ' ============================
1030 '
1040 SCREEN 8:COLOR 15,0,0:CLS
1050 DIM A%(3587)
1060 '
1070 LINE (50,50)-(60,100),48,B:PAINT (51,51),156,48
1080 CIRCLE (55,30),30,255:PAINT (55,30),240,255
1090 COPY (20,0)-(90,100) TO A%
1100 CLS
1110 '
1120 R=RND(-TIME)
1130 FOR Y=0 TO 100 STEP 3
1140  X=INT (RND(1)*186)
1150  COPY A% TO (X,Y),,TPSET
1160 NEXT
1170 GOTO 1170


6.4 Указание области

     Ряд команд занят пересылкой прямоугольных фрагментов изобра-
жения. Фрагмент описывается через указание границы, как  показано
на рисунке 4.73. Координаты SX, SY  представляют  собой  исходную
точку перемещаемого прямоугольника, а NX и NY - длину каждой  его
стороны в точках. Еще два бита, DIX и DIY,  выбирают  направление
сканирования данных (их назначение зависит от типа команды). Мес-
то, куда производится пересылка указывается координатами DX и DY.

               Рисунок 4.73 Указание области

	(SX,SY)
	   ┌────────┬─▶DIX
	   │    NX  │
	   │NY	    │
	   │	    │	 (DX,DY)
	   ├────────┘ >>--> ┌────────┐
	   │		    │	     │
	   ▼		    │	     │
	   DIY		    │	     │
			    └────────┘



6.5 Использование каждой команды

     Команды классифицируются на 3 группы: скоростные  пересылки,
логические пересылки и рисование. В этом разделе описываются  ко-
манды и их использование.


6.5.1 HMMC (CPU -> VRAM скоростная пересылка)

     Данные поступают от CPU в указанную область VRAM (см.  рису-
нок 4.74). Логическая операция игнорируется. Информация передает-
ся байтами, с высокой скоростью. Заметьте, что в режимах  ГРАФИКА
4 и 6 младший бит координаты X игнорируется, а в режиме ГРАФИКА 5
игнорируются два младших бита.

     Установите параметры в регистрах, как изображено на рисунке,
и запишите первый пересылаемый байт в регистр R#44.  Запись  кода
F0H в регистр R#46 вызовет немедленное срабатывание команды: байт
из регистра R#44 поступит во VRAM, и VDP  будет  ждать  следующий
байт от CPU.

     CPU должен следить за тем, чтобы MSX-VIDEO  успевал  принять
очередной байт, проверяя бит TR регистра S#2 (он должен быть  ра-
вен "1"). Если бит CE регистра S#2 равен "0", это  означает,  что
все данные приняты (область заполнена). Листинг 4.8 демонстрирует
пример использования HMMC.


	Рисунок 4.74 Действие команды HMMC
	┌───────────────────────────────┐
	│				│
	│				│   VDP   CPU
	│     (DX,DY)			│  ┌──┐  ┌──┐
	│	 ┌───────────┬───▶DIX	│  │  │  │  │
	│	 │     NX    │		│  │  │  │  │
	│	 │NY	     ◀─────────────┤  │◀─┤  │
	│	 ├───────────┘		│  │  │  │  │
	│	 │			│  │  │  │  │
	│	 ▼			│  └──┘  └──┘
	│	DIY			│
	│				│
	│				│
	└───────────────────────────────┘
MXD: выбирает память-приемник: 0 = VRAM, 1 = ERAM

NX: размеры фрагмента по горизонтали (в точках): 0...511
NY: размеры фрагмента по вертикали (в точках): 0...1023

DIX: направление вдоль NX: 0 = вправо, 1 = влево
DIY: направление вдоль NY: 0 = вниз, 1 = вверх

DX: горизонтальная координата приемника: 0...511
DY: вертикальная координата приемника: 0...1023

CLR (регистр #44): первый байт пересылаемых данных


     Рисунок 4.75 Настройка регистров для HMMC

R#36:	DX7 DX6 DX5 DX4 DX3 DX2 DX1 DX0◀┐
R#37:	 0   0   0   0   0   0   0  DX8◀┴─ DX

R#38:	DY7 DY6 DY5 DY4 DY3 DY2 DY1 DY0◀┐
R#39:	 0   0   0   0   0   0  DY9 DY8◀┴─ DY

R#40:	NX7 NX6 NX5 NX4 NX3 NX2 NX1 NX0◀┐
R#41:	 0   0   0   0   0   0   0  NX8◀┴─ NX

R#42:	NY7 NY6 NY5 NY4 NY3 NY2 NY1 NY0◀┐
R#43:	 0   0   0   0   0   0  NY9 NY8◀┴─ NY

R#44:	CR7 CR6 CR5 CR4 CR3 CR2 CR1 CR0◀── CLR

R#45:	 0   -  MXD  -  DIX DIY  -   - ◀── ARG (аргумент)
		 │	 │   └───────────▶ направление X
		 │	 └───────────────▶ направление Y
		 └───────────────────────▶ VRAM/ERAM
Запуск HMMC:

R#46:	 1   1   1   1   -   -   -   -



Листинг 4.8 Пример использования команды HMMC
; =================================================
;  Пример HMMC: RAM (IX) -> VRAM (H,L)-(D,E)
; =================================================

RDVDP	EQU	0006H
WVDP	EQU	0007H

HMMC:	DI			; запретить прерывания
	CALL	WAIT.VDP	; ждать окончания команды

	LD	A,(WVDP)
	LD	C,A
	INC	C		; C := порт 1
	LD	A,36
	OUT	(C),A
	LD	A,17+80H
	OUT	(C),A		; R#17 := 36

	INC	C
	INC	C		; C := порт 3

	XOR	A
	OUT	(C),H		; DX
	OUT	(C),A
	OUT	(C),L		; DY
	OUT	(C),A

	LD	A,H		; сделать NX и DIX
	SUB	D
	LD	D,00000100B
	JR	NC,HMMC1
	LD	D,00000000B
	NEG
HMMC1:	LD	H,A		; H := NX, D := DIX

	LD	A,L		; сделать NY и DIY
	SUB	E
	LD	E,00000010B
	JR	NC,HMMC2
	LD	E,00000000B
	NEG
HMMC2:	LD	L,A		; L := NY

	XOR	A
	OUT	(C),H		; NX
	OUT	(C),A
	OUT	(C),L		; NY
	OUT	(C),A
	LD	H,(IX+0)
	OUT	(C),H		; первый байт
	LD	A,D
	OR	E
	OUT	(C),A		; DIX и DIY
	LD	A,0F0H
	OUT	(C),A		; код команды

	LD	A,(WVDP)
	LD	C,A
	INC	C		; C := порт 1
	LD	A,44+80H
	OUT	(C),A
	LD	A,17+80H
	OUT	(C),A
	INC	C
	INC	C

LOOP:	LD	A,2
	CALL	GET.STATUS
	BIT	0,A
	JR	Z,EXIT		; проверить бит CE
	BIT	7,A
	JR	Z,LOOP		; проверить бит TR
	INC	IX
	LD	A,(IX+0)
	OUT	(C),A
	JR	LOOP

EXIT:	XOR	A		; перед выходом нужно
	CALL	GET.STATUS	; выбрать регистр S#0
	EI
	RET

GET.STATUS:		; читать регистр статуса S#A
	PUSH	BC
	LD	BC,(WVDP)
	INC	C
	OUT	(C),A
	LD	A,8FH
	OUT	(C),A
	LD	BC,(RVDP)
	INC	C
	IN	A,(C)
	POP	BC
	RET

WAIT.VDP:		; ждать, пока VDP не освободится
	LD	A,2
	CALL	GET.STATUS
	AND	1
	JR	NZ,WAIT.VDP
	XOR	A
	CALL	GET.STATUS
	RET

	END



6.5.2 YMMM (VRAM -> VRAM скоростная пересылка вдоль Y)

     Данные  из  указанной  области  VRAM  копируются  в   другую
область. Эта команда выполняет пересылку только по Y.

     Установите параметры в регистрах, как изображено на рисунке.
Запись кода E0H в регистр R#46 вызовет  немедленное  срабатывание
команды. Если бит CE регистра S#2 равен "1", это значит, что  ко-
манда еще исполняется.


	Рисунок 4.76 Действие команды YMMM
	┌───────────────────────────────┐
	│				│
	│				│
	│     (DX,DY)--------------▶ DIX│
	│	|┌──────────────────────┤
	│	|│NY			│
	│	|└──────────────────────┤
	│	|(DX,SY)      ▲		│
	│	|┌────────────┴─────────┤
	│	|│			│
	│	|└──────────────────────┤
	│	▼			│
	│      DIY			│
	└───────────────────────────────┘
MXD: выбирает память-приемник: 0 = VRAM, 1 = ERAM

SY: вертикальная координата источника: 0...1023

NY: размеры фрагмента по вертикали (в точках): 0...1023

DIX: показывает, какой край экрана устанавливается
     по умолчанию: 0 = правый, 1 = левый
DIY: направление вдоль NY: 0 = вниз, 1 = вверх

DX: горизонтальная координата приемника: 0...511
DY: вертикальная координата приемника: 0...1023


     Рисунок 4.77 Настройка регистров для YMMM

R#34:	SY7 SY6 SY5 SY4 SY3 SY2 SY1 SY0◀┐
R#35:	 0   0   0   0   0   0  SY9 SY8◀┴─ SY

R#36:	DX7 DX6 DX5 DX4 DX3 DX2 DX1 DX0◀┐
R#37:	 0   0   0   0   0   0   0  DX8◀┴─ DX

R#38:	DY7 DY6 DY5 DY4 DY3 DY2 DY1 DY0◀┐
R#39:	 0   0   0   0   0   0  DY9 DY8◀┴─ DY

R#42:	NY7 NY6 NY5 NY4 NY3 NY2 NY1 NY0◀┐
R#43:	 0   0   0   0   0   0  NY9 NY8◀┴─ NY

R#45:	 0   -  MXD  -  DIX DIY  -   - ◀── ARG (аргумент)
		 │	 │   └───────────▶ направление X
		 │	 └───────────────▶ направление Y
		 └───────────────────────▶ VRAM/ERAM
Запуск YMMM:

R#46:	 1   1   1   0   -   -   -   -




6.5.3 HMMM (VRAM -> VRAM скоростная пересылка)

     Данные из указанной области VRAM копируются в другую область
VRAM.

     Установите параметры в регистрах, как изображено на рисунке.
Запись кода D0H в регистр R#46 вызовет  немедленное  срабатывание
команды. Если бит CE регистра S#2 равен "1", это значит, что  ко-
манда еще исполняется.


	Рисунок 4.78 Действие команды HMMM
	┌───────────────────────────────┐
	│     (SX,SY)--------------▶ DIX│
	│	|┌────────┐		│
        │	|│        │		│
	│	|│   NX	  │NY		│
	│	|└───────┬┘		│
	│	|(DX,DY) │		│
	│	|	┌▼───────┐	│
        │	|	│	 │	│
	│	|	│	 │	│
	│	|	└────────┘	│
	│	▼			│
	│      DIY			│
	└───────────────────────────────┘
MXS: выбирает память-источник: 0 = VRAM, 1 = ERAM
MXD: выбирает память-приемник: 0 = VRAM, 1 = ERAM

SX: горизонтальная координата источника: 0...511
SY: вертикальная координата источника: 0...1023

NX: размеры фрагмента по горизонтали (в точках): 0...511
NY: размеры фрагмента по вертикали (в точках): 0...1023

DIX: направление вдоль NX: 0 = вправо, 1 = влево
DIY: направление вдоль NY: 0 = вниз, 1 = вверх

DX: горизонтальная координата приемника: 0...511
DY: вертикальная координата приемника: 0...1023


     Рисунок 4.79 Настройка регистров для HMMM

R#32:	SX7 SX6 SX5 SX4 SX3 SX2 SX1 SX0◀┐
R#33:	 0   0   0   0   0   0   0  SX8◀┴─ SX

R#34:	SY7 SY6 SY5 SY4 SY3 SY2 SY1 SY0◀┐
R#35:	 0   0   0   0   0   0  SY9 SY8◀┴─ SY

R#36:	DX7 DX6 DX5 DX4 DX3 DX2 DX1 DX0◀┐
R#37:	 0   0   0   0   0   0   0  DX8◀┴─ DX

R#38:	DY7 DY6 DY5 DY4 DY3 DY2 DY1 DY0◀┐
R#39:	 0   0   0   0   0   0  DY9 DY8◀┴─ DY

R#40:	NX7 NX6 NX5 NX4 NX3 NX2 NX1 NX0◀┐
R#41:	 0   0   0   0   0   0   0  NX8◀┴─ NX

R#42:	NY7 NY6 NY5 NY4 NY3 NY2 NY1 NY0◀┐
R#43:	 0   0   0   0   0   0  NY9 NY8◀┴─ NY

R#45:	 0   -  MXD MXS DIX DIY  -   - ◀── ARG (аргумент)
		 │   │	 │   └───────────▶ направление X
		 │   │	 └───────────────▶ направление Y
		 └───┴───────────────────▶ VRAM/ERAM
Запуск HMMM:

R#46:	 1   1   0   1   -   -   -   -



6.5.4 HMMV (скоростное рисование прямоугольника)

     Каждый байт в указанной области VRAM получает значение, рав-
ное указанному цвету.

     Установите параметры в регистрах, как изображено на рисунке.
Запись кода C0H в регистр R#46 вызовет  немедленное  срабатывание
команды. Если бит CE регистра S#2 равен "1", это значит, что  ко-
манда еще исполняется.

	Рисунок 4.80 Действие команды HMMV
	┌───────────────────────────────┐
	│				│
	│				│   VDP
	│     (DX,DY)--------------▶ DIX│  ┌──┐
	│	|┌────────┐		│  │  │
	│	|│	  │NX		│  │  │
	│	|└────────┘◀───────────────┤  │
	│	|    NY			│  │  │
	│	|			│  │  │
	│	|			│  └──┘
	│	|			│
	│	▼			│
	│      DIY			│
	└───────────────────────────────┘
MXD: выбирает память-приемник: 0 = VRAM, 1 = ERAM

NX: размеры фрагмента по горизонтали (в точках): 0...511
NY: размеры фрагмента по вертикали (в точках): 0...1023

DIX: направление вдоль NX: 0 = вправо, 1 = влево
DIY: направление вдоль NY: 0 = вниз, 1 = вверх

DX: горизонтальная координата приемника: 0...511
DY: вертикальная координата приемника: 0...1023

CLR: цвет рисования


     Рисунок 4.81 Настройка регистров для HMMV

R#36:	DX7 DX6 DX5 DX4 DX3 DX2 DX1 DX0◀┐
R#37:	 0   0   0   0   0   0   0  DX8◀┴─ DX

R#38:	DY7 DY6 DY5 DY4 DY3 DY2 DY1 DY0◀┐
R#39:	 0   0   0   0   0   0  DY9 DY8◀┴─ DY

R#40:	NX7 NX6 NX5 NX4 NX3 NX2 NX1 NX0◀┐
R#41:	 0   0   0   0   0   0   0  NX8◀┴─ NX

R#42:	NY7 NY6 NY5 NY4 NY3 NY2 NY1 NY0◀┐
R#43:	 0   0   0   0   0   0  NY9 NY8◀┴─ NY

R#44:	CR7 CR6 CR5 CR4 CR3 CR2 CR1 CR0◀── CLR

R#45:	 0   -  MXD  -  DIX DIY  -   - ◀── ARG (аргумент)
		 │	 │   └───────────▶ направление X
		 │	 └───────────────▶ направление Y
		 └───────────────────────▶ VRAM/ERAM
Запуск HMMV:

R#46:	 1   1   0   0   -   -   -   -


6.5.5 LMMC (CPU -> VRAM логическая пересылка)

     Точечная пересылка данных от CPU во VRAM. Можно указать  ло-
гическую операцию. В командах  логических  пересылок,  таких  как
LMMC, в любом режиме графики под  каждую  точку  отводится  целый
байт.

     Установите параметры в регистрах, как изображено на рисунке.
Логическая операция может быть указана в 4 младших битах регистра
R#46. В остальном - так же, как и в HMMC.


	Рисунок 4.82 Действие команды LMMC
	┌───────────────────────────────┐
	│				│
	│				│   VDP   CPU
	│     (DX,DY)--------------▶ DIX│  ┌──┐  ┌──┐
	│	|┌────────┐		│  │  │  │  │
	│	|│	  │NY		│  │  │  │  │
	│	|└────────┘◀───────────────┤  │◀─┤  │
	│	|    NX			│  │  │  │  │
	│	|			│  │  │  │  │
	│	|			│  └──┘  └──┘
	│	|			│
	│	▼			│
	│      DIY			│
	└───────────────────────────────┘
MXD: выбирает память-приемник: 0 = VRAM, 1 = ERAM

NX: размеры фрагмента по горизонтали (в точках): 0...511
NY: размеры фрагмента по вертикали (в точках): 0...1023

DIX: направление вдоль NX: 0 = вправо, 1 = влево
DIY: направление вдоль NY: 0 = вниз, 1 = вверх

DX: горизонтальная координата приемника: 0...511
DY: вертикальная координата приемника: 0...1023

CLR: первый байт данных



     Рисунок 4.83 Настройка регистров для LMMC

R#36:	DX7 DX6 DX5 DX4 DX3 DX2 DX1 DX0◀┐
R#37:	 0   0   0   0   0   0   0  DX8◀┴─ DX

R#38:	DY7 DY6 DY5 DY4 DY3 DY2 DY1 DY0◀┐
R#39:	 0   0   0   0   0   0  DY9 DY8◀┴─ DY

R#40:	NX7 NX6 NX5 NX4 NX3 NX2 NX1 NX0◀┐
R#41:	 0   0   0   0   0   0   0  NX8◀┴─ NX

R#42:	NY7 NY6 NY5 NY4 NY3 NY2 NY1 NY0◀┐
R#43:	 0   0   0   0   0   0  NY9 NY8◀┴─ NY

R#44:	CR7 CR6 CR5 CR4 CR3 CR2 CR1 CR0◀── CLR

R#45:	 0   -  MXD  -  DIX DIY  -   - ◀── ARG (аргумент)
		 │	 │   └───────────▶ направление X
		 │	 └───────────────▶ направление Y
		 └───────────────────────▶ VRAM/ERAM
Запуск LMMC:

R#46:	 1   0   1   1  LO3 LO2 LO1 LO0◀─ логическая операция



6.5.6 LMCM (VRAM -> CPU логическая пересылка)

     Точечная пересылка данных из VRAM в CPU.

     Установите параметры в регистрах, как изображено на рисунке.
Запись кода A0H в регистр R#46 вызовет  немедленное  срабатывание
команды. CPU должен принимать данные, если бит  TR  регистра  S#2
установился в 1. Данные передаются через регистр S#7. Если бит CE
регистра S#2 равен нулю, это означает, что данные исчерпаны.

	Рисунок 4.84 Действие команды LMCM
	┌───────────────────────────────┐
	│				│
	│				│   VDP   CPU
	│     (SX,SY)--------------▶ DIX│  ┌──┐  ┌──┐
	│	|┌────────┐		│  │  │  │  │
	│	|│	  │NY		│  │  │  │  │
	│	|└────────┘───────────────▶│  ├─▶│  │
	│	|    NX			│  │  │  │  │
	│	|			│  │  │  │  │
	│	|			│  └──┘  └──┘
	│	|			│
	│	▼			│
	│      DIY			│
	└───────────────────────────────┘
MXS: выбирает память-источник: 0 = VRAM, 1 = ERAM

NX: размеры фрагмента по горизонтали (в точках): 0...511
NY: размеры фрагмента по вертикали (в точках): 0...1023

DIX: направление вдоль NX: 0 = вправо, 1 = влево
DIY: направление вдоль NY: 0 = вниз, 1 = вверх

SX: горизонтальная координата источника: 0...511
SY: вертикальная координата источника: 0...1023



     Рисунок 4.85 Настройка регистров для LMCM

R#32:	SX7 SX6 SX5 SX4 SX3 SX2 SX1 SX0◀┐
R#33:	 0   0   0   0   0   0   0  SX8◀┴─ SX

R#34:	SY7 SY6 SY5 SY4 SY3 SY2 SY1 SY0◀┐
R#35:	 0   0   0   0   0   0  SY9 SY8◀┴─ SY

R#40:	NX7 NX6 NX5 NX4 NX3 NX2 NX1 NX0◀┐
R#41:	 0   0   0   0   0   0   0  NX8◀┴─ NX

R#42:	NY7 NY6 NY5 NY4 NY3 NY2 NY1 NY0◀┐
R#43:	 0   0   0   0   0   0  NY9 NY8◀┴─ NY

R#45:	 0   -   -  MXS DIX DIY  -   - ◀── ARG (аргумент)
		     │	 │   └───────────▶ направление X
		     │	 └───────────────▶ направление Y
		     └───────────────────▶ VRAM/ERAM
Запуск LMCM:

R#46:	 1   0   1   0   -   -   -   -

Прием данных из регистра статуса S#7



6.5.7 LMMM (VRAM -> VRAM логическая пересылка)

     Данные из указанной области VRAM копируются в другую область
VRAM (по точкам).

     Установите параметры в регистрах, как изображено на рисунке.
Запись кода 9XH (X - код логической операции) в регистр R#46  вы-
зовет немедленное срабатывание команды. Если бит CE регистра  S#2
равен "1", это значит, что команда еще исполняется.

	Рисунок 4.86 Действие команды LMMM
	┌───────────────────────────────┐
	│     (SX,SY)--------------▶ DIX│
	│	|┌────────┐		│
        │	|│        │		│
	│	|│   NX	  │NY		│
	│	|└───────┬┘		│
	│	|(DX,DY) │		│
	│	|	┌▼───────┐	│
        │	|	│	 │	│
	│	|	│	 │	│
	│	|	└────────┘	│
	│	▼			│
	│      DIY			│
	└───────────────────────────────┘
MXS: выбирает память-источник: 0 = VRAM, 1 = ERAM
MXD: выбирает память-приемник: 0 = VRAM, 1 = ERAM

SX: горизонтальная координата источника: 0...511
SY: вертикальная координата источника: 0...1023

NX: размеры фрагмента по горизонтали (в точках): 0...511
NY: размеры фрагмента по вертикали (в точках): 0...1023

DIX: направление вдоль NX: 0 = вправо, 1 = влево
DIY: направление вдоль NY: 0 = вниз, 1 = вверх

DX: горизонтальная координата приемника: 0...511
DY: вертикальная координата приемника: 0...1023


     Рисунок 4.87 Настройка регистров для LMMM

R#32:	SX7 SX6 SX5 SX4 SX3 SX2 SX1 SX0◀┐
R#33:	 0   0   0   0   0   0   0  SX8◀┴─ SX

R#34:	SY7 SY6 SY5 SY4 SY3 SY2 SY1 SY0◀┐
R#35:	 0   0   0   0   0   0  SY9 SY8◀┴─ SY

R#36:	DX7 DX6 DX5 DX4 DX3 DX2 DX1 DX0◀┐
R#37:	 0   0   0   0   0   0   0  DX8◀┴─ DX

R#38:	DY7 DY6 DY5 DY4 DY3 DY2 DY1 DY0◀┐
R#39:	 0   0   0   0   0   0  DY9 DY8◀┴─ DY

R#40:	NX7 NX6 NX5 NX4 NX3 NX2 NX1 NX0◀┐
R#41:	 0   0   0   0   0   0   0  NX8◀┴─ NX

R#42:	NY7 NY6 NY5 NY4 NY3 NY2 NY1 NY0◀┐
R#43:	 0   0   0   0   0   0  NY9 NY8◀┴─ NY

R#45:	 0   -  MXD MXS DIX DIY  -   - ◀── ARG (аргумент)
		 │   │	 │   └───────────▶ направление X
		 │   │	 └───────────────▶ направление Y
		 └───┴───────────────────▶ VRAM/ERAM
Запуск LMMM:

R#46:	 1   0   0   1  LO3 LO2 LO1 LO0◀─ логическая операция


6.5.8 LMMV (логическое рисование прямоугольника)

     Каждая точка указанной области VRAM получает значение,  рав-
ное указанному цвету. Разрешены логические операции над  содержи-
мым VRAM и данным цветом.

     Установите параметры в регистрах, как изображено на рисунке.
Запись кода 8XH (где X - код логической операции) в регистр  R#46
вызовет немедленное срабатывание команды. Если  бит  CE  регистра
S#2 равен "1", это значит, что команда еще исполняется.


	Рисунок 4.88 Действие команды LMMV
	┌───────────────────────────────┐
	│				│
	│				│   VDP
	│     (DX,DY)--------------▶ DIX│  ┌──┐
	│	|┌────────┐		│  │  │
	│	|│	  │NX		│  │  │
	│	|└────────┘◀───────────────┤  │
	│	|    NY			│  │  │
	│	|			│  │  │
	│	|			│  └──┘
	│	|			│
	│	▼			│
	│      DIY			│
	└───────────────────────────────┘
MXD: выбирает память-приемник: 0 = VRAM, 1 = ERAM

NX: размеры фрагмента по горизонтали (в точках): 0...511
NY: размеры фрагмента по вертикали (в точках): 0...1023

DIX: направление вдоль NX: 0 = вправо, 1 = влево
DIY: направление вдоль NY: 0 = вниз, 1 = вверх

DX: горизонтальная координата приемника: 0...511
DY: вертикальная координата приемника: 0...1023

CLR: цвет рисования


     Рисунок 4.89 Настройка регистров для LMMV

R#36:	DX7 DX6 DX5 DX4 DX3 DX2 DX1 DX0◀┐
R#37:	 0   0   0   0   0   0   0  DX8◀┴─ DX

R#38:	DY7 DY6 DY5 DY4 DY3 DY2 DY1 DY0◀┐
R#39:	 0   0   0   0   0   0  DY9 DY8◀┴─ DY

R#40:	NX7 NX6 NX5 NX4 NX3 NX2 NX1 NX0◀┐
R#41:	 0   0   0   0   0   0   0  NX8◀┴─ NX

R#42:	NY7 NY6 NY5 NY4 NY3 NY2 NY1 NY0◀┐
R#43:	 0   0   0   0   0   0  NY9 NY8◀┴─ NY

R#44:	CR7 CR6 CR5 CR4 CR3 CR2 CR1 CR0◀── CLR

R#45:	 0   -  MXD  -  DIX DIY  -   - ◀── ARG (аргумент)
		 │	 │   └───────────▶ направление X
		 │	 └───────────────▶ направление Y
		 └───────────────────────▶ VRAM/ERAM
Запуск LMMV:

R#46:	 1   0   0   0  LO3 LO2 LO1 LO0◀─ логическая операция



6.5.9 LINE (рисование линии)

     Между любыми координатами VRAM можно провести линию. Необхо-
димые для этого параметры исчерпываются начальной точкой DX,  DY,
длинами проекций на оси координат: NX (большая) и  NY  (меньшая),
направлениями этих проекций DIX и DIY, а также цветом и  логичес-
кой операцией.

	Рисунок 4.90 Действие команды LINE
	┌───────────────────────────────┐
	│	      ▲	DIY		│
	│	     ╱|			│
	│	    ╱ |			│
	│	   ╱  |			│
	│	  ╱   |			│
	│	 ╱    |Min		│
	│	╱     |			│
	│      ╱      |			│
	│     ╱	      |			│
	│    ╱	 Maj  |			│
	│   ----------┴-▶DIX		│
	│ (DX,DY)			│
	└───────────────────────────────┘
MXD: выбирает память-приемник: 0 = VRAM, 1 = ERAM

Maj: длина большей стороны (в точках): 0...1023
Min: длина меньшей стороны (в точках): 0...511

MAJ: 0 = длинная сторона параллельна оси X
     1 = длинная сторона параллельна оси Y

DIX: направление большей проекции: 0 = вправо, 1 = влево
DIY: направление меньшей проекции: 0 = вниз, 1 = вверх

DX: горизонтальная координата приемника: 0...511
DY: вертикальная координата приемника: 0...1023

CLR: цвет рисования


     Рисунок 4.91 Настройка регистров для LINE

R#36:	DX7 DX6 DX5 DX4 DX3 DX2 DX1 DX0◀┐
R#37:	 0   0   0   0   0   0   0  DX8◀┴─ DX

R#38:	DY7 DY6 DY5 DY4 DY3 DY2 DY1 DY0◀┐
R#39:	 0   0   0   0   0   0  DY9 DY8◀┴─ DY

R#40:	NX7 NX6 NX5 NX4 NX3 NX2 NX1 NX0◀┐
R#41:	 0   0   0   0   0   0   0  NX8◀┴─ Maj

R#42:	NY7 NY6 NY5 NY4 NY3 NY2 NY1 NY0◀┐
R#43:	 0   0   0   0   0   0  NY9 NY8◀┴─ Min

R#44:	CR7 CR6 CR5 CR4 CR3 CR2 CR1 CR0◀── CLR

R#45:	 0   -  MXD  -  DIX DIY  -  MAJ◀── ARG (аргумент)
		 │	 │   └───────────▶ направление X
		 │	 └───────────────▶ направление Y
		 └───────────────────────▶ VRAM/ERAM
Запуск LINE:

R#46:	 0   1   1   1   LO3 LO2 LO1 LO0◀─ логическая операция



6.5.10 SRCH (поиск цвета)

     Команда SRCH ищет точку заданного цвета  относительно  любой
координаты VRAM вправо или влево. Она очень удобна  для  создания
операций закраски.

     После установки параметров, показанных на рисунке 4.93,  за-
пишите 60H в регистр R#46, чтобы команда заработала. Поиск закан-
чивается, если цвет найден либо достигнут край экрана. Бит CE ре-
гистра S#2 означает, что команда выполняется.

     Если цвет был найден, бит BD регистра S#2 равен "1", а  най-
денная координата хранится в регистрах S#8 и S#9.


	Рисунок 4.92 Действие команды SRCH
	┌───────────────────────────────┐
	│				│
	│				│
        │				│
	│	   (SX,SY)  DIX		│
	│	      · ----------▶ ·	│
	│		   точка цвета границы
	│				│
        │				│
	│				│
	│				│
	│				│
	│				│
	└───────────────────────────────┘
MXD: выбирает память-приемник: 0 = VRAM, 1 = ERAM

SX: горизонтальная координата поиска: 0...511
SY: вертикальная координата поиска: 0...1023

DIX: направление поиска вдоль NX: 0 = вправо, 1 = влево

EQ: 0 = заканчивает поиск, если обнаружен цвет границы
    1 = заканчивает поиск, если обнаружен цвет, отличный
	от цвета границы

CLR: цвет границы


     Рисунок 4.93 Настройка регистров для SRCH

R#32:	SX7 SX6 SX5 SX4 SX3 SX2 SX1 SX0◀┐
R#33:	 0   0   0   0   0   0   0  SX8◀┴─ SX

R#34:	SY7 SY6 SY5 SY4 SY3 SY2 SY1 SY0◀┐
R#35:	 0   0   0   0   0   0  SY9 SY8◀┴─ SY

R#44:	CR7 CR6 CR5 CR4 CR3 CR2 CR1 CR0◀── CLR

R#45:	 0   -  MXD  -  DIX EQ   -   - ◀── ARG (аргумент)
		 │    	 │   └───────────▶ условие окончания
		 │    	 └───────────────▶ направление Y
		 └───────────────────────▶ VRAM/ERAM
Запуск SRCH:

R#46:	 0   1   1   0   -   -   -   -



6.5.11 PSET (рисование точки)

     Точку можно нарисовать в любом месте VRAM (рис. 4.94).

     После установки параметров, как на  рисунке  4.95,  запишите
5XH в регистр R#46, где X - логическая операция. Бит CE  регистра
S#2 означает, что команда выполняется.

	Рисунок 4.94 Действие команды PSET
	┌───────────────────────────────┐
	│				│
	│				│
        │				│
	│	     (DX,DY)		│
	│		·		│
	│				│
	│				│
        │				│
	│				│
	│				│
	│				│
	│				│
	└───────────────────────────────┘
MXD: выбирает память-приемник: 0 = VRAM, 1 = ERAM

DX: горизонтальная координата: 0...511
DY: вертикальная координата: 0...1023

CLR: цвет


     Рисунок 4.95 Настройка регистров для PSET

R#36:	DX7 DX6 DX5 DX4 DX3 DX2 DX1 DX0◀┐
R#37:	 0   0   0   0   0   0   0  DX8◀┴─ DX

R#38:	DY7 DY6 DY5 DY4 DY3 DY2 DY1 DY0◀┐
R#39:	 0   0   0   0   0   0  DY9 DY8◀┴─ DY

R#44:	CR7 CR6 CR5 CR4 CR3 CR2 CR1 CR0◀── CLR

R#45:	 0   -  MXD  -   -   -   -   - ◀── ARG (аргумент)
		 └───────────────────────▶ VRAM/ERAM
Запуск PSET:

R#46:	 0   1   0   1   LO3 LO2 LO1 LO0◀─ логическая операция



6.5.12 POINT (чтение цвета точки)

     Команда POINT читает код цвета в любой точке VRAM.

     После установки параметров, как на  рисунке  4.97,  запишите
40H в регистр R#46. Бит CE регистра S#2 означает, что команда вы-
полняется. После окончания чтения код цвета устанавливается в ре-
гистре S#7.

	Рисунок 4.96 Действие команды POINT
	┌───────────────────────────────┐
	│				│
	│				│
        │				│
	│	   (SX,SY)		│
	│	      ·			│
	│				│
	│				│
        │				│
	│				│
	│				│
	│				│
	│				│
	└───────────────────────────────┘
MXS: выбирает память-источник: 0 = VRAM, 1 = ERAM

SX: горизонтальная координата: 0...511
SY: вертикальная координата: 0...1023


     Рисунок 4.97 Настройка регистров для POINT

R#32:	SX7 SX6 SX5 SX4 SX3 SX2 SX1 SX0◀┐
R#33:	 0   0   0   0   0   0   0  SX8◀┴─ SX

R#34:	SY7 SY6 SY5 SY4 SY3 SY2 SY1 SY0◀┐
R#35:	 0   0   0   0   0   0  SY9 SY8◀┴─ SY

R#45:	 0   -   -  MXS DIX EQ   -   - ◀── ARG (аргумент)
		     └───────────────────▶ VRAM/ERAM
Запуск POINT:

R#46:	 0   1   0   0   -   -   -   -



6.6 Повышение скорости команд

     Помимо выполнения команд, на VDP возлагается множество  дру-
гих обязанностей, которые хотя и ненамного, но  замедляют  работу
видеопроцессора. Вот почему, отказываясь  от  некоторых  из  них,
можно несколько ускорить выполнение команд. О том, как  это  сде-
лать, рассказано ниже.

1. Запрещение спрайтов

     Этот способ полезен, когда необходимо,  чтобы  экран  всегда
был включен. Установите в "1" бит 1 регистра R#8.

2. Выключение дисплея

     Этот метод не может быть использован  слишком  часто,  кроме
случаев полной инициализации экрана, поскольку  картинка  в  этом
режиме гаснет. Установите в "1" бит 6 регистра R#1.



6.7 Состояние регистров после завершения команды

     В таблице 4.7 собраны состояния регистров  после  завершения
каждой из команд.

     Если количество точек по вертикали принять за N, то значения
SY', DY' и NYB можно посчитать по формулам:

     SY' = SY + N, DY' = DY + N, если DIY = 0
     SY' = SY - N, DY' = DY - N, если DIY = 1
     NYB = NY - N

     ПРИМЕЧАНИЕ: если в LINE бит MAJ равен 0, то N = N - 1

     Таблица 4.7 Состояние регистров после завершения команд

┌─────────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ Команда │  SX │  SY │  DX │  DY │  NX │  NY │ CLR │ CMR │ ARG │
├─────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│  HMMC   │ --- │ --- │ --- │  *  │ --- │  #  │ --- │  0  │ --- │
│  YMMM	  │ ---	│  *  │ --- │  *  │ --- │  #  │ --- │  0  │ --- │
│  HMMM	  │ ---	│  *  │ --- │  *  │ --- │  #  │ --- │  0  │ --- │
│  HMMV   │ ---	│ --- │ --- │  *  │ --- │  #  │ --- │  0  │ --- │
├─────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│  LMMC	  │ ---	│ --- │ --- │  *  │ --- │  #  │ --- │  0  │ --- │
│  LMCM	  │ ---	│  *  │ --- │ --- │ --- │  #  │  *  │  0  │ --- │
│  LMMM	  │ ---	│  *  │ --- │  *  │ --- │  #  │ --- │  0  │ --- │
│  LMMV   │ ---	│ --- │ --- │  *  │ --- │  #  │ --- │  0  │ --- │
├─────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│  LINE	  │ ---	│ --- │ --- │  *  │ --- │ --- │ --- │  0  │ --- │
│  SRCH	  │ ---	│ --- │ --- │ --- │ --- │ --- │ --- │  0  │ --- │
│  PSET	  │ ---	│ --- │ --- │ --- │ --- │ --- │ --- │  0  │ --- │
│  POINT  │ ---	│ --- │ --- │ --- │ --- │ --- │  *  │  0  │ --- │
└─────────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
     - не меняется
     * координаты SY' и DY', а также цвет
     # показания счетчика (NYB), если достигнута граница

Глава 5

MSX2 TECHNICAL HANDBOOK, ГЛАВА 5



                            ГЛАВА 5

                 ДОСТУП К ПЕРИФЕРИИ ЧЕРЕЗ BIOS

     Философия MSX основана на том, чтобы иметь  стандартный  ин-
терфейс, не зависящий от конкретных машин или их версий, то есть,
обращаться к периферии  исключительно  через  BIOS.  Естественно,
пользователь должен знать, как это делается, поэтому  в  главе  5
описывается применение BIOS и логическая структура каждого  пери-
ферийного устройства.


1. PSG (Программируемый Звуковой Генератор) И ВЫВОД ЗВУКА

     MSX располагает тремя возможностями для вывода звуков  (спо-
соб (3) не встроен в стандартный MSX, поэтому здесь не описан). В
данном разделе объясняются способы (1) и (2).

     (1) PSG (3 канала, 8 октав)

     (2) 1 бит порта ввода/вывода

     (3) MSX-AUDIO (синтезатор с частотной модуляцией)



1.1 Возможности PSG

     Музыкальные операторы PLAY, SOUND и BEEP используют  LSI-чип
AY-3-8910. В MSX эта микросхема рассматривается как PSG (програм-
мируемый звуковой генератор), способный генерировать сложную  му-
зыку и разнообразные шумы. PSG имеет следующие возможности:

     - существуют 3 генератора тона, каждый из которых имеет 4096
независимых ступеней (8 октав) и 16 уровней громкости.

     - можно имитировать звуки пианино и органа, используя встро-
енные огибающие.  Предусмотрен,  однако,  единственный  генератор
огибающей, поэтому модулируется только один канал.

     - благодаря встроенному генератору шума можно  легко  созда-
вать звуки, наподобие шелеста ветра или  плеска  волн.  Генератор
шума тоже только  один,  поэтому  шумы  возможны  тоже  только  в
каком-нибудь одном канале.

     - любая необходимая частота звука получается делением  вход-
ной тактовой частоты fc = 1.7897725 MHz.


     Рисунок 5.1 Блочная диаграмма звукового генератора

R0,R1			R7		R8
┌──────────────────┐  ┌─────────┐	┌─────────────┐
│ Генератор тона A ├──▶		├───────▶ усилитель A ├─▶
└──────────────────┘  │		│     ┌─▶─────────────┘
R2,R3		      │		│     │	R9
┌──────────────────┐  │	 трех-	│     │	┌─────────────┐
│ Генератор тона B ├──▶канальный├───────▶ усилитель B ├─▶
└──────────────────┘  │	 микшер	│     ├─▶─────────────┘
R4,R5		      │		│     │	R10
┌──────────────────┐  │		│     │	┌─────────────┐
│ Генератор тона C ├──▶		├───────▶ усилитель C ├─▶
└──────────────────┘  └──▲──────┘     ├─▶─────────────┘
		R6       │	      │		R11,R12,R13
		┌────────┴───────┐    │	┌─────────────────────┐
		│ Генератор шума │    └─┤ Генератор огибающей │
		└────────────────┘	└─────────────────────┘


     PSG располагает двумя дополнительными (ввод/вывод)  портами,
которые не участвуют в выводе звука. MSX использует их как  порты
общего назначения для разнообразных  устройств,  типа  джойстика,
тач-панели или мыши. Эти порты описаны в разделе 5.


∙ Регистры PSG

     Поскольку PSG генерирует звуки самостоятельно, на CPU возла-
гается обязанность лишь указывать, когда и как  следует  изменить
звучание. Для этого достаточно записать необходимые значения в 16
внутренних регистров PSG.


∙ Настройка частоты тона (R0...R5)

     Частоту тона каждого из каналов (A, B или C) указывают в ре-
гистрах R0...R5. Тактовая частота (fc = 1.7897725 MHz) делится на
16, результат принимается за стандартную  частоту.  Каждый  канал
делит стандартную частоту на свое 12-битовое число, таким образом
получая частоту тона. Между 12-битовым делителем (TP) и генериру-
емой частотой справедливо отношение

     ft = fc / (16 * TP)
        = 0.11186078125/TP [MHz]
        = 111860.78125/TP [Hz]

     12-битовое значение подразделяется на 4-битовое число грубой
настройки CT и 8-битовое число тонкой настройки FT, как  показано
на рисунке 5.3. В таблице 5.1 приведены значения делителей, соот-
ветствующие музыкальной шкале.


            Рисунок 5.2 Структура регистров PSG

┌───────────────────┬─────────┬───┬───┬───┬───┬───┬───┬───┐
│ Регистр           │ Бит:  7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │
├─────┬─────────────┴─────┬───┼───┼───┼───┼───┼───┼───┼───┤
│ R 0 │			  │	    8 младших битов	  │
├─────┤ Канал A. Нота	  ├───┴───┴───┴───┼───┼───┼───┼───┤
│ R 1 │			  │		  │ 4 старших бита│
├─────┼───────────────────┼───┬───┬───┬───┼───┼───┼───┼───┤
│ R 2 │			  │	    8 младших битов	  │
├─────┤ Канал B. Нота	  ├───┴───┴───┴───┼───┼───┼───┼───┤
│ R 3 │			  │		  │ 4 старших бита│
├─────┼───────────────────┼───┬───┬───┬───┼───┼───┼───┼───┤
│ R 4 │			  │	    8 младших битов	  │
├─────┤ Канал C. Нота	  ├───┴───┴───┴───┼───┼───┼───┼───┤
│ R 5 │			  │		  │ 4 старших бита│
├─────┼───────────────────┼───────────┬───┼───┼───┼───┼───┤
│ R 6 │	Шум		  │	      │			  │
├─────┼───────────────────┼───────┬───┴───┴───┼───┴───┴───┤
│     │			  │ вв/выв│    шум    │	   тон	  │
│ R 7 │	Микшер		  ├───┬───┼───┬───┬───┼───┬───┬───┤
│     │			  │ A │	B │ C	B   A │	C   B	A │
├─────┼───────────────────┼───┴───┴───┼───┼───┼───┼───┼───┤
│ R 8 │	Канал А. Громкость│	      │	M │		  │
├─────┼───────────────────┼───────────┼───┼───┼───┼───┼───┤
│ R 9 │	Канал B. Громкость│	      │	M │		  │
├─────┼───────────────────┼───────────┼───┼───┼───┼───┼───┤
│ R10 │	Канал C. Громкость│	      │	M │		  │
├─────┼───────────────────┼───┬───┬───┼───┼───┼───┼───┼───┤
│ R11 │			  │	    8 младших битов	  │
├─────┤ Период огибающей  ├───┼───┼───┼───┼───┼───┼───┼───┤
│ R12 │			  │	    8 старших битов	  │
├─────┼───────────────────┼───┴───┴───┴───┼───┼───┼───┼───┤
│ R13 │	Форма огибающей	  │		  │		  │
├─────┼───────────────────┼───┬───┬───┬───┼───┼───┼───┼───┤
│ R14 │Порт A ввода/вывода│				  │
├─────┼───────────────────┼───┼───┼───┼───┼───┼───┼───┼───┤
│ R15 │Порт B ввода/вывода│				  │
└─────┴───────────────────┴───┴───┴───┴───┴───┴───┴───┴───┘


             Рисунок 5.3 Установка высоты тона

		┌──┬──┬──┬──┬──┬──┬──┬──┐
R0, R2, R4	│	8 битов		│
		└───────────────────────┘
		┌───────────┬──┬──┬──┬──┐
R1, R3, R5	│	    │   4 бита	│
		└───────────┴───────────┘
	┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐	│ Канал A: R1,R0
	│ грубо (CT)│       точно (FT)      │◀──┤ Канал B: R3,R2
	└───────────┴───────────────────────┘	│ Канал C: R5,R4
	└──────────────── TP ───────────────┘


         Таблица 5.1 Музыкальная шкала
┌────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│Нота│Окт 1│Окт 2│Окт 3│Окт 4│Окт 5│Окт 6│Окт 7│Окт 8│
├────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│ C  │ D5D │ 6AF │ 357 │ 1AC │  D6 │  6B │  35 │  1B │
│ C# │ C9C │ 64E │ 327 │ 194 │  CA │  65 │  32 │  19 │
│ D  │ BE7 │ 5F4 │ 2FA │ 17D │  BE │  5F │  30 │  18 │
│ D# │ B3C │ 59E │ 2CF │ 168 │  B4 │  5A │  2D │  16 │
│ E  │ A9B │ 54E │ 2A7 │ 153 │  AA │  55 │  2A │  15 │
│ F  │ A02 │ 501 │ 281 │ 140 │  A0 │  50 │  28 │  14 │
│ F# │ 973 │ 4BA │ 25D │ 12E │  97 │  4C │  26 │  13 │
│ G  │ 8EB │ 476 │ 23B │ 11D │  8F │  47 │  24 │  12 │
│ G# │ 86B │ 436 │ 21B │ 10D │  87 │  43 │  22 │  11 │
│ A  │ 7F2 │ 3F9 │ 1FD │  FE │  7F │  40 │  20 │  10 │
│ A# │ 780 │ 3C0 │ 1E0 │  F0 │  78 │  3C │  1E │   F │
│ B  │ 714 │ 38A │ 1C5 │  E3 │  71 │  39 │  1C │   E │
└────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘


∙ Настройка частоты шума (R6)

     Генератор шума исключительно полезен для имитации шума взры-
вов или волн. Выход генератора может подключаться к любому из ка-
налов. Меняя среднюю частоту шума в регистре R6, можно добиваться
разнообразных звуковых эффектов. Средняя чатота  шума  связана  с
5-битовым значением NP из регистра R6 так:

     fn = fc / (16 * NP)
        = 0.11186078125/NP [MHz]
        = 111860.78125/NP [Hz]


            Рисунок 5.4 Установка частоты шума

		┌────────┬──┬──┬──┬──┬──┐
	      R6│        │		│
		└────────┴──────────────┘
			 └───── NP ─────┘

     Поскольку 5-битовый делитель NP находится в пределах 1...31,
средняя частота шума имеет диапазон 3.6...111.9 KHz.


∙ Смешение звуков (микширование)

     Регистр R7 предназначен для раздельного включения  генерато-
ров тона или шума, а также для их смешения. Как показано  на  ри-
сунке 5.5, три младших бита регистра (B0...B2) управляют  выводом
генераторов тона, а следующие три бита (B3...B5) отвечают за  ге-
нератор шума. В обоих случаях 0 означает "включено", 1 -  "выклю-
чено".

      Рисунок 5.5 Переключение выхода каждого канала

		┌──┬──┬──┬──┬──┬──┬──┬──┐
	      R7│B7│B7│B5│B4│B3│B2│B1│B0│
		└──┴──┴──┴──┴──┴──┴──┴──┘
       ┌────────┴─────┘└───┬──┘└────────┴────────┐
┌──────▼────┐		┌──▼────────┐		┌▼──────────┐
│   вв/выв  │		│    шум    │		│    тон    │
├─────┬─────┤		├───┬───┬───┤		├───┬───┬───┤
│  A  │  B  │		│ C │ B │ A │		│ C │ B │ A │
└─────┴─────┘		└───┴───┴───┘		└───┴───┴───┘
   ввод = 0		 включено = 0		 включено = 0
  вывод = 1		выключено = 1		выключено = 1

     Два самых старших бита регистра R7 не влияют  на  звук;  они
определяют направление передачи данных через два порта  ввода/вы-
вода PSG. 0 обозначает ввод данных, 1 - вывод. Поскольку MSX  ис-
пользует порт A для ввода, а порт B для вывода, значение  старших
битов всегда должно быть "10".



∙ Управление громкостью

     Регистры R8...R10 предназначены для указания громкости  каж-
дого канала. Можно избрать один из двух путей: задать  постоянную
громкость (4-битовое значение 0...15) либо воспользоваться такими
эффектами как вибрато или постепенное ослабление звука.

             Рисунок 5.6 Управление громкостью

		┌────────┬──┬──┬──┬──┬──┐
       R8,R9,R10│        │B4│B3│B2│B1│B0│
		└────────┴▲─┴──┴──┴──┴──┘
			  │ └──── L ────┘
			Использование огибающей:
			Нет = 0 (громкость равна L)
			Да  = 1 (L игнорируется)

     Если бит 4 регистра  равен  0,  огибающая  не  используется,
громкость постоянна и равна значению, указанному в 4 младших  би-
тах. В противном случае это значение  игнорируется,  и  громкость
управляется генератором огибающей.


∙ Настройка периода огибающей

     Регистры R11 и R12 содержат 16-битовое значение периода оги-
бающей (старший байт в R12).

            Рисунок 5.7 Установка периода огибающей

		┌──┬──┬──┬──┬──┬──┬──┬──┐
	R11	│	8 битов		│
		└───────────────────────┘
		┌──┬──┬──┬──┬──┬──┬──┬──┐
	R12	│	8 битов		│
		└───────────────────────┘
	┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
	│     грубо (CT)	│       точно (FT)      │
	└───────────────────────┴───────────────────────┘
	└────────────────────── EP ─────────────────────┘

     Между периодом T и 16-битовым делителем EP существует  соот-
ношение:

     T = (256 * EP) / fc
       = (256 * EP) / 1.787725 [MHz]
       = 143.03493 * EP [микросекунд]



∙ Выбор шаблона огибающей

     4 младших бита регистра R13 выбирают шаблон  огибающей,  как
показано на рисунке 5.8. Интервал T  означает  период  огибающей,
который указывается в регистрах R11...R12.


           Рисунок 5.8 Установка формы огибающей

		┌───────────┬──┬──┬──┬──┐
       R13	│           │B3│B2│B1│B0│
		└───────────┴──┴──┴──┴──┘
	┌──────┬────────────────┐┌──────┬────────────────┐
	│      │		││	│       ________ │
	│      │   |\		││	│   |\ |	 │
	│ 00xx │ __| \_________ ││ 1011 │ __| \|	 │
	│      │		││	│		 │
	│      │    /|		││	│    /| /| /| /| │
	│ 01xx │ __/ |_________ ││ 1100 │ __/ |/ |/ |/ | │
	│      │		││	│      _________ │
	│      │   |\ |\ |\ |\	││	│    /		 │
	│ 1000 │ __| \| \| \| \ ││ 1101 │ __/		 │
	│      │		││	│		 │
	│      │   |\		││	│    /\  /\  /\	 │
	│ 1001 │ __| \_________ ││ 1110 │ __/  \/  \/  \ │
	│      │		││	│		 │
	│      │   |\  /\  /\	││	│    /|		 │
	│ 1010 │ __| \/  \/  \/ ││ 1111 │ __/ |_________ │
	└──────┴────────────────┘└──────┴────────────────┘



∙ Порт ввода / вывода (R14, R15)

     Регистры R14, 15 используются как параллельный 8-битовый ин-
терфейс общего назначения. Подробности в разделе 5.




1.2 Доступ к PSG

     Для управления PSG из программ на ассемблере полезны  следу-
ющие подпрограммы:


∙ GICINI (0090H/MAIN) - инициализация PSG
вход: ---
выход: ---
назначение: сбрасывает регистры PSG  и  выполняет  начальную
	    инициализацию рабочей  области  оператора  PLAY.
	    Каждый регистр получает значение в  соответствии
	    с рисунком 5.9.


       Рисунок 5.9 Начальные значения регистров PSG

	R 0 := 0 1 0 1 0 1 0 1
	R 1 := 0 0 0 0 0 0 0 0
	R 2 := 0 0 0 0 0 0 0 0
	R 3 := 0 0 0 0 0 0 0 0
	R 4 := 0 0 0 0 0 0 0 0
	R 5 := 0 0 0 0 0 0 0 0
	R 6 := 0 0 0 0 0 0 0 0
	R 7 := 1 0 1 1 1 0 0 0
	R 8 := 0 0 0 0 0 0 0 0
	R 9 := 0 0 0 0 0 0 0 0
	R10 := 0 0 0 0 0 0 0 0
	R11 := 0 0 0 0 1 0 1 1
	R12 := 0 0 0 0 0 0 0 0
	R13 := 0 0 0 0 0 0 0 0


∙ WRTPSG (0093H/MAIN) - запись в регистр PSG
вход: A - номер регистра PSG, E - данные
выход: ---
назначение: записывает данные из E в регистр, указанный в A


∙ RDPSG (0096H/MAIN) - чтение из регистра PSG
вход: А - номер регистра PSG
выход: А - содержимое указанного регистра
назначение: читает содержимое регистра PSG


∙ STRTMS (0099H/MAIN) - стартует музыку
вход: (QUEUE) - адрес очереди на промежуточном языке MML
выход: ---
назначение:  проверяет, исполняется ли фоновая музыка и
             продолжает игру, если необходимо


     Листинг 5.1 Пример генерации одиночного тона
; =======================================================
; Тон 440 герц (Ля 3 октавы)
; =======================================================
WRTPSG	EQU	0093H

	ORG	0B000H

; ---- начало программы -----

	LD	A,7		; выбрать регистр
	LD	E,10111110B	; тон канала A включен
	CALL	WRTPSG

	LD	A,8		; установить громкость
	LD	E,10
	CALL	WRTPSG

	LD	A,0		; тонкая настройка частоты
	LD	E,0FEH		; коэффициент деления
	CALL	WRTPSG

	LD	A,1		; грубая настройка
	LD	E,0
	CALL	WRTPSG
	RET

	END


1.3 Генерация тона посредством 1-битового звукового порта

     В дополнение к PSG MSX располагает и другим генератором зву-
ка. Это просто-напросто бит, который порождает звук при сбросе  и
установке его программным путем.


           Рисунок 5.10 1-битовый звуковой порт

		┌──┬──┬──┬──┬──┬──┬──┬──┐
		│  │			│
		└─▲┴────────────────────┘
		  │   Порт PPI (адрес 0AAH)
		┌─┴─┐
		┴───┴ громкоговоритель
		/ | \


∙ Доступ к 1-битовому звуковому порту

     Для доступа к 1-битовому выводу звука  предусмотрена  следу-
ющая процедура BIOS.


∙ CHGSND (0135H/MAIN)
вход: А - спецификация "вкл/выкл" (0 -"выкл", иначе -"вкл")
выход: ---
назначение: вызов этой процедуры с регистром  A,  равным  0,
            вызывает  сброс  звукового  бита;  любое  другое
            значение в регистре А устанавливает бит звука.



     Листинг 5.2 Воспроизведение с кассетной ленты
; ==========================================================
; Поместите кассету с обычной музыкальной фонограммой в
; магнитофон. MSX воспроизведет фонограмму (оцифровывая ее
; и синтезируя заново).
; ==========================================================
CHGSND	EQU	0135H
STMOTR	EQU	00F3H
RDPSG	EQU	0096H
BREAKX	EQU	00B7H

	ORG	0B000H

START:	LD	A,1
	CALL	STMOTR		; мотор магнитофона включен

LBL01:	LD	A,14		; регистр 14 PSG
	CALL	RDPSG		; прочитать

	AND	80H		; получить очередной бит с ленты
	CALL	CHGSND		; доступ к звуковому биту

	CALL	BREAKX		; проверить CTRL+STOP
	JR	NC,LBL01

	XOR	A
	CALL	STMOTR		; остановить мотор
	RET

	END
2. КАССЕТНЫЙ ИНТЕРФЕЙС

     Кассетный магнитофон - это наиболее дешевое устройство внеш-
ней памяти, которое можно подключить к MSX.  Знания  о  кассетном
интерфейсе необходимы для правильного восприятия информации,  за-
писанной на ленте.


2.1 Скорость обмена

     Кассетный интерфес MSX поддерживает две скорости обмена (см.
таблицу 5.2). При запуске BASICа выбирается 1200 бод/с.

              Таблица 5.2 Скорость обмена MSX
           ┌────────────┬──────────────────────┐
           │ 1200 бод/с │ относительно низкая  │
           │ 2400 бод/с │ относительно высокая │
           └────────────┴──────────────────────┘
     Скорость обмена указывается в четвертом параметре инструкции
SCREEN или во втором параметре инструкции CSAVE; достаточно  выб-
рать ее единожды.

SCREEN ,,,<скорость_обмена>
CSAVE "имя_файла",<скорость_обмена>
     <скорость_обмена> = 1 для 1200 бод/с, 2 для 2400 бод/с


2.2 Представление отдельно взятого бита

     Одиночный бит, основа всякого обмена, записывается, как  по-
казано на рисунке 5.11. Ширина импульса подсчитывется CPU, поэто-
му прерывания запрещаются, пока активен кассетный интерфейс.
     Данные с кассеты можно прочитать через бит 7 порта B (регис-
тра 15 PSG). Эта возможность и была использована в листинге 5.3 в
качестве примера.

          Рисунок 5.11 Представление одного бита
	┌──────────┬─────┬──────────────────────────────┐
	│ скорость │ бит │	  форма сигнала		│
	├──────────┼─────┼──────────────────────────────┤
	│	   │     │	   ┌────────┐		│
	│	   │  0  │	   │	    │ 1200Hz x 1│
	│	   │     │ ────────┘	    └		│
	│ 1200 бод ├─────┼──────────────────────────────┤
	│	   │     │     ┌───┐	┌───┐		│
	│	   │  1  │     │   │	│   │ 2400Hz x 2│
	│	   │     │ ────┘   └────┘   └		│
	├──────────┼─────┼──────────────────────────────┤
	│	   │     │     ┌───┐			│
	│	   │  0  │     │   │	      2400Hz x 1│
	│	   │     │ ────┘   └			│
	│ 2400 бод ├─────┼──────────────────────────────┤
	│	   │     │   ┌─┐ ┌─┐			│
	│	   │  1  │   │ │ │ │	      4800Hz x 2│
	│	   │     │ ──┘ └─┘ └			│
	└──────────┴─────┴───▲─▲───▲─────────▲──────────┘
			     │ │   │         └─ 2983 T (833 мкс)
			     │ │   └─────────── 1491 T (417 мкс)
			     │ └───────────────  746 T (208 мкс)
			     └─────────────────  373 T (104 мкс)


2.3 Представление отдельно взятого байта

     Байт записывается на ленту в виде 11-битового массива:  сна-
чала идет синхробит "0", затем тело байта  (от  младшего  бита  к
старшему). Завершается байт двумя битами "11" (см. рисунок 5.12).

          Рисунок 5.12 Представление одного байта

          младший бит          старший бит
─────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────────
▧▧▧▧ │ 0 │ x   x   x   x   x   x   x   x │ 1 │ 1 │ ▧▧▧▧▧▧▧▧
─────┴─▲─┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴─────────
       │  └─────────── байт ────────────┘ └──┬──┘
 стартовый бит				 стоп-биты



2.4 Представление заголовка

     Заголовок представляет собой фрагмент записи, который запол-
нен сигналом определенной частоты. Существует два типа заголовка:
длинный и короткий. Длинный позволяет  дождаться,  пока  вращение
мотора стабилизируется. Параллельно уточняется скорость обмена  с
лентой. Короткий заголовок играет роль разделителя между  частями
одного файла. В таблице 5.3 показано представление обоих.


     Таблица 5.3 Представление заголовка
┌────────────────────────────────────────────────┐
│    1200 бод:					 │
│    - длинный: 2400 Hz x 16000 (около 6.7 сек)	 │
│    - коротки: 2400 Hz x 4000 (около 1.7 сек)	 │
├────────────────────────────────────────────────┤
│    2400 бод:					 │
│    - длинный: 4800 Hz x 32000 (около 6.7 сек)	 │
│    - короткий: 4800 Hz x 8000 (около 1.7 сек)	 │
└────────────────────────────────────────────────┘


2.5 Форматы файла

     MSX BASIC поддерживает следующие виды кассетных файлов:

     (1) Текст BASIC-программы

     Программы на BASICе, сохраненные в двоичном формате при  по-
мощи команды CSAVE, делятся на две части: хэдер и тело.

     Рисунок 5.13 Формат файла

───┬───────────────────┬───────────┬───────────┬───
   │ длинный заголовок │ 0D3H x 10 │ имя файла │
───▲───────────────────┴───────────┴───────────▲───
   |             ┌-----------------------------┘
───┬─────────────┬┬─────────────────────┬───
▧▧▧│ хэдер файла ││	тело файла	│▧▧▧
───┴─────────────┴┴─────────────────────┴───
   ┌--------------┘                     └-----┐
───▼────────────────────┬───────────┬─────────▼───
   │ короткий заголовок │ программа │ 00H x 7 │
───┴────────────────────┴───────────┴─────────┴───

     Хэдер содержит длинный заголовок, 10  байт  D3h  и  6  байт,
представляющих имя файла. В теле файла размещаются: короткий  за-
головок, а затем собственно программа, которая завершается  семью
байтами 00h.


     (2) Текст в кодах ASCII

     BASIC-программы, сохраненные при помощи SAVE, а также  файлы
данных, созданные OPEN, записываются в следующем виде.

     Рисунок 5.14 Формат файла

───┬───────────────────┬───────────┬───────────┬───
   │ длинный заголовок │ 0EAH x 10 │ имя файла │
───▲───────────────────┴───────────┴───────────▲───
   |             ┌-----------------------------┘
───┬─────────────┬┬─────────────────────┬───
▧▧▧│ хэдер файла ││	тело файла	│▧▧▧
───┴─────────────┴┴─────────────────────┴───
   ┌--------------┘                     └-----┐
───▼────────┬────────┬────────┬───────────────▼───
   │ блок 1 │ блок 2 │ блок 3 │ ...           │
───┴────────┴────────┴────────┴───────────────┴───
   |        └-----------------------------┐
───▼────────────────────┬─────────────────▼───
   │ короткий заголовок │ 256 байт данных │
───┴────────────────────┴─────────────────┴───


     (3) Машинные коды

     Двоичные файлы, созданные с  помощью  BSAVE,  сохраняются  в
следующем формате. В хэдере, вслед за длинным заголовком, записы-
ваются 10 байт D0h и 6 байт, представляющих имя файла. Тело файла
начинается коротким заголовком, за которым расположены: начальный
адрес, конечный адрес и адрес запуска машинной  программы,  вслед
за которыми идут собственно коды. Поскольку длина тела файла  вы-
числяется по значениям адресов,  специального  маркера  конца  не
требуется. Адрес запуска - это адрес, куда будет передано  управ-
ление, если в команде BLOAD указать опцию R.
      
     Рисунок 5.15 Формат файла

───┬───────────────────┬───────────┬───────────┬───
   │ длинный заголовок │ 0D0H x 10 │ имя файла │
───▲───────────────────┴───────────┴───────────▲───
   |             ┌-----------------------------┘
───┬─────────────┬┬─────────────────────┬───
▧▧▧│ хэдер файла ││	тело файла	│▧▧▧
───┴─────────────┴┴─────────────────────┴───
   ┌--------------┘                     └--------------------┐
───▼────────────────────┬────────┬───────┬───────┬───────────▼──
   │ короткий заголовок │ начало │ конец │ старт │ программа │
───┴────────────────────┴────────┴───────┴───────┴───────────┴──
			 2 байта  2 байта  2 байта



2.6 Доступ к кассетным файлам

     Следующие точки BIOS предназначены для  обработки  кассетных
файлов.

∙ TAPION (00E1H/MAIN) - OPEN (открыть) для чтения
вход: ---
выход: CY = 1, если ненормальное окончание
назначение: включает мотор магнитофона и  читает  заголовок.
	Одновременно определяется скорость обмена, с которой
	был записан файл. Прерывания запрещаются.

∙ TAPIN (00E4H/MAIN) - читать один байт
вход: ---
выход: А = прочитанное значение
	CY = 1, если ненормальное окончание
назначение: читает байт с ленты и помещает его в регистр A

∙ TAPIOF (00E7H/MAIN) - CLOSE (закрыть) для чтения
вход: ---
выход: ---
назначение: заканчивает чтение. Прерывания возобновляются.

∙ TAPOON (00EAH/MAIN) - OPEN (открыть) для записи
вход: A - тип заголовка (0 - короткий, иначе - длинный)
выход: CY = 1, если ненормальное окончание
назначение: влючает мотор магнитофона и записывает заголовок
	указанного в A вида. Прерывания запрещаются.

∙ TAPOUT (00EDH/MAIN) - записать один байт
вход: A - значение
выход: CY = 1, если ненормальное окончание
назначение: записывает байт из регистра A на ленту

∙ TAPOOF (00F0H/MAIN) - CLOSE (закрыть) для записи
вход: ---
выход: ---
назначение: заканчивает запись. Прерывания возобновляются.

∙ STMOTR (00F3H/MAIN) - указывает действие мотора
вход: A - действие (0 - стоп, 1 - старт, 255 - инверсия)
выход: ---
назначение: устанавливает состояние мотора в соответствии со
	значением, указанным в регистре A.

     Если операции чтения/записи реализованы на основе этих точек
BIOS, никаких действий в паузах между  чтением/записью  выполнять
не рекомендуется. Например, если попытаться каждый байт  по  мере
считывания выводить на экран, это скорее всего приведет к сбою.

     Листинг 5.3 содержит пример, в котором использованы  описан-
ные выше точки BIOS.

; =============================================================
; Установите кассету в магнитофон. Все имена и атрибуты файлов
; будут выведены экран в виде списка.
; =============================================================
CHPUT	EQU	00A2H
TAPION	EQU	00E1H
TAPIN	EQU	00E4H
TAPIOF	EQU	00E7H

	ORG	0C000H

START:	CALL	TAPION	; включить мотор и прочитать хэдер

	LD	B,16
	LD	HL,WORK	; адрес рабочей области
LBL01:	PUSH	HL
	PUSH	BC
	CALL	TAPIN	; прочитать байт
	POP	BC
	POP	HL
	JR	C,ERROR	; при обнаружении ошибки CY = 1
	LD	(HL),A
	INC	HL
	DJNZ	LBL01

	LD	HL,FILNAM	; записать имя файла
	CALL	PUTSTR
	LD	HL,WORK+10
	CALL	PUTSTR
	CALL	CRLF

	LD	A,(WORK)	; проверить атрибут

	LD	HL,BINFIL
	CP	0D3H		; двоичный ?
	JR	Z,LBL03

	LD	HL,ASCFIL
	CP	0EAH		; ASCII ?
	JR	Z,LBL03

	LD	HL,MACFIL
	CP	0D0H		; машинные коды ?
	JR	Z,LBL03

	LD	HL,ERRSTR

LBL03:	CALL	PUTSTR
	CALL	TAPIOF
	RET

CRLF:	LD	HL,STCRLF	; перевод строки

PUTSTR:	LD	A,(HL)		; взять символ
	CP	'$'		; конец строки ?
	RET	Z
	CALL	CHPUT		; вывести на CRT
	INC	HL
	JR	PUTSTR

; ----- данные -------

FILNAM:	DB	'FILE NAME : $'
ASCFIL:	DB	'ASCII FILE',10,13,'$'
BINFIL:	DB	'BINARY FILE',10,13,'$'
MACFIL:	DB	'BSAVE FILE',10,13,'$'
ERRSTR:	DB	'TAPE READ ERROR'
STCRLF:	DB	10,13,'$'

; ---- рабочая область -----

WORK:	DS	16
	DB	'$'

	END





3. КЛАВИАТУРНЫЙ ИНТЕРФЕЙС

     Клавиатура MSX2 имеет ту же конструкцию,  что  и  MSX1.  Это
очень удобно для трансляции латинских знаков в катакану. В данной
главе описан клавиатурный интерфейс MSX2.

     Наше описание базируется на японской версии оформления  кла-
виатуры (интернациональная версия несколько отличается).


3.1 Сканирование клавиш

     Клавиши MSX размещены в матрице (пример: рис. 5.16).  Состо-
яние любой из клавиш можно получить в  режиме  реального  времени
путем проверки клавиатурной матрицы.

     Сканирование выполняется следующей процедурой BIOS:

∙ SNSMAT (0141H/MAIN) - читает указанную строку матрицы
вход: A - строка матрицы 0...10
выход: A - состояние клавиш (0 - нажата)
назначение: указывает строку матрицы и возвращает  состояние
	в регистре А. Бит, соответствующий нажатой  клавише,
	устанавливается в 0.


     Рисунок 5.16 Международный вариант клавиатуры MSX

     7     6     5     4     3     2     1     0
  ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
 0│  B  │  L  │     │  /  │  1  │  S  │  X  │  ,  │
  ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
 1│  V  │  J  │  ^  │  ]  │  Q  │  A  │  C  │  N  │
  ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
 2│  G  │  8  │  0  │  [  │  W  │  F  │  Z  │  M  │
  ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
 3│  T  │  I  │  ~  │  ;  │  2  │  D  │  U  │  \  │
  ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
 4│  6  │  K  │  P  │  :  │  3  │  R  │  7  │  H  │
  ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
 5│  5  │  0  │  9  │  @  │  4  │  E  │  Y  │  .  │
  ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
 6│  F3 │  F2 │  F1 │ CODE│ CAPS│GRAPH│ CTRL│SHIFT│
  ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
 7│RETRN│SELCT│  BS │ STOP│ TAB │ ESC │  F5 │  F4 │
  ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
 8│  ▶  │  ▼  │  ▲  │  ◀  │ DEL │ INS │ HOME│SPACE│
  └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
  ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
 9│  4  │  3  │  2  │  1  │  0  │ доп │ доп │ доп │
  ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
10│  .  │  ,  │  -  │  9  │  8  │  7  │  6  │  5  │
  └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘


Листинг 5.4 Использование процедуры сканирования
; =================================================
; Сканировать матрицу и демонстрировать на экране
; =================================================
CHPUT	EQU	0A2H
BREAKX	EQU	0B7H
POSIT	EQU	0C6H
SNSMAT	EQU	141H

	ORG	0B000H

SCAN:	LD	C,0	; C:= номер строки матрицы

SC1:	LD	A,C
	CALL	SNSMAT	; прочитать состояние

	LD	B,8
	LD	HL,BUF	; адрес буфера
SC2:	LD	D,'.'
	RLA		; проверить бит
	JR	C,SC3
	LD	D,'#'
SC3:	LD	(HL),D	; поместить в буфер '.' или '#'
	INC	HL
	DJNZ	SC2

	LD	H,5	; x = 5
	LD	L,C	; y = C + 1
	INC	C
	CALL	POSIT	; установить курсор

	LD	B,8
	LD	HL,BUF
SC4:	LD	A,(HL)
	CALL	CHPUT	; вывести состояние на экран
	INC	HL
	DJNZ	SC4

	CALL	BREAKX	; проверить CTRL STOP
	RET	C

	INC	C	; увеличить номер строки
	LD	A,C
	CP	9
	JR	NZ,SC1
	JR	SCAN

BUF:	DS	8
	RET

	END





3.2 Ввод символов

     MSX сканирует клавиатуру по прерываниям таймера 60 раз в се-
кунду и, если была нажата клавиша, помещает ее  код  в  кольцевой
буфер, как это показано на рисунке 5.18. Ввод с клавиатуры выпол-
няется, главным образом, путем чтения из этого буфера.

	Рисунок 5.18 Кольцевой буфер клавиатуры

KEYBUF(FBF0H,40)  (GETPNT)	     (PUTPNT)
 │		     ▲			│
─┼┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬│┬┬┬---┬┬┬┬┬┬┬┬┬┬┬┬▼┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬──
─┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴─┴┴┴---┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴──
 └────────────────────── 40 байт ──────────────────────┘
PUTPNT показывает ячейку, в которую поступит код клавиши
GETPNT показывает ячейку, откуда будет взят код клавиши


     Процедуры BIOS, предназначенные для получения кодов из буфе-
ра, а также относящиеся к ним операции описаны  ниже.  Выключение
прерываний делает их, естественно, бесполезными.

∙ CHSNS (009CH/MAIN) - проверяет буфер клавиатуры
вход: ---
выход: Z = 1, если буфер пуст
назначение: выясняет, остались ли символы в кольцевом буфере
	и устанавливает флаг Z, если буфер пуст.

∙ CHGET (009FH/MAIN) - вводит один символ из буфера
вход: ---
выход: A - код символа
назначение: читает символ из буфера и  сохраняет  его  в  A.
	Если буфер пуст, высвечивает курсор и ждет  нажатия.
	В  момент  ожидания  можно  произвольно  переключать
	клавиши CAPS, KANA ("РУС") и ROMAN-TO-KANA.  Рабочая
	область, которая имеет отношение к CHGET,  приведена
	ниже. Поскольку SCNCNT и  REPCNT  устанавливаются  в
	нормальное состояние после каждого вызова CHGET,  их
	постоянно нужно обновлять:

CLIKSW (F3DBH, 1) - отзвук клавиши (0 - выкл, 1 - вкл)
SCNCNT (F3F6H, 1) - интервал сканирования (нормально 1)
REPCNT (F3F7H, 1) - задержка перед автоповтором (норма 50)
CSTYLE (FCAAH, 1) - вид курсора (0 - █, иначе - ▁)
CAPST  (FCABH, 1) - CAPS LOCK (0 - выкл, иначе - вкл)
DEADST (FCACH, 1) - DEAD LOCK (0, 1, 2, 3, 4)


∙ KILBUF (0156H/MAIN) - очистить буфер клавиатуры
вход: ---
выход: ---
назначение: сбрасывает буфер клавиатуры


         Листинг 5.5 Использование процедуры ввода
; =================================================
; эта процедура не ждет нажатия клавиши !
; =================================================

CHSNS	EQU	09CH	; проверить буфер
CHGET	EQU	09FH	; получить символ из буфера
CHPUT	EQU	0A2H	; вывести символ на экран
BREAKX	EQU	0B7H	; проверить CTRL STOP
KILBUF	EQU	156H	; очистить буфер
REPCNT	EQU	0F3F7H	; интервал между сканированием
KEYBUF	EQU	0FBF0H	; адрес буфера

	ORG	0B000H	; ввод кода в режиме реального
			; времени

KEY:	CALL	CHSNS	; проверить буфер
	JR	C,KEY1

	LD	A,1
	LD	(REPCNT),A	; не ждать
	CALL	CHGET	; взять символ
	JR	KEY2

KEY1:	LD	A,'-'

KEY2:	CALL	CHPUT	; вывести символ
	CALL	KILBUF	; очистить буфер
	CALL	BREAKX	; ctrl stop ?
	JR	NC,KEY
	RET

	END



∙ CNVCHR (00ABH/MAIN) - преобразование графических кодов
вход: A - код символа
выход: A - преобразованный графсимвол  (обычные  символы  не
преобразуются)
     CY = 0 (был прочитан графический хэдер 01h)
     CY = 1, Z = 1 (был прочитан и преобразован графсимвол)
     CY = 1, Z = 0 (был введен обычный символ)
назначение: использование  CNVCHR  после  CHGET  преобразует
	графический символ в однобайтовый код в соответствии
	с таблицей. Поскольку графсимволы  представляются  в
	иррегулярном 2-байтовом формате (с лидирующим байтом
	01h), данная процедура облегчает их обработку.

	Рисунок 5.19 Схема преобразования кода

	01H 41H ─▶ 01H
	01H 42H ─▶ 02H
	01H 43H ─▶ 03H
	:	    :
	01H 5FH ─▶ 1FH


∙ PINLIN (00AEH/MAIN) - ввод одной физической строки
вход: ---
выход: HL = F55DH
       (F55DH) - введенная строка (признак конца - байт 00h)
	CY = 1 - ввод прерван клавишей STOP
	CY = 0 - ввод прерван клавишей RETURN
назначение: сохраняет введенную строку в буфере F55DH. Можно
	использовать все доступные  функции  редактирования.
	Нажатие RETURN или STOP завершает ввод:

BUF	(F55DH, 258) - строковый буфер
LINTTB (FBB2H, 24) - 00h, если данная физическая строка
является продолжением предыдущей.


∙ INLIN (00B1H/MAIN) - ввод одной строки (с подсказкой)
вход: ---
выход: то же, что PINLIN
назначение: аналогично PINLIN. Разница в том, что часть
	строки, находящаяся левее курсора, в буфере не
	сохраняется.


3.3 Функциональные клавиши

     MSX располагает десятью функциональными  клавишами,  которые
могут переназначаться пользователем по его  желанию.  Под  каждую
клавишу отведено 16 байт:

FNKSTR (F87FH, 16)	- адрес клавиши F1
+ 16			- адрес клавиши F2 и т.д.

     Одно нажатие функциональной клавиши сохраняет в буфере целую
строку. Конец этой строки отмечен байтом 00h, поэтому можно опре-
делить максимально до 15 символов. Для восстановления  начального
состояния функциональных клавиш рекомендуется использовать проце-
дуру INIFNK (003EH/MAIN).


3.4 Проверка клавиши STOP

     CHGET - процедура, описанная в разделе 3.3,- определяет  код
клавиши только в момент прерывания, поэтому  в  ситуациях,  когда
прерывания запрещены (например, обмен с кассетой), нажатая клави-
ша не может быть обнаружена. Тем не менее, комбинацию клавиш CTRL
STOP можно проконтролировать всегда при помощи следующей процеду-
ры BIOS:

∙ BREAKX (00B7H/MAIN) - проверка CTRL STOP
вход: ---
выход: CY = 1 - нажато
назначение: сканирует клавиши CTRL и STOP, возвращая CY = 1,
	если обе нажаты одновременно. Ее можно использовать,
	когда прерывания запрещены.




4. ИНТЕРФЕЙС ПРИНТЕРА

     В этом разделе сказано, как обеспечить доступ к MSX-принтеру
из программ на ассемблере. Информация, придставленная здесь, при-
годится также, если Вы собираетесь использовать принтер для выво-
да точечной графики.


4.1 Обзор интерфейса принтера

     Интерфейс принтера поддерживается BIOSом и BASICом. MSX  уп-
равляет принтером через 8-битовый параллельный порт со  стробиру-
ющими сигналами STROBE и  BUSY  (Стандартный  коннектор  Amphenol
14-штырьковый, "женский" разъем на ЭВМ). На рисунке 5.20 показаны
линии сигналов:

	Рисунок 5.20 Интерфейс принтера
					    ______
	────────────────────────────	1 - STROBE (строб)
	\   07 06 05 04 03 02 01   /	2...9 - данные (b0-b7)
	 \                        /	11 - BUSY (занято)
	  \ 14 13 12 11 10 09 08 /	14 - BGNG (земля)
	   ─────────────────────

┌───┬───┬───┬───┬───┬───┬───┬───┐
│ x │ x │ x │ x │ x │ x │ x │ x │ Порт ВВ/ВЫВ 91H
└───┴───┴───┴───┴───┴───┴───┴───┘
└──────────── данные ───────────┘
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ x │ Порт ВВ/ВЫВ 90H при записи
└───┴───┴───┴───┴───┴───┴───┴─│─┘ ______
			      └── STROBE (вместе с данными)
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ ∙ │ x │ ∙ │ Порт ВВ/ВЫВ 90H при чтении
└───┴───┴───┴───┴───┴───┴─│─┴───┘
			  └────┬─ 0: принтер готов
			       └─ 1: принтер занят



4.2 Вывод на стандартный MSX-принтер

     Если компьютер посылает данные на принтер, действия  послед-
него зависят от того, является ли  он  стандартным  MSX-принтером
или относится к другой системе. В этом разделе  описан  доступ  к
принтерам MSX, работа с другими разъясняется далее.
     MSX-принтер способен напечатать на бумаге любой из тех  сим-
волов, которые могут быть выведены на экран.  Специальные  графи-
ческие символы, соответствующие кодам n = 01H...1FH,  тоже  могут
быть напечатаны, благодаря подаче кода 40H + n вслед  за  лидиру-
ющим байтом 01H. В дополнение к этому можно использовать управля-
ющие коды, перечисленные в таблице 5.4 (более подробно об  управ-
ляющих кодах см. руководство к принтеру).
     Для перевода строки  необходимо  последовательно  подать  на
принтер коды 0DH и 0AH. Для вывода точечного образа нужно послать
принтеру ESCAPE-последовательность ESC "Snnnn",  где  nnnn  пред-
ставляют десятичное число, равное количеству байтов в изображении
строки. Имейте в виду, что MSX имеет  функцию,  превращающую  код
табуляции (09H) в адекватное количество пробелов (20H), чтобы об-
служивать принтеры, не имеющие кода табуляции. В  обычном  состо-
янии эта функция включена. Чтобы не исказить точечный образ, нуж-
но скорректировать ячейку:

RAWPRT (F418, 1) - 0 = заменять TAB на пробелы, иначе - нет

     Таблица 5.4 Управляющие коды принтера MSX

     0AH - подача строки
     0CH - подача формуляра
     0DH - возврат каретки
     ESC + "A" - нормальный интервал между строками
     ESC + "B" - нулевой интервал (для вывода графики)
     ESC + "Snnnn" - вывод точечного образа


4.3 Доступ к принтеру

     Для вывода на принтер предусмотрены следующие процедуры:

∙ LPOUT (00A5H/MAIN)
вход: A = код
выход: CY = 1, если прервано по CTRL STOP
назначение: посылает символ из регистра A на принтер


∙ LPTSTT (00A8H/MAIN)
вход: ---
выход: A = статус принтера
назначение: проверяет состояние принтера. После вызова  этой
	процедуры регистр A = 255 и  Z  =  0,  если  принтер
	подключен к компьютеру; в противном случае A = 0 и Z
	= 1, и принтер не может быть использован.


∙ OUTDLP (014DH/MAIN)
вход: A = код
выход: CY = 1, если прервано по CTRL STOP
назначение: то же, что LPOUT. Отличия в следующем:
     - печатает адекватное количество пробелов вместо TAB;
     - преобразует хирагану в катакану для не-MSX-принтеров;
     - порождает ошибку Device I/O error, если  ненормальное
завершение работы.
5. УНИВЕРСАЛЬНЫЙ ИНТЕРФЕЙС

     Как было сказано в разделе 1, PSG имеет два 8-битовых  порта
ввода/вывода, A и B, в дополнение к звуковым функциям. На MSX эти
порты подключены к универсальному интерфейсу ввода / вывода (порт
джойстика) и используются для обмена данными с джойстиками и  иг-
ровыми пультами (paddle). Среди подпрограмм BIOS немало процедур,
предусмотренных для подключения к MSX самых разных устройств.


	Рисунок 5.21 Универсальный интерфейс

Разъем 1			Разъем 2
┌─────────────────────┐		┌─────────────────────┐
│ (1) (2) (3) (4) (5)◀┼─ +5V	│ (1) (2) (3) (4) (5)◀┼─ +5V
│   (6) (7) (8) (9)◀──┼─ GND	│   (6) (7) (8) (9)◀──┼─ GND
└──────────▲─│────────┘		└────────────│─▲──────┘
	   │ │	┌────────────────────┐       │ │
	   └─│──┤   переключатель    ├───────│─┘
	     ▼	└─────────┬──────────┘       ▼
	к порту B.b4	  │		к порту B.b5
		к порту A: b0...b5



5.1 Назначение и функции портов

     Порты PSG используются, как показано на рисунке 5.22:

     Рисунок 5.22(A) Функции порта A PSG (R#14)

┌───┬───┬───┬───┬───┬───┬───┬───┐
│ b7│ ∙ │ b5│ b4│ b3│ b2│ b1│ b0│
└─│─┴───┴─│─┴─│─┴─│─┴─│─┴─│─┴─│─┘
ввод      │   │   │   │   │   └ контакт #1
данных    │   │   │   │   └──── контакт #2
с кассеты │   │   │   └──────── контакт #3
	  │   │   └──────────── контакт #4
	  │   └──────────────── контакт #6
	  └──────────────────── контакт #7


     Рисунок 5.22(B) Функции порта B PSG (R#15)

┌───┬───┬───┬───┬───┬───┬───┬───┐
│ b7│ b6│ b5│ b4│		│
└─│─┴─│─┴─│─┴─│─┴───┴───┴───┴───┘
  │   │   │   └ контакт #8 разъема 1
  │   │   └──── контакт #8 разъема 2
  │   └─────┬── 0: биты 0-5 подключены к разъему 1
  │	    └── 1: биты 0-5 подключены к разъему 2
  └─────────┬── 0: лампа CODE включена
	    └── 1: лампа CODE выключена


5.2 Использование джойстика

     На рисунке 5.23 изображена электрическая цепь джойстика (по-
сылая "0" на контакт 8 и опрашивая контакты 1-4 и 6-7, можно  по-
лучить сведения о рукоятке и кнопках). Тем не менее,  лучше  вос-
пользоваться BIOS, чтобы обеспечить переносимость программы.

	Рисунок 5.23 Цепь джойстика

		╲
	(1) °──° °──┐ вперед
		    │
		╲   │
	(2) °──° °──┤ назад
		    │
		╲   │
	(3) °──° °──┤ влево
		    │
		╲   │
	(4) °──° °──┤ вправо
		    │
		╲   │
	(6) °──° °──┤ триггер А
		    │
		╲   │
	(7) °──° °──┤ триггер Б
		    │
	(8) °───────┘


     Следующие процедуры аналогичны функциям STICK и STRIG  языка
BASIC. Наряду с джойстиком, они способны опрашивать клавиши  кур-
сора и пробела.

∙ GTSTCK (00D5H/MAIN) - опрашивает рукоятку
вход: A - номер (0 - клавиши курсора, 1 и 2 - разъемы)
выход: A - направление
назначение: возвращает текущее состояние рукоятки  джойстика  или
клавиш курсора в регистре A. Значение - то же, что  и  у  функции
STICK().

∙ GTTRIG (00D8H/MAIN) - опрашивает кнопки триггеров
вход: A - номер (0 - пробел, 1 и 2 - разъемы)
выход: A - состояние (FFH - нажата, 00H - не нажата)
назначение: аналогична функции STRIG().


5.3 Использование игрового пульта

     На рисунке 5.24 приведена схема игрового пульта paddle.  Им-
пульс, поданный на 8-й контакт разъема, запускает  простой  одно-
вибратор, период которого зависит от  угла  поворота  переменного
резистора и лежит в диапазоне 0.01-3.00 мс. Измерение  длины  им-
пульса позволяет определить угол поворота ручки.

	Рисунок 5.24 Схема игрового пульта
			      ─┬─
			       ├─┐
			      ┌┴┐│
			      │ ├┘ 150 KΩ
			0.04μF└┬┘
			  ┌┤├──┤
	       ┌──┐      ┌┴────┴┐
	(8)────┤  o──────o A   Q├─────(1)  для 2,3,4,6 и 7
	       └──┘      │      │         аналогичная схема
		       ┌─┤ B    │
		       │ │  CLR │ Триггер LS123 или
		       │ └───o──┘ совместимый
	       +5V ────┴─────┘
	    ┌┐
Вход  (8): ─┘└─────────────────────
	    ┌───────────────────┐
Выход (1): ─┘                   └── от 10 μs до 3 ms



∙ GTPDL (00DEH/MAIN) - читает информацию с игрового пульта
вход: A - номер пульта (1...12)
выход: A - угол поворота (0...255)
назначение: проверяет состояние пульта.


5.4 Тач-панель, световое перо, мышь и трекбол (кот)

     Все перечисленные устройства обрабатываются одной и  той  же
процедурой:

∙ GTPAD (00DBH/MAIN) - доступ к различным устройствам
вход: A - идентификатор (0...19)
выход: A - информация
назначение: получает разнообразную информацию от  устройств,
	как показано в таблице  5.5.  Соответствует  функции
	PAD (). "XXX1" обозначает устройство "XXX",  которое
	подключено к разъему 1; "XXX2" обозначает то же,  но
	подключенное к разъему 2.


	Таблица 5.5 Функция BIOS GTPAD
┌────┬────────────┬───────────────────────────────────┐
│ ID │ устройство │	возвращаемая информация	      │
├────┼────────────┼───────────────────────────────────┤
│  0 │		  │ FF = поверхность панели, иначе 00 │
│  1 │ панель 1   │ координата X (0...255)	      │
│  2 │		  │ координата Y (0...255)	      │
│  3 │		  │ FF = кнопка нажата, иначе 00      │
├────┼────────────┼───────────────────────────────────┤
│  4 │		  │				      │
│  5 │ панель 2   │ см. выше			      │
│  6 │		  │				      │
│  7 │		  │				      │
├────┼────────────┼───────────────────────────────────┤
│  8 │		  │ FF = данные верны, иначе 00       │
│  9 │ световое   │ координата X (0...255)	      │
│ 10 │ перо	  │ координата Y (0...255)	      │
│ 11 │		  │ FF = кнопка нажата, иначе 00      │
├────┼────────────┼───────────────────────────────────┤
│ 12 │		  │ FF всегда (запрос)		      │
│ 13 │ мышь 1     │ смещение по X (0...255)	      │
│ 14 │ трекбол 1  │ смещение по Y (0...255)	      │
│ 15 │		  │ не используется		      │
├────┼────────────┼───────────────────────────────────┤
│ 16 │		  │				      │
│ 17 │ мышь 2     │ см. выше			      │
│ 18 │ трекбол 2  │				      │
│ 19 │		  │				      │
└────┴────────────┴───────────────────────────────────┘
     Замечание 1: поскольку вся информация о координатах светово-
го пера (A = 9, 10) и переключателе (A = 11) читается в  тот  мо-
мент, когда BIOS вызывается со значением A = 8, полученные данные
имеют смысл лишь тогда, когда результат равен FFH.  Если  же  ре-
зультат вызова с A = 8 равен 00h, полученные значения координат и
состояние переключателя не имеют смысла.
     Замечание 2: мышь и трекбол различаются автоматически.
     Замечание 3: чтобы получить сведения о мыши и трекболе, нуж-
но сделать запрашивающий вызов (A = 12 или 16), а затем, по  воз-
можности быстрее, - остальные, действительные,  вызовы.  Интервал
между ними должен быть сведен к минимуму. Слишком  большая  пауза
между опросами приведет к искаженной картине.
     Замечание 4: для опроса триггеров мыши и трекбола нужно  ис-
пользовать прцедуру GTTRIG, а не GTPAD.



6. ЧАСЫ И ЭНЕРГОНЕЗАВИСИМАЯ ПАМЯТЬ

     MSX2 использует для отсчета времени энергонезависимые  часы,
которые продолжают работу даже тогда, когда  сам  MSX2  выключен.
Помимо измерения времени, внутри микросхемы часов имеется неболь-
шой объем памяти, приспособленный для хранения пароля и  информа-
ции о режиме экрана.


6.1 Функции микросхемы часов

     Часы имеют три функции:

     ∙ ЧАСЫ-КАЛЕНДАРЬ

     - установка/считывание года, месяца, числа, дня недели,  ча-
сов, минут и секунд;
     - 24-часовой и 12-часовой режимы отсчета времени суток;
     - автоматическое распознание 30 и 31-дневных месяцев;
     - поддержка високосного летоисчисления.

     ∙ АЛАРМ (БУДИЛЬНИК)

     - генерация сигнала при достижении времени аларма;
     - установка времени в виде "день, часы, минуты".

     ∙ ЭНЕРГОНЕЗАВИСИМАЯ ПАМЯТЬ

     - 26 ячеек 4-битовой памяти, батарейное питание;
     - хранение следующей настроечной информации:

     1. значение ширины и высоты экрана CRT;
     2. значения SCREEN, WIDTH и COLOR;
     3. тембр и громкость BEEP;
     4. цвет титульной "заставки";
     5. код экспортной версии компьютера;
     6. пароль или...
     7. подсказка для BASIC или...
     8. титульное сообщение.


6.2 Структура микросхемы часов

     Внутренняя структура часов разбита на четыре блока, как  по-
казано на рисунке 5.25; каждый блок состоит из тринадцати 4-бито-
вых регистров, пронумерованных от #0 до #12. К ним добавлены  еще
три 4-битовых регистра для выбора блока  или  режима  управления,
они имеют номера с #13 по #15.
     Регистры каждого блока (#0...#12) и регистр MODE (#13) могут
и принимать, и возвращать данные. Регистры  TEST  (#14)  и  RESET
(#15) служат только для записи.


	Рисунок 5.25 Структура микросхемы часов

    Блок 0 (часы)   Блок 1 (аларм)  Блок 2 (RAM-1)  Блок 3 (RAM-2)
  ┌──────────────┐┌──────────────┐┌──────────────┐┌──────────────┐
 0│ Секунды (1-й ││		 ││		 ││		 │
  │ десят.разряд)││		 ││		 ││		 │
  ├──────────────┤├──────────────┤├		 ┤├		 ┤
 1│ Секунды (1-й ││		 ││		 ││		 │
  │ десят.разряд)││		 ││		 ││		 │
  ├──────────────┤├──────────────┤├ любые данные ┤├ любые данные ┤
  :		 ::		 ::		 ::		 :
  ├──────────────┤├──────────────┤├		 ┤├		 ┤
12│ Год (второй  ││		 ││		 ││		 │
  │ десят.разряд)││		 ││		 ││		 │
  └──────────────┘└──────────────┘└──────────────┘└──────────────┘
  ├─── 4 бита ───┤├─── 4 бита ───┤├─── 4 бита ───┤├─── 4 бита ───┤
  ┌──────────────┐
13│	MODE	 │
  ├──────────────┤┐
14│	TEST	 ││
  ├──────────────┤├─ только запись
15│	RESET	 ││
  └──────────────┘┘


6.3 Регистр MODE

     Регистр MODE служит для трех целей:

     ∙ Выбор блока

     Чтобы обмениваться данными с регистрами #0-#12, нужно  пред-
варительно указать блок, а затем - собственно регистр. Два  млад-
ших бита MODE служат для выбора блока.
     Регистры #13...#15 остаются доступными в любом случае.

     ∙ Включение/выключение аларма

     Для управления алармом используют бит 2 регистра MODE.  Пос-
кольку стандартный MSX2 не поддерживает  аларм,  изменение  этого
бита обычно ни к чему не приводит.

     ∙ Завершение отсчета времени

     Запись 0 в бит 3 регистра MODE прекращает отсчет секунд. За-
пись 1 возобновляет ход.

	Рисунок 5.26 Функции регистра MODE (#13)

	┌───┬───┬───┬───┐ ┌ 00: выбрать блок 0
	│ TE│ AE│ M1│ M0│ ├ 01: выбрать блок 1
	└─│─┴─│─┴─│─┴─│─┘ ├ 02: выбрать блок 2
	  │   │   └───┴───┴ 03: выбрать блок 3
	  │   │
	  │   └───────────┬ 0: запретить аларм
	  │		  └ 1: разрешить аларм
	  │
	  └───────────────┬ 0: остановить секунды
			  └ 1: возобновить

6.4 Регистр TEST

     Регистр #14 TEST предназначен для быстрого увеличения  стар-
ших разрядов времени. Установка 1 в битах регистра вызывает пода-
чу импульсов f = 16384 Hz на соответствующие счетчики.

	Рисунок 5.27 Функции регистра TEST (#14)

	┌───┬───┬───┬───┐
	│ T3│ T2│ T1│ T0│
	└─│─┴─│─┴─│─┴─│─┘
        день час мин сек ---- положение импульса



6.5 Регистр RESET

     Регистр #15 RESET выполняет следующие функции:

     ∙ Сброс аларма

     Запись "1" в бит 0 вызывает сброс всех регистров аларма

     ∙ Установка секунд

     Запись 1 в бит 1 вызывает сброс секунд, что удобно при  нас-
тройке точного времени.

     ∙ Вывод тактирующих импульсов

     Запись "0" в бит 2 включает тактирующий сигнал 16 Hz.
     Запись "0" в бит 3 включает тактирующий сигнал 1 Hz.
     Оба не поддерживаются MSX2.


	Рисунок 5.28 Функции регистра RESET (#15)

	┌───┬───┬───┬───┐
	│ C1│C16│ CR│ AR│
	└─│─┴─│─┴─│─┴─│─┘
	  │   │   │   └─ если 1, сброс регистров аларма
	  │   │   └───── если 1, сброс долей секунд
	  │   └───────── если 0, тактирование 16 Hz
	  └───────────── если 0, тактирование 1 Hz



6.6 Установка времени и аларма

     ∙ Настройка даты и времени

     Блок 0 используется для управления часами. Обращение  к  его
регистрам позволяет установить часы и  календарь.  Текущее  время
можно определить, прочитав значение этих регистров.
     Блок 1 предназначен для установки аларма. Помните, что  ука-
зывается только день, часы и минуты.
     Год представляется в виде двух знаков (регистры #11 и  #12).
MSX-BASIC добавляет к значению года число 80, чтобы получить  ди-
апазон 1980...2079.
     День недели представлен числом от 0 до 6. Пересчетом  в  дни
недели занимается счетчик по mod 7, который обновляется в  момент
смены даты, поэтому соответствие между числом 0...6 и  конкретным
днем недели не определено.


	Рисунок 5.29 Установка времени и аларма

	Блок 0: ВРЕМЯ

	00: секунды (1-й десятичный разряд):	x x x x
	01: секунды (2-й десятичный разряд):	0 x x x
	02: минуты  (1-й десятичный разряд):	x x x x
	03: минуты  (2-й десятичный разряд):	0 x x x
	04: часы    (1-й десятичный разряд):	x x x x
	05: часы    (2-й десятичный разряд):	0 0 x x
	06: день недели:			0 x x x
	07: день    (1-й десятичный разряд):	x x x x
	08: день    (2-й десятичный разряд):	0 0 x x
	09: месяц   (1-й десятичный разряд):	x x x x
	10: месяц   (2-й десятичный разряд):	0 0 0 x
	11: год     (1-й десятичный разряд):	x x x x
	12: год     (2-й десятичный разряд):	x x x x

	Блок 1: АЛАРМ

	02: минуты  (1-й десятичный разряд):	x x x x
	03: минуты  (2-й десятичный разряд):	0 x x x
	04: часы    (1-й десятичный разряд):	x x x x
	05: часы    (2-й десятичный разряд):	0 0 x x
	06: день недели:			0 x x x
	07: день    (1-й десятичный разряд):	x x x x
	08: день    (2-й десятичный разряд):	0 0 x x
	10: 12- или 24-часовой цикл:		0 0 0 x
	11: счетчик високосного года:		0 0 x x


     ∙ Выбор 12-часового и 24-часового отсчета

     Можно выбрать один из двух режимов представления часов: один
(24-часовой) рассматривает полдень как 13 часов, другой (12-часо-
вой) - как 1 p.m.
     Регистр #10 блока 1 используется для выбора режима. Как  по-
казано на рисунке 5.30, 12-часовой отсчет выбирается путем  уста-
новки бита B0 в "0", а 24-часовой - в "1".
     Если был выбран 12-часовой режим, бит B1 регистра #5 блока 0
(разряд "десятки часов") различает первую и вторую половину  дня,
как изображено на рисунке 5.31.

	Рисунок 5.30 Выбор 12- или 24-часового цикла

	┌───┬───┬───┬───┐
	│ ∙ │ ∙ │ ∙ │ B0│ R#10 блок 1
	└───┴───┴───┴─│─┘ ┌ 0: 12.00
		      └───┴ 1: 24.00

	Рисунок 5.31 Флаг УТРО/ВЕЧЕР

	┌───┬───┬───┬───┐
	│ ∙ │ ∙ │ B1│ x │ R#5 блок 0
	└───┴───┴─│─┴───┘ ┌ 0: до полудня
		  └───────┴ 1: после полудня


     ∙ Счетчик високосного года

     Регистр #11 блока 1 работает как счетчик mod 4, который  об-
новляется вместе с изменением года. Когда оба младших бита регис-
тра устанавливаются в 00H, это  рассматривается  как  наступление
високосного года (в феврале учитываются 29 сут).
     При установке этого счетчика BASIC использует остаток от де-
ления года на 4. Например, год 1980 - високосный.

	Рисунок 5.32 Определение високосного года

	┌───┬───┬───┬───┐
	│ ∙ │ ∙ │ B1│ B0│ R#11 блок 1
	└───┴───┴─│─┴─│─┘
		  └───┴── 00: високосный



6.7 Содержание энергонезависимой памяти

     Блоки 2 и 3 задействованы как память из 26 полубайтовых яче-
ек. MSX2 использует это пространство следующим образом:


	Рисунок 5.33 Содержание блока 2

	00: Идентификатор:		x x x x
	01: Смещение экрана по X:	x x x x
	02: Смещение экрана по Y:	x x x x
	03:				- - x x
			INTERLACE: ─────────┘ │
			SCREEN: ──────────────┘
	04: WIDTH (младший байт):	x x x x
	05: WIDTH (старший байт):	x x x x
	06: Цвет переднего плана:	x x x x
	07: Цвет заднего плана:		x x x x
	08: Цвет рамки экрана:		x x x x
	09:				x x x x
		Скорость обмена: ───────┘ │ │ │
		Режим принтера: ──────────┘ │ │
		Звук клавиши: ──────────────┘ │
		Показ клавиш F1-F10: ─────────┘
	10:				x x x x
			Тембр BEEP: ────┴─┘ │ │
			Громкость: ─────────┴─┘
	11: Цвет заставки:		- - x x
	12: Код экспортного исполнения:	x x x x



	Рисунок 5.34 Содержание блока 3
	(зависит от значения идентификатора ID)

Выводит титульное сообщение:

	00: ID = 0
	01: младш. ┐
	02: старш. ┴─ первый символ сообщения
	::	:
	11: младш. ┐
	12: старш. ┴─ шестой символ сообщения

Устанавливает пароль

	00: ID = 1
	01: использование ID=1
	02: использование ID=2
	03: использование ID=3
	04: ┐
	::  ├─ пароль в сжатом виде (4 x 4 бита)
	07: ┘
	08: флаг key_catridge
	09: ┐
	::  ├─ значение key_catridge
	12: ┘

Устанавливает подсказку-приглашение BASICа

	00: ID = 2
	01: младш. ┐
	02: старш. ┴─ первый символ
	::	:
	11: младш. ┐
	12: старш. ┴─ шестой символ



6.8 Доступ к микросхеме часов

     Следующие процедуры BIOS предназначены для доступа к часам и
энергонезависимой памяти. Поскольку эти процедуры располагаются в
SUB-ROM, их вызывают с помощью интерслотовых процедур.

∙ REDCLK (01F5H/SUB) - чтение
вход: C - адрес (см. рисунок 5.35)
выход: A - данные (верны 4 младших бита)
назначение: процедура избавляет от необходимости  отдельно  уста-
	навливать регистр MODE и объектный регистр.

     Рисунок 5.35 Способ спецификации регистра часов

	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│ ∙ │ ∙ │ M1│ M0│ A3│ A2│ A1│ A0│ Регистр C
	└───┴───┴───┴───┴───┴───┴───┴───┘
                └─ блок─┘└─── регистр ──┘


∙ WRTCLK (01F9H/SUB) - запись
вход: C - адрес (см. рисунок 5.35)
	A - данные (верны 4 младших бита)
выход: ---


     Листинг 5.10 представляет пример их использования.
; =========================================================
;	Установка подсказки BASICа
; =========================================================
WRTCLK	EQU	1F9H
EXTROM	EQU	15FH

	ORG	0B000H

START:	LD	C,00110000B	; адрес (блок 2/регистр 0)
	LD	A,2		; идентификатор ID := 2
	CALL	WRTRAM

	LD	B,6		; счетчик цикла
	LD	HL,STRING	; строка
L01:	LD	A,(HL)		; читать очередной символ
	AND	0FH		; младшие 4 бита (HL)
	INC	C		; увеличить адрес
	CALL	WRTRAM		; записать в RAM
	LD	A,(HL)
	RRCA
	RRCA
	RRCA
	RRCA
	AND	0FH		; старшие 4 бита (HL)
	INC	C		; увеличить адрес
	CALL	WRTRAM
	INC	HL
	DJNZ	L01
	RET

WRTRAM:	PUSH	HL
	PUSH	BC
	LD	IX,WRTCLK
	CALL	EXTROM		; межслотовый вызов
	POP	BC
	POP	HL
	RET

STRING:	DB	'READY?'
	END
7. СЛОТЫ И КАТРИДЖИ

     Микропроцессор Z80, использованный в MSX, способен  работать
в адресном пространстве 64 Килобайта  (0000h-FFFFh),  однако  MSX
устроен таким образом, что обеспечивает эффективный доступ к 1 М.
Это возможно, благодаря использованию "слотов", которые позволяют
разместить по одному и тому же адресу более, чем одну ячейку  па-
мяти (или внешнее устройство).
     Эта глава знакомит с использованием слотов и другой информа-
цией, необходимой для разработки катриджей и  внешних  устройств,
подключаемых к слотам.


7.1 Слоты

     Слот - это интерфейс для эффективного использования большого
адресного пространства и адресации устройств, подключенных  через
слоты. BASIC-ROM или RAM тоже не являются исключением. Разъем,  к
которому подключаются катриджи - это тоже один из слотов.


7.1.1 Основной слот и расширяющий слот

     Слот может быть основным или расширенным. Основной слот под-
ключен непосредственно к адресной шине Z80. Стандартная MSX-маши-
на имеет до 4-х основных слотов. Основной слот  можно  расширить,
подключив расширительную коробку (в ряде случаев такое расширение
уже выполнено "внутри" машины), тогда этот слот называется  "рас-
ширенным". Если каждый слот расширен до 4-х "расширяющих" слотов,
полное количество слотов достигает 16-ти. Если Вы умножите 16  на
64 К, то получите тот самый доступный 1 Мегабайт.

     Имейте в виду, что система не поддерживает "расширение  рас-
ширяющих" слотов.  Подключение  расширительной  коробки  возможно
лишь к основному слоту, но в некоторых ситуациях разъем для  кат-
риджей располагается в расширяющем слоте.

	Рисунок 5.36 Основной и расширяющий слот

		     ┌─────┐
		     │ CPU │
		     └──┬──┘
	   ┌────────────┘
	┌──▼──┐  ┌──┴──┐  ┌──┴──┐  ┌──┴──┐
основной│  0  │  │  1  │  │  2  │  │  3  │
	└─────┘  └──┬──┘  └─────┘  └─────┘
	   ┌────────┘
	┌──▼──┐┌──┴──┐┌──┴──┐┌──┴──┐
	│ 1-0 ││ 1-1 ││ 1-2 ││ 1-3 │
	└─────┘└─────┘└─────┘└─────┘

     Каждый слот содержит 64 K адресного пространства, и MSX  уп-
равляет им, деля его на 4 "страницы" по  16  К.  Процессор  может
выбрать отдельный слот для каждой страницы, и,  как  показано  на
рисунке 5.37, существует возможность сочетания фрагментов из раз-
ных слотов. Помните только,  что  страницы  не  меняются  местами
(страница, которая имеет номер n в слоте, имеет тот же номер n  и
для Z80).

	Рисунок 5.37 Пример выбора страниц

	   ┌───┐┌───┐┌───┐┌───┐		┌───┐
страница 0 │ A ││ E ││ I ││ M │	----▶	│ A │
	   ├───┤├───┤├───┤├───┤		├───┤
страница 1 │ B ││ F ││ J ││ N │	----▶	│ J │
	   ├───┤├───┤├───┤├───┤		├───┤
страница 2 │ C ││ G ││ K ││ O │	----▶	│ G │
	   ├───┤├───┤├───┤├───┤		├───┤
страница 3 │ D ││ H ││ L ││ P │	----▶	│ H │
	   └───┘└───┘└───┘└───┘		└───┘
	слот 0	  1    2    3	       адресное
				   пространство Z80


7.1.2 Переключение слотов

     Переключение основных и расширяющих слотов различается.  Для
основных оно выполняется через порт A8H (см. рис.  5.38),  а  для
расширяющих - через "регистр выбора вторичного слота" FFFFH  (см.
рис. 5.39). Прямое обращение к этим регистрам  не  рекомендуется,
так как оно требует тщательного планирования, во  избежание  неп-
редсказуемых последствий (например,  чтобы  не  отключить  вообще
слот, в котором находится сама программа). Для вызова  программы,
расположенной в другом слоте, лучше всего использовать  межслото-
вые процедуры, которые описаны в следующем разделе.


     Рисунок 5.38 Переключение основного слота

	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│	│	│	│	│ Порт A8H
	└───┴───┴───┴───┴───┴───┴───┴───┘
	  └─┬─┘   └─┬─┘   └─┬─┘	  └───┴─ слот для страницы 0
	    │	    │	    └─────────── слот для страницы 1
	    │	    └─────────────────── слот для страницы 2
	    └─────────────────────────── слот для страницы 3


     Рисунок 5.39 Переключение расширяющего слота

	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│	│	│	│	│ Регистр FFFFH
	└───┴───┴───┴───┴───┴───┴───┴───┘
	  └─┬─┘   └─┬─┘   └─┬─┘	  └───┴─ слот для страницы 0
	    │	    │	    └─────────── слот для страницы 1
	    │	    └─────────────────── слот для страницы 2
	    └─────────────────────────── слот для страницы 3

Примечание: При чтении значение возвращается в инверсном виде.


     Слот, в который встроены MAIN-ROM и RAM, а также номера сло-
тов для катриджей зависят от конкретной машины. Сведения  о  том,
как использованы слоты на Вашем MSX, можно получить в руководстве
по эксплуатации. Однако стандарт MSX гарантирует нормальное  фун-
кционирование независимо от занятости слотов,  так  что  Вам  нет
нужды беспокоиться об этом (ровно настолько, насколько Вы  следу-
ете требованиям стандарта).

     Следует сказать, что в ряде случаев все же необходимо  знать
номер слота, в котором располагается та или иная программа.  Нап-
ример, MAIN-ROM в прежних версиях размещалась в основном слоте #0
или расширенном #0-0. Теперь, когда MSX1 расширен до возможностей
MSX2 путем установки MSX-VIDEO и BASICа ver 2.0 ROM, SUB-ROM дол-
жна располагаться в каком-то другом слоте. Слот, в котором  нахо-
дится SUB-ROM, зависит от конкретной машины, однако эта  информа-
ция всегда может быть получена из рабочей области, которая описа-
на ниже (слотовая информация представлена в  формате,  показанном
на рисунке 5.40. Вызывая BIOS из DOS,  проверяйте  слот  MAIN-ROM
таким же образом).

     Рисунок 5.40 Формат для слота

EXPTBL (FCC1H, 1)	слот MAIN-ROM
EXBRSA (FAF8H, 1)	слот SUB-ROM (на MSX1 равен 0)

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│   │		│	│	│
	└─│─┴───┴───┴───┴─│─┴─│─┴─│─┴─│─┘
	  │		  └─┬─┘	  └───┴─ первичный слот (0...3)
	  │		    └─────────── вторичный слот (0...3)
	  └───────────────────────────── 1, если расширенный

     Если процедура располагается в страницах 1, 2 (4000H-7FFFH),
и внутри нее выполняется переход со страницы на страницу, то  для
второй страницы следует выбрать то же слот,  что  и  для  первой.
Чтобы сделать это, нужно узнать слот страницы 1, а затем включить
его же для страницы 2. Для получения информации о  слоте,  где  в
данный момент  находится  Ваша  процедура,  выполните  программу,
представленную ниже:


     Листинг 5.11 Программа, позволяющая узнать текущий слот
; ==========================================================
; Предположим, что Ваш катридж с программой занимает 32 К
; (4000H...BFFFH). Вы разместили идентификатор ID по адресу
; 4000H...4001H, а стартовый адрес программы - в странице 1.
; MSX передает управление именно в эту страницу, так что
; вторая половина катриджа еще не подключена. Вы должны
; узнать, где Вы находитесь (в каком первичном и вторичном
; слоте) и подключить вторую часть катриджа к адресному
; пространству. Ниже дан пример, как это сделать.
; ==========================================================
ENASLT	EQU	24H	; разрешить слот
RSLREG	EQU	138H	; читать первичный слот
EXPTBL	EQU	0FCC1H	; таблица расширений слотов

ENAP2:			; разрешить страницу 2
	CALL	RSLREG	; прочитать регистр первичного слота
	RRCA
	RRCA
	AND	00000011B
	LD	C,A
	LD	B,0
	LD	HL,EXPTBL	; узнать в таблице, расширен
	ADD	HL,BC		; ли слот ?
	LD	C,A
	LD	A,(HL)
	AND	80H
	OR	C		; установить старший бит
	LD	C,A
	INC	HL
	INC	HL
	INC	HL
	INC	HL
	LD	A,(HL)		; узнать вторичный слот
	AND	00001100B
	OR	C		; окончательно сформировать
				; адрес слота
	LD	H,80H		; страница 2
	JP	ENASLT		; подключить

	END




7.2 Межслотовые вызовы

     Как было описано выше, иногда может понадобиться вызов прог-
раммы, которая не расположена в  текущем  слоте.  Наиболее  общие
случаи таких вызовов перечислены ниже:

     (1) вызов BIOS в MAIN-ROM на уровне MSX-DOS
     (2) вызов BIOS в SUB-ROM на уровне BASIC (только MSX2)
     (3) вызов BIOS в MAIN-ROM и SUB-ROM из катриджа

     Для аккуратного выполнения этих вызовов предусмотрена группа
подпрограмм BIOS, называемых "межслотовыми вызовами", которые мо-
гут вызываться из любой процедуры в любом слоте. В  этом  разделе
описано использование межслотовых вызовов.


7.2.1 Операции межслотового вызова

     Когда BIOS вызывается из MSX-DOS, состояние слотов изменяет-
ся, как описано ниже.

     (1) Поскольку в режиме MSX-DOS для всех 64 K адресного прос-
транства выбрана RAM, BASIC-ROM недоступен в этом состоянии  (см.
рис. 5.41-a).
     (2) Чтобы вызвать BIOS из ROM, выберите MAIN-ROM для страни-
цы 0. Затем вызовите BIOS (см. рис. 5.41-b).
     (3) Восстановите исходное состояние после выполнения  опера-
ции BIOS и вернитесь в исходную точку.


     Рисунок 5.41 Межслотовый вызов


а) режим MSX-DOS:		б) вызов BASIC-ROM

	MSX-DOS  BASIC-ROM
	   ┌───┐┌───┐		┌───┐┌───┐
страница 0 │RAM││ROM│		│ROM││RAM│
	   ├───┤├───┤		├───┤├───┤
страница 1 │RAM││ROM│		│ROM││RAM│
	   ├───┤├───┤		├───┤├───┤
страница 2 │RAM││ - │		│RAM││ - │
	   ├───┤├───┤		├───┤├───┤
страница 3 │RAM││ - │		│RAM││ - │
	   └───┘└───┘		└───┘└───┘
	слот 3	  0	     слот 3    0

     Если программа расположена в странице, отличной от  0,  опи-
санная процедура выполняется очень легко, однако проблемы  возни-
кают сразу же, как только дело касается страницы  0.  Нужно  быть
очень осторожным, чтобы не допустить полного отключения самой вы-
зывающей программы и порождения в связи  с  этим  непредсказуемых
результатов. Проблема устраняется с помощью временного перехода к
третьей странице, откуда и производится переключение слотов.


7.2.2 Использование межслотовых вызовов

     Существует несколько способов использования межслотовых  вы-
зовов; все они входят в состав MAIN-ROM как вызовы BIOS.  Некото-
рые из них доступны и из MSX-DOS, так что межслотовые вызовы  мо-
гут выполняться из DOS.

     (1) Межслотовые процедуры в BIOS

∙ RDSLT (000CH/MAIN) - читает значение по указанному адресу
			указанного слота
вход:		A - спецификация слота
		HL - адрес чтения
выход:		A - прочитанное значение
использует:	AF, BC, DE
функция:	читает значение по указанному адресу заданного
		слота сохраняет его в регистре A. Спецификация
		слота выполняется через регистр A в формате,
		показанном на рисунке 5.40. То есть, если слот
		является основным, установите 6 старших битов
		в "0" и задайте слот, используя 2 младших бита
		регистра А. Если указанный слот - расширенный,
		задайте основной слот в битах 0 и 1, и расши-
		ряющий слот в битах 2 и 3, и установите бит 7
		в "1".

∙ WRSLT (0014H/MAIN) - записывает значение по указанному
			адресу указанного слота
вход:		A - спецификация слота (рис. 5.40)
		HL - адрес записи
		E - данные для записи
выход:		---
использует:	AF, BC, DE
функция:	записывает значение регистра E по адресу,
		указанному в регистре HL в слот, заданный
		в регистре A (формат спецификации то же, что
		и на рисунке 5.40)

∙ CALSLT (001CH/MAIN) - вызывает указанный адрес указанного слота
вход:		8 старших битов регистра IY - слот (рис. 5.40)
		IX - адрес вызова
выход:		зависит от результатов вызываемой программы
использует:	зависит от результатов вызываемой программы
функция:	вызывает процедуру по адресу, указанному в регистре
		IX из слота, заданного в старшем байте регистра IY
		(формат спецификации тот же, что и на рис.5.40)

∙ ENASLT (0024H/MAIN) - включает слоты
вход:		A - слот (рис. 5.40)
		HL - два старших бита - номер страницы
выход:		---
использует:	все
функция:	включает слот, заданный	регистром A, в странице,
		указанной в двух старших битах регистра HL

∙ CALLF (0030H/MAIN) - вызывает указанный адрес указанного слота
вход:		слот и адрес указываются в виде параметров
		"командной" строки
выход:		зависит от результатов вызываемой программы
использует:	зависит от результатов вызываемой программы
функция:	отличается от описанной выше процедуры CALSLT тем,
		что слот и адрес указываются в виде параметров,
		как показано ниже. Параметр, задающий слот в том
		же формате, что и RDSLT, располагается сразу
		вслед за инструкцией, которая вызывает CALLF, а
		за ним следуют еще два байта адреса. "CALL 0030H"
		можно заменить инструкцией RST (рестарт). В этом
		случае для межслотового вызова достаточно 4 байт.


	Рисунок 5.42 Пример межслотового вызова

	RST	30H		; межслотовый вызов
	DB	00000000B	; выбрать слот #0
	DW	006CH		; адрес вызова = 006CH



∙ RSLREG (0138H/MAIN) - читает из регистра основного слота
вход:		---
выход:		A - прочитанное значение
использует:	---
функция:	читает значение из регистра выбора основного
		слота и сохраняет в регистре A.

∙ WSLREG (013BH/MAIN) - записывает в регист основного слота
вход:		A - значение для записи
выход:		---
использует:	---
функция:	записывает в регистр выбора основного слота
		значение из регистра А и включает слот

∙ SUBROM (015CH/MAIN) - вызывает BIOS из SUB-ROM
вход:		IX - адрес вызова, PUSH IX (см. стр. 352)
выход:		зависит от результатов вызванной программы
использует:	фоновые регистры и IX, IY резервируются
функция:	эта процедура предназначена специально для
		вызова SUB-ROM. Слот, в котором расположена
		SUB-ROM, устанавливается автоматически.
		Обычно вместо SUBROM используется EXTROM.

∙ EXTROM (015FH/MAIN) - вызывает BIOS из SUB-ROM
вход:		IX - адрес вызова
выход:		зависит от результатов вызванной программы
использует:	фоновые регистры и IX, IY резервируются
функция:	эта процедура предназначена для вызова
		SUB-ROM. Различие между EXTROM и SUBROM
		заключается в сохранении регистра IX в стеке


     (2) Межслотовые процедуры в MSX-DOS

     В MSX-DOS доступны пять видов межслотовых вызовов, и их  ад-
реса определяются как вектора MSX-DOS. Вызовы - те же самые,  что
и в BIOS, поэтому их описание  соответствует  приведенному  выше.
Имейте, однако, в виду, что с их помощью не следует вызывать про-
цедуры SUB-ROM.

	∙ RDSLT
	∙ WRSLT
	∙ CALSLT
	∙ ENASLT
	∙ CALLF

     Листинг 5.12 Вызов BIOS из MSX-DOS
; =================================================
;	Как правильно вызывать BIOS из MSX-DOS
; =================================================
CALSLT	EQU	1CH		; межслотовый вызов
EXBRSA	EQU	0FAF8H		; адрес SUB-ROM
EXPTBL	EQU	0FCC1H		; адрес MAIN-ROM

INITXT	EQU	6CH
LINL40	EQU	0F3AEH

TOTEXT:	LD	B,40
	LD	A,(EXBRSA)	; MSX2 ?
	OR	A		; 0, если MSX1
	JR	Z,TO40
	LD	B,80

TO40:	LD	A,B
	LD	(LINL40),A	; ширина экрана

	LD	IX,INITXT	; вкл. текстовый режим
	LD	IY,(EXPTBL-1)
	CALL	CALSLT
	EI		; так как CALSLT выполнил DI
	RET



7.2.3 Рабочие области для получения состояния слотов

     Предыдущие процедуры использовали следующие рабочие области:

∙ EXBRSA (FAF8H, 1) - слот SUB-ROM

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│   │		│	│	│
	└─│─┴───┴───┴───┴─│─┴─│─┴─│─┴─│─┘
	  │		  └─┬─┘	  └───┴─ первичный слот (0...3)
	  │		    └─────────── вторичный слот (0...3)
	  └───────────────────────────── 1, если расширенный

∙ EXPTBL (FCC1H, 4) - расширен ли слот или нет ?

	  7   6   5   4   3   2   1   0
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│   │		│	│	│ Слот MAIN-ROM
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│   │				│ Слот #1
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│   │				│ Слот #2
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│   │				│ Слот #3
	└─▲─┴───┴───┴───┴───┴───┴───┴───┘
	  └───────────────────────────── 1, если расширен

∙ SLTTBL (FCC5H, 4) - зарезервированное пространство для
			регистров расширенных слотов

	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│	│	│	│	│ слот #0 (основной)
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│	│	│	│	│ слот #1 (основной)
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│	│	│	│	│ слот #2 (основной)
	└───┴───┴───┴───┴───┴───┴───┴───┘
	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│	│	│	│	│ слот #3 (основной)
	└───┴───┴───┴───┴───┴───┴───┴───┘
	  └─┬─┘   └─┬─┘   └─┬─┘	  └───┴─ слот для страницы 0
	    │	    │	    └─────────── слот для страницы 1
	    │	    └─────────────────── слот для страницы 2
	    └─────────────────────────── слот для страницы 3


∙ SLTATR (FCC9H, 64) - информация о тестировании оборудования
			в каждом слоте/странице

	┌───┬───┬───┬───┬───┬───┬───┬───┐
	│   │	│   │			│ слот #0-0, стр.0
	├───┼───┼───┼───┼───┼───┼───┼───┤
	│   │	│   │			│ слот #0-0, стр.1
	├───┴───┴───┴───┴───┴───┴───┴───┤
	:				:
	├───┬───┬───┬───┬───┬───┬───┬───┤
	│   │	│   │			│ слот #3-3, стр.3
	└─│─┴─│─┴─│─┴───┴───┴───┴───┴───┘
	  │   │	  └─────────── расширение оператора CALL
	  │   └─────────────── расширение внешнего устройства
	  └─────────────────── текст BASIC-программы


∙ SLTWRK (FD09H, 128) - рабочая область для оборудования (два
			байта на каждую страницу каждого слота)


7.3 Разработка катриджей

     Обычно машины MSX имеют, по крайней мере, один внешний слот,
и устройства, которые  подключаются  к  этому  слоту,  называются
"катриджами". Примерами катриджей могут быть: ROM для  прикладных
программ или игр, устройства ввода/вывода (дисковод или интерфейс
RS-232C), RAM для расширения памяти, расширительные  коробки  для
усложнения слотовой структуры. Все эти катриджи облегчают  совер-
шенствование MSX. ROM могут содержать программы  как  на  BASICе,
так и на ассемблере. Этот раздел поможет Вам в  разработке  прог-
раммного обеспечения для катриджей.



7.3.1 Заголовок катриджа

     MSX-катриджи имеют общий 16-байтовый заголовок; запуск  кат-
риджа производится на основе информации, указанной в  этом  заго-
ловке. Программы на ассемблере или BASICе могут стартовать  авто-
матически, благодаря информации, содержащейся в заголовке. На ри-
сунке 5.48 представлена конфигурация заголовка для катриджа:


	Рисунок 5.48 Заголовок катриджа

		┌───────────┐ 4000H или 8000H
	+0000H	│     ID    │
		├───────────┤
	+0002H	│    INT    │
		├───────────┤
	+0004H	│ STATEMENT │
		├───────────┤
	+0006H	│   DEVICE  │
		├───────────┤
	+0008H	│    TEXT   │
		├───────────┤
	+000AH	│   резерв  │ Резервная область должна
		│	    │ быть заполнена нулями (00H)
	+0010H	├───────────┤


     ∙ ID
     Для ROM-катриджа, эти два байта имеют коды "AB" (41H,  42H).
Для SUBROM-катриджей идентификатор равен "CD".

     ∙ INIT
     Если катридж выполняет  инициализацию  рабочей  области  или
ввода/вывода, то эти два байта задают адрес процедуры инициализа-
ции; в противном случае им присваивается нулевое значение.  Прог-
рамма инициализации должна  заканчиваться  "RET"  (все  регистры,
кроме SP, могут быть модифицированы). Такие программы, как  игры,
основной рабочий цикл которых находится "внутри ROM",  могут  за-
пускаться именно отсюда.

     ∙ STATEMENT
     Если катридж предназначен для расширения возможностей опера-
тора CALL, эти байты должны содержать адрес процедуры расширения;
в противном случае им присваивается значение 0. Процедура  расши-
рения должна располагаться где-то между 4000H и 7FFFH.
     Оператор CALL имеет следующий формат:

     CALL имя_процедуры [(<аргумент>[,<аргумент>...])]

     Имя_процедуры может иметь до 15 знаков. CALL допускает  сок-
ращение "_" (подчеркивание).

     Когда BASIC-интерпретатор обнаруживает оператор CALL, он по-
мещает имя_процедуры в PROCNM (FD89H, 16) и  передает  управление
катриджам, которые содержат в STATEMENT ненулевой адрес,  начиная
со слота с меньшим номером. При этом регистр HL  указывает  адрес
сразу вслед за именем процедуры (см. рис. 5.49a).

	Рисунок 5.49 Вызов расширения оператора CALL

Состояние интерпретатора при обнаружении оператора CALL:

CALL ABCDE(0,0,0):A=0		CY = 1		конец имени
	  ^HL			┌───┬───┬───┬───┬───┬─▼─┐
			  PROCNM│ A │ B │ C │ D │ E │ 0 │
				└───┴───┴───┴───┴───┴───┘
Оператор не был обработан:

CALL ABCDE(0,0,0):A=0		CY = 1
	  ^HL

Оператор был обработан:

CALL ABCDE(0,0,0):A=0		CY = 0
	  	 ^HL


     Прежде всего, нужно распознать имя процедуры, которое содер-
жится в PROCNM, и возвратить флаг carry = 1, не  меняя  положения
HL, если  катридж  не  поддерживает  данный  оператор  (см.  рис.
5.49b); в противном случае обработайте  оператор  соответствующим
образом, после чего установите указатель HL на следующий исполня-
емый код (обычно это 00H или 3AH) и сбросьте в "0" бит carry (см.
рис. 5.49c).

     По окончании обработки оператора CALL интерпретатор проверя-
ет состояние флага carry и, если он = 1, вызывает следующий  кат-
ридж. Если ни один из катриджей не поддерживает  данный  оператор
(флаг carry был установлен все время), интерпретатор демонстриру-
ет "SYNTAX ERROR". Для получения аргументов  удобно  пользоваться
"внутренними процедурами  расширения  операторов",  которые  были
описаны в разделе 4.4 главы 2.



     ∙ DEVICE
     Эти два байта задают адрес процедуры расширения внешних  ус-
тройств,  если  катридж  предназначен  для   расширения   функций
ввода/вывода; в противном случае эти байты содержат 0000H. Проце-
дура расширения должна находиться между адресами 4000H  и  7FFFH.
Один катридж может подключать до 4 устройств. Имя устройства дол-
жно иметь не более 15 символов.

     Когда BASIC-интерпретатор встречает неизвестное имя, он сох-
раняет его в PROCNM (FD89H, 16), помещает FFH в регистр A и пере-
дает управление катриджам, которые содержат  в  DEVICE  ненулевое
значение (по порядку, начиная со слота с меньшим номером).

     Процедура расширения должна, прежде всего,  распознать  дес-
криптор файла в PROCNM и, если катридж не поддерживает данное ус-
тройство, вернуть управление с битом carry = 1. В противном  слу-
чае, нужно обработать вызов и установить в регистре A идентифика-
тор устройства (0-3), после чего сбросить carry.

     Интерпретатор по состоянию бита carry  определяет,  было  ли
обработано данное устройство и, если нет, вызывает следующий кат-
ридж. Если ни один из катриджей не выполнил обработку файла, выс-
вечивается "Bad file name ERROR".

	Рисунок 5.50 Доступ к расширенному устройству

Состояние интерпретатора при обнаружении оператора OPEN:

OPEN "ABC:"...		A = FF, CY = 1	  конец имени
				┌───┬───┬───┬─▼─┐
			  PROCNM│ A │ B │ C │ 0 │
				└───┴───┴───┴───┘

Устройство не было обработано:	CY = 1

Устройстов обработано:		CY = 0 и A = ID (0...3)

     Когда выполняется фактическая операция ввода/вывода,  интер-
претатор устанавливает идентификатор устройства  (0-3)  в  DEVICE
(FD99H) и помещает в аккумулятор запрос (см. таблицу 5.6), а  за-
тем вызывает процедуру расширения  устройства.  Процедура  должна
адекватно обработать запрос.

     Таблица 5.6 Запросы устройства

	Регистр А	Запрос

	0		OPEN
	2		CLOSE
	4		произвольный доступ
	6		последовательный вывод
	8		последовательный ввод
	10		функция LOC
	12		функция LOF
	14		функция EOF
	16		функция FPOS
	18		резервный символ


     ∙ TEXT
     Эти байты играют роль текстового указателя на BASIC-програм-
му (если она должна запускаться автоматически при рестарте систе-
мы), иначе они должны содержать 0000H. Размер программы не должен
превосходить 16 K (8000H-BFFFH).
     Интерпретатор опрашивает содержимое TEXT; если  значение  не
равно 0, он начинает выполнение программы от заданного  положения
текстового указателя. Программа должна сохраняться в  промежуточ-
ном коде, и в ее начале должен стоять байт 00H, который  отмечает
начало BASIC-программы вообще.
     Скорость работы программы может быть увеличена, если в  опе-
раторах типа GOTO задать абсолютные адреса вместо номеров строк.

     Рисунок 5.51 Размещение BASIC-программы

	┌───────────────┐ 8000H
	├───────────────┤
	│      TEXT	├─┐
	├───────────────┤ │
	:		: │
	├───────────────┤◀┘
	│   программа	│ первый байт должен быть = 00H
	├───────────────┤
	└───────────────┘ BFFFH


     ∙ Как размещать BASIC-программы в ROM

     1. Измените начальный адрес текста на 8021H.

     POKE &HF676,&H21:POKE &HF677,&H80:POKE &H8020,0:NEW

     Примечание: все операторы должны быть в одной строке.

     2. Загрузите BASIC-программу.

     LOAD "PROGRAM"

     3. Создайте заголовок.

     AD = &H8000
     FOR I = 0 TO 31:POKE AD+I,0:NEXT I
     POKE &H8000,ASC("A")
     POKE &H8001,ASC("B")
     POKE &H8008,&H20
     POKE &H8009,&H80

     4. Поместите область 8000H...BFFFH в ROM.



7.3.2 Примечания к разработке программ для катриджей

     ∙ Размещение рабочего пространства для катриджей

     В программах, не "сотрудничающих" с  остальными  катриджами,
(например, в играх),  можно  свободно  использовать  всю  память,
вплоть до системной области (F380H).

     Однако в программах, которые обращаются к подпрограммам  ин-
терпретатора, это пространство не может рассматриваться как рабо-
чее. Существуют три метода выделения рабочей области для  катрид-
жей:

     (1) Разместить RAM в том же самом катридже, что и  ROM  (на-
иболее безопасный и корректный во всех отношениях путь).
     (2) Если нужно не более двух байт, можно использовать  соот-
ветствующее рабочее пространство в SLTWRK (FD09H...).
     (3) Когда нужны три и более байтов, выделите их в RAM, кото-
рое использует BASIC. Для  этого  сохраните  значение  из  BOTTOM
(FC48H, 2) в соответствущей ячейке таблицы SLTWRK и увеличьте BO-
TTOM до нужных размеров рабочего пространства.



     ∙ Hook

     Область, называемая "hook" (ловушка), используется для  рас-
ширения функций BASICа и располагается с FD9AH по  FFC9H  рабочей
области. Каждый хук занимает 5 байтов, которые в нормальном  сос-
тоянии заполнены кодом инструкции "RET".

     Когда MSX-BASIC выполняет некоторую операцию, он прежде все-
го вызывает соответствующий хук. Если последний содержит RET, уп-
равление немедленно возвращается; однако операцию можно изменить,
если 5 байтов хука переписать так, чтобы они выполняли  межслото-
вый вызов программы, находящейся  в  катридже  (собственно,  этим
должна заниматься процедура INIT).


     ∙ Настройка указателя стека

     Если MSX имеет встроенный дисковод, ROM его интерфейса иног-
да успевает настроить стек до того,  как  этим  займется  катридж
(все зависит от взаимного расположения их слотов). В этом  случае
катридж, который не использует дисководы, должен  настроить  стек
заново, во избежание системного краха.


     ∙ Проверка расширенного слота

     Многие из программ, выброшенных на рынок, испытывают  непре-
одолимые затруднения, если их подключают  к  расширенному  слоту.
Поскольку большинство машин MSX2 имеет хотя бы  один  расширенный
слот, программное обеспечение, предназначенное для широкой прода-
жи, должно быть испытано  во  всех  возможных  ситуациях,  в  том
числе, если RAM находится в расширенном слоте.

     Хотя регистр расширенного слота FFFFH расположен в RAM,  его
нельзя использовать в качестве ячейки памяти. Например, настройка
стека "LD SP,0" может повлечь  за  собой  случайное  переключение
слота и выход машины из-под контроля.


     ∙ Замечания по использованию CALSLT

     Выполнение межслотового вызова CALSLT и CALLF разрушает зна-
чение регистров IX, IY и фоновых регистров. На MSX1 вызов  сопро-
вождается запретом прерываний, на MSX2 прерывания после  возврата
восстанавливаются.
     Прерывания всегда запрещены в момент вызова (2  на  рис.)  и
возрата (6 на рис.).

     На MSX2 состояние прерываний резервируется, так что "3" име-
ет то же состояние, что и "1", а "6" - то же, что и "4".  Помните
об этом, когда помещаете EI и DI в текст программы.

Приложения

П Р И Л О Ж Е Н И Е


A.1  СПИСОК ВХОДНЫХ ТОЧЕК BIOS

     В этом разделе перечислены 126 доступных входных точек BIOS.
     Существует два  вида  подпрограмм  BIOS:  одни  находятся  в
MAIN-ROM, другие - в SUB-ROM. Каждая подпрограмма имеет свой соб-
ственный протокол обмена, соответствующий нотации:

ИМЯ МЕТКИ (АДРЕС)	*n
функция:	описание функции и другие замечания
вход:		параметры, используемые при вызове
выход:		возвращаемые параметры
регистры:	используемые регистры (которые теряют свое
		исходное значение)

Значение "n" имеет следующий смысл:

*1	- то же, что и MSX1
*2	- неявно вызывает SUB-ROM в режимах экрана 5...8
*3	- всегда вызывает SUB-ROM
*4	- не вызывает SUB-ROM, пока не выбраны режимы 4...8

Процедуры, не отмеченные "n", добавлены к MSX2.


MAIN-ROM
-----------------------------------------------------------------
     Для вызова процедур из MAIN-ROM используется инструкция CALL
(или RST) в обычном порядке.


∙ Рестарты RST

     Среди перечисленных рестартов, RST 0H...RST 28H используются
BASIC-интерпретатором, RST 30H предназначен для межслотовых вызо-
вов, а RST 38H - для аппаратных прерываний.


CHKRAM (0000H)		*1
функция:	Тестирует RAM и устанавливает слоты.
вход:		---
выход:		---
регистры:	Все.


SYNCHR (0008H)		*1
функция:	Проверяет, совпадает ли символ по адресу HL
		с эталонным символом. Если нет, генерирует
		"SYNTAX  ERROR"; иначе переходит к CHRGTR.
вход:		Установить адрес проверяемого символа в HL,
		эталонный символ разместить сразу вслед за
		инструкцией RST, которая вызывает данную
		процедуру (инлайн-параметр).

		ПРИМЕР:		LD	HL,LETTER
				RST	08H
				DB	"A"
				...
			LETTER:	DB	"B"

выход:		HL увеличивается на 1, символ поступает в A.
		Если тестируемый символ оказался цифровым,
		устанавливается CY; признак конца оператора
		(00H или 3AH) вызывает установку флага Z.
регистры:	AF, HL


RDSLT (000CH)		*1
функция:	Выбирает слот в соответствии со значением A
		и читает один байт из этого слота. При вызове
		процедуры прерывания запрещаются и остаются
		таковыми, пока исполнение не завершится.
вход:		A - номер слота
		F000EEPP
		│   └┤└┴─ номер основного слота (0...3)
		│    └─── номер расширяющего слота (0...3)
		└──────── "1", если слот расширенный
		HL - адрес памяти
выход:		Прочитанное значение в регистре A
регистры:	AF, BC, DE


CHRGTR (0010H)		*1
функция:	Получает символ (токен) из текста на BASICе.
вход:		[HL] - символ для чтения
выход:		HL увеличивается на 1, символ поступает в A.
		Если тестируемый символ оказался цифровым,
		устанавливается CY; признак конца оператора
		(00H или 3AH) вызывает установку флага Z.
регистры:	AF, HL


WRSLT (0014H)		*1
функция:	Выбирает слот в соответствии со значением A
		и записывает один байт в этот слот. При вызове
		процедуры прерывания запрещаются и остаются
		таковыми, пока исполнение не закончится.
вход:		То же, что и в RDSLT. Значение для записи в E.
выход:		---
регистры:	AF, BC, D


OUTDO (0018H)		*2
функция:	Посылает значение на текущее устройство.
вход:		A - посылаемое значение.
		посылает на принтер, если PRTFLG (F416H) ≠ 0;
		посылает в файл, указываемый в PTRFIL (F864H),
		если PTRFIL ≠ 0;
выход:		---
регистры:	---


CALSLT (001CH)		*1
функция:	Вызывает процедуру в другом слоте.
вход:		Укажите слот в 8 старших битах регистра IY
		(так же, как в RDSLT). IX - адрес вызова.
выход:		Зависит от вызываемой процедуры.
регистры:	Зависит от вызываемой процедуры.


DCOMPR (0020H)		*1
функция:	Сравнивает значения регистров HL и DE.
вход:		HL, DE
выход:		Устанавливает флаг  Z, если HL = DE.
		Устанавливает флаг CY, если HL < DE.
регистры:	AF


ENASLT (0024H)		*1
функция:	Выбирает слот в соответствии со значением A.
		При вызове прерывания отключаются и остаются
		таковыми, пока исполнение не закончится.
вход:		A - номер слота (то же, что и в RDSLT).
		Два старших бита HL - номер страницы (0...3)
выход:		---
регистры:	Все.


GETYPR (0028H)		*1
функция:	Возвращает тип DAC (десятичного аккумулятора).
выход:		Флаги S, Z, P/V, CY соответствуют типу DAC:

		∙ целый		∙ одинарной точности
		C = 1		C = 1
		S = 1'		S = 0
		Z = 0		Z = 0
		P/V = 1		P/V = 0'

		∙ строковый	∙ двойной точности
		C = 1		C = 0'
		S = 0		S = 0
		Z = 1'		Z = 0
		P/V = 1		P/V = 1

		Типы можно распознать по флагам, отмеченным (').
регистры:	AF


CALLF (0030H)		*1
функция:	Вызывает процедуру в другом слоте. Вызывающая
		последовательность дана ниже:

		RST	30H
		DB	n	; n - номер слота (как в RDSLT)
		DW	nn	; nn - вызываемый адрес

вход:		Способом, описанным выше.
выход:		Зависит от вызываемой процедуры.
регистры:	AF и регистры, зависящие от вызываемой процедуры.


KEYINT (0038H)		*1
функция:	Выполняет обработку прерываний по таймеру.
вход:		---
выход:		---
регистры:	---



∙ Настройка ВВОДА/ВЫВОДА

INITIO (003BH)		*1
функция:	Инициализирует устройство.
вход:		---
выход:		---
регистры:	Все.


INIFNK (003EH)		*1
функция:	Инициализирует значение функциональных клавиш
вход:		---
выход:		---
регистры:	Все.


∙ Доступ к VDP

DISSCR (0041H)		*1
функция:	Гасит изображение дисплея.
вход:		---
выход:		---
регистры:	AF, BC


ENASCR (0044H)		*1
функция:	Включает экранное изображение.
вход:		---
выход:		---
регистры:	AF, BC


WRTVDP (0047H)		*2
функция:	Записывает данные в регистр VDP.
вход:		C - номер регистра, B - данные; Номера
		регистров 0...23 и 32...46.
выход:		---
регистры:	AF, BC


RDWRM (004AH)		*1
функция:	Читает содержимое VRAM. Предназначена для
		TMS9918, так что смысл имеют лишь 14 младших
		битов адреса. Все биты использует NRDVRM.
вход:		HL - адрес чтения.
выход:		A - прочитанный байт.
регистры:	AF


WRTWRM (004DH)		*1
функция:	Записывает значение во VRAM. Предназначена для
		TMS9918, так что смысл имеют лишь 14 младших
		битов адреса. Все биты использует NWRVRM.
вход:		HL - адрес записи, A - значение.
выход:		---
регистры:	AF


SETRD (0050H)		*1
функция:	Настраивает VDP и разрешает чтение данных из
		области VRAM (используется возможность VDP
		автоматически увеличивать адрес на 1). Это
		помогает значительно ускорить обмен с VRAM,
		по сравнению с цикличным повтором RDVRM. Так
		как данная процедура предназначена для VDP
		TMS9918, смысл имеют лишь 14 младших битов
		адреса. Все биты использует NSETRD.
вход:		HL - адрес VRAM.
выход:		---
регистры:	AF


SETWRT (0053H)		*1
функция:	Настраивает VDP и разрешает запись данных в
		область VRAM (используется возможность VDP
		автоматически увеличивать адрес на 1). Это
		помогает значительно ускорить обмен с VRAM,
		по сравнению с цикличным повтором RDVRM. Так
		как данная процедура предназначена для VDP
		TMS9918, смысл имеют лишь 14 младших битов
		адреса. Все биты использует NSTWRT.
вход:		HL - адрес VRAM.
выход:		---
регистры:	AF


FILVRM (0056H)		*4
функция:	Заполняет область VRAM указанным значением.
		Данная процедура предназначена для TMS9918,
		поэтому смысл имеют лишь 14 младших битов
		адреса. Все биты использует BIGFIL.
вход:		HL - адрес VRAM, BC - длина области, A - данные.
выход:		---
регистры:	AF, BC


LDIRMV (0059H)		*4
функция:	Перенос блока из VRAM в память.
вход:		HL - адрес источника (VRAM),
		DE - адрес приемника (RAM),
		BC - длина блока.
		Задействованы все биты адреса.
выход:		---
регистры:	Все.


LDIRVM (005CH)		*4
функция:	Перенос блока из памяти во VRAM.
вход:		HL - адрес источника (RAM),
		DE - адрес приемника (VRAM),
		BC - длина блока.
		Задействованы все биты адреса.
выход:		---
регистры:	Все.


CHGMOD (005FH)		*3
функция:	Изменяет режим экрана. Палитра не
		восстанавливается. Для инициализации
		палитры см. CHGMDP в SUB-ROM.
вход:		Номер режима (0...8) в A.
выход:		---
регистры:	Все.


CHGCLR (0062H)		*1
функция:	Изменяет цвет экрана.
вход:		A - номер режима.
		FORCLR (F3E9H) - цвет переднего плана.
		BAKCLR (F3EAH) - цвет заднего плана (фона).
		BRDCLR (F3EBH) - цвет рамки экрана.
выход:		---
регистры:	Все.


NMI (0066H)		*1
функция:	Выполняет обработку немаскированных прерываний.
вход:		---
выход:		---
регистры:	---


CLRSPR (0069H)		*3
функция:	Инициализирует спрайты. Шаблоны сбрасываются
		в 0, номера приравниваются номерам планов,
		цвета устанавливаются равными цвету фона.
		Вертикальная координата приравнивается 209
		(режим 0...3) или 217 (режим 4...8).
вход:		SCRMOD (FCAFH) - режим экрана.
выход:		---
регистры:	Все.


INITXT (006CH)		*3
функция:	Настраивает экран на режим ТЕКСТ 1 (40x24).
		Эта процедура не инициализирует палитру. Для
		восстановления палитры служит INIPLT в SUB-ROM.
вход:		TXTNAM (F3B3H) - адрес таблицы экранного буфера.
		TXTCGP (F3B7H) - адрес таблицы знакогенератора.
		LINL40 (F3AEH) - длина экранной линии.
выход:		---
регистры:	Все.


INIT32 (006FH)		*3
функция:	Настраивает экран на режим ГРАФИКА 1 (32x24).
		Палитра не восстанавливается.
вход:		T32NAM (F3BDH) - адрес таблицы экранного буфера.
		T32COL (F3BFH) - адрес таблицы цветов.
		T32CGP (F3C1H) - адрес таблицы знакогенератора.
		T32ATR (F3C3H) - адрес таблицы атрибутов спрайтов.
		T32PAT (F3C5H) - адрес таблицы шаблонов спрайтов.
выход:		---
регистры:	Все.


INIGRP (0072H)		*3
функция:	Настраивает экран на режим высокого разрешения.
		Палитра не восстанавливается.
вход:		GRPNAM (F3C7H) - адрес таблицы экранного буфера.
		GRPCOL (F3C9H) - адрес таблицы цветов.
		GRPCGP (F3CBH) - адрес таблицы знакогенератора.
		GRPATR (F3CDH) - адрес таблицы атрибутов спрайтов.
		GRPPAT (F3CFH) - адрес таблицы шаблонов спрайтов.
выход:		---
регистры:	Все.


INIMLT (0075H)		*3
функция:	Настраивает экран на многоцветный режим.
		Палитра не восстанавливается.
вход:		MLTNAM (F3D1H) - адрес таблицы экранного буфера.
		MLTCOL (F3D3H) - адрес таблицы цветов.
		MLTCGP (F3D5H) - адрес таблицы знакогенератора.
		MLTATR (F3D7H) - адрес таблицы атрибутов спрайтов.
		MLTPAT (F3D9H) - адрес таблицы шаблонов спрайтов.
выход:		---
регистры:	Все.


SETTXT (0078H)		*3
функция:	Устанавливает только VDP в режим ТЕКСТ1 (40x24)
вход:		то же, что INITXT.
выход:		---
регистры:	Все.


SETT32 (007BH)		*3
функция:	Устанавливает только VDP в режим ГРАФИКА 1.
вход:		то же, что INIT32.
выход:		---
регистры:	Все.


SETGRP (007EH)		*3
функция:	Устанавливает только VDP в режим ГРАФИКА 2.
вход:		то же, что INIGRP.
выход:		---
регистры:	Все.


SETMLT (0081H)		*3
функция:	Устанавливает только VDP в многоцветный режим.
вход:		то же, что INIMLT.
выход:		---
регистры:	Все.


CALPAT (0084H)		*1
функция:	Возвращает адрес шаблона спрайта.
вход:		A - номер спрайта.
выход:		HL - адрес.
регистры:	AF, DE, HL.


CALATR (0087H)		*1
функция:	Возвращает адрес атрибута спрайта.
вход:		A - номер спрайта.
выход:		HL - адрес.
регистры:	AF, DE, HL.


GRPSIZ (008AH)		*1
функция:	Возвращает текущий размер спрайта.
вход:		---
выход:		А - длина шаблона (в байтах). Если 16x16,
		то флаг CY = 1.
регистры:	AF.


GRPPRT (008DH)		*2
функция:	Выводит символ на графический экран.
вход:		A - код символа. В режимах 5...8 установите
		код логической операции в LOGOPR (FB02H).
		(Координаты - в GXPOS, GYPOS).
выход:		---
регистры:	---



∙ PSG

GICINI (0090H)		*1
функция:	Настраивает PSG на сигнал BEEP и готовит
		системную область оператора PLAY.
вход:		---
выход:		---
регистры:	Все.


WRTPSG (0093H)		*1
функция:	Записывает данные в регистр PSG.
вход:		A - номер регистра, E - данные.
выход:		---
регистры:	---


RDPSG (0096H)		*1
функция:	Читает данные из регистра PSG.
вход:		A - номер регистра.
выход:		A - данные.
регистры:	AF.


STRTMS (0099H)		*1
функция:	Проверяет, выполняется ли оператор PLAY
		в режиме фонового задания. Если нет,
		начинает исполнение оператора PLAY.
вход:		---
выход:		---
регистры:	Все.



∙ Клавиатура, символьный дисплей (CRT), принтер.

CHSNS (009CH)		*1
функция:	Проверяет состояние буфера клавиатуры.
вход:		---
выход:		Z = 1, если буфер пуст.
регистры:	AF.


CHGET (009FH)		*1
функция:	Вводит один символ из буфера (с ожиданием).
вход:		---
выход:		A - код введенного символа.
регистры:	AF.


CHPUT (00A2H)		*1
функция:	Выводит символ на экран.
вход:		A - код символа для вывода.
выход:		---
регистры:	---


LPTOUT (00A5H)		*1
функция:	Посылает символ на принтер.
вход:		A - код символа к выводу.
выход:		CY = 1, если было нажатие CTRL STOP.
регистры:	F.


LPTSTT (00A7H)		*1
функция:	Проверяет состояние принтера.
вход:		---
выход:		A = 255 и Z = 0, если принтер подключен;
		A =   0 и Z = 1 в противном случае.
регистры:	AF.


CNVCHR (00ABH)		*1
функция:	Обнаруживает хэдер графического символа и
		преобразует код.
вход:		A - код символа.
выход:		CY = 0, если не графический хэдер.
		CY = 1 и Z = 1, если графсимвол преобразован.
		CY = 1 и Z = 0, если преобразования не было.
		Результат в A.
регистры:	AF.


PINLIN (00AEH)		*1
функция:	Помещает введенные с клавиатуры символы в
		буфер, пока не нажаты RETURN или STOP.
вход:		---
выход:		HL - стартовый адрес буфера минус 1;
		CY = 1, если ввод был завершен клавишей STOP.
регистры:	Все.


INLIN (00B1H)		*1
функция:	То же, что и PINLIN, но выставлен AUTFLG (F6AAH).
вход:		---
выход:		HL - стартовый адрес буфера минус 1;
		CY = 1, если ввод был завершен клавишей STOP.
регистры:	Все.


QINLIN (00B4H)		*1
функция:	Выполняет PINLIN с выводом "?" и пробела.
вход:		---
выход:		HL - стартовый адрес буфера минус 1;
		CY = 1, если ввод был завершен клавишей STOP.
регистры:	Все.


BREAKX (00B7H)		*1
функция:	Проверяет состояние клавиш CTRL STOP.
		Используется, когда прерывания запрещены.
вход:		---
выход:		Флаг CY = 1, если было нажатие.
регистры:	AF.


BEEP (00C0H)		*3
функция:	Генерирует звуковой сигнал.
вход:		---
выход:		---
регистры:	Все.


CLS (00C3H)		*3
функция:	Чистит экран.
вход:		---
выход:		---
регистры:	AF, BC, DE


POSIT (00C6H)		*1
функция:	Перемещает курсор.
вход:		H - координата X, L - координата Y
выход:		---
регистры:	AF


FNKSB (00C9H)		*1
функция:	Проверяет активность функциональных клавиш
		(FNKFLG). Если активны, выводит их на экран;
		иначе - убирает с экрана.
вход:		FNKFLG (FBCEH)
выход:		---
регистры:	Все.


ERAFNK (00CCH)		*1
функция:	Убирает отображение функциональных клавиш.
вход:		---
выход:		---
регистры:	Все.


DSPFNK (00CFH)		*2
функция:	Разрешает отображение функциональных клавиш.
вход:		---
выход:		---
регистры:	Все.


TOTEXT (00D2H)		*1
функция:	Возвращает экран в предыдущий текстовый режим.
вход:		---
выход:		---
регистры:	Все.



∙ Доступ к игровым манипуляторам

GTSTCK (00D5H)		*1
функция:	Возвращает состояние джойстика.
вход:		A - номер разъема.
выход:		A - направление наклона рукоятки.
регистры:	Все.


GTTRIG (00D8H)		*1
функция:	Возвращает состояние кнопок триггеров.
вход:		A - номер проверяемой кнопки.
выход:		A =   0, если не нажата.
		A = 255, если нажата.
регистры:	AF.


GTPAD (00DBH)		*1
функция:	Возвращает состояние тач-панели.
вход:		A - номер тач-панели.
выход:		A - значение.
регистры:	Все.


GTPDL (00DEH)		*2
функция:	Возвращает состояние ручки игрового манипулятора.
вход:		A - номер ручки.
выход:		A - значение.
регистры:	Все.



∙ Процедуры для обмена с кассетой

TAPION (00E1H)		*1
функция:	Читает хэдер после включения мотора.
вход:		---
выход:		CY = 1, если ошибка.
регистры:	Все.


TAPIN (00E4H)		*1
функция:	Читает данные с ленты.
вход:		---
выход:		A - данные. CY = 1, если ошибка.
регистры:	Все.


TAPIOF (00E7H)		*1
функция:	Завершает чтение с ленты.
вход:		---
выход:		CY = 1, если ошибка.
регистры:	---


TAPOON (00EAH)		*1
функция:	Записывает хэдер после включения мотора.
вход:		A = 0 - короткий хэдер, иначе - длинный.
выход:		CY = 1, если ошибка.
регистры:	Все.


TAPOUT (00EDH)		*1
функция:	Записывает данные на ленту.
вход:		A - данные.
выход:		CY = 1, если ошибка.
регистры:	Все.


TAPOOF (00F0H)		*1
функция:	Завершает запись на ленту.
вход:		---
выход:		CY = 1, если ошибка.
регистры:	---


STMOTR (00F3H)		*1
функция:	Задает состояние мотора магнитофона.
вход:		A =  0 - стоп;
		A =  1 - пуск;
		A = -1 - инверсия текущего состояния.
выход:		---
регистры:	AF.



∙ Дополнительные процедуры

CHGCAP (0132H)		*1
функция:	Изменяет состояние лампы CAPS.
вход:		A = 0 - погасить;
		A ≠ 0 - включить.
выход:		---
регистры:	AF.


CHGSND (0135H)		*1
функция:	Изменяет состояние звукового бита.
вход:		A = 0 - сбросить;
		A ≠ 0 - установить.
выход:		---
регистры:	AF.


RSLREG (0138H)		*1
функция:	Читает значение регистра выбора основного слота.
вход:		---
выход:		A - прочитанное значение.
регистры:	A.


WSLREG (013BH)		*1
функция:	Записывает в регистр выбора основного слота.
вход:		A - значение для записи.
выход:		---
регистры:	---


RDVDP (013EH)		*1
функция:	Читает из регистра статуса VDP.
вход:		---
выход:		A - прочитанное значение.
регистры:	A.


SNSMAT (0141H)		*1
функция:	Проверяет состояние указанной строки
		клавиатурной матрицы.
вход:		A - номер строки.
выход:		A - данные (нажатой клавише соответствует
		сброшенный бит).
регистры:	AF, C.


ISFLIO (014AH)		*1
функция:	Проверяет, активно ли устройство.
вход:		---
выход:		A = 0 - активно.
		A ≠ 0 - не активно.
регистры:	AF.


OUTDLP (014DH)		*1
функция:	Вывод на принтер. Отличия от LPTOUT следующие:
		1. TAB разворачивается в цепочку пробелов.
		2. Для не MSX принтеров хирагана преобразуется
		в катакану, а графсимволы - в однобайтовые коды.
		3. Ошибка вызывает сообщение "Device I/O error".
вход:		A - код символа.
выход:		---
регистры:	F.


KILBUF (0156H)		*1
функция:	Сбрасывает буфер клавиатуры.
вход:		---
выход:		---
регистры:	HL.


CALBAS (0159H)		*1
функция:	Выполняет межслотовый вызов процедуры
		интерпретатора BASIC.
вход:		IX - адрес вызова.
выход:		Зависит от процедуры.
регистры:	Зависит от процедуры.



∙ Входы, добавленные к MSX2.


SUBROM (015CH)
функция:	Выполняет межслотовый вызов из SUB-ROM.
вход:		IX - адрес; одновременно PUSH IX в стек.
выход:		Зависит от вызываемой процедуры.
регистры:	Задействованы IY и фоновые регистры.


EXTROM (015FH)
функция:	Выполняет межслотовый вызов из SUB-ROM.
вход:		IX - адрес вызова.
выход:		Зависит от вызываемой процедуры.
регистры:	Задействованы IY и фоновые регистры.


EOL (0168H)
функция:	Удаляет символы до конца строки.
вход:		H и L - координаты курсора.
выход:		---
регистры:	Все.


BIGFIL (016BH)
функция:	То же, что и FILVRM, но с отличиями:
		- В FILVRM проверяется, выбран ли режим 0...3.
		Если это так, то считается, что VDP имеет лишь
		16 К VRAM (для совместимости с MSX1). BIGFIL
		не проверяет режим, поэтому выполняет действия
		в соответствии с заданными параметрами.
вход:		см. FILVRM.
выход:		см. FILVRM.
регистры:	см. FILVRM.


NSETRD (016EH)
функция:	Разрешает чтение из VRAM.
вход:		HL - адрес VRAM.
выход:		---
регистры:	AF.


NSTWRT (0171H)
функция:	Разрешает запись во VRAM.
вход:		HL - адрес VRAM.
выход:		---
регистры:	AF.


NRDVRM (0174H)
функция:	Читает один байт из VRAM.
вход:		HL - адрес для чтения.
выход:		A - прочитанное значение.
регистры:	AF.


NWRVRM (0177H)
функция:	Записывает один байт во VRAM.
вход:		HL - адрес для записи, A - данные.
выход:		---
регистры:	AF.



SUB-ROM
-----------------------------------------------------------------

     Вызывающая последовательность для SUB-ROM выгладит следующим
образом:
		LD	IX,INIPLT	; вход BIOS
		CALL	EXTROM
					; возврат сюда

     Если содержимое регистра IX желательно сохранить, используй-
те вызов, показанный ниже:

		PUSH	IX		; сохранить IX
		LD	IX,INIPLT	; вход BIOS
		CALL	SUBROM
					; возврат сюда


GRPPRT (0089H)
функция:	Вывод одного символа на графический экран
		(действует только в режимах 5...8).
вход:		A - код символа.
выход:		---
регистры:	---


NVBXLN (00C9H)
функция:	Рисует прямоугольную рамку.
вход:		исходная точка: BC - X,
				DE - Y,
		конечная точка:	GXPOS (FCB3H) - X,
				GYPOS (FCB5H) - Y,
		цвет:		ATRBYT (F3F2H),
		логич.операция:	LOGOPR (FB02H).
выход:		---
регистры:	Все.


NVBXFL (00CDH)
функция:	Рисует закрашенный прямоугольник.
вход:		исходная точка: BC - X,
				DE - Y,
		конечная точка:	GXPOS (FCB3H) - X,
				GYPOS (FCB5H) - Y,
		цвет:		ATRBYT (F3F2H),
		логич.операция:	LOGOPR (FB02H).
выход:		---
регистры:	Все.


CHGMOD (00D1H) - см. MAIN-ROM

INITXT (00D5H) - см. MAIN-ROM
INIT32 (00D9H) - см. MAIN-ROM
INIGRP (00DDH) - см. MAIN-ROM
INIMLT (00E1H) - см. MAIN-ROM
SETTXT (00E5H) - см. MAIN-ROM
SETT32 (00E9H) - см. MAIN-ROM
SETGRP (00EDH) - см. MAIN-ROM
SETMLT (00F1H) - см. MAIN-ROM

CLRSPR (00F5H) - см. MAIN-ROM
CALPAT (00F9H) - см. MAIN-ROM
CALATR (00FDH) - см. MAIN-ROM

GSPSIZ (0101H) - см. MAIN-ROM


GETPAT (0105H)
функция:	Возвращает шаблон символа.
вход:		А - код символа.
выход:		PATWRK (FC40H) - шаблон.
регистры:	Все.

WRTVRM (0109H) - см. NWRVRM/MAIN-ROM
RDVRM  (010DH) - см. NRDVRM/MAIN-ROM
CHGCLR (0111H) - см. CHGCLR/MAIN-ROM
CLSSUB (0115H) - см. CLS/MAIN-ROM

DSPFNK (011DH) - см. MAIN-ROM
WRTVDP (012DH) - см. MAIN-ROM


VDPSTA (0131H)
функция:	Читает регистр статуса VDP.
вход:		A - номер регистра.
выход:		A - значение.
регистры:	AF.


SETPAG (013DH)
функция:	Управляет страницами видеопамяти.
вход:		DPPAGE (FAF5H) - номер отображаемой страницы.
		ACPAGE (FAF6H) - номер активной страницы.
выход:		---
регистры:	AF.


INIPLT (0141H)
функция:	Инициализирует палитру (текущая палитра
		сохраняется во VRAM).
вход:		---
выход:		---
регистры:	AF, BC, DE.


RSTPLT (0145H)
функция:	Восстанавливает палитру из VRAM.
вход:		---
выход:		---
регистры:	AF, BC, DE.


GETPLT (0149H)
функция:	Получает цветовые коды палитры.
вход:		A - номер палитры (0...15).
выход:		4 старших бита B - код красного;
		4 младших бита B - код синего;
		4 младших бита C - код зеленого.
регистры:	AF, DE.


SETPLT (014DH)
функция:	Устанавливает цвет палитры.
вход:		D - номер палитры (0...15).
		4 старших бита A - код красного;
		4 младших бита A - код синего;
		4 младших бита E - код зеленого.
выход:		---
регистры:	AF.


BEEP (017DH) - см. MAIN-ROM


PROMPT (0181H)
функция:	Выводит подсказку.
вход:		---
выход:		---
регистры:	Все.


NEWPAD (01ADH)
функция:	Возвращает состояние мыши или светового пера.
вход:		Вызывать со следующими данными в A (в скобках
		даны возвращаемые значения):

		08 - опрос светового пера (верно при 0FFH);
		09 - возвращает координату X;
		10 - возвращает координату Y;
		11 - возвращает состояние кнопки пера (0FFH).

		12 - опрос мыши #1 (верно при 0FFH);
		13 - возвращает смещение вдоль X;
		14 - возвращает смещение вдоль Y;
		15 - (всегда 0).

		16 - опрос мыши #2 (верно при 0FFH);
		17 - возвращает смещение вдоль X;
		18 - возвращает смещение вдоль Y;
		19 - (всегда 0).

выход:		A.
регистры:	Все.


CHGMDP (01B5H)
функция:	Изменяет режим VDP. Палитра восстанавливается.
вход:		A - номер режима (0...8).
выход:		---
регистры:	Все.


KNJPRT (01BDH)
функция:	Посылает иероглиф на графический экран
		(только в режимах 5...8).
вход:		BC - код иероглифа, A - режим отображения.
		Режим отображения имеет тот же смысл, что и в
		BASICе:
			0 - вывод полностью 16 x 16 точек;
			1 - вывод только четных точек;
			2 - вывод только нечетных точек;
выход:		---
регистры:	AF.


REDCLK	(01F5H)
функция:	Читает показания часов.
вход:		C - адрес памяти часов:
		00MMAAAA
		  └┤└──┴─ адрес (0...15)
		   └───── режим (0...3)
выход:		A - прочитанное значение (верны 4 младших бита)
регистры:	AF.


WRTCLK (01F9H)
функция:	Записывает данные в часы.
вход:		A - данные для записи; C - адрес памяти часов.
выход:		---
регистры:	F.
А.2 МАТЕМАТИЧЕСКИЙ ПАКЕТ MATH-PACK

     MATH-PACK - основа всех математических процедур BASICа. Бла-
годаря его входным точкам, вычисления с плавающей точкой, а также
тригонометрия становятся доступными из любой программы на  ассем-
блере.
     Любые операции над  действительными  числами  выполняются  в
формате BCD (Binary Coded Decimal - дословно: "десятичное,  зако-
дированное двоичным"). Существуют два пути представления действи-
тельных чисел: одинарная точность и  двойная  точность;  действи-
тельные числа одинарной точности (6 знаков) занимают 4  байта,  а
действительные числа двойной точности (14 знаков) представлены  в
памяти компьютера 8 байтами (см. рисунки A.1 и A.2).


     Рисунок A.1 Двоично-десятичный формат представления.

	   7    6    5    4    3    2    1    0
	┌────┬──────────────────────────────────┐ ┐
	│знак│	         экспонента		│ │
	└────┴──────────────────────────────────┘ │
	┌───────────────────┬───────────────────┐ │
	│  1 цифра мантиссы │  2 цифра мантиссы	│ │
	└───────────────────┴───────────────────┘ ├ одинарная
	┌───────────────────┬───────────────────┐ │ точность
	│  3 цифра мантиссы │  4 цифра мантиссы	│ │
	└───────────────────┴───────────────────┘ │
	┌───────────────────┬───────────────────┐ │
	│  5 цифра мантиссы │  6 цифра мантиссы	│ │
	└───────────────────┴───────────────────┘ ┘
	┌───────────────────┬───────────────────┐
	│  7 цифра мантиссы │  8 цифра мантиссы	│
	└───────────────────┴───────────────────┘
	┌───────────────────┬───────────────────┐
	│  9 цифра мантиссы │ 10 цифра мантиссы	│
	└───────────────────┴───────────────────┘
	┌───────────────────┬───────────────────┐
	│ 11 цифра мантиссы │ 12 цифра мантиссы	│
	└───────────────────┴───────────────────┘
	┌───────────────────┬───────────────────┐
	│ 13 цифра мантиссы │ 14 цифра мантиссы	│ двойная
	└───────────────────┴───────────────────┘ точность


     Рисунок A.2 Примеры представления действительных чисел.

	123456 ─▶ 0.123456 E+6 -▶ DAC = 46 12 34 56

123456.78901234 ─▶ 0.12345678901234 E+6 ─▶ DAC = 46 12 34 56 78 90 12 34

     Действительное число состоит из знака, мантиссы и экспоненты
(порядка). Знак характеризует мантиссу: 0-положительная,  1-отри-
цательная. Порядок представлен в двоичном  формате  и  отображает
степень от -63 до +63 (рисунок A.3). На рисунке A.4 показаны гра-
ницы диапазона доступных действительных чисел двойной точности.


     Рисунок A.3 Формат порядка (экспоненты).

┌────┬──────────────────────────────────┐
│  0 │	0    0	  0    0    0	 0    0	│ = 0
└────┴──────────────────────────────────┘
┌────┬──────────────────────────────────┐
│  1 │	0    0	  0    0    0	 0    0	│ неопределено (-0?)
└────┴──────────────────────────────────┘
┌────┬──────────────────────────────────┐
│  x │	0    0	  0    0    0	 0    1	│ -63 степень десяти
└────┴──────────────────────────────────┘
┌────┬──────────────────────────────────┐
│  x │	1    0	  0    0    0	 0    0	│ 0 степень десяти
└────┴──────────────────────────────────┘
┌────┬──────────────────────────────────┐
│  x │	1    1	  1    1    1	 1    1	│ +63 степень десяти
└────┴──────────────────────────────────┘
	"x" - любое значение (0 или 1)


     Рисунок A.4 Доступный диапазон действительных чисел.

	FF 99 99 99 99 99 99 99 = -0.99999999999999 E+63
	81 10 00 00 00 00 00 00 = -0.10000000000000 E-63
	00 xx xx xx xx xx xx xx =  0
	01 10 00 00 00 00 00 00 = +0.10000000000000 E-63
	7F 99 99 99 99 99 99 99 = +0.99999999999999 E+63


     Память для всех операций предопределена заранее. Прежде все-
го, это область, называемая DAC (Десятичный АКкумулятор), которая
расположена по адресу F7F6H, а  также  область,  куда  помещается
числовое значение, подлежащее обработке, которая  называется  ARG
(АРГумент) и размещается по адресу F847H. Например, при умножении
вычисляется произведение DAC и ARG, и  результат  возвращается  в
DAC.
     В DAC можно хранить числа как одинарной, так и двойной  точ-
ности, а также двухбайтовые целые. Чтобы различать их,  использу-
ется ячейка VALTYP (F663H), значение которой равно 4 для  одинар-
ной точности, 8 - для двойной и 2 - для целых.
     Действительные числа должны располагаться с начала DAC, в то
время как целые должны занимать ячейки DAC+2 и DAC+3.
     Поскольку математический пакет является частью BASICа, любая
ошибка (например, деление на 0 или переполнение) передает  управ-
ление соответствующей процедуре обработки ошибок, которая возвра-
щается на командный уровень. Чтобы предотвратить  это,  настройте
ловушку H.ERRO (FFB1H).

-----------------------------------------------------------------
∙ Рабочая область MATH-PACK

VALTYP	(F663H,  1) - формат (тип) числа, находящегося в DAC
DAC	(F7F6H, 16) - аккумулятор для BCD с плавающей точкой
ARG	(F847H, 16) - аргумент DAC
-----------------------------------------------------------------
∙ ВХОДЫ MATH-PACK

Основные операции:

DECSUB	(268CH) - DAC := DAC - ARG
DECADD	(269AH) - DAC := DAC + ARG
DECNRM	(26FAH) - нормализация (удаление незначащих нулей)
DECROU	(273CH) - округление последнего разряда мантиссы
DECMUL	(27E6H) - DAC := DAC * ARG
DECDIV	(289FH) - DAC := DAC / ARG

     Все эти операции рассматривают DAC и ARG как  действительные
числа двойной точности. Регистры Z80 не сохраняются.
-----------------------------------------------------------------
Тригонометрические функции:

COS	(2993H) - DAC := COS (DAC)
SIN	(29ACH) - DAC := SIN (DAC)
TAN	(29BFH) - DAC := TAN (DAC)
ATN	(2A14H) - DAC := ATN (DAC)
LOG	(2A72H) - DAC := LOG (DAC)
SQR	(2AFFH) - DAC := SQR (DAC)
EXP	(2B4AH) - DAC := EXP (DAC)
RND	(2BDFH) - DAC := RND (DAC)

Данные операции имеют те же имена, что и функции BASICа.
-----------------------------------------------------------------
SIGN	(2E71H) - A := sign (DAC)
ABSFN	(2E82H) - DAC := ABS (DAC)
NEG	(2E8DH) - DAC := NEG (DAC)
SGN	(2E97H) - DAC := SGN (DAC)

     За исключением SING, все эти операции имеют те же имена, что
и в BASICе. Помните, что SGN возвращает результат в виде двухбай-
тного целого числа.
-----------------------------------------------------------------
Сравнения:

FCOMP	(2F21H) - одинарная точность, сравнить CBED и DAC.
ICOMP	(2F4DH) - целые аргументы, сравнить DE и HL.
XDCOMP	(2F5CH) - двойная точность, сравнить ARG и DAC.

Результат сравнения помещается в регистр A:

	A =  1 - левый аргумент больше правого
	A =  0 - аргументы равны
	A = -1 - левый аргумент меньше правого

     В процедуре FCOMP аргумент  CBED  означает  число  одинарной
точности, распределенное по регистрам следующим образом:

	C - знак и экспонента
	B - 1 и 2 цифры мантиссы
	E - 3 и 4 цифры мантиссы
	D - 5 и 6 цифры мантиссы
-----------------------------------------------------------------
Ввод/вывод в формате с плавающей точкой:

FIN	(3299H) - сохраняет строку, представленную в формате с
		  плавающей точкой, в DAC.
На входе:
	HL := адрес строки
	A := первый символ строки

На выходе:
	DAC - действительное число
	C - FFH, если без десятичной точки, иначе 00H
	B - количество разрядов после точки
	D - общее количество разрядов
-----------------------------------------------------------------
FOUT	(3425H) - превращает DAC в строку (без форматирования)
PUFOUT	(3426H) - то же (с форматированием)

На входе:
	A := описатель формата
	b7	0: бесформатный	1: форматный
	b6	0: без запятых	1: с запятыми
	b5	0: ---		1: замена пробелов на '*'
	b4	0: ---		1: '$' перед цифровой частью
	b3	0: ---		1: '+' для положительных чисел
	b2	0: ---		1: знак следует после числа
	b1	не используется
	b0	0: фиксированная точка	1: плавающая точка

	B := количество знаков до '.' (не включая ее)
	C := число знаков после '.' (включая ее)

На выходе:
	HL - начальный адрес строки
-----------------------------------------------------------------
FOUTB	(371AH) - превращает целое число в двоичную строку
FOUTO	(371EH) - превращает целое число в восьмиричную строку
FOUTH	(3722H) - превращает целое число в 16-ричную строку

На входе:
	DAC+2 := 2-байтовое целое
	VALTYP := 2

На выходе:
	HL - начальный адрес строки
-----------------------------------------------------------------
     Строки для  предыдущих  операций  не  резервируются.  Обычно
строка располагается в FBUFFR (с адреса F7C5H). В некоторых ситу-
ациях возможны небольшие отклонения. Для целых двухбайтовых чисел
VALTYP должен быть равен 2 всегда, а не только в FOUTB, FOUTO или
FOUTH.
-----------------------------------------------------------------
Преобразование типов:

FRCINT	(2F8AH) - преобразует DAC в 2-байтовое целое DAC+2,+3
FRCSNG	(2FB2H) - преобразует DAC в число одинарной точности
FRCDBL	(303AH) - преобразует DAC в число двойной точности
FIXER	(30BEH) - DAC := SNG(DAC) * INT(ABS(DAC))

     После выполнения VALTYP будет содержать число 2,  4  или  8,
представляющие тип DAC и, одновременно, его длину в байтах.
-----------------------------------------------------------------
Операции над целыми:

UMULT	(314AH) - DE := BC * DE
ISUB	(3167H) - HL := DE - HL
IADD	(3172H) - HL := DE + HL
IMULT	(3193H) - HL := DE * HL
IDIV	(31E6H) - HL := DE / HL
IMOD	(323AH) - HL := DE mod HL, DE := DE / HL
-----------------------------------------------------------------
Вычисление степеней:

SNGEXP	(37C8H) - одинарная точность, DAC := DAC ^ ARG
DBLEXP	(37D7H) - двойная точность, DAC := DAC ^ ARG
INTEXP	(383FH) - 2-байтные целые, DAC := DE ^ HL

Регистры не сохраняются
-----------------------------------------------------------------


A.3 БЛОЧНЫЕ ПЕРЕСЫЛКИ

     Блочные пересылки соответствуют оператору COPY MSX-BASICа  и
используются для перемещения графических данных между RAM, VRAM и
диском. Они легко выполняются при помощи подпограммы, находящейся
в SUB-ROM и доступной из программ на ассемблере.  Поскольку  речь
идет о SUB-ROM, используйте для вызова SUBROM или EXTROM.

1. Пересылки во VRAM

∙ BLTVV (0191H/SUB)
функция:	Перемещает данные в пределах VRAM.

вход:		HL <- F562H,
		Остальные параметры должны быть следующими:
		SX (F562H, 2)	- координата X источника
		SY (F564H, 2)	- координата Y источника
		DX (F566H, 2)	- координата X приемника
		DY (F568H, 2)	- координата Y приемника
		NX (F56AH, 2)	- число точек по горизонтали
		NY (F56CH, 2)	- число точек по вертикали
		CDUMMY(F56EH,1)	- в установке не нуждается
		ARG (F56FH, 1)	- то же, что и R#45 VDP
		LOGOP (F570H,1)	- код логической операции

выход:		Флаг CY сброшен.
регистры:	Все.


2. Пересылки между RAM и VRAM

     Чтобы использовать описанные далее процедуры,  следует  раз-
местить в памяти достаточное пространство для графданных:

∙ режим 5:	NX * NY / 2 + 4
∙ режим 6:	NX * NY / 4 + 4
∙ режим 7:	NX * NY / 2 + 4
∙ режим 8:	NX * NY + 4

     Не забудьте округлить с избытком.

     На диске или в памяти к графическим данным добавляются инди-
каторы размера. Первые два байта графического массива  показывают
ширину фрагмента (в точках), следующие два байта задают его высо-
ту.

∙ BLTVM (0195H/SUB)
функция:	Перемещает массив во VRAM.

вход:		HL <- F562H,
		Остальные параметры должны быть следующими:
		DPTR (F562H, 2)	- адрес источника в памяти
		DUMMY (F564H,2)	- в установке не нуждается
		DX (F566H, 2)	- координата X приемника
		DY (F568H, 2)	- координата Y приемника
		NX (F56AH, 2)	- число точек по горизонтали
		NY (F56CH, 2)	- число точек по вертикали
		NX и NY можно не устанавливать, так как они
		уже есть в первых 4-х байтах массива
		CDUMMY(F56EH,1)	- в установке не нуждается
		ARG (F56FH, 1)	- то же, что и R#45 VDP
		LOGOP (F570H,1)	- код логической операции

выход:		Флаг CY = 1, если замечена ошибка в параметрах
регистры:	Все.


∙ BLTMV (0199H/SUB)
функция:	Перемещает данные из VRAM в массив.

вход:		HL <- F562H,
		Остальные параметры должны быть следующими:
		SX (F562H, 2)	- координата X источника
		SY (F564H, 2)	- координата Y источника
		DPTR (F566H, 2)	- адрес приемника в памяти
		DUMMY (F568H,2)	- в установке не нуждается
		NX (F56AH, 2)	- число точек по горизонтали
		NY (F56CH, 2)	- число точек по вертикали
		CDUMMY(F56EH,1)	- в установке не нуждается
		ARG (F56FH, 1)	- то же, что и R#45 VDP

выход:		Флаг CY сброшен.
регистры:	Все.


3. Пересылки между диском и RAM/VRAM

     Имя файла должно быть установлено перед использованием диска
(в том же формате, что и в BASICе). Ниже дан пример:

	LD	HL,FNAME	; указатель на имя файла
	LD	(FNPTR),HL	; настроить область параметров
	...
FNAME:	DB	22H,'B:TEST.PIC',22H,0	; "TEST.PIC",end_mark

     Если возникла ошибка, управление передается процедуре  обра-
ботки ошибок BASIC-интерпретатора. Чтобы  обработать  эту  ошибку
самостоятельно, используйте ловушку H.ERRO (FFB1H).

∙ BLTVD (019DH/SUB)
функция:	Перемещает данные с диска во VRAM.

вход:		HL <- F562H,
		Остальные параметры должны быть следующими:
		FNPTR (F562H,2)	- адрес имени файла
		DUMMY (F564H,2)	- в установке не нуждается
		DX (F566H, 2)	- координата X приемника
		DY (F568H, 2)	- координата Y приемника
		NX (F56AH, 2)	- число точек по горизонтали
		NY (F56CH, 2)	- число точек по вертикали
		NX и NY можно не устанавливать, так как они
		уже есть в первых 4-х байтах файла
		CDUMMY(F56EH,1)	- в установке не нуждается
		ARG (F56FH, 1)	- то же, что и R#45 VDP
		LOGOP (F570H,1)	- код логической операции

выход:		Флаг CY = 1, если замечена ошибка в параметрах
регистры:	Все.


∙ BLTDV (01A1H/SUB)
функция:	Перемещает данные из VRAM на диск.

вход:		HL <- F562H,
		Остальные параметры должны быть следующими:
		SX (F562H, 2)	- координата X источника
		SY (F564H, 2)	- координата Y источника
		FNPTR (F566H,2)	- адрес имени файла
		DUMMY (F568H,2)	- в установке не нуждается
		NX (F56AH, 2)	- число точек по горизонтали
		NY (F56CH, 2)	- число точек по вертикали
		CDUMMY(F56EH,1)	- в установке не нуждается
		ARG (F56FH, 1)	- то же, что и R#45 VDP

выход:		Флаг CY сброшен.
регистры:	Все.


∙ BLTMD (01A5H/SUB)
функция:	Загружает данные с диска.

вход:		HL <- F562H,
		Остальные параметры должны быть следующими:
		FNPTR (F562H,2)	- адрес имени файла
		DUMMY (F564H,2)	- в установке не нуждается
		SPTR (F566H, 2)	- начальный адрес загрузки
		EPTR (F568H, 2)	- конечный адрес загрузки

выход:		Флаг CY сброшен.
регистры:	Все.


∙ BLTDM (01A9H/SUB)
функция:	Сохраняет массив данных на диске.

вход:		HL <- F562H,
		Остальные параметры должны быть следующими:
		SPTR (F562H, 2)	- начальный адрес записи
		EPTR (F564H, 2)	- конечный адрес записи
		FNPTR (F566H,2)	- адрес имени файла

выход:		Флаг CY сброшен.
регистры:	Все.
A.4 СПИСОК СИСТЕМНОЙ ОБЛАСТИ

     На рисунке A.5 изображена карта рабочей области MSX2. В дан-
ном разделе перечислены системные переменные и ловушки,  располо-
женные в диапазоне адресов F380H...FFCAH.
     При описании используется следующая нотация  (длина  дана  в
байтах):

ИМЯ_МЕТКИ (АДРЕС, ДЛИНА)
НАЧАЛЬНОЕ ЗНАЧЕНИЕ:
НАЗНАЧЕНИЕ:


     Рисунок A.5 Рабочая область.



∙ Подпрограммы для чтения/записи и межслотовых вызовов

RDPRIM (F380H, 5)	читает из первичного слота
WRPRIM (F385H, 7)	записывает в первичный слот
CLPRIM (F38CH, 14)	вызов первичного слота


∙ Стартовые значения функции USR и текстового экрана

USRTAB (F39AH, 20)
начальное значение:	FCERR
назначение:	стартовый адрес программы на ассемблере функции
		USR (0...9); неопределенная функция указывает на
		процедуру обработки ошибок FCERR (475AH)

LINL40 (F3AEH, 1)
начальное значение:	39
назначение:	ширина строки экрана в SCREEN 0 (устанавливается
		оператором WIDTH в режиме SCREEN 0)

LINL32 (F3AFH, 1)
начальное значение:	29
назначение:	ширина строки экрана в SCREEN 1 (устанавливается
		оператором WIDTH в режиме SCREEN 1)

LINLEN (F3B0H, 1)
начальное значение:	29
назначение:	текущая ширина строки экрана

CRTCNT (F3B1H, 1)
начальное значение:	24
назначение:	количество строк текстового экрана

CLMLST (F3B2H, 1)
начальное значение:	14
назначение:	горизонтальная позиция табуляции, при условии,
		что параметры оператора PRINT разделены запятой



∙ Рабочая область для инициализации

∙ SCREEN 0

TXTNAM (F3B3H, 2)
начальное значение:	0000H
назначение:	адрес экранного буфера

TXTCOL (F3B5H, 2)
назначение:	не используется

TXTCGP (F3B7H, 2)
начальное значение:	0800H
назначение:	адрес знакогенератора

TXTATR (F3B9H, 2)
назначение:	не используется

TXTPAT (F3BBH, 2)
назначение:	не используется



∙ SCREEN 1

T32NAM (F3BDH, 2)
начальное значение:	0000H
назначение:	адрес экранного буфера

T32COL (F3BFH, 2)
начальное значение:	2000H
назначение:	адрес таблицы цветов

T32CGP (F3C1H, 2)
начальное значение:	0000H
назначение:	адрес знакогенератора

T32ATR (F3C3H, 2)
начальное значение:	1B00H
назначение:	адрес атрибутов спрайтов

T32PAT (F3C5H, 2)
начальное значение:	3800H
назначение:	адрес шаблонов спрайтов


∙ SCREEN 2

GRPNAM (F3C7H, 2)
начальное значение:	1800H
назначение:	адрес экранного буфера

GRPCOL (F3C9H, 2)
начальное значение:	2000H
назначение:	адрес таблицы цветов

GRPCGP (F3CBH, 2)
начальное значение:	0000H
назначение:	адрес знакогенератора

GRPATR (F3CDH, 2)
начальное значение:	1B00H
назначение:	адрес атрибутов спрайтов

GRPPAT (F3CFH, 2)
начальное значение:	3800H
назначение:	адрес шаблонов спрайтов



∙ SCREEN 3

MLTNAM (F3D1H, 2)
начальное значение:	0800H
назначение:	адрес экранного буфера

MLTCOL (F3D3H, 2)
назначение:	не используется

MLTCGP (F3D5H, 2)
начальное значение:	0000H
назначение:	адрес знакогенератора

MLTATR (F3D7H, 2)
начальное значение:	1B00H
назначение:	адрес атрибутов спрайтов

MLTPAT (F3D9H, 2)
начальное значение:	3800H
назначение:	адрес шаблонов спрайтов



∙ Другие экранные настройки

CLIKSW (F3DBH, 1)
начальное значение:	1
назначение:	переключатель отзвука клавиши (0 - выкл);
		устанавливается оператором SCREEN

CSRY (F3DCH, 1)
начальное значение:	1
назначение:	вертикальная координата курсора

CSRX (F3DDH, 1)
начальное значение:	1
назначение:	горизонтальная координата курсора

CNSDFG (F3DEH, 1)
начальное значение:	0
назначение:	переключатель отображения функциональных
		клавиш (≠ 0 - вкл); устанавливается KEY ON/OFF




∙ Область для сохранения регистров VDP

RG0SAV (F3DFH, 1)
начальное значение:	0

RG1SAV (F3E0H, 1)
начальное значение:	E0H

RG2SAV (F3E1H, 1)
начальное значение:	0

RG3SAV (F3E2H, 1)
начальное значение:	0

RG4SAV (F3E3H, 1)
начальное значение:	0

RG5SAV (F3E4H, 1)
начальное значение:	0

RG6SAV (F3E5H, 1)
начальное значение:	0

RG7SAV (F3E6H, 1)
начальное значение:	0

STATFL (F3E7H, 1)
начальное значение:	0
назначение:	состояние VDP (на MSX2 содержит значение
		регистра статуса 0)

TRGFLG (F3E8H, 1)
начальное значение:	FFH
назначение:	состояние кнопки триггера джойстика

FORCLR (F3E9H, 1)
начальное значение:	15
назначение:	цвет переднего плана; устанавливается COLOR

BAKCLR (F3EAH, 1)
начальное значение:	4
назначение:	цвет заднего плана; устанавливается COLOR

BRDCLR (F3EBH, 1)
начальное значение:	7
назначение:	цвет рамки экрана; устанавливается COLOR

MAXUPD (F3ECH, 3)
начальное значение:	JP 0000H (C3H, 00H, 00H)
назначение:	для внутреннего использования CIRCLE

MINUPD (F3EFH, 3)
начальное значение:	JP 0000H (C3H, 00H, 00H)
назначение:	для внутреннего использования CIRCLE

ATRBYT (F3F2H, 1)
начальное значение:	15
назначение:	код цвета при работе с графикой



∙ Рабочая область оператора PLAY

QUEUES (F3F3H, 2)
начальное значение:	QUETAB (F959H)
назначение:	указывает на таблицу с музыкальной очередью

FRCNEW (F3F5H, 1)
начальное значение:	255
назначение:	для внутреннего использования BASIC



∙ Рабочая область клавиатуры

SCNCNT (F3F6H, 1)
начальное значение:	1
назначение:	интервал между сканированием клавиш

REPCNT (F3F7H, 1)
начальное значение:	50
назначение:	задержка перед началом автоповтора

PUTPNT (F3F8H, 2)
начальное значение:	KEYBUF (FBF0H)
назначение:	указывает адрес записи в буфер

GETPNT (F3FAH, 2)
начальное значение:	KEYBUF (FBF0H)
назначение:	указывает адрес чтения из буфера



∙ Параметры кассеты


CS120 (F3FCH, 5x2) - таблица настройки LOW, HIGH и HEADER
начальное значение:

1200 бод

	83 (LOW01)
	92 (HIGH01)	- ширина импульса, представляющего "0"
	38 (LOW11)
	45 (HIGH11)	- ширина импульса, представляющего "1"
	2 (HEADLEN)	- старший байт продолжительности
			  короткого хэдера (в битах = 2000)
2400 бод

	37 (LOW02)
	45 (HIGH02)	- ширина импульса, представляющего "0"
	14 (LOW12)
	22 (HIGH12)	- ширина импульса, представляющего "1"
	4 (HEADLEN)	- старший байт продолжительности
			  короткого хэдера (в битах = 4000)

LOW (F406H, 2)
начальное значение:	LOW01, HIGH01 (по умолчанию 1200 бод)
назначение:	ширина импульса, представляющего бит "0";
		устанавливается в операторе SCREEN

HIGH (F408H, 2)
начальное значение:	LOW11, HIGH11 (по умолчанию 1200 бод)
назначение:	ширина импульса, представляющего бит "1";
		устанавливается в операторе SCREEN

HEADER (F40AH, 1)
начальное значение:	HEADLEN (по умолчанию 1200 бод)
назначение:	продолжительность короткого хэдера;
		устанавливается оператором SCREEN

ASPCT1 (F40BH, 1)
назначение:	256 / коэффициент сжатия; устанавливается
		оператором SCREEN для CIRCLE

ASPCT2 (F40DH, 1)
назначение:	256 * коэффициент сжатия; устанавливается
		оператором SCREEN для CIRCLE

ENDPRG (F40FH, 5)
начальное значение:	":"
назначение:	фальшивый конец программы для RESUME NEXT



∙ Рабочая область для нужд интерпретатора

ERRFLG (F414H, 1)
назначение:	область для сохранения номера ошибки

LPTPOS (F415H, 1)
начальное значение:	0
назначение:	положение головки принтера

PRTFLG (F416H, 1)
назначение:	флаг передачи данных на принтер

NTMSXP (F417H, 1)
назначение:	тип принтера (0 = MSX, не 0 = другой)

RAWPRT (F418H, 1)
назначение:	не 0, если печать матричной графики

VLZADR (F419H, 2)
назначение:	адрес символа для функции VAL

VLZDAT (F41BH, 1)
назначение:	символ, замененный функцией VAL на нуль

CURLIN (F41CH, 2)
назначение:	текущая строка BASIC-программы

KBUF (F41FH, 318)
назначение:	внутреннее представление данных из BUF (F55EH)

BUFMIN (F55DH, 1)
начальное значение:	","
назначение:	используется INPUT

BUF (F55EH, 258)
назначение:	буфер для хранения введенных символов, где
		операторы представлены в ASCII-коде

ENDBUF (F660H, 1)
назначение:	предотвращает переполнения BUF (F55EH)

TTYPOS (F661H, 1)
назначение:	неявное положение курсора, используемое BASICом

DIMFLG (F662H, 1)
назначение:	для внутреннего использования BASIC

VALTYP (F663H, 1)
назначение:	идентифицирует тип переменной

DORES (F664H, 1)
назначение:	показывает, может ли сохраненное слово быть
		преобразовано во внутренний формат

DONUM (F665H, 1)
назначение:	флаг преобразования

CONTXT (F666H, 2)
назначение:	текстовый адрес для CHRGET

CONSAV (F668H, 1)
назначение:	хранит токен константы после вызова CHRGET

CONTYP (F669H, 1)
назначение:	тип сохраненной константы

CONLO (F66AH, 8)
назначение:	значение константы

MEMSIZ (F672H, 2)
назначение:	верхний адрес памяти, используемой BASICом

STKTOP (F674H, 2)
назначение:	адрес стека BASICа; зависит от CLEAR

TXTTAB (F676H, 2)
назначение:	начальный адрес текстового буфера BASICа

TEMPPT (F678H, 2)
начальное значение:	TEMPST (F67AH)
назначение:	начальный адрес неиспользованной области
		временного дескриптора (?)

TEMPST (F67AH, 3 * NUMTMP)
назначение:	область для NUMTEMP

DSCTMP (F698H, 3)
назначение:	дескриптор строки-результата операции

FRETOP (F69BH, 2)
назначение:	начальный адрес неиспользованной области
		строкового пространства

TEMP3 (F69DH, 2)
назначение:	для сборки мусора или функции USR

TEMP8 (F69FH, 2)
назначение:	для сборки мусора

ENDFOR (F6A1H, 2)
назначение:	адрес после оператора FOR (чтобы начать цикл
		с оператора, идущего вслед за FOR)

DATLIN (F6A3H, 2)
назначение:	номер строки оператора DATA, читаемого READ

SUBFLG (F6A5H, 1)
назначение:	флаг массива для функции USR

FLGINP (F6A6H, 1)
назначение:	флаг, используемый INPUT или READ

TEMP (F6A7H, 2)
назначение:	ячейка для временного сохранения оператора;
		используется также как указатель переменной,
		адрес текста и т.д.

PTRFLG (F6A9H, 1)
назначение:	0, если нет номера строки для преобразования,
		иначе не 0

AUTFLG (F6AAH, 1)
назначение:	флаг для AUTO (0 - команда недоступна)

AUTLIN (F6ABH, 2)
назначение:	номер последней введенной строки

AUTINC (F6ADH, 2)
начальное значение:	10
назначение:	приращение номера строки для AUTO

SAVTXT (F6AFH, 2)
назначение:	область для сохранения текущего адреса
		исполняемого текста; используется, главным
		образом, оператором RESUME

SAVSTK (F6B1H, 2)
назначение:	область для сохранения стека; используется,
		главным образом, процедурой обработки ошибок
		для восстановления стека

ERRLIN (F6B3H, 2)
назначение:	номер строки, в которой произошла ошибка

DOT (F6B5H, 2)
назначение:	номер последней введенной или напечатанной
		на экране строки

ERRTXT (F6B7H, 2)
назначение:	текстовый адрес, где произошла ошибка;
		используется оператором RESUME

ONELIN (F6B9H, 2)
назначение:	текстовый адрес, куда передается управление
		при обнаружении ошибки; устанавливается
		оператором ERROR GOTO

ONEFLG (F6BBH, 1)
назначение:	флаг, показывающий исполнение процедуры
		обработки ошибок (0 - не исполняется)

TEMP2 (F6BCH, 2)
назначение:	временная память

OLDLIN (F6BEH, 2)
назначение:	номер строки, в которой произошла остановка
		по CTRL STOP, STOP, END или по окончанию текста

OLDTXT (F6C2H, 2)
назначение:	адрес текста, который должен быть исполнен

VARTAB (F6C2H, 2)
назначение:	начальный адрес области простых переменных;
		оператор NEW устанавливает TXTTAB + 2.

ARYTAB (F6C4H, 2)
назначение:	начальный адрес области массивов

STREND (F6C6H, 2)
назначение:	верхний адрес памяти, используемой как буфер
		текста и переменных

DATPTR (F6C8H, 2)
назначение:	адрес данных в момент чтения оператором READ

DEFTBL (F6CAH, 26)
назначение:	область для задания типа переменной по первой
		букве ее имени; зависит от DEFSTR, CLEAR, ! и #



∙ Область для параметров функции USR

PRMSTK (F6E4H, 2)
назначение:	предыдущий блок определения (для сборки
		мусора)

PRMLEN (F6E6H, 2)
назначение:	число байтов в объектной таблице

PARM1 (F6E8H, PRMSIZ)
назначение:	таблица объектных значений параметров; PRMSIZ
		означает количество байтов в блоке определения,
		начальное значение 100

PRMPRV (F74CH, 2)
начальное значение:	PRMSTK
назначение:	указатель на предыдущий блок параметров (для
		сборки мусора)

PRMLN2 (F74EH, 2)
назначение:	размер блока параметров

PARM2 (F750H, 100)
назначение:	память под параметры

PRMFLG (F7B4H, 1)
назначение:	флаг, показывающий, разыскивается ли PARM1

ARYTA2 (F7B5H, 2)
назначение:	конечная точка поиска

NOFUNS (F7B7H, 1)
назначение:	0, если нет объектной функции

TEMP9 (F7B8H, 2)
назначение:	временная ячейка для сбора мусора

FUNACT (F7BAH, 2)
назначение:	количество объектных функций

SWPTMP (F7BCH, 8)
назначение:	область для временного сохранения первого
		параметра оператора SWAP

TRCFLG (F7C4H, 1)
назначение:	флаг трассировки (0 - трассировка выключена)



∙ Рабочая область математического пакета

FBUFFR (F7C5H, 43)
назначение:	для внутреннего использования MATH-PACK

DECTMP (F7F0H, 2)
назначение:	для преобразования целого в формат с плавающей
		точкой

DECTM2 (F7F2H, 2)
назначение:	для процедуры деления

DECCNT (F7F4H, 1)
назначение:	для процедуры деления

DAC (F7F6H, 16)
назначение:	область для вычисленного значения

HOLD8 (F806H, 48)
назначение:	область регистров для умножения

HOLD2 (F836H, 8)
назначение:	для внутреннего использования MATH-PACK

HOLD (F83EH, 8)
назначение:	для внутреннего использования MATH-PACK

ARG (F847H, 16)
назначение:	область для значения, вычисляемого вместе с DAC

RNDX (F857H, 8)
назначение:	хранит случайное действительно число двойной
		точности; устанавливается функцией RND



∙ Данные для BASIC-интерпретатора

MAXFIL (F85FH, 1)
назначение:	максимальный номер файла; настраивается MAXFILES

FILTAB (F860H, 2)
назначение:	начальный адрес информации о файлах

NULBUF (F862H, 2)
назначение:	указывает на буфер, используемый SAVE и LOAD

PTRFIL (F864H, 2)
назначение:	адрес информации о текущем файле

RUNFLG (F866H, ?)
назначение:	ненуль, если в LOAD указана опция R

FILNAM (F8??H, 11)
назначение:	область для хранения имени файла

FILNM2 (F8??H, 11)
назначение:	область для хранения имени файла

NLONLY (F87CH, 1)
назначение:	ненуль, если программа загружается

SAVEND (F87DH, 2)
назначение:	конечный адрес загруженной программы на
		ассемблере

FNKSTR (F87FH, 160)
назначение:	область для определения функциональных
		клавиш (16 символов x 10 клавиш)

CGPNT (F91FH, 3)
назначение:	адрес расположения символьного набора в ROM

NAMBAS (F922H, 2)
назначение:	базовый адрес текущего экранного буфера

CGPBAS (F924H, 2)
назначение:	базовый адрес текущего знакогенератора

PATBAS (F926H, 2)
назначение:	базовый адрес текущего генератора спрайтов

ATRBAS (F928H, 2)
назначение:	базовый адрес таблицы атрибутов спрайтов

CLOC (F92AH, 2)
CMASK (F92BH, 1)
MINDEL (F92DH, 1)
MAXDEL (F92FH, 1)
назначение:	для использования графическими процедурами



∙ Данные для оператора CIRCLE

ASPECT (F931H, 2)
назначение:	коэффициент сжатия эллипса

CENCNT (F933H, 2)
назначение:	для внутреннего использования CIRCLE

CLINEF (F935H, 1)
назначение:	флаг, показывающий направление построения дуги

CNPNTS (F936H, 2)
назначение:	текущая точка

CPLOTF (F938H, 1)
назначение:	для внутреннего использования CIRCLE

CPCNT (F939H, 2)
назначение:	номер восьмой доли окружности

CPCNT8 (F93BH, 2)
назначение:	для внутреннего использования CIRCLE

CPCSUM (F93DH, 2)
назначение:	для внутреннего использования CIRCLE

CSTCNT (F93FH, 2)
назначение:	для внутреннего использования CIRCLE

CSCLXY (F941H, 1)
назначение:	масштаб

CSAVEA (F942H, 2)
назначение:	область для ADVGRP

CSAVEM (F944H, 1)
назначение:	область для ADVGRP

CXOFF (F945H, 2)
назначение:	смещение по X относительно центра

CYOFF (F947H, 2)
назначение:	смещение по Y относительно центра



∙ Данные для оператора PAINT

LOHMSK (F949H, 1)
LOHDIR (F94AH, 1)
LOHADR (F94BH, 2)
LOHCNT (F94DH, 2)
назначение:	для внутреннего использования PAINT

SKPCNT (F94FH, 2)
назначение:	счетчик скачков

MIVCNT (F951H, 2)
назначение:	счетчик перемещений

PDIREC (F953H, 1)
назначение:	направление закраски

LFPROG (F954H, 1)
назначение:	для внутреннего использования PAINT

RTPROG (F955H, 1)
назначение:	для внутреннего использования PAINT



∙ Данные для оператора PLAY

MCLTAB (F956H, 2)
назначение:	указывает на начало PLAY макро или DRAW макро

MCLFLG (F958H, 1)
назначение:	различает PLAY/DRAW

QUETAB (F959H, 24)
назначение:	таблица очереди
	+0	- смещение PUT (точки записи)
	+1	- смещение GET (точки чтения)
	+2	- резервный символ
	+3	- длина очереди
	+4,+5	- адрес очереди

QUEBAK (F971H, 4)
назначение:	используется в BCKQ

VOICAQ (F975H, 128)
назначение:	очередь для голоса 1 (A)

VOICBQ (F9F5H, 128)
назначение:	очередь для голоса 2 (B)

VOICCQ (FA75H, 128)
назначение:	очередь для голоса 3 (C)



∙ Область, добавленная к MSX2

DPPAGE (FAF5H, 1)
назначение:	номер отображаемой страницы VRAM

ACPAGE (FAF6H, 1)
назначение:	номер активной страницы VRAM

AVCSAV (FAF7H, 1)
назначение:	значение порта управления AV

EXBRSA (FAF8H, 1)
назначение:	слотовый адрес SUB-ROM

CHRCNT (FAF9H, 1)
назначение:	счетчик символов в буфере (используется для
		перевода латинских кодов в катакану)

ROMA (FAFAH, 2)
назначение:	используется только в японской версии для
		перевода латинских кодов в катакану

MODE (FAFCH, 1)
назначение:	размер видеопамяти и режим доступа
		0000MVV0
		    │└┴─ 00 = 16K, 01 = 64K, 10 = 128K
		    └─── 1 - отбрасывать 2 старших бита адреса
			 0 - использовать адрес полностью

NORUSE (FAFDH, 1)
назначение:	пока не используется

XSAVE (FAFEH, 2)
назначение:	[I0000000 XXXXXXXX]

YSAVE (FB00H, 2)
назначение:	[x0000000 YYYYYYYY]
		I = 1 - запрос прерывания от светового пера
		0000000 - не используется
		XXXXXXX - координата X
		YYYYYYY - координата Y

LOGOPR (FB02H, 1)
назначение:	код логической операции



∙ Данные для RS-232C


RSTMP (FB03H, 50)
назначение:	рабочая область для RS-232C или диска

TOCNT (FB03H, 1)
назначение:	используется процедурой обслуживания RS-232C

RSFCB (FB04H, 2)
назначение:	+0: младший байт адреса RS-232C
		+1: старший байт адреса RS-232C

RSIQLN (FB06H, 1)
назначение:	используется процедурой обслуживания RS-232C


MEXBIH (FB06H, 5)
OLDSTT (FB0CH, 5)
OLDINT (FB12H, 5)
назначение:	ловушки

DEVNUM (FB17H, 1)
назначение:	используется процедурой обслуживания RS-232C

DATCNT (FB18H, 3)
назначение:	+0: данные
		+1: указатель
		+2: указатель

ERRORS (FB1BH, 1)
FLAGS (FB1CH, 1)
ESTBLS (FB1DH, 1)
COMMSK (FB1EH, 1)
LSTCOM (FB1FH, 1)
LSTMOD (FB20H, 1)
назначение:	используются процедурой обслуживания RS-232C



∙ Данные, используемые DOS

зарезервировано с FB21H по FB34H.
назначение:	используется DOS


∙ Данные для оператора PLAY (те же, что и в MSX1)

PRSCNT (FB35H, 1)
назначение:	D1...D6	- разборка строки
		D7	- проход 1

SAVSP (FB36H, 2)
назначение:	резервирует указатель стека в PLAY

VOICEN (FB38H, 1)
назначение:	текущий интерпретируемый голос

SAVVOL (FB39H, 2)
назначение:	сохранение громкости во время паузы

MCLLEN (FB3BH, 1)
MCLPTR (FB3CH, 2)
QUEUEN (FB3EH, 1)
назначение:	для внутреннего использования PLAY

MUSICF (FC3FH, 1)
назначение:	флаг прерываний для исполнения музыки

PLYCNT (FB40H, 1)
назначение:	количество операторов PLAY, сохраненных
		в очереди



∙ Формат статических данных оператора PLAY (смещение дано
в десятичном виде)

METREX (+ 0, 2)		счетчик таймера
VCXLEN (+ 2, 1)		MCLLEN для данного голоса
VCXPTR (+ 3, 2)		MCLPTR для данного голоса
VCXSTR (+ 5, 2)		для указателя стека
QLENGX (+ 7, 1)		количество байтов в очереди
NTICSX (+ 8, 2)		новый счетчик
TONPRX (+10, 2)		период тона
AMPPRX (+12, 1)		разделение громкости и огибающей
ENVPRX (+13, 2)		период огибающей
OCTAVX (+15, 1)		номер октавы
NOTELX (+16, 1)		длительность тона
TEMPOX (+17, 1)		темп
VOLUMX (+18, 1)		громкость
ENVLPX (+19, 14)	область для задания формы огибающей
MCLSTX (+33, 3)		область для стека
MCLSEX (+36, 1)		инициализация стека
VCBSIZ (+37, 1)		размер статического буфера


∙ Область статических данных голосов

VCBA (FB41H, 37)
назначение:	данные для голоса 0

VCBB (FB66H, 37)
назначение:	данные для голоса 1

VCBC (FB8BH, 37)
назначение:	данные для голоса 2



∙ Другие данные

ENSTOP (FBB0H, 1)
назначение:	флаг, разрешающий теплый старт по нажатию
		SHIFT CTRL GRAPH CODE (0 - запретить)

BASROM (FBB1H, 1)
назначение:	показывает расположение текста программы
		(0 - в RAM, иначе - в ROM)

LINTTB (FBB2H, 24)
назначение:	таблица окончания строк; хранит данные о каждой
		экранной строке текстового режима

FSTPOS (FBCAH, 2)
назначение:	положение первого символа строки INLIN (00B1H)

CODSAV (FBCCH, 1)
назначение:	сохраняет код символа, на который установлен курсор

FNKSW1 (FBCDH, 1)
назначение:	показывает, какие функциональные клавиши
		отображены на экране (1 - F1...F5, 0 - F6...F10)

FNKFLG (FBCEH, 10)
назначение:	область для разрешения, запрещения или временного
		прекращения прерывания по нажатию функциональных
		клавиш (0 - OFF/STOP, 1 - ON для каждой клавиши)

ONGSBF (FBD8H, 1)
назначение:	флаг, показывающий, произошло ли событие,
		заданное в таблице TRPTBL (FC4CH)

CLIKFL (FBD9H, 1)
назначение:	флаг отзвука клавиши

OLDKEY (FBDAH, 11)
назначение:	состояние клавиатурной матрицы (старое)

NEWKEY (FBE5H, 11)
назначение:	состояние клавиатурной матрицы (новое)

KEYBUF (FBF0H, 40)
назначение:	буфер кодов клавиш

LINWRK (FC18H, 40)
назначение:	используется процедурой обработки экрана

PATWRK (FC40H, 8)
назначение:	используется для инверсии шаблона символа

BOTTOM (FC48H, 2)
назначение:	нижний адрес RAM (на MSX2 обычно 8000H)

HIMEM (FC4AH, 2)
назначение:	верхний адрес доступной RAM; устанавливается
		оператором CLEAR

TRPTBL (FC4CH, 78)
назначение:	таблицы ловушек используются для обработки
		прерываний; каждая таблица состоит из трех
		байтов: первый задает состояние ON/STOP/OFF,
		а остальные - адрес перехода по ON GOSUB

		(FC4CH, 3 x 10)	- ON KEY GOSUB
		(FC6AH, 3 x 1)	- ON STOP GOSUB
		(FC6DH, 3 x 1)	- ON SPRITE GOSUB
		(FC70H, 3 x 5)	- ON STRIG GOSUB
		(FC7FH, 3 x 1)	- ON INTERVAL GOSUB
		(FC82H...)	- для будущих расширений

RTYCNT (FC9AH, 1)
назначение:	для внутреннего использования

INTFLG (FC9BH, 1)
назначение:	если нажато Ctrl STOP, запись сюда 03H вызывает
		остановку

PADY (FC9CH, 1)
назначение:	координата X игрового манипулятора

PADX (FC9DH, 1)
назначение:	координата Y игрового манипулятора

JIFFY (FC9EH, 2)
назначение:	используется оператором PLAY

INTVAL (FCA0H, 2)
назначение:	период прерываний по ON INTERVAL GOSUB

INTCNT (FCA2H, 2)
назначение:	счетчик интервала для ON INTERVAL GOSUB

LOWLIM (FCA4H, 1)
WINWID (FCA5H, 1)
назначение:	используется во время чтения с кассеты

GRPHED (FCA6H, 1)
назначение:	флаг пересылки графического символа
		(1 - графический, 0 - обычный)

ESCCNT (FCA7H, 1)
назначение:	для обработки кода ESCAPE

INSFLG (FCA8H, 1)
назначение:	режим вставки (0 - замена, иначе - INS)

CSRSW (FCA9H, 1)
назначение:	отображается ли курсор (0 - нет)

CSTYLE (FCAAH, 1)
назначение:	очертания курсора (0 - блочный, иначе -
		подчеркивание)

CAPST (FCABH, 1)
назначение:	состояние клавиши CAPS (0 - выкл)

KANAST (FCACH, 1)
назначение:	состояние клавиши CODE/KANA/РУС (0 - выкл)

KANAMD (FCADH, 1)
назначение:	режим обработки кана-клавиатуры (0 - 50 звуков,
		иначе - японский вариант)

FLBMEM (FCAEH, 1)
назначение:	0, если загружается BASIC-программа

SCRMOD (FCAFH, 1)
назначение:	текущий режим экрана

OLDSCR (FCB0H, 1)
назначение:	предыдущий режим экрана

CASPRV (FCB1H, 1)
назначение:	область для CAS:

BRDATR (FCB2H, 1)
назначение:	цвет границы для оператора PAINT

GXPOS (FCB3H, 2)
назначение:	координата X графического курсора

GYPOS (FCB5H, 2)
назначение:	координата Y графического курсора

GRPACX (FCB7H, 2)
назначение:	графический аккумулятор (координата X)

GRPACY (FCB9H, 2)
назначение:	графический аккумулятор (координата Y)

DRWFLG (FCBBH, 1)
назначение:	флаг оператора DRAW

DRWSCL (FCBCH, 1)
назначение:	масштаб DRAW (0 - без масштабирования)

DRWANG (FCBDH, 1)
назначение:	угол поворота осей координат DRAW

RUNBNF (FCBEH, 1)
назначение:	указывает BLOAD, BSAVE или ничто

SAVENT (FCBFH, 2)
назначение:	начальный адрес для BSAVE

EXPTBL (FCC1H, 4)
назначение:	флаги расширенных слотов

SLTTBL (FCC5H, 4)
назначение:	текущее состояние расширенных слотов

SLTATR (FCC9H, 64)
назначение:	атрибуты страниц каждого слота

SLTWRK (FD09H, 128)
назначение:	размещение рабочих областей в слотах

PROCNM (FD89H, 16)
назначение:	сохраняет имя расширенного оператора (после
		CALL) или расширенного устройства (после OPEN);
		конец имени отмечен байтом 00H

DEVICE (FD99H, 1)
назначение:	используется для идентификации катриджа
∙ Ловушки

H.KEYI (FD9AH)
смысл:		процедура обработки прерываний MSXIO
назначение:	операции обработки прерываний, типа RS-232C

H.TIMI (FD9FH)
смысл:		обработка прерываний по таймеру MSXIO
назначение:	обработка прерываний по таймеру

H.CHPH (FDA4H)
смысл:		CHPUT MSXIO (вывод одного символа)
назначение:	выбор другой консоли

H.DSPC (FDA9H)
смысл:		DSPCSR MSXIO (вывод курсора)
назначение:	выбор другой консоли

H.ERAC (FDAEH)
смысл:		ERACSR MSXIO (удаление курсора)
назначение:	выбор другой консоли

H.DSPF (FDB3H)
смысл:		DSPFNK MSXIO (вывод функц. клавиш)
назначение:	выбор другой консоли

H.ERAF (FDB8H)
смысл:		ERAFNK MSXIO (удаление функц. клавиш)
назначение:	выбор другой консоли

H.TOTE (FDBDH)
смысл:		TOTEXT MSXIO (текстовый режим)
назначение:	выбор другой консоли

H.CHGE (FDC2H)
смысл:		CHGET MSXIO (получает один символ)
назначение:	выбор другой консоли

H.INIP (FDC7H)
смысл:		INIPAT MSXIO (инициализация знакогенератора)
назначение:	использование другого набора символов

H.KEYC (FDCCH)
смысл:		KEYCOD MSXIO (получение кода клавиши)
назначение:	выбор другой обработки клавиатуры

H.KYEA (FDD1H)
смысл:		NMI MSXIO (Key Easy)
назначение:	выбор другой обработки клавиатуры

H.NMI (FDD6H)
смысл:		NMI MSXIO (немаскированные прерывания)
назначение:	обработка NMI

H.PINL (FDD8H)
смысл:		PINLIN MSXIO (ввод одной линии)
назначение:	выбор другой консоли или другого метода ввода

H.QINL (FDE0H)
смысл:		QINLIN MSXIO (ввод одной линии с "?")
назначение:	выбор другой консоли или другого метода ввода

H.INLI (FDE5H)
смысл:		INLIN MSXIO (ввод одной строки)
назначение:	выбор другой консоли или другого метода ввода

H.ONGO (FDEAH)
смысл:		INGOTP MSXSTS (ON GOTO)
назначение:	выбор другого устройства обработки прерываний

H.DSKO (FDEFH)
смысл:		DSKO$ MSXSTS (вывод на диск)
назначение:	подключение дисковода

H.SETS (FDF4H)
смысл:		SETS MSXSTS (установка атрибута)
назначение:	подключение дисковода

H.NAME (FDF9H)
смысл:		NAME MSXSTS (переименование)
назначение:	подключение дисковода

H.KILL (FDFEH)
смысл:		KILL MSXSTS (удалить файл)
назначение:	подключение дисковода

H.IPL (FE03H)
смысл:		IPL MSXSTS (загрузка программы)
назначение:	подключение дисковода

H.COPY (FEF8H)
смысл:		COPY MSXSTS (копирование файла)
назначение:	подключение дисковода

H.CMD (FE0DH)
смысл:		CMD MSXSTS (расширенная команда)
назначение:	подключение дисковода

H.DSKF (FE12H)
смысл:		DSKF MSXSTS (свободное пространство диска)
назначение:	подключение дисковода

H.DSKI (FE17H)
смысл:		DSKI MSXSTS (ввод с диска)
назначение:	подключение дисковода

H.ATTR (FE1CH)
смысл:		ATTR$ MSXSTS (атрибут)
назначение:	подключение дисковода

H.LSET (FE21H)
смысл:		LSET MSXSTS (выравнивание по левому краю поля)
назначение:	подключение дисковода

H.RSET (FE26H)
смысл:		RSET MSXSTS (выравнивание по правому краю поля)
назначение:	подключение дисковода

H.FIEL (FE2BH)
смысл:		FIELD MSXSTS (поле)
назначение:	подключение дисковода

H.MKI$ (FE30H)
смысл:		MKI$ MSXSTS (создание целого)
назначение:	подключение дисковода

H.MKS$ (FE35H)
смысл:		MKS$ MSXSTS (создание одинарной точности)
назначение:	подключение дисковода

H.MKD$ (FE3AH)
смысл:		MKD$ MSXSTS (создание двойной точности)
назначение:	подключение дисковода

H.CVI (FE3FH)
смысл:		CVI MSXSTS (превращение целого)
назначение:	подключение дисковода

H.CVS (FE44H)
смысл:		CVS MSXSTS (превращение одинарной точности)
назначение:	подключение дисковода

H.CVD (FE49H)
смысл:		CVD MSXSTS (превращение двойной точности)
назначение:	подключение дисковода

H.GETP (FE4EH)
смысл:		GETPTR SPCDSK (вернуть указатель файла)
назначение:	подключение дисковода

H.SETF (FE53H)
смысл:		SETFIL SPCDSK (задать указатель файла)
назначение:	подключение дисковода

H.NOFO (FE58H)
смысл:		NOFOR SPCDSK (оператор OPEN без FOR)
назначение:	подключение дисковода

H.NULO (FE5DH)
смысл:		NULOPN SPCDSK (открыть неиспользуемый файл)
назначение:	подключение дисковода

H.NTFL (FE62H)
смысл:		NTFLO SPCDSK (номер файла не 0)
назначение:	подключение дисковода

H.MERG (FE67H)
смысл:		MERGE SPCDSK (слияние программ)
назначение:	подключение дисковода

H.SAVE (FE6CH)
смысл:		SAVE SPCDSK (запись)
назначение:	подключение дисковода

H.BINS (FE71H)
смысл:		BINSAV SPCDSK (двоичная запись)
назначение:	подключение дисковода

H.BINL (FE76H)
смысл:		BINLOD SPCDSK (двоичная загрузка)
назначение:	подключение дисковода

H.FILE (FE7BH)
смысл:		FILES SPCDSK (вывод имен файлов)
назначение:	подключение дисковода

H.DGET (FE80H)
смысл:		DGET SPCDSK (диск GET)
назначение:	подключение дисковода

H.FILO (FE85H)
смысл:		FILOUT SPCDSK (вывод в файл)
назначение:	подключение дисковода

H.INDS (FE8AH)
смысл:		INDSKC SPCDSK (ввод атрибутов диска)
назначение:	подключение дисковода

H.RSLF (FE8FH)
смысл:		SPCDSK: возврат к прежнему дисководу
назначение:	подключение дисковода

H.SAVD (FE94H)
смысл:		SPCDSK: запомнить текущий дисковод
назначение:	подключение дисковода

H.LOC (FE99H)
смысл:		LOC SPCDSK (положение файла)
назначение:	подключение дисковода

H.LOF (FE9EH)
смысл:		LOF SPCDSK (длина файла)
назначение:	подключение дисковода

H.EOF (FEA3H)
смысл:		EOF SPCDSK (конец файла)
назначение:	подключение дисковода

H.FPOS (FEA8H)
смысл:		FPOS SPCDSK (положение файла)
назначение:	подключение дисковода

H.BAKU (FEADH)
смысл:		Резерв SPCDSK
назначение:	подключение дисковода

H.PARD (FEB2H)
смысл:		PARDEV SPCDSK (получить имя периферии)
назначение:	расширение логического имени устройства

H.NODE (FEB7H)
смысл:		NODEVN SPCDSK (нет имени устройства)
назначение:	выбор имени по умолчанию для другого устройства

H.POSD (FEBCH)
смысл:		POSDSK SPCDSK
назначение:	подключение дисковода

H.DEVN (FEC1H)
смысл:		DEVNAM SPCDSK (обработка имени устройства)
назначение:	расширение логического имени устройства

H.GEND (FEC6H)
смысл:		GENDSP SPCDSK (присвоение устройства)
назначение:	расширение логического имени устройства

H.RUNC (FECBH)
смысл:		RUNC BIMISC (очистка RUN)

H.CLEA (FED0H)
смысл:		CLEARC BIMISC (очистка CLEAR)

H.LOPD (FED5H)
смысл:		LOPDFT BIMISC (установка цикла по умолчанию)
назначение:	выбор другого значения переменной

H.STKE (FEDAH)
смысл:		STKERR BIMISC (ошибка стека)

H.ISFL (FEDFH)
смысл:		ISFLIO BIMISC (файловый ввод/вывод или нет)

H.OUTD (FEE4H)
смысл:		OUTDO BIO (выполнить OUT)

H.CRDO (FEE9H)
смысл:		CRDO BIO (выполнить CRLF)

H.DSKC (FEEEH)
смысл:		DSKCHI BIO (ввод атрибута диска)

H.DOGR (FEF3H)
смысл:		DOGRPH GENGRP (выполнить графическую операцию)

H.PRGE (FEF8H)
смысл:		PRGEND BINTRP (конец программы)

H.ERRP (FEFDH)
смысл:		ERRPTR BINTRP (ошибка дисплея)

H.ERRF (FF02H)
смысл:		BINTRP

H.READ (FF07H)
смысл:		READY BINTRP

H.MAIN (FF0CH)
смысл:		MAIN BINTRP

H.DIRD (FF11H)
смысл:		DIRDO BINTRP (непосредственное выполнение
		оператора)

H.FINI (FF16H)
смысл:		BINTRP

H.FINE (FF1BH)
смысл:		BINTRP

H.CRUN (FF20H)
смысл:		BINTRP

H.CRUS (FF25H)
смысл:		BINTRP

H.ISRE (FF2AH)
смысл:		BINTRP

H.NTFN (FF2FH)
смысл:		BINTRP

H.NOTR (FF34H)
смысл:		BINTRP

H.SNGF (FF39H)
смысл:		BINTRP

H.NEWS (FF3EH)
смысл:		BINTRP

H.GONE (FF43H)
смысл:		BINTRP

H.CHRG (FF48H)
смысл:		BINTRP

H.RETU (FF4DH)
смысл:		BINTRP

H.PRTF (FF52H)
смысл:		BINTRP

H.COMP (FF57H)
смысл:		BINTRP

H.FINP (FF5CH)
смысл:		BINTRP

H.TRMN (FF61H)
смысл:		BINTRP

H.FRME (FF66H)
смысл:		BINTRP

H.NTPL (FF6BH)
смысл:		BINTRP

H.EVAL (FF70H)
смысл:		BINTRP

H.OKNO (FF75H)
смысл:		BINTRP

H.FING (FF7AH)
смысл:		BINTRP

H.ISMI (FF7FH)
смысл:		ISMID$ BINTRP (MID$ или нет)

H.WIDT (FF84H)
смысл:		WIDTHS BINTRP (WIDTH)

H.LIST (FF89H)
смысл:		LIST BINTRP

H.BUFL (FF8EH)
смысл:		BUFLIN BINTRP (буферизовать линию)

H.FRQI (FF93H)
смысл:		FRQINT BINTRP

H.SCNE (FF98H)
смысл:		BINTRP

H.FRET (FF9DH)
смысл:		FRETMP BISTRS

H.PTRG (FFA2H)
смысл:		PTRGET BIPTRG (получить указатель)
назначение:	обработка переменной другого типа

H.PHYD (FFA7H)
смысл:		PHYDIO MSXIO (физический обмен с диском)
назначение:	подключение дисковода

H.FORM (FFACH)
смысл:		FORMAT MSXIO (форматировать диск)
назначение:	подключение дисковода

H.ERRO (FFB1H)
смысл:		ERROR BINTRP
назначение:	обработка ошибок в прикладной программе

H.LPTO (FFB6H)
смысл:		LPTOUT MSXIO (вывод на принтер)
назначение:	подключение другого принтера

H.LPTS (FFBBH)
смысл:		LPTSTT MSXIO (состояние принтера)
назначение:	подключение другого принтера

H.SCRE (FFC0H)
смысл:		SCREEN MSXSTS (вход в оператор)
назначение:	расширение оператора SCREEN

H.PLAY (FFC5H)
смысл:		PLAY MSXSTS (вход в оператор)
назначение:	расширение оператора PLAY


∙ Для расширенной BIOS

FCALL (FFCAH)	ловушка расширенной BIOS

DISINT (FFCFH)	используется DOS

ENAINT (FFD4H)	используется DOS
A.6 КАРТА ВВОДА/ВЫВОДА

00H...3FH	определяются пользователем

40H...7FH	зарезервированы

80H...87H	RS-232C
	80H	данные 8251
	81H	статус/команда 8251
	82H	чтение статуса/маска прерывания
	83H	не используется
	84H	8253
	85H	8253
	86H	8253
	87H	8253

88H...8BH	VDP V9938: порты адаптера MSX1

8CH...8DH	модем

8EH...8FH	зарезервированы

90H...91H	порты принтера
	90H	бит 0: вывод строба (запись)
		бит 1: ввод статуса (чтение)
	91H	данные для печати

92H...97H	зарезервированы

98H...9BH	MSX2 VDP V9938
	98H	доступ к VRAM
	99H	доступ к командным регистрам
	9AH	доступ к палитре (только запись)
	9BH	указатель регистров (только запись)

9CH...9FH	зарезервированы

A0H...A3H	генератор звука AY-3-8910
	A0H	адрес
	A1H	чтение данных
	A2H	запись данных

A4H...A7H	зарезервированы

A8H...ABH	параллельный порт 8255
	A8H	порт A
	A9H	порт B
	AAH	порт C
	ABH	настройка режима

ACH...AFH	чип ввода-вывода (MSX-engine)

B0H...B3H	расширение памяти (спецификация SONY 8255)
	B0H	порт A (адрес A0-A7)
	B1H	порт B (адрес A8-A10, A13-A15, управление R/W)
	B2H	порт C (адрес A11-A12, данные D0-D7)
	B3H	установка режима

B4H...B5H	часы CLOCK-IC (RP-5C01)
	B4H	адрес
	B5H	данные

B6H...B7H	зарезервированы

B8H...BBH	управление световым пером (спецификация SANYO)
	B8H	чтение/запись
	B9H	чтение/запись
	BAH	чтение/запись
	BBH	только запись

BCH...BFH	управление VHD (спецификация JVC 8255)
	BCH	порт A
	BDH	порт B
	BEH	порт C
	BFH	настройка режима

C0H...C1H	MSX-AUDIO

C2H...C7H	зарезервированы

C8H...CFH	интерфейс MSX

D0H...D7H	контроллер флоппи-диска (FDC)

D8H...D9H	катакана-ROM (спецификация TOSHIBA)
	D8H	биты 5-0	мл.адрес (только запись)
	D9H	биты 5-0	ст.адрес (запись)
		биты 7-0	данные (чтение)

DAH...DBH	для дальнейшего расширения катаканы

DCH...F4H	зарезервированы

F5H		управление системой (только запись)
		установка 1 делает доступным устройство:
	бит 0:	кана-ROM
	бит 1:	зарезервировано для каны
	бит 2:	MSX-AUDIO
	бит 3:	наложение изображения
	бит 4:	MSX интерфейс
	бит 5:	RS-232C
	бит 6:	световое перо
	бит 7:	часы (только для MSX2)

F6H		цветовая шина

F7H		управление A/V
	бит 0:	аудио R / включение микшера (запись)
	бит 1:	аудио L / выключение микшера (запись)
	бит 2:	выбор видео входа / 21-штырьковый RGB (запись)
	бит 3:	контроль видео входа / нет ввода (чтение)
	бит 4:	управление AV / TV (запись)
	бит 5:	управление Ym / TV (запись)
	бит 6:	инверсия бита 4 регистра 9 VDP (запись)
	бит 7:	инверсия бита 5 регистра 9 VDP (запись)

F8H...FBH	зарезервированы

FCH...FFH	мэппер
msx/msx2_technical_handbook/oleg_shamshura/oleg_shamshura.txt · Последние изменения: 2023-02-04 20:53 — GreyWolf