Spectrofon #16
20 декабря 1995

Система - о проблемах совместимости клонов Спектрума. Основы программирования музыкального процессора AY-8910/12.

<b>Система</b> - о проблемах совместимости клонов Спектрума. Основы программирования музыкального процессора AY-8910/12.
┌──────────────────────────────┐
│ ───────   СИСТЕМА   ──────── │
└──────────────────────────────┘

 Потехин Леонид
    LeoSOFTWARE from *SA*

   Я  хотел бы продолжить тему о
совместимости  компьютеров. Сна-
чала  немного  о известном прог-
раммном приеме OUT (#FD),A. Этот
прием  применяется в двух случа-
ях: для переключения страниц ОЗУ
(порт  #7FFD)  и для обращения к
музыкальному  сопроцессору (порт
#FFFD). По моим исследованиям он
не  срабатывает  на SCORPION'ах,
АТМ, некоторых 128К машинах соб-
ранных либо на одном большом чи-
пе,  либо  на бывших 48К машинах
память   которых   расширена  до
128k.


   Основная  цель  использования
этого  приема  - немного сэконо-
мить на быстродействии и освобо-
дить регистр ВС под другие цели.
Список нерабочих программ доста-
точно    велик,   очень   многое
исправлено. Но самое плохое, что
несмотря на все, многие програм-
мисты продолжают выпускать прог-
раммы  с  подобной недоработкой.
Переключать  страницы через порт
#FD еще можно (как - об этом ни-
же), но обращаться к музыкально-
му сопроцессору наверное все-та-
ки стоит через порт #FFFD.

   Идея  использования порта #FD
для смены страниц ОЗУ заключает-
ся  в  том, что на выше перечис-
ленных  компьютерах  через  порт
#FD  страницы  ОЗУ корректно пе-
реключаюся,   меняются  активные
экраны,  но для этого необходимо
в  байте, который отправляется в
порт,  устанавливать шестой бит,
т.е.:

для переключения на 0 банк ОЗУ в
порт направится байт #50

для переключения на 1 банк ОЗУ в
порт направится байт #51

для переключения на 2 банк ОЗУ в
порт направится байт #52

для переключения на 3 банк ОЗУ в
порт направится байт #53

и т.д.

   Вполне возможно, что подобный
фокус может не пройти на компью-
терах,   где  шестой  бит  порта
#7FFD  используется  в  каких-то
целях. (Кстати,  хотелось бы уз-
нать, что это за машины. В прог-
рамме CONVER COMMANDER v3.02 су-
ществует подобное обращение, су-
дя  по  всему  для  переключения
страниц).   Для  универсальности
можно  предложить простой способ
распознавания  различных компью-
теров:

Текст  программы с переключением
страниц выглядит так:

ADR1    LD    A,#11
        OUT   (#FD),A

Аналогично,  пусть где-то дальше
встречается такой же кусок прог-
раммы  с  меткой  ADR2. В начале
работы  программы  должна выпол-
няться примерно такая процедура:
(естественно,  она  должна нахо-
дится  в  памяти  не выше адреса
#C000)



DI
LD  BC,#7FFD
LD  DE,#1011
LD  A,(#FFFF)
LD  L,A
INC A
LD  (#FFFF),A    ;RAM 0,(#FFFF)<A+1
OUT (C),E
LD  A,(#FFFF)
LD  H,A
LD  A,L
LD  (#FFFF),A    ;RAM 1, (#FFFF)<A
LD  A,D
OUT (#FD),A

При  этом  происходит следующее:
на  SCORPION'е  включается  8-ой
банк   ОЗУ  (у  SCORPION'а  256К
ОЗУ), на машинах с коррекной од-
нобайтовой  адресацией  к  #7FFD
включается  0 банк, на остальных
изменений   не   происходит  (не
знаю,  как на АТМ, т.к. я не на-
шел  ни одной такой машины у нас
в городе). На 8 банке Scorpion'а
по  адресу #FFFF обычно лежит 0,
и если туда положить что-то дру-
гое,  изменений  не  происходит.
Далее:

LD      A,(#FFFF)
INC     L
CP      L              ; проверка на 0 банк ОЗУ
PUSH    AF             ; сохранение флаг. регистра
DEC     L
LD      B,#1F          ; для Scorpion'а необходимо
XOR     A              ; вернуться на 0 банк ОЗУ
OUT     (C),A          ;
LD      B,#7F          ;
OUT     (C),D          ;
LD      A,L
LD      (#FFFF),A
OUT     (C),E
LD      A,H
LD      (#FFFF),A
OUT     (C),D
POP     AF
RET     Z

LD      HL,ADR1        ; адаптация программы для
LD      A,(HL)         ; корректного переключения
OR      #50            ; страниц под компьютеры,
LD      (HL),A         ; где обычное обращение к
LD      HL,ADR2        ; порту #FD не срабатывает.
LD      A,(HL)
OR      #50
LD      (HL),A
RET


   Программа  написана на скорую
руку, возможны различные упроще-
ния и изменения. Важен сам прин-
цип. Способ испытан на TASM 3.1,
SIMPSONS,  SATISFACTION, INSULT,
STS 2.6 и др. (Только для перек-
лючения  страниц!!!  А  для кор-
ректного обращения к музыкально-
му  сопроцессору  пришлось пере-
писывать    программу-проигрыва-
тель!).

   Для  исправления  чужих прог-
рамм  этот способ более приятен,
так как найти необходимые адреса
и  прицепить  маленькую подпрог-
рамму  с вызовом где-то из нача-
ла,  чаще оказывается легче, чем
использовать  порт  #7FFD. (Если
Вы  занимались аналогичной пере-
делкой чужих программ, то причи-
ны понятны).

"S":  Следующий материал, подго-
товленный   Леонидом   Потехиным
затрагивает  музыкальный  сопро-
цессор.  Речь  пойдет о том, как
можно непосредственно программи-
ровать  AY 8910/12.  Думаем, что
этот  материал  поможет в работе
всем, кто работает над созданием
игрового  программного обеспече-
ния.



          AY-8910/12:
    ОСНОВЫ ПРОГРАММИРОВАНИЯ

   Микросхема  содержит  16  ре-
гистров,  которые отбираются пу-
тем записи вначале по адресу за-
писи   (адрес   ввода/вывода   -
#FFFD(65533))  номера регистра и
затем считывание содержимого ре-
гистра  (того же адреса) или за-
писи в регистр данных адреса за-
писи  (#BFFD(49149)).  Когда ре-
гистр отобран, может быть выпол-
нено несколько  считываний/запи-
сей:  адрес  порта записи должен
изменятся  только  тогда,  когда
требуется  доступ  к другому ре-
гистру.

Основная  частота  часов в схеме
равна 1.7734 МГц (с точностью до
0.01%).   Назначенние  регистров
следующее:

R0 - тонкое управление тоном ка-
нала  А;
R1 - грубое управление тоном ка-
нала А;
R2 - тонкое управление тоном ка-
нала B;
R3 - грубое управление тоном ка-
нала В;
R4 - тонкое управление тоном ка-
нала С;
R5 - грубое управление тоном ка-
нала С.

   Тон   канала  есть  12-битное
значение,  получаемое  из  суммы
разрядов  D3-D0 грубых регистров
и D7-D0 тонких регистров. Основ-
ное устройство тона есть частота
часов,  разделенная  на 16 (т.е.
110.83 кГц)  и с диапазона счет-
чика  в 12 бит могут быть порож-
дены  частоты  от  27 Гц  до 110
кГц.

R6  - управление генератора шума
(D4-D0);  Период  источника шума
берется отсчетом 5 младших битов
регистра  шума каждый период ча-
сов звука, разделенный на 16.

R7  - управление миксером и вво-
дом/выводом.  При  этом: D7 - не
используется;

D6 - 1-порт ввода, 0-порт вывода

     D5 - шум канала С;
     D4 - шум канала В;
     D3 - шум канала А;
     D2 - тон канала С;
     D1 - тон канала В;
     D0 - тон канала А.

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

R8 - управление амплитудой кана-
ла А;

R9 - управление амплитудой кана-
ла В;

RA - управление амплитудой кана-
ла С.

   При этом:

D4 - 1-использование генератора
пакета.

D4  -  0-использование  значения
D3-D0 для амплитуды.

D3-D0 - амплитуда.



   Эти  три  регистра  управляют
амплитудой каждого канала, кото-
рая  либо моделируется, либо нет
регистрами пакета.

   RB - грубое управление перио-
дом пакета;
   RC - тонкое управление перио-
дом пакета.

   Значения 8 бит в RB-RC сумми-
руются  для получения разрядного
числа,  которое считывается вниз
в единицах по 256 раз часов зву-
ка.  Частоты  пакета  могут быть
между 0.1 Гц и 5 кГц.

RD - управление пакетом:
 D3 - продолжение;
 D2 - нарастание;
 D1 - изменение;
 D0 - держать.

             *  *  *
 Кирилл Громов

     И СНОВА О СОВМЕСТИМОСТИ

   Меня  последнее  время  часто
спрашивают:  "Почему у нас в не-
которых  программах  не работает
KEMPSTON  JOYSTICK?"  Причин тут
несколько,  и я спешу их разьяс-
нить. Для этого окунемся немного
в схемотехнику нашего обожаемого
SPECCY.

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

#FF 11111111 O-O-O-H, MY GOD!
#FE 11111110 BORD,MAG,BEEP,KEYB
#FD 11111101 ! ЧИТАЙ НИЖЕ !
#FB 11111011 ZX-PRINTER
   Порт  #FF на самом деле чита-
ется не только по своему истори-
ческому  адресу, а вообще по лю-
бому   незадействованному.  Порт
#FD  на  самом  деле  нельзя ис-
пользовать   напрямую,  так  как
возможен   "ответ"   сразу  нес-
кольких устройств - порта конфи-
гурации  ZX-128,  муз. сопроцес-
сора.  Хотя  его очень часто ис-
пользуют  для переключения стра-
ниц  памяти.  На компьютерах где
он  реализован  как  в фирменном
SPECCY эти номера проходят. Зато
на  горе-компьютерах  типа "АТМ"
ну  и так далее (вы меня поняли)
это  приводит  к  печальным  ре-
зультатам.

   Это  были основные порты, те-
перь далее.



Порт #F7 11110111 \
Порт #EF 11101111  > ZX-LPRINT 3
Порт #E7 11100111 /

Как  видите,  остались  адреса с
#1F  до #DF. В двоичном виде это
выглядит так:

Порт #1F 00011111
Порт #3F 01011111
Порт #9F 10011111
Порт #DF 11011111

   Это - адреса, по которым мож-
но  обращаться, избегая конфлик-
тов  на шине данных. Легко заме-
тить, что во всех адресах разряд
A5  равен  0. Именно по принципу
грубой  дешифрации  этот  разряд
"отвечает" за KEMPSTON JOYSTICK.
То  есть значения джойстика тео-
ретически   должны  читаться  по
всем этим адресам.

   На  деле  же, у кого KEMPSTON
JOYSTICK   выполнен  на  м/схеме
КР580ВВ55,   значения  джойстика
будут  читаться ТОЛЬКО по адресу
#1F (31).  Именно поэтому, в не-
которых программах, где идет оп-
рос по маске #DF, джойстик рабо-
тать  не будет. Решение проблемы
видится  в  замене маски на #1F.
Действительно,   зачем  городить
лишнюю  логику  и мучить компью-
тер, когда адрес #1F стал факти-
чески стандартом в нашей стране.
Я полагаю, что дал исчерпывающий
ответ на данный вопрос.

   В заключение хочется сказать,
что  все,  кому  не  безразличны
вопросы  железа,  и  у кого есть
собственные  находки, могут зво-
нить ко мне на мою ZX, повторяю,
именно ZX BBS.


   Свои находки желательно офор-
мить  в  виде файла в ZX-WORD, и
поместить мне на сервер. Это ка-
сается,  правда,  только жителей
Москвы  и области. Остальные мо-
гут мне писать.

   Выражаю огромную признательность:

 МИХАИЛУ ХОХЛОВУ (фирма "КОНДОР") за большую помощь
в моей работе.

 ДЕНИСУ ЛЕЖЕНКО (L.D.E.Soft) за солидарность и ори-
гинальные технические находки.

 АЛЕКЕСЕЮ и всей FFC за сотрудничество.

 "ИНФОРКОМ"у за их нужное всем дело.

 "SPECTROFON"  и STEP CREATIVE GROUP  за красивый и
полезный журнал.

 "ONLINE"  и  ГРИГОРЬЕВУ ДМИТРИЮ (OLDMAN) за опера-
тивность и компетентность.
   Мой  адрес: г. Москва, Гурьевский пр-зд, дом 19,
корпус 2, кв. 311.

   Телефон: 397-65-08

   Звонить с 20.00 до 22.00.

   CS BBS  работает  по  средам,  четвергам, пятни-
цам с 01.00 до 06.00.

         Громов Кирилл (C) CHUNG
                  Software (FFC)



Другие статьи номера:

Экспертиза - подробный разбор игры "Hacker".

Обзор - "жизнь на спектруме бьет ключем" - обзор основных событий 1995 года.

С миру по биту - ответы на письма читателей по игре "Звёздное Наследие".

С миру по биту - интервью с группой STEP (создателями Spectrofon и Звёздного Наследия).

Чемпионат - финал чемпионата вирусов по игре "ВИРУС-1".

Система - о проблемах совместимости клонов Спектрума. Основы программирования музыкального процессора AY-8910/12.

Конструктор - универсальная схема дешифрации порта расширения для машин с дополнительной памятью. Сравнение компьютеров "PROFI" и "SCORPION".

Фантазия - "Невыполнимое задание" - компьютерная новелла по мотивам игры "Impossible Mission".

Реклама - бесплатные обьявления.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Железо - Интервью капитана Nemo фирме Logros во время ENLiGHTa.
Записки программиста - работа с расширенной опертивной памятью на ZX Spectrum.
BBS - список станций BBS ZXNet.
FunTop98 - что не получилось.
Code - Скриптование в демо: синхронизация эффектов под музыку и не только.

В этот день...   21 ноября