ZX-Ревю 1996 №7-8 1995 г.

Читатель - читателю - "Вариации на тему": тема пропорциональной печати, тема Spectrum`а в школе, тема программного обеспечения.


                        Уважаемая редакция!
     В своей статье я постарался написать о тех проблемах, которые
волнуют меня с тех пор, как я преобрел свой первый Spectrum (48k). С
одной стороны, это создание собственной процедуры быстрой и качественной печати. 
А с другой стороны, это идея создания некоторого расширения стандартного 
Spectrum BASIC'а, которая на современном этапе переросла в идею разработки 
нового языка программирования.
     Если первая идея была неоднократно мною реализована во многих
разных вариантах, то со второй пока масса проблем. Но я надеюсь, что
"терпение и труд все перетрут",  и к Новому Году появится бетта-версия первого 
в мире языка-интегратора ЛАМА.  О том, что должен представлять из себя этот 
язык, я довольно подробно рассказываю в своей статье.
     И наконец, мне хотелось осветить вопрос, который ни разу не поднимался на 
сраницах Вашего журнала.  А именно, программное обеспечение для компьютеров 
типа PROFI, работающих под CP/M.  Надеюсь,  что другие программисты поддержат 
меня, и на страницах ZX-Ревю появятся интересные (и главное, полезные) статьи 
про CP/M.

                      ВАРИАЦИИ НА ТЕМУ.
                     ===================
(c) Алексей Кожевников.

               1. Тема пропорциональной печати.
              ---------------------------------
    Я  занимаюсь  программированием  на  ZX Spectrum  всего два года, и только 
совсем недавно начал писать сносные программы на Ассемблере. Но в течении всего 
этого времени я внимательно следил за всеми публикациями в журнале ZX-РЕВЮ, в 
связи с чем у меня возникло нестерпимое желание поведать миру о своих
собственных разработках (и доработках).
    Первая из представляемых мною программ написана по мотивам статьи  
"Процедуры  пропорциональной  печати", опубликованой в ZX РЕВЮ 94/5 на стр.10
-18. В этой статье подробно рассматривались те принципы, по которым могут  
работать подобные процедуры. После их осмысления я приступил к написанию  
собственной программы, которую назвал SWP (Spectrum Windows Print).
    Для нормальной работы SWP, в первую очередь, требуется сформированный  
соответствующим образом набор символов. Несмотря на то, что этот фонт обладает 
нестандартной структурой (той, что была предложена в вышеупомянутой статье), 
кодировать его вручную совсем необязательно, ибо именно для этого и существует   
пока непревзойденная (в следствие отсутствия конкурентов) утилита SF (нет, 
конечно же, не Since Fiction, a Special Fonter).

==============================================================

        ORG     40000                               Листинг 1.

;--------------------------  ; Принцип действия этой программы
;----- Special  Fonter ----  ; прост до невозможности.
;--------------------------  ; Для того, чтобы получить от нее
                             ; требуемый результат, необходимо
FONT    EQU     50000        ; загрузить в экранную область
SYM_COL EQU     235          ; нарисованный с помощью
                             ; ART STUDIO фонт. Все буквы
;--------------------------  ; в нем должны быть прижаты к
                             ; левому краю знакоместа, и
        LD      HL,#4000     ; НЕ ДОЛЖНЫ залезать в его первую
        LD      DE,FONT      ; строчку. Почему? Да потому, что
        LD      IX,#0000     ; SF определяет конец символа по
        LD      B,SYM_COL    ; появлению активного бита
MADE    PUSH    BC           ; в верхней строчке знакоместа.
        PUSH    DE           ; Проще говоря, для того чтобы
        LD      C,#00        ; дать программе понять, что под
LOOP2   LD      B,#08        ; этот символ Вы не хотите
        INC     DE           ; больше занимать ни единного
        PUSH    HL           ; байта, просто нарисуйте сразу
LOOP1   RL      (HL)         ; за символом точку в верхней
        RLA                  ; строке знакоместа. Автор
        INC     H            ; рекомендует оставлять после
        DJNZ    LOOP1        ; каждого символа полоску в один
        DEC     H            ; бит, иначе при печати символы
        INC     C            ; просто будут сливаться.
        LD      (DE),A       ;
        POP     HL           ; Кроме того, для работы этой
        LD      A,(HL)       ; программы требуется задать
        BIT     7,A          ; значения переменных FONT и
        JR      Z,LOOP2      ; SYM_COL. Первая из них
        POP     DE           ; определяет адрес, по которому
        LD      A,C          ; будет расположен генерируемый
        LD      (DE),A       ; фонт. А вторая - количество
        PUSH    HL           ; символов, подготовленных к
        LD      H,#00        ; обработке утилитой SF.
        LD      L,C          ;
        EX      DE,HL        ; Ну, вот и все, что необходимо
        ADD     HL,DE        ; знать для использования этой
        ADD     IX,DE        ; программы по ее прямому
        EX      DE,HL        ; назначению, то есть генерации
        POP     HL           ; шрифтов для моей программы
        INC     HL           ; SWP.
        POP     BC           ;
        DJNZ    MADE         ; Маленкий нюанс:
        PUSH    IX           ; на выходе (в регистровой паре
        POP     BC           ; BC ) будет выдана длина нового
        RET                  ; фонта.

==============================================================

    Теперь, когда у нас есть рабочий фонт, можно приступить к написанию, 
непосредственно, программы пропорциональной печати. Spectrum Windows Print  
не имеет привязки к системе Spectrum BASIC  и предназначена для работы с 
ассемблерными программами. Адаптация  SWP  не составит труда, поэтому о ней я 
говорить не буду.
    Вопрос адаптации моей программы к Basic'у  я  обошел преднамерено, так как  
во  многом согласен с автором статьи "Проблемы развития ZX Spectrum" (ZX РЕВЮ 
96/1-2, стр.42-50). Действительно, время Basic и TR-DOS прошло! Как на 
смену MS DOS пришла операционная система Windows, так и на Spectrum'е должна   
появиться "операционка", отвечающая требованиям эпохи.
    Было бы совсем неплохо, если  бы эта OS была похожа на пресловутый  Windows  
или не столь известный OS/2. Она должна быть грамотно написана и удобна в 
использовании, и она вполне могла бы использовать в своей работе процедуру
пропорциональной печати (не обязательно мою).
    Так пусть же на Spectrum'е появится свой Windows (или хотя бы Small Hinged 
Windows, по английски это "форточка")!

    В этой программе мною были реализованы некоторые идеи относительно процедур 
печати текстовых сообщений в целом.

==============================================================

        ORG     41000                               Листинг 2.

;--------------------------
;- Spectrum Windows Print -
;--------------------------
                             ; Процедура PRINT есть ни что
PRINT   LD      A,(HL)       ; иное, как стандартная процедура
        OR      A            ; печати, которая неспособна к
        RET     Z            ; обработке контрольных кодов,
        PUSH    HL           ; но ее можно очень легко
        CALL    TYPE         ; усовершенствовать.
        POP     HL           ; Меткой конца является появление
        INC     HL           ; байта равного нулю.
        JR      PRINT

;--------------------------  ; Эта процедура есть воплощение
                             ; моей идеи о процедуре печати,
AUTOPR  EX      (SP),HL      ; которая сама определяет адрес
        PUSH    AF           ; текста, т.к. он располагается
        CALL    PRINT        ; сразу же за командой
        POP     AF           ; CALL AUTOPR. Выход из AUTOPR
        EX      (SP),HL      ; происходит на адрес,
        RET                  ; следующий за маркером конца
                             ; текста.

;--------------------------
                             ; Переменные программы:
FONT    DEFW    50000        ; - адрес фонта;
PLACE   DEFW    #4000        ; - адрес вывода на экран;
CHAR    DEFS    8            ; - буфер для символа;
SHIFT   DEFB    #00          ; - смещение внутри знакоместа;


;--------------------------  ; Процедура вывода символа
                             ; относительно произвольной
                             ; ширины (до 7-и пикселей).

TYPE    LD      HL,(FONT)    ; В HL - адрес фонта.
        SUB     #20          ; Расчет адреса кодовой
        JR      Z,SYMBOL     ; последовательности,
        LD      B,A          ; описывающей символ, код
        LD      D,#00        ; которого находится в
FIND    LD      E,(HL)       ; аккумуляторе.
        INC     E
        ADD     HL,DE
        DJNZ    FIND
SYMBOL  LD      B,(HL)       ; Теперь сформируем
        LD      C,B          ; символ, т.е. приведем его
        EX      DE,HL        ; к более-менее стандартному
ROW     INC     DE           ; виду.
        LD      A,(DE)       ; Особенностью этой процедуры
        PUSH    BC           ; является то, что здесь
        LD      HL,CHAR      ; символ оказывается
        LD      B,#08        ; прижатым к правой стороне
COLUMN  RLA                  ; знакоместа.
        RL      (HL)         ; Мне это кажется оправданным.
        INC     HL
        DJNZ    COLUMN
        POP     BC
        DJNZ    ROW
        LD      A,(PLACE)    ; Теперь обратим внимание на
        AND     #1F          ; координаты вывода.
        XOR     #1F          ; Этот участок программы
        JR      NZ,SHIFT0    ; проверяет, хватит ли в строке
        LD      A,(SHIFT)    ; места для печати очередного
        ADD     A,C          ; символа.
        CP      #08          ; И если нет, то совершает
        JR      C,SHIFT0     ; переход на следующую строку.
        CALL    NEXT
        XOR     A
        LD      (SHIFT),A
SHIFT0  LD      A,C          ; Следующим этапом будет
        LD      HL,SHIFT     ; некоторая дополнительная
        ADD     A,(HL)       ; обработка сгенерированного
        LD      B,#08        ; символа. После работы этого
        LD      E,A          ; участка программы символ
        LD      HL,CHAR      ; в буфере CHAR преобретет
SHIFT1  PUSH    BC           ; максимально удобный для
        LD      B,E          ; печати вид.
SHIFT2  RRC     (HL)
        DJNZ    SHIFT2
        INC     HL
        POP     BC
        DJNZ    SHIFT1
MASK    LD      B,C          ; Настал черед
        LD      A,C          ; формирования маски,
        EX      AF,AF'       ; посредством которой и будет
        XOR     A            ; происходить отображение
MASK1   SCF                  ; символа на экран.
        RRA
        DJNZ    MASK1
        LD      C,A
        LD      A,(SHIFT)
        OR      A
        JR      Z,SCREEN
        LD      B,A
MASK2   SRL     C
        DJNZ    MASK2
SCREEN  LD      HL,(PLACE)   ; На этом участке программы
        LD      B,#08        ; происходит начальная
        LD      A,C          ; подготовка экрана.
        CPL                  ; Очищается та область, куда
        LD      C,A          ; будет впечатан очередной
SCREEN1 LD      A,(HL)       ; символ.
        AND     C
        LD      (HL),A
        INC     H
        DJNZ    SCREEN1
        LD      A,C
        CPL
        LD      C,A
MOVE    LD      HL,(PLACE)   ; Перед Вами
        LD      DE,CHAR      ; процедура переноса
        LD      B,#08        ; символа из буфера CHAR
MOVE1   LD      A,(DE)       ; на экран, с учетом
        AND     C            ; сгенерированной маски.
        OR      (HL)
        LD      (HL),A
        INC     DE
        INC     H
        DJNZ    MOVE1
        EX      AF,AF'       ; Этот участок программы,
        LD      HL,SHIFT     ; без сомнения, очень важен,
        ADD     A,(HL)       ; т.к. именно здесь происходит
        LD      C,A          ; проверка: "А уместился ли
        CP      #09          ; весь символ в текущее
        JR      C,END        ; знакоместо?"
        LD      A,C          ; Если это не так, то
        SUB     #08          ; программа допечатает то, что
        LD      C,A          ; осталось от символа в другом
        LD      (HL),#00     ; знакоместе.
        CALL    NEXT
        JR      MASK
END     LD      A,C          ; И наконец, выход
        PUSH    AF           ; из программы TYPE,
        PUSH    HL           ; с расчетом новых координат
        CP      #08          ; вывода.
        CALL    Z,NEXT
        POP     HL
        POP     AF
        AND     #07
        LD      (HL),A
        RET

NEXT    LD      HL,PLACE     ; Подпрограмма расчета
        INC     (HL)         ; адреса верхней строчки
        RET     NZ           ; следующего знакоместа.
        INC     HL           ; При достижении конца экрана
        LD      A,#08        ; подпрограмма генерирует
        ADD     A,(HL)       ; адрес его начала (#4000).
        LD      (HL),A
        CP      #58
        RET     NZ
        LD      (HL),#40
        RET

==============================================================

    Люди! Пользуйтесь трамваями! Именно там в мою (гениальную)
голову приходят самые лучшие мысли!
    Например, идея создания процедуры  AUTOPR посетила меня именно в трамвае  
(видимо, хорошая встряска помогает моим мыслительным процессам). У этой   
процедуры есть ряд существенных достоинств, о которых я и хочу рассказать.
    Эта процедура предназначалась мною для выдачи по ходу действия программы 
какого-нибудь текстового сообщения. Как бы Вам пришлось поступить в случае  
использования обычной процедуры  печати  (например,  8252  из  ПЗУ)?  Для  
этого Вам пришлось бы найти в тексте программы такое место, где само текстовое  
сообщение не мешало бы работе программы, да еще и присвоить ей метку. Но с 
помощью процедуры AUTOPR все это можно сделать гораздо более элегантно:
        ...
        CALL    AUTOPR
        DEFB    "HELLO, WORLD!"
        NOP
        ...

    В таком виде участок программы становится  более осмысленным, да и на 
метках мы сэкономим.
    Это, собственно, все что я хотел сказать по этому поводу.

                  2.Тема Spectrum'а в школе.
                 ----------------------------

    Большое количество программ из этого раздела ZX РЕВЮ было посвящено 
рисованию математических узоров с помощью операторов PLOT и DRAW. Кроме того, 
в одном из номеров за 1994 год была опубликована программа для построения   
графиков аналитически заданных  фукций.  В свое время я так же пытался написать
подобную программу, но вследствие низкого быстродействия ZX  Spectrum, для  
работы с этой программой  нужно было обладать воистину ангельским терпением.
Да и сама графика оставляла желать лучшего.
    Неплохие  результаты дает компиляция графических программ, например,  
компилятором TOBOS FP. Но в этом случае теряется главное достоинство 
интерпретации: возможность аналитического задания обрабатываемой функции.  
К сожалению, мне не удалось решить эту проблему. Если кто-нибудь найдет 
приемлемый выход из этой ситуации, то я надеюсь, что он об этом сообщит со 
страниц ZX РЕВЮ.
    Пожалуй, самым интересным и нетривиальным (на мой взгляд) решением такой   
проблемы было бы создание нового языка программирования (действительно нового), 
который сочетал бы в себе, в равной степени, и возможности компиляторов и
возможности интерпретаторов. Главной отличительной чертой такого языка (по 
аналогии я бы назвал его интегратором) являлось бы то, что часть программы при  
ее запуске интерпретировалась по ходу работы, а часть ее сразу же переводилась 
бы в машинный или объектный код.
    Такая программа могла бы стать даже родоначальницей целой ветви 
языков-интеграторов. И если бы такой язык впервые появился на ZX Spectrum'e, то 
все пользователи IBM'ок умерли бы от зависти. Да и нам было бы чем гордиться.
    Spectrum forever !!!
    После  небольшого  идеологического  отступления  от  темы, вернемся к 
Spectrum-графике.
    В поисках интересных математических узоров я наткнулся на книгу 
В.П.Дьяконова "Язык программирования Лого", где довольно много внимания уделено 
написанию графических процедур на этом языке. Две из них, показавшиеся мне 
наиболее интересными, я решил адаптировать к Бейсику. И вот что из этого 
получилось...

==============================================================
    Программа SPI.                                  Листинг 3.

 10 LET DS=<приращение по длине>
 20 LET A=90: REM Начальный угол поворота
 30 LET DA=<приращение по углу>
 40 LET S=<начальная длина>
 50 PLOT 127,87
 60 LET DX=S*COS(A/180*PI)
 70 LET DY=S*SIN(A/180*PI)
 80 DRAW DX,DY
 90 LET S=S+DS
100 LET A=A+DA
110 IF A>360 THEN LET A=A-360
120 GOTO 60

==============================================================

    Программа SPI - это рекурсивная программа для рисования различных спиралей.  
Например, при начальных параметрах: S=4, DS=1, DA=88, можно получить такую  же  "квадратную"
раскручивающуюся спираль, как и в книге В.П.Дьяконова.
    Следующая программа BOXN также позволяет получать на экране компьютера  
довольно интересные графические объекты. И если ее откомпилировать, то, в  
комплекте с предыдущей программой SPI, она сможет доставить Вам настоящее 
"райское наслаждение".

==============================================================
    Программа BOXN.                                 Листинг 4.

 10 LET M=<количество рисуемых многоугольников>: REM M=18
 20 LET N=<количество углов у этих многоугольников>: REM N=9
 30 LET L=<длина стороны многоугольника>: REM L=20
 40 LET A=90: LET DA1=360/N: LET DA2=360/M
 50 PLOT 127,87
 60 FOR I=1 TO M
 70 FOR J=1 TO N
 80 LET DX=L*COS(A/180*PI)
 90 LET DY=L*SIN(A/180*PI)
100 DRAW DX,DY
110 LET A=A+DA1
120 IF A>360 THEN LET A=A-360
130 NEXT N
140 LET A=A+DA2
150 IF A>360 THEN LET A=A-360
160 NEXT M

==============================================================

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

               3. Тема программного обеспечения.
              ----------------------------------

             3.1. Ассемблеры, которые мы выбираем.

    До настоящего времени самым распространенным (а может быть и популярным) 
являлся макроассемблер GENS4 (из пакета DEVPAC). Надо думать, все начинающие 
программисты, вышедшие за рамки Бейсика, испытали на себе все его достоинства и 
недостатки.
    Но время GENS'а прошло! На горизонте появились ассемблеры нового поколения  
- TASM и MASM. Эти две программы являются великолепными образцами компьютерной 
мысли. Даже то, что оба они одинаково стилистически оформлены, говорит о 
приходе новой эпохи. Эти программы устанавливают новый стандартный интерфейс
для  компиляторов  языков  высокого и низкого уровня. Надеюсь, что другие 
программисты поддержат этот стандарт и помогут его развить до уровня IBM'овских  
встроеных редакторов языков TurboPascal, TurboBasic и TurboC.
    Существенным недостатком обоих этих ассемблеров является то, что они  
несовместимы на текстовом уровне с другими ассемблерами и текстовыми 
процессорами. Например, автору этой статьи приходилось много раз перескакивать  
из  текстового редактора в ТASM и обратно.
    Существенно облегчило этот процесс наличие в меню опции Import TASM 2.0.   
Фактически эта опция позволяет писать ассемблерные программы в каком-нибудь  
удобном текстовом редакторе, а затем конвертировать в TASM'овский формат. Но
авторы не предусмотрели возможности обратного конвертирования. Поэтому, пока не  
поздно, предлагаю добавить в меню опцию Export.  Действие этой опции заключалось 
бы в перекодировке программ формата TASM или MASM в любой другой текстовый 
формат (Alt или KOI. А лучше, и Alt, и КОИ).
    Надеюсь, что реализовать мое предложение будет не так уж и сложно, и вскоре  
появятся ассемблеры с опциями Import и Export. Причем, чем больше будет выбор  
конвертируемых форматов, тем лучше.
    Другим существенным недостатком обоих этих ассемблеров является отсутствие  
соответствующих им дизассемлеров  и установившихся стандартов на мнемоники  
недокументированных команд. К счастью, судя по всему, скоро наступит день, 
когда все эти проблемы будут успешно разрешены.
    И еще одна маленькая просьба. Может  быть  кто-нибудь напишет TASM (MASM)  
и STS для CP/M-режима компьютера PROFI.

                  3.2. CP/M и все,все,все...

    Всего год назад мне посчастливилось стать обладателем компьютера PROFI. 
Важной отличительной чертой этого компьютера является поддержка CP/M-режима с 
расширеным экраном (512x240). Работая в режиме СР/М, пользователь получает 
доступ к таким программным пакетам, как SUPERCALC, DBASE, SUPERTEXT, а также к
языкам программирования высокого уровня, большая часть которых на стандартном  
Spectrum'е не реализована. Это Fortran, PL/M, PL/1, Fort, TurboPascal, TurboC, 
ADA, MuLisp и другие.
    Реализована возможность использования дополнительной памяти в качестве 
электронного диска. Верхняя граница - 1 Mb.
    Использование CP/M-режима позволяет пользователю работать с IBM'овскими   
текстовыми файлами (только MS-DOS, а не Windows), совершенно не заботясь о 
совместимости. 
    Кроме того, на PROFI уже работает ряд программ, не имеющих близких аналогов  
на известных мне машинах. Хотя многие программы носят на себе четкий IBM'овский 
отпечаток. О двух таких программах я как раз и хочу  рассказать. И об их
достоинствах, и об их недостатках.
    Это файловая оболочка Copy K v.4.1 и текстовый редактор Write System 
v. 3.01. Я выбрал именно эти программы исключительно потому, что мне часто  
приходится с ними работать. И в ходе этого процесса у меня появился ряд
замечаний.
    Нет слов, Copy K - очень приятная файловая оболочка. Устроенная по принципу  
Norton'а, она черезвычайно проста в обращении, но беда в том, что она во многом 
ориентирована на работу с IBM'овской  клавиатурой, поэтому пользователь с
keyboard'ом от Spectrum'а автоматически лишается некоторых удобств. Но это 
пожалуй наименьшее из зол системы.
    Лично для меня гораздо большей проблемой стала неудовлетворительная работа  
Copy K с дискетами в форматах TR-DOS и MS-DOS. Мне не совсем понятна причина 
этих сбоев, так как под управлением системы IS-DOS аналогичные операции
работают грамотно и безошибочно, в то время как у Copy K постоянно возникает  
желание добавить к файлу лишний десяток байт. Таким образом, при копировании 
текстовых файлов из одной системы в другую, появляется всевозможный мусор, 
невозможность избавиться от которого черезвычайно раздражает.
    Поэтому хочется попросить господина Крестьяникова доработать утилиты 
ck.ms и ck.tr, и может быть добавить к ним ck.is (для полной совместимости всех 
Spectrum'овских систем).
    Теперь о редакторе Write. Этот редактор, как мне кажется, написан под 
влиянием такого известного на IBM текст-процессора, как FOTON. К сожалению, 
этот редактор во многом тоже ориентирован на IBM-клавиатуру. Но большое  
количество всевозможных удобств дает право этому редактору называться лучшим из 
лучших. В нем реализована возможность работы в двух стандартных кодировках и 
встроенный "переводчик" из одной системы в другую, работа со знаками 
псевдографики и блочные операции, удобная система форматирования текста и
многое-многое другое.
    Это единственный из известных мне текстовых редакторов Spectrum'а, 
являющийся истинно многооконным (в него встроена поддержка работы с восемью 
окнами). Работать в такой системе невыразимо удобно (почти вся неободимая 
информация всегда под рукой).
    Кроме того, редактор имеет развитую систему блочных операций, в которой я  
углядел всего один недостаток - невозможно выделить вертикальный блок. Write  
рассчитан исключительно на строчные  блоки, а иногда просто необходимо
воспользоваться именно вертикальным блоком.
    Write, как и всякая хорошая CP/M'овская  программа, поддерживает два режима 
отображения информации на экран: 64 и 80 символов в строке.
    Спасибо Вам, господин Дзюбин!
    С помощью Write можно готовить программы для TurboPascal и TurboC, которые, 
как и все IBM-подобные компиляторы, хранят свои исходные программы в виде 
обычных текстовых файлов. В принципе, его можно использовать для написания 
программ для TASM'а, но это очень неудобно.
    Лично я всегда пользуюсь текстовым процессором Write, и Вам того же желаю.

                   3.3. Перспективы CP/M'а.

    Даже в наше тяжелое время продолжается развитие программного обеспечения,  
работающего под CP/M'ом. Автор, к сожалению, не в курсе самых последних 
разработок, но даже ему известно, например, что уже существуют наработки по
резидентной библиотеке функций, обеспечивающих универсальный оконный итерфейс 
пользователя (Windows by Крестьяников А.А.). А также работающие под нашим  
Windows графический редактор Grand Crouix и музыкалка ADJ.
    Так что, до новых встреч под сенью CP/M...

                       4.Тема прощания.
                      ------------------

    И напоследок Вам скажу, что при Ярославском Государственном Педагогическом     
Университете имени К.Д.Ушинского начинает работать Клуб Любителей ZX Spectrum
(и PROFI, в частности).
    Ярославские пользователи могут узнать о его работе если будут следить за 
объявлениями в газете "Губернские вести". Для  жителей других городов, которые 
пожелают с нами связаться, предоставляю свой адрес:
                    150052   г.Ярославль,
                ул. Е.Колесовой, д.78, кв.36.
                       Кожевникову А.Б.
                        д.т. 34-51-37.

******************************************************************************
                     МУЗЫКАЛЬНЫЕ ПРОЦЕССОРЫ AY-3-8912/8912

(c) Р.Сагитдинов, г.Екатеринбуг.                     
                      
   1. ОПИСАНИЕ.
     Музыкальные прцессоры (МП) позволяют воспроизводить широкий спектр 
звуковых эффектов.                         
    Каждый из трех аналоговых каналов МП воспроизводит звуковую картину путем 
декодирования двоичного кода по логарифмической шкале.
    Все сигналы управления МП являются цифровыми и вырабатываются 
непосредственно в микропроцессоре, что дает возможность обойтись без изменений 
в схемотехнике.
    Для связи МП с микропроцессором в AY-3-8910 имеется два универсальных 
8-разрядных порта ввода/вывода, а его корпус имеет 40 выводов. В AY-3-8912 
имеется один порт и 28 выводов.
  2. НАЗНАЧЕНИЕ ВЫВОДОВ.
          DA0/DA7-шина данные/адрес с тремя состояниями. Выводы 30-37 в 
AY-3-8910, выводы 21-28 в AY-3-8912.
    Эта 8-разрядная двунаправленная шина паредназначена для пересылки адресов
и данных процессором и самим МП. В режиме данных, DA0-DA7 соответствуют разрядам 
В0-В7 регистровой области генератора. В адресном режиме DA0-DA3 задают номер
выбираемого регистра (0-15), а DA4-DA7, в сочетании с адресными входами,
А8 и неА9 формируют старшую часть адреса.
          А8 (вход)-вывод 25(17) AY-3-9810 (AY-3-8912).
        неА9 (вход)-вывод 24 AY-3-8910, в AY-3-8912 не поддерживается.
    Область памяти МП состоит из 16-ти 8-разрядных слов, входящих в состав общей 
1024-словной памяти. Как раз с помощью этих адрксных шин и происходит расширение 
адресации памяти МП с 256 до 1024 слов.
        неRESET (вход)-вывод 23 AY-3-8910, 16 у AY-3-8912.
    Используется для инициализации системы и установки блоков в исходное 
состояние путем подачи на вывод логического нуля. При этом все регистры памяти 
МП сбрасываются в ноль.
                   
                                   AY-3-8910

                            ----------------------¬  
                    земля --+1 *                40+--+5 вольт
           не используется--+2                  39+--TEST
                   канал В--+3                  38+--канал С
                   канал А--+4                  37+--DA0
           не используется--+5                  36+--DA1
                      IOB7--+6                  35+--DA2
                      IOB6--+7                  34+--DA3
                      IOB5--+8                  33+--DA4
                      IOB4--+9                  32+--DA5 
                      IOB3--+10                 31+--DA6 
                      IOB2--+11                 30+--DA7 
                      IOB1--+12                 29+--BC1 
                      IOB0--+13                 28+--BC2 
                      IOA7--+14                 27+--BDIR 
                      IOA6--+15                 26+--TEST 2 
                      IOA5--+16                 25+--А8
                      IOA4--+17                 24+--неА9
                      IOA3--+18                 23+--неRESET
                      IOA2--+19                 22+--CLOCK(тактовые импульсы)                              
                      IOA1--+20                 21+--IOA0
                            L----------------------
          CLOCK(вход)-вывод 22 AY-3-8910, 15 у AY-3-8912.
    Используется для подачи тактовой частоты, задающей временные параметры 
генераторов шума, тона и генераторов огибающей. Вход ТТЛ-совместимый.
          BDIR, BC2, BC1 (входы)-выводы 27, 28, 29 AY-3-8910, 18,19,20 у 
AY-3-8912.
    Управляющие шины-BUS DIRECTION 1,2. Исползуются для управления всеми 
внешними и внутренними шинными операциями в МП. Сигналы для этих шин 
вырабатываются непосредственно процессором.
          IOA0-IOA7 (вход/выход) - выводы 14-21 AY-3-8910, 7-14 у AY-3-8912.
          IOB0-IOB7 (вход/выход) - вывод 6-13 AY-3-8910, в AY-3-8912 не 
          поддерживается
                                                                                    
                                  AY-3-8919
                            ---------------------¬
                   канал С--+1 *               28+--DA0
                    TEST 1--+2                 27+--DA1
                  +5 вольт--+3                 26+--DA2
                   канал В--+4                 25+--DA3
                   канал А--+5                 24+--DA4
                     земля--+6                 23+--DA5
                      IOA7--+7                 22+--DA6
                      IOA6--+8                 21+--DA7
                      IOA5--+9                 20+--BC1
                      IOA4--+10                19+--BC2
                      IOA3--+11                18+--BDIR
                      IOA2--+12                17+--A8
                      IOA1--+13                16+--неRESET
                      IOA0--+14                15+--CLOCK
                            L---------------------

          TEST1-вывод 39 AY-3-8910, 2 у AY-3-8912.
          TEST2-вывод 26 AY-3-8910, в AY-3-8912 не поддерживается.
    Предназначены для тестирования генератора.
  4. РЕГИСТРЫ.
    МП имеют шестнадцать восьмиразрядных регистров(R0-R15). Через эти регистры 
осуществляется управление тональным генератором, генератором шума, смесителем и 
вводом/выводом, амплитудой выходных сигналов, генератором огибающей, формой
и периодом огибающей.    
  4.1. ТОНАЛЬНЫЙ ГЕНЕРАТОР (ТГ).
    Каждый канал имеет свой собственный ТГ, который вырабатывает импульсы 
требуемой частоты. Управляется регистрами R0-R5.
  4.2. ГЕНЕРАТОР ШУМА (ГШ).
    Вырабатывает частоту шума на все каналы. Управляется регистром R6.
  4.3. СМЕСИТЕЛЬ.
    Через этот регистр осуществляется управление звуковыми каналами и регистрами 
ввода/вывода. Управление осуществляется через регистр R7. Смеситель объединяет 
частоты генераторов тона и шума каждого из 3-х каналов. Направление передачи 
информации в портах ввода/вывода общего назначения (IOA и IOB) задается 
состоянием двух старших разрядов регистра R7.
  4.4. АМПЛИТУДА.
    Амплитуды сигналов задаются содержимым регистров R8-R10 для каналов А,В,С
соответственно.
  4.5. ГЕНЕРАТОР ОГИБАЮЩЕЙ (ГО).
    В МП реализовано два независимых способа создания сложных форм огибающей
выходного сигнала:
    - изменение частоты ГО программированием регистров R11 и R12;
    - изменение формы огибающей изменением содержимого регистра R13.
  4.6. ПАМЯТЬ ДАННЫХ ПОРТОВ ВВОДА/ВЫВОДА.
    Регистры R14 и R15 используются соответственно для связи с каналами 
ввода/вывода. Содержимое этих регистров можно в любой момент считывать и 
записывать - на формировании звука это никак не отражается.
  3. ЗВУКОВЫЕ ГЕНЕРАТОРЫ.
    Звуковая частота в МП формируется несколькими звуковыми генераторами.
К таковым относятся:
    - тональные генераторы, вырабатывающие для каждого канала основную тональную
частоту;
    - генератор шума;
    - смесители, объединяют для каждого канала их выходной и шумовой сигналы;
    - регулятор амплитуды, управляет ЦАП;
    - ЦАП, формирует для каждого из каналов выходной звуковой сигнал;
    - генератор огибающей, вырабатывает образец огибающей, используемый для 
амплитудной модуляции выходных сигналов.
  5. ПРОГРАММИРОВАНИЕ МП. 
    Поговорим о самом интересном - о программировании МП.
    Программирование МП на ZX-Spectrum осуществляется через два порта, а именно: 
49149(#BFFD) и 65533(#FFFD).
    Для доступа к какому-либо регистру МП, его номер необходимо записать в порт
65533, а значение регистра в порт 49149.
    С этим прекрасно справляется команда OUT. Поэтому МП можно программировать
как из АССЕМБЛЕРа, так и из БЕЙСИКа. Но сначала рассмотрим побитную раскладку 
регистров R0-R13, (R14,R15 никак не влияют на формирование звука).
   РЕГИСТР                             НАЗНАЧЕНИЕ
     0             Плавная установка высоты тона канала А (0...255)
     1             Грубая установка высоты тона канала А (0...15)
     2             Плавная установка высоты тона канала В (0...255)
     3             Грубая установка высоты тона канала В (0...15)
     4             Плавная установка высоты тона канала С (0...255)
     5             Грубая установка высоты тона канала С (0...15)ъ
     6             Частота шума для каналов А,В,С одновременно (0...31)
     7             Управление каналами :
             бит 0-тон А                   бит 3-шум А
             бит 1-тон В                   бит 4-шум В
             бит 2-тон С                   бит 5-шум С
        0 в бите указывает,что функция разрешена
     8             Амплитуда канала А (0...15)
     9             Амплитуда канала В (0...15)
     10            Амплитуда канала С (0...15)
        При амплитуде, равной 15 включается генератор огибающей
     11            Плавное управление периодом огибающей (0...255)
     12            Грубое управление периодом огибающей (0...255)
     13            Выбор типа огибающей (0...15)

    Пример программирования МП на АССЕМБЛЕРе выглядит так:
 
10 ;7-th ORACLE & Sagitdinov R.№1995 Special for INFORCOM
20         ORG 40000
30         ENT
40         LD BC,65533   ;
50         LD A,3        ;в порт 65533 загружается номер 3-го регистра
60         OUT (C),A     ;(грубая установка тона в канале В)
70         LD BC,49149   ;в порт 49149 загркжается значение регистра
80         LD A,5        ;(высота тона 5)
90         OUT (C),A     ;
100        LD BC,65533   ;программирование регистра 7
110        LD A,7        ;
120        OUT (C),A     ;
130        LD BC,49149   ;значение регистра 7
140        LD A,%11111101;(включается канал В,без шумовых эффектов
150        OUT (C),A     ;
160        LD BC,65533   ;прогрвммирование регистра 9
170        LD A,9        ;(амплитуда канала В)
180        OUT (C),A     ;
190        LD BC,49149   ;значение регистра 9
200        LD A,16       ;(т.к. амплитуда равна 16,то включается гене-
210        OUT (C),A     ;ратор огибающей
220        LD BC,65533   ;программирование регистра 12
230        LD A,12       ;(грубое управление периодом огибающей)
240        OUT (C),A     ;
250        LD BC,49149   ;величена периода огибающей
260        LD A,255      ;
270        OUT (C),A     ;
280        LD BC,65533   ;программирование типа огибающей
290        LD A,13       ;
300        OUT (C),A     ;
310        LD BC,49149   ;
320        LD A,%11111110;
330        RET           ;возврат

    Я не советую подобные программы использовать для написания реальных
программ, т.к. невооруженным глазом видно, что они занимают много памяти.
   Лучше пользоваться готовыми блоками или использовать музыкальные редакторы.
Данная программа приведена для лучшего понимания материала.
    Нужно немного сказать о типах огибающей:
       бит 0 - амплитуда меняется периодически от 0 до Мах;
       бит 1 - амплитуда наростает с 0 до Мах и затем остается на постоянном
    уровне;
       бит 2 - амплитуда с ее Мах значения плавно затухает, а через некоторое
    время процесс повторяется;
       бит 3-амплитуда плавно возрастает до Мах и резко обрывается.
   Период огибающей зависит от содержимого R11,R12.
    Программа, аналогичная выше приведенной, но на БЕЙСИКЕ:
10 REM 7-th ORACLE & Sagitdinov R.№1995 Special for INFORCOM
20 OUT 65533,3:OUT 49149,5:REM установка высоты тона канала В
30 OUT 65533,7:OUT 49149,BIN 11111101:REM включается канал В
40 OUT 65533,9:OUT 49149,16:REM установка амплитуды канала В
50 OUT 65533,12:OUT 49149,255:REM установка периода огибающей
60 OUT 65533,13:OUT 49149,BIN 11111110:REM выбор типа огибающей
   Эти программы программируют канал B. Замечу, что канал В в Spectrum работает 
на правый и левый каналы, а A и C на правый и левый, соответственно (имеются 
ввиду стереоканалы).
   Попробуйте бейсик-программу дополнить строками:
60 OUT 65533,9:REM подготовка к изменению амплитуды канала В
70 FOR I=10 TO 2 STEP -1:REM организация цикла
80 OUT 49149,I:REM непосредственная установка амплитуды канала В
90 NEXT I
100 GO TO 70:REM зацикливание
110 OUT 65533,7:OUT 49149,BIN 11111111:REM отключение всех каналов
   Звуковой эффект похож на звуки при подскакивании мячика. Остановить программу
можно BREAK'ом, но в этом случае МП будет генерировать какую-нибудь частоту. 
Этим реализируется главное достоинство МП - параллельная генерация звука и 
выполнение основной программы. Центральный процессор нкжен только для 
изменения содержимого регистров, командой GO TO 110 можно отключить все каналы.
   На этом я заканчиваю. Надеюсь, что Вы узнали что-нибудь новое.
     Если есть вопросы, то пишите. Думаю, информация о МП не должна ограничиться
данной статьей, а, наоборот, послужит поводом для обмена информацией на 
страницах "РЕВЮ" о музыкальных возможностях "всеми нами горячо любимого 
товарища" Spectrum`а, а может быть и послужит для открытия новой рубрики.
     Мой адрес: 620072, г.Екатеринбург, ул. В.Высоцкого 10-384, Сагитдинову Р.



СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



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

Похожие статьи:
Тусовка - отчет со второго сбора Латвийских спектрумистов.
Новости - Graphic station.
Самиздат - Нечто вроде Кашпировского....
Вступление - приложение: анкеты для заполнения акции respect, оболочка для газеты/журнала.
Обзор - обзор двух примечательных игрушек Space Crusade и Dizzy-X. Традиционный хит-парад игр.

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