Autore Topic: Raster Split Scroller  (Letto 6888 volte)

Freshness79

  • Utente
  • **
  • Post: 128
  • Gioco Preferito: Dizzy collection
Raster Split Scroller
« il: 09 Aprile 2009, 23:39:16 »
Ciao a tutti,

ho provato a giocare ancora un po' col VIC, nel tentativo di ricreare un effetto che in molti demo si può vedere.
Il programma allegato é uno scroller verticale creato cambiando il colore dello sfondo in modo sincrono ai raster.
La font é chiaramente presa da quella standard del 64 (lo ammetto iAN, sono pigro :D), volendo utilizzarne una di personalizzata bisogna tenere presente che solo i 7 bit più significativi vengono utilizzati perché 7 sono i raster split che sono riuscito a mettere in fila nella main routine.
In un prossimo post metterò anche il source, nel frattempo fatemi sapere cosa ne pensate!
« Ultima modifica: 21 Gennaio 2015, 23:39:04 da eregil »

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Raster Split Scroller
« Risposta #1 il: 09 Aprile 2009, 23:48:01 »
 te l'ho gia' detto in chat ma lo rendo pubblico, che figata assurda :sabber:
sono commosso :lol:  
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

saver71

  • Utente
  • **
  • Post: 279
  • Amante degli anni '80
    • saver71 - YouTube
Raster Split Scroller
« Risposta #2 il: 10 Aprile 2009, 09:32:13 »
 Fantastico! I miei complimenti!!  ;)  

Freshness79

  • Utente
  • **
  • Post: 128
  • Gioco Preferito: Dizzy collection
Raster Split Scroller
« Risposta #3 il: 14 Aprile 2009, 14:27:31 »
Grazie mille dei commenti, vi sottopongo lo stesso programma con qualche piccolo aggiustamento; appena avrò messo a punto tutto posterò anche il source code.
Per il momento queste sono le novità:
- raster interrupt stabile
- posizionamento dinamico della finestra contenente l'effetto
- dimensionamento dinamico della finestra
- testo dello scroller illimitato (0 terminated)
- possibilità di aggiungere un sid
Al solito, fatemi sapere che ne pensate!
« Ultima modifica: 21 Gennaio 2015, 23:39:33 da eregil »

ice00

  • Utente
  • **
  • Post: 469
    • http://digilander.iol.it/ice00
Raster Split Scroller
« Risposta #4 il: 14 Aprile 2009, 17:01:41 »
 Fantastico!

Perchè non contatti il grupp CoVeNaNt? stanno cercando un coder per il loro prossimo demo, magari il tuo splitter ampliato ulteriormente potebbe trovarci posto ;)

Freshness79

  • Utente
  • **
  • Post: 128
  • Gioco Preferito: Dizzy collection
Raster Split Scroller
« Risposta #5 il: 14 Aprile 2009, 19:46:30 »
Grazie mille Ice00, sono lusingato!
Per quanto riguarda eventuali collaborazioni... beh credo sia ancora presto, é da poco che ho ripreso a programmare e sono ancora abbastanza arrugginito.
Detto questo, vi aggiorno con la versione "musicata".
L'effetto é quello di prima ho soltanto modificato le sinustable relative alla posizione iniziale e alla dimensione dell'effetto per fare in modo che lo scroll non oltrepassi il frame (diventa illeggibile...). Oltre a questo ho messo in sottofondo la stupenda selfmade executable di AMJ.
Come promesso rilascio il source commentato; probabilmente non tutto é in ordine e soprattutto alcune parti (specie verso fine frame) sono lungi dall'essere ottimizzate; comunque sia dovrebbe essere abbastanza agevole da leggere.

Codice: [Seleziona]
; **************************
; * Variabili in Zero page *
; **************************
;
; 50 - altezza effetto 1-256 (0)
; 51 - (LO)
; 52 - (HI) Puntatore sinus height
; 53 - posizione effetto 0-255
; 54 - (LO)
; 55 - (HI)
; 56 - 256-altezza (uso interno)
; 57 - posizione effetto - movimento laterale
; 58 - contatore verticale 5 bit (blocco)
; 59 - contatore font 3 bit (carattere)
; 5A - (LO)
; 5B - (HI) Puntatore carattere
; 5D - (LO)
; 5E - (HI) Puntatore stringa
; 5F - vario


; ****************************
; * Valori da non modificare *
; ****************************

opcode_sta = $8d  ; Opcode per sta abs (valore 0)
opcode_stx = $8e  ; Opcode per stx abs (valore 1)
opcode_jmp = $4c  ; Opcode per jmp abs
NPixel  = 8    ; Numero di pixel (7+1 split, l'ultimo ripristina il colore di sfondo)
ypos  = (($130-2-height)/2)-3; posizione verticale di partenza

; ***********************
; * Valori modificabili *
; ***********************

height  = 20; Altezza dell'effetto (MAX 256)
bgcolor  = $d020; Indirizzo di gestione del colore di sfondo
precalc  = $2500; Indirizzo di partenza tabelle precalcolate
bsr_baseHi = $40  ; Byte splitter routines base address (High order) 20 bytes ciascuna x 128 routine
charbase = $5000; character map
colsfondo = 15; Colore di sfondo
coltesto = 0 ; Colore del test
outsfondo = 5 ; Colore bordo esterno


        *=$0801
        word eoprg
        word 2009
        byte $9E,[intro]d
        petc " by freshness79"
        byte 0
eoprg
        word 0
        *=$0820

intro   
  jsr set_routine_table; Creazione delle routine raster
        jsr initialize  ; Inizializzazione valori 
  jsr initIRQ  ; Inizializzazione raster IRQ
  jsr init  ; Inizializzazione sid player
  cli    ; Interrupt attivati
  jmp *    ; Stiamo in attesa...
 
 
; ***************************************************
; * Routine di sincronizzazione a doppio raster IRQ *
; ***************************************************
; La prima chiamata IRQ é su JMP, quindi l'incertezza é di 1-3 cicli
; Il primo handler permette di ridurla a 1-2 cicli: IRQ arriva sulla NOP
; Il secondo handler infine grazie ad un confronto a fine raster elimina
; l'ultima possibile incertezza
   
fstirq  lsr $d019  ; 6 + (36 Kernal IRQ) + (da 2 a 4 JMP)
  inc $d012  ; 6 interrupt al prossimo raster 
  lda #<secirq ; 2 reimposto il vettore IRQ perché punti
  sta $0314  ; 4 al secondo handler 
  cli    ; 2 attivo gli interrupt
  nop    ; 2 (63-65) <= IRQ
  nop    ; 2 (65-67) <= IRQ 
  nop    ; 2 
  nop    ; 2
  brk    ; Qua non ci si arriva mai, lascio BRK per test
secirq asl $d019  ; 6 + (36 Kernal IRQ) + (da 2 a 3 NOP) 
;lda $53  ; 3 
;sta $d012  ; 4
  lda $ff
  lda $ffff
  lda $d012  ; 4
  ldx #<fstirq       ; 2 ripristino il vecchio IRQ pointer
  nop    ; 2w
  cmp $d012  ; 4  se il ritardo dovuto alla NOP era 1   
  beq synced  ; 2/3 effettuo un branch per allinearmi
synced stx $0314  ; 4 salvo il vettore IRQ
  lda #$00  ; -> RASTER STABILE! 
  sta $d020  ; Riga orizzontale
  tsx    ; ripristino stack pointer
  txa
  clc
  adc #$06
  tax
  txs


 
 
; *******************************
; * Gestione movimento laterale *
; *******************************
; La routine che segue permette di spostare orizzontalmente lo
; scroller. L'effetto é realizzato prendendo valori dalla tabella
; precalcolata ed usandoli per creare un ritardo.
; La parte unitaria del ritardo viene gestita con un branch, quella
; multipla di 2 con dei NOP ($EA) ed un branch obbligato calcolato al
; momento con la modifica del codice in fase di esecuzione
; Contestualmente a questa routine viene creata anche la barra di divisione
; superiore e viene aggiornata la posizione di scroll.

  ldy #colsfondo ; Linea divisoria     
  inc getch+1  ; Aggiornamento posizione scroll verticale
        inc getch+1  ; Aggiornamento posizione scroll verticale
  inc $ffff  ; 6w
  inc $ffff  ; 6w
  sta $ffff  ; 4w
 
  ldx $57  ; 3 Aggiorno la posizione nella 
        inx    ; 2 tabella precalcolata
        stx $57  ; 3
        lda sinus,x  ; 4 carico il valore corrente
  lsr    ; 2 estraggo il bit meno significativo e lo uso
  sty $d020  ; 
  bcc stp1  ; 2/3 uso per creare un eventuale ritardo unitario
stp1 sta sinmod+1       ; 4 con il rimanente creo un displacement all'interno 
sinmod  bpl *  ; 2 di un elenco di NOP
  ds $0f,$ea  ; (2-30) NOP (la nop impiega 2 cicli)
  nop    ; 2w
  nop    ; 2w
  sec    ; 2 Per fare uno scroll alto X basta
  lda #$00  ; 2 skippare 256-X raster.
  sbc $50  ; 3 Il registro che conta i raster in
  sta $56  ; 3 questo caso é y
  tay    ; 2 => inizializzazione contatore raster line

 
; ***********************
; * Main raster routine *
; ***********************
; questa routine crea l'effetto di split raster.
; La routine si compone esattamente di 63 cicli, la lunghezza
; in termini di timing di una raster line.
; Si estrae il valore dall'elenco codes e lo si usa direttamente
; come low byte del JMP indiretto.

posct ldx #coltesto ; 2 inizializzazione colore del testo
retAdd
        iny                ; 2 incremento il contatore delle raster line
        beq cont           ; 2 se sono 256 possiamo uscire
getch   lda codes  ; 4 caricamento codice di riga
        inc getch+1        ; 6 aggiornamento dell'indice dei codici di riga
        sta rt_jmp+1       ; 4 salvataggio del codice nel low byte della jmp indiretta
        lda #colsfondo ; 2 caricamento colore di sfondo
        stx $5f            ; 3w (23) ...wait...   
rt_jmp  jmp (jmp_table)    ; => 40 (comprensivo delle due jmp)


; ***************************************
; * Routine di aggiornamento e chiusura *
; ***************************************
;
; La routine che segue aggiorna la tabella codes tramite 3 chiamate
; alla relativa subroutine e sposta l'indice poi usato nella raster routine.
; Seguono due chiamate alla routine sid player ed infine l'uscita dall'interruzione.
; il 6510 appena esce da questa routine torna alla "JMP *" della intro.

cont ldx $57  ; 3 Aggiorno la posizione nella
  sec    ;
  lda #$1f  ;
  sbc sinus,x  ; 4 carico il valore corrente
  lsr    ; 2 estraggo il bit meno significativo e lo uso
  bcc stp2  ; 2/3 uso per creare un eventuale ritardo unitario
stp2 sta brw+1  ;
brw  bpl *  ; 2 di un elenco di NOP
  ds $0f,$ea  ; (2-30) NOP (la nop impiega 2 cicli)
      ; Ora la routine é nuovamente in sync
 
  clc    ; effettuo uno skip delle linee che non ho
  lda getch+1  ; visualizzato (necessario se l'altezza é
  adc $56  ; diversa da 256)
  sta getch+1  ;
  lda $ff  ; 3w
  sta $ffff  ; 4w
  inc $ffff  ; 6w
  ldx #outsfondo ; Colore sfondo esterno
  sty $d020  ; Linea orizzontale inferiore (y=0)

  clc    ; 2 Aggiornamento effetto
  lda $51  ; 3 sinusoide sulla dimensione
  adc #$01  ; 2 della finestra di visualizzazione
  sta $51  ; 3
  lda $52  ; 3
  adc #$00  ; 2
  and #$01  ; 2
  ora #>heightsinus; 2
  sta $52  ; 3
  lda ($51),y  ; 5
  sta $50  ; 3 - 30 cicli
  clc    ; 2 Aggiornamento effetto
  lda $54  ; 3 sinusoide sulla posizione
  adc #$01  ; 2 della finestra di visualizzazione
  sta $54  ; 3
  lda $55  ; 3
  adc #$00  ; 2
  and #$01  ; 2
  ora #>possinus ; 2
  sta $55  ; 3
  lda ($54),y  ; 5
  sta $53  ; 3 - 30 cicli
  sta $d012
  lda ($5f),y  ; 5w 
 
  stx $d020  ; sfondo esterno
 
  jsr play  ; aggiornamento
  jsr play  ; sid player
 
  ldx #$00
  jsr scroll_update   
        inc getch+1         
        jsr scroll_update   
        inc getch+1         
        jsr scroll_update     

  cli    ; Interrupt nuovamente attivi
  pla    ; ripristino dei tre
  tay    ; registri 
  pla    ;
  tax    ;
  pla    ; ritorno alla routine iniziale
  rti    ; (il JMP * della intro)


; ********************************
; * Aggiornamento dello scroller *
; ********************************
; 58 - contatore verticale 5 bit (blocco)
; 59 - contatore font 3 bit (carattere)
; 5A - (LO)
; 5B - (HI) Puntatore carattere
; 5D - (LO)
; 5E - (HI) Puntatore stringa

scroll_update
        ldy #$00           ; 2
        clc                ; 2
        lda $58            ; 3
        adc #$01           ; 2
        ora #$F0           ; 2
        sta $58            ; 3
;  bcc nomod  ; 2/3
        lda $59            ; 3
        adc #$00           ; 2
        ora #$F8           ; 2
        sta $59            ; 3
        lda $5D            ; 3
        adc #$00           ; 2
        sta $5D            ; 3
  lda $5E  ; 3
  adc #$00  ; 2
  sta $5E  ; 3
        lda ($5D),y        ; 5
  bne skipch  ; 2/3
  lda #<testo  ; 2
  sta $5D  ; 3
  lda #>testo  ; 2
  sta $5E  ; 3
  lda ($5D),y        ; 5
skipch sty $5B            ; 3
        sta $5A            ; 3
        asl $5A            ; 5
        rol $5B            ; 5
        asl $5A            ; 5
        rol $5B            ; 5
        asl $5A            ; 5
        rol $5B            ; 5
        lda $5A            ; 3
        adc #<charbase     ; 2
        sta $5A            ; 3
        lda $5B            ; 3
        adc #>charbase     ; 2
        sta $5B            ; 3
nomod lda $59            ; 3
        and #$07           ; 2
        tay                ; 2
        lda getch+1        ; 4
        sta getmp+1        ; 4
        lda ($5A),y        ; 5
        and #$fE           ; 2
getmp   sta codes,x        ; 4
        rts                ; 6 - 121


; **********************************************
; **********************************************
; * A seguire due funzioni di inizializzazione *
; * delle tabelle e dello schermo              *
; **********************************************
; **********************************************
 
; ****************************************
; * Costruzione della tabella di routine *
; ****************************************
;
; Ogni esecuzione costa 4*NPixel+3 cicli (3 per il JMP e 4*NPixel per gli STA)
; per un totale quindi di 35 cicli con 8 pixel.
; Esempio di routine (questa disegna 01010000):
: sta $d020
; stx $d020
; sta $d020
; stx $d020
; sta $d020
; sta $d020
; sta $d020
; sta $d020
; jmp retAdd
; Ogni routine occupa $20 bytes per rendere più comoda l'indicizzazione (in realtà ogni
; routine é effettivamente composta da 27 byte, 5 quindi vanno persi).

set_routine_table       
        lda #bsr_baseHi
        sta $fc
        lda #$00
        sta $fb
        ldx #$00
rs_byt  stx $fd
        asl $fd
        ldy #$00
rs_lop  asl $fd
        bcs rs_set
        lda #opcode_sta
        bne rs_put
rs_set  lda #opcode_stx
rs_put  sta ($fb),y
        iny
        lda #<bgcolor
        sta ($fb),y
        iny
        lda #>bgcolor
        sta ($fb),y
        iny
        cpy #(NPixel*3)
        bne rs_lop
        lda #opcode_jmp
        sta ($fb),y
        iny
        lda #<retAdd
        sta ($fb),y
        iny
        lda #>retAdd
        sta ($fb),y
        clc
        lda $fb
        adc #$20
        sta $fb
        lda $fc
        adc #$00
        sta $fc
        inx
        cpx #(1<<(NPixel-1))
        bne rs_byt


; **************************
; * Costruzione jump table *
; **************************
;
; Questa routine crea 128 coppie di byte che puntano ad altrettante
; routine raster. Questa jump table viene usata dalla routine raster
; con una jump indiretta.

        ldx #$00
        lda #$00
        sta $fb
        lda #bsr_baseHi
        sta $fc
jmpcr   clc
        lda $fb
        sta jmp_table+0,x
        adc #$20
        sta $fb
        lda $fc
        sta jmp_table+1,x
        adc #$00
        sta $fc
        inx
        inx
        bne jmpcr
  lda heightsinus
  sta $50
  lda #<heightsinus
  sta $51
  lda #>heightsinus
  sta $52
  lda possinus
  sta $53
  lda #<possinus
  sta $54
  lda #>possinus
  sta $55 
        rts



; ***************
; * Inizializza *
; ***************
;
; La routine copia in RAM la charmap standard del 64

initialize
  sei
        lda #$23
        sta $01
        ldx #$00
chsrc   lda $d000,x
chdes   sta charbase,x
        inx
        bne chsrc
        inc chsrc+2
        inc chdes+2
        lda chsrc+2
        cmp #$D8
        bne chsrc
        lda #$27
        sta $01
  lda #<testo
  sta $5d
        lda #>testo
        sta $5e
  cli 
        rts


; ************
; * Init IRQ *
; ************
;
; Disattivazione dell'interrupt standard,
; Impostazione della prima rasterline e dell'indirizzo
; del primo handler della routine di interrupt
; attivazione dei raster interrupt

initIRQ
  sei
        lda #$7f
        sta $dc0d
        sta $dd0d
  lda $dd0c
  lda $dc0c
  lda #$00
  sta $d011
  lda $53
  sta $d012
  lda #<fstirq
  sta $0314
  lda #>fstirq
  sta $0315
  lda #$01
  sta $d01a
  lsr $d019
  rts


; *********************************
; *********************************
; * Tabelle e valori precalcolati *
; *********************************
; *********************************


; ******************
; * Buffer grafico *
; ******************
;
; codes é il buffer nel quale c'é l'elenco costantemente aggiornato
; dei byte stampati a video
*=precalc
  align $100
codes
  ds $100,0

 
; *********
; * Testo *
; *********
;
; testo é il testo che viene sottoposto allo scroll

  align $100
testo
  scrl " ciao a tutti, quello che vedete e uno scroller basato su raster "
        scrl "splits. il testo viene generato cambiando di colore lo sfondo 8 "
        scrl "volte ogni linea... ogni split e lungo 32 pixel perche' "
        scrl "l'istruzione piu corta, la sta, impiega 4 cicli per essere "
        scrl "eseguita - mentre questo testo scorre il sid vi sta facendo "
  scrl "ascoltare la mitica selfmade executable di AMJ. Ho inserito "
  scrl "della musica come controprova che la sincronizzazione avviene "
  scrl "in ogni frame.     wrap!         "
 
  byte 0; E' fondamentale inserire il terminatore!!!!
       
 
; ***************
; * sinus table *
; ***************
;
; la tabella che segue rappresenta una sorta di sinus table utilizzata
; per creare l'effetto di oscillazione a destra e a sinistra.
; I 3 valori presenti (A9,A5,B5) rappresentano rispettivamente 3 tipi di LDA
; con 3 numeri di cicli diversi: A9 impiega 2 cicli, A5 ne impiega 3 e B5 ne
; impiega 4. Applicati al momento giusto nella routine permettono di mantenere
; la sincronia (3 cicli) o di mancarla di 1 posizione in più o in meno (2,4 cicli)
; ottenendo lo spostamento voluto nel successivo frame

  align $100
sinus
  .byte $0F,$0E,$0D,$0D,$0C,$0B,$0A,$0A,$09,$08,$08,$07,$06,$06,$05,$05
  .byte $04,$03,$03,$03,$02,$02,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00
  .byte $00,$00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$02,$02,$03,$03,$04
  .byte $04,$05,$05,$06,$07,$07,$08,$09,$09,$0A,$0B,$0B,$0C,$0D,$0E,$0E
  .byte $0F,$10,$11,$11,$12,$13,$14,$14,$15,$16,$17,$17,$18,$18,$19,$1A
  .byte $1A,$1B,$1B,$1C,$1C,$1C,$1D,$1D,$1D,$1E,$1E,$1E,$1E,$1E,$1E,$1E
  .byte $1E,$1E,$1E,$1E,$1E,$1E,$1E,$1D,$1D,$1D,$1D,$1C,$1C,$1B,$1B,$1A
  .byte $1A,$19,$19,$18,$17,$17,$16,$15,$15,$14,$13,$12,$12,$11,$10,$0F
  .byte $0F,$0E,$0D,$0C,$0C,$0B,$0A,$09,$09,$08,$07,$07,$06,$05,$05,$04
  .byte $04,$03,$03,$02,$02,$01,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00
  .byte $00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$02,$02,$02,$03,$03,$04
  .byte $04,$05,$06,$06,$07,$07,$08,$09,$0A,$0A,$0B,$0C,$0D,$0D,$0E,$0F
  .byte $10,$10,$11,$12,$13,$13,$14,$15,$15,$16,$17,$17,$18,$19,$19,$1A
  .byte $1A,$1B,$1B,$1C,$1C,$1D,$1D,$1D,$1E,$1E,$1E,$1E,$1E,$1E,$1E,$1E
  .byte $1E,$1E,$1E,$1E,$1E,$1E,$1E,$1D,$1D,$1D,$1C,$1C,$1B,$1B,$1B,$1A
  .byte $19,$19,$18,$18,$17,$16,$16,$15,$14,$14,$13,$12,$11,$11,$10,$0F


; **************
; * jump table *
; **************
;
; la tabella che segue viene costruita dal programma e contiene 128 indirizzi assoluti
; alle varie raster routine. L'i-esimo indirizzo della tabella punta alla routine
; raster che "disegna" il byte corrispondente a i.
; Ad esempio l'indirizzo 3 (byte 6,7) punta alla routine che disegna 0000011.

  align $100
jmp_table
        ds $0100,0
 

; ***************
; * sinus table *
; ***************
;

  align $200
possinus
 
dc.b $14,$14,$14,$14,$14,$14,$14,$14,$14,$15,$15,$15,$15,$16,$16,$16
dc.b $17,$17,$18,$18,$19,$19,$1A,$1A,$1B,$1B,$1C,$1D,$1D,$1E,$1F,$1F
dc.b $20,$21,$22,$23,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E
dc.b $2F,$30,$31,$32,$33,$35,$36,$37,$38,$39,$3A,$3C,$3D,$3E,$3F,$41
dc.b $42,$43,$44,$46,$47,$48,$4A,$4B,$4C,$4E,$4F,$50,$52,$53,$55,$56
dc.b $57,$59,$5A,$5B,$5D,$5E,$60,$61,$62,$64,$65,$66,$68,$69,$6B,$6C
dc.b $6D,$6F,$70,$71,$73,$74,$75,$77,$78,$79,$7A,$7C,$7D,$7E,$80,$81
dc.b $82,$83,$84,$86,$87,$88,$89,$8A,$8B,$8C,$8D,$8F,$90,$91,$92,$93
dc.b $94,$95,$96,$96,$97,$98,$99,$9A,$9B,$9C,$9C,$9D,$9E,$9F,$9F,$A0
dc.b $A1,$A1,$A2,$A3,$A3,$A4,$A4,$A5,$A5,$A6,$A6,$A6,$A7,$A7,$A8,$A8
dc.b $A8,$A8,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9
dc.b $A9,$A9,$A9,$A9,$A8,$A8,$A8,$A8,$A7,$A7,$A6,$A6,$A6,$A5,$A5,$A4
dc.b $A4,$A3,$A3,$A2,$A1,$A1,$A0,$9F,$9F,$9E,$9D,$9C,$9C,$9B,$9A,$99
dc.b $98,$97,$96,$96,$95,$94,$93,$92,$91,$90,$8F,$8D,$8C,$8B,$8A,$89
dc.b $88,$87,$86,$84,$83,$82,$81,$80,$7E,$7D,$7C,$7A,$79,$78,$77,$75
dc.b $74,$73,$71,$70,$6F,$6D,$6C,$6B,$69,$68,$66,$65,$64,$62,$61,$60
dc.b $5E,$5D,$5B,$5A,$59,$57,$56,$55,$53,$52,$50,$4F,$4E,$4C,$4B,$4A
dc.b $48,$47,$46,$44,$43,$42,$41,$3F,$3E,$3D,$3C,$3A,$39,$38,$37,$36
dc.b $35,$33,$32,$31,$30,$2F,$2E,$2D,$2C,$2B,$2A,$29,$28,$27,$26,$25
dc.b $24,$23,$23,$22,$21,$20,$1F,$1F,$1E,$1D,$1D,$1C,$1B,$1B,$1A,$1A
dc.b $19,$19,$18,$18,$17,$17,$16,$16,$16,$15,$15,$15,$15,$14,$14,$14
dc.b $14,$14,$14,$14,$14,$14
dc.b $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$15,$15,$15
dc.b $15,$15,$16,$16,$16,$16,$17,$17,$17,$18,$18,$18,$18,$19,$19,$19
dc.b $1A,$1A,$1A,$1B,$1B,$1C,$1C,$1C,$1D,$1D,$1D,$1E,$1E,$1F,$1F,$1F
dc.b $20,$20,$20,$21,$21,$21,$22,$22,$22,$23,$23,$23,$24,$24,$24,$24
dc.b $25,$25,$25,$25,$26,$26,$26,$26,$26,$27,$27,$27,$27,$27,$27,$27
dc.b $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27
dc.b $27,$26,$26,$26,$26,$26,$25,$25,$25,$25,$24,$24,$24,$24,$23,$23
dc.b $23,$22,$22,$22,$21,$21,$21,$20,$20,$20,$1F,$1F,$1F,$1E,$1E,$1D
dc.b $1D,$1D,$1C,$1C,$1C,$1B,$1B,$1A,$1A,$1A,$19,$19,$19,$18,$18,$18
dc.b $18,$17,$17,$17,$16,$16,$16,$16,$15,$15,$15,$15,$15,$14,$14,$14
dc.b $14,$14,$14,$14,$14,$14,$14,$14,$14,$14


  align $200

heightsinus

dc.b $FA,$F9,$F9,$F9,$F9,$F9,$F9,$F9,$F9,$F8,$F8,$F8,$F8,$F7,$F7,$F7
dc.b $F6,$F6,$F5,$F5,$F4,$F4,$F3,$F3,$F2,$F2,$F1,$F0,$F0,$EF,$EE,$EE
dc.b $ED,$EC,$EB,$EA,$EA,$E9,$E8,$E7,$E6,$E5,$E4,$E3,$E2,$E1,$E0,$DF
dc.b $DE,$DD,$DC,$DB,$DA,$D8,$D7,$D6,$D5,$D4,$D3,$D1,$D0,$CF,$CE,$CC
dc.b $CB,$CA,$C9,$C7,$C6,$C5,$C3,$C2,$C1,$BF,$BE,$BD,$BB,$BA,$B8,$B7
dc.b $B6,$B4,$B3,$B2,$B0,$AF,$AD,$AC,$AB,$A9,$A8,$A7,$A5,$A4,$A2,$A1
dc.b $A0,$9E,$9D,$9C,$9A,$99,$98,$96,$95,$94,$93,$91,$90,$8F,$8D,$8C
dc.b $8B,$8A,$89,$87,$86,$85,$84,$83,$82,$81,$80,$7E,$7D,$7C,$7B,$7A
dc.b $79,$78,$77,$77,$76,$75,$74,$73,$72,$71,$71,$70,$6F,$6E,$6E,$6D
dc.b $6C,$6C,$6B,$6A,$6A,$69,$69,$68,$68,$67,$67,$67,$66,$66,$65,$65
dc.b $65,$65,$64,$64,$64,$64,$64,$64,$64,$64
dc.b $64,$64,$64,$64,$64,$64,$64,$64,$64,$65,$65,$65,$65,$66,$66,$67
dc.b $67,$67,$68,$68,$69,$69,$6A,$6A,$6B,$6C,$6C,$6D,$6D,$6E,$6F,$6F
dc.b $70,$71,$71,$72,$73,$74,$74,$75,$76,$77,$77,$78,$79,$7A,$7A,$7B
dc.b $7C,$7C,$7D,$7E,$7F,$7F,$80,$81,$81,$82,$83,$83,$84,$84,$85,$85
dc.b $86,$86,$87,$87,$88,$88,$89,$89,$89,$8A,$8A,$8A,$8B,$8B,$8B,$8B
dc.b $8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8A,$8A
dc.b $8A,$89,$89,$89,$88,$88,$87,$87,$86,$86,$85,$85,$84,$84,$83,$83
dc.b $82,$81,$81,$80,$7F,$7F,$7E,$7D,$7C,$7C,$7B,$7A,$7A,$79,$78,$77
dc.b $77,$76,$75,$74,$74,$73,$72,$71,$71,$70,$6F,$6F,$6E,$6D,$6D,$6C
dc.b $6C,$6B,$6A,$6A,$69,$69,$68,$68,$67,$67,$67,$66,$66,$65,$65,$65
dc.b $65,$64,$64,$64,$64,$64,$64,$64,$64,$64
dc.b $64,$64,$64,$64,$64,$64
dc.b $64,$64,$64,$64,$65,$65,$65,$65,$66,$66,$67,$67,$67,$68,$68,$69
dc.b $69,$6A,$6A,$6B,$6C,$6C,$6D,$6E,$6E,$6F,$70,$71,$71,$72,$73,$74
dc.b $75,$76,$77,$77,$78,$79,$7A,$7B,$7C,$7D,$7E,$80,$81,$82,$83,$84
dc.b $85,$86,$87,$89,$8A,$8B,$8C,$8D,$8F,$90,$91,$93,$94,$95,$96,$98
dc.b $99,$9A,$9C,$9D,$9E,$A0,$A1,$A2,$A4,$A5,$A7,$A8,$A9,$AB,$AC,$AD
dc.b $AF,$B0,$B2,$B3,$B4,$B6,$B7,$B8,$BA,$BB,$BD,$BE,$BF,$C1,$C2,$C3
dc.b $C5,$C6,$C7,$C9,$CA,$CB,$CC,$CE,$CF,$D0,$D1,$D3,$D4,$D5,$D6,$D7
dc.b $D8,$DA,$DB,$DC,$DD,$DE,$DF,$E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7,$E8
dc.b $E9,$EA,$EA,$EB,$EC,$ED,$EE,$EE,$EF,$F0,$F0,$F1,$F2,$F2,$F3,$F3
dc.b $F4,$F4,$F5,$F5,$F6,$F6,$F7,$F7,$F7,$F8,$F8,$F8,$F8,$F9,$F9,$F9
dc.b $F9,$F9,$F9,$F9,$F9,$FA


 
; **************
; * sid player *
; **************
;
; questo é semplicemente un file sid linkato al programma per mettere un po' di musica in
; background. Si può cambiare file, l'importante é fare attenzione a non metterlo in una
; zona occupata dalle tabelle generate dal programma.
; il file da linkare deve essere un prg senza i due byte iniziali.


init=$1060
play=$1063
 
*=$1060; Selfmade executable (AMJ)

sid INCBIN "selfmade.dat"
« Ultima modifica: 21 Gennaio 2015, 23:42:04 da eregil »

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Raster Split Scroller
« Risposta #6 il: 14 Aprile 2009, 20:29:03 »
 Tu sei troppo modesto, Honesty/CVT farebbe carte false per avere un ottimo e preparato coder come te. Appena lo becco su #c-64 ti raccomandero' personalmente =)
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Freshness79

  • Utente
  • **
  • Post: 128
  • Gioco Preferito: Dizzy collection
Raster Split Scroller
« Risposta #7 il: 15 Aprile 2009, 00:19:49 »
Ho ulteriormente riordinato il codice e l'ho dato in pasto iAN per un po' di sana compressione. In allegato trovate un file zip con le versioni definitive dell'eseguibile e del sorgente.

(SOURCE)
« Ultima modifica: 21 Gennaio 2015, 23:42:29 da eregil »

Freshness79

  • Utente
  • **
  • Post: 128
  • Gioco Preferito: Dizzy collection
Raster Split Scroller
« Risposta #8 il: 15 Aprile 2009, 00:21:52 »
...segue dal post precedente.

(PRG)
« Ultima modifica: 21 Gennaio 2015, 23:42:47 da eregil »

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Raster Split Scroller
« Risposta #9 il: 15 Aprile 2009, 00:27:44 »
Giusto per completezza aggiungo che per ridurlo a meno di 4k (4096 bytes) Exomizer non bastava, nemmeno togliendo il codice inutilizzato nel player della musica, ed ho usato il nuovo compattatore ALZ64, con un depacker leggermente modificato per non visualizzare la sporcizia a video che a me da' troppo fastidio =)
« Ultima modifica: 21 Gennaio 2015, 23:43:28 da eregil »
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Freshness79

  • Utente
  • **
  • Post: 128
  • Gioco Preferito: Dizzy collection
Raster Split Scroller
« Risposta #10 il: 02 Dicembre 2009, 00:52:55 »
Dopo un po' di inattività mi faccio vivo...
Nuovo aggiornamento di questa vecchia routine.
Adesso é in grado di gestire font da 8 bit, $d020 viene splittato 9 volte: 8 per disegnare la font, 1 per ritornare al colore di sfondo.
Saluti a tutti!
« Ultima modifica: 21 Gennaio 2015, 23:43:53 da eregil »

saver71

  • Utente
  • **
  • Post: 279
  • Amante degli anni '80
    • saver71 - YouTube
Raster Split Scroller
« Risposta #11 il: 02 Dicembre 2009, 13:46:04 »
 
Codice: [Seleziona]
E' stato riscontrato un errore. Se non sei sicuro su come utilizzare
una funzione del forum ti preghiamo di consultare i nostri file di
Aiuto.

L'errore riscontrato è:

Alcuni file risultano mancanti. Se stavi tentando di visualizzare una
discussione è possibile che essa sia stata rimossa o cancellata.
Torna indietro e prova di nuovo.


 :huh:

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Raster Split Scroller
« Risposta #12 il: 02 Dicembre 2009, 21:32:08 »
 Freshness: posta anche il sorgente, sempre, come tag code, cosi' chi vuole se lo compila ed e' sicuramente piu' utile del solo prg, soprattutto considerando che non si riesce a scaricare per qualche motivo. ;)
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Freshness79

  • Utente
  • **
  • Post: 128
  • Gioco Preferito: Dizzy collection
Raster Split Scroller
« Risposta #13 il: 02 Dicembre 2009, 23:48:42 »
 Ho dovuto metterlo un po' in ordine perché era vergognosamente incasinato... comunque ecco il source code:
Codice: [Seleziona]
; **************************
; * Variabili in Zero page *
; **************************
;

pvsinus  = $E0 ; 2 byte - Puntatore sinus height (Modifica altezza)
pysinus  = $E2; 2 byte - Puntatore sinus vertical position (Modifica posizione Y)
pchar  = $E4; 2 byte - Puntatore carattere corrente
pstring  = $E6; 2 byte - Puntatore stringa corrente
fxheight = $E8; Altezza effetto 1-256 (0)
fxypos  = $E9; Posizione effetto
pxsinus  = $Ea; Puntatore sinus horizontal position (Movimento posizione X)
bitheight = $Eb ; Contatore verticale 5 bit - (dimensione verticale singolo bit)
charheight = $Ec; Contatore font 3 bit (carattere)
compare  = $Ed ; valore di confronto (ampiezza effetto)
nextjmp  = $Ee ; Necessario per la costruzione dinamica degli split
temp  = $Ef; Uso generico
pline  = $F0; Puntatore alla prima linea da splittare


; ****************************
; * Valori da non modificare *
; ****************************

opcode_sty = $8c  ; Opcode per sta abs (valore 0)
opcode_sta = $8d  ; Opcode per sta abs (valore 0)
opcode_stx = $8e  ; Opcode per stx abs (valore 1)
bgcolor  = $d020; Indirizzo di gestione del colore di sfondo
opcode_jmp = $4c  ; Opcode per jmp abs
NPixel  = 9    ; Numero di pixel (7+1 split, l'ultimo ripristina il colore di sfondo)
ypos  = (($130-2-height)/2)-3; posizione verticale di partenza

; ***********************
; * Valori modificabili *
; ***********************

chrheight = 16; Altezza dei caratteri
precalc  = $2500; Indirizzo di partenza tabelle precalcolate
bsr_baseHi = $40  ; Byte splitter routines base address (High order) 20 bytes ciascuna x 128 routine
charbase = $8000; character map
colsfondo = 15; Colore di sfondo     (Si fissa in fase di compilazione)
coltesto = 2 ; Colore del test      (Si può pensare di variarlo per frame)
outsfondo = 5 ; Colore bordo esterno (Si può pensare di variarlo per frame)


        *=$0801
        word eoprg
        word 2009
        byte $9E,[intro]d
        petc " by freshness79"
        byte 0
eoprg
        word 0
        *=$0820

intro  
  jsr set_routine_table; Creazione delle routine raster
  jsr initvar   ; Inizializzazione di alcune variabili
        jsr initchar  ; Inizializzazione charmap
  jsr initIRQ   ; Inizializzazione raster IRQ
  jsr init   ; Inizializzazione sid player
  cli     ; Interrupt attivati
  jmp *    ; Stiamo in attesa...
  
  
; ***************************************************
; * Routine di sincronizzazione a doppio raster IRQ *
; ***************************************************
; La prima chiamata IRQ é su JMP, quindi l'incertezza é di 1-3 cicli
; Il primo handler permette di ridurla a 1-2 cicli: IRQ arriva sulla NOP
; Il secondo handler infine grazie ad un confronto a fine raster elimina
; l'ultima possibile incertezza
    
fstirq  lsr $d019  ; 6 + (36 Kernal IRQ) + (da 2 a 4 JMP)
  inc $d012  ; 6 interrupt al prossimo raster  
  lda #<secirq ; 2 reimposto il vettore IRQ perché punti
  sta $0314  ; 4 al secondo handler  
  cli    ; 2 attivo gli interrupt
  tsx    ; 2
  stx temp  ; 3
  nop    ; 2 (63-65) <= IRQ
  nop    ; 2 (65-67) <= IRQ  
  brk    ; Qua non ci si arriva mai, lascio BRK per test
secirq asl $d019  ; 6 + (36 Kernal IRQ) + (da 2 a 3 NOP)  
  ldx temp  ; 3
  txs    ; 2
  ldy #$00  ; 2
  lda $d012  ; 4
  ldx #<fstirq       ; 2 ripristino il vecchio IRQ pointer
  nop    ; 2w
  cmp $d012  ; 4  se il ritardo dovuto alla NOP era 1    
  beq synced  ; 2/3 effettuo un branch per allinearmi
synced stx $0314  ; 4 salvo il vettore IRQ
  
  sty $d020  ; 4 -> RASTER STABILE! (inizio linea divisoria)
  
  inc $ffff  ; 6w Delay di centramento
  inc $ffff  ; 6w Variando il numero di cicli persi si può  
  inc $ffff  ; 6w riposizionare lo scroll
  inc $ffff  ; 6w
  inc $ffff  ; 6w
  inc $ffff  ; 6w
  nop    ; 5w - 41 wasted cycles

  clc    ; 2 Determina il valore di uscita dal ciclo di split
  lda pline  ; 3
  tay    ; 3 => inizializzazione contatore raster line
  adc fxheight ; 3
  sta compare  ; 3 Valore uscita = pline + fxheight  
  
; *******************************
; * Gestione movimento laterale *
; *******************************
; La routine che segue permette di spostare orizzontalmente lo
; scroller. L'effetto é realizzato prendendo valori dalla tabella sinusoidale
; precalcolata ed usandoli per creare un ritardo.
; La parte unitaria del ritardo viene gestita con un branch, quella
; multipla di 2 con dei NOP ($EA) ed un branch obbligato calcolato al
; momento con la modifica del codice in fase di esecuzione
; Contestualmente a questa routine viene creata anche la barra di divisione
; superiore e viene aggiornata la posizione di scroll.

  
sfond1 lda #colsfondo ; 2
  sta $d020  ; 2 Fine Linea divisoria        
  ldx pxsinus  ; 3 Aggiorno la posizione nella  
        inx    ; 2 tabella precalcolata
        stx pxsinus  ; 3
        lda sinus,x  ; 4 carico il valore corrente
  lsr    ; 2 estraggo il bit meno significativo e lo uso
  bcc stp1  ; 2/3 uso per creare un eventuale ritardo unitario
stp1 sta sinmod+1       ; 4 con il rimanente creo un displacement all'interno  
sinmod  bpl *   ; 2 di un elenco di NOP
  ds $10,$ea  ; (2-30)+1 NOP (la nop impiega 2 cicli)

  
; ***********************
; * Main raster routine *
; ***********************
; questa routine crea l'effetto di split raster.
; La routine si compone esattamente di 63 cicli, la lunghezza
; in termini di timing di una raster line.
; Si estraggono due valori dagli elenchi codes e si usano direttamente come
; indirizzo per un JMP indiretto.
; A questa routine viene accodato lo spezzone precalcolato di STA/STX $D020 ed
; il tutto viene replicato in memoria per avere tutte le combinazioni possibili
; Ciascuna linea dell'effetto si realizza con un continuo salto da routine a routine.

sfondo ldx #coltesto ; 2 inizializzazione colore del testo  
  jmp stmain  ; 3 Parti con l'effetto!
  
stmain iny    ; 2 Prossima linea (prima di questa istruzione siamo già a 36 cicli)
  cpy compare  ; 2
  beq exmain  ; 2 L'effetto é finito?
  lda codesH,y ; 4 No, aggiorna i puntatori alla
  sta nextjmp+1 ; 3 prossima routine da richiamare
  lda codesL,y ; 4 sfruttando le due tabelle code
  .byte $8d,nextjmp,$00; 4 (Crea una STA non zero page... ma zero page - costa 1 ciclo in più)
  jmp (nextjmp) ; 5 (Tot. 63) Salta alla prossima routine
exmain jmp endmain  ; 3 Fine dell'effetto


; ***************************************
; * Routine di aggiornamento e chiusura *
; ***************************************
;
; La routine che segue aggiorna la tabella codes tramite 3 chiamate
; alla relativa subroutine e sposta l'indice poi usato nella raster routine.
; Seguono due chiamate alla routine sid player ed infine l'uscita dall'interruzione.
; il 6510 appena esce da questa routine torna alla "JMP *" della intro.

endmain ldx pxsinus  ; 3 Questa routine serve a ripristinare la
  sec    ; 2 sincronia con i raster eliminando l'effetto
  lda #$1f  ; 2 sinusoidale orizzontale precedentemente
  sbc sinus,x  ; 4 creato
  lsr    ; 2
  bcc stp2  ; 2/3
stp2 sta brw+1  ; 4
brw  bpl *   ; 2
  ds $0f,$ea  ; (2-30) NOP (la nop impiega 2 cicli)        

  ldy #$00  ; 2 Annulla y (viene usato più avanti)
  clc    ; 2 Aggiornamento effetto
  lda pvsinus  ; 3 sinusoide sulla dimensione
  adc #$01  ; 2 della finestra di visualizzazione
  sta pvsinus  ; 3
  lda pvsinus+1 ; 3
  adc #$00  ; 2
  and #$01  ; 2
  ora #>heightsinus; 2      
  ldx #outsfondo ; 2 Colore sfondo esterno  
  
  sty $d020  ; Linea orizzontale inferiore (y=0)  
    
  sta pvsinus+1 ; 3  
  lda (pvsinus),y ; 5
  sta fxheight ; 3 => Nuova altezza caricata    
  lda pysinus  ; 3 Aggiornamento effetto
  adc #$01  ; 2 sinusoide sulla posizione
  sta pysinus  ; 3 della finestra di visualizzazione  
  lda pysinus+1 ; 3
  adc #$00  ; 2
  and #$01  ; 2
  ora #>possinus ; 2
  sta pysinus+1 ; 3  
  lda (pysinus),y ; 5
  sta fxypos  ; 3 => Nuova posizione verticale caricata
  sta $d012  ; 4 Impostazione primo raster del prossimo frame
  
  inc $ffff  ; 6w    
  inc $ffff  ; 6w
  inc $ffff  ; 6w
;  sta $ffff  ; 4w  
      
  stx $d020  ; Fine linea - sfondo esterno

;**************************************************************************
;* Da qua in poi non più bisogno di controllare la sincronia con i raster *
;**************************************************************************

  jsr play  ; aggiornamento sid player
  
  ldx #$00  ; Spostamento scroller
  jsr scroll_update  ;
        jsr scroll_update  ;
        jsr scroll_update  ;    

  jsr play  ; aggiornamento sid player
  
  cli    ; Interrupt nuovamente attivi
  pla    ; ripristino dei tre
  tay    ; registri  
  pla    ;
  tax    ;
  pla    ; ritorno alla routine iniziale
  rti    ; (il JMP * della intro)


; ********************************
; * Aggiornamento dello scroller *
; ********************************
; Legge progressivamente ciascun carattere della stringa e crea
; i due elenchi codes necessari per visualizzare l'effetto

scroll_update        
        inc bitheight ; 5 Aggiorna delay timer
  bne nomod  ; 2 (1) Controlla se si cambia byte
  lda #(256-chrheight); 2 Si, ripristina timer
  sta bitheight ; 3
  clc    ; 2
        lda charheight     ; 3 Aggiorna puntatore alla riga della
        adc #$01           ; 2 font (8 righe)
        ora #$F8           ; 2
        sta charheight     ; 3
        lda pstring        ; 3 Aggiorna puntatore stringa  
        adc #$00           ; 2
        sta pstring        ; 3
  lda pstring+1 ; 3  
  adc #$00  ; 2
  sta pstring+1 ; 3
  ldy #$00           ; 2
        lda (pstring),y    ; 5 Carica carattere corrente
  bne skipch  ; 2 (1) Siamo a fine stringa?
  lda #<testo  ; 2 Se si riparti da capo
  sta pstring  ; 3
  lda #>testo  ; 2
  sta pstring+1 ; 3
  lda (pstring),y    ; 5
skipch sty pchar+1        ; 3 Aggiorna puntatore al font
  asl          ; 2 con il carattere appena caricato
        rol pchar+1        ; 5
        asl              ; 2
        rol pchar+1        ; 5
        asl    ; 2
        rol pchar+1        ; 5
        adc #<charbase     ; 2
        sta pchar          ; 3
        lda pchar+1        ; 3
        adc #>charbase     ; 2
        sta pchar+1        ; 3
nomod lda charheight     ; 3 Carica il byte da visualizzare
        and #$07           ; 2
        tay                ; 2  
        lda (pchar),y      ; 5
  ldy pline  ; 3
  sty getmp+1  ; 4 Imposta la posizione di codesL da aggiornare
  sty getmp2+1 ; 4 Imposta la posizione di codesH da aggiornare
  lsr    ; 2 Ruota il byte caricato di due posizione a destra
  bcc noadj1  ; 2/3
  ora #$80  ; 2
noadj1 lsr    ; 2
  bcc noadj2  ; 2/3
  ora #$80  ; 2
noadj2 pha    ; 3 A partire da xxxxxxyy si ottiene yyxxxxxx
  and #$C0  ; 2 Usa il nibble maggiore come puntatore low (codesL)
  ora #colsfondo ; 2 aggiungo il colore di sfondo (la routine é "spostata" di colsfondo bytes)
getmp   sta codesL,x       ; 4
  pla    ; 3 Usa il nibble inferiore come puntatore high (codesH)
  and #$3F  ; 2
  ora #bsr_baseHi ; 2 Aggiungi la base della tabella
getmp2  sta codesH,x       ; 4
  inc pline  ; 5 Passa alla prossima linea
        rts                ; 6  


; **********************************************
; **********************************************
; * A seguire due funzioni di inizializzazione *
; * delle tabelle e dello schermo              *
; **********************************************
; **********************************************
  
; ****************************************
; * Costruzione della tabella di routine *
; ****************************************
;
; Ogni esecuzione costa 4*NPixel+3 cicli (3 per il JMP e 4*NPixel per gli STA)
; per un totale quindi di 39 cicli con 8 pixel.
; Esempio di routine (questa disegna 01010000):
; sta $d020
; stx $d020
; sta $d020
; stx $d020
; sta $d020
; sta $d020
; sta $d020
; sta $d020
; sta $d020
; Ogni routine occupa 27 byte a cui vanno aggiunti i 22 della routine stmain
; per un totale di 49 byte. Essendo 49 si può agevolmente spostare il low nibble
; dell'indirizzo iniziale con valori da 0 a 15 (=> 49-64). Ciò permette di agire
; sul colore di sfondo (comunque fisso).

set_routine_table        
        lda #bsr_baseHi
        sta $fc
        lda #colsfondo; Sposto la routine col colore di sfondo!;)
        sta $fb
        ldx #$00
rs_byt  stx $fd
        ldy #$00
rs_lop  asl $fd
        bcs rs_set
        lda #opcode_sta
        bne rs_put
rs_set  lda #opcode_stx
rs_put  sta ($fb),y
        iny
        lda #<bgcolor
        sta ($fb),y
        iny
        lda #>bgcolor
        sta ($fb),y
        iny
        cpy #(NPixel*3)
        bne rs_lop
  txa
  pha
  ldx #$00
cpmrt lda stmain,x
  sta ($fb),y
  iny
  inx
  cpx #(endmain-stmain)
  bne cpmrt
  pla
  tax
        clc
        lda $fb
        adc #$40
        sta $fb
        lda $fc
        adc #$00
        sta $fc
        inx
        cpx #((1<<(NPixel-1))&$FF)
        bne rs_byt


; ******************************
; * Inizializzazione variabili *
; ******************************
;
initvar
  lda heightsinus
  sta fxheight
  lda #<heightsinus
  sta pvsinus
  lda #>heightsinus
  sta pvsinus+1
  lda possinus
  sta fxypos
  lda #<possinus
  sta pysinus
  lda #>possinus
  sta pysinus+1  
  lda #<charbase
  sta pchar
  lda #>charbase
  sta pchar+1
  lda #$FF
  sta bitheight
  lda #$00
  sta charheight
  lda #<testo
  sta pstring
        lda #>testo
        sta pstring+1
        rts
  

; ***************
; * Inizializza *
; ***************
;
; La routine copia in RAM la charmap standard del 64

initchar
  sei
        lda #$23
        sta $01
        ldx #$00
chsrc   lda $d000,x
chdes   sta charbase,x
        inx
        bne chsrc
        inc chsrc+2
        inc chdes+2
        lda chsrc+2
        cmp #$D8
        bne chsrc
        lda #$27
        sta $01
  cli  
        rts


; ************
; * Init IRQ *
; ************
;
; Disattivazione dell'interrupt standard,
; Impostazione della prima rasterline e dell'indirizzo
; del primo handler della routine di interrupt
; attivazione dei raster interrupt

initIRQ
  sei
        lda #$7f
        sta $dc0d
        sta $dd0d
  lda $dd0c
  lda $dc0c
  lda #$00
  sta $d011
  lda fxypos
  sta $d012
  lda #<fstirq
  sta $0314
  lda #>fstirq
  sta $0315
  lda #$01
  sta $d01a
  lsr $d019
  rts


; *********************************
; *********************************
; * Tabelle e valori precalcolati *
; *********************************
; *********************************

; *********
; * Testo *
; *********
;
; testo é il testo che viene sottoposto allo scroll (non
; occorre che sia allineato)

testo
  scrl " hi 64 lovers, this is an improved version of my raster scroller."
  scrl " now this is able to manage full 8 bit fonts, look at this..."
  .byte $20,$20,$E6,$20,$A0,$20,160,160,136,133,140,140,143,161,160,160
  scrl "  "
  scrl " wrap!   "
  
  byte 0; E' fondamentale inserire il terminatore!!!!
  
; ***************
; * sinus table *
; ***************
;
; la tabella che segue rappresenta una sorta di sinus table utilizzata
; per creare l'effetto di oscillazione a destra e a sinistra.
; I 3 valori presenti (A9,A5,B5) rappresentano rispettivamente 3 tipi di LDA
; con 3 numeri di cicli diversi: A9 impiega 2 cicli, A5 ne impiega 3 e B5 ne
; impiega 4. Applicati al momento giusto nella routine permettono di mantenere
; la sincronia (3 cicli) o di mancarla di 1 posizione in più o in meno (2,4 cicli)
; ottenendo lo spostamento voluto nel successivo frame

  align $100
sinus
  .byte $0F,$0E,$0D,$0D,$0C,$0B,$0A,$0A,$09,$08,$08,$07,$06,$06,$05,$05
  .byte $04,$03,$03,$03,$02,$02,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00
  .byte $00,$00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$02,$02,$03,$03,$04
  .byte $04,$05,$05,$06,$07,$07,$08,$09,$09,$0A,$0B,$0B,$0C,$0D,$0E,$0E
  .byte $0F,$10,$11,$11,$12,$13,$14,$14,$15,$16,$17,$17,$18,$18,$19,$1A
  .byte $1A,$1B,$1B,$1C,$1C,$1C,$1D,$1D,$1D,$1E,$1E,$1E,$1E,$1E,$1E,$1E
  .byte $1E,$1E,$1E,$1E,$1E,$1E,$1E,$1D,$1D,$1D,$1D,$1C,$1C,$1B,$1B,$1A
  .byte $1A,$19,$19,$18,$17,$17,$16,$15,$15,$14,$13,$12,$12,$11,$10,$0F
  .byte $0F,$0E,$0D,$0C,$0C,$0B,$0A,$09,$09,$08,$07,$07,$06,$05,$05,$04
  .byte $04,$03,$03,$02,$02,$01,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00
  .byte $00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$02,$02,$02,$03,$03,$04
  .byte $04,$05,$06,$06,$07,$07,$08,$09,$0A,$0A,$0B,$0C,$0D,$0D,$0E,$0F
  .byte $10,$10,$11,$12,$13,$13,$14,$15,$15,$16,$17,$17,$18,$19,$19,$1A
  .byte $1A,$1B,$1B,$1C,$1C,$1D,$1D,$1D,$1E,$1E,$1E,$1E,$1E,$1E,$1E,$1E
  .byte $1E,$1E,$1E,$1E,$1E,$1E,$1E,$1D,$1D,$1D,$1C,$1C,$1B,$1B,$1B,$1A
  .byte $19,$19,$18,$18,$17,$16,$16,$15,$14,$14,$13,$12,$11,$11,$10,$0F


; ***********************************
; * sinus table - Effetto posizione *
; ***********************************
;

  align $200
possinus
  
dc.b $14,$14,$14,$14,$14,$14,$14,$14,$14,$15,$15,$15,$15,$16,$16,$16
dc.b $17,$17,$18,$18,$19,$19,$1A,$1A,$1B,$1B,$1C,$1D,$1D,$1E,$1F,$1F
dc.b $20,$21,$22,$23,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E
dc.b $2F,$30,$31,$32,$33,$35,$36,$37,$38,$39,$3A,$3C,$3D,$3E,$3F,$41
dc.b $42,$43,$44,$46,$47,$48,$4A,$4B,$4C,$4E,$4F,$50,$52,$53,$55,$56
dc.b $57,$59,$5A,$5B,$5D,$5E,$60,$61,$62,$64,$65,$66,$68,$69,$6B,$6C
dc.b $6D,$6F,$70,$71,$73,$74,$75,$77,$78,$79,$7A,$7C,$7D,$7E,$80,$81
dc.b $82,$83,$84,$86,$87,$88,$89,$8A,$8B,$8C,$8D,$8F,$90,$91,$92,$93
dc.b $94,$95,$96,$96,$97,$98,$99,$9A,$9B,$9C,$9C,$9D,$9E,$9F,$9F,$A0
dc.b $A1,$A1,$A2,$A3,$A3,$A4,$A4,$A5,$A5,$A6,$A6,$A6,$A7,$A7,$A8,$A8
dc.b $A8,$A8,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9
dc.b $A9,$A9,$A9,$A9,$A8,$A8,$A8,$A8,$A7,$A7,$A6,$A6,$A6,$A5,$A5,$A4
dc.b $A4,$A3,$A3,$A2,$A1,$A1,$A0,$9F,$9F,$9E,$9D,$9C,$9C,$9B,$9A,$99
dc.b $98,$97,$96,$96,$95,$94,$93,$92,$91,$90,$8F,$8D,$8C,$8B,$8A,$89
dc.b $88,$87,$86,$84,$83,$82,$81,$80,$7E,$7D,$7C,$7A,$79,$78,$77,$75
dc.b $74,$73,$71,$70,$6F,$6D,$6C,$6B,$69,$68,$66,$65,$64,$62,$61,$60
dc.b $5E,$5D,$5B,$5A,$59,$57,$56,$55,$53,$52,$50,$4F,$4E,$4C,$4B,$4A
dc.b $48,$47,$46,$44,$43,$42,$41,$3F,$3E,$3D,$3C,$3A,$39,$38,$37,$36
dc.b $35,$33,$32,$31,$30,$2F,$2E,$2D,$2C,$2B,$2A,$29,$28,$27,$26,$25
dc.b $24,$23,$23,$22,$21,$20,$1F,$1F,$1E,$1D,$1D,$1C,$1B,$1B,$1A,$1A
dc.b $19,$19,$18,$18,$17,$17,$16,$16,$16,$15,$15,$15,$15,$14,$14,$14
dc.b $14,$14,$14,$14,$14,$14
dc.b $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$15,$15,$15
dc.b $15,$15,$16,$16,$16,$16,$17,$17,$17,$18,$18,$18,$18,$19,$19,$19
dc.b $1A,$1A,$1A,$1B,$1B,$1C,$1C,$1C,$1D,$1D,$1D,$1E,$1E,$1F,$1F,$1F
dc.b $20,$20,$20,$21,$21,$21,$22,$22,$22,$23,$23,$23,$24,$24,$24,$24
dc.b $25,$25,$25,$25,$26,$26,$26,$26,$26,$27,$27,$27,$27,$27,$27,$27
dc.b $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27
dc.b $27,$26,$26,$26,$26,$26,$25,$25,$25,$25,$24,$24,$24,$24,$23,$23
dc.b $23,$22,$22,$22,$21,$21,$21,$20,$20,$20,$1F,$1F,$1F,$1E,$1E,$1D
dc.b $1D,$1D,$1C,$1C,$1C,$1B,$1B,$1A,$1A,$1A,$19,$19,$19,$18,$18,$18
dc.b $18,$17,$17,$17,$16,$16,$16,$16,$15,$15,$15,$15,$15,$14,$14,$14
dc.b $14,$14,$14,$14,$14,$14,$14,$14,$14,$14


; ******************
; * Buffer grafico *
; ******************
;
; codes é il buffer nel quale c'é l'elenco costantemente aggiornato
; dei byte stampati a video: rappresenta di fatto gli indirizzi delle
; routine che rendono graficamente tutti i valori possibili di un byte.

  *=precalc
  align $100
codesL
  ds $100,colsfondo
codesH
  ds $100,$40
  

; ************************************
; * sinus table - Effetto dimensione *
; ************************************
;

  align $200
heightsinus

dc.b $FA,$F9,$F9,$F9,$F9,$F9,$F9,$F9,$F9,$F8,$F8,$F8,$F8,$F7,$F7,$F7
dc.b $F6,$F6,$F5,$F5,$F4,$F4,$F3,$F3,$F2,$F2,$F1,$F0,$F0,$EF,$EE,$EE
dc.b $ED,$EC,$EB,$EA,$EA,$E9,$E8,$E7,$E6,$E5,$E4,$E3,$E2,$E1,$E0,$DF
dc.b $DE,$DD,$DC,$DB,$DA,$D8,$D7,$D6,$D5,$D4,$D3,$D1,$D0,$CF,$CE,$CC
dc.b $CB,$CA,$C9,$C7,$C6,$C5,$C3,$C2,$C1,$BF,$BE,$BD,$BB,$BA,$B8,$B7
dc.b $B6,$B4,$B3,$B2,$B0,$AF,$AD,$AC,$AB,$A9,$A8,$A7,$A5,$A4,$A2,$A1
dc.b $A0,$9E,$9D,$9C,$9A,$99,$98,$96,$95,$94,$93,$91,$90,$8F,$8D,$8C
dc.b $8B,$8A,$89,$87,$86,$85,$84,$83,$82,$81,$80,$7E,$7D,$7C,$7B,$7A
dc.b $79,$78,$77,$77,$76,$75,$74,$73,$72,$71,$71,$70,$6F,$6E,$6E,$6D
dc.b $6C,$6C,$6B,$6A,$6A,$69,$69,$68,$68,$67,$67,$67,$66,$66,$65,$65
dc.b $65,$65,$64,$64,$64,$64,$64,$64,$64,$64
dc.b $64,$64,$64,$64,$64,$64,$64,$64,$64,$65,$65,$65,$65,$66,$66,$67
dc.b $67,$67,$68,$68,$69,$69,$6A,$6A,$6B,$6C,$6C,$6D,$6D,$6E,$6F,$6F
dc.b $70,$71,$71,$72,$73,$74,$74,$75,$76,$77,$77,$78,$79,$7A,$7A,$7B
dc.b $7C,$7C,$7D,$7E,$7F,$7F,$80,$81,$81,$82,$83,$83,$84,$84,$85,$85
dc.b $86,$86,$87,$87,$88,$88,$89,$89,$89,$8A,$8A,$8A,$8B,$8B,$8B,$8B
dc.b $8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8A,$8A
dc.b $8A,$89,$89,$89,$88,$88,$87,$87,$86,$86,$85,$85,$84,$84,$83,$83
dc.b $82,$81,$81,$80,$7F,$7F,$7E,$7D,$7C,$7C,$7B,$7A,$7A,$79,$78,$77
dc.b $77,$76,$75,$74,$74,$73,$72,$71,$71,$70,$6F,$6F,$6E,$6D,$6D,$6C
dc.b $6C,$6B,$6A,$6A,$69,$69,$68,$68,$67,$67,$67,$66,$66,$65,$65,$65
dc.b $65,$64,$64,$64,$64,$64,$64,$64,$64,$64
dc.b $64,$64,$64,$64,$64,$64
dc.b $64,$64,$64,$64,$65,$65,$65,$65,$66,$66,$67,$67,$67,$68,$68,$69
dc.b $69,$6A,$6A,$6B,$6C,$6C,$6D,$6E,$6E,$6F,$70,$71,$71,$72,$73,$74
dc.b $75,$76,$77,$77,$78,$79,$7A,$7B,$7C,$7D,$7E,$80,$81,$82,$83,$84
dc.b $85,$86,$87,$89,$8A,$8B,$8C,$8D,$8F,$90,$91,$93,$94,$95,$96,$98
dc.b $99,$9A,$9C,$9D,$9E,$A0,$A1,$A2,$A4,$A5,$A7,$A8,$A9,$AB,$AC,$AD
dc.b $AF,$B0,$B2,$B3,$B4,$B6,$B7,$B8,$BA,$BB,$BD,$BE,$BF,$C1,$C2,$C3
dc.b $C5,$C6,$C7,$C9,$CA,$CB,$CC,$CE,$CF,$D0,$D1,$D3,$D4,$D5,$D6,$D7
dc.b $D8,$DA,$DB,$DC,$DD,$DE,$DF,$E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7,$E8
dc.b $E9,$EA,$EA,$EB,$EC,$ED,$EE,$EE,$EF,$F0,$F0,$F1,$F2,$F2,$F3,$F3
dc.b $F4,$F4,$F5,$F5,$F6,$F6,$F7,$F7,$F7,$F8,$F8,$F8,$F8,$F9,$F9,$F9
dc.b $F9,$F9,$F9,$F9,$F9,$FA
  
  
; **************
; * sid player *
; **************
;
; questo é semplicemente un file sid linkato al programma per mettere un po' di musica in
; background. Si può cambiare file, l'importante é fare attenzione a non metterlo in una
; zona occupata dalle tabelle generate dal programma.
; il file da linkare deve essere un prg senza i due byte iniziali.


init=$1060
play=$1063
  
*=$1060; Selfmade executable (AMJ)

sid INCBIN "selfmade.dat"

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Raster Split Scroller
« Risposta #14 il: 03 Dicembre 2009, 00:20:26 »
 Voglio un figlio da te! o almeno un demo completo!  :lol:
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -