Содержание
Ассемблеры
- nasm (16-битный)
Инструменты
- bmp2swan - конвертер 16-цветного BMP-файла в тайлы, палитру и карту. Поддерживается отражение по вертикали и горизонтали.
- SwanLayer Merger - инструмент для объединения данных, нужен в случае, когда на изображение требуется больше 16 цветов: нужно разделить изображения на несколько 16-цветных BMP, сконвертировать при помощи bmp2swan, затем в SwanLayer Merger объединить данные и создать общие карту, набор плиток и палитры.
- WonderSwan Total Sound Driver (WTD)
Эмуляторы
- Cygne Tracer (с дебаггером)
- Другие эмуляторы
Хоумбрю
- Swan-Driving (с исходниками)
- Swan-Driving (ч/б версия) (с исходниками)
- демо от Orion (с исходниками)
Описание
gray
Процессор
Процессорное ядро - 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-разрядную шину данных (вход/выход разделены).
Память
Память разделена на сегементы по 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 .. так далее.
$C3 - Cегмент 3. Аналогично
$C0 - Cегменты 4-$F. Биты 0...3 порта $C0 - это биты 4...7 номера ROM-банка в сегментах 4-$F. Биты 0...3 берутся из номера сегмента, например, IO[$C0]=$4E -> сегмент 9 содержит ROM bank $E9.
Карта памяти
Адрес | Содержит | Шина | Время доступа |
---|---|---|---|
000000h-00FFFFh | Встроенное ОЗУ | 16-bit | 1 цикл |
Пояснение: Для WS и WSC:
Только для WSC:
| |||
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-битное слово считывается из палитрового ОЗУ и выводится на экран.
Порты ввода/вывода
Порт | Доступ | Маска | Название | Описание |
---|---|---|---|---|
000h | RW | 00****** | REG_DISP_CTRL | Управление дисплеем Биты:
|
001h | RW | 00000*** (WS) ******** (WSC) |
REG_BACK_COLOR | Определяет цвет фона Биты:
|
002h | R | ******** | REG_LINE_CUR | Отображение текущей строки |
003h | RW | ******** | REG_LINE_CMP | Сравнение линий (для прерывания обнаружения рисованной линии) |
004h | RW | 000***** (WS) 00****** (WSC) |
REG_SPR_BASE | Определяет базовый адрес для таблицы спрайтов. Чтобы получить адрес таблицы, сдвиньте значение влево 9 раз: х хххххх0 00000000 |
005h | RW | 0******* | REG_SPR_FIRST | Определяет номер спрайта для начала рисования |
006h | RW | ******** | REG_SPR_COUNT | Количество спрайтов для рисования. Любое значение выше 080h действует как 080h. |
007h | RW | 0***0*** (WS) ******** (WSC) |
REG_MAP_BASE | Базовый адрес тайловых карт Формат:
|
008h | RW | ******** | REG_SCR2_WIN_X0 | Определение X верхнего левого угла окна FG |
009h | RW | ******** | REG_SCR2_WIN_Y0 | Определение Y верхнего левого угла окна FG |
00Ah | RW | ******** | REG_SCR2_WIN_X1 | Определение X нижнего правого угла окна FG |
00Bh | RW | ******** | REG_SCR2_WIN_Y1 | Определение Y нижнего правого угла окна FG |
00Ch | RW | ******** | REG_SPR_WIN_X0 | Определение X верхнего левого угла окна спрайтов |
00Dh | RW | ******** | REG_SPR_WIN_Y0 | Определение Y верхнего левого угла окна спрайтов |
00Eh | RW | ******** | REG_SPR_WIN_X1 | Определение X нижнего правого угла окна спрайтов |
00Fh | RW | ******** | REG_SPR_WIN_Y1 | Определение Y нижнего правого угла окна спрайтов |
010h | RW | ******** | REG_SCR1_X | Скролл BG по оси X |
011h | RW | ******** | REG_SCR1_Y | Скролл BG по оси Y |
012h | RW | ******** | REG_SCR2_X | Скролл FG по оси X |
013h | RW | ******** | REG_SCR2_Y | Скролл FG по оси Y |
014h | RW | ******** (WS) ****00** (WSC) 0000000* (SC) |
REG_LCD_CTRL | Бит 0 включает и выключает дисплей. Фукнкция остальных бит зависит от системы:
|
015h | RW | 00****** | REG_LCD_ICON | Иконки. Биты:
|
016h | RW | ******** | REG_LCD_VTOTAL | Дисплейное прерывание VTOTAL. Влияет на все видеотайминги. Начальное значение 09Eh.
При установке значения на 255 дисплей отключается. Установка значения меньше 143 прекращает вызов прерывания VBLANK и вызывает повторение первых строк VTOTAL на дисплее. На SwanCrystal установка нечётных значений в регистре приводит к плохой работе дисплея: сканлайн, размытие, временное выгорание. |
017h | RW | ******** | REG_LCD_VSYNC | Вероятно, положение VSYNC
На SwanCrystal регистр нулевой. Начальное значение - 09Bh Должен быть больше 144 или меньше, чем VTOTAL, иначе дисплей выключится (?). |
018h | -- | |||
019h | -- | |||
01Ah | ???? | |||
01Bh | -- | |||
01Ch | RW | ******** | REG_PALMONO_POOL_0 | Выбор пула монохромной палитры Биты:
|
01Dh | RW | REG_PALMONO_POOL_1 | ||
01Eh | RW | REG_PALMONO_POOL_2 | ||
01Fh | RW | REG_PALMONO_POOL_3 | ||
020h | RW | 0***0*** 0***0*** | REG_PALMONO_0 (Low) | Монохромная палитра. Биты:
|
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 | ******** *******0 | REG_DMA_SRC (Low) | Адрес источника DMA, как линейный адрес (младшие 16 бит). Обновляется после каждой передачи |
041h | RW | REG_DMA_SRC (Mid) | ||
042h | RW | 0000**** | REG_DMA_SRC_HI | Адрес источника DMA, как линейный адрес (старшие 4 бита). Обновляется после каждой передачи |
043h | -- | |||
044h | RW | ******** *******0 | REG_DMA_DST (Low) | Адрес назначения DMA IRAM, как линейный адрес. Обновляется после каждой передачи |
045h | RW | REG_DMA_DST (High) | ||
046h | RW | ******** *******0 | REG_DMA_LEN (Low) | Размер передачи DMA в байтах. Обновляется после каждой передачи |
047h | RW | REG_DMA_LEN (High) | ||
048h | RW | **000000 | REG_DMA_CTRL | Управление передачей DMA. Биты:
|
049h | -- | |||
04Ah | RW | ******** ******** | REG_SDMA_SRC (Low) | Адрес источника Sound DMA как линейный адрес (младшие 16 битов). Обновляется после каждой передачи |
04Bh | RW | REG_SDMA_SRC (Mid) | ||
04Ch | RW | ******** ******** | REG_SDMA_SRC_HI | Адрес источника Sound DMA как линейный адрес (старшие 4 бит). Обновляется после каждой передачи |
04Dh | -- | |||
04Eh | RW | ******** ******** | REG_SDMA_LEN (Low) | Размер передачи Sound DMA в байтах (младшие 16 бит). Обновляется после каждой передачи |
04Fh | RW | REG_SDMA_LEN (Mid) | ||
050h | RW | 0000**** | REG_SDMA_LEN_HI | Размер передачи Sound DMA в байтах (старшие 4 бит). Обновляется после каждой передачи |
051h | -- | |||
052h | RW | **0***** | REG_SDMA_CTRL | Управление передачей Sound DMA Биты:
|
053h | --- | |||
054h | --- | |||
055h | --- | |||
056h | --- | |||
057h | --- | |||
058h | --- | |||
059h | --- | |||
05Ah | --- | |||
05Bh | --- | |||
05Ch | --- | |||
05Dh | --- | |||
05Eh | --- | |||
05Fh | --- | |||
060h | RW | ***0*0** | REG_DISP_MODE | Режим отображения Биты:
|
061h | --- | |||
062h | RW | 0000000* (WSC) 1000000* (SC) |
REG_WSC_SYSTEM | Отсутствует на WonderSwan. Содержит информацию, система является WonderSwan color или SwanCrystal. Также можно позволяет выключить питание. Биты:
|
063h | --- | |||
064h | --- | |||
065h | --- | |||
066h | --- | |||
067h | --- | |||
068h | --- | |||
069h | --- | |||
06Ah | RW | ******** | REG_HYPER_CTRL | Hypervoice. Регистр связан с REG_HYPER_CHAN_CTRL Биты:
|
06Bh | RW | 0**0**** | REG_HYPER_CHAN_CTRL | Hypervoice. Регистр связан с REG_HYPER_CTRL Биты:
|
06Ch | --- | |||
06Dh | --- | |||
06Eh | --- | |||
06Fh | --- | |||
070h | R | REG_UNK_70 | Присутствует только на SwanCrystal. Имеет значение 0D0h | |
071h | R | RRRRRRRR | REG_UNK_71 | Присутствует только на SwanCrystal. Имеет значение 077h |
072h | R | RRRRRRRR | REG_UNK_72 | Присутствует только на SwanCrystal. Имеет значение 0F7h |
073h | R | RRRRRRRR | REG_UNK_73 | Присутствует только на SwanCrystal. Имеет значение 006h |
074h | R | RRRRRRRR | REG_UNK_74 | Присутствует только на SwanCrystal. Имеет значение 0E2h |
075h | R | RRRRRRRR | REG_UNK_75 | Присутствует только на SwanCrystal. Имеет значение 00Ah |
076h | R | RRRRRRRR | REG_UNK_76 | Присутствует только на SwanCrystal. Имеет значение 0EAh |
077h | R | RRRRRRRR | REG_UNK_77 | Присутствует только на SwanCrystal. Имеет значение 0EEh |
078h | --- | |||
079h | --- | |||
07Ah | --- | |||
07Bh | --- | |||
07Ch | --- | |||
07Dh | --- | |||
07Eh | --- | |||
07Fh | --- | |||
080h | RW | 00000*** ******** | REG_SND_CH1_PITCH (Low) | Значение частоты канала |
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 | ******** | REG_SND_CH1_VOL | Громкость канала Биты:
Для Voice весь регистр является значением PCM |
089h | RW | REG_SND_CH2_VOL | ||
08Ah | RW | REG_SND_CH3_VOL | ||
08Bh | RW | REG_SND_CH4_VOL | ||
08Ch | RW | ******** | REG_SND_SWEEP_VALUE | Значение sweep для канала 3 в режиме sweep |
08Dh | RW | 000***** | REG_SND_SWEEP_TIME | Тайминг sweep для канала 3 в режиме sweep |
08Eh | RW | 000***** | REG_SND_NOISE | Настройка шума для канала 4 в шумовом режиме. При изменении режима шума нужно также установить бит сброса. Биты:
|
08Fh | RW | ******** | REG_SND_WAVE_BASE | Указатель на волновую таблицу. Значение регистра должно быть по адресу >> 6. |
090h | RW | ***0**** | REG_SND_CTRL | Включает каналы и меняет режим их работы Биты:
|
091h | RW | R000**** | REG_SND_OUTPUT | Выходной контроль Биты:
|
092h | R | 0RRRRRRR RRRRRRRR | REG_SND_RANDOM (Low) | Текущее значение шума LFSR |
093h | R | REG_SND_RANDOM (High) | ||
094h | RW | 0000**** | REG_SND_VOICE_CTRL | Стереэффект PCM voice
Биты полной громкости переопределяют биты половинной громкости. Биты:
|
095h | RW | ******** | REG_SND_HYPERVOICE | Неизвестно. Вероятно, Hypervoice-семплы |
096h | RW | 000000** ******** (WS) 00000000 00000000 (WSC+SC) |
REG_SND_9697 (Low) | Неизвестно |
097h | RW | REG_SND_9697 (High) | ||
098h | RW | 000000** ******** (WS) 00000000 00000000 (WSC+SC) |
REG_SND_9899 (Low) | Неизвестно |
099h | RW | REG_SND_9899 (High) | ||
09Ah | R | 00000111 (WS) 00000000 (WSC+SC) |
REG_SND_9A | Неизвестно |
09Bh | R | 11111110 (WS) 00000000 (WSC+SC) |
REG_SND_9B | Неизвестно |
09Ch | R | 11111111 (WS) 00000000 (WSC+SC) |
REG_SND_9C | Неизвестно |
09Dh | R | 11111111 (WS) 00000000 (WSC+SC) |
REG_SND_9D | Неизвестно |
09Eh | R | 000000** | REG_SND_9E | Неизвестно |
09Fh | --- | |||
0A0h | RW |
+000**0+ (WS) |
REG_HW_FLAGS | Единственным реальным использованием этого регистра является проверка системы с цветом. Биты:
|
0A1h | --- | |||
0A2h | RW | 0000**** | REG_TMR_CTRL | Управление таймеров
Биты:
|
0A3h | ??? | |||
0A4h | RW | ******** ******** | REG_HTMR_FREQ (Low) | Частота таймера H-Blank |
0A5h | RW | REG_HTMR_FREQ (High) | ||
0A6h | RW | ******** ******** | REG_VTMR_FREQ (Low) | Частота таймера V-Blank |
0A7h | RW | REG_VTMR_FREQ (High) | ||
0A8h | R | RRRRRRRR RRRRRRRR | REG_HTMR_CTR (Low) | Текущее значение счётчика таймера H-Blank |
0A9h | R | REG_HTMR_CTR (High) | ||
0AAh | R | RRRRRRRR RRRRRRRR | REG_VTMR_CTR (Low) | Текущее значение счётчика таймера V-Blank |
0ABh | R | REG_VTMR_CTR (High) | ||
0ACh | ??? | |||
0ADh | --- | |||
0AEh | --- | |||
0AFh | --- | |||
0B0h | RW | *******0 (WSC + SC) *****011 (WS) |
REG_INT_BASE | Смещение номера прерывания для аппаратных прерываний. Нижние 3 бита игнорируются аппаратным обеспечением генерации прерываний, поэтому их можно игнорировать. Фактические сгенерированные номера прерываний: (REG_INT_BASE & 0F8h) / intnum |
0B1h | RW | ******** | REG_SER_DATA | Байты связи. Используются как для передачи, так и для приема |
0B2h | RW | ******** | REG_INT_ENABLE | Включение аппаратных прерываний.
Биты:
|
0B3h | RW | **R00RRR | REG_SER_STATUS | Статус передачи и направление
Биты:
|
0B4h | R | RRRRRRRR | REG_INT_STATUS | Битовая маска для текущих вызваннных аппаратных прерываний. Используемые биты совпадают с номерами прерываний.
REG_INT_ENABLE не влияет на этот регистр. |
0B5h | RW | 0***RRRR | REG_KEYPAD | Кнопки управления
Биты:
|
0B6h | W | WWWWWWWW | REG_INT_ACK | Подтверждение прерывания. Каждый установленный бит будет подтверждать соответствующее прерывание, очищенные биты не действуют.
REG_INT_ENABLE не влияет на этот регистр. Чтение этого регистра возвращает 0. Биты:
|
0B7h | ??? | |||
0B8h | --- | |||
0B9h | --- | |||
0BAh | RW | ******** ******** | REG_IEEP_DATA (Low) | Data port |
0BBh | RW | REG_IEEP_DATA (High) | ||
0BCh | RW | ******** ******** | REG_IEEP_ADDR (Low) | адресный порт и порт управления
1 Кбит:
16 Кбит:
Расширенные команды (верхние 2 бита адреса)
|
0BDh | RW | REG_IEEP_ADDR (High) | ||
0BEh | R | 000000** | REG_IEEP_STATUS | Порт статуса
Биты:
|
W | 0***0000 | REG_IEEP_CMD | Тип поведения. Также запуск команды. Установка более одного бита ничего не вызывает.
Биты:
| |
0BFh | ??? | |||
0C0h | RW | ******** | REG_BANK_ROM2 | Выбор банка ROM (сегменты 4-F)
Регистр содержит верхние биты банка ПЗУ, используемые для доступа к ROM2; нижние 4 бита банка - это верхние 4 бита адреса, к которому осуществляется доступ в этом диапазоне. Все 8 бит сохраняют состояние. В маппере 2001 выводится только 4 бита, в 2003 - 6 Например, для значения регистра 0F4h и адреса доступа 056789h результирующий адрес ПЗУ будет 0456789h для маппера 2001 и 03456789h для маппера 2003. |
0C1h | RW | ******** | REG_BANK_SRAM | Выбор банка SRAM
Пример: для значения регистра 034h и адреса обращения к 015678h результирующий адрес SRAM будет 0345678h. |
0C2h | RW | ******** | REG_BANK_ROM0 | Выбор банка ROM0 (сегмент 2).
Пример: для значения регистра 034h и адреса доступа 025678h результирующий адрес ПЗУ будет 0345678h. |
0C3h | RW | ******** | REG_BANK_ROM1 | Выбор банка ROM1 (сегмент 3).
Пример: для значения регистра 034h и адреса доступа 025678h результирующий адрес ПЗУ будет 0345678h. |
0C4h | RW | ******** ******** | REG_EEP_DATA (Low) | Data port картриджа |
0C5h | RW | REG_EEP_DATA (High) | ||
0C6h | RW | REG_EEP_ADDR (Low) | адресный порт и порт управления картриджа
1 Кбит:
16 Кбит:
Расширенные команды (верхние 2 бита адреса)
| |
0C7h | RW | REG_EEP_ADDR (High) | ||
0C8h | R | REG_EEP_STATUS | порт статуса картриджа
Биты:
| |
0C8h | W | REG_EEP_CMD | Командный порт картриджа
Биты:
| |
0C9h | ??? | |||
0CAh | R | REG_RTC_STATUS | Статус часов
Бит 7 - ожидание команды | |
W | REG_RTC_CMD | Команды часам
Запись:
Чтение:
| ||
0CBh | RW | REG_RTC_DATA | Данные часов
Запись:
После команды ($CA):
чтение: после команды ($CA)
| |
0CCh | RW | ******** | REG_GPO_EN | General-Purpose Outputs - выходные данные общего назначения, используются некоторыми мапперами, например, для светодиодов
Биты:
|
0CDh | RW | ******** | REG_GPO_DATA | Биты:
|
0CEh | RW | REG_WW_FLASH_CE | Порт ввода/вывода для WonderWitch, коммерческого комплекта разработки, который использует Flash-ROM для хранения программ, а также OS и BIOS под названием Freya.
Flash-ROM может быть записан из WonderWitch, но нельзя одновременно писать код и выполнять. То есть нужно перебрасывать код в ОЗУ и выполнять его оттуда, чтобы записать данные на Flash-ROM | |
0CFh | ??? | |||
0D0h | ??? | |||
0D1h | ??? | |||
0D2h | ??? | |||
0D3h | ??? | |||
0D4h | ??? | |||
0D5h | ??? | |||
0D6h | ??? | |||
0D7h | ??? | |||
0D8h | ??? | |||
0D9h | ??? | |||
0DAh | ??? | |||
0DBh | ??? | |||
0DCh | ??? | |||
0DDh | ??? | |||
0DEh | ??? | |||
0DFh | ??? | |||
0E0h | ??? | |||
0E1h | ??? | |||
0E2h | ??? | |||
0E3h | ??? | |||
0E4h | ??? | |||
0E5h | ??? | |||
0E6h | ??? | |||
0E7h | ??? | |||
0E8h | ??? | |||
0E9h | ??? | |||
0EAh | ??? | |||
0EBh | ??? | |||
0ECh | ??? | |||
0EDh | ??? | |||
0EEh | ??? | |||
0EFh | ??? | |||
0F0h | ??? | |||
0F1h | ??? | |||
0F2h | ??? | |||
0F3h | ??? | |||
0F4h | ??? | |||
0F5h | ??? | |||
0F6h | ??? | |||
0F7h | ??? | |||
0F8h | ??? | |||
0F9h | ??? | |||
0FAh | ??? | |||
0FBh | ??? | |||
0FCh | ??? | |||
0FDh | ??? | |||
0FEh | ??? | |||
0FFh | ??? |
Дисплей
Разрешение дисплея WonderSwan равно 224х144
Дисплей WonderSwan может отображать 12 оттенков серого цвета, дисплеи WonderSwan Color и SwanCrystal способны отображать 12-битный RGB (4096 цветов).
Дисплейные тайминги:
0 224 256 ----------------- 0| | | | | | | | | | | | 144|-------------- | 159|_________________|
PIXCLK = 3.072MHz
HDISP = 224
HBLANK = 32
HTOTAL = 256
HCLK = 12kHz (3072000 / 256)
VDISP = 144
VBLANK = 15
VTOTAL = 159
VCLK = ~75.47Hz (12000 / 159)
Когда контроллер дисплея обращается к памяти, процессор не приостанавливается.
Палитры
Видеорежим задаётся в регистре REG_DISP_MODE. В зависимости от выбранного режима используются разные данные.
В монохромном режиме палитры управляются регистрами REG_PALMONO_POOL и REG_PALMONO.
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 - плитка
Звук
Имеется 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-битный LFSR со следующим алгоритмом:
noise_bit = (1 ^ (ctr >> 7) ^ (ctr >> tap)) & 1
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.