Making an Emulator in JavaScript?


1. Introduction
Hola a todos. Gracias por estar aquí en lugar de la otra charla. Quería construir un emulador de Game Boy en JavaScript, pero resultó ser más difícil de lo esperado. Así que hablaremos sobre cómo construir un emulador en JavaScript. Mi nombre es Sarah, soy ingeniera de producto en ePilot. Estamos contratando. Soy originaria de Portugal, viví en Berlín durante cinco años. ¡Gracias!
Hola a todos. Muchas gracias por estar aquí en lugar de la otra charla muy interesante que está sucediendo ahora mismo. Lamento que nos hayan puesto a ambos al mismo tiempo. Así que si han visto el horario antes, como hace dos días o como hace una semana, en realidad decía construir un emulador de Game Boy en JavaScript, así que sabemos cómo fue eso. Pero básicamente, ese era mi plan principal porque pensé que sería fácil. Pensé, solo haré un emulador de Game Boy. Resulta que eso es realmente difícil. ¿Quién lo hubiera pensado, eh?
Y básicamente, sentí que muchas de las cosas que aprendí en el camino harían una buena charla por sí mismas, no porque no lo hice, sino porque quería darles la mejor charla posible. Así que pasó de esto a simplemente construir un emulador en JavaScript. Así que de eso vamos a hablar. Como dijo Nathaniel, mi nombre es Sarah. En realidad, ya no trabajo en Orama, pero olvidé decírselo. Soy ingeniera de producto en una empresa llamada ePilot. De hecho, estamos contratando. Quiero decir, también estamos trabajando. Y soy de Colonia. Así que vengan a unirse a nosotros. No tienen que unirse a nosotros en Colonia. Vivo en Londres. Está bien. Quiero decir, también pueden... Colonia suena bien. Ya saben. Sí. Así que sí. Nuevamente, soy originaria de Portugal. Viví en Berlín durante cinco años. Odio el aeropuerto. Pero eso es todo lo que necesitan saber sobre mí. Muchas gracias.
2. Emulation and Types
La emulación es cuando algo pretende ser otra cosa, como un ordenador pretendiendo ser una PlayStation 1. Hay dos tipos de emulación: emulación de hardware, donde el hardware es el mismo o similar pero no fabricado por el fabricante original, y emulación de software, que es en lo que nos centraremos.
Bien, quiero comenzar la charla diciendo que lo que voy a mostrarles es definitivamente legal. Y hay dos razones por las que puse esta diapositiva. La razón uno es que siempre quise una diapositiva como esta en las charlas que hice. Pero la razón dos es que creo que hay una gran idea errónea sobre la emulación y el hecho de que es ilegal. Y no sé cómo en muchos países se ha vuelto legal o cuál es el precedente. Conozco el de EE. UU. No soy estadounidense, pero siento que todos somos estadounidenses de una manera extraña. Así que ahí lo tienen. Así que en EE. UU. , allá por el año 2000, había una empresa llamada Bleep. Lo juro por Dios, es una empresa real. Y la llamaron Bleep. Y hicieron un emulador de PlayStation 1 para Macs, de todas las cosas. Y le pidieron a Sony su bias, que era algo propietario de Sony, para que pudieran hacer el emulador. Sony dijo, nueve. Y ellos dijeron, está bien, entonces haremos el nuestro. Y hicieron el emulador, lo lanzaron en MacOS. Y hay videos de Steve Jobs diciendo, podemos ejecutar videojuegos en un Mac. Ya no, pero se podía en el año 2000. Ahora necesitas un Linux. Pero sí. Y luego Sony los demandó. Y ellos dijeron, no puedes hacer esto. Y resulta que no podían, porque no tenían ningún código propietario. Así que lo contamos como ingeniería inversa, que generalmente está protegida por la ley. Si se preguntan qué pasó con Bleep, Sony los compró y mató el emulador. Pero hicieron un montón de dinero. Así que eso es bueno. Genial.
Sin embargo, no soy abogado. Así que no te metas con Nintendo. En serio, no te metas con Nintendo. Bien, ¿qué es la emulación? Así que la emulación, lo voy a decir así, la emulación es cuando algo está pretendiendo ser algo más. Así que mi ordenador pretende ser una PlayStation 1, ya sea a través de software o hardware. Y puede ser, se usa principalmente para videojuegos, pero también puede usarse para sistemas operativos reales. Como, creo que puedes ejecutar Windows 95 en el navegador, lo cual es una maldición, pero ¿por qué no? Si puedes hacerlo. Todo lo que se puede escribir en JavaScript eventualmente se escribirá en JavaScript. Supongo que ahora TypeScript. Pero sí. Así que digamos que tienes este ordenador, y este ordenador es como, no, en realidad soy una PlayStation. Así que puede leer ese código, interpretarlo, ejecutar las instrucciones que se supone que debe ejecutar, y hacer la cosa. Sin embargo, hay dos tipos de emulación, y quiero asegurarme de que sepamos la diferencia en lo que realmente vamos a estar hablando. Así que hay emulación de hardware, y digamos que realmente sabes cómo hacer chips. ¿Verdad? Tienes ese software elegante y envías todo a la única empresa que patrocina a todos los YouTubers. Y eso es básicamente, digamos que tienes un chip para un Game Boy, y haces las partes exactas, así que realmente podemos leer el juego. Es emulación de hardware. El hardware es exactamente el mismo o muy similar, solo que no hecho por Nintendo, o Sega, o lo que sea. Pero esto no es de lo que vamos a estar hablando.
3. Software Emulation and Chip 8
La emulación de software es cuando el software imita el comportamiento de una consola. JavaScript no es el lenguaje ideal para la emulación, pero disfruto construyendo cosas poco convencionales. En lugar de emular un Game Boy, creé un emulador para Chip 8, una consola simple de los años 70. Las especificaciones de Chip 8 están bien documentadas, lo que facilita la comprensión de los conceptos de emulación. La mayoría del software tiene cuatro partes principales: hardware, pantalla, teclado o gamepad, y sonido. CHIP-8 tiene un teclado y produce sonidos simples de beep.
Así que es cuando das tu archivo de juego, que generalmente se llama Rome, o cualquier archivo. A veces son 10 archivos. A veces es un archivo zip. Pero entonces tienes este archivo, lo pones, y el software básicamente dice, oh, yo sé lo que es esto. Déjame intentar hacer exactamente lo mismo que haría esta consola. Así que eso es emulación de software. Y de eso vamos a hablar. No voy a enseñarte a construir chips. Si puedes enseñarme a hacer chips, sería genial.
Bien. Entonces, ¿por qué hacerlo en JavaScript? ¿Por qué no? Como, no es el peor lenguaje, quiero decir, no es el peor lenguaje para hacer esto, para ser justos. Eso probablemente sería CSS. Pero, es un lenguaje terrible para hacer esto porque, bueno, la emulación se ejecuta en un nivel muy bajo. Simplemente no deberías hacer esto en JavaScript. Pero me gusta construir cosas malditas. Como, las cosas malditas me traen alegría. Cosas que no deberían existir. Y como la emulación en JavaScript, simplemente no debería existir, ¿verdad? Genial. Bien. Ahora, en lugar de hacer un emulador de un Game Boy, lo cual sería mucho más interesante, y entonces podría traer un Game Boy, no hice eso. Hice un emulador para algo llamado Chip 8.
Así que Chip 8 es una consola muy antigua de los años 70. Y la razón por la que lo hice para esto, y probablemente nunca lo usaste, nunca has oído hablar de él, es literalmente porque Chip 8 solo es conocido por las personas que hacen emuladores, porque es como el primer emulador de bebé. Es muy simple. Así que es como lo primero que aprendes a emular para luego poder ir a pastos más verdes y ser demandado. Chip 8 no te va a demandar. Es de código abierto. Pero también hay una razón muy grande por la que la gente usa Chip 8, es que todas estas especificaciones, como lo que hace cada instrucción, están documentadas en línea, literalmente en Wikipedia. Así que creo que fue hecho en Francia. Y básicamente, ya no tienes que hacer la ingeniería inversa, todo eso. Puedes simplemente mirarlo y decir, oh, esto hace esto, esto limpia la pantalla, por ejemplo. Así que es mucho más fácil comenzar, entender cómo los otros conceptos de emulación, cuando ya tienes todo esto, ¿verdad? Probablemente. No sé.
Bien. Así que la mayoría del software, la mayoría del software, la mayoría de las consolas de juegos, computadoras, lo que sea, iPods, los iPods tienen cuatro partes. Tienes el hardware, y el hardware puede ser como el Rome, la RAM, como la CPU, todos los pequeños cables. Tienes la pantalla. Y sí, tienes la pantalla. A veces. A veces no tienes una pantalla. Tienes un teclado o un gamepad. Así que en el caso de CHIP-8, tienes un teclado. Por eso hay un teclado. Y tienes sonido. Bien. Así que dos cosas, no voy a hablar sobre el teclado y el sonido, porque el único sonido que hace CHIP-8 es como un beep. Como, solo hace beep, y eso es todo. Solo tienes que hacer un sonido cuando te dice que hagas un sonido. No hay modulación ni nada.
4. JavaScript Emulation and the Chip 8 Screen
El teclado, la pantalla, los sprites y el sonido son las cuatro partes principales que se encuentran en la mayoría de las consolas. En la emulación con JavaScript, la pantalla es la parte más sensata en la que centrarse, utilizando Canvas. Sin embargo, para consolas como la Mega Drive, usar sprites es más fácil que dibujar en el Canvas. La pantalla de Chip 8 es pequeña, mide 64 por 32, y es monocromática, permitiendo solo un color.
Y el teclado es simplemente, ya sabes, ad event listener. Como, window ad event listener cuando haces clic en la tecla K y haces la cosa. Sí. Así que estas son las cuatro partes que suelen ser estándar en casi todas las consolas, cada computadora, todo. Y de todas estas, ¿cuál crees que tiene más sentido hacer en JavaScript? Probablemente la pantalla, ¿verdad? Como, tenemos Canvas. Eso tiene sentido. Como, eso es realmente un buen uso de JavaScript, a diferencia de los beeps y los boops. Pero como, solo los beeps. No boops. Solo un sonido. Así que pantalla.
Cuando estaba comenzando esta charla, como, cuando estaba comenzando a escribir este emulador, pensé que, como, está bien, digamos que tienes un juego de Game Boy y quieres poner Super Mario en él. Honestamente, ahora solo voy a referirme a Sega. Me hace sentir más seguro. Digamos que tienes un juego de Mega Drive y quieres poner Sonic en él. Pensé que tendrías que, como, dibujar a Sonic en el Canvas. Y eso, honestamente, usar Canvas es más aterrador para mí que construir un emulador. Como, simplemente no. No lo es. Resulta que no es así como funciona. Como, este no es el caso aquí tanto porque, ya sabes, es monocromático y todo. Pero digamos que estás haciendo esto para la Mega Drive. ¿Es ese el nombre europeo? Sí, ese es el nombre europeo. La Mega Drive o Genesis, si eres de EE. UU., usa sprites. Así que realmente solo tienes que, como, obtener el sprite y ponerlo. Así que es más fácil. No tienes que dibujar el sprite. Solo tienes que obtenerlo. Y eso es mucho más fácil, porque ahora no tengo que escribir código para Canvas. Dios. Bien. La pantalla para Chip 8 es muy pequeña. Es de 64 por 32, lo cual es básicamente incomprensible para nosotros ahora. Quiero decir, también tengo muy mala vista, pero me niego a usar gafas. Así que puede ser eso. No estoy seguro. Para ser justos, usé gafas desde que tenía dos años. Resulta que solía caminar por la casa con un ojo en el medio, y mi mamá pensó que estaba, me envió a una bruja. La bruja le dijo que fuera al hospital. Deberías visitar Portugal. Es genial. Así que 64 por 32. Y es monocromático. Lo cual en la era actual no significa que sea blanco y negro. Significa que solo puedes tener un color. Así que tienes el fondo que sea, que es básicamente solo un canvas, y luego tienes un relleno. Puede ser naranja si quieres. Eso depende de ti. No lo voy a hacer. Voy a poner blanco.
5. JavaScript Emulation and the Screen Class
La pantalla se exporta como una clase llamada screen. Toma un scale y un elemento canvas como parámetros. Se crea un array de celdas y se llena con ceros, representando los estados de los píxeles. Los colores pueden personalizarse, por defecto son blanco y negro. La función setPixel permite establecer píxeles individuales en el canvas.
Pero sí. Esa es la pantalla. Así que es algo bastante simple, ¿verdad? Para. No muy femenino. Bien. Así que exportas un nombre de clase llamado screen, y le pasas un scale, porque de nuevo, 64 por 32 es imperceptible para el ojo humano. Básicamente no es nada en este punto. Así que le pasas un scale, y le pasas un elemento canvas, que es un canvas normal, un elemento canvas de HTML. Esto originalmente estaba en TypeScript, pero el código se hizo demasiado grande. Así que quité los tipos, pero es un elemento canvas de HTML, y el scale es un entero.
Bien. Así que luego creas this.display, y creas un array de las llamadas por las filas, que es 32 por 64, y simplemente lo llenas con ceros. Lo que significa que esto no está lleno. Porque solo tienes uno. Está encendido o apagado. ¿Verdad? Así que puedes simplemente crear un array de ceros, y luego cuando hay un uno, dices, mierda, necesito encender este píxel. Y luego tienes el scale, canvas, bla, bla, bla, y obtienes el contexto. Eso es muy estándar. Bien. Y luego tienes this.colors. Así que puedes pasar colores si quieres. De lo contrario, es solo un relleno. Es negro, y el fondo es blanco. Principalmente lo hice al revés, pero seguro. Y básicamente después de esto, todo lo que necesitas hacer es multiplicar las llamadas y las filas por el scale. ¿Verdad? ¿Tiene sentido hasta ahora? Esta es la parte que debería hacerse en JavaScript. Así que sí. Y luego obtienes un canvas, y luego puedes crear algo llamado setPixel. Y si pasas, como, ¿qué columna es? ¿Qué fila es? Oh, este debería ser el otro color. Eso es genial. Genial.
6. The CPU and Memory in Emulation
El CPU tiene 4,096 ubicaciones de memoria, cada una de 8 bits, permitiendo números hasta 255. Los juegos antiguos se reiniciarían a cero después de alcanzar 255. Los juegos europeos pueden verse afectados. El CPU también tiene 16 registros de datos de 8 bits. Al cargar un juego, necesita transformarse en un array de unidades de ocho bits. Comprender la notación hexadecimal y los operadores bitwise es crucial para el desarrollo de emuladores.
Así que ahora hablemos del CPU, y esta es la parte que está maldita. Y no creo que debas hacerlo en JavaScript. Ni en TypeScript. Ni. Wow. Bien. Así que el CPU tiene 4,096 ubicaciones de memoria, y todas son de 8 bits. ¿Qué significa eso? Significa que solo toma un número hasta 255. Así que si alguna vez has jugado juegos realmente antiguos, quiero decir, todavía sucede hoy, pero obviamente con números más grandes. Y llegaste a algo de 255, y luego volvió a cero. Por eso. Porque no podía manejar números más grandes que eso. Así que era como, ya sabes qué? No. Simplemente volvió a cero.
También probablemente significa que tienes un juego europeo. Así que 16 registros de datos de 8 bits. ¿Qué son los registros de datos? Son pequeñas partes del hardware que pueden realmente mantener datos en ellos. Así que puedes acceder a esos datos. Así que digamos como una puntuación alta. Como que siempre puedes acceder a esa puntuación alta, por ejemplo. Así que este es un juego. Este es Breakout. ¿Cómo crees que se ve si lo cargo en la computadora? Porque mi pensamiento era, como un emulador dev bebé. No, lo opuesto. Espera, ¿un bebé? No. Lo que sea. Lo que sea que dijeron que no pude escuchar. También tengo mala audición. El punto es, simplemente no soy un muy buen humano en general. Así que como, esto es lo que ves. Así que cuando lo cargas, como alguien que no sabía lo que estaba haciendo, pensé que iba a obtener el código. Que en este caso, creo que es como Z80 assembly. Y pensé que iba a tener que analizar el Z80 assembly. Ya sabes, como Babel. O algo así. Pero no. No, no, no. Eso sería demasiado fácil. Así que lo que tienes que hacer es transformar todo esto que obtienes en un array de unidades de ocho bits. Y así es como se ven. Este es el mismo juego exacto, pero en un array de unidades de ocho bits. Y llegas a un punto en tu vida donde dices, TypeScript no puede ayudarte aquí. Estos son solo números en este punto. Estás como, no sé qué hace esto. Pero puedes averiguarlo.
Así que una cosa muy importante es que, como, dos cosas, no una, dos cosas que son muy importantes cuando estás aprendiendo a hacer emuladores es la notación hexadecimal y los operadores bitwise. Así que vamos a hablar sobre la notación hexadecimal primero. Y me voy a calmar un poco. Ahí vamos. Así que notación hexadecimal.
7. Hexadecimal Notation and its Uses
La notación hexadecimal permite representar números usando letras, ahorrando espacio de memoria. La notación hexadecimal va de cero a F, en lugar de cero a nueve. Cada dígito en notación hexadecimal se llama nibble, y dos nibbles forman un byte. La notación hex se asocia comúnmente con colores, como el blanco representado como FFFF. La notación hex se puede convertir a decimal multiplicando cada dígito por potencias de 16 y sumando los resultados. La notación hex es una representación ampliamente conocida, a menudo utilizada para describir colores y sus intensidades.
¿Por qué usarla y qué demonios es? Así que la notación hexadecimal, en lugar de ir de cero a nueve, que es la forma decimal, va de cero a F. Y sé que esto te lleva de vuelta a como el grado 11 o como sea que lo llames de donde eres. Pero como el año antes del último año de la escuela secundaria donde pusieron letras en tu matemáticas? Es básicamente eso. Es básicamente eso. Pusieron letras en mis matemáticas. Y ahora estoy poniendo letras en tus números. Entonces, ¿por qué hacer esto? ¿Por qué? La cosa es que, las computadoras y sistemas antiguos tenían muy poco espacio y memoria y simplemente grandes limitaciones. Así que escribir F es mejor que escribir 15. Es un byte menos. Y quieres ahorrar todos los bytes que puedas. Así que básicamente es eso. Esa es la razón principal por la que existe. Y puedes, ya sabes, ya dije esto. Pero los colores hex, de ahí viene el nombre. Así que veamos el blanco. Así que el blanco es FFFF. Y para que un número sea un máximo de 255, solo puedes tener dos bytes, que son las dos letras o dos números. Pueden ser dos letras o dos números. Cada uno de ellos, puedes llamarlo un nibble. Hay otros nombres, pero me gusta la palabra nibble. Así que tienes tres conjuntos de dos nibbles, ¿verdad? ¿Y cómo transformas esto en decimal? Matemáticas. Así que nos vamos a centrar en uno, y tienes un F, dos, y luego el segundo F comenzando desde la derecha, así que comenzamos en el amarillo. Bien. ¿Qué demonios? Bien. Así que F es 15, ¿correcto? Sí, Sarah. Bien. Y esta es una notación hexadecimal, lo que significa que es 16. Es de cero a 16. Así que lo multiplicas por 16, y la potencia es qué tan lejos estás desde la derecha comenzando en cero. Así que el primero es 15 veces 16 a la cero, ¿verdad? Y el segundo es 15 veces 16 a la potencia de uno, y ¿qué te da eso? Eso básicamente te da 15 veces 16 más 15 veces uno, porque cualquier cosa a la potencia de cero es uno. Así que básicamente obtienes 240 más 15, y ¿qué te da eso? Lo sé. Estoy serio. 255. Así que si sumas los tres juntos, obtienes 255, 255, 255, que es el color blanco. Así que básicamente, la notación hex es muy conocida para nosotros. Simplemente no lo pensamos así. De hecho, tenía estas tres diapositivas tratando de explicar la notación hex, y mi compañero simplemente dijo, ¿por qué no usar colores? Y yo estaba como, ¿los colores? Oh, los colores, querido. Sí, así que algunas personas incluso pueden decir cuánto verde tiene algo por la notación hex de ello. Así que solo piénsalo como de cero a 15, F es 15, de derecha a izquierda.
8. Bitwise Operators in JavaScript
Los operadores bitwise se utilizan para manipular bytes y combinar valores hexadecimales en JavaScript. El operador end compara los bits de dos valores y devuelve un uno si ambos bits son uno. El operador or devuelve un uno si cualquiera de los bits es uno. El operador xor devuelve un valor positivo si uno de los bits es positivo. Por ejemplo, al usar 12 y 10, el resultado es dos.
Luego tienes operadores bitwise. No se deben usar operadores bitwise en JavaScript. Así que digamos que tienes un byte y quieres desplazar este byte, o quieres combinar dos valores hexadecimales juntos, y quieres obtener solo una parte de ello o algo así como eso. Así es como lo haces. Así que este es un operador end, y básicamente, digamos que tienes 12. Oh, sí. Olvidé decir esto. Solo puedes usar esto para mostrar valores hexadecimales en JavaScript. De lo contrario, piensa que es una cadena. Así que esto le dirá a JavaScript, no asumas que esto es una cadena. Esto es un número. Déjame en paz. Genial. Así que end será básicamente como, OK, vamos al primero. Es un uno, y el otro es un uno, así que estamos haciendo un uno. Y el segundo, dos y cero, no son ambos iguales. No son ambos positivos. Entonces estamos haciendo un cero. Or es lo mismo pero diferente. Así que or es básicamente como, OK, uno de ellos es un uno cualquiera, y el otro definitivamente no es un cero, así que estamos haciendo eso. Y esto es xor, que básicamente significa que si uno de ellos, ambos son positivos, se convertirá en negativo. Y si solo uno de ellos es positivo, entonces serás positivo. Así que en este caso, si tienes 12 y 10, básicamente tendrás dos, porque el uno fue eliminado. Correcto.
9. Creating a Switch Statement for Instructions
Después de discutir las instrucciones y convertirlas en hexadecimal, el siguiente paso es crear una gran declaración switch. El código de operación determina la acción específica a realizar. Cada caso corresponde a un valor específico de nibble en el código de operación. Por ejemplo, si el nibble es cero, el renderizador se borra. Este proceso se repite para cada instrucción. El emulador aún está en desarrollo.
OK. Así que tenemos estas instrucciones. Estoy en la unidad ocho en array, y podemos convertir esto en hexadecimal. ¿Qué hacemos, entonces? ¿A dónde vamos desde aquí? Bueno, ahora tenemos que decirle a la computadora qué hacer. ¿Y cómo le dices a algo con muchas opciones qué hacer? Creas una gran declaración switch. Todo el código es una declaración switch. Pero incluso he visto emuladores que estaban en Rust o algo así, y piensas, wow, hicieron que Rust se viera mal. Eso es increíble.
OK. Así que obtienes un código de operación. Digamos que tu código de operación es FFFF, ¿verdad? Y lo que esto significa, como cuando estás haciendo esto, creo que puedo seleccionar cosas. Sí. Significa que básicamente estás diciendo, no quiero estos tres primeros nibbles. Solo me importa este. Ahí vamos. Solo me importa este. Porque ese, si es cero, será cero. Pero si es otra cosa, entonces mantendrá ese. ¿Tiene sentido? Ustedes están captando esto mucho más rápido que yo. OK. Así que estamos haciendo el caso cero. Solo significa que, OK, este nibble era cero, básicamente. Como el del código de operación era cero. Genial. Y si, en ese caso, queremos verificar, OK, ¿fue lo que obtuvimos 00E0? Y si lo fue, entonces limpias el renderizador. Significa que el juego ha terminado, o estás renderizando un nuevo cuadro o algo así. ¿Fue esto? Entonces sacas la pila. Así que básicamente solo tienes que hacer esto para cada instrucción. Así que ahora, este es todo el código de esto, que es solo muchas de las mismas instrucciones. Así que todo lo que ves aquí es principalmente de las cosas que he explicado. Hay algunas cosas en operadores bitwise donde desplazas los bits. No vamos a entrar en eso. Pero sí. Como puedes ver, estas son principalmente las mismas cosas que te he dicho antes. Solo mucho de eso. Aún no está terminado.
Oh, ahí vamos. OK, genial. Espera. ¿Nunca puse esto en pantalla completa? Oh, OK, genial. OK. Y ahora, voy a mostrarte el emulador real. Puede que tenga que recargar la pantalla. Así que este es el emulador real – oh, Dios mío. No soy muy bueno en esto. Pero este es el emulador real. Esto es solo una imagen. Espero que puedas decir que no – El emulador está dentro de él. Me tomó mucho tiempo, OK? Tuve que poner esto en Photoshop, Photoshop falso, photopea, y hacerlo ver bien.
10. Using the Chippy Emulator
El emulador funciona y se puede instalar desde npm o GitHub. El presentador no tiene apego al código. Las diapositivas están disponibles a través de códigos QR.
Pero básicamente, sí. Funciona. Renderizo cosas en la pantalla, y aparecen. Y funciona bastante bien. No increíble, pero suficiente. Dios mío. Por el amor de Dios, conseguiré uno. Gracias. Ahora estamos bien. Puedo continuar. OK. Vienes aquí al escenario y juegas videojuegos. Si quieres instalarlo, lo puse en npm en mi nombre slash chippy, porque es un emulador chippy, y es lindo. Lo entiendes. Lo entiendes. También está en GitHub bajo mi nombre slash chippy. Así que puedes instalarlo. Haz lo que quieras con él. No tengo ningún apego a mi código, principalmente cuando es solo un montón de declaraciones switch. OK. Sí. Muchas gracias. Puedes encontrar las diapositivas en el primer QR, y ese es mi cielo azul en el segundo. Quiero decir, depende de dónde estés mirando. Pero, sí. Muchas gracias, y que tengas un gran día.
11. Emulation Legality and Advice
El presentador discute la legalidad de la emulación y aconseja no proporcionar ROMs, juegos y BIOS propietarios. Emular consolas antiguas generalmente es seguro, pero emular consolas actuales como la Switch es ilegal. Ganar dinero con proyectos de emulación puede llevar a problemas legales, mientras que los proyectos de aficionados para consolas como la Mega Drive probablemente no enfrenten consecuencias legales.
Así que estaba a punto de preguntar, porque cuando estabas haciendo tus diapositivas, y luego en un momento simplemente dijiste, oh, ¿puedo resaltar esto? Y luego resaltaste el código. Mi cerebro tuvo que, más o menos – Oh, sí, era reveal.js en React. ¿De reveal.js? Eso es bastante genial. Bastante genial. Muy bien. Recuerden, amigos, pueden agregar sus preguntas, y vamos a ir a la que – volveremos a la que tenga más votos. Primero hablemos de – así que comenzaste la charla diciendo que no eres abogado. No soy abogado, no. Y tú – pero ¿alguna vez has visto algún – solo quiero rápidamente – creo que las preguntas se están moviendo, pero ¿tienes algún consejo para alguien que tal vez quiera entrar en la emulación, que tal vez esté un poco preocupado por, como, cuál es la manera correcta de hacerlo? ¿Hay algún consejo solo para eso en general?
Quiero decir, sí. Nunca proporciones ROMs. Como, nunca proporciones juegos, y nunca proporciones BIOS, que es propietario de quien lo hizo. Pero en general, si es una consola antigua, a nadie le importa. Como, Nintendo o Sega no van a ir tras de ti a menos que decidas emular una Switch porque todavía está vigente. Como, no emules algo que todavía está vigente. Eso no es realmente emulación. Eso es, ya sabes. No puedes hacer eso. Eso es ilegal. Y también, supongo que hay algo diferente entre construir algo para ti mismo y solo para aprender cómo construirlo versus construirlo para – La mayoría de las cosas con las que tuve problemas en los últimos par de – No sé si alguno de ustedes sigue ese tipo de cosas, pero dos emuladores de Switch recibieron un strike de copyright. Y básicamente, como, gran parte de la razón es que estaban ganando dinero a través de Patreon por ello. Así que, como, ese es gran parte del problema, es como, si quieres trabajar en esto, probablemente no puedas ganar dinero porque usarán eso en tu contra. Justo, justo. Pero también, como, si estás haciendo algo para, como, la Mega Drive, nadie te va a demandar. Como, eso es todo. A Sega no le importa. Mira toda la mierda rara de Sonic que tienes en línea. Si van a demandar a alguien, van a demandar a DeviantArt. No, justo.
QnA
Emulation Projects and Reverse Engineering
El presentador discute la elección de la notación hexadecimal y la complejidad de los proyectos de emulación. Hablan sobre trabajar en el emulador de Chip8 e intentar hacer un emulador de Game Boy. También se menciona el proceso de ingeniería inversa de una consola. El presentador expresa una preferencia por los operadores switch y su uso en el trabajo.
Justo. Tenemos una pregunta de Skulls. Si se usa hex para reducir la cantidad de bytes, ¿por qué no usar una notación base que aproveche todas las letras? Creo que en ese momento esta fue la que decidieron usar. Honestamente, no creo que haya, como – Creo que ahora mismo si eso fuera una opción, probablemente se usaría. Pero, como, creo que en ese momento esto era, como, lo que funcionaba en todas partes. Sí, y también siento que – y ahora me siento realmente mal por no recordar exactamente cómo surgió el hexadecimal, pero creo que fue una cosa, y puede haber sido que en aquellos días había una explicación muy legítima de por qué. Que no tenemos ahora. Que no tenemos ahora, pero buena lección de historia que podría venir y ser una herramienta la próxima vez.
¿Cuál es el proyecto de emulación más complicado en el que has trabajado? Así que sé que hablaste de que comenzaste con – ¿cuál era el nombre de la biblioteca de nuevo? ¿El juego que usaste? Oh, intenté hacer un Game Boy primero. Game Boy primero, y luego en su lugar usaste – Usé Chip8. Chip8. Lo siento, eso fue lo que olvidé. Así que Chip8 es, como dijiste, donde mucha gente puede comenzar. ¿Has intentado ir más avanzado? ¿Ha habido algo que sea realmente complejo? Por lo que he visto hasta ahora, básicamente vas, como, Chip8, y luego Game Boy, y luego puedes hacer cosas como NES o cualquier tipo de sistema de 8 bits. He visto cómo hacer uno de Game Boy, y no creo que la mayoría de ello sea increíblemente diferente. No tengo idea de cómo hacer sonido. Y, como, si lo miras en línea, si vas, como, emulador de Game Boy JS, tres cuartas partes de ellos son, como, el sonido no funciona. Y yo, como, me pregunto por qué. Como, esto fue lo principal que estaba buscando en Google, ¿cómo está haciendo la gente esto? Nunca he usado mucho la API de audio. Y, como, todos ellos son, como, sí. Así que, sí, creo que la parte más difícil que he intentado hacer fue, como, cuando comencé a hacer este emulador, pero creo que mucho de ello vino del hecho de que simplemente pensé, puedo simplemente recogerlo, y simplemente recogerlo, simplemente hacerlo. Sabes, como, esto es realmente viejo, está bien. Y supongo que simplemente poder recoger algo es una buena razón para comenzar un proyecto.
Tenemos a Leo, quien primero dice que esto fue increíble. ¿Cuál es la próxima consola? ¿Hay otra consola en la que te gustaría trabajar? ¿Todavía vas por el Game Boy? Oh, definitivamente estoy haciendo el, como, haciéndolo emulado en Game Boy Talk. Genial, ¿qué tan lejos has llegado? Supongo que tienen muchos más opcodes que necesitas listar. Sí, básicamente, así que necesito pasar por el, así que, como, obviamente un Game Boy no es de código abierto, como chip A, pero ha habido mucha gente a lo largo de los años que ha hecho el trabajo de, como, ingeniería inversa de todos los opcodes que entran. Así que eso es lo principal en lo que estoy trabajando ahora mismo es asegurarme de que sé qué, como, todos estos opcodes hacen y qué se supone que deben hacer, básicamente. Esa es una buena pregunta, y solo estoy deslizando mi pregunta aquí, beneficio de ser un maestro de ceremonias. Entonces, ¿cuál es el proceso de ingeniería inversa de una consola? Tal vez, ¿sabes, como, cómo lo hacen? Porque no es algo que esté documentado públicamente. ¿La gente simplemente, cuál es la palabra? ¿Cómo hacen ingeniería inversa? Creo que mucho de, creo, no estoy realmente seguro, solo estoy hablando sin saber ahora mismo, pero creo que, como, primero que nada, necesitas saber cómo hacer juegos para ella, ¿verdad? y luego a partir de eso puedes ver lo que la consola está haciendo, porque también sabes lo que realmente, como, lo que está leyendo, como, sabes el opcode que está leyendo para hacer eso, y luego desde allí puedes intentar y descubrirlo, pero para eso necesitas modelar la consola antes, así que necesitas mucho conocimiento en hardware, ¿verdad? porque no puedes simplemente hacer un juego para, como, el Game Boy y funcionará. No funcionará. Como, tienes que, como, hacer el cartucho, hacer todo bien para él, y luego puedes probarlo. Así que en mi, creo que así fue como se hizo, como, tenías, como, cartuchos de prueba para estas cosas, y, como, harías clic derecho, y sabrías, como, está bien, esto es lo que le dije que hiciera, y hizo clic derecho. Así que, como, es solo mucha gente que es muy buena en cosas muy específicas. Muy bien. Así que si estás interesado en la ingeniería inversa, estoy bastante seguro de que podrías escribir una charla tal vez el próximo año y explicarnos algo de eso. Realmente me gustaría. Sí. Tenemos a Victoria que ahora está preguntando, ¿por qué usaste un switch en lugar de algo como un mapa? Voy a ser honesto. Me gustan los switches. Me gustan los operadores switch. Creo que son buenos. No creo que sean malos. No sé por qué y cuándo empezamos a pensar que eran malos. Como, no se ve bien, pero, como, está bien. Es bueno. Está bien. Como, creo que es más legible para mí usar un operador switch.
Emulating Consoles and High Scores
El presentador discute el rendimiento de JavaScript en la emulación de consolas, mencionando que JavaScript puede manejar consolas de hasta 16 a 32 bits, con el uso de WASM permitiendo la emulación de la PS2. También mencionan su disponibilidad para más preguntas fuera de la sesión y proporcionan información sobre cómo seguir su trabajo. La pregunta favorita del presentador fue sobre su puntuación más alta, que fue 10, en una consola no tan receptiva.
Genial. Ven a trabajar con nosotros. La siguiente, esta es otra anónima. ¿Es JavaScript lo suficientemente rápido para emular consolas como una Game Boy Advanced? Game Boy Advanced, sí. Cualquier cosa después de 16 bits, no lo creo. Hay – oh, no, en realidad, hay – si usas WASM, puedes emular la PS2. PCS2 tiene un emulador que puede funcionar en la web. Así que eso es bastante impresionante. Pero creo que eso es principalmente si usas WASM. Cualquier cosa por encima de, como, 16 a 32 bits. 32 bits es – la PlayStation 1 es en realidad de 32 bits, no de 64. Así que, como, cualquier cosa hasta PlayStation probablemente sea posible. Quiero decir, es posible. Cualquier cosa por encima de eso, creo que empezarías a tener cuellos de botella, probablemente.
Justo. Sé que hemos terminado – básicamente estamos fuera de tiempo. Y hay muchas más preguntas que la gente puede encontrarte en el Q&A de los ponentes afuera. Pero también, ¿dónde puede la gente simplemente encontrar y seguir tu trabajo en general? Oh, sí, había un código QR. Había un código QR. Y también, siéntanse libres de seguir a Sarah en línea también.
Y de esas preguntas que tuviste – disculpa, de esas preguntas que tuviste, ¿cuál fue tu favorita? Hubo alguien que preguntó cuál era mi puntuación más alta, y lo siento, pero elijo esa. Bueno, sí, no puedo verla. La vi allí. Sí, la vi, y desapareció. Pero ¿cuál fue tu puntuación más alta en eso? Creo que fue como 10, y estaba realmente orgullosa. Realmente orgullosa. Porque eso es como – esto no es receptivo. Voy a ser honesta. No es una buena consola. Bueno, 10 es una puntuación sólida, Sarah. Gracias, gracias. Muchas gracias. Por cierto, la persona que hizo esa pregunta, ven a encontrar a Sarah para obtener tu premio también, y démosle un aplauso más. Gracias.
Comments