Steam Deck

Steam Deck

To start off with the disclaimer, I make absolutely no money telling you this. I recently bought a Steam Deck. I didn't feel like it was worth the money to buy one brand new, so I went scouring the usual places for a used one. Specifically, I tried eBay, CraigsList, and Facebook Marketplace. There were a few conversations and bids, but ultimately, I bought mine from a man named Frank in the Lower East Side. At the time of this writing, the cheapest model is $399 (plus tax, $440) for a 256GB LCD device. The middle is $549 ($600 delivered) for a 512GB OLED device. And the top model is $649 ($710 delivered) for a 1TB OLED device. I paid $400 for a 1TB OLED device that was used maybe a month. And now that I have it, I can safely say that I would have paid the $710 for a brand new one as well.

I last updated this on April 16th, 2025. I will probably update this many more times with new content as time passes. Feel free to check back periodically.

What is it

A Steam Deck is a small linux computer that masquerades as a gaming console. It has two analog sticks, two trackpads, 8 trigger buttons, a directional pad, and 6 additional buttons. It has a 7" screen which can be LCD or OLED depending on the model. It is not worth getting an LCD because that negatively impacts the battery life and you can see the glare/shine from the LCD trying to render black, which does not occur with an OLED screen. The computer runs a customized operating system and runs a specific gaming mode which makes it very intuitive and flows the way you might expect on an Xbox or Playstation console.

Intended Purpose

The intended purpose of this device is to play Steam games. You can go to store.steampowered.com and buy games (and a Steam Deck). Then you simply log in and download the game and go to town. Obviously if it doesn't play well with an Xbox or Playstation or Switch controller, it won't play well on the device. Luckily, you can buy yourself a cheap USB-C hub (I recommend an Anker from wherever you like to shop). This will allow you to plug in an HDMI cable to a TV or monitor and attach a keyboard or mouse. It also exposes a USB-C port to charge the device. So you've got a full desktop setup possible right there.

Linux? I Thought Steam Games Were for Windows

If you are a Steam customer today, you mostly play on a Windows computer. There are some games that work on Macs, but much less than Windows. So what gives? If the Steam Deck is linux, how does anything work? The answer is Proton. Proton is a compatability layer that allows you to play Windows games on a Linux computer. There is another program called Wine that tries to do the same as well, so this is not unique. But the Steam Deck has embraced this in a way nothing else ever has. When you start a game, under the hood, Proton runs all the necessary programs to bridge the gap and allow the game to see what looks like a Windows computer.

So Just Buy Steam Games?

Here is the fun part. Steam is just the start. And the makers of the Steam Deck, Valve, recognized that from the start and rather than get cannibalized, they enabled it, encouraged it, or tacitly ignored it, depending on how you look at it and what you're trying to do. A Steam Deck is designed to play anything, from anywhere, anytime. Here's my journey.

Accessories You Should Consider

USB-C Hub: Anker, as recommended above. Not absolutely required, but if you want to save money on off the official Steam Dock and run this on a TV, you will need this. Should be $25.

Case: Absolutely get a case. I bought a full rubbery one that covers the entire back. Put the screen protector on first. They have others that just cover the two sides, I didn't like that as much. Should be $20.

Screen: I bought screen protectors. It was a little complicated to get it on (do it before the case) without any bubbles as it was very edge-to-edge with the screen. Should be $10 for 3.

Battery Bank: You can get 40,000mAh or 50,000mAh power banks today which will double your battery in the deck, for an additional 3-8 hours of gaming. Should be $30.

AirTag (or AirTag-like): You could slap one of these inside the case in the back center, the credit card format ones may be better, but even the others are fine. Should be $25.

Controllers: It will be hard to play on the small screen, but in theory, you could pair two (or even three) bluetooth controllers to the device for local multiplayer. Should be $30 each.

Portable Keyboard & Mouse: Look, you could try to use the on-screen keyboard (in fact, you can't turn it off, very annoying) but it's a pain. Either you will SSH to the deck a lot or you should just invest in something like this. I bought a great folding bluetooth keyboard/trackpad combo that works great and actually fits exactly into the groove on the back between the grips when not in use. Should be $25.

External HDD or USB-C Thumbdrive: Buying a 1TB drive will allow you to keep a backup (or rotate things in/out). 512GB would also work if you only have a 256GB or 512GB Deck or less stuff. Should be $70. I spent $40 on a 512GB Sandisk USB-C/USB-A Thumbdrive. Go into Desktop Mode and open KDE Partition Manager. I deleted the partition on the drive (make SURE you're on the thumbdrive) and created a new btrfs partition leaving me with about 470GB of usable space (don't forget to hit Apply). Open the Dolphin file manager and click the removable drive to mount it. Then open Konsole and you should be in your home folder (~). You will type `rsync -avPhv . /run/media/deck/` and hit <tab> so it will pick the random UUID for the drive. Remove the trailing slash and hit enter. This could take a long time the first time, but over time, it will get very very fast, only transferring new or changed files (like saves, new games, etc).

Windows: This is a cheap cop-out, but I cannot begin to tell you how much easier things are by having access to a full blown installation of Windows 7 or Windows 10. I see literally thousands of these available online for $90 to $180. It doesn't have to be anything special, just an ok machine from the last decade, 4GB of RAM, maybe a 64GB SDD. Can be a laptop for a nice portable extra device, or not, really. The point is, it allows you to run various setups and processes. All without dealing with the nuance of the Steam Deck and SteamOS. There are many cases below where I had to use a separate Windows machine to get things going, and I definitely took advantage of that. Of course, if you are only going to be using games from Steam, GOG, and Zoom, you may not need this, but plenty of Abandonware will benefit from being installed proper and then copied over.

The Greatest Game Console

I will get right into it. I will share what worked and what didn't. Your mileage may vary, things can change, but this is my experience.

Start by enabling Developer Mode (Settings > System > System Settings, Enable Developer Mode). This will be necessary for many things. One of which is once enabled, you will see a new Developer item in the Settings menu now. Under here, one of the easy things you can do is disable Wifi Power Management. This will improve connectivity to 5Ghz wifi networks, for a much faster experience (at the expense of marginally lower battery life).

Next thing we want to do is hit the Steam button and go to Power > Switch to Desktop. This is where we can see the linux operating system running behind the scenes. Once you are there, open the Discover store and download Heroic, Lutris, and Chrome. Then open the program called Konsole and hold Steam + X to bring up an on-screen keyboard where you will type `passwd` and hit enter. Pick some reasonable 5 or 6 character password that is easy to type, you will type it a lot. For advanced users, you can generate an SSH key (`ssh-keygen -t rsa`) if you don't already have one on your Windows/Mac/Linux machine and `mkdir ~/.ssh` on your deck and copy the contents of your ~/.ssh/id_rsa.pub file into ~/.ssh/authorized_keys on the deck. I imagine vim and emacs are both installed on the deck.

Emulation

If you are unfamiliar, emulation is the act of running a different system on top of the one you're using. For example, if you wanted to play a Nintendo game, you would run an emulator that acts like a Nintendo and load a ROM (which stands for read-only memory, and represents the data on one of the NES cartidges you may have seen from the 1980s. Those were just like a huge write-once stick of memory. All games are like this, in essence - whether it's a custom cartridge or a CD or a DVD.

Open Chrome and go to emudeck.com and download the SteamOS installer. I chose to use the ES Frontend, the installation where you do NOT integrate with your Steam library, and installed every possible emulator (sometimes it would make you pick RetroArch or something else, in those cases, I always picked RetroArch). RetroArch is a tool that combines a couple of dozen emulators into one neat package. Usually that works perfectly fine. For cases where it doesn't, there are other standalone emulators installed and visible in ES Frontend. There is a ton of info at emudeck.github.io.

Quick Pause

Go back to Discover and make sure you have all of these applications (EmuDeck probably installed some of them): DOSBox-X, Duckstation, melonDS, Mount Unmount ISO, PPSSPP, ProtonUp-Qt, RetroArch, xemu, Wine, Dolphin Emulator (not to be confused with Dolphin the file manager, which is also on the device).

Minecraft?

I'm not a big Minecraft player, but I understand it's pretty important for a lot of people. The good news is I was able to trivially get this working. I downloaded Prism Launcher from Discover. I went to Kinguin.net and bought a $7 account that had Minecraft Java (you can buy the game, too). I did the setup as dictated by Kinguin and then added the account to Prism. Then I installed 1.25 which was the current version. When I tried to launch, it asked me to name my profile, which I did, but then it failed to launch. I had to go to the Accounts section and sync to get it to work properly. I was then able to launch and play.

Back to Emulation

Now go find yourself a download of games for systems except Switch, PS5, Xbox One. Examples are NES, Gameboy, SNES, Gameboy Color, Genesis, Master Drive, 32X, Game Gear, N64, Gamecube, PSP, Gameboy Advance, Gameboy DS, Gameboy 3DS, Playstation, Playstation 2, Wii, Xbox, Atari, and anything else you can think of. Myrient and Vimm and R-Roms are possible places to Google. You can do all this right from the deck with the hub mentioned above. If you don't have the setup, you can do it on any other machine and transfer the games over.

Let's Connect Remotely

If you're on Windows, you'll need to download Bitvise (or some other SSH/SCP client). On any other device, you've already got what you need. We are going to turn on the SSH/SCP server. Open Konsole and type `sudo systemctl enable sshd --now` which will turn on the server. If you cannot guess, to turn it off again later, you would run `sudo systemctl disable sshd` and it will stop running. This allows you to connect remotely. Next step is to get on your router and find out the IP of your deck. You can also get this info from the Network info on the deck itself. From the other machine, open the SSH client or open a terminal and ssh to deck@deck_ip. Most of the time this is ssh deck@192.168.?.?? where deck is the username and ? will be digits. It will prompt you for the password you set earlier. Now you're all set.

Games On Before Game On

Now you can get the games onto your device. If you had downloaded a bundle, just extract the zip/7z/rar file and you'll have a folder full of files. Ship these over to your deck, they go in ~/Emulation/roms/ under the folder for the system they work on (for example ~/Emulation/roms/nes for Nintendo games or ~/Emulation/roms/snes for Super Nintendo). For example, say I was in a folder with a few Nintendo roms, I could do something like this on linux or mac: `scp * deck@my_deck_ip:~/Emulation/roms/nes` which would prompt me for the password and proceed to copy all those games to the deck.

Be sure to extract games from archives when necessary. For example, sometimes a game will be compressed into a zip/rar/7z file. The emulators do not always work with those, so you have to extract the files. You can do this on device after sending the games there, or beforehand. For example, if I had an xbox iso in a 7z archive, I would copy the 7z file to the ~/Emulation/roms/xbox folder and then in Konsole on the device (or via SSH), I would go into the folder and type `7z -y e name_of_file.7z` wihch would extract the game and then `rm -rf name_of_file.7z` since I do not need both the archive and the iso.

Maybe Not Steam?

I have bought games on other platforms. Zoom Platform (not the video conferencing place) and GoG (Good Old Games) are two of the popular places I have many games on. You can run Heroic or Lutris in Desktop Mode to add your accounts for these platforms and many more so you can access those games. Note that there is a NSL NonSteamLaunchers project that lots of places seem to champion. I could never get this to work properly, but Heroic worked on the first try, and I didn't see a reason not to use it. If you can get NSL working, maybe you would prefer that.

Another thing that I have not worked on yet is running just random software. For example, R G Catalyst has a Mechwarrior Quadrilogy (which is the first 4 mechwarrior games with all expansion packs) that should in theory work on Steam. I also am interested in dozens of abandonware games that have no home anywhere. Often these will run in DOSBox or something similar on your computer today. I will want to get these running on the deck as well. A few examples are Quarantine and Road Warrior. Quarantine, by Imagexcel in 1994, was the first game to include a full soundtrack which I still remember plenty of today. Imagine GTA, but you stay in taxi mode all the time, with missions happening in taxi mode.

Useful Commands

One thing I find myself doing a lot is digging into many subfolders to find files and send them to a single place on the deck. I use this for that: `find . -type f -name "*.bin" -print0 | while IFS= read -r -d '' file; do echo "$file"; scp "$file" deck@192.168.1.211:~/Emulation/roms/psx; done;` note that I had to push my ssh key into authorized_keys to avoid the password prompt.

When you're in desktop mode, and you press Steam+X to bring up the keyboard, sometimes it is better if it is at the top. The little button near the X and Y buttons will move the keyboard to the top of the screen. This is really handy in DosBox. You can also hold L2 (left hand big trigger) and press the Move button on the screen, lower right corner. Also Steam+DpadLeft is Escape.

When you're in desktop mode, you can hold the button near the X and Y buttons for 3 seconds to swap from Desktop Mode to Gamepad mode. This is especially important for DOSBox games.

Quarantine (And Really Any DOS Game)

I am going to detail my setup, which works for every game I have tried so far. First, as noted above, you'll swap to Gamepad mode. Note that Quarantine was a keyboard-only game, which helps immensely, but I will also note that Civilization 1 also works well, and uses a mouse. Some of this was from relentlessoptimizer.com and other info I have found in various places and some tinkering myself.

You can read a ton about DOSBox-X on the wiki so I'm going to keep it very practical here. DOSBox is a tool that lets you play DOS games on another operating system that would not normally be able to play those games. It has a huge number of customization options and many different forks. The one we will use is DOSBox-X, available on the Discover store.

First, make a folder Games off your /home/deck folder if it does not already exist.

SCP (or otherwise copy) your game folder to the deck. In this case, I made a folder quar (keep it under 8 characters, as DOS demanded) and sent the entire folder to the deck (which for many games made before 1998, is usually 10-15 MB total).

Make a file, games.conf, and get it into your Games folder. Here is an example (I apologize, I do not recall where I got this one):

[sdl]
#       fullscreen: Start dosbox directly in fullscreen. (Press ALT-Enter to go back)
#       fulldouble: Use double buffering in fullscreen. It can reduce screen flickering, but it can also result in a slow DOSBox.
#   fullresolution: What resolution to use for fullscreen: original or fixed size (e.g. 1024x768).
#                     Using your monitor's native resolution with aspect=true might give the best results.
#                     If you end up with small window on a large screen, try an output different from surface.
# windowresolution: Scale the window to this size IF the output device supports hardware scaling.
#                     (output=surface does not!)
#           output: What video system to use for output. possible values: surface, overlay, opengl, openglnb, ddraw.
#         autolock: Mouse will automatically lock, if you click on the screen. (Press CTRL-F10 to unlock)
#      sensitivity: Mouse sensitivity.
#      waitonerror: Wait before closing the console if dosbox has an error.
#         priority: Priority levels for dosbox. Second entry behind the comma is for when dosbox is not focused/minimized.
#                     pause is only valid for the second entry.
#                   Possible values: lowest, lower, normal, higher, highest, pause.
#       mapperfile: File used to load/save the key/event mappings from. Resetmapper only works with the defaul value.
#     usescancodes: Avoid usage of symkeys, might not work on all operating systems.

fullscreen=false
showmenu=true
fulldouble=true
fullresolution=1280×960
windowresolution=1280×960
output=ddraw
autolock=false
sensitivity=100
waitonerror=true
priority=higher,normal
mapperfile=mapper-0.74.map
usescancodes=true

[dosbox]
#  machine: The type of machine tries to emulate.
#           Possible values: hercules, cga, tandy, pcjr, ega, vgaonly, svga_s3, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe.
# captures: Directory where things like wave, midi, screenshot get captured.
#  memsize: Amount of memory DOSBox has in megabytes.
#             This value is best left at its default to avoid problems with some games,
#             though few games might require a higher value.
#             There is generally no speed advantage when raising this value.

machine=svga_s3
captures=capture
memsize=16

[render]
# frameskip: How many frames DOSBox skips before drawing one.
#    aspect: Do aspect correction, if your output method doesn't support scaling this can slow things down!.
#    scaler: Scaler used to enlarge/enhance low resolution modes.
#              If 'forced' is appended, then the scaler will be used even if the result might not be desired.
#            Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x,
#            hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x.

frameskip=0
aspect=true
scaler=normal2x

[cpu]
#      core: CPU Core used in emulation. auto will switch to dynamic if available and appropriate.
#            Possible values: auto, dynamic, normal, simple.
#   cputype: CPU Type used in emulation. auto is the fastest choice.
#            Possible values: auto, 386, 386_slow, 486_slow, pentium_slow, 386_prefetch.
#    cycles: Amount of instructions DOSBox tries to emulate each millisecond.
#            Setting this value too high results in sound dropouts and lags.
#            Cycles can be set in 3 ways:
#              'auto'          tries to guess what a game needs.
#                              It usually works, but can fail for certain games.
#              'fixed #number' will set a fixed amount of cycles. This is what you usually need if 'auto' fails.
#                              (Example: fixed 4000).
#              'max'           will allocate as much cycles as your computer is able to handle.
#
#            Possible values: auto, fixed, max.
#   cycleup: Amount of cycles to decrease/increase with keycombo.(CTRL-F11/CTRL-F12)
# cycledown: Setting it lower than 100 will be a percentage.

core=auto
cputype=auto
cycles=18000
cycleup=1000
cycledown=1000


[mixer]
#   nosound: Enable silent mode, sound is still emulated though.
#      rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality.
#            Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
# blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged.
#            Possible values: 1024, 2048, 4096, 8192, 512, 256.
# prebuffer: How many milliseconds of data to keep on top of the blocksize.

nosound=false
rate=44100
blocksize=1024
prebuffer=80

[midi]
#     mpu401: Type of MPU-401 to emulate.
#             Possible values: intelligent, uart, none.
# mididevice: Device that will receive the MIDI data from MPU-401.
#             Possible values: default, win32, alsa, oss, coreaudio, coremidi, none.
# midiconfig: Special configuration options for the device driver. This is usually the id of the device you want to use.
#               See the README/Manual for more details.

mpu401=intelligent
mididevice=default
midiconfig=

[sblaster]
#  sbtype: Type of Soundblaster to emulate. gb is Gameblaster.
#          Possible values: sb1, sb2, sbpro1, sbpro2, sb16, gb, none.
#  sbbase: The IO address of the soundblaster.
#          Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300.
#     irq: The IRQ number of the soundblaster.
#          Possible values: 7, 5, 3, 9, 10, 11, 12.
#     dma: The DMA number of the soundblaster.
#          Possible values: 1, 5, 0, 3, 6, 7.
#    hdma: The High DMA number of the soundblaster.
#          Possible values: 1, 5, 0, 3, 6, 7.
# sbmixer: Allow the soundblaster mixer to modify the DOSBox mixer.
# oplmode: Type of OPL emulation. On 'auto' the mode is determined by sblaster type. All OPL modes are Adlib-compatible, except for 'cms'.
#          Possible values: auto, cms, opl2, dualopl2, opl3, none.
#  oplemu: Provider for the OPL emulation. compat might provide better quality (see oplrate as well).
#          Possible values: default, compat, fast.
# oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly).
#          Possible values: 44100, 49716, 48000, 32000, 22050, 16000, 11025, 8000.

sbtype=sb16
sbbase=220
irq=7
dma=1
hdma=5
sbmixer=true
oplmode=auto56
oplemu=compat
oplrate=44100

[gus]
#      gus: Enable the Gravis Ultrasound emulation.
#  gusrate: Sample rate of Ultrasound emulation.
#           Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
#  gusbase: The IO base address of the Gravis Ultrasound.
#           Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300.
#   gusirq: The IRQ number of the Gravis Ultrasound.
#           Possible values: 5, 3, 7, 9, 10, 11, 12.
#   gusdma: The DMA channel of the Gravis Ultrasound.
#           Possible values: 3, 0, 1, 5, 6, 7.
# ultradir: Path to Ultrasound directory. In this directory
#           there should be a MIDI directory that contains
#           the patch files for GUS playback. Patch sets used
#           with Timidity should work fine.

gus=false
gusrate=44100
gusbase=240
gusirq=5
gusdma=3
ultradir=C:\ULTRASND

[speaker]
# pcspeaker: Enable PC-Speaker emulation.
#    pcrate: Sample rate of the PC-Speaker sound generation.
#            Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
#     tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'.
#            Possible values: auto, on, off.
# tandyrate: Sample rate of the Tandy 3-Voice generation.
#            Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
#    disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible).

pcspeaker=true
pcrate=44100
tandy=auto
tandyrate=44100
disney=true

[joystick]
# joysticktype: Type of joystick to emulate: auto (default), none,
#               2axis (supports two joysticks),
#               4axis (supports one joystick, first joystick used),
#               4axis_2 (supports one joystick, second joystick used),
#               fcs (Thrustmaster), ch (CH Flightstick).
#               none disables joystick emulation.
#               auto chooses emulation depending on real joystick(s).
#               (Remember to reset dosbox's mapperfile if you saved it earlier)
#               Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none.
#        timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away).
#     autofire: continuously fires as long as you keep the button pressed.
#       swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks.
#   buttonwrap: enable button wrapping at the number of emulated buttons.

joysticktype=auto
timed=false
autofire=false
swap34=true
buttonwrap=false

[serial]
# serial1: set type of device connected to com port.
#          Can be disabled, dummy, modem, nullmodem, directserial.
#          Additional parameters must be in the same line in the form of
#          parameter:value. Parameter for all types is irq (optional).
#          for directserial: realport (required), rxdelay (optional).
#                           (realport:COM1 realport:ttyS0).
#          for modem: listenport (optional).
#          for nullmodem: server, rxdelay, txdelay, telnet, usedtr,
#                         transparent, port, inhsocket (all optional).
#          Example: serial1=modem listenport:5000
#          Possible values: dummy, disabled, modem, nullmodem, directserial.
# serial2: see serial1
#          Possible values: dummy, disabled, modem, nullmodem, directserial.
# serial3: see serial1
#          Possible values: dummy, disabled, modem, nullmodem, directserial.
# serial4: see serial1
#          Possible values: dummy, disabled, modem, nullmodem, directserial.

serial1=dummy
serial2=dummy
serial3=disabled
serial4=disabled

[dos]
#            xms: Enable XMS support.
#            ems: Enable EMS support.
#            umb: Enable UMB support.
# keyboardlayout: Language code of the keyboard layout (or none).

xms=true
ems=true
umb=true
keyboardlayout=auto

The things you may change above is the fullscreen setting (I don't mind manually going full screen when I'm ready) and the cycles (how many instructions to execute every millisecond). Most games will work fine on these settings, but if you need to change them, I will show you how to do that next.

Make a file in the game folder (in this case, quar) called dosbox.conf. Here are the contents for that file:

[sdl]
mapperfile=dosbox.map

[autoexec]
mount c .
c:
cd quar
q.exe
exit
The autoexec section here is what will be executed as DOSBox commands. The first time you run DOSBox, it will ask you to pick a starting folder (and offer to remember it forever). I picked the Games folder for this. So the first line, mount c . says "Make a c drive starting in the Games folder." Then we switch to the C drive, go into the game folder (quar), and run the game (q.exe). Always add an exit to the end to stop DOSBox when you quit the game.

The other interesting bit is the dosbox.map file referenced above. I am going to paste it here, but note that it is large:

[SDL2]
hand_reset "key 21 host"
hand_reboot "key 5 host"
hand_loadmap
hand_quickrun "key 20 host"
hand_shutdown "key 66 mod1"
hand_capmouse "key 67 mod1"
hand_fastedit
hand_copyall "key 62 mod1"
hand_paste "key 63 mod1"
hand_pasteend
hand_ejectpage "key 59 mod1"
hand_printtext
hand_pause "key 72 host"
hand_pauseints
hand_gui "key 6 host"
hand_mapper "key 16 host"
hand_fullscr "key 9 host"
hand_resetsize "key 42 host"
hand_dbcssbcs
hand_autoboxdraw
hand_incsize "key 82 host"
hand_decsize "key 81 host"
hand_resetcolor
hand_pwrbutton
hand_togmenu "key 41 host"
hand_speedlock "key 79 host"
hand_speedlock2
hand_speednorm "key 80 host"
hand_speedup "key 48 host"
hand_slowdown "key 47 host"
hand_editcycles
hand_savestate "key 22 host"
hand_loadstate "key 15 host"
hand_showstate
hand_prevslot "key 54 host"
hand_nextslot "key 55 host"
hand_decfskip
hand_incfskip
hand_aspratio
hand_fscaler
hand_recwave "key 26 host"
hand_recmtwave
hand_caprawmidi
hand_caprawopl
hand_capnetrf
hand_video "key 12 host"
hand_scrshot "key 19 host"
hand_rawscrshot "key 19 mod1 host"
hand_cycauto
hand_cycledown "key 45 host"
hand_cycleup "key 46 host"
hand_normal
hand_dynamic
hand_simple
hand_full
hand_volup "key 87 host"
hand_voldown "key 86 host"
hand_recvolup
hand_recvoldown
hand_sendkey_mapper "key 76 host"
hand_swapimg "key 18 host"
hand_swapcd "key 7 host"
hand_rescanall
key_f13
key_f14
key_f15
key_f16
key_f17
key_f18
key_f19
key_f20
key_f21
key_f22
key_f23
key_f24
key_esc "key 41" "stick_0 button 1"
key_f1 "key 58"
key_f2 "key 59"
key_f3 "key 60"
key_f4 "key 61"
key_f5 "key 62"
key_f6 "key 63"
key_f7 "key 64"
key_f8 "key 65"
key_f9 "key 66"
key_f10 "key 67"
key_f11 "key 68"
key_f12 "key 69"
key_grave "key 53"
key_1 "key 30"
key_2 "key 31"
key_3 "key 32"
key_4 "key 33"
key_5 "key 34"
key_6 "key 35"
key_7 "key 36"
key_8 "key 37"
key_9 "key 38"
key_0 "key 39"
key_minus "key 45"
key_equals "key 46"
key_bspace "key 42"
key_tab "key 43"
key_q "key 20"
key_w "key 26"
key_e "stick_0 button 16" "key 8"
key_r "key 21"
key_t "key 23"
key_y "key 28" "stick_0 button 3"
key_u "key 24"
key_i "key 12"
key_o "key 18"
key_p "key 19"
key_lbracket "key 47"
key_rbracket "key 48"
key_enter "key 40" "stick_0 button 0"
key_capslock "key 57"
key_a "key 4"
key_s "key 22"
key_d "key 7"
key_f "key 9"
key_g "key 10"
key_h "key 11"
key_j "key 13"
key_k "key 14"
key_l "key 15"
key_semicolon "key 51"
key_quote "key 52"
key_backslash "key 49"
key_lshift "stick_0 button 17"
key_lessthan "key 100"
key_z "stick_0 button 18" "key 29"
key_x "key 27"
key_c "key 6"
key_v "key 25"
key_b "key 5"
key_n "key 17"
key_m "key 16" "stick_0 button 10"
key_comma "key 54"
key_period "key 55"
key_slash "key 56"
key_rshift "key 229"
key_lctrl "stick_0 button 9"
key_lwindows
key_lalt "key 226" "stick_0 button 19"
key_space "key 44" "stick_0 button 2"
key_ralt "key 230"
key_rwindows
key_rwinmenu
key_rctrl "key 228"
key_printscreen "key 70"
key_scrolllock "key 71"
key_pause "key 72"
key_insert "key 73"
key_home "key 74"
key_pageup
key_delete "key 76"
key_end "key 77"
key_pagedown
key_up "key 82" "stick_0 button 11"
key_left "key 80" "stick_0 button 13"
key_down "key 81" "stick_0 button 12"
key_right "key 79" "stick_0 button 14"
key_kp_equals "key 103"
key_kp_comma "key 133"
key_numlock "key 83"
key_kp_divide "key 84"
key_kp_multiply "key 85"
key_kp_minus "key 86"
key_kp_7 "key 95"
key_kp_8 "key 96"
key_kp_9 "key 97"
key_kp_plus "key 87"
key_kp_4 "key 92"
key_kp_5 "key 93"
key_kp_6 "key 94"
key_kp_1 "key 89"
key_kp_2 "key 90"
key_kp_3 "key 91"
key_kp_enter "key 88"
key_kp_0 "key 98"
key_kp_period "key 99"
mouse_left
mouse_middle
mouse_right
jbutton_0_0 "stick_0 button 0"
jbutton_0_1 "stick_0 button 1"
jaxis_0_0- "stick_0 axis 0 0"
jaxis_0_0+ "stick_0 axis 0 1"
jaxis_0_1- "stick_0 axis 1 0"
jaxis_0_1+ "stick_0 axis 1 1"
jbutton_0_2 "stick_0 button 2"
jbutton_0_3 "stick_0 button 3"
jbutton_1_0
jbutton_1_1
jaxis_0_2- "stick_0 axis 2 0"
jaxis_0_2+ "stick_0 axis 2 1"
jaxis_0_3- "stick_0 axis 3 0"
jaxis_0_3+ "stick_0 axis 3 1"
jaxis_1_0-
jaxis_1_1-
jaxis_1_0+
jaxis_1_1+
jbutton_0_4 "stick_0 button 4"
jbutton_0_5 "stick_0 button 5"
jhat_0_0_0 "stick_0 hat 0 1"
jhat_0_0_3 "stick_0 hat 0 8"
jhat_0_0_2 "stick_0 hat 0 4"
jhat_0_0_1 "stick_0 hat 0 2"
key_jp_hankaku
key_jp_muhenkan "key 139"
key_jp_henkan "key 138"
key_jp_hiragana "key 136"
key_jp_yen "key 137"
key_jp_bckslash "key 135"
key_colon
key_caret
key_atsign
key_kor_hancha
key_kor_hanyong
mod_1 "key 224" "key 228"
mod_2 "key 226" "key 230"
mod_3 "key 225" "key 229"
host "key 69"
I did not write this by hand. In DOSBox, you can go to the File menu and pick the "Mapper Editor" which will show you a fake keyboard and let you map this to the buttons on the deck. You click on a key, for example, E, and then hit "Add" and press a button on the deck and now when you press that button, DOSBox will send an "E" to the game. In Quarantine, this means Eject (i.e. the passenger/package). When you're done, hit Save to write the file. You can also load an existing file to make changes later (from the File menu).

So for Quarantine, for example, I mapped the arrow keys to the dpad, then L1 is Control, to fire the special, L4 is Alt, to cycle weapons, R1 is (M)ap, R3 is Z (jump), R4 is (E)ject, Y was actually Y, X for Space, B for Escape, and A for Enter. Now when I run the game, I can do everything in Gamepad mode.

Next, create a file, dosbox-q.sh, in the quar folder which looks like this:

#!/bin/sh
flatpak run com.dosbox_x.DOSBox-X -conf "/home/deck/Games/games.conf" -conf "/home/deck/Games/quar/dosbox.conf"
Then make it executable with `chmod +x dosbox-q.sh` which will make it possible to just tap it in Dolphin and start it. Now, you can right click it (left trigger on it) and hit "Add to Steam" which will put it in your Steam library. You can also add a shortcut on your desktop to this file so it plays like any game in your Steam library that was installed on the deck.

When you want to do this to another game, you copy the dosbox.map, dosbox.conf, and dosbox-q.sh file into the next game's folder, and rename dosbox-q.sh to be more aligned to the next game (for example dosbox-civ1.sh). Then modify the dosbox.map for the controls necessary (keeping in mind if you want to go to Desktop mode or Gamepad mode) and dosbox.conf for any other settings (more or less CPU cycles, etc).

Mechwarrior Quadrology

Mechwarrior 2 is probably one of the most important games in my history. Having it work is almost critical to owning this device. Let me walk you through how that went. Ultimately, I did get it playing.

Results

Steam: specifically GTA, Prince of Persia, Stray, and Flatout. These worked fine. I also have Portal and Portal 2, great games, haven't tried yet, highly recommend watching for sales of these. No reason to think they won't work (they clearly mark the ones that do not work on Steam Deck or if they need a keyboard and mouse).

NES: Worked fine from ES Frontend. Super Mario 3 is a timeless classic. Castlevania 3, Adventure Island, Zelda, just amazing.

Gameboy: Worked fine from ES Frontend. Link's Awakening anyone? It appears custom-palette games also worked in the same gameboy folder (like Killer Instinct).

Gameboy Color: Worked fine from ES Frontend. Mario Tennis has the longest intro of nonsense ever.

Gameboy Advance: Worked fine from ES Frontend. Breath of Fire? I mean come on.

SNES: Worked fine from ES Frontend. I still have my Super Mario RPG cartridge. A classic. A Link to the Past changed my life.

PSP: Worked fine from ES Frontend. Assassin's Creed is a great game on this platform. There are a few Burnout games which are very popular as well.

N64: Worked fine from ES Frontend. Mario 64 and Ocarina of Time belong in some kind of shrine to video games.

Sega Genesis/CD: Worked fine from ES Frontend. Shadowrun might be the best thing ever. Note that SegaCD and Sega Genesis are interchangable these days.

Sega (Mega Drive) 32X: Worked fine in ES Frontend. Also known as Super 32X or Genesis 32X.

Atary Lynx: Worked fine in ES Frontend. Make sure to check the EmuDeck cheat sheet linked above for details and be very careful about the filename of the bios - it has to end in img, but you may sometimes find it as bin.

Xbox: Worked fine in ES Frontend. You will need to find a bios online and put those on the deck into ~/Emulation/bios, there are 2 or 3 files you will need. Just do some Googling. After that, you can put ISOs of games into ~/Emulation/roms/xbox. Then you will run xemu from Emulators folder. It will complain about needing a disc, obviously. In the file menu, you can Load a Disc (which means choosing the ISO from the folder). Then reset xemu (under the File menu) and the game will start. Ninja Gaiden Black and Hunter ftw.

PS1 (aka PSX): Worked fine from ES Frontend. You will need to name the bios files carefully (some places have it as ps-30a.bin which is the Americas version, and should be called scph5501.bin) and put them in ~/Emulation/bios. Then drop bin/cue files into ~/Emulation/roms/psx (without subfolders). Pressing both joysticks allowed me to exit the emulator and offered to save the state.

PS2: Worked fine from ES Frontend. You need to look here to get the right bios. I think the 230a, 230e, and 230h are good choices. Dropping isos into ps2 folder was all that was necessary.

GOG: Worked fine from Heroic in Desktop Mode.

Epic Store: Worked fine from Heroic in Desktop Mode.

Vita: Worked fine from ES Frontend. Check emudeck site for info on getting firmware files right from Playstation website. Open vita3k in Deskop mode and update immediately. Then install the two firmware files. On r-roms, you'll find a link to pkg AND bin files, you will need both (keep each pair of these in a separate folder). Install the pkg from the menu in vita3k and find the accompanying work.bin for the game you are loading.

Saturn: Worked fine from ES Frontend. Check the emudeck cheat sheet for bios info, Abdess is a source for the saturn_bios.bin and for me, mpr-17933.bin. Send bin/cue files to the roms/saturn folder.

Gamecube: WIP. I ran Dolphin-emu from the Emulators folder in ES Frontend and this worked. I configured the controller as follows: Mario Kart Double Dash and Metroid Prime are amazing games. Also cannot exit cleanly, have to hard exit the whole emulator. Also running from ES Frontend did not work.

Abandonware: I specifically tried Quarantine and Civilization so far, and used the method detailed above successfully. I would say that in general, this should always work, but may require a little tweaking here and there, and may only work in Desktop Mode.

Android

I wrote what I wrote. Ryan R has put together this incredible tool which will install Android 13 either with or without the Google Play Store. I had to reboot, and it only seemed to work in Game Mode when running the Android_Waydroid_Cage.sh script, but it booted up in seconds and gave me a full Android 13 installation (I signed into Google Play and went to town). What would you want this for? If anything, just having Google Maps, with offline maps for navigation and POIs, is worth it. Plus the few mobile games I really like and might want around (8 Ball Pool, Subway Surfers, Tank Hero, etc).

Bonus: Productivity

Earlier on, I mentioned this was actually a Linux computer hidden inside a game console. So in the Discover store in Desktop Mode, you can find things like LibreOffice (the office suite for Linux), Slack, and anything else you might need to get work done. When you plug in that HDMI cable and either wire in or connect a keyboard and mouse via bluetooth, you will actually have a pretty good work machine as well. I can edit code in VS Code and operate as I would on my laptop with ease.

Bonus 2: LLMs?

I've heard you can run any 10B paramter model on your steam deck. You can also easily hook up models running in the cloud (Flash 2.5 is probably my favorite for the value, maybe you spend a few pennies a day, never over $1). More to come in this area as I do some more research.

To Do

Xbox 360? Dreamcast? GBDS? Virual Boy? MAME? Other systems, quadrilogy, zoom (Zone Raiders), some decky plugins, especially for power management