Cómo generar tipo de letra diferente en Basic? ¿y ASM?

Pagina 2/4
1 | | 3 | 4

Van assembler

Champion (378)

afbeelding van assembler

25-06-2011, 18:48

El problema es que si utilizas PRINT#1, el MSX-Basic va a dibujar las letras tal cual las tiene definidas en ROM.

Para escribir TUS letras, tendrás que hacerte una rutina que usando VPOKES dibuje las letras que tú has definido. Vamos, el VPOKE 6144,65 <-ASC("A") dibujará TU A.
No sé si se puede modificar algo para que PRINT#1 utilice los caracteres definidos en VRAM.

Otro detalle importante es que al ser SCREEN 2 un modo gráfico, para hacer lo que quieres tendrías que definir los caracteres para cada uno de los tres bloques de 256 caracteres en los que se divide la pantalla.

eso se haría con unos:

50 VPOKE A*8+B,VAL("&B"+LEFT$(C$,8))
51 VPOKE A*8+B+256*8,VAL("&B"+LEFT$(C$,8))
52 VPOKE A*8+B+256*8*2,VAL("&B"+LEFT$(C$,8))
60 VPOKE 8192+A*8+B,VAL("&H"+RIGHT$(C$,2))
61 VPOKE 8192+A*8+B+256*8,VAL("&H"+RIGHT$(C$,2))
62 VPOKE 8192+A*8+B+256*8*2,VAL("&H"+RIGHT$(C$,2))

Debe funcionar, pero no lo he probado... Tongue

Van celeroncillo

Expert (87)

afbeelding van celeroncillo

25-06-2011, 19:04

Gracias assembler, pero lo que quiero es escribir mucho texto en screen 2,1 o 0 y con mis letras, en screen 0 no hay problema ya que de la manera que inicié es post me funciona perfectamente (eso si, en 1 color), pero en el resto... como puedo escribir sin hacer ese print?.

Van assembler

Champion (378)

afbeelding van assembler

26-06-2011, 00:09

Eso sería algo así:

10 SCREEN 2
11 FOR A=6144 TO 6144+768
12 VPOKE A,0
13 NEXT
20 FOR A=ASC("A") TO ASC("C")
30 FOR B=0 TO 7
40 READ C$
50 VPOKE A*8+B,VAL("&B"+LEFT$(C$,8))
51 VPOKE A*8+B+256*8,VAL("&B"+LEFT$(C$,8))
52 VPOKE A*8+B+512*8,VAL("&B"+LEFT$(C$,8))
60 VPOKE 8192+A*8+B,VAL("&H"+RIGHT$(C$,2))
61 VPOKE 8192+A*8+B+256*8,VAL("&H"+RIGHT$(C$,2))
62 VPOKE 8192+A*8+B+512*8,VAL("&H"+RIGHT$(C$,2))
70 NEXT
80 NEXT
130 DATA 0011000021
131 DATA 0100100031
132 DATA 0100100041
133 DATA 0100100051
134 DATA 1100110061
135 DATA 1011010071
136 DATA 1000010081
137 DATA 0000000001
140 DATA 1011000061
141 DATA 1100100071
142 DATA 1001000081
143 DATA 1110000091
144 DATA 10001000a1
145 DATA 10001000b1
146 DATA 11110000c1
147 DATA 0000000001
148 DATA 0000000001
150 DATA 0111000001
151 DATA 1000100001
152 DATA 1000000001
153 DATA 1000000001
154 DATA 1000000001
156 DATA 1000100001
157 DATA 0111010001
158 DATA 0000000001
10000 '
10010 RESTORE 10100
10020 X=1
10030 Y=4
10040 GOSUB 10120
10050 RESTORE 10110
10060 X=5
10070 Y=10
10080 GOSUB 10120
10090 GOTO 10090
10100 DATA AAABBBCBCBCBAABAAABABAACCCCBABCBCABCBCACB
10110 DATA AAABBBCCCBBBAAABBBAAABBBCCCBBBCCCAAA
10114 DATA Aqui se podria poner cualquier texto con letras que esten definidas previamente. Si se usa la coma, habria que modificar la rutina que hay en 10120 para que lea hasta que encuentre un caracter especial, por ejemplo un *
10120 LOCATE X,Y
10130 READ A$
10140 FOR B=1 TO LEN(A$)
10150 VPOKE 6144+X+Y*32+B-1,ASC(MID$(A$,B))
10160 NEXT
10170 RETURN

Ten en cuenta que solo puedes escribir con las letras que has definido. Si no has definido las minúsculas, por ejemplo, un vpoke 6144,asc("a") dibujará un hueco en blanco, porque por defecto, en screen 2, todos los tiles están vacios.

Van e_sedes

Expert (112)

afbeelding van e_sedes

30-06-2011, 00:20

Yo personalmente haría esto:
Con el ICVGM 3.03 diseñaría un set completo de tiles, teniendo en cuenta la posición de cada uno respecto a su número ascii. Se pueden cargar algunos sets de fuentes que trae el programa para guiarte.
Abres el fichero .DAT que usa el programa, verás que es un archivo de texto normal y corriente. Lo editas con un editor cualquiera. Nos interesan las partes que van tras las etiquetas PATTERN y MCOLOR. Serían algo así:

PATTERN DB $EE,$EE,$EE,$00,$EE,$EE,$EE,$00, ...
DB $EE,$EE,$EE,$00,$EE,$EE,$EE,$00, ...
(...)
MCOLOR DB $EE,$EE,$EE,$00,$EE,$EE,$EE,$00, ...
DB $EE,$EE,$EE,$00,$EE,$EE,$EE,$00, ...
(...)
Con el editor sustituyes los DB con DATA y los $ con &h. Solo te queda numerar las líneas. Para eso puedes usar el Nestorpreter o hacerlo a mano, como quieras.

Y ahora el código:

 
10 DEFUSR0=&H41:DEFUSR1=&H44
20 COLOR 15,1,1:KEY OFF
30 screen 1:width32:keyoff
40 color15,1,1:SCREEN 2,0,0
50 poke &hfcaf,1
60 AA=USR0(0)
(aquí cargas las DATAs en la VRAM)
70 AA=USR1(0)
80 locate0,0: print "jelou!"
90 data &hee,&hee,&hee,&hee, ...

y la explicación:

linea 10. define dos direciones de rutinas de la BIOS para que la pantalla se conecte/desconecte. Si llamas a usr0 la pantalla se apaga y puedes mandarle datos sin que se vea que lo hace y además va un poco más rápido. Llamando a usr1 se vuelve a encender.

lineas 20, 30. configuras screen 1 de manera muy similar a screen 2. De esta manera queda guardada esta configuración en las variables de sistema.

linea 40. pones screen 2.

linea 50. con este poke cambias una variable de sistema que indica en que screen se está. El VDP sigue en screen 2, como lo dejaste antes, pero el interprete de BASIC lee aquí y "cree" que está en screen 1 con los parámetros que pusiste antes.

linea 60. desactiva la pantalla y despues cargas las DATAS. Las que van despues de la etiqueta PATTERN hay que cargarlas desde la dirección 0 de la vram tres veces seguidas. Las de la etiqueta MCOLOR desde la direción &h2000 tres veces seguidas.
linea 70. activa la pantalla.

linea 80. Ya ves lo que hace. Ahora puedes trabajar como en screen 1, con LOCATEs, PRINTs y esas cosas, pero en screen 2.

un saludo.

Van anonymous

incognito ergo sum (109)

afbeelding van anonymous

01-07-2011, 23:21

Creo recordar que se puede definir la dirección del set de caracteres con una variable en la zona alta de la RAM. Si es así, con cargar un set completo y apuntar a su dirección con esa variable, ya podría hacerse directamente en todos los modos de pantalla sin tener que recurrir a la redefinición de caracteres, ya que de eso se encargaría la BIOS (sí, incluso en SC2 y superiores).

Lo busco, hago una prueba y os comento.

Van anonymous

incognito ergo sum (109)

afbeelding van anonymous

01-07-2011, 23:36

Lo he encontrado, estoy haciendo pruebas... sospecho que el primer byte indica el slot donde se sitúa el set de caracteres... me falta comprobarlo y hacer un programa de ejemplo.

Van anonymous

incognito ergo sum (109)

afbeelding van anonymous

02-07-2011, 00:27

Vale, funciona. Os pongo un ejemplo en basic para que veáis como va el tema:

10 f=64
20 ms=(inp(&ha8)\f) mod 4
30 sa=peek(&hfcc1+ms)
40 ss=(peek(&hfcc5+ms)\f) mod 4
50 v=sa+ss*4+ms
60 a=peek(&hf920)+256*peek(&hf921)
70 for x=0 to 2047
80 poke &hc000+x,(int(1.5*peek(a+x)) mod 256
90 next
100 poke &hf91f,v
110 poke &hf920,&h00
120 poke &hf921,&hc0

La línea 10 define la variable f, que debe ser 64 si queremos situar el nuevo set de caracteres en la página 3 (de &hc000 para arriba) y debe ser 16 si lo queremos situar en la página 2 (de &h8000 a &hbfff).

La línea 20 lee el registro de selección de slots y se queda con el slot principal seleccionado para la página adecuada.
La línea 30 comprueba si ese slot está ampliado o no.
La línea 40 lee el subslot seleccionado para la página adecuada.
La línea 50 compone el valor de selección de slots en el formato que utiliza la BIOS.

Básicamente estas cuatro líneas son una copia en BASIC de una rutina de identificación de slot típica.

La línea 60 identifica la dirección del set de caracteres en la ROM.
Las líneas 70 a 90 leen el set de caracteres de la ROM y lo copian de &hc000 en adelante, pero introduciendo una pequeña modificación para que se aprecie que se ha modificado el set.

La línea 100 pokea el valor del slot donde se sitúa el nuevo set de caracteres.
Las líneas 110 y 120 pokean la dirección donde se sitúa el nuevo set de caracteres.

Una vez ejecutado este código, el set de caracteres se habrá modificado y funcionará perfectamente en cualquier screen entre 0 y 8. No lo he probado en los modos del 9958...

Espero que sea eso lo que buscábais.

Van celeroncillo

Expert (87)

afbeelding van celeroncillo

02-07-2011, 00:50

Perdona SapphiRe, Syntax error in 80, lease con voz de Mourinho ... ¿por que?

Van assembler

Champion (378)

afbeelding van assembler

02-07-2011, 07:16

80 poke &hc000+x,int(1.5*peek(a+x)) mod 256

sobra un paréntesis de apertura, o falta uno de cierre.

Por cierto Shapphire, la "pequeña modificación" queda bastante bien para utilizar una sola línea para generarla.

Van celeroncillo

Expert (87)

afbeelding van celeroncillo

02-07-2011, 09:28

Gracias assembler, ya lo había observado, pero no sabía conde colocarlo.

Pagina 2/4
1 | | 3 | 4