Dizzy
09.10.2004, 19:19
Вот пришла в голову идея попытаться сделать эмулятор ZX-Spectrum для телефона Х100.
ZX Spectrum представляет одну из лучших реализаций 8-битных платформ. В базовой конфигурации он имеет 3,5 МГц процессор Z-80, 64 кб памяти, из которых 16 кб занимает ПЗУ и 6912 байт экран. Благодаря усилиям отечественных Кулибиных добавилась память, появился звук, работа с FDD, HDD, а также новые режимы экрана, кэш и прочее.
Основная прелесть проекта в том что с 1982 по 2004 год для платформы ZX Spectrum было разработано просто _огромное_ количество программного обеспечения и в том числе игр. Отдельного внимания заслуживает музыка но об этом позднее.
На сегодняшний день платформа практически умерла, но остались ещё люди в основном из СНГ которые ей верны до последнего ;)
Ознакомившись со спецификациями MIDP 1.0 и Samsung OEM API можно прийти к выводу что реализовать задуманное вполне возможно (хотя на первый взгляд невозможно).
На сегодняшний день существует целый ряд нерешённых, но постоянно обдумываемых мною задач.
Принцип работы транслятора будет основываться на золотом правиле оптимайзера: «Выигрываем в скорости – проигрываем в размере памяти». Ориентировочной скорости работы транслятора должно хватить на корректную эмуляцию логики, но практически не остаётся машинного времени для прорисовки экрана и обработки звука (звук я хочу обсудить позднее).
Итак экран.
Экран ZX – Spectrum занимает 6912 байт из которых: 6144 байта занимает чёрно-белое изображение (256x192) в режиме 8 точек на байт, причём он ещё адресуется по хитрому, а оставшиеся 768 байт (32x24) цвета в режиме 1 байт на квадрат 8x8 точек линейно.
Экран X100 128x128x65536 нас вполне устраивает по цветности, но совсем не устраивает по разрешающей способности. Не беда - придётся рисовать с использованием фильтров.
Это всё тонкости реализации, но проблема с экраном не в них, а в том чтобы как-то адресовать экранное пространство телефона или область изображения класса Image, что нам MIDP 1.0 не позволяет. Может есть какие-то дополнительные наборы классов которые это умеют? Может это можно как-то сделать и без них?
У меня есть варианты со стандартными классами только очень медленные (отсортировано предположительно по скорости):
1. Например для чёрно-белого рендеринга создаётся 256! Imag-ей а для цветного 256x128=32768! (Интересно Java такое выдержит?) Imag-ей размером 4x1 пикселей. Дальше для каждого байта изображения с ZX рисуем соответствующий Image и так 6144 раза.
2. Создаём свой шрифт 256 символов который в принципе делает то же что и 256 Imag-ей, задаём цвет тона, цвет фона, печатаем.
3. Рисуем экран с помощью линий Canvas-а но по точкам, предварительно установив нужный цвет.
4. Кодируем на лету экран ZX-Spectrum в PNG файл (считаем CRC и сжимаем ZIP - это по скорости нереально просто) далее создаём из него Image.
Давайте подробнее остановимся на способах прорисовки с помощью MIDP 1.0 как можно что-либо нарисовать кроме стандартных линий прямоугольников и дуг, загрузки Imag-ей из PNG и печати текста?
ZX Spectrum представляет одну из лучших реализаций 8-битных платформ. В базовой конфигурации он имеет 3,5 МГц процессор Z-80, 64 кб памяти, из которых 16 кб занимает ПЗУ и 6912 байт экран. Благодаря усилиям отечественных Кулибиных добавилась память, появился звук, работа с FDD, HDD, а также новые режимы экрана, кэш и прочее.
Основная прелесть проекта в том что с 1982 по 2004 год для платформы ZX Spectrum было разработано просто _огромное_ количество программного обеспечения и в том числе игр. Отдельного внимания заслуживает музыка но об этом позднее.
На сегодняшний день платформа практически умерла, но остались ещё люди в основном из СНГ которые ей верны до последнего ;)
Ознакомившись со спецификациями MIDP 1.0 и Samsung OEM API можно прийти к выводу что реализовать задуманное вполне возможно (хотя на первый взгляд невозможно).
На сегодняшний день существует целый ряд нерешённых, но постоянно обдумываемых мною задач.
Принцип работы транслятора будет основываться на золотом правиле оптимайзера: «Выигрываем в скорости – проигрываем в размере памяти». Ориентировочной скорости работы транслятора должно хватить на корректную эмуляцию логики, но практически не остаётся машинного времени для прорисовки экрана и обработки звука (звук я хочу обсудить позднее).
Итак экран.
Экран ZX – Spectrum занимает 6912 байт из которых: 6144 байта занимает чёрно-белое изображение (256x192) в режиме 8 точек на байт, причём он ещё адресуется по хитрому, а оставшиеся 768 байт (32x24) цвета в режиме 1 байт на квадрат 8x8 точек линейно.
Экран X100 128x128x65536 нас вполне устраивает по цветности, но совсем не устраивает по разрешающей способности. Не беда - придётся рисовать с использованием фильтров.
Это всё тонкости реализации, но проблема с экраном не в них, а в том чтобы как-то адресовать экранное пространство телефона или область изображения класса Image, что нам MIDP 1.0 не позволяет. Может есть какие-то дополнительные наборы классов которые это умеют? Может это можно как-то сделать и без них?
У меня есть варианты со стандартными классами только очень медленные (отсортировано предположительно по скорости):
1. Например для чёрно-белого рендеринга создаётся 256! Imag-ей а для цветного 256x128=32768! (Интересно Java такое выдержит?) Imag-ей размером 4x1 пикселей. Дальше для каждого байта изображения с ZX рисуем соответствующий Image и так 6144 раза.
2. Создаём свой шрифт 256 символов который в принципе делает то же что и 256 Imag-ей, задаём цвет тона, цвет фона, печатаем.
3. Рисуем экран с помощью линий Canvas-а но по точкам, предварительно установив нужный цвет.
4. Кодируем на лету экран ZX-Spectrum в PNG файл (считаем CRC и сжимаем ZIP - это по скорости нереально просто) далее создаём из него Image.
Давайте подробнее остановимся на способах прорисовки с помощью MIDP 1.0 как можно что-либо нарисовать кроме стандартных линий прямоугольников и дуг, загрузки Imag-ей из PNG и печати текста?