Вход

Просмотр полной версии : Эмуляторы для Linux



ZXMAK
03.09.2024, 02:12
Хотел поставить какой-то эмулятор на Raspberry Pi, но ничего путного не нашел.
Гугл советует fuse, но он работает странновато на какихто опкодах сильно подтормаживает, полноэкранного режима нет, да и в окне ресайз со странностями.
Как альтернативу гугл посоветовал FBZX, но в нём даже TRDOS нет и какие-то проблемы с реальной скоростью (завышена).

Неужели на Linux нет хороших эмуляторов спектрума?

CityAceE
03.09.2024, 08:19
Неужели на Linux нет хороших эмуляторов спектрума?
ZXBaremulator (https://zxmini.speccy.org/en/index.html) для Raspberry Pi. Но он не под Linux, а под голое железо.

ZXMAK
03.09.2024, 08:37
Но он не под Linux, а под голое железо.

Не, такое не годится. Как же в браузере параллельно лазить и музыку слушать? :)
ZEmu после допиливания очень шустро работает. То что надо для Raspberry Pi.

ZXMAK
03.09.2024, 22:54
Ау, тут еще бывает ктото?

Как время летит быстро, спектруму уже больше 40 лет... Когда был маленький, думал как-же давно были изобретены радиолампы. А сейчас уже и возраст спектрума к такому времени приближается, а казалось бы не так уж и давно он появился. Среди молодежи уже мало кто знает что были такие компьютеры...

Dexus
04.09.2024, 15:20
Под Линукс изначально Xpeccy делался. Но я даже не представляю на малине как он будет работать.

SAM style
04.09.2024, 17:53
Под Линукс изначально Xpeccy делался. Но я даже не представляю на малине как он будет работать.
Думается, что хреново он будет работать :v2_dizzy_tired2:

ZXMAK
04.09.2024, 22:01
Думается, что хреново он будет работать :v2_dizzy_tired2:

запустился, но пока не понял как выбрать 128К модель с TRDOS.
В настройках меню Romset фиксировано ZX48 и не выбирается, хотя модель выбрал Pentagon.

https://i.imgur.com/fw5vwEQ.png

SAM style
04.09.2024, 22:59
запустился, но пока не понял как выбрать 128К модель с TRDOS.
В настройках меню Romset фиксировано ZX48 и не выбирается, хотя модель выбрал Pentagon.
В первом сообщении темы - https://zx-pk.ru/threads/9479-xpeccy.html - есть ссылка на ром-пак, их надо скидать в ~/.config/samstyle/xpeccy/roms. Это файлы ПЗУ, из них (конкретно pentagon.rom и trdos.rom) можешь создать свой ромсет, или просто нажать лампочку в настройках справа от списка пзу.

ZXMAK
05.09.2024, 00:06
а можно ли без установки, прямо в папку build положить (рядом с исполняемым файлом)?

SAM style
05.09.2024, 11:59
а можно ли без установки, прямо в папку build положить (рядом с исполняемым файлом)?
Запускать можно откуда угодно, но конфиги всё равно будут в ~/.config/samstyle/xpeccy, в том числе и ПЗУ

Dexus
05.09.2024, 17:45
ZXMAK,
Можно взять пак с ромами+конфигами+профилями : https://volutar.myds.me/xpeccy/config.zip

Мне интересно будут ли вообще шейдеры работать на малинке, и как там со скоростью с ними...

ZXMAK
05.09.2024, 22:25
ZXMAK,
Мне интересно будут ли вообще шейдеры работать на малинке, и как там со скоростью с ними...

как проверить шейдеры в Xpeccy не знаю. А вообще работают, но медленее чем на игровых видеокартах.

sea.glsl примерно 3-5 fps:

const int NUM_STEPS = 8;
const float PI = 3.141592;
const float EPSILON = 1e-3;
#define EPSILON_NRM (0.1 / iResolution.x)

// sea
const int ITER_GEOMETRY = 3;
const int ITER_FRAGMENT = 5;
const float SEA_HEIGHT = 0.6;
const float SEA_CHOPPY = 4.0;
const float SEA_SPEED = 0.8;
const float SEA_FREQ = 0.16;
const vec3 SEA_BASE = vec3(0.1,0.19,0.22);
const vec3 SEA_WATER_COLOR = vec3(0.8,0.9,0.6);
#define SEA_TIME (1.0 + iGlobalTime * SEA_SPEED)
const mat2 octave_m = mat2(1.6,1.2,-1.2,1.6);

// math
mat3 fromEuler(vec3 ang) {
vec2 a1 = vec2(sin(ang.x),cos(ang.x));
vec2 a2 = vec2(sin(ang.y),cos(ang.y));
vec2 a3 = vec2(sin(ang.z),cos(ang.z));
mat3 m;
m[0] = vec3(a1.y*a3.y+a1.x*a2.x*a3.x,a1.y*a2.x*a3.x+a3.y* a1.x,-a2.y*a3.x);
m[1] = vec3(-a2.y*a1.x,a1.y*a2.y,a2.x);
m[2] = vec3(a3.y*a1.x*a2.x+a1.y*a3.x,a1.x*a3.x-a1.y*a3.y*a2.x,a2.y*a3.y);
return m;
}
float hash( vec2 p ) {
float h = dot(p,vec2(127.1,311.7));
return fract(sin(h)*43758.5453123);
}
float noise( in vec2 p ) {
vec2 i = floor( p );
vec2 f = fract( p );
vec2 u = f*f*(3.0-2.0*f);
return -1.0+2.0*mix( mix( hash( i + vec2(0.0,0.0) ),
hash( i + vec2(1.0,0.0) ), u.x),
mix( hash( i + vec2(0.0,1.0) ),
hash( i + vec2(1.0,1.0) ), u.x), u.y);
}

// lighting
float diffuse(vec3 n,vec3 l,float p) {
return pow(dot(n,l) * 0.4 + 0.6,p);
}
float specular(vec3 n,vec3 l,vec3 e,float s) {
float nrm = (s + 8.0) / (PI * 8.0);
return pow(max(dot(reflect(e,n),l),0.0),s) * nrm;
}

// sky
vec3 getSkyColor(vec3 e) {
e.y = max(e.y,0.0);
return vec3(pow(1.0-e.y,2.0), 1.0-e.y, 0.6+(1.0-e.y)*0.4);
}

// sea
float sea_octave(vec2 uv, float choppy) {
uv += noise(uv);
vec2 wv = 1.0-abs(sin(uv));
vec2 swv = abs(cos(uv));
wv = mix(wv,swv,wv);
return pow(1.0-pow(wv.x * wv.y,0.65),choppy);
}

float map(vec3 p) {
float freq = SEA_FREQ;
float amp = SEA_HEIGHT;
float choppy = SEA_CHOPPY;
vec2 uv = p.xz; uv.x *= 0.75;

float d, h = 0.0;
for(int i = 0; i < ITER_GEOMETRY; i++) {
d = sea_octave((uv+SEA_TIME)*freq,choppy);
d += sea_octave((uv-SEA_TIME)*freq,choppy);
h += d * amp;
uv *= octave_m; freq *= 1.9; amp *= 0.22;
choppy = mix(choppy,1.0,0.2);
}
return p.y - h;
}

float map_detailed(vec3 p) {
float freq = SEA_FREQ;
float amp = SEA_HEIGHT;
float choppy = SEA_CHOPPY;
vec2 uv = p.xz; uv.x *= 0.75;

float d, h = 0.0;
for(int i = 0; i < ITER_FRAGMENT; i++) {
d = sea_octave((uv+SEA_TIME)*freq,choppy);
d += sea_octave((uv-SEA_TIME)*freq,choppy);
h += d * amp;
uv *= octave_m; freq *= 1.9; amp *= 0.22;
choppy = mix(choppy,1.0,0.2);
}
return p.y - h;
}

vec3 getSeaColor(vec3 p, vec3 n, vec3 l, vec3 eye, vec3 dist) {
float fresnel = clamp(1.0 - dot(n,-eye), 0.0, 1.0);
fresnel = pow(fresnel,3.0) * 0.65;

vec3 reflected = getSkyColor(reflect(eye,n));
vec3 refracted = SEA_BASE + diffuse(n,l,80.0) * SEA_WATER_COLOR * 0.12;

vec3 color = mix(refracted,reflected,fresnel);

float atten = max(1.0 - dot(dist,dist) * 0.001, 0.0);
color += SEA_WATER_COLOR * (p.y - SEA_HEIGHT) * 0.18 * atten;

color += vec3(specular(n,l,eye,60.0));

return color;
}

// tracing
vec3 getNormal(vec3 p, float eps) {
vec3 n;
n.y = map_detailed(p);
n.x = map_detailed(vec3(p.x+eps,p.y,p.z)) - n.y;
n.z = map_detailed(vec3(p.x,p.y,p.z+eps)) - n.y;
n.y = eps;
return normalize(n);
}

float heightMapTracing(vec3 ori, vec3 dir, out vec3 p) {
float tm = 0.0;
float tx = 1000.0;
float hx = map(ori + dir * tx);
if(hx > 0.0) return tx;
float hm = map(ori + dir * tm);
float tmid = 0.0;
for(int i = 0; i < NUM_STEPS; i++) {
tmid = mix(tm,tx, hm/(hm-hx));
p = ori + dir * tmid;
float hmid = map(p);
if(hmid < 0.0) {
tx = tmid;
hx = hmid;
} else {
tm = tmid;
hm = hmid;
}
}
return tmid;
}

// main
void mainImage( out vec4 fragColor, in vec2 fragCoord ) {
vec2 uv = fragCoord.xy / iResolution.xy;
uv = uv * 2.0 - 1.0;
uv.x *= iResolution.x / iResolution.y;
float time = iGlobalTime * 0.3 + iMouse.x*0.01;

// ray
vec3 ang = vec3(sin(time*3.0)*0.1,sin(time)*0.2+0.3,time);
vec3 ori = vec3(0.0,3.5,time*5.0);
vec3 dir = normalize(vec3(uv.xy,-2.0)); dir.z += length(uv) * 0.15;
dir = normalize(dir) * fromEuler(ang);

// tracing
vec3 p;
heightMapTracing(ori,dir,p);
vec3 dist = p - ori;
vec3 n = getNormal(p, dot(dist,dist) * EPSILON_NRM);
vec3 light = normalize(vec3(0.0,1.0,0.8));

// color
vec3 color = mix(
getSkyColor(dir),
getSeaColor(p,n,light,dir,dist),
pow(smoothstep(0.0,-0.05,dir.y),0.3));

// post
fragColor = vec4(pow(color,vec3(0.75)), 1.0);
}


glXQueryVersion: 1.4
Version: 3.1 Mesa 23.2.1-1~bpo12+rpt3
Renderer: V3D 4.2
Vendor: Broadcom
GL: 3.1
GLSL: 1.40
AA: 0
Color: 32
Depth: 24
Stencil: 0
ShaderVersion: 1.40

https://i.imgur.com/OGC9GYe.png

Вообще графика в Raspios Bookworm с Wayland Wayfire замечательная. У меня включен Wayfire плагины cube и wobbly (виляющие окна, окна ведут себя как резиновые, болтаются и покачиваются, иммитируя резиновую физику, когда мышкой подхватываешь и тянешь), эффекты плавные и приятные глазу, при этом на производительности это не сказывается.

Брал RPI4 4G попробовать для сигнальной обработки, но вот уже год сижу на ней как не десктопе, т.к. нормальный комп или ноут сейчас приобрести нет возможности. Для разработки конечно слабовато, но geany вполне себе шустро работает. А инет читать и видео смотреть отлично. Единственное что с HD и UHD разрешениями могут быть проблемы с лагами если формат не H264.

У RPI5 процессор и GPU примерно в два раза быстрей, правда с другой стороны убрали аппаратное ускорение H264, но зато добавили аппаратное ускорение для шифрования. Думаю на RPI5 этот-же шейдер будет давать порядка 6-10 fps.

Dexus
06.09.2024, 01:54
ZXMAK, не, в Xpeccy (без S) пиксельные шейдеры в opengl режиме имеются, для имитации crt (какой-никакой). В паке с конфигами по моей ссылке. Но судя по скрину - собрана не GL версия, а с софтовым рендером и масштабированием.

ZXMAK
06.09.2024, 02:15
ZXMAK, не, в Xpeccy (без S) пиксельные шейдеры в opengl режиме имеются, для имитации crt (какой-никакой). В паке с конфигами по моей ссылке. Но судя по скрину - собрана не GL версия, а с софтовым рендером и масштабированием.

Хм, ccmake не видит опции для GL:


CMAKE_BUILD_TYPE
CMAKE_INSTALL_PREFIX /usr/local
Qt5Core_DIR /usr/lib/aarch64-linux-gnu/cmake/Qt5Core
Qt5Gui_DIR /usr/lib/aarch64-linux-gnu/cmake/Qt5Gui
Qt5Widgets_DIR /usr/lib/aarch64-linux-gnu/cmake/Qt5Widgets
Qt5_DIR /usr/lib/aarch64-linux-gnu/cmake/Qt5
SDL2MAIN_LIBRARY /usr/lib/aarch64-linux-gnu/libSDL2main.a
SDL2_INCLUDE_DIR /usr/include/SDL2
SDL2_LIBRARY /usr/lib/aarch64-linux-gnu/libSDL2main.a;/usr/lib/aarch64-linux-gnu/libSDL2.so


Добавил вручную cmake -DUSEOPENGL=1, собралось но падает при запуске:


$ gdb ./xpeccy
GNU gdb (Debian 13.1-3) 13.1
Copyright (C) 2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "aarch64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./xpeccy...
(No debugging symbols found in ./xpeccy)
(gdb) run
Starting program: /home/pi/ZX/Xpeccy/build/xpeccy
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1".
[New Thread 0x7ff271f040 (LWP 518305)]
[New Thread 0x7ff1c26040 (LWP 518306)]
Using SDL ver 2.26.5
Using ZLIB ver 1.2.13
Using Qt ver 5.15.8
[New Thread 0x7fed43a040 (LWP 518307)]
[New Thread 0x7fecc2a040 (LWP 518308)]
[New Thread 0x7fdf3cf040 (LWP 518311)]
[Thread 0x7fdf3cf040 (LWP 518311) exited]
[New Thread 0x7fdf3cf040 (LWP 518312)]
[New Thread 0x7fdebbf040 (LWP 518313)]
[Thread 0x7fdf3cf040 (LWP 518312) exited]
[New Thread 0x7fdf3cf040 (LWP 518314)]
[New Thread 0x7fde38a040 (LWP 518315)]
[Thread 0x7fdf3cf040 (LWP 518314) exited]
[Thread 0x7fdebbf040 (LWP 518313) exited]
[New Thread 0x7fdebbf040 (LWP 518316)]
[New Thread 0x7fdf3cf040 (LWP 518317)]
[Thread 0x7fdebbf040 (LWP 518316) exited]
[Thread 0x7fde38a040 (LWP 518315) exited]
[Thread 0x7fdf3cf040 (LWP 518317) exited]
[New Thread 0x7fdf3cf040 (LWP 518319)]
SDL audio device opening...success: 48000 960 (32784 / 32784)
constructor
Joystick not opened
[New Thread 0x7fde38a040 (LWP 518324)]
[New Thread 0x7fdebbf040 (LWP 518325)]
end:constructor
[New Thread 0x7fca7be040 (LWP 518326)]
[New Thread 0x7fbbbde040 (LWP 518329)]
initializeGL
vtx_shd
frg_shd
end: initializeGL
qt.qpa.wayland: Wayland does not support QWindow::requestActivate()
[New Thread 0x7fbb21f040 (LWP 518330)]

Thread 1 "xpeccy" received signal SIGSEGV, Segmentation fault.
0x0000007ff708c018 in QImage::QImage(QImage const&) () from /lib/aarch64-linux-gnu/libQt5Gui.so.5
(gdb)


видимо какая-то ошибка с неправильным вызовом QImage::QImage или до этого где-то память повредилась

Update: вот с callstack:


(gdb) bt
#0 0x0000007ff708c018 in QImage::QImage(QImage const&) () at /lib/aarch64-linux-gnu/libQt5Gui.so.5
#1 0x0000007fed9c3ed4 in QtWaylandClient::QWaylandShmBackingStore::toImage( ) const () at /lib/aarch64-linux-gnu/libQt5WaylandClient.so.5
#2 0x0000007ff7330d20 in QPlatformBackingStore::toTexture(QRegion const&, QSize*, QFlags<QPlatformBackingStore::TextureFlag>*) const ()
at /lib/aarch64-linux-gnu/libQt5Gui.so.5
#3 0x0000007ff7330724 in QPlatformBackingStore::composeAndFlush(QWindow*, QRegion const&, QPoint const&, QPlatformTextureList*, bool) ()
at /lib/aarch64-linux-gnu/libQt5Gui.so.5
#4 0x0000007ff7739b18 in () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5
#5 0x0000007ff773b2ec in () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5
#6 0x0000007ff773d720 in () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5
#7 0x0000007ff77706d0 in QWidget::event(QEvent*) () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5
#8 0x0000007ff772c0a0 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5
#9 0x0000007ff6c39d60 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /lib/aarch64-linux-gnu/libQt5Core.so.5
#10 0x0000007ff773e374 in () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5
#11 0x0000007ff7740960 in () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5
#12 0x0000007ff77594dc in QWidget::repaint(QRect const&) () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5
#13 0x0000007ff775954c in QWidget::repaint() () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5
#14 0x00000055556174f0 in MainWin::frame_timer() (this=0x7fffffd240) at /home/pi/ZX/Xpeccy/src/emulwin.cpp:621
#15 0x0000007ff6c76628 in () at /lib/aarch64-linux-gnu/libQt5Core.so.5
#16 0x0000007ff6c7ac40 in QTimer::timeout(QTimer::QPrivateSignal) () at /lib/aarch64-linux-gnu/libQt5Core.so.5
#17 0x0000007ff6c6a5e4 in QObject::event(QEvent*) () at /lib/aarch64-linux-gnu/libQt5Core.so.5
#18 0x0000007ff772c0a0 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5
#19 0x0000007ff6c39d60 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /lib/aarch64-linux-gnu/libQt5Core.so.5
#20 0x0000007ff6c98d80 in QTimerInfoList::activateTimers() () at /lib/aarch64-linux-gnu/libQt5Core.so.5
#21 0x0000007ff6c996ec in () at /lib/aarch64-linux-gnu/libQt5Core.so.5
--Type <RET> for more, q to quit, c to continue without paging--
#22 0x0000007ff521774c in g_main_context_dispatch () at /lib/aarch64-linux-gnu/libglib-2.0.so.0
#23 0x0000007ff52179e0 in () at /lib/aarch64-linux-gnu/libglib-2.0.so.0
#24 0x0000007ff5217a84 in g_main_context_iteration () at /lib/aarch64-linux-gnu/libglib-2.0.so.0
#25 0x0000007ff6c99ac8 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib/aarch64-linux-gnu/libQt5Core.so.5
#26 0x0000007ff6c38278 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib/aarch64-linux-gnu/libQt5Core.so.5
#27 0x0000007ff6c412fc in QCoreApplication::exec() () at /lib/aarch64-linux-gnu/libQt5Core.so.5
#28 0x000000555560f060 in main(int, char**) (ac=<optimized out>, av=0x7fffffefb8) at /home/pi/ZX/Xpeccy/src/main.cpp:307


Дело не в OpenGL, сам OpenGL прекрасно работает.

Dexus
06.09.2024, 12:32
ZXMAK, видимо что-то с qtGL не правильно делается. Там индикаторы (иконки/надписи) поверху GL контекста должны отрисовываются. И там изначально пришлось пожонглировать порядком создания/инициализации чтобы все отрисовывалось. Возможно с этим что-то не так. А может и с Legacy, который с добавленим qt6 добавили. Можно попробовать собрать версию годичной давности.

ZXMAK
06.09.2024, 18:30
не совсем понятно, а зачем для этого QT? ведь иконки проще напрямую в GL отрендерить