Судьба эмулятора SPRINT - теперь он называется SprintEm
Moderator: Shaos
-
- Admin
- Posts: 24006
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Судьба эмулятора SPRINT - теперь он называется SprintEm
Задумался я тут над судьбой своего эмулятора Спринтера...
P.S. Добавил голосовалку 1 июня 2013 года
P.P.S. С лета 2018 года исходники эмуля живут на гитлабе, а с марта 2022 эмулятор стал называться SprintEm:
https://gitlab.com/nedopc/sprintem
P.S. Добавил голосовалку 1 июня 2013 года
P.P.S. С лета 2018 года исходники эмуля живут на гитлабе, а с марта 2022 эмулятор стал называться SprintEm:
https://gitlab.com/nedopc/sprintem
Last edited by Shaos on 01 Jun 2013 00:23, edited 5 times in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24006
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Пока предполагается следующее - превратить Zpring в безромный эмулятор Спринтера, Спектрума и Турбо-2+ (может еще и Ориона в придачу). "Безромный" - значит никаких ромов! Вся эмуляция только через самые популярные точки входа плюс поддержка соответствующих форматов экрана и стандартов переключения страниц памяти. 100% совместимости нет и не будет по понятным причинам - точки входа буду подрубать только по мере необходимости для того или иного софта, который надо будет заставить работать в эмуле (собственно я так и делал в SPRINT-e).
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24006
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Появилось кому что сказать на поставленную тему?Shaos wrote:Пока предполагается следующее - превратить Zpring в безромный эмулятор Спринтера, Спектрума и Турбо-2+ (может еще и Ориона в придачу). "Безромный" - значит никаких ромов! Вся эмуляция только через самые популярные точки входа плюс поддержка соответствующих форматов экрана и стандартов переключения страниц памяти. 100% совместимости нет и не будет по понятным причинам - точки входа буду подрубать только по мере необходимости для того или иного софта, который надо будет заставить работать в эмуле (собственно я так и делал в SPRINT-e).
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Retired
- Posts: 1474
- Joined: 03 Aug 2003 22:37
- Location: Moscow
-
- God
- Posts: 1101
- Joined: 29 Dec 2003 01:00
- Location: Москва
-
- Admin
- Posts: 24006
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
-
- Admin
- Posts: 24006
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Под MacOS X на PowerPC пока есть проблемы со сборкой и проблемы с "big endian" - сборка корректируется вот таким более универсальным Makefile:
Проблему "big endian" пока не поправил...
P.S. Кроме того мой код использует сканкоды кнопок клавиатуры, передавая их в эмулируемые программы как есть, а на аппловском железе сканкоды совсем другие - придётся переделывать код обработки клавиатуры, делая маппинг из высокоуровневых SDL-макросов в эмулируемые PC-сканкоды...
Code: Select all
CC = g++
CFLAGS = `sdl-config --cflags` -I. -Wall -O2 -DSDL
# -DBASICSE
LFLAGS = `sdl-config --libs` -lm -lpthread
OBJS = targa.o unigraf.o bios.o z80/z80.o z80/z80_ops.o
all: zpring
clean:
rm -f *.o
rm -f z80/*.o
z80/z80.o: z80/z80.cpp z80/z80.h
$(CC) $(CFLAGS) -c z80/z80.cpp -o z80/z80.o
z80/z80_ops.o: z80/z80_ops.cpp z80/z80.h z80/z_cb.hpp z80/z_ddfd.hpp z80/z_ddfdcb.hpp z80/z_ed.hpp z80/z_macros.h
$(CC) $(CFLAGS) -c z80/z80_ops.cpp -o z80/z80_ops.o
bios.o: bios.cpp bios.h zpring.h
$(CC) $(CFLAGS) -c bios.cpp
unigraf.o: unigraf.cpp unigraf.h
$(CC) $(CFLAGS) -c unigraf.cpp -DFONT8X8 -DUNIFOPEN
targa.o: targa.cpp targa.h
$(CC) $(CFLAGS) -c targa.cpp
zpring: zpring.cpp bios.h zpring.h z80/z80.h $(OBJS)
$(CC) zpring.cpp $(CFLAGS) -o zpring $(LFLAGS) $(OBJS)
P.S. Кроме того мой код использует сканкоды кнопок клавиатуры, передавая их в эмулируемые программы как есть, а на аппловском железе сканкоды совсем другие - придётся переделывать код обработки клавиатуры, делая маппинг из высокоуровневых SDL-макросов в эмулируемые PC-сканкоды...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24006
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
-
- Admin
- Posts: 24006
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re:
Вот наткнулся на версию моего эмулятора Спринтера, приспособленную под 64-битную Mac OS X:
https://github.com/suborb/sprint
Надо поглядеть чего они там наменяли...
https://github.com/suborb/sprint
Надо поглядеть чего они там наменяли...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24006
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Судьба эмулятора SPRINT -> Рождение Zpring
Поправил исходники, чтобы собирались и работали в 64-битном линухе (проверял на своём серваке AMD64).
Проверил, что всё что должно работать из примеров всё также работает, а также поправил урлы на стартовой страничке:
Проверил, что всё что должно работать из примеров всё также работает, а также поправил урлы на стартовой страничке:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24006
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Судьба эмулятора SPRINT -> Рождение Zpring
Проверил, что и в DOS оно всё также собирается и работает 
Широкий экран в оконном режиме из под Linux тоже работает нормально:

Широкий экран в оконном режиме из под Linux тоже работает нормально:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24006
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Судьба эмулятора SPRINT -> Рождение Zpring
Надо будет слегка перелопатить исходники т.к. на самом деле в SPRINT у меня всегда предполагалось, что рисуем и показываем мы одну и туже видеостраницу т.е. нельзя было показывать одну и рисовать в другую, а потом типа эту другую вывести на экран...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24006
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Судьба эмулятора SPRINT -> Рождение Zpring
Вобщем 2 экрана планирую добавить так (и даже больше чем это) - вывод графики (а также опрос кнопок клавы и мыши) у меня идёт через C++ класс UniGraf (который внутри имеет реализации для SDL, svgalib и DOS переключаемые условной компиляцией), который поддерживает абстрактные пикселы, которые могут быть больше реальных пикселов экрана и даже могут быть совсем неквадратные - поэтому у меня получается выводить спринтеровский экран 640x256 в графическое окно 800x600 и вообще окно (или экран) любого размера (причём размер может быть даже меньше эмулируемого). Копирование в окно (на экран) идёт через периодически вызываемый метод Update, в котором например в случае SDL просто стоит вызов SDL_UpdateRect(PRIV->screen,0,0,dx,dy); копирующий копию экрана из системной памяти в видеопамять. Так вот мне надо добавить новый закадровый экран как отдельный объект SDL_Surface размером БОЛЬШЕ видимой области и блиттить его часть по вызову метода Update - левую часть закадрового буфера (страница 0), либо правую часть закадрового буфера (страница 1). Можно даже дальше пойти и сымитировать полную видеопамять 512КБ (хоть она и не поддержана в реальной железяке), добавив ещё одну такую же пару экранов ниже первой пары (т.е. закадровый буфер получит размер в 1024 полупикселей (512 байт) на 512 строк (причём с увеличением пропорционально целевому окну). Более того - пользуясь тем фактом, что у нас уже будет буфер больше видимого экрана, можно относительно просто реализовать горизонтальный и вертикальный СКРОЛЛИНГ причём с заворачиванием в кольцо (точнее в тор)! Для эмуляции Спринтера скроллинг само собой ненужен, но для будущего компьютера Zpring он очень даже не помешаетShaos wrote:Надо будет слегка перелопатить исходники т.к. на самом деле в SPRINT у меня всегда предполагалось, что рисуем и показываем мы одну и туже видеостраницу т.е. нельзя было показывать одну и рисовать в другую, а потом типа эту другую вывести на экран...

Одно НО (точнее два) - это будет работать только в SDL, т.к. в реализации через svgalib для Linux и через ваткомовский graph.h для DOS никаких сурфейсов в UniGraf нету и весь вывод идёт прямо на экран путём вывода пикселей в нужные места согласно коэффициенту увеличения для каждого абстрактного пиксела. Скажем реализацию для svgalib я выкину - с некоторых пор этой графической библиотекой для консольного линуха на ПЦ стало не так то просто пользоваться (она лет 10 назад стала требовать подгрузки специального модуля ядра из под рута) и я даже не в курсе будет ли она работать с современными дистрами линукса (из дебияна её похоже выкинули ещё в 2013) - как говориться фиг с ней, а вот DOS мне хотелось бы сохранить - возможно в ваткомовском graph.h есть поддержка закадровых буферов и мне надо просто ей правильно воспользоваться - буду смотреть...
P.S. Почитал про ваткомовскую графику - там можно только сохранять экран в image и восстанавливать его потом обратно, т.е. придётся научиться рисовать в такую сохранённую картинку и при переключении экранов просто копировать правильную картинку в экран - выходит полноценного плавного скроллинга не получится т.к. картинка копируется только целиком, хоть и в произвольные координаты. Можно попробовать программно скроллировать, но это будет наверное несколько тормозно. Вот как WATCOM рассчитывает размер буфера под картинку:
Code: Select all
long _WCI86FAR _CGRAPH _imagesize( short x1, short y1, short x2, short y2 )
/*====================================================================
This routine returns the size of buffer needed to store the picture
in the rectangle defined by ( x1, y1 ) and ( x2, y2 ), in viewport
coordinates. */
{
if( _GraphMode() ) {
return( _L2imagesize( _VtoPhysX( x1 ), _VtoPhysY( y1 ),
_VtoPhysX( x2 ), _VtoPhysY( y2 ) ) );
} else {
return( 0 );
}
}
Entry( _IMAGESIZE, _imagesize ) // alternate entry-point
long _WCI86FAR _L2imagesize( short x1, short y1, short x2, short y2 )
/*==============================================================
This routine returns the size of buffer needed to store the picture
in the rectangle defined by ( x1, y1 ) and ( x2, y2 ), in physical
coordinates. */
{
#if defined( _DEFAULT_WINDOWS )
// For Windows and OS/2, the size is only the size of the record
x1 = x1;
x2 = x2;
y1 = y1;
y2 = y2;
return( sizeof( struct picture ) );
#else
short xwid;
short ywid;
long size; /* size of image */
xwid = abs( x2 - x1 ) + 1;
ywid = abs( y2 - y1 ) + 1;
size = (long)ywid * _RowLen( xwid );
return( size + 6L );
#endif
}
short _RowLen( short pixels )
/*===========================
This routine calculates the number of bytes needed to store one row
of pixels. */
{
short size;
if( _CurrState->misc_info & PLANAR ) {
size = ( ( pixels + 7 ) / 8 ) * _CurrState->vc.bitsperpixel;
} else {
size = ( ( pixels * _CurrState->vc.bitsperpixel + 7 ) / 8 );
}
return( size );
}
P.P.S. В этих 6 байтах запоминаются значения picwidth, picheight и bpp (это если я нагуглил правильные сырцы)...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24006
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Судьба эмулятора SPRINT -> Рождение Zpring
Прикрутил сохранение в PNG вместо TGA:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24006
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Судьба эмулятора SPRINT -> Рождение Zpring
По итогам стрима про портирование эмуля на макос оно таки заработало:
Версия собираемая в MacOS уже выложена на гитлаб (для успешной сборки нужен brew через который ставится sdl и в котором уже есть libpng)
Версия собираемая в MacOS уже выложена на гитлаб (для успешной сборки нужен brew через который ставится sdl и в котором уже есть libpng)
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net