Autor Tema: Assembler - Cosas que voy aprediendo  (Leído 34849 veces)

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 12990
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Assembler - Cosas que voy aprediendo
« Respuesta #45 en: Agosto 01, 2015, 20:15:03 »
Que interesante. En algún momento me gustaría probar algo de esto.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Assembler - Cosas que voy aprediendo
« Respuesta #46 en: Agosto 02, 2015, 22:52:51 »
Estudiandolo estoy.

Grácias Riq  ;)

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

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Assembler - Cosas que voy aprediendo
« Respuesta #47 en: Agosto 02, 2015, 22:55:42 »
Que interesante. En algún momento me gustaría probar algo de esto.

Es muy interesante y útil. La cosa tiene su miga  pero si consigues comprenderlo bién se pueden hacer virguerias. Llevo dias leyendo de todo para tratar de entenderlo. Soy duro de mollera  ;)
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 12990
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Assembler - Cosas que voy aprediendo
« Respuesta #48 en: Agosto 02, 2015, 23:18:26 »
Soy duro de mollera  ;)

Me parece de muy mala educación contradecir a un compañero :P

Ahora mismo estoy metido cargando revistas y libros a Ri, que tenía curro atrasado. Al mismo tiempo cargando también cosas a CBMes, asi que dejo este tema un poquito aparcado, pero en algun momento me pica de nuevo y sigo donde estaba.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Assembler - Cosas que voy aprediendo
« Respuesta #49 en: Agosto 03, 2015, 00:03:55 »
Me parece de muy mala educación contradecir a un compañero :P

Así me gusta. Pero no sé si os a pasado alguna vez que ante una cosa obvia que la tienes delante , no la ves y cuando te das cuenta , te das de collejas por no pillarlo a la primera.

Así estoy yo con el raster. Ya comprendo que hay que desconctar algunas cosas para que las interrupciones NMI no te toquen las narices.

Cuando lo tenga aclarado (lo más básico y necesario para que funcionen, nada de virguerias) lo colgare , aunque supongo que en "dudas en ensamblador", que creo que pertenecen las dudas que tengo sobre esto.


Ahora mismo estoy metido cargando revistas y libros a Ri, que tenía curro atrasado. Al mismo tiempo cargando también cosas a CBMes, asi que dejo este tema un poquito aparcado, pero en algun momento me pica de nuevo y sigo donde estaba.

No es una competición  ;), pero siempre es agradable y divertido tener a más gente con niveles similares para ir evolucionando con los aportes e ideas de cada uno.

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

riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Assembler - Cosas que voy aprediendo
« Respuesta #50 en: Agosto 11, 2015, 03:02:57 »
timers

La frecuencia de barrido de NTSC (commodore en EE.UU) es de 60 veces por segundo. La PAL-B (europa) es de 50-veces por segundo.
O sea, que el barrido en la NTSC es más rápido... asi que usar el raster-IRQ para tocar música no es muy buena idea.
Entonces ¿si queres hacer un jueguito que funcione en NTSC y PAL, y que la música corra a la misma velocidad que haces?

Podes cambiar el código de la música, pero algo más fácil es usar los timers de la CIA, y programar uno para que se ejecute 50 veces por segundo.
Programarlos es relativamente sencillo, pero lo que hay que tener en cuenta es que cuando el timer llega a 0, se genera una IRQ.

Entonces si uno ya tiene instalado un vector con el raster-IRQ, hay que diferenciar cuando la IRQ es de raster y cuando es de timer.
Es se puede hacer comprobando si $d019 esta en uno para saber si fue una interrupción por raster, o similar.

Si la IRQ es por timer, entonces solo ahí uno tiene que tocar la música... y de esa manera la música va a sonar a la misma velocidad tanto en NTSC como en PAL.

Quizás lo complicado es saber que valores hay que usar en el timer, porque la duración de un ciclo en NTSC y PAL son distintos... lo bueno es que todo esto ya fue hecho hace muchos años... entonces solo hay que usar, por ejemplo, estos números para programar el timer:

http://codebase64.org/doku.php?id=base:playing_music_on_pal_and_ntsc

Aca tengo código que lo usa (el scroller es el mismo del jueguito que estoy haciendo, pero fijense en la parte que dice "sync50hz" )
https://github.com/ricardoquesada/c64-casual-connect-15/blob/master/src/intro.s

y aca esta un .prg para que prueben


« última modificación: Agosto 11, 2015, 03:06:44 por riq »

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 12990
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Assembler - Cosas que voy aprediendo
« Respuesta #51 en: Agosto 11, 2015, 04:35:42 »
Que bueno todo... en serio.

riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Assembler - Cosas que voy aprediendo
« Respuesta #52 en: Septiembre 14, 2015, 08:31:12 »
Optimizaciones...

Detectar colisiones usando la funcionalidad que trae el VIC esta bien, pero cuando uno quiere hacer cosas más complejas no es muy útil.
Por ejemplo, si a mi me interesa saber si mi sprite colisiona con ciertos caracteres, pero quiero ignorar otros, ya no me sirve usar la IRQ de sprite-caracteres que trae el VIC.

Entonces para detectar eso, uno tiene que hacer una simple rutina de "bounding box"
Y si bien hacer un bounding_box() no es complicado, lo más importante es hacerlo rápido, ya que se va a ejecutar 1 vez por por sprite en cada loop.

En la rutina que estoy haciendo, lo más lento era una multiplicación por 40 que hacía.
Código: [Seleccionar]
// saber que char hay en (x,y)
int char_index = y * 40 + x;

// Y se puede optimizar con
int char_index = (y * 32) + (y *8) + x;

// que es lo mismo que esto, pero más rápido
int char_index = (y << 5) + (y << 3) + x;

// pero lo más rápido de todo es hacer una tabla de multiplicaciones
// la tabla solo ocupa 50 bytes (25 words) ya que solo multiplico por valores entre 0 y 24, ya
// que solo hay 25 columnas
int char_index = tabla_de_mulitplicacion_de_40[y] + x;

así que lo que hice fue una tablita...  y para hacer la tablita me hice este tool:
https://github.com/ricardoquesada/c64-misc/blob/master/tools/mult_table_generator.py

A medida que voy avanzado con el jueguito, me estoy dando cuenta lo importante que es tener tablas de valores precalculados para todo, por dos simple razones:

- velocidad
- simplifica el código múchisimo :)

pero el problema es que las tablas hacen que consuma más memoria, lo cual puede ser un problema grande.


El jueguito va progresando poco a poco, todavía no tiene mucho, pero aunque ahora hay un "game scene" donde se puede mover el actor y hacerlo saltar y tiene detección de colisiones y salta bajo y alto. Se puede bajar de aca:
https://github.com/ricardoquesada/c64-the-muni-race/blob/master/bin/therace.prg?raw=true
« última modificación: Septiembre 14, 2015, 08:34:10 por riq »

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 12990
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Assembler - Cosas que voy aprediendo
« Respuesta #53 en: Septiembre 17, 2015, 22:01:00 »
Ya me gustaría llegar a ese nivel como para hacer una detección por boundingbox...

He mirado el prg, ¿tus personajes van desnudos? :D :D

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 12990
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Assembler - Cosas que voy aprediendo
« Respuesta #54 en: Septiembre 17, 2015, 22:01:42 »
Consejo: para empezar a jugar pon también que sirva el disparo, además de F1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Assembler - Cosas que voy aprediendo
« Respuesta #55 en: Septiembre 17, 2015, 22:36:22 »
Me gusta el efecto de gravedad en el salto.
¿Has hecho exprofeso que en el primer hueco haya como un fondo y en el segúndo,  caiga en un bucle infinito donde el monociclista alcanza velocidades supersónicas?.

Es divertido  ver como se acelera y aparece el efécto estroboscópico   ;D

Hacia la derecha desaparece y parece que sigue haciendo camino ya que tarda el mismo tiempo dedicado en volver como el que he invertido antes. Es curioso.

Pero tiene pinta de entretenido. Me gusta.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Assembler - Cosas que voy aprediendo
« Respuesta #56 en: Septiembre 18, 2015, 00:02:35 »

He mirado el prg, ¿tus personajes van desnudos? :D :D

Ahora que me fijo... tienes razón  :D.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Assembler - Cosas que voy aprediendo
« Respuesta #57 en: Septiembre 18, 2015, 01:40:53 »
Ja. Andar en monociclo desnudo no es algo que yo recomiende :) Son más mis limitaciones como artista gráfico que otra cosa.

El código todavía esta muy crudo... le falta muchísimo, y voy avanzado poco a poco. Me concentré solamente en hacer un mini algoritmo de colisiones. Mi siguiente paso creo que es mejorar el editor de caracteres que estoy haciendo (vchar64) para poder hacer un mapa más o menos decente.

Ya agregaré mejores animaciones, mejores graficos, sonidos y demás... quizas en 5 años lo termine :)

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Assembler - Cosas que voy aprediendo
« Respuesta #58 en: Septiembre 18, 2015, 08:17:59 »
Ja. Andar en monociclo desnudo no es algo que yo recomiende :)

Pués anda, que sin sillín...  :D

Ya agregaré mejores animaciones, mejores graficos, sonidos y demás... quizas en 5 años lo termine :)

Veo que eres optimista. Si necesitas ayuda en el apartado gráfico, tenemos un artista en el foro , Errazking. Es un crack!!  ;).
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Assembler - Cosas que voy aprediendo
« Respuesta #59 en: Enero 04, 2016, 01:26:51 »
Pues aquí seguimos.

Estoy empezando un juego tipo Head On (por fin me he animado a intentar algo  ::)) y se me a ocurrido ir poniendo las rutinas que voy creando para que si veis alguno como añadir mejoras, pues me encantará aplicarlas si esta en mis posibilidades entenderlo.

La verdad es que es complicado el jueguecito, el hacer que los enemigos se muevan hacia el carril donde estoy desde cualquier dirección y posición de la pantalla es malnacido.

Intentaré crear unas tablas para que estas cosas las haga de manera automática sin "if thens" o comprobaciones eternas que compliquen el seguir/crear el programa
Ya iré colgando por aquí los progresos  ;)

Código: [Seleccionar]
;Creado en CBM prg STUDIO 3.6.0
;Pruebas para colocar sprite en pantalla partiendo de unas coordenadas de pantalla
;X de 0 a 39 e Y de 0 a 24
; 10 SYS4096

*=$801

        BYTE    $0B, $08, $0A, $00, $9E, $34, $30, $39, $36, $00, $00, $00
*=$1000 ;#4096

;Posición sprite en coordenadas X=0 e Y=0 de caracteres, en el sprite es X=#24 e Y=#50
;Formula de caracteres a sprites: Xcar*8+24 Ycar*8+50
facarg=$bc0c
intfac=$b391
sum=$b86a
res=$b853
mul=$ba2b
div=$bb12
facind=$bc9b
msb=$d010       ;Activar >255 sprites
posprites=$D000
spena=$D015
Posmemspr=$07f8 ;#2040

Xcar0=#30        ;Coordenada X coche 0 (el prota) 28*8=224 +24 de correccion=248.
                 ;Es el máximo sin tener que activar el msb
Ycar0=#00        ;Coordenada Y coche 0 (elprota)

;Posicionando y conectando sprites
        lda #1
        sta spena      ;Conecta sprite 0
        lda #24+50
        sta posprites   ;CoordX
        lda #50
        sta posprites+1 ;CoordY
        lda #192+2      ;#12288
        sta Posmemspr   ;Sprite en memoria
loop                    ;Inutil de momento, solo se ejecuta una vez
   
        lda #00         ;Desactiva el msb antes del cálculo
        sta msb         ;es mejorable, solo es para la prueba.

;Multiplicando la coordenada X en caracteres para conseguir la coordenada X del sprite:
;Vale también para la coordenada Y. De hecho, se llamará a esta rutina para calcular
;cada eje de cada coche.

;ACU y Registro Y se pueden cargar antes de llamar a esta rutina. Aqui los cargo a
;continuación para las pruebas.

        lda #00         ;HIBYTE  LoHi Es 0 por que va de 0 a 0 XD
        ldy #Xcar0      ;LOBYTE ;00XX coordenada X coche Va de 0 al 39
        jsr intfac      ;
        jsr facarg      ;
        lda #00         ;HIBYTE LoHi
        ldy #08         ;LOBYTE 0008 X8
        jsr intfac
        jsr mul         ;Resultado en $64 y $65 HIBYTE y LOBYTE respectivamente
        jsr facind
        lda $64         ;Resultado HI de multiplicar Xcar x 8 bits
        ldy $65         ;Resultado LO de multiplicar Xcar x 8 bits
        jsr intfac
        jsr facarg
        lda #00         
        ldy #24         ;Corrección de la posición del sprite , ya que coordnada
                        ;X o Y con valor 0, queda detrás del borde de la pantalla.

        jsr intfac
        jsr sum
        jsr facind
        ldy $65
        clc             ;Por si acaso XD
        lda $64         ;Si el numero calculado sobrepasa los 255, el Hibyte no sera 0
        beq sigue1      ;Si es cero, pasa de activar el msb
        lda #01         ;Si es > de 0 , pasa a activar el msb
        sta msb

sigue1  sty posprites ;posprites   ;
        rts             ;Vuelta al basic


*=$3000 ;#12288  12288/64=192 primer sprite
; Derecha
 BYTE 0,0,0
 BYTE 118,0,0
 BYTE 32,0,0
 BYTE 63,0,0
 BYTE 63,0,0
 BYTE 32,0,0
 BYTE 118,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0,0

; Izquierda
 BYTE 0,0,0
 BYTE 110,0,0
 BYTE 4,0,0
 BYTE 252,0,0
 BYTE 252,0,0
 BYTE 4,0,0
 BYTE 110,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0,0

; Abajo
 BYTE 0,0,0
 BYTE 66,0,0
 BYTE 126,0,0
 BYTE 90,0,0
 BYTE 24,0,0
 BYTE 90,0,0
 BYTE 90,0,0
 BYTE 24,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0,0

; Arriba
 BYTE 24,0,0
 BYTE 90,0,0
 BYTE 90,0,0
 BYTE 24,0,0
 BYTE 90,0,0
 BYTE 126,0,0
 BYTE 66,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0
 BYTE 0,0,0,0

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