Deja Vu #0A
30 сентября 2000
  Софт  

__________________________________________

(C) Max/CYBERAX Software/BDA
__________________________________________



_________    _________ ___________           ____     _______
_   ___   /   _____/ _   _____/   __ __  /_   |       _  
/      /  _____     |    __)_   |  |    |   |    /  /_  
     ____ /          |          |  |  /  |   |      _/   
 ______  //_______  / /_______  /  |____/   |___| /  _____  /
        /         /          /                  /        /
   CYBERAX Sound Editor v1.0 help file.




            Глава 1.
         Ух ты, какие кнопочки!..


   Управление  редактором   осуществляется
следующими частями клавиатуры:

CURSOR KEYS,
TRUE VIDEO,
INV VIDEO - перемещение курсора

ENTER - проигрывание сэмпла

O, P - изменение параметров на единицу

U, I - ускоренное изменение параметров

SPACE - установка/снятие флажков

L - очистка поля под курсором (cLear)

0 - очистка всех полей в строке сэмпла

SS+Q - удаление строки сэмпла

SS+W - вставка строки сэмпла

Y - копирование поля под курсором в нижнюю
    строку и перемещение на нее (copY)

T - установка метки повтора (loop To)

R - установка флага повтора (Repeat)

E - установка флага конца сэмпла (End)

1...8 - смена октавы

Z, S, X, D, C, V,
G, B, H, N, J, M - установка ноты

Те же клавиши,  нажатые вместе с CS, дадут
частоту ноты лежащей на октаву выше.  Таб-
лица нот - REAL SOUND из PT3.4

SS - переход  в режим прямого ввода  пара-
метров  (между прочим,  это весьма удобная
фича!).  Удерживая  SS  и нажимая при этом
цифровые клавиши  можно посимвольно ввести
значение параметра.   Если  вводится гром-
кость, то помимо  цифровых  можно нажимать
и клавиши A, B, C, D, E, F.  Нажатие SPACE
приведет к  отмене  сделанных изменений, а
отпускание SS - к их подтверждению.

EXT MODE - выход из редактора.



            Глава 2.
     Ой, а что это за циферки такие ?

   Итак, сэмпл состоит из 256 позиций (или
строк).  После компиляции от него останут-
ся только  позиции  с нулевой по метку END
(или REPEAT).
   Присутствие  одной из этих меток обяза-
тельно.  Позиция,  содержащая метку конца,
также  проигрывается.   Если  зацикливание
присутствует, то после  проигрывания  всех
позиций звук не заглохнет, а продолжится с
метки LOOP TO.
   Позиция состоит из следующих полей:

0) Метка LOOP TO

1) Номер (000 - 255)

2) Метка REPEAT или END

3) Громкость (0 - F)

4) Частота шума (0 - 31)

5) Частота тона (0 - 4095)

   Поля 4 и 5 содержат флажки,  означающие
маски шума и тона соответственно.

   Для  чтения/записи  сэмплов  я надолбил
небольшой глюк на BASIC'е.  После загрузки
редактора появится примерно такая менюшка:

             1. Edit sample
             2. Load sample
             3. Save sample
             4. Disk catalogue
             5. Clear sample

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

            Глава 3.
А компакт диски в ваш плейер можно сувать?


   Плэйер  по самым грубым прикидкам  жрет
максимум 300 тактов, что,  я думаю, не так
уж и много.  Перед использованием он наве-
шивается  на  player вашего любимого музы-
кального редактора.  Для примера пусть бу-
дет ProTracker v3.x.


;-----------------------------------------
        ORG   #6000
        ENT

MUS_PLR EQU   #C000;  адрес плэйера PT3
CHAN    EQU   0;      номер канала (0...2)
RG_TNE  EQU   CHAN*2+MUS_PLR+#300
RG_NSE  EQU   MUS_PLR+#306
RG_MIX  EQU   MUS_PLR+#307
RG_VOL  EQU   MUS_PLR+#308+CHAN

        CALL  MODIFY;  коверкаем плэйер
        CALL  AY_OFF;  вырубаем AY
        CALL  MUS_PLR; инициализируем музу

SMP     LD    L,0;     номер сэмпла
        CALL  INI_SMP; инициализируем

MAIN    EI
        HALT
        CALL  MUS_PLR+5; муза
        CALL  SND_PLR;   звуки
        CALL  OUTPUT;    вывод на AY
        LD    A,#7F
        IN    A,(#FE)
        BIT   1,A
        JR    Z,SMP;     SS - звук
        RRCA
        JR    C,MAIN;    SPC - выход
        JP    AY_OFF

;L - SAMPLE
INI_SMP LD    H,0
        ADD   HL,HL
        LD    BC,SM_ADTB
        ADD   HL,BC
        LD    A,(HL)
        INC   HL
        LD    H,(HL)
        LD    L,A
        LD    E,(HL)
        INC   HL
        LD    D,(HL)
        INC   HL
        EX    DE,HL
        ADD   HL,DE
        XOR   A
        LD    (NO_SM_F),A;             *
        LD    (SND_PLR+2),A
        LD    (REP_ADR+1),HL
        LD    (SND_PLR+1),DE
        RET

SND_PLR LD    HL,0
        LD    A,H
        AND   A
        JR    NZ,SMP_ON
NO_SM_F RET;                           *
        LD    (RG_VOL),A; A=0 !!!      *
        LD    HL,RG_MIX;               *
        LD    A,(HL);                  *
        OR    CHAN*3+2/2*9;            *
        LD    (HL),A;                  *
        LD    A,#C9;                   *
        LD    (NO_SM_F),A;             *
        RET
SMP_ON  LD    A,(RG_MIX)
        OR    CHAN*3+2/2*9
        LD    C,A
        LD    A,(HL)
        INC   HL
        RRCA
        JR    NC,NOT_NSE
        EX    AF,AF
        LD    A,(HL)
        INC   HL
        LD    (RG_NSE),A
        EX    AF,AF
        RES   CHAN+3,C
NOT_NSE RRCA
        JR    NC,NOT_TNE
        LD    D,(HL)
        INC   HL
        LD    E,(HL)
        INC   HL
        LD    (RG_TNE),DE
        RES   CHAN,C
NOT_TNE RRCA
        JR    NC,NOT_REP
REP_ADR LD    HL,0
NOT_REP RRCA
        JR    NC,NOT_END
        LD    H,0
NOT_END AND   #0F
        LD    (RG_VOL),A
        LD    (SND_PLR+1),HL
        LD    A,C
        LD    (RG_MIX),A
        RET

AY_OFF  LD    HL,MUS_PLR+#300+10
        XOR   A
        LD    (HL),A
        DEC   L
        LD    (HL),A
        DEC   L
        LD    (HL),A
        DEC   L
        CPL
        LD    (HL),A
OUTPUT  LD    DE,#FFBF
        LD    BC,#FFFD
        LD    HL,MUS_PLR+#300
        OUT   (C),L
        LD    B,E
        OUTI
        !ASSM 12
        LD    B,D
        OUT   (C),L
        LD    B,E
        OUTI
        !CONT
        LD    A,(HL)
        OR    A
        RET   Z
        LD    B,D
        OUT   (C),L
        LD    B,E
        OUT   (C),A
        XOR   A
        LD    (HL),A
        RET

MODIFY  LD    HL,MUS_PLR+#6E1
        LD    (HL),#18
        INC   L
        LD    (HL),#2D
        INC   L
        LD    HL,MUS_PLR+#717
        LD    A,6
        CALL  MODIFY2
        LD    (HL),#DD
        INC   L
        LD    (HL),#7D
        INC   L
        INC   A
        CALL  MODIFY2
        LD    (HL),#18
        INC   L
        LD    (HL),#21
        INC   L
        LD    L,#44
        LD    A,13
        CALL  MODIFY2
        LD    (HL),#18
        INC   L
        LD    (HL),4
        RET

MODIFY2 LD    (HL),#32
        INC   L
        LD    (HL),A
        INC   L
        LD    (HL),MUS_PLR&H+3
        INC   L
        RET


;Табличка адресов сэмплов.
SM_ADTB DW    SAMPLE0
        DW    SAMPLE1
        DW    SAMPLE2
;       ...


;А это сами сэмплы.
SAMPLE0 LCODE "SMP0"
SAMPLE1 LCODE "SMP1"
SAMPLE2 LCODE "SMP2"
;       ...


;Музон с плэйером в формате PT3.X
        ORG   MUS_PLR
        LCODE "MUZAK"
;-----------------------------------------


   Когда первые восторги от звуков и музы-
ки поутихнут,  нетрудно  заметить  главный
недостаток проигрывателя:  если  во  время
звучания  продолжительного звука  включить
еще один, пусть даже коротенький и негром-
кий, первый звук оборвется.  Такой  эффект
свойственен не только моему плэйеру. Возь-
мите любую игру со звуками и увидите  ана-
логичную картину (правда  в  одной  из них
в подобных случаях звук  выводился в неза-
нятый канал, но там не было музыки).
   Я предпринял  попытку  устранения таких
накладок и написал еще один проигрыватель.
Этот монстр жрет уже 1500 тактов максимум,
но задачу свою выполняет.
   В общем-то,  ничего  нового и сверхъес-
тественного я не придумал.   Просто теперь
при вызове звука  необходимо указывать его
приоритет (0-7). И если приоритет текущего
эффекта выше приоритета нового эффекта, то
последний будет пропущен.
   Правда,  здесь есть одна особенность (а
зачем, думаете, мне понадобилось аж полто-
ры штуки тактов ?).   Пусть играет продол-
жительный сэмпл с приоритетом 4.  Вы вызы-
ваете еще один (короткий  и  с приоритетом
3).  Первый звук прерывается, затем проиг-
рывается второй,  но  после  его окончания
вновь  начнет  играть первый,  причем не с
того места где он был прерван, а так будто
он играл непрерывно.
   Т.е. плэйер  одновременно  может играть
до 8 сэмплов, но слышен только самый "при-
оритетный" из них.   Если же приоритет те-
кущего и нового сэмпла равны,  то  текущий
прерывается и удаляется из очереди,  а его
место занимает новый.
   Кроме того, внеся небольшие изменения в
плэйер,  можно  ввести  приоритет  музона,
тогда  сэмпл  с  меньшим приоритетом будет
слышен  только  когда в данном  канале нет
музыки.

;-----------------------------------------
        ORG   #6000
        ENT

MUS_PLR EQU   #C000;  адрес плэйера PT3
CHAN    EQU   0;      номер канала (0...2)
RG_TNE  EQU   CHAN*2+MUS_PLR+#300
RG_NSE  EQU   MUS_PLR+#306
RG_MIX  EQU   MUS_PLR+#307
RG_VOL  EQU   MUS_PLR+#308+CHAN

        CALL  MODIFY;  коверкаем плэйер
        CALL  AY_OFF;  вырубаем AY
        CALL  MUS_PLR; инициализируем музу
        CALL  CLR_SEQ; очищаем очередь

SMP     LD    HL,#0002; H - приоритет
        CALL  INI_SMP;  L - номер звука

        LD    HL,#0101
        CALL  INI_SMP

        LD    HL,#0200
        CALL  INI_SMP

MAIN    EI
        HALT
        CALL  MUS_PLR+5; муза
        CALL  SND_PLR;   звуки
        CALL  OUTPUT;    вывод на AY
        LD    A,#7F
        IN    A,(#FE)
        BIT   1,A
        JR    Z,SMP;     SS - звук
        RRCA
        JR    C,MAIN;    SPC - выход
        JP    AY_OFF

;H=PRIORITY, L=SAMPLE
INI_SMP LD    A,H
        ADD   A,A
        ADD   A,A
        ADD   A,SMP_SEQ+1&L
        LD    E,A
        LD    D,SMP_SEQ+1&H
        JR    NC,$+3
        INC   D
        LD    H,0
        ADD   HL,HL
        LD    BC,SM_ADTB
        ADD   HL,BC
        LD    A,(HL)
        INC   HL
        LD    H,(HL)
        LD    L,A
        LD    C,(HL)
        INC   HL
        LD    B,(HL)
        INC   HL
        XOR   A
        LD    (NO_SM_F+1),A;           *
        LD    (DE),A
        DEC   DE
        LD    A,L
        LD    (DE),A
        INC   DE
        INC   DE
        LD    A,H
        ADD   HL,BC
        EX    DE,HL
        LD    (HL),E
        INC   HL
        LD    (HL),D
        DEC   HL
        DEC   HL
        LD    (HL),A
        RET

SND_PLR DI
        LD    (NO_SMPS+1),SP
        LD    SP,SMP_SEQ
        LD    B,8;                     [4]
        XOR   A
SMP_FND POP   HL
        OR    H
        JR    NZ,FOUND
        POP   HL
        DJNZ  SMP_FND
NO_SM_F JR    NO_SMPS;                 *
        LD    (RG_VOL),A; A=0 !!!      *
        LD    HL,RG_MIX;               *
        LD    A,(HL);                  *
        OR    CHAN*3+2/2*9;            *
        LD    (HL),A;                  *
        LD    A,NO_SMPS-NO_SM_F-2;     *
        LD    (NO_SM_F+1),A;           *
        JR    NO_SMPS
FOUND   LD    A,(RG_MIX)
        OR    CHAN*3+2/2*9
        LD    C,A
        LD    A,(HL)
        INC   HL
        RRCA
        JR    NC,NOT_NSE
        EX    AF,AF
        LD    A,(HL)
        INC   HL
        LD    (RG_NSE),A
        EX    AF,AF
        RES   CHAN+3,C
NOT_NSE RRCA
        JR    NC,NOT_TNE
        LD    D,(HL)
        INC   HL
        LD    E,(HL)
        INC   HL
        LD    (RG_TNE),DE
        RES   CHAN,C
NOT_TNE RRCA
        JR    NC,NOT_REP
        POP   HL
        PUSH  HL
NOT_REP RRCA
        JR    NC,NOT_END
        LD    H,0
NOT_END AND   #0F
        LD    (RG_VOL),A
        PUSH  HL
        POP   HL,HL
        LD    A,C
        LD    (RG_MIX),A
        DEC   B
        JR    Z,NO_SMPS
        LD    D,0
SMP_LP  POP   HL
        DEC   H
        INC   H
        JR    Z,NOT_EN
        LD    A,(HL)
        LD    C,A
        INC   HL
        AND   3
        LD    E,A
        ADD   HL,DE
        BIT   2,C
        JR    Z,NOT_RP
        POP   HL
        PUSH  HL
NOT_RP  BIT   3,C
        JR    Z,NOT_EN
        LD    H,D
NOT_EN  PUSH  HL
        POP   HL,HL
        DJNZ  SMP_LP
NO_SMPS LD    SP,0
        EI
        RET


;Эта маленькая процедурка - кардинальный
;способ вырубить все звуки.
CLR_SEQ LD    HL,SMP_SEQ+1
        LD    DE,4
        LD    B,8;                     [4]
CLSQ_LP LD    (HL),D
        ADD   HL,DE
        DJNZ  CLSQ_LP
        RET

;Процедуры AY_OFF,  MODIFY и MODIFY2 абсо-
;лютно  идентичны помещенным в первом лис-
;тинге,  поэтому я  их проскипаю.  А  если
;честно - анимация не влазит в статью...
;(Cardinal, блин, буфер под текст урезал:)

SMP_SEQ DS    4*8;                   [4*4]

;Табличка адресов сэмплов.
SM_ADTB DW    SAMPLE0
        DW    SAMPLE1
        DW    SAMPLE2
;       ...


;А это сами сэмплы.
SAMPLE0 LCODE "SMP0"
SAMPLE1 LCODE "SMP1"
SAMPLE2 LCODE "SMP2"
;       ...


;Музон с плэйером в формате PT3.X
        ORG   MUS_PLR
        LCODE "MUZAK"
;-----------------------------------------


   Теперь несколько замечаний по плэйерам.

1) Проигрыватели музыки и звуков лучше по-
   весить на прерывания.

2) После вызова процедуры  MODIFY,  плэйер
   музыки больше не влияет на регистры AY!
   Если  нужно  заглушить и музу и звуки -
   убирайте с прерываний  вызов  MUS_PLR и
   SND_PLR, затем вызывайте AY_OFF.

3) Когда звук(и) проиграются до конца, ка-
   нал глушится  на 1 фрейм.  Это  сделано
   для того,  чтобы  не оставалось гудения
   от последней проигранной позиции звука.
     Если ваш музон в данном канале не за-
   тихает никогда,  то  он  будет забивать
   это гудение и заглушку можно убрать. То
   же в случае если все ваши сэмплы  окан-
   чиваются пустой позицией.
     За  глушение   в  листингах  отвечают
   строки, помеченные (*).

4) Если нужно отрубить звуки, то:

   а) для  первого  плэйера запихайте ноль
      по адресу SND_PLR+2

   б) для второго плэйера вызовите CLR_SEQ
      (заглохнут все звуки), либо  пихайте
      ноль по адресу P*4+SMP_SEQ+1, где P-
      приоритет звука подлежащего глушению

   В обоих случаях звук прекратится только
   после   следующего   вызова  SND_PLR  и
   OUTPUT (т.е. при следующем прерывании).

5) Совсем  забыл!   Во  2-м  проигрывателе
   приоритет звуков  изменяется от 0 до 7,
   причем 0 - высший приоритет.   НИЗЯ за-
   давать приоритет больше семи !!!

6) WARNING!   Если  будете  оптимизировать
   процедуры INI_SMP (на первый взгляд они
   написаны несколько коряво), то не наде-
   лайте глюков!  Инициализатор таким сде-
   лан специально,  чтобы во время его ра-
   боты могли  приходить  прерывания с ви-
   сящим на них плэйером.   Если же сокра-
   тить эти процедуры, то плэйер может на-
   чать  проигрывать "недоинициализирован-
   ный" сэмпл, у которого, скажем, инициа-
   лизатор успел  выставить  только  млад-
   ший байт адреса начала...

7) Немного насчет быстродействия 2-го про-
   игрывателя.    Старайтесь  использовать
   меньший диапазон приоритетов. Например,
   если вам достаточно  трех уровней прио-
   ритета, то  используйте значения 7,6,5;
   если двух - 7,6 и т.п.
     Для большинства применений достаточно
   четырех  уровней.  В  листинге  кое-где
   встречаются закомментированные значения
   в квадратных  скобках.  Используйте  их
   для переделки плэйера на 4 приоритета.


   Дальнейшее наворачивание player'а:

1) Можно  для  каждого  сэмпла  в  очереди
   ввести  дополнительные  поля:  смещение
   тона и смещение шума.  Тогда один и тот
   же звук можно будет  проиграть с разной
   высотой.

2) Можно туда же добавить и поле громкости
   звука.  При этом  появится  возможность
   варьировать  громкость  звуков  в игре,
   например,  при  изменении расстояния до
   их источника.
     Для  регулирования  громкости  удобно
   использовать  содержащуюся   в  плэйере
   PT3 табличку. Делается это так:

    LD    A,#0X;  текущая громкость 0...#F
VLM OR    #Y0;    глобальная громкость*#10
    LD    L,A
    LD    H,MUS_PLR&h+1
    LD    A,(HL); новая громкость

3) Неплохо бы ввести  глобальные громкости
   для музона и для звуков.   Делается это
   опять таки по табличке из плэйера.



            Глава 4.
        Ну ты, хацкер, блин даешь!

   Если вы загружали CSE 1.0, то наверняка
заметили полное отсутствие удобного интер-
фейса для работы с диском (если не считать
BASIC).  Честно говоря, мне влом было что-
либо  сочинять.  Однако  редактор  написан
таким  образом,  что к нему любой желающий
может подцепить  свой любимый файлер.  Для
этого вам пригодится данная глава.
   Кроме того,  здесь  приведена структура
сэмплов,  которая   понадобится   если  вы
захотите написать  собственный  компилятор
звуков в нужный вам формат, конвертер в/из
другого формата или плэйер.

   Редактор располагается в памяти с адре-
са #D100 и до конца.   Остальное  ОЗУ сво-
бодно  и может быть  использовано под фай-
лер.

   Точки входа в редактор:

- #D100 - очистка редактируемого сэмпла

- #D103 - компиляция редактируемого сэмпла

- #D106 - декомпиляция сэмпла

- #D109 - редактирование


   Логика работы:

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

2) После редактирования нужно вызвать ком-
   пилятор и  только после этого сохранять
   сэмпл.  При выходе из компилятора в ре-
   гистре BC содержится длина звука.

3) В принципе,  можете работать и с неком-
   пилированными звуками.   Информация  по
   местоположению  в памяти сэмплов приве-
   дена ниже.

4) Рекомендую  посмотреть BASIC-загрузчик,
   там все разжевано подробнее.


             Формат сэмплов.

   Звуки в редакторе  представлены  в двух
форматах:   некомпилированный и компилиро-
ванный.  Первый  используется  внутри  CSE
для  редактирования  звуков,  а  во втором
формате сэмплы хранятся на диске и играют-
ся плэйером.

I) Формат некомпилированных сэмплов.

   В памяти  sample располагается с адреса
#F700. Длина sample'а фиксирована и соста-
вляет 1024 байта. На одну позицию (строку)
приходится 4 байта:

Байт 0:  бит  7   - метка REPEAT
         бит  6   - метка END
         бит  5   - метка LOOP TO
         биты 3-0 - громкость

Байт 1:  бит  7   - флаг NOISE
         биты 4-0 - частота шума

Байт 2:  бит  7   - флаг TONE
         биты 3-0 - старшие 4 бита
                    частоты тона

Байт 3:  биты 7-0 - младшие 8 бит
                    частоты тона

Примечание1: флаг включен, если соответст-
             вующие ему бит равен 1 и вык-
             лючен, если бит равен 0.

Примечание2: 7-й и 6-й биты  0-го байта не
             могут быть одновременно уста-
             новлены!   Каждая из трех ме-
             ток может встречаться в сэмп-
             ле не более одного раза.

II) Формат компилированных сэмплов.

   Компилированный  сэмпл  располагается в
памяти с адреса #FB00.  Длина sample'а пе-
ременна  и  зависит от положения метки END
(REPEAT) и от количества включенных флагов
TONE и NOISE в сэмпле.
   Первые 2 байта содержат смещение от на-
чала сэмпла+2 до позиции, на  которую про-
исходит зацикливание (LOOP TO).
   Далее идут сами позиции. На каждую при-
ходится от 1 до 4 байт:

Байт 0:  биты 7-4 - громкость
         бит  3   - метка END
         бит  2   - метка REPEAT
         бит  1   - флаг TONE
         бит  0   - флаг NOISE

   Наличие  остальных  байтов  зависит  от
значения байта 0:

- если  NOISE=TONE=0,  то  больше в данной
  позиции байтов нет.

- если флаг NOISE=1, то младшие 5 бит сле-
  дующего  байта содержат значение частоты
  шума.

- если флаг TONE=1, то далее идет два бай-
  та частоты тона: сначала байт со старши-
  ми 4-мя битами частоты (содержатся в 4-х
  младших битах),  затем  байт  с младшими
  восемью.

- если NOISE=TONE=1,  то сначала идет байт
  частоты шума, затем 2 байта тона.

  Признаком конца сэмпла служит включенный
флаг END или REPEAT. Во втором случае осу-
ществляется переход на метку LOOP TO.




            Глава 5.
            Yeah! Bonus pack!

   К редактору прилагается  специ-
альный  bonus  pack,  в котором вы
найдете  коллекцию  почти  из #100
готовых звуков!  Все это было мной
надергано из MSX'овых  саунд-моду-
лей,  которые,  в свою очередь, я
позаимствовал из музыкалок  MSX-1...MSX-12
(это  еще  далеко не все звуки,  я выбирал
более-менее приличные).
   Сначала я хотел просто  поместить звуки
в zip-архиве,  но потом подумал, что их не
совсем  удобно  в таком  виде прослушивать
(нужно по-одному грузить в редактор).  По-
этому пришлось сделать  небольшой плэйер с
возможностью отгрузки сэмплов на диск.
   Изучая  эти  звуки в  редакторе можно и
самому научится  клепать  неплохие эффекты
(как-никак  их  делали  профессионалы  для
игрушек на MSX).  Кстати,  попробуйте най-
ти  в  этой коллекции лай собаки  из METAL
GEAR...



            Глава 6.
           Пишите, Шура, пишите!

   По всем вопросам связанным с CSE пишите
в редакцию.  Если вам позарез нужна какая-
либо функция (например, копирование кусков
сэмпла в буфер и обратно) - пишите.   Если
я  сочту  вашу идею  рациональной и у меня
будет время и желание - сделаю поддержку.
   Если вдруг обнаружатся какие-либо глюки
(особенно фатальные)  -  не  поленитесь  и
сообщите.
   В принципе,  могу  помочь  с адаптацией
проигрывателя звуков к другому музыкально-
му редактору (PSC, ST PRO, FT, GT, ASM..),
хотя и не знаю  у  кого  это может вызвать
проблемы.
   Да, совсем забыл!   Если сделаете удоб-
ный и быстрый дисковый интерфейс  - присы-
лайте!



Other articles:


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

Similar articles:
Programming - KR580VV55A.
Iron - Additional graphics mode 512x192.
Introduction - On the control interface of the newspaper.
ZXNet - On the use of a modem "Allegro."

В этот день...   21 November