diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/404.html b/404.html new file mode 100644 index 000000000..d44360c4f --- /dev/null +++ b/404.html @@ -0,0 +1,4988 @@ + + + + + + + + + + + + + + + + + + + ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..fba5be08b --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +rocknix.org \ No newline at end of file diff --git a/_inc/css/custom.css b/_inc/css/custom.css new file mode 100644 index 000000000..4f3fd6fdb --- /dev/null +++ b/_inc/css/custom.css @@ -0,0 +1,151 @@ +/* Colors Light & Dark */ +[data-md-color-scheme="art-book"] { + /* Primary color shades */ + --md-primary-fg-color: #111111; + --md-primary-bg-color: #eeeeee; + --md-primary-bg-color--light: #bbbbbb; + /* Accent color shades */ + --md-accent-fg-color: #FF5555; + --md-accent-fg-color--transparent: #cccccc; + /* Default color shades */ + --md-default-fg-color: #111111; + --md-default-fg-color--light: #222222; + --md-default-fg-color--lighter: #cccccc; + --md-default-fg-color--lightest: #cccccc; + --md-default-bg-color: #dddddd; + --md-default-bg-color--light: #dddddd; + --md-default-bg-color--lighter: #dddddd; + --md-default-bg-color--lightest: #dddddd; + /* Typeset color shades */ + --md-typeset-color: #111111; + /* Typeset `a` color shades */ + --md-typeset-a-color: #FF5555; + /* Typeset `table` color shades */ + --md-typeset-table-color: #cccccc; + --md-typeset-table-color--light: #eeeeee; + /* Footer color shades */ + --md-footer-bg-color: #111111; + /* Typeset `kbd` color shades */ + --md-typeset-kbd-color: #eeeeee; + --md-typeset-kbd-accent-color: #dddddd; + --md-typeset-kbd-border-color: #bbbbbb; + /* Code color shades */ + --md-code-bg-color: #eee; + --md-code-fg-color: #111; + --md-code-hl-operator-color: #111; + --md-code-hl-variable-color: #111; + --md-code-hl-comment-color: #999; + --md-code-hl-punctuation-color: #111; +} +[data-md-color-scheme="art-book-next"] { + /* Primary color shades */ + --md-primary-fg-color: #111111; + --md-primary-bg-color: #eeeeee; + --md-primary-bg-color--light: #bbbbbb; + /* Accent color shades */ + --md-accent-fg-color: #FF5555; + --md-accent-fg-color--transparent: #333333; + /* Default color shades */ + --md-default-fg-color: #eeeeee; + --md-default-fg-color--light: #eeeeee; + --md-default-fg-color--lighter: #888888; + --md-default-fg-color--lightest: #444444; + --md-default-bg-color: #222222; + --md-default-bg-color--light: #222222; + --md-default-bg-color--lighter: #222222; + --md-default-bg-color--lightest: #222222; + /* Typeset color shades */ + --md-typeset-color: #eeeeee; + /* Typeset `a` color shades */ + --md-typeset-a-color: #FF5555; + /* Typeset `table` color shades */ + --md-typeset-table-color: #333333; + --md-typeset-table-color--light: #444444; + /* Footer color shades */ + --md-footer-bg-color: #111111; + /* Typeset `kbd` color shades */ + --md-typeset-kbd-color: #555; + --md-typeset-kbd-accent-color: #444; + --md-typeset-kbd-border-color: #222; + /* Code color shades */ + --md-code-bg-color: #111; + --md-code-fg-color: #fff; + --md-code-hl-operator-color: #fff; + --md-code-hl-variable-color: #fff; + --md-code-hl-comment-color: #999; + --md-code-hl-punctuation-color: #fff; +} + +.md-typeset .admonition, .md-typeset details { + background-color: inherit; + color: inherit +} + +[data-md-color-scheme="art-book"] img[src$="#only-dark"], +[data-md-color-scheme="art-book"] img[src$="#gh-dark-mode-only"] { + display: none; /* Hide dark images in light mode */ +} +[data-md-color-scheme="art-book-next"] img[src$="#only-light"], +[data-md-color-scheme="art-book-next"] img[src$="#gh-light-mode-only"] { + display: none; /* Hide dark images in light mode */ +} + +.md-typeset h1, .md-typeset h2, .md-typeset h3 { + font-weight: 700; +} +.md-typeset h1 { + margin: 0 0 0.64em; +} +.md-typeset h2 { + margin: 1em 0 0.64em; +} +.md-typeset h3 { + margin: 0.64em 0 0.8em; +} + +.md-header__inner { + padding: 0.4rem 0.2rem; +} + +.md-main__inner { + margin-top: 0.5rem; + padding-top: 0; +} + +.md-typeset table:not([class]) { + font-size: .74rem; +} + +.md-nav__item--section>.md-nav__link { + font-weight: 700; +} + +@media screen and (min-width: 76.25em) { + .md-nav__item--section { + margin: 1.5em 0; + } + .md-nav__item--section>.md-nav__link { + font-size: .8rem; + } +} + +.md-nav__container>.md-nav__link { + color: inherit; +} + +div.preview-container { + margin-block-start: 1em; + margin-block-end: 1em; + position: relative; + display: flex; + align-items: center; + justify-content: center +} +div.preview-container video { + position: absolute; + margin: 0; + width: 52%; +} +div.preview-container image { + position: absolute; +} diff --git a/_inc/images/add-games/gadget_file_transfer.png b/_inc/images/add-games/gadget_file_transfer.png new file mode 100644 index 000000000..61f060412 Binary files /dev/null and b/_inc/images/add-games/gadget_file_transfer.png differ diff --git a/_inc/images/add-games/gadget_network_samba.png b/_inc/images/add-games/gadget_network_samba.png new file mode 100644 index 000000000..c7b0b927d Binary files /dev/null and b/_inc/images/add-games/gadget_network_samba.png differ diff --git a/_inc/images/add-games/hostname.png b/_inc/images/add-games/hostname.png new file mode 100644 index 000000000..320b7ea16 Binary files /dev/null and b/_inc/images/add-games/hostname.png differ diff --git a/_inc/images/add-games/mac_samba_share.png b/_inc/images/add-games/mac_samba_share.png new file mode 100644 index 000000000..7acc99fb2 Binary files /dev/null and b/_inc/images/add-games/mac_samba_share.png differ diff --git a/_inc/images/add-games/mac_smb_by_hostname.png b/_inc/images/add-games/mac_smb_by_hostname.png new file mode 100644 index 000000000..f9201cc11 Binary files /dev/null and b/_inc/images/add-games/mac_smb_by_hostname.png differ diff --git a/_inc/images/add-games/recovery_grub_rp5.jpg b/_inc/images/add-games/recovery_grub_rp5.jpg new file mode 100644 index 000000000..b19f9052f Binary files /dev/null and b/_inc/images/add-games/recovery_grub_rp5.jpg differ diff --git a/_inc/images/add-games/recovery_on_rgb10x.jpg b/_inc/images/add-games/recovery_on_rgb10x.jpg new file mode 100644 index 000000000..33d220a9c Binary files /dev/null and b/_inc/images/add-games/recovery_on_rgb10x.jpg differ diff --git a/_inc/images/add-games/windows_network_games_roms.png b/_inc/images/add-games/windows_network_games_roms.png new file mode 100644 index 000000000..3d90fd882 Binary files /dev/null and b/_inc/images/add-games/windows_network_games_roms.png differ diff --git a/_inc/images/add-games/windows_network_private.png b/_inc/images/add-games/windows_network_private.png new file mode 100644 index 000000000..3aadc17c6 Binary files /dev/null and b/_inc/images/add-games/windows_network_private.png differ diff --git a/_inc/images/add-games/windows_network_shares.png b/_inc/images/add-games/windows_network_shares.png new file mode 100644 index 000000000..c0f302f37 Binary files /dev/null and b/_inc/images/add-games/windows_network_shares.png differ diff --git a/_inc/images/add-games/windows_new_connection.png b/_inc/images/add-games/windows_new_connection.png new file mode 100644 index 000000000..b7b601dbd Binary files /dev/null and b/_inc/images/add-games/windows_new_connection.png differ diff --git a/_inc/images/add-games/windows_smb_by_hostname.png b/_inc/images/add-games/windows_smb_by_hostname.png new file mode 100644 index 000000000..c3515e819 Binary files /dev/null and b/_inc/images/add-games/windows_smb_by_hostname.png differ diff --git a/_inc/images/collections-dynamic-1.png b/_inc/images/collections-dynamic-1.png new file mode 100644 index 000000000..d151a97b3 Binary files /dev/null and b/_inc/images/collections-dynamic-1.png differ diff --git a/_inc/images/collections-dynamic-2.png b/_inc/images/collections-dynamic-2.png new file mode 100644 index 000000000..435403045 Binary files /dev/null and b/_inc/images/collections-dynamic-2.png differ diff --git a/_inc/images/collections-dynamic-3.png b/_inc/images/collections-dynamic-3.png new file mode 100644 index 000000000..1e93eeab7 Binary files /dev/null and b/_inc/images/collections-dynamic-3.png differ diff --git a/_inc/images/collections-dynamic-4.png b/_inc/images/collections-dynamic-4.png new file mode 100644 index 000000000..1437c63ae Binary files /dev/null and b/_inc/images/collections-dynamic-4.png differ diff --git a/_inc/images/collections-from-theme-1.png b/_inc/images/collections-from-theme-1.png new file mode 100644 index 000000000..be4fe0bb3 Binary files /dev/null and b/_inc/images/collections-from-theme-1.png differ diff --git a/_inc/images/collections-from-theme-2.png b/_inc/images/collections-from-theme-2.png new file mode 100644 index 000000000..bd50aa1ad Binary files /dev/null and b/_inc/images/collections-from-theme-2.png differ diff --git a/_inc/images/collections-main-menu.png b/_inc/images/collections-main-menu.png new file mode 100644 index 000000000..a2bd25baa Binary files /dev/null and b/_inc/images/collections-main-menu.png differ diff --git a/_inc/images/controllers/dualsense.png b/_inc/images/controllers/dualsense.png new file mode 100644 index 000000000..e75a832f2 Binary files /dev/null and b/_inc/images/controllers/dualsense.png differ diff --git a/_inc/images/controllers/dualshock-4.png b/_inc/images/controllers/dualshock-4.png new file mode 100644 index 000000000..2b5399749 Binary files /dev/null and b/_inc/images/controllers/dualshock-4.png differ diff --git a/_inc/images/controllers/global/D-Pad.png b/_inc/images/controllers/global/D-Pad.png new file mode 100644 index 000000000..c934cd143 Binary files /dev/null and b/_inc/images/controllers/global/D-Pad.png differ diff --git a/_inc/images/controllers/global/East.png b/_inc/images/controllers/global/East.png new file mode 100644 index 000000000..3334bbd04 Binary files /dev/null and b/_inc/images/controllers/global/East.png differ diff --git a/_inc/images/controllers/global/L1.png b/_inc/images/controllers/global/L1.png new file mode 100644 index 000000000..1b4818cab Binary files /dev/null and b/_inc/images/controllers/global/L1.png differ diff --git a/_inc/images/controllers/global/L2.png b/_inc/images/controllers/global/L2.png new file mode 100644 index 000000000..cbddf2d60 Binary files /dev/null and b/_inc/images/controllers/global/L2.png differ diff --git a/_inc/images/controllers/global/L3.png b/_inc/images/controllers/global/L3.png new file mode 100644 index 000000000..5d67c3b65 Binary files /dev/null and b/_inc/images/controllers/global/L3.png differ diff --git a/_inc/images/controllers/global/LeftStick.png b/_inc/images/controllers/global/LeftStick.png new file mode 100644 index 000000000..ed1b9388f Binary files /dev/null and b/_inc/images/controllers/global/LeftStick.png differ diff --git a/_inc/images/controllers/global/North.png b/_inc/images/controllers/global/North.png new file mode 100644 index 000000000..b2e8b79a3 Binary files /dev/null and b/_inc/images/controllers/global/North.png differ diff --git a/_inc/images/controllers/global/R1.png b/_inc/images/controllers/global/R1.png new file mode 100644 index 000000000..12a815f66 Binary files /dev/null and b/_inc/images/controllers/global/R1.png differ diff --git a/_inc/images/controllers/global/R2.png b/_inc/images/controllers/global/R2.png new file mode 100644 index 000000000..e42bfcd18 Binary files /dev/null and b/_inc/images/controllers/global/R2.png differ diff --git a/_inc/images/controllers/global/R3.png b/_inc/images/controllers/global/R3.png new file mode 100644 index 000000000..9cbbfedb2 Binary files /dev/null and b/_inc/images/controllers/global/R3.png differ diff --git a/_inc/images/controllers/global/RightStick.png b/_inc/images/controllers/global/RightStick.png new file mode 100644 index 000000000..507fd782c Binary files /dev/null and b/_inc/images/controllers/global/RightStick.png differ diff --git a/_inc/images/controllers/global/Select.png b/_inc/images/controllers/global/Select.png new file mode 100644 index 000000000..8645900fe Binary files /dev/null and b/_inc/images/controllers/global/Select.png differ diff --git a/_inc/images/controllers/global/South.png b/_inc/images/controllers/global/South.png new file mode 100644 index 000000000..a0f5ad6da Binary files /dev/null and b/_inc/images/controllers/global/South.png differ diff --git a/_inc/images/controllers/global/Start.png b/_inc/images/controllers/global/Start.png new file mode 100644 index 000000000..88375fc43 Binary files /dev/null and b/_inc/images/controllers/global/Start.png differ diff --git a/_inc/images/controllers/global/West.png b/_inc/images/controllers/global/West.png new file mode 100644 index 000000000..f3ed57284 Binary files /dev/null and b/_inc/images/controllers/global/West.png differ diff --git a/_inc/images/controllers/snes.png b/_inc/images/controllers/snes.png new file mode 100644 index 000000000..3cda80e03 Binary files /dev/null and b/_inc/images/controllers/snes.png differ diff --git a/_inc/images/controllers/switch-pro.png b/_inc/images/controllers/switch-pro.png new file mode 100644 index 000000000..a778ae852 Binary files /dev/null and b/_inc/images/controllers/switch-pro.png differ diff --git a/_inc/images/controllers/xbox-one.png b/_inc/images/controllers/xbox-one.png new file mode 100644 index 000000000..9a2fc4dbf Binary files /dev/null and b/_inc/images/controllers/xbox-one.png differ diff --git a/_inc/images/devices/anbernic-rg28xx.png b/_inc/images/devices/anbernic-rg28xx.png new file mode 100644 index 000000000..b6e0b3fd8 Binary files /dev/null and b/_inc/images/devices/anbernic-rg28xx.png differ diff --git a/_inc/images/devices/anbernic-rg34xx.png b/_inc/images/devices/anbernic-rg34xx.png new file mode 100644 index 000000000..0c87c741c Binary files /dev/null and b/_inc/images/devices/anbernic-rg34xx.png differ diff --git a/_inc/images/devices/anbernic-rg351pm.png b/_inc/images/devices/anbernic-rg351pm.png new file mode 100644 index 000000000..81b85fbb9 Binary files /dev/null and b/_inc/images/devices/anbernic-rg351pm.png differ diff --git a/_inc/images/devices/anbernic-rg351v.png b/_inc/images/devices/anbernic-rg351v.png new file mode 100644 index 000000000..d4f072199 Binary files /dev/null and b/_inc/images/devices/anbernic-rg351v.png differ diff --git a/_inc/images/devices/anbernic-rg353.png b/_inc/images/devices/anbernic-rg353.png new file mode 100644 index 000000000..7cb572c35 Binary files /dev/null and b/_inc/images/devices/anbernic-rg353.png differ diff --git a/_inc/images/devices/anbernic-rg35xx2024.png b/_inc/images/devices/anbernic-rg35xx2024.png new file mode 100644 index 000000000..4dc2cd19d Binary files /dev/null and b/_inc/images/devices/anbernic-rg35xx2024.png differ diff --git a/_inc/images/devices/anbernic-rg35xxh.png b/_inc/images/devices/anbernic-rg35xxh.png new file mode 100644 index 000000000..01b2098dc Binary files /dev/null and b/_inc/images/devices/anbernic-rg35xxh.png differ diff --git a/_inc/images/devices/anbernic-rg35xxplus.png b/_inc/images/devices/anbernic-rg35xxplus.png new file mode 100644 index 000000000..cdcc561cd Binary files /dev/null and b/_inc/images/devices/anbernic-rg35xxplus.png differ diff --git a/_inc/images/devices/anbernic-rg35xxsp.png b/_inc/images/devices/anbernic-rg35xxsp.png new file mode 100644 index 000000000..07de34e6e Binary files /dev/null and b/_inc/images/devices/anbernic-rg35xxsp.png differ diff --git a/_inc/images/devices/anbernic-rg40xxh.png b/_inc/images/devices/anbernic-rg40xxh.png new file mode 100644 index 000000000..1ce2419fc Binary files /dev/null and b/_inc/images/devices/anbernic-rg40xxh.png differ diff --git a/_inc/images/devices/anbernic-rg40xxv.png b/_inc/images/devices/anbernic-rg40xxv.png new file mode 100644 index 000000000..c16240c2b Binary files /dev/null and b/_inc/images/devices/anbernic-rg40xxv.png differ diff --git a/_inc/images/devices/anbernic-rg503.png b/_inc/images/devices/anbernic-rg503.png new file mode 100644 index 000000000..9c841069a Binary files /dev/null and b/_inc/images/devices/anbernic-rg503.png differ diff --git a/_inc/images/devices/anbernic-rg552.png b/_inc/images/devices/anbernic-rg552.png new file mode 100644 index 000000000..238768aa0 Binary files /dev/null and b/_inc/images/devices/anbernic-rg552.png differ diff --git a/_inc/images/devices/anbernic-rgarc.png b/_inc/images/devices/anbernic-rgarc.png new file mode 100644 index 000000000..b3bc035dc Binary files /dev/null and b/_inc/images/devices/anbernic-rgarc.png differ diff --git a/_inc/images/devices/anbernic-rgcubexx.png b/_inc/images/devices/anbernic-rgcubexx.png new file mode 100644 index 000000000..ebd0f4e91 Binary files /dev/null and b/_inc/images/devices/anbernic-rgcubexx.png differ diff --git a/_inc/images/devices/ayaneo-air-plus_btns.png b/_inc/images/devices/ayaneo-air-plus_btns.png new file mode 100644 index 000000000..0e7ff3e0d Binary files /dev/null and b/_inc/images/devices/ayaneo-air-plus_btns.png differ diff --git a/_inc/images/devices/gameforce-ace.png b/_inc/images/devices/gameforce-ace.png new file mode 100644 index 000000000..d18f606dc Binary files /dev/null and b/_inc/images/devices/gameforce-ace.png differ diff --git a/_inc/images/devices/hardkernel-odroid-go-advance.png b/_inc/images/devices/hardkernel-odroid-go-advance.png new file mode 100644 index 000000000..ee1f09c85 Binary files /dev/null and b/_inc/images/devices/hardkernel-odroid-go-advance.png differ diff --git a/_inc/images/devices/hardkernel-odroid-go-super.png b/_inc/images/devices/hardkernel-odroid-go-super.png new file mode 100644 index 000000000..630898fa5 Binary files /dev/null and b/_inc/images/devices/hardkernel-odroid-go-super.png differ diff --git a/_inc/images/devices/hardkernel-odroid-go-ultra.png b/_inc/images/devices/hardkernel-odroid-go-ultra.png new file mode 100644 index 000000000..c384223c3 Binary files /dev/null and b/_inc/images/devices/hardkernel-odroid-go-ultra.png differ diff --git a/_inc/images/devices/hardkernel-odroid-n2.png b/_inc/images/devices/hardkernel-odroid-n2.png new file mode 100644 index 000000000..ea798b99d Binary files /dev/null and b/_inc/images/devices/hardkernel-odroid-n2.png differ diff --git a/_inc/images/devices/indiedroid-nova.png b/_inc/images/devices/indiedroid-nova.png new file mode 100644 index 000000000..fc7002cc7 Binary files /dev/null and b/_inc/images/devices/indiedroid-nova.png differ diff --git a/_inc/images/devices/magicx-xu-mini-m.png b/_inc/images/devices/magicx-xu-mini-m.png new file mode 100644 index 000000000..b6c48dc15 Binary files /dev/null and b/_inc/images/devices/magicx-xu-mini-m.png differ diff --git a/_inc/images/devices/miyoo-mini-flip.png b/_inc/images/devices/miyoo-mini-flip.png new file mode 100644 index 000000000..db5c8c375 Binary files /dev/null and b/_inc/images/devices/miyoo-mini-flip.png differ diff --git a/_inc/images/devices/mods/powkiddy-rgb10max3pro-mod1.png b/_inc/images/devices/mods/powkiddy-rgb10max3pro-mod1.png new file mode 100644 index 000000000..115a48ca1 Binary files /dev/null and b/_inc/images/devices/mods/powkiddy-rgb10max3pro-mod1.png differ diff --git a/_inc/images/devices/orange-pi-5.png b/_inc/images/devices/orange-pi-5.png new file mode 100644 index 000000000..84cbbdc79 Binary files /dev/null and b/_inc/images/devices/orange-pi-5.png differ diff --git a/_inc/images/devices/powkiddy-rgb10.png b/_inc/images/devices/powkiddy-rgb10.png new file mode 100644 index 000000000..5b0fc2367 Binary files /dev/null and b/_inc/images/devices/powkiddy-rgb10.png differ diff --git a/_inc/images/devices/powkiddy-rgb10max3.png b/_inc/images/devices/powkiddy-rgb10max3.png new file mode 100644 index 000000000..7469badfa Binary files /dev/null and b/_inc/images/devices/powkiddy-rgb10max3.png differ diff --git a/_inc/images/devices/powkiddy-rgb10max3pro.png b/_inc/images/devices/powkiddy-rgb10max3pro.png new file mode 100644 index 000000000..e69394dcc Binary files /dev/null and b/_inc/images/devices/powkiddy-rgb10max3pro.png differ diff --git a/_inc/images/devices/powkiddy-rgb10x.png b/_inc/images/devices/powkiddy-rgb10x.png new file mode 100644 index 000000000..740301386 Binary files /dev/null and b/_inc/images/devices/powkiddy-rgb10x.png differ diff --git a/_inc/images/devices/powkiddy-rgb20sx.png b/_inc/images/devices/powkiddy-rgb20sx.png new file mode 100644 index 000000000..25ecd2251 Binary files /dev/null and b/_inc/images/devices/powkiddy-rgb20sx.png differ diff --git a/_inc/images/devices/powkiddy-rgb30.png b/_inc/images/devices/powkiddy-rgb30.png new file mode 100644 index 000000000..dadb3c284 Binary files /dev/null and b/_inc/images/devices/powkiddy-rgb30.png differ diff --git a/_inc/images/devices/powkiddy-rk2023.png b/_inc/images/devices/powkiddy-rk2023.png new file mode 100644 index 000000000..58b4ac355 Binary files /dev/null and b/_inc/images/devices/powkiddy-rk2023.png differ diff --git a/_inc/images/devices/powkiddy-v10.png b/_inc/images/devices/powkiddy-v10.png new file mode 100644 index 000000000..aff026f23 Binary files /dev/null and b/_inc/images/devices/powkiddy-v10.png differ diff --git a/_inc/images/devices/powkiddy-x35s.png b/_inc/images/devices/powkiddy-x35s.png new file mode 100644 index 000000000..6e438fc6d Binary files /dev/null and b/_inc/images/devices/powkiddy-x35s.png differ diff --git a/_inc/images/devices/powkiddy-x55.png b/_inc/images/devices/powkiddy-x55.png new file mode 100644 index 000000000..c3a6aec4a Binary files /dev/null and b/_inc/images/devices/powkiddy-x55.png differ diff --git a/_inc/images/devices/powkiddy-xu10.png b/_inc/images/devices/powkiddy-xu10.png new file mode 100644 index 000000000..dee3753dc Binary files /dev/null and b/_inc/images/devices/powkiddy-xu10.png differ diff --git a/_inc/images/devices/retroid-pocket-5.png b/_inc/images/devices/retroid-pocket-5.png new file mode 100644 index 000000000..021ab62ac Binary files /dev/null and b/_inc/images/devices/retroid-pocket-5.png differ diff --git a/_inc/images/devices/retroid-pocket-mini.png b/_inc/images/devices/retroid-pocket-mini.png new file mode 100644 index 000000000..ab6a0a54c Binary files /dev/null and b/_inc/images/devices/retroid-pocket-mini.png differ diff --git a/_inc/images/devices/unbranded-game-console-r33s.png b/_inc/images/devices/unbranded-game-console-r33s.png new file mode 100644 index 000000000..184051d3a Binary files /dev/null and b/_inc/images/devices/unbranded-game-console-r33s.png differ diff --git a/_inc/images/devices/unbranded-game-console-r36s.png b/_inc/images/devices/unbranded-game-console-r36s.png new file mode 100644 index 000000000..c617b9550 Binary files /dev/null and b/_inc/images/devices/unbranded-game-console-r36s.png differ diff --git a/_inc/images/logo.svg b/_inc/images/logo.svg new file mode 100644 index 000000000..9d5fbac09 --- /dev/null +++ b/_inc/images/logo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/_inc/images/scraping-after.png b/_inc/images/scraping-after.png new file mode 100644 index 000000000..169cef9cb Binary files /dev/null and b/_inc/images/scraping-after.png differ diff --git a/_inc/images/scraping-before.png b/_inc/images/scraping-before.png new file mode 100644 index 000000000..8f0930a84 Binary files /dev/null and b/_inc/images/scraping-before.png differ diff --git a/_inc/images/screenshots/gamelist-view-metadata-immersive.png b/_inc/images/screenshots/gamelist-view-metadata-immersive.png new file mode 100644 index 000000000..ae6442dc6 Binary files /dev/null and b/_inc/images/screenshots/gamelist-view-metadata-immersive.png differ diff --git a/_inc/images/screenshots/gamelist-view-no-metadata-immersive.png b/_inc/images/screenshots/gamelist-view-no-metadata-immersive.png new file mode 100644 index 000000000..e07ea52a6 Binary files /dev/null and b/_inc/images/screenshots/gamelist-view-no-metadata-immersive.png differ diff --git a/_inc/images/screenshots/menu.png b/_inc/images/screenshots/menu.png new file mode 100644 index 000000000..1f79f6f33 Binary files /dev/null and b/_inc/images/screenshots/menu.png differ diff --git a/_inc/images/screenshots/system-view.png b/_inc/images/screenshots/system-view.png new file mode 100644 index 000000000..6bba9f855 Binary files /dev/null and b/_inc/images/screenshots/system-view.png differ diff --git a/_inc/images/update/throw_tar_to_samba.png b/_inc/images/update/throw_tar_to_samba.png new file mode 100644 index 000000000..733c8449d Binary files /dev/null and b/_inc/images/update/throw_tar_to_samba.png differ diff --git a/_inc/images/video-frame.png b/_inc/images/video-frame.png new file mode 100644 index 000000000..325453982 Binary files /dev/null and b/_inc/images/video-frame.png differ diff --git a/_inc/video/preview.mp4 b/_inc/video/preview.mp4 new file mode 100644 index 000000000..95646357d Binary files /dev/null and b/_inc/video/preview.mp4 differ diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 000000000..1cf13b9f9 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/bundle.c8d2eff1.min.js b/assets/javascripts/bundle.c8d2eff1.min.js new file mode 100644 index 000000000..4b1b31f52 --- /dev/null +++ b/assets/javascripts/bundle.c8d2eff1.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var _i=Object.create;var br=Object.defineProperty;var Ai=Object.getOwnPropertyDescriptor;var Ci=Object.getOwnPropertyNames,Ft=Object.getOwnPropertySymbols,ki=Object.getPrototypeOf,vr=Object.prototype.hasOwnProperty,eo=Object.prototype.propertyIsEnumerable;var Zr=(e,t,r)=>t in e?br(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,F=(e,t)=>{for(var r in t||(t={}))vr.call(t,r)&&Zr(e,r,t[r]);if(Ft)for(var r of Ft(t))eo.call(t,r)&&Zr(e,r,t[r]);return e};var to=(e,t)=>{var r={};for(var o in e)vr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Ft)for(var o of Ft(e))t.indexOf(o)<0&&eo.call(e,o)&&(r[o]=e[o]);return r};var gr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Hi=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ci(t))!vr.call(e,n)&&n!==r&&br(e,n,{get:()=>t[n],enumerable:!(o=Ai(t,n))||o.enumerable});return e};var jt=(e,t,r)=>(r=e!=null?_i(ki(e)):{},Hi(t||!e||!e.__esModule?br(r,"default",{value:e,enumerable:!0}):r,e));var ro=(e,t,r)=>new Promise((o,n)=>{var i=c=>{try{a(r.next(c))}catch(p){n(p)}},s=c=>{try{a(r.throw(c))}catch(p){n(p)}},a=c=>c.done?o(c.value):Promise.resolve(c.value).then(i,s);a((r=r.apply(e,t)).next())});var no=gr((xr,oo)=>{(function(e,t){typeof xr=="object"&&typeof oo!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(xr,function(){"use strict";function e(r){var o=!0,n=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(C){return!!(C&&C!==document&&C.nodeName!=="HTML"&&C.nodeName!=="BODY"&&"classList"in C&&"contains"in C.classList)}function c(C){var ct=C.type,Ne=C.tagName;return!!(Ne==="INPUT"&&s[ct]&&!C.readOnly||Ne==="TEXTAREA"&&!C.readOnly||C.isContentEditable)}function p(C){C.classList.contains("focus-visible")||(C.classList.add("focus-visible"),C.setAttribute("data-focus-visible-added",""))}function l(C){C.hasAttribute("data-focus-visible-added")&&(C.classList.remove("focus-visible"),C.removeAttribute("data-focus-visible-added"))}function f(C){C.metaKey||C.altKey||C.ctrlKey||(a(r.activeElement)&&p(r.activeElement),o=!0)}function u(C){o=!1}function h(C){a(C.target)&&(o||c(C.target))&&p(C.target)}function w(C){a(C.target)&&(C.target.classList.contains("focus-visible")||C.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(C.target))}function A(C){document.visibilityState==="hidden"&&(n&&(o=!0),Z())}function Z(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function te(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(C){C.target.nodeName&&C.target.nodeName.toLowerCase()==="html"||(o=!1,te())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",A,!0),Z(),r.addEventListener("focus",h,!0),r.addEventListener("blur",w,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var zr=gr((kt,Vr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof kt=="object"&&typeof Vr=="object"?Vr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof kt=="object"?kt.ClipboardJS=r():t.ClipboardJS=r()})(kt,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Li}});var s=i(279),a=i.n(s),c=i(370),p=i.n(c),l=i(817),f=i.n(l);function u(D){try{return document.execCommand(D)}catch(M){return!1}}var h=function(M){var O=f()(M);return u("cut"),O},w=h;function A(D){var M=document.documentElement.getAttribute("dir")==="rtl",O=document.createElement("textarea");O.style.fontSize="12pt",O.style.border="0",O.style.padding="0",O.style.margin="0",O.style.position="absolute",O.style[M?"right":"left"]="-9999px";var I=window.pageYOffset||document.documentElement.scrollTop;return O.style.top="".concat(I,"px"),O.setAttribute("readonly",""),O.value=D,O}var Z=function(M,O){var I=A(M);O.container.appendChild(I);var W=f()(I);return u("copy"),I.remove(),W},te=function(M){var O=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},I="";return typeof M=="string"?I=Z(M,O):M instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(M==null?void 0:M.type)?I=Z(M.value,O):(I=f()(M),u("copy")),I},J=te;function C(D){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?C=function(O){return typeof O}:C=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},C(D)}var ct=function(){var M=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},O=M.action,I=O===void 0?"copy":O,W=M.container,K=M.target,Ce=M.text;if(I!=="copy"&&I!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(K!==void 0)if(K&&C(K)==="object"&&K.nodeType===1){if(I==="copy"&&K.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(I==="cut"&&(K.hasAttribute("readonly")||K.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Ce)return J(Ce,{container:W});if(K)return I==="cut"?w(K):J(K,{container:W})},Ne=ct;function Pe(D){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Pe=function(O){return typeof O}:Pe=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},Pe(D)}function xi(D,M){if(!(D instanceof M))throw new TypeError("Cannot call a class as a function")}function Xr(D,M){for(var O=0;O0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof W.action=="function"?W.action:this.defaultAction,this.target=typeof W.target=="function"?W.target:this.defaultTarget,this.text=typeof W.text=="function"?W.text:this.defaultText,this.container=Pe(W.container)==="object"?W.container:document.body}},{key:"listenClick",value:function(W){var K=this;this.listener=p()(W,"click",function(Ce){return K.onClick(Ce)})}},{key:"onClick",value:function(W){var K=W.delegateTarget||W.currentTarget,Ce=this.action(K)||"copy",It=Ne({action:Ce,container:this.container,target:this.target(K),text:this.text(K)});this.emit(It?"success":"error",{action:Ce,text:It,trigger:K,clearSelection:function(){K&&K.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(W){return hr("action",W)}},{key:"defaultTarget",value:function(W){var K=hr("target",W);if(K)return document.querySelector(K)}},{key:"defaultText",value:function(W){return hr("text",W)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(W){var K=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(W,K)}},{key:"cut",value:function(W){return w(W)}},{key:"isSupported",value:function(){var W=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],K=typeof W=="string"?[W]:W,Ce=!!document.queryCommandSupported;return K.forEach(function(It){Ce=Ce&&!!document.queryCommandSupported(It)}),Ce}}]),O}(a()),Li=Mi},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,c){for(;a&&a.nodeType!==n;){if(typeof a.matches=="function"&&a.matches(c))return a;a=a.parentNode}}o.exports=s},438:function(o,n,i){var s=i(828);function a(l,f,u,h,w){var A=p.apply(this,arguments);return l.addEventListener(u,A,w),{destroy:function(){l.removeEventListener(u,A,w)}}}function c(l,f,u,h,w){return typeof l.addEventListener=="function"?a.apply(null,arguments):typeof u=="function"?a.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(A){return a(A,f,u,h,w)}))}function p(l,f,u,h){return function(w){w.delegateTarget=s(w.target,f),w.delegateTarget&&h.call(l,w)}}o.exports=c},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(o,n,i){var s=i(879),a=i(438);function c(u,h,w){if(!u&&!h&&!w)throw new Error("Missing required arguments");if(!s.string(h))throw new TypeError("Second argument must be a String");if(!s.fn(w))throw new TypeError("Third argument must be a Function");if(s.node(u))return p(u,h,w);if(s.nodeList(u))return l(u,h,w);if(s.string(u))return f(u,h,w);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function p(u,h,w){return u.addEventListener(h,w),{destroy:function(){u.removeEventListener(h,w)}}}function l(u,h,w){return Array.prototype.forEach.call(u,function(A){A.addEventListener(h,w)}),{destroy:function(){Array.prototype.forEach.call(u,function(A){A.removeEventListener(h,w)})}}}function f(u,h,w){return a(document.body,u,h,w)}o.exports=c},817:function(o){function n(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),p=document.createRange();p.selectNodeContents(i),c.removeAllRanges(),c.addRange(p),s=c.toString()}return s}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,s,a){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var c=this;function p(){c.off(i,p),s.apply(a,arguments)}return p._=s,this.on(i,p,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),c=0,p=a.length;for(c;c{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var Va=/["'&<>]/;qn.exports=za;function za(e){var t=""+e,r=Va.exec(t);if(!r)return t;var o,n="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(p[0]===6||p[0]===2)){r=0;continue}if(p[0]===3&&(!i||p[1]>i[0]&&p[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function V(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],s;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(a){s={error:a}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(s)throw s.error}}return i}function z(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||a(u,h)})})}function a(u,h){try{c(o[u](h))}catch(w){f(i[0][3],w)}}function c(u){u.value instanceof ot?Promise.resolve(u.value.v).then(p,l):f(i[0][2],u)}function p(u){a("next",u)}function l(u){a("throw",u)}function f(u,h){u(h),i.shift(),i.length&&a(i[0][0],i[0][1])}}function so(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof ue=="function"?ue(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(s){return new Promise(function(a,c){s=e[i](s),n(a,c,s.done,s.value)})}}function n(i,s,a,c){Promise.resolve(c).then(function(p){i({value:p,done:a})},s)}}function k(e){return typeof e=="function"}function pt(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var Wt=pt(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Ve(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=ue(s),c=a.next();!c.done;c=a.next()){var p=c.value;p.remove(this)}}catch(A){t={error:A}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(A){i=A instanceof Wt?A.errors:[A]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=ue(f),h=u.next();!h.done;h=u.next()){var w=h.value;try{co(w)}catch(A){i=i!=null?i:[],A instanceof Wt?i=z(z([],V(i)),V(A.errors)):i.push(A)}}}catch(A){o={error:A}}finally{try{h&&!h.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new Wt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)co(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ve(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ve(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Er=Ie.EMPTY;function Dt(e){return e instanceof Ie||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function co(e){k(e)?e():e.unsubscribe()}var ke={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var lt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,s=n.isStopped,a=n.observers;return i||s?Er:(this.currentObservers=null,a.push(r),new Ie(function(){o.currentObservers=null,Ve(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,s=o.isStopped;n?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new j;return r.source=this,r},t.create=function(r,o){return new vo(r,o)},t}(j);var vo=function(e){se(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Er},t}(v);var St={now:function(){return(St.delegate||Date).now()},delegate:void 0};var Ot=function(e){se(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=St);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,s=o._infiniteTimeWindow,a=o._timestampProvider,c=o._windowTime;n||(i.push(r),!s&&i.push(a.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,s=n._buffer,a=s.slice(),c=0;c0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var s=r.actions;o!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==o&&(ut.cancelAnimationFrame(o),r._scheduled=void 0)},t}(zt);var yo=function(e){se(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(qt);var de=new yo(xo);var L=new j(function(e){return e.complete()});function Kt(e){return e&&k(e.schedule)}function _r(e){return e[e.length-1]}function Je(e){return k(_r(e))?e.pop():void 0}function Ae(e){return Kt(_r(e))?e.pop():void 0}function Qt(e,t){return typeof _r(e)=="number"?e.pop():t}var dt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Yt(e){return k(e==null?void 0:e.then)}function Bt(e){return k(e[ft])}function Gt(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function Jt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Di(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Xt=Di();function Zt(e){return k(e==null?void 0:e[Xt])}function er(e){return ao(this,arguments,function(){var r,o,n,i;return Ut(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,ot(r.read())];case 3:return o=s.sent(),n=o.value,i=o.done,i?[4,ot(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,ot(n)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function tr(e){return k(e==null?void 0:e.getReader)}function N(e){if(e instanceof j)return e;if(e!=null){if(Bt(e))return Ni(e);if(dt(e))return Vi(e);if(Yt(e))return zi(e);if(Gt(e))return Eo(e);if(Zt(e))return qi(e);if(tr(e))return Ki(e)}throw Jt(e)}function Ni(e){return new j(function(t){var r=e[ft]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Vi(e){return new j(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?g(function(n,i){return e(n,i,o)}):ce,ye(1),r?Qe(t):jo(function(){return new or}))}}function $r(e){return e<=0?function(){return L}:x(function(t,r){var o=[];t.subscribe(S(r,function(n){o.push(n),e=2,!0))}function le(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new v}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,c=a===void 0?!0:a;return function(p){var l,f,u,h=0,w=!1,A=!1,Z=function(){f==null||f.unsubscribe(),f=void 0},te=function(){Z(),l=u=void 0,w=A=!1},J=function(){var C=l;te(),C==null||C.unsubscribe()};return x(function(C,ct){h++,!A&&!w&&Z();var Ne=u=u!=null?u:r();ct.add(function(){h--,h===0&&!A&&!w&&(f=Pr(J,c))}),Ne.subscribe(ct),!l&&h>0&&(l=new it({next:function(Pe){return Ne.next(Pe)},error:function(Pe){A=!0,Z(),f=Pr(te,n,Pe),Ne.error(Pe)},complete:function(){w=!0,Z(),f=Pr(te,s),Ne.complete()}}),N(C).subscribe(l))})(p)}}function Pr(e,t){for(var r=[],o=2;oe.next(document)),e}function R(e,t=document){return Array.from(t.querySelectorAll(e))}function P(e,t=document){let r=me(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function me(e,t=document){return t.querySelector(e)||void 0}function Re(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var la=T(d(document.body,"focusin"),d(document.body,"focusout")).pipe(be(1),q(void 0),m(()=>Re()||document.body),B(1));function vt(e){return la.pipe(m(t=>e.contains(t)),Y())}function Vo(e,t){return T(d(e,"mouseenter").pipe(m(()=>!0)),d(e,"mouseleave").pipe(m(()=>!1))).pipe(t?be(t):ce,q(!1))}function Ue(e){return{x:e.offsetLeft,y:e.offsetTop}}function zo(e){return T(d(window,"load"),d(window,"resize")).pipe(Me(0,de),m(()=>Ue(e)),q(Ue(e)))}function ir(e){return{x:e.scrollLeft,y:e.scrollTop}}function et(e){return T(d(e,"scroll"),d(window,"resize")).pipe(Me(0,de),m(()=>ir(e)),q(ir(e)))}function qo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)qo(e,r)}function E(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)qo(o,n);return o}function ar(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function gt(e){let t=E("script",{src:e});return H(()=>(document.head.appendChild(t),T(d(t,"load"),d(t,"error").pipe(b(()=>Ar(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),_(()=>document.head.removeChild(t)),ye(1))))}var Ko=new v,ma=H(()=>typeof ResizeObserver=="undefined"?gt("https://unpkg.com/resize-observer-polyfill"):$(void 0)).pipe(m(()=>new ResizeObserver(e=>{for(let t of e)Ko.next(t)})),b(e=>T(qe,$(e)).pipe(_(()=>e.disconnect()))),B(1));function pe(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Ee(e){return ma.pipe(y(t=>t.observe(e)),b(t=>Ko.pipe(g(({target:r})=>r===e),_(()=>t.unobserve(e)),m(()=>pe(e)))),q(pe(e)))}function xt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function sr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var Qo=new v,fa=H(()=>$(new IntersectionObserver(e=>{for(let t of e)Qo.next(t)},{threshold:0}))).pipe(b(e=>T(qe,$(e)).pipe(_(()=>e.disconnect()))),B(1));function yt(e){return fa.pipe(y(t=>t.observe(e)),b(t=>Qo.pipe(g(({target:r})=>r===e),_(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function Yo(e,t=16){return et(e).pipe(m(({y:r})=>{let o=pe(e),n=xt(e);return r>=n.height-o.height-t}),Y())}var cr={drawer:P("[data-md-toggle=drawer]"),search:P("[data-md-toggle=search]")};function Bo(e){return cr[e].checked}function Be(e,t){cr[e].checked!==t&&cr[e].click()}function We(e){let t=cr[e];return d(t,"change").pipe(m(()=>t.checked),q(t.checked))}function ua(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function da(){return T(d(window,"compositionstart").pipe(m(()=>!0)),d(window,"compositionend").pipe(m(()=>!1))).pipe(q(!1))}function Go(){let e=d(window,"keydown").pipe(g(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:Bo("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),g(({mode:t,type:r})=>{if(t==="global"){let o=Re();if(typeof o!="undefined")return!ua(o,r)}return!0}),le());return da().pipe(b(t=>t?L:e))}function ve(){return new URL(location.href)}function st(e,t=!1){if(G("navigation.instant")&&!t){let r=E("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function Jo(){return new v}function Xo(){return location.hash.slice(1)}function Zo(e){let t=E("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function ha(e){return T(d(window,"hashchange"),e).pipe(m(Xo),q(Xo()),g(t=>t.length>0),B(1))}function en(e){return ha(e).pipe(m(t=>me(`[id="${t}"]`)),g(t=>typeof t!="undefined"))}function At(e){let t=matchMedia(e);return nr(r=>t.addListener(()=>r(t.matches))).pipe(q(t.matches))}function tn(){let e=matchMedia("print");return T(d(window,"beforeprint").pipe(m(()=>!0)),d(window,"afterprint").pipe(m(()=>!1))).pipe(q(e.matches))}function Ur(e,t){return e.pipe(b(r=>r?t():L))}function Wr(e,t){return new j(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let s=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+s*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function De(e,t){return Wr(e,t).pipe(b(r=>r.text()),m(r=>JSON.parse(r)),B(1))}function rn(e,t){let r=new DOMParser;return Wr(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),B(1))}function on(e,t){let r=new DOMParser;return Wr(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),B(1))}function nn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function an(){return T(d(window,"scroll",{passive:!0}),d(window,"resize",{passive:!0})).pipe(m(nn),q(nn()))}function sn(){return{width:innerWidth,height:innerHeight}}function cn(){return d(window,"resize",{passive:!0}).pipe(m(sn),q(sn()))}function pn(){return Q([an(),cn()]).pipe(m(([e,t])=>({offset:e,size:t})),B(1))}function pr(e,{viewport$:t,header$:r}){let o=t.pipe(X("size")),n=Q([o,r]).pipe(m(()=>Ue(e)));return Q([r,t,n]).pipe(m(([{height:i},{offset:s,size:a},{x:c,y:p}])=>({offset:{x:s.x-c,y:s.y-p+i},size:a})))}function ba(e){return d(e,"message",t=>t.data)}function va(e){let t=new v;return t.subscribe(r=>e.postMessage(r)),t}function ln(e,t=new Worker(e)){let r=ba(t),o=va(t),n=new v;n.subscribe(o);let i=o.pipe(ee(),oe(!0));return n.pipe(ee(),$e(r.pipe(U(i))),le())}var ga=P("#__config"),Et=JSON.parse(ga.textContent);Et.base=`${new URL(Et.base,ve())}`;function we(){return Et}function G(e){return Et.features.includes(e)}function ge(e,t){return typeof t!="undefined"?Et.translations[e].replace("#",t.toString()):Et.translations[e]}function Te(e,t=document){return P(`[data-md-component=${e}]`,t)}function ne(e,t=document){return R(`[data-md-component=${e}]`,t)}function xa(e){let t=P(".md-typeset > :first-child",e);return d(t,"click",{once:!0}).pipe(m(()=>P(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function mn(e){if(!G("announce.dismiss")||!e.childElementCount)return L;if(!e.hidden){let t=P(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return H(()=>{let t=new v;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),xa(e).pipe(y(r=>t.next(r)),_(()=>t.complete()),m(r=>F({ref:e},r)))})}function ya(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function fn(e,t){let r=new v;return r.subscribe(({hidden:o})=>{e.hidden=o}),ya(e,t).pipe(y(o=>r.next(o)),_(()=>r.complete()),m(o=>F({ref:e},o)))}function Ct(e,t){return t==="inline"?E("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},E("div",{class:"md-tooltip__inner md-typeset"})):E("div",{class:"md-tooltip",id:e,role:"tooltip"},E("div",{class:"md-tooltip__inner md-typeset"}))}function un(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return E("aside",{class:"md-annotation",tabIndex:0},Ct(t),E("a",{href:r,class:"md-annotation__index",tabIndex:-1},E("span",{"data-md-annotation-id":e})))}else return E("aside",{class:"md-annotation",tabIndex:0},Ct(t),E("span",{class:"md-annotation__index",tabIndex:-1},E("span",{"data-md-annotation-id":e})))}function dn(e){return E("button",{class:"md-clipboard md-icon",title:ge("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function Dr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,p)=>[...c,E("del",null,p)," "],[]).slice(0,-1),i=we(),s=new URL(e.location,i.base);G("search.highlight")&&s.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[p])=>`${c} ${p}`.trim(),""));let{tags:a}=we();return E("a",{href:`${s}`,class:"md-search-result__link",tabIndex:-1},E("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&E("div",{class:"md-search-result__icon md-icon"}),r>0&&E("h1",null,e.title),r<=0&&E("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(c=>{let p=a?c in a?`md-tag-icon md-tag--${a[c]}`:"md-tag-icon":"";return E("span",{class:`md-tag ${p}`},c)}),o>0&&n.length>0&&E("p",{class:"md-search-result__terms"},ge("search.result.term.missing"),": ",...n)))}function hn(e){let t=e[0].score,r=[...e],o=we(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),s=r.findIndex(l=>l.scoreDr(l,1)),...c.length?[E("details",{class:"md-search-result__more"},E("summary",{tabIndex:-1},E("div",null,c.length>0&&c.length===1?ge("search.result.more.one"):ge("search.result.more.other",c.length))),...c.map(l=>Dr(l,1)))]:[]];return E("li",{class:"md-search-result__item"},p)}function bn(e){return E("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>E("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?ar(r):r)))}function Nr(e){let t=`tabbed-control tabbed-control--${e}`;return E("div",{class:t,hidden:!0},E("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function vn(e){return E("div",{class:"md-typeset__scrollwrap"},E("div",{class:"md-typeset__table"},e))}function Ea(e){let t=we(),r=new URL(`../${e.version}/`,t.base);return E("li",{class:"md-version__item"},E("a",{href:`${r}`,class:"md-version__link"},e.title))}function gn(e,t){return E("div",{class:"md-version"},E("button",{class:"md-version__current","aria-label":ge("select.version")},t.title),E("ul",{class:"md-version__list"},e.map(Ea)))}var wa=0;function Ta(e,t){document.body.append(e);let{width:r}=pe(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=sr(t),n=typeof o!="undefined"?et(o):$({x:0,y:0}),i=T(vt(t),Vo(t)).pipe(Y());return Q([i,n]).pipe(m(([s,a])=>{let{x:c,y:p}=Ue(t),l=pe(t),f=t.closest("table");return f&&t.parentElement&&(c+=f.offsetLeft+t.parentElement.offsetLeft,p+=f.offsetTop+t.parentElement.offsetTop),{active:s,offset:{x:c-a.x+l.width/2-r/2,y:p-a.y+l.height+8}}}))}function Ge(e){let t=e.title;if(!t.length)return L;let r=`__tooltip_${wa++}`,o=Ct(r,"inline"),n=P(".md-typeset",o);return n.innerHTML=t,H(()=>{let i=new v;return i.subscribe({next({offset:s}){o.style.setProperty("--md-tooltip-x",`${s.x}px`),o.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),T(i.pipe(g(({active:s})=>s)),i.pipe(be(250),g(({active:s})=>!s))).subscribe({next({active:s}){s?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Me(16,de)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(_t(125,de),g(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?o.style.setProperty("--md-tooltip-0",`${-s}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Ta(o,e).pipe(y(s=>i.next(s)),_(()=>i.complete()),m(s=>F({ref:e},s)))}).pipe(ze(ie))}function Sa(e,t){let r=H(()=>Q([zo(e),et(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:s,height:a}=pe(e);return{x:o-i.x+s/2,y:n-i.y+a/2}}));return vt(e).pipe(b(o=>r.pipe(m(n=>({active:o,offset:n})),ye(+!o||1/0))))}function xn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return H(()=>{let i=new v,s=i.pipe(ee(),oe(!0));return i.subscribe({next({offset:a}){e.style.setProperty("--md-tooltip-x",`${a.x}px`),e.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),yt(e).pipe(U(s)).subscribe(a=>{e.toggleAttribute("data-md-visible",a)}),T(i.pipe(g(({active:a})=>a)),i.pipe(be(250),g(({active:a})=>!a))).subscribe({next({active:a}){a?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Me(16,de)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(_t(125,de),g(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?e.style.setProperty("--md-tooltip-0",`${-a}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),d(n,"click").pipe(U(s),g(a=>!(a.metaKey||a.ctrlKey))).subscribe(a=>{a.stopPropagation(),a.preventDefault()}),d(n,"mousedown").pipe(U(s),ae(i)).subscribe(([a,{active:c}])=>{var p;if(a.button!==0||a.metaKey||a.ctrlKey)a.preventDefault();else if(c){a.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(p=Re())==null||p.blur()}}),r.pipe(U(s),g(a=>a===o),Ye(125)).subscribe(()=>e.focus()),Sa(e,t).pipe(y(a=>i.next(a)),_(()=>i.complete()),m(a=>F({ref:e},a)))})}function Oa(e){return e.tagName==="CODE"?R(".c, .c1, .cm",e):[e]}function Ma(e){let t=[];for(let r of Oa(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let s;for(;s=/(\(\d+\))(!)?/.exec(i.textContent);){let[,a,c]=s;if(typeof c=="undefined"){let p=i.splitText(s.index);i=p.splitText(a.length),t.push(p)}else{i.textContent=a,t.push(i);break}}}}return t}function yn(e,t){t.append(...Array.from(e.childNodes))}function lr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,s=new Map;for(let a of Ma(t)){let[,c]=a.textContent.match(/\((\d+)\)/);me(`:scope > li:nth-child(${c})`,e)&&(s.set(c,un(c,i)),a.replaceWith(s.get(c)))}return s.size===0?L:H(()=>{let a=new v,c=a.pipe(ee(),oe(!0)),p=[];for(let[l,f]of s)p.push([P(".md-typeset",f),P(`:scope > li:nth-child(${l})`,e)]);return o.pipe(U(c)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of p)l?yn(f,u):yn(u,f)}),T(...[...s].map(([,l])=>xn(l,t,{target$:r}))).pipe(_(()=>a.complete()),le())})}function En(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return En(t)}}function wn(e,t){return H(()=>{let r=En(e);return typeof r!="undefined"?lr(r,e,t):L})}var Tn=jt(zr());var La=0;function Sn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Sn(t)}}function _a(e){return Ee(e).pipe(m(({width:t})=>({scrollable:xt(e).width>t})),X("scrollable"))}function On(e,t){let{matches:r}=matchMedia("(hover)"),o=H(()=>{let n=new v,i=n.pipe($r(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let s=[];if(Tn.default.isSupported()&&(e.closest(".copy")||G("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${La++}`;let p=dn(c.id);c.insertBefore(p,e),G("content.tooltips")&&s.push(Ge(p))}let a=e.closest(".highlight");if(a instanceof HTMLElement){let c=Sn(a);if(typeof c!="undefined"&&(a.classList.contains("annotate")||G("content.code.annotate"))){let p=lr(c,e,t);s.push(Ee(a).pipe(U(i),m(({width:l,height:f})=>l&&f),Y(),b(l=>l?p:L)))}}return _a(e).pipe(y(c=>n.next(c)),_(()=>n.complete()),m(c=>F({ref:e},c)),$e(...s))});return G("content.lazy")?yt(e).pipe(g(n=>n),ye(1),b(()=>o)):o}function Aa(e,{target$:t,print$:r}){let o=!0;return T(t.pipe(m(n=>n.closest("details:not([open])")),g(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(g(n=>n||!o),y(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Mn(e,t){return H(()=>{let r=new v;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Aa(e,t).pipe(y(o=>r.next(o)),_(()=>r.complete()),m(o=>F({ref:e},o)))})}var Ln=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var qr,ka=0;function Ha(){return typeof mermaid=="undefined"||mermaid instanceof Element?gt("https://unpkg.com/mermaid@10.7.0/dist/mermaid.min.js"):$(void 0)}function _n(e){return e.classList.remove("mermaid"),qr||(qr=Ha().pipe(y(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Ln,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),B(1))),qr.subscribe(()=>ro(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${ka++}`,r=E("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),s=r.attachShadow({mode:"closed"});s.innerHTML=n,e.replaceWith(r),i==null||i(s)})),qr.pipe(m(()=>({ref:e})))}var An=E("table");function Cn(e){return e.replaceWith(An),An.replaceWith(vn(e)),$({ref:e})}function $a(e){let t=e.find(r=>r.checked)||e[0];return T(...e.map(r=>d(r,"change").pipe(m(()=>P(`label[for="${r.id}"]`))))).pipe(q(P(`label[for="${t.id}"]`)),m(r=>({active:r})))}function kn(e,{viewport$:t,target$:r}){let o=P(".tabbed-labels",e),n=R(":scope > input",e),i=Nr("prev");e.append(i);let s=Nr("next");return e.append(s),H(()=>{let a=new v,c=a.pipe(ee(),oe(!0));Q([a,Ee(e)]).pipe(U(c),Me(1,de)).subscribe({next([{active:p},l]){let f=Ue(p),{width:u}=pe(p);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let h=ir(o);(f.xh.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),Q([et(o),Ee(o)]).pipe(U(c)).subscribe(([p,l])=>{let f=xt(o);i.hidden=p.x<16,s.hidden=p.x>f.width-l.width-16}),T(d(i,"click").pipe(m(()=>-1)),d(s,"click").pipe(m(()=>1))).pipe(U(c)).subscribe(p=>{let{width:l}=pe(o);o.scrollBy({left:l*p,behavior:"smooth"})}),r.pipe(U(c),g(p=>n.includes(p))).subscribe(p=>p.click()),o.classList.add("tabbed-labels--linked");for(let p of n){let l=P(`label[for="${p.id}"]`);l.replaceChildren(E("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),d(l.firstElementChild,"click").pipe(U(c),g(f=>!(f.metaKey||f.ctrlKey)),y(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return G("content.tabs.link")&&a.pipe(Le(1),ae(t)).subscribe(([{active:p},{offset:l}])=>{let f=p.innerText.trim();if(p.hasAttribute("data-md-switching"))p.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let w of R("[data-tabs]"))for(let A of R(":scope > input",w)){let Z=P(`label[for="${A.id}"]`);if(Z!==p&&Z.innerText.trim()===f){Z.setAttribute("data-md-switching",""),A.click();break}}window.scrollTo({top:e.offsetTop-u});let h=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...h])])}}),a.pipe(U(c)).subscribe(()=>{for(let p of R("audio, video",e))p.pause()}),$a(n).pipe(y(p=>a.next(p)),_(()=>a.complete()),m(p=>F({ref:e},p)))}).pipe(ze(ie))}function Hn(e,{viewport$:t,target$:r,print$:o}){return T(...R(".annotate:not(.highlight)",e).map(n=>wn(n,{target$:r,print$:o})),...R("pre:not(.mermaid) > code",e).map(n=>On(n,{target$:r,print$:o})),...R("pre.mermaid",e).map(n=>_n(n)),...R("table:not([class])",e).map(n=>Cn(n)),...R("details",e).map(n=>Mn(n,{target$:r,print$:o})),...R("[data-tabs]",e).map(n=>kn(n,{viewport$:t,target$:r})),...R("[title]",e).filter(()=>G("content.tooltips")).map(n=>Ge(n)))}function Ra(e,{alert$:t}){return t.pipe(b(r=>T($(!0),$(!1).pipe(Ye(2e3))).pipe(m(o=>({message:r,active:o})))))}function $n(e,t){let r=P(".md-typeset",e);return H(()=>{let o=new v;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Ra(e,t).pipe(y(n=>o.next(n)),_(()=>o.complete()),m(n=>F({ref:e},n)))})}function Pa({viewport$:e}){if(!G("header.autohide"))return $(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Ke(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),Y()),o=We("search");return Q([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),Y(),b(n=>n?r:$(!1)),q(!1))}function Rn(e,t){return H(()=>Q([Ee(e),Pa(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),Y((r,o)=>r.height===o.height&&r.hidden===o.hidden),B(1))}function Pn(e,{header$:t,main$:r}){return H(()=>{let o=new v,n=o.pipe(ee(),oe(!0));o.pipe(X("active"),je(t)).subscribe(([{active:s},{hidden:a}])=>{e.classList.toggle("md-header--shadow",s&&!a),e.hidden=a});let i=fe(R("[title]",e)).pipe(g(()=>G("content.tooltips")),re(s=>Ge(s)));return r.subscribe(o),t.pipe(U(n),m(s=>F({ref:e},s)),$e(i.pipe(U(n))))})}function Ia(e,{viewport$:t,header$:r}){return pr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=pe(e);return{active:o>=n}}),X("active"))}function In(e,t){return H(()=>{let r=new v;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=me(".md-content h1");return typeof o=="undefined"?L:Ia(o,t).pipe(y(n=>r.next(n)),_(()=>r.complete()),m(n=>F({ref:e},n)))})}function Fn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),Y()),n=o.pipe(b(()=>Ee(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),X("bottom"))));return Q([o,n,t]).pipe(m(([i,{top:s,bottom:a},{offset:{y:c},size:{height:p}}])=>(p=Math.max(0,p-Math.max(0,s-c,i)-Math.max(0,p+c-a)),{offset:s-i,height:p,active:s-i<=c})),Y((i,s)=>i.offset===s.offset&&i.height===s.height&&i.active===s.active))}function Fa(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return $(...e).pipe(re(o=>d(o,"change").pipe(m(()=>o))),q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),B(1))}function jn(e){let t=R("input",e),r=E("meta",{name:"theme-color"});document.head.appendChild(r);let o=E("meta",{name:"color-scheme"});document.head.appendChild(o);let n=At("(prefers-color-scheme: light)");return H(()=>{let i=new v;return i.subscribe(s=>{if(document.body.setAttribute("data-md-color-switching",""),s.color.media==="(prefers-color-scheme)"){let a=matchMedia("(prefers-color-scheme: light)"),c=document.querySelector(a.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");s.color.scheme=c.getAttribute("data-md-color-scheme"),s.color.primary=c.getAttribute("data-md-color-primary"),s.color.accent=c.getAttribute("data-md-color-accent")}for(let[a,c]of Object.entries(s.color))document.body.setAttribute(`data-md-color-${a}`,c);for(let a=0;a{let s=Te("header"),a=window.getComputedStyle(s);return o.content=a.colorScheme,a.backgroundColor.match(/\d+/g).map(c=>(+c).toString(16).padStart(2,"0")).join("")})).subscribe(s=>r.content=`#${s}`),i.pipe(Oe(ie)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Fa(t).pipe(U(n.pipe(Le(1))),at(),y(s=>i.next(s)),_(()=>i.complete()),m(s=>F({ref:e},s)))})}function Un(e,{progress$:t}){return H(()=>{let r=new v;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(y(o=>r.next({value:o})),_(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Kr=jt(zr());function ja(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Wn({alert$:e}){Kr.default.isSupported()&&new j(t=>{new Kr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||ja(P(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(y(t=>{t.trigger.focus()}),m(()=>ge("clipboard.copied"))).subscribe(e)}function Dn(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function Ua(e,t){let r=new Map;for(let o of R("url",e)){let n=P("loc",o),i=[Dn(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let s of R("[rel=alternate]",o)){let a=s.getAttribute("href");a!=null&&i.push(Dn(new URL(a),t))}}return r}function mr(e){return on(new URL("sitemap.xml",e)).pipe(m(t=>Ua(t,new URL(e))),he(()=>$(new Map)))}function Wa(e,t){if(!(e.target instanceof Element))return L;let r=e.target.closest("a");if(r===null)return L;if(r.target||e.metaKey||e.ctrlKey)return L;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),$(new URL(r.href))):L}function Nn(e){let t=new Map;for(let r of R(":scope > *",e.head))t.set(r.outerHTML,r);return t}function Vn(e){for(let t of R("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return $(e)}function Da(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...G("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=me(o),i=me(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=Nn(document);for(let[o,n]of Nn(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Te("container");return Fe(R("script",r)).pipe(b(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new j(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),L}),ee(),oe(document))}function zn({location$:e,viewport$:t,progress$:r}){let o=we();if(location.protocol==="file:")return L;let n=mr(o.base);$(document).subscribe(Vn);let i=d(document.body,"click").pipe(je(n),b(([c,p])=>Wa(c,p)),le()),s=d(window,"popstate").pipe(m(ve),le());i.pipe(ae(t)).subscribe(([c,{offset:p}])=>{history.replaceState(p,""),history.pushState(null,"",c)}),T(i,s).subscribe(e);let a=e.pipe(X("pathname"),b(c=>rn(c,{progress$:r}).pipe(he(()=>(st(c,!0),L)))),b(Vn),b(Da),le());return T(a.pipe(ae(e,(c,p)=>p)),e.pipe(X("pathname"),b(()=>e),X("hash")),e.pipe(Y((c,p)=>c.pathname===p.pathname&&c.hash===p.hash),b(()=>i),y(()=>history.back()))).subscribe(c=>{var p,l;history.state!==null||!c.hash?window.scrollTo(0,(l=(p=history.state)==null?void 0:p.y)!=null?l:0):(history.scrollRestoration="auto",Zo(c.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),d(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(X("offset"),be(100)).subscribe(({offset:c})=>{history.replaceState(c,"")}),a}var Qn=jt(Kn());function Yn(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,s)=>`${i}${s}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return s=>(0,Qn.default)(s).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function Ht(e){return e.type===1}function fr(e){return e.type===3}function Bn(e,t){let r=ln(e);return T($(location.protocol!=="file:"),We("search")).pipe(He(o=>o),b(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:G("search.suggest")}}})),r}function Gn({document$:e}){let t=we(),r=De(new URL("../versions.json",t.base)).pipe(he(()=>L)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:s,aliases:a})=>s===i||a.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),b(n=>d(document.body,"click").pipe(g(i=>!i.metaKey&&!i.ctrlKey),ae(o),b(([i,s])=>{if(i.target instanceof Element){let a=i.target.closest("a");if(a&&!a.target&&n.has(a.href)){let c=a.href;return!i.target.closest(".md-version")&&n.get(c)===s?L:(i.preventDefault(),$(c))}}return L}),b(i=>{let{version:s}=n.get(i);return mr(new URL(i)).pipe(m(a=>{let p=ve().href.replace(t.base,"");return a.has(p.split("#")[0])?new URL(`../${s}/${p}`,t.base):new URL(i)}))})))).subscribe(n=>st(n,!0)),Q([r,o]).subscribe(([n,i])=>{P(".md-header__topic").appendChild(gn(n,i))}),e.pipe(b(()=>o)).subscribe(n=>{var s;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let a=((s=t.version)==null?void 0:s.default)||"latest";Array.isArray(a)||(a=[a]);e:for(let c of a)for(let p of n.aliases.concat(n.version))if(new RegExp(c,"i").test(p)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let a of ne("outdated"))a.hidden=!1})}function Ka(e,{worker$:t}){let{searchParams:r}=ve();r.has("q")&&(Be("search",!0),e.value=r.get("q"),e.focus(),We("search").pipe(He(i=>!i)).subscribe(()=>{let i=ve();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=vt(e),n=T(t.pipe(He(Ht)),d(e,"keyup"),o).pipe(m(()=>e.value),Y());return Q([n,o]).pipe(m(([i,s])=>({value:i,focus:s})),B(1))}function Jn(e,{worker$:t}){let r=new v,o=r.pipe(ee(),oe(!0));Q([t.pipe(He(Ht)),r],(i,s)=>s).pipe(X("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(X("focus")).subscribe(({focus:i})=>{i&&Be("search",i)}),d(e.form,"reset").pipe(U(o)).subscribe(()=>e.focus());let n=P("header [for=__search]");return d(n,"click").subscribe(()=>e.focus()),Ka(e,{worker$:t}).pipe(y(i=>r.next(i)),_(()=>r.complete()),m(i=>F({ref:e},i)),B(1))}function Xn(e,{worker$:t,query$:r}){let o=new v,n=Yo(e.parentElement).pipe(g(Boolean)),i=e.parentElement,s=P(":scope > :first-child",e),a=P(":scope > :last-child",e);We("search").subscribe(l=>a.setAttribute("role",l?"list":"presentation")),o.pipe(ae(r),Ir(t.pipe(He(Ht)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:s.textContent=f.length?ge("search.result.none"):ge("search.result.placeholder");break;case 1:s.textContent=ge("search.result.one");break;default:let u=ar(l.length);s.textContent=ge("search.result.other",u)}});let c=o.pipe(y(()=>a.innerHTML=""),b(({items:l})=>T($(...l.slice(0,10)),$(...l.slice(10)).pipe(Ke(4),jr(n),b(([f])=>f)))),m(hn),le());return c.subscribe(l=>a.appendChild(l)),c.pipe(re(l=>{let f=me("details",l);return typeof f=="undefined"?L:d(f,"toggle").pipe(U(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(g(fr),m(({data:l})=>l)).pipe(y(l=>o.next(l)),_(()=>o.complete()),m(l=>F({ref:e},l)))}function Qa(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=ve();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function Zn(e,t){let r=new v,o=r.pipe(ee(),oe(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),d(e,"click").pipe(U(o)).subscribe(n=>n.preventDefault()),Qa(e,t).pipe(y(n=>r.next(n)),_(()=>r.complete()),m(n=>F({ref:e},n)))}function ei(e,{worker$:t,keyboard$:r}){let o=new v,n=Te("search-query"),i=T(d(n,"keydown"),d(n,"focus")).pipe(Oe(ie),m(()=>n.value),Y());return o.pipe(je(i),m(([{suggest:a},c])=>{let p=c.split(/([\s-]+)/);if(a!=null&&a.length&&p[p.length-1]){let l=a[a.length-1];l.startsWith(p[p.length-1])&&(p[p.length-1]=l)}else p.length=0;return p})).subscribe(a=>e.innerHTML=a.join("").replace(/\s/g," ")),r.pipe(g(({mode:a})=>a==="search")).subscribe(a=>{switch(a.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(g(fr),m(({data:a})=>a)).pipe(y(a=>o.next(a)),_(()=>o.complete()),m(()=>({ref:e})))}function ti(e,{index$:t,keyboard$:r}){let o=we();try{let n=Bn(o.search,t),i=Te("search-query",e),s=Te("search-result",e);d(e,"click").pipe(g(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>Be("search",!1)),r.pipe(g(({mode:c})=>c==="search")).subscribe(c=>{let p=Re();switch(c.type){case"Enter":if(p===i){let l=new Map;for(let f of R(":first-child [href]",s)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,h])=>h-u);f.click()}c.claim()}break;case"Escape":case"Tab":Be("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof p=="undefined")i.focus();else{let l=[i,...R(":not(details) > [href], summary, details[open] [href]",s)],f=Math.max(0,(Math.max(0,l.indexOf(p))+l.length+(c.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}c.claim();break;default:i!==Re()&&i.focus()}}),r.pipe(g(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let a=Jn(i,{worker$:n});return T(a,Xn(s,{worker$:n,query$:a})).pipe($e(...ne("search-share",e).map(c=>Zn(c,{query$:a})),...ne("search-suggest",e).map(c=>ei(c,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,qe}}function ri(e,{index$:t,location$:r}){return Q([t,r.pipe(q(ve()),g(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>Yn(o.config)(n.searchParams.get("h"))),m(o=>{var s;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let a=i.nextNode();a;a=i.nextNode())if((s=a.parentElement)!=null&&s.offsetHeight){let c=a.textContent,p=o(c);p.length>c.length&&n.set(a,p)}for(let[a,c]of n){let{childNodes:p}=E("span",null,c);a.replaceWith(...Array.from(p))}return{ref:e,nodes:n}}))}function Ya(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return Q([r,t]).pipe(m(([{offset:i,height:s},{offset:{y:a}}])=>(s=s+Math.min(n,Math.max(0,a-i))-n,{height:s,locked:a>=i+n})),Y((i,s)=>i.height===s.height&&i.locked===s.locked))}function Qr(e,o){var n=o,{header$:t}=n,r=to(n,["header$"]);let i=P(".md-sidebar__scrollwrap",e),{y:s}=Ue(i);return H(()=>{let a=new v,c=a.pipe(ee(),oe(!0)),p=a.pipe(Me(0,de));return p.pipe(ae(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*s}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),p.pipe(He()).subscribe(()=>{for(let l of R(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=pe(f);f.scrollTo({top:u-h/2})}}}),fe(R("label[tabindex]",e)).pipe(re(l=>d(l,"click").pipe(Oe(ie),m(()=>l),U(c)))).subscribe(l=>{let f=P(`[id="${l.htmlFor}"]`);P(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),Ya(e,r).pipe(y(l=>a.next(l)),_(()=>a.complete()),m(l=>F({ref:e},l)))})}function oi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return Lt(De(`${r}/releases/latest`).pipe(he(()=>L),m(o=>({version:o.tag_name})),Qe({})),De(r).pipe(he(()=>L),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Qe({}))).pipe(m(([o,n])=>F(F({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return De(r).pipe(m(o=>({repositories:o.public_repos})),Qe({}))}}function ni(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return De(r).pipe(he(()=>L),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Qe({}))}function ii(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return oi(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ni(r,o)}return L}var Ba;function Ga(e){return Ba||(Ba=H(()=>{let t=__md_get("__source",sessionStorage);if(t)return $(t);if(ne("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return L}return ii(e.href).pipe(y(o=>__md_set("__source",o,sessionStorage)))}).pipe(he(()=>L),g(t=>Object.keys(t).length>0),m(t=>({facts:t})),B(1)))}function ai(e){let t=P(":scope > :last-child",e);return H(()=>{let r=new v;return r.subscribe(({facts:o})=>{t.appendChild(bn(o)),t.classList.add("md-source__repository--active")}),Ga(e).pipe(y(o=>r.next(o)),_(()=>r.complete()),m(o=>F({ref:e},o)))})}function Ja(e,{viewport$:t,header$:r}){return Ee(document.body).pipe(b(()=>pr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),X("hidden"))}function si(e,t){return H(()=>{let r=new v;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(G("navigation.tabs.sticky")?$({hidden:!1}):Ja(e,t)).pipe(y(o=>r.next(o)),_(()=>r.complete()),m(o=>F({ref:e},o)))})}function Xa(e,{viewport$:t,header$:r}){let o=new Map,n=R(".md-nav__link",e);for(let a of n){let c=decodeURIComponent(a.hash.substring(1)),p=me(`[id="${c}"]`);typeof p!="undefined"&&o.set(a,p)}let i=r.pipe(X("height"),m(({height:a})=>{let c=Te("main"),p=P(":scope > :first-child",c);return a+.8*(p.offsetTop-c.offsetTop)}),le());return Ee(document.body).pipe(X("height"),b(a=>H(()=>{let c=[];return $([...o].reduce((p,[l,f])=>{for(;c.length&&o.get(c[c.length-1]).tagName>=f.tagName;)c.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let h=f.offsetParent;for(;h;h=h.offsetParent)u+=h.offsetTop;return p.set([...c=[...c,l]].reverse(),u)},new Map))}).pipe(m(c=>new Map([...c].sort(([,p],[,l])=>p-l))),je(i),b(([c,p])=>t.pipe(Rr(([l,f],{offset:{y:u},size:h})=>{let w=u+h.height>=Math.floor(a.height);for(;f.length;){let[,A]=f[0];if(A-p=u&&!w)f=[l.pop(),...f];else break}return[l,f]},[[],[...c]]),Y((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([a,c])=>({prev:a.map(([p])=>p),next:c.map(([p])=>p)})),q({prev:[],next:[]}),Ke(2,1),m(([a,c])=>a.prev.length{let i=new v,s=i.pipe(ee(),oe(!0));if(i.subscribe(({prev:a,next:c})=>{for(let[p]of c)p.classList.remove("md-nav__link--passed"),p.classList.remove("md-nav__link--active");for(let[p,[l]]of a.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",p===a.length-1)}),G("toc.follow")){let a=T(t.pipe(be(1),m(()=>{})),t.pipe(be(250),m(()=>"smooth")));i.pipe(g(({prev:c})=>c.length>0),je(o.pipe(Oe(ie))),ae(a)).subscribe(([[{prev:c}],p])=>{let[l]=c[c.length-1];if(l.offsetHeight){let f=sr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=pe(f);f.scrollTo({top:u-h/2,behavior:p})}}})}return G("navigation.tracking")&&t.pipe(U(s),X("offset"),be(250),Le(1),U(n.pipe(Le(1))),at({delay:250}),ae(i)).subscribe(([,{prev:a}])=>{let c=ve(),p=a[a.length-1];if(p&&p.length){let[l]=p,{hash:f}=new URL(l.href);c.hash!==f&&(c.hash=f,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),Xa(e,{viewport$:t,header$:r}).pipe(y(a=>i.next(a)),_(()=>i.complete()),m(a=>F({ref:e},a)))})}function Za(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:s}})=>s),Ke(2,1),m(([s,a])=>s>a&&a>0),Y()),i=r.pipe(m(({active:s})=>s));return Q([i,n]).pipe(m(([s,a])=>!(s&&a)),Y(),U(o.pipe(Le(1))),oe(!0),at({delay:250}),m(s=>({hidden:s})))}function pi(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new v,s=i.pipe(ee(),oe(!0));return i.subscribe({next({hidden:a}){e.hidden=a,a?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(U(s),X("height")).subscribe(({height:a})=>{e.style.top=`${a+16}px`}),d(e,"click").subscribe(a=>{a.preventDefault(),window.scrollTo({top:0})}),Za(e,{viewport$:t,main$:o,target$:n}).pipe(y(a=>i.next(a)),_(()=>i.complete()),m(a=>F({ref:e},a)))}function li({document$:e}){e.pipe(b(()=>R(".md-ellipsis")),re(t=>yt(t).pipe(U(e.pipe(Le(1))),g(r=>r),m(()=>t),ye(1))),g(t=>t.offsetWidth{let r=t.innerText,o=t.closest("a")||t;return o.title=r,Ge(o).pipe(U(e.pipe(Le(1))),_(()=>o.removeAttribute("title")))})).subscribe(),e.pipe(b(()=>R(".md-status")),re(t=>Ge(t))).subscribe()}function mi({document$:e,tablet$:t}){e.pipe(b(()=>R(".md-toggle--indeterminate")),y(r=>{r.indeterminate=!0,r.checked=!1}),re(r=>d(r,"change").pipe(Fr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ae(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function es(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function fi({document$:e}){e.pipe(b(()=>R("[data-md-scrollfix]")),y(t=>t.removeAttribute("data-md-scrollfix")),g(es),re(t=>d(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function ui({viewport$:e,tablet$:t}){Q([We("search"),t]).pipe(m(([r,o])=>r&&!o),b(r=>$(r).pipe(Ye(r?400:100))),ae(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function ts(){return location.protocol==="file:"?gt(`${new URL("search/search_index.js",Yr.base)}`).pipe(m(()=>__index),B(1)):De(new URL("search/search_index.json",Yr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var rt=No(),Rt=Jo(),wt=en(Rt),Br=Go(),_e=pn(),ur=At("(min-width: 960px)"),hi=At("(min-width: 1220px)"),bi=tn(),Yr=we(),vi=document.forms.namedItem("search")?ts():qe,Gr=new v;Wn({alert$:Gr});var Jr=new v;G("navigation.instant")&&zn({location$:Rt,viewport$:_e,progress$:Jr}).subscribe(rt);var di;((di=Yr.version)==null?void 0:di.provider)==="mike"&&Gn({document$:rt});T(Rt,wt).pipe(Ye(125)).subscribe(()=>{Be("drawer",!1),Be("search",!1)});Br.pipe(g(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=me("link[rel=prev]");typeof t!="undefined"&&st(t);break;case"n":case".":let r=me("link[rel=next]");typeof r!="undefined"&&st(r);break;case"Enter":let o=Re();o instanceof HTMLLabelElement&&o.click()}});li({document$:rt});mi({document$:rt,tablet$:ur});fi({document$:rt});ui({viewport$:_e,tablet$:ur});var tt=Rn(Te("header"),{viewport$:_e}),$t=rt.pipe(m(()=>Te("main")),b(e=>Fn(e,{viewport$:_e,header$:tt})),B(1)),rs=T(...ne("consent").map(e=>fn(e,{target$:wt})),...ne("dialog").map(e=>$n(e,{alert$:Gr})),...ne("header").map(e=>Pn(e,{viewport$:_e,header$:tt,main$:$t})),...ne("palette").map(e=>jn(e)),...ne("progress").map(e=>Un(e,{progress$:Jr})),...ne("search").map(e=>ti(e,{index$:vi,keyboard$:Br})),...ne("source").map(e=>ai(e))),os=H(()=>T(...ne("announce").map(e=>mn(e)),...ne("content").map(e=>Hn(e,{viewport$:_e,target$:wt,print$:bi})),...ne("content").map(e=>G("search.highlight")?ri(e,{index$:vi,location$:Rt}):L),...ne("header-title").map(e=>In(e,{viewport$:_e,header$:tt})),...ne("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Ur(hi,()=>Qr(e,{viewport$:_e,header$:tt,main$:$t})):Ur(ur,()=>Qr(e,{viewport$:_e,header$:tt,main$:$t}))),...ne("tabs").map(e=>si(e,{viewport$:_e,header$:tt})),...ne("toc").map(e=>ci(e,{viewport$:_e,header$:tt,main$:$t,target$:wt})),...ne("top").map(e=>pi(e,{viewport$:_e,header$:tt,main$:$t,target$:wt})))),gi=rt.pipe(b(()=>os),$e(rs),B(1));gi.subscribe();window.document$=rt;window.location$=Rt;window.target$=wt;window.keyboard$=Br;window.viewport$=_e;window.tablet$=ur;window.screen$=hi;window.print$=bi;window.alert$=Gr;window.progress$=Jr;window.component$=gi;})(); +//# sourceMappingURL=bundle.c8d2eff1.min.js.map + diff --git a/assets/javascripts/bundle.c8d2eff1.min.js.map b/assets/javascripts/bundle.c8d2eff1.min.js.map new file mode 100644 index 000000000..fc522dbae --- /dev/null +++ b/assets/javascripts/bundle.c8d2eff1.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/rxjs/node_modules/tslib/tslib.es6.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2024 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/anbernic/rg35xx-2024/index.html b/devices/anbernic/rg35xx-2024/index.html new file mode 100644 index 000000000..e262feccf --- /dev/null +++ b/devices/anbernic/rg35xx-2024/index.html @@ -0,0 +1,5828 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RG35XX 2024 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Anbernic RG35XX 2024

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Allwinner H700ARM Cortex-A53 (Quad-core) @ 1.4 GHzMali G31
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
3.5-inch 640*4801 GB LPDDR4NoneNone
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline LinuxPanfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Tweaks

+

In Emulationstation system settings you find an overclock setting options. The overlock option enables 1.5 GHz operation.

+ + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverInterface
RG35XX 2024Allwinner H700 (ARM)Mainline LinuxPanfrostSway + Emulation Station
+

Features

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX can be run from an SD Card and an second SD card can be used to store games
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
LEDSupports selecting from a set of colors or turning the power LED off (choice persists through reboots)
Does not support other effects.
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
MENU+START (x2)Quit Game
MENU+R1Save State
MENU+L1Load State
MENU+X(NORTH)Open RA Menu
MENU+B(SOUTH)Reset Game
MENU+Y(WEST)Show FPS
MENU+A(EAST)Take Screenshot
MENU+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
MENU+START (hold for 2sec)Quit Game
MENU+R1Save State
MENU+L1 (hold for 2sec)Load State
MENU+Y(WEST)Show FPS
MENU+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
MENU+STARTQuit Game
MENU+R1Save State
MENU+L1Load State
MENU+Y(WEST)Take Screenshot
MENU+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
B(SOUTH)Button 1
A(EAST)Button 2
X(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
MENU+Vol +Brightness Up
MENU+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Notes

+

Installation

+

Download the latest H700 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+
+

Before booting the device, see the Installation Guide for H700 devices

+
+

Latest Version +Latest Version

+

Additional References

+ + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/anbernic/rg35xx-h/index.html b/devices/anbernic/rg35xx-h/index.html new file mode 100644 index 000000000..66ae52b60 --- /dev/null +++ b/devices/anbernic/rg35xx-h/index.html @@ -0,0 +1,5828 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RG35XX H - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Anbernic RG35XX H

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Allwinner H700ARM Cortex-A53 (Quad-core) @ 1.4 GHzMali G31
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
3.5-inch 640*4801 GB LPDDR4None2.4/5 GHz WiFi + BT
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline LinuxPanfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Tweaks

+

In Emulationstation system settings you find an overclock setting options. The overlock option enables 1.5 GHz operation.

+ + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverInterface
RG35XX HAllwinner H700 (ARM)Mainline LinuxPanfrostSway + Emulation Station
+

Features

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX can be run from an SD Card and an second SD card can be used to store games
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
LEDSupports selecting from a set of colors or turning the power LED off (choice persists through reboots)
Does not support other effects.
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
MENU+START (x2)Quit Game
MENU+R1Save State
MENU+L1Load State
MENU+X(NORTH)Open RA Menu
MENU+B(SOUTH)Reset Game
MENU+Y(WEST)Show FPS
MENU+A(EAST)Take Screenshot
MENU+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
MENU+START (hold for 2sec)Quit Game
MENU+R1Save State
MENU+L1 (hold for 2sec)Load State
MENU+Y(WEST)Show FPS
MENU+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
MENU+STARTQuit Game
MENU+R1Save State
MENU+L1Load State
MENU+Y(WEST)Take Screenshot
MENU+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
B(SOUTH)Button 1
A(EAST)Button 2
X(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
MENU+Vol +Brightness Up
MENU+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Notes

+

Installation

+

Download the latest H700 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+
+

Before booting the device, see the Installation Guide for H700 devices

+
+

Latest Version +Latest Version

+

Additional References

+ + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/anbernic/rg35xx-plus/index.html b/devices/anbernic/rg35xx-plus/index.html new file mode 100644 index 000000000..de5855024 --- /dev/null +++ b/devices/anbernic/rg35xx-plus/index.html @@ -0,0 +1,5828 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RG35XX Plus - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Anbernic RG35XX Plus

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Allwinner H700ARM Cortex-A53 (Quad-core) @ 1.4 GHzMali G31
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
3.5-inch 640*4801 GB LPDDR4None2.4/5 GHz WiFi + BT
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline LinuxPanfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Tweaks

+

In Emulationstation system settings you find an overclock setting options. The overlock option enables 1.5 GHz operation.

+ + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverInterface
RG35XX PlusAllwinner H700 (ARM)Mainline LinuxPanfrostSway + Emulation Station
+

Features

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX can be run from an SD Card and an second SD card can be used to store games
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
LEDSupports selecting from a set of colors or turning the power LED off (choice persists through reboots)
Does not support other effects.
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
MENU+START (x2)Quit Game
MENU+R1Save State
MENU+L1Load State
MENU+X(NORTH)Open RA Menu
MENU+B(SOUTH)Reset Game
MENU+Y(WEST)Show FPS
MENU+A(EAST)Take Screenshot
MENU+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
MENU+START (hold for 2sec)Quit Game
MENU+R1Save State
MENU+L1 (hold for 2sec)Load State
MENU+Y(WEST)Show FPS
MENU+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
MENU+STARTQuit Game
MENU+R1Save State
MENU+L1Load State
MENU+Y(WEST)Take Screenshot
MENU+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
B(SOUTH)Button 1
A(EAST)Button 2
X(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
MENU+Vol +Brightness Up
MENU+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Notes

+

Installation

+

Download the latest H700 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+
+

Before booting the device, see the Installation Guide for H700 devices

+
+

Latest Version +Latest Version

+

Additional References

+ + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/anbernic/rg35xx-sp/index.html b/devices/anbernic/rg35xx-sp/index.html new file mode 100644 index 000000000..c7ab602b2 --- /dev/null +++ b/devices/anbernic/rg35xx-sp/index.html @@ -0,0 +1,5828 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RG35XX SP - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Anbernic RG35XX SP

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Allwinner H700ARM Cortex-A53 (Quad-core) @ 1.4 GHzMali G31
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
3.5-inch 640*4801 GB LPDDR4None2.4/5 GHz WiFi + BT
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline LinuxPanfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Tweaks

+

In Emulationstation system settings you find an overclock setting options. The overlock option enables 1.5 GHz operation.

+ + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverInterface
RG35XX SPAllwinner H700 (ARM)Mainline LinuxPanfrostSway + Emulation Station
+

Features

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX can be run from an SD Card and an second SD card can be used to store games
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
LEDSupports selecting from a set of colors or turning the power LED off (choice persists through reboots)
Does not support other effects.
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
MENU+START (x2)Quit Game
MENU+R1Save State
MENU+L1Load State
MENU+X(NORTH)Open RA Menu
MENU+B(SOUTH)Reset Game
MENU+Y(WEST)Show FPS
MENU+A(EAST)Take Screenshot
MENU+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
MENU+START (hold for 2sec)Quit Game
MENU+R1Save State
MENU+L1 (hold for 2sec)Load State
MENU+Y(WEST)Show FPS
MENU+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
MENU+STARTQuit Game
MENU+R1Save State
MENU+L1Load State
MENU+Y(WEST)Take Screenshot
MENU+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
B(SOUTH)Button 1
A(EAST)Button 2
X(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
MENU+Vol +Brightness Up
MENU+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Notes

+

Installation

+

Download the latest H700 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+
+

Before booting the device, see the Installation Guide for H700 devices

+
+

Latest Version +Latest Version

+

Additional References

+ + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/anbernic/rg40xx-h/index.html b/devices/anbernic/rg40xx-h/index.html new file mode 100644 index 000000000..2c25b254a --- /dev/null +++ b/devices/anbernic/rg40xx-h/index.html @@ -0,0 +1,5828 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RG40XX H - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Anbernic RG40XX H

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Allwinner H700ARM Cortex-A53 (Quad-core) @ 1.4 GHzMali G31
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
4.0-inch 640*4801 GB LPDDR4None2.4/5 GHz WiFi + BT
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline LinuxPanfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Tweaks

+

In Emulationstation system settings you find an overclock setting options. The overlock option enables 1.5 GHz operation.

+ + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverInterface
RG40XX HAllwinner H700 (ARM)Mainline LinuxPanfrostSway + Emulation Station
+

Features

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX can be run from an SD Card and an second SD card can be used to store games
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
LEDSupports selecting from a set of colors or turning the power LED off (choice persists through reboots)
Does not support other effects.
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
MENU+START (x2)Quit Game
MENU+R1Save State
MENU+L1Load State
MENU+X(NORTH)Open RA Menu
MENU+B(SOUTH)Reset Game
MENU+Y(WEST)Show FPS
MENU+A(EAST)Take Screenshot
MENU+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
MENU+START (hold for 2sec)Quit Game
MENU+R1Save State
MENU+L1 (hold for 2sec)Load State
MENU+Y(WEST)Show FPS
MENU+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
MENU+STARTQuit Game
MENU+R1Save State
MENU+L1Load State
MENU+Y(WEST)Take Screenshot
MENU+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
B(SOUTH)Button 1
A(EAST)Button 2
X(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
MENU+Vol +Brightness Up
MENU+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Notes

+

Installation

+

Download the latest H700 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+
+

Before booting the device, see the Installation Guide for H700 devices

+
+

Latest Version +Latest Version

+

Additional References

+ + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/anbernic/rg40xx-v/index.html b/devices/anbernic/rg40xx-v/index.html new file mode 100644 index 000000000..1334cd074 --- /dev/null +++ b/devices/anbernic/rg40xx-v/index.html @@ -0,0 +1,5828 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RG40XX V - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Anbernic RG40XX V

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Allwinner H700ARM Cortex-A53 (Quad-core) @ 1.4 GHzMali G31
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
4.0-inch 640*4801 GB LPDDR4None2.4/5 GHz WiFi + BT
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline LinuxPanfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Tweaks

+

In Emulationstation system settings you find an overclock setting options. The overlock option enables 1.5 GHz operation.

+ + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverInterface
RG40XX VAllwinner H700 (ARM)Mainline LinuxPanfrostSway + Emulation Station
+

Features

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX can be run from an SD Card and an second SD card can be used to store games
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
LEDSupports selecting from a set of colors or turning the power LED off (choice persists through reboots)
Does not support other effects.
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
MENU+START (x2)Quit Game
MENU+R1Save State
MENU+L1Load State
MENU+X(NORTH)Open RA Menu
MENU+B(SOUTH)Reset Game
MENU+Y(WEST)Show FPS
MENU+A(EAST)Take Screenshot
MENU+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
MENU+START (hold for 2sec)Quit Game
MENU+R1Save State
MENU+L1 (hold for 2sec)Load State
MENU+Y(WEST)Show FPS
MENU+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
MENU+STARTQuit Game
MENU+R1Save State
MENU+L1Load State
MENU+Y(WEST)Take Screenshot
MENU+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
B(SOUTH)Button 1
A(EAST)Button 2
X(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
MENU+Vol +Brightness Up
MENU+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Notes

+

Installation

+

Download the latest H700 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+
+

Before booting the device, see the Installation Guide for H700 devices

+
+

Latest Version +Latest Version

+

Additional References

+ + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/anbernic/rg503/index.html b/devices/anbernic/rg503/index.html new file mode 100644 index 000000000..9b1c77e99 --- /dev/null +++ b/devices/anbernic/rg503/index.html @@ -0,0 +1,5833 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RG503 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Anbernic RG503

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3566ARM Cortex-A55 (Quad-core) @ 1.8 GHzMali G52
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
5-inch 960*5441 GB LPDDR4None2.4/5 GHz WiFi + BT
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Tweaks

+

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

+

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

+
    +
  1. Inserting the OS SD card into a PC.
  2. +
  3. Open ROCKNIX partition, and go to the extlinux folder.
  4. +
  5. Open extlinux.conf text file.
  6. +
  7. Completely remove the line that starts with FDTOVERLAYS.
  8. +
  9. Now your device will boot with stock voltages.
  10. +
+ + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverInterface
RG503Rockchip RK3566 (ARM)Mainline LinuxPanfrostSway + Emulation Station
+

Features

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX can be run from an SD Card and an second SD card can be used to store games
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
LEDSupports selecting from a set of colors or turning the power LED off (choice persists through reboots)
Does not support other effects.
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (x2)Quit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+X(NORTH)Open RA Menu
SELECT+B(SOUTH)Reset Game
SELECT+Y(WEST)Show FPS
SELECT+A(EAST)Take Screenshot
SELECT+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (hold for 2sec)Quit Game
SELECT+R1Save State
SELECT+L1 (hold for 2sec)Load State
SELECT+Y(WEST)Show FPS
SELECT+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
SELECT+STARTQuit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+Y(WEST)Take Screenshot
SELECT+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
B(SOUTH)Button 1
A(EAST)Button 2
X(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
SELECT+Vol +Brightness Up
SELECT+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Notes

+

Installation

+

Download the latest RK3566 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+

Additional References

+ + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/anbernic/rg552/index.html b/devices/anbernic/rg552/index.html new file mode 100644 index 000000000..810de7ce8 --- /dev/null +++ b/devices/anbernic/rg552/index.html @@ -0,0 +1,5277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RG552 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Anbernic RG552

+

+

Overview

+ + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverInterface
RG552Rockchip RK3399 (ARM)Mainline LinuxPanfrostWeston + Emulation Station
+

Features

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX can be run from an SD Card and an second SD card can be used to store games
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
FanCan be set globally, per system or per game.
+

Notes

+

Installation

+

Download the latest RK3399 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+

Additional References

+ +

Community Videos

+ + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/anbernic/rgarc/index.html b/devices/anbernic/rgarc/index.html new file mode 100644 index 000000000..3a2aa6b7a --- /dev/null +++ b/devices/anbernic/rgarc/index.html @@ -0,0 +1,5852 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RG ARC [D/S] - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Anbernic RG ARC [D/S]

+

+

Overview

+
+

eMMC model with legacy bootloader is not supported.

+
+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3566ARM Cortex-A55 (Quad-core) @ 1.8 GHzMali G52
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
4-inch 640*4801 GB (S), 2 GB (D) LPDDR432GB (D)2.4/5 GHz WiFi + BT
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Tweaks

+

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

+

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

+
    +
  1. Inserting the OS SD card into a PC.
  2. +
  3. Open ROCKNIX partition, and go to the extlinux folder.
  4. +
  5. Open extlinux.conf text file.
  6. +
  7. Completely remove the line that starts with FDTOVERLAYS.
  8. +
  9. Now your device will boot with stock voltages.
  10. +
+

Features

+ + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX can be installed to the eMMC on the D model or run from an SD Card, and an second SD card can be used to store games
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (x2)Quit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+Y(NORTH)Open RA Menu
SELECT+A(SOUTH)Reset Game
SELECT+X(WEST)Show FPS
SELECT+B(EAST)Take Screenshot
SELECT+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (hold for 2sec)Quit Game
SELECT+R1Save State
SELECT+L1 (hold for 2sec)Load State
SELECT+X(WEST)Show FPS
SELECT+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
AA
XB
ZC Up
BC Down
YC Left
CC Right
L2Z
L1L
R1R
SELECT+STARTQuit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+XTake Screenshot
SELECT+AReset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press Y(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • +

    You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.

    +
  • +
  • +

    The default mapping maps the Nintendo 64 joystick to the d-pad, by selecting custom input configuration in advanced game options it will map the Nintendo 64 d-pad to the Arc d-pad.

    +
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
B(EAST)Circle
ACross
Y(NORTH)Triangle
XSquare
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
AButton 1
B(EAST)Button 2
Y(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
SELECT+Vol +Brightness Up
SELECT+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Notes

+

Installation

+

Download the latest RK3566 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+
RG-ARC-D Users
+

You will need to wipe the Android partition to boot into ROCKNIX.

+
WARNING - This will remove Android completely from your device.
+
    +
  • +

    Install ADB on your computer if you don't already have it. How to Install and Use ADB, the Android Debug Bridge Utility

    +
  • +
  • +

    From power off and sd ejected, hold down power and volume down to get into Android recovery

    +
  • +
  • +

    Connect the device to your computer via USB using the "DC" port on the device.

    +
  • +
  • +

    Switch ADB into root mode using adb root - You may get a timeout error here, continue on anyway.

    +
  • +
  • +

    If you would like a backup of your Android partition, run adb pull /dev/block/mmcblk0 android.img

    +
  • +
  • +

    Get an ADB shell with adb shell

    +
  • +
  • +

    Wipe the Android partition: dd if=/dev/zero of=/dev/block/mmcblk0 bs=4M This will take a few minutes and when it is done you will get an "out of space" message.

    +
  • +
  • +

    Exit the shell exit

    +
  • +
  • +

    Insert your ROCKNIX SD card, and run adb reboot

    +
  • +
  • +

    You should now be booting ROCKNIX!

    +
  • +
+

Additional References

+ + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/gameforce/gameforce-ace/index.html b/devices/gameforce/gameforce-ace/index.html new file mode 100644 index 000000000..de834b890 --- /dev/null +++ b/devices/gameforce/gameforce-ace/index.html @@ -0,0 +1,5577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + GameForce Ace - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

GameForce Ace (WIP)

+

+

Overview

+ + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverInterface
Gameforce AceRockchip RK3588Rockchip 5.10 BSP LinuxPanfrostWeston + Emulation Station
+

Features

+ + + + + + + + + + + + + +
Feature                Notes
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
Function+START (x2)Quit Game
Function+R1Save State
Function+L1Load State
Function+X(NORTH)Open RA Menu
Function+B(SOUTH)Reset Game
Function+Y(WEST)Show FPS
Function+A(EAST)Take Screenshot
Function+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
Function+START (hold for 2sec)Quit Game
Function+R1Save State
Function+L1 (hold for 2sec)Load State
Function+Y(WEST)Show FPS
Function+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
Function+STARTQuit Game
Function+R1Save State
Function+L1Load State
Function+Y(WEST)Take Screenshot
Function+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
Function+Vol +Brightness Up
Function+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Additional References

+ + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/hardkernel/odroid-go-advance/index.html b/devices/hardkernel/odroid-go-advance/index.html new file mode 100644 index 000000000..5416037f1 --- /dev/null +++ b/devices/hardkernel/odroid-go-advance/index.html @@ -0,0 +1,5342 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Odroid Go Advance - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Odroid Go Advance

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3326ARM Cortex-A35 (Quad-core) @ 1.3 GHzMali G31
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
3.5-inch 480*3201 GB DDR3LNoneBlack Edition: 2.4 GHz (ESP32-S2)
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Notes

+

Installation

+

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+

Analogue Stick

+

There are several parameters available for the analogue stick in the odroidgo2_joypad driver. These can be used to work around stick drift, or a disconnected stick, perhaps due to a broken connector on the mainboard (which causes stick input to the right to permanently register).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterNotes
joystick_fuzz0 - 1800, used to filter noise from the event stream
joystick_flat0 - 1800
joystick_y_range0 - 1800
joystick_x_range0 - 1800
joystick_scale
joystick_deadzone0 - 1800
+

To override a parameter value, modify bootargs in boot.ini. For example to disable the analogue stick input, modify boot.ini to use the following values as per this Odroid forum post: +

setenv joystick_fuzz "1800"
+setenv joystick_flat "1800"
+setenv joystick_y_range "1800"
+setenv joystick_x_range "1800"
+setenv joystick_scale "2"
+setenv joystick_deadzone "1800"
+setenv joystick_config "button-adc-x-range=${joystick_x_range} button-adc-y-range=${joystick_y_range} button-adc-fuzz=${joystick_fuzz} button-adc-flat=${joystick_flat} button-adc-scale=${joystick_scale} button-adc-deadzone=${joystick_deadzone}"
+
+setenv bootargs "<snip - existing bootargs> ${joystick_config}"
+

+

Additional References

+ + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/hardkernel/odroid-go-super/index.html b/devices/hardkernel/odroid-go-super/index.html new file mode 100644 index 000000000..0b426f38b --- /dev/null +++ b/devices/hardkernel/odroid-go-super/index.html @@ -0,0 +1,5277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Odroid Go Super - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Odroid Go Super

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3326ARM Cortex-A35 (Quad-core) @ 1.3 GHzMali G31
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
5-inch 854*4801 GB DDR3LNoneNone
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Notes

+

Installation

+

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+

Additional References

+ + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/hardkernel/odroid-go-ultra/index.html b/devices/hardkernel/odroid-go-ultra/index.html new file mode 100644 index 000000000..c51125994 --- /dev/null +++ b/devices/hardkernel/odroid-go-ultra/index.html @@ -0,0 +1,6058 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Odroid Go Ultra - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Odroid Go Ultra

+

+

Overview

+ + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverInterface
Odroid Go UltraAmlogic S922X / Mali G52 M6 (ARMv8-A)Mainline LinuxMaliWeston + Emulation Station
+

Features

+ + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX should be installed directly to the internal EMMC.
A microSD Card can be used for game storage.
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (x2)Quit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+X(NORTH)Open RA Menu
SELECT+B(SOUTH)Reset Game
SELECT+Y(WEST)Show FPS
SELECT+A(EAST)Take Screenshot
SELECT+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

AetherSX2 (PS2)

+ + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
F1+R1Save State
F1+L1Load State
F1+X(NORTH)Open Menu
+ + + + + + + + + + + + + +
Required Bios FilesPath
SCPH-70012.bin/roms/bios/aethersx2/bios
+

Drastic (Nintendo DS)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
R2Save State
L2Load State
F1Open Menu
F2Switch One Screen and Dual Screen Layout
L3Change Screen Layout/Swap Screens
+

Dolphin-SA (Gamecube / Wii)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
F1+STARTQuit Game
F1+R2Save State
F1+L2Load State
F1+B(SOUTH)Screenshot
F1+Y(WEST)Change Internal Resolution
F1+A(EAST)Change Aspect Ratio
F1+X(NORTH)Show FPS
F1+D-Pad UpIncrease current state slot
F1+D-Pad DownDecrease current state slot
F1+R1Fast-Forward
+

Lime3DS (Nintendo 3DS)

+ + + + + + + + + + + + + +
Button ComboAction
F1+STARTQuit Game
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
F1+STARTQuit Game
F1+R1Save State
F1+L1Load State
F1+Y(WEST)Take Screenshot
F1+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
F1Open Menu
+

Yabasanshiro (Sega Saturn)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTOpen Menu
Y(WEST)A
A(EAST)B
B(SOUTH)C
X(NORTH)X
L1Y
R1Z
L2L
R2R
START+SELECT+R1Quit Game
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
B(SOUTH)Button 1
A(EAST)Button 2
X(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Open Beats of Rage (OpenBOR)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTConfirm
SELECTCancel
B(SOUTH)Attack 1
A(EAST)Jump
X(NORTH)Attack 2
Y(WEST)Special
+
+

note: pressing A on title screen will exit

+
+

Vice (Commodore 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTOpen Menu
SELECTDisplay Keyboard
B(SOUTH)Back
A(EAST)Fire / Confirm
L1Back
L2Assign Hotkey
L3Fire (Joy 2)
R1Confirm
R2Swap Joystick Port
+

Additional Notes:

+

Games will require keyboard key presses to progress through messages and to launch +(e.g. SPACE, RSTR [run/start], F3, F7).

+

SELECT to show onscreen keyboard, left analog/d-pad to move cursor, B to confirm

+

C= on keyboard resets the machine

+

L2 to assign highlighted key or menu function to gamepad button (save config to retain)

+

To cancel onscreen keyboard, move cursor to blank area and A/L1 to close keyboard +or click on X in top left corner of keyboard

+

Joystick can be assigned to port 1 or 2. R2 to switch ports. +port 1: [left analog] + [B = fire] +port 2: [right analog] + [L3 = fire].

+

To quit emulator, START, highlight Exit Emulator, B to confirm

+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
F1+Vol +Brightness Up
F1+Vol -Brightness Down
F2+Vol +Battery Status
F2+Vol -WIFI Toggle
+

Notes

+

Installation

+

First download the latest S922X-Odroid_GOU version of ROCKNIX from the button below.

+

Latest Version +Latest Version

+

Installation process:

+
    +
  1. Boot the Odroid Go Ultra into recovery mode following the steps on the Odroid wiki.
  2. +
  3. Once booted into recovery mode and connected to a PC via USB-C, the ROCKNIX image may be flashed to the EMMC using Balena Etcher, win32diskimager, dd or similar.
  4. +
  5. Restart the device and ROCKNIX will go through its first boot process (running from EMMC).
  6. +
+

Troubleshooting

+

You cannot brick this device. If you cannot get into recovery mode, do the following:

+ +

The device should now be in recovery mode, ready to flash ROCKNIX (or other firmware) to the device.

+

Additional References

+ + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/hardkernel/odroid-n2/index.html b/devices/hardkernel/odroid-n2/index.html new file mode 100644 index 000000000..52b94173f --- /dev/null +++ b/devices/hardkernel/odroid-n2/index.html @@ -0,0 +1,5209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Odroid N2/N2+/N2L - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Odroid N2/N2+/N2L

+

+

Overview

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverInterface
N2Amlogic S922X / Mali G52 M6 (ARMv8-A)Mainline LinuxMaliWeston + Emulation Station
N2+Amlogic S922X / Mali G52 M6 (ARMv8-A)Mainline LinuxMaliWeston + Emulation Station
N2LAmlogic S922X / Mali G52 M6 (ARMv8-A)Mainline LinuxMaliWeston + Emulation Station
+

Notes

+

Installation

+

Download the latest S922X-Odroid_N2 version of ROCKNIX for N2/N2+ or S922X-Odroid_N2L for N2L from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+

Additional References

+ + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/index.html b/devices/index.html new file mode 100644 index 000000000..3eeb5f59d --- /dev/null +++ b/devices/index.html @@ -0,0 +1,5076 @@ + + + + + + + + + + + + + + + + + + + + + Index - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + + + + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/indiedroid/nova/index.html b/devices/indiedroid/nova/index.html new file mode 100644 index 000000000..0f78c2db8 --- /dev/null +++ b/devices/indiedroid/nova/index.html @@ -0,0 +1,5195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nova - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Indiedroid Nova

+

+

Overview

+ + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverInterface
NovaRockchip RK3588S / Mali G610 (ARMv8-A)Rockchip 5.10 BSP LinuxPanfrostWeston + Emulation Station
+

Notes

+

Installation

+

Download the latest RK3588 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+

Additional References

+ + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/magicx/xu-mini-m/index.html b/devices/magicx/xu-mini-m/index.html new file mode 100644 index 000000000..85d6892ae --- /dev/null +++ b/devices/magicx/xu-mini-m/index.html @@ -0,0 +1,5373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + XU Mini M - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

MagicX XU Mini M

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3326ARM Cortex-A35 (Quad-core) @ 1.3 GHzMali G31
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
2.8-inch 640*4801 GB DDR4NoneNone
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
G(GUIDE)+START (x2)Quit Game
G(GUIDE)+R1Save State
G(GUIDE)+L1Load State
G(GUIDE)+X(NORTH)Open RA Menu
G(GUIDE)+B(SOUTH)Reset Game
G(GUIDE)+Y(WEST)Show FPS
G(GUIDE)+A(EAST)Take Screenshot
G(GUIDE)+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Emulators

+ +

Notes

+

Installation

+

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/orange-pi/orange-pi-5/index.html b/devices/orange-pi/orange-pi-5/index.html new file mode 100644 index 000000000..7666abc0e --- /dev/null +++ b/devices/orange-pi/orange-pi-5/index.html @@ -0,0 +1,5217 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Orange Pi 5 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Orange Pi 5

+

+

Overview

+ + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverInterface
Orange Pi 5Rockchip RK3588S / Mali G610 (ARMv8-A)Rockchip 5.10 BSP LinuxPanfrostWeston + Emulation Station
+

Notes

+

Installation

+

Download the latest RK3588 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+

Additional References

+ +

Community Videos

+ + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/powkiddy/rgb10-max-3-pro/index.html b/devices/powkiddy/rgb10-max-3-pro/index.html new file mode 100644 index 000000000..c4585b228 --- /dev/null +++ b/devices/powkiddy/rgb10-max-3-pro/index.html @@ -0,0 +1,6100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RGB10 Max 3 Pro - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Powkiddy RGB10 Max 3 Pro

+

+

Overview

+ + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverInterface
RGB10 Max 3 ProAmlogic A311D / Mali G52 M4 (ARMv8-A)Mainline LinuxMaliWeston + Emulation Station
+

Features

+ + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX should be installed directly to the internal EMMC.
When installed directly to the EMMC; an SD Card can be used for game storage.
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (x2)Quit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+X(NORTH)Open RA Menu
SELECT+B(SOUTH)Reset Game
SELECT+Y(WEST)Show FPS
SELECT+A(EAST)Take Screenshot
SELECT+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

AetherSX2 (PS2)

+ + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
F1+R1Save State
F1+L1Load State
F1+X(NORTH)Open Menu
+ + + + + + + + + + + + + +
Required Bios FilesPath
SCPH-70012.bin/roms/bios/aethersx2/bios
+

Drastic (Nintendo DS)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
R2Save State
L2Load State
F1Open Menu
F2Switch One Screen and Dual Screen Layout
L3Change Screen Layout/Swap Screens
+

Dolphin-SA (Gamecube / Wii)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
F1+STARTQuit Game
F1+R2Save State
F1+L2Load State
F1+B(SOUTH)Screenshot
F1+Y(WEST)Change Internal Resolution
F1+A(EAST)Change Aspect Ratio
F1+X(NORTH)Show FPS
F1+D-Pad UpIncrease current state slot
F1+D-Pad DownDecrease current state slot
F1+R1Fast-Forward
+

Lime3DS (Nintendo 3DS)

+ + + + + + + + + + + + + +
Button ComboAction
F1+STARTQuit Game
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
F1+STARTQuit Game
F1+R1Save State
F1+L1Load State
F1+Y(WEST)Take Screenshot
F1+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
F1Open Menu
+

Yabasanshiro (Sega Saturn)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTOpen Menu
Y(WEST)A
A(EAST)B
B(SOUTH)C
X(NORTH)X
L1Y
R1Z
L2L
R2R
START+SELECT+R1Quit Game
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
B(SOUTH)Button 1
A(EAST)Button 2
X(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Open Beats of Rage (OpenBOR)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTConfirm
SELECTCancel
B(SOUTH)Attack 1
A(EAST)Jump
X(NORTH)Attack 2
Y(WEST)Special
+
+

note: pressing A on title screen will exit

+
+

Vice (Commodore 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTOpen Menu
SELECTDisplay Keyboard
B(SOUTH)Back
A(EAST)Fire / Confirm
L1Back
L2Assign Hotkey
L3Fire (Joy 2)
R1Confirm
R2Swap Joystick Port
+

Additional Notes:

+

Games will require keyboard key presses to progress through messages and to launch +(e.g. SPACE, RSTR [run/start], F3, F7).

+

SELECT to show onscreen keyboard, left analog/d-pad to move cursor, B to confirm

+

C= on keyboard resets the machine

+

L2 to assign highlighted key or menu function to gamepad button (save config to retain)

+

To cancel onscreen keyboard, move cursor to blank area and A/L1 to close keyboard +or click on X in top left corner of keyboard

+

Joystick can be assigned to port 1 or 2. R2 to switch ports. +port 1: [left analog] + [B = fire] +port 2: [right analog] + [L3 = fire].

+

To quit emulator, START, highlight Exit Emulator, B to confirm

+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
F1+Vol +Brightness Up
F1+Vol -Brightness Down
F2+Vol +Battery Status
F2+Vol -WIFI Toggle
+

Emulators

+ +

Notes

+

Installation

+

Download the latest S922X-Odroid_GOU version of ROCKNIX from the button below.

+
+

ROCKNIX must be flashed directly onto the RGB10 Max 3 Pro rather than an SD card. This is done by putting the device into recovery mode, per the manual by holding down R2, L2, and power. A video demonstation is shown here.

+
+

Latest Version +Latest Version

+

Troubleshooting

+

You cannot brick this device. If you cannot get into recovery mode, do the following:

+
    +
  • Download this recovery image.
  • +
  • Flash the image to a spare microSD card using Balena Etcher or similar.
  • +
  • Remove the back cover of the device (four screws).
  • +
  • Locate a small button on the back of the board (the side that's visible), near the right thumbstick.
  • +
  • While holding down the small button, power on the device.
  • +
+

The device should now be in recovery mode, ready to flash ROCKNIX (or other firmware) to the device.

+

If you find yourself doing this often, consider drilling a pinhole in the back cover so that the button can be accessed with a paperclip.

+

+

Community Videos

+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/powkiddy/rgb10-max-3/index.html b/devices/powkiddy/rgb10-max-3/index.html new file mode 100644 index 000000000..54ef2dc44 --- /dev/null +++ b/devices/powkiddy/rgb10-max-3/index.html @@ -0,0 +1,5813 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RGB10 Max 3 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Powkiddy RGB10 Max 3

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3566ARM Cortex-A55 (Quad-core) @ 1.8 GHzMali G52
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
5-inch 1280*7201 GB LPDDR4None2.4 GHz WiFi + BT (RTL8723DS)
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Tweaks

+

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

+

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

+
    +
  1. Inserting the OS SD card into a PC.
  2. +
  3. Open ROCKNIX partition, and go to the extlinux folder.
  4. +
  5. Open extlinux.conf text file.
  6. +
  7. Completely remove the line that starts with FDTOVERLAYS.
  8. +
  9. Now your device will boot with stock voltages.
  10. +
+

Features

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX can be run from an SD Card and an second SD card can be used to store games
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
LEDSupports selecting from a set of colors or turning the power LED off (choice persists through reboots)
Does not support other effects.
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (x2)Quit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+X(NORTH)Open RA Menu
SELECT+B(SOUTH)Reset Game
SELECT+Y(WEST)Show FPS
SELECT+A(EAST)Take Screenshot
SELECT+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (hold for 2sec)Quit Game
SELECT+R1Save State
SELECT+L1 (hold for 2sec)Load State
SELECT+Y(WEST)Show FPS
SELECT+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
SELECT+STARTQuit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+Y(WEST)Take Screenshot
SELECT+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
B(SOUTH)Button 1
A(EAST)Button 2
X(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
SELECT+Vol +Brightness Up
SELECT+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Emulators

+ +

Notes

+

Installation

+

Download the latest RK3566 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/powkiddy/rgb10/index.html b/devices/powkiddy/rgb10/index.html new file mode 100644 index 000000000..cd3873431 --- /dev/null +++ b/devices/powkiddy/rgb10/index.html @@ -0,0 +1,5450 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RGB10 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Powkiddy RGB10

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3326ARM Cortex-A35 (Quad-core) @ 1.3 GHzMali G31
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
3.5-inch 480*3201 GB DDR3LNoneNone
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (x2)Quit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+Y(NORTH)Open RA Menu
SELECT+A(SOUTH)Reset Game
SELECT+X(WEST)Show FPS
SELECT+B(EAST)Take Screenshot
SELECT+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
-(MINUS)+START (hold for 2sec)Quit Game
-(MINUS)+R1Save State
-(MINUS)+L1 (hold for 2sec)Load State
-(MINUS)+X(WEST)Show FPS
-(MINUS)+R2Fast-Forward
+(PLUS)+L1Select disc
+(PLUS)+R1Eject/Insert disc
+(PLUS)+D-Pad LeftDecrease save slot by 1
+(PLUS)+D-Pad RightIncrease save slot by 1
+(PLUS)+L2Configure buttons on virtual port 1
+(PLUS)+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Emulators

+ +

Notes

+

Installation

+

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/powkiddy/rgb10x/index.html b/devices/powkiddy/rgb10x/index.html new file mode 100644 index 000000000..ef2835450 --- /dev/null +++ b/devices/powkiddy/rgb10x/index.html @@ -0,0 +1,5450 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RGB10X - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Powkiddy RGB10X

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3326ARM Cortex-A35 (Quad-core) @ 1.3 GHzMali G31
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
3.5-inch 640*4801 GB DDR3LNoneNone
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (x2)Quit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+Y(NORTH)Open RA Menu
SELECT+A(SOUTH)Reset Game
SELECT+X(WEST)Show FPS
SELECT+B(EAST)Take Screenshot
SELECT+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
-(MINUS)+START (hold for 2sec)Quit Game
-(MINUS)+R1Save State
-(MINUS)+L1 (hold for 2sec)Load State
-(MINUS)+X(WEST)Show FPS
-(MINUS)+R2Fast-Forward
+(PLUS)+L1Select disc
+(PLUS)+R1Eject/Insert disc
+(PLUS)+D-Pad LeftDecrease save slot by 1
+(PLUS)+D-Pad RightIncrease save slot by 1
+(PLUS)+L2Configure buttons on virtual port 1
+(PLUS)+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Emulators

+ +

Notes

+

Installation

+

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/powkiddy/rgb20sx/index.html b/devices/powkiddy/rgb20sx/index.html new file mode 100644 index 000000000..4c254fbd5 --- /dev/null +++ b/devices/powkiddy/rgb20sx/index.html @@ -0,0 +1,5809 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RGB20SX - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Powkiddy RGB20SX

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3566ARM Cortex-A55 (Quad-core) @ 1.8 GHzMali G52
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
4-inch 720*7201 GB LPDDR4None2.4 GHz WiFi + BT (RTL8723DS)
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Tweaks

+

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

+

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

+
    +
  1. Inserting the OS SD card into a PC.
  2. +
  3. Open ROCKNIX partition, and go to the extlinux folder.
  4. +
  5. Open extlinux.conf text file.
  6. +
  7. Completely remove the line that starts with FDTOVERLAYS.
  8. +
  9. Now your device will boot with stock voltages.
  10. +
+

Features

+ + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX can be run from an SD Card and an second SD card can be used to store games
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (x2)Quit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+X(NORTH)Open RA Menu
SELECT+B(SOUTH)Reset Game
SELECT+Y(WEST)Show FPS
SELECT+A(EAST)Take Screenshot
SELECT+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (hold for 2sec)Quit Game
SELECT+R1Save State
SELECT+L1 (hold for 2sec)Load State
SELECT+Y(WEST)Show FPS
SELECT+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
SELECT+STARTQuit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+Y(WEST)Take Screenshot
SELECT+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
B(SOUTH)Button 1
A(EAST)Button 2
X(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
SELECT+Vol +Brightness Up
SELECT+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Emulators

+ +

Notes

+

Installation

+

Download the latest RK3566 version of ROCKNIX from the button below and follow the instructions listed on the Install page. Insert the SD card into the TF-OS slot of the device and power it on.

+

Latest Version +Latest Version

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/powkiddy/rgb30/index.html b/devices/powkiddy/rgb30/index.html new file mode 100644 index 000000000..85cd3a607 --- /dev/null +++ b/devices/powkiddy/rgb30/index.html @@ -0,0 +1,5871 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RGB30 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Powkiddy RGB30

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3566ARM Cortex-A55 (Quad-core) @ 1.8 GHzMali G52
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
4-inch 720*7201 GB LPDDR4None2.4/5 GHz WiFi + BT (RTL8821CS)
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Tweaks

+

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

+

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

+
    +
  1. Inserting the OS SD card into a PC.
  2. +
  3. Open ROCKNIX partition, and go to the extlinux folder.
  4. +
  5. Open extlinux.conf text file.
  6. +
  7. Completely remove the line that starts with FDTOVERLAYS.
  8. +
  9. Now your device will boot with stock voltages.
  10. +
+

Features

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX can be run from an SD Card and an second SD card can be used to store games
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
LEDSupports selecting from a set of colors or turning the power LED off (choice persists through reboots)
Does not support other effects.
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (x2)Quit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+X(NORTH)Open RA Menu
SELECT+B(SOUTH)Reset Game
SELECT+Y(WEST)Show FPS
SELECT+A(EAST)Take Screenshot
SELECT+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (hold for 2sec)Quit Game
SELECT+R1Save State
SELECT+L1 (hold for 2sec)Load State
SELECT+Y(WEST)Show FPS
SELECT+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
SELECT+STARTQuit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+Y(WEST)Take Screenshot
SELECT+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
B(SOUTH)Button 1
A(EAST)Button 2
X(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
SELECT+Vol +Brightness Up
SELECT+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Emulators

+ +

Notes

+

Installation

+

Download the latest RK3566 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+

Video Guide

+
+

Courtesy of @RetroGameCorps

+
+ + +

Download the latest RK3566 version of ROCKNIX from the button below and follow the instructions listed on the Install page. Insert the SD card into the TF-OS slot of the device and power it on.

+

Latest Version +Latest Version

+

Community Videos

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/powkiddy/rk2023/index.html b/devices/powkiddy/rk2023/index.html new file mode 100644 index 000000000..8d30ed824 --- /dev/null +++ b/devices/powkiddy/rk2023/index.html @@ -0,0 +1,5850 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RK2023 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Powkiddy RK2023

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3566ARM Cortex-A55 (Quad-core) @ 1.8 GHzMali G52
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
3.5-inch 640*4801 GB LPDDR4NoneOptional 2.4/5 GHz WiFi + BT
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Tweaks

+

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

+

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

+
    +
  1. Inserting the OS SD card into a PC.
  2. +
  3. Open ROCKNIX partition, and go to the extlinux folder.
  4. +
  5. Open extlinux.conf text file.
  6. +
  7. Completely remove the line that starts with FDTOVERLAYS.
  8. +
  9. Now your device will boot with stock voltages.
  10. +
+

Features

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX can be run from an SD Card and an second SD card can be used to store games
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
LEDSupports selecting from a set of colors or turning the power LED off (choice persists through reboots)
Does not support other effects.
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (x2)Quit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+X(NORTH)Open RA Menu
SELECT+B(SOUTH)Reset Game
SELECT+Y(WEST)Show FPS
SELECT+A(EAST)Take Screenshot
SELECT+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (hold for 2sec)Quit Game
SELECT+R1Save State
SELECT+L1 (hold for 2sec)Load State
SELECT+Y(WEST)Show FPS
SELECT+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
SELECT+STARTQuit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+Y(WEST)Take Screenshot
SELECT+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
B(SOUTH)Button 1
A(EAST)Button 2
X(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
SELECT+Vol +Brightness Up
SELECT+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Emulators

+ +

Notes

+

Installation

+

Download the latest RK3566 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+

Community Videos

+ + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/powkiddy/x35s/index.html b/devices/powkiddy/x35s/index.html new file mode 100644 index 000000000..5ded5614d --- /dev/null +++ b/devices/powkiddy/x35s/index.html @@ -0,0 +1,5802 @@ + + + + + + + + + + + + + + + + + + + + + + + + + X35S - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Powkiddy X35S

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3566ARM Cortex-A55 (Quad-core) @ 1.8 GHzMali G52
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
3.5-inch 640*4801 GB LPDDR4X4 GBNone
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Tweaks

+

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

+

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

+
    +
  1. Inserting the OS SD card into a PC.
  2. +
  3. Open ROCKNIX partition, and go to the extlinux folder.
  4. +
  5. Open extlinux.conf text file.
  6. +
  7. Completely remove the line that starts with FDTOVERLAYS.
  8. +
  9. Now your device will boot with stock voltages.
  10. +
+

Features

+ + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX can be installed to the eMMC or run from an SD Card, and a second SD card can be used to store games
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (x2)Quit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+X(NORTH)Open RA Menu
SELECT+B(SOUTH)Reset Game
SELECT+Y(WEST)Show FPS
SELECT+A(EAST)Take Screenshot
SELECT+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (hold for 2sec)Quit Game
SELECT+R1Save State
SELECT+L1 (hold for 2sec)Load State
SELECT+Y(WEST)Show FPS
SELECT+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
SELECT+STARTQuit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+Y(WEST)Take Screenshot
SELECT+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
B(SOUTH)Button 1
A(EAST)Button 2
X(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
SELECT+Vol +Brightness Up
SELECT+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Emulators

+ +

Notes

+

Installation

+

Download the latest RK3566-X55 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Once you have burned the image to an SD card, you will need to modify the file extlinux/extlinux.conf on the FAT partition, and change x55 to x35s on the FDT line.

+

Latest Version +Latest Version

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/powkiddy/x55/index.html b/devices/powkiddy/x55/index.html new file mode 100644 index 000000000..adad230df --- /dev/null +++ b/devices/powkiddy/x55/index.html @@ -0,0 +1,5889 @@ + + + + + + + + + + + + + + + + + + + + + + + + + X55 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Powkiddy X55

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3566ARM Cortex-A55 (Quad-core) @ 1.8 GHzMali G52
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
5.5-inch 1280*7202 GB LPDDR4X (except some revisions which only have 1 GB)8 GB (except early revisions)2.4/5 GHz WiFi + BT (8821CS)
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Tweaks

+

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

+

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

+
    +
  1. Inserting the OS SD card into a PC.
  2. +
  3. Open ROCKNIX partition, and go to the extlinux folder.
  4. +
  5. Open extlinux.conf text file.
  6. +
  7. Completely remove the line that starts with FDTOVERLAYS.
  8. +
  9. Now your device will boot with stock voltages.
  10. +
+

Features

+ + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
StorageROCKNIX can be installed to the emmc or run from an SD Card, and an second SD card can be used to store games
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (x2)Quit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+X(NORTH)Open RA Menu
SELECT+B(SOUTH)Reset Game
SELECT+Y(WEST)Show FPS
SELECT+A(EAST)Take Screenshot
SELECT+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (hold for 2sec)Quit Game
SELECT+R1Save State
SELECT+L1 (hold for 2sec)Load State
SELECT+Y(WEST)Show FPS
SELECT+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
SELECT+STARTQuit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+Y(WEST)Take Screenshot
SELECT+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Hypseus-singe (Daphne)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+STARTQuit Game
SELECTCoin
STARTStart
B(SOUTH)Button 1
A(EAST)Button 2
X(NORTH)Button 3
+

Notes:

+
    +
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • +
  • +

    For example the following would assign quit to L1 and pause to R1

    +
    [KEYBOARD]
    +KEY_QUIT = SDLK_ESCAPE 0 5
    +KEY_PAUSE = SDLK_p 0 6
    +
    +
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
SELECT+Vol +Brightness Up
SELECT+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Emulators

+ +

Notes

+

Installation

+

Download the latest RK3566-X55 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+

Screen Calibration

+

The Powkiddy X55 screen is miscalibrated from the factory. While there's no universal fix (yet) this issue can greatly be mitigated by using a Retroarch Shader. Instructions for doing so are listed below:

+
    +
  1. Start a game
  2. +
  3. Open the "Quick Menu" in Retroarch by pressing both joysticks
  4. +
  5. Navigate to "Shaders"
  6. +
  7. Turn "Video Shader" to "ON"
  8. +
  9. Navigate to "Load Preset"
  10. +
  11. Select "Misc" -> "Image Adjustment"
  12. +
  13. Go to "Shader Parameters" and change the following parameters:
  14. +
  15. Target Gamma -> 2.40
  16. +
  17. Monitor Gamma 2.00
  18. +
  19. Saturation -> 1.50
  20. +
  21. Contrast -> 1.15
  22. +
  23. Black Level -> -0.10
  24. +
  25. Navigate back to the shader menu and pick "Save Preset"
  26. +
  27. Select Either:
  28. +
  29. "Save Global Preset" to have this as the default for all Retroarch cores
  30. +
  31. "Save Core Preset" to have this as the default for a specific system (e.g all PSX games)
  32. +
  33. "Save Content Preset" to have this as the default for a specific directory (e.g all roms in a "RPG" directory)
  34. +
  35. "Save Game Preset" to have this as the default for the specific game that you're running
  36. +
+

The settings at 7 are just a proposal, you might want to experiment a bit to get something that matches your preferences but they should serve as a great starting point.

+

As a bonus, adjust the "Horizontal Overscan %" and "Vertical Overscan %" settings to deal with e.g PSX games that have black borders (such as Crash Tag Team Racing and Spyro).

+

The black bars on the sides when displaying 4:3 content will not be effected by shaders and might thus look lighter than the game image. If you find this distracting a (lighter) overlay will hide this issue.

+

Community Videos

+ + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/powkiddy/xu10/index.html b/devices/powkiddy/xu10/index.html new file mode 100644 index 000000000..1c38074aa --- /dev/null +++ b/devices/powkiddy/xu10/index.html @@ -0,0 +1,5310 @@ + + + + + + + + + + + + + + + + + + + + + + + + + XU10 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Powkiddy XU10

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3326ARM Cortex-A35 (Quad-core) @ 1.3 GHzMali G31
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
3.5-inch 640*4801 GB DDR4NoneNone
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Features

+ + + + + + + + + + + + + +
Feature                Notes
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
+

Emulators

+ +

Notes

+

Installation

+

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/retroid/retroid-pocket-5/index.html b/devices/retroid/retroid-pocket-5/index.html new file mode 100644 index 000000000..150c02464 --- /dev/null +++ b/devices/retroid/retroid-pocket-5/index.html @@ -0,0 +1,5790 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Retroid Pocket 5 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Retroid Pocket 5

+

+

Overview

+ + + + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverVulkan driverInterface
Retroid Pocket 5Qualcomm SD865Mainline LinuxFreedrenoTurnipSway + Emulation Station
+

Features

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
FanCan be set globally, per system or per game.
Joystick LEDSSupports selecting from a set of colors, battery level status,
or turning the joystick LEDS off.
RumbleCan be turned on or off in Emulation Station under
Controller & Bluetooth Settings > Enable Rumble
+

Controls

+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
HOME+Vol +Brightness Up
HOME+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
HOME+START (x2)Quit Game
HOME+R1Save State
HOME+L1Load State
HOME+X(NORTH)Open RA Menu
HOME+B(SOUTH)Reset Game
HOME+Y(WEST)Show FPS
HOME+A(EAST)Take Screenshot
HOME+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
HOME+STARTQuit Game
HOME+R1Save State
HOME+L1Load State
HOME+Y(WEST)Take Screenshot
HOME+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Dolphin-QT (Gamecube / Wii)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
HOME+STARTQuit Game
HOME+R1Save State
HOME+L1Load State
HOME+B(SOUTH)Screenshot
HOME+A(EAST)Change Aspect Ratio
HOME+D-Pad UpIncrease current state slot
HOME+D-Pad DownDecrease current state slot
HOME+R2Increase Emulator Speed
HOME+L2Decrease Emulator Speed
+

Dolphin-SA (Gamecube / Wii)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
HOME+STARTQuit Game
HOME+R2Save State
HOME+L2Load State
HOME+B(SOUTH)Screenshot
HOME+Y(WEST)Change Internal Resolution
HOME+A(EAST)Change Aspect Ratio
HOME+X(NORTH)Show FPS
HOME+D-Pad UpIncrease current state slot
HOME+D-Pad DownDecrease current state slot
HOME+R1Fast-Forward
+

AetherSX2 (PS2)

+ + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
HOME+R1Save State
HOME+L1Load State
HOME+X(NORTH)Open Menu
+ + + + + + + + + + + + + +
Required Bios FilesPath
SCPH-70012.bin/roms/bios/aethersx2/bios
+

Xemu (XBOX)

+ + + + + + + + + + + + + +
Button ComboAction
HOMEOpen Menu
+ + + + + + + + + + + + + + + + + +
Required Bios FilesPath
Complex_4627v1.03.bin/roms/bios/xemu/bios
mcpx_1.0.bin/roms/bios/xemu/bios
+

Additional References

+ +

Community Videos

+

| |

+ + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/retroid/retroid-pocket-mini/index.html b/devices/retroid/retroid-pocket-mini/index.html new file mode 100644 index 000000000..15b1a12d2 --- /dev/null +++ b/devices/retroid/retroid-pocket-mini/index.html @@ -0,0 +1,5790 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Retroid Pocket Mini - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Retroid Pocket Mini

+

+

Overview

+ + + + + + + + + + + + + + + + + + + + + +
DeviceCPU / ArchitectureKernelGL driverVulkan driverInterface
Retroid Pocket MiniQualcomm SD865Mainline LinuxFreedrenoTurnipSway + Emulation Station
+

Features

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Feature                Notes
WifiCan be turned on in Emulation Station under Main Menu > Network Settings
BluetoothSupports bluetooth audio and controllers
FanCan be set globally, per system or per game.
Joystick LEDSSupports selecting from a set of colors, battery level status,
or turning the joystick LEDS off.
RumbleCan be turned on or off in Emulation Station under
Controller & Bluetooth Settings > Enable Rumble
+

Controls

+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
HOME+Vol +Brightness Up
HOME+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
HOME+START (x2)Quit Game
HOME+R1Save State
HOME+L1Load State
HOME+X(NORTH)Open RA Menu
HOME+B(SOUTH)Reset Game
HOME+Y(WEST)Show FPS
HOME+A(EAST)Take Screenshot
HOME+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mupen64Plus-SA (Nintendo 64)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
B(SOUTH)A
Y(WEST)B
Right Analog UpC Up
Right Analog DownC Down
Right Analog LeftC Left
Right Analog RightC Right
L2Z
L1L
R1R
HOME+STARTQuit Game
HOME+R1Save State
HOME+L1Load State
HOME+Y(WEST)Take Screenshot
HOME+B(SOUTH)Reset Game
+

Notes:

+
    +
  • Z and L button assignment can be changed directly in EmulationStation
      +
    • Highlight the game and press X(NORTH)
    • +
    • Select ADVANCED GAME OPTIONS
    • +
    • Set EMULATOR to MUPEN64PLUSSA
    • +
    • Then change INPUT ONFIGURATION
        +
      • Default: L1 = L, L2 = Z
      • +
      • Z & L SWAP: L1 = Z, L2 = L
      • +
      +
    • +
    +
  • +
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
  • +
+

PPSSPP-SA (PSP)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
STARTStart
SELECTSelect
A(EAST)Circle
B(SOUTH)Cross
X(NORTH)Triangle
Y(WEST)Square
L1L
R1R
R2Save State
L2Load State
L3Open Menu
+

Dolphin-QT (Gamecube / Wii)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
HOME+STARTQuit Game
HOME+R1Save State
HOME+L1Load State
HOME+B(SOUTH)Screenshot
HOME+A(EAST)Change Aspect Ratio
HOME+D-Pad UpIncrease current state slot
HOME+D-Pad DownDecrease current state slot
HOME+R2Increase Emulator Speed
HOME+L2Decrease Emulator Speed
+

Dolphin-SA (Gamecube / Wii)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
HOME+STARTQuit Game
HOME+R2Save State
HOME+L2Load State
HOME+B(SOUTH)Screenshot
HOME+Y(WEST)Change Internal Resolution
HOME+A(EAST)Change Aspect Ratio
HOME+X(NORTH)Show FPS
HOME+D-Pad UpIncrease current state slot
HOME+D-Pad DownDecrease current state slot
HOME+R1Fast-Forward
+

AetherSX2 (PS2)

+ + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
HOME+R1Save State
HOME+L1Load State
HOME+X(NORTH)Open Menu
+ + + + + + + + + + + + + +
Required Bios FilesPath
SCPH-70012.bin/roms/bios/aethersx2/bios
+

Xemu (XBOX)

+ + + + + + + + + + + + + +
Button ComboAction
HOMEOpen Menu
+ + + + + + + + + + + + + + + + + +
Required Bios FilesPath
Complex_4627v1.03.bin/roms/bios/xemu/bios
mcpx_1.0.bin/roms/bios/xemu/bios
+

Additional References

+ +

Community Videos

+

| |

+ + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/unbranded/game-console-r33s/index.html b/devices/unbranded/game-console-r33s/index.html new file mode 100644 index 000000000..e7ac88912 --- /dev/null +++ b/devices/unbranded/game-console-r33s/index.html @@ -0,0 +1,5499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Game Console R33S - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Game Console R33S

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3326ARM Cortex-A35 (Quad-core) @ 1.3 GHzMali G31
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
3.5-inch 640*4801 GB (some revisions 512 MB) DDR3NoneNone
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (x2)Quit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+Y(NORTH)Open RA Menu
SELECT+A(SOUTH)Reset Game
SELECT+X(WEST)Show FPS
SELECT+B(EAST)Take Screenshot
SELECT+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (hold for 2sec)Quit Game
SELECT+R1Save State
SELECT+L1 (hold for 2sec)Load State
SELECT+X(WEST)Show FPS
SELECT+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
SELECT+Vol +Brightness Up
SELECT+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Emulators

+ +

Notes

+

Installation

+

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/devices/unbranded/game-console-r35s-r36s/index.html b/devices/unbranded/game-console-r35s-r36s/index.html new file mode 100644 index 000000000..5e8a160ff --- /dev/null +++ b/devices/unbranded/game-console-r35s-r36s/index.html @@ -0,0 +1,5536 @@ + + + + + + + + + + + + + + + + + + + + + + + Game Console R35S/R36S - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Game Console R35S/R36S

+

+

Overview

+

Hardware

+ + + + + + + + + + + + + + + +
SoCCPUGPU
Rockchip RK3326ARM Cortex-A35 (Quad-core) @ 1.3 GHzMali G31
+ + + + + + + + + + + + + + + + + +
DisplayRAMeMMCConnectivity
3.5-inch 640*4801 GB DDR3NoneNone
+

Software

+ + + + + + + + + + + + + + + + + +
KernelGPU driversCompositorInterface
Mainline Linuxlibmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1)SwayEmulation Station
+

Controls

+

RetroArch Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (x2)Quit Game
SELECT+R1Save State
SELECT+L1Load State
SELECT+Y(NORTH)Open RA Menu
SELECT+A(SOUTH)Reset Game
SELECT+X(WEST)Show FPS
SELECT+B(EAST)Take Screenshot
SELECT+R2Fast-Forward
+

Notes:

+
    +
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the "AUTOCONFIGURE RETROARCH HOTKEYS" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
  • +
+

Mednafen Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
SELECT+START (hold for 2sec)Quit Game
SELECT+R1Save State
SELECT+L1 (hold for 2sec)Load State
SELECT+X(WEST)Show FPS
SELECT+R2Fast-Forward
START+L1Select disc
START+R1Eject/Insert disc
START+D-Pad LeftDecrease save slot by 1
START+D-Pad RightIncrease save slot by 1
START+L2Configure buttons on virtual port 1
START+R2Insert coin
+

Notes:

+
    +
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
  • +
+

Global Hotkeys

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Button ComboAction
L1+START+SELECTExit Emulator / Application
SELECT+Vol +Brightness Up
SELECT+Vol -Brightness Down
START+Vol +Battery Status
START+Vol -WIFI Toggle
+

Emulators

+ +

Notes

+

Installation

+

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

+

Latest Version +Latest Version

+

New displays (R36s of year 2024)

+

Recent R36s have new displays that need some extra actions to work.

+

The simplest way so far is:

+
    +
  • Determine which panel do you have (or just try every option until it works)
  • +
  • Download a mipi-panel.dtbo.r36s-panel* there
  • +
  • Rename the downloaded file and put it to a boot (ROCKNIX) partition as overlays/mipi-panel.dtbo
  • +
+

These files mostly have just basic refresh rate (77.378 FPS) (panel4 has 50, 60, 75 because we tested it)

+

If you have an original .dtb file, you can generate a mipi-panel.dtbo from it.
+Assuming you have an SSH access and you have scp'd the original dtb as rk3326-r35s-linux.dtb, the process would be as follows: +

RK3326:~ # mount -o remount,rw /flash
+RK3326:~ # mkdir -p /flash/overlays/
+RK3326:~ # ### Be not afraid! importpanel.py may run for a minute or two for some panels
+RK3326:~ # /usr/libexec/generic-dsi/importpanel.py rk3326-r35s-linux.dtb -O /flash/overlays/mipi-panel.dtbo
+RK3326:~ # sync; mount -o remount,ro /flash/
+
+Here we just make an overlays directory writable, then call a script that does all the importing stuff.
+Feel free to run this script on your PC, modify it and experiment with panel timings.

+

This script adds a bunch of potentially useful refresh rates, but we have very few knowledge on which modes work well.
+Please check them with wlr-randr or with game configuration and tell us which modes work with your panel.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/donations/index.html b/donations/index.html new file mode 100644 index 000000000..af9b5880c --- /dev/null +++ b/donations/index.html @@ -0,0 +1,5191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Donations - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Donations

+

Thank you for your interest in donating to ROCKNIX! We don't accept financial contributions. If you would like to volunteer or contribute in some way to our project, please read our Code of Conduct and Contributing to ROCKNIX guides. You are also encouraged to join us on Discord to learn and collaborate with us.

+

Why Don't You Accept Donations?

+
    +
  • As an Open Source project our operational expenses are fairly low, so to us a donation of your time is much more valuable ❤
  • +
  • Open Source development is not considered charitable activity in some parts of the world, including the United States. Accepting donations can create unnecessary complexity for the project, and for the person donating.
  • +
+

Build Infrastructure

+

Our GitHub runners are the nodes we use to build and push releases to GitHub. Trillian is our primary development host, Deepthought is our primary release builder. Node specs can be found in the table below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCPUCores/ThreadsRAMDiskUsage
deepthoughtRyzen 7 5800H8c/16t32GB2TB NVMe SSDGitHub Runner
trillianRyzen 7 5800H8c/16t32GB2TB NVMe SSDLocal Dev
+

Project and Web Hosting

+

GitHub serves our release packages, as well as our WIKI. Our domain, rocknix.org is hosted with GitHub pages and powered by MkDocs + Material. Currently, ROCKNIX does not take advantage of any functionality that requires a paid GitHub plan.

+ + + + + + + + + + + + + + + + + + + + +
ProjectURLComment
ROCKNIXgithub.com/ROCKNIX/distributionProject site, Stable Release Repository.
Documentationrocknix.orgROCKNIX Wiki
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/faqs/index.html b/faqs/index.html new file mode 100644 index 000000000..8a8486369 --- /dev/null +++ b/faqs/index.html @@ -0,0 +1,5477 @@ + + + + + + + + + + + + + + + + + + + + + + + + + FAQs - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Frequently Asked Questions

+

About ROCKNIX

+

Does ROCKNIX offer any formal support?

+

No. ROCKNIX is something that we develop for fun, it is provided as-is. There are a variety of avenues to seek community help, but this is a tinkerer's distribution so you will need to get your hands dirty to solve any issues.

+

Do you plan to add additional ports, software, or emulators?

+

We are a community developed distribution, and we believe that it is the responsibility of the person who wants a new feature to develop and contribute that feature. If you would like to add something to ROCKNIX, pull requests are welcomed. Please review our code of conduct, our contributing guidelines, and our build guide before submitting your first pull request.

+

Do you support X device? Will you add support for X device?

+

You can find the list of currently supported devices here: Devices

+

If the device you are interested in isn't in that list then no one has contributed the work to add support for it yet. Why? To add support for a device we (1) need to be interested in adding support for it 😊 and (2) need to have direct access to the device.

+

That said, anyone who is interested can submit updates to ROCKNIX to add support for a device they care about! If you are interested in adding support for a new device please start here: Contribute

+

Licensing ROCKNIX for redistribution

+

ROCKNIX utilizes a non-commercial CC BY-NC-SA 4.0 copyleft license on our branding which is intended to prevent abuse of our work. Device Makers and others who would like to bundle on devices may not do so without our express permission.

+
Selling ROCKNIX
+

The ROCKNIX brand is licensed for non-commercial use only. It is not allowed to be sold or included as an up charge in any form what-so-ever. Period. This is not negotiable.

+

What if you stop working on ROCKNIX?

+

We don't expect that to happen, however ROCKNIX is an Open Source project hosted here on GitHub which means the source code is readily available for anyone in the world to pick up and continue where we left off. Our license model(GPLv2) license when no other license applies.) allows for this to happen by providing and encouraging redistribution (freedom 2) and the right to distribute a modified version (freedom 3). ROCKNIX only prohibits commercial use through our branding which is licensed by the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

+

Using ROCKNIX

+

Which emulators and game engines are supported by ROCKNIX?

+

Emulators and game engines are configured on a per device basis and are automatically documented at build time. Documentation can be found at the following URL: Per Device Documentation

+

How do I log in over SSH or Samba?

+

External services (SSH and Samba) are disabled by default in release builds, and can be enabled in the Network Settings menu. When enabled, the SSH/Samba username is "root". The root password is regenerated by default after each reboot, and can be found in the System Settings menu. You can optionally provide your own root password if you wish.

+

If logging in to Samba fails on Windows with the message, "The user name or password is incorrect", see these links for a solution (Windows 10 Pro, Windows 10 Home).

+

Please also see the Networking and Adding Games to ROCKNIX pages for additional details.

+

Sound suddenly stopped working on my device!

+

Log in over ssh, and run the following steps. +

systemctl stop pipewire-pulse pipewire-pulse.socket pipewire pipewire.socket wireplumber
+rm -rf /storage/.local/state /storage/.config/pulse
+reboot
+

+

EmuStation displays duplicate game titles. How can I disable a file extension to remove the duplicates? (e.g. display only .cue and don't display .bin files for PlayStation)

+
    +
  • Within EmuStation, select the relevant game system (e.g. PlayStation)
  • +
  • Press Select to View Options
  • +
  • In View Options section, choose View Customisation
  • +
  • Under File Extensions, deselect any file extensions that are not required (e.g. deselect .bin for PlayStation when also using .cue files)
  • +
+

How do I edit es_systems.cfg (for example, to modify the list of systems in EmuStation, add a custom core or script, or change the order that systems are displayed)?

+
    +
  • Delete the ~/.config/emulationstation/es_systems.cfg symlink.
  • +
  • Copy the custom version of es_systems.cfg to ~/.config/emulationstation.
  • +
  • Stop the UI service: systemctl stop ${UI_SERVICE}
  • +
  • Restart the UI service to use the custom version: systemctl start ${UI_SERVICE}
  • +
+
+

Note: System updates will overwrite it, custom settings will be preserved as last_es_systems.cfg.

+
+

Where do I put bios files and files and Retroarch system files

+
    +
  • Bios files go in /storage/roms/bios
  • +
  • Please see the corresponding system documentation in the wiki for required files for each system.
  • +
+

Where do I put music files to enable background music within emulationstation (while browsing my game library)?

+
    +
  • Music files should be added to /storage/roms/BGM
  • +
+

My game has slowdown and stuttering issues. What can I do to improve performance?

+

First make sure you don't have a TDP configured that is too low for your emulator to function correctly. Next, try adjusting settings within the emulator, either retroarch core or standalone emulator configuration menu.

+

Where are log files stored?

+

Log files can be found in /var/log/

+

Various logs are generated, including

+
    +
  • EmuStation logs es_log.txt (cumulative log of all ES activity), es_launch_stdout.log (last emulator launched from ES) and es_launch_stderr.log (blank if there wasn't an error for the last emulator launch)
  • +
  • Execution log exec.log (generic execution log that indicates what was last executed, including the command to launch the emulator) e.g. for gzdoom launch of heretic.doom runemu.sh: Executing /usr/bin/bash start_gzdoom.sh /storage/roms/doom/heretic.doom
  • +
  • Boot log boot.log (Output from autostart during system startup)
  • +
  • Emulator-specific log (for non-retroarch emulators) e.g. gzdoom.log is the log specific to gzdoom to indicate whether there is any issue within the emulator when launching heretic.doom, noted above
  • +
  • Retroarch logs are turned off by default, but can be enabled within Retroarch (Tools > Retroarch: Settings > Logging > Log to a File), are stored in /var/log/retroarch and are quite detailed, so should provide sufficient detail to identify missing roms within a game's romset, configuration issues and other errors that prevent games from working
  • +
+
+

Note: Retroarch uses a shared config file, so logging can be enabled within 64bit or 32bit and it will be enabled for all Retroarch cores

+
+

I have a device with a single microsd and I can't see the games partition in Windows or macOS.

+

ROCKNIX does not create an ExFAT partition on the boot device, and expands the full partition using ext4. You can sync files to the device over the network or by loading your files onto a EXT4, ExFAT, or FAT32 formatted usb stick and copy them with FileMan or over ssh. Please see the Adding Games page for more details.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 000000000..6e71bcf30 --- /dev/null +++ b/index.html @@ -0,0 +1,5286 @@ + + + + + + + + + + + + + + + + + + + + + + + ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + +
+ +

Welcome to the ROCKNIX Wiki

+

Latest Version Activity Pull Requests Community +Latest Version Activity Pull Requests Community

+

Just Enough Linux Operating System (ROCKNIX) is an immutable Linux distribution for handheld gaming devices focused on retro gaming emulation. It is developed by a small community of enthusiasts and our goal is to produce an operating system that has the features and capabilities we need and to have fun as we develop it.

+

Features

+
    +
  • Integrated cross-device local and remote network play.
  • +
  • In-game touch support on supported devices.
  • +
  • Fine grain control for battery life or performance.
  • +
  • Includes support for playing Music and Video.
  • +
  • Bluetooth audio and controller support.
  • +
  • Support for HDMI audio and video out, and USB audio.
  • +
  • Device to device and device to cloud sync with Syncthing and rclone.
  • +
  • VPN support with Wireguard, Tailscale, and ZeroTier.
  • +
  • Includes built-in support for scraping and retroachievements.
  • +
+

Preview

+ + + + + + + + + +
+ +

Community

+

The ROCKNIX community utilizes Discord for discussion, if you would like to join us please use this link:   Discord

+

Licenses

+

ROCKNIX is a Linux distribution that is made up of many open-source components. Components are provided under their respective licenses. This distribution includes components licensed for non-commercial use only.

+

ROCKNIX Branding

+

ROCKNIX branding and images are licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

+

You are free to:

+
    +
  • Share: copy and redistribute the material in any medium or format
  • +
  • Adapt: remix, transform, and build upon the material
  • +
+

Under the following terms:

+
    +
  • Attribution: You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
  • +
  • NonCommercial: You may not use the material for commercial purposes.
  • +
  • ShareAlike: If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
  • +
+

ROCKNIX Software

+

Copyright 2024 ROCKNIX (https://github.com/ROCKNIX)

+

Original software and scripts developed by the ROCKNIX team are licensed under the terms of the GNU GPL Version 2. The full license can be found in this project's licenses folder.

+

Bundled Works

+

All other software is provided under each component's respective license. These licenses can be found in the software sources or in this project's licenses folder. Modifications to bundled software and scripts by the ROCKNIX team are licensed under the terms of the software being modified.

+

Credits

+

Like any Linux distribution, this project is not the work of one person. It is the work of many persons all over the world who have developed the open source bits without which this project could not exist. Special thanks to CoreELEC, LibreELEC, and to developers and contributors across the open source community.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/play/add-games/index.html b/play/add-games/index.html new file mode 100644 index 000000000..7e6a0449c --- /dev/null +++ b/play/add-games/index.html @@ -0,0 +1,5763 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Add Games - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Adding Games to ROCKNIX

+

ROCKNIX has a few options for adding games and the option you choose will depend on the device you have and its available functionality (For example, some devices do not have networking capabilites so those devices will not be able to use the network transfer option).

+

This page will aim to document all possible options and indicate when you might use a given one over another.

+
+

For details on which specific files each system requires please see the corresponding pages in the systems section of this wiki.

+
+

Storage Modes

+

ROCKNIX has support for using internal and external storage (microsd) for games. To make games available in the OS we provide different features based on the capability of the filesystem that you are using. To support our storage modes ROCKNIX nests games into a directory on your games card called "roms". All games found in this path will be available in the OS.

+

Merged Storage

+

When using a microsd that is formatted as Ext4 (Linux), ROCKNIX will present users with the ability to merge both the internal and external storage together allowing users to use both devices to store games. This mode has two preferences, external (default), and internal.

+
    +
  • Preference External
  • +
  • This mode will save anything written to /storage/roms to your external microsd (/storage/games-external/roms).
  • +
  • Preference Internal
  • +
  • This mode will save anything written to /storage/roms to your internal storage (/storage/games-internal/roms).
  • +
+
+

Note: Merged Storage is disabled by default.

+
+

Simple Storage

+

When Merged Storage is disabled, or when you are using ExFAT or FAT32, ROCKNIX will mount your external card to /storage/games-external and make the content of /storage/games-external/roms available at /storage/roms.

+

Troubleshooting

+
    +
  • It is possible to create a conflict which will prevent games from being displayed in EmulationStation. This can usually be resolved by executing /usr/bin/cleanup_overlay. Note: This will reboot your device.
  • +
  • If no game folders appear in /storage/roms, make sure you have a roms directory on your microsd and reboot.
  • +
+

Option 1: Network Transfer

+

Network transfer can be used on any device that can connect to the internet (this includes devices with native networking capabilites and ones where networking can be added through an external dongle).

+

This option first requires you to set up networking on your device. Please see Networking for details. Once you have completed those steps make note of your IP Address in the Network Settings menu.

+

In addition to your IP you will also need your root password, which is rocknix by default.
+You can change it in the Main Menu by pressing START in EmulationStation and navigating to System Settings/Security.

+

HTTP

+

Enabling Simple HTTP Server in Network settings lets you upload and download files by entering your device's IP address in any browser on the local network (or on VPN IP, see VPN section for details). The username is root and the password (rocknix by default) can be found in Root Password in the Security menu.

+

SMB

+
    +
  • +

    Windows:

    +
      +
    • To avoid typing device name/address it is recommended to make your network connection "Private".
      + Windows trusts "Private" connections and shows available shares in "Network".
      + In Settings, open "Network % internet", click on connection's Properties and switch to "Private" +
      Screenshot: Making network Private in Windows + +
    • +
    • With "Private" connection you will likely see your device in Windows Explorer's "Network" +
      Screenshot: Handheld in Windows network + +
    • +
    • If you don't see your device (if you chose to stay with "Public" network or if something went wrong) you can access your device by hostname.
      + See (or set as you like) your device hostname in START/Network settings (let it be RK3566 as on screenshots).
      + In Explorer address string type \\[DEVICE HOSTNAME].local (replace [DEVICE HOSTNAME] with proper name) (\\RK3566.local on screenshot) +
      Screenshot: Open network share by hostname in Windows + + +
    • +
    • If event that fails, don't worry. You can access your device by IP address.
      + open a Windows Explorer window, and type in \\[YOUR IP ADDRESS]; replace [YOUR IP ADDRESS] with the IP Address seen in the Network Settings menu.
    • +
    • You may be prompted for a username and password.
    • +
    • The username is root and your password (rocknix by default) can be found in the System Settings/Security menu.
    • +
    +
  • +
  • +

    MacOS:

    +
      +
    • You will likely just see your device in "Shared" section of Finder +
      Screenshot: Handheld in Mac OS Finder + +
    • +
    • +

      If that fails, you can connect manually by hostname or IP.
      + Open Finder and press Cmd+K (or select Go > Connect to Server from the top menu). + In the address bar that appears, type smb://[ADDRESS]; replace [ADDRESS] with hostname with .local suffix or with the IP Address seen in the Network Settings menu. +

      Screenshot: Open network share by hostname in Mac OS + + +

      +
    • +
    • +

      You may be prompted for a username and password.

      +
    • +
    • For name enter root and your password (rocknix by default) can be found in the System Settings/Security menu.
    • +
    +
  • +
+

SFTP/SSH

+

Using your SFTP program of choice; set up an SFTP connection to the IP Address seen in the Network Settings menu.
+Make sure the Port is set to 22.
+The username is root and your password (rocknix by default) can be found in the System Settings/Security menu.

+

You can also transfer files using the scp command line tool, which is part of OpenSSH and is included with recent versions of Windows and Linux

+

After connecting

+
    +
  • You will see a list of folders after you have connected via network.
  • +
  • Open the roms folder and you will see a list of folders where games and bios files can be placed. (Please see the systems section of the wiki for details on where each system's files should be placed)
  • +
  • After you have added your games you can get them to display in EmulationStation by pressing START to open the Main Menu, then open Game Settings then select Update Gamelists under the Tools header.
  • +
+

Option 2: USB Gaget Modes

+

Many devices can be USB gadgets allowing you to transfer files over USB cable.

+
    +
  • RK3326 has only one data USB port, so you need to connect cable to "OTG" port.
    + Some older Powkiddy devices (ones with wi-fi switch) have built-in USB hub making gadget impossible.
  • +
  • On other devices use the port you use to charge the console ("DC")
  • +
+

Network gadget (former ECM)

+

This mode is most useful. You get a network connection between your PC and console, and then just use Samba or SFTP.

+
    +
  • +

    In EmulationStation's Network Settings: Enable Samba (Windows shares) and/or SSH, switch gadget mode to "network".
    + Don't forget to exit settings to apply changes! +
    +

    Screenshot: Needed options configured + +
    +

    +
  • +
  • +

    Now your PC should see a new network connection. Check it out in PC's network settings! + Here "Ethernet 5" with "No internet" is a console gadget connection.
    + Initially Properties will say "Public network". +
    +

    Screenshot: New gadget connection in Windows + +
    +

    +
  • +
  • +

    Windows only: You need to change your network profile type to "Private" for easier access.
    + Click on Properties and switch to "Private" +
    +

    Screenshot: Making network Private in Windows + +
    +

    +
  • +
  • +

    Now, when your PC trusts this connection, you will see your Rocknix device in "Network" +
    +

    Screenshot: Handheld in Windows network and Mac Shares + + +
    +

    +
  • +
  • +

    In this "computer" open "games-roms" share.
    + Here you can add roms to corresponding folders. +
    +

    Screenshot: games-roms share in Windows Explorer + +
    +

    +
  • +
+

File transfer gadget (former MTP)

+

This mode seems simple to use, but it has some limitations.

+
    +
  • +

    Some operating systems may need a driver or special software

    +
  • +
  • +

    Sometimes file transfer fails and you need to restart gadget and retry transfer

    +
  • +
  • +

    In EmulationStation's Network Settings: switch gadget mode to file transfer. +
    +

    Screenshot: file transfer gadget + +
    +

    +
  • +
+

Option 3: SD Card

+

Games can also be added via an SD card. There are 2 primary methods for this depending on your device.

+

If your device has 2 SD card slots

+

If you do not wish to use a second card in Slot 2 for games

+
    +
  • Turn off your device, remove your SD card from slot 1 and open it on your PC.
  • +
  • You PC will display a list of folders, open the games-internal/roms directory and you will see a list of folders for each system where you can place your games and bios files.
  • +
  • Add your games and place your SD card back into slot 1 and boot up ROCKNIX.
  • +
+

If you do wish to use a second card in Slot 2 for games

+
    +
  • With your device turned off; insert a FAT32/ExFAT/ext4/btrfs formated SD card into slot 2 of your device.
  • +
  • Turn your device on.
  • +
  • When ROCKNIX completes its boot process, the roms directory will automatically be created on the second SD card.
  • +
  • Now you can turn off your device, remove your SD card from slot 2 and open it on your PC.
  • +
  • You PC will display a list of folders, open the roms directory and you will see a list of folders for each system where you can place your games and bios files.
  • +
  • Add your games and place your SD card back into slot 2 and boot up ROCKNIX.
  • +
+

If your device does not see your SD card (or write the needed folders to it) please open System Settings and make sure Autodetect Games Card is turned on (located under the Hardware/Storage header) then reboot your device.

+

If your device has 1 SD card slot

+
+

This option is only for devices where you have installed ROCKNIX to the internal drive of the device. In this scenario an SD card can be used directly for storage

+
+
    +
  • With ROCKNIX installed to your internal drive press START to open the Main Menu, then open System Settings and turn on Autodetect Games Card under the Hardware/Storage header.
  • +
  • Turn your device off
  • +
  • Insert a FAT32/ExFAT/ext4 formated SD card into your device.
  • +
  • Turn your device on
  • +
  • When ROCKNIX completes its boot process, the roms directory will automatically be created.
  • +
  • Now you can turn off your device, remove your SD card and open it on your PC.
  • +
  • You PC will display a list of folders, open the roms directory and you will see a list of folders for each system where you can place your games and bios files.
  • +
  • Add your games and place your SD card back into your device and boot up ROCKNIX.
  • +
+

Option 3.1: access SD Card in recovery mode

+

How to enter recovery mode

+
    +
  • RK3566 only Before entering recovery mode, connect handheld to PC via USB
  • +
  • +

    On other devices you can connect the cable at any time

    +
  • +
  • +

    On most devices, hold Volume Down while device boots.

    +
  • +
  • +

    On SD865 (Retroid Pocket 5/Mini) choose RECOVERY option in GRUB menu +
    +

    Photo: RECOVERY menu entry on RP5 + +

    +
  • +
  • +

    A message will appear telling about exposed SD/eMMC devices +
    +

    Photo: RGB10X exposing both SD cards + +

    +
  • +
  • +

    Your PC should now see all your handheld storage devices as USB mass storage

    +
  • +
  • Manage your ROMs, format partitions or even do a clean ROCKNIX install
  • +
  • Don't forget to eject all the drives to prevent filesystem corruption
  • +
  • Press Volume Up, device will reboot into normal mode
  • +
+

Option 4: External USB Drive

+

ROCKNIX has a built in File Manager and you can use it to access connected USB drives and transfer files.

+
    +
  1. Connect your USB Drive to your device
  2. +
  3. Open the Tools system and select File Manager
  4. +
  5. Navigate up to / and then select media - you should see your drive listed after opening media
  6. +
  7. Open your drive and you should see its contents
  8. +
  9. From here you can navigate to the file(s) you would like to copy and then navigate back to the storage/roms directory and paste your copied files in the approrpiate folder.
  10. +
+

Option 5: Linux OS

+

ROCKNIX' storage drive is formated as ext4 which can be read natively by linux operating systems. Plugging in your SD card into an linux OS will enable you to browse the directories and add files directly.

+

NFS Storage

+

NFS Storage differs to the other approaches in that you do not need to copy any files to the device. It relies on a pre-curated and shared roms location to exist on a Network Attached Storage (NAS) Network File System on the network which the device is connected to. This allows you to quickly load pre-scrapped/existing collections without the need to synchromise or copy anything to an SD card or internal storage.

+

Unlike SMB/Samba file shares, NFS was designed specifically for fast IO and to work and present like a local file-system to the OS. Using NFS even on 2.4ghz networks for rom collections often provides a better experience than even the internal SD card can support. NFS servers are relatively trivial to setup and can be installed on Windows through the features function.

+

NFS support in rocknix is implemented as a variation on the merged storage approach. The NFS URI(Universal Resource Identifier) is mounted to /storage/games-external and the local storage is mounted in an overlay as the Upper location. Meaning saves / writes to are kept local to the device.

+

To Use NFS create a file in /storage/ called '.nfs-mount' with a single entry of the format: +NFS_PATH=<valid NFS uri>

+

i.e something similar to

+

NFS_PATH=nfs.example.com:/path/containing-a-roms-subdir

+

Once created, ensure you are connected to a Network segment that can reach the NFS URI (local wifi or connected via tailscale/vpn) and navigate to the 'Tools' collection in ES. Execute the 'Mount NFS' entry. ES should restart and you should now have a merged collection available in ES.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/play/controls/index.html b/play/controls/index.html new file mode 100644 index 000000000..ae5be014e --- /dev/null +++ b/play/controls/index.html @@ -0,0 +1,5043 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Controls - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Controls

+
+

Controls documentation is being moved to device pages. This work is not fully complete so there is chance you will not find controls documentation for your device just yet. We're working on it 😄 and will update this page when things are complete.

+
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/play/install/index.html b/play/install/index.html new file mode 100644 index 000000000..f3c648b27 --- /dev/null +++ b/play/install/index.html @@ -0,0 +1,5206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Install - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Installing ROCKNIX

+

ROCKNIX is installed by downloading an image for your device, flashing it to an SD Card (or your device's internal storage) and then booting the device to start the install process.

+

Step 1: Download LatestLatest

+
    +
  • Download the latest version of ROCKNIX for your device from the releases page.
      +
    • You'll find download links for each device/platform we support under the "Installation Package Downloads" header.
    • +
    • Make sure to download the correct image for your device. For example; if you are installing ROCKNIX on a Gameforce Ace you would download the ROCKNIX-RK3588 image.
    • +
    • If you have any questions you can check the Device Support section to confirm which image you should download for your specific device.
    • +
    +
  • +
+

Step 2: Flash

+
    +
  • First decompress the image.
  • +
  • Then write the image to an SD Card using an imaging tool. +
  • +
+

Step 3: Boot your device

+
    +
  • Insert your SD Card into your device while its off and then turn it on
  • +
  • Note: Some devices may require you to set the boot order so your SD Card is loaded first. Please see documentation for your specific device to see if this applies to you.
  • +
  • ROCKNIX will run through its install process and then reboot your device after its complete.
  • +
  • When your device reboots it will load directly into EmulationStation; at this point you are good to go!
  • +
+
+

Additional Notes

+
    +
  • ROCKNIX operating system is stored on an Ext4 partition that can be read by LINUX but is not natively readable on Windows. Currently it is not possible to access the primary ROCKNIX Ext4 partition on Windows to add games.
  • +
  • On devices that support a second sd card, the sd card can be formatted as Ext4, FAT32, or exFAT. ROCKNIX will automatically detect the second SD card on boot and make it available as game storage.
  • +
  • On x86 devices ROCKNIX includes an installation tool. The installation tool can be found in the tools menu, which is one of the systems listed within ES.
  • +
+

Next Steps

+ + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/play/netplay/index.html b/play/netplay/index.html new file mode 100644 index 000000000..8a8dca863 --- /dev/null +++ b/play/netplay/index.html @@ -0,0 +1,5346 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Netplay - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Network Play

+

RetroArch network play for up to 4 players is available across all WIFI enabled devices supported by ROCKNIX. Before continuing, please make sure that all devices are updated to the same version of the operating system.

+

Video Guide

+
+

Courtesy of @RetroGameCorps

+
+ + +

Enabling Network Play

+

Before netplay is available, it must be enabled on each participating device.

+
    +
  • Select Games Settings -> Netplay Settings
  • +
  • NetPlay -> Enabled
  • +
  • Index Games
  • +
+

Option 1: LAN based Network Play

+

Using this feature is simple. For LAN based play, connect your devices to your WIFI network. A minimum of one host and one client are required for play.

+

Local LAN Play (HOST)

+
    +
  • Select Network Settings.
  • +
  • Disable Local Play Mode.
  • +
  • Select 1 (Host).
  • +
  • Choose a game and press Y.
  • +
  • Select Netplay Options.
      +
    • Select Host a Netplay Session.
    • +
    +
  • +
+

Local LAN Play (CLIENTS)

+
    +
  • Select Network Settings.
  • +
  • Disable Local Play Mode.
  • +
  • Select 2-4 (Clients).
  • +
  • Choose a game and press Y.
  • +
  • Select Netplay Options.
      +
    • Select Connect to a Netplay Session.
    • +
    +
  • +
+

Option 2: Device to Device Network Play

+

Device to device connections will automatically generate and connect to a local WIFI network. As with LAN based play, one host and one client are required for play. Using the same version of ROCKNIX on each device is REQUIRED or devices will not connect. Device to device connections are intended for local play only, retroAchievements, scraping, and system updates will not be available in this mode.

+

Device to Device Play (HOST)

+
    +
  • Select Network Settings.
  • +
  • Enable Local Play Mode.
  • +
  • Select 1 (Host).
  • +
  • Choose a game and press Y.
  • +
  • Select Netplay Options.
      +
    • Select Host a Netplay Session.
    • +
    +
  • +
+

Device to Device Play (CLIENTS)

+
    +
  • Select Network Settings.
  • +
  • Enable Local Play Mode.
  • +
  • Select 2-4 (Clients).
  • +
  • Choose a game and press Y.
  • +
  • Select Netplay Options.
      +
    • Select Connect to a Netplay Session.
    • +
    +
  • +
+ +

ROCKNIX supports GameLink play for GameBoy and GameBoy Color. To use, on each device select the appropriate core for the game being started in advanced settings for the game, or for the system.

+ + + + + + + + + + + + + + + + + +
CoreFeatures
TGBDual RecommendedSupport for multiplayer GameLink play, including battle/trading.
GambatteSupport for multiplayer GameLink play.
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/play/retro-achievements/index.html b/play/retro-achievements/index.html new file mode 100644 index 000000000..6247f9318 --- /dev/null +++ b/play/retro-achievements/index.html @@ -0,0 +1,5135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Achievements - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Retro Achievements

+

ROCKNIX has a native integration with RetroAchievements which allows you to earn achievements as you play games across numerous emulators. In order to use RetroAchievements your device must be connected to the internet.

+

Setup

+
    +
  1. Create an account at RetroAchievements.org.
  2. +
  3. Follow the steps on the Networking page to connect your device to the internet.
  4. +
  5. While in EmulationStation press START on your controller to open the Main Menu.
  6. +
  7. Select Game Settings and then choose RetroAchievement Settings.
  8. +
  9. Turn On RetroAchievements (first toggle).
  10. +
  11. Then enter your username and password for RetroAchievements.org in the username and password fields.
  12. +
+

Additional Notes

+
    +
  • There are additional settings that can be changed in the above menu to tailor your experience. Please see the documentation @ docs.retroachievements.org for details on each option
      +
    • Recommended Settings:
    • +
    • Unlock Sound (On): this plays the classic unlock sound each time an achievement is earned.
    • +
    • Automatic Screenshot (On): this takes a screenshot each time an achievement is earned and stores it in the screenshots directory. These can be viewed in the screenshots system in EmulationStation.
    • +
    +
  • +
  • Not all emulators and games support RetroAchievements; please see the list of emulators that support achievements here and check if your game has achievements available by searching for it on RetroAchievements.org
  • +
  • There is a change needed on the RetroAchievements API in order to be able to display to display your history of earned achievements in EmulationStation. Once the needed change is made by RetroAchievements; we can look at renabling this functionality in EmulationStation.
  • +
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/play/update/index.html b/play/update/index.html new file mode 100644 index 000000000..e3c31b593 --- /dev/null +++ b/play/update/index.html @@ -0,0 +1,5194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Update - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Updating ROCKNIX

+

ROCKNIX can be updated "Over the Air" (OTA) or by manually downloading an update .tar file, adding to your device storage and rebooting.

+

Option 1: OTA Update

+

If your device has access to the internet you can update ROCKNIX directly from EmulationStation.

+
    +
  1. In EmulationStation open the main menu by pressing the Start button on your controller.
  2. +
  3. Select System Settings
  4. +
  5. Scroll to the System Update header and select Start Update
  6. +
+
+

You can also view the change log for the latest release by selecting the Change Log before you update.

+
+

Option 2: Manual Update

+

If you device does not have access to the internet you can still update manually

+
    +
  1. Download the latest update (.tar) of ROCKNIX for your device from the releases page.
      +
    • You'll find download links for each device/platform we support under the "Update Package Downloads" header.
    • +
    • Make sure to download the correct .tar file for your device. For example; if you are installing ROCKNIX on a Gameforce Ace you would download the ROCKNIX-RK3588 file.
    • +
    • If you have any questions you can check the Device Support section to confirm which .tar you should download for your specific device.
    • +
    +
  2. +
  3. Copy the update to your device's update share.
      +
    • via SCP to /storage/.update +
      Snippet: SCP transfer +
      $ scp ~/Downloads/ROCKNIX-RK3326.aarch64-20241221.tar rk3326.local:.update/
      +
      +
    • +
    • via Samba to "update" +
      Screenshot: update file copied to "update" samba share + +
    • +
    +
  4. +
  5. Reboot the device, and the update will begin automatically.
  6. +
+

Option 3: Development build

+
+

Development builds do not contain credentials for scraping and RetroAchievements, so these functions will not work!

+
+
    +
  • find a build you need in dev-builds channel
  • +
  • a link to nightly builds is in channel topic
  • +
  • .tar and .img.gz files are good for updating.
    +.tar is a bit faster to update than .img.gz
    +.zip needs to be unzipped
  • +
+

Update process is similar to manual update:

+
    +
  1. Download (and unzip if needed) the build, you need .tar or .img.gz file
  2. +
  3. Copy the update to your device's update share.
      +
    • via SCP to /storage/.update +
      Snippet: SCP transfer of .img.gz +
      $ scp ~/Downloads/ROCKNIX-RK3326.aarch64-20241221-b.img.gz rk3326.local:.update/
      +
      +
    • +
    • via Samba to "update" +
      Screenshot: .tar copied to "update" samba share + +
    • +
    +
  4. +
  5. Reboot the device, and the update will begin automatically.
  6. +
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 000000000..dc8b2f507 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Home","text":""},{"location":"#welcome-to-the-rocknix-wiki","title":"Welcome to the ROCKNIX Wiki","text":"

Just Enough Linux Operating System (ROCKNIX) is an immutable Linux distribution for handheld gaming devices focused on retro gaming emulation. It is developed by a small community of enthusiasts and our goal is to produce an operating system that has the features and capabilities we need and to have fun as we develop it.

"},{"location":"#features","title":"Features","text":"
  • Integrated cross-device local and remote network play.
  • In-game touch support on supported devices.
  • Fine grain control for battery life or performance.
  • Includes support for playing Music and Video.
  • Bluetooth audio and controller support.
  • Support for HDMI audio and video out, and USB audio.
  • Device to device and device to cloud sync with Syncthing and rclone.
  • VPN support with Wireguard, Tailscale, and ZeroTier.
  • Includes built-in support for scraping and retroachievements.
"},{"location":"#preview","title":"Preview","text":""},{"location":"#community","title":"Community","text":"

The ROCKNIX community utilizes Discord for discussion, if you would like to join us please use this link: \u00a0 Discord

"},{"location":"#licenses","title":"Licenses","text":"

ROCKNIX is a Linux distribution that is made up of many open-source components. Components are provided under their respective licenses. This distribution includes components licensed for non-commercial use only.

"},{"location":"#rocknix-branding","title":"ROCKNIX Branding","text":"

ROCKNIX branding and images are licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

You are free to:

  • Share: copy and redistribute the material in any medium or format
  • Adapt: remix, transform, and build upon the material

Under the following terms:

  • Attribution: You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
  • NonCommercial: You may not use the material for commercial purposes.
  • ShareAlike: If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
"},{"location":"#rocknix-software","title":"ROCKNIX Software","text":"

Copyright 2024 ROCKNIX (https://github.com/ROCKNIX)

Original software and scripts developed by the ROCKNIX team are licensed under the terms of the GNU GPL Version 2. The full license can be found in this project's licenses folder.

"},{"location":"#bundled-works","title":"Bundled Works","text":"

All other software is provided under each component's respective license. These licenses can be found in the software sources or in this project's licenses folder. Modifications to bundled software and scripts by the ROCKNIX team are licensed under the terms of the software being modified.

"},{"location":"#credits","title":"Credits","text":"

Like any Linux distribution, this project is not the work of one person. It is the work of many persons all over the world who have developed the open source bits without which this project could not exist. Special thanks to CoreELEC, LibreELEC, and to developers and contributors across the open source community.

"},{"location":"donations/","title":"Donations","text":"

Thank you for your interest in donating to ROCKNIX! We don't accept financial contributions. If you would like to volunteer or contribute in some way to our project, please read our Code of Conduct and Contributing to ROCKNIX guides. You are also encouraged to join us on Discord to learn and collaborate with us.

"},{"location":"donations/#why-dont-you-accept-donations","title":"Why Don't You Accept Donations?","text":"
  • As an Open Source project our operational expenses are fairly low, so to us a donation of your time is much more valuable
  • Open Source development is not considered charitable activity in some parts of the world, including the United States. Accepting donations can create unnecessary complexity for the project, and for the person donating.
"},{"location":"donations/#build-infrastructure","title":"Build Infrastructure","text":"

Our GitHub runners are the nodes we use to build and push releases to GitHub. Trillian is our primary development host, Deepthought is our primary release builder. Node specs can be found in the table below:

Name CPU Cores/Threads RAM Disk Usage deepthought Ryzen 7 5800H 8c/16t 32GB 2TB NVMe SSD GitHub Runner trillian Ryzen 7 5800H 8c/16t 32GB 2TB NVMe SSD Local Dev"},{"location":"donations/#project-and-web-hosting","title":"Project and Web Hosting","text":"

GitHub serves our release packages, as well as our WIKI. Our domain, rocknix.org is hosted with GitHub pages and powered by MkDocs + Material. Currently, ROCKNIX does not take advantage of any functionality that requires a paid GitHub plan.

Project URL Comment ROCKNIX github.com/ROCKNIX/distribution Project site, Stable Release Repository. Documentation rocknix.org ROCKNIX Wiki"},{"location":"faqs/","title":"Frequently Asked Questions","text":""},{"location":"faqs/#about-rocknix","title":"About ROCKNIX","text":""},{"location":"faqs/#does-rocknix-offer-any-formal-support","title":"Does ROCKNIX offer any formal support?","text":"

No. ROCKNIX is something that we develop for fun, it is provided as-is. There are a variety of avenues to seek community help, but this is a tinkerer's distribution so you will need to get your hands dirty to solve any issues.

"},{"location":"faqs/#do-you-plan-to-add-additional-ports-software-or-emulators","title":"Do you plan to add additional ports, software, or emulators?","text":"

We are a community developed distribution, and we believe that it is the responsibility of the person who wants a new feature to develop and contribute that feature. If you would like to add something to ROCKNIX, pull requests are welcomed. Please review our code of conduct, our contributing guidelines, and our build guide before submitting your first pull request.

"},{"location":"faqs/#do-you-support-x-device-will-you-add-support-for-x-device","title":"Do you support X device? Will you add support for X device?","text":"

You can find the list of currently supported devices here: Devices

If the device you are interested in isn't in that list then no one has contributed the work to add support for it yet. Why? To add support for a device we (1) need to be interested in adding support for it \ud83d\ude0a and (2) need to have direct access to the device.

That said, anyone who is interested can submit updates to ROCKNIX to add support for a device they care about! If you are interested in adding support for a new device please start here: Contribute

"},{"location":"faqs/#licensing-rocknix-for-redistribution","title":"Licensing ROCKNIX for redistribution","text":"

ROCKNIX utilizes a non-commercial CC BY-NC-SA 4.0 copyleft license on our branding which is intended to prevent abuse of our work. Device Makers and others who would like to bundle on devices may not do so without our express permission.

"},{"location":"faqs/#selling-rocknix","title":"Selling ROCKNIX","text":"

The ROCKNIX brand is licensed for non-commercial use only. It is not allowed to be sold or included as an up charge in any form what-so-ever. Period. This is not negotiable.

"},{"location":"faqs/#what-if-you-stop-working-on-rocknix","title":"What if you stop working on ROCKNIX?","text":"

We don't expect that to happen, however ROCKNIX is an Open Source project hosted here on GitHub which means the source code is readily available for anyone in the world to pick up and continue where we left off. Our license model(GPLv2) license when no other license applies.) allows for this to happen by providing and encouraging redistribution (freedom 2) and the right to distribute a modified version (freedom 3). ROCKNIX only prohibits commercial use through our branding which is licensed by the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

"},{"location":"faqs/#using-rocknix","title":"Using ROCKNIX","text":""},{"location":"faqs/#which-emulators-and-game-engines-are-supported-by-rocknix","title":"Which emulators and game engines are supported by ROCKNIX?","text":"

Emulators and game engines are configured on a per device basis and are automatically documented at build time. Documentation can be found at the following URL: Per Device Documentation

"},{"location":"faqs/#how-do-i-log-in-over-ssh-or-samba","title":"How do I log in over SSH or Samba?","text":"

External services (SSH and Samba) are disabled by default in release builds, and can be enabled in the Network Settings menu. When enabled, the SSH/Samba username is \"root\". The root password is regenerated by default after each reboot, and can be found in the System Settings menu. You can optionally provide your own root password if you wish.

If logging in to Samba fails on Windows with the message, \"The user name or password is incorrect\", see these links for a solution (Windows 10 Pro, Windows 10 Home).

Please also see the Networking and Adding Games to ROCKNIX pages for additional details.

"},{"location":"faqs/#sound-suddenly-stopped-working-on-my-device","title":"Sound suddenly stopped working on my device!","text":"

Log in over ssh, and run the following steps.

systemctl stop pipewire-pulse pipewire-pulse.socket pipewire pipewire.socket wireplumber\nrm -rf /storage/.local/state /storage/.config/pulse\nreboot\n

"},{"location":"faqs/#emustation-displays-duplicate-game-titles-how-can-i-disable-a-file-extension-to-remove-the-duplicates-eg-display-only-cue-and-dont-display-bin-files-for-playstation","title":"EmuStation displays duplicate game titles. How can I disable a file extension to remove the duplicates? (e.g. display only .cue and don't display .bin files for PlayStation)","text":"
  • Within EmuStation, select the relevant game system (e.g. PlayStation)
  • Press Select to View Options
  • In View Options section, choose View Customisation
  • Under File Extensions, deselect any file extensions that are not required (e.g. deselect .bin for PlayStation when also using .cue files)
"},{"location":"faqs/#how-do-i-edit-es_systemscfg-for-example-to-modify-the-list-of-systems-in-emustation-add-a-custom-core-or-script-or-change-the-order-that-systems-are-displayed","title":"How do I edit es_systems.cfg (for example, to modify the list of systems in EmuStation, add a custom core or script, or change the order that systems are displayed)?","text":"
  • Delete the ~/.config/emulationstation/es_systems.cfg symlink.
  • Copy the custom version of es_systems.cfg to ~/.config/emulationstation.
  • Stop the UI service: systemctl stop ${UI_SERVICE}
  • Restart the UI service to use the custom version: systemctl start ${UI_SERVICE}

Note: System updates will overwrite it, custom settings will be preserved as last_es_systems.cfg.

"},{"location":"faqs/#where-do-i-put-bios-files-and-files-and-retroarch-system-files","title":"Where do I put bios files and files and Retroarch system files","text":"
  • Bios files go in /storage/roms/bios
  • Please see the corresponding system documentation in the wiki for required files for each system.
"},{"location":"faqs/#where-do-i-put-music-files-to-enable-background-music-within-emulationstation-while-browsing-my-game-library","title":"Where do I put music files to enable background music within emulationstation (while browsing my game library)?","text":"
  • Music files should be added to /storage/roms/BGM
"},{"location":"faqs/#my-game-has-slowdown-and-stuttering-issues-what-can-i-do-to-improve-performance","title":"My game has slowdown and stuttering issues. What can I do to improve performance?","text":"

First make sure you don't have a TDP configured that is too low for your emulator to function correctly. Next, try adjusting settings within the emulator, either retroarch core or standalone emulator configuration menu.

"},{"location":"faqs/#where-are-log-files-stored","title":"Where are log files stored?","text":"

Log files can be found in /var/log/

Various logs are generated, including

  • EmuStation logs es_log.txt (cumulative log of all ES activity), es_launch_stdout.log (last emulator launched from ES) and es_launch_stderr.log (blank if there wasn't an error for the last emulator launch)
  • Execution log exec.log (generic execution log that indicates what was last executed, including the command to launch the emulator) e.g. for gzdoom launch of heretic.doom runemu.sh: Executing /usr/bin/bash start_gzdoom.sh /storage/roms/doom/heretic.doom
  • Boot log boot.log (Output from autostart during system startup)
  • Emulator-specific log (for non-retroarch emulators) e.g. gzdoom.log is the log specific to gzdoom to indicate whether there is any issue within the emulator when launching heretic.doom, noted above
  • Retroarch logs are turned off by default, but can be enabled within Retroarch (Tools > Retroarch: Settings > Logging > Log to a File), are stored in /var/log/retroarch and are quite detailed, so should provide sufficient detail to identify missing roms within a game's romset, configuration issues and other errors that prevent games from working

Note: Retroarch uses a shared config file, so logging can be enabled within 64bit or 32bit and it will be enabled for all Retroarch cores

"},{"location":"faqs/#i-have-a-device-with-a-single-microsd-and-i-cant-see-the-games-partition-in-windows-or-macos","title":"I have a device with a single microsd and I can't see the games partition in Windows or macOS.","text":"

ROCKNIX does not create an ExFAT partition on the boot device, and expands the full partition using ext4. You can sync files to the device over the network or by loading your files onto a EXT4, ExFAT, or FAT32 formatted usb stick and copy them with FileMan or over ssh. Please see the Adding Games page for more details.

"},{"location":"configure/cloud-sync/","title":"Cloud Sync","text":"

ROCKNIX has built in support for multiple cloud sync options. These can be used to sync save files, games and other files between multiple devices.

"},{"location":"configure/cloud-sync/#syncthing","title":"Syncthing","text":"

Syncthing is a tool that lets you synchronize the contents of folders across multiple devices. It is different from cloud storage in that devices are updated directly with the latest changes from their peer(s) whenever they are online at the same time. Some things you can use it for with ROCKNIX:

  • Keep your game library synchronized between your computer and ROCKNIX device(s),
  • Keep all your handhelds synchronized (including those that run Android),
  • Copy savegames as they are created and seamlessly continue playing on another device,
  • Keep a copy of your configuration files for easier editing.
"},{"location":"configure/cloud-sync/#setup","title":"Setup","text":""},{"location":"configure/cloud-sync/#setup-on-rocknix","title":"Setup on ROCKNIX","text":"
  • Make sure you are connected to a WiFi network before continuing.
  • Go to \"Network Settings\" and set \"Enable Syncthing\" to \"on\". Make a note of your device's IP address, as well as the root password in the System Settings menu.
  • On a computer or mobile device in the same network, open a browser and point it to \"http://a.b.c.d:8384\" where \"a.b.c.d\" is the IP address of your ROCKNIX device.
  • When prompted for a user name and password, enter \"root\" as user and the password you noted earlier.
  • You should now be directed to a configuration page running on your ROCKNIX device - we'll come back to this shortly.
"},{"location":"configure/cloud-sync/#setup-on-peers","title":"Setup on Peer(s)","text":"

Install Syncthing on the device or computer that you want to synchronize with your ROCKNIX device. If your other device also runs ROCKNIX, simply repeat the above steps. Otherwise go to https://syncthing.net to download Syncthing for your platform. You may also find it in your Linux distribution's package manager, the Android Play Store, etc. Generally it is not required to install the same version of Syncthing on all devices. You can synchronize a folder across any number of peers.

"},{"location":"configure/cloud-sync/#connecting-folders","title":"Connecting Folders","text":"
  1. Go to the web interface of your ROCKNIX device (see above). Don't worry about notices about upgrading or the file system being read-only, nothing you can do. (Note: You can also go to the web interface of any of the peers, it'll work the same - but for this documentation it is assumed that you're on a ROCKNIX device.)
  2. Under \"Remote Devices\", click \"Add Remote Device\". Enter the Device ID of the peer you want to synchronize with. If the remote is in the same network as your ROCKNIX device the ID will be shown automatically. Otherwise, you'll find it in the remote's web interface by clicking \"Actions\" at the top and then \"Show ID\". Give the device a name if you like.
  3. In the \"Folders\" section, click \"Add Folder\". In the popup window that opens, set a label and specify the path on the device (e.g. /storage/roms). This is the folder you will be sharing with other peers.
  4. In the same popup window, go to the \"Sharing\" tab and select the remote device you just set up. Optionally, go to the \"Ignore Patterns\" tab and configure those. Click \"Save\" to close the window.
  5. On the remote's interface you should receive a popup that a new device wants to connect. Click \"Add Device\" and then \"Save\" to accept. It should now show up under \"Remote Devices\".
  6. Still on the remote, you should receive a new popup saying that the ROCKNIX device wants to share a folder. Click \"Add\", then in the popup window, specify the path to an empty local folder to store the synchronized contents. Click \"Save\".
  7. The folder should now be copied from the ROCKNIX device to the remote.
"},{"location":"configure/cloud-sync/#adding-more-peers","title":"Adding more Peers","text":"
  • To share the folder with more peers, first follow step 2 on your ROCKNIX device to add another remote.
  • Find the folder you want to add another peer to and click \"Edit\".
  • In the popup window, go to the \"Sharing\" tab. The new remote should appear as an option. Select it and then click \"Save\".
  • Follow steps 5 and 6 on the new remote to connect the folder.
"},{"location":"configure/cloud-sync/#things-to-keep-in-mind","title":"Things to Keep in Mind","text":""},{"location":"configure/cloud-sync/#syncthing-is-not-a-cloud-storage","title":"Syncthing is not a cloud storage","text":"

In order for devices to synchronize, they need to be online at the same time. Unless you have one peer that is always on, this is different from an online storage like Dropbox or Nextcloud. However, this behaviour can be emulated (no pun intended) by installing Syncthing on a cloud server or an always-on Raspberry Pi.

"},{"location":"configure/cloud-sync/#syncthing-is-not-a-backup","title":"Syncthing is not a backup","text":"

Folders are synchronized with other peers immediately as they come online at the same time - this includes changes and deletions! Be sure to make regular backups of your folders.

"},{"location":"configure/cloud-sync/#devices-do-not-need-to-be-on-the-same-network","title":"Devices do not need to be on the same network","text":"

Syncthing uses relay servers to ensure communication between peers. This means that there does not need to be a direct connection between your devices, no port forwarding, etc - as soon as they are both online they will find each other and synchronize. Although file transfers are end-to-end encrypted when they are sent through relays, be aware of this if you plan on using Syncthing for anything more sensitive than your save files.

"},{"location":"configure/cloud-sync/#using-syncthing-for-savesstates","title":"Using Syncthing for Saves/States","text":"

Using Syncthing for savegames is great because it allows you to seamlessly play a game across multiple handhelds, or even other devices. For example, you can play a game of Super Mario 64 on your RG353 while on the go, then launch the game on a RetroPie or PC running RetroArch and your save game will be transferred automatically to be continued on the big screen. However, this comes with a few caveats.

RetroArch differentiates between saves, i.e. the battery or memory card storage featured in the original game, and states, i.e. the save state feature that is part of the emulator. While saves are often compatible across different versions of RetroArch cores, states tend to break more frequently. This means that if you create states with two incompatible versions of an emulator and they are synchronized, you may lose one of them.

  • For maximum compatibility, make sure to use the same cores on all devices and update them at similar frequencies.
  • RetroArch uses two separate folders for saves and states. This makes it easy to choose whether you want to synchronize only saves, states, or both.
  • In the RetroArch settings under \"Saving\", you can tell RetroArch to sort saves and states into subfolders based on content directory or core name. It is highly recommended to make use of this to reduce the risk of accidentally overwriting an incompatible save or state.
  • Make regular backups of your save folders.
"},{"location":"configure/cloud-sync/#synchronizing-with-android","title":"Synchronizing with Android","text":"
  • For Android-based handhelds people seem to be recommending the Syncthing-Fork from F-Droid.
  • Keeping Syncthing running in the background on Anroid may severely impact your battery life and reduce standby time. Check out these tips to help you balance battery life and synchronization times.
  • Using cross-platform versions of emulators is much more likely to introduce incompatibilities so be extra careful when syncing savegames.
"},{"location":"configure/cloud-sync/#further-documentation","title":"Further Documentation","text":"

For any questions and advanced configuration, be sure to check out the full documentation at https://docs.syncthing.net/index.html.

"},{"location":"configure/cloud-sync/#rclone","title":"Rclone","text":"

Using Rclone is easy, however configuration must be performed manually before it will function correctly.

rclone.cfg is stored in /storage/.config/rclone/rclone.conf and can be copied from another device but only after the destination device has booted into ROCKNIX (so copy to secondary sd, boot device, launch 351files, copy from there to proper path above)

"},{"location":"configure/cloud-sync/#setup-rclone","title":"Setup Rclone","text":""},{"location":"configure/cloud-sync/#credentialed-access","title":"Credentialed Access","text":"

To set up rclone, open an ssh connection to your handheld using PowerShell ssh, putty, or ssh on Linux and Mac. * Username: root (all lower case!) * Password: (To get the root password, press Start, then Select System Settings.) * Connection: (Your device, example RG552 or RG351MP.)

"},{"location":"configure/cloud-sync/#example-using-powershell-ssh-linux-or-macos","title":"Example using PowerShell ssh, Linux, or macOS:","text":"

ssh root@RG552

"},{"location":"configure/cloud-sync/#setting-up-rclone","title":"Setting up Rclone","text":"

Now that you're connected you will need to configure Rclone. This process is menu driven, but also requires steps on your PC. To complete configuration of Rclone, run rclone config in your ssh session and then follow the provider documentation and headless configuration steps to configure it for your cloud provider of choice.

  • Rclone Provider Documentation
  • Rclone Headless Configuration

See detailed setup example below

"},{"location":"configure/cloud-sync/#using-rclone","title":"Using Rclone","text":"

In ROCKNIX you are able to mount your cloud drive like any other storage device, as long as you are network connected. To mount your cloud drive, press Start, select Network Settings, and then select the Mount Cloud Drive option. This drive is available on /storage/cloud by default, and is accessible from ssh and from 351Files. To mount the cloud drive over ssh use rclonectl mount to mount the drive and rclonectl unmount to unmount it.

Note: Mounting the cloud drive is not persistent, you will need to select it before use.

"},{"location":"configure/cloud-sync/#using-cloud-backup-and-restore","title":"Using Cloud Backup and Restore","text":"

In the tools menu you will find two options, Cloud Backup, and Cloud Restore. These tools will back up or restore your save games and save states by connecting your cloud drive and copying them. These tools are configurable by editing /storage/.config/rsync.conf and /storage/.config/rsync-rules.conf.

Note: The cloud backup and restore tools are destructive, but they do not delete data by default. Deletes are left to the user to manage.

"},{"location":"configure/cloud-sync/#rsyncconf","title":"rsync.conf","text":"

The rsync.conf configuration file contains parameters used by the cloud tools that provide the path for your cloud drive to be mounted, the path to sync the data from, the destination for the sync and rsync options for cloud backup and restore. The configuration is user editable, and the defaults are as follows:

### This is the path where your cloud volume is mounted.\nMOUNTPATH=\"/storage/cloud\"\n\n### This is the path to your game folder on your cloud drive.\nSYNCPATH=\"GAMES\"\n\n### This is the path we are backup up from.\nBACKUPPATH=\"/storage/roms\"\n\n### This allows changes to the rsync options for cloud_backup (pending stable release)\nRSYNCOPTSBACKUP=\"-raiv --prune-empty-dirs\"\n\n### This allows changes to the rsync options for cloud_restore (pending stable release)\nRSYNCOPTSRESTORE=\"-raiv\"\n

"},{"location":"configure/cloud-sync/#rsync-rulesconf","title":"rsync-rules.conf","text":"

The rsync-rules.conf configuration file contains the pattern used by rsync to know which files to backup and restore. This file is user editable. The default settings are as follows:

# This is a required rule for subdirectory matching.\n+ */\n\n### Do not include BIOS.\n- bios/**\n\n### Retroarch saves\n+ *.sav\n+ *.srm\n+ *.auto\n+ *.state*\n\n### This is a required rule to exclude all other file types.\n- *\n

To create custom match rules, use - to exclude and + to include. Use caution as a mismatched rule can copy every single file from the source path or no files at all.

"},{"location":"configure/cloud-sync/#detailed-example","title":"Detailed Example","text":"

This example configures rclone to use Dropbox

Rclone provide detailed examples for connecting to all supported cloud servers, including Rclone Dropbox example

"},{"location":"configure/cloud-sync/#configure-cloud-backup-connection-on-rocknix-device-using-ssh","title":"Configure cloud backup connection on ROCKNIX device using ssh","text":"

From the terminal command line type

rclone version\n

and press enter

Note the version number, which is required for a later step

Now type

rclone config\n

and press enter

type n to create a new remote site

type in a name for the site (use a name without spaces), then press enter

rclone suggest using remote, but in this example the remote site is called rg503

don\u2019t include spaces in the site\u2019s name. Rclone does allow names that include spaces, but rsync will fail if a site name with spaces is used in the cloud backup script.

Choose from the list of cloud providers that is displayed. For Dropbox, type 12 and enter in this example

The next options displayed are slightly different from the Dropbox example on rclone website

For client_id and client_secret press enter and enter to skip, or read Rclone Dropbox example for details about setting up your own App ID (rclone App ID is shared with all rclone users by default)

Type n to skip editing the advanced config

For auto config, select n for remote or headless machine (i.e. ROCKNIX device that doesn't have a web browser)

Instructions are provided explaining how to authorize the connection from the remote device to the cloud service

"},{"location":"configure/cloud-sync/#install-and-run-rclone-on-machine-with-a-web-browser-to-authorize-connection-to-cloud-service","title":"Install and run rclone on machine with a web-browser to authorize connection to cloud service","text":"

Download rclone on a device with a web-browser so rclone can use a web-page to authorize the connection by allowing you to login with your authorization credentials for the cloud service

Rclone download server

Download the same version of rclone as is installed on ROCKNIX device, as noted above.

Use terminal window (e.g. CMD on Windows) to browse to rclone executable and run

rclone authorize dropbox\n

and press enter

Rclone will launch a web page to enable login to the cloud service and authorization of the connection

After successful authorization, the terminal window will display the authorization token that needs to be pasted into ROCKNIX ssh

Copy the entire token

"},{"location":"configure/cloud-sync/#update-rocknix-with-authorization-token","title":"Update ROCKNIX with authorization token","text":"

Paste authorization token into ROCKNIX command prompt, then type y to confirm that the remote connection is correct

The connection is now configured and can be tested (q to quit rclone config)

Type

rclone lsd rg503:\n

where rg503 is the name of the remote connection (rclone example names the remote connection as remote)

don't forget to add : to the name of remote connection

The names of the top-level folders within Dropbox cloud service will be displayed

"},{"location":"configure/cloud-sync/#nfs-storage","title":"NFS Storage","text":"

Create a file in '/storage/' called '.nfs-mount' containing a single line of the format:

NFS_PATH=<Valid NFS URI>

Navigate to 'Tools' and select 'Mount NFS' entry. The NFS path will be mounted to /storage/games-external and an overlay merge with /storage/games-internal as the upper will be created at /storage/roms. Saves/state will be written locally.

"},{"location":"configure/collections/","title":"Collections","text":"

In addition to the systems displayed; EmulationStation (ES) has functionality to create custom collections that you can use to group and organize your game library in different ways. For example; if you wanted to create a view that automatically grouped all of your Role Playing Games or one that only lists the games you are currently playing you can use ES collections to do that.

All of the options described below can be managed by pressing START anywhere in ES to open the Main Menu and then opening Game Collection Settings

"},{"location":"configure/collections/#managing-your-backlog","title":"Managing Your Backlog","text":"

ROCKNIX includes a Now Playing collection that can be used to curate and play through your backlog. You can turn this on by going to Game Collection Settings > Create New Custom Collection from Theme while using our default system-theme.

Once its turned on; you can add to it by pressing X(NORTH) on any game while in ES. In the menu that opens you'll see Now Playing listed under the collections header. Simply highlight it and press the confirm button.

You can also set ROCKNIX to boot directly into the Now Playing collection by setting the Start on System value in the Game Collection Settings menu. Change that value to Now Playing and also turn on Start on Gamelist.

With the above settings you can create a very simple view of the games you are trying to finish that displays when ROCKNIX launches.

"},{"location":"configure/collections/#collection-types","title":"Collection Types","text":"

There are 3 collection types in ES so let's walk through each to help you decide which makes sense to use for your use cases.

"},{"location":"configure/collections/#automated-collections","title":"Automated Collections","text":"

EmulationStation has a set of built-in automated collections to easily view your last played games, favorites and all the games in your library. You can turn these on or off in the Automated Game Collections menu.

"},{"location":"configure/collections/#editable-collections","title":"Editable Collections","text":"

An editable collection is one that you can specifically curate by hand. Simply give it a name and then as you are browing your gamelists you can press X(NORTH) on any game and add it to the collection you created. As an example, you could use this functionality to create a collection for all of your Final Fantasy games and then manually add each FF game to the list.

"},{"location":"configure/collections/#dynamic-collections","title":"Dynamic Collections","text":"

A dynamic collection enables you to create a set of filters that will automatically group your games. For example if you wanted to create a collection that automatically grouped all of your Role Playing Games into a single view; you could create a dynamic collection called RPGs, select a genre filter of Role Playing Games and then save the filter. Then any time you add a new game with the Role Playing genre it will automatically show up in this collection.

"},{"location":"configure/collections/#additional-notes","title":"Additional Notes","text":"

You can also use the Game Collection Settings menu to manage which systems are displayed. Press START anywhere in ES to open the Main Menu and then go to Game Collection Settings > Systems Displayed. In this menu; uncheck the systems you would like to hide and then exit the menu. ES will then refresh and those systems will be hidden.

"},{"location":"configure/hdmi/","title":"HDMI","text":"

Some devices support HDMI output to an external display.

To set the output resolution (eg to 1280x720) automatically on boot on a build using the sway compositor:

Create autostart script:

mkdir /storage/.config/autostart\nnano /storage/.config/autostart/090-sway-hdmi-resolution\n

In script (set a proper \"output...\" string to match your modifications):

#!/bin/bash\necho \"output HDMI-A-1 resolution 1280x720\" >> /storage/.config/sway/config\n

Make the script executable:

chmod +x /storage/.config/autostart/090-sway-hdmi-resolution\n

"},{"location":"configure/networking/","title":"Networking","text":"

Networking can be set up on any device that can connect to the internet (this includes devices with native networking capabilites and ones where networking can be added through an external dongle).

With networking turned on you do things such as add games, update ROCKNIX, netplay across devices, cloud sync, play over VPN and access RetroAchievements.

"},{"location":"configure/networking/#setup","title":"Setup","text":"
  1. While in EmulationStation press START on your controller to open the Main Menu.
  2. Navigate to and select Network Settings.
  3. Under the Network Configuration header turn on Enable Network.
  4. Then select WIFI SSID and choose your network name.
  5. Finally enter your password under WIFI Key using the onscreen keyboard.

When you exit the network settings menu your network should activiate.

"},{"location":"configure/networking/#additional-notes","title":"Additional Notes","text":"
  • If you want to transfer games over the network make sure to turn enable SSH and Samba under Network Services. You can read more about that on the Add Games page.
  • If you want to enable netplay to be able to play multiplayer across devices please see the page on Netplay.
  • Check out Cloud Sync to see the available options and steps for setting up cloud sync services.
  • If you would like to earn achievements while playing games please check out RetroAchievements
  • If you have pre-existing collections you can use NFS(Network File System) to mount an NFS share which will be merged with the internal storage to quickly access pre-curated collections instantly(sometimes refered to as streaming) see Add Games
"},{"location":"configure/optimizations/","title":"Optimizations","text":"

ROCKNIX provides a variety of settings that allow you to optimize for battery life or performance globally, on a per system and per game basis. For emulating 6th generation and later systems, we recommend installing ROCKNIX on internal storage if available to reduce IO bottlenecks reading and writing shader cache.

"},{"location":"configure/optimizations/#optimizing-for-performance","title":"Optimizing For Performance","text":"

Optimizing for performance will have significant impact on battery life, however it will also provide the best experience for more demanding emulators.

"},{"location":"configure/optimizations/#recommended-global-settings","title":"Recommended Global Settings","text":""},{"location":"configure/optimizations/#amd-intel-based-devices","title":"AMD / Intel based devices","text":"Enabled CPU Threads CPU Scheduler Energy Performance Preference GPU Performance Profile Enhanced Power Saving Cooling Profile WIFI Power Saving All Schedutil Balanced Performance Balanced Off Moderate1 or Auto Off

Note: The ROCKNIX team DOES NOT recommend the \"BEST PERFORMANCE\" GPU profile on AMD devices as it sets the profile_peak GPU profile which can lead to poor performance and kernel panics, use \"BALANCED\" instead.

"},{"location":"configure/optimizations/#glmark","title":"GLMark","text":"DEVICE @ TDP 4w 6w 9w 15w 18w 24w 28w Loki Max (6800U) 2082 3068 4910 7266 8600 9990 10319 Loki Zero (3050e) 515 1303 1943 3195 3466 3615 3618 Atari VCS (R1606G) 534 565 1055 1342 1376 1378 1376 AYANEO 2S (7840U) 1784 2341 4646 8109 9049 9699 9844 AYANEO Air Plus (6800U) 854 2051 4192 5946 7340 9325 9674 AYANEO Air Pro (5560U) 878 1405 3543 5193 5716 5874 5892"},{"location":"configure/optimizations/#7z","title":"7z","text":"DEVICE @ TDP 4w 6w 9w 15w 18w 24w 28w Loki Max (6800U) 12129 19530 28391 42809 46432 51183 53276 Loki Zero (3050e) 3370 5304 7397 8441 8514 8493 8441 Atari VCS (R1606G) 5015 6172 9027 9726 9239 9233 9257 AYANEO 2S (7840U) 9319 15790 24295 38956 45249 55117 58515 AYANEO Air Plus (6800U) 6323 11394 22519 39682 43529 47904 47562 AYANEO Air Pro (5560U) 6940 13919 21916 30421 32565 35375 36723"},{"location":"configure/optimizations/#arm-based-devices","title":"ARM based devices","text":"Enabled CPU Threads CPU Scheduler GPU Performance Profile Enhanced Power Saving Cooling Profile WIFI Power Saving All Performance Best Performance Off Moderate1 or Auto Off

Note: It's recommended to reboot the device after disabling Enhanced Power Saving.

"},{"location":"configure/optimizations/#optimizing-for-battery-life","title":"Optimizing For Battery Life","text":"

ROCKNIX includes an Enhanced Power Saving mode which is available in the System Settings menu. This option provides a variety of sub options that when enabled tune your device for optimal battery life without immediately sacrificing performance.

Feature Function May Affect Stability CPU Power Saving Tunes the CPU/SoC to preference battery life over performance. No Audio Power Saving Enables the audio device to operate in a low power mode. No PCIE Active State Power Management Forces a low power state for PCI and PCIe connections. Yes Enable Wake Events Enables PCI wakeup signalling to allow devices to enter low power states. Yes Runtime Power Management Enables USB idle power management, and configures usb devices to autosuspend. Yes"},{"location":"configure/optimizations/#recommended-settings","title":"Recommended Settings","text":"

Enable Enhanced Power Saving, and enable all options. If the device has undesired behavior, disable the options that may effect stability and reboot the device.

"},{"location":"configure/optimizations/#amd-intel-based-devices_1","title":"AMD / Intel based devices","text":"Enabled CPU Threads CPU Scheduler Energy Performance Preference GPU Performance Profile Enhanced Power Saving Cooling Profile WIFI Power Saving 4 Powersave Power Saving Battery Focus On Quiet1 On

ROCKNIX recommends setting the minimum TDP that offers full performance for your game or system.

"},{"location":"configure/optimizations/#glmark_1","title":"GLMark","text":"DEVICE @ TDP 4w 6w 9w 15w 18w 24w 28w Loki Max 1968 2869 4660 7042 8243 9442 9804 Loki Zero 544 1130 1313 1385 1378 1392 1397 Atari VCS 305 332 332 332 333 333 332 AYANEO 2S (7840U) 1594 2340 4582 7713 8157 9658 9889 AYANEO Air Plus 744 2103 3971 6086 7193 8908 9377 AYANEO Air Pro (5560U) 979 1956 3639 5057 5503 5708 5742"},{"location":"configure/optimizations/#7z_1","title":"7z","text":"DEVICE @ TDP 4w 6w 9w 15w 18w 24w 28w Loki Max 6931 11247 14003 15941 16114 16758 16792 Loki Zero 2980 2986 3006 2992 2992 2993 2978 Atari VCS 2464 4513 4530 4524 4531 4529 4549 AYANEO 2S (7840U) 5419 8765 13465 19799 21247 22709 23197 AYANEO Air Plus 5731 8291 13139 15638 16205 16065 16001 AYANEO Air Pro (5560U) 6100 9234 11955 14269 14711 14822 14856"},{"location":"configure/optimizations/#arm-based-devices_1","title":"ARM based devices","text":"Enabled CPU Threads CPU Scheduler GPU Performance Profile Enhanced Power Saving Cooling Profile WIFI Power Saving 4 Powersave Battery Focus On Quiet1 On"},{"location":"configure/optimizations/#recommended-settings-per-system","title":"Recommended Settings Per System","text":""},{"location":"configure/optimizations/#amd-intel","title":"AMD / Intel","text":"

As performance varies across supported devices, there are no specific recommendations. Explore various settings to find the best configuration per system/game for your device.

"},{"location":"configure/optimizations/#arm-devices","title":"ARM Devices","text":"Manufacturer System Enabled CPU Threads CPU Scheduler GPU Performance Profile Enhanced Power Saving Cooling Profile WIFI Power Saving Nintendo 64 All Performance Best Performance Off Moderate1 or Auto Off Nintendo GameCube, Wii All Performance Best Performance Off Moderate1 or Auto Off Sega Saturn, Dreamcast All Performance Best Performance Off Moderate1 or Auto Off Sony PSP All Performance Best Performance Off Moderate1 or Auto Off

1 Only available if the feature is supported on your device.

"},{"location":"configure/overlays/","title":"Overlays","text":""},{"location":"configure/overlays/#retroarch","title":"RetroArch","text":"

Overlays should be possible to add when using RetroArch cores. Broadly speaking overlays serve three purposes:

  1. To fill the black areas of the screen while playing games that were developed for a different aspect ratio than the device uses (e.g 4:3 games on a 16:9 screen)
  2. To simulate scan lines to improve how games originally developed for CRT monitors are displayed on low-powered devices. For high-powered devices you probably want to use a shader
  3. To display buttons on devices with touch-screens

Instructions on how to use overlays can be found here: Libretro Overlays. Suggested sample configurations for different systems can be found in Retrogamecorps Overlay and Shaders guide.

The default selection of overlays in Retroarch is limited, additional overlays can be found on Github, see e.g Duimn Retroarch-Overlays for 16:9 systems or Ourigen Perfect Overlays for 4:3 screens.

"},{"location":"configure/overlays/#stand-alone-emulators","title":"Stand-Alone Emulators","text":"

Overlays are not supported for standalone emulators. That said, if you are interested in developing the support to add them please check out how to start contributing here.

"},{"location":"configure/scraper/","title":"Scraping","text":"

Scraping allows you to download metadata, images and videos for your games, as well as manuals and sometimes even game maps.

From this... To this...

To scrape games, your device needs an internet connection, and you\u2019ll also need to create to create an account on ScreenScraper.

Once you have created a ScreenScraper account:

  1. Press Start to access the Main Menu, then go to Scraper.
  2. Enter your ScreenScraper username and password in the Username and Password fields.
  3. Using the checkboxes, select which resources you want to download when scraping (Preview images are downloaded automatically, and so are the game\u2019s title, release date, developer, etc)

Please see our Recommended Configurations for options that we believe work well with our default theme.

"},{"location":"configure/shaders/","title":"Shaders","text":""},{"location":"configure/shaders/#creating-a-custom-shader-preset","title":"Creating a custom shader preset","text":"

ROCKNIX supports adding custom shaders in addition to the built-in shaders available in the \"Advanced Game Options\" and \"Game Settings / Per System Advanced Configuration\" settings \"shader set\" selection.

"},{"location":"configure/shaders/#step-1-launch-a-game-and-access-the-shaders-menu-in-quick-settings","title":"Step 1: Launch a game and access the shaders menu in quick settings","text":"

If Shaders are set to \"off,\" change to \"on\"

"},{"location":"configure/shaders/#step-2-configure-shader-settings-to-preference-by-modifying-existing-shaders","title":"Step 2: Configure Shader settings to preference by modifying existing shaders","text":"

Specific parameters will vary on a per-shader basis so it's recommended you test with the individual shaders first by loading the built-ins and modifying their parameters to your preference. When you know how you'd lke to configure everything, you'll select your parameters and passes. To start, you'll select the number of shader passes, the filtering (linear, nearests, or default), and the number of passes for each individual shader listed (generally leave this item at default). Then select \"apply changes,\" set parameters, and save the shader.

"},{"location":"configure/shaders/#example","title":"Example","text":"

The below example shader configuration is based on a custom shader with two passes for GBA to enable vba-color for original colors (ala real hardware) and LCD grid:

In shaders, choose \"load\" and then load \"vba-color\" (either from the main list, or if on android/PC, it'll be in the \"handhelds\" folder.

Once loaded, go down to \"shader passes\" and change it from 1 to 2.

For the second pass where it says \"N/A\" select it, go into the \"handhelds\" folder and choose LCD1x.

Then press \"Apply changes\" to set it. From there go into \"shader parameters\" and you'll see the darkening, brighten scanlines, and brighten LCD options. Configure parameters as preferred. For this example, set:

  • Darken: 0.25
  • Brighten Scanlines: 28.00
  • Brighten LCD: 6.00

Once it's configured to your liking, back out of the parameters menu and in the shaders menu press \"save\" in the menu list. In the save menu set \"Simple Presets\" to \"off\" and then \"save shader preset as\" and name the custom shader. It will now be selectable as a default like any of the other preconfigured shaders.

You can add additional passes following the steps above (increase passes to 3 and follow the same steps), but keep in mind performance will be dependent on your device, and not all shaders will work at full speed with multiple passes.

"},{"location":"configure/shaders/#step-3-save-your-new-shader-preset","title":"Step 3: Save your new shader preset","text":"

Select \"Save\" in the shaders menu.

At the top of the list, set \"Simple Presets\" to off. Then choose \"Save Shader Preset As\" and name the shader. Press the enter key on the on-screen keyboard to save the preset. Exit Retroarch normally via the hotkey preset, or by backing out to the main menu and choosing \"Quit Retroarch\"

"},{"location":"configure/shaders/#step-4-load-your-shader-preset-from-rocknix-menu","title":"Step 4: Load your shader preset from ROCKNIX menu","text":"

Browse into either \"advanced game options\" within game selection, or Main Menu -> Game Settings -> Per System Advanced Configuration.

Select shader set, then browse through with the d-pad, joystick, or L/R buttons to page. Your custom shader will now be available to select in the list.

"},{"location":"configure/themes/","title":"Themes","text":"

Our default frontend is EmulationStation and our default theme is Art Book Next (which has been designed specifically to work with all the aspect ratios we support). You will see it represented in the UI as system-theme and it's updated automatically as part of each ROCKNIX release. It also offers a set of options to tailor the look of theme which are detailed below.

"},{"location":"configure/themes/#preview","title":"Preview","text":""},{"location":"configure/themes/#theme-configuration","title":"Theme Configuration","text":"

The following options can be changed directly from the main menu under UI Settings > Theme Configuration

Option Description Distribution Used to define which folder to look in for Theme Customization files. For ROCKNIX installs this defaults to ROCKNIX so please leave it as such Aspect Ratio Enables you to select the correct aspect ratio for your screen. ROCKNIX supports 16:9, 4:3, 16:10, 5:3, 3:2 and 1:1 aspect ratios. We default this automatically so you should not need to change it but if the theme layout looks odd or spacing looks incorrect you can use this setting to make sure the aspect ratio matches your screen. Color Scheme Sets the color scheme that is used for the theme. There is a set of prebuilt color schemes that you can select and an option to supply your custom color scheme (selected by choosing custom). You can see details on customizations below under Theme Customziations. Font Size When this is set to custom it allows you to define custom font sizes for the gamelist. You can see details on customizations below under Theme Customziations. System View Style Defines the layout/design used for the System View Gamelist View Style Defines the layout/design used for the Gamelist View"},{"location":"configure/themes/#recommended-configurations","title":"Recommended Configurations","text":""},{"location":"configure/themes/#option-1-if-you-prefer-screenshots","title":"Option 1: If you prefer Screenshots","text":"Setting Value Scraper: Image Source Screenshot Scraper: Box Source Box 2D Scraper: Logo Source Wheel Theme Configuration: Gamelist View Style Metadata On (Immersive) or Metadata Off (Immersive)"},{"location":"configure/themes/#option-2-if-you-prefer-boxart","title":"Option 2: If you prefer Boxart","text":"Setting Value Scraper: Image Source Box 2D Scraper: Box Source None Scraper: Logo Source Wheel Theme Configuration: Gamelist View Style Metadata On"},{"location":"configure/themes/#theme-customizations","title":"Theme Customizations","text":"

Art Book Next allows customizations to artwork, colors and fonts without the need to edit the source XML. This enables you to change the look of the theme and retain any changes when ROCKNIX is updated.

"},{"location":"configure/themes/#start-here","title":"Start Here","text":"
  • Create the following path on your storage device: ~/roms/rocknix/theme-customizations/art-book-next/
  • In Theme Configuration make sure distribution is set to ROCKNIX (this is needed to make sure the above path is referenced when looking for customization files)
"},{"location":"configure/themes/#background-art","title":"Background Art","text":"

The artwork used on the system view can be customized with your own images. You can create either centered or full screen variations.

  • Create a folder in the path you created above called backgrounds
  • Upload your custom background images to that folder
  • They can be named:
    • _default.jpg
    • _default.png
    • ${system.theme}.jpg
    • ${system.theme}.png
  • The theme will look them them up in that order. If a given image is not found in your folder then the the images from the theme will be used as a fallback. This allows you to customize only the images you want and still have images displayed for all systems.
  • _default.jpg/png can be used for creating a single image that is used for all systems OR a fallback for systems that you did not create a custom image for (if you don't want to use the fallback that already exists in the theme)
  • ${system.theme}.jpg/png should be named for the system you are looking to override. For example if you wanted to override the artwork for snes you would create an image called snes.jpg or snes.png in the backgrounds folder
  • once your images are in place you turn on custom images by changing the System View Style to either...
    • Centered Artwork (Custom)
    • Multi Artwork (Custom)
    • Fullscreen Artwork (Custom)
    • I added these options so you could switch off custom artwork without needing to delete your customizations

To create centered artwork that matches the mask used in the theme you can use the system-art-mask files I supply in the theme's resources directory here. I have tried to include a mask that works in the major editing programs.

If you create a set of images that you would like to share with the community please let us know about it in the themes channel on Discord

"},{"location":"configure/themes/#logos","title":"Logos","text":"

The logos used on the system and gamelist views can be customized with your own images.

  • Create a folder in the path you created above called logos
  • Upload your custom logo images to that folder
  • They can be named:
    • ${system.theme}.svg
    • ${system.theme}.png
  • The theme will look them them up in that order. I recommend SVGs as they scale better on different resolutions.
  • ${system.theme}.svg/png should be named for the system you are looking to override. For example if you wanted to override the artwork for snes you would create an image called snes.svg or snes.png in the logos folder
  • once your images are in place you turn on custom logos by changing the Color Scheme to Custom
"},{"location":"configure/themes/#color-schemes","title":"Color Schemes","text":"

You can create your own custom color scheme to use for the theme

  • Download this template: https://github.com/anthonycaccese/art-book-next-jelos/blob/main/resources/customizations/colors.xml
  • Upload it in the path you created above and make sure its called colors.xml
  • Change any values in the template to the colors you prefer.
  • I tried to make the values as self explanatory as possible but if you have questions regarding which property does what please don't hesitate to ask.
  • After your colors are defined; in theme configuration change Color Scheme to Custom
"},{"location":"configure/themes/#fonts","title":"Fonts","text":"

You can modify the font size used to display gamelists

  • Download this template: https://github.com/anthonycaccese/art-book-next-jelos/blob/main/resources/customizations/fonts.xml
  • Upload it in the path you created above and make sure its called fonts.xml
  • Change any values in the above template to the sizes you like.
  • After your sizes are defined; in theme configuration change Font Size to Custom
"},{"location":"configure/themes/#adding-additional-themes","title":"Adding Additional Themes","text":"

You can upload additional themes to your device at this path: /storage/.emulationstation/themes

Below are a few sources for themes that may work.

"},{"location":"configure/themes/#option-1-batocera-themes","title":"Option 1: Batocera Themes","text":"
  • Our version of EmulationStation is forked from the same version used in Batocera so you can also use themes that were created for Batocera.
  • You can find a list of Batocera themes here: https://batocera.org/themes.php

There are no guarantees that themes from the above list will support the aspect ratio of your device or all of the systems we support. Because of that; some themes may look odd, not display all systems or have layouts that do not match well to your screen.

"},{"location":"configure/themes/#option-2-community-created-themes","title":"Option 2: Community Created Themes","text":"

Members of our Community create themes as well. This list is not exhaustive but here are a few that have been shared on discord that are known to work well:

  • es-theme-gbz35-jelos by booYah187: Known to work well on 4:3 aspect ratio
  • es-theme-albedo by mluizvitor: Known to work well on 3:2, 4:3 and 5:3 aspect ratios
  • es-theme-elementerial by mluizvitor: Known to work well on 3:2, 4:3 and 5:3 aspect ratios
"},{"location":"configure/themes/#creating-your-own-theme","title":"Creating Your Own Theme","text":"

An exhaustive tutorial is out of scope for this wiki. That said; please see Batocera's theme documention @ https://wiki.batocera.org/write_themes_for_emulationstation. Its a great starter guide for understanding the fundamentals of creating themes for the version of EmulationStation used by ROCKNIX.

"},{"location":"configure/vpn/","title":"VPN Services","text":"

ROCKNIX has built in support for multiple VPN services.

"},{"location":"configure/vpn/#tailscale","title":"Tailscale","text":"

Tailscale is a VPN service that makes the devices and applications you own accessible anywhere in the world, securely and effortlessly. It enables encrypted point-to-point connections using the open source WireGuard protocol, which means only devices on your private network can communicate with each other.

"},{"location":"configure/vpn/#step-1-sign-up-for-tailscale-account","title":"Step 1: Sign up for Tailscale account","text":"

Sign up for a Tailscale account.

Tailscale requires a Single Sign-On (SSO) provider, so you\u2019ll need a Google, Microsoft, GitHub, Okta, OneLogin, or other supported SSO identity provider account to begin.

"},{"location":"configure/vpn/#step-2-add-a-pc-to-your-tailscale-network","title":"Step 2: Add a PC to your Tailscale network","text":"

Tailscale helps you connect your devices together. For that to be possible, Tailscale needs to run on your PC.

Tailscale works seamlessly with Linux, Windows, macOS, Raspberry Pi, Android, Synology, and more. Download Tailscale and log in on the PC.

Download Tailscale

"},{"location":"configure/vpn/#step-3-add-your-device-to-your-network","title":"Step 3: Add your device to your network","text":"

ROCKNIX Emulation Station has customized UI with Tailscale support.

  • Press \"start\" button to go into Emulation Station Main Menu.
  • Select Network Settings submenu.
  • Select \"Tailscale VPN\" and turn it on.
  • Select \"Back\" button to exit setting dialog.

The initial connection to Tailscale will require authentication.

  • Select Network Settings submenu again.
  • You should see Tailscale authentication url. You need to type this url on your PC browser and authenticate.
  • After login on PC is successful, Select \"Tailscale VPN\" and turn it on again.
  • Select \"Back\" button to exit setting dialog.
  • Tailscale VPN should be connected.
"},{"location":"configure/vpn/#links","title":"Links","text":"
  • Tailscale homepage link
"},{"location":"configure/vpn/#wireguard","title":"Wireguard","text":"

As game streaming becomes more popular, it enables AAA games, streamed over the internet from your home computer, to be played on your console while traveling.

"},{"location":"configure/vpn/#configuring-wireguard-vpn-in-rocknix","title":"Configuring WireGuard VPN in ROCKNIX","text":"

Typically the configuration involves copying your WireGuard VPN config file over to your ROCKNIX device and then enabling WireGuard VPN in Emulation Station Network Settings menu.

"},{"location":"configure/vpn/#wireguard-config","title":"WireGuard Config","text":"

ROCKNIX uses standard WireGuard config file format. The file is typically provided by your VPN provider. If you want to host your own VPN Server on your local network, there are plenty of tutorials available online.

Currently only the single connection is supported. The WireGuard config file must be placed in the following location - /storage/.config/wireguard/wg0.conf. Please use SSH or Samba to create the file there.

Don't forget to restart Emulation Station to pick up the changes.

Sample wg0.conf file

[Interface]\nPrivateKey = <your private key>\nAddress = 10.111.10.2/24\n\n[Peer]\nPublicKey = <server public key>\nAllowedIPs = 0.0.0.0/0\nEndpoint = <server>:<port>\n

Note: \"DNS\" option is not yet supported in the config. Please remove line starting with \"DNS\" from your config file.

"},{"location":"configure/vpn/#enabling-wireguard-connection","title":"Enabling WireGuard connection","text":"

Emulation Station now has a new menu item toggle to enable or disable WireGuard VPN connection. Use it turn the connection on or off.

Note: make sure that WireGuard config file is present on the device, see the Configuring WireGuard VPN in ROCKNIX section above. The menu option is only available when the config file is present.

Connect to configured VPN server * Press \"start\" button to go into Emulation Station Main Menu * Select Network Settings submenu * Select \"Wireguard VPN\" and turn it on * Select \"Back\" button to exit setting dialog * WireGuard VPN should be connected

Disconnect from configured VPN server * Press \"start\" button to go into Emulation Station Main Menu * Select Network Settings submenu * Select \"Wireguard VPN\" and turn it off * Select \"Back\" button to exit setting dialog * WireGuard VPN should be disconnected

"},{"location":"configure/vpn/#server-configuration-for-advanced-users","title":"Server Configuration (for advanced users)","text":"

The local PC can be setup to be a WireGuard server. This allows accessing that PC (and a local network if SNAT is enabled) from the remote location using the device.

The configuration is the following: * Generate pair of configuration files * Install WireGuard on your local PC and import server config * Setup Port Forwarding for WireGuard port from your local router to your local PC * Enable WireGuard on your device

"},{"location":"configure/vpn/#config-pair-generation","title":"Config Pair generation","text":"

The device have a helper script which can generate a pair of configuration files for the device and for the local PC with WireGuard server.

The script should be executed from SSH terminal.

# Generate config file\nwg-genconfig\n
The script will generate wg0.conf and wg0.conf.server files.

"},{"location":"configure/vpn/#wg0confserver-server-config","title":"wg0.conf.server server config","text":"

[Interface]\nPrivateKey = <server private key>\n# PublicKey = <server public key>\nAddress = 10.111.10.1/24\nListenPort = 51820\n\n# If you want to access other devices on the same network,\n# you need to enable SNAT, the lines below.\n# Make sure that eth0 matches your main network interface.\n#PostUp = echo 1 > /proc/sys/net/ipv4/ip_forward\n#PostUp = iptables -A FORWARD -i %i -j ACCEPT\n#PostUp = iptables -A FORWARD -o %i -j ACCEPT\n#PostUp = iptables -t nat -A POSTROUTING -s 10.111.10.0/24 -o eth0 -j MASQUERADE\n#PostDown = iptables -D FORWARD -i %i -j ACCEPT\n#PostDown = iptables -D FORWARD -o %i -j ACCEPT\n#PostDown = iptables -t nat -D POSTROUTING -s 10.111.10.0/24 -o eth0 -j MASQUERADE\n\n[Peer]\nPublicKey = <device public key>\nAllowedIPs = 10.111.10.2/32\n
If you want you device to access your local network, you need to enable SNAT, allow your local PC forward network packets to other devices on your local network. That is done by uncommenting PostUp/PostDown commands in the config.

"},{"location":"configure/vpn/#install-wireguard-on-your-local-pc","title":"Install WireGuard on your local PC","text":"
  • Download the client for your OS from here.
  • Import wg0.conf.server and enable the tunnel.
"},{"location":"configure/vpn/#troubleshooting","title":"Troubleshooting","text":""},{"location":"configure/vpn/#diagnostics","title":"Diagnostics","text":"

Sometimes the tunnel doesn't establish successfully. The following commands can useful to diagnose issues.

The commands below should be executed on the device using SSH shell access.

# Check the status of active tunnels.\n# You should see the connection statistics.\nwg show\n
# Check my public ip address\ncurl ifconfig.co -4\n
# Bring tunnel up\nwg-quick up /storage/.config/wireguard/wg0.conf\n
# Bring tunnel down\nwg-quick down /storage/.config/wireguard/wg0.conf\n

"},{"location":"configure/vpn/#links_1","title":"Links","text":"
  • WireGuard homepage link
  • WireGuard is also supported in ConnMan VPN plugin using ssh command line link
"},{"location":"configure/vpn/#zerotier","title":"ZeroTier","text":"

ZeroTier allows you to build robust peer-to-peer networks, connetcting all of your devices together. It's very similar to Tailscale.

"},{"location":"configure/vpn/#step-1-sign-up-for-zerotier-account","title":"Step 1: Sign up for ZeroTier account","text":"

Sign up for a ZeroTier account.

"},{"location":"configure/vpn/#step-2-add-other-devices-to-your-zerotier-network","title":"Step 2: Add other devices to your ZeroTier network","text":"

You can add devices that you want connected to the ZeroTier network. One device can be connected to multiple networks, so you can even have different networks for different purposes.

It's most likely going to run everywhere you want it, since the software exists for OpenWRT, Desktop Linux, Windows, Android, etc.

Download ZeroTier

"},{"location":"configure/vpn/#step-3-add-your-device-to-your-network_1","title":"Step 3: Add your device to your network","text":"

ROCKNIX Emulation Station has customized UI with ZeroTier support.

  • Create a file called \"zerotier-networks\" in /storage/.config/zerotier-networks, containing one network ID per line
  • Press \"start\" button to go into Emulation Station Main Menu.
  • Select Network Settings submenu.
  • Select \"ZeroTier VPN\" and turn it on.
  • Select \"Back\" button to exit setting dialog.

Don't forget to authenticate your device in the ZerTier control panel after starting the service. It should show up on the webpage.

You can also use the traditional way of adding a network ID by using zerotier-cli join through SSH shell, but in this cae the zerotier-networks file shouldn't be present.

"},{"location":"configure/vpn/#links_2","title":"Links","text":"
  • ZeroTier homepage link
  • Script used to add networks on start link
"},{"location":"contribute/","title":"Index","text":""},{"location":"contribute/#contributing-to-rocknix","title":"Contributing to ROCKNIX","text":"

Your contribution helps ROCKNIX become a better Linux distribution, so we're glad you're here! We aim to make contributing to this project as easy and transparent as possible.

Contributors are able to:

  • Discuss the current state of the code
  • Submit a fix
  • Propose new features
  • Become a maintainer
"},{"location":"contribute/#becoming-a-maintainer","title":"Becoming a maintainer","text":"

When contributing to ROCKNIX you are expected to become the maintainer of your contribution. Please keep this in mind when submitting pull requests.

  • Keep track of your contributions upstream and keep your components up-to-date.
  • Watch the issue tracker and resolve issues related to your contribution.
"},{"location":"contribute/#we-develop-with-github","title":"We Develop with Github","text":"

We use Github to host code, to track issues and feature requests, as well as accept pull requests.

Pull requests are the best way to propose changes to the codebase (we use Github Flow). We actively welcome your pull requests:

  1. Join our discord and chat with us, we'll be happy to help you successfully implement your change.
  2. Fork the repo and create your branch from dev.
  3. Ensure your code is built locally and tested.
  4. Any changes should be reflected in the documentation.
  5. Issue a pull request back to our dev branch.
"},{"location":"contribute/#use-a-consistent-coding-style","title":"Use a Consistent Coding Style","text":"
  • Please follow the same style as the source you are editing.
  • If you are contributing new code, keep the style consistent with other similar works.
  • Parameterize as much as possible, try to avoid hard coded values whenever you can.
  • Use 2 spaces for indentation rather than tabs when possible.
"},{"location":"contribute/#license","title":"License","text":"

When you submit code changes, your submissions are understood to be contributed under the same license as the original project code or under GPLv2 license when no other license applies.

"},{"location":"contribute/#getting-started","title":"Getting Started","text":"

Our recommended next step is getting a build environment set up so you can see how ROCKNIX works and how packages are built. Check out the details in Building ROCKNIX and if you have any questions please let us know on Discord.

This document was adapted from the open-source contribution guidelines for Facebook's Draft

"},{"location":"contribute/build/","title":"Building ROCKNIX","text":"

ROCKNIX is a fairly unique distribution as it is built to order and only enough of the operating system and applications are built for the purpose of booting and executing emulators and ports. Developers and others who would like to contribute to our project should read and agree to the Contributor Code of Conduct and Contributing to ROCKNIX guides before submitting your first contribution.

"},{"location":"contribute/build/#1-prep","title":"1. Prep","text":"

Building ROCKNIX requires a host with 200GB of free space for a single device, or 1TB of free space for a full world build.

Expect your first build to take on the order of ten hours. You will need a stable internet connection, since hundreds of packages will be downloaded from their source.

Download errors often produce build failures with misleading error messages. If this happens to you, see the Troubleshooting section below.

After a clean build, all subsequent builds will go much faster (minutes) since 99% of the build work is cached.

"},{"location":"contribute/build/#docker-recommended","title":"Docker (Recommended)","text":"

Docker is the easiest and most reliable way to build ROCKNIX.

You need no previous experience with Docker; you merely need to install it on your build machine. Newcomers to the project are strongly recommended to use this approach.

We recommend using Ubuntu 22.04 for the host machine, as this is well-tested and known to work. Other distributions and operating systems might also work for Docker builds, but are untested and unsupported.

Install Docker using the following commands:
sudo apt update\nsudo apt install ca-certificates curl gnupg\n\nsudo install -m 0755 -d /etc/apt/keyrings\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg\nsudo chmod a+r /etc/apt/keyrings/docker.gpg\n\necho \\\n  \"deb [arch=\"$(dpkg --print-architecture)\" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \\\n  \"$(. /etc/os-release && echo \"$VERSION_CODENAME\")\" stable\" | \\\n  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null\n\nsudo apt update\nsudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\n\nsudo groupadd docker\nsudo usermod -aG docker $USER\nnewgrp docker\n\ndocker run hello-world\n

Docker installation reference (source): Install using the apt repository and Linux post-installation steps.

The final command should produce a message indicating that Docker is properly installed. If you encounter any errors, see the reference links above.

"},{"location":"contribute/build/#manual-build","title":"Manual Build","text":"

Manual builds (outside of Docker) are only recommended for developers with specific needs that cannot be met by the Docker approach. The host configuration should match the Docker container as closely as possible, running Ubuntu 22.04 with all packages listed in the Dockerfile.

"},{"location":"contribute/build/#virtual-machines","title":"Virtual Machines","text":"

If you prefer to use a virtual machine for your build platform; keep in mind that results vary. There have been some reports of success with VMware Workstation (Player and Pro) and WSL and some unsuccessful attempts with VirtualBox. These reports are not definitive, but something to keep in mind if you prefer to use a VM.

"},{"location":"contribute/build/#2-clone","title":"2. Clone","text":"

After preparing the build machine, clone the ROCKNIX git repository onto it.

cd ~\ngit clone https://github.com/ROCKNIX/distribution.git\n
"},{"location":"contribute/build/#selecting-the-desired-branch","title":"Selecting the Desired Branch","text":"

Once you have cloned the repo, decide whether you want to build the main branch which is more stable, or the development branch which is unstable but hosts our newest features.

Branch Purpose main Stable ROCKNIX sources dev Unstable ROCKNIX sources

To check out our development branch, cd into the project directory and checkout dev.

cd distribution\ngit checkout dev\n
"},{"location":"contribute/build/#filesystem-structure","title":"Filesystem Structure","text":"

We have a simple filesystem structure adopted from parent distributions CoreELEC, LibreELEC, etc.

.\n\u251c\u2500\u2500 build.ROCKNIX-DEVICE.ARCHITECTURE\n\u251c\u2500\u2500 config\n\u251c\u2500\u2500 distributions\n\u251c\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 licenses\n\u251c\u2500\u2500 Makefile\n\u251c\u2500\u2500 packages\n\u251c\u2500\u2500 post-update\n\u251c\u2500\u2500 projects\n\u251c\u2500\u2500 release\n\u251c\u2500\u2500 scripts\n\u251c\u2500\u2500 sources\n\u2514\u2500\u2500 tools\n

build.ROCKNIX-DEVICE.ARCHITECTURE

Build roots for each device and that device's architecture(s). For ARM devices ROCKNIX builds and uses a 32bit root for several of the cores used in the 64bit distribution.

config

Contains functions utilized during the build process including architecture specific build flags, optimizations, and functions used throughout the build workflow.

distributions

Distributions contains distribution-specific build flags and parameters and splash screens.

Dockerfile

Used to build the Ubuntu container used to build ROCKNIX. The container is hosted at https://hub.docker.com/u/rocknix.

licenses

All of the licenses used throughout the distribution packages are hosted here. If you're adding a package that contains a license, make sure it is available in this directory before submitting the PR.

Makefile

Used to build one or more ROCKNIX images, or to build and deploy the Ubuntu container.

packages

All of the packages used to develop and build ROCKNIX are hosted within the packages directory. The package structure documentation is available here.

post-update

Anything that is necessary to be run on a device after an upgrade should be added here. Be sure to apply a guard to test that the change needs to be executed before execution.

projects

Hardware-specific parameters are stored in the projects folder. Anything that should not be included on every device during a world build should be isolated to the specific project or device here.

release

The output directory for all of the build images.

scripts

This directory contains all of the scripts used to fetch, extract, build, and release the distribution. Review Makefile for more details.

sources

As the distribution is being built, package source files are fetched and hosted in this directory. They will persist after a make clean.

tools

The tools directory contains utility scripts that can be used during the development process, including a simple tool to burn an image to a usb drive or sdcard.

"},{"location":"contribute/build/#3-build","title":"3. Build","text":""},{"location":"contribute/build/#making-the-builder-image","title":"Making the Builder image","text":"

To be able to build with Docker, you'll need to create the builder image. This only needs to be done one time before you build your first image.

make docker-image-build\n

For users with docker <= 22, the BuildKit plugin must also be installed. You can alternatively build using the legacy builder with docker build --tag \"rocknix/rocknix-build:latest\" .

"},{"location":"contribute/build/#building-device-images","title":"Building Device Images","text":"

Building ROCKNIX is easy. From the root of your local repository, issue one of the make commands listed below, depending on the desired device and whether you are using Docker.

Devices Dependency Docker Command Manual Command RK3588 make docker-RK3588 make RK3588 RK3326 make docker-RK3326 make RK3326 RK3566 make docker-RK3566 make RK3566 S922X make docker-S922X make S922X ALL DEVICES make docker-world make world

Devices that list a dependency require you to build the dependency first, since that build will be used as the root of the device you are building.

For example, the following command uses Docker to build the RK3588 image.

make docker-RK3588\n
"},{"location":"contribute/build/#rightsized-builds","title":"Rightsized Builds","text":"

ROCKNIX supports various build variables which alter the behavior of the distribution for specific purposes including debugging, or hosting containers. The options are defined below and are passed on the make command line. Ex. BASE_ONLY=true make docker-RK3566.

Build Option Default Function EMULATION_DEVICE yes Builds EmulationStation and all emulators if yes. Builds EmulationStation and NO emulators if no. ENABLE_32BIT yes Builds a 32bit root and includes it in the image. Needed for 32bit cores and applications. BASE_ONLY false1 Builds only the bare minimum packages. Includes Sway or Weston on supported devices. Does not build EmulationStation. CONTAINER_SUPPORT no Builds support for running containers on ROCKNIX.

Note: 1 this property will change to yes/no for consistency in a future release.

"},{"location":"contribute/build/#env-variables","title":"Env Variables","text":"

For development builds, you can use the following env variables to customize the image or change build time functionality. To make them globally available to the builds, add them to ${HOME}/.ROCKNIX/options.

Variable Function LOCAL_SSH_KEYS_FILE Enables using ssh public keys for access without the root password. LOCAL_WIFI_SSID The SSID of the network the device should connect to automatically. LOCAL_WIFI_KEY The WIFI authentication key for the connection.\" SCREENSCRAPER_DEV_LOGIN Login information for screenscraper.fr. GAMESDB_APIKEY Login information for thegamesdb.net. CHEEVOS_DEV_LOGIN Login information for retroachievements.org. CLEAN_PACKAGES Allows specifying packages to clean during a build. CONCURRENCY_MAKE_LEVEL The number of concurrent jobs to use during a build (defaults to the number returned by nproc)."},{"location":"contribute/build/#ssh-keys","title":"SSH Keys","text":"
export LOCAL_SSH_KEYS_FILE=~/.ssh/rocknix/authorized_keys\n
"},{"location":"contribute/build/#wifi-ssid-and-password","title":"WiFi SSID and password","text":"
export LOCAL_WIFI_SSID=MYWIFI\nexport LOCAL_WIFI_KEY=secret\n
"},{"location":"contribute/build/#screenscraper-gamesdb-and-retroachievements","title":"Screenscraper, GamesDB, and RetroAchievements","text":"

To enable Screenscraper, GamesDB, and RetroAchievements, register at each site and apply the api keys in ${HOME}/.ROCKNIX/options. Unsetting one of the variables will disable it in EmulationStation. This configuration is picked up by EmulationStation during the build.

# Apply for a Screenscraper API Key here: https://www.screenscraper.fr/forumsujets.php?frub=12&numpage=0\nexport SCREENSCRAPER_DEV_LOGIN=\"devid=DEVID&devpassword=DEVPASSWORD\"\n# Apply for a GamesDB API Key here: https://forums.thegamesdb.net/viewforum.php?f=10\nexport GAMESDB_APIKEY=\"APIKEY\"\n# Find your Cheevos Web API key here: https://retroachievements.org/controlpanel.php\nexport CHEEVOS_DEV_LOGIN=\"z=RETROACHIEVEMENTSUSERNAME&y=APIKEYID\"\n
"},{"location":"contribute/build/#cleaning-additional-packages","title":"Cleaning Additional Packages","text":"

make docker-shell\nCLEAN_PACKAGES=\"linux ppsspp-sa\" make RK3588\nexit\n
The first and last lines should be omitted if building outside of Docker.

"},{"location":"contribute/build/#troubleshooting","title":"Troubleshooting","text":"

The very first build after a fresh checkout is the hardest. Give yourself sufficient time to generate the first build and work through any failures before attempting to modify ROCKNIX.

Download errors can produce misleading failure messages so beware of chasing red herrings. A network failure is much more likely than a bug in the makefile, given how frequently it is tested by our CI system and other devs.

"},{"location":"contribute/build/#option-1-clean-the-package-that-failed","title":"Option 1: Clean the package that failed","text":"

Try cleaning the failed package and building again using the following command:

PROJECT={PROJECT} DEVICE={DEVICE} ARCH={ARCH} ./scripts/clean {PACAKGE NAME}\n

Use this table to determine the values you should use in the above command:

For Build PROJECT DEVICE ARCH RK3588 Rockchip RK3588 aarch64 RK3326 Rockchip RK3326 aarch64 RK3566 Rockchip RK3566 aarch64 RK3566-X55 Rockchip RK3566-X55 aarch64 S922X Amlogic S922X aarch64

As an example; if you were buildling RK3588 and wanted to clean the mame-lr package:

PROJECT=Rockchip DEVICE=RK3588 ARCH=aarch64 ./scripts/clean mame-lr\n

After cleaning a package you can try to build/install it directly as a quick way to see if the error is resolved. Just change the script to install or build depending on what the package requires.

Using our example above (e.g. building for RK3588) mame-lr requires install so you can run this command to check it directly

PROJECT=Rockchip DEVICE=RK3588 ARCH=aarch64 ./scripts/install mame-lr\n

If that completes without error then running the build for your device should proceed.

"},{"location":"contribute/build/#option-2-delete-the-source-of-the-package-that-failed","title":"Option 2: Delete the source of the package that failed","text":"

If you are still getting an error after trying the above its likely that a download failure occured for the source of the package that is failing.

In this case; manually delete the relevant package(s) from the sources and build.ROCKNIX-... directories and start your build again. This will force that package to be re-downloaded from source and re-built.

"},{"location":"contribute/build/#additional-notes","title":"Additional notes","text":"
  • In most cases build failures are caused by single package failures which the above options should help resolve. Exhaust all options before using make clean for the entire build. That action will delete the build cache and takes hours to regenerate.
  • As a very last resort, delete the entire local repository and start over. This is VERY rarely needed so please focus on the above options first.
"},{"location":"contribute/code-of-conduct/","title":"Contributor Code of Conduct","text":""},{"location":"contribute/code-of-conduct/#our-pledge","title":"Our Pledge","text":"

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

"},{"location":"contribute/code-of-conduct/#our-standards","title":"Our Standards","text":"

Examples of behavior that contributes to a positive environment for our community include:

  • Demonstrating empathy and kindness toward other people
  • Being respectful of differing opinions, viewpoints, and experiences
  • Giving and gracefully accepting constructive feedback
  • Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
  • Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

  • The use of sexualized language or imagery, and sexual attention or advances of any kind
  • Trolling, insulting or derogatory comments, and personal or political attacks
  • Public or private harassment
  • Publishing others' private information, such as a physical or email address, without their explicit permission
  • Other conduct which could reasonably be considered inappropriate in a professional setting
"},{"location":"contribute/code-of-conduct/#enforcement-responsibilities","title":"Enforcement Responsibilities","text":"

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

"},{"location":"contribute/code-of-conduct/#scope","title":"Scope","text":"

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

"},{"location":"contribute/code-of-conduct/#enforcement","title":"Enforcement","text":"

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at contact at rocknix dot org. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

"},{"location":"contribute/code-of-conduct/#enforcement-guidelines","title":"Enforcement Guidelines","text":"

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

"},{"location":"contribute/code-of-conduct/#1-correction","title":"1. Correction","text":"

Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

"},{"location":"contribute/code-of-conduct/#2-warning","title":"2. Warning","text":"

Community Impact: A violation through a single incident or series of actions.

Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

"},{"location":"contribute/code-of-conduct/#3-temporary-ban","title":"3. Temporary Ban","text":"

Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

"},{"location":"contribute/code-of-conduct/#4-permanent-ban","title":"4. Permanent Ban","text":"

Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

Consequence: A permanent ban from any sort of public interaction within the community.

"},{"location":"contribute/code-of-conduct/#attribution","title":"Attribution","text":"

This Code of Conduct is adapted from the Contributor Covenant, version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

"},{"location":"contribute/modify/","title":"Modifying ROCKNIX","text":"

Before modifying ROCKNIX, be sure you can successfully build the unmodified main or dev branch. Establish a baseline of success before introducing changes to the ROCKNIX source.

"},{"location":"contribute/modify/#building-a-single-package","title":"Building a Single Package","text":"

When modifying individual packages, it's useful to regularly verify the build-ability of your changes. Rather than rebuild an entire device image, it is much faster to simply rebuild a single package using the following commands:

make docker-shell\nexport PROJECT=Rockchip DEVICE=RK3588 ARCH=aarch64\n./scripts/clean busybox\n./scripts/build busybox\nexit\n

PROJECT is one of Amlogic, PC, or Rockchip (i.e. the subdirectories of the project directory).

The first and last lines should be omitted if building outside of Docker.

If you are interested in an EmulationStation package build it requires additional steps because its source code is located in a separate repository. Please see instructions here.

"},{"location":"contribute/modify/#creating-a-patch-for-a-package","title":"Creating a Patch for a Package","text":"

It is common to have imported package source code modifed to fit the use case. It's recommended to use a special shell script to build it in case you need to iterate over it. See below.

cd sources/wireguard-linux-compat\ntar -xvJf wireguard-linux-compat-v1.0.20211208.tar.xz\nmv wireguard-linux-compat-v1.0.20211208 wireguard-linux-compat\ncp -rf wireguard-linux-compat wireguard-linux-compat.orig\n\n# Make your changes to wireguard-linux-compat\nmkdir -p ../../packages/network/wireguard-linux-compat/patches/RK3588\n# run from the sources dir\ndiff -rupN wireguard-linux-compat wireguard-linux-compat.orig >../../packages/network/wireguard-linux-compat/patches/RK3588/mychanges.patch\n
"},{"location":"contribute/modify/#creating-a-patch-for-a-package-using-git","title":"Creating a Patch for a Package Using git","text":"

If you are working with a git repository, building a patch for the distribution is simple. Rather than using diff, use git diff.

cd sources/emulationstation/emulationstation-098226b/\n# Make your changes to EmulationStation\nvim/emacs/vscode/notepad.exe\n# Make the patch directory\nmkdir -p ../../packages/ui/emulationstation/patches\n# Run from the sources dir\ngit diff >../../packages/ui/emulationstation/patches/005-mypatch.patch\n

After the patch is generated, rebuild an individual package by following the section above. The build system will automatically pick up patch files from the patches directory. For testing, one can either copy the built binary to the console or burn the whole image on SD card.

"},{"location":"contribute/modify/#building-a-modified-image","title":"Building a Modified Image","text":"

If you already have a build for your device made using the above process, it's simple to shortcut the build process and create an image to test your changes quickly using the process below.

make docker-shell\n\n# Update the package version for a new package, or apply your patch as above.\nvim/emacs/vscode/notepad.exe\n\nexport OS_VERSION=$(date +%Y%m%d) BUILD_DATE=$(date)\nexport PROJECT=Rockchip DEVICE=RK3588 ARCH=aarch64\n./scripts/clean emulationstation\n./scripts/build emulationstation\n./scripts/install emulationstation\n./scripts/image mkimage\n\nexit\n

The first and last lines should be omitted if building outside of Docker.

"},{"location":"contribute/modify/#pushing-modified-images-to-a-device","title":"Pushing Modified Images to a Device","text":"

You can of course reflash the SD card with the modified image.

Alternatively, you may install the image through the ROCKNIX update mechanism, which retains your ES and emulator settings. If the device is networked and reachable from the build machine, this can be done as follows.

# Replace with your device values\nHOST=192.168.0.123\nDEVICE=RK3566\nARCH=aarch64\n\n# Assume today is the same UTC day that the image was built\nTIMESTAMP=$(date -u +%Y%m%d)\n\nSSH_OPTS=\"-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\"\nscp ${SSH_OPTS} ~/distribution/release/ROCKNIX-${DEVICE}.${ARCH}-${TIMESTAMP}.tar root@${HOST}:~/.update && \\\n    ssh ${SSH_OPTS} root@{HOST} reboot\n
"},{"location":"contribute/modify/#common-file-locations","title":"Common File Locations","text":"

Below is a reference for the locations of files you may frequently interact with while modifying ROCKNIX

File \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Location Description bootloader mkimage projects/Rockchip/bootloader/mkimage busybox package packages/sysutils/busybox init packages/sysutils/busybox/scripts/init kernel config projects/Rockchip/devices/RK3566-ML/linux/linux.aarch64.conf running kernel config build.ROCKNIX-RK3566-ML.aarch64/linux-6.5-rc7/.config boot.scr projects/Rockchip/devices/RK3566/boot/boot.scr uboot package.mk projects/Rockchip/packages/u-boot/package.mk uboot sources/u-boot/u-boot-976fb2f uboot config sources/u-boot/u-boot-976fb2f/configs/anbernic-rgxx3-rk3566_defconfig dts sources sources/u-boot/u-boot-976fb2f/arch/arm/dts/rk3566-anbernic-rgxx3.dts kernel sources/build build.ROCKNIX-RK3566-ML.aarch64/linux-6.6-rc3 final.img releases $EXTRA_CMDLINE projects/Rockchip/devices/RK3566-ML/options $INSTALL /config $BUILD/image/system, /scripts ${BUILD}/initramfs $LE_TEMP scripts/mkimage mktemp -d -p $TARGET_IMG"},{"location":"contribute/packages/","title":"Structure of package.mk files","text":""},{"location":"contribute/packages/#introduction","title":"Introduction","text":"

The package.mk file defines variables and functions to build a package.

"},{"location":"contribute/packages/#variables","title":"Variables","text":"

To control the build behaviour of your package, use variables in the top-down order listed here.

"},{"location":"contribute/packages/#base","title":"Base","text":"Variable Default Required Description PKG_NAME - yes Name of the packaged software application. Should be lowercase PKG_VERSION - yes Version of the packaged software application. If the version is a githash, please use the full githash, not the abbreviated form. PKG_SHA256 - yes SHA256 hashsum of the application download file PKG_ARCH any no Architectures for which the package builds. any or a space separated list of aarch64, arm or x86_64 PKG_LICENSE - yes License of the software application. Reference PKG_SITE - yes Site of the software application PKG_URL - yes Address at which the source of the software application can be retrieved PKG_MAINTAINER - no Your name PKG_DEPENDS_BOOTSTRAPPKG_DEPENDS_HOST PKG_DEPENDS_INIT PKG_DEPENDS_TARGET - no A space separated list of name of packages required to build the software application PKG_SECTION - no virtual if the package only defines dependencies PKG_SHORTDESC - noyes\u00a0for\u00a0addons Short description of the software package PKG_LONGDESC - yes Long description of the package including purpose or function within ROCKNIX or Kodi"},{"location":"contribute/packages/#universal-build-option","title":"Universal Build Option","text":"Variable Default Required Description PKG_SOURCE_DIR - no Force the folder name that application sources are unpacked to. Used when sources do not automatically unpack to a folder with the PKG_NAME-PKG_VERSION naming convention. PKG_SOURCE_NAME - no Force the filename of the application sources. Used when the filename is not the basename of PKG_URL PKG_PATCH_DIRS - no Patches in ./patches are automatically applied after package unpack. Use this option to include patches from an additional folder, e.g. ./patches/$PKG_PATCH_DIRS PKG_NEED_UNPACK - no Space separated list of files or folders to include in package stamp calculation. If the stamp is invalidated through changes to package files or dependent files/folders the package is cleaned and rebuilt. e.g. PKG_NEED_UNPACK=\"$(get_pkg_directory linux)\" will trigger clean/rebuild of a Linux kernel driver package when a change to the linux kernel package is detected. PKG_TOOLCHAIN auto no Control which build toolchain is used. For detailed information, see reference. PKG_BUILD_FLAGS - no A space separated list of flags with which to fine-tune the build process. Flags can be enabled or disabled with a + or - prefix. For detailed information, see the Reference. PKG_PYTHON_VERSION python2.7 no Define the Python version to be used. PKG_IS_KERNEL_PKG - no Set to yes for packages that include Linux kernel modules"},{"location":"contribute/packages/#meson-options","title":"Meson Options","text":"Variable Default Required Description PKG_MESON_SCRIPT ${PKG_BUILD}/meson.build no Meson build file to use PKG_MESON_OPTS_TARGET - no Options directly passed to meson"},{"location":"contribute/packages/#cmake-options","title":"CMAKE Options","text":"Variable Default Required Description PKG_CMAKE_SCRIPT ${PKG_BUILD}/CMakeLists.txt no CMake build file to use PKG_CMAKE_OPTS_HOSTPKG_CMAKE_OPTS_TARGET - no Options directly passed to cmake"},{"location":"contribute/packages/#configure-options","title":"Configure Options","text":"Variable Default Required Description PKG_CONFIGURE_SCRIPT ${PKG_BUILD}/configure no configure script to use PKG_CONFIGURE_OPTSPKG_CONFIGURE_OPTS_BOOTSTRAPPKG_CONFIGURE_OPTS_HOSTPKG_CONFIGURE_OPTS_INITPKG_CONFIGURE_OPTS_TARGET - no Options directly passed to configure"},{"location":"contribute/packages/#make-options","title":"Make Options","text":"Variable Default Required Description PKG_MAKE_OPTSPKG_MAKE_OPTS_BOOTSTRPPKG_MAKE_OPTS_HOSTPKG_MAKE_OPTS_INIT PKG_MAKE_OPTS_TARGET - no Options directly passed to make in the build step PKG_MAKEINSTALL_OPTS_HOSTPKG_MAKEINSTALL_OPTS_TARGET - no Options directly passed to make in the install step"},{"location":"contribute/packages/#addons","title":"Addons","text":"

Additional options used when the package builds an addon.

Variable Default Required Description PKG_REV - yes The revision number of the addon (starts at 100). Must be placed after PKG_VERSION. Must be incremented for each new version else Kodi clients will not detect version change and download the updated addon. PKG_IS_ADDON no yes Must be set to yes or to embedded when this addon is part of the image PKG_ADDON_NAME - yes Proper name of the addon that is shown at the repo PKG_ADDON_TYPE - yes See LE/config/addon/ for other possibilities PKG_ADDON_VERSION - no The version of the addon, used in addon.xml PKG_ADDON_PROVIDES - no Provides in addon-xml PKG_ADDON_REQUIRES - no Requires used in addon.xml PKG_ADDON_PROJECTS @PROJECTS@ no for available projects or devices, see projects subdirectory (note: Use RPi for RPi project, and RPi1 for RPi device) PKG_DISCLAIMER - no Disclaimer in addon-xml PKG_ADDON_IS_STANDALONE - no Defines if an addon depends on Kodi (on) or is standalone (yes) PKG_ADDON_BROKEN - no Marks an addon as broken for the user"},{"location":"contribute/packages/#detailed-information-for-options","title":"Detailed Information for Options","text":""},{"location":"contribute/packages/#toolchain-options","title":"TOOLCHAIN options","text":"

Application/packages needs different toolchains for build. For instance cmake or the classic ./configure or same very different.

For the most application/packages, the auto-detection of the toolchain works proper. But not always. To select a specific toolchain, you only need to set the PKG_TOOLCHAIN variable.

Toolchain Description (if needed) meson Meson Build System cmake CMake with Ninja cmake-make CMake with Make autotools GNU Build System configure preconfigured GNU Build System ninja Ninja Build make Makefile Based manual only runs self writen build steps, see Functions"},{"location":"contribute/packages/#auto-detection","title":"Auto-Detection","text":"

The auto-detections looks for specific files in the source path.

  1. meson.build (PKG_MESON_SCRIPT) => meson toolchain
  2. CMakeLists.txt (PKG_CMAKE_SCRIPT) => cmake toolchain
  3. configure (PKG_CONFIGURE_SCRIPT) => configure toolchain
  4. Makefile => make toolchain

When none of these was found, the build abort and you have to set the toolchain via PKG_TOOLCHAIN

"},{"location":"contribute/packages/#build_flags-options","title":"BUILD_FLAGS options","text":"

Build flags implement often used build options. Normally these are activated be default, but single applications/packages has problems to compile/run with these.

Set the variable PKG_BUILD_FLAGS in the package.mk to enable/disable the single flags. It is a space separated list. The flags can enabled with a + prefix, and disabled with a -.

flag default affected stage description pic disabled target/init Position Independent Code pic:host disabled host/bootstrap see above lto disabled target/init enable LTO (Link Time optimization) in the compiler and linker unless disabled via LTO_SUPPORT. Compiles non-fat LTO objects (only bytecode) and performs single-threaded optimization at link stage lto-parallel disabled target/init same as lto but enable parallel optimization at link stage. Only enable this if the package build doesn't run multiple linkers in parallel otherwise this can result in lots of parallel processes! lto-fat disabled target/init same as lto but compile fat LTO objects (bytecode plus optimized assembly). This increases compile time but can be useful to create static libraries suitable both for LTO and non-LTO linking lto-off disabled target/init explicitly disable LTO in the compiler and linker gold depend on GOLD_SUPPORT target/init can only disabled, use of the GOLD-Linker parallel enabled all make or ninja builds with multiple threads/processes (or not) strip enabled target strips executables (or not)"},{"location":"contribute/packages/#example","title":"Example","text":"
PKG_BUILD_FLAGS=\"+pic -gold\"\nPKG_BUILD_FLAGS=\"-parallel\"\n
"},{"location":"contribute/packages/#functions","title":"Functions","text":"

All build steps in the ROCKNIX build system are done by shell function. These functions can overwritten in the package.mk. But this raises problems, when the build system is updated. To reduce the problem, most function was extended by pre_ and post_ scripts, to use instead.

When it is nesseary to replace configure, make and makeinstall, please use PKG_TOOLCHAIN=\"manual\".

Some of the build steps needs to be run once, like unpack. Other steps needs to be run multiple times, to create the toolchain (stage bootstrap & host) or to create the LE image (stage init & target). These stage specific functions have the stage as suffix, like make_target.

Full list of overwrittable functions.

function stages specific description configure_package - Optional function to implement late binding variable assignment (see below) unpackpre_unpackpost_unpack - Extract the source from the downloaded file pre_patchpost_patch - Apply the patches to the source, after extraction. The patch function it self is not allowed to overwritten pre_build_[stage] yes Runs before of the start of the build pre_configurepre_configure_[stage]configure_[stage]post_configure_[stage] yes Configure the package for the compile. This is only relevant for toolchain, that supports it (e.g. meson, cmake, configure, manual) make_[stage]pre_make_[stage]post_make_[stage] yes Build of the package makeinstall_[stage]pre_makeinstall_[stage]post_makeinstall_[stage] yes Installation of the files in the correct patheshost: TOOLCHAINtarget: SYSROOT and IMAGEbootstrap and init: temporary destination addon - Copy all files together for addon creation. This is requiered for addons"},{"location":"contribute/packages/#late-binding-variable-assignment","title":"Late Binding variable assignment","text":"

A package will be loaded only once, by the call to config/options. During this process, additional package specific variables will be initialised, such as:

  • PKG_BUILD - path to the build folder
  • PKG_SOURCE_NAME - if not already specified, generated from PKG_URL, PKG_NAME andPKG_VERSION

Since these variables will not exist at the time the package is loaded, they can only be referenced after package has loaded. This can be accomplished by referencing these variables in the configure_package() function which is executed once the additional variables have been assigned.

If necessary, the following variables would be configured in configure_package() as they are normally relative to ${PKG_BUILD}:

  PKG_CONFIGURE_SCRIPT\n  PKG_CMAKE_SCRIPT\n  PKG_MESON_SCRIPT\n

Further to this, toolchain variables that are defined in setup_toolchain() must not be referenced \"globally\" in the package as they will only be configured reliably after setup_toolchain() has been called during scripts/build. Any variable in the following list must instead be referenced in a package function such as pre_build_*, pre_configure_*, pre_make_* etc.:

  TARGET_CFLAGS TARGET_CXXFLAGS TARGET_LDFLAGS\n  NINJA_OPTS MAKEFLAGS\n  DESTIMAGE\n  CC CXX CPP LD\n  AS AR NM RANLIB\n  OBJCOPY OBJDUMP\n  STRIP\n  CPPFLAGS CFLAGS CXXFLAGS LDFLAGS\n  PKG_CONFIG\n  PKG_CONFIG_PATH\n  PKG_CONFIG_LIBDIR\n  PKG_CONFIG_SYSROOT_DIR\n  PKG_CONFIG_ALLOW_SYSTEM_CFLAGS\n  PKG_CONFIG_ALLOW_SYSTEM_LIBS\n  CMAKE_CONF CMAKE\n  HOST_CC HOST_CXX HOSTCC HOSTCXX\n  CC_FOR_BUILD CXX_FOR_BUILD BUILD_CC BUILD_CXX\n  _python_sysroot _python_prefix _python_exec_prefix\n

Lastly, the following variables are assigned during scripts/build but some packages may need to use alternative values for these variables. To do so, the package must assign alternative values in pre_build_*/pre_configure_*/pre_make_* etc. functions as these functions will be called after the variables are initialised with default values in scripts/build but before they are used by scripts/build.

  CMAKE_GENERATOR_NINJA\n\n  TARGET_CONFIGURE_OPTS\n  TARGET_CMAKE_OPTS\n  TARGET_MESON_OPTS\n\n  HOST_CONFIGURE_OPTS\n  HOST_CMAKE_OPTS\n  HOST_MESON_OPTS\n\n  INIT_CONFIGURE_OPTS\n  INIT_CMAKE_OPTS\n  INIT_MESON_OPTS\n\n  BOOTSTRAP_CONFIGURE_OPTS\n  BOOTSTRAP_CMAKE_OPTS\n  BOOTSTRAP_MESON_OPTS\n

"},{"location":"contribute/packages/#example_1","title":"Example","text":"
configure_package() {\n  # now we know where we're building, assign a value\n  PKG_CONFIGURE_SCRIPT=\"${PKG_BUILD}/gettext-tools/configure\"\n}\n\npost_patch() {\n  # replace hardcoded stuff\n  sed -i ${PKG_CONFIGURE_SCRIPT} 's|hardcoded stuff|variable stuff|'\n}\n\npre_configure_target() {\n  # add extra flag to toolchain default\n  CFLAGS=\"${CFLAGS} -DEXTRA_FLAG=yeah\"\n}\n\npost_makeinstall_target() {\n  # remove unused executable, install what remains\n  rm ${INSTALL}/usr/bin/bigexecutable\n}\n
"},{"location":"contribute/packages/#toolspkgcheck","title":"tools/pkgcheck","text":"

Use tools/pkgcheck to verify packages. It detects the following issues:

Issue Level Meaning late\u00a0binding\u00a0violation FAIL Late binding variables referenced outside of a function - see late binding duplicate\u00a0function\u00a0def FAIL Function defined multiple times, only last definition will be used bad\u00a0func\u00a0-\u00a0missing\u00a0brace FAIL Opening brace ({) for function definition should be on same line as the function def, ie. pre_configure_target() { intertwined\u00a0vars\u00a0&\u00a0funcs WARN Variable assignments and logic is intertwined with functions - this is cosmetic, but variables and logic should be specified before all functions unknown\u00a0function WARN Could be a misspelled function, ie. per_configure_target() { which might fail silently. ignored\u00a0depends\u00a0assign WARN Values assigned to PKG_DEPENDS_* outside of the global section or configure_package() will be ignored."},{"location":"contribute/packages/#add-a-new-package-to-the-image","title":"Add a new package to the Image","text":"
  1. Think about, why you need it in the image.
    • new multimedia tool
    • add a new network tool
    • new kernel driver
    • ...
  2. Find a place in the packages tree
    • look into the package tree structure, which is generally self explaind.
    • do not place it in an existing package (directory that includes a package.mk)
    • when you found a place, create a directory with the name of your package (use same value for PKG_NAME!!)
  3. Create an initial package.mk
    • you can find a template under packages/package.mk.template. Copy the template into the new directory and call it package.mk
    • apply any required changes to your new package.mk
  4. Find a place in the dependency tree
    • when it extend an existing package, add it there to the PKG_DEPENDS_TARGET/PKG_DEPENDS_HOST etc.
    • take a look into the path packages/virtual, there you should find a virtual packages, that match your new package (misc-packages should be the last option)
  5. Now you can build your image
    • after the build, inside the build-* folder you should find a directory with your package name and -version, eg. widget-1.2.3.
"},{"location":"contribute/quirks/","title":"Adding Quirks","text":""},{"location":"contribute/quirks/#panel-rotation","title":"Panel Rotation","text":"

If you have a new device that supports Mainline Linux, adding and submitting a rotation patch is very simple. Adding a rotation patch to the kernel will provide the hints needed for Wayland/Weston to also correctly rotate the panel.

To begin, download the kernel sources. Extract the kernel and rename it to linux-{version}.orig, and then copy that folder to linux-{version} or extract it again so there are two copies. This will be necessary to create the patch.

"},{"location":"contribute/quirks/#panel-definition-and-default-orientation","title":"Panel Definition and Default Orientation","text":"

Next, edit linux-{version}/./drivers/gpu/drm/drm_panel_orientation_quirks.c and add a struct describing your panel and its orientation if one does not already exist. For example:

static const struct drm_dmi_panel_orientation_data lcd1080x1920_leftside_up = {\n  .width = 1080,\n  .height = 1920,\n  .orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP,\n};\n

In the example above, the panel is 1080p, and rotated to the left in order to be corrected.

"},{"location":"contribute/quirks/#dmi-matching","title":"DMI Matching","text":"

Now that the rotation correction has been defined, the kernel needs a method to match and apply it. For this we use DMI data. You can retrieve the DMI data by using cat, or dmidecode. For our example, we'll use cat.

airplus:~ # cat /sys/class/dmi/id/sys_vendor\nAYANEO\nairplus:~ # cat /sys/class/dmi/id/product_name\nAIR Plus\n

Using this data, we will create a match rule to match our panel struct in drm_panel_orientation_quirks.c.

{\n  .matches = {\n    DMI_EXACT_MATCH(DMI_SYS_VENDOR, \"AYANEO\"),\n    DMI_EXACT_MATCH(DMI_PRODUCT_NAME, \"AIR Plus\"),\n  },\n  .driver_data = (void *)&lcd1080x1920_leftside_up,\n}\n

Save, and build your patch following the instructions here. Place your patch in packages/kernel/linux/patches/RK3588 or the appropriate device directory, and run a test build.

DMI_EXACT_MATCH or DMI_MATCH can be used. DMI_EXACT_MATCH is as implied, an exact match. DMI_MATCH will match that any device where its DMI data includes \"AIR Plus\"

"},{"location":"contribute/quirks/#hardware-quirks","title":"Hardware Quirks","text":"

Adding hardware quirks are simple, and many examples can be found in packages/hardware/quirks/devices. To begin, review an existing quirk to familiarize yourself with the pattern.

"},{"location":"contribute/quirks/#creating-a-quirk","title":"Creating a Quirk","text":"

The simplest way to create a quirk for your device is to copy an existing quirk and modify it. To copy it, simply copy the whole folder to the name of your device using the same DMI pattern as above. If you are working on an AYANEO Air Plus, the folder name would be \"AYANEO Air Plus\" based on the DMI data in our example.

Next, edit each file to contain the data appropriate for your device. To collect the data that you need, use the following tools:

  • 001-deviceconfig
    • This configuration file contains basic information for ROCKNIX that cannot currently be determined automatically. A configuration is provided with the distribution if there is no quirk found, however it can be customized to suit. The following tools can be used to identify the correct data for your device.
    • KEYA/B_MODIFIER - evtest.
    • PATH_SPK/HP - amixer.
  • 002-fancontrol
    • Not all devices have methods available to control the fan. The following can help determine if yours can be controlled.
    • find /sys/devices -name pwm* and evaluate if fan control is available.
    • DEVICE_HAS_FAN=\"false\" if manual control cannot be enabled.
"},{"location":"contribute/quirks/#additional-quirks","title":"Additional Quirks","text":"

Your device may need additional quirks to function correctly or for optimization. Ask in the ROCKNIX discord if you need additional guidance.

"},{"location":"contribute/quirks/#submit-your-quirk","title":"Submit Your Quirk","text":"

Please follow the instuctons for Building and Contributing to submit your quirks to the distribution for inclusion. Please do not change major functionality of the distribution or break our hotkey standards, submissions that do not follow our standards will need to be revised.

"},{"location":"devices/","title":"Index","text":""},{"location":"devices/#devices","title":"Devices","text":"

We provide builds for the following devices:

  • Anbernic
  • Anbernic RG351
  • Anbernic RG353
  • Anbernic RG503
  • Anbernic RG552
  • Anbernic RG ARC
  • Anbernic RG35XX Plus
  • Anbernic RG35XX 2024
  • Anbernic RG35XX H
  • Anbernic RG35XX SP
  • Anbernic RG28XX
  • Anbernic RG40XX V
  • Anbernic RG40XX H
  • Anbernic RG CubeXX
  • Anbernic RG34XX
  • GameForce
  • GameForce Ace
  • Hardkernel
  • Odroid Go Advance
  • Odroid Go Super
  • Odroid Go Ultra
  • Odroid N2/N2+/N2L
  • Indiedroid
  • Nova
  • MagicX
  • XU Mini M
  • Orange Pi
  • Orange Pi 5
  • Powkiddy
  • RGB10
  • RGB10 Max 3 Pro
  • RGB10 Max 3
  • RGB10X
  • RK2023
  • RGB20SX
  • RGB30
  • X35S
  • X55
  • XU10
  • Retroid
  • Retroid Pocket Mini
  • Retroid Pocket 5
  • Unbranded
  • Game Console R33S
  • Game Console R35S R36S
"},{"location":"devices/anbernic/rg-cubexx/","title":"Anbernic RG CubeXX","text":""},{"location":"devices/anbernic/rg-cubexx/#overview","title":"Overview","text":""},{"location":"devices/anbernic/rg-cubexx/#hardware","title":"Hardware","text":"SoC CPU GPU Allwinner H700 ARM Cortex-A53 (Quad-core) @ 1.4 GHz Mali G31 Display RAM eMMC Connectivity 4.0-inch 720*720 1 GB LPDDR4 None 2.4/5 GHz WiFi + BT"},{"location":"devices/anbernic/rg-cubexx/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/anbernic/rg-cubexx/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting options. The overlock option enables 1.5 GHz operation.

Device CPU / Architecture Kernel GL driver Interface RG CubeXX Allwinner H700 (ARM) Mainline Linux Panfrost Sway + Emulation Station"},{"location":"devices/anbernic/rg-cubexx/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be run from an SD Card and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers LED Supports selecting from a set of colors or turning the power LED off (choice persists through reboots) Does not support other effects."},{"location":"devices/anbernic/rg-cubexx/#controls","title":"Controls","text":""},{"location":"devices/anbernic/rg-cubexx/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action MENU+START (x2) Quit Game MENU+R1 Save State MENU+L1 Load State MENU+X(NORTH) Open RA Menu MENU+B(SOUTH) Reset Game MENU+Y(WEST) Show FPS MENU+A(EAST) Take Screenshot MENU+R2 Fast-Forward"},{"location":"devices/anbernic/rg-cubexx/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/anbernic/rg-cubexx/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action MENU+START (hold for 2sec) Quit Game MENU+R1 Save State MENU+L1 (hold for 2sec) Load State MENU+Y(WEST) Show FPS MENU+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/anbernic/rg-cubexx/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/anbernic/rg-cubexx/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R MENU+START Quit Game MENU+R1 Save State MENU+L1 Load State MENU+Y(WEST) Take Screenshot MENU+B(SOUTH) Reset Game"},{"location":"devices/anbernic/rg-cubexx/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/anbernic/rg-cubexx/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/anbernic/rg-cubexx/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/anbernic/rg-cubexx/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/anbernic/rg-cubexx/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application MENU+Vol + Brightness Up MENU+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/anbernic/rg-cubexx/#notes_4","title":"Notes","text":""},{"location":"devices/anbernic/rg-cubexx/#installation","title":"Installation","text":"

Download the latest H700 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

Before booting the device, see the Installation Guide for H700 devices

"},{"location":"devices/anbernic/rg-cubexx/#additional-references","title":"Additional References","text":"
  • Platform Documentation (H700)
"},{"location":"devices/anbernic/rg28xx/","title":"Anbernic RG28XX","text":""},{"location":"devices/anbernic/rg28xx/#overview","title":"Overview","text":""},{"location":"devices/anbernic/rg28xx/#hardware","title":"Hardware","text":"SoC CPU GPU Allwinner H700 ARM Cortex-A53 (Quad-core) @ 1.4 GHz Mali G31 Display RAM eMMC Connectivity 2.8-inch 640*480 1 GB LPDDR4 None None"},{"location":"devices/anbernic/rg28xx/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/anbernic/rg28xx/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting options. The overlock option enables 1.5 GHz operation.

Device CPU / Architecture Kernel GL driver Interface RG28XX Allwinner H700 (ARM) Mainline Linux Panfrost Sway + Emulation Station"},{"location":"devices/anbernic/rg28xx/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be run from an SD Card and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers LED Supports selecting from a set of colors or turning the power LED off (choice persists through reboots) Does not support other effects."},{"location":"devices/anbernic/rg28xx/#controls","title":"Controls","text":""},{"location":"devices/anbernic/rg28xx/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action MENU+START (x2) Quit Game MENU+R1 Save State MENU+L1 Load State MENU+X(NORTH) Open RA Menu MENU+B(SOUTH) Reset Game MENU+Y(WEST) Show FPS MENU+A(EAST) Take Screenshot MENU+R2 Fast-Forward"},{"location":"devices/anbernic/rg28xx/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/anbernic/rg28xx/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action MENU+START (hold for 2sec) Quit Game MENU+R1 Save State MENU+L1 (hold for 2sec) Load State MENU+Y(WEST) Show FPS MENU+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/anbernic/rg28xx/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/anbernic/rg28xx/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R MENU+START Quit Game MENU+R1 Save State MENU+L1 Load State MENU+Y(WEST) Take Screenshot MENU+B(SOUTH) Reset Game"},{"location":"devices/anbernic/rg28xx/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/anbernic/rg28xx/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/anbernic/rg28xx/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/anbernic/rg28xx/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/anbernic/rg28xx/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application MENU+Vol + Brightness Up MENU+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/anbernic/rg28xx/#notes_4","title":"Notes","text":""},{"location":"devices/anbernic/rg28xx/#installation","title":"Installation","text":"

Download the latest H700 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

Before booting the device, see the Installation Guide for H700 devices

"},{"location":"devices/anbernic/rg28xx/#additional-references","title":"Additional References","text":"
  • Platform Documentation (H700)
"},{"location":"devices/anbernic/rg34xx/","title":"Anbernic RG34XX","text":""},{"location":"devices/anbernic/rg34xx/#overview","title":"Overview","text":""},{"location":"devices/anbernic/rg34xx/#hardware","title":"Hardware","text":"SoC CPU GPU Allwinner H700 ARM Cortex-A53 (Quad-core) @ 1.4 GHz Mali G31 Display RAM eMMC Connectivity 3.4-inch 720*480 1 GB LPDDR4 None 2.4/5 GHz WiFi + BT"},{"location":"devices/anbernic/rg34xx/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/anbernic/rg34xx/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting options. The overlock option enables 1.5 GHz operation.

Device CPU / Architecture Kernel GL driver Interface RG34XX Allwinner H700 (ARM) Mainline Linux Panfrost Sway + Emulation Station"},{"location":"devices/anbernic/rg34xx/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be run from an SD Card and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers LED Supports selecting from a set of colors or turning the power LED off (choice persists through reboots) Does not support other effects."},{"location":"devices/anbernic/rg34xx/#controls","title":"Controls","text":""},{"location":"devices/anbernic/rg34xx/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action MENU+START (x2) Quit Game MENU+R1 Save State MENU+L1 Load State MENU+X(NORTH) Open RA Menu MENU+B(SOUTH) Reset Game MENU+Y(WEST) Show FPS MENU+A(EAST) Take Screenshot MENU+R2 Fast-Forward"},{"location":"devices/anbernic/rg34xx/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/anbernic/rg34xx/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action MENU+START (hold for 2sec) Quit Game MENU+R1 Save State MENU+L1 (hold for 2sec) Load State MENU+Y(WEST) Show FPS MENU+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/anbernic/rg34xx/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/anbernic/rg34xx/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R MENU+START Quit Game MENU+R1 Save State MENU+L1 Load State MENU+Y(WEST) Take Screenshot MENU+B(SOUTH) Reset Game"},{"location":"devices/anbernic/rg34xx/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/anbernic/rg34xx/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/anbernic/rg34xx/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/anbernic/rg34xx/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/anbernic/rg34xx/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application MENU+Vol + Brightness Up MENU+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/anbernic/rg34xx/#notes_4","title":"Notes","text":""},{"location":"devices/anbernic/rg34xx/#installation","title":"Installation","text":"

Download the latest H700 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

Before booting the device, see the Installation Guide for H700 devices

"},{"location":"devices/anbernic/rg34xx/#additional-references","title":"Additional References","text":"
  • Platform Documentation (H700)
"},{"location":"devices/anbernic/rg351pmv/","title":"Anbernic RG351 [P/M/V]","text":""},{"location":"devices/anbernic/rg351pmv/#overview","title":"Overview","text":""},{"location":"devices/anbernic/rg351pmv/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3326 ARM Cortex-A35 (Quad-core) @ 1.3 GHz Mali G31 Display RAM eMMC Connectivity 3.5-inch 480320 (P/M), 640480 (V) 1 GB DDR3L None 2.4 GHz WiFi (M/V))"},{"location":"devices/anbernic/rg351pmv/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/anbernic/rg351pmv/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Wifi Can be turned on in Emulation Station under Main Menu > Network Settings (RG351M and RG351V Only)"},{"location":"devices/anbernic/rg351pmv/#notes","title":"Notes","text":""},{"location":"devices/anbernic/rg351pmv/#installation","title":"Installation","text":"

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/anbernic/rg351pmv/#additional-references","title":"Additional References","text":"
  • Platform Documentation (RK3326)
  • Device Quirks
"},{"location":"devices/anbernic/rg353pmvvs/","title":"Anbernic RG353 [P/M/V/VS/PS]","text":""},{"location":"devices/anbernic/rg353pmvvs/#overview","title":"Overview","text":"

eMMC models with legacy bootloader is not supported.

Anbernic RG353P/M/V/VS devices with both v1 and v2 displays are supported.

"},{"location":"devices/anbernic/rg353pmvvs/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3566 ARM Cortex-A55 (Quad-core) @ 1.8 GHz Mali G52 Display RAM eMMC Connectivity 3.5-inch 640*480 1 GB (VS/PS), 2 GB (P/M/V) LPDDR4 32GB (P/M/V) 2.4/5 GHz WiFi + BT"},{"location":"devices/anbernic/rg353pmvvs/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/anbernic/rg353pmvvs/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

  1. Inserting the OS SD card into a PC.
  2. Open ROCKNIX partition, and go to the extlinux folder.
  3. Open extlinux.conf text file.
  4. Completely remove the line that starts with FDTOVERLAYS.
  5. Now your device will boot with stock voltages.
"},{"location":"devices/anbernic/rg353pmvvs/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be installed to the emmc on P/M/V models or run from an SD Card, and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers LED Supports selecting from a set of colors or turning the power LED off (choice persists through reboots) Does not support other effects."},{"location":"devices/anbernic/rg353pmvvs/#controls","title":"Controls","text":""},{"location":"devices/anbernic/rg353pmvvs/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action SELECT+START (x2) Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+X(NORTH) Open RA Menu SELECT+B(SOUTH) Reset Game SELECT+Y(WEST) Show FPS SELECT+A(EAST) Take Screenshot SELECT+R2 Fast-Forward"},{"location":"devices/anbernic/rg353pmvvs/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/anbernic/rg353pmvvs/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action SELECT+START (hold for 2sec) Quit Game SELECT+R1 Save State SELECT+L1 (hold for 2sec) Load State SELECT+Y(WEST) Show FPS SELECT+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/anbernic/rg353pmvvs/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/anbernic/rg353pmvvs/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R SELECT+START Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+Y(WEST) Take Screenshot SELECT+B(SOUTH) Reset Game"},{"location":"devices/anbernic/rg353pmvvs/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/anbernic/rg353pmvvs/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/anbernic/rg353pmvvs/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/anbernic/rg353pmvvs/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/anbernic/rg353pmvvs/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application SELECT+Vol + Brightness Up SELECT+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/anbernic/rg353pmvvs/#notes_4","title":"Notes","text":""},{"location":"devices/anbernic/rg353pmvvs/#installation","title":"Installation","text":"

Download the latest RK3566 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/anbernic/rg353pmvvs/#pmv-users","title":"P/M/V Users","text":"

You will need to wipe the Android partition to boot into ROCKNIX.

"},{"location":"devices/anbernic/rg353pmvvs/#warning-this-will-remove-android-completely-from-your-device","title":"WARNING - This will remove Android completely from your device.","text":"
  • Install ADB on your computer if you don't already have it. How to Install and Use ADB, the Android Debug Bridge Utility

  • From power off and sd ejected, hold down power and volume down to get into Android recovery

  • Connect the device to your computer via USB using the \"DC\" port on the device.

  • Switch ADB into root mode using adb root - You may get a timeout error here, continue on anyway.

  • If you would like a backup of your Android partition, run adb pull /dev/block/mmcblk0 android.img

  • Get an ADB shell with adb shell

  • Wipe the Android partition: dd if=/dev/zero of=/dev/block/mmcblk0 bs=4M This will take a few minutes and when it is done you will get an \"out of space\" message.

  • Exit the shell exit

  • Insert your ROCKNIX SD card, and run adb reboot

  • You should now be booting ROCKNIX!

"},{"location":"devices/anbernic/rg353pmvvs/#additional-references","title":"Additional References","text":"
  • Platform Documentation (RK3566)
  • Device Quirks (353P/M)
  • Device Quirks (353V)
"},{"location":"devices/anbernic/rg353pmvvs/#community-videos","title":"Community Videos","text":""},{"location":"devices/anbernic/rg35xx-2024/","title":"Anbernic RG35XX 2024","text":""},{"location":"devices/anbernic/rg35xx-2024/#overview","title":"Overview","text":""},{"location":"devices/anbernic/rg35xx-2024/#hardware","title":"Hardware","text":"SoC CPU GPU Allwinner H700 ARM Cortex-A53 (Quad-core) @ 1.4 GHz Mali G31 Display RAM eMMC Connectivity 3.5-inch 640*480 1 GB LPDDR4 None None"},{"location":"devices/anbernic/rg35xx-2024/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/anbernic/rg35xx-2024/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting options. The overlock option enables 1.5 GHz operation.

Device CPU / Architecture Kernel GL driver Interface RG35XX 2024 Allwinner H700 (ARM) Mainline Linux Panfrost Sway + Emulation Station"},{"location":"devices/anbernic/rg35xx-2024/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be run from an SD Card and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers LED Supports selecting from a set of colors or turning the power LED off (choice persists through reboots) Does not support other effects."},{"location":"devices/anbernic/rg35xx-2024/#controls","title":"Controls","text":""},{"location":"devices/anbernic/rg35xx-2024/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action MENU+START (x2) Quit Game MENU+R1 Save State MENU+L1 Load State MENU+X(NORTH) Open RA Menu MENU+B(SOUTH) Reset Game MENU+Y(WEST) Show FPS MENU+A(EAST) Take Screenshot MENU+R2 Fast-Forward"},{"location":"devices/anbernic/rg35xx-2024/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/anbernic/rg35xx-2024/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action MENU+START (hold for 2sec) Quit Game MENU+R1 Save State MENU+L1 (hold for 2sec) Load State MENU+Y(WEST) Show FPS MENU+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/anbernic/rg35xx-2024/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/anbernic/rg35xx-2024/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R MENU+START Quit Game MENU+R1 Save State MENU+L1 Load State MENU+Y(WEST) Take Screenshot MENU+B(SOUTH) Reset Game"},{"location":"devices/anbernic/rg35xx-2024/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/anbernic/rg35xx-2024/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/anbernic/rg35xx-2024/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/anbernic/rg35xx-2024/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/anbernic/rg35xx-2024/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application MENU+Vol + Brightness Up MENU+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/anbernic/rg35xx-2024/#notes_4","title":"Notes","text":""},{"location":"devices/anbernic/rg35xx-2024/#installation","title":"Installation","text":"

Download the latest H700 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

Before booting the device, see the Installation Guide for H700 devices

"},{"location":"devices/anbernic/rg35xx-2024/#additional-references","title":"Additional References","text":"
  • Platform Documentation (H700)
"},{"location":"devices/anbernic/rg35xx-h/","title":"Anbernic RG35XX H","text":""},{"location":"devices/anbernic/rg35xx-h/#overview","title":"Overview","text":""},{"location":"devices/anbernic/rg35xx-h/#hardware","title":"Hardware","text":"SoC CPU GPU Allwinner H700 ARM Cortex-A53 (Quad-core) @ 1.4 GHz Mali G31 Display RAM eMMC Connectivity 3.5-inch 640*480 1 GB LPDDR4 None 2.4/5 GHz WiFi + BT"},{"location":"devices/anbernic/rg35xx-h/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/anbernic/rg35xx-h/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting options. The overlock option enables 1.5 GHz operation.

Device CPU / Architecture Kernel GL driver Interface RG35XX H Allwinner H700 (ARM) Mainline Linux Panfrost Sway + Emulation Station"},{"location":"devices/anbernic/rg35xx-h/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be run from an SD Card and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers LED Supports selecting from a set of colors or turning the power LED off (choice persists through reboots) Does not support other effects."},{"location":"devices/anbernic/rg35xx-h/#controls","title":"Controls","text":""},{"location":"devices/anbernic/rg35xx-h/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action MENU+START (x2) Quit Game MENU+R1 Save State MENU+L1 Load State MENU+X(NORTH) Open RA Menu MENU+B(SOUTH) Reset Game MENU+Y(WEST) Show FPS MENU+A(EAST) Take Screenshot MENU+R2 Fast-Forward"},{"location":"devices/anbernic/rg35xx-h/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/anbernic/rg35xx-h/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action MENU+START (hold for 2sec) Quit Game MENU+R1 Save State MENU+L1 (hold for 2sec) Load State MENU+Y(WEST) Show FPS MENU+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/anbernic/rg35xx-h/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/anbernic/rg35xx-h/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R MENU+START Quit Game MENU+R1 Save State MENU+L1 Load State MENU+Y(WEST) Take Screenshot MENU+B(SOUTH) Reset Game"},{"location":"devices/anbernic/rg35xx-h/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/anbernic/rg35xx-h/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/anbernic/rg35xx-h/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/anbernic/rg35xx-h/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/anbernic/rg35xx-h/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application MENU+Vol + Brightness Up MENU+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/anbernic/rg35xx-h/#notes_4","title":"Notes","text":""},{"location":"devices/anbernic/rg35xx-h/#installation","title":"Installation","text":"

Download the latest H700 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

Before booting the device, see the Installation Guide for H700 devices

"},{"location":"devices/anbernic/rg35xx-h/#additional-references","title":"Additional References","text":"
  • Platform Documentation (H700)
"},{"location":"devices/anbernic/rg35xx-plus/","title":"Anbernic RG35XX Plus","text":""},{"location":"devices/anbernic/rg35xx-plus/#overview","title":"Overview","text":""},{"location":"devices/anbernic/rg35xx-plus/#hardware","title":"Hardware","text":"SoC CPU GPU Allwinner H700 ARM Cortex-A53 (Quad-core) @ 1.4 GHz Mali G31 Display RAM eMMC Connectivity 3.5-inch 640*480 1 GB LPDDR4 None 2.4/5 GHz WiFi + BT"},{"location":"devices/anbernic/rg35xx-plus/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/anbernic/rg35xx-plus/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting options. The overlock option enables 1.5 GHz operation.

Device CPU / Architecture Kernel GL driver Interface RG35XX Plus Allwinner H700 (ARM) Mainline Linux Panfrost Sway + Emulation Station"},{"location":"devices/anbernic/rg35xx-plus/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be run from an SD Card and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers LED Supports selecting from a set of colors or turning the power LED off (choice persists through reboots) Does not support other effects."},{"location":"devices/anbernic/rg35xx-plus/#controls","title":"Controls","text":""},{"location":"devices/anbernic/rg35xx-plus/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action MENU+START (x2) Quit Game MENU+R1 Save State MENU+L1 Load State MENU+X(NORTH) Open RA Menu MENU+B(SOUTH) Reset Game MENU+Y(WEST) Show FPS MENU+A(EAST) Take Screenshot MENU+R2 Fast-Forward"},{"location":"devices/anbernic/rg35xx-plus/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/anbernic/rg35xx-plus/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action MENU+START (hold for 2sec) Quit Game MENU+R1 Save State MENU+L1 (hold for 2sec) Load State MENU+Y(WEST) Show FPS MENU+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/anbernic/rg35xx-plus/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/anbernic/rg35xx-plus/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R MENU+START Quit Game MENU+R1 Save State MENU+L1 Load State MENU+Y(WEST) Take Screenshot MENU+B(SOUTH) Reset Game"},{"location":"devices/anbernic/rg35xx-plus/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/anbernic/rg35xx-plus/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/anbernic/rg35xx-plus/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/anbernic/rg35xx-plus/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/anbernic/rg35xx-plus/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application MENU+Vol + Brightness Up MENU+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/anbernic/rg35xx-plus/#notes_4","title":"Notes","text":""},{"location":"devices/anbernic/rg35xx-plus/#installation","title":"Installation","text":"

Download the latest H700 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

Before booting the device, see the Installation Guide for H700 devices

"},{"location":"devices/anbernic/rg35xx-plus/#additional-references","title":"Additional References","text":"
  • Platform Documentation (H700)
"},{"location":"devices/anbernic/rg35xx-sp/","title":"Anbernic RG35XX SP","text":""},{"location":"devices/anbernic/rg35xx-sp/#overview","title":"Overview","text":""},{"location":"devices/anbernic/rg35xx-sp/#hardware","title":"Hardware","text":"SoC CPU GPU Allwinner H700 ARM Cortex-A53 (Quad-core) @ 1.4 GHz Mali G31 Display RAM eMMC Connectivity 3.5-inch 640*480 1 GB LPDDR4 None 2.4/5 GHz WiFi + BT"},{"location":"devices/anbernic/rg35xx-sp/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/anbernic/rg35xx-sp/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting options. The overlock option enables 1.5 GHz operation.

Device CPU / Architecture Kernel GL driver Interface RG35XX SP Allwinner H700 (ARM) Mainline Linux Panfrost Sway + Emulation Station"},{"location":"devices/anbernic/rg35xx-sp/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be run from an SD Card and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers LED Supports selecting from a set of colors or turning the power LED off (choice persists through reboots) Does not support other effects."},{"location":"devices/anbernic/rg35xx-sp/#controls","title":"Controls","text":""},{"location":"devices/anbernic/rg35xx-sp/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action MENU+START (x2) Quit Game MENU+R1 Save State MENU+L1 Load State MENU+X(NORTH) Open RA Menu MENU+B(SOUTH) Reset Game MENU+Y(WEST) Show FPS MENU+A(EAST) Take Screenshot MENU+R2 Fast-Forward"},{"location":"devices/anbernic/rg35xx-sp/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/anbernic/rg35xx-sp/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action MENU+START (hold for 2sec) Quit Game MENU+R1 Save State MENU+L1 (hold for 2sec) Load State MENU+Y(WEST) Show FPS MENU+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/anbernic/rg35xx-sp/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/anbernic/rg35xx-sp/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R MENU+START Quit Game MENU+R1 Save State MENU+L1 Load State MENU+Y(WEST) Take Screenshot MENU+B(SOUTH) Reset Game"},{"location":"devices/anbernic/rg35xx-sp/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/anbernic/rg35xx-sp/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/anbernic/rg35xx-sp/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/anbernic/rg35xx-sp/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/anbernic/rg35xx-sp/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application MENU+Vol + Brightness Up MENU+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/anbernic/rg35xx-sp/#notes_4","title":"Notes","text":""},{"location":"devices/anbernic/rg35xx-sp/#installation","title":"Installation","text":"

Download the latest H700 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

Before booting the device, see the Installation Guide for H700 devices

"},{"location":"devices/anbernic/rg35xx-sp/#additional-references","title":"Additional References","text":"
  • Platform Documentation (H700)
"},{"location":"devices/anbernic/rg40xx-h/","title":"Anbernic RG40XX H","text":""},{"location":"devices/anbernic/rg40xx-h/#overview","title":"Overview","text":""},{"location":"devices/anbernic/rg40xx-h/#hardware","title":"Hardware","text":"SoC CPU GPU Allwinner H700 ARM Cortex-A53 (Quad-core) @ 1.4 GHz Mali G31 Display RAM eMMC Connectivity 4.0-inch 640*480 1 GB LPDDR4 None 2.4/5 GHz WiFi + BT"},{"location":"devices/anbernic/rg40xx-h/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/anbernic/rg40xx-h/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting options. The overlock option enables 1.5 GHz operation.

Device CPU / Architecture Kernel GL driver Interface RG40XX H Allwinner H700 (ARM) Mainline Linux Panfrost Sway + Emulation Station"},{"location":"devices/anbernic/rg40xx-h/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be run from an SD Card and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers LED Supports selecting from a set of colors or turning the power LED off (choice persists through reboots) Does not support other effects."},{"location":"devices/anbernic/rg40xx-h/#controls","title":"Controls","text":""},{"location":"devices/anbernic/rg40xx-h/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action MENU+START (x2) Quit Game MENU+R1 Save State MENU+L1 Load State MENU+X(NORTH) Open RA Menu MENU+B(SOUTH) Reset Game MENU+Y(WEST) Show FPS MENU+A(EAST) Take Screenshot MENU+R2 Fast-Forward"},{"location":"devices/anbernic/rg40xx-h/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/anbernic/rg40xx-h/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action MENU+START (hold for 2sec) Quit Game MENU+R1 Save State MENU+L1 (hold for 2sec) Load State MENU+Y(WEST) Show FPS MENU+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/anbernic/rg40xx-h/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/anbernic/rg40xx-h/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R MENU+START Quit Game MENU+R1 Save State MENU+L1 Load State MENU+Y(WEST) Take Screenshot MENU+B(SOUTH) Reset Game"},{"location":"devices/anbernic/rg40xx-h/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/anbernic/rg40xx-h/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/anbernic/rg40xx-h/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/anbernic/rg40xx-h/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/anbernic/rg40xx-h/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application MENU+Vol + Brightness Up MENU+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/anbernic/rg40xx-h/#notes_4","title":"Notes","text":""},{"location":"devices/anbernic/rg40xx-h/#installation","title":"Installation","text":"

Download the latest H700 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

Before booting the device, see the Installation Guide for H700 devices

"},{"location":"devices/anbernic/rg40xx-h/#additional-references","title":"Additional References","text":"
  • Platform Documentation (H700)
"},{"location":"devices/anbernic/rg40xx-v/","title":"Anbernic RG40XX V","text":""},{"location":"devices/anbernic/rg40xx-v/#overview","title":"Overview","text":""},{"location":"devices/anbernic/rg40xx-v/#hardware","title":"Hardware","text":"SoC CPU GPU Allwinner H700 ARM Cortex-A53 (Quad-core) @ 1.4 GHz Mali G31 Display RAM eMMC Connectivity 4.0-inch 640*480 1 GB LPDDR4 None 2.4/5 GHz WiFi + BT"},{"location":"devices/anbernic/rg40xx-v/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/anbernic/rg40xx-v/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting options. The overlock option enables 1.5 GHz operation.

Device CPU / Architecture Kernel GL driver Interface RG40XX V Allwinner H700 (ARM) Mainline Linux Panfrost Sway + Emulation Station"},{"location":"devices/anbernic/rg40xx-v/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be run from an SD Card and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers LED Supports selecting from a set of colors or turning the power LED off (choice persists through reboots) Does not support other effects."},{"location":"devices/anbernic/rg40xx-v/#controls","title":"Controls","text":""},{"location":"devices/anbernic/rg40xx-v/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action MENU+START (x2) Quit Game MENU+R1 Save State MENU+L1 Load State MENU+X(NORTH) Open RA Menu MENU+B(SOUTH) Reset Game MENU+Y(WEST) Show FPS MENU+A(EAST) Take Screenshot MENU+R2 Fast-Forward"},{"location":"devices/anbernic/rg40xx-v/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/anbernic/rg40xx-v/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action MENU+START (hold for 2sec) Quit Game MENU+R1 Save State MENU+L1 (hold for 2sec) Load State MENU+Y(WEST) Show FPS MENU+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/anbernic/rg40xx-v/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/anbernic/rg40xx-v/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R MENU+START Quit Game MENU+R1 Save State MENU+L1 Load State MENU+Y(WEST) Take Screenshot MENU+B(SOUTH) Reset Game"},{"location":"devices/anbernic/rg40xx-v/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/anbernic/rg40xx-v/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/anbernic/rg40xx-v/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/anbernic/rg40xx-v/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/anbernic/rg40xx-v/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application MENU+Vol + Brightness Up MENU+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/anbernic/rg40xx-v/#notes_4","title":"Notes","text":""},{"location":"devices/anbernic/rg40xx-v/#installation","title":"Installation","text":"

Download the latest H700 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

Before booting the device, see the Installation Guide for H700 devices

"},{"location":"devices/anbernic/rg40xx-v/#additional-references","title":"Additional References","text":"
  • Platform Documentation (H700)
"},{"location":"devices/anbernic/rg503/","title":"Anbernic RG503","text":""},{"location":"devices/anbernic/rg503/#overview","title":"Overview","text":""},{"location":"devices/anbernic/rg503/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3566 ARM Cortex-A55 (Quad-core) @ 1.8 GHz Mali G52 Display RAM eMMC Connectivity 5-inch 960*544 1 GB LPDDR4 None 2.4/5 GHz WiFi + BT"},{"location":"devices/anbernic/rg503/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/anbernic/rg503/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

  1. Inserting the OS SD card into a PC.
  2. Open ROCKNIX partition, and go to the extlinux folder.
  3. Open extlinux.conf text file.
  4. Completely remove the line that starts with FDTOVERLAYS.
  5. Now your device will boot with stock voltages.
Device CPU / Architecture Kernel GL driver Interface RG503 Rockchip RK3566 (ARM) Mainline Linux Panfrost Sway + Emulation Station"},{"location":"devices/anbernic/rg503/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be run from an SD Card and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers LED Supports selecting from a set of colors or turning the power LED off (choice persists through reboots) Does not support other effects."},{"location":"devices/anbernic/rg503/#controls","title":"Controls","text":""},{"location":"devices/anbernic/rg503/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action SELECT+START (x2) Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+X(NORTH) Open RA Menu SELECT+B(SOUTH) Reset Game SELECT+Y(WEST) Show FPS SELECT+A(EAST) Take Screenshot SELECT+R2 Fast-Forward"},{"location":"devices/anbernic/rg503/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/anbernic/rg503/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action SELECT+START (hold for 2sec) Quit Game SELECT+R1 Save State SELECT+L1 (hold for 2sec) Load State SELECT+Y(WEST) Show FPS SELECT+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/anbernic/rg503/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/anbernic/rg503/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R SELECT+START Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+Y(WEST) Take Screenshot SELECT+B(SOUTH) Reset Game"},{"location":"devices/anbernic/rg503/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/anbernic/rg503/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/anbernic/rg503/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/anbernic/rg503/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/anbernic/rg503/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application SELECT+Vol + Brightness Up SELECT+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/anbernic/rg503/#notes_4","title":"Notes","text":""},{"location":"devices/anbernic/rg503/#installation","title":"Installation","text":"

Download the latest RK3566 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/anbernic/rg503/#additional-references","title":"Additional References","text":"
  • Platform Documentation (RK3566)
"},{"location":"devices/anbernic/rg552/","title":"Anbernic RG552","text":""},{"location":"devices/anbernic/rg552/#overview","title":"Overview","text":"Device CPU / Architecture Kernel GL driver Interface RG552 Rockchip RK3399 (ARM) Mainline Linux Panfrost Weston + Emulation Station"},{"location":"devices/anbernic/rg552/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be run from an SD Card and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers Fan Can be set globally, per system or per game."},{"location":"devices/anbernic/rg552/#notes","title":"Notes","text":""},{"location":"devices/anbernic/rg552/#installation","title":"Installation","text":"

Download the latest RK3399 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/anbernic/rg552/#additional-references","title":"Additional References","text":"
  • Platform Documentation (RK3399)
"},{"location":"devices/anbernic/rg552/#community-videos","title":"Community Videos","text":""},{"location":"devices/anbernic/rgarc/","title":"Anbernic RG ARC [D/S]","text":""},{"location":"devices/anbernic/rgarc/#overview","title":"Overview","text":"

eMMC model with legacy bootloader is not supported.

"},{"location":"devices/anbernic/rgarc/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3566 ARM Cortex-A55 (Quad-core) @ 1.8 GHz Mali G52 Display RAM eMMC Connectivity 4-inch 640*480 1 GB (S), 2 GB (D) LPDDR4 32GB (D) 2.4/5 GHz WiFi + BT"},{"location":"devices/anbernic/rgarc/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/anbernic/rgarc/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

  1. Inserting the OS SD card into a PC.
  2. Open ROCKNIX partition, and go to the extlinux folder.
  3. Open extlinux.conf text file.
  4. Completely remove the line that starts with FDTOVERLAYS.
  5. Now your device will boot with stock voltages.
"},{"location":"devices/anbernic/rgarc/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be installed to the eMMC on the D model or run from an SD Card, and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers"},{"location":"devices/anbernic/rgarc/#controls","title":"Controls","text":""},{"location":"devices/anbernic/rgarc/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action SELECT+START (x2) Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+Y(NORTH) Open RA Menu SELECT+A(SOUTH) Reset Game SELECT+X(WEST) Show FPS SELECT+B(EAST) Take Screenshot SELECT+R2 Fast-Forward"},{"location":"devices/anbernic/rgarc/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/anbernic/rgarc/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action SELECT+START (hold for 2sec) Quit Game SELECT+R1 Save State SELECT+L1 (hold for 2sec) Load State SELECT+X(WEST) Show FPS SELECT+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/anbernic/rgarc/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/anbernic/rgarc/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start A A X B Z C Up B C Down Y C Left C C Right L2 Z L1 L R1 R SELECT+START Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+X Take Screenshot SELECT+A Reset Game"},{"location":"devices/anbernic/rgarc/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press Y(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.

  • The default mapping maps the Nintendo 64 joystick to the d-pad, by selecting custom input configuration in advanced game options it will map the Nintendo 64 d-pad to the Arc d-pad.

"},{"location":"devices/anbernic/rgarc/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select B(EAST) Circle A Cross Y(NORTH) Triangle X Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/anbernic/rgarc/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start A Button 1 B(EAST) Button 2 Y(NORTH) Button 3"},{"location":"devices/anbernic/rgarc/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/anbernic/rgarc/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application SELECT+Vol + Brightness Up SELECT+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/anbernic/rgarc/#notes_4","title":"Notes","text":""},{"location":"devices/anbernic/rgarc/#installation","title":"Installation","text":"

Download the latest RK3566 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/anbernic/rgarc/#rg-arc-d-users","title":"RG-ARC-D Users","text":"

You will need to wipe the Android partition to boot into ROCKNIX.

"},{"location":"devices/anbernic/rgarc/#warning-this-will-remove-android-completely-from-your-device","title":"WARNING - This will remove Android completely from your device.","text":"
  • Install ADB on your computer if you don't already have it. How to Install and Use ADB, the Android Debug Bridge Utility

  • From power off and sd ejected, hold down power and volume down to get into Android recovery

  • Connect the device to your computer via USB using the \"DC\" port on the device.

  • Switch ADB into root mode using adb root - You may get a timeout error here, continue on anyway.

  • If you would like a backup of your Android partition, run adb pull /dev/block/mmcblk0 android.img

  • Get an ADB shell with adb shell

  • Wipe the Android partition: dd if=/dev/zero of=/dev/block/mmcblk0 bs=4M This will take a few minutes and when it is done you will get an \"out of space\" message.

  • Exit the shell exit

  • Insert your ROCKNIX SD card, and run adb reboot

  • You should now be booting ROCKNIX!

"},{"location":"devices/anbernic/rgarc/#additional-references","title":"Additional References","text":"
  • Platform Documentation (RK3566)
"},{"location":"devices/hardkernel/odroid-go-advance/","title":"Odroid Go Advance","text":""},{"location":"devices/hardkernel/odroid-go-advance/#overview","title":"Overview","text":""},{"location":"devices/hardkernel/odroid-go-advance/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3326 ARM Cortex-A35 (Quad-core) @ 1.3 GHz Mali G31 Display RAM eMMC Connectivity 3.5-inch 480*320 1 GB DDR3L None Black Edition: 2.4 GHz (ESP32-S2)"},{"location":"devices/hardkernel/odroid-go-advance/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/hardkernel/odroid-go-advance/#notes","title":"Notes","text":""},{"location":"devices/hardkernel/odroid-go-advance/#installation","title":"Installation","text":"

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/hardkernel/odroid-go-advance/#analogue-stick","title":"Analogue Stick","text":"

There are several parameters available for the analogue stick in the odroidgo2_joypad driver. These can be used to work around stick drift, or a disconnected stick, perhaps due to a broken connector on the mainboard (which causes stick input to the right to permanently register).

Parameter Notes joystick_fuzz 0 - 1800, used to filter noise from the event stream joystick_flat 0 - 1800 joystick_y_range 0 - 1800 joystick_x_range 0 - 1800 joystick_scale joystick_deadzone 0 - 1800

To override a parameter value, modify bootargs in boot.ini. For example to disable the analogue stick input, modify boot.ini to use the following values as per this Odroid forum post:

setenv joystick_fuzz \"1800\"\nsetenv joystick_flat \"1800\"\nsetenv joystick_y_range \"1800\"\nsetenv joystick_x_range \"1800\"\nsetenv joystick_scale \"2\"\nsetenv joystick_deadzone \"1800\"\nsetenv joystick_config \"button-adc-x-range=${joystick_x_range} button-adc-y-range=${joystick_y_range} button-adc-fuzz=${joystick_fuzz} button-adc-flat=${joystick_flat} button-adc-scale=${joystick_scale} button-adc-deadzone=${joystick_deadzone}\"\n\nsetenv bootargs \"<snip - existing bootargs> ${joystick_config}\"\n

"},{"location":"devices/hardkernel/odroid-go-advance/#additional-references","title":"Additional References","text":"
  • Platform Documentation (RK3326)
"},{"location":"devices/hardkernel/odroid-go-super/","title":"Odroid Go Super","text":""},{"location":"devices/hardkernel/odroid-go-super/#overview","title":"Overview","text":""},{"location":"devices/hardkernel/odroid-go-super/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3326 ARM Cortex-A35 (Quad-core) @ 1.3 GHz Mali G31 Display RAM eMMC Connectivity 5-inch 854*480 1 GB DDR3L None None"},{"location":"devices/hardkernel/odroid-go-super/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/hardkernel/odroid-go-super/#notes","title":"Notes","text":""},{"location":"devices/hardkernel/odroid-go-super/#installation","title":"Installation","text":"

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/hardkernel/odroid-go-super/#additional-references","title":"Additional References","text":"
  • Platform Documentation (RK3326)
"},{"location":"devices/hardkernel/odroid-go-ultra/","title":"Odroid Go Ultra","text":""},{"location":"devices/hardkernel/odroid-go-ultra/#overview","title":"Overview","text":"Device CPU / Architecture Kernel GL driver Interface Odroid Go Ultra Amlogic S922X / Mali G52 M6 (ARMv8-A) Mainline Linux Mali Weston + Emulation Station"},{"location":"devices/hardkernel/odroid-go-ultra/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX should be installed directly to the internal EMMC. A microSD Card can be used for game storage."},{"location":"devices/hardkernel/odroid-go-ultra/#controls","title":"Controls","text":""},{"location":"devices/hardkernel/odroid-go-ultra/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action SELECT+START (x2) Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+X(NORTH) Open RA Menu SELECT+B(SOUTH) Reset Game SELECT+Y(WEST) Show FPS SELECT+A(EAST) Take Screenshot SELECT+R2 Fast-Forward"},{"location":"devices/hardkernel/odroid-go-ultra/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/hardkernel/odroid-go-ultra/#aethersx2-ps2","title":"AetherSX2 (PS2)","text":"Button Combo Action F1+R1 Save State F1+L1 Load State F1+X(NORTH) Open Menu Required Bios Files Path SCPH-70012.bin /roms/bios/aethersx2/bios"},{"location":"devices/hardkernel/odroid-go-ultra/#drastic-nintendo-ds","title":"Drastic (Nintendo DS)","text":"Button Combo Action R2 Save State L2 Load State F1 Open Menu F2 Switch One Screen and Dual Screen Layout L3 Change Screen Layout/Swap Screens"},{"location":"devices/hardkernel/odroid-go-ultra/#dolphin-sa-gamecube-wii","title":"Dolphin-SA (Gamecube / Wii)","text":"Button Combo Action F1+START Quit Game F1+R2 Save State F1+L2 Load State F1+B(SOUTH) Screenshot F1+Y(WEST) Change Internal Resolution F1+A(EAST) Change Aspect Ratio F1+X(NORTH) Show FPS F1+D-Pad Up Increase current state slot F1+D-Pad Down Decrease current state slot F1+R1 Fast-Forward"},{"location":"devices/hardkernel/odroid-go-ultra/#lime3ds-nintendo-3ds","title":"Lime3DS (Nintendo 3DS)","text":"Button Combo Action F1+START Quit Game"},{"location":"devices/hardkernel/odroid-go-ultra/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R F1+START Quit Game F1+R1 Save State F1+L1 Load State F1+Y(WEST) Take Screenshot F1+B(SOUTH) Reset Game"},{"location":"devices/hardkernel/odroid-go-ultra/#notes_1","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/hardkernel/odroid-go-ultra/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State F1 Open Menu"},{"location":"devices/hardkernel/odroid-go-ultra/#yabasanshiro-sega-saturn","title":"Yabasanshiro (Sega Saturn)","text":"Button Combo Action START Start SELECT Open Menu Y(WEST) A A(EAST) B B(SOUTH) C X(NORTH) X L1 Y R1 Z L2 L R2 R START+SELECT+R1 Quit Game"},{"location":"devices/hardkernel/odroid-go-ultra/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/hardkernel/odroid-go-ultra/#notes_2","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/hardkernel/odroid-go-ultra/#open-beats-of-rage-openbor","title":"Open Beats of Rage (OpenBOR)","text":"Button Combo Action START Confirm SELECT Cancel B(SOUTH) Attack 1 A(EAST) Jump X(NORTH) Attack 2 Y(WEST) Special

note: pressing A on title screen will exit

"},{"location":"devices/hardkernel/odroid-go-ultra/#vice-commodore-64","title":"Vice (Commodore 64)","text":"Button Combo Action START Open Menu SELECT Display Keyboard B(SOUTH) Back A(EAST) Fire / Confirm L1 Back L2 Assign Hotkey L3 Fire (Joy 2) R1 Confirm R2 Swap Joystick Port"},{"location":"devices/hardkernel/odroid-go-ultra/#additional-notes","title":"Additional Notes:","text":"

Games will require keyboard key presses to progress through messages and to launch (e.g. SPACE, RSTR [run/start], F3, F7).

SELECT to show onscreen keyboard, left analog/d-pad to move cursor, B to confirm

C= on keyboard resets the machine

L2 to assign highlighted key or menu function to gamepad button (save config to retain)

To cancel onscreen keyboard, move cursor to blank area and A/L1 to close keyboard or click on X in top left corner of keyboard

Joystick can be assigned to port 1 or 2. R2 to switch ports. port 1: [left analog] + [B = fire] port 2: [right analog] + [L3 = fire].

To quit emulator, START, highlight Exit Emulator, B to confirm

"},{"location":"devices/hardkernel/odroid-go-ultra/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application F1+Vol + Brightness Up F1+Vol - Brightness Down F2+Vol + Battery Status F2+Vol - WIFI Toggle"},{"location":"devices/hardkernel/odroid-go-ultra/#notes_3","title":"Notes","text":""},{"location":"devices/hardkernel/odroid-go-ultra/#installation","title":"Installation","text":"

First download the latest S922X-Odroid_GOU version of ROCKNIX from the button below.

Installation process:

  1. Boot the Odroid Go Ultra into recovery mode following the steps on the Odroid wiki.
  2. Once booted into recovery mode and connected to a PC via USB-C, the ROCKNIX image may be flashed to the EMMC using Balena Etcher, win32diskimager, dd or similar.
  3. Restart the device and ROCKNIX will go through its first boot process (running from EMMC).
"},{"location":"devices/hardkernel/odroid-go-ultra/#troubleshooting","title":"Troubleshooting","text":"

You cannot brick this device. If you cannot get into recovery mode, do the following:

  • Download this recovery image.
  • Follow the recovery steps on the Odroid wiki

The device should now be in recovery mode, ready to flash ROCKNIX (or other firmware) to the device.

"},{"location":"devices/hardkernel/odroid-go-ultra/#additional-references","title":"Additional References","text":"
  • Platform Documentation (S922X)
  • Odroid Go Ultra wiki
"},{"location":"devices/hardkernel/odroid-n2/","title":"Odroid N2/N2+/N2L","text":""},{"location":"devices/hardkernel/odroid-n2/#overview","title":"Overview","text":"Device CPU / Architecture Kernel GL driver Interface N2 Amlogic S922X / Mali G52 M6 (ARMv8-A) Mainline Linux Mali Weston + Emulation Station N2+ Amlogic S922X / Mali G52 M6 (ARMv8-A) Mainline Linux Mali Weston + Emulation Station N2L Amlogic S922X / Mali G52 M6 (ARMv8-A) Mainline Linux Mali Weston + Emulation Station"},{"location":"devices/hardkernel/odroid-n2/#notes","title":"Notes","text":""},{"location":"devices/hardkernel/odroid-n2/#installation","title":"Installation","text":"

Download the latest S922X-Odroid_N2 version of ROCKNIX for N2/N2+ or S922X-Odroid_N2L for N2L from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/hardkernel/odroid-n2/#additional-references","title":"Additional References","text":"
  • Platform Documentation (S922X)
"},{"location":"devices/indiedroid/nova/","title":"Indiedroid Nova","text":""},{"location":"devices/indiedroid/nova/#overview","title":"Overview","text":"Device CPU / Architecture Kernel GL driver Interface Nova Rockchip RK3588S / Mali G610 (ARMv8-A) Rockchip 5.10 BSP Linux Panfrost Weston + Emulation Station"},{"location":"devices/indiedroid/nova/#notes","title":"Notes","text":""},{"location":"devices/indiedroid/nova/#installation","title":"Installation","text":"

Download the latest RK3588 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/indiedroid/nova/#additional-references","title":"Additional References","text":"
  • Platform Documentation (RK3588)
"},{"location":"devices/magicx/xu-mini-m/","title":"MagicX XU Mini M","text":""},{"location":"devices/magicx/xu-mini-m/#overview","title":"Overview","text":""},{"location":"devices/magicx/xu-mini-m/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3326 ARM Cortex-A35 (Quad-core) @ 1.3 GHz Mali G31 Display RAM eMMC Connectivity 2.8-inch 640*480 1 GB DDR4 None None"},{"location":"devices/magicx/xu-mini-m/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/magicx/xu-mini-m/#controls","title":"Controls","text":""},{"location":"devices/magicx/xu-mini-m/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action G(GUIDE)+START (x2) Quit Game G(GUIDE)+R1 Save State G(GUIDE)+L1 Load State G(GUIDE)+X(NORTH) Open RA Menu G(GUIDE)+B(SOUTH) Reset Game G(GUIDE)+Y(WEST) Show FPS G(GUIDE)+A(EAST) Take Screenshot G(GUIDE)+R2 Fast-Forward"},{"location":"devices/magicx/xu-mini-m/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/magicx/xu-mini-m/#emulators","title":"Emulators","text":"
  • Platform Documentation (RK3326)
"},{"location":"devices/magicx/xu-mini-m/#notes_1","title":"Notes","text":""},{"location":"devices/magicx/xu-mini-m/#installation","title":"Installation","text":"

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/orange-pi/orange-pi-5/","title":"Orange Pi 5","text":""},{"location":"devices/orange-pi/orange-pi-5/#overview","title":"Overview","text":"Device CPU / Architecture Kernel GL driver Interface Orange Pi 5 Rockchip RK3588S / Mali G610 (ARMv8-A) Rockchip 5.10 BSP Linux Panfrost Weston + Emulation Station"},{"location":"devices/orange-pi/orange-pi-5/#notes","title":"Notes","text":""},{"location":"devices/orange-pi/orange-pi-5/#installation","title":"Installation","text":"

Download the latest RK3588 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/orange-pi/orange-pi-5/#additional-references","title":"Additional References","text":"
  • Platform Documentation (RK3588)
"},{"location":"devices/orange-pi/orange-pi-5/#community-videos","title":"Community Videos","text":""},{"location":"devices/powkiddy/rgb10-max-3-pro/","title":"Powkiddy RGB10 Max 3 Pro","text":""},{"location":"devices/powkiddy/rgb10-max-3-pro/#overview","title":"Overview","text":"Device CPU / Architecture Kernel GL driver Interface RGB10 Max 3 Pro Amlogic A311D / Mali G52 M4 (ARMv8-A) Mainline Linux Mali Weston + Emulation Station"},{"location":"devices/powkiddy/rgb10-max-3-pro/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX should be installed directly to the internal EMMC. When installed directly to the EMMC; an SD Card can be used for game storage. Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers"},{"location":"devices/powkiddy/rgb10-max-3-pro/#controls","title":"Controls","text":""},{"location":"devices/powkiddy/rgb10-max-3-pro/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action SELECT+START (x2) Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+X(NORTH) Open RA Menu SELECT+B(SOUTH) Reset Game SELECT+Y(WEST) Show FPS SELECT+A(EAST) Take Screenshot SELECT+R2 Fast-Forward"},{"location":"devices/powkiddy/rgb10-max-3-pro/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/powkiddy/rgb10-max-3-pro/#aethersx2-ps2","title":"AetherSX2 (PS2)","text":"Button Combo Action F1+R1 Save State F1+L1 Load State F1+X(NORTH) Open Menu Required Bios Files Path SCPH-70012.bin /roms/bios/aethersx2/bios"},{"location":"devices/powkiddy/rgb10-max-3-pro/#drastic-nintendo-ds","title":"Drastic (Nintendo DS)","text":"Button Combo Action R2 Save State L2 Load State F1 Open Menu F2 Switch One Screen and Dual Screen Layout L3 Change Screen Layout/Swap Screens"},{"location":"devices/powkiddy/rgb10-max-3-pro/#dolphin-sa-gamecube-wii","title":"Dolphin-SA (Gamecube / Wii)","text":"Button Combo Action F1+START Quit Game F1+R2 Save State F1+L2 Load State F1+B(SOUTH) Screenshot F1+Y(WEST) Change Internal Resolution F1+A(EAST) Change Aspect Ratio F1+X(NORTH) Show FPS F1+D-Pad Up Increase current state slot F1+D-Pad Down Decrease current state slot F1+R1 Fast-Forward"},{"location":"devices/powkiddy/rgb10-max-3-pro/#lime3ds-nintendo-3ds","title":"Lime3DS (Nintendo 3DS)","text":"Button Combo Action F1+START Quit Game"},{"location":"devices/powkiddy/rgb10-max-3-pro/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R F1+START Quit Game F1+R1 Save State F1+L1 Load State F1+Y(WEST) Take Screenshot F1+B(SOUTH) Reset Game"},{"location":"devices/powkiddy/rgb10-max-3-pro/#notes_1","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/powkiddy/rgb10-max-3-pro/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State F1 Open Menu"},{"location":"devices/powkiddy/rgb10-max-3-pro/#yabasanshiro-sega-saturn","title":"Yabasanshiro (Sega Saturn)","text":"Button Combo Action START Start SELECT Open Menu Y(WEST) A A(EAST) B B(SOUTH) C X(NORTH) X L1 Y R1 Z L2 L R2 R START+SELECT+R1 Quit Game"},{"location":"devices/powkiddy/rgb10-max-3-pro/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/powkiddy/rgb10-max-3-pro/#notes_2","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/powkiddy/rgb10-max-3-pro/#open-beats-of-rage-openbor","title":"Open Beats of Rage (OpenBOR)","text":"Button Combo Action START Confirm SELECT Cancel B(SOUTH) Attack 1 A(EAST) Jump X(NORTH) Attack 2 Y(WEST) Special

note: pressing A on title screen will exit

"},{"location":"devices/powkiddy/rgb10-max-3-pro/#vice-commodore-64","title":"Vice (Commodore 64)","text":"Button Combo Action START Open Menu SELECT Display Keyboard B(SOUTH) Back A(EAST) Fire / Confirm L1 Back L2 Assign Hotkey L3 Fire (Joy 2) R1 Confirm R2 Swap Joystick Port"},{"location":"devices/powkiddy/rgb10-max-3-pro/#additional-notes","title":"Additional Notes:","text":"

Games will require keyboard key presses to progress through messages and to launch (e.g. SPACE, RSTR [run/start], F3, F7).

SELECT to show onscreen keyboard, left analog/d-pad to move cursor, B to confirm

C= on keyboard resets the machine

L2 to assign highlighted key or menu function to gamepad button (save config to retain)

To cancel onscreen keyboard, move cursor to blank area and A/L1 to close keyboard or click on X in top left corner of keyboard

Joystick can be assigned to port 1 or 2. R2 to switch ports. port 1: [left analog] + [B = fire] port 2: [right analog] + [L3 = fire].

To quit emulator, START, highlight Exit Emulator, B to confirm

"},{"location":"devices/powkiddy/rgb10-max-3-pro/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application F1+Vol + Brightness Up F1+Vol - Brightness Down F2+Vol + Battery Status F2+Vol - WIFI Toggle"},{"location":"devices/powkiddy/rgb10-max-3-pro/#emulators","title":"Emulators","text":"
  • Platform Documentation (S922X)
"},{"location":"devices/powkiddy/rgb10-max-3-pro/#notes_3","title":"Notes","text":""},{"location":"devices/powkiddy/rgb10-max-3-pro/#installation","title":"Installation","text":"

Download the latest S922X-Odroid_GOU version of ROCKNIX from the button below.

ROCKNIX must be flashed directly onto the RGB10 Max 3 Pro rather than an SD card. This is done by putting the device into recovery mode, per the manual by holding down R2, L2, and power. A video demonstation is shown here.

"},{"location":"devices/powkiddy/rgb10-max-3-pro/#troubleshooting","title":"Troubleshooting","text":"

You cannot brick this device. If you cannot get into recovery mode, do the following:

  • Download this recovery image.
  • Flash the image to a spare microSD card using Balena Etcher or similar.
  • Remove the back cover of the device (four screws).
  • Locate a small button on the back of the board (the side that's visible), near the right thumbstick.
  • While holding down the small button, power on the device.

The device should now be in recovery mode, ready to flash ROCKNIX (or other firmware) to the device.

If you find yourself doing this often, consider drilling a pinhole in the back cover so that the button can be accessed with a paperclip.

"},{"location":"devices/powkiddy/rgb10-max-3-pro/#community-videos","title":"Community Videos","text":""},{"location":"devices/powkiddy/rgb10-max-3/","title":"Powkiddy RGB10 Max 3","text":""},{"location":"devices/powkiddy/rgb10-max-3/#overview","title":"Overview","text":""},{"location":"devices/powkiddy/rgb10-max-3/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3566 ARM Cortex-A55 (Quad-core) @ 1.8 GHz Mali G52 Display RAM eMMC Connectivity 5-inch 1280*720 1 GB LPDDR4 None 2.4 GHz WiFi + BT (RTL8723DS)"},{"location":"devices/powkiddy/rgb10-max-3/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/powkiddy/rgb10-max-3/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

  1. Inserting the OS SD card into a PC.
  2. Open ROCKNIX partition, and go to the extlinux folder.
  3. Open extlinux.conf text file.
  4. Completely remove the line that starts with FDTOVERLAYS.
  5. Now your device will boot with stock voltages.
"},{"location":"devices/powkiddy/rgb10-max-3/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be run from an SD Card and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers LED Supports selecting from a set of colors or turning the power LED off (choice persists through reboots) Does not support other effects."},{"location":"devices/powkiddy/rgb10-max-3/#controls","title":"Controls","text":""},{"location":"devices/powkiddy/rgb10-max-3/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action SELECT+START (x2) Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+X(NORTH) Open RA Menu SELECT+B(SOUTH) Reset Game SELECT+Y(WEST) Show FPS SELECT+A(EAST) Take Screenshot SELECT+R2 Fast-Forward"},{"location":"devices/powkiddy/rgb10-max-3/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/powkiddy/rgb10-max-3/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action SELECT+START (hold for 2sec) Quit Game SELECT+R1 Save State SELECT+L1 (hold for 2sec) Load State SELECT+Y(WEST) Show FPS SELECT+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/powkiddy/rgb10-max-3/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/powkiddy/rgb10-max-3/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R SELECT+START Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+Y(WEST) Take Screenshot SELECT+B(SOUTH) Reset Game"},{"location":"devices/powkiddy/rgb10-max-3/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/powkiddy/rgb10-max-3/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/powkiddy/rgb10-max-3/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/powkiddy/rgb10-max-3/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/powkiddy/rgb10-max-3/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application SELECT+Vol + Brightness Up SELECT+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/powkiddy/rgb10-max-3/#emulators","title":"Emulators","text":"
  • Platform Documentation (RK3566)
"},{"location":"devices/powkiddy/rgb10-max-3/#notes_4","title":"Notes","text":""},{"location":"devices/powkiddy/rgb10-max-3/#installation","title":"Installation","text":"

Download the latest RK3566 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/powkiddy/rgb10/","title":"Powkiddy RGB10","text":""},{"location":"devices/powkiddy/rgb10/#overview","title":"Overview","text":""},{"location":"devices/powkiddy/rgb10/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3326 ARM Cortex-A35 (Quad-core) @ 1.3 GHz Mali G31 Display RAM eMMC Connectivity 3.5-inch 480*320 1 GB DDR3L None None"},{"location":"devices/powkiddy/rgb10/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/powkiddy/rgb10/#controls","title":"Controls","text":""},{"location":"devices/powkiddy/rgb10/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action SELECT+START (x2) Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+Y(NORTH) Open RA Menu SELECT+A(SOUTH) Reset Game SELECT+X(WEST) Show FPS SELECT+B(EAST) Take Screenshot SELECT+R2 Fast-Forward"},{"location":"devices/powkiddy/rgb10/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/powkiddy/rgb10/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action -(MINUS)+START (hold for 2sec) Quit Game -(MINUS)+R1 Save State -(MINUS)+L1 (hold for 2sec) Load State -(MINUS)+X(WEST) Show FPS -(MINUS)+R2 Fast-Forward +(PLUS)+L1 Select disc +(PLUS)+R1 Eject/Insert disc +(PLUS)+D-Pad Left Decrease save slot by 1 +(PLUS)+D-Pad Right Increase save slot by 1 +(PLUS)+L2 Configure buttons on virtual port 1 +(PLUS)+R2 Insert coin"},{"location":"devices/powkiddy/rgb10/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/powkiddy/rgb10/#emulators","title":"Emulators","text":"
  • Platform Documentation (RK3326)
"},{"location":"devices/powkiddy/rgb10/#notes_2","title":"Notes","text":""},{"location":"devices/powkiddy/rgb10/#installation","title":"Installation","text":"

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/powkiddy/rgb10x/","title":"Powkiddy RGB10X","text":""},{"location":"devices/powkiddy/rgb10x/#overview","title":"Overview","text":""},{"location":"devices/powkiddy/rgb10x/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3326 ARM Cortex-A35 (Quad-core) @ 1.3 GHz Mali G31 Display RAM eMMC Connectivity 3.5-inch 640*480 1 GB DDR3L None None"},{"location":"devices/powkiddy/rgb10x/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/powkiddy/rgb10x/#controls","title":"Controls","text":""},{"location":"devices/powkiddy/rgb10x/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action SELECT+START (x2) Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+Y(NORTH) Open RA Menu SELECT+A(SOUTH) Reset Game SELECT+X(WEST) Show FPS SELECT+B(EAST) Take Screenshot SELECT+R2 Fast-Forward"},{"location":"devices/powkiddy/rgb10x/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/powkiddy/rgb10x/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action -(MINUS)+START (hold for 2sec) Quit Game -(MINUS)+R1 Save State -(MINUS)+L1 (hold for 2sec) Load State -(MINUS)+X(WEST) Show FPS -(MINUS)+R2 Fast-Forward +(PLUS)+L1 Select disc +(PLUS)+R1 Eject/Insert disc +(PLUS)+D-Pad Left Decrease save slot by 1 +(PLUS)+D-Pad Right Increase save slot by 1 +(PLUS)+L2 Configure buttons on virtual port 1 +(PLUS)+R2 Insert coin"},{"location":"devices/powkiddy/rgb10x/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/powkiddy/rgb10x/#emulators","title":"Emulators","text":"
  • Platform Documentation (RK3326)
"},{"location":"devices/powkiddy/rgb10x/#notes_2","title":"Notes","text":""},{"location":"devices/powkiddy/rgb10x/#installation","title":"Installation","text":"

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/powkiddy/rgb20sx/","title":"Powkiddy RGB20SX","text":""},{"location":"devices/powkiddy/rgb20sx/#overview","title":"Overview","text":""},{"location":"devices/powkiddy/rgb20sx/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3566 ARM Cortex-A55 (Quad-core) @ 1.8 GHz Mali G52 Display RAM eMMC Connectivity 4-inch 720*720 1 GB LPDDR4 None 2.4 GHz WiFi + BT (RTL8723DS)"},{"location":"devices/powkiddy/rgb20sx/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/powkiddy/rgb20sx/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

  1. Inserting the OS SD card into a PC.
  2. Open ROCKNIX partition, and go to the extlinux folder.
  3. Open extlinux.conf text file.
  4. Completely remove the line that starts with FDTOVERLAYS.
  5. Now your device will boot with stock voltages.
"},{"location":"devices/powkiddy/rgb20sx/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be run from an SD Card and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers"},{"location":"devices/powkiddy/rgb20sx/#controls","title":"Controls","text":""},{"location":"devices/powkiddy/rgb20sx/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action SELECT+START (x2) Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+X(NORTH) Open RA Menu SELECT+B(SOUTH) Reset Game SELECT+Y(WEST) Show FPS SELECT+A(EAST) Take Screenshot SELECT+R2 Fast-Forward"},{"location":"devices/powkiddy/rgb20sx/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/powkiddy/rgb20sx/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action SELECT+START (hold for 2sec) Quit Game SELECT+R1 Save State SELECT+L1 (hold for 2sec) Load State SELECT+Y(WEST) Show FPS SELECT+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/powkiddy/rgb20sx/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/powkiddy/rgb20sx/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R SELECT+START Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+Y(WEST) Take Screenshot SELECT+B(SOUTH) Reset Game"},{"location":"devices/powkiddy/rgb20sx/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/powkiddy/rgb20sx/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/powkiddy/rgb20sx/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/powkiddy/rgb20sx/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/powkiddy/rgb20sx/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application SELECT+Vol + Brightness Up SELECT+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/powkiddy/rgb20sx/#emulators","title":"Emulators","text":"
  • Platform Documentation (RK3566)
"},{"location":"devices/powkiddy/rgb20sx/#notes_4","title":"Notes","text":""},{"location":"devices/powkiddy/rgb20sx/#installation","title":"Installation","text":"

Download the latest RK3566 version of ROCKNIX from the button below and follow the instructions listed on the Install page. Insert the SD card into the TF-OS slot of the device and power it on.

"},{"location":"devices/powkiddy/rgb30/","title":"Powkiddy RGB30","text":""},{"location":"devices/powkiddy/rgb30/#overview","title":"Overview","text":""},{"location":"devices/powkiddy/rgb30/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3566 ARM Cortex-A55 (Quad-core) @ 1.8 GHz Mali G52 Display RAM eMMC Connectivity 4-inch 720*720 1 GB LPDDR4 None 2.4/5 GHz WiFi + BT (RTL8821CS)"},{"location":"devices/powkiddy/rgb30/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/powkiddy/rgb30/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

  1. Inserting the OS SD card into a PC.
  2. Open ROCKNIX partition, and go to the extlinux folder.
  3. Open extlinux.conf text file.
  4. Completely remove the line that starts with FDTOVERLAYS.
  5. Now your device will boot with stock voltages.
"},{"location":"devices/powkiddy/rgb30/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be run from an SD Card and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers LED Supports selecting from a set of colors or turning the power LED off (choice persists through reboots) Does not support other effects."},{"location":"devices/powkiddy/rgb30/#controls","title":"Controls","text":""},{"location":"devices/powkiddy/rgb30/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action SELECT+START (x2) Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+X(NORTH) Open RA Menu SELECT+B(SOUTH) Reset Game SELECT+Y(WEST) Show FPS SELECT+A(EAST) Take Screenshot SELECT+R2 Fast-Forward"},{"location":"devices/powkiddy/rgb30/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/powkiddy/rgb30/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action SELECT+START (hold for 2sec) Quit Game SELECT+R1 Save State SELECT+L1 (hold for 2sec) Load State SELECT+Y(WEST) Show FPS SELECT+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/powkiddy/rgb30/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/powkiddy/rgb30/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R SELECT+START Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+Y(WEST) Take Screenshot SELECT+B(SOUTH) Reset Game"},{"location":"devices/powkiddy/rgb30/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/powkiddy/rgb30/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/powkiddy/rgb30/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/powkiddy/rgb30/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/powkiddy/rgb30/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application SELECT+Vol + Brightness Up SELECT+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/powkiddy/rgb30/#emulators","title":"Emulators","text":"
  • Platform Documentation (RK3566)
"},{"location":"devices/powkiddy/rgb30/#notes_4","title":"Notes","text":""},{"location":"devices/powkiddy/rgb30/#installation","title":"Installation","text":"

Download the latest RK3566 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/powkiddy/rgb30/#video-guide","title":"Video Guide","text":"

Courtesy of @RetroGameCorps

Download the latest RK3566 version of ROCKNIX from the button below and follow the instructions listed on the Install page. Insert the SD card into the TF-OS slot of the device and power it on.

"},{"location":"devices/powkiddy/rgb30/#community-videos","title":"Community Videos","text":""},{"location":"devices/powkiddy/rk2023/","title":"Powkiddy RK2023","text":""},{"location":"devices/powkiddy/rk2023/#overview","title":"Overview","text":""},{"location":"devices/powkiddy/rk2023/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3566 ARM Cortex-A55 (Quad-core) @ 1.8 GHz Mali G52 Display RAM eMMC Connectivity 3.5-inch 640*480 1 GB LPDDR4 None Optional 2.4/5 GHz WiFi + BT"},{"location":"devices/powkiddy/rk2023/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/powkiddy/rk2023/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

  1. Inserting the OS SD card into a PC.
  2. Open ROCKNIX partition, and go to the extlinux folder.
  3. Open extlinux.conf text file.
  4. Completely remove the line that starts with FDTOVERLAYS.
  5. Now your device will boot with stock voltages.
"},{"location":"devices/powkiddy/rk2023/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be run from an SD Card and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers LED Supports selecting from a set of colors or turning the power LED off (choice persists through reboots) Does not support other effects."},{"location":"devices/powkiddy/rk2023/#controls","title":"Controls","text":""},{"location":"devices/powkiddy/rk2023/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action SELECT+START (x2) Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+X(NORTH) Open RA Menu SELECT+B(SOUTH) Reset Game SELECT+Y(WEST) Show FPS SELECT+A(EAST) Take Screenshot SELECT+R2 Fast-Forward"},{"location":"devices/powkiddy/rk2023/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/powkiddy/rk2023/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action SELECT+START (hold for 2sec) Quit Game SELECT+R1 Save State SELECT+L1 (hold for 2sec) Load State SELECT+Y(WEST) Show FPS SELECT+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/powkiddy/rk2023/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/powkiddy/rk2023/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R SELECT+START Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+Y(WEST) Take Screenshot SELECT+B(SOUTH) Reset Game"},{"location":"devices/powkiddy/rk2023/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/powkiddy/rk2023/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/powkiddy/rk2023/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/powkiddy/rk2023/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/powkiddy/rk2023/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application SELECT+Vol + Brightness Up SELECT+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/powkiddy/rk2023/#emulators","title":"Emulators","text":"
  • Platform Documentation (RK3566)
"},{"location":"devices/powkiddy/rk2023/#notes_4","title":"Notes","text":""},{"location":"devices/powkiddy/rk2023/#installation","title":"Installation","text":"

Download the latest RK3566 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/powkiddy/rk2023/#community-videos","title":"Community Videos","text":""},{"location":"devices/powkiddy/x35s/","title":"Powkiddy X35S","text":""},{"location":"devices/powkiddy/x35s/#overview","title":"Overview","text":""},{"location":"devices/powkiddy/x35s/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3566 ARM Cortex-A55 (Quad-core) @ 1.8 GHz Mali G52 Display RAM eMMC Connectivity 3.5-inch 640*480 1 GB LPDDR4X 4 GB None"},{"location":"devices/powkiddy/x35s/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/powkiddy/x35s/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

  1. Inserting the OS SD card into a PC.
  2. Open ROCKNIX partition, and go to the extlinux folder.
  3. Open extlinux.conf text file.
  4. Completely remove the line that starts with FDTOVERLAYS.
  5. Now your device will boot with stock voltages.
"},{"location":"devices/powkiddy/x35s/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be installed to the eMMC or run from an SD Card, and a second SD card can be used to store games"},{"location":"devices/powkiddy/x35s/#controls","title":"Controls","text":""},{"location":"devices/powkiddy/x35s/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action SELECT+START (x2) Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+X(NORTH) Open RA Menu SELECT+B(SOUTH) Reset Game SELECT+Y(WEST) Show FPS SELECT+A(EAST) Take Screenshot SELECT+R2 Fast-Forward"},{"location":"devices/powkiddy/x35s/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/powkiddy/x35s/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action SELECT+START (hold for 2sec) Quit Game SELECT+R1 Save State SELECT+L1 (hold for 2sec) Load State SELECT+Y(WEST) Show FPS SELECT+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/powkiddy/x35s/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/powkiddy/x35s/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R SELECT+START Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+Y(WEST) Take Screenshot SELECT+B(SOUTH) Reset Game"},{"location":"devices/powkiddy/x35s/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/powkiddy/x35s/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/powkiddy/x35s/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/powkiddy/x35s/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/powkiddy/x35s/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application SELECT+Vol + Brightness Up SELECT+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/powkiddy/x35s/#emulators","title":"Emulators","text":"
  • Platform Documentation (RK3566)
"},{"location":"devices/powkiddy/x35s/#notes_4","title":"Notes","text":""},{"location":"devices/powkiddy/x35s/#installation","title":"Installation","text":"

Download the latest RK3566-X55 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

Once you have burned the image to an SD card, you will need to modify the file extlinux/extlinux.conf on the FAT partition, and change x55 to x35s on the FDT line.

"},{"location":"devices/powkiddy/x55/","title":"Powkiddy X55","text":""},{"location":"devices/powkiddy/x55/#overview","title":"Overview","text":""},{"location":"devices/powkiddy/x55/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3566 ARM Cortex-A55 (Quad-core) @ 1.8 GHz Mali G52 Display RAM eMMC Connectivity 5.5-inch 1280*720 2 GB LPDDR4X (except some revisions which only have 1 GB) 8 GB (except early revisions) 2.4/5 GHz WiFi + BT (8821CS)"},{"location":"devices/powkiddy/x55/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/powkiddy/x55/#tweaks","title":"Tweaks","text":"

In Emulationstation system settings you find an overclock setting and undervolt options. The overlock option enables 2 GHz operation. While there are 3 levels of undervolting, where L1 is the least undervolt and L3 is the most undervolt. Undervolting can help performance in higher end emulators such as PPSSPP and Yabasanshiro standalone, due to less thermal throttling. As well as less battery drain on lower end emulators.

Obviously it can't be guaranteed that all specimens can undervolt and hence you may end up with a non-booting or unstable system. If this is occurs, the undervolting can be reversed by:

  1. Inserting the OS SD card into a PC.
  2. Open ROCKNIX partition, and go to the extlinux folder.
  3. Open extlinux.conf text file.
  4. Completely remove the line that starts with FDTOVERLAYS.
  5. Now your device will boot with stock voltages.
"},{"location":"devices/powkiddy/x55/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Storage ROCKNIX can be installed to the emmc or run from an SD Card, and an second SD card can be used to store games Wifi Can be turned on in Emulation Station under Main Menu > Network Settings Bluetooth Supports bluetooth audio and controllers"},{"location":"devices/powkiddy/x55/#controls","title":"Controls","text":""},{"location":"devices/powkiddy/x55/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action SELECT+START (x2) Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+X(NORTH) Open RA Menu SELECT+B(SOUTH) Reset Game SELECT+Y(WEST) Show FPS SELECT+A(EAST) Take Screenshot SELECT+R2 Fast-Forward"},{"location":"devices/powkiddy/x55/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/powkiddy/x55/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action SELECT+START (hold for 2sec) Quit Game SELECT+R1 Save State SELECT+L1 (hold for 2sec) Load State SELECT+Y(WEST) Show FPS SELECT+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/powkiddy/x55/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/powkiddy/x55/#mupen64plus-sa-nintendo-64","title":"Mupen64Plus-SA (Nintendo 64)","text":"Button Combo Action START Start B(SOUTH) A Y(WEST) B Right Analog Up C Up Right Analog Down C Down Right Analog Left C Left Right Analog Right C Right L2 Z L1 L R1 R SELECT+START Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+Y(WEST) Take Screenshot SELECT+B(SOUTH) Reset Game"},{"location":"devices/powkiddy/x55/#notes_2","title":"Notes:","text":"
  • Z and L button assignment can be changed directly in EmulationStation
    • Highlight the game and press X(NORTH)
    • Select ADVANCED GAME OPTIONS
    • Set EMULATOR to MUPEN64PLUSSA
    • Then change INPUT ONFIGURATION
      • Default: L1 = L, L2 = Z
      • Z & L SWAP: L1 = Z, L2 = L
  • You can also create your own custom controller configuration and add it to /storage/.configs/game/configs/mupen64plussa. Then update INPUT CONFIGURATION to CUSTOM following the same steps as above.
"},{"location":"devices/powkiddy/x55/#ppsspp-sa-psp","title":"PPSSPP-SA (PSP)","text":"Button Combo Action START Start SELECT Select A(EAST) Circle B(SOUTH) Cross X(NORTH) Triangle Y(WEST) Square L1 L R1 R R2 Save State L2 Load State L3 Open Menu"},{"location":"devices/powkiddy/x55/#hypseus-singe-daphne","title":"Hypseus-singe (Daphne)","text":"Button Combo Action SELECT+START Quit Game SELECT Coin START Start B(SOUTH) Button 1 A(EAST) Button 2 X(NORTH) Button 3"},{"location":"devices/powkiddy/x55/#notes_3","title":"Notes:","text":"
  • To add/change mapping you can edit /storage/.config/game/configs/hypseus/hypinput.ini under [KEYBOARD] section by changing third number for a function from 0 (disabled) to a corresponding joystick value. You can identify joystick values by running jstest /dev/input/js0 over ssh.
  • For example the following would assign quit to L1 and pause to R1

    [KEYBOARD]\nKEY_QUIT = SDLK_ESCAPE 0 5\nKEY_PAUSE = SDLK_p 0 6\n
"},{"location":"devices/powkiddy/x55/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application SELECT+Vol + Brightness Up SELECT+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/powkiddy/x55/#emulators","title":"Emulators","text":"
  • Platform Documentation (RK3566)
"},{"location":"devices/powkiddy/x55/#notes_4","title":"Notes","text":""},{"location":"devices/powkiddy/x55/#installation","title":"Installation","text":"

Download the latest RK3566-X55 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/powkiddy/x55/#screen-calibration","title":"Screen Calibration","text":"

The Powkiddy X55 screen is miscalibrated from the factory. While there's no universal fix (yet) this issue can greatly be mitigated by using a Retroarch Shader. Instructions for doing so are listed below:

  1. Start a game
  2. Open the \"Quick Menu\" in Retroarch by pressing both joysticks
  3. Navigate to \"Shaders\"
  4. Turn \"Video Shader\" to \"ON\"
  5. Navigate to \"Load Preset\"
  6. Select \"Misc\" -> \"Image Adjustment\"
  7. Go to \"Shader Parameters\" and change the following parameters:
  8. Target Gamma -> 2.40
  9. Monitor Gamma 2.00
  10. Saturation -> 1.50
  11. Contrast -> 1.15
  12. Black Level -> -0.10
  13. Navigate back to the shader menu and pick \"Save Preset\"
  14. Select Either:
  15. \"Save Global Preset\" to have this as the default for all Retroarch cores
  16. \"Save Core Preset\" to have this as the default for a specific system (e.g all PSX games)
  17. \"Save Content Preset\" to have this as the default for a specific directory (e.g all roms in a \"RPG\" directory)
  18. \"Save Game Preset\" to have this as the default for the specific game that you're running

The settings at 7 are just a proposal, you might want to experiment a bit to get something that matches your preferences but they should serve as a great starting point.

As a bonus, adjust the \"Horizontal Overscan %\" and \"Vertical Overscan %\" settings to deal with e.g PSX games that have black borders (such as Crash Tag Team Racing and Spyro).

The black bars on the sides when displaying 4:3 content will not be effected by shaders and might thus look lighter than the game image. If you find this distracting a (lighter) overlay will hide this issue.

"},{"location":"devices/powkiddy/x55/#community-videos","title":"Community Videos","text":""},{"location":"devices/powkiddy/xu10/","title":"Powkiddy XU10","text":""},{"location":"devices/powkiddy/xu10/#overview","title":"Overview","text":""},{"location":"devices/powkiddy/xu10/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3326 ARM Cortex-A35 (Quad-core) @ 1.3 GHz Mali G31 Display RAM eMMC Connectivity 3.5-inch 640*480 1 GB DDR4 None None"},{"location":"devices/powkiddy/xu10/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/powkiddy/xu10/#features","title":"Features","text":"Feature\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Notes Wifi Can be turned on in Emulation Station under Main Menu > Network Settings"},{"location":"devices/powkiddy/xu10/#emulators","title":"Emulators","text":"
  • Platform Documentation (RK3326)
"},{"location":"devices/powkiddy/xu10/#notes","title":"Notes","text":""},{"location":"devices/powkiddy/xu10/#installation","title":"Installation","text":"

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/unbranded/game-console-r33s/","title":"Game Console R33S","text":""},{"location":"devices/unbranded/game-console-r33s/#overview","title":"Overview","text":""},{"location":"devices/unbranded/game-console-r33s/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3326 ARM Cortex-A35 (Quad-core) @ 1.3 GHz Mali G31 Display RAM eMMC Connectivity 3.5-inch 640*480 1 GB (some revisions 512 MB) DDR3 None None"},{"location":"devices/unbranded/game-console-r33s/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/unbranded/game-console-r33s/#controls","title":"Controls","text":""},{"location":"devices/unbranded/game-console-r33s/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action SELECT+START (x2) Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+Y(NORTH) Open RA Menu SELECT+A(SOUTH) Reset Game SELECT+X(WEST) Show FPS SELECT+B(EAST) Take Screenshot SELECT+R2 Fast-Forward"},{"location":"devices/unbranded/game-console-r33s/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/unbranded/game-console-r33s/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action SELECT+START (hold for 2sec) Quit Game SELECT+R1 Save State SELECT+L1 (hold for 2sec) Load State SELECT+X(WEST) Show FPS SELECT+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/unbranded/game-console-r33s/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/unbranded/game-console-r33s/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application SELECT+Vol + Brightness Up SELECT+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/unbranded/game-console-r33s/#emulators","title":"Emulators","text":"
  • Platform Documentation (RK3326)
"},{"location":"devices/unbranded/game-console-r33s/#notes_2","title":"Notes","text":""},{"location":"devices/unbranded/game-console-r33s/#installation","title":"Installation","text":"

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/unbranded/game-console-r35s-r36s/","title":"Game Console R35S/R36S","text":""},{"location":"devices/unbranded/game-console-r35s-r36s/#overview","title":"Overview","text":""},{"location":"devices/unbranded/game-console-r35s-r36s/#hardware","title":"Hardware","text":"SoC CPU GPU Rockchip RK3326 ARM Cortex-A35 (Quad-core) @ 1.3 GHz Mali G31 Display RAM eMMC Connectivity 3.5-inch 640*480 1 GB DDR3 None None"},{"location":"devices/unbranded/game-console-r35s-r36s/#software","title":"Software","text":"Kernel GPU drivers Compositor Interface Mainline Linux libmali (GLES 3.2) & Panfrost (GL 3.1/GLES 3.1) Sway Emulation Station"},{"location":"devices/unbranded/game-console-r35s-r36s/#controls","title":"Controls","text":""},{"location":"devices/unbranded/game-console-r35s-r36s/#retroarch-hotkeys","title":"RetroArch Hotkeys","text":"Button Combo Action SELECT+START (x2) Quit Game SELECT+R1 Save State SELECT+L1 Load State SELECT+Y(NORTH) Open RA Menu SELECT+A(SOUTH) Reset Game SELECT+X(WEST) Show FPS SELECT+B(EAST) Take Screenshot SELECT+R2 Fast-Forward"},{"location":"devices/unbranded/game-console-r35s-r36s/#notes","title":"Notes:","text":"
  • By default ROCKNIX will detect your controller and configure RetroArch hotkeys automatically. This is controlled by the \"AUTOCONFIGURE RETROARCH HOTKEYS\" option in the Settings > Controller & Bluetooth menu. While the option is enabled, RetroArch hotkeys will be overwritten by the above defaults each time RetroArch is launched. If this behavior is not desired that option can be disabled and your user-defined RetroArch hotkeys will be used instead.
"},{"location":"devices/unbranded/game-console-r35s-r36s/#mednafen-hotkeys","title":"Mednafen Hotkeys","text":"Button Combo Action SELECT+START (hold for 2sec) Quit Game SELECT+R1 Save State SELECT+L1 (hold for 2sec) Load State SELECT+X(WEST) Show FPS SELECT+R2 Fast-Forward START+L1 Select disc START+R1 Eject/Insert disc START+D-Pad Left Decrease save slot by 1 START+D-Pad Right Increase save slot by 1 START+L2 Configure buttons on virtual port 1 START+R2 Insert coin"},{"location":"devices/unbranded/game-console-r35s-r36s/#notes_1","title":"Notes:","text":"
  • By default ROCKNIX will expand the configuration file according to the first controller mednafen finds. This only happens when the config file doesn't exist (meaning the first time or if you manually delete it). After the initial expansion you are free to customize the controls.
"},{"location":"devices/unbranded/game-console-r35s-r36s/#global-hotkeys","title":"Global Hotkeys","text":"Button Combo Action L1+START+SELECT Exit Emulator / Application SELECT+Vol + Brightness Up SELECT+Vol - Brightness Down START+Vol + Battery Status START+Vol - WIFI Toggle"},{"location":"devices/unbranded/game-console-r35s-r36s/#emulators","title":"Emulators","text":"
  • Platform Documentation (RK3326)
"},{"location":"devices/unbranded/game-console-r35s-r36s/#notes_2","title":"Notes","text":""},{"location":"devices/unbranded/game-console-r35s-r36s/#installation","title":"Installation","text":"

Download the latest RK3326 version of ROCKNIX from the button below and follow the instructions listed on the Install page.

"},{"location":"devices/unbranded/game-console-r35s-r36s/#new-displays-r36s-of-year-2024","title":"New displays (R36s of year 2024)","text":"

Recent R36s have new displays that need some extra actions to work.

The simplest way so far is:

  • Determine which panel do you have (or just try every option until it works)
  • Download a mipi-panel.dtbo.r36s-panel* there
  • Rename the downloaded file and put it to a boot (ROCKNIX) partition as overlays/mipi-panel.dtbo

These files mostly have just basic refresh rate (77.378 FPS) (panel4 has 50, 60, 75 because we tested it)

If you have an original .dtb file, you can generate a mipi-panel.dtbo from it. Assuming you have an SSH access and you have scp'd the original dtb as rk3326-r35s-linux.dtb, the process would be as follows:

RK3326:~ # mount -o remount,rw /flash\nRK3326:~ # mkdir -p /flash/overlays/\nRK3326:~ # ### Be not afraid! importpanel.py may run for a minute or two for some panels\nRK3326:~ # /usr/libexec/generic-dsi/importpanel.py rk3326-r35s-linux.dtb -O /flash/overlays/mipi-panel.dtbo\nRK3326:~ # sync; mount -o remount,ro /flash/\n
Here we just make an overlays directory writable, then call a script that does all the importing stuff. Feel free to run this script on your PC, modify it and experiment with panel timings.

This script adds a bunch of potentially useful refresh rates, but we have very few knowledge on which modes work well. Please check them with wlr-randr or with game configuration and tell us which modes work with your panel.

"},{"location":"play/add-games/","title":"Adding Games to ROCKNIX","text":"

ROCKNIX has a few options for adding games and the option you choose will depend on the device you have and its available functionality (For example, some devices do not have networking capabilites so those devices will not be able to use the network transfer option).

This page will aim to document all possible options and indicate when you might use a given one over another.

For details on which specific files each system requires please see the corresponding pages in the systems section of this wiki.

"},{"location":"play/add-games/#storage-modes","title":"Storage Modes","text":"

ROCKNIX has support for using internal and external storage (microsd) for games. To make games available in the OS we provide different features based on the capability of the filesystem that you are using. To support our storage modes ROCKNIX nests games into a directory on your games card called \"roms\". All games found in this path will be available in the OS.

"},{"location":"play/add-games/#merged-storage","title":"Merged Storage","text":"

When using a microsd that is formatted as Ext4 (Linux), ROCKNIX will present users with the ability to merge both the internal and external storage together allowing users to use both devices to store games. This mode has two preferences, external (default), and internal.

  • Preference External
  • This mode will save anything written to /storage/roms to your external microsd (/storage/games-external/roms).
  • Preference Internal
  • This mode will save anything written to /storage/roms to your internal storage (/storage/games-internal/roms).

Note: Merged Storage is disabled by default.

"},{"location":"play/add-games/#simple-storage","title":"Simple Storage","text":"

When Merged Storage is disabled, or when you are using ExFAT or FAT32, ROCKNIX will mount your external card to /storage/games-external and make the content of /storage/games-external/roms available at /storage/roms.

"},{"location":"play/add-games/#troubleshooting","title":"Troubleshooting","text":"
  • It is possible to create a conflict which will prevent games from being displayed in EmulationStation. This can usually be resolved by executing /usr/bin/cleanup_overlay. Note: This will reboot your device.
  • If no game folders appear in /storage/roms, make sure you have a roms directory on your microsd and reboot.
"},{"location":"play/add-games/#option-1-network-transfer","title":"Option 1: Network Transfer","text":"

Network transfer can be used on any device that can connect to the internet (this includes devices with native networking capabilites and ones where networking can be added through an external dongle).

This option first requires you to set up networking on your device. Please see Networking for details. Once you have completed those steps make note of your IP Address in the Network Settings menu.

In addition to your IP you will also need your root password, which is rocknix by default. You can change it in the Main Menu by pressing START in EmulationStation and navigating to System Settings/Security.

"},{"location":"play/add-games/#http","title":"HTTP","text":"

Enabling Simple HTTP Server in Network settings lets you upload and download files by entering your device's IP address in any browser on the local network (or on VPN IP, see VPN section for details). The username is root and the password (rocknix by default) can be found in Root Password in the Security menu.

"},{"location":"play/add-games/#smb","title":"SMB","text":"
  • Windows:

    • To avoid typing device name/address it is recommended to make your network connection \"Private\". Windows trusts \"Private\" connections and shows available shares in \"Network\". In Settings, open \"Network % internet\", click on connection's Properties and switch to \"Private\" Screenshot: Making network Private in Windows
    • With \"Private\" connection you will likely see your device in Windows Explorer's \"Network\" Screenshot: Handheld in Windows network
    • If you don't see your device (if you chose to stay with \"Public\" network or if something went wrong) you can access your device by hostname. See (or set as you like) your device hostname in START/Network settings (let it be RK3566 as on screenshots). In Explorer address string type \\\\[DEVICE HOSTNAME].local (replace [DEVICE HOSTNAME] with proper name) (\\\\RK3566.local on screenshot) Screenshot: Open network share by hostname in Windows
    • If event that fails, don't worry. You can access your device by IP address. open a Windows Explorer window, and type in \\\\[YOUR IP ADDRESS]; replace [YOUR IP ADDRESS] with the IP Address seen in the Network Settings menu.
    • You may be prompted for a username and password.
    • The username is root and your password (rocknix by default) can be found in the System Settings/Security menu.
  • MacOS:

    • You will likely just see your device in \"Shared\" section of Finder Screenshot: Handheld in Mac OS Finder
    • If that fails, you can connect manually by hostname or IP. Open Finder and press Cmd+K (or select Go > Connect to Server from the top menu). In the address bar that appears, type smb://[ADDRESS]; replace [ADDRESS] with hostname with .local suffix or with the IP Address seen in the Network Settings menu. Screenshot: Open network share by hostname in Mac OS

    • You may be prompted for a username and password.

    • For name enter root and your password (rocknix by default) can be found in the System Settings/Security menu.
"},{"location":"play/add-games/#sftpssh","title":"SFTP/SSH","text":"

Using your SFTP program of choice; set up an SFTP connection to the IP Address seen in the Network Settings menu. Make sure the Port is set to 22. The username is root and your password (rocknix by default) can be found in the System Settings/Security menu.

You can also transfer files using the scp command line tool, which is part of OpenSSH and is included with recent versions of Windows and Linux

"},{"location":"play/add-games/#after-connecting","title":"After connecting","text":"
  • You will see a list of folders after you have connected via network.
  • Open the roms folder and you will see a list of folders where games and bios files can be placed. (Please see the systems section of the wiki for details on where each system's files should be placed)
  • After you have added your games you can get them to display in EmulationStation by pressing START to open the Main Menu, then open Game Settings then select Update Gamelists under the Tools header.
"},{"location":"play/add-games/#option-2-usb-gaget-modes","title":"Option 2: USB Gaget Modes","text":"

Many devices can be USB gadgets allowing you to transfer files over USB cable.

  • RK3326 has only one data USB port, so you need to connect cable to \"OTG\" port. Some older Powkiddy devices (ones with wi-fi switch) have built-in USB hub making gadget impossible.
  • On other devices use the port you use to charge the console (\"DC\")
"},{"location":"play/add-games/#network-gadget-former-ecm","title":"Network gadget (former ECM)","text":"

This mode is most useful. You get a network connection between your PC and console, and then just use Samba or SFTP.

  • In EmulationStation's Network Settings: Enable Samba (Windows shares) and/or SSH, switch gadget mode to \"network\". Don't forget to exit settings to apply changes! Screenshot: Needed options configured

  • Now your PC should see a new network connection. Check it out in PC's network settings! Here \"Ethernet 5\" with \"No internet\" is a console gadget connection. Initially Properties will say \"Public network\". Screenshot: New gadget connection in Windows

  • Windows only: You need to change your network profile type to \"Private\" for easier access. Click on Properties and switch to \"Private\" Screenshot: Making network Private in Windows

  • Now, when your PC trusts this connection, you will see your Rocknix device in \"Network\" Screenshot: Handheld in Windows network and Mac Shares

  • In this \"computer\" open \"games-roms\" share. Here you can add roms to corresponding folders. Screenshot: games-roms share in Windows Explorer

"},{"location":"play/add-games/#file-transfer-gadget-former-mtp","title":"File transfer gadget (former MTP)","text":"

This mode seems simple to use, but it has some limitations.

  • Some operating systems may need a driver or special software

  • Sometimes file transfer fails and you need to restart gadget and retry transfer

  • In EmulationStation's Network Settings: switch gadget mode to file transfer. Screenshot: file transfer gadget

"},{"location":"play/add-games/#option-3-sd-card","title":"Option 3: SD Card","text":"

Games can also be added via an SD card. There are 2 primary methods for this depending on your device.

"},{"location":"play/add-games/#if-your-device-has-2-sd-card-slots","title":"If your device has 2 SD card slots","text":""},{"location":"play/add-games/#if-you-do-not-wish-to-use-a-second-card-in-slot-2-for-games","title":"If you do not wish to use a second card in Slot 2 for games","text":"
  • Turn off your device, remove your SD card from slot 1 and open it on your PC.
  • You PC will display a list of folders, open the games-internal/roms directory and you will see a list of folders for each system where you can place your games and bios files.
  • Add your games and place your SD card back into slot 1 and boot up ROCKNIX.
"},{"location":"play/add-games/#if-you-do-wish-to-use-a-second-card-in-slot-2-for-games","title":"If you do wish to use a second card in Slot 2 for games","text":"
  • With your device turned off; insert a FAT32/ExFAT/ext4/btrfs formated SD card into slot 2 of your device.
  • Turn your device on.
  • When ROCKNIX completes its boot process, the roms directory will automatically be created on the second SD card.
  • Now you can turn off your device, remove your SD card from slot 2 and open it on your PC.
  • You PC will display a list of folders, open the roms directory and you will see a list of folders for each system where you can place your games and bios files.
  • Add your games and place your SD card back into slot 2 and boot up ROCKNIX.

If your device does not see your SD card (or write the needed folders to it) please open System Settings and make sure Autodetect Games Card is turned on (located under the Hardware/Storage header) then reboot your device.

"},{"location":"play/add-games/#if-your-device-has-1-sd-card-slot","title":"If your device has 1 SD card slot","text":"

This option is only for devices where you have installed ROCKNIX to the internal drive of the device. In this scenario an SD card can be used directly for storage

  • With ROCKNIX installed to your internal drive press START to open the Main Menu, then open System Settings and turn on Autodetect Games Card under the Hardware/Storage header.
  • Turn your device off
  • Insert a FAT32/ExFAT/ext4 formated SD card into your device.
  • Turn your device on
  • When ROCKNIX completes its boot process, the roms directory will automatically be created.
  • Now you can turn off your device, remove your SD card and open it on your PC.
  • You PC will display a list of folders, open the roms directory and you will see a list of folders for each system where you can place your games and bios files.
  • Add your games and place your SD card back into your device and boot up ROCKNIX.
"},{"location":"play/add-games/#option-31-access-sd-card-in-recovery-mode","title":"Option 3.1: access SD Card in recovery mode","text":""},{"location":"play/add-games/#how-to-enter-recovery-mode","title":"How to enter recovery mode","text":"
  • RK3566 only Before entering recovery mode, connect handheld to PC via USB
  • On other devices you can connect the cable at any time

  • On most devices, hold Volume Down while device boots.

  • On SD865 (Retroid Pocket 5/Mini) choose RECOVERY option in GRUB menu Photo: RECOVERY menu entry on RP5

  • A message will appear telling about exposed SD/eMMC devices Photo: RGB10X exposing both SD cards

  • Your PC should now see all your handheld storage devices as USB mass storage

  • Manage your ROMs, format partitions or even do a clean ROCKNIX install
  • Don't forget to eject all the drives to prevent filesystem corruption
  • Press Volume Up, device will reboot into normal mode
"},{"location":"play/add-games/#option-4-external-usb-drive","title":"Option 4: External USB Drive","text":"

ROCKNIX has a built in File Manager and you can use it to access connected USB drives and transfer files.

  1. Connect your USB Drive to your device
  2. Open the Tools system and select File Manager
  3. Navigate up to / and then select media - you should see your drive listed after opening media
  4. Open your drive and you should see its contents
  5. From here you can navigate to the file(s) you would like to copy and then navigate back to the storage/roms directory and paste your copied files in the approrpiate folder.
"},{"location":"play/add-games/#option-5-linux-os","title":"Option 5: Linux OS","text":"

ROCKNIX' storage drive is formated as ext4 which can be read natively by linux operating systems. Plugging in your SD card into an linux OS will enable you to browse the directories and add files directly.

"},{"location":"play/add-games/#nfs-storage","title":"NFS Storage","text":"

NFS Storage differs to the other approaches in that you do not need to copy any files to the device. It relies on a pre-curated and shared roms location to exist on a Network Attached Storage (NAS) Network File System on the network which the device is connected to. This allows you to quickly load pre-scrapped/existing collections without the need to synchromise or copy anything to an SD card or internal storage.

Unlike SMB/Samba file shares, NFS was designed specifically for fast IO and to work and present like a local file-system to the OS. Using NFS even on 2.4ghz networks for rom collections often provides a better experience than even the internal SD card can support. NFS servers are relatively trivial to setup and can be installed on Windows through the features function.

NFS support in rocknix is implemented as a variation on the merged storage approach. The NFS URI(Universal Resource Identifier) is mounted to /storage/games-external and the local storage is mounted in an overlay as the Upper location. Meaning saves / writes to are kept local to the device.

To Use NFS create a file in /storage/ called '.nfs-mount' with a single entry of the format: NFS_PATH=<valid NFS uri>

i.e something similar to

NFS_PATH=nfs.example.com:/path/containing-a-roms-subdir

Once created, ensure you are connected to a Network segment that can reach the NFS URI (local wifi or connected via tailscale/vpn) and navigate to the 'Tools' collection in ES. Execute the 'Mount NFS' entry. ES should restart and you should now have a merged collection available in ES.

"},{"location":"play/controls/","title":"Controls","text":"

Controls documentation is being moved to device pages. This work is not fully complete so there is chance you will not find controls documentation for your device just yet. We're working on it and will update this page when things are complete.

"},{"location":"play/install/","title":"Installing ROCKNIX","text":"

ROCKNIX is installed by downloading an image for your device, flashing it to an SD Card (or your device's internal storage) and then booting the device to start the install process.

"},{"location":"play/install/#step-1-download","title":"Step 1: Download","text":"
  • Download the latest version of ROCKNIX for your device from the releases page.
    • You'll find download links for each device/platform we support under the \"Installation Package Downloads\" header.
    • Make sure to download the correct image for your device. For example; if you are installing ROCKNIX on a Gameforce Ace you would download the ROCKNIX-RK3588 image.
    • If you have any questions you can check the Device Support section to confirm which image you should download for your specific device.
"},{"location":"play/install/#step-2-flash","title":"Step 2: Flash","text":"
  • First decompress the image.
  • Then write the image to an SD Card using an imaging tool.
    • Common imaging tools include Rufus, Raspberry Pi Imager, and Win32 Disk Imager. If you're skilled with the command line, dd can also be used.
"},{"location":"play/install/#step-3-boot-your-device","title":"Step 3: Boot your device","text":"
  • Insert your SD Card into your device while its off and then turn it on
  • Note: Some devices may require you to set the boot order so your SD Card is loaded first. Please see documentation for your specific device to see if this applies to you.
  • ROCKNIX will run through its install process and then reboot your device after its complete.
  • When your device reboots it will load directly into EmulationStation; at this point you are good to go!
"},{"location":"play/install/#additional-notes","title":"Additional Notes","text":"
  • ROCKNIX operating system is stored on an Ext4 partition that can be read by LINUX but is not natively readable on Windows. Currently it is not possible to access the primary ROCKNIX Ext4 partition on Windows to add games.
  • On devices that support a second sd card, the sd card can be formatted as Ext4, FAT32, or exFAT. ROCKNIX will automatically detect the second SD card on boot and make it available as game storage.
  • On x86 devices ROCKNIX includes an installation tool. The installation tool can be found in the tools menu, which is one of the systems listed within ES.
"},{"location":"play/install/#next-steps","title":"Next Steps","text":"
  • Add Games
  • Set up Networking
  • Themes
"},{"location":"play/netplay/","title":"Network Play","text":"

RetroArch network play for up to 4 players is available across all WIFI enabled devices supported by ROCKNIX. Before continuing, please make sure that all devices are updated to the same version of the operating system.

"},{"location":"play/netplay/#video-guide","title":"Video Guide","text":"

Courtesy of @RetroGameCorps

"},{"location":"play/netplay/#enabling-network-play","title":"Enabling Network Play","text":"

Before netplay is available, it must be enabled on each participating device.

  • Select Games Settings -> Netplay Settings
  • NetPlay -> Enabled
  • Index Games
"},{"location":"play/netplay/#option-1-lan-based-network-play","title":"Option 1: LAN based Network Play","text":"

Using this feature is simple. For LAN based play, connect your devices to your WIFI network. A minimum of one host and one client are required for play.

"},{"location":"play/netplay/#local-lan-play-host","title":"Local LAN Play (HOST)","text":"
  • Select Network Settings.
  • Disable Local Play Mode.
  • Select 1 (Host).
  • Choose a game and press Y.
  • Select Netplay Options.
    • Select Host a Netplay Session.
"},{"location":"play/netplay/#local-lan-play-clients","title":"Local LAN Play (CLIENTS)","text":"
  • Select Network Settings.
  • Disable Local Play Mode.
  • Select 2-4 (Clients).
  • Choose a game and press Y.
  • Select Netplay Options.
    • Select Connect to a Netplay Session.
"},{"location":"play/netplay/#option-2-device-to-device-network-play","title":"Option 2: Device to Device Network Play","text":"

Device to device connections will automatically generate and connect to a local WIFI network. As with LAN based play, one host and one client are required for play. Using the same version of ROCKNIX on each device is REQUIRED or devices will not connect. Device to device connections are intended for local play only, retroAchievements, scraping, and system updates will not be available in this mode.

"},{"location":"play/netplay/#device-to-device-play-host","title":"Device to Device Play (HOST)","text":"
  • Select Network Settings.
  • Enable Local Play Mode.
  • Select 1 (Host).
  • Choose a game and press Y.
  • Select Netplay Options.
    • Select Host a Netplay Session.
"},{"location":"play/netplay/#device-to-device-play-clients","title":"Device to Device Play (CLIENTS)","text":"
  • Select Network Settings.
  • Enable Local Play Mode.
  • Select 2-4 (Clients).
  • Choose a game and press Y.
  • Select Netplay Options.
    • Select Connect to a Netplay Session.
"},{"location":"play/netplay/#option-3-gameboy-gamelink","title":"Option 3: GameBoy GameLink","text":"

ROCKNIX supports GameLink play for GameBoy and GameBoy Color. To use, on each device select the appropriate core for the game being started in advanced settings for the game, or for the system.

Core Features TGBDual Recommended Support for multiplayer GameLink play, including battle/trading. Gambatte Support for multiplayer GameLink play."},{"location":"play/retro-achievements/","title":"Retro Achievements","text":"

ROCKNIX has a native integration with RetroAchievements which allows you to earn achievements as you play games across numerous emulators. In order to use RetroAchievements your device must be connected to the internet.

"},{"location":"play/retro-achievements/#setup","title":"Setup","text":"
  1. Create an account at RetroAchievements.org.
  2. Follow the steps on the Networking page to connect your device to the internet.
  3. While in EmulationStation press START on your controller to open the Main Menu.
  4. Select Game Settings and then choose RetroAchievement Settings.
  5. Turn On RetroAchievements (first toggle).
  6. Then enter your username and password for RetroAchievements.org in the username and password fields.
"},{"location":"play/retro-achievements/#additional-notes","title":"Additional Notes","text":"
  • There are additional settings that can be changed in the above menu to tailor your experience. Please see the documentation @ docs.retroachievements.org for details on each option
    • Recommended Settings:
    • Unlock Sound (On): this plays the classic unlock sound each time an achievement is earned.
    • Automatic Screenshot (On): this takes a screenshot each time an achievement is earned and stores it in the screenshots directory. These can be viewed in the screenshots system in EmulationStation.
  • Not all emulators and games support RetroAchievements; please see the list of emulators that support achievements here and check if your game has achievements available by searching for it on RetroAchievements.org
  • There is a change needed on the RetroAchievements API in order to be able to display to display your history of earned achievements in EmulationStation. Once the needed change is made by RetroAchievements; we can look at renabling this functionality in EmulationStation.
"},{"location":"play/update/","title":"Updating ROCKNIX","text":"

ROCKNIX can be updated \"Over the Air\" (OTA) or by manually downloading an update .tar file, adding to your device storage and rebooting.

"},{"location":"play/update/#option-1-ota-update","title":"Option 1: OTA Update","text":"

If your device has access to the internet you can update ROCKNIX directly from EmulationStation.

  1. In EmulationStation open the main menu by pressing the Start button on your controller.
  2. Select System Settings
  3. Scroll to the System Update header and select Start Update

You can also view the change log for the latest release by selecting the Change Log before you update.

"},{"location":"play/update/#option-2-manual-update","title":"Option 2: Manual Update","text":"

If you device does not have access to the internet you can still update manually

  1. Download the latest update (.tar) of ROCKNIX for your device from the releases page.
    • You'll find download links for each device/platform we support under the \"Update Package Downloads\" header.
    • Make sure to download the correct .tar file for your device. For example; if you are installing ROCKNIX on a Gameforce Ace you would download the ROCKNIX-RK3588 file.
    • If you have any questions you can check the Device Support section to confirm which .tar you should download for your specific device.
  2. Copy the update to your device's update share.
    • via SCP to /storage/.update Snippet: SCP transfer
      $ scp ~/Downloads/ROCKNIX-RK3326.aarch64-20241221.tar rk3326.local:.update/\n
    • via Samba to \"update\" Screenshot: update file copied to \"update\" samba share
  3. Reboot the device, and the update will begin automatically.
"},{"location":"play/update/#option-3-development-build","title":"Option 3: Development build","text":"

Development builds do not contain credentials for scraping and RetroAchievements, so these functions will not work!

  • find a build you need in dev-builds channel
  • a link to nightly builds is in channel topic
  • .tar and .img.gz files are good for updating. .tar is a bit faster to update than .img.gz .zip needs to be unzipped

Update process is similar to manual update:

  1. Download (and unzip if needed) the build, you need .tar or .img.gz file
  2. Copy the update to your device's update share.
    • via SCP to /storage/.update Snippet: SCP transfer of .img.gz
      $ scp ~/Downloads/ROCKNIX-RK3326.aarch64-20241221-b.img.gz rk3326.local:.update/\n
    • via Samba to \"update\" Screenshot: .tar copied to \"update\" samba share
  3. Reboot the device, and the update will begin automatically.
"},{"location":"systems/","title":"Index","text":""},{"location":"systems/#supported-systems","title":"Supported Systems","text":""},{"location":"systems/3do/","title":"Panasonic 3DO","text":""},{"location":"systems/3do/#overview","title":"Overview","text":"Game Path Supported Extensions roms/3do .iso .bin .chd .cue"},{"location":"systems/3do/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Opera \u00a0 default docs.libretro.com/library/opera"},{"location":"systems/3do/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files Opera https://docs.libretro.com/library/opera/#bios"},{"location":"systems/3ds/","title":"Nintendo 3DS","text":""},{"location":"systems/3ds/#overview","title":"Overview","text":"Game Path Supported Extensions roms/3ds .3ds .3dsx .elf .axf .cci .cxi .app"},{"location":"systems/3ds/#emulatorcore","title":"Emulator/Core","text":"Name Platform Documentation Lime3DS (SA) S922X https://github.com/Lime3DS/Lime3DS"},{"location":"systems/3ds/#aes-keys","title":"AES Keys","text":"

You need crypto keys to play encrypted roms.

Emulator Required Files Path Lime3DS (SA) aes_keys.txt /storage/.config/lime3ds/sysdata"},{"location":"systems/amiga/","title":"Commodore Amiga","text":""},{"location":"systems/amiga/#overview","title":"Overview","text":"Game Path Supported Extensions roms/amiga .zip .adf .uae .ipf .dms .adz .lha .m3u .hdf .hdz"},{"location":"systems/amiga/#emulatorcore","title":"Emulator/Core","text":"Name Documentation puae docs.libretro.com/library/puae puae2021 docs.libretro.com/library/puae uae4arm github.com/libretro/uae4arm-libretro"},{"location":"systems/amiga/#bios","title":"Bios","text":"Path Files roms/bios Add the files listed here: docs.libretro.com/library/puae/#bios"},{"location":"systems/amigacd32/","title":"Commodore Amiga CD32","text":""},{"location":"systems/amigacd32/#overview","title":"Overview","text":"Game Path Supported Extensions roms/amigacd32 .iso .cue .lha .chd"},{"location":"systems/amigacd32/#emulatorcore","title":"Emulator/Core","text":"Name Documentation puae docs.libretro.com/library/puae puae2021 docs.libretro.com/library/puae uae4arm github.com/libretro/uae4arm-libretro"},{"location":"systems/amigacd32/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All docs.libretro.com/library/puae/#bios"},{"location":"systems/amstradcpc/","title":"Amstrad CPC","text":""},{"location":"systems/arduboy/","title":"Arduboy","text":""},{"location":"systems/arduboy/#overview","title":"Overview","text":"Game Path Supported Extensions roms/arduboy .hex"},{"location":"systems/arduboy/#emulatorcore","title":"Emulator/Core","text":"Name Documentation arduous github.com/libretro/arduous"},{"location":"systems/atari2600/","title":"Atari 2600","text":""},{"location":"systems/atari2600/#overview","title":"Overview","text":"Game Path Supported Extensions roms/atari2600 .a26 .bin .zip .7z"},{"location":"systems/atari2600/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Stella docs.libretro.com/library/stella"},{"location":"systems/atari5200/","title":"Atari 5200","text":""},{"location":"systems/atari5200/#overview","title":"Overview","text":"Game\u00a0Path\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Supported Extensions roms/atari5200 .rom .xfd .atr .atx .cdm .cas .car .bin .a52 .xex .zip .7z"},{"location":"systems/atari5200/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Atari800 docs.libretro.com/library/atari800 a5200 github.com/libretro/a5200"},{"location":"systems/atari5200/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All docs.libretro.com/library/atari800/#bios"},{"location":"systems/atari7800/","title":"Atari 7800","text":""},{"location":"systems/atari7800/#overview","title":"Overview","text":"Game Path Supported Extensions roms/atari7800 .a78 .bin .zip .7z"},{"location":"systems/atari7800/#emulatorcore","title":"Emulator/Core","text":"Name Documentation ProSystem docs.libretro.com/library/prosystem"},{"location":"systems/atari7800/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files ProSystem See: docs.libretro.com/library/prosystem/#bios"},{"location":"systems/atari800/","title":"Atari 800","text":""},{"location":"systems/atari800/#overview","title":"Overview","text":"Game Path Supported Extensions roms/atari800 .rom .xfd .atr .atx .cdm .cas .car .bin .a52 .xex .zip .7z"},{"location":"systems/atari800/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Atari800 docs.libretro.com/library/atari800 a5200 github.com/libretro/a5200"},{"location":"systems/atari800/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All docs.libretro.com/library/atari800/#bios"},{"location":"systems/atarijaguar/","title":"Atari Jaguar","text":""},{"location":"systems/atarijaguar/#overview","title":"Overview","text":"Game Path Supported Extensions roms/atarijaguar .j64 .jag .rom .abs .cof .bin .prg"},{"location":"systems/atarijaguar/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Virtual Jaguar docs.libretro.com/library/virtual_jaguar"},{"location":"systems/atarilynx/","title":"Atari Lynx","text":""},{"location":"systems/atarilynx/#overview","title":"Overview","text":"Game Path Supported Extensions roms/atarilynx .lnx .lyx .o .zip .7z"},{"location":"systems/atarilynx/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Handy docs.libretro.com/library/handy Beetle Lynx github.com/libretro/beetle_lynx Lynx (Mednafen) mednafen.github.io/documentation/lynx.html"},{"location":"systems/atarilynx/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files Handy docs.libretro.com/library/handy/#bios Beetle Lynx docs.libretro.com/library/beetle_lynx/#bios"},{"location":"systems/atarist/","title":"Atari ST","text":""},{"location":"systems/atomiswave/","title":"Sammy Atomiswave","text":""},{"location":"systems/atomiswave/#overview","title":"Overview","text":"Game Path Supported Extensions roms/atomiswave .lst .bin .dat .zip .7z"},{"location":"systems/atomiswave/#emulatorcore","title":"Emulator/Core","text":"Name\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Platform(s) Documentation Flycast RK3326, RK3399, S922X, RK3566 docs.libretro.com/library/flycast Flycast 2021 RK3326, S922X, RK3566 docs.libretro.com/library/flycast Flycast 32 RK3326 docs.libretro.com/library/flycast Flycast (Stand Alone) RK3326, RK3399, S922X, RK3566 github.com/flyinghead/flycast"},{"location":"systems/atomiswave/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All docs.libretro.com/library/flycast/#bios"},{"location":"systems/atomiswave/#additional-references","title":"Additional References","text":"

Getting started with arcade emulation (Libretro)

"},{"location":"systems/build-engine/","title":"Build Engine","text":""},{"location":"systems/build-engine/#build-files","title":".build files","text":"

These files must be created for each build engine game that will be launched with raze. The file contains a PATH variable and an optional GRP variable. The PATH variable points to the subfolder containing the game's GRP file. The optional GRP variable is used to identify the specific GRP file to load for games with multiple GRP files.

Example: /roms/build/shadow warrior.build contains

PATH=sw\nGRP=SW.GRP\n-- end --\n
where the Shadow Warrior games files are stored in subfolder sw, i.e. /roms/build/sw/

Note: don't leave any space between GRP or PATH and = and enclose filenames containing spaces with \"quotes\"

Note: add -- end -- to the end of the file if it contains multiple lines

"},{"location":"systems/c128/","title":"Commodore 128","text":""},{"location":"systems/c16/","title":"Commodore 16","text":""},{"location":"systems/c64/","title":"Commodore 64","text":""},{"location":"systems/cdi/","title":"Philips - CD-I","text":""},{"location":"systems/cdi/#overview","title":"Overview","text":"Game Path Supported Extensions roms/cdi .chd .cue .iso"},{"location":"systems/cdi/#emulatorcore","title":"Emulator/Core","text":"

!!! note : games required Digital Video Card (like Dragon's Lair) will not run because this feature is not implemented on SAME_CDI

Name Documentation SAME_CDI docs.libretro.com/library/same_cdi"},{"location":"systems/cdi/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files SAME_CDI see: docs.libretro.com/library/same_cdi/#bios"},{"location":"systems/channelf/","title":"Fairchild Channel F","text":""},{"location":"systems/channelf/#overview","title":"Overview","text":"Game Path Supported Extensions roms/channelf .bin .chf .zip .7z"},{"location":"systems/channelf/#emulatorcore","title":"Emulator/Core","text":"Name Documentation FreeChaF github.com/libretro/FreeChaF"},{"location":"systems/channelf/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files FreeChaF see: github.com/libretro/FreeChaF#bios"},{"location":"systems/chip-8/","title":"CHIP-8 / S-CHIP / XO-CHIP","text":""},{"location":"systems/chip-8/#overview","title":"Overview","text":"Game Path Supported Extensions roms/chip-8 .ch8 .sc8 .xo8"},{"location":"systems/chip-8/#emulatorcore","title":"Emulator/Core","text":"Name Documentation JAXE docs.libretro.com/library/jaxe"},{"location":"systems/colecovision/","title":"ColecoVision","text":""},{"location":"systems/colecovision/#overview","title":"Overview","text":"Game Path Supported Extensions roms/coleco .bin .col .rom .zip .7z"},{"location":"systems/colecovision/#emulatorcore","title":"Emulator/Core","text":"Name Documentation blueMSX docs.libretro.com/library/bluemsx GearColeco \u00a0 default docs.libretro.com/library/gearcoleco"},{"location":"systems/colecovision/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files blueMSX see: docs.libretro.com/library/bluemsx/#bios GearColeco see: docs.libretro.com/library/gearcoleco/#bios"},{"location":"systems/cps1/","title":"Capcom CPS-1","text":""},{"location":"systems/cps1/#overview","title":"Overview","text":"Game Path Supported Extensions roms/cps1 .zip .7z"},{"location":"systems/cps1/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Final Burn Neo \u00a0 default docs.libretro.com/library/fbneo"},{"location":"systems/cps1/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files Final Burn Neo docs.libretro.com/library/fbneo/#bios"},{"location":"systems/cps1/#additional-references","title":"Additional References","text":"

Getting started with arcade emulation (Libretro)

"},{"location":"systems/cps2/","title":"Capcom CPS-2","text":""},{"location":"systems/cps2/#overview","title":"Overview","text":"Game Path Supported Extensions roms/cps2 .zip .7z"},{"location":"systems/cps2/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Final Burn Neo \u00a0 default docs.libretro.com/library/fbneo"},{"location":"systems/cps2/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files Final Burn Neo docs.libretro.com/library/fbneo/#bios"},{"location":"systems/cps2/#additional-references","title":"Additional References","text":"

Getting started with arcade emulation (Libretro)

"},{"location":"systems/cps3/","title":"Capcom CPS-3","text":""},{"location":"systems/cps3/#overview","title":"Overview","text":"Game Path Supported Extensions roms/cps3 .zip .7z"},{"location":"systems/cps3/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Final Burn Neo \u00a0 default docs.libretro.com/library/fbneo"},{"location":"systems/cps3/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files Final Burn Neo docs.libretro.com/library/fbneo/#bios"},{"location":"systems/cps3/#additional-references","title":"Additional References","text":"

Getting started with arcade emulation (Libretro)

"},{"location":"systems/daphne/","title":"Daphne","text":""},{"location":"systems/daphne/#overview","title":"Overview","text":"Game Path Supported Extensions roms/daphne .daphne .singe"},{"location":"systems/daphne/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Hypseus Singe \u00a0 default github.com/DirtBagXon/hypseus-singe"},{"location":"systems/daphne/#instructions","title":"Instructions","text":""},{"location":"systems/daphne/#background","title":"Background","text":"

Hypseus-Singe supports two different game formats (Daphne and Singe). One thing to keep in mind (which will help when working with files) is that Daphne is emulation so it requires a rom dump of the arcade machine to function and Singe is simulation so it combines video files with LUA code to simulate the machines.

The Daphne format requires a rom file that goes in the roms/daphne/roms directory and a folder per game that contains resources (video files, sounds, etc...) for each game roms/daphne/rom.daphne. The Singe format is self-contained and its folders contain all the resources that a game requires to run.

"},{"location":"systems/doom/","title":"Doom","text":""},{"location":"systems/doom/#overview","title":"Overview","text":"Game Path Supported Extensions roms/doom .doom"},{"location":"systems/doom/#emulatorcore","title":"Emulator/Core","text":"Name Documentation GZDoom github.com/ZDoom/gzdoom

GZDoom will detect the analog stick automatically, this makes menus navigatable. ROCKNIX does not provide any controls mapping for gzdoom, as there is no obvious default mapping as with console emulators. Users have to map their own preferred controls.

"},{"location":"systems/doom/#creating-doom-files","title":"Creating .doom files","text":"

These files must be created for each WAD that you want to load with gzdoom. The file should contain at least one IWAD variable and optional MOD variables. Multiple IWAD and MOD variables can be used in the same file to load multiple wads, mods and packages. Therefore, multiple .doom files can be created for the same WAD for each configuration of the game.

It is recommended to store WAD files in a \\iwads subfolder and MODs in a \\mods subfolder. You would then include the path to each file in the .doom file (see examples below)

Example Folder Structure
/roms/doom/\n    \u251c\u2500 doom2.doom\n    \u251c\u2500 heretic-mod.doom\n    \u251c\u2500 iwads/\n    \u2502   \u251c\u2500 doom2.wad\n    \u2502   \u251c\u2500 heretic.wad\n    \u2502   \u2514\u2500 IWMPP_Heretic.wad\n    \u2514\u2500 mods/\n        \u251c\u2500 precise-crosshair-v1.4.1.pk3\n        \u2514\u2500 target-spy-v2.0.1.pk3\n
"},{"location":"systems/doom/#example-doom-2-no-mods","title":"Example: Doom 2 (no mods)","text":"

/roms/doom/doom2.doom would contain

IWAD=iwads/doom2.wad\n-- end --\n
to load vanilla Doom 2

don't leave any space between GRP or PATH and = and enclose filenames containing spaces with \"quotes\"

"},{"location":"systems/doom/#example-heretic-with-mods","title":"Example: Heretic (with mods)","text":"

Example: /roms/doom/heretic-mod.doom would contain

IWAD=iwads/heretic.wad\nIWAD=iwads/IWMPP_Heretic.wad\nMOD=mods/precise-crosshair-v1.4.1.pk3\nMOD=mods/target-spy-v2.0.1.pk3\n-- end --\n
to load Heretic with additional patches and mods.

make sure to add -- end -- to the end of the file

"},{"location":"systems/dreamcast/","title":"Sega Dreamcast","text":""},{"location":"systems/dreamcast/#overview","title":"Overview","text":"Game Path Supported Extensions roms/dreamcast .lst .bin .dat .zip .7z"},{"location":"systems/dreamcast/#emulatorcore","title":"Emulator/Core","text":"Name\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Platform(s) Documentation Flycast RK3326, RK3399, S922X, RK3566 docs.libretro.com/library/flycast Flycast 2021 RK3326, S922X, RK3566 docs.libretro.com/library/flycast Flycast 32 RK3326 docs.libretro.com/library/flycast Flycast (Stand Alone) RK3326, RK3399, S922X, RK3566 github.com/flyinghead/flycast"},{"location":"systems/dreamcast/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All docs.libretro.com/library/flycast/#bios"},{"location":"systems/easyrpg/","title":"EasyRPG","text":""},{"location":"systems/fbn/","title":"Final Burn Neo","text":""},{"location":"systems/fbn/#overview","title":"Overview","text":"Game Path Supported Extensions roms/fbneo .zip .7z"},{"location":"systems/fbn/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Final Burn Neo \u00a0 default docs.libretro.com/library/fbneo"},{"location":"systems/fbn/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files Final Burn Neo docs.libretro.com/library/fbneo/#bios"},{"location":"systems/fbn/#additional-references","title":"Additional References","text":"

Getting started with arcade emulation (Libretro)

"},{"location":"systems/fds/","title":"Famicom Disk System (FDS)","text":""},{"location":"systems/fds/#overview","title":"Overview","text":"Game Path Supported Extensions roms/fds .fds .zip .7z"},{"location":"systems/fds/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Nestopia \u00a0 default docs.libretro.com/library/nestopia_ue FCEUmm docs.libretro.com/library/fceumm QuickNES docs.libretro.com/library/quicknes"},{"location":"systems/fds/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All disksys.rom (ca30b50f880eb660a320674ed365ef7a)"},{"location":"systems/gameandwatch/","title":"Nintendo Game & Watch","text":""},{"location":"systems/gameandwatch/#overview","title":"Overview","text":"Game Path Supported Extensions roms/gameandwatch .mgw .zip .7z"},{"location":"systems/gameandwatch/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Handheld Electronic (GW) docs.libretro.com/library/gw"},{"location":"systems/gamecube/","title":"Nintendo Gamecube","text":""},{"location":"systems/gamecube/#overview","title":"Overview","text":"Game Path Supported Extensions roms/gamecube .gcm .iso .gcz .ciso .wbfs .rvz .dol"},{"location":"systems/gamecube/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Dolphin (SA) dolphin-emu.org/docs/guides Dolphin (QT) dolphin-emu.org/docs/guides Dolphin Libretro docs.libretro.com/library/dolphin"},{"location":"systems/gamecube/#bios","title":"Bios","text":"

You may need the following files to correctly load fonts on some Gamecube games

Emulator Optional Files Path Dolphin IPL.bin roms/bios/GC/EUR Dolphin IPL.bin roms/bios/GC/JAP Dolphin IPL.bin roms/bios/GC/USA"},{"location":"systems/gamegear/","title":"Sega Game Gear","text":""},{"location":"systems/gamegear/#overview","title":"Overview","text":"Game Path Supported Extensions roms/gamegear .gg .bin .zip .7z"},{"location":"systems/gamegear/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Gearsystem docs.libretro.com/library/gearsystem Genesis Plus GX docs.libretro.com/library/genesis_plus_gx PicoDrive docs.libretro.com/library/picodrive SMS Plus GX docs.libretro.com/library/smsplus GG (Mednafen) mednafen.github.io/documentation/gg.html"},{"location":"systems/gamegear/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All see: docs.libretro.com/library/gearsystem/#bios"},{"location":"systems/gb/","title":"Nintendo Gameboy","text":""},{"location":"systems/gb/#overview","title":"Overview","text":"Game Path Supported Extensions roms/gb .gb .gbc .zip .7z"},{"location":"systems/gb/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Gambatte \u00a0 default docs.libretro.com/library/gambatte SameBoy docs.libretro.com/library/sameboy Gearboy docs.libretro.com/library/gearboy TGB Dual docs.libretro.com/library/tgb_dual mGBA docs.libretro.com/library/mgba VBA-M docs.libretro.com/library/vba_m"},{"location":"systems/gb/#bios","title":"Bios","text":"Filename MD5 Path gb_bios.bin 32fbbd84168d3482956eb3c5051637f5 roms/bios"},{"location":"systems/gba/","title":"Nintendo Gameboy Advance","text":""},{"location":"systems/gba/#overview","title":"Overview","text":"Game Path Supported Extensions roms/gba .gba .zip .7z"},{"location":"systems/gba/#emulatorcore","title":"Emulator/Core","text":"Name Platform Documentation mGBA \u00a0 default All docs.libretro.com/library/mgba gpSP All docs.libretro.com/library/gpsp VBA-M All docs.libretro.com/library/vba_m VBA Next All docs.libretro.com/library/vba_next Beetle GBA All docs.libretro.com/library/beetle_gba NanoBoyAdvance (SA) RK3588 github.com/nba-emu/NanoBoyAdvance"},{"location":"systems/gba/#bios","title":"Bios","text":"Filename MD5 Path gba_bios.bin a860e8c0b6d573d191e4ec7db1b1e4f6 roms/bios"},{"location":"systems/gbc/","title":"Nintendo Gameboy Color","text":""},{"location":"systems/gbc/#overview","title":"Overview","text":"Game Path Supported Extensions roms/gbc .gb .gbc .zip .7z"},{"location":"systems/gbc/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Gambatte \u00a0 default docs.libretro.com/library/gambatte SameBoy docs.libretro.com/library/sameboy Gearboy docs.libretro.com/library/gearboy TGB Dual docs.libretro.com/library/tgb_dual mGBA docs.libretro.com/library/mgba VBA-M docs.libretro.com/library/vba_m"},{"location":"systems/gbc/#bios","title":"Bios","text":"Filename MD5 Path gbc_bios.bin dbfce9db9deaa2567f6a84fde55f9680 roms/bios"},{"location":"systems/genesis/","title":"Sega Genesis / Megadrive","text":""},{"location":"systems/genesis/#overview","title":"Overview","text":"System Game Path Supported Extensions Sega Genesis roms/genesis .md .gen .bin .sg .smd .zip .7z Megadrive roms/megadrive .md .gen .bin .sg .smd .zip .7z"},{"location":"systems/genesis/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Genesis Plus GX docs.libretro.com/library/genesis_plus_gx Genesis Plus GX Wide github.com/libretro/Genesis-Plus-GX-Wide PicoDrive docs.libretro.com/library/picodrive"},{"location":"systems/genesis/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files Genesis Plus GX docs.libretro.com/library/genesis_plus_gx/#bios PicoDrive docs.libretro.com/library/picodrive/#bios"},{"location":"systems/intellivision/","title":"Intellivision","text":""},{"location":"systems/intellivision/#overview","title":"Overview","text":"Game Path Supported Extensions roms/intellivision .int .bin .rom .zip .7z"},{"location":"systems/intellivision/#emulatorcore","title":"Emulator/Core","text":"Name Documentation FreeIntv docs.libretro.com/library/freeintv"},{"location":"systems/intellivision/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files FreeIntv see: docs.libretro.com/library/freeintv/#bios"},{"location":"systems/j2me/","title":"Sun Microsystems J2ME","text":""},{"location":"systems/macintosh/","title":"Macintosh","text":""},{"location":"systems/macintosh/#overview","title":"Overview","text":"Game Path Supported Extensions roms/mac .dsk .img .hfv .cmd .zip"},{"location":"systems/macintosh/#emulatorcore","title":"Emulator/Core","text":"Name Documentation minivmac docs.libretro.com/library/minivmac"},{"location":"systems/macintosh/#bios","title":"Bios","text":"Filename MD5 Path MacII.rom 66223BE1497460F1E60885EEB35E03CC roms/bios"},{"location":"systems/mame/","title":"MAME","text":""},{"location":"systems/mame/#overview","title":"Overview","text":"Game Path Supported Extensions roms/mame .zip .7z Name Documentation MAME 2003-Plus \u00a0 default docs.libretro.com/library/mame2003_plus MAME 2010 docs.libretro.com/library/mame_2010 MAME 2015 docs.libretro.com/guides/arcade-getting-started MAME (Current) docs.libretro.com/guides/arcade-getting-started"},{"location":"systems/mame/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All docs.libretro.com/library/mame2003_plus/#bios"},{"location":"systems/mame/#additional-references","title":"Additional References","text":"

Getting started with arcade emulation (Libretro)

"},{"location":"systems/mastersystem/","title":"Sega Master System","text":""},{"location":"systems/mastersystem/#overview","title":"Overview","text":"Game Path Supported Extensions roms/mastersystem .sms .bin .zip .7z"},{"location":"systems/mastersystem/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Gearsystem docs.libretro.com/library/gearsystem Genesis Plus GX docs.libretro.com/library/genesis_plus_gx PicoDrive docs.libretro.com/library/picodrive SMS Plus GX docs.libretro.com/library/smsplus SMS (Mednafen) mednafen.github.io/documentation/sms.html"},{"location":"systems/mastersystem/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All see: docs.libretro.com/library/gearsystem/#bios"},{"location":"systems/megaduck/","title":"Mega Duck","text":""},{"location":"systems/megaduck/#overview","title":"Overview","text":"Game Path Supported Extensions roms/megaduck .bin .zips .7z"},{"location":"systems/megaduck/#emulatorcore","title":"Emulator/Core","text":"Name Documentation SameDuck docs.libretro.com/library/sameduck"},{"location":"systems/moonlight/","title":"Moonlight","text":"

ROCKNIX now supports Moonlight Game Streaming, which allows to connect to your local computer running Moonlight and stream AAA games.

"},{"location":"systems/moonlight/#step-1-setup-moonlight-on-your-pc","title":"Step 1: Setup Moonlight on your PC","text":"

Please follow standard guide to setup Moonlight on your home PC, link.

"},{"location":"systems/moonlight/#step-2-configure-moonlight-in-rocknix","title":"Step 2: Configure Moonlight in ROCKNIX","text":"

The setup requires pairing with your local PC running Moonlight and then populating Moonlight Streaming tab with all your games. After those are completed, you can select an individual game to start streaming.

"},{"location":"systems/moonlight/#pair-with-your-local-pc","title":"Pair with your local PC","text":"
  • While in EmulationStation press START to open the Main Menu
  • Select \"MOONLIGHT GAME STREAMING\" submenu
  • Please note the \"PAIRING PIN\" at the bottom of the window
  • You can also specify \"SERVER IP\" address, but it should be detected automatically
  • Select \"PAIR WITH SERVER\" option
  • Now, go to the local PC and enter PIN to continue the pairing process
  • You should see a confirmation message on your device
  • The paring process should complete

After pairing was successful, select \"UPDATE MOONLIGHT GAMES\" option. This should query the server for the list of all games and populate Moonlight Streaming system in Emulation Station.

"},{"location":"systems/moonlight/#step-3-play","title":"Step 3: Play","text":"

Browse to the Moonlight system in Emulation Station. Select the game you want to play. The game should start and you should be able to interact with it.

"},{"location":"systems/moonlight/#remote-playing-over-internet","title":"Remote Playing over internet","text":"
  • The easiest option is to add your device to your Tailscale network with your local PC.
  • Moonlight allows to open several ports to connect to the local PC to stream over the internet. Setup might be somewhat complicated.
  • Another option is to use WireGuard to setup the connection with the device. This approach requires only a single open port, but it requires WireGuard server to be running on your local network.
"},{"location":"systems/moto/","title":"Thomson - MO/TO family (TO7, TO7/70, TO8, TO8D, TO9, TO9+, MO5 and MO6)","text":""},{"location":"systems/moto/#overview","title":"Overview","text":"Game Path Supported Extensions roms/moto .fd .sap .k7 .rom .m7 .m5"},{"location":"systems/moto/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Theodore docs.libretro.com/library/theodore"},{"location":"systems/mplayer/","title":"Media Player","text":""},{"location":"systems/mplayer/#overview","title":"Overview","text":"Game\u00a0Path\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Supported Extensions roms/mplayer .mp4 .mkv .avi .mov .wmv .m3u .mpg .ytb .twi .sh .mp3 .aac .mka .dts .flac .ogg .m4a .ac3 .opus .wav .wv .eac33 .thd"},{"location":"systems/mplayer/#emulatorcore","title":"Emulator/Core","text":"Name Documentation mpv mpv.io/manual/master/"},{"location":"systems/mplayer/#controls","title":"Controls","text":"Button Action A(SOUTH) Play/Pause B(EAST) Change Audio Track Y(WEST) Change Subtitle Track X(NORTH) View OSD D-Pad Left Skip Backward 5 Seconds D-Pad Right Skip Forward 5 Seconds D-Pad Up Skip Forward 60 Seconds D-Pad Down Skip Backward 60 Seconds SELECT+START Quit (Saves Playback Position)"},{"location":"systems/msx/","title":"Microsoft MSX 1 & 2","text":"

msx msx2

"},{"location":"systems/music/","title":"Music Player","text":""},{"location":"systems/n64/","title":"Nintendo 64","text":""},{"location":"systems/n64/#overview","title":"Overview","text":"Game Path Supported Extensions roms/n64 .z64 .n64 .v64 .zip .7z"},{"location":"systems/n64/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Mupen64Plus-Next \u00a0 default docs.libretro.com/library/mupen64plus Mupen64Plus docs.libretro.com/library/mupen64plus Parallel N64 github.com/libretro/parallel-n64 Mupen64Plus (SA) mupen64plus.org/docs"},{"location":"systems/naomi/","title":"Sega Naomi","text":""},{"location":"systems/naomi/#overview","title":"Overview","text":"Game Path Supported Extensions roms/naomi .lst .bin .dat .zip .7z"},{"location":"systems/naomi/#emulatorcore","title":"Emulator/Core","text":"Name\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Platform(s) Documentation Flycast RK3326, RK3399, S922X, RK3566 docs.libretro.com/library/flycast Flycast 2021 RK3326, S922X, RK3566 docs.libretro.com/library/flycast Flycast 32 RK3326 docs.libretro.com/library/flycast Flycast (Stand Alone) RK3326, RK3399, S922X, RK3566 github.com/flyinghead/flycast"},{"location":"systems/naomi/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All docs.libretro.com/library/flycast/#bios"},{"location":"systems/naomi/#additional-references","title":"Additional References","text":"

Getting started with arcade emulation (Libretro)

"},{"location":"systems/nds/","title":"Nintendo DS","text":""},{"location":"systems/nds/#overview","title":"Overview","text":"Game Path Supported Extensions roms/nds .nds .zip .7z"},{"location":"systems/nds/#emulatorcore","title":"Emulator/Core","text":"Name Platform Documentation melonDS \u00a0 default All docs.libretro.com/library/melonds DeSmuME All docs.libretro.com/library/desmume melonDS (SA) All melonds.kuribo64.net Drastic (SA) All --"},{"location":"systems/nds/#bios","title":"Bios","text":"Filename MD5 Path bios7.bin df692a80a5b1bc90728bc3dfc76cd948 roms/bios bios9.bin a392174eb3e572fed6447e956bde4b25 roms/bios firmware.bin roms/bios dsi_bios7.bin roms/bios dsi_bios9.bin roms/bios dsi_firmware.bin roms/bios dsi_nand.bin roms/bios dsi_sd_card.bin roms/bios"},{"location":"systems/neogeo/","title":"SNK Neo Geo","text":""},{"location":"systems/neogeo/#overview","title":"Overview","text":"Game Path Supported Extensions roms/neogeo .7z .zip .neo"},{"location":"systems/neogeo/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Final Burn Neo \u00a0 default docs.libretro.com/library/fbneo Geolith docs.libretro.com/library/geolith MAME 2003-Plus docs.libretro.com/library/mame2003_plus MAME 2010 docs.libretro.com/library/mame_2010 MAME 2015 docs.libretro.com/guides/arcade-getting-started MAME (Current) docs.libretro.com/guides/arcade-getting-started"},{"location":"systems/neogeo/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files Final Burn Neo docs.libretro.com/library/fbneo/#bios Geolith docs.libretro.com/library/geolith/#bios MAME docs.libretro.com/library/mame2003_plus/#bios"},{"location":"systems/neogeo/#additional-references","title":"Additional References","text":"

Getting started with arcade emulation (Libretro)

"},{"location":"systems/neogeocd/","title":"SNK Neo Geo CD","text":""},{"location":"systems/neogeocd/#overview","title":"Overview","text":"Game Path Supported Extensions roms/neocd .cue .iso .chd"},{"location":"systems/neogeocd/#emulatorcore","title":"Emulator/Core","text":"Name Documentation NeoCD \u00a0 default github.com/libretro/neocd_libretro"},{"location":"systems/neogeocd/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files NeoCD github.com/libretro/neocd_libretro#bios"},{"location":"systems/nes/","title":"NES / Famicom","text":""},{"location":"systems/nes/#overview","title":"Overview","text":"Game Path Supported Extensions roms/nes .nes .unif .unf .zip .7z roms/famicom .nes .unif .unf .zip .7z"},{"location":"systems/nes/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Nestopia \u00a0 default docs.libretro.com/library/nestopia_ue FCEUmm docs.libretro.com/library/fceumm QuickNES docs.libretro.com/library/quicknes Mesen docs.libretro.com/library/mesen"},{"location":"systems/ngp/","title":"Neo Geo Pocket / Pocket Color","text":""},{"location":"systems/ngp/#overview","title":"Overview","text":"System Game Path Supported Extensions Neo Geo Pocket roms/ngp .ngp .ngc .zips .7z Neo Geo Pocket Color roms/npgc .ngp .ngc .zips .7z"},{"location":"systems/ngp/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Beetle NeoPop docs.libretro.com/library/beetle_neopop RACE docs.libretro.com/library/race ngp (Mednafen) mednafen.github.io/documentation/ngp.html"},{"location":"systems/odyssey2/","title":"Magnavox Odyssey","text":""},{"location":"systems/odyssey2/#overview","title":"Overview","text":"Game Path Supported Extensions roms/odyssey .bin .zip .7z"},{"location":"systems/odyssey2/#emulatorcore","title":"Emulator/Core","text":"Name Documentation O2EM docs.libretro.com/library/o2em"},{"location":"systems/odyssey2/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files O2EM see: docs.libretro.com/library/o2em/#bios"},{"location":"systems/openbor/","title":"Open Beats of Rage","text":""},{"location":"systems/palm/","title":"Palm Inc. - Palm OS","text":""},{"location":"systems/palm/#overview","title":"Overview","text":"Game Path Supported Extensions roms/palm .prc .pqa .img .pdb .zip"},{"location":"systems/palm/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Mu git.libretro.com/libretro/Mu"},{"location":"systems/palm/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files Mu see: git.libretro.com/libretro/Mu#files"},{"location":"systems/pc/","title":"MS-DOS","text":""},{"location":"systems/pc/#overview","title":"Overview","text":"Game Path Supported Extensions roms/pc .com .bat .exe .dosz"},{"location":"systems/pc/#emulatorcore","title":"Emulator/Core","text":"Name Documentation dosbox_pure \u00a0 default docs.libretro.com/library/dosbox_pure dosbox_svn docs.libretro.com/library/dosbox"},{"location":"systems/pc88/","title":"NEC PC-88","text":""},{"location":"systems/pc88/#overview","title":"Overview","text":"Game Path Supported Extensions roms/pc88 .d88 .u88 .m3u"},{"location":"systems/pc88/#emulatorcore","title":"Emulator/Core","text":"Name Documentation QUASI88 docs.libretro.com/library/quasi88"},{"location":"systems/pc88/#bios","title":"Bios","text":"

Path: roms/bios/quasi88

Emulator Required Files QUASI88 see: docs.libretro.com/library/quasi88/#bios"},{"location":"systems/pc98/","title":"NEC PC-98","text":""},{"location":"systems/pc98/#overview","title":"Overview","text":"Game Path Supported Extensions roms/pc98 .d98 .zip .fdi .fdd .2hd .tfd .d88 .hdm .xdf .dup .hdi .thd .nhd .hdd .hdn"},{"location":"systems/pc98/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Neko Project II Kai docs.libretro.com/library/neko_project_ii_kai"},{"location":"systems/pc98/#bios","title":"Bios","text":"

Path: roms/bios/np2kai

Emulator Required Files Neko Project II Kai see: docs.libretro.com/library/neko_project_ii_kai/#bios"},{"location":"systems/pcengine/","title":"NEC PC-Engine / TurboGrafx-16","text":""},{"location":"systems/pcengine/#overview","title":"Overview","text":"System Game Path Supported Extensions PC-Engine roms/pcengine .pce .bin .zip .7z PC-Engine CD roms/pcenginecd .cue .ccd .chd .toc .m3u TurboGrafx-16 roms/tg16 .pce .bin .zip .7z TurboGrafx-CD roms/tg16cd .cue .ccd .chd .toc .m3u"},{"location":"systems/pcengine/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Beetle PCE FAST default docs.libretro.com/library/beetle_pce_fast Beetle PCE docs.libretro.com/library/beetle_pce_fast Beetle SuperGrafx docs.libretro.com/library/beetle_sgx PCE (Mednafen) mednafen.github.io/documentation/pce.html PCE FAST (Mednafen) mednafen.github.io/documentation/pce_fast.html"},{"location":"systems/pcengine/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All see: docs.libretro.com/library/beetle_pce_fast/#bios"},{"location":"systems/pcfx/","title":"NEC PC-FX","text":""},{"location":"systems/pcfx/#overview","title":"Overview","text":"Game Path Supported Extensions roms/pcfx .chd .cue .ccd .toc"},{"location":"systems/pcfx/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Beetle PCFX default docs.libretro.com/library/beetle_pc_fx PCFX (Mednafen) mednafen.github.io/documentation/pcfx.html"},{"location":"systems/pcfx/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All see: docs.libretro.com/library/beetle_pc_fx/#bios"},{"location":"systems/pet/","title":"Commodore PET","text":""},{"location":"systems/pico-8/","title":"Pico-8","text":""},{"location":"systems/pico-8/#overview","title":"Overview","text":"Game Path Supported Extensions roms/pico-8 .png .p8"},{"location":"systems/pico-8/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Pico-8 \u00a0 default https://www.lexaloffle.com/pico-8.php Fake-08 https://github.com/jtothebell/fake-08"},{"location":"systems/pico-8/#instructions","title":"Instructions","text":""},{"location":"systems/pico-8/#option-1-running-pico-8-through-the-native-engine","title":"Option 1: Running Pico-8 through the native engine","text":"

Pico-8 games are best played with the default emulator as it supports all native features without any limitations. You need to purchase it from Lexaloffle and we do recommend that you buy a copy if you can. Its an awesome piece of software and it also comes with the tools to make your own games.

"},{"location":"systems/pico-8/#setup","title":"Setup","text":"

Once you have purchased a license; the files you need will depend on the device you are using. These instructions will walk through how to set things up to work on all of our supported devices.

  • Go to Lexaloffle's download page
  • From that page download the Linux 64-bit zip file and the Raspberry Pi zip file
  • From the Linux 64-bit zip file...
    • Create a directory in roms/pico-8 called x86_64
    • Upload the pico8_dyn and pico8.dat from the Linux 64-bit zip to this directory (you do not need any other files)
  • From the Raspberry Pi zip file...
    • Create a directory in roms/pico-8 called aarch64
    • Upload the pico8_64 and pico8.dat from the Raspberry Pi zip to this directory (you do not need any other files)
Folder Structure
/roms/pico-8/\n    \u251c\u2500 x86_64/\n    \u2502   \u251c\u2500 pico8_dyn\n    \u2502   \u251c\u2500 pico8.dat\n    \u251c\u2500 aarch64/\n    \u2502   \u251c\u2500 pico8_64\n    \u2502   \u251c\u2500 pico8.dat\n    \u2514\u2500 Splore.png\n
"},{"location":"systems/pico-8/#playing-a-game","title":"Playing a game","text":"

Once the above is set up is you have 2 options for playing games through Pico-8's native engine:

  1. Using Splore
    • Splore is awesome as it allows you to browse and play the entire library of user created games with an internet connection.
    • To use this method simply launch Splore from the gamelist.
    • Note that you will need an internet connection to browse the pico-8 BBS (If you don't have an internet connection you can still use it to launch games you have downloaded previously)
    • To exit a game and return to EmulationStation you can either (1) press the START button while highlighting a game in Splore then selecting Options > Shutdown or (2) Press L1 + SELECT + START
  2. Through .png or .p8 files added directly roms/pico-8 or roms/pico-8/carts
    • Browse the list of games (aka. \"Carts\") on Lexaloffle's website
    • Download the .png or .p8 file for any game you are interested in playing and upload it to either roms/pico-8 or roms/pico-8/carts
      • roms/pico-8 is recommended if you want to have your games show up directly when you open the Pico-8 system in ES
      • roms/pico-8/carts is recommended if you plan to use Splore directly and also want to see your downloaded carts in the Splore interface.
    • Refresh EmulationStation by pressing START to open the Main Menu then select Game Settings > Update Gamelists.
    • You should now be able to launch the game by selecting it from the gamelist.
    • To exit a game and return to EmulationStation you can either (1) press the START button then selecting Options > Shutdown or (2) Press L1 + SELECT + START
"},{"location":"systems/pico-8/#option-2-running-through-retroarch-fake-08","title":"Option 2: Running through RetroArch Fake-08","text":"

Fake-08 does not support all the native features of Pico-8 so its not guaranteed that every game will work with it.

  • Set the default emulator for Pico-8 to Fake-08
  • Browse the list of games (aka. \"Carts\") on Lexaloffle's website
  • Download the .png file for any game you are interested in playing and upload it to roms/pico-8
  • Refresh EmulationStation by pressing START to open the Main Menu then select Game Settings > Update Gamelists.
  • You should now be able to launch the game by selecting it from the gamelist.
"},{"location":"systems/pico-8/#controls","title":"Controls","text":""},{"location":"systems/pico-8/#emulatorcore-pico-8","title":"Emulator/Core: Pico-8","text":"Button Action A(SOUTH) X/V B(EAST) O/Z/C START Menu"},{"location":"systems/pokemini/","title":"Nintendo Pok\u00e9mon Mini","text":""},{"location":"systems/pokemini/#overview","title":"Overview","text":"Game Path Supported Extensions roms/pokemini .min .zip .7z"},{"location":"systems/pokemini/#emulatorcore","title":"Emulator/Core","text":"Name Documentation PokeMini \u00a0 default docs.libretro.com/library/pokemini"},{"location":"systems/pokemini/#bios","title":"Bios","text":"Filename MD5 Path bios.min 1e4fb124a3a886865acb574f388c803d roms/bios"},{"location":"systems/ports/","title":"Ports","text":""},{"location":"systems/ports/#overview","title":"Overview","text":"Game Path Supported Extensions roms/ports .sh"},{"location":"systems/ports/#using-portmaster","title":"Using PortMaster","text":"

PortMaster provides a easy way to set up and play ports of many homebrew and classic games. You can browse the games available on their website here: https://portmaster.games/

"},{"location":"systems/ports/#setup","title":"Setup","text":"

PortMaster is only known to work on ARM devices at this time.

Follow PortMaster's install instructions for ROCKNIX listed on their wiki here. You can use either the script or zip method described on that page.

For any questions regarding PortMaster please check out their Discord

"},{"location":"systems/ps2/","title":"Sony PlayStation 2","text":""},{"location":"systems/ps2/#overview","title":"Overview","text":"Game Path Supported Extensions roms/ps2 .chd .iso .mdf .cso .gz"},{"location":"systems/ps2/#emulatorcore","title":"Emulator/Core","text":"Name Platform Documentation AetherSX2 RK3588, S922X, RK3399, SD865 www.aethersx2.com/archive"},{"location":"systems/ps2/#bios","title":"Bios","text":"

You need at least one of the files from the following table.

Emulator Required Files Path PCSX2 SCPH-70012.bin roms/bios/pcsx2/bios LRPS2 see details roms/bios/pcsx2/bios AetherSX2 SCPH-70012.bin /roms/bios/aethersx2/bios"},{"location":"systems/ps3/","title":"Sony PlayStation 3","text":""},{"location":"systems/ps3/#overview","title":"Overview","text":"Game Path Supported Extensions roms/ps3 .ps3 .psn"},{"location":"systems/ps3/#emulatorcore","title":"Emulator/Core","text":"Name Documentation RPCS3 rpcs3.net/quickstart"},{"location":"systems/ps3/#instructions","title":"Instructions","text":""},{"location":"systems/ps3/#1-firmware-setup","title":"1. Firmware Setup","text":"

RPCS3 requires official PS3 firmware to be installed through RPCS3's GUI before you can run games. Its recommended to have a mouse/keyboard plugged in for these steps to make it easier to navigate RPCS3's GUI.

  1. Download the latest official PS3 firmware from Sony's PS3 System Software page. (The downloaded file will be named PS3UPDAT.PUP)
  2. Transfer the PS3UPDAT.PUP file to /roms/temp. If the temp folder does not exist then please create it (you will delete this file after you have installed it).
  3. Navigate to the Tools system and then select Start RPCS3. This will open the RPCS3 GUI where you will install the firmware you downloaded above.
  4. Select File > Install Firmware.
  5. Navigate to ~/roms/temp, select PS3UPDAT.PUP and press Open

The firmware will be installed and then a window will open to process the needed files; please let this process complete. Once complete you can close out RPCS3 and return to EmulationStation. You can also delete PS3UPDAT.PUP from /roms/temp to free up space.

"},{"location":"systems/ps3/#2-game-setup","title":"2. Game Setup","text":"

PS3 games are available in two formats: Disc-Based Games and Digital PSN Packages. The steps for setting up a given game differ depending on its source format.

"},{"location":"systems/ps3/#disc-based-games","title":"Disc-Based Games","text":"

RPCS3 works with decrypted ISO files stored in a folder format so you will need to convert your discs to this format before they can be read by the emulator.

"},{"location":"systems/ps3/#steps","title":"Steps:","text":"
  1. Follow these instructions from RPCS3's wiki to dump and decrypt your PS3 disc (recommended: follow the instructions for using ps3-disc-dumper).
  2. Add a .ps3 extension to the end of the folder name that was generated by ps3-disc-dumper.
  3. Upload that folder (with the .ps3 extension) to roms/ps3 Example Folder Structure
    /roms/ps3/\n    \u2514\u2500 Game name.ps3/\n        \u251c\u2500 PS3_GAME/\n        \u2502  \u251c\u2500 LICDIR/\n        \u2502  \u251c\u2500 TROPDIR/ (trophy data)\n        \u2502  \u251c\u2500 USRDIR/ (the main game data)\n        \u2502  \u251c\u2500 ICON0.PNG\n        \u2502  \u251c\u2500 PARAM.SFO\n        \u2502  \u251c\u2500 PIC0.PNG\n        \u2502  \u251c\u2500 PS3LOGO.DAT\n        \u2502  \u2514\u2500 (various other metadata files)\n        \u251c\u2500 PS3_UPDATE/ (built-in firmware update, if applicable)\n        \u2514\u2500 PS3_DISC.SFB\n
  4. Refresh EmulationStation by pressing START to open the Main Menu then select Game Settings > Update Gamelists.

Once complete you should now see your game in the PS3 gamelist.

"},{"location":"systems/ps3/#digital-psn-packages","title":"Digital PSN Packages","text":"

Digital PSN Packages will only work in dev at this time. Please do not try them if you are running a main release.

RPCS3 requires Digial PSN Packages to be installed through the emulator GUI before they can be played. If you have questions regarding which files are necessary to install PSN games, please check out the RPCS3 wiki. The following notes will focus only on the steps needed once you have the needed files.

"},{"location":"systems/ps3/#rpcs3-steps","title":"RPCS3 Steps:","text":"
  1. Upload the needed files for you PSN game to ~/roms/temp (you will delete these files after installation)
  2. Navigate to the Tools system and then select Start RPCS3. This will open the RPCS3 GUI where you will install your PSN game.
  3. Select File > Install Packages/Raps/Edats
  4. Navigate to ~/roms/temp, select the files for your PSN game and press Open
  5. After install please note down the value that is displayed in the Serial column in RPCS3's game list for the game you just installed (you will use this in the next set of steps)

Once complete you can close out RPCS3 and return to EmulationStation. You can also delete your PSN game files from /roms/temp to free up space.

As a side note your installed games can be found in ~/roms/bios/RPCS3/dev_hdd0/games (this may be useful if you ever run into storage limitaions and want to free up space)

"},{"location":"systems/ps3/#emulationstation-steps","title":"EmulationStation Steps:","text":"

In order for your newly installed game to show up in EmulationStation you need to create one more thing... a .psn file to represent your installed game.

  1. Create a file in ~/roms/ps3 called [Game Name].psn where [Game Name] is a readable name for your game (this will help with scraping)
  2. Edit that file and on the first line paste the Serial of the game that you noted down from the steps above Example File Setup
    /roms/ps3/\n    \u2514\u2500 Afterburner Climax (USA).psn\n        \u2514\u2500 NPUB30151\n
  3. Save the file
  4. Refresh EmulationStation by pressing START to open the Main Menu then select Game Settings > Update Gamelists.

Once done you should be able to launch your PSN game directly from the EmulationStation gamelist.

"},{"location":"systems/ps3/#3-running-a-game","title":"3. Running a Game","text":"

On the first boot of a game, RPCS3 will compile its PPU modules. This can take a long time so please have patience as its required to run the game. Allowing RPCS3 to do this will also make all future launches of the game much quicker.

To exit a game and return to EmulationStation you can either (1) press the GUIDE button on your controller to open up RPCS3's menu and select Exit or (2) Press L1 + SELECT + START

"},{"location":"systems/psp/","title":"Sony PlayStation Portable (PSP)","text":""},{"location":"systems/psp/#overview","title":"Overview","text":"Game Path Supported Extensions roms/psp .iso .cso .pbp .chd"},{"location":"systems/psp/#emulatorcore","title":"Emulator/Core","text":"Name Documentation PPSSPP (Stand Alone) ppsspp.org/docs/intro PPSSPP docs.libretro.com/library/ppsspp"},{"location":"systems/psp/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files PPSSPP docs.libretro.com/library/ppsspp/#bios"},{"location":"systems/psp/#cheats-and-fixes","title":"Cheats and Fixes","text":"

Rocknix ships with a database of optional cheats, fixes and improvements for PSP games.

These can be beneficial for both low-powered devices (e.g to lock a 60 FPS game to 30 FPS to make it easier to emulate or to disable certain effects that are slow to emulate) and high-powered devices (e.g to change a 30 FPS game to 60 FPS for increased smoothness). The aspect ratio of some games can also be changed this way to play games on 3:2 screens without black bars.

To see which cheats are available for a game and to enable them, follow the steps below:

  1. Launch PPSSPP and open the menu with the hotkeys for your device
  2. Select \"Cheats\"
  3. Select \"Import from PSP/Cheats/cheat.db\"
  4. If any cheats are available for the loaded game they'll be shown on the right side and can be enabled

Keep in mind that cheats and fixes are not guaranteed to work and can impact stability. Please do not report non-working cheats or crashes with cheats enabled as bugs to either the PPSSPP project or to Rocknix.

"},{"location":"systems/psvita/","title":"Sony PlayStation Vita","text":""},{"location":"systems/psvita/#overview","title":"Overview","text":"Game Path Supported Extensions see notes .sh"},{"location":"systems/psvita/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Vita3K vita3k.org/quickstart.html"},{"location":"systems/psvita/#notes","title":"Notes","text":"

Support for this system is a work in progress.

"},{"location":"systems/psx/","title":"Sony PlayStation","text":""},{"location":"systems/psx/#overview","title":"Overview","text":"Game Path Supported Extensions roms/psx .bin .cue .img .mdf .pbp .toc .cbn .m3u .ccd .chd .iso"},{"location":"systems/psx/#emulatorcore","title":"Emulator/Core","text":"Name Platform Documentation Beetle PSX S922X, RK3399, RK3588 docs.libretro.com/library/beetle_psx DuckStation (Stand Alone) S922X, RK3399, RK3588, RK3566 github.com/stenzek/duckstation PCSX ReARMed S922X, RK3399, RK3588, RK3566, RK3326 docs.libretro.com/library/pcsx_rearmed PCSX ReARMed 32 RK3399, RK3588, RK3566, RK3326 docs.libretro.com/library/pcsx_rearmed DuckStation All github.com/stenzek/duckstation SwanStation All github.com/libretro/swanstation"},{"location":"systems/psx/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files Beetle PSX docs.libretro.com/library/beetle_psx/#bios PSX (Mednafen) mednafen.github.io/documentation/psx.html#Section_firmware_bios PCSX ReARMed docs.libretro.com/library/pcsx_rearmed/#bios"},{"location":"systems/saturn/","title":"Sega Saturn","text":""},{"location":"systems/saturn/#overview","title":"Overview","text":"Game Path Supported Extensions roms/saturn .cue .chd .iso"},{"location":"systems/saturn/#emulatorcore","title":"Emulator/Core","text":"Name Documentation YabaSanshiro docs.libretro.com/library/yabause Beetle Saturn docs.libretro.com/library/beetle_saturn YabaSanshiro (Stand Alone) github.com/devmiyax/yabause Kronos (Stand Alone) github.com/FCare/Kronos"},{"location":"systems/saturn/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All See: docs.libretro.com/library/beetle_saturn/#bios"},{"location":"systems/scummvm/","title":"SCUMMVM","text":""},{"location":"systems/scummvm/#overview","title":"Overview","text":"Game Path Supported Extensions roms/scummvm Refer to games required data files"},{"location":"systems/scummvm/#emulatorcore","title":"Emulator/Core","text":"Name Documentation ScummVM https://www.scummvm.org/"},{"location":"systems/scummvm/#instructions","title":"Instructions","text":"
  • Add the ScummVM game data files within a subfolder to roms/scummvm (e.g. roms/scummvm/sky). Check ScummVM's supported games page for more details on the required data files.
  • In EmulationStation, select the _Scan ScummVM Games under the ScummVM device section or run the _Scan ScummVM Games.sh script in /storage/.config/scummvm. This will automatically generate the required .scummvm files within /storage/.config/scummvm/games. See the next section, if you would like to create these files manually.
  • To see the newly created list, refresh EmulationStation by pressing START to open the Main Menu then select Game Settings > Update Gamelists.
"},{"location":"systems/scummvm/#scummvm-files","title":".scummvm files","text":"

Unlike other systems, ScummVM relies on .scummvm files to link to the rom/data files from its internal configuration folder. They can be generated automatically by the _Scan ScummVM Games script (see above) or by manually creating each file and placing it within /storage/.config/scummvm/games.

.scummvm files are named using the common name of the game and the Game Short Name in brackets (e.g. Beneath a Steel Sky (sky).scummvm).

.scummvm files contain a single line in the form:

  • --path= variable and the path to the folder containing the game, followed by the Game Short Name

Example: /storage/.config/scummvm/games/Beneath a Steel Sky (sky).scummvm contains

--path=\"/roms/scummvm/Beneath a Steel Sky (CD VGA)\" sky\n

.scummvm files are NOT stored in /roms/scummvm and any .scummvm files stored there will not be displayed by EmulationStation. EmulationStation only displays .scummvm files that are in /storage/.config/scummvm/games.

"},{"location":"systems/scummvm/#scraping","title":"Scraping","text":"

All metadata files and media folders generated from scraping will be stored in /storage/.config/scummvm/games.

"},{"location":"systems/scummvm/#deleting-games","title":"Deleting games","text":"

Deleting ScummVM games through EmulationStation's Game Options menu will only delete the .scummvm file within /storage/.config/scummvm/games and not the game data files in roms/scummvm.

This can be useful as sometimes the _Scan ScummVM Games script will generate multiple .scummvm files for one game.

"},{"location":"systems/scv/","title":"Epoch - Super Cassette Vision","text":""},{"location":"systems/scv/#overview","title":"Overview","text":"Game Path Supported Extensions roms/scv .cart .bin .rom .0 .zip"},{"location":"systems/scv/#emulatorcore","title":"Emulator/Core","text":"Name Documentation EmuSCV docs.libretro.com/library/emuscv"},{"location":"systems/scv/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files EmuSCV see: docs.libretro.com/library/emuscv/#bios"},{"location":"systems/sega32x/","title":"Sega 32X","text":""},{"location":"systems/sega32x/#overview","title":"Overview","text":"Game Path Supported Extensions roms/sega32x .32x .smd .bin .md .zip .7z"},{"location":"systems/sega32x/#emulatorcore","title":"Emulator/Core","text":"Name Documentation PicoDrive docs.libretro.com/library/picodrive"},{"location":"systems/sega32x/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files PicoDrive docs.libretro.com/library/picodrive/#bios"},{"location":"systems/segacd/","title":"Sega CD / Mega CD","text":""},{"location":"systems/segacd/#overview","title":"Overview","text":"System Game Path Supported Extensions Sega CD roms/segacd .chd .cue .iso .m3u Mega CD roms/megacd .chd .cue .iso .m3u"},{"location":"systems/segacd/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Genesis Plus GX docs.libretro.com/library/genesis_plus_gx PicoDrive docs.libretro.com/library/picodrive"},{"location":"systems/segacd/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files Genesis Plus GX docs.libretro.com/library/genesis_plus_gx/#bios PicoDrive docs.libretro.com/library/picodrive/#bios"},{"location":"systems/sg-1000/","title":"Sega SG-1000","text":""},{"location":"systems/sg-1000/#overview","title":"Overview","text":"Game Path Supported Extensions roms/sg-1000 .sg .bin .zip .7z"},{"location":"systems/sg-1000/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Gearsystem docs.libretro.com/library/gearsystem Genesis Plus GX docs.libretro.com/library/genesis_plus_gx PicoDrive docs.libretro.com/library/picodrive"},{"location":"systems/sg-1000/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All see: docs.libretro.com/library/gearsystem/#bios"},{"location":"systems/snes/","title":"Super Nintendo / Super Famicom","text":""},{"location":"systems/snes/#overview","title":"Overview","text":"System Game Path Supported Extensions Super Nintendo roms/snes .smc .fig .sfc .swc .zip .7z Super Famicom roms/sfc .smc .fig .sfc .swc .zip .7z Satellaview roms/satellaview .smc .fig .bs .sfc .bsx .swc .zip .7z MSU-1 roms/snesmsu1 .smc .fig .sfc .swc .zip .7z Sufami Turbo roms/sufami .st .zip .7z"},{"location":"systems/snes/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Snes9x \u00a0 default docs.libretro.com/library/snes9x Snes9x 2010 docs.libretro.com/library/snes9x_2010 Snes9x 2002 docs.libretro.com/library/snes9x_2002 Snes9x 2005 Plus docs.libretro.com/library/snes9x_2005_plus Beetle Supafaust github.com/libretro/supafaust BSNES docs.libretro.com/library/beetle_bsnes BSNES Mercury Performance docs.libretro.com/library/bsnes_mercury_performance BSNES HD (Beta) github.com/DerKoun/bsnes-hd"},{"location":"systems/snes/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All STBIOS.bin (d3a44ba7d42a74d3ac58cb9c14c6a5ca) BS-X.bin (fed4d8242cfbed61343d53d48432aced)"},{"location":"systems/supergrafx/","title":"NEC SuperGrafx","text":""},{"location":"systems/supergrafx/#overview","title":"Overview","text":"Game Path Supported Extensions roms/sgfx .sgx .pce .zip .7z"},{"location":"systems/supergrafx/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Beetle SuperGrafx default docs.libretro.com/library/beetle_sgx Beetle PCE docs.libretro.com/library/beetle_pce_fast PCE (Mednafen) mednafen.github.io/documentation/pce.html"},{"location":"systems/supergrafx/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files All see: docs.libretro.com/library/beetle_sgx/#bios"},{"location":"systems/supervision/","title":"Supervision","text":""},{"location":"systems/supervision/#overview","title":"Overview","text":"Game Path Supported Extensions roms/supervision .sv .zip .7z"},{"location":"systems/supervision/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Potator github.com/libretro/potator"},{"location":"systems/tic-80/","title":"TIC-80","text":""},{"location":"systems/uzebox/","title":"Uzebox","text":""},{"location":"systems/uzebox/#overview","title":"Overview","text":"Game Path Supported Extensions roms/uzebox .uze"},{"location":"systems/uzebox/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Uzem docs.libretro.com/library/uzem"},{"location":"systems/vectrex/","title":"Vectrex","text":""},{"location":"systems/vectrex/#overview","title":"Overview","text":"Game Path Supported Extensions roms/vectrex .vec .bin .zip .7z"},{"location":"systems/vectrex/#emulatorcore","title":"Emulator/Core","text":"Name Documentation vecx docs.libretro.com/library/vecx"},{"location":"systems/vic20/","title":"Commodore VIC-20","text":""},{"location":"systems/videopac/","title":"Philips Videopac","text":""},{"location":"systems/videopac/#overview","title":"Overview","text":"Game Path Supported Extensions roms/videopac .bin .zip .7z"},{"location":"systems/videopac/#emulatorcore","title":"Emulator/Core","text":"Name Documentation O2EM docs.libretro.com/library/o2em"},{"location":"systems/videopac/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files O2EM see: docs.libretro.com/library/o2em/#bios"},{"location":"systems/vircon32/","title":"Vircon32","text":""},{"location":"systems/vircon32/#overview","title":"Overview","text":"Game Path Supported Extensions roms/vircon32 .v32"},{"location":"systems/vircon32/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Vircon32 docs.libretro.com/library/vircon32"},{"location":"systems/vircon32/#bios","title":"Bios","text":"

Path: roms/bios

Emulator Required Files Vircon32 https://docs.libretro.com/library/vircon32/#bios"},{"location":"systems/virtualboy/","title":"Nintendo Virtual Boy","text":""},{"location":"systems/virtualboy/#overview","title":"Overview","text":"Game Path Supported Extensions roms/virtualboy .vb .zip .7z"},{"location":"systems/virtualboy/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Beetle VB docs.libretro.com/library/beetle_vb"},{"location":"systems/wii/","title":"Nintendo Wii","text":""},{"location":"systems/wii/#overview","title":"Overview","text":"Game Path Supported Extensions roms/wii .gcm .iso .gcz .ciso .wbfs .rvz .dol .wad"},{"location":"systems/wii/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Dolphin (SA) dolphin-emu.org/docs/guides Dolphin (QT) dolphin-emu.org/docs/guides Dolphin Libretro docs.libretro.com/library/dolphin"},{"location":"systems/wiiu/","title":"Nintendo Wii U","text":""},{"location":"systems/wiiu/#overview","title":"Overview","text":"Game Path Supported Extensions roms/wiiu .wud .wux .wua"},{"location":"systems/wiiu/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Cemu (SA) \u00a0 default wiki.cemu.info/wiki/Main_Page"},{"location":"systems/wonderswan/","title":"Wonderswan / Wonderswan Color","text":""},{"location":"systems/wonderswan/#overview","title":"Overview","text":"System Game Path Supported Extensions Wonderswan roms/wonderswan .ws .wsc .zips .7z Wonderswan Color roms/wonderswancolor .ws .wsc .zips .7z"},{"location":"systems/wonderswan/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Beetle Cygne docs.libretro.com/library/beetle_cygne wswan (Mednafen) mednafen.github.io/documentation/wswan.html"},{"location":"systems/x1/","title":"Sharp X1","text":""},{"location":"systems/x1/#overview","title":"Overview","text":"Game Path Supported Extensions roms/x1 .dx1 .2d .2hd .tfd .d88 88d .hdm .xdf .dup .tap .cmd .zip .7z"},{"location":"systems/x1/#emulatorcore","title":"Emulator/Core","text":"Name Documentation X Millennium github.com/r-type/xmil-libretro"},{"location":"systems/x1/#bios","title":"Bios","text":"

Path: roms/bios/xmil

Emulator Required Files X Millennium IPLROM.X1 IPLROM.X1T"},{"location":"systems/x68000/","title":"Sharp X68000","text":""},{"location":"systems/x68000/#overview","title":"Overview","text":"Game Path Supported Extensions roms/x68000 .dim .img .d88 .hdm .dup .2hd .xdf .hdf .cmd .m3u .zip .7z"},{"location":"systems/x68000/#emulatorcore","title":"Emulator/Core","text":"Name Documentation PX68k docs.libretro.com/library/px68k"},{"location":"systems/x68000/#bios","title":"Bios","text":"Path Files roms/bios/keropi Add the files listed here: docs.libretro.com/library/px68k/#bios"},{"location":"systems/xbox/","title":"Microsoft Xbox","text":""},{"location":"systems/xbox/#overview","title":"Overview","text":"Game Path Supported Extensions roms/xbox .iso

xemu requires game discs to be in the form of xiso images. These are generally saved with a .iso extension, but are not the same as typical ISO images and should be created following the instructions in Xemu's documentation (linked below).

"},{"location":"systems/xbox/#emulatorcore","title":"Emulator/Core","text":"Name Documentation xemu xemu.app/docs/disc-images"},{"location":"systems/xbox/#bios","title":"Bios","text":"

see: xemu.app/docs/required-files

Required Files Path mcpx_1.0.bin /roms/bios/xemu/bios Complex_4627v1.03.bin /roms/bios/xemu/bios Optional Files Path eeprom.bin /roms/bios/xemu/eeprom xbox_hdd.qcow2 /roms/bios/xemu/hdd"},{"location":"systems/zmachine/","title":"Infocom Zmachine","text":""},{"location":"systems/zx81/","title":"Sinclair ZX81","text":""},{"location":"systems/zx81/#overview","title":"Overview","text":"Game Path Supported Extensions roms/zx81 .tzx .p .t81 .zip .7z"},{"location":"systems/zx81/#emulatorcore","title":"Emulator/Core","text":"Name Documentation EightyOne docs.libretro.com/library/eightyone"},{"location":"systems/zxspectrum/","title":"Sinclair ZX Spectrum","text":""},{"location":"systems/zxspectrum/#overview","title":"Overview","text":"Game Path Supported Extensions roms/zxspectrum .tzx .tap .z80 .rzx .scl .trd"},{"location":"systems/zxspectrum/#emulatorcore","title":"Emulator/Core","text":"Name Documentation Fuse docs.libretro.com/library/fuse"},{"location":"systems/zxspectrum/#bios","title":"Bios","text":"

Path: roms/bios/fuse

Emulator Required Files Fuse see: docs.libretro.com/library/fuse/#bios"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 000000000..e0feae8df --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,818 @@ + + + + https://rocknix.org/ + 2025-01-17 + daily + + + https://rocknix.org/donations/ + 2025-01-17 + daily + + + https://rocknix.org/faqs/ + 2025-01-17 + daily + + + https://rocknix.org/configure/bluetooth/ + 2025-01-17 + daily + + + https://rocknix.org/configure/cloud-sync/ + 2025-01-17 + daily + + + https://rocknix.org/configure/collections/ + 2025-01-17 + daily + + + https://rocknix.org/configure/h700-installation/ + 2025-01-17 + daily + + + https://rocknix.org/configure/hdmi/ + 2025-01-17 + daily + + + https://rocknix.org/configure/networking/ + 2025-01-17 + daily + + + https://rocknix.org/configure/optimizations/ + 2025-01-17 + daily + + + https://rocknix.org/configure/overlays/ + 2025-01-17 + daily + + + https://rocknix.org/configure/scraper/ + 2025-01-17 + daily + + + https://rocknix.org/configure/shaders/ + 2025-01-17 + daily + + + https://rocknix.org/configure/themes/ + 2025-01-17 + daily + + + https://rocknix.org/configure/vpn/ + 2025-01-17 + daily + + + https://rocknix.org/contribute/ + 2025-01-17 + daily + + + https://rocknix.org/contribute/build/ + 2025-01-17 + daily + + + https://rocknix.org/contribute/code-of-conduct/ + 2025-01-17 + daily + + + https://rocknix.org/contribute/modify/ + 2025-01-17 + daily + + + https://rocknix.org/contribute/packages/ + 2025-01-17 + daily + + + https://rocknix.org/contribute/quirks/ + 2025-01-17 + daily + + + https://rocknix.org/devices/ + 2025-01-17 + daily + + + https://rocknix.org/devices/anbernic/rg-cubexx/ + 2025-01-17 + daily + + + https://rocknix.org/devices/anbernic/rg28xx/ + 2025-01-17 + daily + + + https://rocknix.org/devices/anbernic/rg34xx/ + 2025-01-17 + daily + + + https://rocknix.org/devices/anbernic/rg351pmv/ + 2025-01-17 + daily + + + https://rocknix.org/devices/anbernic/rg353pmvvs/ + 2025-01-17 + daily + + + https://rocknix.org/devices/anbernic/rg35xx-2024/ + 2025-01-17 + daily + + + https://rocknix.org/devices/anbernic/rg35xx-h/ + 2025-01-17 + daily + + + https://rocknix.org/devices/anbernic/rg35xx-plus/ + 2025-01-17 + daily + + + https://rocknix.org/devices/anbernic/rg35xx-sp/ + 2025-01-17 + daily + + + https://rocknix.org/devices/anbernic/rg40xx-h/ + 2025-01-17 + daily + + + https://rocknix.org/devices/anbernic/rg40xx-v/ + 2025-01-17 + daily + + + https://rocknix.org/devices/anbernic/rg503/ + 2025-01-17 + daily + + + https://rocknix.org/devices/anbernic/rg552/ + 2025-01-17 + daily + + + https://rocknix.org/devices/anbernic/rgarc/ + 2025-01-17 + daily + + + https://rocknix.org/devices/gameforce/gameforce-ace/ + 2025-01-17 + daily + + + https://rocknix.org/devices/hardkernel/odroid-go-advance/ + 2025-01-17 + daily + + + https://rocknix.org/devices/hardkernel/odroid-go-super/ + 2025-01-17 + daily + + + https://rocknix.org/devices/hardkernel/odroid-go-ultra/ + 2025-01-17 + daily + + + https://rocknix.org/devices/hardkernel/odroid-n2/ + 2025-01-17 + daily + + + https://rocknix.org/devices/indiedroid/nova/ + 2025-01-17 + daily + + + https://rocknix.org/devices/magicx/xu-mini-m/ + 2025-01-17 + daily + + + https://rocknix.org/devices/orange-pi/orange-pi-5/ + 2025-01-17 + daily + + + https://rocknix.org/devices/powkiddy/rgb10-max-3-pro/ + 2025-01-17 + daily + + + https://rocknix.org/devices/powkiddy/rgb10-max-3/ + 2025-01-17 + daily + + + https://rocknix.org/devices/powkiddy/rgb10/ + 2025-01-17 + daily + + + https://rocknix.org/devices/powkiddy/rgb10x/ + 2025-01-17 + daily + + + https://rocknix.org/devices/powkiddy/rgb20sx/ + 2025-01-17 + daily + + + https://rocknix.org/devices/powkiddy/rgb30/ + 2025-01-17 + daily + + + https://rocknix.org/devices/powkiddy/rk2023/ + 2025-01-17 + daily + + + https://rocknix.org/devices/powkiddy/x35s/ + 2025-01-17 + daily + + + https://rocknix.org/devices/powkiddy/x55/ + 2025-01-17 + daily + + + https://rocknix.org/devices/powkiddy/xu10/ + 2025-01-17 + daily + + + https://rocknix.org/devices/retroid/retroid-pocket-5/ + 2025-01-17 + daily + + + https://rocknix.org/devices/retroid/retroid-pocket-mini/ + 2025-01-17 + daily + + + https://rocknix.org/devices/unbranded/game-console-r33s/ + 2025-01-17 + daily + + + https://rocknix.org/devices/unbranded/game-console-r35s-r36s/ + 2025-01-17 + daily + + + https://rocknix.org/play/add-games/ + 2025-01-17 + daily + + + https://rocknix.org/play/controls/ + 2025-01-17 + daily + + + https://rocknix.org/play/install/ + 2025-01-17 + daily + + + https://rocknix.org/play/netplay/ + 2025-01-17 + daily + + + https://rocknix.org/play/retro-achievements/ + 2025-01-17 + daily + + + https://rocknix.org/play/update/ + 2025-01-17 + daily + + + https://rocknix.org/systems/ + 2025-01-17 + daily + + + https://rocknix.org/systems/3do/ + 2025-01-17 + daily + + + https://rocknix.org/systems/3ds/ + 2025-01-17 + daily + + + https://rocknix.org/systems/amiga/ + 2025-01-17 + daily + + + https://rocknix.org/systems/amigacd32/ + 2025-01-17 + daily + + + https://rocknix.org/systems/amstradcpc/ + 2025-01-17 + daily + + + https://rocknix.org/systems/arduboy/ + 2025-01-17 + daily + + + https://rocknix.org/systems/atari2600/ + 2025-01-17 + daily + + + https://rocknix.org/systems/atari5200/ + 2025-01-17 + daily + + + https://rocknix.org/systems/atari7800/ + 2025-01-17 + daily + + + https://rocknix.org/systems/atari800/ + 2025-01-17 + daily + + + https://rocknix.org/systems/atarijaguar/ + 2025-01-17 + daily + + + https://rocknix.org/systems/atarilynx/ + 2025-01-17 + daily + + + https://rocknix.org/systems/atarist/ + 2025-01-17 + daily + + + https://rocknix.org/systems/atomiswave/ + 2025-01-17 + daily + + + https://rocknix.org/systems/build-engine/ + 2025-01-17 + daily + + + https://rocknix.org/systems/c128/ + 2025-01-17 + daily + + + https://rocknix.org/systems/c16/ + 2025-01-17 + daily + + + https://rocknix.org/systems/c64/ + 2025-01-17 + daily + + + https://rocknix.org/systems/cdi/ + 2025-01-17 + daily + + + https://rocknix.org/systems/channelf/ + 2025-01-17 + daily + + + https://rocknix.org/systems/chip-8/ + 2025-01-17 + daily + + + https://rocknix.org/systems/colecovision/ + 2025-01-17 + daily + + + https://rocknix.org/systems/cps1/ + 2025-01-17 + daily + + + https://rocknix.org/systems/cps2/ + 2025-01-17 + daily + + + https://rocknix.org/systems/cps3/ + 2025-01-17 + daily + + + https://rocknix.org/systems/daphne/ + 2025-01-17 + daily + + + https://rocknix.org/systems/doom/ + 2025-01-17 + daily + + + https://rocknix.org/systems/dreamcast/ + 2025-01-17 + daily + + + https://rocknix.org/systems/easyrpg/ + 2025-01-17 + daily + + + https://rocknix.org/systems/fbn/ + 2025-01-17 + daily + + + https://rocknix.org/systems/fds/ + 2025-01-17 + daily + + + https://rocknix.org/systems/gameandwatch/ + 2025-01-17 + daily + + + https://rocknix.org/systems/gamecube/ + 2025-01-17 + daily + + + https://rocknix.org/systems/gamegear/ + 2025-01-17 + daily + + + https://rocknix.org/systems/gb/ + 2025-01-17 + daily + + + https://rocknix.org/systems/gba/ + 2025-01-17 + daily + + + https://rocknix.org/systems/gbc/ + 2025-01-17 + daily + + + https://rocknix.org/systems/genesis/ + 2025-01-17 + daily + + + https://rocknix.org/systems/intellivision/ + 2025-01-17 + daily + + + https://rocknix.org/systems/j2me/ + 2025-01-17 + daily + + + https://rocknix.org/systems/macintosh/ + 2025-01-17 + daily + + + https://rocknix.org/systems/mame/ + 2025-01-17 + daily + + + https://rocknix.org/systems/mastersystem/ + 2025-01-17 + daily + + + https://rocknix.org/systems/megaduck/ + 2025-01-17 + daily + + + https://rocknix.org/systems/moonlight/ + 2025-01-17 + daily + + + https://rocknix.org/systems/moto/ + 2025-01-17 + daily + + + https://rocknix.org/systems/mplayer/ + 2025-01-17 + daily + + + https://rocknix.org/systems/msx/ + 2025-01-17 + daily + + + https://rocknix.org/systems/music/ + 2025-01-17 + daily + + + https://rocknix.org/systems/n64/ + 2025-01-17 + daily + + + https://rocknix.org/systems/naomi/ + 2025-01-17 + daily + + + https://rocknix.org/systems/nds/ + 2025-01-17 + daily + + + https://rocknix.org/systems/neogeo/ + 2025-01-17 + daily + + + https://rocknix.org/systems/neogeocd/ + 2025-01-17 + daily + + + https://rocknix.org/systems/nes/ + 2025-01-17 + daily + + + https://rocknix.org/systems/ngp/ + 2025-01-17 + daily + + + https://rocknix.org/systems/odyssey2/ + 2025-01-17 + daily + + + https://rocknix.org/systems/openbor/ + 2025-01-17 + daily + + + https://rocknix.org/systems/palm/ + 2025-01-17 + daily + + + https://rocknix.org/systems/pc/ + 2025-01-17 + daily + + + https://rocknix.org/systems/pc88/ + 2025-01-17 + daily + + + https://rocknix.org/systems/pc98/ + 2025-01-17 + daily + + + https://rocknix.org/systems/pcengine/ + 2025-01-17 + daily + + + https://rocknix.org/systems/pcfx/ + 2025-01-17 + daily + + + https://rocknix.org/systems/pet/ + 2025-01-17 + daily + + + https://rocknix.org/systems/pico-8/ + 2025-01-17 + daily + + + https://rocknix.org/systems/pokemini/ + 2025-01-17 + daily + + + https://rocknix.org/systems/ports/ + 2025-01-17 + daily + + + https://rocknix.org/systems/ps2/ + 2025-01-17 + daily + + + https://rocknix.org/systems/ps3/ + 2025-01-17 + daily + + + https://rocknix.org/systems/psp/ + 2025-01-17 + daily + + + https://rocknix.org/systems/psvita/ + 2025-01-17 + daily + + + https://rocknix.org/systems/psx/ + 2025-01-17 + daily + + + https://rocknix.org/systems/saturn/ + 2025-01-17 + daily + + + https://rocknix.org/systems/scummvm/ + 2025-01-17 + daily + + + https://rocknix.org/systems/scv/ + 2025-01-17 + daily + + + https://rocknix.org/systems/sega32x/ + 2025-01-17 + daily + + + https://rocknix.org/systems/segacd/ + 2025-01-17 + daily + + + https://rocknix.org/systems/sg-1000/ + 2025-01-17 + daily + + + https://rocknix.org/systems/snes/ + 2025-01-17 + daily + + + https://rocknix.org/systems/supergrafx/ + 2025-01-17 + daily + + + https://rocknix.org/systems/supervision/ + 2025-01-17 + daily + + + https://rocknix.org/systems/tic-80/ + 2025-01-17 + daily + + + https://rocknix.org/systems/uzebox/ + 2025-01-17 + daily + + + https://rocknix.org/systems/vectrex/ + 2025-01-17 + daily + + + https://rocknix.org/systems/vic20/ + 2025-01-17 + daily + + + https://rocknix.org/systems/videopac/ + 2025-01-17 + daily + + + https://rocknix.org/systems/vircon32/ + 2025-01-17 + daily + + + https://rocknix.org/systems/virtualboy/ + 2025-01-17 + daily + + + https://rocknix.org/systems/wii/ + 2025-01-17 + daily + + + https://rocknix.org/systems/wiiu/ + 2025-01-17 + daily + + + https://rocknix.org/systems/wonderswan/ + 2025-01-17 + daily + + + https://rocknix.org/systems/x1/ + 2025-01-17 + daily + + + https://rocknix.org/systems/x68000/ + 2025-01-17 + daily + + + https://rocknix.org/systems/xbox/ + 2025-01-17 + daily + + + https://rocknix.org/systems/zmachine/ + 2025-01-17 + daily + + + https://rocknix.org/systems/zx81/ + 2025-01-17 + daily + + + https://rocknix.org/systems/zxspectrum/ + 2025-01-17 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 000000000..74d864bf2 Binary files /dev/null and b/sitemap.xml.gz differ diff --git a/systems/3do/index.html b/systems/3do/index.html new file mode 100644 index 000000000..71071b82f --- /dev/null +++ b/systems/3do/index.html @@ -0,0 +1,5182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Panasonic 3DO - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/3ds/index.html b/systems/3ds/index.html new file mode 100644 index 000000000..c0e421518 --- /dev/null +++ b/systems/3ds/index.html @@ -0,0 +1,5186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nintendo 3DS - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Nintendo 3DS

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/3ds.3ds .3dsx .elf .axf .cci .cxi .app
+

Emulator/Core

+ + + + + + + + + + + + + + + +
NamePlatformDocumentation
Lime3DS (SA)S922Xhttps://github.com/Lime3DS/Lime3DS
+

AES Keys

+
+

You need crypto keys to play encrypted roms.

+
+ + + + + + + + + + + + + + + +
EmulatorRequired FilesPath
Lime3DS (SA)aes_keys.txt/storage/.config/lime3ds/sysdata
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/amiga/index.html b/systems/amiga/index.html new file mode 100644 index 000000000..52a231fea --- /dev/null +++ b/systems/amiga/index.html @@ -0,0 +1,5187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Amiga - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/amigacd32/index.html b/systems/amigacd32/index.html new file mode 100644 index 000000000..6e453c44c --- /dev/null +++ b/systems/amigacd32/index.html @@ -0,0 +1,5190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Amiga CD32 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/amstradcpc/index.html b/systems/amstradcpc/index.html new file mode 100644 index 000000000..86bdff130 --- /dev/null +++ b/systems/amstradcpc/index.html @@ -0,0 +1,5042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Amstrad CPC - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Amstrad CPC

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/arduboy/index.html b/systems/arduboy/index.html new file mode 100644 index 000000000..259d83d2d --- /dev/null +++ b/systems/arduboy/index.html @@ -0,0 +1,5146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Arduboy - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Arduboy

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/arduboy.hex
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
arduousgithub.com/libretro/arduous
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/atari2600/index.html b/systems/atari2600/index.html new file mode 100644 index 000000000..0db5568b7 --- /dev/null +++ b/systems/atari2600/index.html @@ -0,0 +1,5146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Atari 2600 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Atari 2600

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/atari2600.a26 .bin .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
Stelladocs.libretro.com/library/stella
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/atari5200/index.html b/systems/atari5200/index.html new file mode 100644 index 000000000..bf3c2b550 --- /dev/null +++ b/systems/atari5200/index.html @@ -0,0 +1,5186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Atari 5200 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/atari7800/index.html b/systems/atari7800/index.html new file mode 100644 index 000000000..fcf5fa8ce --- /dev/null +++ b/systems/atari7800/index.html @@ -0,0 +1,5182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Atari 7800 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/atari800/index.html b/systems/atari800/index.html new file mode 100644 index 000000000..e4d30183e --- /dev/null +++ b/systems/atari800/index.html @@ -0,0 +1,5186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Atari 800 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/atarijaguar/index.html b/systems/atarijaguar/index.html new file mode 100644 index 000000000..f05744db2 --- /dev/null +++ b/systems/atarijaguar/index.html @@ -0,0 +1,5146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Atari Jaguar - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Atari Jaguar

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/atarijaguar.j64 .jag .rom .abs .cof .bin .prg
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
Virtual Jaguardocs.libretro.com/library/virtual_jaguar
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/atarilynx/index.html b/systems/atarilynx/index.html new file mode 100644 index 000000000..46ba31874 --- /dev/null +++ b/systems/atarilynx/index.html @@ -0,0 +1,5194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Atari Lynx - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Atari Lynx

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/atarilynx.lnx .lyx .o .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + +
NameDocumentation
Handydocs.libretro.com/library/handy
Beetle Lynxgithub.com/libretro/beetle_lynx
Lynx (Mednafen)mednafen.github.io/documentation/lynx.html
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + + + + + +
EmulatorRequired Files
Handydocs.libretro.com/library/handy/#bios
Beetle Lynxdocs.libretro.com/library/beetle_lynx/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/atarist/index.html b/systems/atarist/index.html new file mode 100644 index 000000000..787158ae5 --- /dev/null +++ b/systems/atarist/index.html @@ -0,0 +1,5042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Atari ST - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Atari ST

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/atomiswave/index.html b/systems/atomiswave/index.html new file mode 100644 index 000000000..54a7c5cda --- /dev/null +++ b/systems/atomiswave/index.html @@ -0,0 +1,5219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sammy Atomiswave - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sammy Atomiswave

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/atomiswave.lst .bin .dat .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name                  Platform(s)Documentation
FlycastRK3326, RK3399, S922X, RK3566docs.libretro.com/library/flycast
Flycast 2021RK3326, S922X, RK3566docs.libretro.com/library/flycast
Flycast 32RK3326docs.libretro.com/library/flycast
Flycast (Stand Alone)RK3326, RK3399, S922X, RK3566github.com/flyinghead/flycast
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
Alldocs.libretro.com/library/flycast/#bios
+

Additional References

+

Getting started with arcade emulation (Libretro)

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/build-engine/index.html b/systems/build-engine/index.html new file mode 100644 index 000000000..656e31aea --- /dev/null +++ b/systems/build-engine/index.html @@ -0,0 +1,5110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Build Engine - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Build Engine

+

.build files

+

These files must be created for each build engine game that will be launched with raze. The file contains a PATH variable and an optional GRP variable. The PATH variable points to the subfolder containing the game's GRP file. The optional GRP variable is used to identify the specific GRP file to load for games with multiple GRP files.

+

Example: /roms/build/shadow warrior.build contains +

PATH=sw
+GRP=SW.GRP
+-- end --
+
+where the Shadow Warrior games files are stored in subfolder sw, i.e. /roms/build/sw/

+
+

Note: don't leave any space between GRP or PATH and = and enclose filenames containing spaces with "quotes"

+

Note: add -- end -- to the end of the file if it contains multiple lines

+
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/c128/index.html b/systems/c128/index.html new file mode 100644 index 000000000..f9de2ad62 --- /dev/null +++ b/systems/c128/index.html @@ -0,0 +1,5042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Commodore 128 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Commodore 128

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/c16/index.html b/systems/c16/index.html new file mode 100644 index 000000000..9dc6b8835 --- /dev/null +++ b/systems/c16/index.html @@ -0,0 +1,5042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Commodore 16 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Commodore 16

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/c64/index.html b/systems/c64/index.html new file mode 100644 index 000000000..28fd5d2b5 --- /dev/null +++ b/systems/c64/index.html @@ -0,0 +1,5042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Commodore 64 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Commodore 64

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/cdi/index.html b/systems/cdi/index.html new file mode 100644 index 000000000..714a46cc7 --- /dev/null +++ b/systems/cdi/index.html @@ -0,0 +1,5183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Philips CD-I - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Philips - CD-I

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/cdi.chd .cue .iso
+

Emulator/Core

+

!!! note : games required Digital Video Card (like Dragon's Lair) will not run because this feature is not implemented on SAME_CDI

+ + + + + + + + + + + + + +
NameDocumentation
SAME_CDIdocs.libretro.com/library/same_cdi
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
SAME_CDIsee: docs.libretro.com/library/same_cdi/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/channelf/index.html b/systems/channelf/index.html new file mode 100644 index 000000000..6449bacba --- /dev/null +++ b/systems/channelf/index.html @@ -0,0 +1,5182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Fairchild Channel F - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Fairchild Channel F

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/channelf.bin .chf .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
FreeChaFgithub.com/libretro/FreeChaF
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
FreeChaFsee: github.com/libretro/FreeChaF#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/chip-8/index.html b/systems/chip-8/index.html new file mode 100644 index 000000000..7e963422a --- /dev/null +++ b/systems/chip-8/index.html @@ -0,0 +1,5146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + CHIP-8 / S-CHIP / XO-CHIP - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

CHIP-8 / S-CHIP / XO-CHIP

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/chip-8.ch8 .sc8 .xo8
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
JAXEdocs.libretro.com/library/jaxe
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/colecovision/index.html b/systems/colecovision/index.html new file mode 100644 index 000000000..bab02f1d2 --- /dev/null +++ b/systems/colecovision/index.html @@ -0,0 +1,5190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + ColecoVision - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

ColecoVision

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/coleco.bin .col .rom .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + +
NameDocumentation
blueMSXdocs.libretro.com/library/bluemsx
GearColeco   defaultdocs.libretro.com/library/gearcoleco
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + + + + + +
EmulatorRequired Files
blueMSXsee: docs.libretro.com/library/bluemsx/#bios
GearColecosee: docs.libretro.com/library/gearcoleco/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/cps1/index.html b/systems/cps1/index.html new file mode 100644 index 000000000..d2e110eff --- /dev/null +++ b/systems/cps1/index.html @@ -0,0 +1,5202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Capcom CPS-1 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/cps2/index.html b/systems/cps2/index.html new file mode 100644 index 000000000..ea721f530 --- /dev/null +++ b/systems/cps2/index.html @@ -0,0 +1,5202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Capcom CPS-2 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/cps3/index.html b/systems/cps3/index.html new file mode 100644 index 000000000..ac82d6784 --- /dev/null +++ b/systems/cps3/index.html @@ -0,0 +1,5202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Capcom CPS-3 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/daphne/index.html b/systems/daphne/index.html new file mode 100644 index 000000000..757a51d6c --- /dev/null +++ b/systems/daphne/index.html @@ -0,0 +1,5198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Daphne - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Daphne

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/daphne.daphne .singe
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
Hypseus Singe   defaultgithub.com/DirtBagXon/hypseus-singe
+

Instructions

+

Background

+

Hypseus-Singe supports two different game formats (Daphne and Singe). One thing to keep in mind (which will help when working with files) is that Daphne is emulation so it requires a rom dump of the arcade machine to function and Singe is simulation so it combines video files with LUA code to simulate the machines.

+

The Daphne format requires a rom file that goes in the roms/daphne/roms directory and a folder per game that contains resources (video files, sounds, etc...) for each game roms/daphne/rom.daphne. The Singe format is self-contained and its folders contain all the resources that a game requires to run.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/doom/index.html b/systems/doom/index.html new file mode 100644 index 000000000..4a660461e --- /dev/null +++ b/systems/doom/index.html @@ -0,0 +1,5248 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Doom - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Doom

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/doom.doom
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
GZDoomgithub.com/ZDoom/gzdoom
+

GZDoom will detect the analog stick automatically, this makes menus navigatable. ROCKNIX does not provide any controls mapping for gzdoom, as there is no obvious default mapping as with console emulators. Users have to map their own preferred controls.

+

Creating .doom files

+

These files must be created for each WAD that you want to load with gzdoom. The file should contain at least one IWAD variable and optional MOD variables. Multiple IWAD and MOD variables can be used in the same file to load multiple wads, mods and packages. Therefore, multiple .doom files can be created for the same WAD for each configuration of the game.

+

It is recommended to store WAD files in a \iwads subfolder and MODs in a \mods subfolder. You would then include the path to each file in the .doom file (see examples below)

+
Example Folder Structure
/roms/doom/
+    ├─ doom2.doom
+    ├─ heretic-mod.doom
+    ├─ iwads/
+       ├─ doom2.wad
+       ├─ heretic.wad
+       └─ IWMPP_Heretic.wad
+    └─ mods/
+        ├─ precise-crosshair-v1.4.1.pk3
+        └─ target-spy-v2.0.1.pk3
+
+

Example: Doom 2 (no mods)

+

/roms/doom/doom2.doom would contain +

IWAD=iwads/doom2.wad
+-- end --
+
+to load vanilla Doom 2

+
+

don't leave any space between GRP or PATH and = and enclose filenames containing spaces with "quotes"

+
+

Example: Heretic (with mods)

+

Example: /roms/doom/heretic-mod.doom would contain +

IWAD=iwads/heretic.wad
+IWAD=iwads/IWMPP_Heretic.wad
+MOD=mods/precise-crosshair-v1.4.1.pk3
+MOD=mods/target-spy-v2.0.1.pk3
+-- end --
+
+to load Heretic with additional patches and mods.

+
+

make sure to add -- end -- to the end of the file

+
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/dreamcast/index.html b/systems/dreamcast/index.html new file mode 100644 index 000000000..ef4dccf46 --- /dev/null +++ b/systems/dreamcast/index.html @@ -0,0 +1,5199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sega Dreamcast - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sega Dreamcast

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/dreamcast.lst .bin .dat .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name                  Platform(s)Documentation
FlycastRK3326, RK3399, S922X, RK3566docs.libretro.com/library/flycast
Flycast 2021RK3326, S922X, RK3566docs.libretro.com/library/flycast
Flycast 32RK3326docs.libretro.com/library/flycast
Flycast (Stand Alone)RK3326, RK3399, S922X, RK3566github.com/flyinghead/flycast
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
Alldocs.libretro.com/library/flycast/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/easyrpg/index.html b/systems/easyrpg/index.html new file mode 100644 index 000000000..75d076263 --- /dev/null +++ b/systems/easyrpg/index.html @@ -0,0 +1,5042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + EasyRPG - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

EasyRPG

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/fbn/index.html b/systems/fbn/index.html new file mode 100644 index 000000000..9e24282ba --- /dev/null +++ b/systems/fbn/index.html @@ -0,0 +1,5202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Final Burn Neo - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/fds/index.html b/systems/fds/index.html new file mode 100644 index 000000000..20e5beb59 --- /dev/null +++ b/systems/fds/index.html @@ -0,0 +1,5190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nintendo Famicom Disk System (FDS) - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Famicom Disk System (FDS)

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/fds.fds .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + +
NameDocumentation
Nestopia   defaultdocs.libretro.com/library/nestopia_ue
FCEUmmdocs.libretro.com/library/fceumm
QuickNESdocs.libretro.com/library/quicknes
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
Alldisksys.rom (ca30b50f880eb660a320674ed365ef7a)
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/gameandwatch/index.html b/systems/gameandwatch/index.html new file mode 100644 index 000000000..e49d7a381 --- /dev/null +++ b/systems/gameandwatch/index.html @@ -0,0 +1,5146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nintendo Game & Watch - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Nintendo Game & Watch

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/gameandwatch.mgw .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
Handheld Electronic (GW)docs.libretro.com/library/gw
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/gamecube/index.html b/systems/gamecube/index.html new file mode 100644 index 000000000..b4f38eaa1 --- /dev/null +++ b/systems/gamecube/index.html @@ -0,0 +1,5202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nintendo Gamecube - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Nintendo Gamecube

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/gamecube.gcm .iso .gcz .ciso .wbfs .rvz .dol
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + +
NameDocumentation
Dolphin (SA)dolphin-emu.org/docs/guides
Dolphin (QT)dolphin-emu.org/docs/guides
Dolphin Libretrodocs.libretro.com/library/dolphin
+

Bios

+
+

You may need the following files to correctly load fonts on some Gamecube games

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
EmulatorOptional FilesPath
DolphinIPL.binroms/bios/GC/EUR
DolphinIPL.binroms/bios/GC/JAP
DolphinIPL.binroms/bios/GC/USA
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/gamegear/index.html b/systems/gamegear/index.html new file mode 100644 index 000000000..ca3988978 --- /dev/null +++ b/systems/gamegear/index.html @@ -0,0 +1,5198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sega Game Gear - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sega Game Gear

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/gamegear.gg .bin .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDocumentation
Gearsystemdocs.libretro.com/library/gearsystem
Genesis Plus GXdocs.libretro.com/library/genesis_plus_gx
PicoDrivedocs.libretro.com/library/picodrive
SMS Plus GXdocs.libretro.com/library/smsplus
GG (Mednafen)mednafen.github.io/documentation/gg.html
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
Allsee: docs.libretro.com/library/gearsystem/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/gb/index.html b/systems/gb/index.html new file mode 100644 index 000000000..1354bdc72 --- /dev/null +++ b/systems/gb/index.html @@ -0,0 +1,5201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nintendo Gameboy - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Nintendo Gameboy

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/gb.gb .gbc .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDocumentation
Gambatte   defaultdocs.libretro.com/library/gambatte
SameBoydocs.libretro.com/library/sameboy
Gearboydocs.libretro.com/library/gearboy
TGB Dualdocs.libretro.com/library/tgb_dual
mGBAdocs.libretro.com/library/mgba
VBA-Mdocs.libretro.com/library/vba_m
+

Bios

+ + + + + + + + + + + + + + + +
FilenameMD5Path
gb_bios.bin32fbbd84168d3482956eb3c5051637f5roms/bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/gba/index.html b/systems/gba/index.html new file mode 100644 index 000000000..f3544c7b4 --- /dev/null +++ b/systems/gba/index.html @@ -0,0 +1,5208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nintendo Gameboy Advance - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Nintendo Gameboy Advance

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/gba.gba .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamePlatformDocumentation
mGBA   defaultAlldocs.libretro.com/library/mgba
gpSPAlldocs.libretro.com/library/gpsp
VBA-MAlldocs.libretro.com/library/vba_m
VBA NextAlldocs.libretro.com/library/vba_next
Beetle GBAAlldocs.libretro.com/library/beetle_gba
NanoBoyAdvance (SA)RK3588github.com/nba-emu/NanoBoyAdvance
+

Bios

+ + + + + + + + + + + + + + + +
FilenameMD5Path
gba_bios.bina860e8c0b6d573d191e4ec7db1b1e4f6roms/bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/gbc/index.html b/systems/gbc/index.html new file mode 100644 index 000000000..c95a4bd0f --- /dev/null +++ b/systems/gbc/index.html @@ -0,0 +1,5201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nintendo Gameboy Color - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Nintendo Gameboy Color

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/gbc.gb .gbc .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDocumentation
Gambatte   defaultdocs.libretro.com/library/gambatte
SameBoydocs.libretro.com/library/sameboy
Gearboydocs.libretro.com/library/gearboy
TGB Dualdocs.libretro.com/library/tgb_dual
mGBAdocs.libretro.com/library/mgba
VBA-Mdocs.libretro.com/library/vba_m
+

Bios

+ + + + + + + + + + + + + + + +
FilenameMD5Path
gbc_bios.bindbfce9db9deaa2567f6a84fde55f9680roms/bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/genesis/index.html b/systems/genesis/index.html new file mode 100644 index 000000000..d46e15d0e --- /dev/null +++ b/systems/genesis/index.html @@ -0,0 +1,5201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sega Genesis / Megadrive - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sega Genesis / Megadrive

+

Overview

+ + + + + + + + + + + + + + + + + + + + +
SystemGame PathSupported Extensions
Sega Genesisroms/genesis.md .gen .bin .sg .smd .zip .7z
Megadriveroms/megadrive.md .gen .bin .sg .smd .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + +
NameDocumentation
Genesis Plus GXdocs.libretro.com/library/genesis_plus_gx
Genesis Plus GX Widegithub.com/libretro/Genesis-Plus-GX-Wide
PicoDrivedocs.libretro.com/library/picodrive
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + + + + + +
EmulatorRequired Files
Genesis Plus GXdocs.libretro.com/library/genesis_plus_gx/#bios
PicoDrivedocs.libretro.com/library/picodrive/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/index.html b/systems/index.html new file mode 100644 index 000000000..29454b092 --- /dev/null +++ b/systems/index.html @@ -0,0 +1,5028 @@ + + + + + + + + + + + + + + + + + + + + + Index - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + +

Supported Systems

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/intellivision/index.html b/systems/intellivision/index.html new file mode 100644 index 000000000..c71672e97 --- /dev/null +++ b/systems/intellivision/index.html @@ -0,0 +1,5182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Mattel Intellivision - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/j2me/index.html b/systems/j2me/index.html new file mode 100644 index 000000000..77431463c --- /dev/null +++ b/systems/j2me/index.html @@ -0,0 +1,5042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + J2ME - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sun Microsystems J2ME

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/macintosh/index.html b/systems/macintosh/index.html new file mode 100644 index 000000000..ceb9fce3d --- /dev/null +++ b/systems/macintosh/index.html @@ -0,0 +1,5106 @@ + + + + + + + + + + + + + + + + + + + + + Macintosh - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Macintosh

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/mac.dsk .img .hfv .cmd .zip
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
minivmacdocs.libretro.com/library/minivmac
+

Bios

+ + + + + + + + + + + + + + + +
FilenameMD5Path
MacII.rom66223BE1497460F1E60885EEB35E03CCroms/bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/mame/index.html b/systems/mame/index.html new file mode 100644 index 000000000..57bee05a7 --- /dev/null +++ b/systems/mame/index.html @@ -0,0 +1,5195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + MAME - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

MAME

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/mame.zip .7z
+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDocumentation
MAME 2003-Plus   defaultdocs.libretro.com/library/mame2003_plus
MAME 2010docs.libretro.com/library/mame_2010
MAME 2015docs.libretro.com/guides/arcade-getting-started
MAME (Current)docs.libretro.com/guides/arcade-getting-started
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
Alldocs.libretro.com/library/mame2003_plus/#bios
+

Additional References

+

Getting started with arcade emulation (Libretro)

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/mastersystem/index.html b/systems/mastersystem/index.html new file mode 100644 index 000000000..be936fd89 --- /dev/null +++ b/systems/mastersystem/index.html @@ -0,0 +1,5198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sega Master System - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sega Master System

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/mastersystem.sms .bin .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDocumentation
Gearsystemdocs.libretro.com/library/gearsystem
Genesis Plus GXdocs.libretro.com/library/genesis_plus_gx
PicoDrivedocs.libretro.com/library/picodrive
SMS Plus GXdocs.libretro.com/library/smsplus
SMS (Mednafen)mednafen.github.io/documentation/sms.html
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
Allsee: docs.libretro.com/library/gearsystem/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/megaduck/index.html b/systems/megaduck/index.html new file mode 100644 index 000000000..974937944 --- /dev/null +++ b/systems/megaduck/index.html @@ -0,0 +1,5146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Mega Duck - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Mega Duck

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/megaduck.bin .zips .7z
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
SameDuckdocs.libretro.com/library/sameduck
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/moonlight/index.html b/systems/moonlight/index.html new file mode 100644 index 000000000..882c2d7ba --- /dev/null +++ b/systems/moonlight/index.html @@ -0,0 +1,5219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Moonlight - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Moonlight

+

ROCKNIX now supports Moonlight Game Streaming, which allows to connect to your local computer running Moonlight and stream AAA games.

+

Step 1: Setup Moonlight on your PC

+

Please follow standard guide to setup Moonlight on your home PC, link.

+

Step 2: Configure Moonlight in ROCKNIX

+

The setup requires pairing with your local PC running Moonlight and then populating Moonlight Streaming tab with all your games. After those are completed, you can select an individual game to start streaming.

+

Pair with your local PC

+
    +
  • While in EmulationStation press START to open the Main Menu
  • +
  • Select "MOONLIGHT GAME STREAMING" submenu
  • +
  • Please note the "PAIRING PIN" at the bottom of the window
  • +
  • You can also specify "SERVER IP" address, but it should be detected automatically
  • +
  • Select "PAIR WITH SERVER" option
  • +
  • Now, go to the local PC and enter PIN to continue the pairing process
  • +
  • You should see a confirmation message on your device
  • +
  • The paring process should complete
  • +
+

After pairing was successful, select "UPDATE MOONLIGHT GAMES" option. This should query the server for the list of all games and populate Moonlight Streaming system in Emulation Station.

+

Step 3: Play

+

Browse to the Moonlight system in Emulation Station. Select the game you want to play. The game should start and you should be able to interact with it.

+

Remote Playing over internet

+
    +
  • The easiest option is to add your device to your Tailscale network with your local PC.
  • +
  • Moonlight allows to open several ports to connect to the local PC to stream over the internet. Setup might be somewhat complicated.
  • +
  • Another option is to use WireGuard to setup the connection with the device. This approach requires only a single open port, but it requires WireGuard server to be running on your local network.
  • +
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/moto/index.html b/systems/moto/index.html new file mode 100644 index 000000000..919e20b82 --- /dev/null +++ b/systems/moto/index.html @@ -0,0 +1,5146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Thomson MO/TO Family - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Thomson - MO/TO family (TO7, TO7/70, TO8, TO8D, TO9, TO9+, MO5 and MO6)

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/moto.fd .sap .k7 .rom .m7 .m5
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
Theodoredocs.libretro.com/library/theodore
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/mplayer/index.html b/systems/mplayer/index.html new file mode 100644 index 000000000..9d94c2809 --- /dev/null +++ b/systems/mplayer/index.html @@ -0,0 +1,5211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Media Player - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Media Player

+

Overview

+ + + + + + + + + + + + + +
Game Path      Supported Extensions
roms/mplayer.mp4 .mkv .avi .mov .wmv .m3u .mpg .ytb .twi .sh .mp3 .aac .mka .dts .flac .ogg .m4a .ac3 .opus .wav .wv .eac33 .thd
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
mpvmpv.io/manual/master/
+

Controls

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ButtonAction
A(SOUTH)Play/Pause
B(EAST)Change Audio Track
Y(WEST)Change Subtitle Track
X(NORTH)View OSD
D-Pad LeftSkip Backward 5 Seconds
D-Pad RightSkip Forward 5 Seconds
D-Pad UpSkip Forward 60 Seconds
D-Pad DownSkip Backward 60 Seconds
SELECT+STARTQuit (Saves Playback Position)
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/msx/index.html b/systems/msx/index.html new file mode 100644 index 000000000..e0f8999d2 --- /dev/null +++ b/systems/msx/index.html @@ -0,0 +1,5044 @@ + + + + + + + + + + + + + + + + + + + + + + + + + MSX - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Microsoft MSX 1 & 2

+

msx +msx2

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/music/index.html b/systems/music/index.html new file mode 100644 index 000000000..3c19cad42 --- /dev/null +++ b/systems/music/index.html @@ -0,0 +1,5042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Music Player - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Music Player

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/n64/index.html b/systems/n64/index.html new file mode 100644 index 000000000..7693ce3b6 --- /dev/null +++ b/systems/n64/index.html @@ -0,0 +1,5158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nintendo 64 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/naomi/index.html b/systems/naomi/index.html new file mode 100644 index 000000000..b1e6f5774 --- /dev/null +++ b/systems/naomi/index.html @@ -0,0 +1,5219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sega Naomi - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sega Naomi

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/naomi.lst .bin .dat .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name                  Platform(s)Documentation
FlycastRK3326, RK3399, S922X, RK3566docs.libretro.com/library/flycast
Flycast 2021RK3326, S922X, RK3566docs.libretro.com/library/flycast
Flycast 32RK3326docs.libretro.com/library/flycast
Flycast (Stand Alone)RK3326, RK3399, S922X, RK3566github.com/flyinghead/flycast
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
Alldocs.libretro.com/library/flycast/#bios
+

Additional References

+

Getting started with arcade emulation (Libretro)

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/nds/index.html b/systems/nds/index.html new file mode 100644 index 000000000..856bc25a7 --- /dev/null +++ b/systems/nds/index.html @@ -0,0 +1,5233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nintendo DS - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Nintendo DS

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/nds.nds .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamePlatformDocumentation
melonDS   defaultAlldocs.libretro.com/library/melonds
DeSmuMEAlldocs.libretro.com/library/desmume
melonDS (SA)Allmelonds.kuribo64.net
Drastic (SA)All--
+

Bios

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FilenameMD5Path
bios7.bindf692a80a5b1bc90728bc3dfc76cd948roms/bios
bios9.bina392174eb3e572fed6447e956bde4b25roms/bios
firmware.binroms/bios
dsi_bios7.binroms/bios
dsi_bios9.binroms/bios
dsi_firmware.binroms/bios
dsi_nand.binroms/bios
dsi_sd_card.binroms/bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/neogeo/index.html b/systems/neogeo/index.html new file mode 100644 index 000000000..f5ff606c2 --- /dev/null +++ b/systems/neogeo/index.html @@ -0,0 +1,5304 @@ + + + + + + + + + + + + + + + + + + + + + + + + + SNK Neo Geo - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

SNK Neo Geo

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/neogeo.7z .zip .neo
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDocumentation
Final Burn Neo   defaultdocs.libretro.com/library/fbneo
Geolithdocs.libretro.com/library/geolith
MAME 2003-Plusdocs.libretro.com/library/mame2003_plus
MAME 2010docs.libretro.com/library/mame_2010
MAME 2015docs.libretro.com/guides/arcade-getting-started
MAME (Current)docs.libretro.com/guides/arcade-getting-started
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + + + + + + + + + +
EmulatorRequired Files
Final Burn Neodocs.libretro.com/library/fbneo/#bios
Geolithdocs.libretro.com/library/geolith/#bios
MAMEdocs.libretro.com/library/mame2003_plus/#bios
+

Additional References

+

Getting started with arcade emulation (Libretro)

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/neogeocd/index.html b/systems/neogeocd/index.html new file mode 100644 index 000000000..c23d6a546 --- /dev/null +++ b/systems/neogeocd/index.html @@ -0,0 +1,5182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + SNK Neo Geo CD - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/nes/index.html b/systems/nes/index.html new file mode 100644 index 000000000..5fd1c1618 --- /dev/null +++ b/systems/nes/index.html @@ -0,0 +1,5162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nintendo NES / Famicom - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/ngp/index.html b/systems/ngp/index.html new file mode 100644 index 000000000..eabd3bd9e --- /dev/null +++ b/systems/ngp/index.html @@ -0,0 +1,5161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + SNK Neo Geo Pocket - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/odyssey2/index.html b/systems/odyssey2/index.html new file mode 100644 index 000000000..63ae98ac2 --- /dev/null +++ b/systems/odyssey2/index.html @@ -0,0 +1,5182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Magnavox Odyssey 2 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Magnavox Odyssey

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/odyssey.bin .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
O2EMdocs.libretro.com/library/o2em
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
O2EMsee: docs.libretro.com/library/o2em/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/openbor/index.html b/systems/openbor/index.html new file mode 100644 index 000000000..8f1391d81 --- /dev/null +++ b/systems/openbor/index.html @@ -0,0 +1,5042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Open Beats of Rage - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Open Beats of Rage

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/palm/index.html b/systems/palm/index.html new file mode 100644 index 000000000..ed04a8103 --- /dev/null +++ b/systems/palm/index.html @@ -0,0 +1,5182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Palm OS - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Palm Inc. - Palm OS

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/palm.prc .pqa .img .pdb .zip
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
Mugit.libretro.com/libretro/Mu
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
Musee: git.libretro.com/libretro/Mu#files
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/pc/index.html b/systems/pc/index.html new file mode 100644 index 000000000..fd58236ab --- /dev/null +++ b/systems/pc/index.html @@ -0,0 +1,5150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + MS-DOS - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/pc88/index.html b/systems/pc88/index.html new file mode 100644 index 000000000..9c87d9e79 --- /dev/null +++ b/systems/pc88/index.html @@ -0,0 +1,5182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + NEC PC-88 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/pc98/index.html b/systems/pc98/index.html new file mode 100644 index 000000000..487a63f8d --- /dev/null +++ b/systems/pc98/index.html @@ -0,0 +1,5182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + NEC PC-98 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/pcengine/index.html b/systems/pcengine/index.html new file mode 100644 index 000000000..e3bfdd9bd --- /dev/null +++ b/systems/pcengine/index.html @@ -0,0 +1,5215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + NEC PC-Engine / TurboGrafx-16 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

NEC PC-Engine / TurboGrafx-16

+

Overview

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SystemGame PathSupported Extensions
PC-Engineroms/pcengine.pce .bin .zip .7z
PC-Engine CDroms/pcenginecd.cue .ccd .chd .toc .m3u
TurboGrafx-16roms/tg16.pce .bin .zip .7z
TurboGrafx-CDroms/tg16cd.cue .ccd .chd .toc .m3u
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDocumentation
Beetle PCE FAST defaultdocs.libretro.com/library/beetle_pce_fast
Beetle PCEdocs.libretro.com/library/beetle_pce_fast
Beetle SuperGrafxdocs.libretro.com/library/beetle_sgx
PCE (Mednafen)mednafen.github.io/documentation/pce.html
PCE FAST (Mednafen)mednafen.github.io/documentation/pce_fast.html
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
Allsee: docs.libretro.com/library/beetle_pce_fast/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/pcfx/index.html b/systems/pcfx/index.html new file mode 100644 index 000000000..488d7a87f --- /dev/null +++ b/systems/pcfx/index.html @@ -0,0 +1,5186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + NEC PC-FX - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/pet/index.html b/systems/pet/index.html new file mode 100644 index 000000000..3e3ba5ea6 --- /dev/null +++ b/systems/pet/index.html @@ -0,0 +1,5042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Commodore PET - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Commodore PET

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/pico-8/index.html b/systems/pico-8/index.html new file mode 100644 index 000000000..a4e5fd15e --- /dev/null +++ b/systems/pico-8/index.html @@ -0,0 +1,5350 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Pico-8 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+ +
+ + + +
+
+ + + + + + + +

Pico-8

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/pico-8.png .p8
+

Emulator/Core

+ + + + + + + + + + + + + + + + + +
NameDocumentation
Pico-8   defaulthttps://www.lexaloffle.com/pico-8.php
Fake-08https://github.com/jtothebell/fake-08
+

Instructions

+

Option 1: Running Pico-8 through the native engine

+

Pico-8 games are best played with the default emulator as it supports all native features without any limitations. You need to purchase it from Lexaloffle and we do recommend that you buy a copy if you can. Its an awesome piece of software and it also comes with the tools to make your own games.

+

Setup

+

Once you have purchased a license; the files you need will depend on the device you are using. These instructions will walk through how to set things up to work on all of our supported devices.

+
    +
  • Go to Lexaloffle's download page
  • +
  • From that page download the Linux 64-bit zip file and the Raspberry Pi zip file
  • +
  • From the Linux 64-bit zip file...
      +
    • Create a directory in roms/pico-8 called x86_64
    • +
    • Upload the pico8_dyn and pico8.dat from the Linux 64-bit zip to this directory (you do not need any other files)
    • +
    +
  • +
  • From the Raspberry Pi zip file...
      +
    • Create a directory in roms/pico-8 called aarch64
    • +
    • Upload the pico8_64 and pico8.dat from the Raspberry Pi zip to this directory (you do not need any other files)
    • +
    +
  • +
+
Folder Structure
/roms/pico-8/
+    ├─ x86_64/
+       ├─ pico8_dyn
+       ├─ pico8.dat
+    ├─ aarch64/
+       ├─ pico8_64
+       ├─ pico8.dat
+    └─ Splore.png
+
+

Playing a game

+

Once the above is set up is you have 2 options for playing games through Pico-8's native engine:

+
    +
  1. Using Splore
      +
    • Splore is awesome as it allows you to browse and play the entire library of user created games with an internet connection.
    • +
    • To use this method simply launch Splore from the gamelist.
    • +
    • Note that you will need an internet connection to browse the pico-8 BBS (If you don't have an internet connection you can still use it to launch games you have downloaded previously)
    • +
    • To exit a game and return to EmulationStation you can either (1) press the START button while highlighting a game in Splore then selecting Options > Shutdown or (2) Press L1 + SELECT + START
    • +
    +
  2. +
  3. Through .png or .p8 files added directly roms/pico-8 or roms/pico-8/carts
      +
    • Browse the list of games (aka. "Carts") on Lexaloffle's website
    • +
    • Download the .png or .p8 file for any game you are interested in playing and upload it to either roms/pico-8 or roms/pico-8/carts
        +
      • roms/pico-8 is recommended if you want to have your games show up directly when you open the Pico-8 system in ES
      • +
      • roms/pico-8/carts is recommended if you plan to use Splore directly and also want to see your downloaded carts in the Splore interface.
      • +
      +
    • +
    • Refresh EmulationStation by pressing START to open the Main Menu then select Game Settings > Update Gamelists.
    • +
    • You should now be able to launch the game by selecting it from the gamelist.
    • +
    • To exit a game and return to EmulationStation you can either (1) press the START button then selecting Options > Shutdown or (2) Press L1 + SELECT + START
    • +
    +
  4. +
+

Option 2: Running through RetroArch Fake-08

+
+

Fake-08 does not support all the native features of Pico-8 so its not guaranteed that every game will work with it.

+
+
    +
  • Set the default emulator for Pico-8 to Fake-08
  • +
  • Browse the list of games (aka. "Carts") on Lexaloffle's website
  • +
  • Download the .png file for any game you are interested in playing and upload it to roms/pico-8
  • +
  • Refresh EmulationStation by pressing START to open the Main Menu then select Game Settings > Update Gamelists.
  • +
  • You should now be able to launch the game by selecting it from the gamelist.
  • +
+

Controls

+

Emulator/Core: Pico-8

+ + + + + + + + + + + + + + + + + + + + + +
ButtonAction
A(SOUTH)X/V
B(EAST)O/Z/C
STARTMenu
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/pokemini/index.html b/systems/pokemini/index.html new file mode 100644 index 000000000..b4cfd9db3 --- /dev/null +++ b/systems/pokemini/index.html @@ -0,0 +1,5181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nintendo Pokémon Mini - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Nintendo Pokémon Mini

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/pokemini.min .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
PokeMini   defaultdocs.libretro.com/library/pokemini
+

Bios

+ + + + + + + + + + + + + + + +
FilenameMD5Path
bios.min1e4fb124a3a886865acb574f388c803droms/bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/ports/index.html b/systems/ports/index.html new file mode 100644 index 000000000..e56f5ab5a --- /dev/null +++ b/systems/ports/index.html @@ -0,0 +1,5169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Ports - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ports

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/ports.sh
+

Using PortMaster

+

PortMaster provides a easy way to set up and play ports of many homebrew and classic games. You can browse the games available on their website here: https://portmaster.games/

+

Setup

+
+

PortMaster is only known to work on ARM devices at this time.

+
+

Follow PortMaster's install instructions for ROCKNIX listed on their wiki here. You can use either the script or zip method described on that page.

+

For any questions regarding PortMaster please check out their Discord

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/ps2/index.html b/systems/ps2/index.html new file mode 100644 index 000000000..d82f8e3d3 --- /dev/null +++ b/systems/ps2/index.html @@ -0,0 +1,5196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sony PlayStation 2 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sony PlayStation 2

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/ps2.chd .iso .mdf .cso .gz
+

Emulator/Core

+ + + + + + + + + + + + + + + +
NamePlatformDocumentation
AetherSX2RK3588, S922X, RK3399, SD865www.aethersx2.com/archive
+

Bios

+
+

You need at least one of the files from the following table.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
EmulatorRequired FilesPath
PCSX2SCPH-70012.binroms/bios/pcsx2/bios
LRPS2see detailsroms/bios/pcsx2/bios
AetherSX2SCPH-70012.bin/roms/bios/aethersx2/bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/ps3/index.html b/systems/ps3/index.html new file mode 100644 index 000000000..d06348853 --- /dev/null +++ b/systems/ps3/index.html @@ -0,0 +1,5300 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sony PlayStation 3 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sony PlayStation 3

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/ps3.ps3 .psn
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
RPCS3rpcs3.net/quickstart
+

Instructions

+

1. Firmware Setup

+
+

RPCS3 requires official PS3 firmware to be installed through RPCS3's GUI before you can run games. Its recommended to have a mouse/keyboard plugged in for these steps to make it easier to navigate RPCS3's GUI.

+
+
    +
  1. Download the latest official PS3 firmware from Sony's PS3 System Software page. (The downloaded file will be named PS3UPDAT.PUP)
  2. +
  3. Transfer the PS3UPDAT.PUP file to /roms/temp. If the temp folder does not exist then please create it (you will delete this file after you have installed it).
  4. +
  5. Navigate to the Tools system and then select Start RPCS3. This will open the RPCS3 GUI where you will install the firmware you downloaded above.
  6. +
  7. Select File > Install Firmware.
  8. +
  9. Navigate to ~/roms/temp, select PS3UPDAT.PUP and press Open
  10. +
+

The firmware will be installed and then a window will open to process the needed files; please let this process complete. Once complete you can close out RPCS3 and return to EmulationStation. You can also delete PS3UPDAT.PUP from /roms/temp to free up space.

+

2. Game Setup

+

PS3 games are available in two formats: Disc-Based Games and Digital PSN Packages. The steps for setting up a given game differ depending on its source format.

+

Disc-Based Games

+

RPCS3 works with decrypted ISO files stored in a folder format so you will need to convert your discs to this format before they can be read by the emulator.

+
Steps:
+
    +
  1. Follow these instructions from RPCS3's wiki to dump and decrypt your PS3 disc (recommended: follow the instructions for using ps3-disc-dumper).
  2. +
  3. Add a .ps3 extension to the end of the folder name that was generated by ps3-disc-dumper.
  4. +
  5. Upload that folder (with the .ps3 extension) to roms/ps3 +
    Example Folder Structure
    /roms/ps3/
    +    └─ Game name.ps3/
    +        ├─ PS3_GAME/
    +          ├─ LICDIR/
    +          ├─ TROPDIR/ (trophy data)
    +          ├─ USRDIR/ (the main game data)
    +          ├─ ICON0.PNG
    +          ├─ PARAM.SFO
    +          ├─ PIC0.PNG
    +          ├─ PS3LOGO.DAT
    +          └─ (various other metadata files)
    +        ├─ PS3_UPDATE/ (built-in firmware update, if applicable)
    +        └─ PS3_DISC.SFB
    +
  6. +
  7. Refresh EmulationStation by pressing START to open the Main Menu then select Game Settings > Update Gamelists.
  8. +
+

Once complete you should now see your game in the PS3 gamelist.

+

Digital PSN Packages

+
+

Digital PSN Packages will only work in dev at this time. Please do not try them if you are running a main release.

+
+

RPCS3 requires Digial PSN Packages to be installed through the emulator GUI before they can be played. If you have questions regarding which files are necessary to install PSN games, please check out the RPCS3 wiki. The following notes will focus only on the steps needed once you have the needed files.

+
RPCS3 Steps:
+
    +
  1. Upload the needed files for you PSN game to ~/roms/temp (you will delete these files after installation)
  2. +
  3. Navigate to the Tools system and then select Start RPCS3. This will open the RPCS3 GUI where you will install your PSN game.
  4. +
  5. Select File > Install Packages/Raps/Edats
  6. +
  7. Navigate to ~/roms/temp, select the files for your PSN game and press Open
  8. +
  9. After install please note down the value that is displayed in the Serial column in RPCS3's game list for the game you just installed (you will use this in the next set of steps)
  10. +
+

Once complete you can close out RPCS3 and return to EmulationStation. You can also delete your PSN game files from /roms/temp to free up space.

+

As a side note your installed games can be found in ~/roms/bios/RPCS3/dev_hdd0/games (this may be useful if you ever run into storage limitaions and want to free up space)

+
EmulationStation Steps:
+

In order for your newly installed game to show up in EmulationStation you need to create one more thing... a .psn file to represent your installed game.

+
    +
  1. Create a file in ~/roms/ps3 called [Game Name].psn where [Game Name] is a readable name for your game (this will help with scraping)
  2. +
  3. Edit that file and on the first line paste the Serial of the game that you noted down from the steps above +
    Example File Setup
    /roms/ps3/
    +    └─ Afterburner Climax (USA).psn
    +        └─ NPUB30151
    +
  4. +
  5. Save the file
  6. +
  7. Refresh EmulationStation by pressing START to open the Main Menu then select Game Settings > Update Gamelists.
  8. +
+

Once done you should be able to launch your PSN game directly from the EmulationStation gamelist.

+

3. Running a Game

+

On the first boot of a game, RPCS3 will compile its PPU modules. This can take a long time so please have patience as its required to run the game. Allowing RPCS3 to do this will also make all future launches of the game much quicker.

+

To exit a game and return to EmulationStation you can either (1) press the GUIDE button on your controller to open up RPCS3's menu and select Exit or (2) Press L1 + SELECT + START

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/psp/index.html b/systems/psp/index.html new file mode 100644 index 000000000..f7b5bbdef --- /dev/null +++ b/systems/psp/index.html @@ -0,0 +1,5215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sony PlayStation Portable - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sony PlayStation Portable (PSP)

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/psp.iso .cso .pbp .chd
+

Emulator/Core

+ + + + + + + + + + + + + + + + + +
NameDocumentation
PPSSPP (Stand Alone)ppsspp.org/docs/intro
PPSSPPdocs.libretro.com/library/ppsspp
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
PPSSPPdocs.libretro.com/library/ppsspp/#bios
+

Cheats and Fixes

+

Rocknix ships with a database of optional cheats, fixes and improvements for PSP games.

+

These can be beneficial for both low-powered devices (e.g to lock a 60 FPS game to 30 FPS to make it easier to emulate or to disable certain effects that are slow to emulate) and high-powered devices (e.g to change a 30 FPS game to 60 FPS for increased smoothness). The aspect ratio of some games can also be changed this way to play games on 3:2 screens without black bars.

+

To see which cheats are available for a game and to enable them, follow the steps below:

+
    +
  1. Launch PPSSPP and open the menu with the hotkeys for your device
  2. +
  3. Select "Cheats"
  4. +
  5. Select "Import from PSP/Cheats/cheat.db"
  6. +
  7. If any cheats are available for the loaded game they'll be shown on the right side and can be enabled
  8. +
+

Keep in mind that cheats and fixes are not guaranteed to work and can impact stability. Please do not report non-working cheats or crashes with cheats enabled as bugs to either the PPSSPP project or to Rocknix.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/psvita/index.html b/systems/psvita/index.html new file mode 100644 index 000000000..8d5ed294d --- /dev/null +++ b/systems/psvita/index.html @@ -0,0 +1,5166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sony PlayStation Vita - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sony PlayStation Vita

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
see notes.sh
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
Vita3Kvita3k.org/quickstart.html
+

Notes

+

Support for this system is a work in progress.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/psx/index.html b/systems/psx/index.html new file mode 100644 index 000000000..913f7ee27 --- /dev/null +++ b/systems/psx/index.html @@ -0,0 +1,5217 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sony PlayStation - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sony PlayStation

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/psx.bin .cue .img .mdf .pbp .toc .cbn .m3u .ccd .chd .iso
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamePlatformDocumentation
Beetle PSXS922X, RK3399, RK3588docs.libretro.com/library/beetle_psx
DuckStation (Stand Alone)S922X, RK3399, RK3588, RK3566github.com/stenzek/duckstation
PCSX ReARMedS922X, RK3399, RK3588, RK3566, RK3326docs.libretro.com/library/pcsx_rearmed
PCSX ReARMed 32RK3399, RK3588, RK3566, RK3326docs.libretro.com/library/pcsx_rearmed
DuckStationAllgithub.com/stenzek/duckstation
SwanStationAllgithub.com/libretro/swanstation
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + + + + + + + + + +
EmulatorRequired Files
Beetle PSXdocs.libretro.com/library/beetle_psx/#bios
PSX (Mednafen)mednafen.github.io/documentation/psx.html#Section_firmware_bios
PCSX ReARMeddocs.libretro.com/library/pcsx_rearmed/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/saturn/index.html b/systems/saturn/index.html new file mode 100644 index 000000000..b0978f039 --- /dev/null +++ b/systems/saturn/index.html @@ -0,0 +1,5194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sega Saturn - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sega Saturn

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/saturn.cue .chd .iso
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDocumentation
YabaSanshirodocs.libretro.com/library/yabause
Beetle Saturndocs.libretro.com/library/beetle_saturn
YabaSanshiro (Stand Alone)github.com/devmiyax/yabause
Kronos (Stand Alone)github.com/FCare/Kronos
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
AllSee: docs.libretro.com/library/beetle_saturn/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/scummvm/index.html b/systems/scummvm/index.html new file mode 100644 index 000000000..f10ba1c38 --- /dev/null +++ b/systems/scummvm/index.html @@ -0,0 +1,5242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + SCUMMVM - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

SCUMMVM

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/scummvmRefer to games required data files
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
ScummVMhttps://www.scummvm.org/
+

Instructions

+
    +
  • Add the ScummVM game data files within a subfolder to roms/scummvm (e.g. roms/scummvm/sky). Check ScummVM's supported games page for more details on the required data files.
  • +
  • In EmulationStation, select the _Scan ScummVM Games under the ScummVM device section or run the _Scan ScummVM Games.sh script in /storage/.config/scummvm. This will automatically generate the required .scummvm files within /storage/.config/scummvm/games. See the next section, if you would like to create these files manually.
  • +
  • To see the newly created list, refresh EmulationStation by pressing START to open the Main Menu then select Game Settings > Update Gamelists.
  • +
+

.scummvm files

+

Unlike other systems, ScummVM relies on .scummvm files to link to the rom/data files from its internal configuration folder. They can be generated automatically by the _Scan ScummVM Games script (see above) or by manually creating each file and placing it within /storage/.config/scummvm/games.

+

.scummvm files are named using the common name of the game and the Game Short Name in brackets (e.g. Beneath a Steel Sky (sky).scummvm).

+

.scummvm files contain a single line in the form:

+
    +
  • --path= variable and the path to the folder containing the game, followed by the Game Short Name
  • +
+

Example: /storage/.config/scummvm/games/Beneath a Steel Sky (sky).scummvm contains +

--path="/roms/scummvm/Beneath a Steel Sky (CD VGA)" sky
+

+
+

.scummvm files are NOT stored in /roms/scummvm and any .scummvm files stored there will not be displayed by EmulationStation. EmulationStation only displays .scummvm files that are in /storage/.config/scummvm/games.

+
+

Scraping

+

All metadata files and media folders generated from scraping will be stored in /storage/.config/scummvm/games.

+

Deleting games

+

Deleting ScummVM games through EmulationStation's Game Options menu will only delete the .scummvm file within /storage/.config/scummvm/games and not the game data files in roms/scummvm.

+

This can be useful as sometimes the _Scan ScummVM Games script will generate multiple .scummvm files for one game.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/scv/index.html b/systems/scv/index.html new file mode 100644 index 000000000..6521d08ea --- /dev/null +++ b/systems/scv/index.html @@ -0,0 +1,5182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Epoch Super Cassette Vision - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Epoch - Super Cassette Vision

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/scv.cart .bin .rom .0 .zip
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
EmuSCVdocs.libretro.com/library/emuscv
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
EmuSCVsee: docs.libretro.com/library/emuscv/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/sega32x/index.html b/systems/sega32x/index.html new file mode 100644 index 000000000..2c7036856 --- /dev/null +++ b/systems/sega32x/index.html @@ -0,0 +1,5182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sega 32X - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/segacd/index.html b/systems/segacd/index.html new file mode 100644 index 000000000..99e8bc939 --- /dev/null +++ b/systems/segacd/index.html @@ -0,0 +1,5197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sega CD / Mega CD - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sega CD / Mega CD

+

Overview

+ + + + + + + + + + + + + + + + + + + + +
SystemGame PathSupported Extensions
Sega CDroms/segacd.chd .cue .iso .m3u
Mega CDroms/megacd.chd .cue .iso .m3u
+

Emulator/Core

+ + + + + + + + + + + + + + + + + +
NameDocumentation
Genesis Plus GXdocs.libretro.com/library/genesis_plus_gx
PicoDrivedocs.libretro.com/library/picodrive
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + + + + + +
EmulatorRequired Files
Genesis Plus GXdocs.libretro.com/library/genesis_plus_gx/#bios
PicoDrivedocs.libretro.com/library/picodrive/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/sg-1000/index.html b/systems/sg-1000/index.html new file mode 100644 index 000000000..462ce32a5 --- /dev/null +++ b/systems/sg-1000/index.html @@ -0,0 +1,5190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sega SG-1000 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sega SG-1000

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/sg-1000.sg .bin .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + +
NameDocumentation
Gearsystemdocs.libretro.com/library/gearsystem
Genesis Plus GXdocs.libretro.com/library/genesis_plus_gx
PicoDrivedocs.libretro.com/library/picodrive
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
Allsee: docs.libretro.com/library/gearsystem/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/snes/index.html b/systems/snes/index.html new file mode 100644 index 000000000..ea096631b --- /dev/null +++ b/systems/snes/index.html @@ -0,0 +1,5232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nintendo Super Nintendo / Super Famicom - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Super Nintendo / Super Famicom

+

Overview

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SystemGame PathSupported Extensions
Super Nintendoroms/snes.smc .fig .sfc .swc .zip .7z
Super Famicomroms/sfc.smc .fig .sfc .swc .zip .7z
Satellaviewroms/satellaview.smc .fig .bs .sfc .bsx .swc .zip .7z
MSU-1roms/snesmsu1.smc .fig .sfc .swc .zip .7z
Sufami Turboroms/sufami.st .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDocumentation
Snes9x   defaultdocs.libretro.com/library/snes9x
Snes9x 2010docs.libretro.com/library/snes9x_2010
Snes9x 2002docs.libretro.com/library/snes9x_2002
Snes9x 2005 Plusdocs.libretro.com/library/snes9x_2005_plus
Beetle Supafaustgithub.com/libretro/supafaust
BSNESdocs.libretro.com/library/beetle_bsnes
BSNES Mercury Performancedocs.libretro.com/library/bsnes_mercury_performance
BSNES HD (Beta)github.com/DerKoun/bsnes-hd
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
AllSTBIOS.bin (d3a44ba7d42a74d3ac58cb9c14c6a5ca)
BS-X.bin (fed4d8242cfbed61343d53d48432aced)
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/supergrafx/index.html b/systems/supergrafx/index.html new file mode 100644 index 000000000..b872c484c --- /dev/null +++ b/systems/supergrafx/index.html @@ -0,0 +1,5190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + NEC SuperGrafx - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

NEC SuperGrafx

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/sgfx.sgx .pce .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + + + + + +
NameDocumentation
Beetle SuperGrafx defaultdocs.libretro.com/library/beetle_sgx
Beetle PCEdocs.libretro.com/library/beetle_pce_fast
PCE (Mednafen)mednafen.github.io/documentation/pce.html
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
Allsee: docs.libretro.com/library/beetle_sgx/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/supervision/index.html b/systems/supervision/index.html new file mode 100644 index 000000000..55a45e332 --- /dev/null +++ b/systems/supervision/index.html @@ -0,0 +1,5146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Watara Supervision - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Supervision

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/supervision.sv .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
Potatorgithub.com/libretro/potator
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/tic-80/index.html b/systems/tic-80/index.html new file mode 100644 index 000000000..689f5ce02 --- /dev/null +++ b/systems/tic-80/index.html @@ -0,0 +1,5042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + TIC-80 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

TIC-80

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/uzebox/index.html b/systems/uzebox/index.html new file mode 100644 index 000000000..446d38f1d --- /dev/null +++ b/systems/uzebox/index.html @@ -0,0 +1,5146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Uzebox - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Uzebox

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/uzebox.uze
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
Uzemdocs.libretro.com/library/uzem
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/vectrex/index.html b/systems/vectrex/index.html new file mode 100644 index 000000000..18fcda3c1 --- /dev/null +++ b/systems/vectrex/index.html @@ -0,0 +1,5146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Vectrex - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Vectrex

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/vectrex.vec .bin .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
vecxdocs.libretro.com/library/vecx
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/vic20/index.html b/systems/vic20/index.html new file mode 100644 index 000000000..fd95a3d6b --- /dev/null +++ b/systems/vic20/index.html @@ -0,0 +1,5042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Commodore VIC-20 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Commodore VIC-20

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/videopac/index.html b/systems/videopac/index.html new file mode 100644 index 000000000..98b5d224e --- /dev/null +++ b/systems/videopac/index.html @@ -0,0 +1,5182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Philips Videopac - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Philips Videopac

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/videopac.bin .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
O2EMdocs.libretro.com/library/o2em
+

Bios

+
+

Path: roms/bios

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
O2EMsee: docs.libretro.com/library/o2em/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/vircon32/index.html b/systems/vircon32/index.html new file mode 100644 index 000000000..07545ce07 --- /dev/null +++ b/systems/vircon32/index.html @@ -0,0 +1,5182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Vircon 32 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/virtualboy/index.html b/systems/virtualboy/index.html new file mode 100644 index 000000000..8fd973610 --- /dev/null +++ b/systems/virtualboy/index.html @@ -0,0 +1,5146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nintendo Virtual Boy - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Nintendo Virtual Boy

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/virtualboy.vb .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
Beetle VBdocs.libretro.com/library/beetle_vb
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/wii/index.html b/systems/wii/index.html new file mode 100644 index 000000000..5a7934e30 --- /dev/null +++ b/systems/wii/index.html @@ -0,0 +1,5154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nintendo Wii - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/wiiu/index.html b/systems/wiiu/index.html new file mode 100644 index 000000000..05d036b13 --- /dev/null +++ b/systems/wiiu/index.html @@ -0,0 +1,5146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nintendo Wii U - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Nintendo Wii U

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/wiiu.wud .wux .wua
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
Cemu (SA)   defaultwiki.cemu.info/wiki/Main_Page
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/wonderswan/index.html b/systems/wonderswan/index.html new file mode 100644 index 000000000..14cfa4af6 --- /dev/null +++ b/systems/wonderswan/index.html @@ -0,0 +1,5157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Bandai Wonderswan / Wonderswan Color - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Wonderswan / Wonderswan Color

+

Overview

+ + + + + + + + + + + + + + + + + + + + +
SystemGame PathSupported Extensions
Wonderswanroms/wonderswan.ws .wsc .zips .7z
Wonderswan Colorroms/wonderswancolor.ws .wsc .zips .7z
+

Emulator/Core

+ + + + + + + + + + + + + + + + + +
NameDocumentation
Beetle Cygnedocs.libretro.com/library/beetle_cygne
wswan (Mednafen)mednafen.github.io/documentation/wswan.html
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/x1/index.html b/systems/x1/index.html new file mode 100644 index 000000000..7c73cd0b8 --- /dev/null +++ b/systems/x1/index.html @@ -0,0 +1,5182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sharp X1 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sharp X1

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/x1.dx1 .2d .2hd .tfd .d88 88d .hdm .xdf .dup .tap .cmd .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
X Millenniumgithub.com/r-type/xmil-libretro
+

Bios

+
+

Path: roms/bios/xmil

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
X MillenniumIPLROM.X1 IPLROM.X1T
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/x68000/index.html b/systems/x68000/index.html new file mode 100644 index 000000000..49b1b4b37 --- /dev/null +++ b/systems/x68000/index.html @@ -0,0 +1,5179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sharp X68000 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sharp X68000

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/x68000.dim .img .d88 .hdm .dup .2hd .xdf .hdf .cmd .m3u .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
PX68kdocs.libretro.com/library/px68k
+

Bios

+ + + + + + + + + + + + + +
PathFiles
roms/bios/keropiAdd the files listed here: docs.libretro.com/library/px68k/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/xbox/index.html b/systems/xbox/index.html new file mode 100644 index 000000000..c8f682b9a --- /dev/null +++ b/systems/xbox/index.html @@ -0,0 +1,5207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Microsoft Xbox - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Microsoft Xbox

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/xbox.iso
+
+

xemu requires game discs to be in the form of xiso images. These are generally saved with a .iso extension, but are not the same as typical ISO images and should be created following the instructions in Xemu's documentation (linked below).

+
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
xemuxemu.app/docs/disc-images
+

Bios

+
+

see: xemu.app/docs/required-files

+
+ + + + + + + + + + + + + + + + + +
Required FilesPath
mcpx_1.0.bin/roms/bios/xemu/bios
Complex_4627v1.03.bin/roms/bios/xemu/bios
+ + + + + + + + + + + + + + + + + +
Optional FilesPath
eeprom.bin/roms/bios/xemu/eeprom
xbox_hdd.qcow2/roms/bios/xemu/hdd
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/zmachine/index.html b/systems/zmachine/index.html new file mode 100644 index 000000000..cf9d66712 --- /dev/null +++ b/systems/zmachine/index.html @@ -0,0 +1,5042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Infocom Zmachine - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Infocom Zmachine

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/zx81/index.html b/systems/zx81/index.html new file mode 100644 index 000000000..5903289e9 --- /dev/null +++ b/systems/zx81/index.html @@ -0,0 +1,5146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sinclair ZX81 - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sinclair ZX81

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/zx81.tzx .p .t81 .zip .7z
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
EightyOnedocs.libretro.com/library/eightyone
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/systems/zxspectrum/index.html b/systems/zxspectrum/index.html new file mode 100644 index 000000000..16dd35ea8 --- /dev/null +++ b/systems/zxspectrum/index.html @@ -0,0 +1,5182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sinclair ZX Spectrum - ROCKNIX Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sinclair ZX Spectrum

+

Overview

+ + + + + + + + + + + + + +
Game PathSupported Extensions
roms/zxspectrum.tzx .tap .z80 .rzx .scl .trd
+

Emulator/Core

+ + + + + + + + + + + + + +
NameDocumentation
Fusedocs.libretro.com/library/fuse
+

Bios

+
+

Path: roms/bios/fuse

+
+ + + + + + + + + + + + + +
EmulatorRequired Files
Fusesee: docs.libretro.com/library/fuse/#bios
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file