Материал из Chipwiki
Перейти к: навигация, поиск
WonderSwan/Программирование — различия между версиями
(Процессор)
(Хоумбрю: Обновление ссылок)
Строка 15: Строка 15:
  
 
==Хоумбрю==
 
==Хоумбрю==
* [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] (с исходниками)
  

Версия 17:39, 21 июля 2021

Ассемблеры

  • nasm (16-битный)

Инструменты

  • bmp2swan - конвертер 16-цветного BMP-файла в тайлы, палитру и карту. Поддерживается отражение по вертикали и горизонтали.
  • SwanLayer Merger - инструмент для объединения данных, нужен в случае, когда на изображение требуется больше 16 цветов: нужно разделить изображения на несколько 16-цветных BMP, сконвертировать при помощи bmp2swan, затем в SwanLayer Merger объединить данные и создать общие карту, набор плиток и палитры.
  • WonderSwan Total Sound Driver (WTD)

Эмуляторы

Хоумбрю

Описание

Материал ниже основан на данных источниках:

Процессор

Процессорное ядро - NEC V30 MZ на частоте 3.072 Мгц.

NEC V30 MZ - убыстрённая версия V30 с внутренним конвеером (16 байтовый буфер предварительной загрузки). V30MZ примерно в 4 раза быстрее V30. V30 в свою очередь является клоном Intel 8086, но работает на 30% быстрее его, может эмулировать Intel 8080 и содержит собственные инструкции.

В V30 MZ выборка команд, их декодирование и выполнение инструкций выполняется параллельно. По этой причине сложно определить, какая часть программы в настоящее время выполняется путём контроля ввода адресной шины для выборки кода команды.

Если дана команда условного перехода, даже если не выполняются ответвления, адрес назначения перехода выбирается предварительно (1 раз), и поэтому дальнейший мониторинг программы затруднён.

V30 MZ имеет 8 очередей предварительной выборки (16 байт)

Между V30MZ и V30 есть несколько отличий, например, неподдерживаемые опкоды, другая обработка флагов после mul/div.

V30 MZ имеет 20-разрядную адресную шину, 16-разрядную шину данных (вход/выход разделены).

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 - неизвестно
b6 - контрастность LCD (0 - низкая, 1 - высокая)
b0-1 - громкость по-умолчанию

084h 01h Цвет имени:

00 - чёрный
01 - красный
02 - оранжевый
03 - жёлтый
04 - зелёный
и т.д.

Кодирование имени:

Значение ASCII Описание
000h 020h Пробел
001h-00Ah 030h-039h Числа
00Bh-024h 041h-05Ah Заглавные символы
025h 003h Серде
026h 00Dh Музыкальная нота
027h 02Bh Плюс
028h 02Dh Минус
029h 03Fh Знак вопроса
02Ah 02Eh Точка

DMA контроллер

Этот контроллер прямого доступа к памяти приостанавливает работу процессора во время передачи.

На WonderSwan все эти регистры не отображены. Информация о них верна для режима совместимости с WonderSwan на WonderSwan Color или SwanCrystal.

Контроллер DMA:

  • передаёт данные в словах, все регистры обеспечивают выравнивание слов
  • не может получить доступ к SRAM из-за 8-битной шины
  • может передавать только в IRAM, нет способа указать пункт назначения за его пределами

Контроллер DMA имеет несколько режимов сбоя передачи. При быстром сбое передачи контроллер не запускается, процессор не останавливается. При медленном сбое передача занимает столько же времени, сколько и завершённая передача, только некоторые или все слова не будут переданы.

Случаи быстрого сбоя:

  • длина равна 0
  • источник указан как находящийся в SRAM

Случаи медленного сбоя:

  • источник перемещается в SRAM - в этом случае слова передаются до момента сбоя

Передача данных контроллером занимает мало времени. Общее время передачи составляет 5 + 2n циклов, где n-количество передаваемых слов.

Порты
REG_DMA_SRC
REG_DMA_SRC_HI
REG_DMA_DST
REG_DMA_LEN
REG_DMA_CTRL

Sound DMA контроллер

На WonderSwan регистры Sound DMA не отображены. Информация о них верна для режима совместимости с WonderSwan на WonderSwan Color или SwanCrystal.

Порты
REG_SDMA_SRC
REG_SDMA_SRC_HI
REG_SDMA_LEN
REG_SDMA_LEN_HI
REG_SDMA_CTRL

Таймеры

Имеется 2 таймера обратного отчёта, которые можно использовать для запуска растровых событий, звука или чего-то ещё. Имеются однократный и зацикленный режимы.

Порты
REG_TMR_CTRL
REG_HTMR_FREQ
REG_VTMR_FREQ
REG_HTMR_CTR
REG_VTMR_CTR

Картридж

В большинстве случаев последниие 10 байт образа картриджа являются разделом метаданных.

ПЗУ WonderSwan содержат 10 - байтовый раздел метаданных в качестве последних 10 байтов образа ПЗУ. В большинстве случаев это верно, но некоторые тележки содержат неверную или вводящую в заблуждение информацию. Список этих игр приведен ниже

Смещение Размер Описание
-01h 001h Должен быть равным нулю!
000h 001h Идентификатор издателя
001h 001h Система (0=WonderSwan, 1=WonderSwan Color)
002h 001h Идентификатор игры
003h 001h Версия игры
004h 001h Размер ПЗУ:
  • 000h - 1Mbit? (128KB)
  • 001h - 2Mbit? (256KB)
  • 002h - 4Mbit (512KB)
  • 003h - 8Mbit (1MB)
  • 004h - 16Mbit (2MB)
  • 005h - 24Mbit (3MB)
  • 006h - 32Mbit (4MB)
  • 007h - 48Mbit (6MB)
  • 008h - 64Mbit (8MB)
  • 009h - 128Mbit (16MB)
005h 001h Размер сохранения:
  • 000h - отсутствует
  • 001h - 64Kbit SRAM (8KB)
  • 002h - 256Kbit SRAM (32KB)
  • 003h - 1Mbit SRAM (128KB)
  • 004h - 2Mbit SRAM (256KB)
  • 005h - 4Mbit SRAM (512KB)
  • 010h - 1Kbit EEPROM
  • 020h - 16Kbit EEPROM
  • 050h - 8Kbit EEPROM?
006h 001h Флаги:
  • b2 - Скорость доступа к ПЗУ (0=3 цикла, 1=1 цикл)
  • b1 - разрядность шины ПЗУ (0=16-bit, 1=8-bit)
  • b0 - ориентация (0=горизонтальная, 1=вертикальная)
007h 001h RTC используется или нет (0=нет, 1=дат)
008h 002h 16-битная сумма всех слов ПЗУ, кроме этого. WonderWitch равно нулю.

Картриджи используют систему банков памяти. Имеется три банка ПЗУ и 1 банк SRAM.

Порты
REG_BANK_ROM2
REG_BANK_SRAM
REG_BANK_ROM0
REG_BANK_ROM1

Часы реального времени (RTC)

Для команд чтения каждое считывание из регистра REG_RTC_DATA будет подавать следующий байт из сдвигового регистра, поэтому убедитесь, что вы прочитали все соответствующие данные для команды.

Для команд записи нужно запистаь первый байт в REG_RTC_DATA перед отправкой команды, так как этот байт будет смещён. Для команд с длинными данными после отправки команды остальные байты выбейте через порт REG_RTC_DATA

Для записи команд вы должны записать первый байт в REG_RTC_DATA перед отправкой команды, так как этот байт данных немедленно смещается. Для команд с более длинными данными, после отправки команды, выбейте остальные байты через порт REG_RTC_DATA.

Команды

Команда Код Ввод Вывод
Сброс 060h None None
Чтение статуса 062h None 1 byte
Запись статуса 063h 1 byte None
Чтение даты 064h None 4 bytes (?)
Запись даты 065h 4 bytes (?) None
Чтение времени 066h None 3 bytes (?)
Запись времени 067h 3 bytes (?) None
Чтение звонка R0 068h - -
Запись звонка R0 069h - -
Чтение звонка R1 06Ah - -
Запись звонка R1 06Bh - -

Регистр статуса/состояния 7 - POWER 6 - 24/12 5 - INTAE 4 - 0 3 - INTME 2 - 0 1 - INTFE 0 - 0

Регистр даты 0-7 - год 8-12 - месяц 16-21 - день 24-26 - день недели 32-37 - час 39 - перед/после полудня 40-46 - минуты 48-54 - секунды 55 - тест

Порты
REG_RTC_STATUS
REG_RTC_CMD
REG_RTC_DATA

ЭСППЗУ картриджа (EEPROM)

Порты
REG_EEP_DATA
REG_EEP_ADDR
REG_EEP_STATUS
REG_EEP_CMD

Выходы картриджа общего назначения

Порты
REG_GPO_EN
REG_GPO_DATA

WonderWitch

-