Ready64 Forum
Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: Fabbroz75 - 12 Luglio 2006, 10:19:28
-
Ho provato a scrivere la "logica" di una routine che genera mappe di gioco a blocchi.
La routine, genera 2 righe con i caratteri A e B, leggendo i dati dalla mappa ( A e B immaginateli come blocchi grafici Nulla / Terreno )
; Code by Fabbroz75
; solo scopo didattico
; da ottimizzare ed ampliare
maxline = 8
*= $0900 ; SYS2304 dal basic per eseguirla
cls lda #$00 ; colore 0
sta $d020 ; centro
sta $d021 ; bordo
jsr $e544 ; cancello lo schermo
ldx #$00
code lda map,x ; carico i dati della mappa
sta $0400,x ; stampo i caratteri nella prima riga
lda map,x+maxline; passo alla seconda colonna della mappa
sta $0428,x ; la stampo nella seconda riga
inx ; leggo i singoli byte
cpx #$08 ; ho letto 8 byte per riga?
bne code ; se no, continua finche'
; no ho letto tutta la mappa
lda #$0d ; Aggiungo un accapo
jsr $ffd2 ; solo per evitare che la scritta ready
; vada sopa mappa
rts ; torna al basic
map
byte 1,1,1,1,1,1,2,1
byte 1,2,2,2,2,1,2,1
ecco cosa genera:
AAAAAABA
ABBBBABA
-
Ho provato a scrivere la "logica" di una routine che genera mappe di gioco a blocchi.
Un po' pochino per definirla tale, e' praticamente un stampa a video dei dati.
se scrivevi
SCRU "AAAAAABA"
SCRU "ABBBBABA"
era piu' chiaro anche per te sapere cosa avresti messo nella memoria video.
Ti do qualcosa su cui studiare, qui ogni bit a 0 indica uno spazio e quelli a 1 mettono uno spazio in reverse. Utile per fare ad esempio uno zoom 8x8 di un charset.
;---------------------------------------
maxline = 8
currpos = $fb
counter = $fd
;---------------------------------------
*= $0801
word eop
word 7102
byte $9e
byte [start]d
eop
byte 0
;---------------------------------------
start
lda #$00
sta $d020
sta $d021
lda #$01
jsr $e536
;init puntatori
ldx #<$0400
lda #>$0400
stx currpos
sta currpos+1
stx counter
next ;prendi 1 byte
lda map,x
ldy #00
loop1
ldx #$20; valore per i bit a 0
rol ; bit7 nel carry
bcc stampaA
ldx #$a0; per quelli a 1
stampaA
pha ;preserva A nello stack
txa
sta (currpos),y
pla
iny
cpy #$08
bne loop1
;prossima linea
lda currpos
clc
adc #$28
sta currpos
bcc noinchigh
inc currpos+1
noinchigh
;prossimo byte
inc counter
ldx counter
cpx #[endmap-map]
bne next
;ldx #$08; all'uscita vale gia' 8
ldy #$00
jmp $e50c;posiziona cursore, torna al basic
;---------------------------------------
map
byte $80,$80,$e1,$01,$41,$a8,$49,$0e
endmap
;---------------------------------------
-
Grazie ancora.
rispondo a:
"... era piu' chiaro anche per te sapere cosa avresti messo nella memoria video..."
Sto iniziando a capire e i vari $0400, $d800 etc...
Il mio scopo attuale è quello di riuscire a disegnare un "livello" a blocchi ( platform )
Tutta la logica l'ho... devo conoscere l'hardware del c64 e sapere come accedere ai vari registri.
Ho fatto una routine dove stampo desto a video e cambio dove voglio il colore delle singole lettere o delle parole ( $040x e $D80x )
maxline = 8
col = $d800
vid = $0400
*= $0801 ; SYS2304 dal basic per eseguirla
.byte $0b,$08,$0a,$00,$9e
.text "2061"
.byte $00,$00,$00
ldx #$00
code
lda map,x
sta col,x
sta vid,x
inx
cpx #$05
bne code
rts
map
byte 3,4,1,5,1
Una cavolata... se consideri che mi sto studiando la rom e la ram map del c64.
Voglio capire come accedere in modalità bitmap e disegnarci dentro...
e l'utilizzo degli irq.
Intanto ti ringrazio ancora per tutti i consigli.