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

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Assembler - Cosas que voy aprediendo
« Respuesta #30 en: Julio 30, 2015, 16:44:34 »
¿Porqué lo de "muni"?, mi cerebro está contaminado y al leer "muni" inmediatamente veo el diminutivo de Municipalidad...
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Assembler - Cosas que voy aprediendo
« Respuesta #31 en: Julio 30, 2015, 16:46:09 »
¿Porqué lo de "muni"?, mi cerebro está contaminado y al leer "muni" inmediatamente veo el diminutivo de Municipalidad...

muni = Mountain Unicycle... es como Mountain Bike, pero para monociclos.
Y es un deporte real... no es un invento mio :)

https://www.google.com/search?q=google+images&es_sm=91&source=lnms&tbm=isch&sa=X&ved=0CAcQ_AUoAWoVChMIoOaaoYyDxwIV0qSICh1d6Qq3&biw=1435&bih=778#tbm=isch&q=mountain+unicycle

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Assembler - Cosas que voy aprediendo
« Respuesta #32 en: Julio 30, 2015, 20:34:45 »
No tenía ni idea de este deporte!

En ese enlace he visto la foto que usaste, me parece que hay otras que se nota mejor que es un monociclo, por ejemplo esta:
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Assembler - Cosas que voy aprediendo
« Respuesta #33 en: Julio 30, 2015, 21:48:56 »
gracias. es buena esa foto.

riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Assembler - Cosas que voy aprediendo
« Respuesta #34 en: Julio 30, 2015, 22:11:17 »
¿Mejor ahora?


Lo que me gustaba de la foto original, es que era yo el que estaba andado :-P

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Assembler - Cosas que voy aprediendo
« Respuesta #35 en: Julio 30, 2015, 22:16:51 »
Lo que me gustaba de la foto original, es que era yo el que estaba andado :-P
Lo sabía, mi 9º bit me decía que usaste esa foto era por eso! :D

Tampoco la descartes tan rapidamente!
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Assembler - Cosas que voy aprediendo
« Respuesta #36 en: Julio 30, 2015, 22:20:42 »
Viendo la foto original, tu conversión ha quedado muy parecida.

Bancos de memoria: $1000 y $9000

Pero si uno usa los bancos 0, 2 ($0000-$3FFFF y $8000-$BFFF) no se pueden usar la direcciones que estan entre $1000-$1FFF  y $9000-$9FFFF para poner sprites, graficos y charsets. Cuando le dicen al VIC que use esas direcciones, los lee de la ROM en vez de la RAM.



No lo sabia. Creia que tenia acceso a toda la RAM.
Estas cosas son las que me matan a la hora de tratar con mi pequeñin. Nunca lo he leido en ningún libro de los que tengo asi que, ¿como lo averiguas cuando tu programa falla antes de pegarte un tiro?.

Me falta aun mucha practica y leer mucha documentación.
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 #37 en: Julio 30, 2015, 23:01:34 »
No lo sabia. Creia que tenia acceso a toda la RAM.

Vos podes usar toda la RAM, los 64k.
Pero el VIC no puede ver la RAM que esta entre $1000-$1FFF y $9000-$9FFF.
O sea, vos podes poner código en esos lugares. Pero no pongas sprites, graficos y charsets.

Para más info leer este articulo: http://www.zimmers.net/cbmpics/cbm/c64/vic-ii.txt
Ir a la sección 2.4.2

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Assembler - Cosas que voy aprediendo
« Respuesta #38 en: Julio 30, 2015, 23:31:24 »
Parece ser un buen lugar para poner el código, no?
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Assembler - Cosas que voy aprediendo
« Respuesta #39 en: Julio 30, 2015, 23:32:03 »
Vos podes usar toda la RAM, los 64k.
Pero el VIC no puede ver la RAM que esta entre $1000-$1FFF y $9000-$9FFF.
O sea, vos podes poner código en esos lugares. Pero no pongas sprites, graficos y charsets.

Para más info leer este articulo: http://www.zimmers.net/cbmpics/cbm/c64/vic-ii.txt
Ir a la sección 2.4.2

Vaale. La memoria de color no se mueve selecciones el banco que selecciones , el VIC accede a 16k de cada página pero las zonas 0 y 2 contienen los carcteres en ROM . Creo que voy pilandolo , aunque la ROM CHAR no se mueve, el VIC no lo sabe y sigue saltandose ese hueco ¿no?.
 
Las zonas 1 y 3 son 100% aprovechables.

Me estoy releyendo los libros que tengo para ponerme al dia y en el GUIA DE REFERENCIA DEL COMMODORE 64 de Microelectronica y control comentan los mapas y los huecos.

Grácias por el fichero DOC.  Toda ayuda es poca  ;)
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Assembler - Cosas que voy aprediendo
« Respuesta #40 en: Julio 30, 2015, 23:33:59 »
Parece ser un buen lugar para poner el código, no?

Nada que empleé el VIC debe ser puesto en esas zonas . Codigo , sin problemas o eso interpreto.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Assembler - Cosas que voy aprediendo
« Respuesta #41 en: Julio 31, 2015, 22:12:05 »
A mi me tiene frito el tema interrupciones.
Hay como 100 maneras diferentes para hacerlo, aunque este listado (que adjunto al post) para mi es el mas coherente y temendamente estable.
Riq, tu lo tienes dominado, pero a mi se me resiste. Emplearlas es fácil, pero comprender al 100% el por qué funciona aún se me escapa.

Con lo fácil que son las interrupciones en un Arduino ...  ::)
Te la dejo por si te sirve para el juego y por si puedes iluminarme un poco sobre este tema.

Código: [Seleccionar]

                             ; CBM prg Studio
; 10 SYS (4096)

*=$801

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

;Aparece el sprite 0 en las dos mitades de la pantalla, pero solo es por probar la rutina.

;Los valores de pantalla de rastreo en zona visible , van de 50 a 250.
;150 es el centro. 250+50=300  300/2=150 .

superior=50         ;Primera pantalla. La superior
inferior=150 ;150        ;Segunda pantalla. Inferior
                *=$1000
        lda #255
        sta 2040       ;Puntero sprite 0 en 255
        lda #1
        sta $d015       ;Sprite 0 activado
       

        sei         ; set interrupt disable flag
        ldy #$7f    ; $7f = %01111111
        sty $dc0d   ; Turn off CIAs Timer interrupts
        sty $dd0d   ; Turn off CIAs Timer interrupts
        lda $dc0d   ; cancel all CIA-IRQs in queue/unprocessed
        lda $dd0d   ; cancel all CIA-IRQs in queue/unprocessed
        lda #$01    ; Set Interrupt Request Mask...
        sta $d01a   ; ...we want IRQ by Rasterbeam
        lda #<irq   ; point IRQ Vector to our custom irq routine
        ldx #>irq
        sta $314    ; store in $314/$315
        stx $315   
        lda #superior    ; trigger first interrupt at row zero
        sta $d012
        lda $d011   ; Bit#0 of $d011 is basically...
        and #$7f    ; ...the 9th Bit for $d012
        sta $d011   ; we need to make sure it is set to zero
        cli         ; clear interrupt disable flag
        rts

irq     dec $d019 ; acknowledge IRQ
        lda $d012
        cmp #inferior
        beq rojo        ;Segunda mitad
        lda #0
        sta $d021        ;Color negro en pantalla
        lda #inferior
        sta $d012       ;Nuevo valor segnda pantalla
        lda #80
        sta $d000
        sta $d001
        jmp pasa

rojo    lda #2
        sta $d021        ;Color rojo en pantalla
        lda #superior
        sta $d012        ;nuevo valor primera mitad
        lda #200
        sta $d000
        sta $d001
pasa    jmp $ea31

« última modificación: Julio 31, 2015, 22:14:21 por Maniako »
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 #42 en: Agosto 01, 2015, 00:18:36 »
y por si puedes iluminarme un poco sobre este tema.

en concreto, ¿qué dudas tenes sobre las interrupciones?

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Assembler - Cosas que voy aprediendo
« Respuesta #43 en: Agosto 01, 2015, 07:58:05 »
Como desviarlas no.
Es el por qué de como conseguir fluidez y estabilidad.
Veo muchas maneras de eliminar esos flicks que afean y dejar los cortes de cambio de color impecables, pero cada cual usa una manera distinta de manipular los registros del VIC para conseguirlo y eso me desorienta.

Usando las CIAS es sencillo conseguir que cada cierto tiempo se ejecute mi rutina, pero usando el RASTER para por ejemplo conseguir multiples SPRITES o diferentes modos graficos a la vez según donde esté la linea de barrido es mas lioso.
Cada cual usa técnicas que difieren unas de otras para conseguirlo.
Si por lo menos siguieran un patrón lo llegaria a comprender, pero hasta ahora solo coinciden en muy pocas cosas y contra mas rutinas leo, mas me confunden.


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 #44 en: Agosto 01, 2015, 19:08:57 »
A mi me sirvió entender el porqué de la inestabilidad del raster para entender lo demás... así que empiezo por el principio:

¿por qué la IRQ del raster es inestable?

El barrido de la pantalla se hace unas 50 veces por segundo en PAL-B (la Commodore europea).
Y uno le puede decir a la commodore que te avise cuando empiece el barrido, y que te avise cuando el raster esta en cierta posición del barrido.

Supongamos que quiero que la interrupción me avise cuando el raster esta en la posición 50.
Entonces se hace lo tradicional de poner el vector $314 apuntando a donde queres, poner #50 en $d012, y demas.

Pero vas a ver que a veces sos llamado en el medio de la "scan line", o a veces al principio... como si fuera aleatorio.
Pero en verdad no es aleatorio, y sos llamado de acuerdo a lo siguiente:

a) Supongamos que el raster llega a la linea 50
b) La interrupción interrumpe lo que esta sucediendo en bucle principal
c) Para eso tiene que dejar terminar la instrucción que se este ejecutando
d) y luego pone en el stack A,X,Y, status y PC.
e) y luego te llama a tu código.

La unica incógnita es c)... no se sabe que instrucción se esta ejecutando... y hay instrucciones que tardan 2 ciclos y otras que pueden tardar 7.
Y esos 5 ciclos de diferencia es el "randomness" que ves en las "raster inestables".

¿Como prevenirlos?

Hay distintas técnicas. La que yo estoy usando es una llamada "doble IRQ" que esta muy bien explicada aca:
http://codebase64.org/doku.php?id=base:stable_raster_routine

La idea es la siguiente:
Como no sabes lo que pasa en c), la idea es poner una primera IRQ llena de NOPs y luego otra, con la idea de que la segunda IRQ se llame cuando se estan ejecutando los NOPs... y luego un truquito más que esta explicado en ese documento.

El código mencionado ahí lo puse en esta macro en format CA65:
https://github.com/ricardoquesada/c64-the-muni-race/blob/master/src/mymacros.mac