Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: Shinzon en 31 de Mayo de 2007, 09:35:09 am



Título: Estrellado con el Assembler...
Publicado por: Shinzon en 31 de Mayo de 2007, 09:35:09 am
Buen comienzo tengo yo.

He conseguido imprimir un caracter en la pantalla usando las rutinas BIOS. Bien, hasta aquí perfecto.

Pero hay madre de todos los corderos, yo siempre voy a mas. Ahora quiero imprimir una cadena definida. Lo he intentado todo, pero como soy Lerdosky, lo unico que me hace es sacar basura y bloquearse (estoy con el BlueMSX). Veamos la rutina de marras:

; Rutina para imprimpir una cadena de texto en la pantalla (Screen 0)
; recogiendola de una cadena definida (DATOS:)

CHPUT:   EQU   &H00A2
CHGMOD:   EQU   &H008C

      LD    A, 0      ; Seleccionamos el modo de pantalla (0=Screen 0)
      CALL   CHGMOD   ; Cambio a Screen 0

      LD    HL, DATOS   ; Cargo en HL la cadena de texto
BUCLE:      LD   A, (HL)   ; Se coge el siguiente caracter de la cadena
      CP   "$"      ; Se compara el caracter de A con $
      JR   Z, FIN      ; Si es $, salta a FIN
      PUSH   HL      ; Sino...: GUARGO HL
      CALL   CHPUT      ; El caracter de A se imprime
      POP    HL      ; Se recupera la cadena
      INC    HL      ; Coge el siguiente caracter de la cadena
      JR   BUCLE      ; Repite el Bucle

FIN:      END         ; Fin de programa

DATOS:   DEFM    "Esta es la cadena de texto que quiero imprimir"
      DEFB   &H07, &H07, &H07, "$"

               ; El "$" es el último caracter de la cadena
               ; El &H07 no tengo ni idea de que es...


Despues de examinar la rutina 100 veces, me rindo, me veo incapaz de arreglarlo. Entiendo la rutina, ese no es el problema, pero no se porque no funciona :(

Bueno, almas caritativas. Dadme un poco de tregua y dedidme... ¿dónde está el fallo?

Agradecido como para invitar a unas cervezas :)


Título: Re: Estrellado con el Assembler...
Publicado por: Darth_Fistro en 31 de Mayo de 2007, 10:12:03 am
¡Hola!

¿Estás llamando la rutina desde el basic? Si es así, sustituye el FIN: END por un FIN: RET, porque siempre debes volver al basic con RET, si no no volverá y se acabará colgando.

No recuerdo si CHPUT modifica el registro HL, si no es así (que alguien lo confirme, please, ahora mismo no tengo tablas aquí) te puedes ahorrar los PUSH HL y POP HL

Si así no te funciona, entonces hay que ver qué parámetros necesita CHPUT. No la uso nunca, pero supongo que A contendrá el caracter a imprimir, así que por lo que veo la rutina debe funcionar.

Un saludo  ;)


Título: Re: Estrellado con el Assembler...
Publicado por: Dioniso en 31 de Mayo de 2007, 10:22:20 am
Je, je. Es eso. El RET ... no me ha pasado veces  :D


Título: Re: Estrellado con el Assembler...
Publicado por: Jon_Cortazar en 31 de Mayo de 2007, 10:33:24 am
Shinzon: Pon un RET en tu vida! ;). Efectivamente, tu rutina debe funcionar perfectamente.  ;)


Título: Re: Estrellado con el Assembler...
Publicado por: Shinzon en 31 de Mayo de 2007, 10:49:23 am
Yuuujjjuuuuu. Sabia que el fallo estaba en esa maldita línea, pero no sabía porque. Había comprobado toda la rutina, pero...

Tomo nota de lo del RET para el basic. Eso si que no lo sabia. La verdad es que lo estaba probando con el RSCII, pero la rutina colgaba el "msx". Aun así ha sido muy interesante. Creo que esto me va a gustar... :)

Por cierto, la rutina BIOS CHPUT si modifica el par de registros HL. De hecho, creo que modifica todos.

Graccie, bambinos! Estais invitados a una buena cerveza fría. Pasarme la factura :)


Título: Re: Estrellado con el Assembler...
Publicado por: pitpan en 31 de Mayo de 2007, 11:52:37 am
En lugar de usar

LD A,0
CALL CHGMOD

Puedes usar

CALL INITXT

Y, además,

XOR A

equivale a

LD A,0

aunque cambia las banderas de estado (registro F)

Por otra parte, acostúmbrate a no usar el modo "consola" para volcar caracteres. Si lo que quieres es hacer juegos, empieza a escribir directamente a VRAM. La BIOS es de mucha ayuda. Te pongo una versión modificada de tu rutina:

CALL INITXT ; SCREEN 0

ld HL,NAMTBL+POS_X+POS_Y*40 ; equivalente a LOCATE X,Y. NAMTBL para SCREEN 0 es igual a 0000h
ld de,TEXTO

BUCLE:

ld a,[de]
inc de
cp '$'
jr z,FIN

call WRTVRM ; escribe el contenido del acumulador A en la posición de VRAM a la que apunta HL. No modifica registros.
inc hl
jr BUCLE

FIN:
ret

Estudia la rutina y haz todas las modificaciones que se te ocurran. De todos modos, lo de usar como terminador el carácter "$" sólo tiene sentido para MSX-DOS y MS-DOS/Windows. Lo más cómodo es predefinir la longitud de la cadena, o usar un terminador más sencillo de tratar, como por ejemplo, 00h.

Con 00h podrías ahorrarte el CP '$' y substituirlo por OR A. Más rápido y más compacto.

En fin. Bienvenido al mundo del asm.


Título: Re: Estrellado con el Assembler...
Publicado por: Darth_Fistro en 31 de Mayo de 2007, 12:11:39 pm
Eso, eso, animándote con pequeños programas y siguiendo los consejos de Edu, prácticamente has caído en el lado oscuro y lo peor... ¡ya no hay vuelta atrás!  ;D

 :guitar:


Título: Re: Estrellado con el Assembler...
Publicado por: Shinzon en 31 de Mayo de 2007, 12:20:29 pm
Entre esta tarde y mañana me pondré con la rutina de Robsy -gracias, se ve que aún existen caballeros jeje- a estudiarla y analizarla. Me he propuesto meterme de lleno en esto, y cuando la cabeza se me hincha... -la de arriba, ¡mal pensados!- no hay quien me pare.

En fin. En cualquier caso, la rutina que yo he puesto, no me sirve. He efectuado las modificaciones oportunas y no hay manera. Se queda colgado. Estoy empezando a sospechar del BlueMSX. He decir, que la rutina en cuestión, está extraida del Technical HandBook of MSX2, de ASCII Corporation. La rutina entera de ASCII me funciona perfectamente, pero la parte en cuestión, me tira de los pelos...

Si quereis la pongo entera por aquí, para a ver si sabeis decirme donde he metido el pezuño.

Y si, es cierto, siento la llamada del lado oscuro... ¡del assembler! Ya me habeis contaminado. Ahora estoy corrupto. Solo me falta saber quien es "Casco Oscuro" jajajajajaja

Saludos again te again!


Título: Re: Estrellado con el Assembler...
Publicado por: Dioniso en 31 de Mayo de 2007, 12:28:08 pm
Solo me falta saber quien es "Casco Oscuro" jajajajajaja

(http://www.geocities.com/dioniso072/CascoOscuro.jpg)


Título: Re: Estrellado con el Assembler...
Publicado por: Jon_Cortazar en 31 de Mayo de 2007, 12:30:59 pm
Que me parto!!!!!  :D :D :D :D :D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D


Título: Re: Estrellado con el Assembler...
Publicado por: doraemonppc en 31 de Mayo de 2007, 12:35:06 pm
Brutal!
Se le salula lord darth vader


Título: Re: Estrellado con el Assembler...
Publicado por: Darth_Fistro en 31 de Mayo de 2007, 12:50:14 pm
jajajajajajaja  :D  :D  :D

Veo que tenemos los mismos monitores ESI Near, Mr.Dioniso  ;)


Título: Re: Estrellado con el Assembler...
Publicado por: Dioniso en 31 de Mayo de 2007, 01:00:13 pm
Veo que tenemos los mismos monitores ESI Near, Mr.Dioniso  ;)

Bueno, esto fue en casa de un colega y una colega ... yo, ahora, sólo tengo portátil para programar. De ese ordenador salieron los samples del BEEPERTRON, una versión metal con guitarraca del tema intro del mismo juego y ...  ::)


Título: Re: Estrellado con el Assembler...
Publicado por: SapphiRe_MSX en 31 de Mayo de 2007, 01:48:28 pm
JUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASSSSSSSSSSS ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D


Título: Re: Estrellado con el Assembler...
Publicado por: WYZ en 31 de Mayo de 2007, 02:08:56 pm
Juas juas juas! Dioniso en el Bar Daver.  ;D


Título: Re: Estrellado con el Assembler...
Publicado por: jltursan en 31 de Mayo de 2007, 02:34:23 pm
Jejejeeeee, ¡menudo vinazo que se está cascando el Vader!, ¿o es un pacharancito? :D


Título: Re: Estrellado con el Assembler...
Publicado por: Jon_Cortazar en 31 de Mayo de 2007, 02:38:05 pm
Yo es que me voy a poner esa foto en el avatar YA mismo! ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D


Título: Re: Estrellado con el Assembler...
Publicado por: Darth_Fistro en 31 de Mayo de 2007, 04:12:16 pm

Citar
De ese ordenador salieron los samples del BEEPERTRON, una versión metal con guitarraca del tema intro del mismo juego y ...  ::)

...¿y?

No nos dejes ya así, hombre  ;)


Título: Re: Estrellado con el Assembler...
Publicado por: Dioniso en 31 de Mayo de 2007, 07:34:21 pm
Todo a su tiempo ...


Título: Re: Estrellado con el Assembler...
Publicado por: Shinzon en 01 de Junio de 2007, 06:14:07 am
Vale, me pongo a sus pies, señor Oscuro! jejejeje

Joe, la cantidad de tiempo libre que teneis, jajajajajajajaja

En fin. Yo lo de conocerte lo decía metaforicamente, pero bueno... Ya veo que estás mal de lo tuyo jajajajaja ;)

Bueno, al tema, que me liais de mala manera, y al final me veo en un super levantando carritos con el poder de la fuerza.

- Entiendo las funciones lógicas (AND, OR y XOR), pero hay algo que no entiendo. Para limpiar el registro A -lease, ponerlo a 0- se hace un XOR A. Vale, aplicando la misma fe ciega que en Dionisio, me lo creo y como si nada. Pero si no me equivoco -lo que dudo sinceramente- la función XOR tiene una tabla de la verdad como:

x1  x2  Salida
0    0     0
1    0     1
0    1     1
1    1     0

Es decir, que los bits independientes del dato y del acumulador, para que este se ponga a 0, deben ser o ambos 1, ó ambos 0. La pregunta surge... ¿quien me dice a mi que esto va a ser así? El acumulador puede tener cualquier valor, ¿no?

Dicho esto, me pongo con la rutina de ayer de Robsy, que estoy en racha.

Darth Fistro, Dionisio & Cia: ¡Estais podridos! Pero me gusta el olor ;)

jajajaja. Saludos cordiales a todos :)


Título: Re: Estrellado con el Assembler...
Publicado por: pitpan en 01 de Junio de 2007, 06:44:20 am
XOR A es la notación oficial de ZILOG para referirse a XOR A,A. Por lo tanto, la tabla asociada es la siguiente:

A  A  A^A
--------------
0  0     0
1  1     0
--------------

Es decir, como hacer un XOR a A consigo mismo, lo que puede pasar es que cada bit del acumulador sea 1 o sea 0. En cualquier caso, el resultado de hacer una disyunción exclusiva resultará siempre en 0.

La única diferencia entre LD A,0 y XOR A es que LD A,0 no modifica las banderas de estado y XOR A sí que lo hace, dejándote las condiciones Z, NC y alguna más.

A seguir trabajando...


Título: Re: Estrellado con el Assembler...
Publicado por: Shinzon en 01 de Junio de 2007, 09:42:34 am
El caso es que justo antes de entrar, me he dado cuenta de la tonteria que he dicho. Totalmente cierto.

Dicho esto... ¿cuando se hace XOR A, hay alguna forma de "resetear" los Flags ó o estos se resetea cuando se utiliza alguna otra instrucción?

Bueno, me voy coscando del tema :)

Por cierto, por ahora no tengo planteado savar ningun juego -no tengo el nivel, ni las ganas ni el tiempo-, aunque si alguien está esperando un NEMESIS ó algo así, tendría un planteamiento bastante "especial". Lo digo porque:



Título: Re: Estrellado con el Assembler...
Publicado por: Shinzon en 01 de Junio de 2007, 09:44:58 am
... -continua-...

El pobre Doctor Venom, estará usando muletas.
Tendrá unas muelas que me rio yo de los agujeros negros.
Etc...

Vamos, que si saco algo, será bastante mas sencillo.

Dicho esto, sigo con mis estudios. Mas salu2.


Título: Re: Estrellado con el Assembler...
Publicado por: Dioniso en 01 de Junio de 2007, 09:52:05 am
Dicho esto... ¿cuando se hace XOR A, hay alguna forma de "resetear" los Flags ó o estos se resetea cuando se utiliza alguna otra instrucción?

No te compliques y en ese caso haz simplemente un LD A,0.


Título: Re: Estrellado con el Assembler...
Publicado por: Shinzon en 01 de Junio de 2007, 11:28:06 am
Vale, si eso es lo que tenía pensado, pero ¿hay alguna forma de resetear los Flags? Es que ahora que me pica el gusanillo... :)

De todas formas, y como conclusión personal, deduzco que:

- Se suele utilizar mas XOR A porque sólo ocupa 1 byte. Por contrapartida, afecta a los Flags Z y NC, los cuales, habría que resetear... Eso implicaría que:

* Habría que inserta alguna línea más de código, lo que sería contraproducente, ya que queremos optimizar y ahorrar memoria. Esto sería así en el caso, de que, por ejemplo, posteriormente queramos efectuar alguna operación, y al estar estos dos Flags afectados, podría darnos un error en la operación que efectuemos.

- Por parte de LD A, 0, tiene la desventaja que usa 2 bytes (una para el nemónico y otra para el dato). Sin embargo no afecta a ningún Flag, por lo que no habría que añadir más código.

Decidme si tiene alguna falla este razonamiento -es que como le doy al coco yo solo...- y así ver si estoy haciendo progresos.

Seguiremos :)


Título: Re: Estrellado con el Assembler...
Publicado por: Dioniso en 01 de Junio de 2007, 11:57:43 am
Vale, si eso es lo que tenía pensado, pero ¿hay alguna forma de resetear los Flags? Es que ahora que me pica el gusanillo... :)

Pues no estoy seguro pero ... AND A no reseteaba las banderas?  ???

Voy a buscar por internet pero creo que era así ... si mal no recuerdo.


Título: Re: Estrellado con el Assembler...
Publicado por: Dioniso en 01 de Junio de 2007, 12:02:34 pm
Bueno, me autorespondo:

Después de un XOR A, para resetear las banderas haz un CP A.


Título: Re: Estrellado con el Assembler...
Publicado por: Shinzon en 01 de Junio de 2007, 01:54:37 pm
¡Tenía que ser! Una autocomparación, que da una verdad como resultado. Si es que, parezco lerdo jajajajajaja

Vale, aunque quizás no sea el método más apropiado,  es bueno saber como funcionan las cosas. Así poco a poco, me voy metiendo de lleno.

Una vez mas, -para variar- me aprovecho, y solicito de algún editor de Sprites y Caracteres que dé los códigos en Hex, Bin ó Dec. Es para hacer unas pruebas con las rutinas de movimiento de Sprites, y empezar a definirlos, y todo eso.

Como decimos por aquí: Mila Esker! (mil gracias)

Windows nunca tendrá la magia de un público tan unido como nosotros. :)


Título: Re: Estrellado con el Assembler...
Publicado por: jltursan en 01 de Junio de 2007, 02:44:23 pm
Citar
Una vez mas, -para variar- me aprovecho, y solicito de algún editor de Sprites y Caracteres que dé los códigos en Hex, Bin ó Dec

Pues para no complicarte mucho puedes empezar con este:

TinySprite version 0.4.5  (http://msx.jannone.org/tinysprite/tinysprite.html)

o este otro más simple:

MSX Sprite Draw, ver.3.0 (http://andrear.altervista.org/contents/msx/msxsprites/16x16/MsxSprites16x16.html)