Autore Topic: Missing Cycles E Sprite  (Letto 1564 volte)

Tremal-Naik

  • Neo-iscritto
  • *
  • Post: 21
  • Gioco Preferito: Turrican
Missing Cycles E Sprite
« il: 18 Agosto 2004, 14:33:46 »
 E' da stamattina che mi sto leggendo l'articolo di Pasi Ojala sulla sincronizzazione dei raster usando gli sprite... I concetti che ci stanno dietro li sto capendo abbastanza ma e' il perche' questa tecnica funziona che non mi vuole entrare in testa.

Come esperimento ho anche fatto un programma sulla falsa riga del tutorial ma non mi ha aiutato molto...

Qualcuno di voi riesce a chiarirmi le idee?

Codice: [Seleziona]
                   
                    processor 6502

                    org $0900

RASTER = $fa
                    sei
                    lda #$7f
                    sta $dc0d              ; Disabilito interrupt del CIA

                    lda #$01
                    sta $d01a              ; Abilito raster IRQ
                    lda #%0000001
                   sta $d015              ; Abilito lo sprite 0


                    lda #<irq_routine
                    sta $0314
                    lda #>irq_routine
                    sta $0315

                    lda #$1b
                    sta $d011
                    lda #RASTER
                    sta $d012              ; Interrupt a $0fb

                    lda #RASTER-20
                   sta $d001              ; L'ultima riga dello sprite coincide con
                                           ; il raster su cui voglio l'interrupt


                    lda #$00
                    sta $d017              ; Gli sprite non sono espansi
                    cli
                    rts

irq_routine

                    nop
                    nop
                    nop
                    nop
                    nop
                    nop
                    nop
                    nop
                    nop



                    ldy #0
draw_bar
                    lda color,y
                    ldx color2,y

                    sta $d020
                    stx $d020
                    sta $d020
                    stx $d020
                    sta $d020
                    stx $d020
                    sta $d020
                    stx $d020
                    sta $d020
                    stx $d020
                    sta $d020
                    stx $d020


                    iny
                    cpy #color_end-color

                    bne draw_bar
                    lda #$00
                    sta $d020

                   ;jsr rotate_color

                    lda #$01
                    sta $d019

                    jmp $ea31


color
                    dc.b 0,1,2,3,4,5,6,7
                    dc.b 7,0,1,2,3,4,5,6
                    dc.b 6,7,0,1,2,3,4,5



color_end

color2
                    dc.b 8,9,10,11,12,13,14,15
                    dc.b 15,8,9,10,11,12,13,14
                    dc.b 14,15,8,9,10,11,12,13



color2_end

rotate_color
                    lda color2_end-2
                    sta $fe
                    ldx #(color2_end-color-2)
rotr
                        lda color-1,x
                        sta color  ,x
                        dex
                        bne rotr
                        lda $fe
                        sta color

                        rts

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Missing Cycles E Sprite
« Risposta #1 il: 14 Settembre 2004, 13:59:58 »
 Ciao

Stavo leggendo anch'io quegli articoli :)
In pratica,da quel che ho capito io per ottenere certi effetti grafici devi sincronizzare la cpu e il chip video; per farlo metti uno sprite nel punto dello schermo in cui vuoi la sincronizzazione,e crei un ritardo (per esempio attraverso delle istruzioni NOP) che termina nel momento in cui il VIC ha finito (o ha iniziato) a decodificare lo sprite:in entrambi i casi,la cpu deve aspettare che il chip video liberi il bus,prima di poter tornare ad eseguire istruzioni (perchè,come detto nell'articolo,cpu e VIC non possono usare il bus contemporaneamente).
Non appena il VIC libera il bus parte il rasterbeam,che può così operare in sincronia con la cpu (in parole povere,il rasterbeam ridisegna lo schermo man mano che la cpu riempie i registri del chip video).

Mi rendo conto che la mia spiegazione è sommaria e imprecisa,ma questo non è concetto che si spiega in due parole,e meriterebbe una trattazione a parte.

P.S.:per chi fosse interessato,questo articolo si trova sul numero 3 di C= Hacking.