summaryrefslogtreecommitdiffstats
path: root/2020/subtitles/emacsconf-2020--27-state-of-retro-gaming-in-emacs-chip8--vasilij-wasamasa-schneidermann-autogen.sbv
diff options
context:
space:
mode:
Diffstat (limited to '2020/subtitles/emacsconf-2020--27-state-of-retro-gaming-in-emacs-chip8--vasilij-wasamasa-schneidermann-autogen.sbv')
-rw-r--r--2020/subtitles/emacsconf-2020--27-state-of-retro-gaming-in-emacs-chip8--vasilij-wasamasa-schneidermann-autogen.sbv912
1 files changed, 0 insertions, 912 deletions
diff --git a/2020/subtitles/emacsconf-2020--27-state-of-retro-gaming-in-emacs-chip8--vasilij-wasamasa-schneidermann-autogen.sbv b/2020/subtitles/emacsconf-2020--27-state-of-retro-gaming-in-emacs-chip8--vasilij-wasamasa-schneidermann-autogen.sbv
deleted file mode 100644
index c88c3ded..00000000
--- a/2020/subtitles/emacsconf-2020--27-state-of-retro-gaming-in-emacs-chip8--vasilij-wasamasa-schneidermann-autogen.sbv
+++ /dev/null
@@ -1,912 +0,0 @@
-0:00:00.880,0:00:04.520
-hello everyone and welcome to my talk
-
-0:00:02.879,0:00:06.960
-state of retrogaming and Emacs
-
-0:00:04.520,0:00:08.639
-[Music]
-
-0:00:06.960,0:00:12.000
-first of all a little bit about myself
-
-0:00:08.639,0:00:13.599
-my name is neilman I'm 28 years old
-
-0:00:12.000,0:00:15.200
-I work as a cyber security consultant
-
-0:00:13.599,0:00:17.440
-msg systems and
-
-0:00:15.200,0:00:19.359
-test other people's web applications and
-
-0:00:17.440,0:00:20.160
-review the source code for security
-
-0:00:19.359,0:00:22.960
-problems
-
-0:00:20.160,0:00:25.039
-you can reach me by email I have my own
-
-0:00:22.960,0:00:26.480
-self-hosted git repositories
-
-0:00:25.039,0:00:28.480
-and I have a blog where you can
-
-0:00:26.480,0:00:32.160
-occasionally find new posts by me on all
-
-0:00:28.480,0:00:34.800
-kinds of things not just emix things
-
-0:00:32.160,0:00:36.480
-so but the motivation about this one I
-
-0:00:34.800,0:00:38.079
-found that Emacs is the ultimate
-
-0:00:36.480,0:00:40.160
-procrastination machine and there are
-
-0:00:38.079,0:00:41.200
-lots of fun demonstrations I'll go over
-
-0:00:40.160,0:00:44.160
-a few of them
-
-0:00:41.200,0:00:46.079
-for example someone made a thing to
-
-0:00:44.160,0:00:48.239
-order sell it for himself online so it
-
-0:00:46.079,0:00:50.879
-doesn't have to walk over to the shop
-
-0:00:48.239,0:00:51.760
-there's plenty rc bots there's some game
-
-0:00:50.879,0:00:53.520
-things
-
-0:00:51.760,0:00:55.600
-there's an emulator for the z machine
-
-0:00:53.520,0:00:57.600
-which you can use to play zorg
-
-0:00:55.600,0:00:59.039
-and so I asked myself at this point can
-
-0:00:57.600,0:01:01.039
-you actually emulate retro games at
-
-0:00:59.039,0:01:02.800
-60fps and it looked around a bit
-
-0:01:01.039,0:01:04.479
-and found some projects but none that
-
-0:01:02.800,0:01:07.360
-were actually able to
-
-0:01:04.479,0:01:08.000
-do it at 60fps so I set out to do my own
-
-0:01:07.360,0:01:09.439
-one
-
-0:01:08.000,0:01:11.119
-and looked out for a console that you
-
-0:01:09.439,0:01:13.439
-can actually emulate at that speed
-
-0:01:11.119,0:01:14.690
-using emax with its very very limited
-
-0:01:13.439,0:01:16.320
-rendering
-
-0:01:14.690,0:01:19.520
-[Music]
-
-0:01:16.320,0:01:20.560
-and here's the project chip8.el it's
-
-0:01:19.520,0:01:22.880
-pretty much finished
-
-0:01:20.560,0:01:24.000
-it clocks into under 1000 sourced lines
-
-0:01:22.880,0:01:26.159
-of code
-
-0:01:24.000,0:01:28.080
-it supports the superchip 8 extensions
-
-0:01:26.159,0:01:30.159
-it runs at full speed all games behave
-
-0:01:28.080,0:01:32.320
-okay as far as I'm concerned and
-
-0:01:30.159,0:01:34.479
-yeah I'm pretty happy with it it's very
-
-0:01:32.320,0:01:37.040
-much the hell world of emulation
-
-0:01:34.479,0:01:40.880
-and I might maybe do some other
-
-0:01:37.040,0:01:43.360
-emulation projects in the future
-
-0:01:40.880,0:01:45.439
-now for the section which is the longest
-
-0:01:43.360,0:01:46.320
-bunch of fun facts about ship a dot el
-
-0:01:45.439,0:01:49.759
-which I've learned
-
-0:01:46.320,0:01:52.240
-during this project so
-
-0:01:49.759,0:01:54.640
-what the hell is debate anyway first of
-
-0:01:52.240,0:01:56.799
-all unlike many other emulation game
-
-0:01:54.640,0:01:58.560
-things it's not a console but a vm
-
-0:01:56.799,0:02:00.000
-it was designed for easy parting of home
-
-0:01:58.560,0:02:02.560
-computer games
-
-0:02:00.000,0:02:03.680
-it wasn't terribly successful and but
-
-0:02:02.560,0:02:04.320
-there's still a small community of
-
-0:02:03.680,0:02:06.079
-enthusiasts
-
-0:02:04.320,0:02:09.119
-writing games for it and there are even
-
-0:02:06.079,0:02:11.920
-a few demos
-
-0:02:09.119,0:02:14.720
-this vm has system specs it has a very
-
-0:02:11.920,0:02:14.959
-very simple 8-bit cpu with 16 registers
-
-0:02:14.720,0:02:17.760
-and
-
-0:02:14.959,0:02:18.160
-36 fixed size instructions you have a
-
-0:02:17.760,0:02:20.560
-whole
-
-0:02:18.160,0:02:22.080
-4 kilobyte of ram you have a stack with
-
-0:02:20.560,0:02:24.480
-16 return addresses
-
-0:02:22.080,0:02:25.760
-the resolution is 64 by 32 black white
-
-0:02:24.480,0:02:28.000
-pixels
-
-0:02:25.760,0:02:29.440
-rendering is done by drawing sprites
-
-0:02:28.000,0:02:30.160
-these are drawn in excel mode meaning
-
-0:02:29.440,0:02:32.239
-that if you
-
-0:02:30.160,0:02:33.840
-draw a sprite and set a bit it just
-
-0:02:32.239,0:02:35.040
-flips over from black to white or white
-
-0:02:33.840,0:02:36.560
-to black
-
-0:02:35.040,0:02:38.239
-first one you have a modern buzz that
-
-0:02:36.560,0:02:40.640
-can just beep at one
-
-0:02:38.239,0:02:43.120
-frequency and most unusually there's a
-
-0:02:40.640,0:02:45.360
-hexadecimal keypad as input
-
-0:02:43.120,0:02:48.160
-so the keys are basically zero to nine
-
-0:02:45.360,0:02:48.160
-and a to f
-
-0:02:48.480,0:02:52.400
-so how does this whole thing work it
-
-0:02:50.879,0:02:53.599
-runs an unspecified speed
-
-0:02:52.400,0:02:54.879
-you'll probably have to do some fine
-
-0:02:53.599,0:02:56.080
-tune you find the speed you're happy
-
-0:02:54.879,0:02:58.560
-with
-
-0:02:56.080,0:03:01.120
-sound and delay timers exist they count
-
-0:02:58.560,0:03:02.879
-down at 60fps down to zero
-
-0:03:01.120,0:03:05.120
-this is done so that you can play a
-
-0:03:02.879,0:03:06.640
-sound at some specific time
-
-0:03:05.120,0:03:08.640
-the game itself is loaded with a fixed
-
-0:03:06.640,0:03:10.480
-offset into ram the program account is
-
-0:03:08.640,0:03:11.920
-set to exactly that offset
-
-0:03:10.480,0:03:13.840
-and from there it enters the game loop
-
-0:03:11.920,0:03:15.519
-where decodes and instruction executes
-
-0:03:13.840,0:03:18.130
-it for the side effects and just
-
-0:03:15.519,0:03:19.599
-loops and does this at infinitum
-
-0:03:18.130,0:03:21.920
-[Music]
-
-0:03:19.599,0:03:23.920
-so the game was the first thing where
-
-0:03:21.920,0:03:24.239
-into problems the usual game approach is
-
-0:03:23.920,0:03:26.640
-to
-
-0:03:24.239,0:03:28.239
-do stuff figure out how long to eight
-
-0:03:26.640,0:03:30.640
-wait for exactly that much and
-
-0:03:28.239,0:03:31.680
-repeat this doesn't work well in imax at
-
-0:03:30.640,0:03:34.959
-all because well
-
-0:03:31.680,0:03:37.280
-user input basically and
-
-0:03:34.959,0:03:39.040
-Emacs is designed to just do whatever it
-
-0:03:37.280,0:03:40.080
-needs to do whenever you enter use input
-
-0:03:39.040,0:03:42.799
-instead of
-
-0:03:40.080,0:03:43.440
-doing things at one specific time if you
-
-0:03:42.799,0:03:45.040
-try to do
-
-0:03:43.440,0:03:46.640
-interruptable sleep well you get
-
-0:03:45.040,0:03:49.440
-unpredictable behavior
-
-0:03:46.640,0:03:50.959
-for example can be the timer doesn't run
-
-0:03:49.440,0:03:52.560
-at all at next time because you've
-
-0:03:50.959,0:03:54.400
-accidentally cancelled it
-
-0:03:52.560,0:03:55.760
-if you do uninterruptable sleep it's
-
-0:03:54.400,0:03:56.720
-freezes instead which isn't what you
-
-0:03:55.760,0:03:59.360
-want either
-
-0:03:56.720,0:04:00.560
-so I went for timers which forced me to
-
-0:03:59.360,0:04:02.159
-do inversion of control
-
-0:04:00.560,0:04:04.080
-meaning that I have to write code in the
-
-0:04:02.159,0:04:06.159
-style where it's just call it
-
-0:04:04.080,0:04:07.200
-time and this allows this input to
-
-0:04:06.159,0:04:09.120
-happen and to
-
-0:04:07.200,0:04:11.040
-for things to progress at roughly the
-
-0:04:09.120,0:04:12.879
-speed I want to
-
-0:04:11.040,0:04:14.159
-so there's the skydiver function which
-
-0:04:12.879,0:04:16.000
-is called a 60fps
-
-0:04:14.159,0:04:17.359
-and I have to be very careful to not do
-
-0:04:16.000,0:04:20.479
-too much in it
-
-0:04:17.359,0:04:22.960
-and say this function execute cpu cycles
-
-0:04:20.479,0:04:23.680
-decrypt the sound delay registers and
-
-0:04:22.960,0:04:27.759
-redraw
-
-0:04:23.680,0:04:28.800
-the screen so to map this whole system
-
-0:04:27.759,0:04:31.199
-to mx lisp
-
-0:04:28.800,0:04:33.120
-I've used just integers and vectors
-
-0:04:31.199,0:04:35.040
-which contain even more integers
-
-0:04:33.120,0:04:37.759
-this is used for the ram registers
-
-0:04:35.040,0:04:39.120
-return stack key state screen and so on
-
-0:04:37.759,0:04:41.520
-and so forth basically
-
-0:04:39.120,0:04:42.800
-what you would do if you were writing c
-
-0:04:41.520,0:04:44.560
-all of this is stored in global
-
-0:04:42.800,0:04:46.479
-variables I'm not using any
-
-0:04:44.560,0:04:48.400
-lists at all and as a side effect
-
-0:04:46.479,0:04:50.320
-there's no constant going on at all
-
-0:04:48.400,0:04:51.120
-there are no extra objects created which
-
-0:04:50.320,0:04:53.919
-would trigger
-
-0:04:51.120,0:04:55.840
-garbage collection pulses this getting
-
-0:04:53.919,0:04:56.720
-this red was rather tricky actually and
-
-0:04:55.840,0:04:58.560
-there were some
-
-0:04:56.720,0:05:01.680
-in garbage collection problems which I
-
-0:04:58.560,0:05:01.680
-had to resolve over time
-
-0:05:01.759,0:05:05.520
-so the coding instructions for this you
-
-0:05:04.320,0:05:06.800
-have to know that all instructions are
-
-0:05:05.520,0:05:08.880
-two bytes long
-
-0:05:06.800,0:05:10.240
-and the arguments encoded inside them
-
-0:05:08.880,0:05:11.440
-for example the jump to address
-
-0:05:10.240,0:05:15.120
-instruction
-
-0:05:11.440,0:05:18.400
-is encoded as one and three hex digits
-
-0:05:15.120,0:05:20.800
-the type is extracted masking with f000
-
-0:05:18.400,0:05:21.680
-and then shifting it by 12 bits mask
-
-0:05:20.800,0:05:24.000
-means the hd
-
-0:05:21.680,0:05:25.440
-performance binary end you can do the
-
-0:05:24.000,0:05:26.639
-same with the argument basement with
-
-0:05:25.440,0:05:29.520
-zero fff
-
-0:05:26.639,0:05:31.039
-and no shift if you do this long enough
-
-0:05:29.520,0:05:32.639
-you'll find common patterns for example
-
-0:05:31.039,0:05:35.280
-addresses are always encoded like this
-
-0:05:32.639,0:05:36.880
-using the last three nibbles in the code
-
-0:05:35.280,0:05:38.400
-you'll find a big count which dispatches
-
-0:05:36.880,0:05:40.070
-on the type and executes it for the side
-
-0:05:38.400,0:05:41.440
-effects
-
-0:05:40.070,0:05:43.440
-[Music]
-
-0:05:41.440,0:05:45.919
-for testing I've initially just accused
-
-0:05:43.440,0:05:47.280
-the rom until I fit ctrl g
-
-0:05:45.919,0:05:49.039
-and then use the debug command to run
-
-0:05:47.280,0:05:51.360
-the screen to a buffer
-
-0:05:49.039,0:05:52.320
-later on I found tiny roms that just
-
-0:05:51.360,0:05:55.680
-display a static
-
-0:05:52.320,0:05:57.280
-test screen for example logo and looked
-
-0:05:55.680,0:05:59.199
-whether it looked right
-
-0:05:57.280,0:06:00.960
-I added instructions as needed and went
-
-0:05:59.199,0:06:03.360
-through more and more and more roms and
-
-0:06:00.960,0:06:05.199
-later I wrote in unit test suite as a
-
-0:06:03.360,0:06:06.000
-safety net and this unit test suite it
-
-0:06:05.199,0:06:08.400
-just
-
-0:06:06.000,0:06:10.080
-sets up an empty emulator state executes
-
-0:06:08.400,0:06:10.400
-some instructions and then looks whether
-
-0:06:10.080,0:06:13.840
-the
-
-0:06:10.400,0:06:13.840
-expected side effects have happened
-
-0:06:14.880,0:06:19.120
-for debugging I usually use e-debug but
-
-0:06:17.120,0:06:20.880
-this was super ineffective because well
-
-0:06:19.120,0:06:22.960
-you don't really want to step through
-
-0:06:20.880,0:06:24.960
-big cons doing side effects for every
-
-0:06:22.960,0:06:26.880
-single cycle when it can take like 100
-
-0:06:24.960,0:06:29.680
-cycles for things to happen
-
-0:06:26.880,0:06:31.360
-therefore I've set up logging and
-
-0:06:29.680,0:06:32.720
-whenever I locked something
-
-0:06:31.360,0:06:33.919
-and couldn't figure out the error I
-
-0:06:32.720,0:06:37.039
-compared my lock output with
-
-0:06:33.919,0:06:39.199
-instrumented version of another emulator
-
-0:06:37.039,0:06:40.880
-and if the locks diverge then I have
-
-0:06:39.199,0:06:42.720
-figured out where the bug lies and could
-
-0:06:40.880,0:06:44.479
-look deeper into it
-
-0:06:42.720,0:06:46.639
-future project idea might be a chip 8
-
-0:06:44.479,0:06:50.720
-debugger but I doubt I'll ever
-
-0:06:46.639,0:06:52.639
-go into it for analysis I initially
-
-0:06:50.720,0:06:54.400
-wrote a disassembler which is a very
-
-0:06:52.639,0:06:56.160
-simple thing but super tedious
-
-0:06:54.400,0:06:57.599
-especially if you wanted to add advanced
-
-0:06:56.160,0:06:59.120
-functionality for example analysis or
-
-0:06:57.599,0:07:00.000
-thinking of what part is data what had
-
-0:06:59.120,0:07:01.840
-this code
-
-0:07:00.000,0:07:03.360
-and I had this great idea for using the
-
-0:07:01.840,0:07:05.120
-radari 2 framework
-
-0:07:03.360,0:07:06.479
-and adding analysis and disassembly
-
-0:07:05.120,0:07:08.400
-plug-in for it
-
-0:07:06.479,0:07:10.319
-so I looked into this found okay here
-
-0:07:08.400,0:07:12.160
-where you can write plugins in c
-
-0:07:10.319,0:07:13.520
-but also in python so I wrote one in
-
-0:07:12.160,0:07:15.039
-python and then the scout there's
-
-0:07:13.520,0:07:17.440
-actually existing one in core which you
-
-0:07:15.039,0:07:19.599
-have to enable explicitly by passing its
-
-0:07:17.440,0:07:21.840
-argument so I've tried it and found it's
-
-0:07:19.599,0:07:23.680
-not exactly as good as my own one so
-
-0:07:21.840,0:07:26.610
-improved this one and submitted pull
-
-0:07:23.680,0:07:28.080
-requests until it was at the same level
-
-0:07:26.610,0:07:30.160
-[Music]
-
-0:07:28.080,0:07:31.360
-rendering was the trickiest part of this
-
-0:07:30.160,0:07:34.319
-whole thing because
-
-0:07:31.360,0:07:35.759
-well I decided against using a library
-
-0:07:34.319,0:07:37.120
-not like there would have been any
-
-0:07:35.759,0:07:39.599
-usable library for this
-
-0:07:37.120,0:07:41.680
-my usual approach of accelerating svg
-
-0:07:39.599,0:07:45.120
-file was too expensive it just created
-
-0:07:41.680,0:07:47.360
-too much garbage and took too long time
-
-0:07:45.120,0:07:49.599
-I then tried creating mutating strings
-
-0:07:47.360,0:07:52.639
-this was either either too expensive
-
-0:07:49.599,0:07:55.039
-just like svgs or too complicated I
-
-0:07:52.639,0:07:57.280
-tried changing svg tiles which created
-
-0:07:55.039,0:07:59.520
-gaps between the lines
-
-0:07:57.280,0:08:00.720
-then I tried to create an xpm file which
-
-0:07:59.520,0:08:02.400
-was backed by a bull vector
-
-0:08:00.720,0:08:04.400
-administrating this bull vector
-
-0:08:02.400,0:08:06.879
-but the image caching effect made it
-
-0:08:04.400,0:08:10.000
-just every nth frame to appear which
-
-0:08:06.879,0:08:11.440
-wasn't good either then I had the idea
-
-0:08:10.000,0:08:13.280
-to just use plain text
-
-0:08:11.440,0:08:14.800
-and paint the individual characters with
-
-0:08:13.280,0:08:17.120
-a different background color this
-
-0:08:14.800,0:08:18.479
-this had perfect perfect performance
-
-0:08:17.120,0:08:20.000
-there were many optimization attempts
-
-0:08:18.479,0:08:21.840
-until I got there and it was
-
-0:08:20.000,0:08:23.199
-very very stressful I wasn't sure
-
-0:08:21.840,0:08:26.160
-whether I would ever get to accept the
-
-0:08:23.199,0:08:28.560
-performance at all
-
-0:08:26.160,0:08:30.319
-for sound you only need to a single beep
-
-0:08:28.560,0:08:31.280
-so technically it shouldn't be difficult
-
-0:08:30.319,0:08:33.519
-to emulate it
-
-0:08:31.280,0:08:34.880
-however doing this is hard because Emacs
-
-0:08:33.519,0:08:37.200
-officially only supports synchronous
-
-0:08:34.880,0:08:39.039
-playback of sounds
-
-0:08:37.200,0:08:41.360
-but there's also emax process which you
-
-0:08:39.039,0:08:43.519
-can launch in asynchronous way
-
-0:08:41.360,0:08:45.279
-so I looked into it and found that
-
-0:08:43.519,0:08:46.640
-employee has a slave mode and mpv
-
-0:08:45.279,0:08:50.880
-supports listing on the
-
-0:08:46.640,0:08:54.000
-fifo for commands so I've created a pipe
-
-0:08:50.880,0:08:55.519
-started a past mpv in loop mode and
-
-0:08:54.000,0:08:58.000
-always send in pause and pause command
-
-0:08:55.519,0:09:01.839
-to the fifo and that way I could control
-
-0:08:58.000,0:09:01.839
-when to start beeping and stop beeping
-
-0:09:02.640,0:09:07.200
-so yeah that's it so far was a very
-
-0:09:05.760,0:09:09.279
-educational experience
-
-0:09:07.200,0:09:10.320
-I have tried out a bunch of games which
-
-0:09:09.279,0:09:12.640
-were
-
-0:09:10.320,0:09:14.320
-well I almost say the worst ports of
-
-0:09:12.640,0:09:15.839
-classic games I've ever tried
-
-0:09:14.320,0:09:18.320
-it wasn't terribly fun to play them but
-
-0:09:15.839,0:09:21.760
-was fun to improve the emulator until
-
-0:09:18.320,0:09:23.279
-well things worked good enough
-
-0:09:21.760,0:09:25.120
-and I've learned a lot about how
-
-0:09:23.279,0:09:27.760
-computers work at this level
-
-0:09:25.120,0:09:28.880
-so maybe maybe I'll in the future make
-
-0:09:27.760,0:09:31.920
-another emulator
-
-0:09:28.880,0:09:34.000
-but uh I'm not sure whether anything
-
-0:09:31.920,0:09:36.560
-more advanced like intel 8080 emulator
-
-0:09:34.000,0:09:37.839
-will actually run mix fast enough
-
-0:09:36.560,0:09:39.200
-but it's still an interesting idea
-
-0:09:37.839,0:09:39.600
-because then you could actually have an
-
-0:09:39.200,0:09:41.680
-os
-
-0:09:39.600,0:09:43.120
-inside Emacs and fulfill that one
-
-0:09:41.680,0:09:45.440
-specific meme
-
-0:09:43.120,0:09:47.279
-but if I try to do most serious stuff
-
-0:09:45.440,0:09:48.000
-I'll probably use chicken scheme which
-
-0:09:47.279,0:09:49.920
-is my
-
-0:09:48.000,0:09:53.279
-preferred language for serious projects
-
-0:09:49.920,0:09:57.839
-and writing neso gamer emulator
-
-0:09:53.279,0:09:57.839
-and that's it thank you
-