init repo
209
README.md
Normal 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" /> <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
BIN
datasheet/572ПА1-v2.pdf
Normal file
BIN
datasheet/74HC08.pdf
Normal file
BIN
datasheet/74HC138.pdf
Normal file
BIN
datasheet/74HC175.pdf
Normal file
12567
datasheet/CY62256N.pdf
Normal file
BIN
datasheet/k6x4008c1f.pdf
Normal file
BIN
docs/BlackCat/block_ports.png
Normal file
After Width: | Height: | Size: 71 KiB |
BIN
docs/BlackCat/irqge.png
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
docs/BlackCat/snd_out.png
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
docs/Northwood/2mb.gif
Normal file
After Width: | Height: | Size: 57 KiB |
BIN
docs/Northwood/50ba5d184ed1.jpeg
Normal file
After Width: | Height: | Size: 1.7 MiB |
BIN
docs/Northwood/8d2c84c2cb33.jpeg
Normal file
After Width: | Height: | Size: 3.1 MiB |
BIN
docs/Northwood/Gerber_GS2M_NORTHWOOD.zip
Normal file
BIN
docs/Northwood/Schematic_GS2M_NORTHWOOD.png
Normal file
After Width: | Height: | Size: 444 KiB |
4613
docs/Northwood/iBOM_GS2M_NORTHWOOD.html
Normal file
BIN
docs/Northwood/pcb1.gif
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
docs/Northwood/pcb2.gif
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
docs/Northwood/photo_2025-01-01_12-55-54.jpg
Normal file
After Width: | Height: | Size: 159 KiB |
42
docs/Northwood/readme_by_Northwood.txt
Normal 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.
|
||||
|
BIN
docs/Northwood/Доработка для GS1.3.jpg
Normal file
After Width: | Height: | Size: 364 KiB |
BIN
docs/Programmgeneralisation.txt
Normal file
383
docs/format_mod.txt
Normal 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
@ -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.
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
|
BIN
docs/Буклет по GeneralSound.pdf
Normal file
BIN
docs/Другой ЦАП/другой цап.png
Normal file
After Width: | Height: | Size: 1.3 MiB |
BIN
docs/Замена 27512 на FLASH/FLASH.png
Normal file
After Width: | Height: | Size: 509 KiB |
5
docs/Замена 27512 на FLASH/Адреса для прошивки FLASH.txt
Normal file
@ -0,0 +1,5 @@
|
||||
Прошивка GS размером 32КБ заливается для разных Flash по следующим адресам HEX !
|
||||
|
||||
Flash 128kb 49f010 - #18000
|
||||
Flash 256kb 49f020 - #38000
|
||||
Flash 512kb 49f040 - #78000
|
BIN
docs/Замена 27512 на FLASH/Установка FLASH.png
Normal file
After Width: | Height: | Size: 636 KiB |
1
docs/Замена ИЕ2 на ИЕ5/Описание.txt
Normal file
@ -0,0 +1 @@
|
||||
Если не смогли найти счетчик ИЕ2 он легко меняется на ИЕ5
|
BIN
docs/Замена ИЕ2 на ИЕ5/Схема.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
docs/Исправляем диодный дешифратор/scheme-1.1.pdf
Normal file
43
docs/Разгон 14.4 мгц/nortwood.txt
Normal 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 означает, что нужно не только заменить кварц, но и на один из счетчиков напаять бутербродом новую микросхему логики, разрезать на плате несколько дорожек с целью изменения коэффициента деления счётчика. Я в одной из тем как-то выкладывал схему доработки.
|
5
docs/Разгон 14.4 мгц/Описание.txt
Normal file
@ -0,0 +1,5 @@
|
||||
Разгон GS на 20% тремя проводками -
|
||||
В качестве D18 ставится ИЕ5 серии 555, 1531, 1533. Кварц в идеале 14.4мгц ,
|
||||
я поставил что было под рукой из убитой материнки 14.318мГц (разницу на слух думаю невозможно будет различить)
|
||||
На GS надо со стороны D18 разрезать дорожку между 2 и 3 выводами,
|
||||
с обратной стороны перерезать в трех местах землю, все.
|
BIN
docs/Разгон 14.4 мгц/Провода.jpg
Normal file
After Width: | Height: | Size: 398 KiB |
BIN
docs/Разгон 14.4 мгц/Режем.jpg
Normal file
After Width: | Height: | Size: 797 KiB |
BIN
docs/Разгон 14.4 мгц/Схема.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
docs/Расширение памяти без установки 62256/gs2m1.jpg
Normal file
After Width: | Height: | Size: 123 KiB |
BIN
docs/Расширение памяти без установки 62256/gs2m2.jpg
Normal file
After Width: | Height: | Size: 128 KiB |
After Width: | Height: | Size: 869 KiB |
BIN
docs/Расширение памяти без установки 62256/Доработки.png
Normal file
After Width: | Height: | Size: 4.2 MiB |
7
docs/Расширение памяти без установки 62256/Описание.txt
Normal file
@ -0,0 +1,7 @@
|
||||
Схема задействует всю память на плате расширения, в следствии чего не надо устанавливать основную память 62256 (4шт.) на GS.
|
||||
|
||||
Диоды к сигналам /К3 и /К4 паяются на обратной стороне GS, КП11 и третий диод ставятся на плате расширения памяти,
|
||||
дополнительный элемент ЛЛ1 это неиспользуемый элемент от DD2.
|
||||
|
||||
При тесте по Print in 179 должно быть 62 страницы памяти.
|
||||
|
BIN
docs/Расширение памяти без установки 62256/Плата расширения.png
Normal file
After Width: | Height: | Size: 2.0 MiB |
BIN
docs/Расширение памяти без установки 62256/Схема.gif
Normal file
After Width: | Height: | Size: 79 KiB |
372
docs/Руководство по программированию v.1.3.doc
Normal 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
docs/Руководство по программированию v.1.4.pdf
Normal file
BIN
firmware/release/gs104.rom
Normal file
2
firmware/release/gs104.txt
Normal file
@ -0,0 +1,2 @@
|
||||
General Sound (tm) ROM
|
||||
Copyright 1997 StingerVersion 1.04 Beta PreRls
|
BIN
firmware/release/gs105a.rom
Normal file
90
firmware/release/gs105a.txt
Normal 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
23
firmware/release/gs105b.txt
Normal 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
4
firmware/release/gs108.txt
Normal file
@ -0,0 +1,4 @@
|
||||
Прошивка появилась для карты ZXMGeneralSound.
|
||||
Какие в ней изменения на данный момент неизвестно.
|
||||
|
||||
http://micklab.ru/My%20Soundcard/ZXMGeneralSound.htm#firmware
|
BIN
firmware/release/neogs110.rom
Normal file
6
firmware/release/neogs110.txt
Normal file
@ -0,0 +1,6 @@
|
||||
Развитие прошивки для новой звуковой карты neoGS от NedoPC
|
||||
|
||||
Исходники на svn репозитории:
|
||||
http://svn.zxevo.ru/listing.php?repname=ngs
|
||||
|
||||
Прошика без проблем работает на классическом GeneralSound
|
7
firmware/src/README.md
Normal file
@ -0,0 +1,7 @@
|
||||
# Исходники ключевых версий в интернете
|
||||
|
||||
## v105b
|
||||
https://github.com/psbhlw/gs-firmware
|
||||
|
||||
## v110
|
||||
http://svn.zxevo.ru/listing.php?repname=ngs
|
BIN
firmware/src/v104/GS104SRC.TRD
Normal file
BIN
firmware/src/v104/GS1_0.TXT
Normal file
553
firmware/src/v104/MOD.TXT
Normal 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
|
||||
|
383
firmware/src/v104/MOD_FORM.TXT
Normal 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)
|
46
firmware/src/v104/README.TXT
Normal 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
30
firmware/src/v105b/make_rom.a80
Normal 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
|
||||
|
11
firmware/src/v105b/make_rom.bat
Normal 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
|
129
firmware/src/v105b/patch/AMTOGS_patched.a80
Normal 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
|
||||
|
143
firmware/src/v105b/patch/GSFRQTB_patched.a80
Normal 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
|
516
firmware/src/v105b/patch/patch.a80
Normal 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
|
||||
|
||||
|
||||
|
||||
|
271
firmware/src/v105b/patch/reloop.a80
Normal 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
|
||||
|
11
firmware/src/v105b/patch/todo
Normal 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?
|
||||
|
||||
|
||||
|
BIN
firmware/src/v105b/sjasmplus.exe
Normal file
41
firmware/src/v105b/src/COMM.a80
Normal 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
|
1278
firmware/src/v105b/src/COM_H.a80
Normal file
627
firmware/src/v105b/src/COM_L.a80
Normal 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
|
||||
|
||||
|
||||
|
206
firmware/src/v105b/src/DIHO.a80
Normal 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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
142
firmware/src/v105b/src/ENGINE_L.a80
Normal 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
|
||||
|
||||
|
||||
|
756
firmware/src/v105b/src/FX_H.a80
Normal 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
|
||||
|
243
firmware/src/v105b/src/GEN_L.a80
Normal 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
|
||||
|
||||
|
||||
|
277
firmware/src/v105b/src/INIT_H.a80
Normal 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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
219
firmware/src/v105b/src/INIT_L.a80
Normal 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
|
||||
|
||||
|
||||
|
||||
|
||||
|
377
firmware/src/v105b/src/INTTST.a80
Normal 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
|
||||
|
120
firmware/src/v105b/src/LOAD_L.a80
Normal 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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
392
firmware/src/v105b/src/MEM_H.a80
Normal 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
|
||||
|
||||
|
||||
|
58
firmware/src/v105b/src/MEM_L.a80
Normal 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
|
||||
|
||||
|
346
firmware/src/v105b/src/PLAY.a80
Normal 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
|
||||
|
504
firmware/src/v105b/src/QUANTUM.a80
Normal 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
|
||||
|
96
firmware/src/v105b/src/TABLES_H.a80
Normal 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
|
||||
|
||||
|
14
firmware/src/v105b/src/TABLES_L.a80
Normal 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
|
||||
|
||||
|
||||
|
||||
|
201
firmware/src/v105b/src/TEST_H.a80
Normal 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)
|
||||
|
172
firmware/src/v105b/src/VOL_H.a80
Normal 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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
143
firmware/src/v105b/src/_AMFRQTB.a80
Normal 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
|
128
firmware/src/v105b/src/_AMTOGS.a80
Normal 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
|
28
firmware/src/v105b/src/_BPM.a80
Normal 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
|
33
firmware/src/v105b/src/_DIVTAB3.a80
Normal 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
|
||||
|
143
firmware/src/v105b/src/_GSFRQTB.a80
Normal 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
|
426
firmware/src/v105b/src/__MAIN.a80
Normal 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
|
||||
|
||||
|
85
firmware/src/v105b/src/_tab_info.txt
Normal 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).
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
7
firmware/src/v105b/src/_trash.a80
Normal 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
|
411
firmware/src/v105b/src/sgen/SGEN.a80
Normal 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
|
||||
|
||||
|