PRINT en HiRes con RST 10h

Software para o relacionado con el core ZX Spectrum / Software for or related to the ZX Spectrum core
Responder
Avatar de Usuario
Uto
Mensajes: 1389
Registrado: 17 Dic 2015, 16:39

PRINT en HiRes con RST 10h

Mensaje por Uto » 18 Oct 2016, 20:01

Hola,

Estoy dandole vueltas a una rutina para poder hacer un PRINT de un string ASCIIZ en modo HiRes. La primera duda es si sabéis si hay algo ya hecho con licencia libre que pueda usar, y no reinvento la rueda. Si no existiera, imprimir en HiRes se puede hacer de dos maneras:

1) Te montas la rutina entera de PRINT
2) Aprovechas la de la ROM

En el segundo caso, no es más que imprimir alternativamente en Screen 0 y Screen 1 pero...

- Cuando imprimes con la de la ROM la posición de escritura avanza al siguiente caracter (o lo que ella cree que es el siguiente caracter)
- Andar cambiando de banco todo el rato no se si es lento

Por lo que vuelve a haber dos maneras de hacerlo:

1) Ir recorriendo el String normalmente, cambiando de banco a cada caracter, y retrasando el cursor cada vez que el caracter sea par, es decir hariamos algo (en pseudodigo):

Código: Seleccionar todo

:bucle
 Si caracter=0 salir de bucle
 escribe caracter
 apunta al siguiente
 cambiabanco()
 si la posicion es par, retrasa cursor 
salta a bucle
No se como retrasar el cursor, pero supongo que la siguiente posición de escritura andará en algun lado, probablemente una variable del sistema, lo buscaré pero si os lo sabéis me ahorráis la búsqueda.

2) Imprimir primero todas las impares y luego todas las pares.

Código: Seleccionar todo

:bucle
 Si caracter=0 salir de bucle
 escribe caracter
 apunta dos mas adelante
 salta a bucle
  apunta al segundo caracter de la cadena
  cambiabanco()
 :bucle2
 Si caracter=0 salir de bucle2
 escribe caracter
 apunta dos mas adelante
 salta a bucle2
Bueno, es una idea, obviamente esto obliga a empezar a escribir siempre en columnas pares (0,2,4) pero es una aproximación aceptable.

¿Cual de las dos va a ser más rápida? ¿Se os ocurre otra opción? ¿Es una mala idea usar RST 10h y sería mejor hacerse la rutina a mano?

Por cierto Antonio, si has llegado a leer hasta aquí ¿por que si el problema de la BIOS es el espacio en pantalla no usas HiRes?
Última edición por Uto el 19 Oct 2016, 00:59, editado 1 vez en total.

Avatar de Usuario
antoniovillena
Mensajes: 2611
Registrado: 27 Sep 2015, 20:41

Re: PRINT en HiRes con RST 10h

Mensaje por antoniovillena » 18 Oct 2016, 20:17

La ROM es muy lenta. Hazlo todo con rutinas propias. Respecto a la BIOS, me gustaba el aspecto de la fuente 6x8 sobre pantalla de spectrum normal. Se puede jugar con los atributos para no perder color, las rutinas son rápidas y la fuente legible

Avatar de Usuario
Uto
Mensajes: 1389
Registrado: 17 Dic 2015, 16:39

Re: PRINT en HiRes con RST 10h

Mensaje por Uto » 19 Oct 2016, 00:49

Sí, lo que pasa es que tengo un problemilla: es un dot command.

ESXDOS ya tiene montado el sistema para que RST 10h funcione, pero si trato de hacer yo mi propia rutina tengo este problema: llegado un momento tengo ya en HL la dirección de memoria en la que escribir (dentro de la memoria de pantalla) y en DE la dirección de la ROM donde están los 8 bytes que forman ese caracter (calculada a partir de la variable CHARS). El problema es que cuando estás ejecutando un dot command la ROM del Spectrum no está, y en lo que apunta DE no está el juego de caracteres.

A partir de aquí tengo dos opciones:

1) Copiar el código que pinta esos 8 bytes en RAM - quiza en el buffer de impresora ¿era 23296? - y forzar el desmapeado con rst 18h y ejecutarlo en RAM. Eso lo puedo hacer con un LDIR, y no es gran cosa (no lo he mirado pero deben ser 4-6 bytes), pero imagino que si cada vez que pinto un caracter tengo que hacer un LDIR aunque sea de pocos bytes, la cosa muy fina no va a ir. Podría hacerlo solo una vez por cadena quizá, o incluso solo una vez al arrancar el dot command.

2) Tener una copia del juego de caracteres dentro del dot command y usar la copia en lugar de la de la ROM, pero eso son 760 bytes gastados, que en un dot command es casi el 10% del espacio disponible. Esto me permitiría por otro lado tener un juego de caracteres custom, quizá más apropiado al modo HiRes, aunque la verdad es que el estándar se ve perfecto así concentrado en lo que antes eran 4x8. También es verdad que al usar el modo Timex, ya estoy asumiendo que voy a usar 6K de RAM y machacar lo que allí haya, por lo que en sí ya es un dot command "invasivo" como lo es ZXUC por ejemplo, así que podria incluso convertirlo directamente en un híbrido tipo ZXUC y entonces tendría 41K disponibles.

Lo que voy a usar tampoco tiene que ser ultra rápido, será (si algún dia la termino) una utilidad, por lo que la velocidad tampoco es algo que me atormente, salvo que se note muchísimo.

PD: Ni me había fijado que la BIOS está ya en 40 columnas :-)

Avatar de Usuario
Uto
Mensajes: 1389
Registrado: 17 Dic 2015, 16:39

Re: PRINT en HiRes con RST 10h

Mensaje por Uto » 19 Oct 2016, 11:03

Me estoy planteando usar el modo de 40 columnas, quizá tenga que hacer algún ajuste pero creo que podría funcionar, y evitaría que fuera un dot command invasivo (al usar los 6114 bytes a partir de 6000h para el modo Timex) además de poder funcionar en un Spectrum normal (con DiviDE claro).

Lo que no tengo claro es el tema de licencias. En el código del firmware.asm no pone nada, ni en general pone nada en ningún sitio sobre la licencia del software y firmware. En la FAQ oficial de ZX-Uno habla de CC by-SA, pero entiendo que eso es para el hardware, porque no es una licencia muy común para software, de hecho nunca la he visto asociada a software. Tampoco tengo claro si la rutina de 40 columnas es tuya Antonio o no :-?

El caso es que me gustaría, si algún dia termino esta utilidad, poder publicar sus fuentes y ponerles la licencia libre MIT o GPL (suelo preferir MIT porque es menos restrictiva, pero cuando uso código GPL la licencia me obliga a que el mio sea también GPL).

En fin, ¿alguien me puede aclarar este punto?

Avatar de Usuario
antoniovillena
Mensajes: 2611
Registrado: 27 Sep 2015, 20:41

Re: PRINT en HiRes con RST 10h

Mensaje por antoniovillena » 19 Oct 2016, 11:19

El código es 100% cosecha propia y está licenciado como CC by-SA. Tendrás que mantener esa parte del código con esa licencia, pero no pasa nada porque es menos restrictiva que GPL (no hay problema en mezclarlo).
Uto escribió:Me estoy planteando usar el modo de 40 columnas, quizá tenga que hacer algún ajuste pero creo que podría funcionar, y evitaría que fuera un dot command invasivo (al usar los 6114 bytes a partir de 6000h para el modo Timex) además de poder funcionar en un Spectrum normal (con DiviDE claro).

Lo que no tengo claro es el tema de licencias. En el código del firmware.asm no pone nada, ni en general pone nada en ningún sitio sobre la licencia del software y firmware. En la FAQ oficial de ZX-Uno habla de CC by-SA, pero entiendo que eso es para el hardware, porque no es una licencia muy común para software, de hecho nunca la he visto asociada a software. Tampoco tengo claro si la rutina de 40 columnas es tuya Antonio o no :-?

El caso es que me gustaría, si algún dia termino esta utilidad, poder publicar sus fuentes y ponerles la licencia libre MIT o GPL (suelo preferir MIT porque es menos restrictiva, pero cuando uso código GPL la licencia me obliga a que el mio sea también GPL).

En fin, ¿alguien me puede aclarar este punto?

Avatar de Usuario
mcleod_ideafix
Mensajes: 829
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: PRINT en HiRes con RST 10h

Mensaje por mcleod_ideafix » 19 Oct 2016, 16:20

Uto escribió:La primera duda es si sabéis si hay algo ya hecho con licencia libre que pueda usar, y no reinvento la rueda.
Desde SE IV Anya o Buffy, haces MODE 1 y ya estás en el modo de alta resolución, desde el que puedes hacer PRINT a 80 columnas en BASIC. El código fuente de esa ROM puede servirte de ayuda para implementar tu propia rutina de impresión.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
antoniovillena
Mensajes: 2611
Registrado: 27 Sep 2015, 20:41

Re: PRINT en HiRes con RST 10h

Mensaje por antoniovillena » 19 Oct 2016, 16:30

mcleod_ideafix escribió:
Uto escribió:La primera duda es si sabéis si hay algo ya hecho con licencia libre que pueda usar, y no reinvento la rueda.
Desde SE IV Anya o Buffy, haces MODE 1 y ya estás en el modo de alta resolución, desde el que puedes hacer PRINT a 80 columnas en BASIC. El código fuente de esa ROM puede servirte de ayuda para implementar tu propia rutina de impresión.
Personalmente me parece una fuente muy pequeña y poco legible, sobre todo en video compuesto con pantalla CRT. Si te decides por este modo (tiene sólo 2 colores) te recomiendo que adaptes la fuente de 6x8 a 12x8 ya que tienes el doble de resolución horizontal. El tamaño relativo será el mismo que el de la BIOS del ZX-Uno (42 caracteres por línea)

Avatar de Usuario
Uto
Mensajes: 1389
Registrado: 17 Dic 2015, 16:39

Re: PRINT en HiRes con RST 10h

Mensaje por Uto » 19 Oct 2016, 18:52

Al final creo que me quedaré con las 40 cols del código de Antonio, es la primera vez que veo codigo fuente con una licencia CC, pero no tengo nada que objetar a ello, pondré la misma al mío y andando :-)

Además, como lleva ya el charset incluido, pues no tengo lios por ser un dot command, y al ser de 6x8 ocupa menos.

Habia pensado en usar HiRes precisamente para sacar 64 columnas sin que la legibilidad se resintiera, pero luego he pensado que un dot command que "corrompe" la RAM no es un dot command fino, así que me repliego al modo de 40, porque estoy de acuerdo con Antonio en que 64 en 256 pixeles pierdes legibilidad. De paso con 40 sigo teniendo color, que no es que me haga mucha falta pero con HiRes lo perdía.

Avatar de Usuario
antoniovillena
Mensajes: 2611
Registrado: 27 Sep 2015, 20:41

Re: PRINT en HiRes con RST 10h

Mensaje por antoniovillena » 19 Oct 2016, 19:20

Las mismas rutinas y con menos paja están en el easter egg:

https://github.com/antoniovillena/zxuno ... are/scroll

Te lo digo porque para depurar te vendrá mejor. Al ejecutar scroll.bat se te genera un scroll.tap que puedes ejecutar en cualquier emulador. Estas rutinas están optimizadas en velocidad y ocupan mucha RAM. Al comienzo se rotan las fuentes por software y se generan 4 ú 8 copias en RAM. Si necesitas menos ocupación RAM puedes hacer que tu rutina de impresión las rote al vuelo, aunque será más lenta al imprimir.

Responder