SPC info '95

SPC info '95

Strogino Programming Company © winter 1995, Moscow, RussiaMarch 01, 2018

Предыдущая часть

Часть 2, продолжение.


Теперь об еще одном способе выполнить участок два раза. С этого момента примеры приводятся лишь для ассемблера PDP-11 (нотация директив для MACRO-11, MICRO.WS, TURBO и т.п.). Прошу людей, считающих, что они программируют лучше, только потому что пишут в кодах, оставить свое мнение при себе. Цикл который выполняется 2 раза:

PC - регистр счётчика команд, он же R7.

Это можно сделать только на 16-разрядном компьютере.

Сегодня говорим лишь о применении "INC PC". Команда "DEC PC" такими возможностями не обладает.

Не хочу утруждать вас трассировками и объясню как этот цикл функционирует.

1. Процессор аппаратно нормально функционирует в случае, когда значение PC нечетно.

2. При выборке байта выбирается байт, на который указывает программный счетчик (на этом еще остановимся).

3. При выборке слова (16 разрядного значения или команды) процессор выбирает слово, в которое входит байт, на который указывает программный счетчик.

4. На IBM PC изменять IP (аналог PC на БК) таким же образом, как известно, нельзя, но там есть свои нюансы.

Впервые я встретился с такой технологией году в 1988. Был такой копировщик: "COPY0M". Он обладал длиной 210 байт и сидел с адреса 372. Он успешно копировал программы с автозапуском, тогда как "COPY 1.6", работавший в РП-режиме (далекий предок CFа), не менее успешно эти же программы запускал. Это были такие игры, как "Десантник", "Пещера" и некоторые другие... В то время из языков программирования мне был известен лишь Бейсик. После загрузки можно было по нажатию клавиши записать файл. Переименовать файл в COPY0M было нельзя, но было замечено, что после загрузки файла, выходе по СТОПу и запуска COPY0M с адреса 371 или 373, можно ввести имя, а потом, нажав на клавишу, записать копируемый файл уже с новым именем. Но почему это так было не понятно. Только лет 5 спустя был обнаружен способ программирования на нечетных адресах.

Итак, как выполняется приведенная выше программа:

1. PC четен.

2. Выполняется INC PC. Регистр PC устанавливается на старший байт следующей команды, т.к. мы добавляем единицу, а процессор, выбрав команду, которая занимает одно слово, добавляет еще и двойку.

3. Выбирается и выполняется BR LOOP. Процессор вычитает четное число байт из PC, т.к. в коде команды BR хранится смещение к адресу перехода, деленное на два, т.е. переходить командами ветвления на нечетное число байт нельзя.

4. Регистр PC указывает на старший байт команды NOP. Она также выбирается и выполняется. Здесь эта команда взята для иллюстрации цикла. Об особенности передвижения по нечетным адресам будет рассказано ниже.

5. Регистр PC указывает на старший байт команды INC PC. Она выбирается, выполняется и увеличивает PC еще на один, в результате чего мы перескакиваем через BR LOOP.

Как вы наверно уже догадались, движение по нечетным адресам открывает перед нами новые возможности.

При выполнении команд, использующих адресацию через регистр PC, нужно обратить внимание на следующие моменты:

1. Если команда работает с байтом, то необходимо для устойчивой работы держать этот байт не только в младшем, но и в старшем разряде.

Держим данные и в младшем, и в старшем байтах.

2. Если вы пользуетесь командой типа "CALL ALPHA", то вы переходите по СМЕЩЕНИЮ, и если оно четное, то идя по нечетным адресам Вы перейдете на нечетный адрес.

3. Выровнять PC на четный адрес можно с помощью команды DEC PC.

4. Вы можете переходить на нечетный адрес. При этом в стеке сохраняется четный адрес если вы ушли с четным PC, и нечетный, если с нечетного. Т.е. по каким бы адресам вы ни шли - четным или нечетным, возврат из прерывания или подпрограммы будет по адресу, сохраненному в стеке.

Еще один пример.

Четность PC после возврата из процедуры зависит от четности PC непосредственно перед выполнением команды CALL.

BISB вместо MOVB т.к. MOVB расширит знак.

После выполнения в младшем байте регистра R1 - код первого введенного символа, в старшем байте R1 - код второго введенного символа.

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


BUGS

Alexander Barychev

Несколько слов об очень оригинальной доработке.

Как известно, в Вашей любимой операционной системе MK-DOS 3.15 нет autoexec'a. А ведь в MK-DOS'e 2.10 онь биль. Товарищ МКТ не позаботился о счастливом детстве пользователей БК. Пришлось эту заботу взять на себя и поведать о реализации файла "STARTS.COM" в MK-DOS 3.15.

Для этого Вам нужно любым способом достать файлы AUTOEXEC и STARTS.COM, поставляемые с MK-DOS 2.10. Если нашелся счастливый обладатель этой версии и Вы записали эти файлы, то это еще полдела. Ко второй (лучшей) половине дела кухонную утварь лучше не допускать. Итак, следует:

Переписать систему на любую чистую дискету, туда же записать вышеуказанные файлы, и исправить в файле "MKDOS V3.15" строку "VD.SYS" на, скажем, "SU.SYS". Откровенно говоря, Вы обманываете MK-DOS и заставляете его (ее) грузить "SU.SYS" вместо "VD.SYS". "SU.SYS" есть переименованный "AUTOEXEC". Да, кстати, все это будет работать только на БК0011(М), т.к. только на ней грузится файл "VD.SYS".

После выполнения вышеописанного проверьте работу системы. Если все в порядке, то переписывайте файлы "MKDOS V3.15", "SU.SYS" и "STARTS.COM".

Немного о файле "STARTS.COM". Это обычный текстовый файл, который может выполнять такие последовательные действия, как запуск нужных программ, запуск ненужных программ и т.п.

Команды:

LOAD NAME - загрузить файл по своим адpесам;

SAVE NAME - записать файл;

RUN NAME - запустить файл;

? ТЕКСТ - выдать текст;

END - он и в Африке END.

Файл STARTS.COM может быть не более 200 байт!


SOUND

Alexander Matchugovsky

После долгих колебаний было все-таки решено посвятить вас (да, именно Вас лично) в тайны создания действительно качественной музыки под COVOX. Речь идет о новых алгоритмах.

Но для начала рассмотрим старый драйвер проигрывания из SSTplay:

Вход: R0 - время звучания ноты, R1 - адрес инструмента для первого голоса, R2 - адрес инструмента для второго голоса, R3 - адрес ударного инструмента для третьего голоса. В обеих командах ADD #0,#0 первый ноль следует заменить на частоту звучания ноты (по таблице).

Подпрограмма ("драйвер") микширования и проигрывания из Strogino Sound Tracker.

Если вам в голову прийдет мысль, что этот драйвер заимствован из STDEMO by RDC, это лишний раз подтвердит, что с проблемой написания музыкальных программ вы сталкиваетесь впервые. Дело в том, что как-либо иначе написать драйвер микширования голосов для воспроизведения цифровой музыки просто невозможно, это единственный способ. И еще до появления STDEMO, когда я впервые попробовал написать 2х-голосую мелодию под COVOX, получился примерно такой же драйвер, основанный на тех же принципах. Речь об авторстве здесь не уместна.

Стоит заметить, что инструменты в памяти должны храниться не в 8-битовом представлении, а в 6-битовом (качество страдает), т.е. после загрузки с диска каждый байт инструмента нужно поделить на 4 (командами RORB).

Теперь ответ на давно возникший вопрос: почему в SST-формате всего два с половиной голоса?

Если я отвечу, что на большее число голосов не хватает быстродействия, вы мне не поверите: ведь в STDEMO звучит 4х-голосая музыка. Как же Денис с Дмитрием (RDC & XPEHsoft) этого добились? Вот тут следует несколько углубиться в теорию.

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

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

Этого объяснения уже достаточно, чтобы найти хоть какие-то преимущества 2-голосого драйвера перед 4-голосым.

На самом деле, существует способ извлекать высокие ноты и на очень медленной машине. Для этого, по сути, необходимо проигрывать инструменты существенно быстрее. А поскольку скорость работы программы не позволяет делать это "честно", приходится хитрить: при проигрывании инструментов берется каждый второй байт, т.е. скорость передвижения указателя вдоль инструмента повышается в 2 раза. Или каждый третий. Как в STDEMO. Разумеется, качество звука от этого страдает непоправимо. Судите сами: практически все инструменты, используемые при написании мелодий на Scream Tracker'е (а это небезызвестные MOD'ы, STM'ы и S3M'ы), оцифрованы на частоте всего 8 KHz! А как звучат!.. Да вот звучат-то как раз не очень. Послушайте emptymin.s3m или realize.s3m, где инструменты по 22 да по 44 KHz! Почти CD-качество (если слушать на CUBIC-player'е, который все эти 8-битные инструменты аппроксимирует аж в 64 бита!!!). Так вот: после этого инструменты на 8 KHz раздражают слух. А теперь возьмите каждый третий байт. Вы получите меньше 3 KHz! Вы представляете, что получится? Да, но в STDEMO сделано именно так, а звучит не хуже SST. Почему?

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

Квадратная волна.

Видите ли, если этот инструмент оцифровать с частотой 40 KHz, в памяти получится последовательность из, скажем, 500 нулей и 500 единиц, повторяющаяся много раз. Если оцифровать на частоте 4 KHz, то нулей и единиц будет по 50 штук, причем качество не пострадает. А теперь еще раз взгляните на инструмент: чему там страдать? Этот же звук можно извлечь даже из пьезодинамика! Вот с флейтой, органом, скрипкой, даже просто с пианино так не выйдет...

Вернемся к вопросу о SST.

Да, всего 2 нормальных голоса и третий для долбежки по одной ноте (сгодится лишь для барабанов и для песен на одном аккорде), но зато родные инструменты из ЛЮБОГО MOD'а, STM'а и даже из тех S3M'ов, где частота инструментов вплоть до 11 KHz!

Ну да ладно, с достоинствами и недостатками SST вроде разобрались, но хотел-то я рассказать про НОВЫЙ драйвер, а не про старый. Новый драйвер по-прежнему играет 2.5 голоса, но намного быстрее, качественнее и громче. Соблюдая "копирайты", отмечу, что некоторые идеи для нового драйвера заимствованы из подпрограмм микширования в "Scream Tracker III", за что следует благодарить PSI из Future Crew. Кстати, ничто не мешает превратить драйвер в 3х-и-более-голосый в ущерб качеству и оптимизации громкости. Но...

...качество, Качество и еще раз КАЧЕСТВО! Этой темой мы открыли номер, этой и закроем.


Окончание: Часть 3

Report Page