Ассемблеры
Инструменты
- bmp2swan - конвертер 16-цветного BMP-файла в тайлы, палитру и карту. Поддерживается отражение по вертикали и горизонтали.
- SwanLayer Merger - инструмент для объединения данных, нужен в случае, когда на изображение требуется больше 16 цветов: нужно разделить изображения на несколько 16-цветных BMP, сконвертировать при помощи bmp2swan, затем в SwanLayer Merger объединить данные и создать общие карту, набор плиток и палитры.
- WonderSwan Total Sound Driver (WTD)
Эмуляторы
Хоумбрю
Описание
Материал ниже основан на данных источниках:
Процессор
Процессорное ядро - 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
WonderSwan имеет внутреннюю EEPROM размером 1 Кбит (64x16 бит), используемую для хранения информации о пользователе и некоторых очень небольших объемов данных, сохраняемых игрой. WonderSwan Color имеет EEPROM размером 16 Кбит (1024x16 бит), где добавлены ещё еще несколько полей информации о пользователе и увеличена область для игровых сохранений.
Информация о владельце может быть установлена в программе IPL.
Порты
REG_IEEP_DATA
REG_IEEP_ADDR
REG_IEEP_STATUS
REG_IEEP_CMD
Использование ???
Информация о владельце
Addr |
Size |
Description
|
060h |
10h |
Имя (схема кодирования указана ниже)
|
070h |
02h |
Год рождения
|
072h |
01h |
Месяц рождения
|
073h |
01h |
День рождения
|
074h |
01h |
Пол
|
075h |
01h |
Группа крови
|
Для WSC/SC
|
080h |
03h |
Неизвестно
|
083h |
01h |
Флаги:
b7 - неизвестно
b6 - контрастность LCD (0 - низкая, 1 - высокая)
b0-1 - громкость по-умолчанию
|
084h |
01h |
Цвет имени:
00 - чёрный
01 - красный
02 - оранжевый
03 - жёлтый
04 - зелёный
и т.д.
|
Кодирование имени:
Значение |
ASCII |
Описание
|
000h |
020h |
Пробел
|
001h-00Ah |
030h-039h |
Числа
|
00Bh-024h |
041h-05Ah |
Заглавные символы
|
025h |
003h |
Серде
|
026h |
00Dh |
Музыкальная нота
|
027h |
02Bh |
Плюс
|
028h |
02Dh |
Минус
|
029h |
03Fh |
Знак вопроса
|
02Ah |
02Eh |
Точка
|
DMA контроллер
Этот контроллер прямого доступа к памяти приостанавливает работу процессора во время передачи.
На WonderSwan все эти регистры не отображены. Информация о них верна для режима совместимости с WonderSwan на WonderSwan Color или SwanCrystal.
Контроллер DMA:
- передаёт данные в словах, все регистры обеспечивают выравнивание слов
- не может получить доступ к SRAM из-за 8-битной шины
- может передавать только в IRAM, нет способа указать пункт назначения за его пределами
Контроллер DMA имеет несколько режимов сбоя передачи. При быстром сбое передачи контроллер не запускается, процессор не останавливается. При медленном сбое передача занимает столько же времени, сколько и завершённая передача, только некоторые или все слова не будут переданы.
Случаи быстрого сбоя:
- длина равна 0
- источник указан как находящийся в SRAM
Случаи медленного сбоя:
- источник перемещается в SRAM - в этом случае слова передаются до момента сбоя
Передача данных контроллером занимает мало времени. Общее время передачи составляет 5 + 2n циклов, где n-количество передаваемых слов.
Порты
REG_DMA_SRC
REG_DMA_SRC_HI
REG_DMA_DST
REG_DMA_LEN
REG_DMA_CTRL
Sound DMA контроллер
На WonderSwan регистры Sound DMA не отображены. Информация о них верна для режима совместимости с WonderSwan на WonderSwan Color или SwanCrystal.
Порты
REG_SDMA_SRC
REG_SDMA_SRC_HI
REG_SDMA_LEN
REG_SDMA_LEN_HI
REG_SDMA_CTRL
Таймеры
Имеется 2 таймера обратного отчёта, которые можно использовать для запуска растровых событий, звука или чего-то ещё. Имеются однократный и зацикленный режимы.
Порты
REG_TMR_CTRL
REG_HTMR_FREQ
REG_VTMR_FREQ
REG_HTMR_CTR
REG_VTMR_CTR
Картридж
В большинстве случаев последниие 10 байт образа картриджа являются разделом метаданных.
ПЗУ WonderSwan содержат 10 - байтовый раздел метаданных в качестве последних 10 байтов образа ПЗУ. В большинстве случаев это верно, но некоторые тележки содержат неверную или вводящую в заблуждение информацию. Список этих игр приведен ниже
Смещение
|
Размер
|
Описание
|
-01h |
001h |
Должен быть равным нулю!
|
000h |
001h |
Идентификатор издателя
|
001h |
001h |
Система (0=WonderSwan, 1=WonderSwan Color)
|
002h |
001h |
Идентификатор игры
|
003h |
001h |
Версия игры
|
004h |
001h |
Размер ПЗУ:
- 000h - 1Mbit? (128KB)
- 001h - 2Mbit? (256KB)
- 002h - 4Mbit (512KB)
- 003h - 8Mbit (1MB)
- 004h - 16Mbit (2MB)
- 005h - 24Mbit (3MB)
- 006h - 32Mbit (4MB)
- 007h - 48Mbit (6MB)
- 008h - 64Mbit (8MB)
- 009h - 128Mbit (16MB)
|
005h |
001h |
Размер сохранения:
- 000h - отсутствует
- 001h - 64Kbit SRAM (8KB)
- 002h - 256Kbit SRAM (32KB)
- 003h - 1Mbit SRAM (128KB)
- 004h - 2Mbit SRAM (256KB)
- 005h - 4Mbit SRAM (512KB)
- 010h - 1Kbit EEPROM
- 020h - 16Kbit EEPROM
- 050h - 8Kbit EEPROM?
|
006h |
001h |
Флаги:
- b2 - Скорость доступа к ПЗУ (0=3 цикла, 1=1 цикл)
- b1 - разрядность шины ПЗУ (0=16-bit, 1=8-bit)
- b0 - ориентация (0=горизонтальная, 1=вертикальная)
|
007h |
001h |
RTC используется или нет (0=нет, 1=дат)
|
008h |
002h |
16-битная сумма всех слов ПЗУ, кроме этого. WonderWitch равно нулю.
|
Картриджи используют систему банков памяти. Имеется три банка ПЗУ и 1 банк SRAM.
Порты
REG_BANK_ROM2
REG_BANK_SRAM
REG_BANK_ROM0
REG_BANK_ROM1
Часы реального времени (RTC)
Для команд чтения каждое считывание из регистра REG_RTC_DATA будет подавать следующий байт из сдвигового регистра, поэтому убедитесь, что вы прочитали все соответствующие данные для команды.
Для команд записи нужно запистаь первый байт в REG_RTC_DATA перед отправкой команды, так как этот байт будет смещён. Для команд с длинными данными после отправки команды остальные байты выбейте через порт REG_RTC_DATA
Для записи команд вы должны записать первый байт в REG_RTC_DATA перед отправкой команды, так как этот байт данных немедленно смещается. Для команд с более длинными данными, после отправки команды, выбейте остальные байты через порт REG_RTC_DATA.
Команды
Команда |
Код |
Ввод |
Вывод
|
Сброс |
060h |
None |
None
|
Чтение статуса |
062h |
None |
1 byte
|
Запись статуса |
063h |
1 byte |
None
|
Чтение даты |
064h |
None |
4 bytes (?)
|
Запись даты |
065h |
4 bytes (?) |
None
|
Чтение времени |
066h |
None |
3 bytes (?)
|
Запись времени |
067h |
3 bytes (?) |
None
|
Чтение звонка R0 |
068h |
- |
-
|
Запись звонка R0 |
069h |
- |
-
|
Чтение звонка R1 |
06Ah |
- |
-
|
Запись звонка R1 |
06Bh |
- |
-
|
Регистр статуса/состояния
7 - POWER
6 - 24/12
5 - INTAE
4 - 0
3 - INTME
2 - 0
1 - INTFE
0 - 0
Регистр даты
0-7 - год
8-12 - месяц
16-21 - день
24-26 - день недели
32-37 - час
39 - перед/после полудня
40-46 - минуты
48-54 - секунды
55 - тест
Порты
REG_RTC_STATUS
REG_RTC_CMD
REG_RTC_DATA
ЭСППЗУ картриджа (EEPROM)
Порты
REG_EEP_DATA
REG_EEP_ADDR
REG_EEP_STATUS
REG_EEP_CMD
Выходы картриджа общего назначения
Порты
REG_GPO_EN
REG_GPO_DATA
WonderWitch
-