Шаблон:Раздел не завершен
Ассемблеры
Инструменты
- bmp2swan - конвертер 16-цветного BMP-файла в тайлы, палитру и карту. Поддерживается отражение по вертикали и горизонтали.
- SwanLayer Merger - инструмент для объединения данных, нужен в случае, когда на изображение требуется больше 16 цветов: нужно разделить изображения на несколько 16-цветных BMP, сконвертировать при помощи bmp2swan, затем в SwanLayer Merger объединить данные и создать общие карту, набор плиток и палитры.
- WonderSwan Total Sound Driver (WTD)
Эмуляторы
Хоумбрю
Описание
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:
- 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-битное слово считывается из палитрового ОЗУ и выводится на экран.
Порты ввода/вывода
Клик
Порт |
Доступ |
Маска
|
Название
|
Описание
|
000h |
RW |
00******
|
REG_DISP_CTRL
|
Управление дисплеем
Биты:
- 0 - BG включен
- 1 - FG включен
- 2 - спрайты включены
- 3 - спрайтовое окно включено
- 4,5 - FG-окно
- 0 0 - слой FG отображается внутри и снаружи зоны окна
- 0 1 - ??
- 1 0 - слой FG отображается только внутри окна
- 1 1 - слой FG отображается за пределами окна.
|
001h |
RW |
00000*** (WS) ******** (WSC)
|
REG_BACK_COLOR
|
Определяет цвет фона
Биты:
- WS: 0-2 - цвет фона из пула
- WSC: 0-3 - цвет фона, 4-7 палитра фона
|
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
|
Базовый адрес тайловых карт
Формат:
- Биты 7-0 : ffffbbbb
- Биты 7-4 - Определение FG (адрес - 0ffff000 00000000)
- Биты 3-0 - Определение BG (адрес - 0bbbb000 00000000)
|
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 включает и выключает дисплей. Фукнкция остальных бит зависит от системы:
- WonderSwan:
- WonderSwan Color:
- 4-7 - ???
- 1 - контраст (0 - низкий, 1 - высокий)
- SwanCrystal
|
015h |
RW |
00******
|
REG_LCD_ICON
|
Иконки.
Биты:
- 5 - большой круг
- 4 - средний круг
- 3 - маленький круг
- 2 - положение иконки по горизонтали
- 1 - положение иконки по вертикали
- 0 - индикатор сна
|
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
|
Выбор пула монохромной палитры
Биты:
- 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 |
0***0*** 0***0*** |
REG_PALMONO_0 (Low)
|
Монохромная палитра.
Биты:
- 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 |
******** *******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.
Биты:
- 7 - стоп/старт передачи. Когда передача закончена, бит принимает значение 0.
- 6 - шаг адреса (0 = увеличение, 1 = уменьшение)
|
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
Биты:
- 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 |
---
|
054h |
---
|
055h |
---
|
056h |
---
|
057h |
---
|
058h |
---
|
059h |
---
|
05Ah |
---
|
05Bh |
---
|
05Ch |
---
|
05Dh |
---
|
05Eh |
---
|
05Fh |
---
|
060h |
RW |
***0*0**
|
REG_DISP_MODE
|
Режим отображения
Биты:
- 7 - количество цвето в плитках (0 = 4 цвета, 1 = 16 цветов)
- 6 - режим отображения (0=WS, 1=WSC)
- 5 - формат тайлов (0=packed, как в Mega Drive, или 1=layered, как в Game Gear)
|
061h |
---
|
062h |
RW |
0000000* (WSC) 1000000* (SC)
|
REG_WSC_SYSTEM
|
Отсутствует на WonderSwan. Содержит информацию, система является WonderSwan color или SwanCrystal. Также можно позволяет выключить питание.
Биты:
- 7 - система (0=WonderSwan Color, 1=SwanCrystal)
- 0 - значение 1 отключает систему.
|
063h |
---
|
064h |
---
|
065h |
---
|
066h |
---
|
067h |
---
|
068h |
---
|
069h |
---
|
06Ah |
RW |
********
|
REG_HYPER_CTRL
|
Hypervoice. Регистр связан с REG_HYPER_CHAN_CTRL
Биты:
- 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 |
0**0****
|
REG_HYPER_CHAN_CTRL
|
Hypervoice. Регистр связан с REG_HYPER_CTRL
Биты:
- 6 - включает правый канал
- 5 - включает левый канал
- 0-3 - ???
|
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
|
Громкость канала
Биты:
- 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 |
********
|
REG_SND_SWEEP_VALUE
|
Значение sweep для канала 3 в режиме sweep
|
08Dh |
RW |
000*****
|
REG_SND_SWEEP_TIME
|
Тайминг sweep для канала 3 в режиме sweep
|
08Eh |
RW |
000*****
|
REG_SND_NOISE
|
Настройка шума для канала 4 в шумовом режиме. При изменении режима шума нужно также установить бит сброса.
Биты:
- 4 - вкл/выкл
- 3 - сброс
- 0-2 - режим
|
08Fh |
RW |
********
|
REG_SND_WAVE_BASE
|
Указатель на волновую таблицу. Значение регистра должно быть по адресу >> 6.
|
090h |
RW |
***0****
|
REG_SND_CTRL
|
Включает каналы и меняет режим их работы
Биты:
- 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 |
R000****
|
REG_SND_OUTPUT
|
Выходной контроль
Биты:
- 7 - подключение наушников
- 3 - наушники вкл.
- 1-2 Сдвиг громкости основного динамика. Значение, отправленное на ШИМ динамика, сдвигается на это количество бит вниз
- 0 - основной динамик вкл.
|
092h |
R |
0RRRRRRR RRRRRRRR |
REG_SND_RANDOM (Low)
|
Текущее значение шума LFSR
|
093h |
R |
REG_SND_RANDOM (High)
|
094h |
RW |
0000****
|
REG_SND_VOICE_CTRL
|
Стереэффект PCM voice
Биты полной громкости переопределяют биты половинной громкости.
Биты:
- 3 - Левый канал вкл. (половинная громкость)
- 2 - Левый канал вкл. (полная громкость)
- 1 - Правый канал вкл. (половинная громкость)
- 0 - Правый канал вкл. (полная громкость)
|
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)
+000**1+ (SC/WSC)
+++++*1+ (SC в WS mode)
|
REG_HW_FLAGS
|
Единственным реальным использованием этого регистра является проверка системы с цветом.
Биты:
- 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 |
---
|
0A2h |
RW |
0000****
|
REG_TMR_CTRL
|
Управление таймеров
Биты:
- 3 - режима таймера V-Blank (0=один раз, 1=автоповтор)
- 2 - таймер V-Blank вкл/выкл
- 1 - режима таймера H-Blank (0=один раз, 1=автоповтор)
- 0 - таймер H-Blank Timer вкл/выкл
|
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
|
Включение аппаратных прерываний.
Биты:
- 7 - таймер HBlank
- 6 - начало VBlank
- 5 - таймер VBlank
- 4 - Обнаружение рисования линий
- 3 - Последовательный приём данных
- 2 - RTC Alarm
- 1 - Нажатие кнопок
- 0 - Последовательная передача данных
|
0B3h |
RW |
**R00RRR
|
REG_SER_STATUS
|
Статус передачи и направление
Биты:
- 7 - Включение передачи
- 6 - Скорость передачи (0=9600, 1=38400)
- 5 - Сброс Переполнения
- 2 - Отправка пустого буфера/завершение передачи
- 1 - Переполнение/ошибка
- 0 - Завершение приёма
|
0B4h |
R |
RRRRRRRR
|
REG_INT_STATUS
|
Битовая маска для текущих вызваннных аппаратных прерываний. Используемые биты совпадают с номерами прерываний.
REG_INT_ENABLE не влияет на этот регистр.
|
0B5h |
RW |
0***RRRR
|
REG_KEYPAD
|
Кнопки управления
Биты:
- Запись/чтение
- 6 - чтение кнопок
- 5 - чтение X-кнопок
- 4 - чтение Y-кнопок
- Чтение:
- 3 - B, X4, Y4
- 2 - A, X3, Y3
- 1 - Start, X2, Y2
- 0 - X1, Y1
|
0B6h |
W |
WWWWWWWW
|
REG_INT_ACK
|
Подтверждение прерывания. Каждый установленный бит будет подтверждать соответствующее прерывание, очищенные биты не действуют.
REG_INT_ENABLE не влияет на этот регистр.
Чтение этого регистра возвращает 0.
Биты:
- 7 - таймер HBlank
- 6 - начало VBlank
- 5 - таймер VBlank
- 4 - Обнаружение рисования линий
- 3 - Последовательный приём данных
- 2 - RTC Alarm
- 1 - Нажатие кнопок
- 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 Кбит:
- 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)
|
0BEh |
R |
000000**
|
REG_IEEP_STATUS
|
Порт статуса
Биты:
- 1 - Запись завершена
- 0 - Чтение завершено
|
W |
0***0000
|
REG_IEEP_CMD
|
Тип поведения. Также запуск команды. Установка более одного бита ничего не вызывает.
Биты:
- 6 - Защита
- 5 - Запись
- 4 - Чтение
|
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 Кбит:
- 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 |
???
|
0CAh |
R |
|
REG_RTC_STATUS
|
Статус часов
Бит 7 - ожидание команды
|
W |
|
REG_RTC_CMD
|
Команды часам
Запись:
- $10 - Сброс
- $12 - ??? будильник ???
- $13 - ???
- $14 - Установить время
- $15 - Получить время
Чтение:
|
0CBh |
RW |
|
REG_RTC_DATA
|
Данные часов
Запись:
После команды ($CA):
- $14 - 7 записей
- год (+2000)
- месяц
- день
- день недели
- час
- минута
- секунда
чтение: после команды ($CA)
- $13 - бит 7 - Ack [HACK = 1]
- $15 - 7 записей
- год (+2000)
- месяц
- день
- день недели
- час
- минута
- секунда
|
0CCh |
RW |
********
|
REG_GPO_EN
|
General-Purpose Outputs - выходные данные общего назначения, используются некоторыми мапперами, например, для светодиодов
Биты:
- 4-7 - ????
- 3 - GPO3 вкл
- 2 - GPO2 вкл
- 1 - GPO1 вкл
- 0 - GPO0 вкл
|
0CDh |
RW |
********
|
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 |
???
|
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.
Кнопки
Проверка статус кнопок в порте 0B5h.
Кнопки мультиплексированы на 4 бита с использованием AND. Чтобы получить полные значения кнопок, повторите каждое из значений маски и объедините их.
Прерывания
Таблица векторов прерываний расположена в 0000:0000h, каждая запись имеет длину 4 байта и содержит дальний указатель на обработчик. В таблице векторов есть 100h записей, но только указатели прерываний процессора и аппаратных прерываний могут заполняться или использоваться для указателей обработчиков прерываний.
Прерывания процессора
Эти номера прерываний привязаны к началу IVT.
Прерывание |
Название |
Описание
|
00h |
CPUINT_DIV |
Разделить ошибку
|
01h |
CPUINT_STEP |
Одноступенчатое прерывание
|
02h |
CPUINT_NMI |
Немаскируемое прерывание
|
03h |
CPUINT_BREAK |
инструкция INT 3
|
04h |
CPUINT_INTO |
Переполнение прерывания
|
05h |
CPUINT_BOUNDS |
BOUND-отказ
|
06h |
CPUINT_INVALID |
Неверный опкод
|
07h |
CPUINT_ESCAPE |
Опкод выхода
|
Аппаратные прерывания
Эти прерывания не привязаны к началу IVT, регистр REG_INT_BASE определяет базу для векторов аппаратных прерываний.
Они имеют приоритеты, самый высокий номер прерывания имеет приоритет над более низким.
Edge(?)-инициируемые прерывания должны быть подтверждены через REG_INT_ACK для разрешения запуска другого прерывания.
Level(?)-инициируемые прерывания должны быть урегулированы, иначе прерывание будет срабатывать непрерывно.
Прерывание |
Триггер |
Название |
Описание
|
00h |
Level |
HWINT_SER_TX |
Serial TX ready interrupt
|
01h |
Edge |
HWINT_KEY |
Key press interrupt
|
02h |
Level |
HWINT_CART |
Cartridge interrupt (usually RTC alarm)
|
03h |
Level |
HWINT_SER_RX |
Serial RX ready interrupt
|
04h |
Edge |
HWINT_LINE |
Line compare interrupt
|
05h |
Edge |
HWINT_VBLANK_TMR |
V-Blank timer interrupt
|
06h |
Edge |
HWINT_VBLANK |
V-Blank interrupt
|
07h |
Edge |
HWINT_HBLANK_TMR |
H-Blank timer interrupt
|
Порты
REG_INT_BASE
REG_INT_ENABLE
REG_INT_STATUS
REG_INT_ACK
Последовательный порт
Порт расширения - это прежде всего внешний последовательный порт. Разъем имеет только последовательный контакт IN и OUT, что означает, что нет аппаратного управления потоком данных.
Последовательный контроллер WonderSwan имеет однобайтовый входной буфер и не имеет выходного буфера. Любое переполнение входного буфера приведет к установке бита переполнения в REG_SER_STATUS, и последовательный контроллер перестаёт отвечать, пока не будет установлен бит сброса переполнения.
Синхронные передачи
Чтобы открыть последовательное соединение, установите бит разрешения и бит сброса превышения в REG_SER_STATUS.
Чтобы закрыть последовательную связь, очистите бит разрешения. Скорее всего, придётся подождать, пока поднимается пустая отправка.
Чтобы отправить символ, подождите, пока пустая отправка высоко поднимается, затем записывайте байт данных в REG_USER_DATA.
Чтобы получить символ, дождитесь, пока полученные данные поднимутся выше, а затем считайте байт данных из REG_SER_DATA. Если при ожидании было установлено Переполнение (Overrun) и оно произошло, выполните Overrun Reset.
Асинхронные передачи
???
Порты
REG_SER_DATA
REG_SER_STATUS
Внутренняя EEPROM
DMA контроллер
Sound DMA контроллер
Таймеры
Картридж
WonderWitch