Ready64 Forum
Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: Elder0010 - 10 Febbraio 2011, 18:38:52
-
Ok, dopo qualche giorno di studio sul materiale trovato nel forum e sui vari codebase / tutorials in giro, sono riuscito a mettere insieme un po' di codice per realizzare un raster split. Prima di convertire il codice usando gli interrupts, e affrontare i vari problemi di sincronizzazione, vorrei riuscire ad avere una situazione stabile in questa modalità (polling del raster in un ciclo).
La mia idea è di mettere un logo in alto, e un testo con degli effetti in basso.
Il ragionamento che ho fatto è il seguente:
1) visualizzo immagine
2) visualizzo testo
3) Splitto: in alto modalità bitmap multicolour, in basso modalità testo.
Tutto funziona finchè uso il default charset. Invece provando a caricarne uno custom a $2800, mi trovo il tutto il charset (come se venisse dumpato carattere x carattere), "spiattellato" nella zona superiore dello schermo. Nella parte bassa, invece tutto ok: il messaggio è visualizzato.
Assunzioni:
- l'immagine che ho usato è in formato koala paint, e anche se la parte interessante è quella superiore, ho comunque fatto un bitmap grande tanto quanto tutto lo schermo (quindi la metà in basso è tutta nera..)
Non riesco a trovare una soluzione, ma ho pensato a delle possibili cause:
- forse c'è un errore nei valori settati su $d018 nei due "splits". Presumo quello superiore. La procedura mi è chiara, ho rifatto i conti e mi sembrano corretti, ma forse mi sfugge qualcosa.
- se non è $d018, allora il ciclo che visualizza l'immagine (prima parte del codice), va a pescare erroneamente nella zona di memoria del charset.
Includo il sorgente e il binario + le risorse per compilare il tutto in allegato!
;Raster split demo
*=$0801
;thx iancoog
word eop
word 7102
byte $9e,"2061",0
eop word 0
;codice
ldx #$00
stx $d021
copyloop:
lda $3f40,x; copy colours to screen RAM
sta $0400,x
lda $4040,x
sta $0500,x
;Parte eliminata: non voglio visualizzare nulla nella seconda metà dello schermo
; lda $4140,x
; sta $0600,x
; lda $4240,x
; sta $0700,x
; lda $4328,x; copy colours to colour RAM
; sta $d800,x
;lda $4428,x
;sta $d800,x
;lda $4528,x
;sta $d800,x
;lda $4628,x
; sta $d800,x
;End parte eliminata
dex
bne copyloop
tax
disphello lda hellotxt,x
cmp #$40 ;Fix caratteri non validi
bcc charokay
sec
sbc #$40 ;end fix
charokay sta $0700,x
inx
cpx #$0E
bne disphello
loop
lda #$30
raster1
cmp $d012
bne raster1
ldx #$00
stx $d020
lda #$3b ; bitmap mode
ldx #$18 ; multi-colour mode
ldy #$18
sta $d011
stx $d016
sty $d018
lda #$a8
raster2
cmp $d012
bne raster2
ldx #$01
stx $d020
lda #$1b
ldx #$08
ldy #$1a;Trovare bit giusto
sta $d011 ; Clear high bit of $d012, set text mode
stx $d016 ; single-colour
sty $d018
jmp loop
hellotxt .TEXT "RASTER SPLIT!!!"
*=$2000
incprg "elder_doppio.koa"
*=$2800
incprg "daredevil.64c"
-
Scusa (spero di non dire una scemenza), ma mi spieghi il senso di questo???
*=$2000
incprg "elder_doppio.koa"
*=$2800
incprg "daredevil.64c"
In pratica tu fai caricare al programma assembler prima l'immagine "eleder_doppio.koa" che è 10003 bytes (il che significa che se comincia da $2000 finisce $4713!!!) e poi fai caricare sempre al programma assembler un set di caratteri di 2048 bytes a partire da $2800 andando così a sovrapporre l'immagine caricata prima!?!?!?!
In altre parole penso che il problema sia semplicemente che il tuo set di caratteri (cioè daredevil.64c) va a sovrapporsi (e quindi di fatto cancella) all'immagine "elder...". Questo è il motivo per cui ti ritrovi "disegnato" o come hai detto tu "spiattellato" tutto il set di caratteri.
La soluzione è semplicemente quella di "rilocare" il set di caratteri in un'altra area della memoria.
Almeno questo è quello che penso io...
Prova un pò...
-
Se infatti fai la prova a non far caricare il set di caratteri eliminando le istruzioni:
*=$2800
incprg "daredevil.64c"
la tua immagine compare correttamente (ho provato io stesso) ma ovviamente non essendoci nessun set la parte inferiore risulta un casino...
La soluzione è quella che ti ho detto prima:
1) decidi una nuova area di memoria in cui porre il set di caratteri;
2) correggi il valore da porre in $d018 in base all'area di memoria che scegli.
Mi sa che le tue "assunzioni"
Non riesco a trovare una soluzione, ma ho pensato a delle possibili cause:
- forse c'è un errore nei valori settati su $d018 nei due "splits". Presumo quello superiore. La procedura mi è chiara, ho rifatto i conti e mi sembrano corretti, ma forse mi sfugge qualcosa.
- se non è $d018, allora il ciclo che visualizza l'immagine (prima parte del codice), va a pescare erroneamente nella zona di memoria del charset.
erano un pochetto sbagliate... :P
Buon Lavoro!!! :lol:
-
L'ideale sarebbe
*=$0800
incprg charset
*=$1000
;codice (fino a $1fff penso ti basti no?)
*=$2000
incprg koalapic
cosi' si avra' sia bmp che charset nello stesso banco del VIC-II, devi solo cambiare il valore di $d018 (e ok, anche il bit 5 di $d011 per settare text mode piuttosto che bmp mode)
Per eseguire dovrai dare una sys4096 a mano (l'inizio del basic e' occupato dal charset).
Se ti da' a noia, ogni volta che compili, comprimi il prg con pucrunch o exomizer ed il gioco e' fatto.
-
Mentre aspettavo che rispondesse iancoog (il sito Ready64 indicava che si era collegato) ho comunque riscritto il tutto cambiando banco... (ho perso meno tempo e ho letto la risposta di ian a gioco fatto).
Qui c'è il listato:
;Raster split demo
*=$0801
word eop
word 7102
byte $9e,"2061",0
eop word 0
;Puliamo lo schermo video che useremo
lda #32
ldx #0
pulizia sta $5000,x
sta $5100,x
sta $5200,x
sta $5300,x
dex
bne pulizia
sei; fermiamo le interruzioni perchè il flickering mi dava fastidio
ldx #$00
stx $d021
copyloop:
lda $3f40,x; copy colours to screen RAM
sta $0400,x
lda $4040,x
sta $0500,x
dex
bne copyloop
tax
disphello lda hellotxt,x
cmp #$40 ;Fix caratteri non validi
bcc charokay
sec
sbc #$40 ;end fix
charokay sta $5300,x
inx
cpx #$0E
bne disphello
loop
lda #$30
raster1 cmp $d012
bne raster1
ldx #$00
stx $d020
lda $dd00
and #252
ora #3
sta $dd00
lda #$3b ; bitmap mode
ldx #$18 ; multi-colour mode
ldy #$18
sta $d011
stx $d016
sty $d018
lda #$a8
raster2 cmp $d012
bne raster2
ldx #$01
stx $d020
lda $dd00
and #252
ora #2
sta $dd00
lda #$1b
ldx #$08
ldy #$42;Trovare bit giusto
sta $d011 ; Clear high bit of $d012, set text mode
stx $d016 ; single-colour
sty $d018
jmp loop
hellotxt .TEXT "RASTER SPLIT!!!"
*=$2000
incprg "elder_doppio.koa"
*=$4800
incprg "daredevil.64c"
Mentre in allegato il risultato col DASM...
-
siete pregati di usare un vostro numero di linea, 7102 e' © iAN CooG :P:P:P
-
loool ho niubbato :)
grazie! quanto prima vado avanti con gli studi e posto qualche risultato :D
-
Ecco qualche aggiornamento, ora va tutto meglio (anche se ci sono problemi di sincronizzazione), e sono riuscito a fare una mezza raster bar smanettando un po con il codice.
;raster split + interrupts
*=$0800
incprg "daredevil.64c"
*=$1000
incprg "music.dat"
*=$2000
incprg "elder_doppio.koa"
* = $4800;Sys 18432 to start!
jsr $1000
sei
jsr $e544;Screen clear
;Puliamo lo schermo video che useremo
lda #32
ldx #0
pulizia sta $5000,x
sta $5100,x
sta $5200,x
sta $5300,x
dex
bne pulizia
sei; fermiamo le interruzioni perchè il flickering mi dava fastidio
ldx #$00
stx $d021
copyloop
lda $3f40,x; copy colours to screen RAM
sta $0400,x
lda $4040,x
sta $0500,x
dex
bne copyloop
tax
;Display message
ldx #$00
dispmsg lda hellotxt,x
cmp #$40;IS TEXT CHAR OVER #$40.
bcc charokay;ELSE DON'T CHANGE
sec ;OTHERWISE CONVERT
sbc #$40;TO CORRECT CHARS.
charokay sta $0688,x
inx
cpx #$18
bne dispmsg
sei
lda #<irqrast
ldx #>irqrast
sta $0314
stx $0315
lda #$0
sta $d012
lda #$7f
sta $dc0d
lda #$1b
sta $d011
lda #$01
sta $d01a
cli
hold
lda #$0
sta $d020
sta $d021
lda #$30
raster1
cmp $d012
bne raster1
lda #$0
sta $d020
sta $d021
lda #$3b ; bitmap mode
ldx #$18 ; multi-colour mode
ldy #$18
sta $d011
stx $d016
sty $d018
lda #$a8
raster2
cmp $d012
bne raster2
lda #$1b
ldx #$08
ldy #$12;Trovare bit giusto
sta $d011 ; Clear high bit of $d012, set text mode
stx $d016 ; single-colour
sty $d018
lda #$0
sta $d020
sta $d021
jmp hold
irqrast
lda $dc0d ; ACK CIA 1 interrupts
lda $dd0d ; ACK CIA 2 interrupts
asl $d019 ; ACK VIC interrupts
lda #$b1
sta $d012
jsr txtwash
jsr rastwash
jsr $1003
lda #$b1
sta $d012
n2o
lda $c1
cmp $d012
bne n2o
;LDA #$B3
;STA $D012
cli
jmp $ea31
hellotxt .text "RASTER SPLIT!! "
;======================
;TEXT WASHING ROUTINE
;======================
txtwash
lda colour+$00
sta colour+$28
ldx #$00
cycle lda colour+$01,x
sta colour+$00,x
lda colour,x
sta $da88,x
inx
cpx #$28
bne cycle
rts
;======================
; RASTER BAR
;======================
rastwash
ldx #$00
cycle2
lda colour+$01,x
sta colour+$00,x
sta $d020
sta $d021
inx
cpx #$34;VERIFICARE!!!
bne cycle2
rts
;DATA TABLES FOR COLOURS
colour
.byte $06,$06,$06,$0e,$06,$0e
.byte $0e,$06,$0e,$0e,$0e,$03
.byte $0e,$03,$03,$0e,$03,$03
.byte $03,$01,$03,$01,$01,$03
.byte $01,$01,$01,$03,$01,$01
.byte $03,$01,$03,$03,$03,$0e
.byte $03,$03,$0e,$03,$0e,$0e
.byte $0e,$06,$0e,$0e,$06,$0e
.byte $06,$06,$06,$00,$00,$00
-
Un bel passo avanti...
Non capisco però alcune cose: perchè se hai creato finalmente una routine di gestione delle interruzioni (per suonare la musica ed eseguire le rasterbars), poi non la sfrutti per gestire anche lo split dello schermo?
-
Si, ho in mente di migrare completamente a una soluzione "solo interrupts", ma voglio andare a step (ancora non sono molto sicuro di quello che faccio, come avete visto) e quindi ho lasciato parte della logica basata su un meccanismo che ho acquisito.
Posterò quanto prima gli altri progressi :) grazie per le dritte ragazzi