Por qué existe una sección para el QL?

Déjanos tu mensaje después de oír la señal

Moderador: Sir Cilve Sinclair

Avatar de Usuario
Rinconete
Jack The Nipper
Mensajes: 193
Registrado: Mar Oct 09, 2007 7:32 pm
Ubicación: Valladolid

Re: Por qué existe una sección para el QL?

Mensaje por Rinconete » Sab May 23, 2009 12:29 am

Se me olvidaba, supongo que los [primeros] emuladores de Spectrum sacaban/sacan partido de esa compatibilidad, al menos el de Pedro ¿Giner?

Me gustaría probar el ejercicio que propones y escribir también una rutina de servicio de la int del temporizador para leer la memoria de vídeo...

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Por qué existe una sección para el QL?

Mensaje por mcleod_ideafix » Sab May 23, 2009 1:23 am

Rinconete escribió:Se me olvidaba, supongo que los [primeros] emuladores de Spectrum sacaban/sacan partido de esa compatibilidad, al menos el de Pedro ¿Giner?

Pedro Gimeno, y que yo sepa, no, no usaba eso. Lo que sí usó fue una emulación muy optimizada del Z80, en donde prácticamente usaba registros del 8086 para almacenar los valores de los registros del Z80 emulado, en lugar de variables de memoria, y tablas de saltos para implementar la búsqueda de operandos y la ejecución propiamente dicha.
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Por qué existe una sección para el QL?

Mensaje por mcleod_ideafix » Sab May 23, 2009 2:27 am

Rinconete escribió:Me gustaría probar el ejercicio que propones y escribir también una rutina de servicio de la int del temporizador para leer la memoria de vídeo...

Sería el emulador de Spectrum que interpretaría el Sinclair BASIC más rápido del mundo, creo :D
Necesitarías:
- Una ROM recompilada para 8086, es decir una ROM que use opcodes del 8086. Algunos opcodes no se podrían implementar, como IM x, pero creo que la ROM sólo usa IM 1.
- Tu programa deberá reprogramar el 8254 del PC (IRQ 0, o INT 08h en MSDOS) para llamar, cada 1/50 de segundo a una rutina "fuera del espacio del Spectrum" que se encargara de volcar los 6912 bytes de la memoria de pantalla, a la VGA, por ejemplo, a una VGA en modo 13h (MCGA).
- La ROM original deberá sustituir cualquier IN 254 (para leer el teclado) por una rutina que lea el valor "traducido" del teclado del PC. Es decir, necesitarás un gestor de interrupción para el teclado del PC (IRQ 1, o INT 9 en MSDOS) que cuando se reciba una pulsación o depulsación de una tecla del PC actualice un mapa en memoria que refleje el estado de la matriz del teclado del Spectrum. Cuando en la ROM aparezca un IN 254, deberá sustituirse con el valor leído de este mapa, según la semifila requerida.
- Asimismo, cualquier OUT 254 que afecte al altavoz (en la ROM esto sólo se hace en la rutina BEEPER) se sustituirá por código equivalente en el 8086 que use el puerto 61h (creo que era ese) donde se encuentra el altavoz del PC.

Haces un programa (un .COM por ejemplo, es más cómodo para esto) que atrape la INT 08h y INT 09h. La INT 08h la reprograma para que emita una interrupción 50 veces por segundo, y la diriges a una rutina que se encargue de repintar la pantalla, y de ejecutar la rutina situada en la dirección 38h del segmento de la ROM.
La INT 09h leerá teclas del PC, las mapeará a ZX Spectrum y mantendrá una estructura en memoria semejante a la matriz del teclado del Spectrum (por ejemplo, 8 variables que contengan cada una el estado de una semifila). La ROM estará, como te decía antes, modificada para que un IN 254 se traduzca en una lectura a la variable correspondiente.
La ROM la vuelcas en los primeros 16K de un segmento de memoria real. La RAM serán los 48K restantes. Tu rutina de actualización de pantalla tomará los datos de los segundos 16K del segmento.
Cuando esté todo listo, no tendrás más que saltar al comienzo de la ROM traducida, y a partir de ahí, el "Spectrum" está funcionando.

El emulador así hecho no sería capaz de cargar o grabar programas a cinta, entre otras cosas porque iría demasiado rápido para los timmings que maneja el Spectrum real, pero podrías perfectamente teclear programas en BASIC y verlos ejecutarse a una velocidad vertiginosa: una instrucción Z80 original = una instrucción 8086 original. Si tomamos que un Z80 va a 3,5MHz y un 8086 (vamos, un Pentium/AMD de los de ahora) va a 3,5 GHz (vale, va a menos, pero recordad que son máquinas superescalares y aún trabajando a 16 bits, eso se nota, así que la velocidad de reloj "aparente" es mayor que la velocidad real), esto significa que el intérprete de BASIC, y nuestros programas, irían 1000 veces más rápido. Incluso si eliges ejecutarlo dentro de DosBOX, iría más rápido que cualquier emulador de MS DOS ejecutado dentro de DosBOX (acabo de probar mi copia registrada del Z80 de Gerton Lunter en el DosBOX y lo que antes iba a 100% en un 486 DX4/100, ahora va al 58%).

Eso sí, sólamente programas BASIC puros. Ni un sólo POKE que no sea a las variables del sistema o a la pantalla, y ni un RANDOMIZE USR... ¡¡¡a menos que la rutina del USR sea código máquina del 8086!!!
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Por qué existe una sección para el QL?

Mensaje por mcleod_ideafix » Sab May 23, 2009 8:42 am

Rinconete escribió:Me gustaría probar el ejercicio que propones y escribir también una rutina de servicio de la int del temporizador para leer la memoria de vídeo...

Bueno, pues aquí tienes algo para empezar.

Es un programa en ensamblador, que se convierte a un .COM, ejecutable desde MS DOS, y también desde la ventana de MS DOS de Windows XP, o DosBOX. Requiere VGA (modo MCGA). No usa nada que no esté en el 8086 original, así que, cambiando la rutina que escribe a VGA por una en CGA podría ejecutarse en un PC200.

El código, como verás, ya tiene implementado un gestor para refrescar la pantalla 50 veces por segundo. Hay también un borde al que se le puede cambiar el color.

El código para manejar el teclado está escrito en parte. Falta el mapeo de teclas de PC a Spectrum y recrear la matriz del teclado. También falta el soporte de sonido (el beeper), y una rutinilla que escribí pero después he borrado, para cambiar el color del borde.

Vamos, que esto no es más que un experimento para ver cómo quedaría la cosa. Al final del código fuente hay un pequeño trozo de código que aparece en formato 8086, y comentado, en formato Z80. Este es el código que se "copia" a la zona de memoria que defino como ROM (desde la posición 0 del segmento de 64K que uso para la memoria de este extraño Spectrum). Después de eso, salto directamente a la posición 0 y empiezo a ejecutar el código.

En este ejemplo, el código simplemente escribe un patrón de líneas verticales en la pantalla, con paper 0, ink 7 y brillo 1. El flash no se ha implementado en la rutina que actualiza la pantalla. Después de escribir el patrón, se queda en un bucle sin fin.

La diferencia entre esto que he hecho, y un emulador (como por ejemplo, el Bacteria, que es para MS DOS y también está hecho en ensamblador) es que este programa no emula el Z80, sino que ejecuta código nativo del 8086. Tal y como está sería más acertado decir que este programa es el resultado de ver qué pasaría si a un Spectrum real se le pudiera enchufar un 8086 en lugar de un Z80.

La curiosidad, no obstante, reside en que sería factible reescribir la ROM del Spectrum para funcionar en el 8086, con lo que tendrías un Spectrum funcional... en BASIC.

Y volvierndo al asunto de este hilo, calculo que este programa con soporte de CGA de 16 colores (el modo este exclusivo de Amstrad) se vería razonablemente bien en un PC200. Dado que no hay emulación del código objeto, sino ejecución de código nativo, con este programa tendrías un Spectrum con un 8086 corriendo a 8 MHz... excepto cuando le tocase refrescar la pantalla. Quizás fuera lo suficientemente usable para trabajar en Sinclair BASIC con el PC200, sustituyendo las rutinas de LOAD y SAVE por otras que grabaran/reprodujeran a/desde un fichero TAP.

Y entonces Morgan tendría por fin en su PC200 algo parecido a un "modo compatible Spectrum" :D
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
Rinconete
Jack The Nipper
Mensajes: 193
Registrado: Mar Oct 09, 2007 7:32 pm
Ubicación: Valladolid

Re: Por qué existe una sección para el QL?

Mensaje por Rinconete » Sab May 23, 2009 10:57 am

Caramba, lo tienes muy pensado, dan ganas de ponerse manos a la obra y recordar viejos tiempos. Uff, hace 15 o 16 años que no escribo cosas en ensamblador del 8086, pero no me importaría volver al tecleo...

Se me ocurren algunas cosas a lo que comentas: el 8086 no tenía un juego de registros alternativo (que recuerde) así que habría que implementar algo para esas instrucciones. La temporización se podría resolver en la interrupción del timer introduciendo retardos antes de volver, para tratar de conseguir la ejecución a 3.5 MHz. El teclado tendría la limitación de no poder detectar dos teclas pulsadas, aunque para el BASIC no sería problema.

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Por qué existe una sección para el QL?

Mensaje por mcleod_ideafix » Sab May 23, 2009 2:50 pm

Rinconete escribió:Se me ocurren algunas cosas a lo que comentas: el 8086 no tenía un juego de registros alternativo (que recuerde) así que habría que implementar algo para esas instrucciones.

Como comenté hace algunos posts, la compatibilidad a nivel de código fuente del 8086 lo es con el 8080, no con el Z80. Para cosas como la instrucción EXX habría que tirar de subrutinas que hiciesen el cambio de set usando memoria como almacenamiento intermedio. Afortunadamente no es algo que en la ROM se haga constantemente (aunque sí más veces de las que me hubiera gustado :D )

Rinconete escribió:La temporización se podría resolver en la interrupción del timer introduciendo retardos antes de volver, para tratar de conseguir la ejecución a 3.5 MHz.

¿Para qué? La gracia está en conseguir el intérprete de BASIC más rápido posible. Además, si ejecutaras esto en un 8086 a 8 MHz, como el del PC200, no habría opción a muchos retardos, más bien ninguno.

Rinconete escribió:El teclado tendría la limitación de no poder detectar dos teclas pulsadas, aunque para el BASIC no sería problema.

De hecho, el PC sí puede detectar más de una tecla pulsada. Otra cosa es que tu teclado en concreto tenga alguna limitación sobre el número de teclas pulsadas que puede enviar. De esto ya hicimos alguna investigación cuando Ben sacó la versión externa del adaptador de teclado...
Web: ZX Projects | Twitter: @zxprojects

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Re: Por qué existe una sección para el QL?

Mensaje por Gandulf » Dom May 24, 2009 10:10 am

Lo que está proponiendo McLeod es aplicable a cualquier PC y no a un PC 200. Se está hablando de la compatibilidad entre los 8086/88 a nivel set de instrucciones y el 8080 o el Z80, y la forma de realizar una emulación directa de la ROM o el Basic, si alguien se anima a modificar las partes de la ROM que gestionan el hardware.

Insisto en que no hay gente ni material para meter en una sección del PC200 todo lo que hay y se genera en el área de QL, a no ser que se quiera meter un área para hablar de PC y la época MS-DOS, en cuyo caso sí habría material y temas para dar y tomar, pero sería totalmente offtopic en un sitio Sinclair.
Un saludo,

Gandulf

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Re: Por qué existe una sección para el QL?

Mensaje por Gandulf » Dom May 24, 2009 10:12 am

morgan escribió:hay que estar muy ciego para no darse cuenta que lo que un su día fue un inegable fracaso comercial, el paso del tiempo, la perspectiva histórica y su caracter minóritario, le han convertido por méritos propios en una especie protegida de la retroescena.


Esta frase es aplicable por ejemplo a un SAM Coupe, pero no a un PC que no es una máquina singular.
Un saludo,

Gandulf

Avatar de Usuario
Rinconete
Jack The Nipper
Mensajes: 193
Registrado: Mar Oct 09, 2007 7:32 pm
Ubicación: Valladolid

Re: Por qué existe una sección para el QL?

Mensaje por Rinconete » Dom May 24, 2009 10:36 am

mcleod_ideafix escribió:
Rinconete escribió:El teclado tendría la limitación de no poder detectar dos teclas pulsadas, aunque para el BASIC no sería problema.

De hecho, el PC sí puede detectar más de una tecla pulsada. Otra cosa es que tu teclado en concreto tenga alguna limitación sobre el número de teclas pulsadas que puede enviar. De esto ya hicimos alguna investigación cuando Ben sacó la versión externa del adaptador de teclado...


ah ok, ufff, hablaba de memoria, aunque por las pruebas que hice en la época del 1512 eso es lo que me pareció que pasaba. No recuerdo si el problema estaba en la manera de conectar el ¿8255? o por lo que entregaba el teclado. Y por lo que recuerdo de los ordenadores de mis amigos esa manera de funcionar estaba bastante extendida. Y lo que pase ahora con los teclados confieso que no tengo ni idea :D

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Re: Por qué existe una sección para el QL?

Mensaje por Gandulf » Dom May 24, 2009 9:17 pm

De memoria también de cuando programaba en ensamblador para 8086, creo recordar que no se pueden leer lo que se dice 2 teclas "simultáneas", ya que no va por filas y columnas como en el spectrum (no se lee una matriz). Lo que hacía yo (y creo recordar que los juegos comerciales de la época también) es aprovechar la característica del código que da el teclado cuando se "suelta" una tecla. Si se pulsa una tecla y luego recibimos la pulsación de otra sin haber recibido el código de que la primera tecla se ha "soltado", entonces están las 2 teclas pulsadas.
Un saludo,

Gandulf

Avatar de Usuario
Ralphy
Freddy Hardest
Mensajes: 589
Registrado: Dom May 27, 2007 10:58 am
Ubicación: Lo 100 to picha, no tor mundo puehé DKI.

Re: Por qué existe una sección para el QL?

Mensaje por Ralphy » Lun May 25, 2009 12:41 am

Jo, como os habeis desviado del tema, off-topic total juajuajuajua...

A "pregnUntAS" tontas...
(sí, "pregnUntAS", ¿ lo captais ? preguntas tontas que "embarazan" -de ahí el entrecomillado anterior- con solo leerlas una vez).

- Pregunta: ¿ Por qué existe una sección para el QL ? (Toma canela en rama con la preguntita).

- Respuesta: Pues para aquellos/as que tengan cualquier duda, aporte y/u opinión acerca de ese sistema (para mí desconocidísimo) nos enviamos mensajes en esa sección, como al igual en la parte "Juegos" nos enviamos mensajes sobre ese tema (el de los juegos) acerca de soluciones, dudas, pokes, bugs (errores), compatibilidad, remakes, curiosidades, mapas y demás cosas al respecto.


Y no era tan difícil la pregunta, ¿ eh ? Acerté, ¿ donde recojo mi trofeo ?


Es que, vamos, con solo leer la preguntita de marras, me dí cuenta al instante que solo pudo ser... Hala, solucionado. Tema cerrado (eso que lo hagan los moderatas claro está), aclaradito y a otra duda, que si sé la posible respuesta pues con gusto respondo.

Morgan, hijo, es que a veces no sé si estás de broma o qué se yo.

Y ya que estamos: ¿ Por qué existe un foro del Spectrum como este ? jaaajajajajajja (que nadie responda a este última pregunta, que yo estaba de coña, conste).
ADVERTENCIA: Las autoridades spectrumeras advierten que Ralphy desprotege sériamente sus juegos.

En el nombre del anime, del manga, y del espíritu otaku: Imagen ¡¡¡ A ni MÉN !!!

¡¡¡ OTAKUS AL PODER !!!

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Por qué existe una sección para el QL?

Mensaje por mcleod_ideafix » Lun May 25, 2009 2:42 am

Gandulf escribió:De memoria también de cuando programaba en ensamblador para 8086, creo recordar que no se pueden leer lo que se dice 2 teclas "simultáneas", ya que no va por filas y columnas como en el spectrum (no se lee una matriz). Lo que hacía yo (y creo recordar que los juegos comerciales de la época también) es aprovechar la característica del código que da el teclado cuando se "suelta" una tecla. Si se pulsa una tecla y luego recibimos la pulsación de otra sin haber recibido el código de que la primera tecla se ha "soltado", entonces están las 2 teclas pulsadas.

Así es precisamente como lo he implementado en el código de ejemplo: hay un vector que se llama "Teclas" y que tiene un elemento por cada una de las 128 teclas que pueden codificarse en el teclado del PC. El elemento i-esimo corresponde a la tecla i-ésima, y vale 1 si la tecla está pulsada, y 0 si no lo está.
Lo que falta, en esa parte del programa, es una rutina que lea el vector con las teclas pulsadas y soltadas y lo transforme en una matriz de 8x5 donde se refleje el estado de la correspondiente tecla del Spectrum.
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Por qué existe una sección para el QL?

Mensaje por mcleod_ideafix » Lun May 25, 2009 2:54 am

Gandulf escribió:Para mi la opción de conectar la CGA a la tele es totalmente absurda, ya que en esa época no había televisiones LCD, y conectar un PC a una tele de tubo para utilizarla como monitor la considero absurda; salvo que se pensara en un PC como en una máquina de 8 bits, algo que alguien compra para jugar, conectar a la tele y punto. Mala prespectiva.


Mira, esta es una tarjeta CGA de las primeras que se hicieron. La encontré en uno de los laboratorios hace años, y la tengo en mi despacho. No sé si ésta en concreto es de IBM o es fabricada por otro. Puedes ver que es una tarjeta de longitud completa, como era lo habitual entonces, y con el bus ISA de 8 bits.
Imagen

Y, como era normal en aquellas CGA's, tenía su salida de video compuesto (¡en NTSC, of course!) con lo que la idea de conectar el PC a una tele no era tan absurda por parte de IBM y otros...
Imagen
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Por qué existe una sección para el QL?

Mensaje por na_th_an » Lun May 25, 2009 8:38 am

Además, el modo de texto de la CGA era de 640x200, que es una resolución que se ve bastante bien en la tele.

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Re: Por qué existe una sección para el QL?

Mensaje por Gandulf » Lun May 25, 2009 11:08 am

Bueno, entonces es un error mío motivado por la evolución de las tarjetas a lo largo de los años. Si las CGA estandar tenían salida RCA destinada a conectar a un televisor , está claro que entonces no es una idea extraña de Amstrad. Yo es que he trabajado con XTs con tarjetas MDA y similares (en realidad creo que nunca trabajé con un ordenador con CGA pura y dura) y no había esta extraña (para mi) opción de conectar el PC a una tele.

Si pienso en el aspecto de los primeros monitores IBM la verdad es que sí parecen televisores.... :)
Un saludo,

Gandulf

Responder

¿Quién está conectado?

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