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

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11304
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #240 en: Julio 21, 2015, 23:43:25 »
Listo, aquí está. Mas simple que el mecanismo de un botijo :P

Código: [Seleccionar]
*= $c000 ; sys 49152
!to "test.prg", cbm

;activa todos los sprites
LDA #$FF
STA $D015

; posicion
LDA #60
STA $D000
STA $D001

; color
LDA #$01
STA $D027

loop
lda $d010 ;Carga Acu con el valor actual de MSB
eor #%00000001
sta $d010
JMP loop

Supongo que será porque hay que sincronizar con el barrido o es que el VIC es un procesador cuantico, al leer el valor lo estas modificando :P

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11304
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #241 en: Julio 21, 2015, 23:44:22 »
@jozepzin:

Estas haciendo un `eor` en vez de un `ora`.
`eor` significa "Exlusive Or": https://es.wikipedia.org/wiki/Disyunci%C3%B3n_exclusiva

Coñio... que es esa tontería... un tiro en los webs...

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11304
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #242 en: Julio 21, 2015, 23:47:59 »
Lo he probado con ORA y funciona bien. Gracisimas.

Ahora pruebo el mismo código pero en vez de poner ORA pongo ADC, que es lo que usa el Maniako en su ejemplo.
Y vuelta al parpadeo!

Citar
loop
   lda $d010
   clc
   adc #%00000001
   sta $d010
   JMP loop

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11304
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #243 en: Julio 21, 2015, 23:49:25 »
Este es el codigo de Maniako:

Código: [Seleccionar]
lda msb ;Carga Acu con el valor actual de MSB
clc     ;Carry 0
adc valbmsb,x ;Le suma el valor de la variable segun el sprite en curso (activado en MSB)
sta msb       ;Guarda el nuevo valor con el sprite activado su MSB

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11304
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #244 en: Julio 21, 2015, 23:52:01 »
Igual en esto del ADC el error es que al estar ya activo es logico que haya parpadeo, ya que 0001 se convierte en 0010.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #245 en: Julio 21, 2015, 23:55:29 »
Riq tiene razón. Yo también estoy pez.

Para estas cosas, siempre hago programas como este para verlo en acción.

Código: [Seleccionar]
; 10 SYS (4096)

*=$801

        BYTE    $0E, $08, $0A, $00, $9E, $20, $28,  $34, $30, $39, $36, $29, $00, $00, $00

*=$1000

               
        lda #0
        sta$0400
loop       lda $0400
       
        eor #%00000001
        sta $0400
        jmp loop

Con ORA todo OK.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #246 en: Julio 22, 2015, 00:00:17 »
El código lo puse de memoria, prueba con el salto BCS (Branch on Carry Set) en vez de BCC

   Hi Carlos!!

  En cierto modo has "dado con la tecla" ya que la cosa parece que ha mejorado y ahora colisiona cuando debe pero de una forma muy extraña, el cambio a BCS a sido muy mejorativo pero no completo, imagino que habrá que hacer mas depuraciones...

  Ya he vuelto al curro y ya me vuelve a faltar tiempo,..el cual tiempo cuento lo tenga te voy a mandar el listado por correo privado (desde el movil porque estoy capado de PC) para que le eches un vistazo en las rutinas a y el ejecutable actual,....ya lo veras sin prisas que sé que también te falta tiempo...

  Cuando veas el Ejecutable actual en el Vice vas a alucinar con las mejoras en relacion a la Demo que te mostré (Saltas, Disparas, Matas, se muestran todos los enemigos existentes, mueren a tus impactos, funciona el marcador, secuencias de explosion,etc, etc),...como te digo sin prisas, de hecho a ver si tengo un hueco para mandartelo que yo también ando un poco apretado con el curro..

  Y como simpre mil gracias y...

   AL HIERRO!!

 

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #247 en: Julio 22, 2015, 00:01:56 »
ADC suma al acu la dirección donde apunto en mi programa (un bite en concreto ya definido al final del listado).

Como solo se suma una vez el bit que deseo activar , no se va alterando su valor a cada ciclo.

Si quieres activar el MSB (>255) del sprite 0, sumas 1 a $D010 (si D010 contiene 0 ) y obtienes 1 (MSB activado para sprite 0).

Si vuelves a sumarle 1 (otra vez activar el sprite 0) obtienes 2, con lo cual conectas el sprite 1 y desconectas el 0.

Si vas sumandole 1 a saco, conectas y desconectas los sprites continuamente.

Por cierto, si vas a sumar  , antes pon CLC Clear Carry Flag , si el Carry está activado, los resultados no serán los que deseas ;)
« última modificación: Julio 22, 2015, 00:03:46 por Maniako »
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11304
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #248 en: Julio 22, 2015, 01:22:04 »
El caso es que el ADC sirve para activar y no volver a tocar el registro, pero en la lógica de mi versión no me sirve hacerlo de esa manera. Igual lo estoy planteando como haría un juego en la actualidad y no es así como se debería hacer en el 64. Pero bueno, me divierto un rato :P

¿Hay alguna instrucción que invierta valores? me refiero a por ejemplo %0001 lo convierta en %1110
He mirado el listado de instrucciones y parece que no, pero como me lié con el EOR/ORA igual tambien se me está escapando eso.

riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Dudas en Ensamblador
« Respuesta #249 en: Julio 22, 2015, 02:32:21 »
¿Hay alguna instrucción que invierta valores? me refiero a por ejemplo %0001 lo convierta en %1110
He mirado el listado de instrucciones y parece que no, pero como me lié con el EOR/ORA igual tambien se me está escapando eso.

"EOR #$ff" hace exacamente eso.

Código: [Seleccionar]
   lda #%00000001
   eor #%11111111      ; ahora A = %11111110

   lda #%00001111
   eor #%11111111      ; ahora A = %11110000

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #250 en: Julio 22, 2015, 08:49:16 »
 EOR invierte bit's?.

Si Acu= 10110101
EOR #$01
Acu=10110100 ?.

Mi código aun mas corto en 3,2,1...
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 534
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #251 en: Julio 22, 2015, 10:25:56 »
La funcion XOR es igual que OR pero da 0 si ambas entradas son iguales, por eso es OR exclusivo, porque funciona como OR pero solo una entrada puede estar en 1 para dar 1.
Lo interesante de esta pequeña diferencia, es que si miramos la tabla, da 1 si las dos entradas son distintas (solo hay un 1 en cualquiera de las entradas, y la otra es 0), y da 0 si las dos entradas son iguales, ya que si las dos eran 0 ya daba 0 (por ser OR), y ahora por ser exclusivo, si ambas son 1 tambien da 0.
Por esta razon XOR sirve para dos aplicaciones muy utiles, la primera es la comparacion exacta de dos valores, si cada uno de los bits correspondientes de cada parametro son iguales, el resultado sera 0, si alguno de los bits son distintos, por ejemplo el bit 0 de un parametro es 0 y el bit 0 del otro es 1, va a dar 1 como una OR normal, y esto da un resultado general distinto de 0. En resumen, que si se hace XOR entre dos bytes, solo da 0 si son iguales, si da distinto de 0 es que los dos bytes tienen algun bit diferente.
La otra aplicacion que es mas util, es que invierte solo los bits que estan a 1 en uno de los parametros, por eso para invertir todo un byte hay que hacer XOR con $FF, si hacemos XOR con $00 no se altera nada. La funcion XOR es muy utilizada para simular sprites en maquinas como los Spectrum, donde se usan graficos monocromaticos, ya que invierte solo los bits a los que se haga XOR con 1, lo que se suele hacer es dibujar un "sprite" sobre el bitmap de pantalla aplicando XOR entre el sprite y la pantalla. El resultado de esto es que el sprite aparece pintado en negro si el fondo era blanco, y en blanco si el fondo era negro. Justo antes de volver a redibujarlo en otras coordenadas, se vuelve a aplicar XOR en la pantalla en el mismo lugar, y la pantalla vuelve a quedar como antes, invirtiendo los puntos correspondientes del sprite (los puntos del sprite que vendrian a ser "transparentes" estarian a 0, y no afectarian para nada al bitmap al aplicarle XOR). Tambien puede verse este efecto en sistemas como el Workbench de Amiga y otros sistemas graficos de los 80s, cuando se muestra el recuadro que simboliza el borde de una ventana, al mover la ventana a otra posicion, solo que en Amiga se hace XOR con los colores, pero se puede apreciar que el color cambia segun lo que haya en el fondo.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #252 en: Julio 22, 2015, 11:00:05 »
Pastbytes... ¿estas casado?.
Puedo dejar a mi mujer por tus conocimientos  ;)

Mas claro agua. Por eso los "sprites" de un Z80 parece que tengan un campo de fuerza cuadriculado.

Agradecido por la educadora lección.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 534
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #253 en: Julio 22, 2015, 11:12:07 »
Bueno, no es el Z80 el problema, sino no tener sprites, en MSX no pasa eso, en un Amstrad CPC o incluso en un PC con una VGA clasica (o Hercules/CGA/EGA) se tienen que usar esos trucos, aunque es mas efectivo en graficos monocromaticos. Lo del borde que les agregan es para que se destaquen mas sobre el fondo, usen o no XOR, desventajas que tiene el no usar mas de 2 colores para los graficos.
Ahora que recuerdo, XOR tambien se uso en varios sistemas operativos graficos para mostrar el puntero, cuando no era comun tener un sprite para eso (que si tiene el Amiga por ejemplo). Ahora no me acuerdo si Windows 3.1 o los primeros MacOS, o ambos, hacian eso, que parte del puntero cambiaba a blanco o negro segun lo que hubiera en esos puntos en la pantalla.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11304
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #254 en: Julio 22, 2015, 11:44:26 »
Pastbytes, no te vayas por la tangente y responde la pregunta de Maniako.. :-P