init repo

This commit is contained in:
Roman Krupnin 2025-02-15 18:26:49 +03:00
commit b816de49a7
238 changed files with 338896 additions and 0 deletions

209
README.md Normal file
View File

@ -0,0 +1,209 @@
# General Sound
## Профессиональная музыкальная карта для Вашего ZX Spectrum
Музыкальный бластер General Sound предназначен для совместной работы с любым ZX Spectrum совместимым компьютером
и обеспечивает качественное проигрывание оцифрованных музыкальных файлов в формате mod, а так же проигрывание отдельных оцифрованных сэмплов.
За основу GS была взята схема музыкальной платы от компьютера Amiga 500+, в связи с чем качество музыки GS
практически ни в чем не уступает знаменитому качеству музыки компьютера Amiga.
GS использует в работе свой собственный процессор и, установленные на нем 128 кб ОЗУ, благодаря чему он не отнимает ресурсы от базового процессора компьютера,
что позволяет, например, загрузить свой любимый модуль, сбросить Спектрум, загрузить ассемблер и творить под любимую музыку.
ПО внутри GS полностью берет на себя задачи проигрывания звука, интерпретации модуля и т.д.
Программирование GS сводится к передаче байт за байтом модуля и/или сэмплов, а затем требуется только подавать команды типа:
запустить модуль, установить глобальную громкость проигрывания модуля, запустить сэмпл #09 в канале #02 и т.д.
<img src="photos/RareGS.jpg" width="600" /><br>
Конструктивно GS выполнен в виде слота для компьютеров с системной шиной в стандарте ZXBUS.
Основные технические характеристики:
- Процессор - Z80, работающий на частоте 12 МГц
- ОЗУ - 128 кБ (расширяется до 2048 кБ)
- ПЗУ - 32 кБ
- Частота прерываний - 37500 Гц
- Количество каналов - четыре восьмиразрядных канала с независимой регулировкой громкости (еще 6 бит на каждый канал)
## Историческая справка
Музыкальная карты впервые была анонсирована 30 ноября 1995 на страницах журнала ZX Format #02 в рубрике "Железо - Переферия: презентация звуковой карты General Sound".
<br>https://zxpress.ru/article.php?id=285
```
Студия X-TRADE и HACKER STINGER объявляют о своей совместной разработке. Нами предпринята попытка (весьма успешная) создания принципиально
новой музыкальной приставки для ZX-SPECTRUM.
В последнее время тема альтернативной музыки для SPECCY глубоко засела в умах хаккеров и программистов, о чем свидетельствует появившееся в последнее
время большое количество программ, воспроизводящих оцифрованную музыку, таких, как INSTRUMENT, DIGITAL PLAYER и др. Предпринимались попытки присоединения к ZX-SPECTRUM приставок типа
COVOX в надежде получить удов летворительное качество звука.
К сожалению, эти попытки нельзя назвать успешными - достаточно сравнить звучание COVOXa на SPECCY и IBM PC (почувствуйте разницу!). Все это объясняется
низкой производительностью Z80 по сравнению с более современными процессорами. К тому же проигрывание оцифрованной музыки отнимает у Z80 почти 100% его
машинного времени, поэтому ни о каких других процессах параллельно с музыкой и речи быть не может. Тем более об оцифрованных спецэффектах в играх.
Поэтому мы решили не тратиться попусту и сразу сделать классную вещь! Наша музыкальная карта "ZX GENERAL SOUND", как мы ее назвали, преставляет собой самостоятельную микропроцессорную
систему на четыре независимых канала по 8 бит, со своим внутренним BIOS-ом и памятью, отведенной специально под музыку.
Чем это здорово?
1. "ZX GENERAL SOUND" практически не отнимает времени у главного процессора, что позволяет использовать музыку в любой момент работы компьютера, не обращая внимания на загруженность главного процессора.
2. На музыку не тратится память компьютера.
3. Возможность использования суперспецэффектов в играх, а также голосовых сообщений.
4. Возможность проигрывания музыки с компьютеров AMIGA и IBM PC.
5. Несложное подключение к SPECTRUM'у, причем в самом ком пьютере не нужно делать никаких доработок.
6. Не очень высокая стоимость, примерно равная стоимости отечественного дисковода.
7. И, что самое главное, несравнимо лучшее качество стереозвука по сравнению с AY8910/12 и COVOX - подобными прибамбасами.
Ко всему вышесказанному надо добавить, что многие ведущие программисты Питера в курсе нашей разработки и согласились создавать под нее SOFT.
Работа над "ZX GENERAL SOUND" ведется уже давно, и на данный момент существует опытный образец, требующий небольшой доводки
(т.к. все время приходят новые гениальные идеи), а также ведется тяжелая борьба за снижение его себестоимости.
Но, несмотря на все трудности, мы планируем к весне обрадовать пользователей SPECCY.
<br>X-TRADE software
<br>DANGEROUS (back to SPECCY from AMIGA)
<br>HACKER STINGER (back to SPECCY from IBM PC)
```
Когда стали производиться карты серийно доподлинно неизвестно, считается что это наступило в 1997 году, согласно надписи на наклейках ПЗУ.
## Открытие проекта в свободный доступ
До 2007 года General Sound оставался коммерческим продуктом и свободное воспроизведение и распространение было запрещено. Однако авторы решили открыть проект, чем несказанно обрадовали общественность.
https://zx-pk.ru/threads/6007-general-sound-(skhema).html
## Исходные коды прошивки
В каталоге firmaware/src представлены две ключевые версии:
- авторская версия 1.04
- версия 1.05a и 1.05b с исправлениями уже после открытия проекта
Версия 1.10, написанная для карты neoGS от NedoPC, находится в репозитории NedoPC и прекрасно работает с классической платой.
## Схема и печатная плата
Всего в ходу пять версий классического General Sound. Перечислим их:
## v1.0
Схема и монтажка появились еще во времена FIDO и были выполнены в текстовом файле псевдографикой. Считалось это нелицензионным и распространялось как варез.
Плата первой версии несколько отличалась от последующих.
На самой плате имелся краевой разъем для подключения специального кабеля с отдельной небольшой платкой, которая через буферы уже подключалась к разъему ZXBUS.
На данный момент (февраль 2025 года) живых экземпляров такой платы не обнаружено.
<img src="photos/GSOldVerTop.jpg" width="300" />&nbsp;&nbsp;<img src="photos/GSOldVerBottom.jpg" width="300" /><br>
## v1.1
Файл с исходником платы в формате p-cad 2001 был опубликован Евгением Мучкиным 20.08.2007 на форуме zx-pk, своим постом сообщив об открытии проекта.
https://zx-pk.ru/threads/6007-general-sound-(skhema).html
## v1.2
Файл с исходником платы в формате p-cad 2006 был опубликован palsw 28.12.2011 на странице https://zx-pk.ru/threads/17696-general-sound-sborka-i-nastrojka-varianta-2011-rasshirenie-ram-2mb.html
Доработки платы делал zorel:
- Разводка платы не соответствует 100% схеме, иначе бы не было смысла переразводилась. Доработки будут описаны в мануале, который готовится.
Но доработки не влияют глобально на работоспособность-неработоспособность карты - введены цепи управления ОЗУ свыше 512К, разблокирована цепь NMI, проведены косметические изменения на печатной плате.
- R1A и R2A это резисторы появившиеся в результате доработки платы до совместимости с модулями расширения памяти выше 512Кб.
Оригинальная плата GS без "доработки скальпелем" не имела возможности адресовать, через разъем расширения, более 512Кб.
Эта версия платы уже позволяет оперировать объемами вплоть до 8Мб. Чтобы все работало необходимо запаять оба резистора R1A и R2A.
## v1.3
Версия сделана Олегом Стариченко (solegstar) в 2020 году, в которой были наконец исправлены накопившиеся ошибки предыдущих версий, которые каждый раз приходилось исправлять при помощи МГТФ.
## v1.4
Версия сделана Романом Крупниным (RomanRom2) в 2023 году. До этой версии не существовало схемы в каком либо CAD, были только в формате картинок (и pdf).
Поскольку это не позволяет синхронизировать схему с платой - это и приводило к вечным ошибкам, то в схеме, то в плате.
Существует множество версий, выполненными разными людьми, где утверждается о каких-нибудь исправлениях и не факт, что не внесены новые ошибки :)
<img src="photos/gs_assembled.jpg" width="600" /><br>
В этой версии были выполнены следующие доработки:
- отрисована схема в p-cad 2006 по плате v1.3, исправлены ошибки с точки зрения CAD. Так, например, цепи GND и AGND имели "короткое замыкание". Понятно что линия аналоговой земли
в этом устройстве есть то же самое что и "обычная" земля, но с точки зрения CAD это ошибка.
- оптимизированы проводники, приведены к "единому стандарту", в предыдущих версиях многие из них (сигнальных) имели разную ширину
- переставлены некоторые резисторы и конденсаторы, что бы облегчить их монтаж
- немного подвинуты микросхемы памяти, что бы было чуть удобнее паять сигналы CS тех, что устанавливаются вторым этажом
- нарисован CAD элемент для ламели (краевого разъема) по стандарту ISA
- сделан "ключ" для правильной установки в слот
- нанесено немного дополнительных обозначений на слое шелка
- сделана заливка полигона GND с обоих сторон
Отныне схема и плата полностью выполнены в CAD и полностью синхронизированы. Схема не имеет ошибок на этот раз (инфа 146%) :) т.к. слинкованная с ней плата работает.
Эта версия полностью совместима со всеми предыдущими версиями, распиновка всех разъемов осталась прежней, разные расширители памяти так же все работают.
Проект по традиции выполнен в p-cad 2006 sp2
# Доработки
Классический General Sound, по традиции ZX сообщества, так же имеет множество доработок и модификаций в схеме и плате. Вот некоторые из них:
- Несколько доработок BlackCat
- Несколько доработок Northwood
- Другой ЦАП
- Замена 27512 на FLASH
- Замена ИЕ2 на ИЕ5
- Исправление диодного дешифратора
- Разгон 14.4 МГц
- Расширение памяти без установки 62256
Некоторые доработки могут дублироваться, они предложены разными авторами, но сделаны немного по разному.
Использование доработок оставляется на усмотрение пользователей, они собраны в каталоге docs.
# Другие проекты, совместимые с General Sound
## v.smd
Проект выполнен Павлов Рябцовым (chipkin) в 2018 году. Это попытка внести все актуальные доработки, взяв за основу классическую версию 1.2 от zorel.
Что из этого вышло можно почитать в теме форума zxpk: https://zx-pk.ru/threads/28713-sborka-i-nastrojka-platy-gs-2017g-(-pavla-ryabtsova)
Спойлер: плата имеет множество ошибок. По сообщениям пользователей, собравщих эту плату - нужно делать порезы на плате ДО монтажа, иначе потом это будет очень трудно сделать.
В авторском архиве (на 8 странице темы) так же есть версия, выполненная на smd элементах, что является более интересным направлением в данном проекте. Отсюда и его название.
<img src="photos/v.smd.jpg" width="600" /><br>
Проект интересный и почти рабочий. Все желающие могут довести проект до ума :)
## neoGS
<img src="photos/neogs_c_front.jpg" width="600" /><br>
Это первый продукт группы NedoPC, Вадим Акимов (LVD), Чунин Роман (CHRV), Вячеслав Савенков (Savelij), Жабин Алексей (KOE), Василий Климов (JTN).
Карта делалась и тестировалась в 2007-2008 годах. 18 октября 2008 в серию была выпущена NeoGS версии rev.B
Подробнее на странице проекта: http://nedopc.com/gs/ngs.php
## ZXM-GeneralSound
Разработка 2014 года. Просто захотелось в конце 2013 года сделать что то менее мощное чем звукая карта NeoGs от группы NedoPC.
<img src="photos/zxm_generalsound1t.jpg" width="600" /><br>
В отличии от оригинала практически вся мелкая логика спрятана в микросхему программируемой логики EPM7128STC100, что позволило существенно уменьшить общие габариты платы.
Кроме того, вся память ОЗУ теперь находится также на основной плате и общий объем составляет 2Мб. Объем ПЗУ тоже увеличен до 128Кб.
И в дополнении к этому в качестве микросхем ЦАП применены микросхемы TLC7528, которые также позволили сократить габариты платы.
Программное обеспечение данной платы полностью совместимо с программой оригинала. Стоит конечно отметить, что имеется в виду базовая прошивка, т.е. младшие 32 Кб ПЗУ.
Подробнее на странице проекта: http://micklab.ru/My%20Soundcard/ZXMGeneralSound.htm
## ZX Multisound
Проект Евгения Лозового (UzixLS) 2022 года.
<img src="photos/zxms-revA.jpg" width="600" /><br>
Карта-комбайн, среди ее музыкальных возможностей не только General Sound, но и многое другое.
Репозиторий проекта на гитхабе: https://github.com/UzixLS/zx-multisound

BIN
datasheet/572ПА1-v1.pdf Normal file

Binary file not shown.

BIN
datasheet/572ПА1-v2.pdf Normal file

Binary file not shown.

BIN
datasheet/74HC08.pdf Normal file

Binary file not shown.

BIN
datasheet/74HC138.pdf Normal file

Binary file not shown.

BIN
datasheet/74HC175.pdf Normal file

Binary file not shown.

12567
datasheet/CY62256N.pdf Normal file

File diff suppressed because it is too large Load Diff

BIN
datasheet/k6x4008c1f.pdf Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

BIN
docs/BlackCat/irqge.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
docs/BlackCat/snd_out.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
docs/Northwood/2mb.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 KiB

File diff suppressed because one or more lines are too long

BIN
docs/Northwood/pcb1.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
docs/Northwood/pcb2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

View File

@ -0,0 +1,42 @@
Расширение памяти GS до 2Мб при обязательном отсутствии на плате GS микросхем памяти 62256.
Суть простая:
По классической схеме расширения ОЗУ до 2 Мб, на плате GS должны стоять двумя бутербродами 4 микросхемы основного ОЗУ общим объёмом 128 Кб, и на плате расширения установлено ОЗУ объёмом 2 Мб. При этом первые 128 Кб (4 страницы) просто перекрываются микросхемами ОЗУ на плате GS, поэтому на плате расширения эти страницы просто остаются не использованными.
Моя плата расширения ОЗУ призвана устранить этот недостаток, теперь ставить на плату GS 2 бутерброда ОЗУ не надо, соответственно на 4 микросхемы 62256 уменьшаются и материальные затраты. Кроме этого, решается вопрос избавления от медленных микросхем ОЗУ 62256 с временем доступа 120-150 нс, что даёт возможность потом разогнать GS. Кроме этого, в качестве логики я решил использовать микросхемы в корпусах DIP, т.к. достать их проще, чем в SOP или SOIC корпусах.
Эта схема расширения ОЗУ требует наличие 3-х доработок на плате GS. Если у вас GS собран из новодела на новой плате, на которой уже учтено расширение памяти до 2 Мб по старой схеме, то доработки № 2 и № 3 у вас уже есть, остаётся ввести только доработку № 1.
Все обозначения сигналов я использовал по схеме GS из PDF файла, сами PDF с принципиальной и монтажной схемами GS во вложении.
Описание всех доработок платы GS:
№ 1 B5 - берётся с DD9 (ИД7) выв.14 (сигнал RAM1) - активируется в адресном пространстве #4000-#7FFF
№ 2 B6 - подаётся на DD13 (ИД7) на выв.6 вместо сигнала /K1 (блокировка ПЗУ при обращении к любой странице ОЗУ)
№ 3 B7 - берётся с DD7 (ТМ8) выв.9 (тактовый сигнал порта #00)
список микросхем:
DD1-DD4 - K6T4008C1B-GB55 (можно GB70)
DD5 - 1533КП11
DD6 - 1533ТМ8
DD7 - 1533ИД7
DD8 - 1533ЛИ1 (лучше 1531 или 531 в случае разгона процессора)
DD9 - 1533ЛЕ1 (лучше 1531 или 531 в случае разгона процессора)
По микросхемам памяти: Самая главная здесь микросхема ОЗУ - DD1, без неё GS работать не будет. Остальные можно ставить, можно нет, от этого будет зависеть кол-во найденных страниц памяти.
Сами микросхемы ОЗУ можно ставить и меньшего объёма, если они будут в таком же корпусе SOP-32.
Доступный объём ОЗУ для МОДов будет точно таким же, как и с классическим расширением ОЗУ:
1 микросхема DD1 емкостью 512 Кбайт - 512-16-32 = 464 Кб ("PRINT IN 179" должен выдать 14 страниц)
2 микросхемы емкостью по 512 Кбайт - 1024-16-32 = 976 Кб ("PRINT IN 179" должен выдать 30 страниц)
3 микросхемы емкостью по 512 Кбайт - 1536-16-32 = 1488 Кб ("PRINT IN 179" должен выдать 46 страниц)
4 микросхемы емкостью по 512 Кбайт - 2048-16-32 = 2000 Кб ("PRINT IN 179" должен выдать 62 страницы)
32 Кб из общего объёма памяти недоступны, т.к. 0-я страница ОЗУ перекрывается ПЗУ. Эта особенность присутствует и в классическом расширении, и в этом.
16 Кб из общего объёма используются самим GS для собственных нужд, это 1-я страница ОЗУ, и её половинка проецируется в адресное пространство #4000...#7FFF.

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 KiB

Binary file not shown.

383
docs/format_mod.txt Normal file
View File

@ -0,0 +1,383 @@
Noisetracker/Soundtracker/Protracker Module Format
--------------------------------------------------
Credits: Lars Hamre, Norman Lin, Mark Cox, Peter Hanning,
Steinar Midtskogen, Marc Espie, and Thomas Meyer
(All numbers below are given in decimal)
3rd Revision
Module Format:
# Bytes Description
------- -----------
20 The module's title, padded with null (\0) bytes. Original
Protracker wrote letters only in uppercase.
(Data repeated for each sample 1-15 or 1-31)
22 +0 Sample's name, padded with null bytes. If a name begins with a
'#', it is assumed not to be an instrument name, and is
probably a message.
2 +22 Sample length in words (1 word = 2 bytes). The first word of
the sample is overwritten by the tracker, so a length of 1
still means an empty sample. See below for sample format.
1 +24 Lowest four bits represent a signed nibble (-8..7) which is
the finetune value for the sample. Each finetune step changes
the note 1/8th of a semitone. Implemented by switching to a
different table of period-values for each finetune value.
1 +25 Volume of sample. Legal values are 0..64. Volume is the linear
difference between sound intensities. 64 is full volume, and
the change in decibels can be calculated with 20*log10(Vol/64)
2 +26 Start of sample repeat offset in words. Once the sample has
been played all of the way through, it will loop if the repeat
length is greater than one. It repeats by jumping to this
position in the sample and playing for the repeat length, then
jumping back to this position, and playing for the repeat
length, etc.
2 +28 Length of sample repeat in words. Only loop if greater than 1.
(End of this sample's data.. each sample uses the same format and they
are stored sequentially)
N.B. All 2 byte lengths are stored with the Hi-byte first, as is usual
on the Amiga (big-endian format).
1 Number of song positions (ie. number of patterns played
throughout the song). Legal values are 1..128.
1 Historically set to 127, but can be safely ignored.
Noisetracker uses this byte to indicate restart position -
this has been made redundant by the 'Position Jump' effect.
128 Pattern table: patterns to play in each song position (0..127)
Each byte has a legal value of 0..63 (note the Protracker
exception below). The highest value in this table is the
highest pattern stored, no patterns above this value are
stored.
(4) The four letters "M.K." These are the initials of
Unknown/D.O.C. who changed the format so it could handle 31
samples (sorry.. they were not inserted by Mahoney & Kaktus).
Startrekker puts "FLT4" or "FLT8" here to indicate the # of
channels. If there are more than 64 patterns, Protracker will
put "M!K!" here. You might also find: "6CHN" or "8CHN" which
indicate 6 or 8 channels respectively. If no letters are here,
then this is the start of the pattern data, and only 15
samples were present.
(Data repeated for each pattern:)
1024 Pattern data for each pattern (starting at 0).
(Each pattern has same format and is stored in numerical order.
See below for pattern format)
(Data repeated for each sample:)
xxxxxx The maximum size of a sample is 65535 words. Each sample is
stored as a collection of bytes (length of a sample was given
previously in the module). Each byte is a signed value (-128
..127) which is the channel data. When a sample is played at a
pitch of C2 (see below for pitches), about 8287 bytes of
sample data are sent to the channel per second. Multiply the
rate by the twelfth root of 2 (=1.0595) for each semitone
increase in pitch eg. moving the pitch up 1 octave doubles the
rate. The data is stored in the order it is played (eg. first
byte is first byte played). The first word of the sample data
is used to hold repeat information, and will overwrite any
sample data that is there (but it is probably safer to set it
to 0).
The rate given above (8287) conveys an inaccurate picture of
the module-format - in reality it is different for different
Amigas. As the routines for playing were written to run off
certain interrupts, for different Amiga computers the rate to
send data to the channel will be different. For PAL machines
the clock rate is 7093789.2 Hz and for NTSC machines it is
7159090.5 Hz. When the clock rate is divided by twice the
period number for the pitch it will give the rate to send the
data to the channel, eg. for a PAL machine sending a note at
C2 (period 428), the rate is 7093789.2/856 ~= 8287.1369
(Each sample is stored sequentially)
Pattern Format:
Each pattern is divided into 64 divisions. By allocating different
tempos for each pattern and spacing the notes across different amounts
of divisions, different bar sizes can be accommodated.
Each division contains the data for each channel (1..4) stored after
each other. Channels 1 and 4 are on the left, and channels 2 and 3 are
on the right. In the case of more channels: channels 5 and 8 are on the
left, and channels 6 and 7 are on the right, etc. Each channel's data in
the division has an identical format which consists of 2 words (4
bytes). Divisions are numbered 0..63. Each division may be divided into
a number of ticks (see 'set speed' effect below).
Channel Data:
(the four bytes of channel data in a pattern division)
7654-3210 7654-3210 7654-3210 7654-3210
wwww xxxxxxxxxxxxxx yyyy zzzzzzzzzzzzzz
wwwwyyyy (8 bits) is the sample for this channel/division
xxxxxxxxxxxx (12 bits) is the sample's period (or effect parameter)
zzzzzzzzzzzz (12 bits) is the effect for this channel/division
If there is to be no new sample to be played at this division on this
channel, then the old sample on this channel will continue, or at least
be "remembered" for any effects. If the sample is 0, then the previous
sample on that channel is used. Only one sample may play on a channel at
a time, so playing a new sample will cancel an old one - even if there
has been no data supplied for the new sample. Though, if you are using a
"silence" sample (ie. no data, only used to turn off other samples) it
is polite to set its default volume to 0.
To determine what pitch the sample is to be played on, look up the
period in a table, such as the one below (for finetune 0). If the period
is 0, then the previous period on that channel is used. Unfortunately,
some modules do not use these exact values. It is best to do a binary-
search (unless you use the period as the offset of an array of notes..
expensive), especially if you plan to use periods outside the "standard"
range. Periods are the internal representation of the pitch, so effects
that alter pitch (eg. sliding) alter the period value (see "effects"
below).
C C# D D# E F F# G G# A A# B
Octave 1: 856, 808, 762, 720, 678, 640, 604, 570, 538, 508, 480, 453
Octave 2: 428, 404, 381, 360, 339, 320, 302, 285, 269, 254, 240, 226
Octave 3: 214, 202, 190, 180, 170, 160, 151, 143, 135, 127, 120, 113
Octave 0:1712,1616,1525,1440,1357,1281,1209,1141,1077,1017, 961, 907
Octave 4: 107, 101, 95, 90, 85, 80, 76, 71, 67, 64, 60, 57
Octaves 0 and 4 are NOT standard, so don't rely on every tracker being
able to play them, or even not crashing if being given them - it's just
nice that if you can code it, to allow them to be read.
Effects:
Effects are written as groups of 4 bits, eg. 1871 = 7 * 256 + 4 * 16 +
15 = [7][4][15]. The high nibble (4 bits) usually determines the effect,
but if it is [14], then the second nibble is used as well.
[0]: Arpeggio
Where [0][x][y] means "play note, note+x semitones, note+y
semitones, then return to original note". The fluctuations are
carried out evenly spaced in one pattern division. They are usually
used to simulate chords, but this doesn't work too well. They are
also used to produce heavy vibrato. A major chord is when x=4, y=7.
A minor chord is when x=3, y=7.
[1]: Slide up
Where [1][x][y] means "smoothly decrease the period of current
sample by x*16+y after each tick in the division". The
ticks/division are set with the 'set speed' effect (see below). If
the period of the note being played is z, then the final period
will be z - (x*16 + y)*(ticks - 1). As the slide rate depends on
the speed, changing the speed will change the slide. You cannot
slide beyond the note B3 (period 113).
[2]: Slide down
Where [2][x][y] means "smoothly increase the period of current
sample by x*16+y after each tick in the division". Similar to [1],
but lowers the pitch. You cannot slide beyond the note C1 (period
856).
[3]: Slide to note
Where [3][x][y] means "smoothly change the period of current sample
by x*16+y after each tick in the division, never sliding beyond
current period". The period-length in this channel's division is a
parameter to this effect, and hence is not played. Sliding to a
note is similar to effects [1] and [2], but the slide will not go
beyond the given period, and the direction is implied by that
period. If x and y are both 0, then the old slide will continue.
[4]: Vibrato
Where [4][x][y] means "oscillate the sample pitch using a
particular waveform with amplitude y/16 semitones, such that (x *
ticks)/64 cycles occur in the division". The waveform is set using
effect [14][4]. By placing vibrato effects on consecutive
divisions, the vibrato effect can be maintained. If either x or y
are 0, then the old vibrato values will be used.
[5]: Continue 'Slide to note', but also do Volume slide
Where [5][x][y] means "either slide the volume up x*(ticks - 1) or
slide the volume down y*(ticks - 1), at the same time as continuing
the last 'Slide to note'". It is illegal for both x and y to be
non-zero. You cannot slide outside the volume range 0..64. The
period-length in this channel's division is a parameter to this
effect, and hence is not played.
[6]: Continue 'Vibrato', but also do Volume slide
Where [6][x][y] means "either slide the volume up x*(ticks - 1) or
slide the volume down y*(ticks - 1), at the same time as continuing
the last 'Vibrato'". It is illegal for both x and y to be non-zero.
You cannot slide outside the volume range 0..64.
[7]: Tremolo
Where [7][x][y] means "oscillate the sample volume using a
particular waveform with amplitude y*(ticks - 1), such that (x *
ticks)/64 cycles occur in the division". The waveform is set using
effect [14][7]. Similar to [4].
[8]: -- Unused --
[9]: Set sample offset
Where [9][x][y] means "play the sample from offset x*4096 + y*256".
The offset is measured in words. If no sample is given, yet one is
still playing on this channel, it should be retriggered to the new
offset using the current volume.
[10]: Volume slide
Where [10][x][y] means "either slide the volume up x*(ticks - 1) or
slide the volume down y*(ticks - 1)". If both x and y are non-zero,
then the y value is ignored (assumed to be 0). You cannot slide
outside the volume range 0..64.
[11]: Position Jump
Where [11][x][y] means "stop the pattern after this division, and
continue the song at song-position x*16+y". This shifts the
'pattern-cursor' in the pattern table (see above). Legal values for
x*16+y are from 0 to 127.
[12]: Set volume
Where [12][x][y] means "set current sample's volume to x*16+y".
Legal volumes are 0..64.
[13]: Pattern Break
Where [13][x][y] means "stop the pattern after this division, and
continue the song at the next pattern at division x*10+y" (the 10
is not a typo). Legal divisions are from 0 to 63 (note Protracker
exception above).
[14][0]: Set filter on/off
Where [14][0][x] means "set sound filter ON if x is 0, and OFF is x
is 1". This is a hardware command for some Amigas, so if you don't
understand it, it is better not to use it.
[14][1]: Fineslide up
Where [14][1][x] means "decrement the period of the current sample
by x". The incrementing takes place at the beginning of the
division, and hence there is no actual sliding. You cannot slide
beyond the note B3 (period 113).
[14][2]: Fineslide down
Where [14][2][x] means "increment the period of the current sample
by x". Similar to [14][1] but shifts the pitch down. You cannot
slide beyond the note C1 (period 856).
[14][3]: Set glissando on/off
Where [14][3][x] means "set glissando ON if x is 1, OFF if x is 0".
Used in conjunction with [3] ('Slide to note'). If glissando is on,
then 'Slide to note' will slide in semitones, otherwise will
perform the default smooth slide.
[14][4]: Set vibrato waveform
Where [14][4][x] means "set the waveform of succeeding 'vibrato'
effects to wave #x". [4] is the 'vibrato' effect. Possible values
for x are:
0 - sine (default) /\ /\ (2 cycles shown)
4 (without retrigger) \/ \/
1 - ramp down | \ | \
5 (without retrigger) \ | \ |
2 - square ,--, ,--,
6 (without retrigger) '--' '--'
3 - random: a random choice of one of the above.
7 (without retrigger)
If the waveform is selected "without retrigger", then it will not
be retriggered from the beginning at the start of each new note.
[14][5]: Set finetune value
Where [14][5][x] means "sets the finetune value of the current
sample to the signed nibble x". x has legal values of 0..15,
corresponding to signed nibbles 0..7,-8..-1 (see start of text for
more info on finetune values).
[14][6]: Loop pattern
Where [14][6][x] means "set the start of a loop to this division if
x is 0, otherwise after this division, jump back to the start of a
loop and play it another x times before continuing". If the start
of the loop was not set, it will default to the start of the
current pattern. Hence 'loop pattern' cannot be performed across
multiple patterns. Note that loops do not support nesting, and you
may generate an infinite loop if you try to nest 'loop pattern's.
[14][7]: Set tremolo waveform
Where [14][7][x] means "set the waveform of succeeding 'tremolo'
effects to wave #x". Similar to [14][4], but alters effect [7] -
the 'tremolo' effect.
[14][8]: -- Unused --
[14][9]: Retrigger sample
Where [14][9][x] means "trigger current sample every x ticks in
this division". If x is 0, then no retriggering is done (acts as if
no effect was chosen), otherwise the retriggering begins on the
first tick and then x ticks after that, etc.
[14][10]: Fine volume slide up
Where [14][10][x] means "increment the volume of the current sample
by x". The incrementing takes place at the beginning of the
division, and hence there is no sliding. You cannot slide beyond
volume 64.
[14][11]: Fine volume slide down
Where [14][11][x] means "decrement the volume of the current sample
by x". Similar to [14][10] but lowers volume. You cannot slide
beyond volume 0.
[14][12]: Cut sample
Where [14][12][x] means "after the current sample has been played
for x ticks in this division, its volume will be set to 0". This
implies that if x is 0, then you will not hear any of the sample.
If you wish to insert "silence" in a pattern, it is better to use a
"silence"-sample (see above) due to the lack of proper support for
this effect.
[14][13]: Delay sample
Where [14][13][x] means "do not start this division's sample for
the first x ticks in this division, play the sample after this".
This implies that if x is 0, then you will hear no delay, but
actually there will be a VERY small delay. Note that this effect
only influences a sample if it was started in this division.
[14][14]: Delay pattern
Where [14][14][x] means "after this division there will be a delay
equivalent to the time taken to play x divisions after which the
pattern will be resumed". The delay only relates to the
interpreting of new divisions, and all effects and previous notes
continue during delay.
[14][15]: Invert loop
Where [14][15][x] means "if x is greater than 0, then play the
current sample's loop upside down at speed x". Each byte in the
sample's loop will have its sign changed (negated). It will only
work if the sample's loop (defined previously) is not too big. The
speed is based on an internal table.
[15]: Set speed
Where [15][x][y] means "set speed to x*16+y". Though it is nowhere
near that simple. Let z = x*16+y. Depending on what values z takes,
different units of speed are set, there being two: ticks/division
and beats/minute (though this one is only a label and not strictly
true). If z=0, then what should technically happen is that the
module stops, but in practice it is treated as if z=1, because
there is already a method for stopping the module (running out of
patterns). If z<=32, then it means "set ticks/division to z"
otherwise it means "set beats/minute to z" (convention says that
this should read "If z<32.." but there are some composers out there
that defy conventions). Default values are 6 ticks/division, and
125 beats/minute (4 divisions = 1 beat). The beats/minute tag is
only meaningful for 6 ticks/division. To get a more accurate view
of how things work, use the following formula:
24 * beats/minute
divisions/minute = -----------------
ticks/division
Hence divisions/minute range from 24.75 to 6120, eg. to get a value
of 2000 divisions/minute use 3 ticks/division and 250 beats/minute.
If multiple "set speed" effects are performed in a single division,
the ones on higher-numbered channels take precedence over the ones
on lower-numbered channels. This effect has a large number of
different implementations, but the one described here has the
widest usage.
N.B. This document should be fairly accurate now, but as the module
format is more of an observation than a standard, a couple of effects
cannot be relied upon to act exactly the same from tracker to tracker
(especially if the tracker is not for the Amiga). It is probably better
to use this document as a guide rather than as a hard-and-fast
definition of the module format. Oh.. and yes, I would normally give
bytes as hex values, but it is easier to understand a consistent
notation.
Andrew Scott (Adrenalin Software), INTERNET:ascott@tartarus.uwa.edu.au
Author of MIDIMOD (MOD to MIDI converter), PTMID (MIDI to MOD converter)

241
docs/format_ust.txt Normal file
View File

@ -0,0 +1,241 @@
=============================================================================
Ultimate Soundtracker module format description
Version 0.1 (w) 1997 by Michael Schwendt <sidplay@geocities.com>
=============================================================================
This is an attempt on documenting the file format of music modules
(MOD files) that were created with Karsten Obarski's Ultimate
Soundtracker, the original Soundtracker that started it all back in
1987/88 on AMIGA.
Whereas various Soundtracker derivatives such as Protracker,
Noisetracker, or a few of the Soundtracker v2 series, are widely
known and supported, hardly any available MODule player supports old
and classic Soundtracker modules.
In 1988 and later Karsten Obarski's original program was hacked,
ripped off, and improved by various programmers from cracking and
demo groups. Some of the first were Exterminator of TJC, Tip of The
New Masters, Unknown/D.O.C, Mahoney & Kaktus of Northstar and
Silents, and Mnemotron/Spreadpoint. During this process the original
module format got altered and extended. One by-product of this
development was partial incompatibility between competing
Soundtrackers and their modules, most noticably between the Ultimate
Soundtracker and the first illegal series of Soundtracker versions.
Even worse, some changes made it impossible - or at least very
difficult - to detect the true module format.
Years later people without knowledge of the incompatibility between
the original Soundtracker module format and successors like
Soundtracker 2.4 or Protracker damaged modules by converting them to
Protracker format. It would be tiresome trying to find any such
module in any collection and either repair or remove it in case it
can't be restored properly. However, the opposite doesn't seem to be
a real choice either. Rather than trying to find and convert any old
Soundtracker module into some well-defined module format, it sounds
much more reasonable to add native Ultimate Soundtracker support to
MODule players.
Old Soundtracker modules that are likely to be found in any classic
collection are those composed by Karsten Obarski himself, such as
famous game sounds from Amegas, Crystal Hammer, Ralleymaster (sic!),
or Sarcophaser, to name a few, and others done in 1987 and 1988, most
noticably the unforgotten tunes by SLL.
Rather than serving as a complete MOD reference, this document
focuses on relevant differences between the Ultimate Soundtracker
format and the first popular hacked Soundtracker versions that still
featured 4 voices and 15 channels. The terminology used in this
document might differ from other available MOD format descriptions.
The following abbreviations are local to this document. Please don't
use them in MOD players. They are uncommon and would confuse users.
UST -> Ultimate Soundtracker
ST -> Soundtracker (scene versions)
MST -> Master Soundtracker
PT -> Protracker
NT -> Noisetracker
One false assumption often made is that "M.K." is an ID introduced in
Protracker or by "Mahoney & Kaktus". The truth is it was Unknown/DOC
who put his initials into Soundtracker 2.4 to server as format ID and
indicate 31 samples. Mahoney & Kaktus used "N.T." in Noisetracker.
Thanks to Jake Stine (MikMod) and Lada Kopecky (A.M.P) for their
interesting discussions about UST format detection proposals.
If you have any comments or corrections, feel free to e-mail me.
-----------------------------------------------------------------------------
Short summary of differences and incompatibilities (more below):
- maximum sample length
- numbering of effects
- playing of repeat-samples (looping samples)
Format characteristics:
- 4 tracks (voices, channels)
- 15 sample headers (instrument definitions, slots)
- sample header length is 30 bytes
- 128 pattern table steps (pattern order)
- pattern length is 1024 bytes
File offset Content description
+ 0 song/module working title
+ 20 15 sample headers (see below)
+ 470 song length (number of steps in pattern table)
+ 471 song speed in beats per minute (see below)
+ 472 pattern step table
+ 600 pattern data (1024 bytes) for each pattern number
. that can be found in entire pattern table
.
+ ??? sample data
Sample header (big-endian byte order):
+ 0 sample file/name
+ 22 sample length in words
+ 24 volume word (0-64)
+ 26 sample repeat offset in bytes
+ 28 sample repeat length in words (0=loop off, >1 loop on)
[+ 30 (end)]
Noticable features in sample header:
- Volume word does not contain a "Finetuning" value in its high-byte.
- Sample repeat offset is in bytes (unlike PT, NT, and ST 2.5, where
it is specified as number of words).
- Maximum sample length is 9999 bytes decimal, but 1387 words hexadecimal.
Longest samples on original sample disk ST-01 were 9900 bytes.
- Sample file names have no disk name prefix like "st-01:" or "ST-01:"
since only a single sample disk was supported. In later ST versions
one had to enter a disk name.
Caveat: There are hacked modules where disk names have been
dropped or added.
Notes on playing repeat-samples:
- Unlike PT only the loop-area is played. PT plays from Start to Repeat
End and then loops between Repeat Start and Repeat End. UST modules
often (!) sound screwed if repeat-samples are played incorrectly.
Hence: Sample Start = Repeat Start, Sample Length = Repeat Length.
Effects:
- Arpeggio: 1xy (1. base note)
(2. x semitones higher)
(3. y semitones higher)
- Pitchbend: 2xy (20y = sub y from period = pitch up)
(2x0 = add x to period = pitch down)
Conversion of UST effects to PT (or MST):
- Arpeggio: 1xy => 0xy
- Pitchbend: 20y => 10y
2x0 => 20x
-----------------------------------------------------------------------------
Song speed in beats per minute:
The byte at module offset 471 is not the "song restart position". It
is meant to be the song speed in beats per minute (bpm), satisfying
this formula:
AMIGA Timer-IRQ value = (240-bpm)*122
This might be constant for other 15-instrument ST modules, but not
for the Ultimate Soundtracker.
The default for UST modules is 0x78 = 120 BPM = 48 Hz. AMIGA custom
chips only ran at 716 kHz, which is one tenth of the processor clock
speed. Thus:
freq = 716 kHz / ((240-bpm)*122)
[freq] = kHz
Rumours state that Karsten Obarski made a failure upon calculating
that default speed and planned to get a default of 50 Hz. For sure he
didn't calculate at full precision. This would have required the
true accurate clock speed of the AMIGA. And that one was varying in
different documentation. If you happen to find a more accurate clock
speed, the result might differ by 1-2 Hz more. Look:
with 716 kHz = 716*1024 Hz : freq(120) ~= 50.08 Hz
with 716 kHz = 716*1000 Hz : freq(120) ~= 48.9 Hz
-----------------------------------------------------------------------------
An experimental format detection:
Note that the recommended way is to either default to UST or provide
a switch to toggle between UST and ST. The fact that an UST module
can't be detected 100% percent correctly, can't make MODplayer
authors happy. But think about a switch at least.
- Check whether every Sample Length is <= 9999 bytes. If not, the
MOD cannot be in UST format. Newer Sountrackers supported samples
longer than 9999 bytes. So, it might be in some newer ST format.
Caveat: It still could be a ST, MST or PT module with short samples.
- If (Repeat Offset in words + Repeat Length in words) converted to
bytes exceeds Sample End and/or length of file, it is an UST file
with Repeat Offset in bytes. In other words, first assume Repeat
Offset to be given in words and calculate the Repeat End in order
to be able to check the sample range:
Sample Start + Repeat Offset * 2 = Repeat End
If this Repeat End exceeds the sample end, it is an UST module and
Repeat Offset is specified in bytes.
Caveat: The looping in some ST modules (bad rips, for instance)
could go a couple of bytes past the end, so better add some safety
bytes.
- If you use a format loader/converter, scan each pattern for the
availability of PT effects or any effects other than 1xy and 2xy.
If available it cannot be UST.
Might be an idea to check the pattern data for effects 1xy and 2xy
with xy > 0x1f. Could be that no Soundtracker module would ever have
a reason to pitchbend up or down that far, while almost any UST module
that uses either effect does so. The exception would be a UST module
that uses only 20y / 21x commands or a very low arpeggio.
Of course, the only exception to the rule now is if a newer
SoundTracker module doesn't follow the sample prefix rules, has all
samples < 9999 bytes, uses no effects at all, and has a loop near the
start of a sample only. A more advanced detection could check whether
the samples are from the ST-01 sample disk preset.
Master Soundtracker 1.0 introduced new effects and changes effect
numbering.
Soundtracker 2.0 was based on Master Soundtracker 1.0. Soundtracker
2.0, 2.1, 2.2, 2.3, 2.4 have Repeat Offset specified in bytes. As of
Soundtracker 2.5 Repeat Offset is in words. Soundtracker 2.3
introduced 31 samples. Soundtracker 2.4 introduced Unknown/DOC's
initials "M.K." as format ID. Soundtracker 2.6 introduced a
double-sized pattern order table and the "MTN" format ID from
Mnemotron.
In Noisetracker 1.0, Repeat Offset is specified in words.
Noisetracker features 31 samples and the "N.T." ID.
-----------------------------------------------------------------------------

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 KiB

View File

@ -0,0 +1,5 @@
Прошивка GS размером 32КБ заливается для разных Flash по следующим адресам HEX !
Flash 128kb 49f010 - #18000
Flash 256kb 49f020 - #38000
Flash 512kb 49f040 - #78000

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 KiB

View File

@ -0,0 +1 @@
Если не смогли найти счетчик ИЕ2 он легко меняется на ИЕ5

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -0,0 +1,43 @@
https://zx-pk.ru/threads/17696-general-sound-sborka-i-nastrojka-varianta-2011-rasshirenie-ram-2mb.html?p=615931&viewfull=1#post615931
В GS вообще нельзя ставить серию 555, она слишком медленная даже для родной тактовой частоты процессора 12 МГц, получишь нестабильную работу. Ставить нужно не хуже чем 1533.
По поводу флешки, судя по маркировке, у тебя флешка с временем доступа 120 нс. Для тактовой частоты процессора 12 МГц, этого быстродействия флешки хватит с головой. Но если есть желание в будущем разогнать процессор GS, тогда лучше будет поставить флешку с временем доступа не более 90 нс.
P.s. Вот простейший расчёт максимального времени доступа для ПЗУ и статического ОЗУ для GS:
1 / 12 МГц = 83.3 нс. Т.к. процессор Z80 производит любое обращение к любой памяти за 2 такта, то максимальное время доступа можно умножить на 2, т.е. получаем 166.6 нс.
Таким образом можно смело ставить флешку со временем доступа 120 нс (в конце маркировки цифра 12) и даже 150 нс (в конце маркировки цифра 15).
Но при наличии процессора Z80 расчитанного на 20 МГц, в GS его можно разогнать до 18 МГц.
Для 18 МГц получаем вот такое максимальное допустимое время доступа для флешки и статичесого ОЗУ:
1 / 18 МГц = 55.5 нс. * 2 такта = 111 нс.
Т.е. для возможности будущего разгона, флешку лучше поставить с временем доступа не более чем 90 нс (на конце цифра 90).
Частоту кварца нужно выбирать так, чтобы можно было бы с минимальными доработками схемы получить правильную частоту прерываний GS - 37.5 КГц.
В данном случае частота кварца должна быть кратна 1.5 МГц. Поэтому варианты разгона могут быть только 13.5 МГц, 15 МГц, 16.5 МГц и 18 МГц.
Кварц на 13.5 МГц я не видел в глаза. На 15 МГц у нас купить не проблема. На 16.5 МГц - огромная редкость, обыскав всё и вся мне удалось такой купить в кол-ве 2-х штук у одного единственного продавца, и это оказались последние. На 18 МГц найти у нас особой проблемы нет.
Выше 18 МГц остаётся ещё вариант 19.5 МГц, которую потянет процессор, но такого кварца ты не найдёшь, а во вторых, кварц выше 18 МГц по классической схеме генератора примененного в GS ты и не запустишь - в лучшем случае генератор запустится на в 3 раза меньшей частоте. В худшем случае генератор не заработает вообще.
Дело в том, что кварцы до 18 МГц работают на своей основной резонансной частоте, а все кварцы с более высокими частотами работают на 3-й гармонике, в то время как основная резонансная частота у них в 3 раза ниже, такие кварцы требуют совершенно другую схему тактового генератора.
Необходимость разгона GS имеется из-за того, что при штатной частоте 12 МГц и частоте прерываний 37.5 кГц, в одном прерывании у процессора имеется всего лишь 12000 / 37.5 = 320 тактов. Этого не достаточно и приводит к торможении при проигрывании MODов, у которых одновременно звучат сразу все 4 инструмента (проигрывается одновременно все 4 канала). 320 тактов хватает для одновременно проигрывания только до 3-х каналов. Прошивка версии 1.5 проблему решает частично, т.е. необходимость разгона процессора всё равно имеется.
Я свой разогнал до 18 МГц, что дало 18000 / 37.5 = 480 тактов, этого оказалось достаточно чтобы убрались все торможения. Плюс прошивка версии 1.5, и про скрежет в колонках на тех МОДах, на которых он был, я забыл.
Повторюсь, сначала ты запусти его на штатной частоте 12 МГц. Т.к. разгон процессора в GS означает, что нужно не только заменить кварц, но и на один из счетчиков напаять бутербродом новую микросхему логики, разрезать на плате несколько дорожек с целью изменения коэффициента деления счётчика. Я в одной из тем как-то выкладывал схему доработки.

View File

@ -0,0 +1,5 @@
Разгон GS на 20% тремя проводками -
В качестве D18 ставится ИЕ5 серии 555, 1531, 1533. Кварц в идеале 14.4мгц ,
я поставил что было под рукой из убитой материнки 14.318мГц (разницу на слух думаю невозможно будет различить)
На GS надо со стороны D18 разрезать дорожку между 2 и 3 выводами,
с обратной стороны перерезать в трех местах землю, все.

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 797 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

View File

@ -0,0 +1,7 @@
Схема задействует всю память на плате расширения, в следствии чего не надо устанавливать основную память 62256 (4шт.) на GS.
Диоды к сигналам /К3 и /К4 паяются на обратной стороне GS, КП11 и третий диод ставятся на плате расширения памяти,
дополнительный элемент ЛЛ1 это неиспользуемый элемент от DD2.
При тесте по Print in 179 должно быть 62 страницы памяти.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

View File

@ -0,0 +1,372 @@
{\rtf1\ansi\ansicpg1251\uc1 \deff0\deflang1033\deflangfe1049{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f134\froman\fcharset0\fprq0{\*\panose 00000000000000000000}Times New Roman Cyr{\*\falt Times New Roman};}{\f135\froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};}{\f136\froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};}{\f138\froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};}{\f139\froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};}{\f140\froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};}{\f141\fswiss\fcharset238\fprq2 Arial CE;}{\f142\fswiss\fcharset204\fprq2 Arial Cyr;}{\f144\fswiss\fcharset161\fprq2 Arial Greek;}{\f145\fswiss\fcharset162\fprq2 Arial Tur;}{\f146\fswiss\fcharset186\fprq2 Arial Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\nowidctlpar\widctlpar\adjustright \f134\fs20\lang1049\cgrid \snext0 Обычный;}{\s1\sb240\sa60\keepn\nowidctlpar\widctlpar\adjustright \b\f1\fs28\lang1049\kerning28\cgrid \sbasedon0 \snext0 заголовок 1;}{\*\cs10 \additive Основной шрифт;}}{\*\listtable{\list\listtemplateid1102467452\listsimple{\listlevel\levelnfc0\leveljc0\levelfollow0\levelstartat1\levelold\levelspace0\levelindent283{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\b0\i0\f134\fs20\ulnone\fbias0 \fi-283\li283 }{\listname ;}\listid1716738721}}{\*\listoverridetable{\listoverride\listid1716738721\listoverridecount0\ls1}}{\info{\title GENERAL SOUND}{\author Зонов С.Ю.}{\operator Зонов С.Ю.}{\creatim\yr1998\mo10\dy6\hr11\min20}{\revtim\yr1998\mo10\dy6\hr11\min20}{\printim\yr1998\mo2\dy19\hr18\min25}{\version2}{\edmins0}{\nofpages6}{\nofwords2783}{\nofchars15868}{\*\company SC}{\nofcharsws19487}{\vern73}}\paperw11906\paperh16838\margl567\margr567\margt454\margb454 \widowctrl\ftnbj\aenddoc\lytprtmet\formshade\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot \fet0\sectd \sbknone\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \qc\nowidctlpar\widctlpar\adjustright \f134\fs20\lang1049\cgrid {\b\fs36 GENERAL SOUND
\par }\pard \qr\nowidctlpar\widctlpar\adjustright {\b (с) STINGER}{
\par }\pard \qc\nowidctlpar\widctlpar\adjustright {\b Руководство по подключению и программированию}{\b\f0\lang1033 }{\b General Sound.
\par }\pard \qc\nowidctlpar\widctlpar\adjustright {\b Версия v1.03. Редакция 003.
\par }\pard\plain \s1\sb240\sa60\keepn\nowidctlpar\widctlpar\outlinelevel0\adjustright \b\f1\fs28\lang1049\kerning28\cgrid {\f142 1. Краткие технические характеристики GS.
\par }\pard\plain \nowidctlpar\widctlpar\adjustright \f134\fs20\lang1049\cgrid {Процессор: Z80, 12MHz, без циклов wait.
\par }\pard \nowidctlpar\widctlpar\adjustright {ROM: 32k, - 27256
\par RAM: Static Ram 128k ,из них 112k доступно для модулей и}{\f0\lang1033 }{сэмплов в базовой версии.
\par INT : 37.5 KHz
\par Каналы: 4 независимых 8-ми битных канала, каждый с 6-и битным контролем громкости.
\par }\pard\plain \s1\sb240\sa60\keepn\nowidctlpar\widctlpar\outlinelevel0\adjustright \b\f1\fs28\lang1049\kerning28\cgrid {\lang1033 2.}{\f142 Подключение к компьютеру
\par }\pard\plain \sl-200\slmult0\nowidctlpar\widctlpar\adjustright \f134\fs20\lang1049\cgrid {\b\lang1033 GS }{выполнен в виде слота для компьютеров с системной шиной в стандарте }{\f0\lang1033 Scorpion.
\par }{\i\ul Внимание!}{ Очень полезно проконтролировать напряжение питания Вашего компьютера. Часто оно очень занижено (вплоть до 4.5 вольт вместо 5.0вольт) Это может сказаться на качестве работы }{\b\f0\lang1033 GS}{\f0\lang1033 }{вплоть до сбоев в работе. Устойчивая работа}{\b }{\b\f0\lang1033 GS}{\f0\lang1033 }{гарантируется при напряжении питания не менее 4.8 вольт.
\par }\pard \sl-200\slmult0\nowidctlpar\widctlpar\adjustright {Убедительная просьба, все подключения производить при выключенном питании компьютера. При подключении к системному разъему следить за совпадением контактов, так как системный разъем не имеет ключа от неправильного подключения.
\par }{\b\f0\lang1033 GS}{\f0\lang1033 }{вставляется таким образом, что его микросхемы смотрят на микросхемы компьютера.
\par Тест правильности подключения}{\f0\lang1033 :
\par }\pard \fi851\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {\b 10 }{\b\f0\lang1033 OUT 187,244
\par 15 PAUSE 100
\par 20 PRINT IN 179
\par }\pard \sl-200\slmult0\nowidctlpar\widctlpar\adjustright {На экране должно появится число 3}{\lang1033
\par }\pard\plain \s1\sb240\sa60\keepn\nowidctlpar\widctlpar\outlinelevel0\adjustright \b\f1\fs28\lang1049\kerning28\cgrid {\lang1033 3}{\f142 . Краткое описание GS, или много всякой лабуды.
\par }\pard\plain \nowidctlpar\widctlpar\adjustright \f134\fs20\lang1049\cgrid {\b GS}{-музыкальная карточка, предназначенная для проигрывания музыкальных модулей и}{\f0\lang1033 }{отдельных сэмплов(эффектов).
\par }\pard \qj\fi284\nowidctlpar\widctlpar\adjustright {Модули для }{\b GS}{ - это стандартные Амижные}{\f0\lang1033 }{и PCшные 4-х канальные MOD файлы, а сэмплы - как Амижные signed sample, так и PCшные unsigned sample. Проигрыватель MOD файлов в GS является}{\f0\lang1033 }{практически полным аналогом ProTracker'а}{\f0\lang1033 }{на Амиге и создавался при интенсивном использовании исходников ProTracker'a. (Исходники были из Protracker'а v2.1A by Lars}{\f0\lang1033 }{"ZAP" Hamre - Amiga Freelancers)
\par }\pard \nowidctlpar\widctlpar\adjustright {MOD Player поддерживает все команды Pro}{\f0\lang1033 }{Tracker'а, за исключением двух:
\par }{\b Е01 Filter On}{- Амига-специфичная команда, включает фильтр высоких частот.
\par }{\b EFX Invert Loop}{ Я еще не видел плейера,}{\f0\lang1033 }{который бы поддерживал эту команду. Возможно, она поддерживается на каких-то старых плейерах.
\par }\pard \qj\fi284\nowidctlpar\widctlpar\adjustright {\b GS}{ представляет из себя, по-сути, микропроцессорный комплекс со своим процессором, ПЗУ, ОЗУ и портами, и абсолютно не}{\f0\lang1033 }{зависит от главного процессора Спектрума,}{\f0\lang1033 }{что позволяет, например, загрузить свой}{\f0\lang1033 }{любимый модуль, сбросить Спектрум, загрузить ассемблер и творить под любимую музыку. Soft внутри GS полностью берет на себя}{\f0\lang1033 }{задачи проигрывания звука, интерпретации}{\f0\lang1033 }{модуля и т.д. Программирование GS'а сводится к передаче байт за байтом модуля}{\f0\lang1033 }{и/или сэмплов, а затем требуется только}{\f0\lang1033 }{подавать команды типа: запустить модуль, установить глобальную громкость проигрывания модуля, запустить сэмпл #09 в}{\f0\lang1033 }{канале #02 и т.д.
\par }\pard \qj\fi284\nowidctlpar\widctlpar\adjustright {Если предполагается загрузить модуль}{\f0\lang1033 }{вместе с сэмплами, то ОБЯЗАТЕЛЬНО требуется загружать вначале модуль, а затем сэмплы. При загрузке модуля очень рекомендуется}{\f0\lang1033 }{оставить свободными 2к памяти, т.е. загружать модули длиной максимум 110K. Это условие не является необходимым, но его исполнение очень желательно в целях совместимости с последующими версиями.
\par Аналогично очень рекомендуется оставлять}{\f0\lang1033 }{по 80 байт для каждого сэмпла, например,}{\f0\lang1033 }{если требуется загрузить 63-х килобайтный}{\f0\lang1033 }{модуль и 18 сэмплов, то имеем:
\par }\pard \qj\nowidctlpar\widctlpar\adjustright {Total_Sample_Length=112*1024-63*1024-2*1024-18*80=46688 байт}{\f0\lang1033 }{
\par Это суммарная длина сэмплов, которые при}{\f0\lang1033 }{таком положении вещей могут быть загружены.Если же, например, требуется вычислить,}{\f0\lang1033 }{сколько поместится в память }{\b GS}{ 2-х килобайтных сэмплов, то это вычисляется следующим образом:
\par }\pard \nowidctlpar\widctlpar\adjustright {112*1024/(2048+80)=53 сэмпла.
\par В GS'е имеются 4 физических канала, которые и проигрывают звук.
\par Каналы 0 и 1 - левые, а 2 и 3 - правые.}{\f0\lang1033 }{
\par }\pard\plain \s1\sb240\sa60\keepn\nowidctlpar\widctlpar\outlinelevel0\adjustright \b\f1\fs28\lang1049\kerning28\cgrid {\f142 4. Интерфейс со Спектрумом.
\par }\pard\plain \qj\nowidctlpar\widctlpar\adjustright \f134\fs20\lang1049\cgrid {На мир GS смотрит при помощи 4 регистров:
\par {\pntext\pard\plain\f134\fs20\cgrid \hich\af134\dbch\af0\loch\f134 1. \tab}}\pard \qj\fi-283\li283\nowidctlpar\widctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec\pnb0\pni0\pnf134\pnfs20\pnstart1\pnindent283\pnhang{\pntxta . }}\ls1\adjustright {\b Command register}{ - регистр команд, доступный для записи порт по адресу 187. В}{\f0\lang1033 }{этот регистр записываются команды.}{\f0\lang1033
\par {\pntext\pard\plain\f134\fs20\cgrid \hich\af134\dbch\af0\loch\f134 2. \tab}}\pard \qj\fi-283\li283\nowidctlpar\widctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec\pnb0\pni0\pnf134\pnfs20\pnstart1\pnindent283\pnhang{\pntxta . }}\ls1\adjustright {\b Status register }{- регистр состояния,}{\f0\lang1033 }{доступный для чтения порт по адресу 187.
\par }\pard \qj\nowidctlpar\widctlpar\adjustright {\ul Биты регистра}{:
\par }\pard \qj\fi1701\nowidctlpar\widctlpar\adjustright {7 - }{\b Data bit}{, флаг данных
\par 6 - Неопределен
\par 5 - Неопределен
\par 4 - Неопределен
\par 3 - Неопределен
\par 2 - Неопределен
\par 1 - Неопределен
\par 0 - }{\b Command bit}{, флаг команд
\par }\pard \qj\nowidctlpar\widctlpar\adjustright {Этот регистр позволяет определить состояние }{\b GS}{, в частности можно ли прочитать}{\f0\lang1033 }{или записать очередной байт данных, или}{\f0\lang1033 }{подать очередную команду, и т.п.}{\f0\lang1033 }{
\par 3.}{\b Data register}{ - регистр данных, доступный для записи порт по адресу 179. В этот}{\f0\lang1033 }{регистр Спектрум записывает данные, например, это могут быть аргументы команд.
\par 4.}{\b Output register}{ - регистр вывода, доступный для чтения порт по адресу 179. Из}{\f0\lang1033 }{этого регистра Спектрум читает данные,}{\f0\lang1033 }{идущие от }{\b G}{S.
\par }\pard \qj\fi284\nowidctlpar\widctlpar\adjustright {\b Command bit}{ в регистре состояний устанавливается аппаратно после записи команды}{\f0\lang1033 }{в регистр команд. Сбрасываться в 0 он может только из }{\b GS}{, что сигнализирует об определенном этапе исполнения команды.}{\f0\lang1033 }{
\par }{\b Data bit}{ в регистре состояний может быть}{\f0\lang1033 }{установлен или сброшен как по желанию}{\f0\lang1033 }{Спектрума, так и по желанию }{\b GS}{: при записи}{\f0\lang1033 }{Спектрумом в регистр данных он аппаратно}{\f0\lang1033 }{устанавливается в 1, а после чтения }{\b GS}{'ом из этого регистра сбрасывается в 0. При}{\f0\lang1033 }{записи GS в регистр вывода он (все тот же}{\f0\lang1033 }{\b Data bit}{) аппаратно устанавливается в 1, а}{\f0\lang1033 }{после чтения из этого порта Спектрумом}{\f0\lang1033 }{сбрасывается аппаратно в 0. Несмотря на то, что регистр данных и регистр вывода расположены в пространстве}{\f0\lang1033 }{адресов портов по одному и тому же адресу}{\f0\lang1033 }{и воздействуют на один и тот же бит данных, они являются двумя независимыми регистрами. Значение, один раз записанное в}{\f0\lang1033 }{один из этих регистров, остается неизменным в нем до новой записи.
\par }\pard \qj\nowidctlpar\widctlpar\adjustright {Состояние бита данных очень часто неопределено, и если в спецификации команд не}{\f0\lang1033 }{определены значения этого бита на определенных этапах исполнения команды, недопустимо делать какие-либо предположения относительно значения этого бита.
\par }\pard\plain \s1\sb240\sa60\keepn\nowidctlpar\widctlpar\outlinelevel0\adjustright \b\f1\fs28\lang1049\kerning28\cgrid {\f142 5. Система команд GS.
\par }\pard\plain \qj\fi284\nowidctlpar\widctlpar\adjustright \f134\fs20\lang1049\cgrid {В начале позволю себе небольшое отступление от собственно системы команд. GS, как известно, предназначен в основном для проигрывания модулей и сэмплов. В данной версии (1.03) GS ROM допукается загрузка одного модуля и/или до 32 сэмплов. Каждый сэмпл при загрузке его в память получает свой уникальный идентификатор, который однозначно определяет обращение к данному сэмплу в командах, которые требуют номер сэмпла. Самый первый загруженный сэмпл получает номер (handle) = 1, следующий - номер 2, и т.д.
\par }\pard \qj\fi284\nowidctlpar\widctlpar\adjustright {То же самое применимо и к модулям, и этот единственный загруженный модуль будет иметь handle=1 после загрузки. Особенностью данной версии является также то, что вначале требуется загружать модуль, а затем уже сэмплы. Особенности описания команд:
\par }\pard \nowidctlpar\widctlpar\adjustright {Команды описываются следующим образом:
\par 1. Hex код команды
\par 2. Название команды
\par 3. Выполняемые действия при исполнении команды
\par 4. Формат команды
\par 5. Комментарии к команде
\par Формат команды описывается следующим образом:
\par }\pard \qc\nowidctlpar\widctlpar\adjustright {\b
\par }\pard \qc\nowidctlpar\widctlpar\box\brdrs\brdrw60\brsp20 \adjustright {\b GSCOM\tab EQU\tab 187
\par GSDAT \tab EQU \tab 179}{\f0\lang1033
\par }\pard \qc\nowidctlpar\widctlpar\adjustright {\f0\lang1033
\par }{\b \sect }\sectd \sbknone\linex0\headery709\footery709\cols2\colsx567\linebetcol\endnhere\sectdefaultcl \pard\plain \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 \f134\fs20\lang1049\cgrid {\b SC #NN}{\f0\lang1033 - }{Послать код команды в регистр команд
\par }\pard \fi1701\nowidctlpar\widctlpar\adjustright {LD A,#NN
\par OUT (GSCOM),A}{\f0\lang1033
\par }\pard \fi1701\nowidctlpar\widctlpar\adjustright {
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b WC}{\f0\lang1033 -}{ Ожидание сброса Command bit
\par }\pard \nowidctlpar\widctlpar\adjustright {WCLP}{\f0\lang1033 :\tab }{IN A,(GSCOM)
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {RRCA
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {JR C,WCLP}{\f0\lang1033
\par }\pard \fi2410\nowidctlpar\widctlpar\adjustright {
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b SD Data}{ }{\f0\lang1033 -}{ Послать данные в регистр данных
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {LD A,Data
\par OUT (GSDAT),A}{\f0\lang1033
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {\f0\lang1033
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b WD}{\b\f0\lang1033 -}{Ожидание сброса Data bit, по}{\f0\lang1033 }{сути, ожидание, пока }{\b GS}{\f0\lang1033 }{не примет посланные ему данные}{\f0\lang1033 }{
\par }\pard \nowidctlpar\widctlpar\adjustright {WDLP}{\f0\lang1033 :}{ }{\f0\lang1033 \tab }{IN A,(GSCOM)
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {RLCA
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {JR C,WDLP}{\f0\lang1033
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b GD Data}{ }{\f0\lang1033 - }{Принять данные из регистра}{\f0\lang1033 }{данных
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {IN A,(GSDAT)}{\f0\lang1033
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {WN}{\f0\lang1033 - }{Ожидание установки Data bit, по}{\f0\lang1033 }{сути, ожидание очередных данных}{\f0\lang1033 }{от }{\b GS}{
\par }\pard \nowidctlpar\widctlpar\adjustright {WNLP}{\f0\lang1033 :}{ }{\f0\lang1033 \tab }{IN A,(GSCOM)
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {RLCA
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {JR NC,WNLP\sect }\sectd \sbknone\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl \pard\plain \qc\nowidctlpar\widctlpar\box\brdrs\brdrw60\brsp20 \adjustright \f134\fs20\lang1049\cgrid {\b Команды GS}{\b\f0\lang1033
\par }\pard \qc\nowidctlpar\widctlpar\adjustright {\b\f0\lang1033
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b \sect }\sectd \sbknone\linex0\headery709\footery709\cols2\colsx340\linebetcol\endnhere\sectdefaultcl \pard\plain \qc\nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 \f134\fs20\lang1049\cgrid {\b #00 Reset flags}{
\par }\pard \nowidctlpar\widctlpar\adjustright {Сбрасывает флаги Data bit и Command}{\f0\lang1033 }{bit.
\par }\pard \fi567\nowidctlpar\widctlpar\adjustright {SC #00
\par }\pard \fi567\nowidctlpar\widctlpar\adjustright {WC
\par }\pard \nowidctlpar\widctlpar\adjustright {(Data bit=0, Command bit=0)
\par }{\f0\lang1033
\par }\pard \qc\nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #0E Go in Covox mode}{\b\f0\lang1033 }{\b
\par }\pard \nowidctlpar\widctlpar\adjustright {Переходит в режим }{\b С}{\b\f0\lang1033 ovox}{, напрямую}{\f0\lang1033 }{копирует регистр данных в ЦАПы двух (правого и левого) каналов.}{\f0\lang1033 }{Выход из этого режима - запись #00}{\f0\lang1033 }{ в регистр команд.
\par }\pard \fi567\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {SC #0E
\par }\pard \fi567\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {WC
\par SD \\
\par SD \\
\par ...}{\f0\lang1033 - }{ / Это вывод в ЦАПы
\par SD /
\par SC #00
\par WC
\par }\pard \nowidctlpar\widctlpar\adjustright {
\par }\pard \qc\nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #F3 Warm restart
\par }\pard \nowidctlpar\widctlpar\adjustright {Сбрасывает полностью }{\b GS}{, но пропускает}{\f0\lang1033 }{этапы определения количества страниц}{\f0\lang1033 }{памяти и их проверки, что очень сильно}{\f0\lang1033 }{ ускоряет процесс инициализации.}{\f0\lang1033 }{
\par }\pard \fi567\nowidctlpar\widctlpar\adjustright {SC #F3
\par }\pard \fi567\nowidctlpar\widctlpar\adjustright {WC
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #F4 Cold restart
\par }\pard \nowidctlpar\widctlpar\adjustright {Полный перезапуск GS со всеми проверками. По сути, JP #0000.
\par }\pard \fi567\nowidctlpar\widctlpar\adjustright {SC #F4
\par }\pard \fi567\nowidctlpar\widctlpar\adjustright {WC}{\f0\lang1033
\par }\pard \fi567\nowidctlpar\widctlpar\adjustright {
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #20 Get total RAM
\par }\pard \nowidctlpar\widctlpar\adjustright {Получить общий объем доступной памяти}{\f0\lang1033 }{на GS. ( В базовой версии это 112к)}{\f0\lang1033 }{
\par }\pard \fi567\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {SC #20
\par }\pard \fi567\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {WC
\par GD RAM.L(Младшая часть)
\par WN
\par GD RAM.M(Средняя часть)
\par WN
\par GD RAM.H(Старшая часть)
\par }\pard \nowidctlpar\widctlpar\adjustright {Total RAM=65536*RAM.H+256*RAM.M+RAM.L
\par
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #21 Get free RAM
\par }\pard \nowidctlpar\widctlpar\adjustright {Получить общий объем свободной памяти}{\f0\lang1033 }{ на GS.
\par }\pard \fi567\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {SC #20
\par }\pard \fi567\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {WC
\par GD RAM.L(Младшая часть)
\par WN
\par GD RAM.M(Средняя часть)
\par WN
\par GD RAM.H(Старшая часть)
\par Free_RAM=65536*RAM.H+256*RAM.M+RAM.L
\par }\pard \nowidctlpar\widctlpar\adjustright {
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #23 Get number of RAM Pages
\par }\pard \nowidctlpar\widctlpar\adjustright {Получить число страниц на GS.
\par }\pard \nowidctlpar\widctlpar\adjustright {SC #23
\par WC
\par GD Number_RAM_Pages
\par В базовой версии 3 страницы.}{\f0\lang1033 }{
\par
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #2A Set Module Master Volume
\par }\pard \nowidctlpar\widctlpar\adjustright {Установить громкость проигрывания}{\f0\lang1033 }{модулей.
\par }\pard \nowidctlpar\widctlpar\adjustright {SD Module_Master_Volume [#00..#40]}{\f0\lang1033
\par }\pard \nowidctlpar\widctlpar\adjustright {SC #2A
\par }\pard \nowidctlpar\widctlpar\adjustright {WC
\par [GD Old_Master_Volume] - Старая громк}{\f0\lang1033
\par }\pard \nowidctlpar\widctlpar\adjustright {Маленький пример использования данной}{\f0\lang1033 }{ команды:
\par }\pard \nowidctlpar\widctlpar\adjustright {(Предполагается, что играется модуль)}{\f0\lang1033 }{
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {LD B,#40
\par }\pard \nowidctlpar\widctlpar\adjustright {LOOP:\tab LD A,B
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {OUT (GSDAT),A
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {LD A,#2A
\par OUT (GSCOM),A
\par EI
\par HALT
\par DJNZ LOOP
\par }\pard \nowidctlpar\widctlpar\adjustright {
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {LD A,#32
\par }\pard \fi720\nowidctlpar\widctlpar\adjustright {OUT (GSCOM),A
\par }\pard \nowidctlpar\widctlpar\adjustright {Вышеописанное плавно снижает громкость}{\f0\lang1033 }{играющего модуля, а затем останавливает}{\f0\lang1033 }{его.
\par
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #2B Set FX Master Volume
\par }\pard \nowidctlpar\widctlpar\adjustright {Установить громкость проигрывания}{\f0\lang1033 }{эффектов.
\par }\pard \nowidctlpar\widctlpar\adjustright {SD FX_Master_Volume [#00..#40]
\par SC #2B
\par WC
\par [GD Old_FX_Volume] - Старая громкость
\par Аналогично предыдущей команде, но действует на сэмплы.С помощью этих двух команд можно регулировать баланс громкостей модуля и сэмплов,}{\f0\lang1033 }{и т.п.
\par
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #2E Set Current FX
\par }\pard \qj\nowidctlpar\widctlpar\adjustright {Установить текущий эффект. Просто}{\f0\lang1033 }{присваивает переменной CURFX это значение. Если какая-либо команда требует номер сэмпла (sample handle), то}{\f0\lang1033 }{можно вместо этого номера подать ей}{\f0\lang1033 }{#00 и интерпретатор подставит вместо}{\f0\lang1033 }{этого нуля значение переменной CURFX.}{\f0\lang1033 }{(См. команды #38, #39, #40-#4F для}{\f0\lang1033 }{понимания вышеизложенного.)
\par }\pard \nowidctlpar\widctlpar\adjustright {SD Cur_FX
\par SC #2E
\par WC
\par
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #30 Load Module}{\b\f0\lang1033 }{\b
\par }\pard \nowidctlpar\widctlpar\adjustright {Загрузка модуля в память.
\par }\pard \nowidctlpar\widctlpar\adjustright {SC #30
\par WC
\par [GD Module_Handle]-номер модуля
\par (Command bit=0, Data bit=0)
\par
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b SC #D1 Open Stream
\par }\pard \nowidctlpar\widctlpar\adjustright {Открыть поток WC
\par }\pard \nowidctlpar\widctlpar\adjustright {SD \\
\par WD \\
\par ... Байты модуля
\par SD /
\par WD /
\par
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b SC #D2 Close Stream
\par }\pard \nowidctlpar\widctlpar\adjustright {Закрыть потокWC
\par }\pard \nowidctlpar\widctlpar\adjustright {Пример:
\par }\pard \fi720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {LD HL,Mod_adress
\par }\pard \fi720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {LD DE,0-Mod_length
\par LD C,GSCOM
\par LD A,#30
\par CALL SENDCOM
\par LD A,#D1
\par CALL SENDCOM
\par LD A,(HL)
\par }\pard \sl-200\slmult0\nowidctlpar\widctlpar\adjustright {LOOP:\tab IN B,(C)
\par }\pard \fi720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {JP P,READY
\par IN B,(C)
\par JP M,LOOP
\par }\pard \sl-200\slmult0\nowidctlpar\widctlpar\adjustright {READY:OUT (GSDAT),A
\par }\pard \fi720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {INC HL
\par LD A,(HL)
\par INC E
\par JP NZ,LOOP
\par INC D
\par JP NZ,LOOP
\par WAIT:\tab IN B,(C) ; Ждем принятия
\par JP M,WAIT ;последнего байта
\par LD A,#D2
\par CALL SENDCOM
\par IN A,(GSDAT) ; Номер модуля
\par }\pard \fi720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {OUT (GSDAT),A
\par }\pard \fi720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {LD A,#31
\par }\pard \sl-200\slmult0\nowidctlpar\widctlpar\adjustright {SENDCOM:\tab OUT (GSCOM),A
\par WAITCOM:\tab IN A,(GSCOM)
\par }\pard \fi720\li720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {RRCA
\par JR C,WAITCOM
\par RET
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #31 Play module
\par }\pard \nowidctlpar\widctlpar\adjustright {Проигрывание модуля.
\par }\pard \nowidctlpar\widctlpar\adjustright {SD Module_Handle - номер модуля
\par SC #31
\par WC
\par
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #32 Stop module
\par }\pard \nowidctlpar\widctlpar\adjustright {Остановить проигрывание модуля.
\par }\pard \nowidctlpar\widctlpar\adjustright {SC #32
\par WC
\par
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #33 Continue module
\par }\pard \nowidctlpar\widctlpar\adjustright {Продолжить проигрывание модуля после остановки.
\par }\pard \nowidctlpar\widctlpar\adjustright {SC #33
\par WC
\par
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #38 Load FX
\par }\pard \nowidctlpar\widctlpar\adjustright {Загрузка сэмпла эффекта в память.
\par }\pard \nowidctlpar\widctlpar\adjustright {Загружает беззнаковые сэмплы
\par (PC type)
\par SC #38
\par WC
\par [GD FX_Handle]-номер сэмпла
\par (Command bit=0, Data bit=0)
\par SC #D1 (Open Stream-открыть поток)
\par WC
\par SD \\
\par WD \\
\par ... Байты сэмпла
\par SD /
\par WD /
\par
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b SC #D2 Close Stream
\par }\pard \nowidctlpar\widctlpar\adjustright {Закрыть поток
\par }\pard \nowidctlpar\widctlpar\adjustright {WC
\par }\pard \qj\nowidctlpar\widctlpar\adjustright {При загрузке каждого сэмпла, в памяти }{\b GS}{ создается для этого сэмпла заголовок, в котором описываются различные параметры сэмпла. После загрузки эти параметры устанавливаются в определенные значения, как то: }{\b Note}{=60, }{\b Volume}{=#40, }{\b FineTune}{=0, }{\b Seek- First}{=#0F, }{\b SeekLast}{=#0F, }{\b Priority}{=#80, }{\b No Loop}{ и внутренняя переменная }{\b CurFX}{ устанавливается равной }{\b FX_Handle}{.
\par }\pard \qj\nowidctlpar\widctlpar\adjustright {Затем командами #40, #41, #42, #45, #46 и #47 можно эти значения по умолчанию сменить на свои. Это требуется потому что команда #39 для инициации проигрывания сэмпла использует значения параметров из заголовка сэмпла.
\par В своем естественном виде сэмплы обычно плохо пакуются компрессорами, но сжимаемость обычно можно поднять, если перевести сэмпл в Delta-вид, т.е. хранить не абсолютные значения сэмпла, а относительное смещение относительно предыдущего байта. Примерно вот так можно перевести сэмпл в Delta-вид:
\par }\pard \fi720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {LD HL,Start_of_sample
\par LD DE,0-Length_of_sample
\par LD C,#00
\par }\pard \sl-200\slmult0\nowidctlpar\widctlpar\adjustright {LOOP:\tab LD A,(HL)
\par }\pard \fi720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {SUB C
\par LD C,(HL)
\par LD (HL),A
\par INC E
\par JP NZ,LOOP
\par INC D
\par JP NZ,LOOP
\par }\pard \sl-200\slmult0\nowidctlpar\widctlpar\adjustright {А вот как можно закачать сэмпл:
\par }\pard \fi720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {LD IX,Parameters
\par LD HL,Sample_adress
\par LD DE,0-Sample_length
\par LD C,GSCOM
\par }\pard \sl-200\slmult0\nowidctlpar\widctlpar\adjustright {
\par }\pard \fi720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {LD A,#38
\par CALL SENDCOM
\par LD A,#D1
\par CALL SENDCOM
\par }\pard \sl-200\slmult0\nowidctlpar\widctlpar\adjustright {
\par }\pard \fi720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {LD A,(HL)
\par }\pard \sl-200\slmult0\nowidctlpar\widctlpar\adjustright {LOOP:\tab IN B,(C)
\par }\pard \fi720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {JP P,READY
\par IN B,(C)
\par JP M,LOOP
\par }\pard \sl-200\slmult0\nowidctlpar\widctlpar\adjustright {READY:\tab OUT (GSDAT),A
\par }\pard \fi720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {INC HL
\par ADD A,(HL)
\par INC E
\par JP NZ,LOOP
\par INC D
\par JP NZ,LOOP
\par }\pard \sl-200\slmult0\nowidctlpar\widctlpar\adjustright {WAIT:\tab IN B,(C) ; Ждем принатия
\par }\pard \li709\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {JP M,WAIT ;последнего байтаLD A,#D2CALL SENDCOM
\par }\pard \sl-200\slmult0\nowidctlpar\widctlpar\adjustright {; Теперь переопределяем параметры сэмпла по умолчанию своими значениями
\par }\pard \fi720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {LD A,(IX+#00)
\par }\pard \fi720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {OUT (GSDAT),A ; Нота
\par LD A,#40
\par CALL SENDCOM
\par LD A,(IX+#01)
\par OUT (GSDAT),A ; Громкость
\par LD A,#41SENDCOM:\tab OUT (GSCOM), AWAITCOM:\tab IN A,(GSCOM)
\par RRCA
\par JR C,WAITCOM
\par RET
\par
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #39 Play FX
\par }\pard \nowidctlpar\widctlpar\adjustright {Проигрывание эффекта.SD FX_Handle - номер сэмплаSC #39WC
\par }\pard \qj\fi284\nowidctlpar\widctlpar\adjustright {При исполнении этой команды происходит следующее: смотрятся каналы, указанные в SeekFirst параметре нашего сэмпла, и если хотя-бы один из них свободен, в нем и проигрывается сэмпл, в противном случае смотрятся каналы, указанные в SeekLast и если один из них свободен, в нем и играется сэмпл, если свободных нет, то просматриваются все каналы, указанные SeekLast, из них выбирается канал с наименьшим приоритетом и сравнивается с приоритетом нашего сэмпла (имеется в виду сэмпл, который мы хотим проиграть), если у этого сэмпла будет больший приоритет, чем у сэмпла, уже играющего в канале, то играющий в канале сэмпл будет остановлен, а наш сэмпл будет запущен в этом канале вместо старого сэмпла. Вот такая вот приоритетная схема. Когда сэмпл запускается в канале, то его нота, громкость и т.п. параметры записываются в область данных канала из заголовка сэмпла.}{\f0\lang1033 }{В общем случае, чтобы проиграть сэмпл с нужными параметрами, вы можете установить эти параметры после загрузки сэмпла и смело использовать команду #39. Если же параметры должны меняться, то можно поступать следующим образом: командой #2E сделать текущим требуемый сэмпл, командами #4x изменить его параметры, а затем уже запускать его командой #39.
\par }\pard \qj\fi284\nowidctlpar\widctlpar\adjustright {Альтернативный метод запуска сэмплов предоставляют команды #80..#9F, при исполнении этих команд вы прямо в коде команды указываете, в каком канале требуется запустить сэмпл, и кроме этого, вы можете также указать с какой нотой и/или громкостью требуется запустить сэмпл.
\par }\pard \qj\nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #3A Stop FX in channels
\par }\pard \qj\nowidctlpar\widctlpar\adjustright {Остановка проигрывания эффектов в заданных каналах, которые указываются в маске каналов (Channel Mask).
\par }\pard \qj\nowidctlpar\widctlpar\adjustright {В ней единица в n-ном бите указывает на то, что эффект в n-ном канале требуется остановить
\par }\pard \nowidctlpar\widctlpar\adjustright {SD Channel_MaskSC #3AWCОписанное выше есть идеальный вариант работы данной команды, но к сожалению не все так просто в этом мире, и эта команда действует не так, а именно: единица в бите 7 останавливает сэмпл в нулевом канале, и т.п. В следующих версиях это будет исправлено, а пока я могу порекомендовать останавливать вообще все сэмплы маской #FF.
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #3E Load FX (Extended version)
\par }\pard \nowidctlpar\widctlpar\adjustright {Загрузка сэмпла эффекта в память. Позволяет загружать сэмплы со знаком.(Amiga type)SD #01 (Signed sample)SC #3EWC[GD FX_Handle]-номер сэмпла(Command bit=0, Data bit=0)SC #D1 (Open Stream-открыть поток)WCSD \\WD \\ ... Байты сэмплаSD /WD /
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b SC #D2 (Close Stream-закрыть поток)
\par }\pard \nowidctlpar\widctlpar\adjustright {WC
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #40 Set FX Sample Playing Note
\par }\pard \nowidctlpar\widctlpar\adjustright {Установка ноты по умолчанию для текущего эффекта.SD Note [0..95]SC #40}{\f0\lang1033
\par }{WC}{\f0\lang1033
\par }\pard \sl-200\slmult0\nowidctlpar\widctlpar\adjustright {Note=}{\f0\lang1033 \tab }{0 C-0}{\f0\lang1033
\par }\pard \li720\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {1 C#012 C-124 C-236 C-3 (C-1 в Амиге)48 C-4 (C-2 в Амиге)60 C-5 (C-3 в Амиге)72 C-684 C-7}{\f0\lang1033
\par }\pard \nowidctlpar\widctlpar\adjustright {В данной версии Sound Generators Wave 2, 3 могут воспроизвести октавы 3, 4 и 5, поэтому допустимым значением параметра Note является диапазон от 36 до 71.
\par }\pard \nowidctlpar\widctlpar\adjustright {
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #41 Set FX Sample Volume
\par }\pard \nowidctlpar\widctlpar\adjustright {Установка громкости по умолчанию для текущего эффекта.SD FX_Volume [#00..#40]SC #41WC
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #45 Set FX Sample Priority
\par }\pard \nowidctlpar\widctlpar\adjustright {Установка приоритета для текущего эффекта.(См. команду #39)SD FX_Priority [#01..#fe]SC #45WC
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #46 Set FX Sample Seek First parameter
\par }\pard \nowidctlpar\widctlpar\adjustright {Установка параметра Seek First для текущего эффекта.(См. команду #39)SD FX_SeekFirstSC #46WC
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #47 Set FX Sample Seek Last parameter
\par }\pard \nowidctlpar\widctlpar\adjustright {Установка параметра Seek Last для текущего эффекта.(См. команду #39)SD FX_SeekLastSC #47WC
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #60 Get Song Position
\par }\pard \nowidctlpar\widctlpar\adjustright {Получение значения переменной Song_Position в текущем модуле.SC #60WCGD Song_Position [#00..#FF]
\par }\pard \qj\fi284\nowidctlpar\widctlpar\adjustright {Можно интерпретировать как количество проигранных паттернов модуля. После старта модуля принимает значение 0 и увеличивается на единицу после проигрывания очередного паттерна. Эта переменная может использоваться для синхронизирования процессов в Спектруме с проигрыванием модуля. Для этого можно, например, в начале процедуры обработки прерывания сделать SC #60, затем выполнить процедуры различных операций с экраном, скроллинга строчек и т.п. (т.е. чтобы была достаточная для выполнения команды задержка), а затем прочитать значение порта 179 (}{\b GD Song_Position}{), и сравнить его с требуемым и, в случае равенства, перейти на следующую часть демы, т.е.if (Song_Position==My_Position)
\par }\pard \qj\nowidctlpar\widctlpar\adjustright { \tab then goto Next_Part_Of_Demo
\par }\pard \qj\nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #61 Get Pattern Position
\par }\pard \qj\nowidctlpar\widctlpar\adjustright {Получение значения переменной Pattern_Position в текущем модуле.SC #61WCGD Pattern_Position [#00..#3F]Получить значение смещения в паттерне (текущий ROW), использование - аналогично предыдущей команде, однако требуется заметить, что эта величина изменяется довольно быстро, и поэтому}{\f0\lang1033 :}{
\par }\pard \qj\nowidctlpar\widctlpar\adjustright { if (Pattern_Position>=My_Position)
\par }\pard \qj\fi720\nowidctlpar\widctlpar\adjustright { then goto Next_Part_Of_Demo
\par }\pard \qj\nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #62 Get Mixed Position
\par }\pard \qj\nowidctlpar\widctlpar\adjustright {Получить значение Pattern_Position, немного смешанной с Song_Position. SC #62WCGD Mixed_PositionMixed_Position: (по битам)
\par }\pard \qj\li720\nowidctlpar\widctlpar\adjustright {7-Song_Position.16-Song_Position.05-Pattern_Position.54-Pattern_Position.43-Pattern_Position.32-Pattern_Position.21-Pattern_Position.10-Pattern_Position.0
\par }\pard \qj\fi284\nowidctlpar\widctlpar\adjustright {Т.е. если получить Mixed_Position и сделать с ним AND #3F, то получится вылитый Pattern_Position, а если после получения его немного RLCA, RLCA, AND #02 - то это будут младшие два бита Song_Position. См. примечания к командам #60 и #61.
\par }\pard \nowidctlpar\widctlpar\adjustright {
\par }\pard \nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #63 Get Channel Notes
\par }\pard \nowidctlpar\widctlpar\adjustright {Получить ноты всех каналов модуля.SC #63WCGD Note_of_channel_0WNGD Note_of_channel_1WNGD Note_of_channel_2WNGD Note_of_channel_3
\par }\pard \qj\fi284\nowidctlpar\widctlpar\adjustright {Если в каком-либо канале значение ноты изменилось с последнего исполнения команды #63, то бит 7 полученного заначения Note_of_channel_N будет в нуле, если же это значение то же самое, что и было раньше, то этот бит будет в единице. Младшие семь битов и есть собственно нота от 0 до 95; если это значение равно 127, то это означает, что никакие сэмплы в канале не играют. Данная команда предназначена в основном для построения на ее основе различных анализаторов.
\par }\pard \qj\nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #64 Get Channel Volumes
\par }\pard \qj\nowidctlpar\widctlpar\adjustright {Получить громкости всех каналов модуля.SC #64WCGD Volume_of_channel_0WNGD Volume_of_channel_1WNGD Volume_of_channel_2WNGD Volume_of_channel_3См. описание команды #63
\par }\pard \qj\nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #80 Direct Play FX Sample (#80..#83)
\par }\pard \qj\nowidctlpar\widctlpar\adjustright {Проигрывание сэмпла в заданном канале.SD Sample_NumberSC #80..#83 (Младшие биты определяют непосредственно номер канала, в котором требуется играть сэмпл)WC
\par }\pard \qj\nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #88 Direct Play FX Sample (#88..#8B)
\par }\pard \qj\nowidctlpar\widctlpar\adjustright {Проигрывание сэмпла в заданном канале с заданной нотой.SD Sample_NumberSC #88..#8B (Младшие биты определяют непосредственно номер канала, в котором требуется играть сэмпл)WCSD Note [0..95]WD
\par }\pard \qj\nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #90 Direct Play FX Sample (#90..#93)
\par }\pard \qj\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {Проигрывание сэмпла в заданном канале с заданной громкостью.SD Sample_NumberSC #90..#93 (Младшие биты определяют непосредствен но номер канала, в котором требуется играть сэмпл)WCSD Volume [#00..#40]WD
\par }\pard \qj\nowidctlpar\widctlpar\box\brdrs\brdrw15\brsp20 \adjustright \shading2000 {\b #98 Direct Play FX Sample (#98..#9B)
\par }\pard \qj\sl-200\slmult0\nowidctlpar\widctlpar\adjustright {Проигрывание сэмпла в заданном канале с заданной нотой и громкостью.SD Sample_NumberSC #88..#8B (Младшие биты определяют непосредственно номер канала, в котором требуется играть сэмпл)WCSD Note [0..95]WDSD Volume [#00..#40]WD --------------------определяют непосредственно номер канала, в котором требуется играть сэмпл)WC SD Note [0..95]}{\b \sect }\sectd \sbknone\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl \pard\plain \qj\nowidctlpar\widctlpar\adjustright \f134\fs20\lang1049\cgrid {
\par }}

BIN
firmware/release/gs104.rom Normal file

Binary file not shown.

View File

@ -0,0 +1,2 @@
General Sound (tm) ROM
Copyright 1997 StingerVersion 1.04 Beta PreRls

BIN
firmware/release/gs105a.rom Normal file

Binary file not shown.

View File

@ -0,0 +1,90 @@
General Sound ROM v1.05a
(с) Stinger, 1997,
bugfixed by psb & Evgeny Muchkin, 2007.
В данной версии прошивки исправлены глюки версии 1.04 Beta.
1. Глюк с модулями, в которых >= 63 паттерна (klisje.mod, tranceillusion.mod).
2. Глюк со скоростью проигрывания ПОСЛЕДНЕЙ ноты модуля, её скорость
выставлялась стандартной, во многих модулях при зацикливании была заметна
задержка (напр., technostyle(z).mod). Более того, при зацикливании не на 1ю
позицию, скорость все равно выставлялась стандартной!
3. Пофиксена неправильная скорость проигрывания сэмплов. На некоторых модулях
было заметно, что сэмплы играли немного быстрее чем надо (напр.,
EightMayDay.mod).
4. При начале проигрывания модуля GS сообщал, что играет какая-то нота, даже
если в канале ничего не играло (команда #64 возвращала не 127).
5. Добавлена команда для плееров: #6A - Set player mode. После этой команды GS
перестанет обращать внимание на команду останова в модуле (ком. F00). Полезно
для некоторых модулей (bst.mod).
Формат команды:
SD #01 ;#01 - On, #00 - Off
SC #6A
WC
6. Встроен релупер для модулей. Раньше, если в модуле играл сэмпл, длина лупа
которого была слишком маленькой (десятки-сотни байт), GS тормозил или зависал.
После этой команды сэмплы в загружаемом модуле фиксятся и GS не тормозит.
Формат команды:
SD MinLoopLen_Low
SC #6B
WC
SD MinLoopLen_High
Параметр MinLoopLen задается в СЛОВАХ и может быть в диапазоне от 0 до 16384
(0 - релупер выключен).
Возможен короткий формат команды:
SC #6B
WC
SC ... ;следующая команда GS
В этом случае длина поумолчанию будет 512 слов.
ВНИМАНИЕ! Настройки команд #6A и #6B сбрасываются только аппаратным RESET или
командой #F4 (командой #F3 не сбрасываются!).
p.s. В прошивке по смещению #0004 находится номер версии в BCD формате; по
смещению #0100 находятся оригинальные копирайты (3 строки по 24 символа); по
смещению #0800 находится информация о патче, строка заканчивается 0.
p.p.s. Для работы старых плееров в новых режимах (п.5 и 6), достаточно перед их
запуском дать из бейсика команды:
OUT 179,1
OUT 187,106
OUT 187,107
p.p.p.s. Хочется выразить особую благодарность следующим людям:
Stinger: за прошивку и доступные исходники,
Aprisobal: без SjASMPlus не было бы ничего этого,
Evgeny Muchkin: за всяческое содействие при создании патча,
Caro: за IDA и моральную поддержку,
SMT & Alone Coder: за UnrealSpeccy (и за исправление глюков в нем!;),
Half Elf: за плагины к фару,
n1k-o & Manwe: за консультации по mod'ам.

BIN
firmware/release/gs105b.rom Normal file

Binary file not shown.

View File

@ -0,0 +1,23 @@
General Sound ROM v1.05b
(с) Stinger, 1997,
bugfixed by psb & Evgeny Muchkin, 2007, 2015.
В данной версии прошивки исправлены глюки, которые остались в 1.05a.
1. Неправильно обрабатывалась команда 9xx модуля. Если сэмпл был зациклен,
а смещение указывало за пределы сэмпла, то проигрывание сэмпла останавливалось.
Теперь в этом случае проигрывание начинается с начала цикла.
2. После загрузки модуля старая прошивка производила операцию смены знака у
сэмплов до самого конца ОЗУ, независимо от длины модуля. При большом объёме
памяти у GS операция занимала достаточно много времени.
3. Опциональное исправление. Стандартная прошивка имеет интенсивный тест ОЗУ,
что уже даже при 512 КБ памяти приводит к весьма ощутимой задержке после
сброса. Некоторым программам не хватало таймаута для определения наличия GS.
Прошивка с отключенным тестом ОЗУ стартует на порядки быстрее.

BIN
firmware/release/gs108.rom Normal file

Binary file not shown.

View File

@ -0,0 +1,4 @@
Прошивка появилась для карты ZXMGeneralSound.
Какие в ней изменения на данный момент неизвестно.
http://micklab.ru/My%20Soundcard/ZXMGeneralSound.htm#firmware

Binary file not shown.

View File

@ -0,0 +1,6 @@
Развитие прошивки для новой звуковой карты neoGS от NedoPC
Исходники на svn репозитории:
http://svn.zxevo.ru/listing.php?repname=ngs
Прошика без проблем работает на классическом GeneralSound

7
firmware/src/README.md Normal file
View File

@ -0,0 +1,7 @@
# Исходники ключевых версий в интернете
## v105b
https://github.com/psbhlw/gs-firmware
## v110
http://svn.zxevo.ru/listing.php?repname=ngs

Binary file not shown.

BIN
firmware/src/v104/GS1_0.TXT Normal file

Binary file not shown.

553
firmware/src/v104/MOD.TXT Normal file
View File

@ -0,0 +1,553 @@
Path: pdxgate!usenet.ee.pdx.edu!ogicse!network.ucsd.edu!usc!wupost!uunet!pipex!marble.uknet.ac.uk!uknet!edcastle!iantw
From: iantw@castle.ed.ac.uk (Ian Tweedie)
Newsgroups: comp.sys.ibm.pc.demos
Subject: Re: Does anyone have the MOD file format?
Message-ID: <33868@castle.ed.ac.uk>
Date: 5 Apr 93 11:48:50 GMT
References: <lru8ebINN79h@earth.cs.utexas.edu> <LESHER.93Apr4142851@vega.cs.bucknell.edu>
Organization: Edinburgh University
Lines: 542
lesher@vega.cs.bucknell.edu (Tim Lesher) writes:
>I don't have it, but I seem to remember that there's a really good
>tutorial packaged with the Mac mod player "The Sound Trecker". You
>can get if from wuarchive.wustl.edu, /mirrors/info-mac/sound/st.
Here is the Amiga (ProTracker) module format document. The first part
I got from a BBS, the second part I got from Mark Cox (author of
ModPlay, etc).
*********************************************************************
Protracker 1.1B Song/Module Format:
Offset Bytes Description
0 20 Songname. Remember to put trailing null bytes at the end...
Information for sample 1-31:
Offset Bytes Description
20 22 Samplename for sample 1. Pad with null bytes.
42 2 Samplelength for sample 1. Stored as number of words.
Multiply by two to get real sample length in bytes.
44 1 Lower four bits are the finetune value, stored as a signed
four bit number. The upper four bits are not used, and
should be set to zero.
Value: Finetune:
0 0
1 +1
2 +2
3 +3
4 +4
5 +5
6 +6
7 +7
8 -8
9 -7
A -6
B -5
C -4
D -3
E -2
F -1
45 1 Volume for sample 1. Range is $00-$40, or 0-64 decimal.
46 2 Repeat point for sample 1. Stored as number of words offset
from start of sample. Multiply by two to get offset in bytes.
48 2 Repeat Length for sample 1. Stored as number of words in
loop. Multiply by two to get replen in bytes.
Information for the next 30 samples starts here. It's just like the info for
sample 1.
Offset Bytes Description
50 30 Sample 2...
80 30 Sample 3...
.
.
.
890 30 Sample 30...
920 30 Sample 31...
Offset Bytes Description
950 1 Songlength. Range is 1-128.
951 1 Well... this little byte here is set to 127, so that old
trackers will search through all patterns when loading.
Noisetracker uses this byte for restart, but we don't.
952 128 Song positions 0-127. Each hold a number from 0-63 that
tells the tracker what pattern to play at that position.
1080 4 The four letters "M.K." - This is something Mahoney & Kaktus
inserted when they increased the number of samples from
15 to 31. If it's not there, the module/song uses 15 samples
or the text has been removed to make the module harder to
rip. Startrekker puts "FLT4" or "FLT8" there instead.
Offset Bytes Description
1084 1024 Data for pattern 00.
.
.
.
xxxx Number of patterns stored is equal to the highest patternnumber
in the song position table (at offset 952-1079).
Each note is stored as 4 bytes, and all four notes at each position in
the pattern are stored after each other.
00 - chan1 chan2 chan3 chan4
01 - chan1 chan2 chan3 chan4
02 - chan1 chan2 chan3 chan4
etc.
Info for each note:
_____byte 1_____ byte2_ _____byte 3_____ byte4_
/ / / /
0000 0000-00000000 0000 0000-00000000
Upper four 12 bits for Lower four Effect command.
bits of sam- note period. bits of sam-
ple number. ple number.
Periodtable for Tuning 0, Normal
C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113
To determine what note to show, scan through the table until you find
the same period as the one stored in byte 1-2. Use the index to look
up in a notenames table.
This is the data stored in a normal song. A packed song starts with the
four letters "PACK", but i don't know how the song is packed: You can
get the source code for the cruncher/decruncher from us if you need it,
but I don't understand it; I've just ripped it from another tracker...
In a module, all the samples are stored right after the patterndata.
To determine where a sample starts and stops, you use the sampleinfo
structures in the beginning of the file (from offset 20). Take a look
at the mt_init routine in the playroutine, and you'll see just how it
is done.
Lars "ZAP" Hamre/Amiga Freelancers
--------------------------
Found that document...
Mark J Cox ------------------------------------------- m.j.h.cox@bradford.ac.uk
University of Bradford ---------------------------- bc732@cleveland.freenet.edu
Mark
EFFECT COMMANDS
---------------
Effect commands on protracker should
be compatible with all other trackers.
0 - None/Arpeggio 8 - * NOT USED *
1 - Portamento Up 9 - SampleOffset
2 - Portamento Down A - VolumeSlide
3 - TonePortamento B - PositionJump
4 - Vibrato C - Set Volume
5 - ToneP + VolSlide D - PatternBreak
6 - Vibra + VolSlide E - Misc. Cmds
7 - Tremolo F - Set Speed
E - COMMANDS
------------
The E command has been altered to
contain more commands than one.
E0- Filter On/Off E8- * NOT USED *
E1- Fineslide Up E9- Retrig Note
E2- Fineslide Down EA- FineVol Up
E3- Glissando Control EB- FineVol Down
E4- Vibrato Control EC- NoteCut
E5- Set Finetune ED- NoteDelay
E6- Patternloop EE- PatternDelay
E7- Tremolo Control EF- Invert Loop
Cmd 0. Arpeggio [Range:$0-$F/$0-$F]
-----------------------------------
Usage: $0 + 1st halfnote add
+ 2nd halfnote add
Arpeggio is used to simulate chords.
This is done by rapidly changing the
pitch between 3(or 2) different notes.
It sounds very noisy and grainy on
most samples, but ok on monotone ones.
Example: C-300047 C-major chord:
(C+E+G or C+4+7 halfnotes)
C-300037 C-minor chord:
(C+D#+G or C+3+7 halfnotes)
Cmd 1. Portamento up [Speed:$00-$FF]
------------------------------------
Usage: $1 + portamento speed
Portamento up will simply slide the
sample pitch up. You can NOT slide
higher than B-3! (Period 113)
Example: C-300103 1 is the command,
3 is the portamentospeed.
NOTE: The portamento will be called as
many times as the speed of the song.
This means that you'll sometimes have
trouble sliding accuratly. If you
change the speed without changing the
sliderates, it will sound bad...
Cmd 2. Portamento down [Speed:$00-FF]
-------------------------------------
Usage: $2 + portamento speed
Just like command 1, except that this
one slides the pitch down instead.
(Adds to the period).
You can NOT slide lower than C-1!
(Period 856)
Example: C-300203 2 is the command,
3 is the portamentospeed.
Cmd 3. Tone-portamento [Speed:$00-$FF]
--------------------------------------
Usage: Dest-note + $3 + slidespeed
This command will automatically slide
from the old note to the new.
You don't have to worry about which
direction to slide, you need only set
the slide speed. To keep on sliding,
just select the command $3 + 00.
Example: A-200000 First play a note.
C-300305 C-3 is the note to
slide to, 3 the command,
and 5 the speed.
Cmd 4. Vibrato [Rate:$0-$F,Dpth:$0-$F]
--------------------------------------
Usage: $4 + vibratorate + vibratodepth
Example: C-300481 4 is the command,
8 is the speed of the vibrato,
and 1 is the depth of the vibrato.
To keep on vibrating, just select
the command $4 + 00. To change the
vibrato, you can alter the rate,
depth or both. Use command E4- to
change the vibrato-waveform.
Cmd 5. ToneP + Volsl [Spd:$0-$F/$0-$F]
--------------------------------------
Usage: $5 + upspeed + downspeed
This command will continue the current
toneportamento and slide the volume
at the same time. Stolen from NT2.0.
Example: C-300503 3 is the speed to
turn the volume down.
C-300540 4 is the speed to
slide it up.
Cmd 6. Vibra + Volsl [Spd:$0-$F/$0-$F]
--------------------------------------
Usage: $6 + upspeed + downspeed
This command will continue the current
vibrato and slide the volume at the
same time. Stolen from NT2.0.
Example: C-300605 5 is the speed to
turn the volume down.
C-300640 4 is the speed to
slide it up.
Cmd 7. Tremolo [Rate:$0-$F,Dpth:$0-$F]
--------------------------------------
Usage: $7 + tremolorate + tremolodepth
Tremolo vibrates the volume.
Example: C-300794 7 is the command,
9 is the speed of the tremolo,
and 4 is the depth of the tremolo.
To keep on tremoling, just select
the command $7 + 00. To change the
tremolo, you can alter the rate,
depth or both. Use command E7- to
change the tremolo-waveform.
Cmd 9. Set SampleOffset [Offs:$00-$FF]
--------------------------------------
Usage: $9 + Sampleoffset
This command will play from a chosen
position in the sample, and not from
the beginning. The two numbers equal
the two first numbers in the length
of the sample. Handy for speech-
samples.
Example: C-300923 Play sample from
offset $2300.
Cmd A. Volumeslide [Speed:$0-$F/$0-$F]
--------------------------------------
Usage: $A + upspeed + downspeed
Example: C-300A05 5 is the speed to
turn the volume down.
C-300A40 4 is the speed to
slide it up.
NOTE: The slide will be called as
many times as the speed of the song.
The slower the song, the more the
volume will be changed on each note.
Cmd B. Position-jump [Pos:$00-$7F]
----------------------------------
Usage: $B + position to continue at
Example: C-300B01 B is the command,
1 is the position to
restart the song at.
This command will also perform a
pattern-break (see 2 pages below).
You can use this command instead of
restart as on noisetracker, but you
must enter the position in hex!
Cmd C. Set volume [Volume:$00-$40]
----------------------------------
Usage: $C + new volume
Well, this old familiar command will
set the current volume to your own
selected. The highest volume is $40.
All volumes are represented in hex.
(Programmers do it in hex, you know!)
Example: C-300C10 C is the command,
10 is the volume (16 decimal).
Cmd D. Pattern-break
[Pattern-pos:00-63, decimal]
----------------------------
Usage: $D + pattern-position
This command just jumps to the next
song-position, and continues play
from the patternposition you specify.
Example: C-300D00 Jump to the next
song-position and continue play
from patternposition 00.
Or: C-300D32 Jump to the next
song-position and continue play
from patternposition 32 instead.
Cmd E0. Set filter [Range:$0-$1]
--------------------------------
Usage: $E0 + filter-status
This command jerks around with the
sound-filter on some A500 + A2000.
All other Amiga-users should keep out
of playing around with it.
Example: C-300E01 disconnects filter
(turns power LED off)
C-300E00 connects filter
(turns power LED on)
Cmd E1. Fineslide up [Range:$0-$F]
----------------------------------
Usage: $E1 + value
This command works just like the
normal portamento up, except that
it only slides up once. It does not
continue sliding during the length of
the note.
Example: C-300E11 Slide up 1 at the
beginning of the note.
(Great for creating chorus effects)
Cmd E2. Fineslide down [Range:$0-$F]
------------------------------------
Usage: $E2 + value
This command works just like the
normal portamento down, except that
it only slides down once. It does not
continue sliding during the length of
the note.
Example: C-300E26 Slide up 6 at the
beginning of the note.
Cmd E3. Glissando Ctrl [Range:$0-$1]
------------------------------------
Usage: $E3 + Glissando-Status
Glissando must be used with the tone-
portamento command. When glissando is
activated, toneportamento will slide
a halfnote at a time, instead of a
straight slide.
Example: C-300E31 Turn Glissando on.
C-300E30 Turn Glissando off.
Cmd E4. Set vibrato waveform
[Range:$0-$3]
----------------------------
Usage: $E4 + vibrato-waveform
Example: C-300E40 Set sine(default)
E44 Don't retrig WF
C-300E41 Set Ramp Down
E45 Don't retrig WF
C-300E42 Set Squarewave
E46 Don't retrig WF
C-300E43 Set Random
E47 Don't retrig WF
Cmd E5. Set finetune [Range:$0-$F]
----------------------------------
Usage: $E5 + finetune-value
Example: C-300E51 Set finetune to 1.
Use these tables to figure out the
finetune-value.
Finetune: +7 +6 +5 +4 +3 +2 +1 0
Value: 7 6 5 4 3 2 1 0
Finetune: -1 -2 -3 -4 -5 -6 -7 -8
Value: F E D C B A 9 8
Cmd E6. PatternLoop [Loops:$0-$F]
----------------------------------
Usage: $E6 + number of loops
This command will loop a part of a
pattern.
Example: C-300E60 Set loopstart.
C-300E63 Jump to loop 3
times before playing on.
Cmd E7. Set tremolo waveform
[Range:$0-$3]
----------------------------
Usage: $E7 + tremolo-waveform
Example: C-300E70 Set sine(default)
E74 Don't retrig WF
C-300E71 Set Ramp Down
E75 Don't retrig WF
C-300E72 Set Squarewave
E76 Don't retrig WF
C-300E73 Set Random
E77 Don't retrig WF
Cmd E9. Retrig note [Value:$0-$F]
---------------------------------
Usage: $E9 + Tick to Retrig note at.
This command will retrig the same note
before playing the next. Where to
retrig depends on the speed of the
song. If you retrig with 1 in speed 6
that note will be trigged 6 times in
one note slot. Retrig on hi-hats!
Example: C-300F06 Set speed to 6.
C-300E93 Retrig at tick 3
out of 6.
Cmd EA. FineVolsl up [Range:$0-$F]
----------------------------------
Usage: $EA + value
This command works just like the
normal volumeslide up, except that
it only slides up once. It does not
continue sliding during the length of
the note.
Example: C-300EA3 Slide volume up 1
at the beginning of the note.
Cmd EB. FineVolsl down [Range:$0-$F]
------------------------------------
Usage: $EB + value
This command works just like the
normal volumeslide down, except that
it only slides down once. It does not
continue sliding during the length of
the note.
Example: C-300EB6 Slide volume down
6 at the beginning of the note.
Cmd EC. Cut note [Value:$0-$F]
------------------------------
Usage: $EC + Tick to Cut note at.
This command will cut the note
at the selected tick, creating
extremely short notes.
Example: C-300F06 Set speed to 6.
C-300EC3 Cut at tick 3 out
of 6.
Note that the note is not really cut,
the volume is just turned down.
Cmd ED. NoteDelay [Value:$0-$F]
-------------------------------
Usage: $ED + ticks to delay note.
This command will delay the note
to the selected tick.
Example: C-300F06 Set speed to 6.
C-300ED3 Play note at tick
3 out of 6.
Cmd EE. PatternDelay [Notes:$0-$F]
----------------------------------
Usage: $EE + notes to delay pattern.
This command will delay the pattern
the selected numbers of notes.
Example: C-300EE8 Delay pattern 8
notes before playing on.
All other effects are still active
when the pattern is being delayed.
Cmd EF. Invert Loop [Speed:$0-$F]
---------------------------------
Usage: $EF + Invertspeed
This command will need a short loop
($10,20,40,80 etc. bytes) to work.
It will invert the loop byte by byte.
Sounds better than funkrepeat...
Example: C-300EF8 Set invspeed to 8.
To turn off the inverting, set
invspeed to 0, or press ctrl + Z.
Cmd F. Set speed [Speed:$00-$FF]
--------------------------------
Usage: $F + speed
This command will set the speed of the
song.
---------------------------end forwarded message----------------------------
--
--Jeff Hartung--
Disclaimer: My opinions only, etc., etc., BLAH! BLAH! BLAH!...
InterNet - hartung@crl.ucsd.edu BITNET - hartung@ucsd
UUCP - ucsd!crl.ucsd.edu!hartung
This is a reposting for an earlier one.
Enjoy.....
ian

View File

@ -0,0 +1,383 @@
Noisetracker/Soundtracker/Protracker Module Format
--------------------------------------------------
Credits: Lars Hamre, Norman Lin, Mark Cox, Peter Hanning,
Steinar Midtskogen, Marc Espie, and Thomas Meyer
(All numbers below are given in decimal)
3rd Revision
Module Format:
# Bytes Description
------- -----------
20 The module's title, padded with null (\0) bytes. Original
Protracker wrote letters only in uppercase.
(Data repeated for each sample 1-15 or 1-31)
22 Sample's name, padded with null bytes. If a name begins with a
'#', it is assumed not to be an instrument name, and is
probably a message.
2 Sample length in words (1 word = 2 bytes). The first word of
the sample is overwritten by the tracker, so a length of 1
still means an empty sample. See below for sample format.
1 Lowest four bits represent a signed nibble (-8..7) which is
the finetune value for the sample. Each finetune step changes
the note 1/8th of a semitone. Implemented by switching to a
different table of period-values for each finetune value.
1 Volume of sample. Legal values are 0..64. Volume is the linear
difference between sound intensities. 64 is full volume, and
the change in decibels can be calculated with 20*log10(Vol/64)
2 Start of sample repeat offset in words. Once the sample has
been played all of the way through, it will loop if the repeat
length is greater than one. It repeats by jumping to this
position in the sample and playing for the repeat length, then
jumping back to this position, and playing for the repeat
length, etc.
2 Length of sample repeat in words. Only loop if greater than 1.
(End of this sample's data.. each sample uses the same format and they
are stored sequentially)
N.B. All 2 byte lengths are stored with the Hi-byte first, as is usual
on the Amiga (big-endian format).
1 Number of song positions (ie. number of patterns played
throughout the song). Legal values are 1..128.
1 Historically set to 127, but can be safely ignored.
Noisetracker uses this byte to indicate restart position -
this has been made redundant by the 'Position Jump' effect.
128 Pattern table: patterns to play in each song position (0..127)
Each byte has a legal value of 0..63 (note the Protracker
exception below). The highest value in this table is the
highest pattern stored, no patterns above this value are
stored.
(4) The four letters "M.K." These are the initials of
Unknown/D.O.C. who changed the format so it could handle 31
samples (sorry.. they were not inserted by Mahoney & Kaktus).
Startrekker puts "FLT4" or "FLT8" here to indicate the # of
channels. If there are more than 64 patterns, Protracker will
put "M!K!" here. You might also find: "6CHN" or "8CHN" which
indicate 6 or 8 channels respectively. If no letters are here,
then this is the start of the pattern data, and only 15
samples were present.
(Data repeated for each pattern:)
1024 Pattern data for each pattern (starting at 0).
(Each pattern has same format and is stored in numerical order.
See below for pattern format)
(Data repeated for each sample:)
xxxxxx The maximum size of a sample is 65535 words. Each sample is
stored as a collection of bytes (length of a sample was given
previously in the module). Each byte is a signed value (-128
..127) which is the channel data. When a sample is played at a
pitch of C2 (see below for pitches), about 8287 bytes of
sample data are sent to the channel per second. Multiply the
rate by the twelfth root of 2 (=1.0595) for each semitone
increase in pitch eg. moving the pitch up 1 octave doubles the
rate. The data is stored in the order it is played (eg. first
byte is first byte played). The first word of the sample data
is used to hold repeat information, and will overwrite any
sample data that is there (but it is probably safer to set it
to 0).
The rate given above (8287) conveys an inaccurate picture of
the module-format - in reality it is different for different
Amigas. As the routines for playing were written to run off
certain interrupts, for different Amiga computers the rate to
send data to the channel will be different. For PAL machines
the clock rate is 7093789.2 Hz and for NTSC machines it is
7159090.5 Hz. When the clock rate is divided by twice the
period number for the pitch it will give the rate to send the
data to the channel, eg. for a PAL machine sending a note at
C2 (period 428), the rate is 7093789.2/856 ~= 8287.1369
(Each sample is stored sequentially)
Pattern Format:
Each pattern is divided into 64 divisions. By allocating different
tempos for each pattern and spacing the notes across different amounts
of divisions, different bar sizes can be accommodated.
Each division contains the data for each channel (1..4) stored after
each other. Channels 1 and 4 are on the left, and channels 2 and 3 are
on the right. In the case of more channels: channels 5 and 8 are on the
left, and channels 6 and 7 are on the right, etc. Each channel's data in
the division has an identical format which consists of 2 words (4
bytes). Divisions are numbered 0..63. Each division may be divided into
a number of ticks (see 'set speed' effect below).
Channel Data:
(the four bytes of channel data in a pattern division)
7654-3210 7654-3210 7654-3210 7654-3210
wwww xxxxxxxxxxxxxx yyyy zzzzzzzzzzzzzz
wwwwyyyy (8 bits) is the sample for this channel/division
xxxxxxxxxxxx (12 bits) is the sample's period (or effect parameter)
zzzzzzzzzzzz (12 bits) is the effect for this channel/division
If there is to be no new sample to be played at this division on this
channel, then the old sample on this channel will continue, or at least
be "remembered" for any effects. If the sample is 0, then the previous
sample on that channel is used. Only one sample may play on a channel at
a time, so playing a new sample will cancel an old one - even if there
has been no data supplied for the new sample. Though, if you are using a
"silence" sample (ie. no data, only used to turn off other samples) it
is polite to set its default volume to 0.
To determine what pitch the sample is to be played on, look up the
period in a table, such as the one below (for finetune 0). If the period
is 0, then the previous period on that channel is used. Unfortunately,
some modules do not use these exact values. It is best to do a binary-
search (unless you use the period as the offset of an array of notes..
expensive), especially if you plan to use periods outside the "standard"
range. Periods are the internal representation of the pitch, so effects
that alter pitch (eg. sliding) alter the period value (see "effects"
below).
C C# D D# E F F# G G# A A# B
Octave 1: 856, 808, 762, 720, 678, 640, 604, 570, 538, 508, 480, 453
Octave 2: 428, 404, 381, 360, 339, 320, 302, 285, 269, 254, 240, 226
Octave 3: 214, 202, 190, 180, 170, 160, 151, 143, 135, 127, 120, 113
Octave 0:1712,1616,1525,1440,1357,1281,1209,1141,1077,1017, 961, 907
Octave 4: 107, 101, 95, 90, 85, 80, 76, 71, 67, 64, 60, 57
Octaves 0 and 4 are NOT standard, so don't rely on every tracker being
able to play them, or even not crashing if being given them - it's just
nice that if you can code it, to allow them to be read.
Effects:
Effects are written as groups of 4 bits, eg. 1871 = 7 * 256 + 4 * 16 +
15 = [7][4][15]. The high nibble (4 bits) usually determines the effect,
but if it is [14], then the second nibble is used as well.
[0]: Arpeggio
Where [0][x][y] means "play note, note+x semitones, note+y
semitones, then return to original note". The fluctuations are
carried out evenly spaced in one pattern division. They are usually
used to simulate chords, but this doesn't work too well. They are
also used to produce heavy vibrato. A major chord is when x=4, y=7.
A minor chord is when x=3, y=7.
[1]: Slide up
Where [1][x][y] means "smoothly decrease the period of current
sample by x*16+y after each tick in the division". The
ticks/division are set with the 'set speed' effect (see below). If
the period of the note being played is z, then the final period
will be z - (x*16 + y)*(ticks - 1). As the slide rate depends on
the speed, changing the speed will change the slide. You cannot
slide beyond the note B3 (period 113).
[2]: Slide down
Where [2][x][y] means "smoothly increase the period of current
sample by x*16+y after each tick in the division". Similar to [1],
but lowers the pitch. You cannot slide beyond the note C1 (period
856).
[3]: Slide to note
Where [3][x][y] means "smoothly change the period of current sample
by x*16+y after each tick in the division, never sliding beyond
current period". The period-length in this channel's division is a
parameter to this effect, and hence is not played. Sliding to a
note is similar to effects [1] and [2], but the slide will not go
beyond the given period, and the direction is implied by that
period. If x and y are both 0, then the old slide will continue.
[4]: Vibrato
Where [4][x][y] means "oscillate the sample pitch using a
particular waveform with amplitude y/16 semitones, such that (x *
ticks)/64 cycles occur in the division". The waveform is set using
effect [14][4]. By placing vibrato effects on consecutive
divisions, the vibrato effect can be maintained. If either x or y
are 0, then the old vibrato values will be used.
[5]: Continue 'Slide to note', but also do Volume slide
Where [5][x][y] means "either slide the volume up x*(ticks - 1) or
slide the volume down y*(ticks - 1), at the same time as continuing
the last 'Slide to note'". It is illegal for both x and y to be
non-zero. You cannot slide outside the volume range 0..64. The
period-length in this channel's division is a parameter to this
effect, and hence is not played.
[6]: Continue 'Vibrato', but also do Volume slide
Where [6][x][y] means "either slide the volume up x*(ticks - 1) or
slide the volume down y*(ticks - 1), at the same time as continuing
the last 'Vibrato'". It is illegal for both x and y to be non-zero.
You cannot slide outside the volume range 0..64.
[7]: Tremolo
Where [7][x][y] means "oscillate the sample volume using a
particular waveform with amplitude y*(ticks - 1), such that (x *
ticks)/64 cycles occur in the division". The waveform is set using
effect [14][7]. Similar to [4].
[8]: -- Unused --
[9]: Set sample offset
Where [9][x][y] means "play the sample from offset x*4096 + y*256".
The offset is measured in words. If no sample is given, yet one is
still playing on this channel, it should be retriggered to the new
offset using the current volume.
[10]: Volume slide
Where [10][x][y] means "either slide the volume up x*(ticks - 1) or
slide the volume down y*(ticks - 1)". If both x and y are non-zero,
then the y value is ignored (assumed to be 0). You cannot slide
outside the volume range 0..64.
[11]: Position Jump
Where [11][x][y] means "stop the pattern after this division, and
continue the song at song-position x*16+y". This shifts the
'pattern-cursor' in the pattern table (see above). Legal values for
x*16+y are from 0 to 127.
[12]: Set volume
Where [12][x][y] means "set current sample's volume to x*16+y".
Legal volumes are 0..64.
[13]: Pattern Break
Where [13][x][y] means "stop the pattern after this division, and
continue the song at the next pattern at division x*10+y" (the 10
is not a typo). Legal divisions are from 0 to 63 (note Protracker
exception above).
[14][0]: Set filter on/off
Where [14][0][x] means "set sound filter ON if x is 0, and OFF is x
is 1". This is a hardware command for some Amigas, so if you don't
understand it, it is better not to use it.
[14][1]: Fineslide up
Where [14][1][x] means "decrement the period of the current sample
by x". The incrementing takes place at the beginning of the
division, and hence there is no actual sliding. You cannot slide
beyond the note B3 (period 113).
[14][2]: Fineslide down
Where [14][2][x] means "increment the period of the current sample
by x". Similar to [14][1] but shifts the pitch down. You cannot
slide beyond the note C1 (period 856).
[14][3]: Set glissando on/off
Where [14][3][x] means "set glissando ON if x is 1, OFF if x is 0".
Used in conjunction with [3] ('Slide to note'). If glissando is on,
then 'Slide to note' will slide in semitones, otherwise will
perform the default smooth slide.
[14][4]: Set vibrato waveform
Where [14][4][x] means "set the waveform of succeeding 'vibrato'
effects to wave #x". [4] is the 'vibrato' effect. Possible values
for x are:
0 - sine (default) /\ /\ (2 cycles shown)
4 (without retrigger) \/ \/
1 - ramp down | \ | \
5 (without retrigger) \ | \ |
2 - square ,--, ,--,
6 (without retrigger) '--' '--'
3 - random: a random choice of one of the above.
7 (without retrigger)
If the waveform is selected "without retrigger", then it will not
be retriggered from the beginning at the start of each new note.
[14][5]: Set finetune value
Where [14][5][x] means "sets the finetune value of the current
sample to the signed nibble x". x has legal values of 0..15,
corresponding to signed nibbles 0..7,-8..-1 (see start of text for
more info on finetune values).
[14][6]: Loop pattern
Where [14][6][x] means "set the start of a loop to this division if
x is 0, otherwise after this division, jump back to the start of a
loop and play it another x times before continuing". If the start
of the loop was not set, it will default to the start of the
current pattern. Hence 'loop pattern' cannot be performed across
multiple patterns. Note that loops do not support nesting, and you
may generate an infinite loop if you try to nest 'loop pattern's.
[14][7]: Set tremolo waveform
Where [14][7][x] means "set the waveform of succeeding 'tremolo'
effects to wave #x". Similar to [14][4], but alters effect [7] -
the 'tremolo' effect.
[14][8]: -- Unused --
[14][9]: Retrigger sample
Where [14][9][x] means "trigger current sample every x ticks in
this division". If x is 0, then no retriggering is done (acts as if
no effect was chosen), otherwise the retriggering begins on the
first tick and then x ticks after that, etc.
[14][10]: Fine volume slide up
Where [14][10][x] means "increment the volume of the current sample
by x". The incrementing takes place at the beginning of the
division, and hence there is no sliding. You cannot slide beyond
volume 64.
[14][11]: Fine volume slide down
Where [14][11][x] means "decrement the volume of the current sample
by x". Similar to [14][10] but lowers volume. You cannot slide
beyond volume 0.
[14][12]: Cut sample
Where [14][12][x] means "after the current sample has been played
for x ticks in this division, its volume will be set to 0". This
implies that if x is 0, then you will not hear any of the sample.
If you wish to insert "silence" in a pattern, it is better to use a
"silence"-sample (see above) due to the lack of proper support for
this effect.
[14][13]: Delay sample
Where [14][13][x] means "do not start this division's sample for
the first x ticks in this division, play the sample after this".
This implies that if x is 0, then you will hear no delay, but
actually there will be a VERY small delay. Note that this effect
only influences a sample if it was started in this division.
[14][14]: Delay pattern
Where [14][14][x] means "after this division there will be a delay
equivalent to the time taken to play x divisions after which the
pattern will be resumed". The delay only relates to the
interpreting of new divisions, and all effects and previous notes
continue during delay.
[14][15]: Invert loop
Where [14][15][x] means "if x is greater than 0, then play the
current sample's loop upside down at speed x". Each byte in the
sample's loop will have its sign changed (negated). It will only
work if the sample's loop (defined previously) is not too big. The
speed is based on an internal table.
[15]: Set speed
Where [15][x][y] means "set speed to x*16+y". Though it is nowhere
near that simple. Let z = x*16+y. Depending on what values z takes,
different units of speed are set, there being two: ticks/division
and beats/minute (though this one is only a label and not strictly
true). If z=0, then what should technically happen is that the
module stops, but in practice it is treated as if z=1, because
there is already a method for stopping the module (running out of
patterns). If z<=32, then it means "set ticks/division to z"
otherwise it means "set beats/minute to z" (convention says that
this should read "If z<32.." but there are some composers out there
that defy conventions). Default values are 6 ticks/division, and
125 beats/minute (4 divisions = 1 beat). The beats/minute tag is
only meaningful for 6 ticks/division. To get a more accurate view
of how things work, use the following formula:
24 * beats/minute
divisions/minute = -----------------
ticks/division
Hence divisions/minute range from 24.75 to 6120, eg. to get a value
of 2000 divisions/minute use 3 ticks/division and 250 beats/minute.
If multiple "set speed" effects are performed in a single division,
the ones on higher-numbered channels take precedence over the ones
on lower-numbered channels. This effect has a large number of
different implementations, but the one described here has the
widest usage.
N.B. This document should be fairly accurate now, but as the module
format is more of an observation than a standard, a couple of effects
cannot be relied upon to act exactly the same from tracker to tracker
(especially if the tracker is not for the Amiga). It is probably better
to use this document as a guide rather than as a hard-and-fast
definition of the module format. Oh.. and yes, I would normally give
bytes as hex values, but it is easier to understand a consistent
notation.
Andrew Scott (Adrenalin Software), INTERNET:ascott@tartarus.uwa.edu.au
Author of MIDIMOD (MOD to MIDI converter), PTMID (MIDI to MOD converter)

View File

@ -0,0 +1,46 @@
GS 1.04 ROM sources
‚ᥠ¯à ¢  ­  ¤ ­­ãî ¯à®è¨¢ªã ¯à¨­ ¤«¥¦ â €«¥ªá ­¤àã €£¥¥¢ã AKA Stinger.
€¢â®à à §à¥è ¥â ᢮¡®¤­®¥ à á¯à®áâà ­¥­¨¥, ¨á¯®«ì§®¢ ­¨¥ ¨ ¬®¤¨ä¨ª æ¨î
¤ ­­®© ¯à®è¨¢ª¨ ¢ ­¥ª®¬¬¥àç¥áª¨å 楫ïå.
<EFBFBD>ਠ¬®¤¨ä¨ª æ¨¨ ¤ ­­®© ¯à®è¨¢ª¨ ¬®¨ ª®¯¨à ©âë ¤®«¦­ë ®áâ ¢ âìáï
­¥¯à¨ª®á­®¢­­ë¬¨ (‘¬¥é¥­¨ï #100-#12F ¢ ROM) ¨ ¤®«¦­ë ¡ëâì ᢮¡®¤­® ¤®áâ㯭ë
¨á室­ë¥ ⥪áâë ¬®¤¨ä¨æ¨à®¢ ­­®© ¯à®è¨¢ª¨.
I. <20>â ¯ë ᡮન ¯à®è¨¢ª¨ GS:
1. ‡ £à㦠¥¬ Tasm:
run "boot"[enter] [enter]
2. Š®¬¯¨«¨à㥬 £« ¢­ë© ä ©«:
m main
a
3. <20>®¤áç¨â뢠¥¬ CRC
m crc
a
r
4. ‡ ¯¨á뢠¥¬ ¯à®è¨¢ªã
q [enter] q [down] [enter]
randomize usr 15619:rem:save "gs" code 32768,32768
‘®¡á⢥­­® ¢á¥.
<20>à ¢¤  ¯à¨ ª®¬¯¨«ï樨 ¨á¯®«ì§ãîâáï 2 § à ­¥¥ áä®à¬¨à®¢ ­­ëå ä ©« :
stuff - 24kb ¯ãá⮣® ¬¥áâ  (#FF) + 8kb â ¡«¨æ
sgen - 7.5kb ¯à¥¤ª®¬¯¨«¨à®¢ ­ëå á ã­¤£¥­¥à â®à®¢ + 0.5 ª¡ â ¡«¨æ
II. Sgen
ˆá室­¨ª¨ á ã­¤£¥­¥à â®à®¢ ª ᮦ «¥­¨î ¯®â¥àï­ë (­ã ¬®¦¥â ï ¨ ­ ©¤ã ¨å
¢ ¡ã¤ã饬 %). <20>â® ­¥ £«®¡ «ì­ ï ¯®â¥àï, â.ª. ®­¨ ¥áâì ¢ ¯à¥¤ª®¬¯¨«¨à®¢ ­®¬
¢¨¤¥, ¨ ¨å ᮢ¥à襭­® â®ç­® ­ã¦­® ¡ë«® ¯¥à¥¤¥«ë¢ âì, â.ª. ¬®¦­® ¡ë«®
¯®¢ëá¨âì íä䥪⨢­®áâì à ¡®âë, ã ¬¥­ï ¤ ¦¥ ¡ë«¨ ¨¤¥¨ ª ª.
‘ ¬ ï § ­¨¬ âìáï í⨬ ¢àï¤ «¨ ¡ã¤ã, ­® ¬®¦¥â ªâ®-­¨¡ã¤ì %)
<20>ਬ¥àë:
sgen_asm
sgen*
(<28>â® ¨¬¥­­® ¯à¨¬¥àë, ­¥ £ à ­â¨àãî, çâ® ®­¨ ¢®®¡é¥ à ¡®â îâ, å®âï ­ ¢¥à­®¥
¬¥¤«¥­­® ¤®«¦­ë à ¡®â âì)
â㤠 ¦¥ ¯®¤á®¥¤¨­ ï¥âáï â ¡«¨æ  ¤«ï ¨­â¥à¯®«ï樨 divtab3

3402
firmware/src/v104/SBMOD.ASM Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,30 @@
DEVICE ZXSPECTRUM48
include "src/__MAIN.a80"
;calc ROM CRC
LUA
s=0
for i = _c("GSRomBaseL+8"), _c("GSRomBaseL+16383"), 2 do
s=s+sj.get_word(i)
end
for i = _c("GSRomBaseH"), _c("GSRomBaseH+16383"), 2 do
s=s+sj.get_word(i)
end
if 1==0 then
_pc("org 6")
sj.add_word(s)
end
print ("ROM CS: ",s-2128680)
ENDLUA
; SAVEBIN "gsroml",GSRomBaseL,#4000
; SAVEBIN "gsromh",GSRomBaseH,#4000
include "patch/patch.a80"
SAVEBIN "gsroml_",GSRomBaseL,#4000
SAVEBIN "gsromh_",GSRomBaseH,#4000

View File

@ -0,0 +1,11 @@
@ECHO OFF
sjasmplus.exe -isrc -ipatch -isrc/sgen make_rom.a80
if %errorlevel% neq 0 goto end
copy /b gsroml_+gsromh_ gs105b.rom >nul
del gsroml_
del gsromh_
:end
pause

View File

@ -0,0 +1,129 @@
DW 0, 3, 5, 8, 11, 14, 16, 19
DW 22, 24, 27, 30, 32, 35, 38, 41
DW 43, 46, 49, 51, 54, 57, 59, 62
DW 65, 68, 70, 73, 76, 78, 81, 84
DW 87, 89, 92, 95, 97, 100, 103, 105
DW 108, 111, 114, 116, 119, 122, 124, 127
DW 130, 132, 135, 138, 141, 143, 146, 149
DW 151, 154, 157, 160, 162, 165, 168, 170
DW 173, 176, 178, 181, 184, 187, 189, 192
DW 195, 197, 200, 203, 205, 208, 211, 214
DW 216, 219, 222, 224, 227, 230, 233, 235
DW 238, 241, 243, 246, 249, 251, 254, 257
DW 260, 262, 265, 268, 270, 273, 276, 279
DW 281, 284, 287, 289, 292, 295, 297, 300
DW 303, 306, 308, 311, 314, 316, 319, 322
DW 324, 327, 330, 333, 335, 338, 341, 343
DW 346, 349, 352, 354, 357, 360, 362, 365
DW 368, 370, 373, 376, 379, 381, 384, 387
DW 389, 392, 395, 397, 400, 403, 406, 408
DW 411, 414, 416, 419, 422, 425, 427, 430
DW 433, 435, 438, 441, 443, 446, 449, 452
DW 454, 457, 460, 462, 465, 468, 470, 473
DW 476, 479, 481, 484, 487, 489, 492, 495
DW 498, 500, 503, 506, 508, 511, 514, 516
DW 519, 522, 525, 527, 530, 533, 535, 538
DW 541, 543, 546, 549, 552, 554, 557, 560
DW 562, 565, 568, 571, 573, 576, 579, 581
DW 584, 587, 589, 592, 595, 598, 600, 603
DW 606, 608, 611, 614, 617, 619, 622, 625
DW 627, 630, 633, 635, 638, 641, 644, 646
DW 649, 652, 654, 657, 660, 662, 665, 668
DW 671, 673, 676, 679, 681, 684, 687, 690
DW 692, 695, 698, 700, 703, 706, 708, 711
DW 714, 717, 719, 722, 725, 727, 730, 733
DW 735, 738, 741, 744, 746, 749, 752, 754
DW 757, 760, 763, 765, 768, 771, 773, 776
DW 779, 781, 784, 787, 790, 792, 795, 798
DW 800, 803, 806, 808, 811, 814, 817, 819
DW 822, 825, 827, 830, 833, 836, 838, 841
DW 844, 846, 849, 852, 854, 857, 860, 863
DW 865, 868, 871, 873, 876, 879, 881, 884
DW 887, 890, 892, 895, 898, 900, 903, 906
DW 909, 911, 914, 917, 919, 922, 925, 927
DW 930, 933, 936, 938, 941, 944, 946, 949
DW 952, 955, 957, 960, 963, 965, 968, 971
DW 973, 976, 979, 982, 984, 987, 990, 992
DW 995, 998, 1000, 1003, 1006, 1009, 1011, 1014
DW 1017, 1019, 1022, 1025, 1028, 1030, 1033, 1036
DW 1038, 1041, 1044, 1046, 1049, 1052, 1055, 1057
DW 1060, 1063, 1065, 1068, 1071, 1073, 1076, 1079
DW 1082, 1084, 1087, 1090, 1092, 1095, 1098, 1101
DW 1103, 1106, 1109, 1111, 1114, 1117, 1119, 1122
DW 1125, 1128, 1130, 1133, 1136, 1138, 1141, 1144
DW 1146, 1149, 1152, 1155, 1157, 1160, 1163, 1165
DW 1168, 1171, 1174, 1176, 1179, 1182, 1184, 1187
DW 1190, 1192, 1195, 1198, 1201, 1203, 1206, 1209
DW 1211, 1214, 1217, 1219, 1222, 1225, 1228, 1230
DW 1233, 1236, 1238, 1241, 1244, 1247, 1249, 1252
DW 1255, 1257, 1260, 1263, 1265, 1268, 1271, 1274
DW 1276, 1279, 1282, 1284, 1287, 1290, 1293, 1295
DW 1298, 1301, 1303, 1306, 1309, 1311, 1314, 1317
DW 1320, 1322, 1325, 1328, 1330, 1333, 1336, 1338
DW 1341, 1344, 1347, 1349, 1352, 1355, 1357, 1360
DW 1363, 1366, 1368, 1371, 1374, 1376, 1379, 1382
DW 1384, 1387, 1390, 1393, 1395, 1398, 1401, 1403
DW 1406, 1409, 1411, 1414, 1417, 1420, 1422, 1425
DW 1428, 1430, 1433, 1436, 1439, 1441, 1444, 1447
DW 1449, 1452, 1455, 1457, 1460, 1463, 1466, 1468
DW 1471, 1474, 1476, 1479, 1482, 1484, 1487, 1490
DW 1493, 1495, 1498, 1501, 1503, 1506, 1509, 1512
DW 1514, 1517, 1520, 1522, 1525, 1528, 1530, 1533
DW 1536, 1539, 1541, 1544, 1547, 1549, 1552, 1555
DW 1557, 1560, 1563, 1566, 1568, 1571, 1574, 1576
DW 1579, 1582, 1585, 1587, 1590, 1593, 1595, 1598
DW 1601, 1603, 1606, 1609, 1612, 1614, 1617, 1620
DW 1622, 1625, 1628, 1631, 1633, 1636, 1639, 1641
DW 1644, 1647, 1649, 1652, 1655, 1658, 1660, 1663
DW 1666, 1668, 1671, 1674, 1676, 1679, 1682, 1685
DW 1687, 1690, 1693, 1695, 1698, 1701, 1704, 1706
DW 1709, 1712, 1714, 1717, 1720, 1722, 1725, 1728
DW 1731, 1733, 1736, 1739, 1741, 1744, 1747, 1749
DW 1752, 1755, 1758, 1760, 1763, 1766, 1768, 1771
DW 1774, 1777, 1779, 1782, 1785, 1787, 1790, 1793
DW 1795, 1798, 1801, 1804, 1806, 1809, 1812, 1814
DW 1817, 1820, 1822, 1825, 1828, 1831, 1833, 1836
DW 1839, 1841, 1844, 1847, 1850, 1852, 1855, 1858
DW 1860, 1863, 1866, 1868, 1871, 1874, 1877, 1879
DW 1882, 1885, 1887, 1890, 1893, 1895, 1898, 1901
DW 1904, 1906, 1909, 1912, 1914, 1917, 1920, 1923
DW 1925, 1928, 1931, 1933, 1936, 1939, 1941, 1944
DW 1947, 1950, 1952, 1955, 1958, 1960, 1963, 1966
DW 1969, 1971, 1974, 1977, 1979, 1982, 1985, 1987
DW 1990, 1993, 1996, 1998, 2001, 2004, 2006, 2009
DW 2012, 2014, 2017, 2020, 2023, 2025, 2028, 2031
DW 2033, 2036, 2039, 2042, 2044, 2047, 2050, 2052
DW 2055, 2058, 2060, 2063, 2066, 2069, 2071, 2074
DW 2077, 2079, 2082, 2085, 2087, 2090, 2093, 2096
DW 2098, 2101, 2104, 2106, 2109, 2112, 2115, 2117
DW 2120, 2123, 2125, 2128, 2131, 2133, 2136, 2139
DW 2142, 2144, 2147, 2150, 2152, 2155, 2158, 2160
DW 2163, 2166, 2169, 2171, 2174, 2177, 2179, 2182
DW 2185, 2188, 2190, 2193, 2196, 2198, 2201, 2204
DW 2206, 2209, 2212, 2215, 2217, 2220, 2223, 2225
DW 2228, 2231, 2233, 2236, 2239, 2242, 2244, 2247
DW 2250, 2252, 2255, 2258, 2261, 2263, 2266, 2269
DW 2271, 2274, 2277, 2279, 2282, 2285, 2288, 2290
DW 2293, 2296, 2298, 2301, 2304, 2307, 2309, 2312
DW 2315, 2317, 2320, 2323, 2325, 2328, 2331, 2334
DW 2336, 2339, 2342, 2344, 2347, 2350, 2352, 2355
DW 2358, 2361, 2363, 2366, 2369, 2371, 2374, 2377
DW 2380, 2382, 2385, 2388, 2390, 2393, 2396, 2398
DW 2401, 2404, 2407, 2409, 2412, 2415, 2417, 2420
DW 2423, 2425, 2428, 2431, 2434, 2436, 2439, 2442
DW 2444, 2447, 2450, 2453, 2455, 2458, 2461, 2463
DW 2466, 2469, 2471, 2474, 2477, 2480, 2482, 2485
DW 2488, 2490, 2493, 2496, 2498, 2501, 2504, 2507
DW 2509, 2512, 2515, 2517, 2520, 2523, 2526, 2528
DW 2531, 2534, 2536, 2539, 2542, 2544, 2547, 2550
DW 2553, 2555, 2558, 2561, 2563, 2566, 2569, 2571
DW 2574, 2577, 2580, 2582, 2585, 2588, 2590, 2593
DW 2596, 2599, 2601, 2604, 2607, 2609, 2612, 2615
DW 2617, 2620, 2623, 2626, 2628, 2631, 2634, 2636
DW 2639, 2642, 2645, 2647, 2650, 2653, 2655, 2658
DW 2661, 2663, 2666, 2669, 2672, 2674, 2677, 2680
DW 2682, 2685, 2688, 2690, 2693, 2696, 2699, 2701
DW 2704, 2707, 2709, 2712, 2715, 2718, 2720, 2723
DW 2726, 2728, 2731, 2734, 2736, 2739, 2742, 2745
DW 2747, 2750, 2753, 2755, 2758, 2761, 2763, 2766

View File

@ -0,0 +1,143 @@
DW 18516, 17478, 16497, 15569, 14696, 13871, 13092, 12357, 11665, 11010, 10391, 9810
DW 9258, 8739, 8247, 7784, 7349, 6935, 6546, 6178, 5832, 5505, 5197, 4905
DW 4629, 4369, 4123, 3893, 3674, 3469, 3274, 3090, 2914, 2752, 2598, 2452
DW 2314, 2184, 2063, 1946, 1836, 1733, 1635, 1543, 1457, 1376, 1297, 1224
DW 1157, 1092, 1030, 973, 919, 867, 819, 773, 730, 686, 648, 613
DW 578, 546, 516, 486, 459, 432, 408, 386, 365, 343, 324, 305
DW 289, 273, 256, 243, 229, 216, 205, 191, 181, 173, 162, 154
DW 146, 135, 129, 121, 113, 108, 102, 97, 91, 86, 81, 75
DW 18384, 17351, 16378, 15458, 14590, 13771, 12998, 12270, 11581, 10932, 10318, 9739
DW 9190, 8677, 8187, 7730, 7295, 6887, 6500, 6135, 5789, 5464, 5159, 4869
DW 4596, 4337, 4093, 3864, 3647, 3442, 3250, 3066, 2895, 2733, 2579, 2433
DW 2298, 2168, 2046, 1933, 1825, 1722, 1625, 1533, 1446, 1365, 1289, 1216
DW 1149, 1084, 1024, 965, 911, 859, 811, 767, 724, 684, 643, 608
DW 573, 543, 511, 484, 456, 429, 405, 383, 362, 340, 321, 305
DW 286, 270, 256, 240, 227, 216, 202, 191, 181, 170, 162, 151
DW 143, 135, 127, 121, 113, 108, 102, 94, 89, 86, 81, 75
DW 18252, 17227, 16259, 15347, 14485, 13674, 12906, 12181, 11497, 10851, 10242, 9669
DW 9126, 8612, 8130, 7673, 7244, 6835, 6451, 6089, 5748, 5426, 5121, 4834
DW 4561, 4307, 4064, 3836, 3620, 3417, 3225, 3044, 2874, 2712, 2560, 2417
DW 2282, 2152, 2033, 1917, 1811, 1708, 1614, 1522, 1438, 1357, 1281, 1208
DW 1141, 1076, 1016, 959, 905, 854, 805, 762, 719, 678, 640, 602
DW 570, 538, 508, 478, 451, 427, 402, 381, 359, 338, 319, 302
DW 283, 270, 254, 240, 227, 213, 202, 189, 178, 170, 159, 151
DW 143, 135, 127, 118, 113, 108, 100, 94, 89, 83, 81, 75
DW 18119, 17102, 16142, 15237, 14382, 13574, 12814, 12094, 11416, 10775, 10169, 9599
DW 9061, 8552, 8071, 7619, 7189, 6787, 6405, 6046, 5708, 5386, 5083, 4799
DW 4529, 4275, 4037, 3809, 3596, 3393, 3204, 3023, 2852, 2693, 2541, 2398
DW 2265, 2138, 2017, 1903, 1798, 1698, 1600, 1511, 1427, 1346, 1270, 1200
DW 1132, 1068, 1008, 951, 897, 849, 800, 757, 713, 673, 635, 600
DW 565, 535, 505, 475, 448, 424, 400, 378, 356, 338, 319, 300
DW 283, 267, 251, 237, 224, 210, 200, 189, 178, 167, 159, 148
DW 140, 132, 127, 118, 113, 105, 100, 94, 89, 83, 78, 75
DW 17989, 16981, 16026, 15128, 14279, 13476, 12719, 12005, 11332, 10697, 10096, 9528
DW 8996, 8490, 8014, 7563, 7138, 6738, 6359, 6002, 5667, 5348, 5048, 4764
DW 4496, 4245, 4007, 3782, 3569, 3369, 3179, 3001, 2833, 2674, 2522, 2382
DW 2249, 2122, 2003, 1890, 1784, 1684, 1589, 1500, 1416, 1335, 1262, 1192
DW 1124, 1059, 1000, 946, 892, 843, 794, 751, 708, 667, 630, 594
DW 562, 529, 500, 473, 446, 421, 397, 375, 354, 335, 316, 297
DW 281, 264, 251, 235, 224, 210, 200, 186, 175, 167, 156, 148
DW 140, 132, 124, 118, 110, 105, 100, 94, 89, 83, 78, 75
DW 17859, 16856, 15913, 15018, 14177, 13379, 12630, 11919, 11251, 10618, 10023, 9461
DW 8931, 8428, 7955, 7509, 7087, 6689, 6313, 5959, 5627, 5310, 5013, 4729
DW 4464, 4215, 3977, 3755, 3544, 3344, 3158, 2979, 2812, 2655, 2506, 2366
DW 2233, 2106, 1990, 1876, 1771, 1673, 1579, 1489, 1406, 1327, 1251, 1181
DW 1116, 1054, 995, 938, 886, 835, 789, 746, 703, 662, 627, 592
DW 557, 527, 497, 470, 443, 419, 394, 373, 351, 332, 313, 294
DW 278, 262, 248, 235, 221, 208, 197, 186, 175, 164, 156, 148
DW 140, 132, 124, 116, 110, 105, 97, 91, 89, 83, 78, 73
DW 17732, 16737, 15796, 14909, 14074, 13284, 12538, 11835, 11170, 10542, 9950, 9393
DW 8866, 8368, 7898, 7454, 7035, 6641, 6267, 5916, 5586, 5272, 4975, 4696
DW 4431, 4183, 3950, 3728, 3517, 3320, 3133, 2958, 2793, 2636, 2487, 2347
DW 2217, 2092, 1973, 1863, 1760, 1660, 1568, 1479, 1395, 1316, 1243, 1173
DW 1108, 1046, 986, 932, 878, 830, 784, 740, 697, 659, 621, 586
DW 554, 521, 494, 465, 440, 416, 392, 370, 348, 329, 310, 294
DW 275, 262, 246, 232, 219, 208, 194, 183, 175, 164, 156, 146
DW 137, 129, 124, 116, 110, 102, 97, 91, 86, 81, 78, 73
DW 17603, 16616, 15683, 14804, 13971, 13187, 12449, 11748, 11089, 10467, 9880, 9326
DW 8801, 8309, 7841, 7400, 6987, 6595, 6224, 5875, 5545, 5234, 4940, 4661
DW 4402, 4153, 3920, 3701, 3493, 3296, 3112, 2936, 2771, 2617, 2468, 2330
DW 2201, 2076, 1960, 1849, 1746, 1649, 1554, 1468, 1387, 1308, 1235, 1165
DW 1100, 1038, 981, 924, 873, 824, 778, 735, 692, 654, 616, 584
DW 548, 519, 489, 462, 435, 411, 389, 367, 346, 327, 308, 292
DW 275, 259, 246, 232, 219, 205, 194, 183, 173, 162, 154, 146
DW 137, 129, 121, 116, 108, 102, 97, 91, 86, 81, 78, 73
DW 19617, 18516, 17478, 16497, 15569, 14696, 13871, 13092, 12357, 11665, 11010, 10391
DW 9810, 9258, 8739, 8247, 7784, 7349, 6935, 6546, 6178, 5832, 5505, 5197
DW 4905, 4629, 4369, 4123, 3893, 3674, 3469, 3274, 3090, 2914, 2752, 2598
DW 2452, 2314, 2184, 2063, 1946, 1836, 1733, 1635, 1543, 1457, 1376, 1297
DW 1224, 1157, 1092, 1030, 973, 919, 867, 819, 773, 730, 686, 648
DW 613, 578, 546, 516, 486, 459, 432, 408, 386, 365, 343, 324
DW 305, 289, 273, 256, 243, 229, 216, 205, 191, 181, 173, 162
DW 154, 146, 135, 129, 121, 113, 108, 102, 97, 91, 86, 81
DW 19476, 18384, 17351, 16378, 15458, 14590, 13771, 12998, 12270, 11581, 10932, 10318
DW 9739, 9190, 8677, 8187, 7730, 7295, 6887, 6500, 6135, 5789, 5464, 5159
DW 4869, 4596, 4337, 4093, 3864, 3647, 3442, 3250, 3066, 2895, 2733, 2579
DW 2433, 2298, 2168, 2046, 1933, 1825, 1722, 1625, 1533, 1446, 1365, 1289
DW 1216, 1149, 1084, 1024, 965, 911, 859, 811, 767, 724, 684, 643
DW 608, 573, 543, 511, 484, 456, 429, 405, 383, 362, 340, 321
DW 305, 286, 270, 256, 240, 227, 216, 202, 191, 181, 170, 162
DW 151, 143, 135, 127, 121, 113, 108, 102, 94, 89, 86, 81
DW 19336, 18252, 17227, 16259, 15347, 14485, 13674, 12906, 12181, 11497, 10851, 10242
DW 9669, 9126, 8612, 8130, 7673, 7244, 6835, 6451, 6089, 5748, 5426, 5121
DW 4834, 4561, 4307, 4064, 3836, 3620, 3417, 3225, 3044, 2874, 2712, 2560
DW 2417, 2282, 2152, 2033, 1917, 1811, 1708, 1614, 1522, 1438, 1357, 1281
DW 1208, 1141, 1076, 1016, 959, 905, 854, 805, 762, 719, 678, 640
DW 602, 570, 538, 508, 478, 451, 427, 402, 381, 359, 338, 319
DW 302, 283, 270, 254, 240, 227, 213, 202, 189, 178, 170, 159
DW 151, 143, 135, 127, 118, 113, 108, 100, 94, 89, 83, 81
DW 19198, 18119, 17102, 16142, 15237, 14382, 13574, 12814, 12094, 11416, 10775, 10169
DW 9599, 9061, 8552, 8071, 7619, 7189, 6787, 6405, 6046, 5708, 5386, 5083
DW 4799, 4529, 4275, 4037, 3809, 3596, 3393, 3204, 3023, 2852, 2693, 2541
DW 2398, 2265, 2138, 2017, 1903, 1798, 1698, 1600, 1511, 1427, 1346, 1270
DW 1200, 1132, 1068, 1008, 951, 897, 849, 800, 757, 713, 673, 635
DW 600, 565, 535, 505, 475, 448, 424, 400, 378, 356, 338, 319
DW 300, 283, 267, 251, 237, 224, 210, 200, 189, 178, 167, 159
DW 148, 140, 132, 127, 118, 113, 105, 100, 94, 89, 83, 78
DW 19060, 17989, 16981, 16026, 15128, 14279, 13476, 12719, 12005, 11332, 10697, 10096
DW 9528, 8996, 8490, 8014, 7563, 7138, 6738, 6359, 6002, 5667, 5348, 5048
DW 4764, 4496, 4245, 4007, 3782, 3569, 3369, 3179, 3001, 2833, 2674, 2522
DW 2382, 2249, 2122, 2003, 1890, 1784, 1684, 1589, 1500, 1416, 1335, 1262
DW 1192, 1124, 1059, 1000, 946, 892, 843, 794, 751, 708, 667, 630
DW 594, 562, 529, 500, 473, 446, 421, 397, 375, 354, 335, 316
DW 297, 281, 264, 251, 235, 224, 210, 200, 186, 175, 167, 156
DW 148, 140, 132, 124, 118, 110, 105, 100, 94, 89, 83, 78
DW 18922, 17859, 16856, 15913, 15018, 14177, 13379, 12630, 11919, 11251, 10618, 10023
DW 9461, 8931, 8428, 7955, 7509, 7087, 6689, 6313, 5959, 5627, 5310, 5013
DW 4729, 4464, 4215, 3977, 3755, 3544, 3344, 3158, 2979, 2812, 2655, 2506
DW 2366, 2233, 2106, 1990, 1876, 1771, 1673, 1579, 1489, 1406, 1327, 1251
DW 1181, 1116, 1054, 995, 938, 886, 835, 789, 746, 703, 662, 627
DW 592, 557, 527, 497, 470, 443, 419, 394, 373, 351, 332, 313
DW 294, 278, 262, 248, 235, 221, 208, 197, 186, 175, 164, 156
DW 148, 140, 132, 124, 116, 110, 105, 97, 91, 89, 83, 78
DW 18787, 17732, 16737, 15796, 14909, 14074, 13284, 12538, 11835, 11170, 10542, 9950
DW 9393, 8866, 8368, 7898, 7454, 7035, 6641, 6267, 5916, 5586, 5272, 4975
DW 4696, 4431, 4183, 3950, 3728, 3517, 3320, 3133, 2958, 2793, 2636, 2487
DW 2347, 2217, 2092, 1973, 1863, 1760, 1660, 1568, 1479, 1395, 1316, 1243
DW 1173, 1108, 1046, 986, 932, 878, 830, 784, 740, 697, 659, 621
DW 586, 554, 521, 494, 465, 440, 416, 392, 370, 348, 329, 310
DW 294, 275, 262, 246, 232, 219, 208, 194, 183, 175, 164, 156
DW 146, 137, 129, 124, 116, 110, 102, 97, 91, 86, 81, 78
DW 18652, 17603, 16616, 15683, 14804, 13971, 13187, 12449, 11748, 11089, 10467, 9880
DW 9326, 8801, 8309, 7841, 7400, 6987, 6595, 6224, 5875, 5545, 5234, 4940
DW 4661, 4402, 4153, 3920, 3701, 3493, 3296, 3112, 2936, 2771, 2617, 2468
DW 2330, 2201, 2076, 1960, 1849, 1746, 1649, 1554, 1468, 1387, 1308, 1235
DW 1165, 1100, 1038, 981, 924, 873, 824, 778, 735, 692, 654, 616
DW 584, 548, 519, 489, 462, 435, 411, 389, 367, 346, 327, 308
DW 292, 275, 259, 246, 232, 219, 205, 194, 183, 173, 162, 154
DW 146, 137, 129, 121, 116, 108, 102, 97, 91, 86, 81, 78

View File

@ -0,0 +1,516 @@
; DEFINE SKIP_MEM_TEST 1
ORG GSRomBaseL+4
DEFB #05 ;LOW (in BCD!)
DEFB #01 ;HIGH (in BCD!)
;patch info
ORG GSRomBaseL+#0100
DEFM "General Sound (tm) ROM"
DEFM "Copyright 1997 Stinger"
DEFM "Version 1.05b "
ORG GSRomBaseL+#0080
DB "This is improved ROM Version 1.04 Beta. "
DB "Bugfixes by psb & Evgeny Muchkin, 2007, 2015.",0
;------------------------------------------------------------------------------;
;PLAY.a80
;patch for >=63 patterns module
ORG TTY0+9 ;in PLAYMD
L8D6B LD DE,#0000+1084
JR NZ,L8D70
LD DE,#0000+600
LD HL,#8000+472
L8D70 LD B,#80
SUB A
L8D73 CP (HL)
JR NC,L8D77
LD A,(HL)
L8D77 INC HL
DJNZ L8D73
INC A
LD (PATTS),A
LD L,A
LD H,B
ADD HL,HL
ADD HL,HL
LD A,H
LD H,L
LD L,B
ADD HL,DE
ADC A,B
SLI H
RLA
RRC H
LD E,A
LD (SMPS),HL
LD (SMPS+2),A
NOP
NOP
NOP
ORG TTT13+6 ;in INITPAT
JP Patch11
;------------------------------------------------------------------------------;
;TABLES_H.a80
;patch for speed==0 (new cmd #6A - Set player mode)
ORG COMTABH+#6A-#20 ;in table with commands
DB low Patch2
ORG COMTABH+#6A-#20+#100
DB high Patch2
;FX_H.a80
ORG FXF_5 ;in FXF
JP Patch2x
;------------------------------------------------------------------------------;
;QUANTUM.a80
;patch for wrong last note speed, etc...
ORG EFXGTNT ;in EFXGTNT
JP Patch3
ORG EFXSKP8+15 ;don't change speed here
DW 0
ORG EFXSKP8+6 ;don't change speed here
DW 0
ORG EFXSKP8+12 ;don't change speed here
DW 0
;------------------------------------------------------------------------------;
;PLAY.a80
;patch for initial note (cmd#64 - get note)
ORG RDLP1 ;in PLAYMD
CALL Patch4:NOP
;------------------------------------------------------------------------------;
;TABLES_H.a80
;patch: module relooper (new cmd #6B - Set minimal loop length)
ORG COMTABH+#6B-#20 ;in table with commands
DB low Patch5
ORG COMTABH+#6B-#20+#100
DB high Patch5
;COM_H.a80
;patch for short loop (cmd#30 - load module)
ORG COM65-4 ;in COM30
CALL Patch5x
;INIT_H.a80
;patch for store&restore relooper settings
ORG INITVAR+1
CALL Patch5i1
ORG INITV01+25
CALL Patch5i2
ORG INITR0E+12
JP Patch5i3
;------------------------------------------------------------------------------;
;QUANTUM.a80
;loop sample if mod cmd 9xx has an offset beyond sample
ORG COMM3_
JP Patch6
;------------------------------------------------------------------------------;
;INIT_L.a80
;skip time consuming ROM CRC check and RAM test
IFDEF SKIP_MEM_TEST
ORG INIT_+1+2+1+1+3+3 ;skip ROM CRC check
JR INIT03
ORG INITR08e ;skip intensive RAM check and clear
JP INIT0Ce
ENDIF
;------------------------------------------------------------------------------;
;PLAY.a80
;fix samples sign no more than needed
ORG SMPMD2f
JP Patch7
;------------------------------------------------------------------------------;
;_GSFRQTB.a80
;patch for wrong sample frequencies
ORG GSFRQTB
INCLUDE "GSFRQTB_patched.a80"
ORG AMTOGS
INCLUDE "AMTOGS_patched.a80"
;FX_H.a80
;patch for wrong sample frequencies
ORG EFXCNV
EFXCNv LD A,H
CP #04
JR NC,EFXCNv1
XOR A
LD (CPAGE),A
OUT (PAGE),A
ADD HL,HL
LD A,H
ADD A,#F8
LD H,A
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
RET
EFXCNv1 PUSH HL
LD E,L
LD D,H
ADD HL,HL
ADD HL,HL
ADD HL,DE
XOR A ;HL A
LD C,A ;DE C
SRL D ;/2
RR E
RR C
ADD A,C
ADC HL,DE ;+/2
SRL D ;/4
RR E
RR C
SRL D ;/8
RR E
RR C
ADD A,C
ADC HL,DE ;+/8
SRL D ;/16
RR E
RR C
SRL D ;/32
RR E
RR C
SRL D ;/64
RR E
RR C
SRL D ;/128
RR E
RR C
SRL D ;/256
RR E
RR C
ADD A,C
ADC HL,DE ;+/256
SRL E ;/512
RR C
ADD A,C
ADC HL,DE ;+/512
SRL E ;/1024
RR C
ADD A,C
ADC HL,DE ;+/1024
SRL E ;/2048
RR C
SRL E ;/4096
RR C
ADD A,C
ADC HL,DE ;+/4096
; SRL E ;/8192
; RR C
; ADD A,C
; ADC HL,DE ;+/8192
SRL H
RR L
SRL H
RR L
SRL H
RR L
JR NC,EFXCNv2
INC HL
EFXCNv2 POP DE
ADD HL,DE
ADD HL,DE
RET
; display $,ARPTAB
; ORG EFXNOP2 ;block CALL EFXCNV for test GSFRQTB table
; RET
;------------------------------------------------------------------------------;
ORG Free1
; >=63 patterns fix
Patch11
; LD A,(HL)
; ADD A,A
; ADD A,A
; LD E,D
; LD D,A
; LD A,(MODTP)
; INC A
; LD HL,#0000+1084
; JR Z,TTT15
; LD HL,#0000+600
;TTT15 XOR A
; LD (CPAGE),A
; OUT (PAGE),A
; ADD HL,DE
; LD DE,#5000
; LD BC,#400
; CALL LDMEM
; XOR A
; OUT (#00),A
; RET
LD H,(HL)
LD L,D
ADD HL,HL,HL,HL
JR NC,$+3:INC D
LD A,(MODTP)
INC A
LD BC,#0000+1084
JR Z,TTT15x
LD BC,#0000+600
TTT15x
ADD HL,BC
JR NC,$+3:INC D
XOR A
LD (CPAGE),A
OUT (PAGE),A
LD A,D
LD DE,#5000
LD BC,#400
CALL LDMEM
XOR A
OUT (#00),A
RET
;------------------------------------------------------------------------------;
; new cmd #6A - Set player mode
PlMode EQU MODTP+1 ;new var
Patch2 LD A,(PlMode) ;command
OUT (OUTRG),A
IN A,(DATRG)
OUT (RSCOM),A
LD (PlMode),A
RET
Patch2x LD A,(PlMode):OR A:RET NZ
LD HL,MTSTAT
SET 7,(HL)
RET
;------------------------------------------------------------------------------;
; last note speed
Patch3 LD A,(MTSNGPS):OR A:JR NZ,Patch3e ;1st pattern
LD A,(MTPATPS):OR A:JR NZ,Patch3e ;1st row
LD A,6 ;init speed at start of MOD
LD (MTSPEED),A
LD HL,750
LD (TICKLEN),HL
LD (TCKLEFT),HL
Patch3e LD IY,CHANS
JP EFXGTNT+4
;------------------------------------------------------------------------------;
; initial note
Patch4
LD (IY+CHCNTL),#00
LD (IY+CHREAL),#7F
RET
;------------------------------------------------------------------------------;
;MOD relooper
; new cmd #6B - Set minimal loop length (turn on relooper)
MODLLEN EQU PlMode+1 ;minimal loop len
Patch5 IN A,(DATRG):LD L,A
OUT (RSCOM),A
IN A,(FLAGS):AND #81:JR Z,$-4
JP P,Patch5s
IN A,(DATRG):LD H,A
LD DE,16385
OR A:SBC HL,DE:ADD HL,DE
JR C,Patch5s+3
Patch5s LD HL,#0200
LD (MODLLEN),HL
RET
;reconstruct MOD after load
Patch5x
CALL PLAYMD ;init MOD
LD HL,(MODLLEN)
LD A,H:OR L:RET Z ;relooper off
LD A,(MODTP):OR A
LD A,31,HL,1084
JR NZ,$+7
LD A,15,HL,600
LD (MODSMPS),A,(MODPTST),HL
CALL CHIP
JP PLAYMD ;init MOD again
INCLUDE "reloop.a80"
;store settings
Patch5i1
LD A,(PlMode),C,A
LD DE,(MODLLEN)
LD A,(ERRCODE)
RET
;restore settings
Patch5i2
LD (ERRCODE),A
LD A,C,(PlMode),A
LD (MODLLEN),DE
RET
;clear vars after full reset!
Patch5i3
XOR A:LD H,A,L,A
LD (PlMode),A
LD (MODLLEN),HL
JP INITVAR
;------------------------------------------------------------------------------;
; loop sample if mod cmd 9xx has an offset beyond sample
Patch6
LD A,(IY+CHLPBP)
INC A
JP Z,Patch6e
DEC A
LD L,(IY+CHLPBL)
LD H,(IY+CHLPBH)
LD (IY+CHCURL),L
LD (IY+CHCURH),H
LD (IY+CHCURP),A
JP COMM5
Patch6e
RES 7,(IY+CHSTAT)
JP COMM5
;------------------------------------------------------------------------------;
; calc pages number to fix samples sign
Patch7
LD BC,(MEMBOT+1)
RL C
RL B
LD A,B ;a=last used page#
INC A
SUB E ;sub smps page#
LD B,A ;num of pages to process
JP SMPMD2

View File

@ -0,0 +1,271 @@
;(c)Evgeny Muchkin
MODSMPS equ #5000
MODPTST equ #5001
ChipSP_ equ #5005
CHIP246 equ #5007
TOcip_ equ #5009
CHIPLN equ #5010 ; <20>€4€Ž …Œ<E280A6>Ž (pointer)
CHIPPP equ #5013 ; „ˆ<E280B9>€ ŒŽ„“‹Ÿ
CIP1 equ #5016 ; Ž’Š“„€ <20><EFBFBD><EFBFBD>Žˆœ
CIP2 equ #5019 ; Š“„€ <20><EFBFBD><EFBFBD>Žˆœ
CIP3 equ #501c ; ŠŽ<C5A0> <20>ŽŠ€
CHIP DI
LD A,(RAMPG)
OUT (PAGE),A
;loop_start correction
; LD IX,#8014
; LD A,(MODSMPS)
; LD B,A ;smps!
;DOP_I1 LD H,(IX+22) ;len
; LD L,(IX+23)
; LD D,(IX+28) ;loop len
; LD E,(IX+29)
; AND A
; SBC HL,DE
; PUSH HL
; LD D,(IX+26) ;loop start
; LD E,(IX+27)
; AND A
; SBC HL,DE
; POP HL
; JR NC,DOP_I2
; LD (IX+26),H
; LD (IX+27),L
;DOP_I2 LD DE,30
; ADD IX,DE
; DJNZ DOP_I1
LD DE,(MODPTST) ;patts data!
LD A,(PATTS)
LD L,A
LD H,B
ADD HL,HL
ADD HL,HL
LD A,H
LD H,L
LD L,B
ADD HL,DE
ADC A,B
LD (CHIPLN),HL
LD (CHIPLN+2),A
LD (ChipSP_),SP
LD HL,CHIPLN
LD DE,CHIPPP
PUSH DE
LDI:LDI:LDI
POP IY
LD A,(MODSMPS)
LD B,A ;smps!
LD DE,30
LD IX,#8014
ChIp LD H,(IX+22) ;len
LD L,(IX+23)
CALL TOCip
ADD IX,DE
DJNZ ChIp
;LD HL,#2E4D ;M.K.
;LD (#8438),HL
;LD L,#4B
;LD (#843A),HL
LD IX,#802A
LD A,(MODSMPS)
LD B,A ;smps!
CHIP1 LD A,(RAMPG)
OUT (PAGE),A
LD H,(IX+6) ;loop len
LD L,(IX+7)
LD (CHIP246),HL
LD A,(IX) ;len
OR (IX+1)
JP Z,CHIP2 ;skip if no smp
LD DE,2
CALL CP_DDE
JP C,CHIP2 ;skip if loop len <2
LUP_LEN LD DE,(MODLLEN)
CALL CP_DDE
JP NC,CHIP2 ;skip if loop len>=LUP_LEN
PUSH BC
LD B,H,C,L
EXX
LD BC,0 ;reloop counter
CHIP3 EXX
ADD HL,BC
CALL CP_DDE
EXX
INC BC
JR C,CHIP3
PUSH BC
EXX
;!!!!!!!!!!!!!!!!!!!!!!!!!!
PUSH HL ;new loop len
LD B,(IX+6) ;loop len
LD C,(IX+7)
AND A
SBC HL,BC
LD DE,CHIPPP
LD (TOcip_),DE
LD IY,CIP1
CALL TOCIP
LD DE,CHIPLN
LD (TOcip_),DE
LD B,3 ;check if free mem
LD DE,CIP1+2
LD HL,RAMTOP+2
ChipLP LD A,(DE)
CP (HL)
DEC HL,DE
JR C,ChipOK
JP NZ,ChipSP
DJNZ ChipLP
ChipOK POP HL
EX DE,HL ;DE=new loop len
LD H,(IX) ;len
LD L,(IX+1)
LD B,(IX+6) ;loop len
LD C,(IX+7)
AND A
SBC HL,BC
ADD HL,DE
LD (IX),H ;new smp len
LD (IX+1),L
LD (IX+6),D ;new loop len
LD (IX+7),E
LD IY,CIP1
LD H,(IX+4) ;loop start
LD L,(IX+5)
PUSH HL,HL,HL
ADD HL,BC
CALL TOCIP
LD IY,CIP2
POP HL
ADD HL,DE
CALL TOCIP
LD HL,CHIPPP
LD DE,CIP3
LDI:LDI:LDI
CALL DIRER
LD IY,CIP1
POP HL
CALL TOCIP
POP HL
CHIP4 LD DE,(CHIP246) ;orig loop len
ADD HL,DE
LD IY,CIP2
CALL TOCIP
LD HL,CIP2
LD DE,CIP3
LDI:LDI:LDI
POP BC
CHIP5 PUSH BC
CALL DIRER
CHIP6 LD HL,(CHIP246) ;orig loop len
LD IY,CIP2
CALL TOCip
POP BC
DEC BC
LD A,B
OR C
JR NZ,CHIP5
POP BC
CHIP2 LD DE,(CHIP246) ;orig loop len
LD A,(RAMPG)
OUT (PAGE),A
LD H,(IX+6) ;new loop len
LD L,(IX+7)
AND A
SBC HL,DE
LD IY,CHIPPP ;corr mod len
CALL TOCip
LD H,(IX)
LD L,(IX+1)
LD IY,CHIPLN ;add pointer
CALL TOCip
LD DE,30
ADD IX,DE
DEC B
JP NZ,CHIP1
ChipSP LD SP,(ChipSP_)
;LD A,#FF
;LD (CONVERT),A
;CALL PLAYMD
EI
;JP COMINT
RET
DIRER LD IY,CIP1
LD L,(IY+3)
LD H,(IY+4)
LD B,(IY+5)
EXX
LD L,(IY)
LD H,(IY+1)
LD B,(IY+2)
LD E,(IY+6)
LD D,(IY+7)
LD C,(IY+8)
PUSH IX
CALL RESI10_
POP IX
RET
TOCIP PUSH HL,DE
PUSH IY
POP DE
TOcip LD HL,(TOcip_) ;CHIPLN
LDI:LDI:LDI
POP DE,HL
TOCip CALL ADD_IY
ADD_IY LD A,(IY)
ADD A,L
LD (IY),A
LD A,(IY+1)
ADC A,H
LD (IY+1),A
LD A,(IY+2)
ADC A,0
LD (IY+2),A
RET
CP_DDE PUSH HL
AND A
SBC HL,DE
POP HL
RET
;RESID10 ; MOVE BLOCK IN GS
; BHL - FROM
; CDE - END
; 'BHL - TO
RESI10_ SUB A:OUT (PAGE),A
LD (SYSTEM),A,A,B
PUSH HL:EXX:POP DE
PUSH HL,BC
LD C,A:OR A:SBC HL,DE
LD A,B:SBC A,C:EX DE,HL
POP BC,HL:LD C,A:OR E,D
RET Z
EXX:EX DE,HL:SBC HL,DE:LD A,C
SBC A,B:LD LX,A:OR L,H:EXX
RET Z
PUSH DE,BC:BIT 7,C:EXX
JP NZ,MOVL
JP MOVH

View File

@ -0,0 +1,11 @@
1. mod with 64 patt. +
2. mod stop if speed=0 +
3. last note speed +
4. initial note (cmd#64) +
5. sample freq +
6. mod relooper +
7. goto position cmd?

Binary file not shown.

View File

@ -0,0 +1,41 @@
WTCM IN A,(FLAGS)
RRCA
JR NC,WTCM
IN A,(COMRG)
CP #12
JR Z,CM12
CP #18
JR Z,CM18
CP #1A
JR Z,CM1A
CP #1B
JR Z,CM1B
CP #20
JR Z,CM20
OUT (RSCOM),A
JP WTCM
CM12 IN A,(DATRG)
OUT (RSCOM),A
OUT (PAGE),A
JP WTCM
CM18 IN A,(DATRG)
LD E,A
OUT (RSCOM),A
CM18_1 IN A,(FLAGS)
OR A
JP P,CM18_1
IN A,(DATRG)
LD D,A
JP WTCM
CM1A LD A,(DE)
OUT (OUTRG),A
OUT (RSCOM),A
JP WTCM
CM1B INC DE
OUT (RSCOM),A
JP WTCM
CM20 OUT (RSCOM),A
RET

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,627 @@
COMHZ OUT (RSCOM),A
COMINT LD SP,ISTACK
COMINT_ IN A,(FLAGS)
RRCA
JR C,COMINT1
LD A,(PROCESS)
OR A
JR Z,COMINT_
LD A,(BUSY)
OR A
JR NZ,COMINT_
IN A,(FLAGS)
RRCA
JR C,COMINT1
LD A,#FF
LD (INGEN),A
PUSH DE
CALL ENGINE
POP DE
XOR A
LD (INGEN),A
JP COMINT_
COMINT1 IN A,(COMRG)
CP #20
JR C,COMLOW
COMINT2 CP #F0
JR C,COMHIGH
SUB #D0
COMLOW ADD A,A
LD H,high COMTAB
LD L,A
LD A,(HL)
INC L
LD H,(HL)
LD L,A
JP (HL)
COMHIGH LD HL,COMINT_
PUSH HL
LD L,A
LD H,high COMTABH
XOR A
LD (CPAGE),A
OUT (PAGE),A
LD A,(HL)
INC H
LD H,(HL)
LD L,A
JP (HL)
WTDTL IN A,(FLAGS)
AND #81
JR Z,WTDTL
IN A,(DATRG)
JP P,COMINT1
JP (IY)
WTDTG IN A,(FLAGS)
OR A
JP P,WTDTG
IN A,(DATRG)
JP (IY)
; UNPHASE
; ORG $+#00FF&#FF00
; PHASE $-GSRomBaseL
align 256
COMTAB DEFW COM00,COM01,COM02,COM03,COM04,COM05,COM06,COM07
DEFW COM08,COM09,COM0A,COM0B,COM0C,COM0D,COM0E,COM0F
DEFW COM10,COM11,COM12,COM13,COM14,COM15,COM16,COM17
DEFW COM18,COM19,COM1A,COM1B,COM1C,COM1D,COM1E,COM1F
DEFW COMF0,COMF1,COMF2,COMF3,COMF4,COMF5,COMF6,COMF7
DEFW COMF8,COMF9,COMFA,COMFB,COMFC,COMFD,COMFE,COMFF
COMZ OUT (RSCOM),A
JP COMINT_
; #00 - RESET FLAGS COMMAND
COM00 IN A,(DATRG)
OUT (RSCOM),A
JP COMINT_
; #01 - INITIALIZE DAC'S COMMAND
COM01 OUT (RSCOM),A
LD A,#80
LD HL,DAC0
LD (HL),A
LD B,(HL)
INC H
LD (HL),A
LD B,(HL)
INC H
LD (HL),A
LD B,(HL)
INC H
LD (HL),A
LD B,(HL)
JP COMINT_
; #02 - INITIALIZE VOLUME CONTROL REGISTERS
COM02 OUT (RSCOM),A
LD A,#3F
OUT (VOL0),A
OUT (VOL1),A
OUT (VOL2),A
OUT (VOL3),A
JP COMINT_
; #03 - RESET VOLUME CONTROL REGISTERS
COM03 OUT (RSCOM),A
XOR A
OUT (VOL0),A
OUT (VOL1),A
OUT (VOL2),A
OUT (VOL3),A
JP COMINT_
; #04 - SET CURRENT CHANNEL
COM04 IN A,(DATRG)
OUT (RSCOM),A
AND #07
LD E,A
JP COMINT_
; #05 - SET VOLUME OF CURRENT CHANNEL
COM05 IN A,(DATRG)
OUT (RSCOM),A
LD B,A
LD A,E
CP #04
JP NC,COMINT_
ADD A,VOL0
LD C,A
OUT (C),B
JP COMINT_
; #06 - OUTPUT BYTE TO CUR CHANNEL
COM06 IN A,(DATRG)
OUT (RSCOM),A
LD B,A
LD A,E
CP #04
JP NC,COMINT_
ADD A,high DAC0
LD H,A
LD L,#00
LD (HL),B
LD A,(HL)
JP COMINT_
; #07 - OUTPUT BYTE TO CUR CHANNEL WITH VOLUME CONTROL
COM07 IN A,(DATRG)
OUT (RSCOM),A
LD B,A
LD A,E
CP #04
JP NC,COMINT_
ADD A,high DAC0
LD H,A
LD L,#00
LD (HL),B
SUB high DAC0
ADD A,VOL0
LD C,A
LD IY,COM07_1
JP WTDTL
COM07_1 OUT (C),A
LD A,(HL)
JP COMINT_
; #08
COM08 EQU COMZ
; #09 - SET PHISICAL VOLUME OF CHANNEL
COM09 IN A,(DATRG)
OUT (RSCOM),A
LD B,A
RLCA
RLCA
AND #03
ADD A,VOL0
LD C,A
LD A,B
AND #3F
OUT (C),A
JP COMINT_
; #0A - OUTPUT BYTE TO CHANNEL
COM0A IN A,(DATRG)
OUT (RSCOM),A
LD B,A
LD IY,COM0A_1
JP WTDTL
COM0A_1 AND #03
ADD A,high DAC0
LD H,A
LD L,#00
LD (HL),B
LD A,(HL)
JP COMINT_
; #0B - OUTPUT BYTE TO CHANNEL WITH VOLUME CONTROL
COM0B IN A,(DATRG)
OUT (RSCOM),A
LD C,A
LD IY,COM0B_1
JP WTDTL
COM0B_1 LD B,A
RLCA
RLCA
AND #03
ADD A,high DAC0
LD H,A
LD L,#00
LD (HL),C
SUB high DAC0
ADD A,VOL0
LD C,A
LD A,B
AND #3F
OUT (C),A
LD A,(HL)
JP COMINT_
; #0C - OUTPUT TO ALL CHANNELS
COM0C IN A,(DATRG)
OUT (RSCOM),A
LD HL,DAC0
LD (HL),A
LD A,(HL)
INC H
LD IY,COM0C_1
JP WTDTL
COM0C_1 LD (HL),A
LD A,(HL)
INC H
LD IY,COM0C_2
JP WTDTL
COM0C_2 LD (HL),A
LD A,(HL)
INC H
LD IY,COM0C_3
JP WTDTL
COM0C_3 LD (HL),A
LD A,(HL)
JP COMINT_
; #0D - OUTPUT BYTES TO CHANNELS
COM0D IN A,(DATRG)
OUT (RSCOM),A
AND #0F
JP Z,COMINT_
RLCA
RLCA
RLCA
RLCA
LD B,A
LD HL,DAC0
LD IY,COM0D_3
JP COM0D_2
COM0D_3 LD (HL),A
LD A,(HL)
INC H
JP COM0D_2
COM0D_1 JP Z,COMINT_
INC H
COM0D_2 SLA B
JR NC,COM0D_1
JP WTDTL
; #0E - GO IN COVOX MODE
COM0E OUT (RSCOM),A
LD HL,DAC0
LD BC,DAC2
COM0E_1 IN A,(DATRG)
LD (HL),A
LD (BC),A
LD A,(HL)
LD A,(BC)
IN A,(FLAGS)
RRCA
JP NC,COM0E_1
JP COMINT_
; #0F - GO IN STEREO COVOX MODE
COM0F IN A,(DATRG)
OUT (RSCOM),A
CP "Y"
JP NZ,COMINT_
LD HL,DAC0
LD DE,DAC2
COM0F_1 IN A,(DATRG)
LD (HL),A
IN A,(COMRG)
LD (DE),A
LD A,(HL)
LD A,(DE)
IN A,(FLAGS)
OR A
JP M,COM0F_1
LD B,#00
OUT (RSCOM),A
COM0F_2 IN A,(FLAGS)
AND #81
JR NZ,COM0F_1
DJNZ COM0F_2
COM0F_3 IN A,(FLAGS)
AND #81
JR Z,COM0F_3
CP #80
JR NZ,COM0F_1
IN A,(DATRG)
CP "N"
JP NZ,COM0F_1
COM0F_4 IN A,(FLAGS)
AND #81
JR Z,COM0F_4
CP #01
JR NZ,COM0F_1
IN A,(COMRG)
CP #0F
JP NZ,COM0F_1
OUT (RSCOM),A
COM0F_5 IN A,(FLAGS)
AND #81
JR Z,COM0F_5
CP #01
JR NZ,COM0F_1
IN A,(COMRG)
CP #AA
JP NZ,COM0F_1
OUT (RSCOM),A
JP COMINT_
; #10 - OUTPUT TO PORT
COM10 IN A,(DATRG)
OUT (RSCOM),A
LD C,A
LD IY,COM10_1
JP WTDTL
COM10_1 OUT (C),A
JP COMINT_
; #11 - INPUT FROM PORT
COM11 IN A,(DATRG)
LD C,A
IN A,(C)
OUT (OUTRG),A
OUT (RSCOM),A
JP COMINT_
; #12 - OUT TO PAGE REGISTER
COM12 IN A,(DATRG)
OUT (RSCOM),A
OUT (PAGE),A
JP COMINT_
; #13 - JUMP TO ADRESS
COM13 IN A,(DATRG)
OUT (RSCOM),A
LD L,A
LD IY,COM13_1
JP WTDTL
COM13_1 LD H,A
JP (HL)
; #14 - RECEIVE BLOCK
; 70+27*WAIT PER LOOP : 171K,123K,96K PER SECOND MAX
COM14 IN A,(DATRG)
OUT (RSCOM),A
CPL
LD C,A
LD HL,WTDTL
LD IY,COM14_1
JP (HL)
COM14_1 CPL
LD B,A
INC BC
LD IY,COM14_2
JP (HL)
COM14_2 LD E,A
LD IY,COM14_3
JP (HL)
COM14_3 LD D,A
LD A,B
OR C
JP Z,COMINT_
LD LX,B
LD B,#81
BIT 0,C
JR NZ,COM14_7
COM14_6 IN A,(FLAGS)
AND B
JR Z,COM14_6
IN A,(DATRG)
JP P,COMINT1
LD (DE),A
INC DE
INC C
COM14_7 IN A,(FLAGS)
AND B
JR Z,COM14_7
IN A,(DATRG)
JP P,COMINT1
LD (DE),A
INC DE
INC C
JP NZ,COM14_6
COM14_5 INC LX
JP NZ,COM14_6
JP COMINT_
; #15 - TRANSMIT BLOCK
COM15 IN A,(DATRG)
CPL
LD C,A
LD IY,COM15_1
JP WTDTG
COM15_1 CPL
LD B,A
INC BC
LD IY,COM15_2
JP WTDTG
COM15_2 LD E,A
LD IY,COM15_3
JP WTDTG
COM15_3 LD D,A
LD A,B
OR C
JP Z,COMINT_
LD LX,B
LD B,#81
LD A,(DE)
INC DE
OUT (OUTRG),A
OUT (RSCOM),A
LD HL,COM15_4
INC C
JP NZ,COM15_4
INC LX
JP Z,COMINT_
COM15_4 IN A,(FLAGS)
AND B
JR Z,COM15_5
JP P,COMINT1
IN A,(FLAGS)
AND B
JR Z,COM15_5
JP P,COMINT1
IN A,(FLAGS)
AND B
JR Z,COM15_5
JP P,COMINT1
IN A,(FLAGS)
AND B
JR Z,COM15_5
JP P,COMINT1
JP (HL)
COM15_5 LD A,(DE)
OUT (OUTRG),A
INC DE
INC C
JP NZ,COM15_4
COM15_7 INC LX
JP NZ,COM15_4
JP COMINT_
; #16 - PUT BYTE
COM16 IN A,(DATRG)
OUT (RSCOM),A
LD B,A
LD IY,COM16_1
JP WTDTL
COM16_1 LD L,A
LD IY,COM16_2
JP WTDTL
COM16_2 LD H,A
LD (HL),B
JP COMINT_
; #17 - GET BYTE
COM17 IN A,(DATRG)
LD L,A
LD IY,COM17_1
JP WTDTL
COM17_1 LD H,A
LD A,(HL)
OUT (OUTRG),A
OUT (RSCOM),A
JP COMINT_
; #18 - SET MEMORY POINTER
COM18 IN A,(DATRG)
OUT (RSCOM),A
LD E,A
LD IY,COM18_1
JP WTDTL
COM18_1 LD D,A
JP COMINT_
; #19 - PUT BYTE TO MEMORY POINTER
COM19 IN A,(DATRG)
OUT (RSCOM),A
LD (DE),A
JP COMINT_
; #1A - GET BYTE FROM MEMORY POINTER
COM1A LD A,(DE)
OUT (OUTRG),A
OUT (RSCOM),A
JP COMINT_
; #1B - INCREMENT POINTER
COM1B OUT (RSCOM),A
INC DE
JP COMINT_
; #1C - PUT BYTE TO SYSTEM AREA
COM1C IN A,(DATRG)
OUT (RSCOM),A
LD L,A
LD IY,COM1C_1
JP WTDTL
COM1C_1 LD H,#20
LD (HL),A
JP COMINT_
; #1D - GET BYTE FROM SYSTEM AREA
COM1D IN A,(DATRG)
LD L,A
LD H,#20
LD A,(HL)
OUT (OUTRG),A
OUT (RSCOM),A
JP COMINT_
COM1E EQU COMZ
COM1F EQU COMZ
COMF0 LD A,(ERRCODE) ; GET STATUS
OUT (OUTRG),A
OUT (RSCOM),A
JP COMINT_
COMF1 EQU COMZ
COMF2 EQU COMZ
COMF3 OUT (RSCOM),A
JP INITVAR
COMF4 OUT (RSCOM),A
JP #0000
COMF5 OUT (RSCOM),A
LD A,HX
AND #80
JP NZ,COMF5_1
LD A,#FF
LD (BUSY),A
JP COMINT_
COMF5_1 OR #40
LD HX,A
JP COMINT_
COMF6 OUT (RSCOM),A
LD A,HX
AND #80
JP NZ,COMF6_1
XOR A
LD (BUSY),A
JP COMINT_
COMF6_1 LD HX,A
JP COMINT_
COMF7 LD A,HX
OUT (OUTRG),A
OUT (RSCOM),A
JP COMINT_
COMF8 EQU COMZ
COMF9 EQU COMZ
; #FA - TEST COMMAND
COMFA OUT (RSCOM),A
XOR A
LD (CPAGE),A
OUT (PAGE),A
JP TCOM
COMFB EQU COMZ
COMFC EQU COMZ
COMFD EQU COMZ
COMFE EQU COMZ
COMFF EQU COMZ

View File

@ -0,0 +1,206 @@
;RETURN: E - NOTE
NOTEID LD HL,AMINOTE
CALL DIH
LD E,A
RET
;RETURN: E - NOTE
NOTEGET LD E,(IY+CHNOTE)
LD A,E
INC A
RET NZ
NOTEFND LD HL,AMFRQTB
LD A,(IY+CHFINE)
RRA
AND #0F
JR Z,NOTEFN1
LD C,A
ADD A,A
ADD A,C
ADD A,A
ADD A,A
ADD A,A
LD B,0
RL B
ADD A,A
RL B
ADD A,A
RL B
LD C,A
ADD HL,BC
NOTEFN1 LD E,(IY+CHPERL)
LD D,(IY+CHPERH)
CALL DIH
LD E,A
RET
DIH LD BC,#005F
PUSH HL
INC HL
LD A,(HL)
DEC HL
CP D
JR C,DIHRGR
JR NZ,DIH2
LD A,(HL)
CP E
JR C,DIHRGR
JR NZ,DIH2
POP HL
XOR A
SCF
RET
DIHRGR LD E,(HL)
INC HL
LD D,(HL)
POP HL
XOR A
RET
DIH2 LD A,#BF
ADD A,L
LD L,A
LD A,H
ADC A,B
LD H,A
LD A,(HL)
DEC HL
CP D
JR C,DIH3
JR NZ,DIHRLO
LD A,(HL)
CP E
JR C,DIH3
JR NZ,DIHRLO
POP HL
LD A,C
SCF
RET
DIHRLO LD E,(HL)
INC HL
LD D,(HL)
POP HL
LD A,C
OR A
RET
DIH3 POP HL
DIHLP PUSH HL
LD A,B
ADD A,C
AND #FE
ADD A,L
LD L,A
LD A,H
ADC A,#00
LD H,A
INC HL
LD A,(HL)
DEC HL
CP D
JR C,DIHGR
JR NZ,DIHLO
LD A,(HL)
CP E
JR C,DIHGR
JR NZ,DIHLO
POP HL
LD A,B
ADD A,C
SRL A
SCF
RET
DIHGR LD A,B
ADD A,C
SRL A
LD C,A
POP HL
JP DIHLP
DIHLO LD A,B
ADD A,C
SRL A
CP B
LD B,A
JR Z,DIHMID
POP HL
JP DIHLP
DIHMID PUSH HL
PUSH BC
LD A,(HL)
INC HL
SUB E
LD C,A
LD A,(HL)
INC HL
SBC A,D
LD B,A
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
EX DE,HL
OR A
SBC HL,DE
LD A,H
CP B
JR C,DIHFLO
JR NZ,DIHFGR
LD A,L
CP C
JR C,DIHFLO
JR NZ,DIHFGR
DIHFLO POP BC
POP HL
POP HL
LD A,C
OR A
RET
DIHFGR POP BC
POP HL
LD E,(HL)
INC HL
LD D,(HL)
POP HL
LD A,B
RET
AMINOTE DEFW 6848,6464,6096,5760,5424,5120,4832,4560,4304,4064,3840,3624 ;C-0
DEFW 3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812 ;C-1
DEFW 1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906 ;C-2
DEFW 856,808,762,720,678,640,604,570,538,508,480,453 ;C-3
DEFW 428,404,381,360,339,320,302,285,269,254,240,226 ;C-4
DEFW 214,202,190,180,170,160,151,143,135,127,120,113 ;C-5
DEFW 107,101,95,90,85,80,75,71,67,63,60,56 ;C-6
DEFW 53,50,47,45,42,40,37,35,33,31,30,28 ;C-7

View File

@ -0,0 +1,142 @@
ENGINE LD HL,(QTFREE)
LD H,high QTMAP
LD A,L
AND #1C
LD L,A
LD (QTFREE),HL
LD A,(HL)
OR A
JP NZ,ENG_FUL
LD A,(CHANSFX+#000)
RLCA
RR C
LD A,(CHANSFX+#040)
RLCA
RR C
LD A,(CHANSFX+#080)
RLCA
RR C
LD A,(CHANSFX+#0C0)
RLCA
RR C
LD A,(CHANSFX+#100)
RLCA
RR C
LD A,(CHANSFX+#140)
RLCA
RR C
LD A,(CHANSFX+#180)
RLCA
RR C
LD A,(CHANSFX+#1C0)
RLCA
RR C
LD A,(GSCHNS)
AND C
LD C,A
LD (FXCHNS),A
JR NZ,ENG_01
LD A,(MTSTAT)
BIT 6,A
RET NZ
OR A
JP M,ENG_00
LD A,(MODULE)
OR A
JR NZ,ENG_01
ENG_00 XOR A
LD (PROCESS),A
RET
ENG_01 LD A,(MODSWCH)
OR A
JR NZ,ENG_03
LD A,(MODULE)
OR A
JR Z,ENG_03
LD A,#01
LD (SGENOFF),A
LD A,(TCKLEFT+1)
CP #02
JR NC,ENG_05
OR A
LD A,(TCKLEFT)
JR Z,ENG_04
SUB #80
JR NC,ENG_05
JP ENG_04
ENG_03 LD A,#01
LD (SGENOFF),A
LD A,(FXTICK+1)
CP #02
JR NC,ENG_05
OR A
LD A,(FXTICK)
JR Z,ENG_04
SUB #80
JR NC,ENG_05
ENG_04 NEG
LD (SGENOFF),A
ENG_05 XOR A
LD (CHANNEL),A
OR C
JR Z,ENG_07
LD IY,CHANSFX
SRL C
ENG_06 PUSH BC
CALL C,GEN
LD BC,CHANLEN
ADD IY,BC
POP BC
SRL C
JR C,ENG_06
JR NZ,ENG_06
ENG_07
CALL QUANTUM
XOR A
LD (CPAGE),A
OUT (PAGE),A
RET
ENG_80 LD A,(SGENOFF)
LD E,A
LD D,#00
LD HL,(FXTICK)
OR A
SBC HL,DE
JR Z,ENG_81
JR C,ENG_81
LD (FXTICK),HL
JP ENG_82
ENG_81
ENG_82 LD A,(MODSWCH)
OR A
JR NZ,$
LD A,(MODULE)
OR A
JR Z,$
LD HL,(TCKLEFT)
SBC HL,DE
LD (TCKLEFT),HL
JR NZ,ENG_83
ENG_83
ENG_FUL LD A,(PLAYING)
OR A
RET NZ
DI
XOR A
LD (FILLALL),A
CALL QTPLAY
RET

View File

@ -0,0 +1,756 @@
FXCHK_ LD HL,FXJP2
JP FXCHK__
FXCHK LD HL,FXJP1
FXCHK__ LD A,(IY+CHCOM)
AND #1F
ADD A,A
ADD A,L
LD L,A
LD A,(HL)
INC L
LD H,(HL)
LD L,A
LD A,(IY+CHPARM)
JP (HL)
FXE_ LD HL,FXEJP2
JP FXE__
FXE LD HL,FXEJP1
FXE__ RRCA
RRCA
RRCA
RRCA
AND #0F
ADD A,A
ADD A,L
LD L,A
LD A,(HL)
INC L
LD H,(HL)
LD L,A
LD A,(IY+CHPARM)
AND #0F
JP (HL)
FXRET RET
FXNOP LD L,(IY+CHPERL)
LD H,(IY+CHPERH)
EFXNOP2 CALL EFXCNV
LD (IY+CHFRQL),L
LD (IY+CHFRQH),H
RET
EFXCNV LD A,H
CP #04
JR NC,EFXCNV1
XOR A
LD (CPAGE),A
OUT (PAGE),A
ADD HL,HL
LD A,H
ADD A,#F8
LD H,A
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
RET
EFXCNV1 PUSH HL
LD C,L
LD B,H
ADD HL,HL
ADD HL,HL
EX DE,HL
LD HL,#0000
ADD HL,DE
LD E,C
LD D,B
ADD HL,DE
XOR A
LD C,A
SRL D
RR E
RR C
SRL D
RR E
RR C
ADD A,C
ADC HL,DE
SRL D
RR E
RR C
ADD A,C
ADC HL,DE
SRL D
RR E
RR C
ADD A,C
ADC HL,DE
SRL D
RR E
RR C
SRL D
RR E
RR C
ADD A,C
ADC HL,DE
SRL D
RR E
RR C
SRL D
RR E
RR C
SRL E
RR C
ADD A,C
ADC HL,DE
SRL E
RR C
ADD A,C
ADC HL,DE
SRL E
RR C
SRL E
RR C
ADD A,C
ADC HL,DE
SRL H
RR L
SRL H
RR L
SRL H
RR L
JR NC,EFXCNV2
INC HL
EFXCNV2 POP DE
ADD HL,DE
ADD HL,DE
RET
ARPTAB DEFB 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2
DEFB 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2
FX0 OR A
JP Z,FXNOP
LD B,A
LD A,(MTCOUNT)
LD HL,ARPTAB
ADD A,L
LD L,A
LD A,H
ADC A,#00
LD H,A
LD A,(HL)
OR A
JP Z,FXNOP
PUSH AF
PUSH BC
CALL NOTEFND
POP BC
POP AF
DEC A
LD A,B
JR NZ,FX0_2
RRCA
RRCA
RRCA
RRCA
FX0_2 AND #0F
ADD A,E
LD E,A
CP 96
RET NC
CALL GETFRQ
LD (IY+CHFRQL),L
LD (IY+CHFRQH),H
RET
FX1 LD E,A
LD D,#00
LD L,(IY+CHPERL)
LD H,(IY+CHPERH)
OR A
SBC HL,DE
JR NC,FX1_2
LD HL,#0000
FX1_2 PUSH HL
LD HL,113
FX1_8 POP DE
OR A
SBC HL,DE
JR C,FX1_9
ADD HL,DE
EX DE,HL
FX1_9 SET 7,(IY+CHFLAGS)
LD (IY+CHPERL),E
LD (IY+CHPERH),D
PUSH DE
EX DE,HL
CALL EFXCNV
LD (IY+CHFRQL),L
LD (IY+CHFRQH),H
POP DE
CALL NOTEFND
LD (IY+CHREAL),A
RET NC
LD (IY+CHNOTE),A
RES 7,(IY+CHFLAGS)
RET
FX2 LD E,A
LD D,#00
LD L,(IY+CHPERL)
LD H,(IY+CHPERH)
ADD HL,DE
JR NC,FX2_2
LD HL,#FFFF
FX2_2 PUSH HL
LD HL,856
FX2_8 POP DE
OR A
SBC HL,DE
JR NC,FX2_9
ADD HL,DE
EX DE,HL
FX2_9 SET 7,(IY+CHFLAGS)
LD (IY+CHPERL),E
LD (IY+CHPERH),D
PUSH DE
EX DE,HL
CALL EFXCNV
LD (IY+CHFRQL),L
LD (IY+CHFRQH),H
POP DE
CALL NOTEFND
LD (IY+CHREAL),A
RET NC
LD (IY+CHNOTE),A
RES 7,(IY+CHFLAGS)
RET
FX3 OR A
JR Z,FX3_1
LD (IY+CHPORT),A
FX3_1 LD A,(IY+CHWNT)
CP 96
RET NC
LD E,A
CALL GETPER
EX DE,HL
LD L,(IY+CHPERL)
LD H,(IY+CHPERH)
OR A
SBC HL,DE
JR Z,FX3_9
ADD HL,DE
LD C,(IY+CHPORT)
LD B,#00
JR C,FX3_5
SBC HL,BC
JR C,FX3_9
SBC HL,DE
JR C,FX3_9
FX3_2 ADD HL,DE
LD (IY+CHPERL),L
LD (IY+CHPERH),H
BIT 2,(IY+CHFLAGS)
CALL Z,EFXCNV
BIT 2,(IY+CHFLAGS)
JR Z,FX3_3
EX DE,HL
CALL NOTEFND
LD E,A
CALL GETFRQ
FX3_3 LD (IY+CHFRQL),L
LD (IY+CHFRQH),H
RET
FX3_5 ADD HL,BC
JR C,FX3_9
SBC HL,DE
JR C,FX3_2
FX3_9 LD E,(IY+CHWNT)
LD (IY+CHNOTE),E
LD (IY+CHREAL),E
CALL GETPER
LD (IY+CHPERL),L
LD (IY+CHPERH),H
CALL GETFRQ
LD (IY+CHFRQL),L
LD (IY+CHFRQH),H
RES 7,(IY+CHFLAGS)
LD (IY+CHCOM),#00
LD (IY+CHPARM),#00
LD (IY+CHWNT),#7F
RET
FX3_ RET
FX4 PUSH DE
PUSH BC
OR A
JR Z,FX4_3
LD L,A
LD H,(IY+CHVIBCM)
AND #0F
JR Z,FX4_1
XOR H
AND #0F
XOR H
LD H,A
FX4_1 LD A,L
AND #F0
JR Z,FX4_2
XOR H
AND #F0
XOR H
LD H,A
FX4_2 LD (IY+CHVIBCM),H
FX4_3 LD D,(IY+CHVIBPS)
LD A,D
AND #03
JR Z,FX4_5
CP #03
JR NZ,FX4_A
LD A,R
AND #03
JR Z,FX4_5
CP #03
JR Z,FX4_5
FX4_A DEC A
JR Z,FX4_4
LD E,#FF
JP FX4_6
FX4_4 LD A,D
AND #7C
RLCA
LD E,A
BIT 7,D
JR NZ,FX4_6
LD A,#F8
SUB E
LD E,A
JP FX4_6
FX4_5 LD A,D
RRCA
RRCA
AND #1F
LD HL,VIBTB
ADD A,L
LD L,A
LD E,(HL)
FX4_6 LD A,(IY+CHVIBCM)
AND #0F
JR Z,FX4_9
LD B,A
LD HL,#0000
LD D,H
FX4_7 ADD HL,DE
DJNZ FX4_7
LD B,#07
LD A,L
FX4_8 SRL H
RRA
DJNZ FX4_8
ADC A,D
LD L,A
LD H,#00
BIT 7,(IY+CHVIBPS)
JR Z,FX4_9
DEC H
CPL
LD L,A
INC HL
FX4_9 LD E,(IY+CHPERL)
LD D,(IY+CHPERH)
ADD HL,DE
CALL EFXNOP2
LD A,(IY+CHVIBCM)
AND #F0
RRCA
RRCA
ADD A,(IY+CHVIBPS)
LD (IY+CHVIBPS),A
POP BC
POP DE
; LD (IY+CHCNTL),#00
; LD (IY+CHCNTH),#00
RET
FX5 CALL FXA
JP FX3_1
FX6 CALL FXA
PUSH DE
PUSH BC
JP FX4_3
FX7 PUSH DE
PUSH BC
OR A
JR Z,FX7_3
LD L,A
LD H,(IY+CHTRMCM)
AND #0F
JR Z,FX7_1
XOR H
AND #0F
XOR H
LD H,A
FX7_1 LD A,L
AND #F0
JR Z,FX7_2
XOR H
AND #F0
XOR H
LD H,A
FX7_2 LD (IY+CHTRMCM),H
FX7_3 LD D,(IY+CHTRMPS)
LD A,D
AND #03
JR Z,FX7_5
CP #03
JR NZ,FX7_A
LD A,R
AND #03
JR Z,FX7_5
CP #03
JR Z,FX7_5
FX7_A DEC A
JR Z,FX7_4
LD E,#FF
JP FX7_6
FX7_4 LD A,D
AND #7C
RLCA
LD E,A
BIT 7,D
JR NZ,FX7_6
LD A,#F8
SUB E
LD E,A
JP FX7_6
FX7_5 LD A,D
RRCA
RRCA
AND #1F
LD HL,VIBTB
ADD A,L
LD L,A
LD E,(HL)
FX7_6 LD A,(IY+CHTRMCM)
AND #0F
JR Z,FX7_9
LD B,A
LD HL,#0000
LD D,H
FX7_7 ADD HL,DE
DJNZ FX7_7
LD B,#06
LD A,L
FX7_8 SRL H
RRA
DJNZ FX7_8
ADC A,D
BIT 7,(IY+CHTRMPS)
JR Z,FX7_9
LD L,A
LD A,(IY+CHVOL)
SUB L
JR NC,FX7_B
XOR A
JP FX7_B
FX7_9 ADD A,(IY+CHVOL)
CP #40
JR C,FX7_B
LD A,#40
FX7_B CP (IY+CHMVOL)
LD (IY+CHMVOL),A
JR Z,FX7_C
SET 0,(IY+CHSTAT)
FX7_C LD A,(IY+CHTRMCM)
AND #F0
RRCA
RRCA
ADD A,(IY+CHTRMPS)
LD (IY+CHTRMPS),A
POP BC
POP DE
RET
FX9 OR A
RET
JR Z,FX9_1
LD (IY+CHOFFST),A
FX9_1 LD H,(IY+CHOFFST)
LD L,#00
; JP NEWSMP
FXA OR A
RET Z
LD L,A
LD A,(IY+CHVOL)
LD H,A
LD A,L
AND #F0
JR Z,FXA_1
RRCA
RRCA
RRCA
RRCA
ADD A,H
CP #40
JR C,FXA_2
LD A,#40
JP FXA_2
FXA_1 LD A,H
SUB L
JR NC,FXA_2
LD A,#00
LD (IY+CHCOM),A
LD (IY+CHPARM),A
FXA_2 LD (IY+CHVOL),A
CP (IY+CHMVOL)
LD (IY+CHMVOL),A
RET Z
SET 0,(IY+CHSTAT)
RET
FXB DEC A
LD (MTSNGPS),A
XOR A
LD (MTBRKPS),A
INC A
LD (MTJMPFL),A
RET
FXC CP #40
JR C,FXC_1
LD A,#40
FXC_1 LD (IY+CHVOL),A
CP (IY+CHMVOL)
LD (IY+CHMVOL),A
RET Z
SET 0,(IY+CHSTAT)
RET
FXD LD L,A
AND #F0
RRCA
LD H,A
RRCA
RRCA
ADD A,H
LD H,A
LD A,L
AND #0F
ADD A,H
CP #40
JR C,FXD_1
XOR A
FXD_1 LD (MTBRKPS),A
LD A,#01
LD (MTJMPFL),A
RET
FXF OR A
JR Z,FXF_5
CP #20
JR NC,FXF_1
FXF_0 LD (MTSPEED),A
RET
FXF_1 LD (MTBPM),A
SUB #20
LD HL,BPMTAB
ADD A,A
JR NC,FXF_3
INC H
FXF_3 ADD A,L
LD L,A
JR NC,FXF_4
INC H
FXF_4 LD A,(HL)
INC HL
LD H,(HL)
LD L,A
LD (TICKLEN),HL
LD (TCKLEFT),HL
RET
FXF_5 LD HL,MTSTAT
SET 7,(HL)
RET
FXE0 AND #01
LD (MTFILTR),A
RET
FXE3 RES 2,(IY+CHFLAGS)
OR A
RET Z
SET 2,(IY+CHFLAGS)
RET
FXE4 RES 1,(IY+CHFLAGS)
BIT 2,A
JR Z,FXE4_2
SET 1,(IY+CHFLAGS)
FXE4_2 AND #03
LD L,A
LD A,(IY+CHVIBPS)
AND #FC
OR L
LD (IY+CHVIBPS),A
RET
FXE5 ADD A,A
LD (IY+CHFINE),A
RET
FXE6 OR A
JR Z,FXE6_3
INC (IY+CHLPCNT)
DEC (IY+CHLPCNT)
JR Z,FXE6_2
DEC (IY+CHLPCNT)
RET Z
FXE6_1 LD A,(IY+CHPATPS)
LD (MTBRKPS),A
LD A,#01
LD (MTBRKFL),A
RET
FXE6_2 LD (IY+CHLPCNT),A
JP FXE6_1
FXE6_3 LD A,(MTPATPS)
LD (IY+CHPATPS),A
RET
FXE7 RES 0,(IY+CHFLAGS)
BIT 2,A
JR Z,FXE7_2
SET 0,(IY+CHFLAGS)
FXE7_2 AND #03
LD L,A
LD A,(IY+CHTRMPS)
AND #FC
OR L
LD (IY+CHTRMPS),A
RET
FXE9 OR A
RET Z
LD L,A
LD A,(MTCOUNT)
FXE9_1 SUB L
JR NC,FXE9_1
ADD A,L
RET NZ
CALL GETSMP
RET
FXEA RLCA
RLCA
RLCA
RLCA
JP FXA
FXEC LD HL,MTCOUNT
CP (HL)
RET NZ
XOR A
LD (IY+CHVOL),A
CP (IY+CHMVOL)
LD (IY+CHMVOL),A
RET Z
SET 0,(IY+CHSTAT)
RET
FXED LD HL,MTCOUNT
CP (HL)
RET NZ
CALL GETSMP
RET
FXEE LD HL,MTPDT2
INC (HL)
DEC (HL)
RET NZ
INC A
LD (MTPDT),A
RET

View File

@ -0,0 +1,243 @@
GEN LD A,(QTFREE)
ADD A,high DAC0
ADD A,(IY+CHRDN)
LD D,A
LD A,(SGENOFF)
LD E,A
LD A,(CHANNEL)
OR (IY+CHRDR)
LD (CHANNEL),A
GEN_ LD L,(IY+CHCURL)
LD H,(IY+CHCURH)
LD B,(IY+CHCNTL)
GENLP EXX
LD H,high RAMPG
LD L,(IY+CHCURP)
LD D,(IY+CHCNTH)
LD E,(IY+CHFRQH)
LD B,(HL)
LD A,B
LD (CPAGE),A
OUT (PAGE),A
LD A,L
EXX
CP (IY+CHENDP)
JP C,GENTP
PUSH DE
EX DE,HL
LD L,(IY+CHENDL)
LD H,(IY+CHENDH)
DEC HL
SBC HL,DE
INC HL
EX DE,HL
LD LX,E
LD A,D
POP DE
JR C,GENCHK
OR A
JR Z,GENENT
LD LX,#FF
JP GENENT
GENCHK RES 7,(IY+CHSTAT)
LD A,(IY+CHLPBP)
INC A
JP Z,GENCHK2
DEC A
LD (IY+CHCURP),A
LD L,(IY+CHLPBL)
LD H,(IY+CHLPBH)
LD A,(IY+CHLPEP)
LD (IY+CHENDP),A
LD A,(IY+CHLPEL)
LD (IY+CHENDL),A
LD A,(IY+CHLPEH)
LD (IY+CHENDH),A
; LD (IY+CHCNTL),#00
; LD (IY+CHCNTH),#00
SET 7,(IY+CHSTAT)
JP GENLP
GENCHK2 LD (IY+CHREAL),#7F
BIT 6,(IY+CHSTAT)
JP Z,GENZERO
PUSH IY
PUSH DE
LD IY,CHANS
LD B,#08
LD DE,CHANLEN
GENCHK3 SET 0,(IY+CHSTAT)
ADD IY,DE
DJNZ GENCHK3
POP DE
POP IY
JP GENZERO
GENTP LD LX,#FF
LD A,H
INC A
JP M,GENENT
OR L
JR Z,GENENT
NEG
LD LX,A
GENENT LD C,(IY+CHFRQL)
LD A,(IY+CHOLDV)
PUSH IY
CALL #2030
POP IY
LD (IY+CHOLDV),A
LD (IY+CHCNTH),C
LD A,H
OR A
JP M,GENJ2
LD H,#80
INC (IY+CHCURP)
GENJ2 LD A,E
OR A
JP Z,GENRET
BIT 7,(IY+CHSTAT)
JP NZ,GENLP
JP GENZERO
GENRET LD (IY+CHCURL),L
LD (IY+CHCURH),H
LD (IY+CHCNTL),B
JP GENEXT
GENZERO LD A,E
CP #FF
JR NC,GENZENT
LD B,(IY+CHOLDV)
LD C,#80
CP #FD
JR NC,GENZ_1
CP #F9
JR NC,GENZ_2
LD A,C
ADD A,B
RRA
LD H,A
ADD A,B
RRA
LD L,A
ADD A,B
RRA
LD (DE),A
INC E
LD A,L
LD (DE),A
INC E
ADD A,H
RRA
LD (DE),A
INC E
LD A,H
LD (DE),A
INC E
ADD A,C
RRA
LD L,A
ADD A,H
RRA
LD (DE),A
INC E
LD A,L
LD (DE),A
INC E
ADD A,C
RRA
LD (DE),A
INC E
JP GENZENT
GENZ_2 LD A,C
ADD A,B
RRA
LD H,A
ADD A,B
RRA
LD (DE),A
INC E
LD A,H
LD (DE),A
INC E
ADD A,C
RRA
LD (DE),A
INC E
JP GENZENT
GENZ_1 LD A,B
ADD A,C
RRA
LD (DE),A
INC E
GENZENT LD A,#80
BIT 0,E
JR Z,GENZJP1
LD (DE),A
INC E
JR Z,GENZEXT
GENZJP1 BIT 1,E
JR Z,GENZJP2
LD (DE),A
INC E
LD (DE),A
INC E
JR Z,GENZEXT
GENZJP2 BIT 2,E
JR Z,GENZLP
LD (DE),A
INC E
LD (DE),A
INC E
LD (DE),A
INC E
LD (DE),A
INC E
JR Z,GENZEXT
GENZLP LD (DE),A
INC E
LD (DE),A
INC E
LD (DE),A
INC E
LD (DE),A
INC E
LD (DE),A
INC E
LD (DE),A
INC E
LD (DE),A
INC E
LD (DE),A
INC E
JP NZ,GENZLP
GENZEXT LD A,(QTFREE)
ADD A,high DAC0
ADD A,(IY+CHRDN)
LD D,A
LD E,#FF
LD A,#80
LD (DE),A
GENEXT XOR A
LD (CPAGE),A
OUT (PAGE),A
BIT 0,(IY+CHSTAT)
RET Z
JP CALCVOL

View File

@ -0,0 +1,277 @@
;EX AF,AF'
INITVAR DI
LD A,(ERRCODE)
EX AF,AF'
LD A,(NUMPG)
LD SP,#8000
LD HL,#8080
LD B,#00
INITV00 PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
DJNZ INITV00
LD HL,#0000
LD B,#FE
INITV01 PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
DJNZ INITV01
LD SP,ISTACK
LD (NUMPG),A
EX AF,AF'
LD (ERRCODE),A
LD A,#00
LD (INFO),A
XOR A
LD (ROMPG),A
LD HL,DAC0
LD A,(HL)
INC H
LD A,(HL)
INC H
LD A,(HL)
INC H
LD A,(HL)
LD A,#3F
OUT (VOL0),A
OUT (VOL1),A
OUT (VOL2),A
OUT (VOL3),A
LD HL,CHNVOL
LD DE,CHNVOL+1
LD BC,#0007
LD (HL),#BF
LDIR
LD A,high INTTAB
LD I,A
LD HL,INT7
LD DE,#4040
LD BC,#0017
LDIR
EX DE,HL
LD (HL),#C3
INC L
LD (HL),low INT7
INC L
LD (HL),high INT7
LD HL,QTMAP
LD (QTFREE),HL
LD (QTBUSY),HL
LD DE,QTMAP+1
LD BC,#001F
LD (HL),B
LDIR
LD HL,VOLTAB
LD DE,VOLTAB+1
LD BC,#001F
LD (HL),#3F
LDIR
LD HL,VOLRQTB
LD DE,VOLRQTB+1
LD BC,#0007
LD (HL),#3F
LDIR
LD A,#0F
LD (GSCHNS),A
LD (MTCHNS),A
LD A,#40
LD (MODVOL),A
LD (FXMVOL),A
LD (FXVOL),A
LD A,%11000011
LD (MTSTAT),A
XOR A
LD (MODULE),A
LD A,(NUMPG)
SRL A
LD B,A
LD HL,#8000
RR H
LD A,B
LD (RAMTOP),HL
LD (RAMTOP+2),A
LD (PTRC),HL
LD (PTRC+2),A
LD (PTRB),HL
LD (PTRB+2),A
LD (PTRA),HL
LD (PTRA+2),A
LD (PTR9),HL
LD (PTR9+2),A
LD (PTR8),HL
LD (PTR8+2),A
LD (PTR7),HL
LD (PTR7+2),A
LD (PTR6),HL
LD (PTR6+2),A
LD (PTR5),HL
LD (PTR5+2),A
LD (MEMTOP),HL
LD (MEMTOP+2),A
LD (PTR4),HL
LD (PTR4+2),A
LD IY,CHANSFX
LD (CURCHAN),IY
LD BC,#0801
LD DE,CHANLEN
INITV03 LD (IY+CHSTAT),#40
LD (IY+CHRDR),C
LD (IY+CHRDRI),C
LD A,#08
SUB B
LD (IY+CHRDN),A
AND #02
JR Z,INITV05
SET 5,(IY+CHSTAT)
INITV05 LD (IY+CHFLAGS),#00
LD (IY+CHPORT),#01
LD (IY+CHVIBCM),#11
LD (IY+CHTRMCM),#11
LD (IY+CHOFFST),#01
LD (IY+CHWNT),#7F
LD (IY+CHOLDV),#80
LD (IY+CHEPAN),#20
LD (IY+CHEVOL),#40
RLC C
ADD IY,DE
DJNZ INITV03
LD IY,CHANS
LD B,#08
INITV04 LD (IY+CHSTAT),#00
LD (IY+CHFLAGS),#00
LD (IY+CHPORT),#01
LD (IY+CHVIBCM),#11
LD (IY+CHTRMCM),#11
LD (IY+CHOFFST),#01
LD (IY+CHWNT),#7F
LD (IY+CHOLDV),#80
LD (IY+CHEPAN),#20
LD (IY+CHEVOL),#40
ADD IY,DE
DJNZ INITV04
LD IY,CHANS
LD (IY+CHSTAT),#00
LD (IY+CHRDR),#01
LD (IY+CHRDRI),#01
LD (IY+CHRDN),#00
ADD IY,DE
LD (IY+CHSTAT),#20
LD (IY+CHRDR),#04
LD (IY+CHRDRI),#04
LD (IY+CHRDN),#02
ADD IY,DE
LD (IY+CHSTAT),#20
LD (IY+CHRDR),#08
LD (IY+CHRDRI),#08
LD (IY+CHRDN),#03
ADD IY,DE
LD (IY+CHSTAT),#00
LD (IY+CHRDR),#02
LD (IY+CHRDRI),#02
LD (IY+CHRDN),#01
LD HL,750
LD (TICKLEN),HL
LD (TCKLEFT),HL
LD (FXTICK),HL
LD (FXTCLEN),HL
LD HX,#80
LD DE,#0000
IN A,(DATRG)
JP COMINT
; B - NUMBER OF CHANNELS
INITCHN LD HL,(#EC60)
LD (IY+CHPERL),L ; C-4
LD (IY+CHPERH),H
LD HL,(#E060)
LD (IY+CHFRQL),L
LD (IY+CHFRQH),H
LD (IY+CHNOTE),48
LD (IY+CHFLAGS),#00
LD (IY+CHREAL),#7F
LD (IY+CHCNTL),#00
LD (IY+CHCNTH),#00
LD (IY+CHINS),#00
LD (IY+CHSMP),#00
LD (IY+CHCOM),#00
LD (IY+CHPARM),#00
LD (IY+CHVIBPS),#00
LD (IY+CHTRMPS),#00
LD (IY+CHPATPS),#00
LD (IY+CHLPCNT),#00
LD A,B
LD BC,CHANLEN
ADD IY,BC
LD B,A
DJNZ INITCHN
RET

View File

@ -0,0 +1,219 @@
INIT DI
OUT (RSCOM),A
INIT_ XOR A
OUT (OUTRG),A
LD L,A
LD H,A
LD BC,#0004
LD SP,#0008
JR INIT02
INIT00 OUT (PAGE),A
LD SP,#C000
LD C,#04
DEC A
INIT01 POP DE
ADD HL,DE
POP DE
ADD HL,DE
POP DE
ADD HL,DE
POP DE
ADD HL,DE
INIT02 POP DE
ADD HL,DE
POP DE
ADD HL,DE
POP DE
ADD HL,DE
POP DE
ADD HL,DE
DJNZ INIT01
DEC C
JR NZ,INIT01
OR A
JR Z,INIT00
LD DE,(ROMCRC)
SBC HL,DE
; JR NZ,INIT_
INIT03
LD HL,RAMPG
LD DE,RAMPG+1
LD BC,#003F
LD (HL),B
LDIR
XOR A
LD (#7FFF),A
OUT (PAGE),A
EXX
LD A,(#8000)
LD D,A
LD A,(#FFFF)
LD E,A
EXX
LD HL,#8000
LD DE,#FFFF
LD BC,#3FAA
INITR01 LD A,B
OUT (PAGE),A
LD (HL),C
LD (DE),A
DJNZ INITR01
XOR A
OUT (PAGE),A
EXX
LD A,D
LD (#8000),A
LD A,E
LD (#FFFF),A
EXX
LD A,(#7FFF)
LD LX,A
LD A,#C0
LD (#7FFF),A
LD HL,#FFFF
LD DE,RAMPG
LD B,#3F
INITR02 LD A,#40
SUB B
OUT (PAGE),A
CP (HL)
JR NZ,INITR05
LD (DE),A
LD A,(#8000)
CP #AA
JR Z,INITR06
INITR04 XOR A
LD (HL),A
LD (#8000),A
INITR05 DJNZ INITR02
JP INITR0E
INITR06 LD A,#01
LD (HL),A
INITR07 CP (HL)
JR NZ,INITR04
RLC (HL)
RLCA
JR NC,INITR07
LD A,#FE
LD (HL),A
INITR08 CP (HL)
JR NZ,INITR04
RLC (HL)
RLCA
JR C,INITR08
INITR08e
EXX
LD HL,#8000
LD C,#AA
INITR09 LD A,C
XOR H
INITR0A XOR L
LD (HL),A
XOR L
INC L
XOR L
LD (HL),A
XOR L
INC L
XOR L
LD (HL),A
XOR L
INC L
XOR L
LD (HL),A
XOR L
INC L
JP NZ,INITR0A
INC H
JP NZ,INITR09
LD H,#80
INITR0B LD A,C
XOR H
XOR L
XOR (HL)
JR NZ,INITR0D
INC L
LD A,C
XOR H
XOR L
XOR (HL)
JR NZ,INITR0D
INC L
LD A,C
XOR H
XOR L
XOR (HL)
JR NZ,INITR0D
INC L
LD A,C
XOR H
XOR L
XOR (HL)
JR NZ,INITR0D
INC L
JP NZ,INITR0B
INC H
JP NZ,INITR0B
LD HL,#0000
LD SP,HL
LD BC,#0008
INIT0C PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
PUSH HL
DJNZ INIT0C
DEC C
JP NZ,INIT0C
EXX
INIT0Ce INC E
EXX
INITR0D EXX
DEC B
JP NZ,INITR02
INITR0E LD A,E
LD (NUMPG),A
OUT (OUTRG),A
LD A,LX
LD (DE),A
XOR A
OUT (PAGE),A
JP INITVAR

View File

@ -0,0 +1,377 @@
;***********************************************************
;* INTERRUPT HANDLING PROCEDURES *
;***********************************************************
; UNPHASE
; ORG $+#00FF&#FF00
; PHASE $-GSRomBase
align 256
INTZ RET
INT0 EX AF,AF'
INC A
JR Z,INT0_
EX AF,AF'
EI
RET
DEFS 11
RET
INT0_ PUSH DE
JP QTDONE
INT1 EX AF,AF'
PUSH DE
LD E,A
LD D,HX
LD A,(DE)
INC E
JR Z,INT1_
LD A,E
POP DE
EX AF,AF'
EI
RET
DEFS 4
RET
PUSH DE
INT1_ JP QTDONE
INT2 EX AF,AF'
PUSH DE
LD E,A
LD D,HX
LD A,(DE)
INC D
LD A,(DE)
INC E
JR Z,INT2_
LD A,E
POP DE
EX AF,AF'
EI
RET
DEFS 2
RET
PUSH DE
INT2_ JP QTDONE
INT3 EX AF,AF'
PUSH DE
LD E,A
LD D,HX
LD A,(DE)
INC D
INC D
LD A,(DE)
INC E
JR Z,INT3_
LD A,E
POP DE
EX AF,AF'
EI
RET
DEFS 1
RET
PUSH DE
INT3_ JP QTDONE
INT4 EX AF,AF'
PUSH DE
LD E,A
LD D,HX
LD A,(DE)
INC D
LD A,(DE)
INC D
LD A,(DE)
INC E
JR Z,INT4_
LD A,E
POP DE
EX AF,AF'
EI
RET
RET
PUSH DE
INT4_ JP QTDONE
INT5 EX AF,AF'
PUSH DE
LD E,A
LD D,HX
LD A,(DE)
INC D
INC D
INC D
LD A,(DE)
INC E
JR Z,INT5_
LD A,E
POP DE
EX AF,AF'
EI
RET
RET
PUSH DE
INT5_ JP QTDONE
INT6 EX AF,AF'
PUSH DE
LD E,A
LD D,HX
LD A,(DE)
INC D
LD A,(DE)
INC D
INC D
LD A,(DE)
INC E
JR Z,INT6_
LD A,E
POP DE
EX AF,AF'
EI
RET
PUSH DE
INT6_ JP QTDONE
INT7 EX AF,AF'
PUSH DE
LD E,A
LD D,HX
LD A,(DE)
INC D
INC D
LD A,(DE)
INC D
LD A,(DE)
INC E
JR Z,INT7_
LD A,E
POP DE
EX AF,AF'
EI
RET
PUSH DE
INT7_ JP QTDONE
QTFAULT LD DE,(QTBUSY)
LD (DE),A
LD (PLAYING),A
POP DE
EX AF,AF'
RET
INT_IM1 IM 1
EI
EX DE,HL
LD HL,(QTBUSY)
LD (HL),A
LD A,L
ADD A,#04
AND #1C
LD L,A
LD (QTBUSY),HL
SET 5,L
LD A,(HL)
OUT (VOL0),A
INC L
LD A,(HL)
OUT (VOL1),A
INC L
LD A,(HL)
OUT (VOL2),A
INC L
LD A,(HL)
OUT (VOL3),A
POP AF
POP HL
EX DE,HL
RET
QTDONE LD A,(QTBUSY)
ADD A,#04
AND #1C
LD E,A
LD D,high QTMAP
LD A,(DE)
OR A
JR Z,QTFAULT
EX AF,AF'
PUSH AF
INC E
LD A,(DE)
LD HX,A
INC E
LD A,(DE)
OR A
JR Z,INT_IM1
IM 2
EX DE,HL
LD HL,#4058
CP (HL)
JR Z,INT_I1
LD (HL),A
LD HL,#1518
LD (#4040),HL
EI
DEC A
JR Z,INT_I0
ADD A,#03
LD L,A
LD H,high INT0
PUSH DE
PUSH BC
LD DE,#4042
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LD HL,#D508
LD (#4040),HL
POP BC
POP DE
LD HL,(QTBUSY)
LD (HL),#00
LD A,L
ADD A,#04
AND #1C
LD L,A
LD (QTBUSY),HL
SET 5,L
LD A,(HL)
OUT (VOL0),A
INC L
LD A,(HL)
OUT (VOL1),A
INC L
LD A,(HL)
OUT (VOL2),A
INC L
LD A,(HL)
OUT (VOL3),A
POP AF
POP HL
EX DE,HL
RET
INT_I1 EI
LD A,#04
LD HL,(QTBUSY)
LD (HL),#00
ADD A,L
AND #1C
LD L,A
LD (QTBUSY),HL
SET 5,L
LD A,(HL)
OUT (VOL0),A
INC L
LD A,(HL)
OUT (VOL1),A
INC L
LD A,(HL)
OUT (VOL2),A
INC L
LD A,(HL)
OUT (VOL3),A
POP AF
POP HL
EX DE,HL
RET
INT_I0 LD HL,INT0+2
PUSH DE
PUSH BC
LD DE,#4042
LDI
LDI
LDI
LDI
LDI
LD HL,#3C08
LD (#4040),HL
POP BC
POP DE
LD HL,(QTBUSY)
LD (HL),A
LD A,L
ADD A,#04
AND #1C
LD L,A
LD (QTBUSY),HL
SET 5,L
LD A,(HL)
OUT (VOL0),A
INC L
LD A,(HL)
OUT (VOL1),A
INC L
LD A,(HL)
OUT (VOL2),A
INC L
LD A,(HL)
OUT (VOL3),A
POP AF
POP HL
EX DE,HL
RET
QTPLAY DI
LD A,#FF
LD (PLAYING),A
LD HL,(QTBUSY)
LD A,(HL)
EX AF,AF'
INC L
LD A,(HL)
LD HX,A
INC L
LD A,(HL)
IM 1
OR A
JR Z,QTPLAY_
IM 2
LD HL,#4058
CP (HL)
JR Z,QTPLAY_
LD (HL),A
LD L,A
LD H,high INT0
LD DE,#4040
LD BC,#0012
LDIR
QTPLAY_ LD HL,(QTBUSY)
SET 5,L
LD A,(HL)
OUT (VOL0),A
INC L
LD A,(HL)
OUT (VOL1),A
INC L
LD A,(HL)
OUT (VOL2),A
INC L
LD A,(HL)
OUT (VOL3),A
EI
RET

View File

@ -0,0 +1,120 @@
; RET B,DE - OLD CURADR
LOAD LD B,#81
LD HL,(CURADR)
LD A,(CURADR+2)
SCF
RL H
RLA
RRC H
LD E,A
LD D,high RAMPG
LOAD_ LD A,(DE)
OR A
JP Z,LOADWT3
LD (CPAGE),A
OUT (PAGE),A
LD A,(NUMPG)
CP E
JR NZ,LOADWT
LD A,H
CP #C0
JR C,LOADWT2
JP LOADWT3
LOADWT IN A,(FLAGS)
AND B
JR Z,LOADWT
RRCA
IN A,(DATRG)
JR C,LOADCM
ADD A,C
LD (HL),A
INC L
JP NZ,LOADWT
INC H
JP NZ,LOADWT
INC E
LD HL,#8000
JP LOAD_
LOADCM IN A,(COMRG)
CP #F3
JP Z,COMF3
CP #F4
JP Z,COMF4
OUT (RSCOM),A
CP #D2
JP Z,LOAD3
JP LOADWT
LOADWT2 IN A,(FLAGS)
AND B
JR Z,LOADWT2
RRCA
IN A,(DATRG)
JR C,LOADCM2
LD (HL),A
INC L
JP NZ,LOADWT2
INC H
BIT 6,H
JP Z,LOADWT2
LOADWT3 IN A,(FLAGS)
AND B
JR Z,LOADWT3
RRCA
IN A,(DATRG)
JP NC,LOADWT3
IN A,(COMRG)
CP #F3
JP Z,COMF3
CP #F4
JP Z,COMF4
OUT (RSCOM),A
CP #D2
JR Z,LOAD3
JP LOADWT3
LOADCM2 IN A,(COMRG)
CP #F3
JP Z,COMF3
CP #F4
JP Z,COMF4
OUT (RSCOM),A
CP #D2
JR Z,LOAD3
JP LOADWT2
LOAD3 LD A,E
RL H
SRL A
RR H
LD (CURADR),HL
LD (CURADR+2),A
LD (MEMBOT),HL
LD (MEMBOT+2),A
LD E,A
XOR A
LD (CPAGE),A
OUT (PAGE),A
LD A,E
RET

View File

@ -0,0 +1,392 @@
;MEMORY MOVEMENT MODULE - HIGH PART
;PROCEDURE: MOVE MEMORY
;INPUT : B ,HL - SOURCE START LOGICAL ADRESS
; C ,DE - SOURCE END LOGICAL ADRESS
; B',HL' - DESTINATION LOGICAL ADRESS
;OUTPUT : C ,DE = DEST-START
;USES : TYPE 1 REGS,RAMPG,CPAGE,BUFFER,SYSTEM
;EFFECT : MOVES MEMORY REGION {START,END-1} TO DEST
; ALL ADRESSES IS LOGICAL
MOVMEM XOR A
LD (SYSTEM),A
PUSH HL
LD A,B
EXX
POP DE
PUSH HL
PUSH BC
LD C,A
OR A
SBC HL,DE
LD A,B
SBC A,C
EX DE,HL
POP BC
POP HL
LD C,A
OR E
OR D
RET Z
EXX
EX DE,HL
SBC HL,DE
LD A,C
SBC A,B
LD LX,A
OR L
OR H
EXX
RET Z
PUSH DE
PUSH BC
BIT 7,C
LD A,B
EXX
JR NZ,MOVL
CP C
JP C,MOVH
JR NZ,MOVL
EXX
LD A,H
EXX
CP D
JP C,MOVH
JR NZ,MOVL
EXX
LD A,L
EXX
CP E
JP C,MOVH
MOVL SLI D
RL B
RRC D
PUSH DE
EXX
EX DE,HL
POP HL
SLI D
RL B
RRC D
LD A,B
LD BC,#0000
EXX
LD C,A
ML1 EXX
LD A,H
CP D
JR C,ML3
JR NZ,ML2
LD A,L
CP E
JR C,ML3
ML2 LD A,C
SUB L
LD C,A
LD A,B
SBC A,H
JR ML4
ML3 LD A,C
SUB E
LD C,A
LD A,B
SBC A,D
ML4 LD B,A
LD A,LX
OR A
JR NZ,ML6
LD A,B
EXX
CP H
JR C,ML7
JR NZ,ML5
EXX
LD A,C
EXX
CP L
JR C,ML7
ML5 PUSH HL
EXX
POP BC
ML6 EXX
ML7 LD D,high RAMPG
LD A,B
CP C
JR NZ,ML9
LD E,B
LD A,(DE)
LD (SDPAGE),A
EXX
PUSH BC
ML8 LD A,C
CALL MLDI
JP PE,ML8
JR MLD
ML9 EXX
PUSH BC
MLA PUSH BC
PUSH DE
EXX
LD E,B
LD A,(DE)
LD (SDPAGE),A
EXX
LD DE,BUFFER
LD A,C
CALL MLDI
POP DE
POP BC
PUSH HL
EXX
LD E,C
LD A,(DE)
LD (SDPAGE),A
EXX
LD HL,BUFFER
LD A,C
CALL MLDI
POP HL
JP PE,MLA
MLD BIT 7,H
JR NZ,MLB
SET 7,H
EXX
INC B
JP MLC
MLB SET 7,D
EXX
INC C
MLC POP DE
OR A
SBC HL,DE
LD A,LX
SBC A,#00
LD LX,A
OR L
OR H
JP NZ,ML1
POP BC
POP DE
RET
MOVH LD A,L
OR H
JR NZ,MH0
DEC LX
MH0 DEC HL
EX DE,HL
ADD HL,DE
LD A,B
ADC A,LX
SLI H
RLA
RRC H
LD B,A
PUSH HL
PUSH DE
INC DE
LD A,E
OR D
LD A,LX
JR NZ,MHF
INC LX
MHF EX DE,HL
EXX
POP DE
ADD HL,DE
ADC A,B
SLI H
RLA
RRC H
EX DE,HL
POP HL
EXX
LD C,A
MH1 EXX
LD A,H
CP D
JR C,MH3
JR NZ,MH2
LD A,L
CP E
JR C,MH3
MH2 LD C,E
LD B,D
JR MH4
MH3 LD C,L
LD B,H
MH4 RES 7,B
INC BC
LD A,LX
OR A
JR NZ,MH6
LD A,B
EXX
CP H
JR C,MH7
JR NZ,MH5
EXX
LD A,C
EXX
CP L
JR C,MH7
MH5 PUSH HL
EXX
POP BC
MH6 EXX
MH7 LD D,high RAMPG
LD A,B
CP C
JR NZ,MH9
LD E,B
LD A,(DE)
LD (SDPAGE),A
EXX
PUSH BC
MH8 LD A,C
CALL MLDD
JP PE,MH8
JR MHD
MH9 EXX
PUSH BC
MHA PUSH BC
PUSH DE
EXX
LD E,B
LD A,(DE)
LD (SDPAGE),A
EXX
LD DE,BUFFER+#00FF
LD A,C
CALL MLDD
POP DE
POP BC
PUSH HL
EXX
LD E,C
LD A,(DE)
LD (SDPAGE),A
EXX
LD HL,BUFFER+#00FF
LD A,C
CALL MLDD
POP HL
JP PE,MHA
MHD BIT 7,H
JR NZ,MHB
SET 7,H
EXX
DEC B
JP MHC
MHB SET 7,D
EXX
DEC C
MHC POP DE
OR A
SBC HL,DE
LD A,LX
SBC A,#00
LD LX,A
OR L
OR H
JP NZ,MH1
POP BC
POP DE
RET
;PROCEDURE: LOAD MEMORY BLOCK
;INPUT : A,HL - SOURCE LOGICAL ADRESS
; DE - DESTINATION PHISICAL ADRESS (LOW RAM)
; BC - BLOCK LENGTH
;USES : TYPE 2 REGS,RAMPG,CPAGE,SYSTEM
;EFFECT : MOVES MEMORY BLOCK FROM HIGH MEMORY TO LOW
; SWITCH TO PAGE 0
LDMEM SLI H
RLA
RRC H
LM1 LD LX,A
PUSH HL
LD L,A
LD H,high RAMPG
LD A,(HL)
POP HL
LD (SDPAGE),A
ADD HL,BC
JR NC,LM2
JR NZ,LM4
LM2 SBC HL,BC
LM3 LD A,C
CALL MLDI
JP PE,LM3
RET
LM4 XOR A
SBC HL,BC
LM5 LD A,L
NEG
CALL MLDI
BIT 7,H
JP NZ,LM5
SET 7,H
LD A,LX
INC A
JP LM1
;PROCEDURE: SAVE MEMORY BLOCK
;INPUT : A,DE - DESTINATION LOGICAL ADRESS
; HL - SOURCE PHISICAL ADRESS (LOW RAM)
; BC - BLOCK LENGTH
;USES : TYPE 2 REGS,RAMPG,CPAGE,SYSTEM
;EFFECT : MOVES MEMORY BLOCK FROM LOW MEMORY TO HIGH
; SWITCH TO PAGE 0
SVMEM SLI D
RLA
RRC D
SM1 LD LX,A
PUSH HL
LD L,A
LD H,high RAMPG
LD A,(HL)
POP HL
LD (SDPAGE),A
EX DE,HL
ADD HL,BC
JR NC,SM2
JR NZ,SM4
SM2 SBC HL,BC
EX DE,HL
SM3 LD A,C
CALL MLDI
JP PE,SM3
RET
SM4 XOR A
SBC HL,BC
EX DE,HL
SM5 LD A,E
NEG
CALL MLDI
BIT 7,D
JP NZ,SM5
SET 7,D
LD A,LX
INC A
JP SM1

View File

@ -0,0 +1,58 @@
;MEMORY MOVEMENT MODULE - LOW PART
; UNPHASE
; ORG $+#00FF&#FF00
; PHASE $-GSRomBase
align 256
LDITAB DUP #100:DB #ED,#A0:EDUP
RET C
LD A,(SYSTEM)
LD (CPAGE),A
OUT (PAGE),A
RET
MLDI NEG
ADD A,A
LD LY,A
LD A,high LDITAB
ADC A,#00
LD HY,A
LD A,(SDPAGE)
LD (CPAGE),A
OUT (PAGE),A
JP (IY)
TLDI NEG
ADD A,A
LD LY,A
LD A,high LDITAB
ADC A,#00
LD HY,A
SCF
JP (IY)
MLDD NEG
ADD A,A
LD LY,A
LD A,high LDDTAB
ADC A,#00
LD HY,A
LD A,(SDPAGE)
LD (CPAGE),A
OUT (PAGE),A
JP (IY)
; UNPHASE
; ORG $+#00FF&#FF00
; PHASE $-GSRomBase
align 256
LDDTAB DUP #100:DB #ED,#A8:EDUP
LD A,(SYSTEM)
LD (CPAGE),A
OUT (PAGE),A
RET

View File

@ -0,0 +1,346 @@
PLAYMD LD A,(RAMPG)
OUT (PAGE),A
LD IY,CHANS
LD DE,CHANLEN
LD B,#04
RDLP1 LD (IY+CHCNTL),#00
LD (IY+CHCNTH),#00
LD (IY+CHOLDV),#80
LD (IY+CHSTAT),#01
LD (IY+CHLPCNT),#00
LD (IY+CHPATPS),#00
LD (IY+CHTRMPS),#00
LD (IY+CHVIBPS),#00
LD (IY+CHVOL),#40
LD (IY+CHMVOL),#40
LD (IY+CHINS),#00
LD (IY+CHSMP),#00
LD (IY+CHPAN),#80
LD (IY+CHEPAN),#20
LD (IY+CHEVOL),#40
LD (IY+CHFADVL),#FF
LD (IY+CHFADVH),#FF
ADD IY,DE
DJNZ RDLP1
LD LX,#FF
LD A,(#8000+1080)
CP "M"
JR Z,TTY1
CP "4"
JR Z,TTY1
CP "F"
JR Z,TTY1
LD LX,#00
JP TTY0
TTY1 LD A,(#8000+1081)
CP "."
JR Z,TTY2
CP "L"
JR Z,TTY2
CP "!"
JR Z,TTY2
CP "C"
JR Z,TTY2
LD LX,#00
JP TTY0
TTY2 LD A,(#8000+1082)
CP "K"
JR Z,TTY0
CP "T"
JR Z,TTY0
CP "H"
JR Z,TTY0
LD LX,#00
TTY0 LD A,LX
LD (MODTP),A
LD HL,#8000+952
OR A
JR NZ,TTT10
LD HL,#8000+472
TTT10 LD B,#80
XOR A
FDF2 CP (HL)
JR NC,FDF
LD A,(HL)
FDF INC HL
DJNZ FDF2
INC A
LD (PATTS),A
ADD A,A
ADD A,A
INC LX
DEC LX
LD HL,#8000+1084
JR NZ,TTT12
LD HL,#8000+600
TTT12 LD D,A
LD E,0
ADD HL,DE
SET 7,H
LD A,E
ADC A,#00
LD E,A
LD (SMPS),HL
LD (SMPS+2),A
LD A,LX
OR A
LD BC,#8000+950
JR NZ,TTT11
LD BC,#8000+470
TTT11 LD A,(BC)
DEC A
LD (MTSNGSZ),A
INC BC
LD A,(BC)
LD (MTSNGLP),A
LD IX,#5400
LD IY,#8000+20
LD B,31
LD C,E
RDLP3 PUSH BC
LD (IX+SMPBEG),C
LD (IX+SMPBEG+1),L
LD (IX+SMPBEG+2),H
LD A,(IY+28)
OR A
JR NZ,LPL
LD A,(IY+29)
CP #02
JP C,NLPL
LPL PUSH HL
PUSH BC
LD L,(IY+27)
LD H,(IY+26)
LD E,(IY+23)
LD D,(IY+22)
SBC HL,DE
POP BC
POP HL
JP NC,NLPL
PUSH HL
PUSH BC
LD E,(IY+27)
LD D,(IY+26)
EX DE,HL
ADD HL,HL
EX DE,HL
LD B,0
RL B
SRL C
RL H
RRC H
ADD HL,DE
LD A,C
ADC A,B
LD C,A
SLI H
RL C
RRC H
LD (IX+SMPLPB),C
LD (IX+SMPLPB+1),L
LD (IX+SMPLPB+2),H
SRL C
RL H
RRC H
LD E,(IY+29)
LD D,(IY+28)
EX DE,HL
ADD HL,HL
EX DE,HL
LD B,0
RL B
ADD HL,DE
LD A,C
ADC A,B
LD C,A
SLI H
RL C
RRC H
LD (IX+SMPLPE),C
LD (IX+SMPLPE+1),L
LD (IX+SMPLPE+2),H
POP BC
POP HL
LD E,(IY+23)
LD D,(IY+22)
EX DE,HL
ADD HL,HL
EX DE,HL
LD B,#00
RL B
SRL C
RL H
RRC H
ADD HL,DE
LD A,C
ADC A,B
LD C,A
SLI H
RL C
RRC H
JP LPL2
LD A,(IX+SMPLPE)
CP C
JR C,LPL2
JR NZ,LPL1
LD A,(IX+SMPLPE+2)
CP H
JR C,LPL2
JR NZ,LPL1
LD A,(IX+SMPLPE+1)
CP L
JR C,LPL2
LPL1 LD A,(IX+SMPEND)
LD (IX+SMPLPE),A
LD A,(IX+SMPEND+1)
LD (IX+SMPLPE+1),A
LD A,(IX+SMPEND+2)
LD (IX+SMPLPE+2),A
JP LPCNT
LPL2 LD A,(IX+SMPLPE)
LD (IX+SMPEND),A
LD A,(IX+SMPLPE+1)
LD (IX+SMPEND+1),A
LD A,(IX+SMPLPE+2)
LD (IX+SMPEND+2),A
JP LPCNT
NLPL LD (IX+SMPLPB),#FF
LD E,(IY+23)
LD D,(IY+22)
EX DE,HL
ADD HL,HL
EX DE,HL
LD B,#00
RL B
SRL C
RL H
RRC H
ADD HL,DE
LD A,C
ADC A,B
LD C,A
SLI H
RL C
RRC H
RDLP2 LD (IX+SMPEND+1),L
LD (IX+SMPEND+2),H
LD (IX+SMPEND),C
LPCNT LD A,(IY+24)
ADD A,A
LD (IX+SMPFT),A
LD A,(IY+25)
LD (IX+SMPVOL),A
LD DE,#0010
ADD IX,DE
LD DE,30
ADD IY,DE
LD A,C
POP BC
LD C,A
DEC B
JP NZ,RDLP3
; CALL INITPAT
LD HL,CONVERT
LD A,(HL)
OR A
JR NZ,NOCONV
LD (HL),#FF
LD HL,(SMPS)
LD A,(SMPS+2)
LD E,A
LD D,high RAMPG
SMPMD2f LD A,(NUMPG)
SUB E
LD B,A
SMPMD2 LD A,(DE)
OUT (PAGE),A
SMPMD1 LD A,(HL)
ADD A,#80
LD (HL),A
INC L
JP NZ,SMPMD1
INC H
JP NZ,SMPMD1
LD H,#80
INC E
DJNZ SMPMD2
LD A,(DE)
OUT (PAGE),A
OR A
JR Z,SMPMD4
SMPMD3 LD A,(HL)
ADD A,#80
LD (HL),A
INC L
JP NZ,SMPMD3
INC H
BIT 6,H
JP Z,SMPMD3
SMPMD4
; NOCONV CALL EFXGTNT
; CALL QUANTUM
NOCONV XOR A
LD (CPAGE),A
OUT (PAGE),A
RET
INITPAT LD A,(MTSNGPS)
LD E,A
LD D,0
LD A,(MODTP)
INC A
LD HL,#8000+952
JR Z,TTT13
LD HL,#8000+472
TTT13 ADD HL,DE
LD A,(RAMPG)
OUT (PAGE),A
LD A,(HL)
ADD A,A
ADD A,A
LD E,D
LD D,A
LD A,(MODTP)
INC A
LD HL,#0000+1084
JR Z,TTT15
LD HL,#0000+600
TTT15 XOR A
LD (CPAGE),A
OUT (PAGE),A
ADD HL,DE
LD DE,#5000
LD BC,#400
CALL LDMEM
XOR A
OUT (#00),A
RET

View File

@ -0,0 +1,504 @@
;**************************************************************
;* QUANTUM PROCEDURE *
;**************************************************************
QUANTUM LD A,(FXCHNS)
CPL
LD C,A
LD A,(GSCHNS)
AND C
LD C,A
LD IY,CHANS ;CHANNELS
LD A,(MTSTAT)
AND #C0
JR NZ,L221
L204 LD A,C
AND (IY+CHRDR)
JR Z,L205
BIT 7,(IY+CHSTAT)
JR Z,L205
PUSH BC
CALL GEN
POP BC
L205 LD A,LY
ADD A,#40
LD LY,A
JP NC,L204
JP L221
L221 XOR A
LD (CPAGE),A
OUT (PAGE),A
LD HL,VOLRQTB
LD A,(QTFREE)
ADD A,low VOLTAB
LD E,A
LD D,high VOLTAB
LDI
LDI
LDI
LDI
LD HL,(QTFREE)
LD B,L
INC L
PUSH BC
PUSH HL
LD A,(CHANNEL)
AND #0F
LD HL,INTTB
ADD A,A
ADD A,L
LD L,A
LD A,H
ADC A,#00
LD H,A
LD C,(HL)
INC HL
LD B,(HL)
LD A,(CHANNEL)
AND #0F
LD HL,INTOFF
ADD A,L
LD L,A
LD A,H
ADC A,#00
LD H,A
LD A,(QTFREE)
ADD A,#60
ADD A,(HL)
POP HL
LD (HL),A
INC L
LD (HL),C
INC L
LD (HL),B
POP BC
INC L
RES 5,L
LD (QTFREE),HL
LD L,B
LD A,(SGENOFF)
LD (HL),A
LD A,(PLAYING)
OR A
JP NZ,L224
LD (QTBUSY),HL
CALL QTPLAY
L224 LD A,(SGENOFF)
NEG
LD C,A
LD B,0
LD A,(MTSTAT)
AND #C0
RET NZ
LD HL,(TCKLEFT)
OR A
SBC HL,BC
JR Z,EFXINT
LD (TCKLEFT),HL
RET
EFXINT LD A,(MODULE)
OR A
RET Z
LD HL,(TICKLEN)
LD (TCKLEFT),HL
XOR A
LD (CPAGE),A
OUT (PAGE),A
LD IY,CHANS
LD B,#04
LD A,(MTCOUNT)
INC A
LD (MTCOUNT),A
LD HL,MTSPEED
CP (HL)
JR C,EFXNONT ;NO NEW NOTE
XOR A
LD (MTCOUNT),A
LD A,(MTPDT2)
OR A
JR Z,EFXGTNT ;GET NEW NOTE
CALL EFXNONT
JP EFXSKIP
EFXNONT LD IY,CHANS
LD B,#04
EFXNON1 PUSH BC
LD A,(IY+CHCOM)
OR (IY+CHPARM)
JR NZ,EFXNON2
CALL FXNOP
JP EFXNON3
EFXNON2 CALL FXCHK_
EFXNON3 LD BC,CHANLEN
ADD IY,BC
POP BC
DJNZ EFXNON1
RET
EFXNOP LD L,(IY+CHPERL) ;;not used!
LD H,(IY+CHPERL) ;;bug!
CALL EFXCNV
LD (IY+CHFRQL),L
LD (IY+CHFRQH),H
RET
EFXGTNT LD IY,CHANS
XOR A
LD (CPAGE),A
OUT (PAGE),A
LD (CURCHN),A
COMM1 XOR A
LD (CPAGE),A
OUT (PAGE),A
CALL GETROWS
LD (IY+CHCOM),B
LD (IY+CHPARM),C
LD A,E
OR A
JR Z,COMM2
LD (IY+CHINS),E
PUSH DE
PUSH BC
CALL EFXNEWI
POP BC
POP DE
COMM2 LD A,D
CP #7F
JP Z,COMM5
LD A,B
CP #03
JP Z,COMM4
CP #05
JP Z,COMM4
CP #0E
JR NZ,COMM3
LD A,C
AND #F0
CP #50
JR Z,COMM5_
LD (IY+CHNOTE),D
LD (IY+CHREAL),D
CP #D0
JR Z,COMM3__
JP COMM3
COMM5_ LD A,C
AND #0F
SLA A
LD (IY+CHFINE),A
COMM3 LD (IY+CHNOTE),D
LD (IY+CHREAL),D
CALL GETSMP
COMM3__ LD E,(IY+CHNOTE)
CALL GETPER
LD (IY+CHPERL),L
LD (IY+CHPERH),H
LD E,(IY+CHNOTE)
CALL GETFRQ
LD (IY+CHFRQL),L
LD (IY+CHFRQH),H
LD A,(IY+CHCOM)
CP #09
JP NZ,COMM5
LD A,(IY+CHPARM)
OR A
JR NZ,FX9_
LD A,(IY+CHOFFST)
FX9_ LD (IY+CHOFFST),A
LD H,A
LD L,#00
XOR A
ADC A,A
EX DE,HL
LD L,(IY+CHCURL)
LD H,(IY+CHCURH)
LD B,(IY+CHCURP)
RL H
SRL B
RR H
ADD HL,DE
ADC A,B
SLI H
RLA
RRC H
LD (IY+CHCURL),L
LD (IY+CHCURH),H
LD (IY+CHCURP),A
CP (IY+CHENDP)
JP C,COMM5
JR NZ,COMM3_
LD A,H
CP (IY+CHENDH)
JP C,COMM5
JR NZ,COMM3_
LD A,L
CP (IY+CHENDL)
JP C,COMM5
COMM3_ RES 7,(IY+CHSTAT)
JP COMM5
COMM4 LD (IY+CHWNT),D
COMM5 XOR A
LD (CPAGE),A
OUT (PAGE),A
CALL FXCHK
COMM6 LD BC,CHANLEN
ADD IY,BC
LD A,(CURCHN)
INC A
LD (CURCHN),A
CP #04
JP NZ,COMM1
EFXSKIP LD HL,MTPATPS
INC (HL)
LD A,(MTPDT)
OR A
JR Z,EFXSKP2
LD (MTPDT2),A
XOR A
LD (MTPDT),A
EFXSKP2 LD A,(MTPDT2)
OR A
JR Z,EFXSKP3
DEC A
LD (MTPDT2),A
JR Z,EFXSKP3
DEC (HL)
EFXSKP3 LD A,(MTBRKFL)
OR A
JR Z,EFXSKP4
LD A,(MTBRKPS)
LD (HL),A
XOR A
LD (MTBRKPS),A
LD (MTBRKFL),A
JP EFXSKP5
EFXSKP4 LD A,(HL)
OR A
JR NZ,EFXSKP5
LD A,(MTPDT2)
OR A
JR Z,EFXSKP6
EFXSKP5 LD A,(MTROWS)
CP (HL)
JR NC,EFXSKPX
EFXSKP6 LD A,(MTBRKPS)
LD (MTPATPS),A
XOR A
LD (MTBRKPS),A
LD (MTJMPFL),A
LD HL,MTSNGPS
INC (HL)
JR Z,EFXSKP7
LD A,(MTSNGSZ)
CP (HL)
JP NC,INITPAT
EFXSKP7 LD A,(MTSNGSZ)
LD HL,MTSNGLP
CP (HL)
LD A,#00
JR C,EFXSKP8
LD A,(HL)
EFXSKP8 LD (MTSNGPS),A
LD A,6
LD (MTSPEED),A
LD HL,750
LD (TICKLEN),HL
LD (TCKLEFT),HL
XOR A
LD (MTBRKPS),A
LD (MTJMPFL),A
LD (MTBRKFL),A
LD (MTPDT),A
LD (MTPDT2),A
JP INITPAT
EFXSKPX LD A,(MTJMPFL)
OR A
JP NZ,EFXSKP6
RET
GETSMP SET 7,(IY+CHSTAT)
LD A,(IY+CHINS)
OR A
JR Z,GETSMP2
DEC A
ADD A,A
ADD A,A
ADD A,A
ADD A,A
LD E,A
LD A,#54
ADC A,#00
LD D,A
LD A,(DE)
LD (IY+CHCURP),A
INC DE
LD A,(DE)
LD (IY+CHCURL),A
INC DE
LD A,(DE)
LD (IY+CHCURH),A
INC (IY+CHCURL)
CALL Z,GETSMP3
INC (IY+CHCURL)
CALL Z,GETSMP3
INC DE
LD A,(DE)
LD (IY+CHENDP),A
INC DE
LD A,(DE)
LD (IY+CHENDL),A
INC DE
LD A,(DE)
LD (IY+CHENDH),A
INC DE
INC DE
INC DE
LD A,(DE)
LD (IY+CHLPBP),A
INC DE
LD A,(DE)
LD (IY+CHLPBL),A
INC DE
LD A,(DE)
LD (IY+CHLPBH),A
INC DE
LD A,(DE)
LD (IY+CHLPEP),A
INC DE
LD A,(DE)
LD (IY+CHLPEL),A
INC DE
LD A,(DE)
LD (IY+CHLPEH),A
LD (IY+CHCNTL),#00
LD (IY+CHCNTH),#07
LD A,(IY+CHCURP)
CP (IY+CHENDP)
RET C
JP NZ,GETSMP2
LD A,(IY+CHCURH)
CP (IY+CHENDH)
RET C
JP NZ,GETSMP2
LD A,(IY+CHCURL)
CP (IY+CHENDL)
RET C
GETSMP2 RES 7,(IY+CHSTAT)
RET
GETSMP3 INC (IY+CHCURH)
RET NZ
LD (IY+CHCURH),#80
INC (IY+CHCURP)
RET
EFXNEWI LD A,(IY+CHINS)
DEC A
ADD A,A
ADD A,A
ADD A,A
ADD A,A
LD E,A
LD A,#54
ADC A,#00
LD D,A
INC DE
INC DE
INC DE
INC DE
INC DE
INC DE
LD A,(DE)
LD (IY+CHFINE),A
INC DE
LD A,(DE)
CP #40
JR C,GETSMP1
LD A,#40
GETSMP1 LD (IY+CHVOL),A
CP (IY+CHMVOL)
LD (IY+CHMVOL),A
RET Z
SET 0,(IY+CHSTAT)
RET
GETROWS LD A,(MTPATPS)
AND #3F
ADD A,A
ADD A,A
LD L,A
LD H,#00
ADD HL,HL
ADD HL,HL
LD A,(CURCHN)
ADD A,A
ADD A,A
ADD A,L
LD L,A
LD A,H
ADC A,#50
LD H,A
LD A,(HL)
AND #10
PUSH AF
LD A,(HL)
AND #0F
LD D,A
INC HL
LD E,(HL)
OR E
LD A,#7F
JR Z,GETRWS2
PUSH HL
CALL NOTEID
POP HL
GETRWS2 INC HL
POP BC
LD D,A
LD A,(HL)
AND #F0
RRCA
RRCA
RRCA
RRCA
OR B
LD E,A
LD A,(HL)
AND #0F
LD B,A
INC HL
LD C,(HL)
RET

View File

@ -0,0 +1,96 @@
; UNPHASE
; ORG $+#00FF&#FF00
; PHASE $+(#c000-GSRomBaseH)
align 256
VIBTB DB 0,24,49,74,97,120,141,161,180,197,212,224,235
DB 244,250,253,255,253,250,244,235,224,212,197,180
DB 161,141,120,97,74,49,24
COMTABH
DB low COM20,low COM21,low COM22,low COM23,low COMHZ,low COMHZ,low COMHZ,low COMHZ ;#20
DB low COMHZ,low COMHZ,low COM2A,low COM2B,low COM2C,low COM2D,low COM2E,low COM2F ;#28
DB low COM30,low COM31,low COM32,low COM33,low COM34,low COM35,low COM36,low COM37 ;#30
DB low COM38,low COM39,low COM3A,low COM3B,low COM3C,low COM3D,low COM3E,low COM3F ;#38
DB low COM40,low COM41,low COM42,low COMHZ,low COMHZ,low COM45,low COM46,low COM47 ;#40
DB low COM48,low COM49,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ ;#48
DB low COM50,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ ;#50
DB low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ ;#58
DB low COM60,low COM61,low COM62,low COM63,low COM64,low COM65,low COM66,low COM67 ;#60
DB low COM68,low COM69,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ ;#68
DB low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ ;#70
DB low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ ;#78
DB low COM80,low COM80,low COM80,low COM80,low COM80,low COM80,low COM80,low COM80 ;#80
DB low COM80,low COM80,low COM80,low COM80,low COM80,low COM80,low COM80,low COM80 ;#88
DB low COM80,low COM80,low COM80,low COM80,low COM80,low COM80,low COM80,low COM80 ;#90
DB low COM80,low COM80,low COM80,low COM80,low COM80,low COM80,low COM80,low COM80 ;#98
DB low COMA0,low COMA0,low COMA0,low COMA0,low COMA0,low COMA0,low COMA0,low COMA0 ;#A0
DB low COMA0,low COMA0,low COMA0,low COMA0,low COMA0,low COMA0,low COMA0,low COMA0 ;#A8
DB low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ ;#B0
DB low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ ;#B8
DB low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ ;#C0
DB low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ ;#C8
DB low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ ;#D0
DB low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ ;#D8
DB low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ ;#E0
DB low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ,low COMHZ ;#E8
DEFS #10
DEFS #20
DB high COM20,high COM21,high COM22,high COM23,high COMHZ,high COMHZ,high COMHZ,high COMHZ ;#20
DB high COMHZ,high COMHZ,high COM2A,high COM2B,high COM2C,high COM2D,high COM2E,high COM2F ;#28
DB high COM30,high COM31,high COM32,high COM33,high COM34,high COM35,high COM36,high COM37 ;#30
DB high COM38,high COM39,high COM3A,high COM3B,high COM3C,high COM3D,high COM3E,high COM3F ;#38
DB high COM40,high COM41,high COM42,high COMHZ,high COMHZ,high COM45,high COM46,high COM47 ;#40
DB high COM48,high COM49,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ ;#48
DB high COM50,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ ;#50
DB high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ ;#58
DB high COM60,high COM61,high COM62,high COM63,high COM64,high COM65,high COM66,high COM67 ;#60
DB high COM68,high COM69,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ ;#68
DB high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ ;#70
DB high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ ;#78
DB high COM80,high COM80,high COM80,high COM80,high COM80,high COM80,high COM80,high COM80 ;#80
DB high COM80,high COM80,high COM80,high COM80,high COM80,high COM80,high COM80,high COM80 ;#88
DB high COM80,high COM80,high COM80,high COM80,high COM80,high COM80,high COM80,high COM80 ;#90
DB high COM80,high COM80,high COM80,high COM80,high COM80,high COM80,high COM80,high COM80 ;#98
DB high COMA0,high COMA0,high COMA0,high COMA0,high COMA0,high COMA0,high COMA0,high COMA0 ;#A0
DB high COMA0,high COMA0,high COMA0,high COMA0,high COMA0,high COMA0,high COMA0,high COMA0 ;#A8
DB high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ ;#B0
DB high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ ;#B8
DB high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ ;#C0
DB high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ ;#C8
DB high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ ;#D0
DB high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ ;#D8
DB high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ ;#E0
DB high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ,high COMHZ ;#E8
DEFS #10
FXJP1 DW FXNOP,FXNOP,FXNOP,FXNOP,FXNOP,FXNOP,FXNOP,FXNOP
DW FXNOP,FXNOP,FXNOP,FXB ,FXC ,FXD ,FXE ,FXF
DW FXRET,FXRET,FXRET,FXRET,FXRET,FXRET,FXRET,FXRET
DW FXRET,FXRET,FXRET,FXRET,FXRET,FXRET,FXRET,FXRET
FXJP2 DW FX0 ,FX1 ,FX2 ,FX3 ,FX4 ,FX5 ,FX6 ,FX7
DW FXRET,FXRET,FXA ,FXRET,FXRET,FXRET,FXE_ ,FXRET
DW FXRET,FXRET,FXRET,FXRET,FXRET,FXRET,FXRET,FXRET
DW FXRET,FXRET,FXRET,FXRET,FXRET,FXRET,FXRET,FXRET
FXEJP1 DW FXE0,FX1,FX2,FXE3,FXE4,FXE5,FXE6,FXE7
DW FXRET,FXE9,FXEA,FXA,FXEC,FXED,FXEE,FXRET
FXEJP2 DW FXRET,FXRET,FXRET,FXRET,FXRET,FXRET,FXRET,FXRET
DW FXRET,FXE9,FXRET,FXRET,FXEC,FXED,FXRET,FXRET
TCOMTB DEFW TCOM ,TCOM ,TCOM2,TCOM3,TCOM4,TCOM5,TCOM6,TCOM7
DEFW TCOM8,TCOM9,TCOMA,TCOMB,TCOMC,TCOMD,TCOME,TCOMF
DEFW TCOM10,TCOM11,TCOM12,TCOM13,TCOM14,TCOM15,TCOM ,TCOM
DEFW TCOM ,TCOM ,TCOM ,TCOM ,TCOM ,TCOM ,TCOM ,TCOM

View File

@ -0,0 +1,14 @@
; UNPHASE
; ORG $+#00FF&#FF00
; PHASE $-GSRomBase
align 256
INTTAB DEFS #101,high INTAREA
INTTB DW INT0,INT1,INT1,INT2,INT1,INT3,INT2,INT4,INT1,INT5
DW INT3,INT6,INT2,INT7,INT4,#0000
INTOFF DB 0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0

View File

@ -0,0 +1,201 @@
TCOM IN A,(FLAGS)
RRCA
JR NC,TCOM
TCOM_ IN A,(COMRG)
CP #20
JP NC,COMINT2
CP #01
JR Z,TCOM
OUT (RSCOM),A
LD HL,TCOMTB
ADD A,A
ADD A,L
LD L,A
LD A,(HL)
INC L
LD H,(HL)
LD L,A
JP (HL)
TCOM2 LD HL,DAC0
LD A,#3F
OUT (VOL0),A
TCOMDAC LD (HL),0
LD A,(HL)
LD IY,TCONT1
JP TWAIT
TCONT1 LD (HL),#FF
LD A,(HL)
LD IY,TCOMDAC
JP TWAIT
TCOM3 LD HL,DAC1
LD A,#3F
OUT (VOL1),A
JR TCOMDAC
TCOM4 LD HL,DAC2
LD A,#3F
OUT (VOL2),A
JR TCOMDAC
TCOM5 LD HL,DAC3
LD A,#3F
OUT (VOL3),A
JR TCOMDAC
TCOM6 XOR A
OUT (OUTRG),A
LD IY,TCONT2
JP TWAIT
TCONT2 LD A,#FF
OUT (OUTRG),A
LD IY,TCOM6
JP TWAIT
TCOM7 LD C,VOL0
LD HL,DAC0
LD (HL),#FF
LD A,(HL)
TCOMVOL LD A,#00
OUT (C),A
LD IY,TCONT3
JP TWAIT
TCONT3 LD A,#FF
OUT (C),A
LD IY,TCOMVOL
JP TWAIT
TCOM8 LD C,VOL1
LD HL,DAC1
LD (HL),#FF
LD A,(HL)
JR TCOMVOL
TCOM9 LD C,VOL2
LD HL,DAC2
LD (HL),#FF
LD A,(HL)
JR TCOMVOL
TCOMA LD C,VOL3
LD HL,DAC3
LD (HL),#FF
LD A,(HL)
JR TCOMVOL
TCOMB LD HL,DAC0
LD C,VOL0
TCOMTST LD B,#3F
TCOMT4 OUT (C),B
LD D,114
TCOMT5 LD (HL),#00
LD A,(HL)
XOR A
TCOMT6 DEC A
JR NZ,TCOMT6
LD (HL),#FF
LD A,(HL)
XOR A
TCOMT7 DEC A
JR NZ,TCOMT7
DEC D
JR NZ,TCOMT5
DEC B
JP P,TCOMT4
IN A,(FLAGS)
RRCA
JR NC,TCOMTST
JP TCOM_
TCOMC LD HL,DAC1
LD C,VOL1
JP TCOMTST
TCOMD LD HL,DAC2
LD C,VOL2
JP TCOMTST
TCOME LD HL,DAC3
LD C,VOL3
JP TCOMTST
TCOMF LD A,#3F
OUT (VOL0),A
OUT (VOL1),A
OUT (VOL2),A
OUT (VOL3),A
LD B,#00
LD L,B
TCONT8 LD H,high DAC0
LD (HL),B
LD A,(HL)
INC H
LD (HL),B
LD A,(HL)
INC H
LD (HL),B
LD A,(HL)
INC H
LD (HL),B
LD A,(HL)
DJNZ TCONT8
IN A,(FLAGS)
RRCA
JP NC,TCONT8
JP TCOM_
TCOM10 IN A,(DATRG)
OUT (OUTRG),A
JP TCOM_
TCOM11 IN A,(DATRG)
JP TCOM_
TCOM12 LD HL,DAC0
TCONT9 LD A,#3F
OUT (VOL0),A
OUT (VOL1),A
OUT (VOL2),A
OUT (VOL3),A
TCONTA IN A,(DATRG)
LD (HL),A
LD A,(HL)
TCONTB DJNZ TCONTB
LD (HL),#00
LD A,(HL)
TCONTC DJNZ TCONTC
IN A,(FLAGS)
RRCA
JP C,TCOM_
JP TCONTA
TCOM13 LD HL,DAC1
JR TCONT9
TCOM14 LD HL,DAC2
JR TCONT9
TCOM15 LD HL,DAC3
JR TCONT9
TWAIT LD B,#04
TWAIT1 LD DE,38686
TWAIT2 IN A,(FLAGS)
RRCA
JP C,TCOM_
DEC DE
LD A,D
OR E
JR NZ,TWAIT2
DJNZ TWAIT2
JP (IY)

View File

@ -0,0 +1,172 @@
;VOLUME CALCULATION FOR MODULES AND FX
CALCVOL RES 0,(IY+CHSTAT)
LD DE,#FC00
LD A,(IY+CHMVOL)
AND #7F
JP Z,CALCV_Z
CP #40
CALL C,MUL64
LD A,(IY+CHEVOL)
OR A
JP Z,CALCV_Z
CP #40
CALL C,MUL64
LD A,(IY+CHFADVH)
SRL A
SRL A
ADC A,#00
JP Z,CALCV_Z
CP #40
CALL C,MUL64
BIT 6,(IY+CHSTAT)
JP Z,CALCV_N
LD A,(FXVOL)
OR A
JP Z,CALCV_Z
CP #40
CALL C,MUL64
LD A,(FXMVOL)
OR A
JP Z,CALCV_Z
CP #40
CALL C,MUL64
JP CALCV_X
CALCV_N LD A,(MTVOL)
OR A
JP Z,CALCV_Z
CP #40
CALL C,MUL64
LD A,(MODVOL)
OR A
JP Z,CALCV_Z
CP #40
CALL C,MUL64
CALCV_X LD C,(IY+CHPAN)
LD A,(IY+CHEPAN)
SUB #20
JR Z,CALCV_V
JR NC,CALCV_I
NEG
CALCV_I CP #20
JR C,CALCV_U
LD H,(IY+CHPAN)
LD A,H
OR A
JP P,CALCV_Q
NEG
LD H,A
JP CALCV_Q
CALCV_U RLCA
RLCA
RLCA
LD L,A
LD A,(IY+CHPAN)
OR A
JP P,CALCV_T
NEG
CALCV_T LD B,A
XOR A
JP CALCV_M
CALCV_R ADD A,B
CALCV_E SRL B
CALCV_M SLA L
JR C,CALCV_R
JR NZ,CALCV_E
SRL A
LD H,A
CALCV_Q LD A,(IY+CHEPAN)
CP #20
JR C,CALCV_P
LD A,C
ADD A,H
LD C,A
JR NC,CALCV_V
LD C,#FF
JP CALCV_W
CALCV_P LD A,C
SUB H
LD C,#00
JR C,CALCV_O
LD C,A
CALCV_V LD A,C
CP #80
JR Z,CALCV_Y
OR A
JP M,CALCV_W
CALCV_O BIT 5,(IY+CHSTAT)
JR Z,CALCV_Y
SRL A
CALL MUL64
JP CALCV_Y
CALCV_W BIT 5,(IY+CHSTAT)
JR NZ,CALCV_Y
NEG
SRL A
CALL MUL64
CALCV_Y LD A,D
SRL A
SRL A
ADC A,#00
CALCV_Z LD C,A
LD HL,VOLRQTB
LD A,L
ADD A,(IY+CHRDN)
LD L,A
LD (HL),C
RET
MUL64 LD B,A
LD HL,#0000
AND #0F
JR Z,MUL64_F
SLA B
SLA B
JP MUL64_E
MUL64_A ADD HL,DE
MUL64_E SRL D
RR E
SLA B
JP C,MUL64_A
JP NZ,MUL64_E
EX DE,HL
RET
MUL64_F LD A,B
OR A
JR Z,MUL64_S
SRL D
RR E
CP #20
RET Z
LD L,E
LD H,D
SRL D
RR E
CP #10
RET Z
ADD HL,DE
MUL64_S EX DE,HL
RET

View File

@ -0,0 +1,143 @@
DW 6848, 6464, 6101, 5758, 5435, 5130, 4842, 4570, 4314, 4072, 3843, 3628
DW 3424, 3232, 3050, 2879, 2718, 2565, 2421, 2285, 2157, 2036, 1922, 1814
DW 1712, 1616, 1525, 1440, 1359, 1283, 1211, 1143, 1078, 1018, 961, 907
DW 856, 808, 763, 720, 679, 641, 605, 571, 539, 509, 480, 453
DW 428, 404, 381, 360, 340, 321, 303, 286, 270, 254, 240, 227
DW 214, 202, 191, 180, 170, 160, 151, 143, 135, 127, 120, 113
DW 107, 101, 95, 90, 85, 80, 76, 71, 67, 64, 60, 57
DW 54, 50, 48, 45, 42, 40, 38, 36, 34, 32, 30, 28
DW 6799, 6417, 6057, 5717, 5396, 5093, 4807, 4538, 4283, 4043, 3816, 3602
DW 3399, 3209, 3028, 2859, 2698, 2547, 2404, 2269, 2141, 2021, 1908, 1801
DW 1700, 1604, 1514, 1429, 1349, 1273, 1202, 1134, 1071, 1011, 954, 900
DW 850, 802, 757, 715, 675, 637, 601, 567, 535, 505, 477, 450
DW 425, 401, 379, 357, 337, 318, 300, 284, 268, 253, 238, 225
DW 212, 201, 189, 179, 169, 159, 150, 142, 134, 126, 119, 113
DW 106, 100, 95, 89, 84, 80, 75, 71, 67, 63, 60, 56
DW 53, 50, 47, 45, 42, 40, 38, 35, 33, 32, 30, 28
DW 6750, 6371, 6013, 5676, 5357, 5057, 4773, 4505, 4252, 4013, 3788, 3576
DW 3375, 3185, 3007, 2838, 2679, 2528, 2386, 2252, 2126, 2007, 1894, 1788
DW 1687, 1593, 1503, 1419, 1339, 1264, 1193, 1126, 1063, 1003, 947, 894
DW 844, 796, 752, 709, 670, 632, 597, 563, 532, 502, 474, 447
DW 422, 398, 376, 355, 335, 316, 298, 282, 266, 251, 237, 223
DW 211, 199, 188, 177, 167, 158, 149, 141, 133, 125, 118, 112
DW 105, 100, 94, 89, 84, 79, 75, 70, 66, 63, 59, 56
DW 53, 50, 47, 44, 42, 40, 37, 35, 33, 31, 30, 28
DW 6701, 6325, 5970, 5635, 5319, 5020, 4739, 4473, 4222, 3985, 3761, 3550
DW 3351, 3163, 2985, 2818, 2659, 2510, 2369, 2236, 2111, 1992, 1880, 1775
DW 1675, 1581, 1493, 1409, 1330, 1255, 1185, 1118, 1055, 996, 940, 887
DW 838, 791, 746, 704, 665, 628, 592, 559, 528, 498, 470, 444
DW 419, 395, 373, 352, 332, 314, 296, 280, 264, 249, 235, 222
DW 209, 198, 187, 176, 166, 157, 148, 140, 132, 125, 118, 111
DW 105, 99, 93, 88, 83, 78, 74, 70, 66, 62, 59, 55
DW 52, 49, 47, 44, 42, 39, 37, 35, 33, 31, 29, 28
DW 6653, 6280, 5927, 5595, 5281, 4984, 4704, 4440, 4191, 3956, 3734, 3524
DW 3327, 3140, 2964, 2797, 2640, 2492, 2352, 2220, 2096, 1978, 1867, 1762
DW 1663, 1570, 1482, 1399, 1320, 1246, 1176, 1110, 1048, 989, 933, 881
DW 832, 785, 741, 699, 660, 623, 588, 555, 524, 494, 467, 441
DW 416, 392, 370, 350, 330, 312, 294, 278, 262, 247, 233, 220
DW 208, 196, 185, 175, 165, 156, 147, 139, 131, 124, 117, 110
DW 104, 98, 93, 87, 83, 78, 74, 69, 65, 62, 58, 55
DW 52, 49, 46, 44, 41, 39, 37, 35, 33, 31, 29, 28
DW 6605, 6234, 5885, 5554, 5243, 4948, 4671, 4408, 4161, 3927, 3707, 3499
DW 3303, 3117, 2942, 2777, 2621, 2474, 2335, 2204, 2081, 1964, 1854, 1749
DW 1651, 1559, 1471, 1389, 1311, 1237, 1168, 1102, 1040, 982, 927, 875
DW 826, 779, 736, 694, 655, 619, 584, 551, 520, 491, 463, 437
DW 413, 390, 368, 347, 328, 309, 292, 276, 260, 245, 232, 219
DW 206, 195, 184, 174, 164, 155, 146, 138, 130, 123, 116, 109
DW 103, 97, 92, 87, 82, 77, 73, 69, 65, 61, 58, 55
DW 52, 49, 46, 43, 41, 39, 36, 34, 33, 31, 29, 27
DW 6558, 6190, 5842, 5514, 5205, 4913, 4637, 4377, 4131, 3899, 3680, 3474
DW 3279, 3095, 2921, 2757, 2602, 2456, 2318, 2188, 2066, 1950, 1840, 1737
DW 1639, 1547, 1461, 1379, 1301, 1228, 1159, 1094, 1033, 975, 920, 868
DW 820, 774, 730, 689, 651, 614, 580, 547, 516, 487, 460, 434
DW 410, 387, 365, 345, 325, 307, 290, 274, 258, 244, 230, 217
DW 205, 193, 183, 172, 163, 154, 145, 137, 129, 122, 115, 109
DW 102, 97, 91, 86, 81, 77, 72, 68, 65, 61, 58, 54
DW 51, 48, 46, 43, 41, 38, 36, 34, 32, 30, 29, 27
DW 6510, 6145, 5800, 5475, 5167, 4877, 4604, 4345, 4101, 3871, 3654, 3449
DW 3255, 3073, 2900, 2737, 2584, 2439, 2302, 2173, 2051, 1936, 1827, 1724
DW 1628, 1536, 1450, 1369, 1292, 1219, 1151, 1086, 1025, 968, 913, 862
DW 814, 768, 725, 684, 646, 610, 575, 543, 513, 484, 457, 431
DW 407, 384, 363, 342, 323, 305, 288, 272, 256, 242, 228, 216
DW 203, 192, 181, 171, 161, 152, 144, 136, 128, 121, 114, 108
DW 102, 96, 91, 86, 81, 76, 72, 68, 64, 60, 57, 54
DW 51, 48, 45, 43, 40, 38, 36, 34, 32, 30, 29, 27
DW 7255, 6848, 6464, 6101, 5758, 5435, 5130, 4842, 4570, 4314, 4072, 3843
DW 3628, 3424, 3232, 3050, 2879, 2718, 2565, 2421, 2285, 2157, 2036, 1922
DW 1814, 1712, 1616, 1525, 1440, 1359, 1283, 1211, 1143, 1078, 1018, 961
DW 907, 856, 808, 763, 720, 679, 641, 605, 571, 539, 509, 480
DW 453, 428, 404, 381, 360, 340, 321, 303, 286, 270, 254, 240
DW 227, 214, 202, 191, 180, 170, 160, 151, 143, 135, 127, 120
DW 113, 107, 101, 95, 90, 85, 80, 76, 71, 67, 64, 60
DW 57, 54, 50, 48, 45, 42, 40, 38, 36, 34, 32, 30
DW 7203, 6799, 6417, 6057, 5717, 5396, 5093, 4807, 4538, 4283, 4043, 3816
DW 3602, 3399, 3209, 3028, 2859, 2698, 2547, 2404, 2269, 2141, 2021, 1908
DW 1801, 1700, 1604, 1514, 1429, 1349, 1273, 1202, 1134, 1071, 1011, 954
DW 900, 850, 802, 757, 715, 675, 637, 601, 567, 535, 505, 477
DW 450, 425, 401, 379, 357, 337, 318, 300, 284, 268, 253, 238
DW 225, 212, 201, 189, 179, 169, 159, 150, 142, 134, 126, 119
DW 113, 106, 100, 95, 89, 84, 80, 75, 71, 67, 63, 60
DW 56, 53, 50, 47, 45, 42, 40, 38, 35, 33, 32, 30
DW 7151, 6750, 6371, 6013, 5676, 5357, 5057, 4773, 4505, 4252, 4013, 3788
DW 3576, 3375, 3185, 3007, 2838, 2679, 2528, 2386, 2252, 2126, 2007, 1894
DW 1788, 1687, 1593, 1503, 1419, 1339, 1264, 1193, 1126, 1063, 1003, 947
DW 894, 844, 796, 752, 709, 670, 632, 597, 563, 532, 502, 474
DW 447, 422, 398, 376, 355, 335, 316, 298, 282, 266, 251, 237
DW 223, 211, 199, 188, 177, 167, 158, 149, 141, 133, 125, 118
DW 112, 105, 100, 94, 89, 84, 79, 75, 70, 66, 63, 59
DW 56, 53, 50, 47, 44, 42, 40, 37, 35, 33, 31, 30
DW 7100, 6701, 6325, 5970, 5635, 5319, 5020, 4739, 4473, 4222, 3985, 3761
DW 3550, 3351, 3163, 2985, 2818, 2659, 2510, 2369, 2236, 2111, 1992, 1880
DW 1775, 1675, 1581, 1493, 1409, 1330, 1255, 1185, 1118, 1055, 996, 940
DW 887, 838, 791, 746, 704, 665, 628, 592, 559, 528, 498, 470
DW 444, 419, 395, 373, 352, 332, 314, 296, 280, 264, 249, 235
DW 222, 209, 198, 187, 176, 166, 157, 148, 140, 132, 125, 118
DW 111, 105, 99, 93, 88, 83, 78, 74, 70, 66, 62, 59
DW 55, 52, 49, 47, 44, 42, 39, 37, 35, 33, 31, 29
DW 7049, 6653, 6280, 5927, 5595, 5281, 4984, 4704, 4440, 4191, 3956, 3734
DW 3524, 3327, 3140, 2964, 2797, 2640, 2492, 2352, 2220, 2096, 1978, 1867
DW 1762, 1663, 1570, 1482, 1399, 1320, 1246, 1176, 1110, 1048, 989, 933
DW 881, 832, 785, 741, 699, 660, 623, 588, 555, 524, 494, 467
DW 441, 416, 392, 370, 350, 330, 312, 294, 278, 262, 247, 233
DW 220, 208, 196, 185, 175, 165, 156, 147, 139, 131, 124, 117
DW 110, 104, 98, 93, 87, 83, 78, 74, 69, 65, 62, 58
DW 55, 52, 49, 46, 44, 41, 39, 37, 35, 33, 31, 29
DW 6998, 6605, 6234, 5885, 5554, 5243, 4948, 4671, 4408, 4161, 3927, 3707
DW 3499, 3303, 3117, 2942, 2777, 2621, 2474, 2335, 2204, 2081, 1964, 1854
DW 1749, 1651, 1559, 1471, 1389, 1311, 1237, 1168, 1102, 1040, 982, 927
DW 875, 826, 779, 736, 694, 655, 619, 584, 551, 520, 491, 463
DW 437, 413, 390, 368, 347, 328, 309, 292, 276, 260, 245, 232
DW 219, 206, 195, 184, 174, 164, 155, 146, 138, 130, 123, 116
DW 109, 103, 97, 92, 87, 82, 77, 73, 69, 65, 61, 58
DW 55, 52, 49, 46, 43, 41, 39, 36, 34, 33, 31, 29
DW 6948, 6558, 6190, 5842, 5514, 5205, 4913, 4637, 4377, 4131, 3899, 3680
DW 3474, 3279, 3095, 2921, 2757, 2602, 2456, 2318, 2188, 2066, 1950, 1840
DW 1737, 1639, 1547, 1461, 1379, 1301, 1228, 1159, 1094, 1033, 975, 920
DW 868, 820, 774, 730, 689, 651, 614, 580, 547, 516, 487, 460
DW 434, 410, 387, 365, 345, 325, 307, 290, 274, 258, 244, 230
DW 217, 205, 193, 183, 172, 163, 154, 145, 137, 129, 122, 115
DW 109, 102, 97, 91, 86, 81, 77, 72, 68, 65, 61, 58
DW 54, 51, 48, 46, 43, 41, 38, 36, 34, 32, 30, 29
DW 6898, 6510, 6145, 5800, 5475, 5167, 4877, 4604, 4345, 4101, 3871, 3654
DW 3449, 3255, 3073, 2900, 2737, 2584, 2439, 2302, 2173, 2051, 1936, 1827
DW 1724, 1628, 1536, 1450, 1369, 1292, 1219, 1151, 1086, 1025, 968, 913
DW 862, 814, 768, 725, 684, 646, 610, 575, 543, 513, 484, 457
DW 431, 407, 384, 363, 342, 323, 305, 288, 272, 256, 242, 228
DW 216, 203, 192, 181, 171, 161, 152, 144, 136, 128, 121, 114
DW 108, 102, 96, 91, 86, 81, 76, 72, 68, 64, 60, 57
DW 54, 51, 48, 45, 43, 40, 38, 36, 34, 32, 30, 29

View File

@ -0,0 +1,128 @@
DW 0, 3, 5, 8, 11, 13, 16, 19
DW 21, 24, 27, 30, 32, 35, 38, 40
DW 43, 46, 48, 51, 54, 56, 59, 62
DW 64, 67, 70, 72, 75, 78, 80, 83
DW 86, 89, 91, 94, 97, 99, 102, 105
DW 107, 110, 113, 115, 118, 121, 123, 126
DW 129, 131, 134, 137, 139, 142, 145, 148
DW 150, 153, 156, 158, 161, 164, 166, 169
DW 172, 174, 177, 180, 182, 185, 188, 190
DW 193, 196, 198, 201, 204, 207, 209, 212
DW 215, 217, 220, 223, 225, 228, 231, 233
DW 236, 239, 241, 244, 247, 249, 252, 255
DW 257, 260, 263, 266, 268, 271, 274, 276
DW 279, 282, 284, 287, 290, 292, 295, 298
DW 300, 303, 306, 308, 311, 314, 316, 319
DW 322, 325, 327, 330, 333, 335, 338, 341
DW 343, 346, 349, 351, 354, 357, 359, 362
DW 365, 367, 370, 373, 375, 378, 381, 384
DW 386, 389, 392, 394, 397, 400, 402, 405
DW 408, 410, 413, 416, 418, 421, 424, 426
DW 429, 432, 434, 437, 440, 443, 445, 448
DW 451, 453, 456, 459, 461, 464, 467, 469
DW 472, 475, 477, 480, 483, 485, 488, 491
DW 493, 496, 499, 502, 504, 507, 510, 512
DW 515, 518, 520, 523, 526, 528, 531, 534
DW 536, 539, 542, 544, 547, 550, 553, 555
DW 558, 561, 563, 566, 569, 571, 574, 577
DW 579, 582, 585, 587, 590, 593, 595, 598
DW 601, 603, 606, 609, 612, 614, 617, 620
DW 622, 625, 628, 630, 633, 636, 638, 641
DW 644, 646, 649, 652, 654, 657, 660, 662
DW 665, 668, 671, 673, 676, 679, 681, 684
DW 687, 689, 692, 695, 697, 700, 703, 705
DW 708, 711, 713, 716, 719, 721, 724, 727
DW 730, 732, 735, 738, 740, 743, 746, 748
DW 751, 754, 756, 759, 762, 764, 767, 770
DW 772, 775, 778, 780, 783, 786, 789, 791
DW 794, 797, 799, 802, 805, 807, 810, 813
DW 815, 818, 821, 823, 826, 829, 831, 834
DW 837, 839, 842, 845, 848, 850, 853, 856
DW 858, 861, 864, 866, 869, 872, 874, 877
DW 880, 882, 885, 888, 890, 893, 896, 898
DW 901, 904, 907, 909, 912, 915, 917, 920
DW 923, 925, 928, 931, 933, 936, 939, 941
DW 944, 947, 949, 952, 955, 957, 960, 963
DW 966, 968, 971, 974, 976, 979, 982, 984
DW 987, 990, 992, 995, 998, 1000, 1003, 1006
DW 1008, 1011, 1014, 1016, 1019, 1022, 1025, 1027
DW 1030, 1033, 1035, 1038, 1041, 1043, 1046, 1049
DW 1051, 1054, 1057, 1059, 1062, 1065, 1067, 1070
DW 1073, 1075, 1078, 1081, 1084, 1086, 1089, 1092
DW 1094, 1097, 1100, 1102, 1105, 1108, 1110, 1113
DW 1116, 1118, 1121, 1124, 1126, 1129, 1132, 1135
DW 1137, 1140, 1143, 1145, 1148, 1151, 1153, 1156
DW 1159, 1161, 1164, 1167, 1169, 1172, 1175, 1177
DW 1180, 1183, 1185, 1188, 1191, 1194, 1196, 1199
DW 1202, 1204, 1207, 1210, 1212, 1215, 1218, 1220
DW 1223, 1226, 1228, 1231, 1234, 1236, 1239, 1242
DW 1244, 1247, 1250, 1253, 1255, 1258, 1261, 1263
DW 1266, 1269, 1271, 1274, 1277, 1279, 1282, 1285
DW 1287, 1290, 1293, 1295, 1298, 1301, 1303, 1306
DW 1309, 1312, 1314, 1317, 1320, 1322, 1325, 1328
DW 1330, 1333, 1336, 1338, 1341, 1344, 1346, 1349
DW 1352, 1354, 1357, 1360, 1362, 1365, 1368, 1371
DW 1373, 1376, 1379, 1381, 1384, 1387, 1389, 1392
DW 1395, 1397, 1400, 1403, 1405, 1408, 1411, 1413
DW 1416, 1419, 1421, 1424, 1427, 1430, 1432, 1435
DW 1438, 1440, 1443, 1446, 1448, 1451, 1454, 1456
DW 1459, 1462, 1464, 1467, 1470, 1472, 1475, 1478
DW 1480, 1483, 1486, 1489, 1491, 1494, 1497, 1499
DW 1502, 1505, 1507, 1510, 1513, 1515, 1518, 1521
DW 1523, 1526, 1529, 1531, 1534, 1537, 1539, 1542
DW 1545, 1548, 1550, 1553, 1556, 1558, 1561, 1564
DW 1566, 1569, 1572, 1574, 1577, 1580, 1582, 1585
DW 1588, 1590, 1593, 1596, 1598, 1601, 1604, 1607
DW 1609, 1612, 1615, 1617, 1620, 1623, 1625, 1628
DW 1631, 1633, 1636, 1639, 1641, 1644, 1647, 1649
DW 1652, 1655, 1658, 1660, 1663, 1666, 1668, 1671
DW 1674, 1676, 1679, 1682, 1684, 1687, 1690, 1692
DW 1695, 1698, 1700, 1703, 1706, 1708, 1711, 1714
DW 1717, 1719, 1722, 1725, 1727, 1730, 1733, 1735
DW 1738, 1741, 1743, 1746, 1749, 1751, 1754, 1757
DW 1759, 1762, 1765, 1767, 1770, 1773, 1776, 1778
DW 1781, 1784, 1786, 1789, 1792, 1794, 1797, 1800
DW 1802, 1805, 1808, 1810, 1813, 1816, 1818, 1821
DW 1824, 1826, 1829, 1832, 1835, 1837, 1840, 1843
DW 1845, 1848, 1851, 1853, 1856, 1859, 1861, 1864
DW 1867, 1869, 1872, 1875, 1877, 1880, 1883, 1885
DW 1888, 1891, 1894, 1896, 1899, 1902, 1904, 1907
DW 1910, 1912, 1915, 1918, 1920, 1923, 1926, 1928
DW 1931, 1934, 1936, 1939, 1942, 1944, 1947, 1950
DW 1953, 1955, 1958, 1961, 1963, 1966, 1969, 1971
DW 1974, 1977, 1979, 1982, 1985, 1987, 1990, 1993
DW 1995, 1998, 2001, 2003, 2006, 2009, 2012, 2014
DW 2017, 2020, 2022, 2025, 2028, 2030, 2033, 2036
DW 2038, 2041, 2044, 2046, 2049, 2052, 2054, 2057
DW 2060, 2062, 2065, 2068, 2071, 2073, 2076, 2079
DW 2081, 2084, 2087, 2089, 2092, 2095, 2097, 2100
DW 2103, 2105, 2108, 2111, 2113, 2116, 2119, 2121
DW 2124, 2127, 2130, 2132, 2135, 2138, 2140, 2143
DW 2146, 2148, 2151, 2154, 2156, 2159, 2162, 2164
DW 2167, 2170, 2172, 2175, 2178, 2180, 2183, 2186
DW 2189, 2191, 2194, 2197, 2199, 2202, 2205, 2207
DW 2210, 2213, 2215, 2218, 2221, 2223, 2226, 2229
DW 2231, 2234, 2237, 2240, 2242, 2245, 2248, 2250
DW 2253, 2256, 2258, 2261, 2264, 2266, 2269, 2272
DW 2274, 2277, 2280, 2282, 2285, 2288, 2290, 2293
DW 2296, 2299, 2301, 2304, 2307, 2309, 2312, 2315
DW 2317, 2320, 2323, 2325, 2328, 2331, 2333, 2336
DW 2339, 2341, 2344, 2347, 2349, 2352, 2355, 2358
DW 2360, 2363, 2366, 2368, 2371, 2374, 2376, 2379
DW 2382, 2384, 2387, 2390, 2392, 2395, 2398, 2400
DW 2403, 2406, 2408, 2411, 2414, 2417, 2419, 2422
DW 2425, 2427, 2430, 2433, 2435, 2438, 2441, 2443
DW 2446, 2449, 2451, 2454, 2457, 2459, 2462, 2465
DW 2467, 2470, 2473, 2476, 2478, 2481, 2484, 2486
DW 2489, 2492, 2494, 2497, 2500, 2502, 2505, 2508
DW 2510, 2513, 2516, 2518, 2521, 2524, 2526, 2529
DW 2532, 2535, 2537, 2540, 2543, 2545, 2548, 2551
DW 2553, 2556, 2559, 2561, 2564, 2567, 2569, 2572
DW 2575, 2577, 2580, 2583, 2585, 2588, 2591, 2594
DW 2596, 2599, 2602, 2604, 2607, 2610, 2612, 2615
DW 2618, 2620, 2623, 2626, 2628, 2631, 2634, 2636
DW 2639, 2642, 2644, 2647, 2650, 2653, 2655, 2658
DW 2661, 2663, 2666, 2669, 2671, 2674, 2677, 2679
DW 2682, 2685, 2687, 2690, 2693, 2695, 2698, 2701
DW 2703, 2706, 2709, 2712, 2714, 2717, 2720, 2722
DW 2725, 2728, 2730, 2733, 2736, 2738, 2741, 2744

View File

@ -0,0 +1,28 @@
DW 2930, 2841, 2757, 2679, 2604, 2534, 2467, 2404
DW 2344, 2287, 2232, 2180, 2131, 2083, 2038, 1995
DW 1953, 1913, 1875, 1838, 1803, 1769, 1736, 1705
DW 1674, 1645, 1616, 1589, 1563, 1537, 1512, 1488
DW 1465, 1442, 1420, 1399, 1379, 1359, 1339, 1320
DW 1302, 1284, 1267, 1250, 1234, 1218, 1202, 1187
DW 1172, 1157, 1143, 1130, 1116, 1103, 1090, 1078
DW 1065, 1053, 1042, 1030, 1019, 1008, 997, 987
DW 977, 966, 957, 947, 938, 928, 919, 910
DW 901, 893, 884, 876, 868, 860, 852, 845
DW 837, 830, 822, 815, 808, 801, 794, 788
DW 781, 775, 768, 762, 756, 750, 744, 738
DW 732, 727, 721, 716, 710, 705, 700, 694
DW 689, 684, 679, 674, 670, 665, 660, 656
DW 651, 647, 642, 638, 633, 629, 625, 621
DW 617, 613, 609, 605, 601, 597, 593, 590
DW 586, 582, 579, 575, 572, 568, 565, 561
DW 558, 555, 551, 548, 545, 542, 539, 536
DW 533, 530, 527, 524, 521, 518, 515, 512
DW 510, 507, 504, 501, 499, 496, 493, 491
DW 488, 486, 483, 481, 478, 476, 473, 471
DW 469, 466, 464, 462, 460, 457, 455, 453
DW 451, 449, 446, 444, 442, 440, 438, 436
DW 434, 432, 430, 428, 426, 424, 422, 420
DW 419, 417, 415, 413, 411, 409, 408, 406
DW 404, 402, 401, 399, 397, 396, 394, 392
DW 391, 389, 387, 386, 384, 383, 381, 380
DW 378, 377, 375, 374, 372, 371, 369, 368

View File

@ -0,0 +1,33 @@
DB #00, #01, #01, #02, #03, #03, #04, #05, #05, #06, #07, #07, #08, #09, #09, #0A
DB #0B, #0B, #0C, #0D, #0D, #0E, #0F, #0F, #10, #11, #11, #12, #13, #13, #14, #15
DB #15, #16, #17, #17, #18, #19, #19, #1A, #1B, #1B, #1C, #1D, #1D, #1E, #1F, #1F
DB #20, #21, #21, #22, #23, #23, #24, #25, #25, #26, #27, #27, #28, #29, #29, #2A
DB #2B, #2B, #2C, #2D, #2D, #2E, #2F, #2F, #30, #31, #31, #32, #33, #33, #34, #35
DB #35, #36, #37, #37, #38, #39, #39, #3A, #3B, #3B, #3C, #3D, #3D, #3E, #3F, #3F
DB #40, #41, #41, #42, #43, #43, #44, #45, #45, #46, #47, #47, #48, #49, #49, #4A
DB #4B, #4B, #4C, #4D, #4D, #4E, #4F, #4F, #50, #51, #51, #52, #53, #53, #54, #55
DB #55, #56, #57, #57, #58, #59, #59, #5A, #5B, #5B, #5C, #5D, #5D, #5E, #5F, #5F
DB #60, #61, #61, #62, #63, #63, #64, #65, #65, #66, #67, #67, #68, #69, #69, #6A
DB #6B, #6B, #6C, #6D, #6D, #6E, #6F, #6F, #70, #71, #71, #72, #73, #73, #74, #75
DB #75, #76, #77, #77, #78, #79, #79, #7A, #7B, #7B, #7C, #7D, #7D, #7E, #7F, #7F
DB #80, #81, #81, #82, #83, #83, #84, #85, #85, #86, #87, #87, #88, #89, #89, #8A
DB #8B, #8B, #8C, #8D, #8D, #8E, #8F, #8F, #90, #91, #91, #92, #93, #93, #94, #95
DB #95, #96, #97, #97, #98, #99, #99, #9A, #9B, #9B, #9C, #9D, #9D, #9E, #9F, #9F
DB #A0, #A1, #A1, #A2, #A3, #A3, #A4, #A5, #A5, #A6, #A7, #A7, #A8, #A9, #A9, #AA
DB #55, #56, #57, #57, #58, #59, #59, #5A, #5B, #5B, #5C, #5D, #5D, #5E, #5F, #5F
DB #60, #61, #61, #62, #63, #63, #64, #65, #65, #66, #67, #67, #68, #69, #69, #6A
DB #6B, #6B, #6C, #6D, #6D, #6E, #6F, #6F, #70, #71, #71, #72, #73, #73, #74, #75
DB #75, #76, #77, #77, #78, #79, #79, #7A, #7B, #7B, #7C, #7D, #7D, #7E, #7F, #7F
DB #80, #81, #81, #82, #83, #83, #84, #85, #85, #86, #87, #87, #88, #89, #89, #8A
DB #8B, #8B, #8C, #8D, #8D, #8E, #8F, #8F, #90, #91, #91, #92, #93, #93, #94, #95
DB #95, #96, #97, #97, #98, #99, #99, #9A, #9B, #9B, #9C, #9D, #9D, #9E, #9F, #9F
DB #A0, #A1, #A1, #A2, #A3, #A3, #A4, #A5, #A5, #A6, #A7, #A7, #A8, #A9, #A9, #AA
DB #AB, #AB, #AC, #AD, #AD, #AE, #AF, #AF, #B0, #B1, #B1, #B2, #B3, #B3, #B4, #B5
DB #B5, #B6, #B7, #B7, #B8, #B9, #B9, #BA, #BB, #BB, #BC, #BD, #BD, #BE, #BF, #BF
DB #C0, #C1, #C1, #C2, #C3, #C3, #C4, #C5, #C5, #C6, #C7, #C7, #C8, #C9, #C9, #CA
DB #CB, #CB, #CC, #CD, #CD, #CE, #CF, #CF, #D0, #D1, #D1, #D2, #D3, #D3, #D4, #D5
DB #D5, #D6, #D7, #D7, #D8, #D9, #D9, #DA, #DB, #DB, #DC, #DD, #DD, #DE, #DF, #DF
DB #E0, #E1, #E1, #E2, #E3, #E3, #E4, #E5, #E5, #E6, #E7, #E7, #E8, #E9, #E9, #EA
DB #EB, #EB, #EC, #ED, #ED, #EE, #EF, #EF, #F0, #F1, #F1, #F2, #F3, #F3, #F4, #F5
DB #F5, #F6, #F7, #F7, #F8, #F9, #F9, #FA, #FB, #FB, #FC, #FD, #FD, #FE, #FF, #FF

View File

@ -0,0 +1,143 @@
DW 18367, 17336, 16363, 15444, 14578, 13759, 12987, 12258, 11570, 10921, 10308, 9729
DW 9183, 8668, 8181, 7722, 7289, 6880, 6494, 6129, 5785, 5460, 5154, 4865
DW 4592, 4334, 4091, 3861, 3644, 3440, 3247, 3065, 2893, 2730, 2577, 2432
DW 2296, 2167, 2045, 1931, 1822, 1720, 1623, 1532, 1446, 1365, 1288, 1216
DW 1148, 1083, 1023, 965, 911, 860, 812, 766, 723, 683, 644, 608
DW 574, 542, 511, 483, 456, 430, 406, 383, 362, 341, 322, 304
DW 287, 271, 256, 241, 228, 215, 203, 192, 181, 171, 161, 152
DW 143, 135, 128, 121, 114, 107, 101, 96, 90, 85, 81, 76
DW 18234, 17211, 16245, 15333, 14473, 13660, 12894, 12170, 11487, 10842, 10234, 9659
DW 9117, 8606, 8123, 7667, 7236, 6830, 6447, 6085, 5744, 5421, 5117, 4830
DW 4559, 4303, 4061, 3833, 3618, 3415, 3223, 3043, 2872, 2711, 2558, 2415
DW 2279, 2151, 2031, 1917, 1809, 1708, 1612, 1521, 1436, 1355, 1279, 1207
DW 1140, 1076, 1015, 958, 905, 854, 806, 761, 718, 678, 640, 604
DW 570, 538, 508, 479, 452, 427, 403, 380, 359, 339, 320, 302
DW 285, 269, 254, 240, 226, 213, 201, 190, 179, 169, 160, 151
DW 142, 134, 127, 120, 113, 107, 101, 95, 90, 85, 80, 75
DW 18103, 17087, 16128, 15223, 14369, 13562, 12801, 12083, 11404, 10764, 10160, 9590
DW 9052, 8544, 8064, 7611, 7184, 6781, 6400, 6041, 5702, 5382, 5080, 4795
DW 4526, 4272, 4032, 3806, 3592, 3391, 3200, 3021, 2851, 2691, 2540, 2397
DW 2263, 2136, 2016, 1903, 1796, 1695, 1600, 1510, 1426, 1346, 1270, 1199
DW 1131, 1068, 1008, 951, 898, 848, 800, 755, 713, 673, 635, 599
DW 566, 534, 504, 476, 449, 424, 400, 378, 356, 336, 318, 300
DW 283, 267, 252, 238, 225, 212, 200, 189, 178, 168, 159, 150
DW 141, 133, 126, 119, 112, 106, 100, 94, 89, 84, 79, 75
DW 17973, 16964, 16012, 15113, 14265, 13465, 12709, 11996, 11322, 10687, 10087, 9521
DW 8987, 8482, 8006, 7557, 7133, 6732, 6354, 5998, 5661, 5343, 5044, 4760
DW 4493, 4241, 4003, 3778, 3566, 3366, 3177, 2999, 2831, 2672, 2522, 2380
DW 2247, 2121, 2002, 1889, 1783, 1683, 1589, 1499, 1415, 1336, 1261, 1190
DW 1123, 1060, 1001, 945, 892, 842, 794, 750, 708, 668, 630, 595
DW 562, 530, 500, 472, 446, 421, 397, 375, 354, 334, 315, 298
DW 281, 265, 250, 236, 223, 210, 199, 187, 177, 167, 158, 149
DW 140, 133, 125, 118, 111, 105, 99, 94, 88, 83, 79, 74
DW 17844, 16842, 15897, 15005, 14163, 13368, 12617, 11909, 11241, 10610, 10014, 9452
DW 8922, 8421, 7948, 7502, 7081, 6684, 6309, 5955, 5620, 5305, 5007, 4726
DW 4461, 4211, 3974, 3751, 3541, 3342, 3154, 2977, 2810, 2652, 2504, 2363
DW 2230, 2105, 1987, 1876, 1770, 1671, 1577, 1489, 1405, 1326, 1252, 1182
DW 1115, 1053, 994, 938, 885, 835, 789, 744, 703, 663, 626, 591
DW 558, 526, 497, 469, 443, 418, 394, 372, 351, 332, 313, 295
DW 279, 263, 248, 234, 221, 209, 197, 186, 176, 166, 156, 148
DW 139, 132, 124, 117, 111, 104, 99, 93, 88, 83, 78, 74
DW 17715, 16721, 15783, 14897, 14061, 13272, 12527, 11824, 11160, 10534, 9942, 9384
DW 8858, 8361, 7891, 7448, 7030, 6636, 6263, 5912, 5580, 5267, 4971, 4692
DW 4429, 4180, 3946, 3724, 3515, 3318, 3132, 2956, 2790, 2633, 2486, 2346
DW 2214, 2090, 1973, 1862, 1758, 1659, 1566, 1478, 1395, 1317, 1243, 1173
DW 1107, 1045, 986, 931, 879, 829, 783, 739, 697, 658, 621, 587
DW 554, 523, 493, 466, 439, 415, 391, 369, 349, 329, 311, 293
DW 277, 261, 247, 233, 220, 207, 196, 185, 174, 165, 155, 147
DW 138, 131, 123, 116, 110, 104, 98, 92, 87, 82, 78, 73
DW 17588, 16601, 15669, 14790, 13960, 13176, 12437, 11739, 11080, 10458, 9871, 9317
DW 8794, 8300, 7835, 7395, 6980, 6588, 6218, 5869, 5540, 5229, 4935, 4658
DW 4397, 4150, 3917, 3697, 3490, 3294, 3109, 2935, 2770, 2614, 2468, 2329
DW 2198, 2075, 1959, 1849, 1745, 1647, 1555, 1467, 1385, 1307, 1234, 1165
DW 1099, 1038, 979, 924, 872, 824, 777, 734, 692, 654, 617, 582
DW 550, 519, 490, 462, 436, 412, 389, 367, 346, 327, 308, 291
DW 275, 259, 245, 231, 218, 206, 194, 183, 173, 163, 154, 146
DW 137, 130, 122, 116, 109, 103, 97, 92, 87, 82, 77, 73
DW 17461, 16481, 15556, 14683, 13859, 13081, 12347, 11654, 11000, 10383, 9800, 9250
DW 8731, 8241, 7778, 7342, 6930, 6541, 6174, 5827, 5500, 5191, 4900, 4625
DW 4365, 4120, 3889, 3671, 3465, 3270, 3087, 2914, 2750, 2596, 2450, 2312
DW 2183, 2060, 1945, 1835, 1732, 1635, 1543, 1457, 1375, 1298, 1225, 1156
DW 1091, 1030, 972, 918, 866, 818, 772, 728, 687, 649, 612, 578
DW 546, 515, 486, 459, 433, 409, 386, 364, 344, 324, 306, 289
DW 273, 258, 243, 229, 217, 204, 193, 182, 172, 162, 153, 145
DW 136, 129, 122, 115, 108, 102, 96, 91, 86, 81, 77, 72
DW 19459, 18367, 17336, 16363, 15444, 14578, 13759, 12987, 12258, 11570, 10921, 10308
DW 9729, 9183, 8668, 8181, 7722, 7289, 6880, 6494, 6129, 5785, 5460, 5154
DW 4865, 4592, 4334, 4091, 3861, 3644, 3440, 3247, 3065, 2893, 2730, 2577
DW 2432, 2296, 2167, 2045, 1931, 1822, 1720, 1623, 1532, 1446, 1365, 1288
DW 1216, 1148, 1083, 1023, 965, 911, 860, 812, 766, 723, 683, 644
DW 608, 574, 542, 511, 483, 456, 430, 406, 383, 362, 341, 322
DW 304, 287, 271, 256, 241, 228, 215, 203, 192, 181, 171, 161
DW 152, 143, 135, 128, 121, 114, 107, 101, 96, 90, 85, 81
DW 19319, 18234, 17211, 16245, 15333, 14473, 13660, 12894, 12170, 11487, 10842, 10234
DW 9659, 9117, 8606, 8123, 7667, 7236, 6830, 6447, 6085, 5744, 5421, 5117
DW 4830, 4559, 4303, 4061, 3833, 3618, 3415, 3223, 3043, 2872, 2711, 2558
DW 2415, 2279, 2151, 2031, 1917, 1809, 1708, 1612, 1521, 1436, 1355, 1279
DW 1207, 1140, 1076, 1015, 958, 905, 854, 806, 761, 718, 678, 640
DW 604, 570, 538, 508, 479, 452, 427, 403, 380, 359, 339, 320
DW 302, 285, 269, 254, 240, 226, 213, 201, 190, 179, 169, 160
DW 151, 142, 134, 127, 120, 113, 107, 101, 95, 90, 85, 80
DW 19180, 18103, 17087, 16128, 15223, 14369, 13562, 12801, 12083, 11404, 10764, 10160
DW 9590, 9052, 8544, 8064, 7611, 7184, 6781, 6400, 6041, 5702, 5382, 5080
DW 4795, 4526, 4272, 4032, 3806, 3592, 3391, 3200, 3021, 2851, 2691, 2540
DW 2397, 2263, 2136, 2016, 1903, 1796, 1695, 1600, 1510, 1426, 1346, 1270
DW 1199, 1131, 1068, 1008, 951, 898, 848, 800, 755, 713, 673, 635
DW 599, 566, 534, 504, 476, 449, 424, 400, 378, 356, 336, 318
DW 300, 283, 267, 252, 238, 225, 212, 200, 189, 178, 168, 159
DW 150, 141, 133, 126, 119, 112, 106, 100, 94, 89, 84, 79
DW 19042, 17973, 16964, 16012, 15113, 14265, 13465, 12709, 11996, 11322, 10687, 10087
DW 9521, 8987, 8482, 8006, 7557, 7133, 6732, 6354, 5998, 5661, 5343, 5044
DW 4760, 4493, 4241, 4003, 3778, 3566, 3366, 3177, 2999, 2831, 2672, 2522
DW 2380, 2247, 2121, 2002, 1889, 1783, 1683, 1589, 1499, 1415, 1336, 1261
DW 1190, 1123, 1060, 1001, 945, 892, 842, 794, 750, 708, 668, 630
DW 595, 562, 530, 500, 472, 446, 421, 397, 375, 354, 334, 315
DW 298, 281, 265, 250, 236, 223, 210, 199, 187, 177, 167, 158
DW 149, 140, 133, 125, 118, 111, 105, 99, 94, 88, 83, 79
DW 18905, 17844, 16842, 15897, 15005, 14163, 13368, 12617, 11909, 11241, 10610, 10014
DW 9452, 8922, 8421, 7948, 7502, 7081, 6684, 6309, 5955, 5620, 5305, 5007
DW 4726, 4461, 4211, 3974, 3751, 3541, 3342, 3154, 2977, 2810, 2652, 2504
DW 2363, 2230, 2105, 1987, 1876, 1770, 1671, 1577, 1489, 1405, 1326, 1252
DW 1182, 1115, 1053, 994, 938, 885, 835, 789, 744, 703, 663, 626
DW 591, 558, 526, 497, 469, 443, 418, 394, 372, 351, 332, 313
DW 295, 279, 263, 248, 234, 221, 209, 197, 186, 176, 166, 156
DW 148, 139, 132, 124, 117, 111, 104, 99, 93, 88, 83, 78
DW 18769, 17715, 16721, 15783, 14897, 14061, 13272, 12527, 11824, 11160, 10534, 9942
DW 9384, 8858, 8361, 7891, 7448, 7030, 6636, 6263, 5912, 5580, 5267, 4971
DW 4692, 4429, 4180, 3946, 3724, 3515, 3318, 3132, 2956, 2790, 2633, 2486
DW 2346, 2214, 2090, 1973, 1862, 1758, 1659, 1566, 1478, 1395, 1317, 1243
DW 1173, 1107, 1045, 986, 931, 879, 829, 783, 739, 697, 658, 621
DW 587, 554, 523, 493, 466, 439, 415, 391, 369, 349, 329, 311
DW 293, 277, 261, 247, 233, 220, 207, 196, 185, 174, 165, 155
DW 147, 138, 131, 123, 116, 110, 104, 98, 92, 87, 82, 78
DW 18634, 17588, 16601, 15669, 14790, 13960, 13176, 12437, 11739, 11080, 10458, 9871
DW 9317, 8794, 8300, 7835, 7395, 6980, 6588, 6218, 5869, 5540, 5229, 4935
DW 4658, 4397, 4150, 3917, 3697, 3490, 3294, 3109, 2935, 2770, 2614, 2468
DW 2329, 2198, 2075, 1959, 1849, 1745, 1647, 1555, 1467, 1385, 1307, 1234
DW 1165, 1099, 1038, 979, 924, 872, 824, 777, 734, 692, 654, 617
DW 582, 550, 519, 490, 462, 436, 412, 389, 367, 346, 327, 308
DW 291, 275, 259, 245, 231, 218, 206, 194, 183, 173, 163, 154
DW 146, 137, 130, 122, 116, 109, 103, 97, 92, 87, 82, 77
DW 18500, 17461, 16481, 15556, 14683, 13859, 13081, 12347, 11654, 11000, 10383, 9800
DW 9250, 8731, 8241, 7778, 7342, 6930, 6541, 6174, 5827, 5500, 5191, 4900
DW 4625, 4365, 4120, 3889, 3671, 3465, 3270, 3087, 2914, 2750, 2596, 2450
DW 2312, 2183, 2060, 1945, 1835, 1732, 1635, 1543, 1457, 1375, 1298, 1225
DW 1156, 1091, 1030, 972, 918, 866, 818, 772, 728, 687, 649, 612
DW 578, 546, 515, 486, 459, 433, 409, 386, 364, 344, 324, 306
DW 289, 273, 258, 243, 229, 217, 204, 193, 182, 172, 162, 153
DW 145, 136, 129, 122, 115, 108, 102, 96, 91, 86, 81, 77

View File

@ -0,0 +1,426 @@
GSRomBaseL equ #0000
GSRomBaseH equ #c000
BTICK EQU 750
DAC0 EQU #6000
DAC1 EQU #6100
DAC2 EQU #6200
DAC3 EQU #6300
VOL0 EQU #06
VOL1 EQU #07
VOL2 EQU #08
VOL3 EQU #09
FLAGS EQU #04
OUTRG EQU #03
DATRG EQU #02
COMRG EQU #01
RSCOM EQU #05
PAGE EQU #00
CHSTAT EQU #00
CHFLAGS EQU #01
CHCURL EQU #02
CHCURH EQU #03
CHCURP EQU #04
CHENDL EQU #05
CHENDH EQU #06
CHENDP EQU #07
CHLPBL EQU #08
CHLPBH EQU #09
CHLPBP EQU #0A
CHLPEL EQU #0B
CHLPEH EQU #0C
CHLPEP EQU #0D
CHCNTL EQU #0E
CHCNTH EQU #0F
CHFRQL EQU #10
CHFRQH EQU #11
CHPERL EQU #12
CHPERH EQU #13
CHREAL EQU #14
CHFINE EQU #15
CHRLNT EQU #16
CHPAN EQU #17
CHEPAN EQU #18
CHVOL EQU #19
CHMVOL EQU #1A
CHEVOL EQU #1B
CHFVOL EQU #1C
CHDELVL EQU #1D
CHDELVH EQU #1E
CHDELSL EQU #1F
CHDELSH EQU #20
CHFADVL EQU #21
CHFADVH EQU #22
CHFADSL EQU #23
CHFADSH EQU #24
CHRDR EQU #25
CHRDRI EQU #26
CHRDN EQU #27
CHNOTE EQU #28
CHINS EQU #29
CHSMP EQU #2A
CHCOM EQU #2B
CHPARM EQU #2C
CHVCMD EQU #2D
CHPORT EQU #2E
CHWNT EQU #2F
CHVIBCM EQU #30
CHVIBPS EQU #31
CHTRMCM EQU #32
CHTRMPS EQU #33
CHPATPS EQU #34
CHLPCNT EQU #35
CHOFFST EQU #36
CHSLUP EQU #37
CHSLDN EQU #38
CHPRIOR EQU #39
CHSQZ EQU #3A
;CH EQU #3B
;CH EQU #3C
;CH EQU #3D
;CH EQU #3E
CHOLDV EQU #3F
CHANLEN EQU #40
CHNS EQU #04
SMPBEG EQU #00 ;+00 SAMPLE START ADRESS
SMPEND EQU #03 ;+03 SAMPLE END ADRESS
SMPFT EQU #06 ;+06 SAMPLE FINETUNE
SMPVOL EQU #07 ;+07 SAMPLE VOLUME
SMPLPB EQU #08 ;+08 SAMPLE LOOP START
SMPLPE EQU #0B ;+0B SAMPLE LOOP END
SMPTYPE EQU #00
SMPBEGL EQU #01
SMPBEGM EQU #02
SMPBEGH EQU #03
SMPENDL EQU #04
SMPENDM EQU #05
SMPENDH EQU #06
SMPFINE EQU #08
SMPLPBL EQU #09
SMPLPBM EQU #0A
SMPLPBH EQU #0B
SMPLPEL EQU #0C
SMPLPEM EQU #0D
SMPLPEH EQU #0E
SMPREL EQU #0F
SMPPAN EQU #10
SMPCNT EQU #11
SMPSQZ EQU #12
SMPFRQL EQU #13
SMPFRQH EQU #14
SMPPERL EQU #15
SMPPERH EQU #16
SMPCHAN EQU #17
STACK EQU #4400
FXHEAD EQU #41C0
TBUFFER EQU #4200
ISTACK EQU #4400
CHANSFX EQU #4400
CHANS EQU #4600
SMPADR EQU #4800
FXADR EQU #4C00
INSTAB EQU #4E00
SMPTAB EQU #4F00
PATDC0 EQU #5000
PATDC1 EQU #5200
PATDC2 EQU #5400
PATDC3 EQU #5600
BUFFER EQU #5800
ORG #8000 ;dummy
PHASE #4000
RAMPG DEFS #3F
ROMPG DEFS #01
INTAREA DEFS #40
NUMPG DEFS #01
CPAGE DEFS #01
SYSTEM DEFS #01
SDPAGE DEFS #01
PROCESS DEFS #01
PLAYING DEFS #01
BUSY DEFS #01
INGEN DEFS #01
INT DEFS #01
INTYPE DEFS #01
INTADR DEFS #02
QTFREE DEFS #02
QTBUSY DEFS #02
CNTMOD DEFS #01
CNTSMP DEFS #01
CNTFX DEFS #01
CNTTRK DEFS #02
CNTCHN DEFS #01
CURMOD DEFS #01
CURSMP DEFS #01
CURFX DEFS #01
CURTRK DEFS #02
CURCHN DEFS #01
CURCHAN DEFS #02
MODULE DEFS #01
GSCHNS DEFS #01
FXCHNS DEFS #01
PLCHNS DEFS #01 ; << PAIR
MDCHNS DEFS #01 ; <<
MTCHNS DEFS #01
MODVOL DEFS #01
FXVOL DEFS #01
FXMVOL DEFS #01
MODFADE DEFS #01
FXFADE DEFS #01
MODSWCH DEFS #01
FILLALL DEFS #01
INFO DEFS #01
MODSLEN DEFS #03
FXSLEN DEFS #03
ERRCODE DEFS #01
SGENOFF DEFS #01
CHANNEL DEFS #01
MODPLT DEFS #01
MODSPLT DEFS #01
CONVERT DEFS #01
LSTCHN DEFS #01
LSTFX DEFS #01
LSTMOD DEFS #01
LSTTRC DEFS #02
FXTICK DEFS #02
FXTCLEN DEFS #02
TADR DEFS 2
TLEN DEFS 2
TBUFLEN DEFS 2
TBUFBEG DEFS 2
TBUFLN2 DEFS 2
TBUFBG2 DEFS 2
TBUFOLD DEFS 1
TERROR DEFS 1
TGLBL DEFS 2
TGLBH DEFS 1
TLDDL DEFS 2
TLDDH DEFS 1
TRQLENL DEFS 2
TRQLENH DEFS 1
TSIZE DEFS 2
TCRC DEFS 1
TBURST DEFS 1
TMODE DEFS 1 ;#00-MODULE,#FF-SAMPLE
TMODL DEFS 2
TMODH DEFS 1
TSMPL DEFS 2
TSMPH DEFS 1
LBCOUNT DEFS 1
UNPHASE
PHASE #4100-48
RAMBOT DEFS #03
PTR1 DEFS #03
PTR2 DEFS #03
MEMBOT DEFS #03
PTR3 DEFS #03
PTR4 DEFS #03
MEMTOP DEFS #03
PTR5 DEFS #03
PTR6 DEFS #03
PTR7 DEFS #03
PTR8 DEFS #03
PTR9 DEFS #03
PTRA DEFS #03
PTRB DEFS #03
PTRC DEFS #03
RAMTOP DEFS #03
UNPHASE
PHASE #4100
QTMAP DEFS #20
VOLTAB DEFS #20
CHNVOL DEFS #08
VOLRQTB DEFS #08
MTTYPE DEFS #01
MTSTAT DEFS #01
MTFLAGS DEFS #01
TICKLEN DEFS #02
TCKLEFT DEFS #02
MTBPM DEFS #01
MTSPEED DEFS #01
MTCOUNT DEFS #01
MTPATPS DEFS #01
MTSNGPS DEFS #01
MTSNGSZ DEFS #01
MTSNGLP DEFS #01
MTPDT2 DEFS #01
MTPDT DEFS #01
MTBRKFL DEFS #01
MTBRKPS DEFS #01
MTJMPFL DEFS #01
MTFILTR DEFS #01
MTROWS DEFS #01
MTVOL DEFS #01
DEFS #01
DEFS #01
MODDIR DEFS 8*6
CURADR DEFS 3
SMPS DEFS #03
PATTS DEFS #01
MODTP DEFS #01
UNPHASE
ORG GSRomBaseL ;clear low ROM
DEFS #4000,#FF
ORG GSRomBaseH ;clear high ROM
DEFS #4000,#FF
ORG GSRomBaseL
DI
JP INIT
DEFB #04 ;LOW (in BCD!)
DEFB #01 ;HIGH (in BCD!)
ROMCRC ;DEFS #02
DW #e428 ;CRC from original rom, corrupted!?
ORG GSRomBaseL+#0030
JP #2030
ORG GSRomBaseL+#0038
INT8 EX AF,AF'
PUSH DE
LD E,A
LD D,HX
LD A,(DE)
INC D
LD A,(DE)
INC D
LD A,(DE)
INC D
LD A,(DE)
INC E
JR Z,INT8_
LD A,E
POP DE
EX AF,AF'
EI
RET
INT8_ JP QTDONE
ORG GSRomBaseL+#0066
NMILP POP HL
LD A,L
OUT (OUTRG),A
NMILP2 IN A,(FLAGS)
RLCA
JR C,NMILP2
LD A,H
OUT (OUTRG),A
NMILP3 IN A,(FLAGS)
RLCA
JR C,NMILP3
JP NMILP
ORG GSRomBaseL+#0100
DEFM "General Sound (tm) ROM"
DEFM "Copyright 1997 Stinger"
DEFM "Version 1.04 Beta PreRls"
; LOW ROM INCLUDES
INCLUDE "INIT_L.a80"
INCLUDE "COM_L.a80"
INCLUDE "MEM_L.a80"
; INCLUDE "TRANSF_L.a80"
INCLUDE "LOAD_L.a80"
INCLUDE "PLAY.a80"
INCLUDE "QUANTUM.a80"
INCLUDE "INTTST.a80"
INCLUDE "COMM.a80"
INCLUDE "GEN_L.a80"
INCLUDE "TABLES_L.a80"
BPMTAB INCLUDE "_BPM.a80"
INCLUDE "_trash.a80" ;comes from original ROM!
Free1
ORG GSRomBaseL+#2000
SGEN INCLUDE "SGEN_ASM.a80"
ORG GSRomBaseL+#3E00
DIVTAB3 INCLUDE "_DIVTAB3.a80"
___LEND
; HIGH ROM INCLUDES
ORG GSRomBaseH
; PHASE #c000
INCLUDE "INIT_H.a80"
INCLUDE "COM_H.a80"
INCLUDE "MEM_H.a80"
INCLUDE "ENGINE_L.a80"
INCLUDE "FX_H.a80"
INCLUDE "VOL_H.a80"
INCLUDE "TEST_H.a80"
INCLUDE "TABLES_H.a80"
INCLUDE "DIHO.a80"
___END
; UNPHASE
ORG GSRomBaseH+#2000
INCLUDE "_GSFRQTB.a80"
INCLUDE "_AMFRQTB.a80"
INCLUDE "_AMTOGS.a80"
GSFRQTB EQU #E000
AMFRQTB EQU #EC00
AMTOGS EQU #F800

View File

@ -0,0 +1,85 @@
_bpm.a80:
таблица пересчета скорости "бит в минуту" в количество прерываний GS на тик
(тик равен скорости модуля).
37500 Hz * 60 сек = 2250000 прерываний/мин
1 бит = 24 тика (из описания формата mod)
минимум 32 б/мин = 768 тиков в минуту
максимум 255 б/мин = 6120 тиков в минуту
void make_bpm_tab(void)
{
WORD bpmtab[224];
int i;
for (i=0;i<224;i++)
bpmtab[i]=(WORD)(0.5+2250000.0/((float)(i+32.0)*24.0));
}
_amfrqtb.a80:
таблица соответствия периодов (нот) в модуле нотам всех 8ми октав.
октава периоды--->
1 6848 6464 6100 5760 5428 5124 4836 4564 4308 4068 3844 3628
2 3424 3232 3050 2880 2714 2562 2418 2282 2154 2034 1922 1814
3 1712 1616 1525 1440 1357 1281 1209 1141 1077 1017 961 907
4 856 808 763 720 679 641 605 571 539 509 481 454
5 428 404 381 360 339 320 302 285 269 254 240 227
6 214 202 191 180 170 160 151 143 135 127 120 113
7 107 101 95 90 85 80 76 71 67 64 60 57
8 54 51 48 45 42 40 38 36 34 32 30 28
1 +finetune=1 \
.. +finetune=2 | 15 раз для всех finetune
.. +finetune=n |
8 +finetune=-8 /
_gsfrqtb.a80
таблица периодов (нот) для GS (аналогична амижной).
в оригинальной версии прошивки зависимость между периодом GS и амигой
выражалась формулой:
GS_Per = Ami_Per * 2,68203735351562
в исправленной версии:
GS_Per = Ami_Per * 2,704
_amtogs.a80
таблица перевода периодов амиги в периоды GS (расчитана по формулам как в
_gsfrqtb.a80). в этой таблице значения первых 1024 периодов (0..1023).
значения больших периодов вычисляются в функции EFXCNV (FX_H.a80).

View File

@ -0,0 +1,7 @@
;strange block, comes from original ROM.
;real garbage;)
DB #56, #43, #56, #49, #45, #57, #20, #20, #45, #58, #54, #20, #00, #00, #00, #00
DB #00, #00, #00, #00, #00, #00, #C4, #08, #43, #21, #28, #09, #DA, #02, #00, #00
DB #00, #43, #56, #49, #45, #57, #20, #20, #45, #58, #54, #20, #00, #00, #00, #00
DB #00, #00, #00, #00, #00, #00, #C4, #08, #43, #21, #28, #09, #DA, #02, #00, #00

View File

@ -0,0 +1,411 @@
SGENTBE DEFW S0,S1,S2,S3,S4,S5,S6,S7,S8
SGENTBF DEFW SGEN1,SGEN2,SGEN3,SGEN4
DEFW SGEN5,SGEN6,SGEN7,SGEN8
DEFW SGEN9
DEFW 0,0,0,0,0,0
SGEN EXX
INC D
DEC D
JP Z,SGEN_
LD C,A
LD A,D
DEC A
CP #09
JP NC,SGEN__
ADD A,A
ADD A,low SGENTBF
LD L,A
LD H,high SGENTBF
LD A,(HL)
INC L
LD H,(HL)
LD L,A
LD A,C
JP (HL)
SGEN1 EXX
ADD A,(HL)
RRA
LD (DE),A
INC E
EXX
JP SGEN_
SGEN2 EXX
SUB (HL)
EXX
LD H,high DIVTAB3
JP NC,SGEN2_2
INC H
SGEN2_2 LD L,A
LD A,(HL)
EXX
ADD A,(HL)
LD (DE),A
INC E
ADD A,(HL)
RRA
LD (DE),A
INC E
EXX
JP SGEN_
SGEN3 EXX
ADD A,(HL)
RRA
EXX
LD L,A
ADD A,C
RRA
EXX
LD (DE),A
INC E
EXX
LD A,L
EXX
LD (DE),A
INC E
ADD A,(HL)
RRA
LD (DE),A
INC E
EXX
JP SGEN_
SGEN4 EXX
ADD A,(HL)
RRA
EXX
LD L,A
ADD A,C
RRA
EXX
LD (DE),A
INC E
EXX
LD A,L
EXX
LD (DE),A
INC E
LD (DE),A
INC E
ADD A,(HL)
RRA
LD (DE),A
INC E
EXX
JP SGEN_
SGEN5 EXX
ADD A,(HL)
RRA
EXX
LD L,A
ADD A,C
RRA
EXX
LD (DE),A
INC E
LD (DE),A
INC E
EXX
LD A,L
EXX
LD (DE),A
INC E
ADD A,(HL)
RRA
LD (DE),A
INC E
LD (DE),A
INC E
EXX
JP SGEN_
SGEN6 EXX
ADD A,(HL)
RRA
EXX
LD L,A
ADD A,C
RRA
EXX
LD (DE),A
INC E
LD (DE),A
INC E
EXX
LD A,L
EXX
LD (DE),A
INC E
LD (DE),A
INC E
ADD A,(HL)
RRA
LD (DE),A
INC E
LD (DE),A
INC E
EXX
JP SGEN_
SGEN7 EXX
ADD A,(HL)
RRA
EXX
LD L,A
ADD A,C
RRA
LD H,A
ADD A,C
RRA
EXX
LD (DE),A
INC E
EXX
LD A,H
EXX
LD (DE),A
INC E
EXX
ADD A,L
RRA
EXX
LD (DE),A
INC E
EXX
LD A,L
EXX
LD (DE),A
INC E
ADD A,(HL)
RRA
EXX
LD H,A
ADD A,L
RRA
EXX
LD (DE),A
INC E
EXX
LD A,H
EXX
LD (DE),A
INC E
ADD A,(HL)
RRA
LD (DE),A
INC E
EXX
JP SGEN_
SGEN8 EXX
ADD A,(HL)
RRA
EXX
LD L,A
ADD A,C
RRA
LD H,A
ADD A,C
RRA
EXX
LD (DE),A
INC E
EXX
LD A,H
EXX
LD (DE),A
INC E
EXX
ADD A,L
RRA
EXX
LD (DE),A
INC E
EXX
LD A,L
EXX
LD (DE),A
INC E
LD (DE),A
INC E
ADD A,(HL)
RRA
EXX
LD H,A
ADD A,L
RRA
EXX
LD (DE),A
INC E
EXX
LD A,H
EXX
LD (DE),A
INC E
ADD A,(HL)
RRA
LD (DE),A
INC E
EXX
JP SGEN_
SGEN9 EXX
ADD A,(HL)
RRA
EXX
LD L,A
ADD A,C
RRA
LD H,A
ADD A,C
RRA
EXX
LD (DE),A
INC E
EXX
LD A,H
EXX
LD (DE),A
INC E
LD (DE),A
INC E
EXX
ADD A,L
RRA
EXX
LD (DE),A
INC E
EXX
LD A,L
EXX
LD (DE),A
INC E
ADD A,(HL)
RRA
EXX
LD H,A
ADD A,L
RRA
EXX
LD (DE),A
INC E
EXX
LD A,H
EXX
LD (DE),A
INC E
LD (DE),A
INC E
ADD A,(HL)
RRA
LD (DE),A
INC E
EXX
JP SGEN_
SGEN__ JP SGEN_
SGEN_ LD A,E
CP #09
JR NC,S9
ADD A,A
LD L,A
LD H,high SGENTBE
LD A,(HL)
INC L
LD H,(HL)
LD L,A
JP (HL)
S9 EXX
LD C,#FF
EXX
LD D,#08
JP S8
S0 EXX
LD C,#00
EXX
LD D,#01
JP S1
S3 EXX
PUSH BC
EXX
POP HL
LD B,E
LD E,H
LD C,L
CALL S3_
S_RET LD LY,E
LD E,D
LD D,LY
PUSH DE
EXX
POP BC
RET
S4 EXX
PUSH BC
EXX
POP HL
LD B,E
LD E,H
LD C,L
CALL S4_
JP S_RET
S5 EXX
PUSH BC
EXX
POP HL
LD B,E
LD E,H
LD C,L
CALL S5_
JP S_RET
S6 EXX
PUSH BC
EXX
POP HL
LD B,E
LD E,H
LD C,L
CALL S6_
JP S_RET
S7 EXX
PUSH BC
EXX
POP HL
LD B,E
LD E,H
LD C,L
CALL S7_
JP S_RET
S8 EXX
PUSH BC
EXX
POP HL
LD B,E
LD E,H
LD C,L
CALL S8_
JP S_RET

Some files were not shown because too many files have changed in this diff Show More