Autore Topic: Smooth Scroller Con Le Badlines  (Letto 3267 volte)

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Smooth Scroller Con Le Badlines
« il: 13 Maggio 2006, 15:42:32 »
 Tratto dal "VIC-II compendium" basato su un articolo di Christian Bauer
Citazione
If you only delay the occurrence of the first Bad Line, you can scroll down the complete graphics display by large distances without moving a single byte in display memory.
In pratica,ogni qualvolta

- il raster si trova tra le linee 48 e 247
- i tre bit meno significativi di $d011 coincidono con i tre bit meno significativi del registro di raster ($d012)
- il blanking di schermo non è abilitato (bit 4 di $d011 settato)

il chip video prende 40 cicli di clock alla CPU per visualizzare i caratteri e i colori letti dalla memoria,cioè si ha la cosiddetta "condizione di badline".

Come detto nell'estratto,è possibile sfruttare questa caratteristica del VIC-II per scrollare verso il basso o verso l'alto il contenuto dell'intera matrice video,sia caratteri che colori.

Modificando i tre bit meno significativi di $d011 in modo che non corrispondano mai ai 3 LSB del registro di raster ($d012),si può "ritardare" la lettura dei caratteri e dei colori di un numero arbitrario di linee.
Se il numero di linee di ritardo viene incrementato o decrementato ad ogni quadro video,si ottiene rispettivamente uno smooth-scroller verso il basso o verso l'alto,che presenta almeno tre vantaggi rispetto agli scroller classici

- non ci sono sfarfallii perchè lo scrolling viene tenendo sotto controllo la posizione del pennello elettronico
- il microprocessore non ha il gravoso compito di dover spostare (almeno) 2000 byte alla volta
- non c'e' bisogno di usare buffer per evitare di perdere informazioni :)

Codice: [Seleziona]
;SMOOTH SCROLLING VERTICALE

* = $801

dummy = $ffff

.byte $0b,$08,$0a,$00,$9e
.text "2061"
.byte $00,$00,$00

lda #127
ldx #50
ldy #0
sta $dc0d
stx $d012
sty $3fff
and $d011
sta $d011
lda #<irq
ldx #>irq
ldy #1
sta $314
stx $315
sty $d01a
rts              
                ; +IRQ
                ;------
irq
    ldy #1      ;40-43 <-- Y = linee di ritardo
lp  ldx $d011    ;44-47
    inx          ;46-49
    txa          ;48-51
    and #7      ;50-53
    ora #24      ;52-55
    sta $d011    ;56-59 <-- ritarda le badlines
    inc dummy    ;62- 2
    dec dummy    ; 5- 8
    inc dummy    ;11-14
    dec dummy    ;17-20
    inc dummy    ;23-26
    dec dummy    ;29-32
    lda dummy    ;33-36
    dey          ;35-38
    bne lp      ;38-41
    lda irq+1    ;41-44
    adc #3      ;43-46
    and #7      ;45-48
    ora #24      ;47-50      
dr  inc irq+1    ;53-56
    ldy dummy    ;57-60
    sta $d011    ;61- 1
    lda #255
    sta $d012
    lda #<adj
    sta $314
    lda #>adj
    sta $315
    lsr $d019
    jmp $ea81

;-- aggiusta $d011 (fuori textscreen)
adj
    lda irq+1
    cmp #187
    bne ok
    lda dr
    eor #32
    sta dr      ;inverte direzione
ok  cmp #0
    beq ext
    lda #27
    sta $d011    ;ripristina scrollreg
    lda #50
    sta $d012
    lda #<irq
    sta $314
    lda #>irq
    sta $315
    lsr $d019
    jmp $ea81
    
;-- ripristina le condizioni normali --
ext
    lda #1
    sta irq+1
    lda #$ee
    sta dr
    lda #0
    sta $d01a
    lda #129
    sta $dc0d
    lda #$31
    sta $314
    lda #$ea
    sta $315
    jmp $ea81

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Smooth Scroller Con Le Badlines
« Risposta #1 il: 13 Maggio 2006, 16:24:35 »
 Ottimo. Karmody/HF lo usa sempre per far apparire/sparire le pic nelle sue rels.
Peccato che abbia un utilizzo limitato, lo spazio lasciato vuoto visualizza solo il byte a $3fff, ma per scrollare una schermata statica e' l'ideale.  
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Smooth Scroller Con Le Badlines
« Risposta #2 il: 13 Maggio 2006, 20:57:55 »
 Peraltro mi sono accorto che anche CCC 64 (che preto scansionerò  :D ) affronta l'argomento.
Usa $d012 invece del timing e controlla lo scrolling da Basic,ma il funzionamento è analogo.Riporto qui di seguito il caricatore basic

Codice: [Seleziona]
start tok64 scroll.prg
120 REM
130 FORa=49152TO49295
135 READ b:c=c+b
140 POKE a,b
145 NEXT a
150 IF c<>18297 THEN PRINT "errore":END
155 SYS49152:PRINT CHR$(147)
165 POKE 53280,0:POKE 53281,0
170 PRINT CHR$(158)TAB(12)"movedown"
175 PRINT CHR$(30)TAB(11)"emilitri 89"
180 FOR a=60 TO 120
185 FORb=0TO5
190 NEXT b
195 POKE 254,a
200 NEXT a
205 FORa=120TO60STEP-1
210 FORb=0TO5
215 NEXT b
220 POKE 254,a
225 NEXT a
230 GOTO 180
235 STOP:STOP:STOP:STOP:STOP
255 DATA 120,169,94,141,20,3,169
260 DATA 192,141,21,3,169,0,141
265 DATA 14,220,169,1,141,26,208
270 DATA 169,27,141,17,208,169,32
275 DATA 141,18,208,162,0,160,16
280 DATA 169,3,133,1,189,0,208
285 DATA 72,169,4,133,1,104,157
290 DATA 0,208,202,208,237,238,41
295 DATA 192,238,50,192,136,208,228
300 DATA 169,55,133,1,169,208,141
305 DATA 41,192,141,50,192,169,148
310 DATA 141,0,221,169,196,141,136
315 DATA 2,169,0,133,254,141,255
320 DATA 255,88,96,120,166,254,240
325 DATA 26,234,234,234,173,18,208
330 DATA 41,7,9,16,141,17,208
335 DATA 160,7,136,208,253,234,234
340 DATA 202,208,233,76,130,192,169
345 DATA 27,141,17,208,169,1,141
350 DATA 25,208,169,32,141,18,208
355 DATA 88,76,49,234
360 END
stop tok64
(bastext 1.04)