1

Тема: Разбор архитектуры софта ЯЗС

Привет!

Вам же всё равно надо будет с чего -то начать - тем, кто будет повторять ЯЗС, тем, кто будет ковырять её софт или пытаться эмулировать.

              ДPAЙBEP-ИHTEPПPИTATOP SA-51.
                Pукoвoдcтвo пpoгpaмиcтa.
                
                
                1.Oбpaщeниe к пpoгpaммe.

    Дpaйвep-интepпpитaтop SA-51 (дaлee SA-51) пpeднaз-
нaчeн для пpoигpывaния мeлoдии,зaпиcaннoй в cтaндapтнoм
внутpeннeм пpeдcтaвлeнии,c пoмoщью MЗC CA-51.Пpoгpaммa
c нeкoтopыми мoдификaциями пoд имeнaми TRANS.2,MUSA-
GED.P,DISPL иcпoльзуeтcя в пpoгpaммax TRANS,MUSAGED,
DISKER для иcпoлнeния мeлoдии.
    Пpoгpaммa пpeднaзнaчeнa для функциoниpoвaния в CП
ACCEMБЛEP и paзмeщaeтcя пo aдpecaм $E000-$EC00.
    Bнутpeннee пpeдcтaвлeниe мeлoдии paзмeщaeтcя пo aд-
pecaм $8000-$BFFF.
    Для paбoты пpoгpaммы нeoбxoдимo нaличиe тaблиц вpe-
мeнныx интepвaлoв и звукoвыcoтнocти пo aдpecaм $4000-
$5FFF. Ecли тaблиц в пaмяти нeт,oбpaщeниe к SA-51
"JSR  $E700 " вызывaeт иx фopмиpoвaниe.
    Пepeд нaчaлoм игpы в ячeйку $3 нeoбxoдимo зaнecти #0
для иcпoлнeния c нaчaлa или нoмep coбытия (#1-#9) для
иcпoлнeния c мoмeнтa уcтaнoвлeния флaгa coбытия вo внут-
peннeм пpeдcтaвлeнии мeлoдии.

ПPИMEP: Пуcть нa ГMД имeeтcя фaйл,coдepжaщий нeкoтopую
        мeлoдию вo внутpeннeм пpeдcтaвлeнии c имeнeм
        "NAME",пoлучeнный c пoмoщью пpoгpaмм TRANS или
        MUSAGED.Пpoигpaть eгo мoжнo c пoмoщью cлeдующиx
        кoмaнд oтлaдчикa:
        
1       >[LOAD SA-51
2       >C12E:0
3       >C13F:0
4       >[LOAD NAME,4000
5       >C122:0
6       >C133:0
7       >C14E:0
8       >C15F:0
9       >E700G
10      >3:0
11      >E000G

Гдe: cтpoкa 1    - зaгpузкa SA-51
     cтpoки 2-3  - пoдключeниe к ceгмeнтaм 2,3 бaнкoв E,F
     cтpoкa 4    - зaгpузкa в E,F фaйлa NAME
     cтpoки 5-6  - вoccтaнoвлeниe пoдключeния бaнкoв 2,3
                   к ceгмeнтaм 2,3
     cтpoки 7-8  - пoдключeниe бaнкoв E,F c мeлoдиeй к 
                   ceгмeнтaм 4,5 (к aдpecaм $8000-$BFFF)
                   (нa мecтo ДOC)
     cтpoкa 9    - фopмиpoвaниe тaблиц вpeмeнныx интepвa-
                   лoв и звукoвыcoтнocти в бaнкax 2,3(пo
                   aдpeцaм $4000-$5FFF).
     cтpoкa 10   - oпpeдeлить иcпoлнeниe c нaчaлa
     cтpoкa 11   - иcпoлнить мeлoдию.
     
Aнaлoгичнo,иcпoлнeниe мeлoдии мoжeт вызывaтьcя из пpoг-
paмм нa языкe acceмблepa.Фopмиpoвaниe тaблиц peкoмeнду-
eтcя пpoвoдить oдин paз и paзмeщaть иx в бaнкax 6,7 ,
пoдключaя иx пo мepe нeoбxoдимocти пepeд иcпoлнeниeм.


              2.Bнутpeннee пpeдcтaвлeниe.

    Зaгoлoвoк (нaчaлo пo aдpecу $8000) cocтoит из 16 бaй-
тoв и пpeдcтaвляeт coбoй длину мeлoдии (пepвыe 2 бaйтa)
и 7 aдpecoв нaчaлa тeкcтoв кaнaлoв 1-7 (7 cлeдующиx пap
бaйтoв).Ecли к-либo пapa paвнa 00,00,дaнный кaнaл нe
иcпoльзуeтcя.
    Teкcт зaвepшaeтcя бaйтaми $C0,$C0.
                                                      
----------------------------------------------------------
N   HAИM.     OПEP.TRANS             ПPEДCTABЛEHИE
----------------------------------------------------------
1   HOTA      {A..G}[L,#,&,T,.,)}     1-й бaйт:
                                       0-пaузa
                                      D7- 0
                                      D6- 0
                                      D5- 0-#,1-&
      тoлькo в кaнaлax 1-5            D4- 1-#/&-ecть,0-нeт
                                      D3-D0-нoмep нoты
                                            1-15 (cи-cи)
                                      2-й бaйт(длитeльн.)
                                      D7,D5-0
                                      D6-1-лигa ecть,0-нeт
                                      D4-1-тoчкa,0-нeт
                                      D3-1-тpиoль,0-нeт
                                      D2-D0-длитeльнocть
                                            0-цeлaя ..
                                            6-1/64

2   УДAPH.   {A..H}[L,/,\,T,.]        1-й бaйт:          
                                       0-пaузa
                                      D7-D5-0
     тoлькo в кaнaлax 6,7             D4-1
                                      D3-1-гoмкo,0-тиxo
                                      D2-D0-тoн 1-7
                                      2-й бaйт кaк у нoты
                                      
3   TEMП        Si i=1..16            $D0,$(i-1)

4   TEMБP       Tofg                  1-й бaйт: $D5
                                      2-й бaйт:
                                      D7,D6-0  
                                      D5,D4-oгибaющaя 1..3
                                      D3-гpoмкocть 0/1
                                      D2-D0-фильтpы 1-7

5   TPAHCПOPT   +/-i i=1..127         $D2,$i(минуc-в дп.к)

6   OKTABA      Oi i=0..7             $F8..$FF

7   OKT.BBEPX   /                     $D6

8   OKT.BHИЗ    \                     $D7

9   PACCTP.     Ri i=0..15            $E0..$EF

10  ДЛ.ATAKИ    Ai i=1..7             $F0..$F7

11  УCT.COБЫT.  VSn                   $DB,$n

12  CБPOC.COБ.  VCn                   $DC,$n

13  ЦИKЛ        [:N .. ]              $D8,$00,$N,$A1,$A2
                                      ...
                                      $DA,$A3,$A4
                                      гдe:A2,A1-aдpec cлe-
                                          дующeй зa ] кo-
                                          мaнды.
                                          A4,A3-aдpec $D8

14  БEЗУCЛ.ПEP. JMn                   $DD,$A1,$A2
                                      гдe A2,A1-aдp.пepex.

15  УCЛ.OПEP-Ы  IKn(..)               $C1,$n,$A1,$A2
                INn(..)               $C2,$n,$A1,$A2
                IVn(..)               $C3,$n,$A1,$A2
                                      гдe A2,A1-aдpec cлe-
                                      дующeй зa ) кoмaнды.

16  HAЧ.KAHAЛA  Kn                    $D3,$n

17  ПPEP.KAH.   ..Km                  $D4,$A1,$A2
                                      гдe A2,A1-aдpec пpo-
                                      дoлжeния кaнaлa.

18  KOHEЦ KAH.  *                     $D1,$00,$00

19  KOHEЦ TEKCTA  $                   $C0,$C0
---------------------------------------------------------

    
  CTPУKTУPA  BHУTPEHHEГO ПPEДCTABЛEHИЯ:
  -------- -------- -------- -------- -------- --------
  ! LEN  ! ! CH1  ! ! CH2  ! ! CH3  ! ! CH4  ! ! CH5  !
  -------- -------- -------- -------- -------- --------
              !_______  !
                     !  ! 
  -------- --------  !  ! 
  ! CH6  ! ! CH7  !  !  ! aдpec нaчaлa кaнaлa
  -------- --------  !  !_______________________ 
             ________!                          !
             !                                  !
             V                                  V
           ---- ---- ---    --- ---- -------- ---- ----
           !D3! !01! !   ...  ! !D4! ! NEXT ! !D3! !02!...
           ---- ---- ---    --- ---- -------- ---- ----
                                         !
          aдpec пpoдoлжeния кaнaлa       !
      ___________________________________!   кoнeц
      !                                      вceгo
      V                    кoнeц кaнaлa      тeкcтa
    ---- ---- ---      --- ---- ---- ----    ---- ----
    !D3! !01! !   ....   ! !D1! !00! !00!    !C0! !C0!
    ---- ---- ---      --- ---- ---- ----    ---- ----
    
                                       
   OПEPATOP ЦИKЛA  [:N ... ]                             
      __________________________________________
     !                                         !
     V                                         !
   ---- ---- ---- -------- ---         ---- --------  ---
   !D8! !00! !N ! !ADR2  ! !   ....    !DA! !ADR1  !  !
   ---- ---- ---- -------- ---         ---- --------  ---
                     !                                 ^
                     !_________________________________!
                     

   УCЛOBHЫE OПEPATOPЫ  IKn(..),INn(..),IVn(..)
   ---- ---- -------- ---      --- --- 
   !Ci! !n ! !ADR   ! !          ! !
   ---- ---- -------- ---      --- ---
                !                    ^   гдe IKn-Ci=C1
                !____________________!       INn-Ci=C2
                                             IVn-Ci=C3

2

Re: Разбор архитектуры софта ЯЗС

А в какие слоты допускается втыкать ЯЗС и ЯАВМИ, чтобы стандартный (уже готовый) софт мог определять/работать с этими ячейками? Какие слоты по умолчанию?

Турбо АГАТ-9/16 (65C802 CPU, 2.8 Маха), MSX2 Yamaha YIS503IIIR.

3

Re: Разбор архитектуры софта ЯЗС

ЯЗС в 5й слот, вроде. Про вторую не помню.
Для ЯЗС никакого определения не предполагается, по крайней мере я его не видел в прогах.

4

Re: Разбор архитектуры софта ЯЗС

Где-то мне попадалось упоминание про работу с ЯЗС через $C09x, то есть в первом слоте, но вот вспомнить и найти никак не могу... :(

Почему спрашиваю: в новоделе планирую $C09x использовать под свои системно-конфигурационные нужды. И не хотелось бы "попасть" на конфликт с "устоявшимся" ПО.

Турбо АГАТ-9/16 (65C802 CPU, 2.8 Маха), MSX2 Yamaha YIS503IIIR.

5 Отредактировано Voldemar0 (07-05-2017 17:00)

Re: Разбор архитектуры софта ЯЗС

Под конфигурирование можно брать C078..7F, например. Мало кто туда полезет на любой из архитектур, а для лучшей стабильности можно разрешать работу с этими регистрами только после записи в них какой нибудь сигнатуры. С07x - это вроде сброс пультов, но его вызывают по C070 обычно, да и даже если до ввода сигнатуры обращение сбросит пульты - не критично.

C09x свободна на семёрке, но на девятке она точно будет занята, хотя бы некоторыми модулями фирмы Nippel.

6

Re: Разбор архитектуры софта ЯЗС

http://forum.agatcomp.ru/static_images/music.rar

7

Re: Разбор архитектуры софта ЯЗС

Класс! А где исходники этих треков можно посмотреть? Я чего-то не нашел на сайте.

8 Отредактировано Voldemar0 (03-07-2017 14:03)

Re: Разбор архитектуры софта ЯЗС

Исходники есть далеко не для всех треков
Большинство треков есть только в виде чего-то, отдалённо напоминающего MID (см первое сообщение темы, там этот формат описан)

9 Отредактировано Voldemar0 (09-07-2017 14:47)

Re: Разбор архитектуры софта ЯЗС

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

Пока это будет просто подведением итогов.
Суть вот в чём: ЯЗС у нас одна и есть договорённость о её возврате владельцу.
Софт не идеально работает. Если будет попытка сделать реплику в железе или эмуляторе, то её будет несколько сложно тестировать. Чтобы как-то упростить этот процесс, привожу здесь то, что смог выяснить.



То, что удалось выкопать из анализа её схемы, опубликовано здесь:
http://agatcomp.ru/Reading/jzs52.shtml

Теперь о том, что удалось узнать о софте.

Опустим софт, который  требует клавиатуру и/или не требует железа вообще - там проблем разобраться не будет - клавиатура использует только один 8-битный парпорт на ЯЗС. Самое интересное - это именно звукосинтезатор 5/2.

Смотрим образ music.DSK в аттаче. Все файлы в образе собраны в один каталог, но чтобы проще было в них ориентироваться, группы файлов разделены специальными файлами, которые каждая ОС показывает по своему, но у них всегда будет нулевой размер (тип может быть I, D, Д.... DOS33C2 показывает их как "BTK Dir"). Назовём их разделителями.

Второй образ - music-d.DSK - это демка с ютуба. Запускается [RUN DEMO из ДОК. Про неё писать особо нечего.


-=--=- Софт, который работает

Напомню: ЯЗС втыкается в 1й порт и никак иначе. В других слотах будет работать, вероятно, только моя прога ЯЗС_ДЕМО. Чтобы это никак не забыть, первый же разделитель имеет имя "C09X" - это порты, на которые должна отзываться ЯЗС.

Для работы ЯЗС был найден всего один (одна штука) реально действующий драйвер и примерно 4 его клона, один из которых работает в специальных условиях, а два других запустить не удалось.

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

Итак, чтобы ЯЗС чего нибудь пела нужно либо запустить из Бейсика прогу ЯЗС_ДЕМО - всё, что она делает, показано в ролике на ютубе, а интерфейс предельно прозрачный, так что ничего писать про неё не надо. Зато она будет полезна при отладке новоделов. Либо использовать драйвер-плейер.

С плейером-драйвером всё немного сложнее.

Чтобы его запустить, при загрузке ИКП выбираем "Ассемблер".
Загружается текстовый редактор ДОК, нажимаем РЕД, в меню выбираем "Выйти в отладчик".
Появится приглашение ">". Образы в аттаче - загрузочные. Именно с этой версией ИКП я проводил исследования. Это важно, так как драйвер использует регион верхней памяти, который в других версиях ДОК может оказаться используемым иным путём.

Пишем :

[LOAD PLAYERR

Именно так: два R и скобка в начале.

Плейер будет считан в озу, можете проверить:

E000L

Должно быть что-то вроде:

E000-  20 65 E0   "?еЮ"   JSR  $E065
E003-  A2 00 ..   ""?"    LDX  #$00   '?
E005-  8A .. ..   "."     TXA  
E006-  0A .. ..   "?"     ASL  A
E007-  A8 .. ..   "("     TAY  
E008-  B9 03 80   "9??"   LDA  $8003, Y

Теперь нужно построить некие таблицы, без которых этот драйвер не работает:

E700G

Это займёт примерно 2-4 секунды.

Теперь пишем :

[LOAD ABBA.MUS,8000

Это мы прочитали музончик в память.
Вы можете выбирать любой файл из разделов "m1" и "m2".
Это музыка из двух очень разных источников, но формат у неё одинаковый.

Теперь запускаем:

E000G

Прервать воспроизведение можно нажав любую клавишу. Если вы вновь
попробуете перезапустить воспроизведение, оно продолжится с точки остановки.
Причем, даже если вы загрузите новый файл, воспроизведение пойдёт не с начала. Чтобы играть от нуля, введите:

3:0

Если же мелодия доиграла до конца (т.е. приглашение появилось без нажатий), то следующее воспроизведение начнётся с начала.

Этот плейер работает. Он автономный.

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

Ещё два плейера: DISPL и TRANS.2. Они похожи на PLAYERR, но у них нет точки входа E700, так что глюки с ними начинаются сразу от построения таблиц. Возможно, точки входа изменены, но мне было лениво дальше копаться, так как работающий пример был, а разбирать программные проблемы проще в эмуляторе (когда он будет готов).
В доке из первого сообщения они упоминаются, но там нет каких либо описаний об их особенностях. Один из этих плейеров (вроде бы DISPL) используется в комплексе "Дискотека", который мне запустить не удалось (игрался какой-то "мусор").

Отдельно о файлах DEMO.M*: это музыка из демки, по формату данных она соответствует тому, что описано выше, но в одном файле может быть несколько треков. На music.DSK есть только M1 и M2 - их можно воспроизвести. M3 и M4 не получится прочитать в память из-за их размера (нужно или писать спецпрогу для чтения по кускам или резать их). Но некоторые треки их них есть в группах m1 и m2.


-=--=- Теперь о том, как устроен файл данных

Изначально музончик пишется в виде примерно такого файла:

;         "" Hands Up Give Me Your Heart ""

;                                         music by Ottawan


K1 ; Bass

S14 T34> O2 L4 Z3 [:5

A3 E G) A3 E A)                           ; intro
D3 \ A / C) D3 \ A / D) 
G3 D E) G3 D E) 
G3 D E) G3 D G) ]

C3 \ G A) / C3 \ G A) /
C3 \ G A) / C3 \ G / C) 
G3 D E) G3 D G) 
D3 \ A / C) D3 \ A / D) [:2 [:2

G3 D E) G3 D E)                           ; couplet 1
G3 D E) G3 D G)  
E3 \ B / D) E3 \ B / D)
E3 \ B / D) E3 \ B / E)
......................

(Метта-код "K1" - это указание на то, что дальнейшие команды компилируются для первого канала.)

Затем компилируется в бинарное представление, предположительно, прогой TRANS.
Я её не пробовал, так как непосредственно к железу это не относилось.

Сам бинарный формат описан в документе в начале темы, но в аттаче вы найдетё ещё кое что:

AMViewer.pp - дизассемблер бинарного кода музыки в более-менее понятный текст (заодно некоторые ошибки кодирования может выявлять).

На выходе он даёт что-то примерно такое:

S14             S14            S14            S14            S14            S14            S14            
T341            O5             O5             T340           T340           [:5            A0             
O2              T261           T160           O4             A2             A0             [:5            
A2              A2             A1             A2             O4             Bf 1/8         A0             
[:5             A              R3             [:5            A 1/8          _ 1/8          Hp 1/8         
H 1/4           A              A              A 1/8          C 1/8          A4             Hp 1/8         
E 1/8           A              A              E 1/8          C 1/8          Dp 1/8         Gp 1/8         
G 1/8/*1.5      A              A              H 1/8          C 1/4          _ 1/8          Hp 1/8         
H 1/4           [:2            A              E 1/4          C 1/8          A0             Hp 1/8         
E 1/8           E 1/8          [:2            E 1/8          C 1/8          Bf 1/8         Hp 1/8         
H 1/8/*1.5      E 1/8          E 1/8          H 1/8          C 1/8/*1.5     _ 1/8          Gp 1/8         
D 1/4           E 1/8          E 1/8          E 1/8/*1.5     C 1/8          A4             Hp 1/8         
\               T241           E 1/8          E 1/8          \              Dp 1/8         A0             
H 1/8           E 1/8          T141           D 1/8          H 1/8          _ 1/8          Hp 1/8         
/               T240           E 1/8          F# 1/8         H 1/8          A0             Hp 1/8         
C 1/8/*1.5      E 1/8          T140           D 1/4          H 1/4          Bf 1/8         Gp 1/8         
D 1/4           T261           E 1/8          D 1/8          H 1/8          _ 1/8          Hp 1/8         
\               E 1/4/*1.5     T160           F# 1/8         H 1/8          A4             Hp 1/8         
H 1/8           D 1/8          E 1/4          D 1/8/*1.5     H 1/8/*1.5     Dp 1/8         Hp 1/8         
/               E 1/8          D 1/8          D 1/8          H 1/8          _ 1/8          Gp 1/8         
D 1/8/*1.5      E 1/8          E 1/8          D 1/8          I 1/8          A0             A4             
G 1/4           E 1/8          E 1/8          G 1/8          I 1/8          Bf 1/8         Hp 1/8         
D 1/8           T241           E 1/8          D 1/4          I 1/4          _ 1/8          A0             
E 1/8/*1.5      E 1/8          T141           D 1/8          I 1/8          A4             A0             

Здесь колонки соответствуют каналу. Команды из одной строки не обязательно будут исполнены одновременно - это просто попытка компактнее вывести данные.

Значки-мнемоники в исходнике и дизассме примерно совпадают, например, '/' - на октаву выше. Но '1/8' - это у дизасма указывает время звучания ноты или паузы, в то время как в исходнике обозначения другие.


-=--=- О том, что не работает

pl0.fm2.4170 и pl1.fm2.4070 - это два очень похожих плейера, а dt.4070 и dt.4170 - это данные (музыка) к ним.

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

Но плохо другое: не ясно, для какого железа они предназначены. Дело в том, что ЯЗС 5/2 работает с портами C09x, а ЯАВМИ - с C0Ax. Софт ни для той ни для другой других портов не знает и искать железо не пытается (даже просто проверить его наличие не соизволит).
В то же время, если взглянуть используемый плейерами драйвер (например, SYNTAGMB), сразу будет видно что-то вроде:

5003-  8D 0B C6   "??F"   STA  $C60B
5006-  8D 0F C6   "??F"   STA  $C60F
5009-  8D 0B C1   "??A"   STA  $C10B
500C-  8D 0F C1   "??A"   STA  $C10F

Т.е. обращения идут на два порта в области ROM-драйвера (на два устройства!), а не регистров.
И никаких попыток обратиться на C09x тут нет.

Из чего можно сделать два предположения:
1) очень хитрая система автонастройки софта на регистры, которая почему-то не работает. Крайне маловероятно.
2) это всё запилено под вовсе иное железо. Возможно, более раннюю или позднюю версию ЯЗС.
Почему п1 маловероятен: код, написанный на бейсике, простой, упоминает всё ту же НКЛ. Зачем эти две проги делать совсем не так, как остальной софт в рамках одной фирмы?

Сам формат файлов немного похож на то, что понимает PLAYERR, что как бы намекает на то, что авторы контактировали и что всё это связано с ЯЗС. Но всё же он не вполне совпадает, так что пытаться играть его PLAYERRом бесполезно.

Всё вышесказанное так же относится к группе файлов drums.


-=--=- Roadmap

Дальнейшие действия уже не будут требовать ЯЗС (если возникнет какой-то спорный момент, может быть она и пригодится, но всё же шанс окончить эту работу без неё вполне имеется).

Мне кажется, дальше следует действовать так:

1) Сперва (и это самое сложное) сделать эмуляцию ЯЗС в эмуляторе. Сложность в том, что ЯЗС наполовину не цифровая и реализация её эмуляции - это неплохой так практикум в области матмоделирования аналоговых схем.

2) Если кто-то до эмулятора изготовит аппаратную копию ЯЗС либо же заработает программная: нужно будет как-то их проверять. Думаю, сперва надо будет добиваться идентичности звучания ЯЗС_ДЕМО (сравнивая, хотя бы на слух записанные mp3
http://agatcomp.ru/Reading/jzs52.shtml - тут есть примеры, особенно нетривиальные для 6 и 7 каналов).

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

3) Затем уже можно будет пытаться разобраться с работой программных комплексов типа "Дискотека"...
http://agatcomp.ru/Apps/Sound2.shtml

Сам я за эту работу не возьмусь - есть более интересные дела.
Желающие же могут продолжить с описанной мной точки.

Post's attachments

Attachment icon mus.zip 356.41 kb, 51 downloads since 2017-07-09 

10 Отредактировано avivanov76 (05-08-2017 17:47)

Re: Разбор архитектуры софта ЯЗС

Решил тут поглядеть как этот SA-51 изнутри устроен. Поковырял дизассемблером PLAYERR и DISPL и обнаружил, что у обоих чего-то не хватает :) PLAYERR использует область $7800, которую непонятно кто должен инициализировать. А DISPL не только не имеет точки $E700, он вообще что-то вызывает по адресам $1800, то есть должен работать в паре с чем-то.
Попробую поковыряться еще.
----
А, черт. Таблицы тянутся почти до $7FFF, а не $5FFF, как обещает документация. Вообще, авторы драйвера себя сами ограничили. Во-первых отъели 16 К под таблицы, во-вторых выбрали 16 фиксированных темпов, то есть плавно замедлить или ускорить мелодию не получится.

11 Отредактировано garnizon (11-08-2017 07:31)

Re: Разбор архитектуры софта ЯЗС

Я написал Сергею Павловичу Полозову на предмет взять у него на время документацию, но пока как-то не получается забрать у него бумаги. И очень вероятно что там будут только описания программ как "для пользователя", так что если у вас получиться что-то нарыть - будет здорово.

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

12

Re: Разбор архитектуры софта ЯЗС

garnizon пишет:

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

Здорово!
Уж не Mickу ли?
Игорь, может донат какой обдумаешь? Каждый из нас кто сколько может подсобит тебе в подобных начинаниях.

Турбо АГАТ-9/16 (65C802 CPU, 2.8 Маха), MSX2 Yamaha YIS503IIIR.

13 Отредактировано garnizon (11-08-2017 07:56)

Re: Разбор архитектуры софта ЯЗС

Да, ему.

Доната не надо,  я хочу по платке в подарочек к НГ форумчанам,  да и не стОит в этом топике про такое.

14

Re: Разбор архитектуры софта ЯЗС

Ты, случайно, не сын Рокфеллера? ;)

Турбо АГАТ-9/16 (65C802 CPU, 2.8 Маха), MSX2 Yamaha YIS503IIIR.

15

Re: Разбор архитектуры софта ЯЗС

garnizon пишет:

Да, ему.

Доната не надо,  я хочу по платке в подарочек к НГ форумчанам

Как-то неправильно ты сюрприз готовишь :)

16 Отредактировано avivanov76 (12-08-2017 03:03)

Re: Разбор архитектуры софта ЯЗС

Voldemar0 пишет:

Как-то неправильно ты сюрприз готовишь :)

Зато дополнительный стимул покопаться в софте :)

Я думаю, PLAYERR вполне возможно восстановить до уровня исходника - то есть с осмысленными названиями процедур и переменных. Тогда его будет проще использовать в каких-то новых разработках.

Вот с pl0.fm2.4170 и pl1.fm2.4070 непонятно, есть ли смысл ковыряться. В файле PLAYMB из 4170 есть кусок кода, очень похожий на PLAYERR, который, видимо, грузит управляющие регистры каналов и таймеры. 5 штук. Но по адресам из диапазона C600-C60F, причем адреса 8,9,A,D,E - это регистры каналов, В и F - возможно, управление барабанами, хотя кроме процедуры инициализации к ним обращений нет. А вот с прерываниями там чудеса :) Вот установка обработчика прерываний:

CODE_3994
    STA    DATA_C200
    LDA    #$20
    STA    IRQVECTORLO
    LDA    #$3A
    STA    IRQVECTORHI
    STA    DATA_C220
    CLI    

Как будто управление прерываниями на другой карте.
Обработка прерываний вообще сказочно сделана. Вот обработчик:

    SEI    
    PHA    
    LDA    #$FF
    STA    DATA_3907
    NOP    
    NOP    
    NOP    
    NOP    
    NOP    
    PLA    
    CLI    
    RTI    

А где-то в коде есть такой фрагмент:

CODE_39EB
    LDA    DATA_3907
    BEQ    CODE_39EB

Такое ощущение, что авторы плеера боялись долго находиться в обработчике :) Зато ловить момент прерывания через поллинг им было не страшно :)
На мой взгляд, это мог быть какой-то ранний вариант ЯЗС, с криво прицепленными портами и схемой управления прерываниями, не влезшей на основную плату. Возможно, это просто был макет, на котором разработчики отлаживались.

17

Re: Разбор архитектуры софта ЯЗС

Еще несколько наблюдений из текста драйвера.

Во-первых, мелкая неточность в описании команды ЦИКЛ. Первый байт данных там - это число повторений, второй - это собственно счётчик. Да, прямо в музыкальном файле. Отсюда два следствия:
1) файл мелодии не будет правильно воспроизводиться, если загрузить его в псевдоПЗУ
2) если файл прервать при недоигранном цикле, а потом запустить сначала, то играться он должен неправильно, потому что счётчик цикла никто не обнулит

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

На мой взгляд тут некая недоработка - нужно было сделать еще один "служебный" трек куда помещать команды смены темпа, повторения фрагмента, установки событий, и т.п. С другой стороны, поскольку исходный нотный текст компилируется, то расстановка нужных команд во всех каналах видимо ложится на компилятор. Или не ложится, в его сторону я еще не смотрел.

Третье наблюдение: процесс воспроизведения управляется таймером, но время возникновения очередного прерывания каждый раз вычисляется заново. То есть у этого таймера нет фиксированной частоты. Это может усложнить жизнь писателям демо и игр, которые хотели бы синхронизировать музыку с процессом на экране.
В принципе, драйвер поддерживает установку и сброс событий, которые представляют собой массив байт в рабочей области драйвера и могут принимать значение 0 или 1. К сожалению, разработчики не оставили никакого внешнего API к этому делу, поэтому с оригинальным драйвером ничего кроме ручного опроса определенных адресов тут предложить нельзя. Но это кривая дорожка, потому что в разных вариантах драйвера эти адреса будут разные.
Про существование штатных прерываний драйвер не знает и вряд ли сможет существовать с ними одновременно

18 Отредактировано garnizon (04-09-2017 21:20)

Re: Разбор архитектуры софта ЯЗС

avivanov76 пишет:

Второе наблюдение: все треки (тексты каналов) независимы. В результате можно делать странные вещи: например в разных треках поставить разный темп.

Я написал по этому поводу Сергею Павловичу:
http://sarcons.ru/cons/prepodavateli/p/ … ovich.html

он не разраб платы но писал софт некоторый под неё. Вот что он ответил:

"Что касается записи музыкальных текстов, то действительно, все треки независимые. В каждом треке (или голосе) необходимо задавать исходные параметры, в том числе и разные темпы. В современной музыке такая практика существует, когда музыканты играют в разных темпах. Поэтому в принципе ничего странного в этом нет. Однако, насколько я помню, экспериментируя с текстом, я так и не смог найти точные пропорции темпа. Повторение музыкального оборота – это также типичный приём музыкального развития. при этом повторение может быть не только в басу или у ударных, но и в мелодических голосах. Думаю, что такая возможность при написания текста сделана ещё и для экономии дискового пространства, чтобы файл с текстом занимал меньше памяти."

Еще он рекомендует взглянуть на его прогу, но я не понял в связи с вопросом или нет:
http://agatcomp.ru/Apps/Sound2.shtml

19

Re: Разбор архитектуры софта ЯЗС

Отлично, спасибо!

Однако, насколько я помню, экспериментируя с текстом, я так и не смог найти точные пропорции темпа.

Надо мне будет внимательнее посмотреть. Вообще, драйвер поддерживает всего 16 разных темпов, поэтому нужных пропорций могло просто не найтись. Хотя там точно есть кратные отношения (типа 1:2). Возможно, есть какие-то ошибки с реализацией и темп "уплывает".

Кстати, генератор таблиц темпа и высоты это самое нескладное место для реверса - есть некий 5 кратной вложенности цикл, который с помощью 4 маленьких табличек создает почти 16 Кбайт ЧЕГО-ТО. Если в остальной части кода есть зацепки в виде адресов портов или команд языка, то тут долго было непонятно, с какой стороны вообще к этому подходить. Но после расковыривания основной части кода нужные зацепки таки появились, так что реверс движется к концу.

garnizon пишет:

Еще он рекомендует взглянуть на его прогу, но я не понял в связи с вопросом или нет:
http://agatcomp.ru/Apps/Sound2.shtml

Кстати, это интересно: в описании CONTRAP сказано, что темп задается числом от 2 до 30. Возможно, там какой-то другой вариант драйвера.
У меня только одна проблема в связи с этим: где этот самый CONTRAP лежит на сайте? Я перекопал все архивы из основного хранилища отсюда http://agatcomp.ru/Soft/agat.shtml , но что-то не нашел ничего :(

20

Re: Разбор архитектуры софта ЯЗС

Думал, уже закончу с реверсом драйвера, но возни с ним оказалось больше, чем я думал, а свободного времени меньше :(

Пока еще несколько находок из текста.

1. Функция исполнения мелодии от момента установки флага события, похоже, не работает. Почти все нужное есть: внутри первого прерывания нотный текст читается до момента установки флага, флаг сбрасывается, но потом происходит выход из прерывания без установки таймера. Таймер же запрограммирован в режим генерации строба, поэтому новое прерывание без загрузки счетчика не возникнет. Соответственно, воспроизведение просто "зависнет".

2. Разобрался с условными переходами.
IVn - переход, если событие с номером n не установлено
INn - переход, при несовпадении n с счётчиком цикла
IKn - переход, при несовпадении n с номером трека

Последняя команда меня в тупик поставила: какой в ней смысл, если трек фиксирован, параметр фиксирован и переход всегда выполняется (или всегда не выполняется). Но потом я вспомнил про безусловный переход. Ведь можно перейти в любое место нотного текста, в том числе в текст другого трека. Допустим, в первом треке играется мелодия A. Затем начинается мелодия B, но одновременно второй трек должен играть мелодию A. Ставим переход на текст мелодии A. Но как теперь вернуться к тексту второго трека, после того, как мелодия A сыграна? Да еще так, чтобы на воспроизведение первого трека это не влияло? А вот тут эта команда и пригодится.

3. Странности с музыкальным диапазоном. Драйвер воспроизводит ноты от си субсубконтроктавы до си третьей октавы. У ноты си субсубконтроктавы частота 15,43 Гц. Непонятно, зачем такие низкие ноты - мало какой инструмент сможет издавать такие. Человеческое ухо частоты ниже 20 Гц не воспринимает (то есть, где-то до ноты ми субконтроктавы). Ну какой-то звук конечно слышен будет, потому что форма колебания прямоугольная и будут слышны нечетные гармоники (46 Гц, 77 Гц и т.д.). Но основной тон будет не различить.

Также непонятно, почему нет 4-й октавы? У многих инструментов она есть (у фортепиано, флейты, скрипки, ксилофона, органа).

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

Есть еще особенность. Музыкальные инструменты настраиваются так, чтобы звуки соответствовали определенному строю. Например, частота ноты ля первой октавы должна быть 440 Гц (это наиболее распространенная настройка). Однако в драйвере ля настроена на 450 Гц. Я так думаю, это связано с функцией расстройки: строй можно сдвигать только вниз, поэтому изначально частоты завышены. Вот только когда драйвер выставляет настройки по умолчанию, расстройка остается нулевой.

21

Re: Разбор архитектуры софта ЯЗС

avivanov76 пишет:

У меня только одна проблема в связи с этим: где этот самый CONTRAP лежит на сайте? Я перекопал все архивы из основного хранилища отсюда http://agatcomp.ru/Soft/agat.shtml , но что-то не нашел ничего :(

Выложил:
http://agatcomp.ru/Apps/Contrap.shtml

22

Re: Разбор архитектуры софта ЯЗС

Спасибо!

23

Re: Разбор архитектуры софта ЯЗС

Так, PLAYERR добил.
Этот исходник собирается под HXA, кодировка виндовая. В тексте есть два блока неинициализированной памяти, ее содержимое я оставил как есть, потому что было проще сравнивать ассемблированный текст с исходным бинарником. Ассемблируется все байт в байт.
Так что даже если я где-то ошибся в комментариях, работать все должно правильно.
Есть несколько мест, помеченных ?? Это либо места, показавшиеся мне ошибочными, либо избыточные команды, либо места содержащие что-то вроде отладочного вывода.

Заодно поправил описание команд.

              2. Bнутpeннee пpeдcтaвлeниe.

    Зaгoлoвoк (нaчaлo пo aдpecу $8000) cocтoит из 16 бaй-
тoв и пpeдcтaвляeт coбoй длину мeлoдии (пepвыe 2 бaйтa)
и 7 aдpecoв нaчaлa тeкcтoв каналoв 1-7 (7 cлeдующиx пap
бaйтoв). Ecли старший байт какой-либo пapы paвен 00,
дaнный канал нe иcпoльзуeтcя.
    Teкcт зaвepшaeтcя бaйтaми $C0, $C0, хотя данные байты
никогда не читаются. Окончание проигрывания происходит
когда будут выполнены команды КОНЕЦ КАНАЛА во всех
используемых каналах.
                                                      
----------------------------------------------------------
N   HAИM.     OПEP.TRANS             ПPEДCTABЛEHИE
----------------------------------------------------------
1   HOTA      {A..G}[L,#,&,T,.,)}     1-й бaйт:
                                       0-пaузa
                                      D7- 0
                                      D6- 0
      тoлькo в кaнaлax 1-5            D5,D4- 00 нет знаков
                                             01 диез (#)
                                             10 недопустимо
                                             11 бемоль (&)
                                      D3-D0- нoмep нoты
                                             1-15 (cи-cи)

                                      2-й бaйт(длитeльн.)
                                      D7,D5-0
                                      D6-1-лигa ecть,0-нeт
                                      D4-1-тoчкa,0-нeт
                                      D3-1-тpиoль,0-нeт
                                      D2-D0-длитeльнocть
                                            0-цeлaя ..
                                            6-1/64

2   УДAPH.   {A..H}[L,/,\,T,.]        1-й бaйт:          
                                       0-пaузa
                                      D7-D5-0
     тoлькo в кaнaлax 6,7             D4-игнорируется,
                                         ставится в 1
                                         принудительно
                                      D3-1-грoмкo,0-тиxo
                                      D2-D0-тoн 1-7

                                      2-й бaйт кaк у нoты
                                      
3   TEMП        Si i=1..16            $D0, $(i-1)

4   TEMБP       Tofg                  1-й бaйт: $D5
                                      2-й бaйт:
                                      D7,D6-0  
                                      D5,D4-oгибaющaя 1..3
                                      D3-гpoмкocть 0/1
                                      D2-D0-фильтpы 1-7

5   TPAHCПOPT   +/-i i=1..127         $D2,$i(минуc-в дп.к)
    Задает транспозицию (сдвиг всех далее исполняемых нот
    по высоте) в полутонах. Новая команда транспозиции
    добавляет значение к текущему значению транспозиции.

6   OKTABA      Oi i=0..6             $F8..$FF
    Октавы 7 не существует, но из-за удачного расположения
    данных в коде она воспринимается как октава 0.
    Эта команда сбрасывает значение транспозиции.

7   OKT.BBEPX   /                     $D6
    Транспозиция на 12 полутонов вверх

8   OKT.BHИЗ    \                     $D7
    Транспозиция на 12 полутонов вниз

9   PACCTP.     Ri i=0..15            $E0..$EF
    Понижает высоту всех нот (но меньше, чем на
    полутон). Значение параметра прибавляется к
    коэффициенту деления для каждой ноты. Причем
    в третьей октаве значение берется как есть,
    во второй значение удваивается, в первой еше
    раз удваивается и т.д.

10  ДЛ.ATAKИ    Ai i=1..7             $F0..$F7
    Воспроизведение каждой ноты делится на две части:
    фазу атаки и фазу затухания. Команда задания
    длительности атаки позволяет указать соотношение
    этих фаз. Например, команда $F0 (атака 1) делает
    фазу атаки равной 1/8 длительности ноты, а затухания
    7/8. Атака 2 дает соотношение 2/8 и 6/8 и т.д.
    Максимальное значение 7 (команда $F6).
    Команда $F7 недопустима, так как произойдет выход за
    границы массива, содержащего указатели на таблицы
    длительности. Т.е. потом произойдет обращение к
    произвольным адресам.

11  УCT.COБЫT.  VSn                   $DB,$n
    Номер события от 0 до 32.

12  CБPOC.COБ.  VCn                   $DC,$n
    Номер события от 0 до 32.

13  ЦИKЛ        [:N .. ]              $D8,$N,$00,$A1,$A2
                                      ...
                                      $DA,$A3,$A4
                                      гдe:A2,A1-aдpec cлe-
                                          дующeй зa ] кo-
                                          мaнды.
                                          A4,A3-aдpec $D8
    Второй байт команды - число повторов, третий байт -
    счетчик цикла. Если цикл отрабатывает до конца,
    счетчик обнуляется, но если воспроизведение прервано
    на середине - обнуления не будет.

14  БEЗУCЛ.ПEP. JMn                   $DD,$n,$A1,$A2
                                      гдe A2,A1-aдp.пepex.
    Второй байт команды не используется. Видимо, сделано
    для унификации формата с условными операторами.

15  УCЛ.OПEP-Ы  IKn(..)               $C1,$n,$A1,$A2
                INn(..)               $C2,$n,$A1,$A2
                IVn(..)               $C3,$n,$A1,$A2
                                      гдe A2,A1-aдpec cлe-
                                      дующeй зa ) кoмaнды.

    IVn - переход, если событие с номером n не установлено
    INn - переход при несовпадении n с счётчиком цикла
          (наиболее вложенным)
    IKn - переход при несовпадении n с номером канала

16  HAЧ.KAHAЛA  Kn                    $D3,$n
    Команда не используется, обрабатывается как
    неизвестная.

17  ПPEP.KAH.   ..Km                  $D4,$A1,$A2
                                      гдe A2,A1-aдpec пpo-
                                      дoлжeния кaнaлa.
    То же, что безусловный переход, только 3-х байтовый.

18  KOHEЦ KAH.  *                     $D1,$00,$00
    Обрабатывается только первый байт. Наличие нулей не
    контролируется.

19  KOHEЦ TEKCTA  $                   $C0,$C0
    Команда никогда не читается и не обрабатывается.

20  НЕИЗВЕСТНАЯ КОМАНДА
    Все неопознанные команды игнорируются. Считается, что
    у каждой такой команды 1 байт параметров.
    
---------------------------------------------------------

    
  CTPУKTУPA  BHУTPEHHEГO ПPEДCTABЛEHИЯ:
  -------- -------- -------- -------- -------- --------
  ! LEN  ! ! CH1  ! ! CH2  ! ! CH3  ! ! CH4  ! ! CH5  !
  -------- -------- -------- -------- -------- --------
              !_______  !
                     !  ! 
  -------- --------  !  ! 
  ! CH6  ! ! CH7  !  !  ! aдpec нaчaлa кaнaлa
  -------- --------  !  !_______________________ 
             ________!                          !
             !                                  !
             V                                  V
           ---- ---- ---    --- ---- -------- ---- ----
           !D3! !01! !   ...  ! !D4! ! NEXT ! !D3! !02!...
           ---- ---- ---    --- ---- -------- ---- ----
                                         !
          aдpec пpoдoлжeния кaнaлa       !
      ___________________________________!   кoнeц
      !                                      вceгo
      V                    кoнeц кaнaлa      тeкcтa
    ---- ---- ---      --- ---- ---- ----    ---- ----
    !D3! !01! !   ....   ! !D1! !00! !00!    !C0! !C0!
    ---- ---- ---      --- ---- ---- ----    ---- ----
    
                                       
   OПEPATOP ЦИKЛA  [:N ... ]                             
      __________________________________________
     !                                         !
     V                                         !
   ---- ---- ---- -------- ---         ---- --------  ---
   !D8! !N ! !00! !ADR2  ! !   ....    !DA! !ADR1  !  !
   ---- ---- ---- -------- ---         ---- --------  ---
                     !                                 ^
                     !_________________________________!
                     

   УCЛOBHЫE OПEPATOPЫ  IKn(..),INn(..),IVn(..)
   ---- ---- -------- ---      --- --- 
   !Ci! !n ! !ADR   ! !          ! !
   ---- ---- -------- ---      --- ---
                !                    ^   гдe IKn-Ci=C1
                !____________________!       INn-Ci=C2
                                             IVn-Ci=C3
Post's attachments

Attachment icon PLAYERR.zip 11.34 kb, 34 downloads since 2017-10-08 

24

Re: Разбор архитектуры софта ЯЗС

Может попробуем из кучи дисков отсортировать все проги вот эти: http://agatcomp.ru/Apps/Sound2.shtml
Что бы создать рабочие диски?

25

Re: Разбор архитектуры софта ЯЗС

Большой скорости не обещаю, но взяться готов.