- 3dfx is back.
- Fixed instdrv.exe crashing.
- Added option to use SDL with X11.
- Fixed incorrect 32-bit or 64-bit display on Android x86.
- Added QEMU documentation.
This commit is contained in:
An Bui 2025-12-23 00:08:03 +07:00
parent c9a5e10c81
commit e81a0c43c5
21 changed files with 258 additions and 35 deletions

View file

@ -71,7 +71,8 @@ We publish a **new beta release after every commit** — so you can always test
### Bootstraps
QEMU 9.2.4 - 3dfx:
- [arm64 (for phone or tablet)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.4.9/base-vectras-vm-arm64-v8a.tar.gz)
- [arm64 (for phone or tablet)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.0/base-nosve-vectras-vm-arm64-v8a.tar.gz)
- [x86_64 (for PC)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.0/base-vectras-vm-x86_64.tar.gz)
QEMU 9.2.2 - 3dfx:
- [arm64 (for phone or tablet)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.2.9/base-vectras-vm-arm64-v8a.tar.gz)
@ -83,7 +84,7 @@ QEMU 8.2.0 - 3dfx:
### 3Dfx Wrappers
- [For QEMU 9.2.2 - 3dfx](https://github.com/AnBui2004/Vectras-VM-Emu-Android/blob/master/3dfx/3dfx-wrappers-3.4.7.iso)
- [For QEMU 9.2.4 - 3dfx](https://github.com/AnBui2004/Vectras-VM-Emu-Android/blob/master/3dfx/3dfx-wrappers-3.5.0.iso)
- [For QEMU 8.2.0 - 3dfx](https://github.com/AnBui2004/Vectras-VM-Emu-Android/blob/master/3dfx/3dfx-wrappers-2.9.5.iso)
# Donate

View file

@ -15,8 +15,8 @@ android {
applicationId "com.vectras.vm"
minSdk minApi
targetSdk targetApi
versionCode 53
versionName "3.4.9"
versionCode 54
versionName "3.5.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true

View file

@ -7,6 +7,7 @@
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
@ -23,7 +24,6 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
@ -49,6 +49,9 @@
android:requestLegacyExternalStorage="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".WebViewActivity"
android:exported="false" />
<activity
android:name=".settings.X11DisplaySettingsActivity"
android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout"

View file

@ -1108,6 +1108,18 @@ public class MainSettingsManager extends AppCompatActivity
return prefs.getBoolean("runQemuWithXterm", true);
}
public static void setUseSdl(Context context, Boolean _boolean) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor edit = prefs.edit();
edit.putBoolean("useSdl", _boolean);
edit.apply();
}
public static Boolean getUseSdl(Context context) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
return prefs.getBoolean("useSdl", false);
}
public static void setStandardSetupVersion(Context context, int value) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor edit = prefs.edit();

View file

@ -15,9 +15,9 @@ import java.util.Objects;
public class AppConfig {
// App Config
public static String vectrasVersion = "3.0.0";
public static int vectrasVersionCode = 21;
public static final int standardSetupVersion = 924;
public static String vectrasVersion = "3.5.0";
public static int vectrasVersionCode = 54;
public static final int standardSetupVersion = 9241;
public static String vectrasWebsite = "https://vectras.vercel.app/";
public static String vectrasWebsiteRaw = "https://raw.githubusercontent.com/AnBui2004/Vectras-VM-Emu-Android/refs/heads/master/web/";
public static String bootstrapfileslink = vectrasWebsiteRaw + "/data/setupfiles2.json";
@ -78,7 +78,8 @@ public class AppConfig {
public static String neededPkgs = "bash aria2 tar dwm xfce4-terminal xterm libslirp libslirp-dev pulseaudio-dev glib-dev pixman-dev zlib-dev spice-dev" +
" libusbredirparser usbredir-dev sdl2 sdl2-dev sdl2_image-dev libepoxy-dev virglrenderer-dev rdma-core fluxbox" +
" libusb libaio ncurses-libs curl libnfs gtk+3.0 gtk+3.0-dev fuse libpulse libseccomp jack pipewire liburing pulseaudio pulseaudio-alsa alsa-plugins-pulse" +
" mesa-dri-gallium mesa-vulkan-swrast vulkan-loader mesa-utils mesa-egl mesa-gbm mesa-vulkan-ati mesa-vulkan-broadcom mesa-vulkan-freedreno mesa-vulkan-panfrost qemu-audio-sdl capstone libcbor snappy lzo ndctl keyutils-libs vde2-libs libdw libbpf sndio-libs linux-pam fuse3-libs libssh";
" mesa-dri-gallium mesa-vulkan-swrast vulkan-loader mesa-utils mesa-egl mesa-gbm mesa-vulkan-ati mesa-vulkan-broadcom mesa-vulkan-freedreno mesa-vulkan-panfrost" +
" qemu-audio-sdl capstone libcbor snappy lzo ndctl keyutils-libs vde2-libs libdw libbpf sndio-libs linux-pam fuse3-libs libssh";
public static String neededPkgs32bit = "bash aria2 tar dwm xterm libslirp libslirp-dev pulseaudio-dev glib-dev pixman-dev zlib-dev spice-dev" +
" libusbredirparser usbredir-dev libiscsi-dev sdl2 sdl2-dev libepoxy-dev virglrenderer-dev rdma-core pulseaudio pulseaudio-alsa alsa-plugins-pulse" +

View file

@ -273,13 +273,9 @@ public class StartVM {
params.add(spiceStr);
} else if (MainSettingsManager.getVmUi(activity).equals("X11")) {
params.add("-display");
params.add("sdl");
params.add(MainSettingsManager.getUseSdl(activity) ? "sdl" : "gtk");
params.add("-monitor");
if (MainSettingsManager.getRunQemuWithXterm(activity)) {
params.add("stdio");
} else {
params.add("vc");
}
params.add(MainSettingsManager.getRunQemuWithXterm(activity) ? "stdio" : "vc");
}
//params.add("-full-screen");

View file

@ -37,6 +37,7 @@ import com.vectras.qemu.utils.QmpClient;
import com.vectras.vm.main.MainActivity;
import com.vectras.vm.main.core.MainStartVM;
import com.vectras.vm.settings.VNCSettingsActivity;
import com.vectras.vm.settings.X11DisplaySettingsActivity;
import com.vectras.vm.utils.DialogUtils;
import com.vectras.vm.utils.FileUtils;
import com.vectras.vm.utils.JSONUtils;
@ -648,6 +649,22 @@ public class VMManager {
_activity.stopService(new Intent(_activity, MainService.class));
isQemuStopedWithError = true;
return true;
} else if (_result.contains("mesapt: invalid sdl display")) {
DialogUtils.twoDialog(_activity,
_activity.getResources().getString(R.string.problem_has_been_detected),
_activity.getResources().getString(R.string.you_need_to_switch_to_sdl_to_use_3dfx),
_activity.getString(R.string.go_to_settings),
_activity.getString(R.string.close),
true,
R.drawable.desktop_24px,
true,
() -> {
Intent intent = new Intent();
intent.setClass(_activity, X11DisplaySettingsActivity.class);
_activity.startActivity(intent);
},
null, null);
return false;
} else if (_command.contains("qemu-system") && _result.contains("qemu-system") && !_result.contains("warning:")) {
//Error code: UNKNOW_ERROR
DialogUtils.oneDialog(_activity, _activity.getString(R.string.problem_has_been_detected), _activity.getString(R.string.vm_could_not_be_run_content) + "\n\n" + _result, R.drawable.error_96px);

View file

@ -0,0 +1,87 @@
package com.vectras.vm;
import android.net.Uri;
import android.os.Bundle;
import android.os.StrictMode;
import android.transition.TransitionManager;
import android.view.View;
import android.webkit.CookieManager;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.activity.OnBackPressedCallback;
import androidx.appcompat.app.AppCompatActivity;
import com.vectras.vm.databinding.ActivityWebViewBinding;
import com.vectras.vm.utils.UIUtils;
import java.util.Objects;
public class WebViewActivity extends AppCompatActivity {
ActivityWebViewBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
UIUtils.edgeToEdge(this);
binding = ActivityWebViewBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
UIUtils.setOnApplyWindowInsetsListener(binding.main);
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
binding.webview.getSettings().setJavaScriptEnabled(true);
CookieManager.getInstance().setAcceptCookie(true);
binding.webview.getSettings().setBuiltInZoomControls(true);
binding.webview.getSettings().setDisplayZoomControls(false);
binding.webview.getSettings().setAllowFileAccess(true);
binding.webview.getSettings().setDatabaseEnabled(true);
binding.webview.getSettings().setDomStorageEnabled(true);
if (getIntent().hasExtra("url") && getIntent().getStringExtra("url") != null)
binding.webview.loadUrl(Objects.requireNonNull(getIntent().getStringExtra("url")));
else
binding.webview.loadUrl(AppConfig.vectrasWebsite);
binding.webview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
Uri url = request.getUrl();
String scheme = url.getScheme();
if ("file".equals(scheme) || "http".equals(scheme) || "https".equals(scheme)) {
return false;
}
return true;
}
});
binding.webview.setOnScrollChangeListener((v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
if (scrollY > oldScrollY) {
if (binding.btnClose.getVisibility() == View.VISIBLE) {
TransitionManager.beginDelayedTransition(binding.main);
binding.btnClose.setVisibility(View.GONE);
}
} else if (scrollY < oldScrollY) {
if (binding.btnClose.getVisibility() == View.GONE) {
TransitionManager.beginDelayedTransition(binding.main);
binding.btnClose.setVisibility(View.VISIBLE);
}
}
});
binding.btnClose.setOnClickListener(v -> finish());
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
if (binding.webview.canGoBack()) {
binding.webview.goBack();
} else {
finish();
}
}
});
}
}

View file

@ -42,6 +42,7 @@ import com.vectras.vm.AppConfig;
import com.vectras.vm.VMCreatorActivity;
import com.vectras.vm.Minitools;
import com.vectras.vm.R;
import com.vectras.vm.WebViewActivity;
import com.vectras.vm.databinding.ActivityMainBinding;
import com.vectras.vm.databinding.ActivityMainContentBinding;
import com.vectras.vm.main.softwarestore.SoftwareStoreFragment;
@ -245,10 +246,7 @@ public class MainActivity extends AppCompatActivity implements RomStoreFragment.
public void handleOnBackPressed() {
if (binding.drawerLayout.isDrawerOpen(GravityCompat.START)) {
binding.drawerLayout.closeDrawer(GravityCompat.START);
//Prevent apps from exiting after the drawer is closed.
return;
}
if (binding.searchview.isShowing()) {
} else if (binding.searchview.isShowing()) {
binding.searchview.hide();
} else if (bindingContent.bottomNavigation.getSelectedItemId() != R.id.item_home) {
bindingContent.bottomNavigation.setSelectedItemId(R.id.item_home);
@ -411,6 +409,16 @@ public class MainActivity extends AppCompatActivity implements RomStoreFragment.
Intent intent = new Intent();
intent.setClass(this, Minitools.class);
startActivity(intent);
} else if (id == R.id.navigation_qemu_doc) {
Intent intent = new Intent();
if (FileUtils.isFileExists(getFilesDir().getPath() + "/distro/usr/local/share/qemu/doc/index.html")) {
intent.putExtra("url", "file://" + getFilesDir().getPath() + "/distro/usr/local/share/qemu/doc/index.html");
intent.setClass(this, WebViewActivity.class);
} else {
intent.setAction(ACTION_VIEW);
intent.setData(Uri.parse("https://www.qemu.org/docs/master/"));
}
startActivity(intent);
}
return false;
});

View file

@ -35,6 +35,7 @@ public class X11DisplaySettingsActivity extends AppCompatActivity {
private void initialize() {
binding.swEnabled.setChecked(MainSettingsManager.getVmUi(this).equals("X11"));
binding.swRunQemuWithXterm.setChecked(MainSettingsManager.getRunQemuWithXterm(this));
binding.swUseSdl.setChecked(MainSettingsManager.getUseSdl(this));
binding.swEnabled.setOnCheckedChangeListener((buttonView, isChecked) -> {
MainSettingsManager.setVmUi(this, isChecked ? "X11" : "VNC");
@ -58,6 +59,9 @@ public class X11DisplaySettingsActivity extends AppCompatActivity {
binding.swRunQemuWithXterm.setOnCheckedChangeListener((buttonView, isChecked) -> MainSettingsManager.setRunQemuWithXterm(this, isChecked));
binding.lnRunQemuWithXterm.setOnClickListener(v -> binding.swRunQemuWithXterm.toggle());
binding.swUseSdl.setOnCheckedChangeListener((buttonView, isChecked) -> MainSettingsManager.setUseSdl(this, isChecked));
binding.lnUseSdl.setOnClickListener(v -> binding.swUseSdl.toggle());
isInitialized = true;
uiController(binding.swEnabled.isChecked());
@ -67,5 +71,6 @@ public class X11DisplaySettingsActivity extends AppCompatActivity {
binding.lnAllOptions.setAlpha(isEnabled ? 1f : 0.5f);
binding.lnPreferences.setEnabled(isEnabled);
binding.lnRunQemuWithXterm.setEnabled(isEnabled);
binding.lnUseSdl.setEnabled(isEnabled);
}
}

View file

@ -458,7 +458,10 @@ public class SetupWizard2Activity extends AppCompatActivity {
" echo \"Starting setup...\";" +
" apk update;" +
" echo \"Installing packages...\";" +
" apk add " + (DeviceUtils.is64bit() ? AppConfig.neededPkgs : AppConfig.neededPkgs32bit) + ";" +
" apk add " + (DeviceUtils.is64bit() ? (
DeviceUtils.isArm() ? AppConfig.neededPkgs :
AppConfig.neededPkgs.replace("mesa-vulkan-ati mesa-vulkan-broadcom mesa-vulkan-freedreno", ""))
: AppConfig.neededPkgs32bit) + ";" +
" echo \"Downloading Qemu...\";";
if (isCustomSetupMode) {

View file

@ -61,7 +61,10 @@ public class DeviceUtils {
}
public static boolean is64bit() {
return Build.SUPPORTED_ABIS[0].contains("arm64");
return Build.SUPPORTED_ABIS[0].contains("64");
}
public static boolean isArm() {
return Build.SUPPORTED_ABIS[0].contains("arm");
}
public static boolean isLargeScreen(Context context) {

View file

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal"
android:autoMirrored="true">
<path
android:fillColor="@android:color/white"
android:pathData="M320,520L640,520L640,440L320,440L320,520ZM320,640L640,640L640,560L320,560L320,640ZM320,760L520,760L520,680L320,680L320,760ZM240,880Q207,880 183.5,856.5Q160,833 160,800L160,160Q160,127 183.5,103.5Q207,80 240,80L560,80L800,320L800,800Q800,833 776.5,856.5Q753,880 720,880L240,880ZM520,360L520,160L240,160Q240,160 240,160Q240,160 240,160L240,800Q240,800 240,800Q240,800 240,800L720,800Q720,800 720,800Q720,800 720,800L720,360L520,360ZM240,160L240,160L240,360L240,360L240,160L240,360L240,360L240,800Q240,800 240,800Q240,800 240,800L240,800Q240,800 240,800Q240,800 240,800L240,160Q240,160 240,160Q240,160 240,160Z"/>
</vector>

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".WebViewActivity">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<Button
android:id="@+id/btn_close"
style="@style/Widget.Material3Expressive.Button.IconButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:layout_margin="16dp"
app:icon="@drawable/close_24px"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -75,7 +75,8 @@
android:id="@+id/ln_run_qemu_with_xterm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/object_shape_bottom_high"
android:layout_marginBottom="2dp"
android:background="@drawable/object_shape_middle_high"
android:padding="16dp" >
<LinearLayout
@ -111,6 +112,47 @@
app:layout_constraintTop_toTopOf="parent"
android:clickable="false"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/ln_use_sdl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/object_shape_bottom_high"
android:padding="16dp" >
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/sw_use_sdl"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/use_sdl"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/use_sdl_note"
android:textColor="?android:attr/textColorSecondary"
android:textSize="14sp" />
</LinearLayout>
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/sw_use_sdl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:clickable="false"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View file

@ -35,6 +35,10 @@
android:id="@+id/navigation_item_help"
android:icon="@drawable/help_24px"
android:title="@string/help"/>
<item
android:id="@+id/navigation_qemu_doc"
android:icon="@drawable/docs_24px"
android:title="@string/qemu_documentation"/>
<item
android:id="@+id/navigation_item_info"
android:icon="@drawable/info_24px"

View file

@ -478,6 +478,10 @@
<string name="shared_by">Shared by</string>
<string name="system_update">System update</string>
<string name="system_update_note">You are using an older system, update now.</string>
<string name="use_sdl">Use SDL</string>
<string name="use_sdl_note">Turn it on if you want to use 3dfx and play old retro games.</string>
<string name="qemu_documentation">QEMU documentation</string>
<string name="you_need_to_switch_to_sdl_to_use_3dfx">You need to switch to SDL to use 3dfx.</string>
<!--======================TERMUX STRINGS====================-->

View file

@ -1,15 +1,15 @@
{
"versionCode":"44",
"versionName":"3.4.0",
"size": "55 MB",
"versionCode":"54",
"versionName":"3.5.0",
"size": "46 MB",
"url": "https://github.com/xoureldeen/Vectras-VM-Android/releases",
"Message": "<h2>3.4.0</h2>\n- Fixed the issue of exporting rom with virtual machine ID.\n- New dialog for copying files in creating new virtual machine.\n- New dialog showing information after successful rom import.\n- Fixed no sound playing with Termux.\n- Fixed invalid file path error when using Manual setup.\n- Fixed dialog showing content without line breaks.\n- Fixed rom export error.\n- Added Processes to System monitor.\n- Improved interface.\n- Thinner fonts.\n- Fixed an issue with interaction in Rom store.\n- Fixed the External VNC Server switch being incorrect in certain cases.\n- Removed unnecessary resources.\n- Updated Chinese (Simplified) language (contributed by @WeiguangTWK).\n- Fixed issue with installing system files after not completing the first time.\n- New setup wizard.\n- Added auto return to Home after importing rom and creating virtual machine in Rom store.\n- Improved image viewer.\n- Fixed Unknow display error in architecture in rom info if it is PowerPC architecture.\n- New setup wizard interface that automatically changes according to screen size.\n- New ID generator for virtual machine.\n- Added dialog when deleting virtual machine.",
"Message": "<h2>3.5.0</h2>\n3dfx is back!",
"cancellable": true,
"versionCodeBeta":"53",
"versionNameBeta":"3.4.9",
"versionNameBetas":"3.0.0,3.1.0,3.2.1,3.2.2,3.2.3,3.2.4,3.2.5,3.2.6,3.2.7,3.2.8,3.2.9,3.2.10,3.3.1,3.3.2,3.3.3,3.3.4,3.3.5,3.3.6,3.3.7,3.3.8,3.3.9,3.4.1,3.4.2,3.4.3,3.4.4,3.4.5,3.4.6,3.4.7,3.4.8,3.4.9",
"versionCodeBeta":"54",
"versionNameBeta":"3.5.0",
"versionNameBetas":"3.0.0,3.1.0,3.2.1,3.2.2,3.2.3,3.2.4,3.2.5,3.2.6,3.2.7,3.2.8,3.2.9,3.2.10,3.3.1,3.3.2,3.3.3,3.3.4,3.3.5,3.3.6,3.3.7,3.3.8,3.3.9,3.4.1,3.4.2,3.4.3,3.4.4,3.4.5,3.4.6,3.4.7,3.4.8,3.4.9,3.5.0",
"sizeBeta": "46 MB",
"urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases",
"MessageBeta": "<h2>3.4.9</h2>Bugs fixed.",
"MessageBeta": "<h2>3.5.0</h2>Bugs fixed.",
"cancellableBeta": true
}

View file

@ -1,4 +1,4 @@
{
"aarch64":"https://go.anbui.ovh/vectrasvm/files/qemu/9.2.4-3dfx/base-vectras-vm-arm64-v8a.tar.gz",
"amd64":"https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.2.9/base-vectras-vm-x86_64.tar.gz"
"aarch64":"https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.0/base-nosve-vectras-vm-arm64-v8a.tar.gz",
"amd64":"https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.0/base-vectras-vm-x86_64.tar.gz"
}

View file

@ -2,10 +2,10 @@
{
"rom_name": "3Dfx wrappers driver",
"rom_icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/3dfx_logo.svg/1200px-3dfx_logo.svg.png",
"rom_url": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/blob/master/3dfx/3dfx-wrappers-3.4.9.iso",
"rom_path": "3dfx-wrappers-3.4.9.iso",
"rom_url": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/blob/master/3dfx/3dfx-wrappers-3.5.0.iso",
"rom_path": "3dfx-wrappers-3.5.0.iso",
"rom_avail": true,
"rom_size": "3.4.9",
"rom_size": "3.5.0",
"rom_arch": "X86_64",
"rom_kernel": "",
"rom_extra": "",