Fonts desde SuperBasic

Subforo oficial del Sinclair QL: realiza aquí las consultas relativas a tu QL.

Moderador: Sir Cilve Sinclair

Responder
afx
Sabreman
Mensajes: 396
Registrado: Dom Feb 24, 2008 10:56 pm

Fonts desde SuperBasic

Mensaje por afx » Jue Abr 10, 2008 12:42 am

Para "adornar" algo más los programas desarrollados con SuperBasic, sobre todo los juegos, quedaría bastante bien emplear tipos de letras distintos de los que aporta el sistema.

¿Alguien tiene ejemplos de código de cómo crear y usar fonts distintos de los estándar del QL desde SuperBasic?.

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Fonts desde SuperBasic

Mensaje por badaman » Jue Abr 10, 2008 9:17 am

Puedes hacerlo de dos formas: Con TK2 y sin él.

Con el TK2 es muy fácil. te recuerdo la página con la información:

http://www.speccy.org/sinclairql/manuales/tk2/sec14.htm

Sin él, hay que hacer unos pokes para llamar a la rutina correspondiente del QDOS.

Tengo un código por aquí que, si bien funciona, no cuento con el código ensamblador y poco más puedo decirte de él.

Te lo pongo por si te sirve de alguna forma:

Código: Seleccionar todo

100 ad=RESPR(10)
110 r=RESPR(2306)
120 POKE_W ad,8196
130 POKE_W ad+2,20035
140 POKE_W ad+4,28672
150 POKE_W ad+6,20085
160 LBYTES digital_chr,r
170 CALL ad,0,0,0,37,0,0,0,65537,r


Aquí el fichero digital_chr.

Más fuentes en la web de Dilwyn:

http://www.dilwyn.uk6.net/fonts/index.html

Saludos
Última edición por badaman el Jue Ene 15, 2009 12:08 pm, editado 1 vez en total.
Sinclair QL, la respuesta profesional de los 80

Zerover
Jack The Nipper
Mensajes: 112
Registrado: Mar Abr 08, 2008 9:00 am

Re: Fonts desde SuperBasic

Mensaje por Zerover » Jue Abr 10, 2008 10:59 am

Hola a todos. Por fin he vencido mi perrería y me he registrado.

Al grano.

El código máquina integrado en el programita SuperBASIC
badaman escribió:

Código: Seleccionar todo

100 ad=RESPR(10)
110 r=RESPR(2306)
120 POKE_W ad,8196
130 POKE_W ad+2,20035
140 POKE_W ad+4,28672
150 POKE_W ad+6,20085
160 LBYTES digital_chr,r
170 CALL ad,0,0,0,37,0,0,0,65537,r
es este:

Código: Seleccionar todo

2004  MOVE.L D4,D0
4E43  TRAP #3
7000  MOVEQ.L #0,D0
4E75  RTS
      DS.W 1

y al hacer la llamada CALL se asignan los valores siguientes a los registros:

Código: Seleccionar todo

D1 = 0
D2 = 0
D3 = 0
D4 = $25
D5 = 0
D6 = 0
D7 = 0
A0 = $00010001
A1 = r

antes de ejecutarlo.

El valor 65537 indica que se cambia la fuente de caracteres del canal #1, si quieres cambiar la de otro canal tienes que cambiar este número.

La descripción del TRAP la puedes ver en http://www.speccy.org/sinclairql/man/sq ... tm#sdfount.

Saludos

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Fonts desde SuperBasic

Mensaje por badaman » Jue Abr 10, 2008 11:22 am

Hola Zerover. Qué sorpresa verte por aquí. Bienvenido.

Zerover escribió:

Código: Seleccionar todo

2004  MOVE.L D4,D0
4E43  TRAP #3
7000  MOVEQ.L #0,D0
4E75  RTS
      DS.W 1


Así pues, pasas con el CALL a D4 el número de la llamada a la subrutina del QDOS (25), y mueves el contenido de D4 a D0 con el código máquina. Luego llamas al TRAP (3) correspondiente y devuelves el control.

Parece muy simple.

¿para qué es el MOVEQ.L #0,D0, para borrar el contenido de D0?

¿Que es DS.W 1?

¿Como se pondría el valor de un canal distinto en CALL 00020002 por ejemplo para el #2?

Gracias de antemano.
Última edición por badaman el Jue Abr 10, 2008 11:53 am, editado 1 vez en total.
Sinclair QL, la respuesta profesional de los 80

Zerover
Jack The Nipper
Mensajes: 112
Registrado: Mar Abr 08, 2008 9:00 am

Re: Fonts desde SuperBasic

Mensaje por Zerover » Jue Abr 10, 2008 11:45 am

badaman escribió:Hola Zerover. Qué sorpresa verte por aquí. Bienvenido.

Bien hallado.

badaman escribió:¿para qué es el MOVEQ.L #0,D0, para borrar el contenido de D0?

Cuando se llama a una subrutina en código máquina desde SuperBASIC, siempre se pone en D0 el código del posible error que se haya producido antes de volver con RTS. Si no hay error se pone 0. Los códigos de los errores son los que se pueden ver en http://www.speccy.org/sinclairql/man/sqlpa/apG.htm.

En este caso se supone que siempre se realiza la operación correctamente, y por eso se pone 0, aunque podríamos no poner esa instrucción y dejar en D0 el valor devuelto por el TRAP, así veríamos si ha habido algún problema al usarlo.

badaman escribió:¿Que es DS.W 1?

Significa "Reservar 1 hueco de tamaño PALABRA" (Data Storage size Word 1).

No sé por qué está ahí, pero en SuperBASIC has reservado 10 bytes y el código sólo ocupa 8, con lo que hay una palabra reservada ahí.

badaman escribió:¿Como se pondría el valor de un canal distinto en CALL 00020002 por ejemplo para el #2?

Ahora mismo no recuerdo ese detalle, pero es cuestión de experimentar. Si quitas la instrucción MOVEQ #0,D0 y llamas a la subrutina con un número válido comprobarás el efecto en la ventana correspondiente y si no es válido te saldrá un mensaje de error.

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Fonts desde SuperBasic

Mensaje por badaman » Jue Abr 10, 2008 11:58 am

No sé por qué está ahí, pero en SuperBASIC has reservado 10 bytes y el código sólo ocupa 8, con lo que hay una palabra reservada ahí.


Pero eso no está implementado en los POKEs ¿no? Lo pregunto más que nada para no liar.

Se ve que al que hizo el código en SuperBASIC se le ocurrió reservar dicho espacio para algo. Vete a saber ahora.

Si quitas la instrucción MOVEQ #0,D0 y llamas a la subrutina con un número válido comprobarás el efecto en la ventana correspondiente y si no es válido te saldrá un mensaje de error.


Lo dicho, no parece nada complicado.

Gracias Zerover.
Sinclair QL, la respuesta profesional de los 80

Zerover
Jack The Nipper
Mensajes: 112
Registrado: Mar Abr 08, 2008 9:00 am

Re: Fonts desde SuperBasic

Mensaje por Zerover » Jue Abr 10, 2008 12:28 pm

badaman escribió:Pero eso no está implementado en los POKEs ¿no?

Exacto, por eso he puesto DS y no DC. DS no es una instrucción en ensamblador, es una directiva.

afx
Sabreman
Mensajes: 396
Registrado: Dom Feb 24, 2008 10:56 pm

Re: Fonts desde SuperBasic

Mensaje por afx » Jue Abr 10, 2008 8:36 pm

Esto es ¡¡fantástico!! :D , muchos estamos descubriendo un montón de cosas nuevas. Ahora es cosa de ponerse a probar.

afx
Sabreman
Mensajes: 396
Registrado: Dom Feb 24, 2008 10:56 pm

Re: Fonts desde SuperBasic

Mensaje por afx » Vie Abr 11, 2008 1:59 am

Zerover escribió:El valor 65537 indica que se cambia la fuente de caracteres del canal #1, si quieres cambiar la de otro canal tienes que cambiar este número.


¿Qué valor habría que poner para el canal #7 por ejemplo?, he estado probando y no doy con esos valores (con canal#1 todo va bien).

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Fonts desde SuperBasic

Mensaje por badaman » Vie Abr 11, 2008 6:18 am

El patrón parece ser $00070007 si el canal elegido es el 7. para otros canales sustituir el 7 por el correspondiente valor :)

Sólo hay que convertirlo a decimal: (65536 x 7) + 7

Un ejemplo del resultado en el canal 2

Imagen

Programa revisado:

Código: Seleccionar todo

100 ch=7
110 ch=(65536*ch)+ch
120 ad=RESPR(8)
130 r=RESPR(2306)
140 POKE_W ad,8196
150 POKE_W ad+2,20035
160 POKE_W ad+4,28672
170 POKE_W ad+6,20085
180 LBYTES digital_chr,r
190 CALL ad,0,0,0,37,0,0,0,ch,r
Última edición por badaman el Vie Abr 11, 2008 10:56 am, editado 1 vez en total.
Sinclair QL, la respuesta profesional de los 80

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Fonts desde SuperBasic

Mensaje por badaman » Vie Abr 11, 2008 10:54 am

Si lo que queremos es devolver el tipo de fuente original al canal, sólo tenemos que pasar el valor 0 a A1:

CALL ad,0,0,0,37,0,0,0,ch,0

En la línea anterior hemos cambiado la dirección del juego de caracteres por el valor 0.

Saludos
Sinclair QL, la respuesta profesional de los 80

Responder

¿Quién está conectado?

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