Ready64 Forum

Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: Freshness79 - 09 Aprile 2009, 23:39:16

Titolo: Raster Split Scroller
Inserito da: Freshness79 - 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!
Titolo: Raster Split Scroller
Inserito da: iAN CooG - 09 Aprile 2009, 23:48:01
 te l'ho gia' detto in chat ma lo rendo pubblico, che figata assurda :sabber:
sono commosso :lol:  
Titolo: Raster Split Scroller
Inserito da: saver71 - 10 Aprile 2009, 09:32:13
 Fantastico! I miei complimenti!!  ;)  
Titolo: Raster Split Scroller
Inserito da: Freshness79 - 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!
Titolo: Raster Split Scroller
Inserito da: ice00 - 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 ;)
Titolo: Raster Split Scroller
Inserito da: Freshness79 - 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"
Titolo: Raster Split Scroller
Inserito da: iAN CooG - 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 =)
Titolo: Raster Split Scroller
Inserito da: Freshness79 - 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)
Titolo: Raster Split Scroller
Inserito da: Freshness79 - 15 Aprile 2009, 00:21:52
...segue dal post precedente.

(PRG)
Titolo: Raster Split Scroller
Inserito da: iAN CooG - 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 (http://noname.c64.org/csdb/release/?id=77754), con un depacker leggermente modificato per non visualizzare la sporcizia a video che a me da' troppo fastidio =)
Titolo: Raster Split Scroller
Inserito da: Freshness79 - 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!
Titolo: Raster Split Scroller
Inserito da: saver71 - 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:
Titolo: Raster Split Scroller
Inserito da: iAN CooG - 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. ;)
Titolo: Raster Split Scroller
Inserito da: Freshness79 - 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"
Titolo: Raster Split Scroller
Inserito da: iAN CooG - 03 Dicembre 2009, 00:20:26
 Voglio un figlio da te! o almeno un demo completo!  :lol:
Titolo: Raster Split Scroller
Inserito da: Roberto - 03 Dicembre 2009, 23:34:48
 Purtroppo la gestione degli attachment è fuori uso.
Sto cercando di indagare, scusate per il disagio.
Titolo: Raster Split Scroller
Inserito da: Roberto - 04 Dicembre 2009, 12:52:31
 Ora dovrebbe essere nuovamente possibile scaricare gli allegati.
Titolo: Raster Split Scroller
Inserito da: Freshness79 - 11 Dicembre 2009, 22:10:23
Grazie mille Roberto...
Nuova versione del mio scroller:
- Font da 8 bit
- Colore del testo programmabile per riga
- Colore dello sfondo programmabile per frame
- Testo riposizionabile orizzontalmente
Rispetto alla vecchia versione ora é possibile deformare la font e colorarla con la massima libertà. Prossimamente il source...
Titolo: Raster Split Scroller
Inserito da: iAN CooG - 11 Dicembre 2009, 22:36:42
 \:D/  
Titolo: Raster Split Scroller
Inserito da: Zlin - 14 Dicembre 2009, 20:52:29
 Notevole.

Chapeau!