Содержание
- 1 Ассемблеры
- 2 Инструменты
- 3 Эмуляторы
- 4 Хоумбрю
- 5 Описание
- 5.1 Процессор
- 5.2 Память
- 5.3 Порты ввода/вывода
- 5.4 Дисплей
- 5.5 Звук
- 5.6 Кнопки
- 5.7 Прерывания
- 5.8 Последовательный порт
- 5.9 Внутренняя EEPROM
- 5.10 DMA контроллер
- 5.11 Sound DMA контроллер
- 5.12 Таймеры
- 5.13 Картридж
- 5.14 Часы реального времени (RTC)
- 5.15 ЭСППЗУ картриджа (EEPROM)
- 5.16 Выходы картриджа общего назначения
- 5.17 WonderWitch
Ассемблеры
- nasm (16-битный)
Инструменты
- bmp2swan - конвертер 16-цветного BMP-файла в тайлы, палитру и карту. Поддерживается отражение по вертикали и горизонтали.
- SwanLayer Merger - инструмент для объединения данных, нужен в случае, когда на изображение требуется больше 16 цветов: нужно разделить изображения на несколько 16-цветных BMP, сконвертировать при помощи bmp2swan, затем в SwanLayer Merger объединить данные и создать общие карту, набор плиток и палитры.
- WonderSwan Total Sound Driver (WTD)
Эмуляторы
- Cygne Tracer (с дебаггером)
- Другие эмуляторы
Хоумбрю
- Swan-Driving (с исходниками)
- Swan-Driving (ч/б версия) (с исходниками)
- демо от Orion (с исходниками)
Описание
Материал ниже основан на данных источниках:
Процессор
Процессорное ядро - 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 -
Память
Порты ввода/вывода
Дисплей
Звук
Кнопки
Проверка статус кнопок в порте 0B5h.
Кнопки мультиплексированы на 4 бита с использованием AND. Чтобы получить полные значения кнопок, повторите каждое из значений маски и объедините их.
Прерывания
Таблица векторов прерываний расположена в 0000:0000h, каждая запись имеет длину 4 байта и содержит дальний указатель на обработчик. В таблице векторов есть 100h записей, но только указатели прерываний процессора и аппаратных прерываний могут заполняться или использоваться для указателей обработчиков прерываний.
Прерывания процессора
Эти номера прерываний привязаны к началу IVT.
Прерывание | Название | Описание |
---|---|---|
00h | CPUINT_DIV | Разделить ошибку |
01h | CPUINT_STEP | Одноступенчатое прерывание |
02h | CPUINT_NMI | Немаскируемое прерывание |
03h | CPUINT_BREAK | инструкция INT 3 |
04h | CPUINT_INTO | Переполнение прерывания |
05h | CPUINT_BOUNDS | BOUND-отказ |
06h | CPUINT_INVALID | Неверный опкод |
07h | CPUINT_ESCAPE | Опкод выхода |
Аппаратные прерывания
Эти прерывания не привязаны к началу IVT, регистр REG_INT_BASE определяет базу для векторов аппаратных прерываний.
Они имеют приоритеты, самый высокий номер прерывания имеет приоритет над более низким.
Edge(?)-инициируемые прерывания должны быть подтверждены через REG_INT_ACK для разрешения запуска другого прерывания.
Level(?)-инициируемые прерывания должны быть урегулированы, иначе прерывание будет срабатывать непрерывно.
Прерывание | Триггер | Название | Описание |
---|---|---|---|
00h | Level | HWINT_SER_TX | Serial TX ready interrupt |
01h | Edge | HWINT_KEY | Key press interrupt |
02h | Level | HWINT_CART | Cartridge interrupt (usually RTC alarm) |
03h | Level | HWINT_SER_RX | Serial RX ready interrupt |
04h | Edge | HWINT_LINE | Line compare interrupt |
05h | Edge | HWINT_VBLANK_TMR | V-Blank timer interrupt |
06h | Edge | HWINT_VBLANK | V-Blank interrupt |
07h | Edge | HWINT_HBLANK_TMR | H-Blank timer interrupt |
Порты
REG_INT_BASE
REG_INT_ENABLE
REG_INT_STATUS
REG_INT_ACK
Последовательный порт
Порт расширения - это прежде всего внешний последовательный порт. Разъем имеет только последовательный контакт IN и OUT, что означает, что нет аппаратного управления потоком данных.
Последовательный контроллер WonderSwan имеет однобайтовый входной буфер и не имеет выходного буфера. Любое переполнение входного буфера приведет к установке бита переполнения в REG_SER_STATUS, и последовательный контроллер перестаёт отвечать, пока не будет установлен бит сброса переполнения.
Синхронные передачи
Чтобы открыть последовательное соединение, установите бит разрешения и бит сброса превышения в REG_SER_STATUS.
Чтобы закрыть последовательную связь, очистите бит разрешения. Скорее всего, придётся подождать, пока поднимается пустая отправка.
Чтобы отправить символ, подождите, пока пустая отправка высоко поднимается, затем записывайте байт данных в REG_USER_DATA.
Чтобы получить символ, дождитесь, пока полученные данные поднимутся выше, а затем считайте байт данных из REG_SER_DATA. Если при ожидании было установлено Переполнение (Overrun) и оно произошло, выполните Overrun Reset.
Асинхронные передачи ???
Порты
REG_SER_DATA
REG_SER_STATUS
Внутренняя EEPROM
WonderSwan имеет внутреннюю EEPROM размером 1 Кбит (64x16 бит), используемую для хранения информации о пользователе и некоторых очень небольших объемов данных, сохраняемых игрой. WonderSwan Color имеет EEPROM размером 16 Кбит (1024x16 бит), где добавлены ещё еще несколько полей информации о пользователе и увеличена область для игровых сохранений.
Информация о владельце может быть установлена в программе IPL.
Порты
REG_IEEP_DATA
REG_IEEP_ADDR
REG_IEEP_STATUS
REG_IEEP_CMD
Использование ???
Информация о владельце
Addr | Size | Description |
---|---|---|
060h | 10h | Имя (схема кодирования указана ниже) |
070h | 02h | Год рождения |
072h | 01h | Месяц рождения |
073h | 01h | День рождения |
074h | 01h | Пол |
075h | 01h | Группа крови |
Для WSC/SC | ||
080h | 03h | Неизвестно |
083h | 01h | Флаги: b7 - неизвестно |
084h | 01h | Цвет имени: 00 - чёрный |
Кодирование имени:
Значение | ASCII | Описание |
---|---|---|
000h | 020h | Пробел |
001h-00Ah | 030h-039h | Числа |
00Bh-024h | 041h-05Ah | Заглавные символы |
025h | 003h | Серде |
026h | 00Dh | Музыкальная нота |
027h | 02Bh | Плюс |
028h | 02Dh | Минус |
029h | 03Fh | Знак вопроса |
02Ah | 02Eh | Точка |
DMA контроллер
Этот контроллер прямого доступа к памяти приостанавливает работу процессора во время передачи.
На WonderSwan все эти регистры не отображены. Информация о них верна для режима совместимости с WonderSwan на WonderSwan Color или SwanCrystal.
Контроллер DMA:
- передаёт данные в словах, все регистры обеспечивают выравнивание слов
- не может получить доступ к SRAM из-за 8-битной шины
- может передавать только в IRAM, нет способа указать пункт назначения за его пределами
Контроллер DMA имеет несколько режимов сбоя передачи. При быстром сбое передачи контроллер не запускается, процессор не останавливается. При медленном сбое передача занимает столько же времени, сколько и завершённая передача, только некоторые или все слова не будут переданы.
Случаи быстрого сбоя:
- длина равна 0
- источник указан как находящийся в SRAM
Случаи медленного сбоя:
- источник перемещается в SRAM - в этом случае слова передаются до момента сбоя
Передача данных контроллером занимает мало времени. Общее время передачи составляет 5 + 2n циклов, где n-количество передаваемых слов.
Порты
REG_DMA_SRC
REG_DMA_SRC_HI
REG_DMA_DST
REG_DMA_LEN
REG_DMA_CTRL
Sound DMA контроллер
На WonderSwan регистры Sound DMA не отображены. Информация о них верна для режима совместимости с WonderSwan на WonderSwan Color или SwanCrystal.
Порты
REG_SDMA_SRC
REG_SDMA_SRC_HI
REG_SDMA_LEN
REG_SDMA_LEN_HI
REG_SDMA_CTRL
Таймеры
Имеется 2 таймера обратного отчёта, которые можно использовать для запуска растровых событий, звука или чего-то ещё. Имеются однократный и зацикленный режимы.
Порты
REG_TMR_CTRL
REG_HTMR_FREQ
REG_VTMR_FREQ
REG_HTMR_CTR
REG_VTMR_CTR
Картридж
В большинстве случаев последниие 10 байт образа картриджа являются разделом метаданных.
ПЗУ WonderSwan содержат 10 - байтовый раздел метаданных в качестве последних 10 байтов образа ПЗУ. В большинстве случаев это верно, но некоторые тележки содержат неверную или вводящую в заблуждение информацию. Список этих игр приведен ниже
Смещение | Размер | Описание |
---|---|---|
-01h | 001h | Должен быть равным нулю! |
000h | 001h | Идентификатор издателя |
001h | 001h | Система (0=WonderSwan, 1=WonderSwan Color) |
002h | 001h | Идентификатор игры |
003h | 001h | Версия игры |
004h | 001h | Размер ПЗУ:
|
005h | 001h | Размер сохранения:
|
006h | 001h | Флаги:
|
007h | 001h | RTC используется или нет (0=нет, 1=дат) |
008h | 002h | 16-битная сумма всех слов ПЗУ, кроме этого. WonderWitch равно нулю. |
Картриджи используют систему банков памяти. Имеется три банка ПЗУ и 1 банк SRAM.
Порты
REG_BANK_ROM2
REG_BANK_SRAM
REG_BANK_ROM0
REG_BANK_ROM1
Часы реального времени (RTC)
Для команд чтения каждое считывание из регистра REG_RTC_DATA будет подавать следующий байт из сдвигового регистра, поэтому убедитесь, что вы прочитали все соответствующие данные для команды.
Для команд записи нужно запистаь первый байт в REG_RTC_DATA перед отправкой команды, так как этот байт будет смещён. Для команд с длинными данными после отправки команды остальные байты выбейте через порт REG_RTC_DATA
Для записи команд вы должны записать первый байт в REG_RTC_DATA перед отправкой команды, так как этот байт данных немедленно смещается. Для команд с более длинными данными, после отправки команды, выбейте остальные байты через порт REG_RTC_DATA.
Команды
Команда | Код | Ввод | Вывод |
---|---|---|---|
Сброс | 060h | None | None |
Чтение статуса | 062h | None | 1 byte |
Запись статуса | 063h | 1 byte | None |
Чтение даты | 064h | None | 4 bytes (?) |
Запись даты | 065h | 4 bytes (?) | None |
Чтение времени | 066h | None | 3 bytes (?) |
Запись времени | 067h | 3 bytes (?) | None |
Чтение звонка R0 | 068h | - | - |
Запись звонка R0 | 069h | - | - |
Чтение звонка R1 | 06Ah | - | - |
Запись звонка R1 | 06Bh | - | - |
Регистр статуса/состояния 7 - POWER 6 - 24/12 5 - INTAE 4 - 0 3 - INTME 2 - 0 1 - INTFE 0 - 0
Регистр даты 0-7 - год 8-12 - месяц 16-21 - день 24-26 - день недели 32-37 - час 39 - перед/после полудня 40-46 - минуты 48-54 - секунды 55 - тест
Порты
REG_RTC_STATUS
REG_RTC_CMD
REG_RTC_DATA
ЭСППЗУ картриджа (EEPROM)
Порты
REG_EEP_DATA
REG_EEP_ADDR
REG_EEP_STATUS
REG_EEP_CMD
Выходы картриджа общего назначения
Порты
REG_GPO_EN
REG_GPO_DATA
WonderWitch
-