|
|
(не показано 36 промежуточных версий 5 участников) |
Строка 1: |
Строка 1: |
| {{Основная статья|WonderSwan|Текст=WonderSwan}} | | {{Основная статья|WonderSwan|Текст=WonderSwan}} |
| {{Основная статья|WonderSwan Color|Текст=WonderSwan Color}} | | {{Основная статья|WonderSwan Color|Текст=WonderSwan Color}} |
− | ==Описание== | + | __NOTOC__ |
− | Раздел является переводом [http://cygne.emuunlim.com/files/wstech21.txt документации от Judge и Dox]. Возможны ошибки.
| + | ==Техническая информация== |
| + | * http://daifukkat.su/docs/wsman/ |
| + | * http://cygne.emuunlim.com/files/wstech21.txt |
| | | |
− | <spoiler text="Процессор">
| + | ==Ассемблеры== |
− | Процессорное ядро - NEC V30 MZ на частоте 3.072 Мгц.
| + | * nasm (16-битный) |
− | | |
− | NEC V30 MZ - убыстрённая версия V30 с внутренним конвеером (16 байтовый буфер предварительной загрузки). V30MZ примерно в 4 раза быстрее V30. V30 в свою очередь является клоном Intel 8086, но работает на 30% быстрее его, может эмулировать Intel 8080 и содержит собственные инструкции.
| |
− | | |
− | В V30 MZ выборка команд, их декодирование и выполнение инструкций выполняется параллельно. По этой причине сложно определить, какая часть программы в настоящее время выполняется путём контроля ввода адресной шины для выборки кода команды.
| |
− | | |
− | Если дана команда условного перехода, даже если не выполняются ответвления, адрес назначения перехода выбирается предварительно (1 раз), и поэтому дальнейший мониторинг программы затруднён.
| |
− | | |
− | V30 MZ имеет 8 очередей предварительной выборки (16 байт)
| |
− | | |
− | Между V30MZ и V30 есть несколько отличий, например, неподдерживаемые опкоды, другая обработка флагов после mul/div.
| |
− | </spoiler>
| |
− | <spoiler text="Память">
| |
− | 20 бит адресного пространства = 1 Мбайт. Память разделена на сегменты по 64 Кбайт.
| |
− | | |
− | Сегменты:
| |
− | * 0 - RAM - 16 Кбайт для WonderSwan / 64 КБайт для WonderSwan Color (внутреннее ОЗУ)
| |
− | * 1 - SRAM - 256 Кбайт (32х8) - BSI device BS62LV256TC
| |
− | * 2 - ROM bank (начальный банк = последний)
| |
− | * 3 - ROM bank (начальный банк = последний)
| |
− | * 4 - ROM bank (начальный банк = последний - 11)
| |
− | * 5 - ROM bank (начальный банк = последний - 10)
| |
− | * 6 - ROM bank (начальный банк = последний - 9)
| |
− | * 7 - ROM bank (начальный банк = последний - 8)
| |
− | * 8 - ROM bank (начальный банк = последний - 7)
| |
− | * 9 - ROM bank (начальный банк = последний - 6)
| |
− | * A - ROM bank (начальный банк = последний - 5)
| |
− | * B - ROM bank (начальный банк = последний - 4)
| |
− | * C - ROM bank (начальный банк = последний - 3)
| |
− | * D - ROM bank (начальный банк = последний - 2)
| |
− | * E - ROM bank (начальный банк = последний - 1) | |
− | * F - ROM bank (начальный банк = последний)
| |
− | | |
− | Сегменты 2-$F переключаются с помощью портов :
| |
− | | |
− | $C2 - Cегмент 2. Значение, записанное в порт - номер ROM-банка. $FF означает последний ROM-банк, $FE = последний - 1 .. так далее.<br/>
| |
− | $C3 - Cегмент 3. Аналогично<br/>
| |
− | $C0 - Cегменты 4-$F. Биты 0...3 порта $C0 - это биты 4...7 номера ROM-банка в сегментах 4-$F. Биты 0...3 берутся из номера сегмента, например, IO[$C0]=$4E -> сегмент 9 содержит ROM bank $E9.
| |
− | | |
− | '''RAM map'''
| |
− | WS/WSC:
| |
− | * $0000 - $1FFF
| |
− | * $2000 - $3FFF - 4-цветные тайлы
| |
− | Только для WSC:
| |
− | * $4000 - $7FFF - банк 0 16-цветных тайлов
| |
− | * $8000 - $BFFF - банк 1 16-цветных тайлов
| |
− | * $C000 - $FDFF
| |
− | * $FE00 - $FFFF - палитры
| |
− | </spoiler>
| |
− | <spoiler text="Графика">
| |
− | * Разрешение экрана: 224х144 пикселей (28х18 тайлов)
| |
− | * Тайлы: 8х8. 16 байт на тайл в режиме с 4 цветами, 32 байта - с 16 цветами
| |
− | * Карта: 256х256 пикселей (32х32 тайла)
| |
− | * Слои: фон BG и передний план FG
| |
− | * Расположение карт выбирается с помощью порта $07
| |
− | * Расположение плиток фиксированное: два банка на адресах $4000 и $8000
| |
| | | |
− | WonderSwan (не Color) может отображать 16 оттенков серого (можно выбрать только 8).
| + | ==Инструменты для работы с графикой== |
| + | * [http://onorisoft.free.fr/retro.htm?ws/ws.htm bmp2swan] - конвертер 16-цветного BMP-файла в тайлы, палитру и карту. Поддерживается отражение по вертикали и горизонтали. |
| + | * [http://onorisoft.free.fr/retro.htm?ws/ws.htm SwanLayer Merger] - инструмент для объединения данных, нужен в случае, когда на изображение требуется больше 16 цветов: нужно разделить изображения на несколько 16-цветных BMP, сконвертировать при помощи bmp2swan, затем в SwanLayer Merger объединить данные и создать общие карту, набор плиток и палитры. |
| | | |
− | В WonderSwan Color используется 16 палитр по 8 цветов. Все 16 палитр используются BG и FG. Последние 8 палитр используются спрайтами.
| + | ==Инструменты для работы с музыкой== |
− | | + | * [http://shaw.la.coocan.jp/wtd/ WonderSwan Total Sound Driver] (WTD) |
− | 8 цветов палитры определяются портами 1C (определяет цвета 0-3) и 1E (определяет цвета 4-7).
| |
− | | |
− | Размер каждой палитры составляет 4 бита:
| |
− | * 1С: 11110000
| |
− | * 1D: 33332222
| |
− | * 1E: 55554444
| |
− | * 1F: 77776666
| |
− | | |
− | Порты 20-3E используются для определения самих палитр:
| |
− | * 20: x111x000 - палитра 0
| |
− | * 21: x333x222 - палитра 1
| |
− | и т.д.
| |
− | | |
− | В цветном режиме каждый цвет определяется одним словом, где биты:
| |
− | * 0-3 - синий
| |
− | * 4-7 - зелёный
| |
− | * 8-11 - красный
| |
− | * 12-14 - не используются
| |
− | Цветовые палитры хранятся в оперативной памяти (сегмент 0) по адресу $FE00
| |
− | | |
− | Скроллинг: каждый слой можно прокручитвать по горизонтали или вертикали при помощи портов от $10 до $13.
| |
− | | |
− | Прозрачность:
| |
− | * WonderSwan - если бит 3 в номере палитры задан, то цвет 0 палитры является прозрачным.
| |
− | * WonderSwan Color - цвет 0 каждой палитры прозрачен
| |
− | | |
− | Окна: есть две прямоугольный области для отключения/включения слоя FG (окно BG) или спрайтов (окно Sprite).
| |
− | </spoiler>
| |
− | <spoiler text="Звук">
| |
− | Имеется 4 аудиоканала. Каждый канал может воспроизводить короткие семплы(4 бит, 16 байт (32 семпла = 2 семпла в байтах (биты 0-3 и 4-7)) с выбираемой частотой дискретизации = 3,072 *10e6 / ((2048 - N) x 32 ) Гц , где N = 11-битное значение.<br/>
| |
− | Местонахождение этих семплов неизвестно.
| |
− | | |
− | Громкость каждого аудиоканала меняется записью двух 4-битных значений (лево и право) в порты $88-$8B. Общая громкость управляется через порт $91 (2-битное значение = первые используемые биты в общей громкости (ширина 11 бит), ЦАП может прочитать только 8 бит, начиная от набора бит в порте $91. Например, если первые используемые биты установлены в 2, ЦАП использует биты 2,3,4,5,6,7,8,9 для вывода звука.
| |
− | | |
− | Дополнительные (выбираемые) функции:
| |
− | * канал 2 - voice - можно проигрывать 8-битные семплы, записывая данные в порт ввода/вывода громкости канала 2
| |
− | * канал 3 - sweep - два параметра:
| |
− | ** шаг - 2.667 x (N + 1) мс , где N = 5-битное значение
| |
− | ** байт со значением -128 -127
| |
− | * канал 4 - шум - 7 выбираемых шумов (вероятно, порт ввода/вывода $8E)
| |
− | | |
− | Для детальной информации нужно посмотреть информацию о портах $80-$91 в секции "Порты ввода/вывода"
| |
− | </spoiler>
| |
− | <spoiler text="Заголовок ROM">
| |
− | Заголовок занимает последние 10 байт в каждом ROM-файле
| |
− | * 0 - идентификатор разработчика
| |
− | * 1 - поддерживаемая система
| |
− | ** 00 - WonderSwan
| |
− | ** 01 - WonderSwan Color
| |
− | * 2 - номер Cart ID, определённый в байте 0
| |
− | * 3 - ??
| |
− | * 4 - размер ROM
| |
− | ** 01 - ??
| |
− | ** 02 - 4 Мбит
| |
− | ** 03 - 8 Мбит
| |
− | ** 04 - 16 Мбит
| |
− | ** 05 - ??
| |
− | ** 06 - 32 Мбит
| |
− | ** 07 - ??
| |
− | ** 08 - 64 Мбит
| |
− | ** 09 - 128 Мбит
| |
− | * 5 - размер SRAM/EEPROM
| |
− | ** 00 - 0 кбит
| |
− | ** 01 - 64 кбит SRAM
| |
− | ** 02 - 256 кбит SRAM
| |
− | ** 10 - 1 кбит EEPROM
| |
− | ** 20 - 16 кбит EEPROM
| |
− | ** 50 - 8 кбит EEPROM
| |
− | * 6 - дополнительные функции (?)
| |
− | ** бит 0 - 1 - вертикальная позиция, 1 - горизонтальная позиция
| |
− | ** бит 2 - всегда 1
| |
− | * 7 - 1 - RTC (часы)
| |
− | * 8,9 контрольная сумма = сумма всех байтов ROM, кроме двух последних (где хранится контрольная сумма)
| |
− | </spoiler>
| |
− | <spoiler text="Прерывания">
| |
− | {{textcolor|Пока ничего нет|gray}}
| |
− | </spoiler>
| |
− | <spoiler text="Управление">
| |
− | {{textcolor|Пока ничего нет|gray}}
| |
− | </spoiler>
| |
− | <spoiler text="Internal EEPROM Communication">
| |
− | {{textcolor|Пока ничего нет|gray}}
| |
− | </spoiler>
| |
− | <spoiler text="Порты ввода/вывода">
| |
− | {{textcolor|Пока ничего нет|gray}}
| |
− | </spoiler>
| |
− | ==Ассемблеры==
| |
− | * nasm
| |
− | | |
− | ==Инструменты==
| |
| | | |
| ==Эмуляторы== | | ==Эмуляторы== |
− | * [https://server.romhacking.net/utilities/244/ Cygne Tracer] (с дебаггером) | + | * [https://www.romhacking.net/utilities/244/ Cygne Tracer] (с дебаггером) |
| * [https://www.emu-land.net/portable/ws/emuls/windows Другие эмуляторы] | | * [https://www.emu-land.net/portable/ws/emuls/windows Другие эмуляторы] |
| + | |
| + | ==Исходники== |
| + | * [http://www.sebastianmihai.com/swan-driving.html Swan-Driving] (с исходниками) |
| + | * [http://www.sebastianmihai.com/swan-driving-bw.html Swan-Driving] (ч/б версия) (с исходниками) |
| + | * [http://onorisoft.free.fr/retro.htm?ws/ws.htm демо от Orion] (с исходниками) |