Материал из Chipwiki
Перейти к: навигация, поиск
WonderSwan/Программирование — различия между версиями
Строка 2: Строка 2:
 
{{Основная статья|WonderSwan Color|Текст=WonderSwan Color}}
 
{{Основная статья|WonderSwan Color|Текст=WonderSwan Color}}
 
==Описание==
 
==Описание==
Раздел является переводом [http://cygne.emuunlim.com/files/wstech21.txt документации] от Judge и Dox и [http://daifukkat.su/docs/wsman/ WSMan rev.7]. Возможны ошибки.
+
* http://cygne.emuunlim.com/files/wstech21.txt
 +
* http://daifukkat.su/docs/wsman/
  
<spoiler text="Процессор">
+
{{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.
 
</spoiler>
 
<spoiler text="Память">
 
20 бит адресного пространства = 1 Мбайт. Память разделена на сегменты по 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.
 
 
'''RAM map'''
 
WS/WSC:
 
* $0000 - $1FFF
 
* $2000 - $3FFF - 4-цветные тайлы
 
Только для WSC:
 
* $4000 - $7FFF - банк 0 16-цветных тайлов
 
* $8000 - $BFFF - банк 1 16-цветных тайлов
 
* $C000 - $FDFF
 
* $FE00 - $FFFF - палитры
 
</spoiler>
 
<spoiler text="Графика">
 
* Разрешение экрана: 224х144 пикселей (28х18 тайлов)
 
* Тайлы: 8х8. 16 байт на тайл в режиме с 4 цветами, 32 байта - с 16 цветами
 
* Карта: 256х256 пикселей (32х32 тайла)
 
* Слои: фон BG и передний план FG
 
* Расположение карт выбирается с помощью порта $07
 
* Расположение плиток фиксированное: два банка на адресах $4000 и $8000
 
 
В WonderSwan изображение из оттенков серого. Цвета собраны в пул из 8 оттенков, которые задаются 4 битами (00h - самый яркий, 0Fh - самый темный). 16 палитр включают в себя по 4 цвета из пула.
 
 
В WonderSwan Color регистры монохромного WonderSwan игнорируются, используется 16 палитр по 8 цветов. Все 16 палитр используются BG и FG. Последние 8 палитр используются спрайтами.
 
 
8 цветов палитры определяются портами 1C (определяет цвета 0-3) и 1E (определяет цвета 4-7).
 
 
Размер каждой палитры составляет 4 бита:
 
* 1С: 11110000
 
* 1D: 33332222
 
* 1E: 55554444
 
* 1F: 77776666
 
 
Порты 20-3E используются для определения самих палитр:
 
* 20: x111x000 - палитра 0
 
* 21: x333x222 - палитра 1
 
и т.д.
 
 
В цветном режиме каждый цвет определяется одним словом, где биты:
 
* 0-3 - синий
 
* 4-7 - зелёный
 
* 8-11 - красный
 
* 12-14 - не используются
 
Цветовые палитры хранятся в оперативной памяти (сегмент 0) по адресу $FE00
 
 
Скроллинг: каждый слой можно прокручивать по горизонтали или вертикали при помощи портов от $10 до $13.
 
 
Прозрачность:
 
* WonderSwan - палитры 0-3 и 8-11 непрозрачны. В палитрах 4-7 и 12-15 цвет 0 прозрачный.
 
* WonderSwan Color - цвет 0 каждой палитры прозрачен
 
 
Окна: есть две прямоугольный области для отключения/включения слоя FG (окно BG) или спрайтов (окно Sprite).
 
</spoiler>
 
<spoiler text="Спрайты">
 
{{textcolor|Пока ничего нет|gray}}
 
</spoiler>
 
<spoiler text="Звук">
 
Имеется 4 аудиоканала. Каждый канал может воспроизводить короткие семплы(4 бит, 16 байт (32 семпла = 2 семпла в байтах (биты 0-3 и 4-7)) с выбираемой частотой дискретизации = 3,072 *10e6 / ((2048 - N) x 32 ) Гц , где N = 11-битное значение.<br/>
 
Местонахождение этих семплов неизвестно.
 
 
Громкость каждого аудиоканала меняется записью двух 4-битных значений (лево и право) в порты $88-$8B. Общая громкость управляется через порт $91 (2-битное значение = первые используемые биты в общей громкости (ширина 11 бит), ЦАП может прочитать только 8 бит, начиная от набора бит в порте $91. Например, если первые используемые биты установлены в 2, ЦАП использует биты 2,3,4,5,6,7,8,9 для вывода звука.
 
 
Дополнительные (выбираемые) функции:
 
* канал 2 - voice - можно проигрывать 8-битные семплы, записывая данные в порт ввода/вывода громкости канала 2
 
* канал 3 - sweep - два параметра:
 
** шаг - 2.667 x (N + 1) мс , где N = 5-битное значение
 
** байт со значением -128 -127
 
* канал 4 - шум - 7 выбираемых шумов (вероятно, порт ввода/вывода $8E)
 
 
В WonderSwan Color имеется дополнительный PCM-канал, но только для наушников.
 
 
Для детальной информации нужно посмотреть информацию о портах $80-$91 в секции "Порты ввода/вывода"
 
</spoiler>
 
<spoiler text="ROM-файлы">
 
Заголовок занимает последние 10 байт в каждом ROM-файле
 
* 0 - идентификатор разработчика
 
* 1 - поддерживаемая система
 
** 00 - WonderSwan
 
** 01 - WonderSwan Color
 
* 2 - номер Cart ID, определённый в байте 0
 
* 3 - ??
 
* 4 - размер ROM
 
** 01 - ??
 
** 02 - 4 Мбит
 
** 03 - 8 Мбит
 
** 04 - 16 Мбит
 
** 05 - ??
 
** 06 - 32 Мбит
 
** 07 - ??
 
** 08 - 64 Мбит
 
** 09 - 128 Мбит
 
* 5 - размер SRAM/EEPROM
 
** 00 - 0 кбит
 
** 01 - 64 кбит SRAM
 
** 02 - 256 кбит SRAM
 
** 10 - 1 кбит EEPROM
 
** 20 - 16 кбит EEPROM
 
** 50 - 8 кбит EEPROM
 
* 6 - дополнительные функции (?)
 
** бит 0 - 1 - вертикальная позиция, 1 - горизонтальная позиция
 
** бит 2 - всегда 1
 
* 7 - 1 - RTC (часы)
 
* 8,9 контрольная сумма = сумма всех байтов ROM, кроме двух последних (где хранится контрольная сумма)
 
 
Выпущенные типы картриджей:
 
* BMC2001
 
** до 128 Мбит ROM
 
** до 128 Мбит SRAM
 
** до 16 Кбит EEPROM
 
* BMC2003
 
** до 512 Мбит ROM
 
** до 128 Мбит SRAM
 
** до 4 выходных линий общего назначения
 
** RTC
 
</spoiler>
 
<spoiler text="Прерывания">
 
{{textcolor|Пока ничего нет|gray}}
 
</spoiler>
 
<spoiler text="Управление">
 
Состояние кнопок легко проверить на порте ввода/вывода $B5 (см.ниже). Требуется некоторая задержка между записью и чтением на порте $B5 (несколько {{wiki|ru|NOP|NOP'ов}}).
 
</spoiler>
 
<spoiler text="Internal EEPROM Communication">
 
{{textcolor|Пока ничего нет|gray}}
 
</spoiler>
 
<spoiler text="Порты ввода/вывода">
 
{{textcolor|Пока ничего нет|gray}}
 
</spoiler>
 
 
==Ассемблеры==
 
==Ассемблеры==
 
* nasm
 
* nasm

Версия 20:45, 11 апреля 2019

Описание

gray

Ассемблеры

  • nasm

Инструменты

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

Эмуляторы

Хоумбрю