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