2.8. К о м а н д ы в и д е о п р о ц е с с о р а [89] Кто не способен выдумывать небылицы, у того один выход - рассказывать были. Л.Вовенарг. Размышления и максимы 2.8.1. Т и п ы к о м а н д Команды MSX-VDP можно использовать для выполнения операторов LINE и PSET MSX-BASIC, а также для переноса и копирования части изображения на экране дисплея. Приведем вначале краткие сведения о командах. ┌───────────┬─────────────────────┬───────┬──────┬───────────────┐ │ │ О б л а с т ь │ │ │ Четыре старших│ │ ├──────────┬──────────┤ Едини-│Мнемо-│ бита │ │ Функция │Куда пере-│Откуда пе-│ца дан-│ ника │ регистра номер│ │ │ сылаются │ресылаются│ ных │ │ 46 │ │ │ данные │ данные │ │ ├───┬───┬───┬───┤ │ │(адресат) │(источник)│ │ │CM3│CM2│CM1│CM0│ ├───────────┼──────────┼──────────┼───────┼──────┼───┼───┼───┼───┤ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ ├───────────┼──────────┼──────────┼───────┼──────┼───┼───┼───┼───┤ │ Быстрая │ VRAM │ CPU │ байт │ HMMC │ 1 │ 1 │ 1 │ 1 │ │ пересылка │ VRAM │ VRAM │ байт │ YMMM │ 1 │ 1 │ 1 │ 0 │ │ │ VRAM │ VRAM │ байт │ НMMM │ 1 │ 1 │ 0 │ 1 │ │ │ VRAM │ VDP │ байт │ HMМV │ 1 │ 1 │ 0 │ 0 │ ├───────────┼──────────┼──────────┼───────┼──────┼───┼───┼───┼───┤ │ Пересылка │ VRAM │ CPU │пиксель│ LMMC │ 1 │ 0 │ 1 │ 1 │ │ с логичес-│ CPU │ VRAM │пиксель│ LMCM │ 1 │ 0 │ 1 │ 0 │ │ ким преоб-│ VRAM │ VRAM │пиксель│ LMMM │ 1 │ 0 │ 0 │ 1 │ │ разованием│ VRAM │ VDP │пиксель│ LMMV │ 1 │ 0 │ 0 │ 0 │ ├───────────┼──────────┼──────────┼───────┼──────┼───┼───┼───┼───┤ │ Построение│ VRAM │ VDP │пиксель│ LINЕ │ 0 │ 1 │ 1 │ 1 │ │ л и н и и │ │ │ │ │ │ │ │ │ ├───────────┼──────────┼──────────┼───────┼──────┼───┼───┼───┼───┤ │ Поиск │ VRAM │ VDP │пиксель│ SRCH │ 0 │ 1 │ 1 │ 0 │ ├───────────┼──────────┼──────────┼───────┼──────┼───┼───┼───┼───┤ │ Установка │ VRAM │ VDP │пиксель│ PSET │ 0 │ 1 │ 0 │ 1 │ │ т о ч к и │ │ │ │ │ │ │ │ │ ├───────────┼──────────┼──────────┼───────┼──────┼───┼───┼───┼───┤ │ Считывание│ VDP │ VRAM │пиксель│ POINT│ 0 │ 1 │ 0 │ 0 │ │ точки │ │ │ │ │ │ │ │ │ ├───────────┼──────────┼──────────┼───────┼──────┼───┼───┼───┼───┤ │ Команда │ │ │ │ │ 0 │ 0 │ 1 │ 1 │ │отсутствует│ │ │ │ │ │ │ │ │ ├───────────┼──────────┼──────────┼───────┼──────┼───┼───┼───┼───┤ │ Команда │ │ │ │ │ 0 │ 0 │ 1 │ 0 │ │отсутствует│ │ │ │ │ │ │ │ │ ├───────────┼──────────┼──────────┼───────┼──────┼───┼───┼───┼───┤ │ Команда │ │ │ │ │ 0 │ 0 │ 0 │ 1 │ │отсутствует│ │ │ │ │ │ │ │ │ ├───────────┼──────────┼──────────┼───────┼──────┼───┼───┼───┼───┤ │ СТОП │ │ │ │ STOP │ │ │ │ │ │(прерывание│ │ │ │ │ │ │ │ │ │ выполнения│ │ │ │ │ 0 │ 0 │ 0 │ 0 │ │ в с е х │ │ │ │ │ │ │ │ │ │ команд) │ │ │ │ │ │ │ │ │ └───────────┴──────────┴──────────┴───────┴──────┴───┴───┴───┴───┘ Перед выполнением команды в регистрах видеопроцессора (VDP) с номерами 32,33,34,...,44,45 Вам нужно задать необходимые п а р а м е т р ы. Команды выполняются видеопроцессором после задания кода команды в реги- стре видеопроцессора с номером 46, который называется р е г и с т р о м к о м а н д (регистр команд иногда обозначается CMR ("CoMmand Register"). Это приводит к установке 1 в нулевом бите регистра с о с т о я н и я с номером 2 (имя данного бита - СЕ). Заметим, что после выполнения команды бит СЕ устанавливается в 0. Для прерывания исполняющейся команды выполните команду STOP. ┌─────────────────────────────────────────────────────────┐ │ Команды выполняются только в графических режимах │ │ SCREEN 5, SCREEN 6, SCREEN 7, SCREEN 8! │ └─────────────────────────────────────────────────────────┘ Теперь остановимся на понятии с т р а н и ц а... Значениями параметров, используемых в командах видеопроцессора (VDP), являются ц е л ы е числа, которые, чаще всего,представляют собой коорди- наты X и Y точки на экране дисплея. Другими словами, VDP работает с облас- тью видеопамяти (VRAM), задействованной в текущем режиме SCREEN. С т р а н и ц е й будем называть определенный участок видеопамяти. При отображении на экране видны 192 (или 212) линии текущей страницы (физическое начало изображения на экране устанавливается в соответствии с содержимым регистра видеопроцессора с номером 23). Выбор страницы, предна- значенной для вывода на экран, осуществляется путем изменения базового ад- реса в регистре с номером 2. Содержимое отображаемой на экране дисплея страницы не влияет на выполнение команд видеопроцессора. "Координатная сетка" и адреса расположения страниц для различных режи- мов SCREEN приведены ниже. SCREEN 5 А д р е с SCREEN 6 ──────── ───────── ──────── ┌──────────────────┐ 00000h ┌──────────────────┐ │(0,0) (255,0)│ │(0,0) (511,0)│ │ С т р а н и ц а 0│ │ С т р а н и ц а 0│ │(0,255) (255,255)│ │(0,255) (511,255)│ └──────────────────┘ 07FFFh └──────────────────┘ ┌──────────────────┐ 08000h ┌──────────────────┐ │(0,256) (255,256)│ │(0,256) (511,256)│ │ С т р а н и ц а 1│ │ С т р а н и ц а 1│ │(0,511) (255,511)│ │(0,511) (511,511)│ └──────────────────┘ 0FFFFh └──────────────────┘ ┌──────────────────┐ 10000h ┌──────────────────┐ │(0,512) (255,512)│ │(0,512) (511,512)│ │ С т р а н и ц а 2│ │ страница 2 │ │(0,767) (255,767)│ │(0,767) (511,767)│ └──────────────────┘ 17FFFh └──────────────────┘ ┌──────────────────┐ 18000h ┌──────────────────┐ │(0,768) (255,768)│ │(0,768) (511,768)│ │ С т р а н и ц а 3│ │ страница 3 │ │(0,1023)(255,1023)│ │(0,1023)(511,1023)│ └──────────────────┘ 1FFFFh └──────────────────┘ SCREEN 7 А д р е с SCREEN 8 ──────── ───────── ──────── ┌──────────────────┐ 00000h ┌──────────────────┐ │(0,0) (511,0)│ │(0,0) (255,0)│ │ С т р а н и ц а 0│ │ С т р а н и ц а 0│ │(0,255) (511,255)│ │(0,255) (255,255)│ └──────────────────┘ 0FFFFh └──────────────────┘ ┌──────────────────┐ 10000h ┌──────────────────┐ │(0,256) (511,256)│ │(0,256) (255,256)│ │ С т р а н и ц а 1│ │ С т р а н и ц а 1│ │(0,511) (255,511)│ │(0,511) (255,511)│ └──────────────────┘ 1FFFFh └──────────────────┘ А теперь поговорим о л о г и ч е с к и х о п е р а ц и я х ... Команды видеопроцессора ┌────────────────────────────────────────┐ │ LINE, PSET, LMMC, LMCM, LMMM, LMMV │ └────────────────────────────────────────┘ могут выполнять различные логические операции над ц в е т а м и . Выпол- нение логических операций происходит при установке 4 м л а д ш и х би- тов (с именами LO3,LO2,LO1,LO0) регистра команд номер 46. Приведем краткие данные о логических операциях. Учтите, что в таблице используются следующие обозначения: SC - код цвета и с т о ч н и к а ; DC - код цвета а д р е с а т а. ┌─────┬─────────────────────────────────────────┬───────────────┐ │ Имя │ О п е р а ц и я │LO3 LO2 LO1 LO0│ ├─────┼─────────────────────────────────────────┼───────────────┤ │ IMP │ DC=SC │ 0 0 0 0 │ │ AND │ DC=SC·DC │ 0 0 0 1 │ │ OR │ DC=SC+DC │ 0 0 1 0 │ │ EOR │ DC=NOT(SC)·DC+SC·NOT(DC) │ 0 0 1 1 │ │ NOT │ DC=NOT(SC) │ 0 1 0 0 │ │ │ │ 0 1 0 1 │ │ │ │ 0 1 1 0 │ │ │ │ 0 1 1 1 │ │ TIMP│ IF SC=0 THEN DC=DC ELSE DC=SC │ 1 0 0 0 │ │ TAND│ IF SC=0 THEN DC=DC ELSE DC=SC·DC │ 1 0 0 1 │ │ TOR │ IF SC=0 THEN DC=DC ELSE DC=SC+DC │ 1 0 1 0 │ │ TEOR│ IF SC=0 THEN DC=DC │ │ │ │ ELSE DC=NOT(SC)·DC+SC·NOT(DC) │ 1 0 1 1 │ │ TNOT│ IF SC=0 THEN DC=DC ELSE DC=NOT(SC) │ 1 1 0 1 │ │ │ │ 1 1 0 1 │ │ │ │ 1 1 1 0 │ │ │ │ 1 1 1 1 │ └─────┴─────────────────────────────────────────┴───────────────┘ 2.8.2. С о с т о я н и е р е г и с т р о в п о с л е в ы п о л н е н и я к о м а н д После того, как некоторая команда VDP выполнена,состояние регистров бу- дет таким, как указано в следующей таблице. ┌─────┬─────────────────────────────────────────────────────────┐ │ Мне-│ Н о м е р а р е г и с т р о в │ │мони-├─────┬─────┬─────┬─────┬─────┬─────┬───┬───────────┬─────┤ │ ка │32,33│34,35│36,37│38,39│40,41│42,43│ 44│ 46 │ 45 │ │ ко- ├─────┼─────┼─────┼─────┼─────┼─────┼───┼─────┬─────┼─────┤ │манды│ SX │ SY │ DX │ DY │ NX │ NY │CLR│Старш.Младш. 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 │ ─ │ ─ │ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴───┴─────┴─────┴─────┘ В приведенной таблице: α) символ "─" означает, что содержимое регистра не изменяется; β) символ "∗" означает, что в регистре находится координата точки в момент завершения выполнения команды или код цвета; γ) символ "#" означает, что в регистре находится счетчик (NYB) коли- чества обнаружений границы экрана во время выполнения команды. П р и м е ч а н и е. Значениями для SY*, DY* и NYB служат точки (или байты в высокоскорост- ных пересылках данных), вычисляемые подстановкой N в соотношения,приведен- ные ниже: SY∗=SY+N DY∗=DY+N (DIY=0) SY∗=SY-N DY∗=DY-N (DIY=1) NYB=NY-N Для команд,осуществляющих высокоскоростную пересылку данных (HMMC,HMMM, HMMV,YMMM) N=2 в режимах SCREEN 5 и SCREEN 7, N=4 в режимe SCREEN 6. Для команды LINE: если MAJ=0, то N=N-1. Для других команд N=1. 2.8.3. О п и с а н и е к о м а н д Брось свои иносказанья И гипотезы пустые! На проклятые вопросы Дай ответы нам прямые. Г.Гейне 2.8.3.1. К о м а н д а НММС Команда НМMС пересылает данные от центрального процессора (CPU) в ви- деопамять (VRAM) или расширенную память в виде прямоугольного блока (раз- мером NX╳NY) через регистры видеопроцессора (VDP).Так как переносимые дан- ные организованы побайтно, существует ограничение на величины NX и DX в соответствии с режимом oтображения(в режимах SCREEN 5 и SCREEN 7 эти вели- чины должны быть ч е т н ы м и, а в режиме SCREEN 6 - к р а т н ы м и 4). Взгляните на схему выполнения команды HMMC. В и д е о п а м я т ь или р а с ш и р е н н а я п а м я т ь ┌───────────────────────────────────────┐ │ (DX,DY) │ MSX-VDP CPU │ ┌─────────────┐ ──▶ DIX │ ┌───────┐ ┌────┐ │ │ NX│ (X-направление)│ │ Видео-│ │ │ │ │NY │ ◀─────────────────────│процес-│◀──│ ЦП │ │ └─────────────┘ │ │ сор │ │ │ │ │ DIY │ └───────┘ └────┘ │ │ (Y-направление) │ │ ▼ │ └───────────────────────────────────────┘ Опишем теперь установку регистров для выполнения команды НММС и поря- док ее выполнения. 1. Вначале устанавливаются необходимые параметры в регистры команд VDP, а именно: α) DX: базовая X-координата адресата (от 0 до 511); Отметим, что в режимах SCREEN 5 и SCREEN 7 теряется один младший бит, а в режиме SCREEN 6 - 2 младших бита. DY: базовая Y-координата адресата (от 0 до 1023); Номера битов 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 36 │ DX7 │ DX6 │ DX5 │ DX4 │ DX3 │ DX2 │ DX1 │ DX0 │ (базовая X-координата └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ адресата (младшая часть)) ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 37 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ DX8 │ (базовая X-координата └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ адресата (старшая часть)) ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 38 │ DY7 │ DY6 │ DY5 │ DY4 │ DY3 │ DY2 │ DY1 │ DY0 │ (базовая Y-координата └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ адресата (младшая часть)) ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 39 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ DY9 │ DY8 │ (базовая Y-координата └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ адресата (старшая часть)) β) NX: "ширина" пересылаемого блока по X-направлению в точках (от 0 до 511); Отметим, что в режимах SCREEN 5 и SCREEN 7 теряется один младший бит,а в режиме SCREEN 6 - 2 младших бита. NY: "ширина" пересылаемого блока по Y-направлению в точках (от 0 до 1023). Номера битов 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 40 │ NX7 │ NX6 │ NX5 │ NX4 │ NX3 │ NX2 │ NX1 │ NX0 │ (количество точек для └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ пересылки по X-координате (младшая часть)) ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 41 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ NX8 │ (количество точек для └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ пересылки по X-координате (старшая часть)) ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 42 │ NY7 │ NY6 │ NY5 │ NY4 │ NY3 │ NY2 │ NY1 │ NY0 │ (количество точек для └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ пересылки по Y-координате (младшая часть)) ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 43 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ NY9 │ NY8 │ (количество точек для └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ пересылки по Y-координате (старшая часть)) γ) MХD: задание области памяти адресата (0: видеопамять; 1: расширенная память); DIX: направление для NX по X-координате адресата (0: направо; 1:налево); DIY: направления для NY по Y-координате адресата (0:вниз; 1:вверх). Номера битов 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 45 │ 0 │ MXC │ MXD │ MXS │ DIY │ DIX │ EQ │ MAJ │ (ориентировка блока от-└─────┴─────┴──▲──┴─────┴──▲──┴──▲──┴─────┴─────┘ носительно точки с ко- │ │ │ ординатами (DX,DY)) │ │ │ │ │ │ Задание области памяти адресата ─┘ │ │ (1 - расширенная память, │ │ 0 - видеопамять) │ │ Направление пересылаемых данных(Y) ─────────────┘ │ (1 - вверх , 0 - вниз) │ Направление пересылаемых данных(X) ───────────────────┘ (1 - налево, 0 - направо) δ) CLR: первый байт данных для переноса. Д л я р е ж и м о в SCREEN 5 и SCREEN 7 Номера битов 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 44 │ CH3 │ CH2 │ CH1 │ CH0 │ CL3 │ CL2 │ CL1 │ CL0 │ (регистр цвета) └──▲──┴──▲──┴──▲──┴──▲──┴──▲──┴──▲──┴──▲──┴──▲──┘ └─────┴─────┴─────┘ └─────┴─────┴─────┘ N=0,1,2,...,127 X=2·N X=2·N+1 Д л я р е ж и м а SCREEN 6 Номера битов 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 44 │ CH3 │ CH2 │ CH1 │ CH0 │ CL3 │ CL2 │ CL1 │ CL0 │ (регистр цвета) └──▲──┴──▲──┴──▲──┴──▲──┴──▲──┴──▲──┴──▲──┴──▲──┘ └─────┘ └─────┘ └─────┘ └─────┘ N=0,1,2,...,127 X=4·N X=4·N+1 X=4·N+2 X=4·N+3 Д л я р е ж и м а SCREEN 8 Номера битов 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 44 │ CH3 │ CH2 │ CH1 │ CH0 │ CL3 │ CL2 │ CL1 │ CL0 │ (регистр цвета) └──▲──┴──▲──┴──▲──┴──▲──┴──▲──┴──▲──┴──▲──┴──▲──┘ └─────┴─────┴─────┴─────┴─────┴─────┴─────┘ О д н а т о ч к а 2. После задания значений параметров выполнение команды происходит за- данием кода команды 11110000b в регистре команд с номером 46. Второй и все последующие байты посылаются в регистр номер 44 после про- верки TR-бита и CЕ-бита в регистре состояния с номером 2. В заключение пункта приведем схему алгоритма выполнения команды НММС: ┌───────────┐ ┌───────────────┐ ┌──────────────────────┐ │Начало НММC│──▶│ Установка │──▶│ Выполнение команды │ └───────────┘ │ регистров VDP │ └──────────┬───────────┘ └───────────────┘ │ ┌───────────────────▶│ │ ┌───────────────▼───────────────────────┐ │ │ Чтение регистра состояния с номером 2 │ │ └───────────────┬───────────────────────┘ │ ┌─────▼─────┐ │ │ Конец │ да (CE=0) │ │ команды ? ├──────────┐ │ └─────┬─────┘ │ │ │ нет (CE=1) │ │ ┌─────▼─────┐ │ │ нет (TR=0) │ Пересылка │ │ ├────────────◀─┤ окончена? │ │ │ └─────┬─────┘ │ │ │ да (TR=1) │ │ ┌────────▼───────┐ │ │ │ Перенос данных │ │ │ └────────┬───────┘ ┌─────▼──────┐ └────────────────────┘ │ Конец НМMС │ └────────────┘ П р и м е р. Иллюстрация работы команды HMMC ─────────── 10 DATA 3E,02,F7,87,31,01,32,00,E0,C9 :' Подпрограмма в машинных кодах, 20 FOR I=0 TO 9:READ A$ :' позволяющая прочесть содержи- 30 POKE &HD000+I,VAL("&h"+A$):NEXT I :' мое регистра статуса с номером 40 DEFUSR=&HD000 :' 2 видеопроцессора 50 I=&HA000 :' С этого адреса "берем" данные 60 SCREEN 8 :' Возможны SCREEN 5 ÷ SCREEN 8 61 VDP(36+1)=10:VDP(37+1)=0 :' X,Y-координаты блока 70 VDP(38+1)=10:VDP(39+1)=0 :' Длины сторон блока по осям OX 80 VDP(40+1)=30:VDP(41+1)=0 :' и OY 81 VDP(42+1)=30:VDP(43+1)=0 :' 90 VDP(44+1)=PEEK(I) :' Цвет берем из RAM 100 VDP(45+1)=0 :' Ориентируем блок 110 VDP(46+1)=&B11110000 :' Выполняем команду HMMC 120 A=USR(0):A=PEEK(&HE000) :' Читаем 2-й регистр статуса◀┐┐ 130 CE=(A AND &B00000001) :' Выделяем бит CE ││ 140 IF CE=0 THEN 190 :' Если он равен 0, то ───────││┐ 150 TR=(A AND &B10000000) :' иначе выделяем бит TR │││ 160 IF TR=0 THEN 120 :' Если он равен 0, то ───────┘││ 170 I=I+1:VDP(44+1)=PEEK(I) :' иначе задаем новый цвет ││ 180 GOTO 120 :' ────────────────────────────┘│ 190 A$=INPUT$(1) :' К о н е ц ◀─────────────────┘ 2.8.3.2. К о м а н д а YMMM Тщательно пережевывайте пищу, этим вы помогаете обществу. И.Ильф и Е.Петров Команда YMMM переносит данные из области, определяемой величинами DX, SY,NY,DIX, DIY, и правой или левой "границей" видеопамяти в Y-направле- нии, задаваемом параметром DY. ┌───────────────────────────────────────┐ ─▶ DIX │ (DX,DY)┌────────────────────────┤ (X-направление) │ │ А д р е с а т │ │ └───────────▲────────────┤ │ │ │ │ (DX,SY)┌────────────────────────┤ │ │NY И с т о ч н и к │ │ └────────────────────────┤ └───────────────────────────────────────┘ │ ▼ DIY (Y-направление) Опишем порядок выполнения команды YMMM. 1. Вначале устанавливаются необходимые параметры в регистры команд VDP, а именно: α) MXD: задать область памяти для адресата: (0: видеопамять; 1: расширенная память); DIX: направление по Х-координате от точки источника в сторону правого или левого края экрана (0: направо; 1: налево); DIY: направление для NY (0: вниз; 1: вверх) . Номера битов 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 45 │ 0 │ MXC │ MXD │ MXS │ DIY │ DIX │ EQ │ MAJ │ (регистр аргумента) └─────┴─────┴──▲──┴─────┴──▲──┴──▲──┴─────┴─────┘ │ │ │ Выбор области памяти ─────────────────┘ │ │ Направление пересылаемых данных (Y) ──────────────┘ │ Направление пересылаемых данных (X) ────────────────────┘ β) DX: базовая Х-координата и с т о ч н и к а (oт 0 до 511)(отметим, что в режимах SCREEN 5 и SCREEN 7 теряется один младший бит, а в режиме SCREEN 6 - 2 младших бита); SY: базовая Y-координата и с т о ч н и к а (от 0 до 1023). Номера битов 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 34 │ SY7 │ SY6 │ SY5 │ SY4 │ SY3 │ SY2 │ SY1 │ SY0 │ (базовая координата Y └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ пересылаемого блока (младшая часть)) ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 35 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ SY9 │ SY8 │ (базовая координата Y └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ пересылаемого блока (старшая часть)) ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 36 │ DX7 │ DX6 │ DX5 │ DX4 │ DX3 │ DX2 │ DX1 │ DX0 │ (базовая координата X └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ пересылаемого блока (младшая часть)) ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 37 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ DX8 │ (базовая координата X └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ пересылаемого блока (старшая часть)) γ) DY: базовая Y-координата а д р е с а т а (от 0 до 1023) (отметим, что в режимах SCREEN 5 и SCREEN 7 теряется один младший бит, а в режиме SCREEN 6 - 2 младших бита); NY: "ширина" пересылаемого блока по Y-направлению в точках (от 0 до 1023). Номера битов 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 38 │ DY7 │ DY6 │ DY5 │ DY4 │ DY3 │ DY2 │ DY1 │ DY0 │ (базовая координата Y └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ адресата (младшая часть)) ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 39 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ DY9 │ DY8 │ (базовая координата Y └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ адресата (старшая часть)) ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 42 │ NY7 │ NY6 │ NY5 │ NY4 │ NY3 │ NY2 │ NY1 │ NY0 │ (количество точек по Y-└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ координате (младшая часть)) ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 43 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ NY9 │ NY8 │ (количество точек по Y-└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ координате (старшая часть)) 2. Выполнение команды происходит после помещения числа 11110000b в ре- гистр команд с номером 46. Номера битов 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Р е г и с т р 46 │ 1 │ 1 │ 1 │ 0 │ 0 │ 0 │ 0 │ 0 │ (регистр команды) └──▲──┴──▲──┴──▲──┴─────┴─────┴─────┴─────┴─────┘ └─────┴─────┘ К о д к о м а н д ы YMMM 3. При выполнении команды YMMM СЕ-бит регистра состояния с номером 2 будет установлен в 1, а после выполнения - в 0. П р и м е р. Иллюстрация действия команды YMMM ─────────── 10 SCREEN 8 ' Возможны режимы SCREEN 5 ÷ SCREEN 8 20 FOR I=15 TO 240 STEP 15 ' ┐ Цепочка разноцветных окружностей, ко- 30 CIRCLE(I,15),15,I ' │ торую мы будем копировать 40 NEXT ' ┘ 50 A$=INPUT$(1) ' Подождем до нажатия любой клавиши... 60 VDP(34+1)=0: VDP(36+1)=0 ' Y,X - координаты пересылаемого блока 70 VDP(38+1)=181 ' Так как копирование ведется только в 80 :' ' Y-направлении, то указываем Y-координа- 90 :' ' ту адресата (X-координата остается преж- 95 :' ' ней) 100 VDP(42+1)=31 ' "Высота" (длина по оси Y) пересылаемого 105 :' ' блока 110 VDP(45+1)=&B00000000 ' 111 :' ▲ ▲▲ ' Пересылаем 120 :' │ │└──────── ' н а п р а в о и 130 :' │ └───────── ' в н и з 140 :' └─────────── ' Пересылаем во VRAM 150 VDP(46+1)=&B11100000 ' К о д команды YMMM 170 A$=INPUT$(1) ' К о н е ц