Материал из Chipwiki
Перейти к: навигация, поиск
WonderSwan/Программирование — различия между версиями
 
(не показаны 22 промежуточные версии 4 участников)
Строка 1: Строка 1:
 
{{Основная статья|WonderSwan|Текст=WonderSwan}}
 
{{Основная статья|WonderSwan|Текст=WonderSwan}}
 
{{Основная статья|WonderSwan Color|Текст=WonderSwan Color}}
 
{{Основная статья|WonderSwan Color|Текст=WonderSwan Color}}
<div style="float:right;">__TOC__</div>
+
__NOTOC__
 +
==Техническая информация==
 +
* http://daifukkat.su/docs/wsman/
 +
* http://cygne.emuunlim.com/files/wstech21.txt
 +
 
 
==Ассемблеры==
 
==Ассемблеры==
 
* nasm (16-битный)
 
* nasm (16-битный)
  
==Инструменты==
+
==Инструменты для работы с графикой==
 
* [http://onorisoft.free.fr/retro.htm?ws/ws.htm bmp2swan] - конвертер 16-цветного BMP-файла в тайлы, палитру и карту. Поддерживается отражение по вертикали и горизонтали.
 
* [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 объединить данные и создать общие карту, набор плиток и палитры.
 
* [http://onorisoft.free.fr/retro.htm?ws/ws.htm SwanLayer Merger] - инструмент для объединения данных, нужен в случае, когда на изображение требуется больше 16 цветов: нужно разделить изображения на несколько 16-цветных BMP, сконвертировать при помощи bmp2swan, затем в SwanLayer Merger объединить данные и создать общие карту, набор плиток и палитры.
 +
 +
==Инструменты для работы с музыкой==
 
* [http://shaw.la.coocan.jp/wtd/ WonderSwan Total Sound Driver] (WTD)
 
* [http://shaw.la.coocan.jp/wtd/ WonderSwan Total Sound Driver] (WTD)
  
Строка 14: Строка 20:
 
* [https://www.emu-land.net/portable/ws/emuls/windows Другие эмуляторы]
 
* [https://www.emu-land.net/portable/ws/emuls/windows Другие эмуляторы]
  
==Хоумбрю==
+
==Исходники==
* [http://sebastianmihai.com/main.php?t=107&n=WonderSwan-Color-development-Swan-Driving Swan-Driving] (с исходниками)
+
* [http://www.sebastianmihai.com/swan-driving.html Swan-Driving] (с исходниками)
* [http://sebastianmihai.com/main.php?t=108&n=WonderSwan-Mono-development-Swan-Driving-BW Swan-Driving] (ч/б версия) (с исходниками)
+
* [http://www.sebastianmihai.com/swan-driving-bw.html Swan-Driving] (ч/б версия) (с исходниками)
 
* [http://onorisoft.free.fr/retro.htm?ws/ws.htm демо от Orion] (с исходниками)
 
* [http://onorisoft.free.fr/retro.htm?ws/ws.htm демо от Orion] (с исходниками)
 
==Описание==
 
* http://cygne.emuunlim.com/files/wstech21.txt
 
* http://daifukkat.su/docs/wsman/
 
 
{{textcolor|Перевод и компоновка информации в процессе|gray|Стиль=font-style:italic;}}
 
 
===Процессор===
 
Процессорное ядро - NEC V30 MZ на частоте 3.072 Мгц.
 
 
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.
 
 
V30 MZ имеет 20-разрядную адресную шину, 16-разрядную шину данных (вход/выход разделены).
 
 
===Память===
 
<spoiler>
 
Память разделена на сегементы по 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.
 
 
'''Карта памяти'''
 
{|class="wikitable"
 
|-
 
! Адрес !! Содержит !! Шина !! Время доступа
 
|-
 
| 000000h-00FFFFh || Встроенное ОЗУ || 16-bit || 1 цикл
 
|-
 
| colspan="4" |Пояснение:<br/>
 
Для WS и WSC:
 
* 000000h - 001FFFh - Встроенное ОЗУ (область 16 Кбайт)
 
* 002000h - 003FFFh - 4-цветные тайлы
 
Только для WSC:
 
* 004000h - 007FFFh - банк 0 16-цветных тайлов
 
* 008000h - 00BFFFh - банк 1 16-цветных тайлов
 
* 00C000h - 00FDFFh - Встроенное ОЗУ (дополнительная область для WSC)
 
* 00FE00h - 00FFFFh - палитры
 
 
|-
 
| 010000h-01FFFFh || SRAM картриджа || 8-bit || 3 цикла в WS-режиме, 1 цикл в WSC-режиме
 
|-
 
| 020000h-02FFFFh || Банк памяти картриджа 0 || 16-bit || 1 цикл
 
|-
 
| 030000h-03FFFFh || Банк памяти картриджа 1 || 16-bit || 1 цикл
 
|-
 
| 040000h-0FFFFFh || Банк памяти картриджа 2 || 16-bit || 1 цикл
 
|}
 
 
Всё пространство от 010000h находится на картридже, который управляет банками памяти, доступом к SRAM и т.д.
 
 
Запись возможно только во встроенную ОЗУ и ОЗУ в картридже. Запись в ПЗУ картриджа невозможна. При этом это обеспечивается не маппером картриджа, а SoC консоли.
 
 
Можно попытаться получить доступ за пределами 20-битного адресного пространства (переполнение адресов), злоупотребив сегментацией. Поскольку в процессоре отсутствует линия A20, будет осуществлён к началу карты адресов.
 
 
Процессор использует формат памяти little-endian. Таким образом, при доступе к 16- или 32-битным данным в памяти наименее значимым байтом является первый байт, а наиболее значимым - последний. Точно так же, как в x86-процессорах, Z80 и других.
 
 
Внутренняя SRAM синхронизируется c input clock на частоте 12.288 Мгц, затем разделяется на 4 слота доступа,  для обеспечения одновременного доступа периферийным устройствам без остановки. Порядок слотов неизвестен, в связи с чем может быть затруднено их использование для сложных программных трюков.
 
 
Слоты доступа:
 
* ЦП, DMA, Sprite DMA
 
* звуковое оборудование
 
* тайлы
 
* палитры
 
 
ЦП и DMA совместно используют один слот. Механизм работы DMA приостанавливает работу ЦП и работает на скорости /4. Sprite DMA, вероятно, тоже приостанавливает работу ЦП и находится в том же слоте.
 
 
Звуковое оборудование использует отдельный слот. Вероятно, считывает 16-битные слова в циклическом порядке (канал 1,2,3,4) в отдельные буферы каждый цикл и переносит данные (выборка 4-битная, требуется 4 цикла для заполнения 16-битного слова). Это объясняет задержку при запуске звукового оборудования - оно должно загрузить все буферы перед запуском для предотвращения вывода мусора.
 
 
Тайлы и карта тайлов находятся в отдельном слоте. Неизвестно, в какой момент копируются данные. Требуются тесты.
 
 
Палитровое ОЗУ должно иметь собственный слот, так как pixel clock /4. Каждый цикл 16-битное слово считывается из палитрового ОЗУ и выводится на экран.
 
</spoiler>
 
===Порты ввода/вывода===
 
<spoiler>
 
{|class="wikitable"
 
|-
 
! Порт !! Доступ !!width="150px"| {{Подсказка|Маска|76543210}}
 
! Название
 
! Описание
 
|-
 
| 000h || RW || <nowiki>00******</nowiki>
 
| REG_DISP_CTRL
 
| Управление дисплеем<br/>
 
Биты:
 
* 0 - BG включен
 
* 1 - FG включен
 
* 2 - спрайты включены
 
* 3 - спрайтовое окно включено
 
* 4,5 - FG-окно
 
** 0 0 - слой FG отображается внутри и снаружи зоны окна
 
** 0 1 - ??
 
** 1 0 - слой FG отображается только внутри окна
 
** 1 1 - слой FG отображается за пределами окна.
 
 
|-
 
| 001h || RW || <nowiki>00000*** (WS)</nowiki><br/><nowiki>******** (WSC)</nowiki>
 
| REG_BACK_COLOR
 
| Определяет цвет фона<br/>
 
Биты:
 
* WS: 0-2 - цвет фона из пула
 
* WSC: 0-3 - цвет фона, 4-7 палитра фона
 
 
|-
 
| 002h  || R  || <nowiki>********</nowiki>
 
| REG_LINE_CUR
 
| Отображение текущей строки
 
|-
 
| 003h || RW || <nowiki>********</nowiki>
 
| REG_LINE_CMP
 
| Сравнение линий (для прерывания обнаружения рисованной линии)
 
|-
 
| 004h || RW || <nowiki>000***** (WS)</nowiki><br/><nowiki>00****** (WSC)</nowiki>
 
| REG_SPR_BASE
 
| Определяет базовый адрес для таблицы спрайтов. Чтобы получить адрес таблицы, сдвиньте значение влево 9 раз: х хххххх0 00000000
 
|-
 
| 005h  || RW || <nowiki>0*******</nowiki>
 
| REG_SPR_FIRST
 
| Определяет номер спрайта для начала рисования
 
|-
 
| 006h  || RW || <nowiki>********</nowiki>
 
| REG_SPR_COUNT
 
| Количество спрайтов для рисования. Любое значение выше 080h действует как 080h.
 
|-
 
| 007h  || RW || <nowiki>0***0*** (WS)</nowiki><br/><nowiki>******** (WSC)</nowiki>
 
| REG_MAP_BASE
 
| Базовый адрес тайловых карт<br/>
 
Формат:
 
* Биты 7-0 : ffffbbbb
 
* Биты 7-4 - Определение FG (адрес - 0ffff000 00000000)
 
* Биты 3-0 - Определение BG (адрес - 0bbbb000 00000000)   
 
 
|-
 
| 008h  || RW || <nowiki>********</nowiki>
 
| REG_SCR2_WIN_X0
 
| Определение X верхнего левого угла окна FG
 
|-
 
| 009h  || RW || <nowiki>********</nowiki>
 
| REG_SCR2_WIN_Y0
 
| Определение Y верхнего левого угла окна FG
 
|-
 
| 00Ah  || RW || <nowiki>********</nowiki>
 
| REG_SCR2_WIN_X1
 
| Определение X нижнего правого угла окна FG
 
|-
 
| 00Bh  || RW || <nowiki>********</nowiki>
 
| REG_SCR2_WIN_Y1
 
| Определение Y нижнего правого угла окна FG
 
|-
 
| 00Ch  || RW || <nowiki>********</nowiki>
 
| REG_SPR_WIN_X0
 
| Определение X верхнего левого угла окна спрайтов
 
|-
 
| 00Dh  || RW || <nowiki>********</nowiki>
 
| REG_SPR_WIN_Y0
 
| Определение Y верхнего левого угла окна спрайтов
 
|-
 
| 00Eh  || RW || <nowiki>********</nowiki>
 
| REG_SPR_WIN_X1
 
| Определение X нижнего правого угла окна спрайтов
 
|-
 
| 00Fh  || RW || <nowiki>********</nowiki>
 
| REG_SPR_WIN_Y1
 
| Определение Y нижнего правого угла окна спрайтов
 
|-
 
| 010h  || RW || <nowiki>********</nowiki>
 
| REG_SCR1_X
 
| Скролл BG по оси X
 
|-
 
| 011h  || RW || <nowiki>********</nowiki>
 
| REG_SCR1_Y
 
| Скролл BG по оси Y
 
|-
 
| 012h  || RW || <nowiki>********</nowiki>
 
| REG_SCR2_X
 
| Скролл FG по оси X
 
|-
 
| 013h  || RW || <nowiki>********</nowiki>
 
| REG_SCR2_Y
 
| Скролл FG по оси Y
 
|-
 
| 014h  || RW
 
| <nowiki>******** (WS)</nowiki><br/><nowiki>****00** (WSC)</nowiki><br/><nowiki>0000000* (SC)</nowiki>
 
| REG_LCD_CTRL
 
| Бит 0 включает и выключает дисплей. Фукнкция остальных бит зависит от системы:
 
* WonderSwan:
 
** 1-7 - ???
 
* WonderSwan Color:
 
** 4-7 - ???
 
** 1 - контраст (0 - низкий, 1 - высокий)
 
* SwanCrystal
 
** 1-7 - 0
 
 
|-
 
| 015h  || RW || <nowiki>00******</nowiki>
 
| REG_LCD_ICON
 
| Иконки.<br/>
 
Биты:
 
* 5 - большой круг
 
* 4 - средний круг
 
* 3 - маленький круг
 
* 2 - положение иконки по горизонтали
 
* 1 - положение иконки по вертикали
 
* 0 - индикатор сна
 
 
|-
 
| 016h  || RW  || <nowiki>********</nowiki>
 
| REG_LCD_VTOTAL
 
| Дисплейное прерывание VTOTAL. Влияет на все видеотайминги. Начальное значение 09Eh.
 
 
При установке значения на 255 дисплей отключается.
 
 
Установка значения меньше 143 прекращает вызов прерывания VBLANK и вызывает повторение первых строк VTOTAL на дисплее.
 
 
На SwanCrystal установка нечётных значений в регистре приводит к плохой работе дисплея: сканлайн, размытие, временное выгорание.
 
|-
 
| 017h  || RW  || <nowiki>********</nowiki>
 
| REG_LCD_VSYNC
 
| Вероятно, положение VSYNC
 
 
На SwanCrystal регистр нулевой. Начальное значение - 09Bh
 
 
Должен быть больше 144 или меньше, чем VTOTAL, иначе дисплей выключится (?).
 
|-
 
| 018h  ||colspan="4"| --
 
|-
 
| 019h  ||colspan="4"| --
 
|-
 
| 01Ah  ||colspan="4"| ????
 
|-
 
| 01Bh  ||colspan="4"| --
 
|-
 
| 01Ch  || RW  ||rowspan="4"|<nowiki>********</nowiki>
 
| REG_PALMONO_POOL_0
 
| rowspan="4"| Выбор пула монохромной палитры<br/>
 
Биты:
 
* 4-7 - Цвет (reg*2)+1
 
* 0-3 - Цвет (reg*2)+0
 
 
|-
 
| 01Dh  || RW  || REG_PALMONO_POOL_1
 
|-
 
| 01Eh  || RW  || REG_PALMONO_POOL_2
 
|-
 
| 01Fh  || RW  || REG_PALMONO_POOL_3
 
|-
 
| 020h  || RW  ||rowspan="32"| <nowiki>0***0*** 0***0***</nowiki> || REG_PALMONO_0 (Low)
 
|rowspan="32"| Монохромная палитра.<br/>
 
Биты:
 
* 12-14 - цвет 3
 
* 8-10 - цвет 2
 
* 4-6 - цвет 1
 
* 0-2 - цвет 0
 
 
|-
 
| 021h  || RW  || REG_PALMONO_0 (High)
 
|-
 
| 022h  || RW  || REG_PALMONO_1 (Low)
 
|-
 
| 023h  || RW  || REG_PALMONO_1 (High)
 
|-
 
| 024h  || RW  || REG_PALMONO_2 (Low)
 
|-
 
| 025h  || RW  || REG_PALMONO_2 (High)
 
|-
 
| 026h  || RW  || REG_PALMONO_3 (Low)
 
|-
 
| 027h  || RW  || REG_PALMONO_3 (High)
 
|-
 
| 028h  || RW  || REG_PALMONO_4 (Low)
 
|-
 
| 029h  || RW  || REG_PALMONO_4 (High)
 
|-
 
| 02Ah  || RW  || REG_PALMONO_5 (Low)
 
|-
 
| 02Bh  || RW  || REG_PALMONO_5 (High)
 
|-
 
| 02Ch  || RW  || REG_PALMONO_6 (Low)
 
|-
 
| 02Dh  || RW  || REG_PALMONO_6 (High)
 
|-
 
| 02Eh  || RW  || REG_PALMONO_7 (Low)
 
|-
 
| 02Fh  || RW  || REG_PALMONO_7 (High)
 
|-
 
| 030h  || RW  || REG_PALMONO_8 (Low)
 
|-
 
| 031h  || RW  || REG_PALMONO_8 (High)
 
|-
 
| 032h  || RW  || REG_PALMONO_9 (Low)
 
|-
 
| 033h  || RW  || REG_PALMONO_9 (High)
 
|-
 
| 034h  || RW  || REG_PALMONO_A (Low)
 
|-
 
| 035h  || RW  || REG_PALMONO_A (High)
 
|-
 
| 036h  || RW  || REG_PALMONO_B (Low)
 
|-
 
| 037h  || RW  || REG_PALMONO_B (High)
 
|-
 
| 038h  || RW  || REG_PALMONO_C (Low)
 
|-
 
| 039h  || RW  || REG_PALMONO_C (High)
 
|-
 
| 03Ah  || RW  || REG_PALMONO_D (Low)
 
|-
 
| 03Bh  || RW  || REG_PALMONO_D (High)
 
|-
 
| 03Ch  || RW  || REG_PALMONO_E (Low)
 
|-
 
| 03Dh  || RW  || REG_PALMONO_E (High)
 
|-
 
| 03Eh  || RW  || REG_PALMONO_F (Low)
 
|-
 
| 03Fh  || RW  || REG_PALMONO_F (High)
 
|-
 
| 040h  || RW  ||rowspan="2"| <nowiki>******** *******0</nowiki> || REG_DMA_SRC (Low)
 
|rowspan="2"| Адрес источника DMA, как линейный адрес (младшие 16 бит). Обновляется после каждой передачи
 
|-
 
| 041h  || RW  || REG_DMA_SRC (Mid)
 
|-
 
| 042h  || RW  || <nowiki>0000****</nowiki>
 
| REG_DMA_SRC_HI
 
| Адрес источника DMA, как линейный адрес (старшие 4 бита). Обновляется после каждой передачи
 
|-
 
| 043h  ||colspan="4"| --
 
|-
 
| 044h  || RW  ||rowspan="2"| <nowiki>******** *******0</nowiki> || REG_DMA_DST (Low)
 
|rowspan="2"| Адрес назначения DMA IRAM, как линейный адрес. Обновляется после каждой передачи
 
|-
 
| 045h  || RW  || REG_DMA_DST (High)
 
|-
 
| 046h  || RW  ||rowspan="2"| <nowiki>******** *******0</nowiki> || REG_DMA_LEN (Low)
 
|rowspan="2"| Размер передачи DMA в байтах. Обновляется после каждой передачи
 
|-
 
| 047h  || RW  || REG_DMA_LEN (High)
 
|-
 
| 048h  || RW  || <nowiki>**000000</nowiki>
 
| REG_DMA_CTRL
 
| Управление передачей DMA.<br/>
 
Биты:
 
* 7 - стоп/старт передачи. Когда передача закончена, бит принимает значение 0.
 
* 6 - шаг адреса (0 = увеличение, 1 = уменьшение)
 
 
|-
 
| 049h  ||colspan="4"| --
 
|-
 
| 04Ah  || RW  ||rowspan="2"| <nowiki>******** ********</nowiki> || REG_SDMA_SRC (Low)
 
|rowspan="2"| Адрес источника Sound DMA как линейный адрес (младшие 16 битов). Обновляется после каждой передачи
 
|-
 
| 04Bh  || RW  || REG_SDMA_SRC (Mid)
 
|-
 
| 04Ch  || RW  || <nowiki>******** ********</nowiki>
 
| REG_SDMA_SRC_HI
 
| Адрес источника Sound DMA как линейный адрес (старшие 4 бит). Обновляется после каждой передачи
 
|-
 
| 04Dh  ||colspan="4"| --
 
|-
 
| 04Eh  || RW  ||rowspan="2"| <nowiki>******** ********</nowiki> || REG_SDMA_LEN (Low)
 
|rowspan="2"| Размер передачи Sound DMA в байтах (младшие 16 бит). Обновляется после каждой передачи
 
|-
 
| 04Fh  || RW  || REG_SDMA_LEN (Mid)
 
|-
 
| 050h  || RW  || <nowiki>0000****</nowiki>
 
| REG_SDMA_LEN_HI
 
| Размер передачи Sound DMA в байтах (старшие 4 бит). Обновляется после каждой передачи
 
|-
 
| 051h  ||colspan="4"| --
 
|-
 
| 052h  || RW  || <nowiki>**0*****</nowiki>
 
| REG_SDMA_CTRL
 
| Управление передачей Sound DMA<br/>
 
Биты:
 
* 7 - стоп/старт передачи. Когда передача закончена, бит принимает значение 0. В случае зацикливания бит не сбрасывается сам по себе.
 
* 6 - шаг адреса (0 = увеличение, 1 = уменьшение)
 
* 4 - Порт назначения (0 = REG_SND_CH2_VOL, 1 = REG_SND_HYPERVOICE)
 
* 3 - цикл
 
* 2 - ???
 
* 0-1 - темп
 
** 0  CLK/768 (4000kHz)
 
** 1  CLK/512 (6000kHz) ?
 
** 2  CLK/256 (12000kHz) ?
 
** 3  CLK/128 (24000kHz) ?
 
 
|-
 
| 053h  ||colspan="4"| ---
 
|-
 
| 054h  ||colspan="4"| ---
 
|-
 
| 055h  ||colspan="4"| ---
 
|-
 
| 056h  ||colspan="4"| ---
 
|-
 
| 057h  ||colspan="4"| ---
 
|-
 
| 058h  ||colspan="4"| ---
 
|-
 
| 059h  ||colspan="4"| ---
 
|-
 
| 05Ah  ||colspan="4"| ---
 
|-
 
| 05Bh  ||colspan="4"| ---
 
|-
 
| 05Ch  ||colspan="4"| ---
 
|-
 
| 05Dh  ||colspan="4"| ---
 
|-
 
| 05Eh  ||colspan="4"| ---
 
|-
 
| 05Fh  ||colspan="4"| ---
 
|-
 
| 060h  || RW  || <nowiki>***0*0**</nowiki>
 
| REG_DISP_MODE
 
| Режим отображения<br/>
 
Биты:
 
* 7 - количество цвето в плитках (0 = 4 цвета, 1 = 16 цветов)
 
* 6 - режим отображения (0=WS, 1=WSC)
 
* 5 - формат тайлов (0=packed, как в Mega Drive, или 1=layered, как в Game Gear)
 
 
|-
 
| 061h  ||colspan="4"| ---
 
|-
 
| 062h  || RW  || <nowiki>0000000* (WSC)</nowiki><br/><nowiki>1000000* (SC)</nowiki>
 
| REG_WSC_SYSTEM
 
| Отсутствует на WonderSwan. Содержит информацию, система является WonderSwan color или SwanCrystal. Также можно позволяет выключить питание.<br/>
 
Биты:
 
* 7 - система (0=WonderSwan Color, 1=SwanCrystal)
 
* 0 - значение 1 отключает систему.
 
 
|-
 
| 063h  ||colspan="4"| ---
 
|-
 
| 064h  ||colspan="4"| ---
 
|-
 
| 065h  ||colspan="4"| ---
 
|-
 
| 066h  ||colspan="4"| ---
 
|-
 
| 067h  ||colspan="4"| ---
 
|-
 
| 068h  ||colspan="4"| ---
 
|-
 
| 069h  ||colspan="4"| ---
 
|-
 
| 06Ah  || RW  || <nowiki>********</nowiki>
 
| REG_HYPER_CTRL
 
| Hypervoice. Регистр связан с REG_HYPER_CHAN_CTRL<br/>
 
Биты:
 
* 7 - включено
 
* 4-6 - ???
 
* 2-3 режим масштабирования
 
** 0 data <<3-vol
 
** 1 data <<3-vol | (- 0x100 << 3-vol)
 
** 2 data <<3-vol
 
** 3 данные <<3
 
* 0-1 = громкость
 
 
|-
 
| 06Bh  || RW  || <nowiki>0**0****</nowiki>
 
| REG_HYPER_CHAN_CTRL
 
| Hypervoice. Регистр связан с REG_HYPER_CTRL<br/>
 
Биты:
 
* 6 - включает правый канал
 
* 5 - включает левый канал
 
* 0-3 - ???
 
 
|-
 
| 06Ch  ||colspan="4"| ---
 
|-
 
| 06Dh  ||colspan="4"| ---
 
|-
 
| 06Eh  ||colspan="4"| ---
 
|-
 
| 06Fh  ||colspan="4"| ---
 
|-
 
| 070h  || R  ||
 
| REG_UNK_70
 
| Присутствует только на SwanCrystal. Имеет значение 0D0h
 
|-
 
| 071h  || R  || <nowiki>RRRRRRRR</nowiki>
 
| REG_UNK_71
 
| Присутствует только на SwanCrystal. Имеет значение 077h
 
|-
 
| 072h  || R  || <nowiki>RRRRRRRR</nowiki>
 
| REG_UNK_72
 
| Присутствует только на SwanCrystal. Имеет значение 0F7h
 
|-
 
| 073h  || R  || <nowiki>RRRRRRRR</nowiki>
 
| REG_UNK_73
 
| Присутствует только на SwanCrystal. Имеет значение 006h
 
|-
 
| 074h  || R  || <nowiki>RRRRRRRR</nowiki>
 
| REG_UNK_74
 
| Присутствует только на SwanCrystal. Имеет значение 0E2h
 
|-
 
| 075h  || R  || <nowiki>RRRRRRRR</nowiki>
 
| REG_UNK_75
 
| Присутствует только на SwanCrystal. Имеет значение 00Ah
 
|-
 
| 076h  || R  || <nowiki>RRRRRRRR</nowiki>
 
| REG_UNK_76
 
| Присутствует только на SwanCrystal. Имеет значение 0EAh
 
|-
 
| 077h  || R  || <nowiki>RRRRRRRR</nowiki>
 
| REG_UNK_77
 
| Присутствует только на SwanCrystal. Имеет значение 0EEh
 
|-
 
| 078h  ||colspan="4"| ---
 
|-
 
| 079h  ||colspan="4"| ---
 
|-
 
| 07Ah  ||colspan="4"| ---
 
|-
 
| 07Bh  ||colspan="4"| ---
 
|-
 
| 07Ch  ||colspan="4"| ---
 
|-
 
| 07Dh  ||colspan="4"| ---
 
|-
 
| 07Eh  ||colspan="4"| ---
 
|-
 
| 07Fh  ||colspan="4"| ---
 
|-
 
| 080h  || RW  ||rowspan="8"| <nowiki>00000*** ********</nowiki>
 
| REG_SND_CH1_PITCH (Low)
 
|rowspan="8"| Значение частоты канала
 
|-
 
| 081h  || RW  || REG_SND_CH1_PITCH (High)
 
|-
 
| 082h  || RW  || REG_SND_CH2_PITCH (Low)
 
|-
 
| 083h  || RW  || REG_SND_CH2_PITCH (High)
 
|-
 
| 084h  || RW  || REG_SND_CH3_PITCH (Low)
 
|-
 
| 085h  || RW  || REG_SND_CH3_PITCH (High)
 
|-
 
| 086h  || RW  || REG_SND_CH4_PITCH (Low)
 
|-
 
| 087h  || RW  || REG_SND_CH4_PITCH (High)
 
|-
 
| 088h  || RW  ||rowspan="4"| <nowiki>********</nowiki>
 
| REG_SND_CH1_VOL
 
|rowspan="4"| Громкость канала<br/>
 
Биты:
 
* 4-7 - громкость слева
 
* 0-3 - громкость справа
 
Для Voice весь регистр является значением PCM
 
|-
 
| 089h  || RW  || REG_SND_CH2_VOL
 
|-
 
| 08Ah  || RW  || REG_SND_CH3_VOL
 
|-
 
| 08Bh  || RW  || REG_SND_CH4_VOL
 
|-
 
| 08Ch  || RW  || <nowiki>********</nowiki>
 
| REG_SND_SWEEP_VALUE
 
| Значение sweep для канала 3 в режиме sweep
 
|-
 
| 08Dh  || RW  || <nowiki>000*****</nowiki>
 
| REG_SND_SWEEP_TIME
 
| Тайминг sweep для канала 3 в режиме sweep
 
|-
 
| 08Eh  || RW  || <nowiki>000*****</nowiki>
 
| REG_SND_NOISE
 
| Настройка шума для канала 4 в шумовом режиме. При изменении режима шума нужно также установить бит сброса.<br/>
 
Биты:
 
* 4 - вкл/выкл
 
* 3 - сброс
 
* 0-2 - режим
 
 
|-
 
| 08Fh  || RW  || <nowiki>********</nowiki>
 
| REG_SND_WAVE_BASE
 
| Указатель на волновую таблицу. Значение регистра должно быть по адресу >> 6.
 
|-
 
| 090h  || RW  || <nowiki>***0****</nowiki>
 
| REG_SND_CTRL
 
| Включает каналы и меняет режим их работы<br/>
 
Биты:
 
* 7 - режим канала 4 (0=Wave, 1=Noise)
 
* 6 - режим канала 3 (0=No Sweep, 1=Sweep)
 
* 5 - режим канала 2 (0=Wave, 1=Voice)
 
* 4 - не используется
 
* 3 - канал 4 работает
 
* 2 - канал 3 работает
 
* 1 - канал 2 работает
 
* 0 - канал 1 работает
 
 
|-
 
| 091h  || RW  || <nowiki>R000****</nowiki>
 
| REG_SND_OUTPUT
 
| Выходной контроль<br/>
 
Биты:
 
* 7 - подключение наушников
 
* 3 - наушники вкл.
 
* 1-2  Сдвиг громкости основного динамика. Значение, отправленное на ШИМ динамика, сдвигается на это количество бит вниз
 
* 0 - основной динамик вкл.
 
 
|-
 
| 092h  || R  ||rowspan="2"| <nowiki>0RRRRRRR RRRRRRRR</nowiki> || REG_SND_RANDOM (Low)
 
|rowspan="2"| Текущее значение шума LFSR
 
|-
 
| 093h  || R  || REG_SND_RANDOM (High)
 
|-
 
| 094h  || RW  || <nowiki>0000****</nowiki>
 
| REG_SND_VOICE_CTRL
 
| Стереэффект PCM voice
 
 
Биты полной громкости переопределяют биты половинной громкости.
 
 
Биты:
 
* 3 - Левый канал вкл. (половинная громкость)
 
* 2 - Левый канал вкл. (полная громкость)
 
* 1 - Правый канал вкл. (половинная громкость)
 
* 0 - Правый канал вкл. (полная громкость)
 
 
|-
 
| 095h  || RW  || <nowiki>********</nowiki>
 
| REG_SND_HYPERVOICE
 
| Неизвестно. Вероятно, Hypervoice-семплы
 
|-
 
| 096h  || RW  ||rowspan="2"| <nowiki>000000** ******** (WS)</nowiki><br/><nowiki>00000000 00000000 (WSC+SC)</nowiki>
 
| REG_SND_9697 (Low)
 
|rowspan="2"| Неизвестно
 
|-
 
| 097h  || RW  || REG_SND_9697 (High)
 
|-
 
| 098h  || RW  ||rowspan="2"| <nowiki>000000** ******** (WS)</nowiki><br/><nowiki>00000000 00000000 (WSC+SC)</nowiki>
 
| REG_SND_9899 (Low)
 
|rowspan="2"| Неизвестно
 
|-
 
| 099h  || RW  || REG_SND_9899 (High)
 
|-
 
| 09Ah  || R  || <nowiki>00000111 (WS)</nowiki><br/><nowiki>00000000 (WSC+SC)</nowiki>
 
| REG_SND_9A
 
| Неизвестно
 
|-
 
| 09Bh  || R  || <nowiki>11111110 (WS)</nowiki><br/><nowiki>00000000 (WSC+SC)</nowiki>
 
| REG_SND_9B
 
| Неизвестно
 
|-
 
| 09Ch  || R  || <nowiki>11111111 (WS)</nowiki><br/><nowiki>00000000 (WSC+SC)</nowiki>
 
| REG_SND_9C
 
| Неизвестно
 
|-
 
| 09Dh  || R  || <nowiki>11111111 (WS)</nowiki><br/><nowiki>00000000 (WSC+SC)</nowiki>
 
| REG_SND_9D
 
| Неизвестно
 
|-
 
| 09Eh  || R  || <nowiki>000000**</nowiki>
 
| REG_SND_9E
 
| Неизвестно
 
|-
 
| 09Fh  ||colspan="4"| ---
 
|-
 
| 0A0h  || RW
 
|
 
<nowiki>+000**0+ (WS)</nowiki><br/>
 
<nowiki>+000**1+ (SC/WSC)</nowiki><br/>
 
<nowiki>+++++*1+ (SC в WS mode)</nowiki>
 
| REG_HW_FLAGS
 
| Единственным реальным использованием этого регистра является проверка системы с цветом.<br/>
 
Биты:
 
* 7 - System BIST passed (заблокировано)
 
* 4-6 - Неизвестно, что SC в режиме WS
 
* 3 - скорость ПЗУ картриджей (0=3 цикла, 1=1 цикл)
 
* 2 - Разрядность внешней шины (0=8bit, 1=16bit). Большинство
 
* 1 - система (0=WonderSwan, 1=WonderSwan Color)
 
* 0 BIOS bank out (заблокировано) (0=BIOS mapped, 1=Cart mapped)
 
 
|-
 
| 0A1h  ||colspan="4"| ---
 
|-
 
| 0A2h  || RW  || <nowiki>0000****</nowiki>
 
| REG_TMR_CTRL
 
| Управление таймеров
 
 
Биты:
 
* 3 - режима таймера V-Blank (0=один раз, 1=автоповтор)
 
* 2 - таймер V-Blank вкл/выкл
 
* 1 - режима таймера H-Blank (0=один раз, 1=автоповтор)
 
* 0 - таймер H-Blank Timer вкл/выкл
 
 
|-
 
| 0A3h  ||colspan="4"| ???
 
|-
 
| 0A4h  || RW  ||rowspan="2"| <nowiki>******** ********</nowiki>
 
| REG_HTMR_FREQ (Low)
 
|rowspan="2"| Частота таймера H-Blank
 
|-
 
| 0A5h  || RW  || REG_HTMR_FREQ (High)
 
|-
 
| 0A6h  || RW  ||rowspan="2"| <nowiki>******** ********</nowiki>
 
| REG_VTMR_FREQ (Low)
 
|rowspan="2"| Частота таймера V-Blank
 
|-
 
| 0A7h  || RW  || REG_VTMR_FREQ (High)
 
|-
 
| 0A8h  || R  ||rowspan="2"| <nowiki>RRRRRRRR RRRRRRRR</nowiki>
 
| REG_HTMR_CTR (Low)
 
|rowspan="2"| Текущее значение счётчика таймера H-Blank
 
|-
 
| 0A9h  || R  || REG_HTMR_CTR (High)
 
|-
 
| 0AAh  || R  ||rowspan="2"| <nowiki>RRRRRRRR RRRRRRRR</nowiki>
 
| REG_VTMR_CTR (Low)
 
|rowspan="2"| Текущее значение счётчика таймера V-Blank
 
|-
 
| 0ABh  || R  || REG_VTMR_CTR (High)
 
|-
 
| 0ACh  ||colspan="4"| ???
 
|-
 
| 0ADh  ||colspan="4"| ---
 
|-
 
| 0AEh  ||colspan="4"| ---
 
|-
 
| 0AFh  ||colspan="4"| ---
 
|-
 
| 0B0h  || RW  || <nowiki>*******0 (WSC + SC)</nowiki><br/><nowiki>*****011 (WS)</nowiki>
 
| REG_INT_BASE
 
| Смещение номера прерывания для аппаратных прерываний. Нижние 3 бита игнорируются аппаратным обеспечением генерации прерываний, поэтому их можно игнорировать. Фактические сгенерированные номера прерываний: (REG_INT_BASE & 0F8h) / intnum
 
|-
 
| 0B1h  || RW  || <nowiki>********</nowiki>
 
| REG_SER_DATA
 
| Байты связи. Используются как для передачи, так и для приема
 
|-
 
| 0B2h  || RW  || <nowiki>********</nowiki>
 
| REG_INT_ENABLE
 
| Включение аппаратных прерываний.
 
 
Биты:
 
* 7 - таймер HBlank
 
* 6 - начало VBlank
 
* 5 - таймер VBlank
 
* 4 - Обнаружение рисования линий
 
* 3 - Последовательный приём данных
 
* 2 - RTC Alarm
 
* 1 - Нажатие кнопок
 
* 0 - Последовательная передача данных
 
 
|-
 
| 0B3h  || RW  || <nowiki>**R00RRR</nowiki>
 
| REG_SER_STATUS
 
| Статус передачи и направление
 
 
Биты:
 
* 7 - Включение передачи
 
* 6 - Скорость передачи (0=9600, 1=38400)
 
* 5 - Сброс Переполнения
 
* 2 - Отправка пустого буфера/завершение передачи
 
* 1 - Переполнение/ошибка
 
* 0 - Завершение приёма
 
 
|-
 
| 0B4h  || R  || <nowiki>RRRRRRRR</nowiki>
 
| REG_INT_STATUS
 
| Битовая маска для текущих вызваннных аппаратных прерываний. Используемые биты совпадают с номерами прерываний.
 
 
REG_INT_ENABLE не влияет на этот регистр.
 
|-
 
| 0B5h  || RW  || <nowiki>0***RRRR</nowiki>
 
| REG_KEYPAD
 
| Кнопки управления
 
 
Биты:
 
* Запись/чтение
 
** 6 - чтение кнопок
 
** 5 - чтение X-кнопок
 
** 4 - чтение Y-кнопок
 
* Чтение:
 
** 3 - B, X4, Y4
 
** 2 - A, X3, Y3
 
** 1 - Start, X2, Y2
 
** 0 - X1, Y1
 
 
|-
 
| 0B6h  ||  W  || <nowiki>WWWWWWWW</nowiki>
 
| REG_INT_ACK
 
| Подтверждение прерывания. Каждый установленный бит будет подтверждать соответствующее прерывание, очищенные биты не действуют.
 
 
REG_INT_ENABLE не влияет на этот регистр.
 
 
Чтение этого регистра возвращает 0.
 
 
Биты:
 
* 7 - таймер HBlank
 
* 6 - начало VBlank
 
* 5 - таймер VBlank
 
* 4 - Обнаружение рисования линий
 
* 3 - Последовательный приём данных
 
* 2 - RTC Alarm
 
* 1 - Нажатие кнопок
 
* 0 - Последовательная передача данных
 
 
|-
 
| 0B7h  ||colspan="4"| ???
 
|-
 
| 0B8h  ||colspan="4"| ---
 
|-
 
| 0B9h  ||colspan="4"| ---
 
|-
 
| 0BAh  || RW  ||rowspan="2"| <nowiki>******** ********</nowiki>
 
| REG_IEEP_DATA (Low)
 
|rowspan="2"| Data port
 
|-
 
| 0BBh  || RW  || REG_IEEP_DATA (High)
 
|-
 
| 0BCh  || RW  ||rowspan="2"| <nowiki>******** ********</nowiki>
 
| REG_IEEP_ADDR (Low)
 
|rowspan="2"| адресный порт и порт управления
 
 
1 Кбит:
 
* 8 - начало
 
* 6-7 - Команда (0=расширенная команда, 1=запись, 2=чтение, 3=стереть)
 
* 0-5 - адрес
 
 
16 Кбит:
 
* 12 - начало
 
* 10-11 - Команда (0=расширенная команда, 1=запись, 2=чтение, 3=стереть)
 
* 0-9 - адрес
 
 
Расширенные команды (верхние 2 бита адреса)
 
* 0 - EWDS (запись выкл.)
 
* 1 - WRAL (записать всё.)
 
* 2 - ERAL (Стереть всё)
 
* 3 - EWEN (запись вкл.)
 
 
|-
 
| 0BDh  || RW  || REG_IEEP_ADDR (High)
 
|-
 
|rowspan="2"| 0BEh  || R  || <nowiki>000000**</nowiki>
 
| REG_IEEP_STATUS
 
| Порт статуса
 
 
Биты:
 
* 1 - Запись завершена
 
* 0 - Чтение завершено
 
 
|-
 
| W  || <nowiki>0***0000</nowiki>
 
| REG_IEEP_CMD
 
| Тип поведения. Также запуск команды. Установка более одного бита ничего не вызывает.
 
 
Биты:
 
* 6 - Защита
 
* 5 - Запись
 
* 4 - Чтение
 
 
|-
 
| 0BFh  ||colspan="4"| ???
 
|-
 
| 0C0h  || RW  || <nowiki>********</nowiki>
 
| REG_BANK_ROM2
 
| Выбор банка ROM (сегменты 4-F)
 
 
Регистр содержит верхние биты банка ПЗУ, используемые для доступа к ROM2; нижние 4 бита банка - это верхние 4 бита адреса, к которому осуществляется доступ в этом диапазоне. Все 8 бит сохраняют состояние.
 
 
В маппере 2001 выводится только 4 бита, в 2003 - 6
 
 
Например, для значения регистра 0F4h и адреса доступа 056789h результирующий адрес ПЗУ будет 0456789h для маппера 2001 и 03456789h для маппера 2003.
 
 
|-
 
| 0C1h  || RW  || <nowiki>********</nowiki>
 
| REG_BANK_SRAM
 
| Выбор банка SRAM
 
 
Пример: для значения регистра 034h и адреса обращения к 015678h результирующий адрес SRAM будет 0345678h.
 
|-
 
| 0C2h  || RW  || <nowiki>********</nowiki>
 
| REG_BANK_ROM0
 
| Выбор банка ROM0 (сегмент 2).
 
 
Пример: для значения регистра 034h и адреса доступа 025678h результирующий адрес ПЗУ будет 0345678h.
 
|-
 
| 0C3h  || RW  || <nowiki>********</nowiki>
 
| REG_BANK_ROM1
 
| Выбор банка ROM1 (сегмент 3).
 
 
Пример: для значения регистра 034h и адреса доступа 025678h результирующий адрес ПЗУ будет 0345678h.
 
|-
 
| 0C4h  || RW  ||rowspan="2"| <nowiki>******** ********</nowiki>
 
| REG_EEP_DATA (Low)
 
|rowspan="2"| Data port картриджа
 
|-
 
| 0C5h  || RW  || REG_EEP_DATA (High)
 
|-
 
| 0C6h  || RW  ||rowspan="2"|
 
| REG_EEP_ADDR (Low)
 
|rowspan="2"| адресный порт и порт управления картриджа
 
 
1 Кбит:
 
* 8 - начало
 
* 6-7 - Команда (0=расширенная команда, 1=запись, 2=чтение, 3=стереть)
 
* 0-5 - адрес
 
 
16 Кбит:
 
* 12 - начало
 
* 10-11 - Команда (0=расширенная команда, 1=запись, 2=чтение, 3=стереть)
 
* 0-9 - адрес
 
 
Расширенные команды (верхние 2 бита адреса)
 
* 0 - EWDS (запись выкл.)
 
* 1 - WRAL (записать всё.)
 
* 2 - ERAL (Стереть всё)
 
* 3 - EWEN (запись вкл.)
 
 
|-
 
| 0C7h  || RW  || REG_EEP_ADDR (High)
 
|-
 
| 0C8h  || R  ||
 
| REG_EEP_STATUS
 
| порт статуса картриджа
 
 
Биты:
 
* 6 - Защита
 
* 5 - Запись
 
* 4 - Чтение
 
* 3 - ??
 
* 2 - ??
 
* 1 - Запись завершена
 
* 0 - Чтение завершено
 
 
|-
 
| 0C8h  ||  W  ||
 
| REG_EEP_CMD
 
| Командный порт картриджа
 
 
Биты:
 
* 6 - Защита
 
* 5 - Запись
 
* 4 - Чтение
 
* 3 - ??
 
* 2 - ??
 
* 1 - Запись завершена
 
* 0 - Чтение завершено
 
 
|-
 
| 0C9h  ||colspan="4"| ???
 
|-
 
| rowspan="2"| 0CAh  || R  ||
 
| REG_RTC_STATUS
 
| Статус часов
 
 
Бит 7 - ожидание команды
 
 
|-
 
| W  ||
 
| REG_RTC_CMD
 
| Команды часам
 
 
Запись:
 
* $10 - Сброс
 
* $12 - ??? будильник ???
 
* $13 - ???
 
* $14 - Установить время
 
* $15 - Получить время
 
Чтение:
 
* бит 7 - Ack [HACK = 1]
 
             
 
|-
 
| 0CBh  || RW  ||
 
| REG_RTC_DATA
 
| Данные часов
 
 
Запись:
 
* 7 - ожидание команды
 
 
После команды ($CA):
 
* $14 - 7 записей
 
** год (+2000)
 
** месяц
 
** день
 
** день недели
 
** час
 
** минута
 
** секунда
 
 
чтение: после команды ($CA)
 
* $13 - бит 7 - Ack [HACK = 1]
 
* $15 - 7 записей
 
** год (+2000)
 
** месяц
 
** день
 
** день недели
 
** час
 
** минута
 
** секунда
 
 
|-
 
| 0CCh  || RW  || <nowiki>********</nowiki>
 
| REG_GPO_EN
 
| General-Purpose Outputs - выходные данные общего назначения, используются некоторыми мапперами, например, для светодиодов
 
 
Биты:
 
* 4-7 - ????
 
* 3 - GPO3 вкл
 
* 2 - GPO2 вкл
 
* 1 - GPO1 вкл
 
* 0 - GPO0 вкл
 
 
|-
 
| 0CDh  || RW  || <nowiki>********</nowiki>
 
| REG_GPO_DATA
 
| Биты:
 
* 4-7 - ???
 
* 3 - GPO3-данные (чтение записанного состояния)
 
* 2 - GPO2-данные (чтение записанного состояния)
 
* 1 - GPO1-данные (чтение записанного состояния)
 
* 0 - GPO0-данные (чтение записанного состояния)
 
 
|-
 
| 0CEh  || RW  ||
 
| REG_WW_FLASH_CE
 
| Порт ввода/вывода для WonderWitch, коммерческого комплекта разработки, который использует Flash-ROM для хранения программ, а также OS и BIOS под названием Freya.
 
 
Flash-ROM может быть записан из WonderWitch, но нельзя одновременно писать код и выполнять. То есть нужно перебрасывать код в ОЗУ и выполнять его оттуда, чтобы записать данные на Flash-ROM
 
 
|-
 
| 0CFh  ||colspan="4"| ???
 
|-
 
| 0D0h  ||colspan="4"| ???
 
|-
 
| 0D1h  ||colspan="4"| ???
 
|-
 
| 0D2h  ||colspan="4"| ???
 
|-
 
| 0D3h  ||colspan="4"| ???
 
|-
 
| 0D4h  ||colspan="4"| ???
 
|-
 
| 0D5h  ||colspan="4"| ???
 
|-
 
| 0D6h  ||colspan="4"| ???
 
|-
 
| 0D7h  ||colspan="4"| ???
 
|-
 
| 0D8h  ||colspan="4"| ???
 
|-
 
| 0D9h  ||colspan="4"| ???
 
|-
 
| 0DAh  ||colspan="4"| ???
 
|-
 
| 0DBh  ||colspan="4"| ???
 
|-
 
| 0DCh  ||colspan="4"| ???
 
|-
 
| 0DDh  ||colspan="4"| ???
 
|-
 
| 0DEh  ||colspan="4"| ???
 
|-
 
| 0DFh  ||colspan="4"| ???
 
|-
 
| 0E0h  ||colspan="4"| ???
 
|-
 
| 0E1h  ||colspan="4"| ???
 
|-
 
| 0E2h  ||colspan="4"| ???
 
|-
 
| 0E3h  ||colspan="4"| ???
 
|-
 
| 0E4h  ||colspan="4"| ???
 
|-
 
| 0E5h  ||colspan="4"| ???
 
|-
 
| 0E6h  ||colspan="4"| ???
 
|-
 
| 0E7h  ||colspan="4"| ???
 
|-
 
| 0E8h  ||colspan="4"| ???
 
|-
 
| 0E9h  ||colspan="4"| ???
 
|-
 
| 0EAh  ||colspan="4"| ???
 
|-
 
| 0EBh  ||colspan="4"| ???
 
|-
 
| 0ECh  ||colspan="4"| ???
 
|-
 
| 0EDh  ||colspan="4"| ???
 
|-
 
| 0EEh  ||colspan="4"| ???
 
|-
 
| 0EFh  ||colspan="4"| ???
 
|-
 
| 0F0h  ||colspan="4"| ???
 
|-
 
| 0F1h  ||colspan="4"| ???
 
|-
 
| 0F2h  ||colspan="4"| ???
 
|-
 
| 0F3h  ||colspan="4"| ???
 
|-
 
| 0F4h  ||colspan="4"| ???
 
|-
 
| 0F5h  ||colspan="4"| ???
 
|-
 
| 0F6h  ||colspan="4"| ???
 
|-
 
| 0F7h  ||colspan="4"| ???
 
|-
 
| 0F8h  ||colspan="4"| ???
 
|-
 
| 0F9h  ||colspan="4"| ???
 
|-
 
| 0FAh  ||colspan="4"| ???
 
|-
 
| 0FBh  ||colspan="4"| ???
 
|-
 
| 0FCh  ||colspan="4"| ???
 
|-
 
| 0FDh  ||colspan="4"| ???
 
|-
 
| 0FEh  ||colspan="4"| ???
 
|-
 
| 0FFh  ||colspan="4"| ???
 
|}
 
</spoiler>
 
===Дисплей===
 
<spoiler>
 
Разрешение дисплея WonderSwan равно 224х144
 
 
Дисплей WonderSwan может отображать 12 оттенков серого цвета, дисплеи WonderSwan Color и SwanCrystal способны отображать 12-битный RGB (4096 цветов).
 
 
'''Дисплейные тайминги:'''
 
<pre>
 
    0            224 256
 
    -----------------
 
  0|              |  |
 
  |              |  |
 
  |              |  |
 
  |              |  |
 
144|--------------  |
 
159|_________________|
 
</pre>
 
 
PIXCLK = 3.072MHz<br/><br/>
 
HDISP  = 224<br/>
 
HBLANK =  32<br/>
 
HTOTAL = 256<br/>
 
HCLK  = 12kHz (3072000 / 256)<br/><br/>
 
VDISP  = 144<br/>
 
VBLANK =  15<br/>
 
VTOTAL = 159<br/>
 
VCLK  = ~75.47Hz (12000 / 159)<br/>
 
 
Когда контроллер дисплея обращается к памяти, процессор не приостанавливается.
 
 
'''Палитры'''
 
 
Видеорежим задаётся в регистре REG_DISP_MODE. В зависимости от выбранного режима используются разные данные.
 
 
В монохромном режиме палитры управляются регистрами REG_PALMONO_POOL и  REG_PALMONO.<br/>
 
REG_PALMONO_POOL создаёт пул из 8 оттенков, из которых собираются окончательные палитры. Цвета 4-битные: 00 - самый яркий, 0Fh - самый тёмный.
 
 
Регистры REG_PALMONO выбирает из пула по 4 цвета в каждую из 16 палитр.
 
 
Палитры 0-3 и 8-11 не имеют прозрачности. Палитры 4-7 и 12-15 используют цвет 0 в качестве прозрачного.
 
 
В цветном режиме регистры монохромных палитр игнорируются, палитры хранятся в оперативной памяти по адресу 00FE00h - 00FFFFh (1 слово на цвет, 16 цветов на палитру).
 
 
Палитры в режимах цветного видео полностью игнорируют монохромные регистры палитр, вместо этого сохраняя палитры в оперативной памяти.
 
 
В этих режимах палитры хранятся в оперативной памяти при 0FE00h, 1 слово на цвет, 16 цветов на палитру. В 4-цветном (2BPP) режиме 12 последних цветов каждой палитры равны цвету фона.
 
 
У всех палитр цвет 0 прозрачен, если не используется в качестве фона в регистре REG_BACK_COLOR
 
 
Формат ввода цвета:
 
* 8-11 - Red
 
* 4-7 - Green
 
* 0-3 - Blue
 
 
'''Тайлы'''
 
 
Все плитки имеют размер 8х8. Формат тайлов и их размещение в памяти зависит от режима, выбранного в REG_DISP_MODE.
 
 
4-цветные (2BPP) тайлы располагаются в ОЗУ по адресу 002000h - 003FFFh. В WonderSwan (и WonderSwan Color в режиме WS) здесь может хранится только 512 (0200h) тайлов. В цветном режиме здесь может храниться до 1024 (0400h) тайлов. Спрайты используют только первые 512 тайлов, верхние 512 тайлов могут использоваться только для фона, используя бит атрибута в записи каждой плитки. Каждый тайл занимает 16 байт.
 
 
Имеется два формата хранения данных в 4-цветном тайле:
 
* Planar Format - каждый байт определяет полную строку из 8 пикселей.
 
* Packed Format - каждый байт содержит все биты для 4 пикселей строки. Чётные байты определяют левые пиксели, нечётные - правые
 
 
16-цветные (4BPP) тайлы располагаются в ОЗУ, начиная с 004000h, и здесь может храниться до 1024 (0400h) тайлов. Спрайты используют только первые 512 тайлов, верхние 512 тайлов могут использоваться только для фона, используя бит атрибута в записи каждой плитки. Каждый тайл занимает 32 байта.
 
 
Имеется два формата хранения данных в 16-цветном тайле:
 
* Planar Format - каждый байт определяет полную строку из 8 пикселей.
 
* Packed Format - каждый байт содержит все биты для 2 пикселей строки. Байты по порядку определяют крайние левые пиксели, центральные левые, центральные правые, крайние правые.
 
 
'''Фоновые слои'''
 
 
WonderSwan имеет два фоновых слоя: BG (background, также SCR1) и FG (foreground, также SCR2). BG всегда ниже FG.
 
 
FG имеет функцию окна, которая настраивается с помощью регистра REG_SCR2_WIN
 
 
Расположение тайловых карт в памяти настраивается при помощи регистра REG_MAP_BASE
 
 
Каждый тайл в карте определяется 16-битным словом:
 
* 15 - отражение по вертикали
 
* 14 - отражение по горизонтали
 
* 13 - тайловый банк (только для WSC)
 
* 9-12 - палитра
 
* 0-8 - плитка
 
 
Фоны могут использовать все 16 палитр
 
 
'''Спрайты'''
 
 
Одновременно можно использовать 128 спрайтов, не более 32 на строке.
 
 
Расположение данных спрайтов в памяти можно менять при помощи REG_SPR_BASE.
 
 
Начальный спрайт определяется в REG_SPR_FIRST. Количество спрайтов назначается в REG_SPR_COUNT.
 
 
Все спрайты располагаются выше BG, есть флаг для отображения выше FG.
 
 
Приоритет рисования спрайтов отдаётся более ранним в списке.
 
 
Спрайты поддерживают обрезку окном, которое определяется регистрами REG_SPR_WIN. Каждый спрайт имеет флаг для рисования только внутри или снаружи окна. Спрайтовое окно может быть отключено.
 
 
Спрайты поддерживают горизонтальное и вертикальное отражение.
 
 
Спрайты отрисовываются построчно, но спрайтовая область ОЗУ копируется на 142 строке дисплея, препятствуя мультиплексированию спрайтов с растровыми эффектами.
 
 
Спрайты используют последние 8 палитр.
 
 
Формат
 
 
Запись каждого спрайта в спрайтовой таблице использует 32-битный параметр типа DWORD.
 
 
* 24-31 - положение по оси х
 
* 16-23 - положение по оси y
 
* 15 - отражение по вертикали
 
* 14 - отражение по горизонтали
 
* 13 - положение относительно FG
 
* 12 - режим спрайтового окна (0=снаружи, 1=внутри)
 
* 9-11 - палитра
 
* 0-8 - плитка
 
</spoiler>
 
===Звук===
 
<spoiler>Имеется 4 аудиоканала. Каждый канал может воспроизводить короткие семплы (4 бит, 16 байт (32 семпла = по 2 семпла на байты (биты 0-3 и 4-7)) с выбираемой частотой дискретизации = 3,072*10e6 / ((2048-N)x32 ) Гц , где N = 11-битное значение.
 
 
Громкость каждого канала регулируется отдельно, каждый канал с настраиваемой стереопанорамой
 
 
Канал 2 может воспроизводить 8-битные семплы (функция voice)
 
 
Канал 3 имеет функцию sweep
 
 
Канал 4 можно использовать как шумовой генератор
 
 
В WonderSwan Color имеется дополнительный PCM-канал (HyperVoice), но только для наушников.
 
 
'''Тайминги'''
 
 
Каждый звуковой канал обновляется полный цикл (3072000 Гц). sweep-секция обновляется каждый 256х32 такта (375 гц) ЦАП наушников обновляется каждый 128 тактов (24000 гц).
 
 
'''Высота''' (pitch)
 
 
Алгоритм регистра высоты: reg = 2048 - (3072000 / 32 / f)
 
 
Конвертация значения регистра обратно в частоту: f = 3072000 / 32 / (2048 - reg) Hz
 
 
Значение используется в регистрах REG_SND_CHx_PITCH.
 
 
Регистр хранит значение для сравнения обратного счётчика, который используется для перехода к следующему шагу в семпле. После воспроизведения каждого семпла внутренний счётчик сбрасывается до 2048, затем каждый такт уменьшается на 1. Как только внутренний счётчик будет равен регистру, будет выведен следующий семпл.
 
 
'''HyperVoice'''
 
 
См. регистры REG_HYPER_CTRL и REG_HYPER_CHAN_CTRL
 
 
'''Sweep'''
 
 
Каждый шаг в sweep происходит каждые (reg+1)*32*256 тактов.
 
 
С точки зрения реального времени: reg = (T/2.667ms)-1, где T - время в милисекундах.
 
 
Значение используется в регистре REG_SND_SWEEP_TIME.
 
 
'''Voice'''
 
 
Voice функционирует на канале 2, использует регистр REG_SND_CH2_VOL для передачи 8-bit PCM-данных.
 
 
'''Шум'''
 
 
Канал 4 может работать как шумовой канал.
 
 
Используется 15-битный {{wiki|ru|LFSR|LFSR}} со следующим алгоритмом:
 
 
noise_bit = (1 ^ (ctr >> 7) ^ (ctr >> tap)) & 1<br/>
 
ctr = (ctr << 1) | noise_bit
 
 
Настраиваемые значения tap:
 
* режим 0: tap = 14
 
* режим 1: tap = 10
 
* режим 2: tap = 13
 
* режим 3: tap = 4
 
* режим 4: tap = 8
 
* режим 5: tap = 6
 
* режим 6: tap = 9
 
* режим 7: tap = 11
 
 
Сброс шума устанавливает счетчик LFSR на 00000h. LFSR обновляется, когда включающий бит активен, а канал 4 включен, даже если канал 4 не находится в режиме шума.
 
 
Выходной сигнал шумового канала равен noise_bit, умноженный на 0Fh.</spoiler>
 
===Кнопки===
 
Проверка статус кнопок можно в порте 0B5h.
 
 
Кнопки мультиплексированы на 4 бита с использованием AND. Чтобы получить полные значения кнопок, повторите каждое из значений маски и объедините их.
 
 
===Прерывания===
 
===Последовательный порт===
 
===Внутренняя EEPROM===
 
===DMA контроллер===
 
===Sound DMA контроллер===
 
===Таймеры===
 
===Картридж===
 
===WonderWitch===
 

Текущая версия на 02:12, 15 июня 2023

Техническая информация

Ассемблеры

  • nasm (16-битный)

Инструменты для работы с графикой

  • bmp2swan - конвертер 16-цветного BMP-файла в тайлы, палитру и карту. Поддерживается отражение по вертикали и горизонтали.
  • SwanLayer Merger - инструмент для объединения данных, нужен в случае, когда на изображение требуется больше 16 цветов: нужно разделить изображения на несколько 16-цветных BMP, сконвертировать при помощи bmp2swan, затем в SwanLayer Merger объединить данные и создать общие карту, набор плиток и палитры.

Инструменты для работы с музыкой

Эмуляторы

Исходники