Autore Topic: Gestione Dinamica Dei Dati  (Letto 4230 volte)

metalredstar

  • Newbie
  • *
  • Post: 1
  • Gioco Preferito: The Sentinel
Gestione Dinamica Dei Dati
« il: 09 Settembre 2013, 12:39:14 »
 ciao a tutti... vorrei, da neofito neo-avvicinato alla programmazioned si C64, fare una domanda tecnica ma, diciamo, BASIC-oriented sulla gestione dei DATA...

credo che la questione possa avere attinenza con la gestione della memoria e dei dati in generale... ma io "parlo" in basic perché lo conosco meglio... (almeno un po')

cerco di spiegarmi.

utilizzando il costrutto READ...DATA praticamente io assegno a una variabile A il valore letto dalle catene DATA recuprato di volta in volta tramite il puntatore a DATA... ovvero epr ogni READ il puntatore avanza di una posizione e legge il valore DATA corrispondeente. questo è già una questione a basso livello anche se usata dal basic perché il 6510 ha un solo puntatore utilizzabele allo scopo... ok... io non ho forma di controllare né manipolare la posizione del puntatore, l'unica cosa che posso fare è veder se ci sono ancora DATA disponibili e/o rimettere tutto da capo con RESTORE...

ora facciamo l'esempio che io uso i DATA per caricare i registi del VIC-II per genereare uno sprite....
metti che il mio programma è del tipo : "scegli lo prote che vuoi visualizzare tra gli i 20 diponibili, scrivi un valore da 1 a 20 e premi invio"..

in questo caso io devo DINAMICAMENTE puntare al blocco di data relativo allo sprite 1...20 ma con i contrlli che ho a disposizione posso solo movermi avanti di un DATA per ogni READ o ricominciare da capo... Sapendo che ogni sprite è composto da 24 data sequenziali (3x8 byte) e assumendo che io sono stato bravo e ho organizzato i blocchi da 24 in modo sequenziale, l'unico modo che mi viene per visualizzare direttamente (ad esempio) lo sprite 18 è resettare il puntatore, fare un un ciclo di 17x24 read SENZA assegnare i valori ai registri del VIC in modo di posizionarmi all'inizio del 18esimo blocco di 24 data (dove ho organizzato i valori per lo sprite 18) e da li fare un ciclo di 24 per leggere i DATA e caricare i valori nel VIC...

Cosí dovrebbe funzionare ... però mi sembra una cosa TROOOOOOOOOOPPO lenta per poter esser fruibile in un gioco... anche lavorando in assembler... cioè ... non è possbile che se io DINAMICAMENTE voglio acceder alla struttura dati N per avere a disposizione un certo gruppo di dati devo ricomincire a scorrermi tutti i valori da 0...

e calcola che ho fatto un esempio semplice perché ho ipotizzato cehe i data sono solo per gli sprite e quindi uniformemente organizzati in blocchi da 24... se in mezzo a tutti sti data ci sono (come normale) dati per altre cose (chessó musica, dati personali... ecc. ecc.) che hanno una struttura diversa uno dall'altro diventa un inferno..

come cavolo si fa?

non se sè è un problema di Basic in senso stretto (magari in ASM ci sono tecniche che permettono di accede direttamente al blocco dati desiderato...) o proprio di accesso ai dati in assenza di strutture dati dedicate (tipo Array di oggetti o struct)

non so se sono stato chiaro...

grazie a tutti per l'aiuto ...

COMMODORO

  • Utente
  • **
  • Post: 160
  • Gioco Preferito: Bomberman C64
Gestione Dinamica Dei Dati
« Risposta #1 il: 09 Settembre 2013, 16:47:41 »
 Ti posso garantire che la gestione dei problemi da te esposti usando l'assembly é complessa ma non difficile e così confusionaria come tu temi.
Non ho mai approfondito lo studio del Basic come sto facendo invece ora per l'assembly ma qualcosa te lo posso dire.
Innanzitutto la lettura dei data dei vari sprite non é così caotica.
Con un comando si ordina da che indirizzo di memoria andare a leggere la costruzione dello sprite(dopo averlo acceso, posizionato,definito multicolor o no, prorità etc ).Ovviamente da qualche parte nel programma o in un file allegato ci devono essere i data dello sprite con specificato l'indirizzo di memoria di partenza. Se ci sono molti sprite, la costruzione di ognuno dei quali occupa 64 bytes ($40 in esadecimale), per selezionare quello che serve ci si riferisce con l'indirizzo di memoria di partenza + la posizione nella quale si trova nella lista degli sprite quello che ci serve. In base all'assembler che si sta utilizzando, se prevede l'uso di label, ci può semplificare molto il lavoro.
Nessuna confusione per gli altri data, per esempio i data delle musiche occupano sempre locazioni di memoria ben diverse da quelle usate per disegnare gli sprite. Una locazione di memoria molto usata per i data musicali per esempio è la $1000 cioé in decimale dalla locazione 4096, ed é una locazione che non viene mai utilizzata per la grafica.

Se qualcuno più esperto non interverrà se vuoi approfondire proverò a postarti un pò di esempi.
Ciao

tsm_carmine

  • Redazione
  • Utente
  • ****
  • Post: 515
  • Gioco Preferito: Krakout
Gestione Dinamica Dei Dati
« Risposta #2 il: 09 Settembre 2013, 18:12:31 »
 Tu descrivi le bitmap relative ai vari sprite nelle righe DATA ma il VIC-II non legge assolutamente i dati da lì. Infatti nel ciclo che recupera questi dati con l'istruzione READ c'è un'istruzione POKE che salva il dato appena letto in memoria, a partire da una determinata locazione. Da qualche parte nel programma tu comunichi al VIC-II questa locazione e lui fa il resto, facendo apparire l'immagine. A questo punto hai già capito la soluzione: definisci tutte le immagini per il tuo sprite nelle righe DATA, leggi questi valori (READ), memorizzali (POKE) opportunamente, dopo di che ti basterà cambiare il puntatore del tuo sprite per scegliere di volta in volta l'aspetto da dare all'elemento grafico.
Devi solo stare attento alle restrizioni su dove è possibile memorizzare le immagini e al particolare metodo usato per convertire l'indirizzo di memoria nel numeretto che andrai effettivamente ad indicare come puntatore allo sprite (da non confondere con il puntatore ai DATA, che è tutt'altra cosa).
Riusciremo a costruire un mondo dove più nessuno osi pronunciare le parole... "lettore floppy"?