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

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #30 en: Junio 25, 2014, 08:42:07 »
Para que no se diga que sólo critico y no aporto  ;D

Lo del control de los 255 pixels en la coordenada X:

Existe un registro para controlar la coordenada X por cada sprite hardware. Al ser 8 sprites, pues existen 8 registros ($D000, $D002, $D004, ...). Como cualquier registro del C64, están compuestos por un byte lo que significa 256 valores diferentes, hablando de coordenadas sólo podemos controlar la coordenada X desde 0 hasta 255 por lo que nos quedamos sin una parte de la pantalla por controlar. Para eso existe otro registro: $D010 que simula el octavo bit de cada uno de los 8 registros anteriores.

Cuando movemos un sprite hacia la derecha lo que estamos haciendo es incrementar el valor de ese registro, supongamos que estamos gestionando el sprite 0:

inc $d000    ; movemos un pixel el sprite 0 hacia la derecha

si queremos controlar el limite de los 255 lo que tenemos que hacer es comprobar el valor del registro antes (o después) de incrementarlo. Esto lo podemos hacer de varias formas, ahí entran las posibilidades del ensamblador y la pericia de cada programador.

La forma más evidentemente es comprobar si el valor del registro ya es 255 ($ff), esta es la forma que propuso Laddh en su código:

Código: [Seleccionar]
lda $d000  ;cargamos el valor de $D000 en el acumulador         
   cmp #$ff   ; lo comparamos con 255
   beq label   ; si el resultado es cero, es decir, los valores son iguales salto
   inc $d000  ; si no es 255, incremento la coordenada X

Hay otra forma más elegante de hacerlo y es la siguiente:

Código: [Seleccionar]
inc $d000   ; incremento la coordenada X
beq label    ; si el resultado es cero salto

Y en label es donde debo incrementar el bit más significativo (el octavo) del sprite correspondiente (en el caso del ejemplo el 0)

Código: [Seleccionar]
:label
lda $d010   ; cargo el registro que controla los octavos bits de la coordenada X
ora #%1000000 ; pongo el primer bit (sprite 0) a 1

Espero que se haya entendido.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #31 en: Junio 27, 2014, 00:03:48 »
Jolin,...Muchas Gracias, voy a verlo tranquilamente y te cuento,...que sepas que no te tengo reparo, que te aprecio mucho!!, perdona mi tardanza en contestar estoy un poco liado con el tema de pillarme un carro.

   Saludos!!

   

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #32 en: Junio 27, 2014, 01:27:48 »
 Veo que de todo esto sale un Juego, ya veras y vamos a Participar Todos.

Laddh

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 233
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #33 en: Junio 27, 2014, 08:30:31 »
Hola Carlos, con ese ORA #%10000000 estarías activando el XDerecha del sprite 7, no el sprite 0. Lo digo para que nadie que siga este hilo se lie.
Corrigeme sino es así, un saludo.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #34 en: Junio 27, 2014, 09:15:12 »
Hola Carlos, con ese ORA #%10000000 estarías activando el XDerecha del sprite 7, no el sprite 0. Lo digo para que nadie que siga este hilo se lie.
Corrigeme sino es así, un saludo.

Tienes toda la razón estaba escribiendo de memoria, para activar el sprite 0 habría que hacer:

Código: [Seleccionar]
ora #%00000001

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #35 en: Junio 27, 2014, 15:32:26 »
En general, para resolver dudas lo mejor es que esas dudas sean lo más concretas posibles, porque las explicaciones pueden ser demasiado genéricas o extensas sobre según que tema. Por ejemplo, para los modos de video se podría hacer casi un monográfico.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #36 en: Junio 28, 2014, 16:36:24 »
 He estado observando el listado Carlos y con perdon por la expresion,..si es mas sencillo que tirarse un pedo!!!

 Lo voy a probar en breve,...os agradezco mucho a ti y a Laddh la transmision de vuestros conocimientos os puedo asegurar que van a ser muy utilizados y me ayudan mucho a mejorar,..esto es justo lo que necesitaba, un buen equipo de Coder Assistants!!

   AL HIERRACO!!!

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #37 en: Junio 29, 2014, 16:12:51 »
he hecho un pequeño cambio y me funciona,..antes donde ponia:

:label
    lda $d010   ; cargo el registro que controla los octavos bits de la coordenada X
    ora #%1000000 ; pongo el primer bit (sprite 0) a 1

ahora pone:

label
   lda #%00000001
   sta $d010

  simplemente cargo el valor que activa el sprite 0 y lo aplico a $d010,..me he dado cuenta que al volver sobre tus pasos al llegar a 255 el sprite desaparecia pero lo he solucionado creando una rutina igual que bote a 0 el bit del sprite 0 y vuelve a las coordenadas por debajo de 255 y esto lo hace chequeandolo cuando se mueve a la izquierda.

  Os adjunto el ejercicio y veis como he superado la barrera de los 255,..Gracias!!!,..en breve os muestro el listado que teng que organizarlo un poco.

  Chao

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #38 en: Junio 29, 2014, 16:43:18 »
he hecho un pequeño cambio y me funciona,..antes donde ponia:

:label
    lda $d010   ; cargo el registro que controla los octavos bits de la coordenada X
    ora #%1000000 ; pongo el primer bit (sprite 0) a 1

ahora pone:

label
   lda #%00000001
   sta $d010
...

No es buena idea, te funcionará mientras sólo uses el sprite 0 pero cuando tengas alguno mas estarás machacando lo que hay en los demás bits del registro $d010.

Prueba con lo siguiente y te debería funcionar igual, manteniendo inalterables el resto de bits de $d010:

Código: [Seleccionar]
lda $d010
ora #%00000001
sta $d010
« última modificación: Junio 29, 2014, 18:13:05 por Carlos »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #39 en: Junio 29, 2014, 18:53:17 »
OK, lo pruebo y te cuento,..no se si en mi ensamblador en vez de ORA tengo que escribir OR....

Por otro lado ya he conseguido que funcionen todas las diagonales de la nave,..tengo una pregunta.

En Xain vereis que he montado los decorados mostrando Char en Monocolor, que tengo que hacer para mostrar un char en Multicolor?,..que siempre quedaran mas bonitos los decorados.

  Saludos.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #40 en: Junio 29, 2014, 19:02:48 »
Pega los fragmentos de tu código donde estableces el modo de video y donde dibujas los chars y te explico.

PD: puede que me equivoque, pero los mnemónicos de las instrucciones deberían ser universales para cualquier ensamblador de 6510 por lo que te debe funcionar ORA.
« última modificación: Junio 29, 2014, 19:06:27 por Carlos »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #41 en: Junio 30, 2014, 11:18:17 »
En breve adjunto el listado....

  Volviendo al tema de los Chars en Multicolor,...como manejar scrolls y bancos de tiles y menos moverlos todavia no se,..quiero iniciarme convirtiendo el paquete de chars de 2 Kb que contiene las fuentes de letras,..

  Yo para los chars de las fuentes de letras utilizo el Cuneiform (que es el mismo que Lobo) y me va muy bien,...al ponerlo en multicolor veo que los colores se definen con:

- Color ram
- $D021
- $D022
- $D023

  Todavia no he probado a mostrar los textos en multicolor, tengo que probarlo, cargare el paquete de fuentes rediseñado, con los colores configurados, pero no se si tengo que tocar alguna posicicon de memoria para decirle al ordenador ya que no los tiene que mostrar en monocolor, sino en multicolor.

   Muchas Gracias Carlos!!

Laddh

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 233
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #42 en: Junio 30, 2014, 11:23:16 »
El registro que hay que tocar para multicolor es el bit 4 del $d016. Aquí un ejemplo:
Código: [Seleccionar]
*=$1000            ; SYS 4096

     LDA #$00      ; COLOR NEGRO
     STA $D020     ; BORDE DE LA PANTALLA
     STA $D021     ; FONDO DE LA PANTALLA
     LDA #$93      ; LIMPIA PANTALLA
     JSR $FFD2
     LDA #24       ; ACTIVA LOS BITS 3 Y 4
     STA $D018     ; PERMITE GENERAR LA NUEVA FUENTE DE LETRA EN $2000
     LDA #24
     STA $D016     ; MULTICOLOR Y 40 COLUMNAS
     LDA #2
     STA $D022     ; BACKGROUND COLOR 2
     LDA #7       
     STA $D023     ; BACKGROUND COLOR 3
     LDA #$40      ; LOS 4 PRIMEROS CARACTERES
     JSR $FFD2
     LDA #$41
     JSR $FFD2
     LDA #13       ; ENTER
     JSR $FFD2
     LDA #$42
     JSR $FFD2
     LDA #$43
     JSR $FFD2
LOOP JMP LOOP      ; BUCLE SIN FIN

*=$2000            ; DATOS PARA LOS NUEVOS 4 CARACTERES

     BYTE  129,37,21,29,93,85,85,85
     BYTE  66,72,84,116,117,85,85,85
     BYTE  87,87,85,21,8,8,40,0
     BYTE  213,213,85,84,32,32,40,0



Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #43 en: Junio 30, 2014, 13:37:16 »
Rulas, te voy respondiendo en píldoras que sino me va a salir un tocho infumable.

Lo primero es establecer el modo de video, tu estas usando char hires y ahora debes establecer char multicolor, para eso hay que tocar los registros del VIC $d011 y $d016.

En $d011 debes poner el valor $1b, es el mismo valor que usas para establecer char hires:

Código: [Seleccionar]
lda $1b
sta $d011

Y en $d016 debes poner el valor $18, en char hires usarías el valor $8, la diferencia entre uno y otro es solamente activar un bit de ese registro:

Código: [Seleccionar]
lda $18
sta $d016

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #44 en: Junio 30, 2014, 14:53:44 »
  Por fin os adjunto el listado (yo lo abro con Notepad), he tardado un poco porque he puesto mogollon de explicaciones en lo que es  el Mainloop, para que Baron Ashler y Bieno lo entiendan muy bien, ya que me pedian algun listado sencillo con explicaciones.

  Normalmente al principio suelo cargar el archivo constantes que contiene la asignacion de constantes que yo utilizo, he anulado su carga ya que la he incluido en el listado para que su consulta sea mas rapida para Bieno y Baron y entiendan mejor las constantes

 Basicamente el bucle principal del juego llega hasta la linea 200,..a partir de ella estan las rutinas operativas que el juego utiliza. hay algunos cambios en relacion a la version anterior, ahora los sprites han sido cambiados graficamente por los de Caligula (la nave a cambiado), ha sido eliminado el fondo de estrellas

 El tema de superar la barrera de los 255 lo vereis en una subrutina que esta incluida en la rutina que controla Derecha e Izquierda.

   Saludos.

  Me pongo con lo de mostrar el banco de fuentes en modo multicolor y os cuento...
« última modificación: Junio 30, 2014, 14:57:15 por R. INTERNATIONAL »