Autor Tema: Dudas en Ensamblador  (Leído 97240 veces)

Portiella

  • Commodoremaníaco
  • ****
  • Mensajes: 109
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #120 en: Septiembre 25, 2014, 23:44:06 »
Con .BYTE o .TEXT lo que estás definiendo es un texto o byte que después debe ser copiado a la pantalla.

El ensamblador guardará ese texto en una zona de memoria "Datos", tu debes montar un bucle que copie byte a byte a la memoria de la pantalla.

No recuerdo las instrucciones porque hace 25 años que no programa el 6510

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 631
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #121 en: Septiembre 27, 2014, 10:06:19 »
... 
  He estado consultado libros y listados en Bombjack/Commodore y veo que cargan algunos textos simplemente con .BYTE o .TEXT (atencion porque en el 64Tass se necesita el "." primero) y escriben el texto seguido y lo muestra
...

.byte, .text y demás son los llamados pseudo-ops (pseudo operandos) no son instrucciones del procesador propiamente dichas. Se suelen usar para definir tablas, por ejemplo el pseudo-op .byte coge lo que pones a continuación y lo convierte en una lista de bytes:

.byte 25, $fc = $19 $fc


CPULoyal

  • Commodorista
  • ***
  • Mensajes: 56
  • SYS $FFED
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #122 en: Septiembre 28, 2014, 15:47:56 »
Como te explicaron, los comandos byte y text son pseudo-opcodes que solo son interpretados por el ensamblador (de acuerdo a sus propias reglas y como tal, no consistente entre diferentes ensambladores) y que no forman parte del conjunto de instrucciones del 6510. Son ayudas para simplificar la entrada de datos al momento de programar.
Byte  simplemente indica que lo que sigue a continuación no debe ser interpretado como código, sino como datos.
Por otro lado, text es usado para indicar que lo que sigue a continuación debe ser interpretado por ensamblador como códigos de pantalla, porque como recordarás, en las Commodore los caracteres dichos valores no son los que corresponden a los valores ASCII. Por ejemplo, la A no redefinida tiene un valor ASCII 65 y un valor 1 en código de pantalla.
Así, al usarlos en tu programa lo que defines son tablas que, como tales, deben ser leidas en un bucle y el auxilio de otro registro índice. Ahí sí estas ahorrando memoria con las LDA secuenciales.


Saludos

P.D. El disco duro de mi máquina Güindoze con todos su 250 GB, en el cual tenía todas mis aplicaciones y herramientas de trabajo decidió irse por la libre.
Me he pasado los últimos días rescatando datos, pero entre que todavía no he comprado otro disco al cual trasferirlos y que esta semana recien entré a un nuevo trabajo, no he tenido oportunidad de contestarte.
Mientras tanto, me monté en otro disco duro más pequeño el Linux y apenas estoy terminando de configurarlo para volverlo Commodore VICE ;D Así que durante la siguiente semana te responderé con mis comentarios al avance de Calígula.
« última modificación: Septiembre 28, 2014, 15:53:28 por CPULoyal »

Laddh

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 229
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #123 en: Septiembre 28, 2014, 21:10:01 »
Hay 2 formas típicas de imprimir en pantalla, la primera es la usual de caracter a caracter con un contador que has de saber de antemano:
Código: [Seleccionar]
* = $1000  
  LDX #0
BUCLE LDA TEXTO,X
  JSR $FFD2
  INX
  CPX #13 ;total caracteres
  BNE BUCLE
  RTS
TEXTO .TEXT "HOLA A TODOS."

Y la otra es llamando a la subrutina $AB1E que imprime una cadena acabada con un byte 0

Código: [Seleccionar]
* = $1000  
    LDA #<CADENA
  LDY #>CADENA
  JSR $AB1E
  RTS
CADENA .TEXT "HOLA A TODOS!!!"
  .BYTE $00

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #124 en: Octubre 01, 2014, 00:52:06 »
Buff!!,..perdonad mi ausencia, estaba de Claustro con Caligula y como ya he vuelto de Vaaciones mis tiempos se han vuelto a reducir mucho,..dadme un pelín de tiempo para digerir las respuestas, lo que esta claro es que tengo que hacer algo porque la forma en la que muestro los textos actualmente es desmesurada en el gasto de bytes,..me acuerdo que Lobo me dijo que era inimaginable aunque me vendria bien para saber como se monta algo ladrillo a ladrillo...

  Saludos FERREOS!!
« última modificación: Octubre 01, 2014, 14:31:00 por R. INTERNATIONAL »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #125 en: Octubre 01, 2014, 22:22:54 »
 
   

   Dicen que todo Genio tiene sus rarezas..os muestro una Foto curiosa en la que se ve el Monitor del PC desde el que Desarrollo y en la Pared y como consulta rapida un listado de Etiquetas Standar de las principales posiciones de memoria, un listado de las poco mas de 40 instrucciones del 6502, un mapa de 4 Bank de memoria y un mapa de la memoria de pantalla...
   
  Pensareis que estoy zumbado!!

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #126 en: Octubre 01, 2014, 22:24:16 »

   No se que calidad tendra una vez subida, pero la foto que está tirada con un buen movil os puedo asegurar que empiezo a ampliar, ampliar y ampliar y hasta leo las letras,..increible!!

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 10483
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #127 en: Octubre 01, 2014, 22:56:31 »
¡Te has montado un buen espacio de trabajo! El Calígula está quedando muy bien.

CPULoyal

  • Commodorista
  • ***
  • Mensajes: 56
  • SYS $FFED
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #128 en: Octubre 01, 2014, 23:31:25 »
Lo mejor es la botella al entre la bocina y la lámpara  :P
Recuerda. Si manejas no tomas y si tomas... ¡Invita!  ;D

Saludos

Laddh

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 229
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #129 en: Octubre 02, 2014, 08:25:50 »
Eso si que es una consulta rápida!

Jeff

  • Commodore Master
  • *****
  • Mensajes: 475
  • RUN/STOP + RESTORE
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #130 en: Octubre 02, 2014, 09:09:00 »
R Tape Loading error
« última modificación: Diciembre 18, 2019, 20:42:18 por Jeff »
Press ANY key (¿Donde esta la tecla ANY???)

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #131 en: Octubre 06, 2014, 10:32:13 »
 Buenas Troncos,...quiero ponerme con la gestion de superacion de barrera de 255 en pantalla y con la colision de sprites ya a cañon!!,..comienzo con lo primero.

  Lo cual se hacer pero tengo que aprender a gestionar el movimiento y comportamiento de todos los sprites independendientemente de donde se encuentren,...para entendernos vamos a llamar a la zona de pantalla de 0 a 255 "zona 1" y de 255 hasta el final "Zona 2"

  Imagino que creando una sencilla rutina que gestino cada sprite no habra pobrema,..en el foro se me enseño a entrar en la Zona 2 utilizando OR...una pregunta:

  Puedo hacerlo, comparando no con numero binario todos los bits de $D010 con OR,....sino simplemente el bit (sprite) que yo quiero chequear,.es decir:.....cargo el valor del bit Sprite X (el que sea), lo comparo con AND,..me dira si esta apagado o encendido (si en ese momento esta en la zona1 o zona2), si por ejemplo el sprite esta lo mas a la izquierda posible y comienza a moverse a la derecha, cuando llega a 255 y tras comparar con AND/BNE en que zona esta (que sera la 1 y el bit sera 0), entonces el bit se pone a 1 para que pueda seguir movimiendose por la zona 2 (esto si lo haria con un OR) y con esto no afectaria a los demas sprites tampoco..

  Haciendo unas ocho rutinas de este tipo (o la que sea) podria incluirlas (llamarlas) en los movimientos de todos los sprites y ellas solas gestionarian el paso de una zona a otra de cada sprites,...es solo una pregunta, no se como lo veis, asi todo tengo que probarlo.

   Gracias.
« última modificación: Octubre 06, 2014, 10:34:26 por R. INTERNATIONAL »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #132 en: Octubre 06, 2014, 14:15:30 »
 Estoy pensando en como hare las rutinas que gestionen esto, muchas veces antes de hacer algo estoy reflexionando mentalmente a ver como lo hago y de la forma mas sencilla (ya que el ensamblador ofrece esa posibilidad)....una dudilla suponiendo éste ejemplo:

 Tengo el sprite 0 a la izquierda del todo de la lpantalla (en la Zona 1 por debajo de los 255) y comienzo a moverlo (INC ...) tras moverlo llamo a la rutina que gestiona el asunto para el sprite 0, que podria ser asi

    LDA SP0X                 ; CARGA EL VALOR DE $D000,  X DE SPRITE 0
    CMP #$FF                 ; LO COMPARA CON 255
    BEQ OPERA              ; SI ES IGUAL OPERA LO QUE QUERAMOS QUE SERA QUE SUPERE LA BARRERA
    RTS                          ; REGRESA Y CONTINUA CURSO DE JUEGO

OPERA
    LDA $D010
    ORA #%00000001   ; COMPARA Y SI ES 0 PONE 1 CON LOGICA ORA
    STA $D010               ; APLICA A $D010, SPRITE 0 YA ESTA EN ZONA 2
    RTS                          ; REGRESA          

  En la rutina OPERA tengo una pequeña duda,...tambien podria escribir esto?, utilizando el AND:
 
    LDA SP0X                 ; CARGA EL VALOR DE $D000,  X DE SPRITE 0
   CMP #$FF                 ; LO COMPARA CON 255
    BEQ OPERA              ; SI ES IGUAL OPERA LO QUE QUERAMOS QUE SERA QUE SUPERE LA BARRERA
    RTS                          ; REGRESA Y CONTINUA CURSO DE JUEGO
 
OPERA
    LDA $D010      
    AND #1                    ; COMPARA CON EL BIT QUE GESTIONA EL SPRITE 0 EN $D010
    BNE SUPERA             ; SI ES CERO ESTA EN ZONA 1 Y HA LLEGADO AL TOPE, MANDA A SUPERA
    RTS
 
SUPERA
    LDA #$01                 ; CARGA VALOR 1
    STA $D010               ; APLICA A $D010, SPRITE 0 YA ESTA EN ZONA 2
    RTS 

  Asi todo a ver si me pongo y en cuanto tenga rutinas ya hechas en serio las muestro aqui...saludos.
« última modificación: Octubre 06, 2014, 14:18:08 por R. INTERNATIONAL »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #133 en: Octubre 06, 2014, 14:32:51 »
  Pensareis que para que quiero utilizar el AND,..pero no se que me pasa que cuando hago el sentido contrario de izquirda a derecha (de zona 2 a zona 1),..cuando el sprite 0 pasa a la zona 1 me arrastra a todos los demas, no se porque,..no se si el secreto esta en la Logica que todavia no utilizo...EOR..

  Seguire contando...

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 507
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #134 en: Octubre 06, 2014, 17:39:49 »
Primero deberias entender bien como es que funciona encender y apagar bits.
La operacion OR se usa generalmente para acumular unos, es decir para activar bits sin alterar los demas, por eso si queremos activar el bit 2 y tenemos que el registro contiene 11110000, haciendo 11110000 OR 00000100 nos daria 11110100 porque en cada bit donde haya 1 o 2 unos el resultado sera 1, solo sera 0 si el bit es 0 en ambos bytes.
Si el registro tuviera en su lugar el valor 11111111, haciendo OR 00000100 daria 11111111 porque en el bit 2 hay dos unos y por lo tanto no se altera.
Para apagar un bit lo que se usa es AND, que deja intacto todo lo que tenga un 1 en la mascara, si tenemos un valor en el registro y queremos poner a 0 los bits 0 a 3, hariamos registro AND 11110000, si registro contiene por ejemplo el valor 10101010, lo que quedaria es 10100000. Para apagar un bit determinado, entonces, harias una mascara con el bit correspondiente, por ejemplo si queremos apagar el bit 2 la mascara seria 00000100, si queremos activar el bit usariamos OR y esa mascara tal como esta, pero con AND debemos primero invertirla, quedando como 11111011, esto al aplicarle AND dejaria intactos todos los bits (porque AND de un valor X con 1 siempre da el mismo valor X) excepto el bit 2, que esta a 0.
Lo de comparar con 255 no sirve en todos los casos, porque no necesariamente vas a avanzar de a 1 pixel, podrias estar incrementando a distintas velocidades y darse el caso de que fuera 254 y luego avance 2 pixeles, en cuyo caso no detectarias que tiene que pasar a la otra zona. Si lo quieres simplificar, lo mejor va a ser que hagas 2 rutinas por sprite, una para avanzar un pixel, otra para retroceder un pixel, y asi por cada sprite. Te limitarias a moverte siempre de a un pixel a la vez, pero en la rutina ya te encargarias de incrementar o decrementar 1 en el registro correspondiente, si el incremento activa la bandera carry sabes que pasaste de 255 a 0, y entonces activas con OR el bit correspondiente. Lo mismo cuando pasas de 0 a 255 restando 1, creo que te tiene que activar la bandera de negativo (ahora no recuerdo cual se activa), y antes de hacer algo tendrias que chequear si el bit de ese sprite era 1 para saber si pasaste de la zona superior a la normal. De paso en esas rutinas agregas los chequeos para que el sprite se mantenga dentro de la pantalla, y en el juego seria facil de usar porque solo llamarias a dos rutinas por sprite.
Mas adelante una optimizacion podria ser meter todas las rutinas en una sola, y decirle a la rutina que es lo que quieres hacer cargando un valor en el acumulador, por ejemplo, cargando el numero de sprite en A, de 0 a 7, y usando por ejemplo el bit 7 para indicar si se quiere avanzar o retroceder un pixel.
La operacion OR exclusivo sirve generalmente para invertir el estado de bits especificos, o para hacer una comparacion de igualdad entre dos valores.