πBacteria, emulador Bare Metal para la Raspberry Pi

Sinclair QL, ZX81, +2, +3, 128K ...
ZX-81
Commodore 128
Commodore 128
Mensajes: 117
Registrado: 04 Ene 2013, 16:43
Sistema Favorito: Spectrum +2
primer_sistema: ZX81
consola_favorita: Nintendo DS/3DS
Primera consola: Sega Genesis/Megadrive
Ubicación: La orilla del mar Mediterráneo
Gracias dadas: 15 veces
Gracias recibidas: 23 veces
Contactar:

Re: πBacteria, emulador Bare Metal para la Raspberry Pi

Mensajepor ZX-81 » 25 Oct 2014, 17:17

antoniovillena escribió:
ZX-81 escribió:Aún así es una tarea tremenda. Sigo igual de pasmao que antes... :D


Como curiosidad los registros del Z80 van mapeados a registros del ARM, ya que este último tiene de sobra e implementarlo así es más eficiente que ir leyendo y escribiendo en memoria. Hay instrucciones muy sencillas del Z80 que se emulan con una sola instrucción, por ejemplo RST 0 o todas las LD, sin embargo hay otras muy complicadas como los flags indocumentados y el registro MEMPTR. En conjunto son casi 6000 líneas de core Z80, que parece mucho si las comparas con las 500 del resto del emulador pero que a base de macros y tablas en realidad equivalen a muchas menos (no sé, 3000?).


Aunque lo quieras hacer ver como sencillo, tiene su miga. Y gracias a que tienes sobrada experiencia en la emulación del Z80, que si no... :D

antoniovillena escribió:
ZX-81 escribió:Eso es cierto si el objetivo que te planteas es aprender ASM, lo que es tu caso. El emulador solo es la excusa. Y aún así, la ingeniería inversa está al alcance de pocos y, en algunos casos extremos como el chip gráfico, al alcance de casi ninguno.


Para esto hay un monitor de arranque:
https://cowlark.com/piface/doc/stable/doc/index.wiki

La ingeniería inversa es un concepto muy amplio, desde examinar el código fuente del sistema operativo hasta microfotografiar los chips con previo ataque ácido. La ingeniería inversa fácil está al alcance de cualquiera.


Yo no llamo hacer ingeniería inversa a ver el código fuente de nada. Llamo ingeniería inversa a investigar como funciona algo a bajo nivel sin tener ayuda de documentación o código. Ponerse a desensamblar y hacer una traza de un código que no conoces, eso es lo duro y al alcance de pocos.

antoniovillena escribió:Aún así tendrías que conocer bien los threads que se están ejecutando y matar los que no sean importantes. Y el scheduler tampoco te va a atender cuando tú quieras. Incluso corriendo sólo con el kernel cargado hay muchas cosas que pierdes con respecto a Bare Metal como el acceso directo a interrupciones.


Muchos de esos threads de kernel se crean cuando se activan determinados servicios, como los kworkers que gestionan los puertos USB cuando conectas algo. Y cuando se crean no sería muy sano matarlos. :D
Pero yo hablaba no ya de meterse tanto con el bare-metal, para lo cual efectivamente no necesitas un S.O., sino más orientado a no quedarte sin nada cuando vas a desarrollar algo y quieres que el S.O. interfiera lo menos posible. El propósito de cargar un kernel es, precisamente, descargarte de tareas como la gestión de las interrupciones. Por eso añadía un termino medio de tener unas librerías expresamente para el mundo del bare-metal que, facilitándote la tarea, no te aíslen del HW al 100%.

antoniovillena escribió:
ZX-81 escribió:Y esas librerías en C que ya existen, ¿donde están?. Tengo curiosidad por verlas. Aunque está muy claro que en tu caso el objetivo era, precisamente, el bare-metal y cualquier otra cosa te quita diversión a raudales. :D


Incluídas en el propio compilador de C. Son las librerías estándar, las que te muestran algo en pantalla cuando pones un printf. En Bare Metal no puedes hacer un printf, tendrías que inicializar un modo gráfico, cargar una fuente en memoria y crearte una rutina que te pinte pixel a pixel cada letra.


No sé si hablamos de lo mismo, porque yo entendí que ya habían ciertas librerías en C para manejar el bare-metal. Propiamente dichas, el compilador de C no lleva ninguna librería. En Linux, esa librería es la glibc del sistema y hace uso de servicios proporcionados por el kernel, así que por sí sola sirve para poco. No puedes hacer un printf si no tienes un dispositivo tty al que lanzar la salida. Hay una parte que quizá fuera utilizable, como la parte de la librería string.h, pero muchas llamadas a la glibc son meros wrappers a servicios del sistema. Si no hay sistema, no sirve la librería. Y la glibc está preparada para ser cargada en un entorno donde el kernel y el enlazador dinámico han dispuesto las cosas en memoria de una determinada manera. NI siquiera enlazando con la librería estática te serviría de mucho.

antoniovillena escribió:Un JTAG es un protocolo genérico para acceder al hardware de cualquier dispositivo, es como un estándar pero no lo es del todo porque cada plataforma requiere de su cable JTAG específico. Sirve desde para cargar programas hasta hacer depuración en circuito. El cable USB-Serie tendría que ser de estos que se usan para arduinos y cosas así, que funciona a niveles lógicos de 3.3V. Los cables serie para PC, que van a 12V, no valen. Pero vamos que por la marca del chip creo que tienes el cable bueno.


Gracias por la info. Ese cable serie yo lo uso para conectarme a puertos serie de PC (industriales, pero PC a fin de cuentas) así que seguramente trabajarán con 12V, digo yo.

antoniovillena escribió:A poco que sepas de electrónica es un circuito muy fácil de montar. Además son componentes muy básicos que puedes encontrar en cualquier tienda de electrónica de barrio. Si no, puedes decirle a alguien que te lo construya.


Hace años que no toco nada de electrónica, y ni siquiera tengo soldador a estas alturas. Un polímetro baratujo y gracias es todo lo que tengo. Veo que el circuito es fácil, pero reconoce que no es una cosa que esté al alcance de cualquiera (y puede que si lo intentara, hasta lo montaría, espero que sea como ir en bici, que cuando lo has hecho unas cuantas veces ya no lo olvidas).
Todo espacio de dimensión finita distinta de cero con producto interno tiene una base ortonormal. Tiene sentido, cuando no piensas sobre ello.
Profesor de Matemáticas U.C. Berkeley

Empieza a jugar sin tener que compilar: JSpeccy
Emulador bare-metal para la Raspberry PI 2/3: ZXBaremulator

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 7 veces

Re: πBacteria, emulador Bare Metal para la Raspberry Pi

Mensajepor antoniovillena » 25 Oct 2014, 22:14

ZX-81 escribió:Aunque lo quieras hacer ver como sencillo, tiene su miga. Y gracias a que tienes sobrada experiencia en la emulación del Z80, que si no... :D


Y si no también puedes tomar prestado el core Z80 de otro proyecto. Para ARM había uno pero yo decidí implementarlo por mí mismo.

ZX-81 escribió:Yo no llamo hacer ingeniería inversa a ver el código fuente de nada. Llamo ingeniería inversa a investigar como funciona algo a bajo nivel sin tener ayuda de documentación o código. Ponerse a desensamblar y hacer una traza de un código que no conoces, eso es lo duro y al alcance de pocos.


Entonces no se necesita ingeriería inversa porque los drivers de Linux para la Raspberry que yo sepa tienen todos el código disponible.

ZX-81 escribió:Muchos de esos threads de kernel se crean cuando se activan determinados servicios, como los kworkers que gestionan los puertos USB cuando conectas algo. Y cuando se crean no sería muy sano matarlos. :D
Pero yo hablaba no ya de meterse tanto con el bare-metal, para lo cual efectivamente no necesitas un S.O., sino más orientado a no quedarte sin nada cuando vas a desarrollar algo y quieres que el S.O. interfiera lo menos posible. El propósito de cargar un kernel es, precisamente, descargarte de tareas como la gestión de las interrupciones. Por eso añadía un termino medio de tener unas librerías expresamente para el mundo del bare-metal que, facilitándote la tarea, no te aíslen del HW al 100%.


Ah vale. Supongo que lo que dices no será muy complicado de hacer a nivel de aplicación (no soy experto en Linux), si tienes acceso a root puedes matar los procesos que no necesites con lo que el Scheduler te va a asignar el tiempo que quieras para tus procesos.

ZX-81 escribió:No sé si hablamos de lo mismo, porque yo entendí que ya habían ciertas librerías en C para manejar el bare-metal. Propiamente dichas, el compilador de C no lleva ninguna librería. En Linux, esa librería es la glibc del sistema y hace uso de servicios proporcionados por el kernel, así que por sí sola sirve para poco. No puedes hacer un printf si no tienes un dispositivo tty al que lanzar la salida. Hay una parte que quizá fuera utilizable, como la parte de la librería string.h, pero muchas llamadas a la glibc son meros wrappers a servicios del sistema. Si no hay sistema, no sirve la librería. Y la glibc está preparada para ser cargada en un entorno donde el kernel y el enlazador dinámico han dispuesto las cosas en memoria de una determinada manera. NI siquiera enlazando con la librería estática te serviría de mucho.


No, me refería a que programar en C para Bare Metal es casi tan difícil como hacerlo en ensamblador en el sentido de que no tienes un método sencillo de comunicarte con los periféricos, y ese método sencillo te lo da la librería de C (la glibc) y el kernel.

ZX-81 escribió:Gracias por la info. Ese cable serie yo lo uso para conectarme a puertos serie de PC (industriales, pero PC a fin de cuentas) así que seguramente trabajarán con 12V, digo yo.


Ah pues entonces no te vale. Pero vamos que del que te digo me compré uno por ebay y me costó poco más de un euro.

ZX-81 escribió:Hace años que no toco nada de electrónica, y ni siquiera tengo soldador a estas alturas. Un polímetro baratujo y gracias es todo lo que tengo. Veo que el circuito es fácil, pero reconoce que no es una cosa que esté al alcance de cualquiera (y puede que si lo intentara, hasta lo montaría, espero que sea como ir en bici, que cuando lo has hecho unas cuantas veces ya no lo olvidas).


Desde un punto de vista de la electrónica es uno de los circuitos más fáciles que te puedes construir. Ahora bien, si no tienes soldador poco puedes hacer.

-- Actualizado 25 Oct 2014, 21:33 --

No había caído en que eras el autor del jspeccy. Entonces sabrás de primera mano lo fácil que es hacer un emulador pelado de 48K sin contención. Imagínate que tienes el core Z80 disponible en forma de librería. Si te pones a hacer cuentas no serían muchas líneas de código, si son pocas líneas en Java también serán pocas en ensamblador. Y en algunos aspectos como el escaneo de teclas es más fácil con Bare Metal, porque no tienes que mapear las teclas de un sistema a otro, yo directamente cuando recibo un IN activo las filas del teclado y leo las columnas, no es necesario tener un proceso separado que lea las teclas y las almacene en un array.

ZX-81
Commodore 128
Commodore 128
Mensajes: 117
Registrado: 04 Ene 2013, 16:43
Sistema Favorito: Spectrum +2
primer_sistema: ZX81
consola_favorita: Nintendo DS/3DS
Primera consola: Sega Genesis/Megadrive
Ubicación: La orilla del mar Mediterráneo
Gracias dadas: 15 veces
Gracias recibidas: 23 veces
Contactar:

Re: πBacteria, emulador Bare Metal para la Raspberry Pi

Mensajepor ZX-81 » 26 Oct 2014, 11:00

antoniovillena escribió:
ZX-81 escribió:Yo no llamo hacer ingeniería inversa a ver el código fuente de nada. Llamo ingeniería inversa a investigar como funciona algo a bajo nivel sin tener ayuda de documentación o código. Ponerse a desensamblar y hacer una traza de un código que no conoces, eso es lo duro y al alcance de pocos.


Entonces no se necesita ingeriería inversa porque los drivers de Linux para la Raspberry que yo sepa tienen todos el código disponible.


Bueno, no es tan idílica la situación como parece. El SoC no está completamente documentado y hay partes en Linux que están de aquella manera por no tener toda la documentación ni ayuda del fabricante (lamentablemente es el caso del driver de USB). Aparte, casi todos los SoC's que existen parecidos a la RPi (tipo Beagle Board) usan como GPU una gráfica con más NDA's por m² que el peor software de M$. No están documentados en absoluto, el driver es binario y tiene más misterio que una novela de Agatha Cristie. Hace como un año liberaron parte de la documentación de una GPU muy parecida a la que usa la RPi, pero que aún tira de partes binarias que nadie sabe qué hacen. Aquí hay alguien que lo explica mejor que yo: Why Raspberry PI is Unsuitable for Education.

antoniovillena escribió:Ah vale. Supongo que lo que dices no será muy complicado de hacer a nivel de aplicación (no soy experto en Linux), si tienes acceso a root puedes matar los procesos que no necesites con lo que el Scheduler te va a asignar el tiempo que quieras para tus procesos.


Usando el método que yo decía es que solo queda en memoria, además del kernel y sus tareas internas, tu programa. Y nada más. Salvo que tú arrancaras otra cosa, claro. Y usando el scheduler de TR tendrías un sistema bastante predecible.

antoniovillena escribió:No, me refería a que programar en C para Bare Metal es casi tan difícil como hacerlo en ensamblador en el sentido de que no tienes un método sencillo de comunicarte con los periféricos, y ese método sencillo te lo da la librería de C (la glibc) y el kernel.


Como me llevas mucha ventaja en esto, es muy arriesgado para mi hablar de algo que no he experimentado. Pero ayer, un usuario del canal #legendarios del IRC-Hispano, me proporcionó esta URL que me es realmente interesante: Baking PI - Operating Systems Development. En la lección 11 tiene un driver para manejo de teclado y ratón por USB que está escrito en C y lo usa como parte del resto del sistema que está en ASM. En general en esa web, bajo projects/raspberry hay un montón de cosas chulas acerca del bicho.

Ya nos cuentas si consigues sacar algo positivo de ahí.. ;)
Todo espacio de dimensión finita distinta de cero con producto interno tiene una base ortonormal. Tiene sentido, cuando no piensas sobre ello.
Profesor de Matemáticas U.C. Berkeley

Empieza a jugar sin tener que compilar: JSpeccy
Emulador bare-metal para la Raspberry PI 2/3: ZXBaremulator

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 7 veces

Re: πBacteria, emulador Bare Metal para la Raspberry Pi

Mensajepor antoniovillena » 26 Oct 2014, 14:04

Perdón por la respuesta rápida, el tutorial de baking pi sí que lo conocía, el problema de ese driver es que va por polling, no por interrupciones, y es muy inestable. Hay como 3 o 4 proyectos de emuladores a los que le pasa lo mismo que a mí, en el momento en que salga algo usable lo implementaremos todos a la vez.

Pero que de momento no me parece tan grave lo del USB, simplemente que tendrá menos usuarios.

Y creo que por ahí había uno que se había apañado para trabajar con teclados ps2

ZX-81
Commodore 128
Commodore 128
Mensajes: 117
Registrado: 04 Ene 2013, 16:43
Sistema Favorito: Spectrum +2
primer_sistema: ZX81
consola_favorita: Nintendo DS/3DS
Primera consola: Sega Genesis/Megadrive
Ubicación: La orilla del mar Mediterráneo
Gracias dadas: 15 veces
Gracias recibidas: 23 veces
Contactar:

Re: πBacteria, emulador Bare Metal para la Raspberry Pi

Mensajepor ZX-81 » 30 Nov 2014, 16:15

Parece que por fin ha salido una librería de manejo del USB desde Bare Metal, y que soporta dispositivos USB por interrupciones. A lo mejor le puedes sacar un buen partido.. ;)

uspi

Zuerte maeztro!
Todo espacio de dimensión finita distinta de cero con producto interno tiene una base ortonormal. Tiene sentido, cuando no piensas sobre ello.
Profesor de Matemáticas U.C. Berkeley

Empieza a jugar sin tener que compilar: JSpeccy
Emulador bare-metal para la Raspberry PI 2/3: ZXBaremulator

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 7 veces

Re: πBacteria, emulador Bare Metal para la Raspberry Pi

Mensajepor antoniovillena » 30 Nov 2014, 16:25

ZX-81 escribió:Parece que por fin ha salido una librería de manejo del USB desde Bare Metal, y que soporta dispositivos USB por interrupciones. A lo mejor le puedes sacar un buen partido.. ;)

uspi

Zuerte maeztro!


Muchas gracias por el aviso. Tiene muy buena pinta, a ver si tengo tiempo y lo implemento. Me da a mí que los mini-teclados que están en camino me los voy a quedar todos.

ZX-81
Commodore 128
Commodore 128
Mensajes: 117
Registrado: 04 Ene 2013, 16:43
Sistema Favorito: Spectrum +2
primer_sistema: ZX81
consola_favorita: Nintendo DS/3DS
Primera consola: Sega Genesis/Megadrive
Ubicación: La orilla del mar Mediterráneo
Gracias dadas: 15 veces
Gracias recibidas: 23 veces
Contactar:

Re: πBacteria, emulador Bare Metal para la Raspberry Pi

Mensajepor ZX-81 » 30 Nov 2014, 18:03

Por cierto, ese mismo desarrollador ha creado la librería "Circle" para desarrollo en C++ para Base Metal (como me lo estoy pasando esta tarde lluviosa con lo que estoy trasteando). Y el segundo ejemplo es muy revelador de lo que corre la PI con la MMU activada y sin ella.

Y, todo sea dicho (aunque sea en el lugar equivocado porque este es un foro de Spectrum, perdón a todos los implicados) el curro que se ha pegado el tío no tiene nombre. Proporciona acceso básico a prácticamente todo, incluida la tarjeta de red.... :O
Todo espacio de dimensión finita distinta de cero con producto interno tiene una base ortonormal. Tiene sentido, cuando no piensas sobre ello.
Profesor de Matemáticas U.C. Berkeley

Empieza a jugar sin tener que compilar: JSpeccy
Emulador bare-metal para la Raspberry PI 2/3: ZXBaremulator

Avatar de Usuario
radastan
Amiga 2500
Amiga 2500
Mensajes: 4542
Registrado: 11 Jun 2007, 19:29
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Sega Genesis/Megadrive
Primera consola: Nintendo NES/Clónica
Ubicación: Córdoba-Jaén
Gracias dadas: 9 veces
Gracias recibidas: 40 veces
Contactar:

Re: πBacteria, emulador Bare Metal para la Raspberry Pi

Mensajepor radastan » 21 Ene 2015, 18:55

¿Alguna novedad con este grandísimo invento? ¿has podido soportar los teclados USB?

Si siguieras avanzando creo que sería una alternativa muy maja al ZXUno.
Yo tengo una máquina del tiempo, se llama ZX Spectrum, siempre me devuelve a los buenos momentos.
(\.../) (\.../) (\.../) (\.../)
( *.*) ('.'= ) ('.'= ) ('.'= )
(")_(") (")_(") (")_(") (")_(")
╔═══╦═══╦═══╦══╦══╗
║╔═╗║╔═╗║╔═╗╠╣╠╩╣╠╝
║║─║║╚══╣║─╚╝║║─║║
║╚═╝╠══╗║║─╔╗║║─║║
║╔═╗║╚═╝║╚═╝╠╣╠╦╣╠╗
╚╝─╚╩═══╩═══╩══╩══╝

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 7 veces

Re: πBacteria, emulador Bare Metal para la Raspberry Pi

Mensajepor antoniovillena » 21 Ene 2015, 20:15

En breve tengo pendiente añadirle soporte Kempston bajo la placa tecleator y modelos plus. El teclado USB tendrá que esperar más pero también lo tengo entre mis planes.

De todas formas creo que está tardando el que alguien escriba un segundo emulador Bare Metal.

Avatar de Usuario
radastan
Amiga 2500
Amiga 2500
Mensajes: 4542
Registrado: 11 Jun 2007, 19:29
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Sega Genesis/Megadrive
Primera consola: Nintendo NES/Clónica
Ubicación: Córdoba-Jaén
Gracias dadas: 9 veces
Gracias recibidas: 40 veces
Contactar:

Re: πBacteria, emulador Bare Metal para la Raspberry Pi

Mensajepor radastan » 21 Ene 2015, 20:57

antoniovillena escribió:De todas formas creo que está tardando el que alguien escriba un segundo emulador Bare Metal.


Hombre, ya hay uno de C64 en marcha, además de uno de Apple II.
Yo tengo una máquina del tiempo, se llama ZX Spectrum, siempre me devuelve a los buenos momentos.
(\.../) (\.../) (\.../) (\.../)
( *.*) ('.'= ) ('.'= ) ('.'= )
(")_(") (")_(") (")_(") (")_(")
╔═══╦═══╦═══╦══╦══╗
║╔═╗║╔═╗║╔═╗╠╣╠╩╣╠╝
║║─║║╚══╣║─╚╝║║─║║
║╚═╝╠══╗║║─╔╗║║─║║
║╔═╗║╚═╝║╚═╝╠╣╠╦╣╠╗
╚╝─╚╩═══╩═══╩══╩══╝


Volver a “Sinclair/Spectrum”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados