Título: Ayuda con un problema ... absurdo ¿?¿? Publicado por: cybernoid en 06 de Marzo de 2007, 12:42:47 pm pues estaba yo feliz y contento haciendo mis pijadas con el asMSX y el SDCC cuando me ha dado por hacer bucles en ASM.
y haciendo bucles he llegado hasta este código, se que se puede hacer de otras maneras, pero me interesa comprender por que no funciona. el código es el siguiente: CX equ 9000h xor a ld [CX],a buc: ld a,65 push hl call WRTVRM pop hl ld a,[CX] inc a ld [CX],a ld l,a cp 10 jp nz,buc ret bueno, este bucle tendría que dar por resultado una bonita fila de 10 'A' , pero en vez de 10 muestra 2 ¿?¿? alguien sabe decirme por que? Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: nerlaska en 06 de Marzo de 2007, 01:12:54 pm Bueno, lo primero .. ese código es poco óptimo :)
Y lo segundo .. mmm .. la dirección 9000 no es ROM? :-) Vamos . .que no se puede escribir ahí o lo tienes puesto como RAM? Pregunto .. por si las moscas. Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: SapphiRe en 06 de Marzo de 2007, 01:15:03 pm Código: CX equ 9000h xor a ld [CX],a buc: ld a,65 push hl call WRTVRM pop hl ld a,[CX] inc a ld [CX],a ld l,a cp 10 jp nz,buc ret Veamos, utilizas la posición de memoria CX (9000h en tu ejemplo) como una variable donde vas almacenando el contador. Supongamos que tienes inicializado hl a la primera posición de memoria de vídeo donde quieres imprimir la A. En un principio no veo ningún problema en el código (salvo su ineficiencia, pero ese es otro tema). Lo que sí es curioso es que sólo imprima 2 A's, ya que 10 en binario es 2... ¿puede venir de ahí el problema? Otra pregunta es, ¿en qué dirección se está ejecutando el código? A ver si estás machacando algo del código con el ld [CX],a... Saludos -- Sph. Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: cybernoid en 06 de Marzo de 2007, 01:24:22 pm Bueno, lo primero .. ese código es poco óptimo :) Y lo segundo .. mmm .. la dirección 9000 no es ROM? :-) Vamos . .que no se puede escribir ahí o lo tienes puesto como RAM? Pregunto .. por si las moscas. bueno, el codigo no pretende ser optimo, solo estaba probando, respecto a la direccion de memoria yo he probado en basic a escribir en la posicion y funciona :P supongo que en assembler deberia funcionar tambien. pero bueno, la idea seria escribir en la ram :) Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: cybernoid en 06 de Marzo de 2007, 01:27:59 pm Código: CX equ 9000h xor a ld [CX],a buc: ld a,65 push hl call WRTVRM pop hl ld a,[CX] inc a ld [CX],a ld l,a cp 10 jp nz,buc ret Veamos, utilizas la posición de memoria CX (9000h en tu ejemplo) como una variable donde vas almacenando el contador. Supongamos que tienes inicializado hl a la primera posición de memoria de vídeo donde quieres imprimir la A. En un principio no veo ningún problema en el código (salvo su ineficiencia, pero ese es otro tema). Lo que sí es curioso es que sólo imprima 2 A's, ya que 10 en binario es 2... ¿puede venir de ahí el problema? Otra pregunta es, ¿en qué dirección se está ejecutando el código? A ver si estás machacando algo del código con el ld [CX],a... Saludos -- Sph. el codigo se esta ejecutando en formato ROM page 2 8000h. el codigo esta un poco marraneado de mucho probar, ya sabes que estoy aprendiendo :P y la cosa esta chunga, pero claro para aprendre uno tiene que probar y probar y acaba haciendo cosas como este codigo :) Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: SapphiRe en 06 de Marzo de 2007, 02:32:34 pm el codigo se esta ejecutando en formato ROM page 2 8000h. Entonces no hay más vuelta de hoja, el problema es el que ha apuntado nerlaska: no puedes modificar la posición 9000h porque está en ROM. Prueba a poner algo por encima de C000h Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: cybernoid en 06 de Marzo de 2007, 02:42:52 pm el codigo se esta ejecutando en formato ROM page 2 8000h. Entonces no hay más vuelta de hoja, el problema es el que ha apuntado nerlaska: no puedes modificar la posición 9000h porque está en ROM. Prueba a poner algo por encima de C000h ok, funciona :) muchas gracias a los 2 tengo algunas preguntillas mas, yo de hexadecimal mas bien cojeo mucho, he hecho el tipico ?&HC000 en MSX BASIC y me retorna -16384 ¿por que el numero es negativo? ¿no debería ser positivo? Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: SapphiRe en 06 de Marzo de 2007, 03:03:20 pm tengo algunas preguntillas mas, yo de hexadecimal mas bien cojeo mucho, he hecho el tipico ?&HC000 en MSX BASIC y me retorna -16384 ¿por que el numero es negativo? ¿no debería ser positivo? Pues es tanto negativo como positivo. Ten en cuenta que en 16 bits puedes almacenar un total de 65536 números diferentes, o bien desde el 0 al 65535 o bien incluyendo también números negativos. ¿Cómo? Muy sencillo: el bit más significativo se considera bit de signo, por lo que cualquier número mayor o igual a 8000h será negativo. Así puedes representar números positivos desde 0 a 32767 y desde -32768 a -1. O sea, desde -32768 a +32767 ambos inclusive. Es decir C000h es tanto 49152 como -16384. ¿Por qué? Fácil, si sumamos 49152 más 16384 (que es igual a 4000h en hexadecimal) nos da exactamente 65536 que es 10000h en hexadecimal. Pero ese número es de 17 bits, por lo que al trabajar con sólo 16 bits el resultado es 0000h, o sea: 0. Por lo tanto: 49152 + 16384 = 0 por lo que 49152 = -16384 Por eso C000h vale tanto 49152 como -16384. Vale, posiblemente ahora estés pensando que desde un punto de vista matemático lo anterior no tiene sentido, y llevas razón. Pero es que estamos trabajando ÚNICAMENTE con 16 bits, por lo que las ecuaciones reales son: (49152 + 16384) mod (2^16) = 0 mod (2^16) y 49152 mod (2^16) = -16384 mod (2^16) Un saludo -- Sph. Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: cybernoid en 06 de Marzo de 2007, 03:11:43 pm tengo algunas preguntillas mas, yo de hexadecimal mas bien cojeo mucho, he hecho el tipico ?&HC000 en MSX BASIC y me retorna -16384 ¿por que el numero es negativo? ¿no debería ser positivo? Pues es tanto negativo como positivo. Ten en cuenta que en 16 bits puedes almacenar un total de 65536 números diferentes, o bien desde el 0 al 65535 o bien incluyendo también números negativos. ¿Cómo? Muy sencillo: el bit más significativo se considera bit de signo, por lo que cualquier número mayor o igual a 8000h será negativo. Así puedes representar números positivos desde 0 a 32767 y desde -32768 a -1. O sea, desde -32768 a +32767 ambos inclusive. Es decir C000h es tanto 49152 como -16384. ¿Por qué? Fácil, si sumamos 49152 más 16384 (que es igual a 4000h en hexadecimal) nos da exactamente 65536 que es 10000h en hexadecimal. Pero ese número es de 17 bits, por lo que al trabajar con sólo 16 bits el resultado es 0000h, o sea: 0. Por lo tanto: 49152 + 16384 = 0 por lo que 49152 = -16384 Por eso C000h vale tanto 49152 como -16384. Vale, posiblemente ahora estés pensando que desde un punto de vista matemático lo anterior no tiene sentido, y llevas razón. Pero es que estamos trabajando ÚNICAMENTE con 16 bits, por lo que las ecuaciones reales son: (49152 + 16384) mod (2^16) = 0 mod (2^16) y 49152 mod (2^16) = -16384 mod (2^16) Un saludo -- Sph. acabas de meter un jaleo de numeros en mi cabeza que no te lo puedes imaginar, yo hace tiempo hacia cositas en asm para el Speccy, eran chorradas y las hacia en decimal, con lo que no me liaba mucho, pero ahora con el rollo del hexadecimal me estoy volviendo loco... bueno, supongo que con la practica iré pillando algo, por cierto sapp el 8245 ya ocupa su lugar desde hace un par de días :) Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: SapphiRe en 06 de Marzo de 2007, 03:26:45 pm acabas de meter un jaleo de numeros en mi cabeza que no te lo puedes imaginar Los matemáticos somos así ;D Citar por cierto sapp el 8245 ya ocupa su lugar desde hace un par de días :) ¡¡OLE OLE OLEEEE!!! :D :D :D Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: nerlaska en 06 de Marzo de 2007, 05:20:38 pm Nadie te obliga a escribir en Hexadecimal :)
Puedes trabajar todo en decimal si quieres. Y siempre esta la calculadora de Windows para hacer conversiones. Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: pitpan en 06 de Marzo de 2007, 05:27:13 pm Pero conviene mucho utilizar el hexadecimal si vas a trabajar con máscaras de bits, ya que te permite hacer cosas muy rápidamente sin necesidad de tirar de la calculadora. Y, además, recuerda que en hexadecimal funciona el BCD... Pero mejor dejo que Sap os cuente estas cosillas ;D
Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: cybernoid en 06 de Marzo de 2007, 05:35:01 pm Nadie te obliga a escribir en Hexadecimal :) Puedes trabajar todo en decimal si quieres. Y siempre esta la calculadora de Windows para hacer conversiones. eso seria lo mas facil, pero es que me da rabia lo del Hexadecimal, no lo acabo de pillar, con el binario y el decimal no tengo problemas, pero el hexadecimal se me resiste :( Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: kabish en 06 de Marzo de 2007, 05:35:02 pm La verdad es q el invento de la calculadora para convertir numeros esta muy bien. !Yo tambien la uso!. Lo q pasa es q la mayoria de las veces uso el compass y viene ya con una calcu muy completa. !Hasta he llegado a convertir graficos y todo!.
Ademas puedes probar tu codigo "en caliente" con ctrl+g, y viene muy bien si, como yo, estas aprendiendo y son cosas muy simples. Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: cybernoid en 06 de Marzo de 2007, 05:36:12 pm Pero conviene mucho utilizar el hexadecimal si vas a trabajar con máscaras de bits, ya que te permite hacer cosas muy rápidamente sin necesidad de tirar de la calculadora. Y, además, recuerda que en hexadecimal funciona el BCD... Pero mejor dejo que Sap os cuente estas cosillas ;D que es el BCD? algun truquillo para que se me quede el hexadecimal? Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: Jon_Cortazar en 06 de Marzo de 2007, 07:55:30 pm Para el BCD, el señor robsy se curró un tutorial muy bueno!. En resumidas cuentas, se basa en tratar los números hexadecimales como si fueran cifras decimales, de forma que los acarreos se actualizan como si fueran cuentas decimales de toda la vida. MUY UTIL para hacer marcadores: de recomendada lectura es, de nuevo, el tutorial de robsy que lo puedes bajar aquí: A VUELTAS CON LOS NÚMEROS DECIMALES (Eduardo Robsy) (http://www.robsy.net/bcd.pdf)
Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: jjfranco en 07 de Marzo de 2007, 02:15:57 pm Hola, como yo tambien soy nuevo en esto del ensamblador, y sé lo que cuesta empezar,
me voy a permitir la licencia de sugerirte una forma eficaz y estandar de realizar bucles, y ademas muy sencilla, y ya que has conseguido que tu codigo funcione (ya sé que este no es el motivo de tu pregunta, pero eso que me permito la licencia de hacerte la sugerencia despues de ver tu codigo) El Z80, por suerte tiene una instruccion que está pensada para eso, para hacer bucles, con lo que con esa instruccion y el registro b, puedes hacer bucles de cualquier tamaño. PARA BUCLES DE MENOS DE 255 REPETICIONES --------------------------------------------------------------- ld b,número_de_repeticiones_del_bucle bucle: ; ; Tarea a realizar por el bucle ; djnz bucle --------------------------------------------------------------- PARA BUCLES DE MAS DE 255 REPETICIONES --------------------------------------------------------------- ld b,número_de_repeticiones_del_bucle_exterior buc_ext: push bc ld b,número_de_repeticiones_del_bucle_interior buc_int: ; ; Tarea a realizar por el bucle ; djnz buc_int pop bc djnz bu_ext --------------------------------------------------------------- En este último, el numero de veces que se realizará el bucle sera un total de [numero_de_repeticiones_del_bucle_exterior] X [numero_de_repeticiones_del_bucle_interior] Bueno pos eso que espero que no tomes a mal la sugerencia. Yo llevo muy poco tiempo programando en ensamblador y te puedo decir que es más sencillo de lo que parece, solo es cuestión de saber las cuatro cosas básicas, como los bucles, o como tomar decisiones, por ejemplo. Por lo demás tu pregunta, que aquí hay gente que sabe mogollo.Creeme. Yo estoy aprendiendo, de ellos, más de lo que ellos se creen. Respecto al BCD, es solo el acrónimo de Decimal Codificado en Binario (pero en inglés claro), es un concepto que se usa mucho en electronica digital, normalmente se suele usar un formato basado en el peso de los bits como es el 8-4-2-1, pero nada impide que se pueda codificar de otra manera.La idea es poder representar números más grandes que los que se pueden representar utilizando el formato binario puro. Usando la codificacion BCD 8-4-2-1 el binario 0001 representaria el uno decima, y el resto de los números se representarian según la siguiente tabla. 0000=0 0001=1 0010=2 0011=3 0100=4 0101=5 0111=6 1000=7 1001=8 1010=9 El resto de combinaciones binarias para 4bits no se usan. Y respecto a lo de las mascaras, yo personalmente prefiero hacerlas en binario, es mi gusto. Y ya esta por hoy, espero que este post quede para la posteridad, como mi contribución a la comunidad MSXera. Y lo dicho, tu pregunta, pregunta, que este año queremos más juegos en la DEv. Yo soy nuevo, y al principio cuesta pero creeme que es muy sencillo, a ver si alguien más se anima a programar, manque sea en C. Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: cybernoid en 07 de Marzo de 2007, 02:37:32 pm Y ya esta por hoy, espero que este post quede para la posteridad, como mi contribución a la comunidad MSXera. Y lo dicho, tu pregunta, pregunta, que este año queremos más juegos en la DEv. Yo soy nuevo, y al principio cuesta pero creeme que es muy sencillo, a ver si alguien más se anima a programar, manque sea en C. buena contribucion ^_^ siempre es de agradecer, aunque ya tenia varias pruebas hechas con ese tipo de bucles, pero leerlo asi de claro es un placer :), es bueno saber que no soy el unico que se esta rompiendo el coco para aprender algo. y como pueda desde luego que me presento a la Dev ^_^ Título: Re: Ayuda con un problema ... absurdo ¿?¿? Publicado por: pitpan en 07 de Marzo de 2007, 09:44:59 pm Como bucle de 16 bits, prefiero la siguiente expresión:
ld bc,NUM_VECES BUCLE: push bc ; incluir esta línea en caso de que el código del bucle modifique el registro B o el C ... pop bc ; incluir esta línea en caso de que el código del bucle modifique los registros B o C dec bc ld a,b ; ojo: modifica A or c ; ojo: modifica A jr nz,BUCLE Esta rutina te permite hacer cualquier número de iteraciones entre 1 y 65536. Se pueden hacer variaciones semejantes. De todos modos, en http://map.tni.nl encontraréis un artículo muy bueno sobre bucles, que va mucho más allá de lo que aquí se ha explicado. |