Autore Topic: Routine Generazione Mappa A Blocchi  (Letto 1569 volte)

Fabbroz75

  • Utente
  • **
  • Post: 65
  • Gioco Preferito: Aufwiedersehen Monty
Routine Generazione Mappa A Blocchi
« il: 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 )

Codice: [Seleziona]
; 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:

Codice: [Seleziona]

AAAAAABA
ABBBBABA

C64/C64c/C128/C16/Vic20 | 64SD Infinity 2.0 |

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Routine Generazione Mappa A Blocchi
« Risposta #1 il: 12 Luglio 2006, 21:56:11 »
Citazione da: "Fabbroz75"
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.
Codice: [Seleziona]
;---------------------------------------
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
;---------------------------------------
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Fabbroz75

  • Utente
  • **
  • Post: 65
  • Gioco Preferito: Aufwiedersehen Monty
Routine Generazione Mappa A Blocchi
« Risposta #2 il: 13 Luglio 2006, 16:44:42 »
 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 )

Codice: [Seleziona]

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.
 
C64/C64c/C128/C16/Vic20 | 64SD Infinity 2.0 |