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