Autor Tema: Empezando con ensamblador  (Leído 52307 veces)

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #75 en: Junio 21, 2012, 19:44:34 »
Es que ahora que lo pienso, mi programa funcionaba PERFECTO!!!,...que ocurria?

  Que al compilar dos bitmaps en la misma posicion, solo se quedaron los datos de la ultima (la segunda), es decir me mostraba los mismos graficos en las dos, el programa funcionaba bien solo que me estaba mostrando dos bitmaps iguales y por eso no notaba el cambio.

  Algo mas que he aprendido.

lobogris

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 453
  • Programador
    • Ver Perfil
    • http://back2theretro.blogspot.com
Re:Empezando con ensamblador
« Respuesta #76 en: Junio 21, 2012, 19:45:21 »
eso es :D

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #77 en: Junio 27, 2012, 10:20:14 »
Una nueva preguntita, esta vez sencilla:

  Muestro una Bitmap de Presentacion, al ser pulsado Espacio el programa sigue su curso, es decir la Bitmap es borrada de la Pantalla pero no desaparece completamente, quedan Pixeles perdidos, imagino que es porque no desactivo antes el modo Bitmap y vuelvo al modo texto.

 ¿Alguien me puede decir como desactivo el Modo Bitmap y activo el Modo texto?

 En esta foto podeis ver como la P. De Presentacion no se borra totalmente:



   Como siempre Mil Gracias

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13791
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Empezando con ensamblador
« Respuesta #78 en: Junio 27, 2012, 11:24:00 »
Para poner el modo texto usando C (ese lenguaje que tanto te gusta jaja):

Código: [Seleccionar]
poke(0xD011, peek(0xD011) & 0xDF);
De todos modos la lógica creo que se entiende bien asi lo pasas a ensamblador: leer 0xD011, con el valor leído hacer AND con 0xDF y volver a ponerlo en 0xD011

Lo otro que puedes hacer es rellenar toda la memoria de la pantalla de video con 00.
« última modificación: Junio 27, 2012, 11:26:03 por josepzin »
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #79 en: Junio 27, 2012, 14:30:58 »
Gracias Jose, lo unico que no me termino de enterar bien con la explicacion que me adjuntas, a ver si alguien me pude dar luz sobre el tema en un lenguaje mas de Ensamblador.

Ya que estoy aqui, otra preguntita:

 Mostrada la Bitmap al jugador se le pide que pulse ESPACIO y se queda a la espera con esta rutina:

Código: [Seleccionar]
;WAIT SPACE
SPACE
LDA $DC01
CMP #$EF
BNE SPACE

Pero me encuentro que el ESPACIO interfiere con el Disparo, es decir, cuando comienza el juego,..comienza disparando, ocurre lo que decia Lobo de que el ordenador guarda varias pulsaciones, a pesar de que adjunto esta otra rutina que hace que el ordenador solo cuente UNA pulsacion,..el fallo persiste:

Código: [Seleccionar]
; NOT REPEAT KEY
LDA #$7F
STA $28A

Y aqui mi pregunta,...quiero cambiar la pulsacion de la tecla, es decir que en vez de ESPACIO se pulse por ejemplo: RETURN (ENTER), o CUALQUIER TECLA o simplemente la "S",...alguien me podria pasar alguna rutinilla enla que el ordenador se quede esperando que el jugador pulse RETURN (como primera opcion) o alguna de las otras opciones que he dicho?

    SALUDOS!!!

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13791
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Empezando con ensamblador
« Respuesta #80 en: Junio 27, 2012, 14:42:04 »
Gracias Jose, lo unico que no me termino de enterar bien con la explicacion que me adjuntas, a ver si alguien me pude dar luz sobre el tema en un lenguaje mas de Ensamblador.

Yo creo que sería asi, pero tampoco lo podría asegurar!

Código: [Seleccionar]
LDA $D011
AND #$DF
STA $D011
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #81 en: Junio 27, 2012, 15:04:01 »
Ya,.... si eso segun lo has escrito tu lo entiendo perfectamente e incluso yo mismo te lo podria haber hecho,..lo que me refiero que no entiendo es que para activar el modo texto tengas que utilizar la Logica AND (solo ambos bits encendidos) para dicha accion ya que no se trata de "comparar" nada,..sino de "activar"

Consultando en el curso al que se enlaza veo esto,..aqui va una rutina de activacion de modo texto en la que no se utiliza AND para nada:

LDA #1B
STA $D011

  Voy a probarlo a ver si ya funciona bien...os cuento.
« última modificación: Junio 27, 2012, 15:06:06 por R. INTERNATIONAL »

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13791
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Empezando con ensamblador
« Respuesta #82 en: Junio 27, 2012, 16:04:00 »
En realidad habría que saber qué hacen los otros bits de $D011, ya que el AND se usa para modificar sólo el bit del modo texto y no a los demás.
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #83 en: Junio 27, 2012, 16:07:41 »
Comorrr??,..Gracias Jose.
« última modificación: Junio 27, 2012, 16:09:16 por R. INTERNATIONAL »

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13791
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Empezando con ensamblador
« Respuesta #84 en: Junio 27, 2012, 16:29:37 »
El tema es asi, $D011 se usa para varias cosas:
Citar
Bits #0-#2: Vertical raster scroll.
Bit #3: Screen height; 0 = 24 rows; 1 = 25 rows.
Bit #4: 0 = Screen off, complete screen is covered by border; 1 = Screen on, normal screen contents are visible.
Bit #5: 0 = Text mode; 1 = Bitmap mode.
Bit #6: 1 = Extended background mode on.
Bit #7: Read: Current raster line (bit #8). Write: Raster line to generate interrupt at (bit #8).
Valor por defecto de $D011: $1B, %00011011.

Para poner el modo texto solo tenemos que desactivar el bit#5 y el resto no tocarlos porque sino estarías haciendo alguna de las otras cosas que se controlan con los otros bits, por eso para hacerlo de forma segura hay que usar el AND asi:

Código: [Seleccionar]
LDA $D011
AND #%11011111
STA $D011

Para estas asignaciones el ensamblador es realmente bueno y claro! algún día me pondré a trastear, ¡promesa!
« última modificación: Junio 27, 2012, 16:39:00 por josepzin »
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

lobogris

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 453
  • Programador
    • Ver Perfil
    • http://back2theretro.blogspot.com
Re:Empezando con ensamblador
« Respuesta #85 en: Junio 27, 2012, 18:55:12 »
Para poner el modo texto:

1º) desactivar el modo bitmap, desactivando el bit 5 en $d011
2º) ajustar las posiciones de la RAM de video si fueran distintas (usualmente lo son). La RAM de color es siempre fija en $d800. Por supuesto el banco del VIC debe cambiarse al que pertenezca la dirección de la nueva RAM de video.
3º) ajustar la dirección del generador de caracteres. Esto es, el lugar de memoria donde se alojan los patrones de pixels (bits) de cada caracter, en el modo de texto estándard, la memoria de video es un indice directo a  esta tabla del generador de caracteres.
4º) ajustar el banco en el VIC
5º) informar el SO (kernal) de la nueva dirección de la RAM de video (sólo si pretendes usar el editor de pantalla en BASIC correctamente, o rutinas relacionadas del kernal/basic)

Aquí te pongo mi código para cambiar al modo texto:

Código: [Seleccionar]
// --------------------------------------
// Modo texto estandard 40 x 25 
// --------------------------------------

modo_texto:
                    :set_vic_bank(VIC_BANK_TXT)
                    //configura ram video y memoria generador caracteres ($d018)
                    lda #[[txtmem & $3fff] / 64] | [[chmem & $3fff] / 1024]
                    sta $d018
                    lda #[txtmem/256]
                    sta $0288       // informamos al kernal de la nueva mem. pantalla
                    lda $d011       // valor estandar para modo texto (modo bmp off, etc)
                    and #%11011111  // modo bitmap (bit5) = 0
                    sta $d011

                    lda #$08
                    sta $d016       // valores estandar VIC modo texto

                    rts

txtmem, es la dirección donde comienza mi ram de video (del modo texto)
chmem, es la dirección donde comienza mi generador de caracteres (del modo texto)

La macro para cambiar de banco, ya la puse antes, y bueno seguro que ya sabes como hacerlo, a tu manera.

El bit 4 en $d016, controla el modo multicolor (on/off). Podria haberlo configurado con máscaras binarias, pero me resulta más práctico, en este caso, poner el valor estándar del modo texto en $d016. Este valor, simplemente se averigua haciendo un PEEK en basic, nada más encender el ordenador.

Espero que te sirva. ;)

lobogris

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 453
  • Programador
    • Ver Perfil
    • http://back2theretro.blogspot.com
Re:Empezando con ensamblador
« Respuesta #86 en: Junio 27, 2012, 19:33:11 »
Para leer cualquier tecla, de forma sencilla, usa la rutina del SO llamada GETIN ($ffe4)
al llamarla, en el acumulador tienes el codigo ASCII (PETSCII hablando apropiadamente) de la tecla pulsada...
Si se pulsó una A, es 65, B es 66, etc. 

si pulsas RETURN, el código 13

Supongo que tendrás el manual del c64 a mano por ahi (hay una tabla con todos los códigos en los apéndices)
De todas maneras es más rapido saber el código desde el mismo basic:

PRINT ASC("A")
65

ahi te va un ejemplo de GETIN, en ensamblador donde se espera a que se pulse return:

Código: [Seleccionar]
                    lda #$00
                    sta $c6             // limpia buffer de teclado
espera_tecla:
                    jsr $ffe4
                    cmp #13
                    beq pulsaron_return
                    bne espera_tecla

pulsaron_return:
                    rts

es como usar el GET del basic...

Para CALIGULA, creo que pulsar S quedaria bien (cód. "S" = 83). 

lobogris

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 453
  • Programador
    • Ver Perfil
    • http://back2theretro.blogspot.com
Re:Empezando con ensamblador
« Respuesta #87 en: Junio 28, 2012, 12:08:30 »
Bueno, y ya lo último de hoy...

Sorpresita

Ejecutar el prg y luego hacer un SYS2064

La verdad esto esto es más fácil de lo que pensaba...

Que chulo Manu!

Hace un tiempo queria hacer una demo en c64 usando senos y cosenos, en ensamblador (por supuesto con tablas)

Algo asi hacia hace tiempo, pero se me ha olvidado...

Podrias ponerme como generaste la tabla de senos, o la "fórmula" ? Por que tiene tela pasar un valor de -1 a 1 a una coordenada de pantalla de 0...200 por ejemplo para la Y...

En código máquina los números decimales son una pesadilla para mi... y quiero ampliar mis conocimientos sobre ellos ¿Que consejos podrias darme acerca de usarlos? Tengo pendiente estudiar bien el tema de los FAC del SO, pero tambien y más importante saber como van realmente los números en coma flotante, esos que les sumas una constante y tal...

Te agradeceria si pudieras arrojarme algo más de luz en estos campos  (o quien lo sepa bien por aqui)

Salu2!

Manu

  • Commodoremaníaco
  • ****
  • Mensajes: 118
  • SYS 0
    • Ver Perfil
    • Manuel Sagra
Re:Empezando con ensamblador
« Respuesta #88 en: Junio 28, 2012, 13:02:34 »
La respuesta es muy sencilla...

Sinus Creator

Sólo me limité a copiar y pegar xD
The legend will never die

lobogris

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 453
  • Programador
    • Ver Perfil
    • http://back2theretro.blogspot.com
Re:Empezando con ensamblador
« Respuesta #89 en: Junio 28, 2012, 18:58:15 »
Gracias, yo hacia estas cosas con un programa en basic. Sinus Creator es lo que necesito.

Hace poco me acordé de un detalle sobre todo esto... para que el numero de -1 a 1 en la tabla oscilara habia que multiplicarlo por una constante de escalado y luego redondearlo con INT (en basic) a lo que se le añade, por supuesto coord. de centrado!!

¿de lo de coma flotante y tal, ni papa no?
« última modificación: Junio 28, 2012, 19:02:24 por lobogris »