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