Autore Topic: Charset Personalizzato  (Letto 3055 volte)

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Charset Personalizzato
« il: 02 Aprile 2010, 16:23:35 »
 Salve a tutti!
Sono un esordiente e sto cominciando a fare un po di pratica con la selezione del video bank , dell'indirizzo della memoria video e del charset.
Con questo codice riesco ad impostare il video bank 0, la video memory a $0000 ed un charset caricato a $3800

Codice: [Seleziona]
lda $dd00  ; Seleziono banco 0 ( $0000-$3fff)
ora #%00000011
sta $dd00

lda $d018  ; video a $0000 charset a $3800
ora #%00001110  
sta $d018

Se tento di modificare qualcosa come:

Codice: [Seleziona]
lda $dd00  ; Seleziono banco 2 ( $8000-$BFFF)
ora #%00000001
sta $dd00

lda $d018  ; video a $0000 charset a $9000
ora #%00000100  
sta $d018

mi aspettavo funzionasse lo stesso (ovviamente su locazioni di memoria diverse) invece il charset non viene cambiato!

Qualcuno può illuminarmi?

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Charset Personalizzato
« Risposta #1 il: 02 Aprile 2010, 22:04:45 »
 Che mira =) Sei andato a mettere il charset proprio in uno dei 2 posti in cui il VIC-II vede SEMPRE il charset in ROM, qualunque cosa tu faccia: $1000 e $9000. E' una forzatura necessaria by design, infatti il charset di default e' visto a $1000 ($dd00=0 e $d018=$14). I banchi 1 e 3 sono immuni da questa forzatura quindi sono utilizzabili dal VIC-II nella loro interezza.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Charset Personalizzato
« Risposta #2 il: 05 Aprile 2010, 10:39:13 »
 Quindi posso utilizzare i banchi 1 ($4000-$7FFF) o 3 ($C000-$FFFF) posizionando (nei limiti dei 16k) memoria video e charset dove meglio credo senza ritrovarmi $1000-$17FF o $1800-$1FFF sempre occupati dal charset di default; corretto?

Approfitto per levarmi un altro dubbio:
Il limite dei 16k indirizzabili dal processore video si estende anche ad altri ambiti? E' possibile memorizzare altri dati (musica,mappe,ecc..) nella ram restante?

ps Non mi è ancora molto chiaro l'utilizzo dei vari metodi di indirizzamento (absolute, zero page , indirect ) e di come scegliere quello più indicato a seconda dei vari contesti possibili...

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Charset Personalizzato
« Risposta #3 il: 05 Aprile 2010, 13:35:42 »
Citazione da: "antoniomauro"
Approfitto per levarmi un altro dubbio:
Il limite dei 16k indirizzabili dal processore video si estende anche ad altri ambiti? E' possibile memorizzare altri dati (musica,mappe,ecc..) nella ram restante?
 
La musica nei demo e' infatti messa spesso a $1000-1fff proprio per quello, essendo inutilizzato dal VIC-II, quel segmento puo' essere sfruttato per contenere altri dati. Nei giochi fatti con SEUCK si puo' mettere la musica a $9000.
 
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Charset Personalizzato
« Risposta #4 il: 06 Aprile 2010, 12:16:50 »
 Sarebbe possibile (ad esempio) memorizzare una mappa di caratteri (o una bitmap) oltre i 16k visti dal VIC-II, utilizzandola per ricreare una schermata nella memoria video (copiando i dati da ram a ram)?

Ci sono delle controindicazioni ad utilizzare indirizzi "più lontani"?

Tornando al mio esperimento
Codice: [Seleziona]
lda $dd00  ; Seleziono banco 1 ($4000-$7FFF)
ora #%00000010
sta $dd00
In questa condizione i 16k visibili sono  ($4000-$7FFF) ed impostando:
Codice: [Seleziona]
lda $d018  ; video a $0000 charset a $3800
ora #%00001110  
sta $d018
dovrei avere la memoria video che parte a $0000 ed il charset a $3800.
Tuttavia per scrivere un carattere in alto a sx mi aspettavo di poter fare:
Codice: [Seleziona]
lda #$01  ; Metto un carattere nella memoria video
sta $0000
invece funziona solo se scrivo nella locazione $0400 (quella di default) nonostante abbia impostato i 4bit più significativi di $d018 a 0!




 

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Charset Personalizzato
« Risposta #5 il: 06 Aprile 2010, 22:16:11 »
 :confused: Se il banco in uso parte da $4000, difficilmente otterrai qualche risultato visibile mettendo roba a $0000 (tralasciando il fatto che le locazioni 0/1 sono riservate)
$0000 RELATIVO al banco in uso significa $4000 in questo caso, e $3800 sigifica $7800.

Riguardo l'uso della memoria, previo switch dei banchi con la locazione $01, puoi usarla tutta come ti pare a parte poche eccezioni, ma copiare dati da una parte all'altra implica aggiunta di tempi di attesa, a seconda delle esigenze e situazioni puo' comportare disagi o essere del tutto indifferente, dipende da tuo programma.

Citazione
invece funziona solo se scrivo nella locazione $0400 (quella di default) nonostante abbia impostato i 4bit più significativi di $d018 a 0!
Impossibile. Dopo aver settato $dd00=2 e $d018=$0e lo schermo e' a $4000 e il font a $7800, non ci sono possibilita' di errore. Hai inserito un altro valore nei 2 registri.
 
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Charset Personalizzato
« Risposta #6 il: 07 Aprile 2010, 11:30:43 »
 In effetti "Impossibile" è proprio quello che mi sono detto quando ho compilato (con la tua versione di DASM) ed eseguito (su VICE) queste poche righe di codice:

Codice: [Seleziona]
       org $080D;Inizio del programma

lda $dd00  ; Seleziono banco 1 ($4000-$7FFF)
ora #%00000010
sta $dd00

lda #$01  ; Metto un carattere nella memoria video
sta $4400              ;$4000 + $0400 (posizione di default)

        rts
Il risultato è che non accade nulla......
Se invece cambio l'ultima riga con sta $0400 quella maledetta "A" compare in alto a sx dello schermo!

Dove sto (sicuramente) sbagliando?

ps Ho escluso il caricamento di $d018 per limitare al massimo la possibilità di errore.

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Charset Personalizzato
« Risposta #7 il: 07 Aprile 2010, 12:18:47 »
 Ho provato a sostituire

lda $dd00       
ora #%00000010
sta $dd00

con

lda #$02   
sta $dd00

ed ora in risultato è quello atteso!!
La domanda allora diventa:
Perchè non si può settare un bit con un OR nella notazione binaria?
E' un limite del compilatore oppure è una pratica errata?

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Charset Personalizzato
« Risposta #8 il: 07 Aprile 2010, 21:12:59 »
 ORA fa esattamente quello che gli chiedi, settare a 1 i bit che gli lasci a 1.
Devi pero' spegnere prima quelli che non ti servono accesi, prova AND #$FC prima di ORA.
Io per prove veloci inserisco direttamente il valore con STA dirette, ma essendo gli altri bit di $dd00 riservati ad altro e' bene mascherarli correttamente.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Charset Personalizzato
« Risposta #9 il: 08 Aprile 2010, 10:29:07 »
 Perfetto! Ora è chiarissimo!

Ho scritto una piccola routine che copia alcuni caratteri dalla rom $D000 all'area dove risiede il charset personalizzato e mi chiedevo cosa fanno esattamente queste 2 righe necessarie ad attivare la presenza dei caratteri a $D000;

BASIC:
 poke1,peek(1)and251         :rem switch in character
ASM:
 lda $0001   ;switch in character
 and #$FB
 sta $0001

;copia dei dati

BASIC:
 poke1,peek(1)or4            :rem switch in i/o
ASM:
 lda $0001   ;switch in i/o
 ora #$04
 sta $0001

le ho convertite da un listato basic presente sull "COMMODORE 64 PROGRAMMER'S REFERENCE GUIDE" e vorrei avere conferma della loro correttezza dato che non ho trovato documentazione a riguardo!

Da quanto avevo capito pensavo di poter copiare gli stessi dati da $1000 prima dell'impostazione di $dd00 ma non sembra funzionare....

ps. Mi scuso se queste domande possano risultare banali o scontate. :)  

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Charset Personalizzato
« Risposta #10 il: 08 Aprile 2010, 19:34:44 »
 Beh sempre dalla PRG:
Codice: [Seleziona]
 MEMORY MANAGEMENT ON THE
  COMMODORE 64
[...]
    The 6510 input/output port appears at location 1. The data direction
[...]
  +---------+---+------------+--------------------------------------------+
  |  NAME   |BIT| DIRECTION  |                 DESCRIPTION                |
  +---------+---+------------+--------------------------------------------+
  |  LORAM  | 0 |   OUTPUT   | Control for RAM/ROM at $A000-$BFFF         |
  |  HIRAM  | 1 |   OUTPUT   | Control for RAM/ROM at $E000-$FFFF         |
  |  CHAREN | 2 |   OUTPUT   | Control for I/O/ROM at $D000-$DFFF         |
  |         | 3 |   OUTPUT   | Cassette write line                        |
  |         | 4 |   INPUT    | Cassette switch sense (0=play button down) |
  |         | 5 |   OUTPUT   | Cassette motor control (0=motor spins)     |


Da Mapping the C64 lo stesso schema espresso con parole diverse

Codice: [Seleziona]
1             $1             R6510

Bit 0: LORAM signal.  Selects ROM or RAM at 40960 ($A000).  1=BASIC, 0=RAM
Bit 1: HIRAM signal.  Selects ROM or RAM at 57344 ($E000).  1=Kernal, 0=RAM
Bit 2: CHAREN signal.  Selects character ROM or I/O devices.  1=I/O, 0=ROM

Quindi serve per far vedere il chargen a $d000.
Se setti tutti i primi 2 bit a 0 ($30,$34 o $38) ottieni una configurazione di 64k ram completi, pero' sei anche senza registri di I/O, quindi da usare con giudizio.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Charset Personalizzato
« Risposta #11 il: 09 Aprile 2010, 10:35:58 »
 2 domande ancora:

1) Lasciando i valori di $dd00 e $d018 a quelli di default, i caratteri rom non dovrebbero essere leggibili anche da $1000? Ho provato ma non sembra funzionare!

2) Con molta fatica ho realizzato il mio primo listato in asm che, bene o male, fa quello che volevo (copiare caratteri dalla rom, specchiare un carattere, cambiare indirizzo della memoria video/charset, scrivere sullo schermo) ma non riesco a capire 2 cose:
  a ) Perchè al momento dell'esecuzione non è più possibile utilizzare l'editor basic?
  b ) Se provo a modificare nel ciclo della copia dei caratteri rom cpx #$B8 con cpx #$c0    per copiare un carattere in più, al momento del "run" si blocca tutto. E dire che prima di alcuni ritocchi (in altri punti del codice) non riuscivo ad andare oltre il valore #$B8....
Sto sicuramente ignorando qualcosa nell'utilizzo dei registri e dell'accumulatore che in realtà e fondamentale nella stesura corretta di un programma in asm ma non riesco a capire cosa!!
 
li listato:
Codice: [Seleziona]
processor 6502

app = $02;Variabile di appoggio in zero page???

org $0801

  word eop
  word 7102
  byte $9e,"2061",0;Sys command
eop word 0

org $080D;Inizio del programma

;Copio 23 caratteri caratteri da $D000(rom charset) a $7800
  lda $0001;switch in character
  and #$FB
  sta $0001
  
  ldx #$00
lpCopy  lda $D000,x
  sta $7800,x
  inx
  cpx #$B8;23 char di 8*8bytes  
  bne lpCopy
  
  lda $0001;switch in i/o
  ora #$04
  sta $0001



;Proviamo a copiare la B invertita nel carattere @
  ldx #$00
lpShift1
  lda $7810,x;carico A con i dati del carattere

        ldy #$00
        sty app  ;Azzero app
lpShift2
        lsr        ;shift a destra del byte ed il primo bit finisce nel carry
        rol app    ;recupero il bit finito nel carry  scorrendo a sx app
  iny
  cpy #$08
  bne lpShift2
  
  lda app  ;Memorizza app  
  sta $7800,x
  inx
  cpx #$08
  bne lpShift1



  lda #$02  ; Seleziono banco 1 ($4000-$7FFF)
  sta $dd00
  
  lda #$0E  ; video a $0000 +$4000 charset a $3800 + $4000
  sta $d018


;Scrivo 23 caratteri su schermo
  ldx #$00
lwWrite txa
  sta $4000,x
  inx
  cpx #$17
  bne lwWrite

  rts


ps: Grazie per la pazienza con cui mi stai spiegando tutto!

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Charset Personalizzato
« Risposta #12 il: 09 Aprile 2010, 15:56:08 »
 Aggiungo un dettaglio insolito:
Ho fatto una copia del sorgente in un altro file l'ho ricompilato e ha funzionato senza problemi....Ho aggiunto poi un altro paio di cosette ancora ed ora non va più!
La cosa più strana è che, se commento una parte di codice rendendo il listato più breve (ad esempio la routine di specchiamento di un carattere,oppure le due righe aggiunte) , tutto funziona.
Non credo che sia un errore di quella parte di codice dato che funziona correttamente se la faccio girare in un listato più breve....

ecco le modifiche che ho apportato nel ciclo che copia i caratteri dalla rom
Codice: [Seleziona]
 ldx #$00
lpCopy lda $D000,x
  sta $7800,x
  lda $D100,x  ;Aggiunto
  sta $7900,x  ;Aggiunto
  inx
  cpx #$00      ;modificato    
  bne lpCopy

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Charset Personalizzato
« Risposta #13 il: 09 Aprile 2010, 17:11:54 »
 Mi auto rispondo sperando di aver centrato il problema:
Facendo un po di debug con il monitor del Vice mi sono accorto che nel bel mezzo del ciclo di copia dei dati dalla rom (quando questo si prolunga troppo) l'esecuzione salta ad alcune istruzioni non scritte da me in locazioni diverse da quelle dove ho caricato il prg.
Immaginando che si trattasse di qualche interrupt di sistema ho aggiunto un "SEI" prima del ciclo ed un "CLI" all'uscita dello stesso ripristinando la funzionalità del programma.

A questo punto resta in piedi la sola domanda:
Perchè finita l'esecuzione del codice il controllo non torna all'editor basic?

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Charset Personalizzato
« Risposta #14 il: 09 Aprile 2010, 21:38:49 »
 
Citazione
Perchè finita l'esecuzione del codice il controllo non torna all'editor basic?
Devi anche settare il nuovo indirizzo del video editor per il basic, che punta ancora a $0400. (metti $40 nella loc $0288)
Citazione
Immaginando che si trattasse di qualche interrupt di sistema ho aggiunto un "SEI"
SI, e' necessario disattivare le interrupt se disattivi il kernal perche' la routine di interrupt di sistema, puntata da $0314/5 mentre il kernal e' attivo, o da $fffe/f mentre e' disattivo, viene sempre eseguita dal 6510, a meno di bloccare le IRQ con appunto una SEI. Dopo aver risettato $01 a #$37 fai una CLI, a quel punto la routine di interrupt potra' di nuovo vedere il kernal e fare quel che deve fare.
Se prima di buttarti a capofitto ti fossi letto e provato qualcuno dei tanti esempi gia' postati in questo forum l'avresti gia' notato.

Citazione
1) Lasciando i valori di $dd00 e $d018 a quelli di default, i caratteri rom non dovrebbero essere leggibili anche da $1000? Ho provato ma non sembra funzionare!

Si e' detto che e' il VIC-II a vederli li, non sono fisicamente presenti a $1000 o $9000, ci mancherebbe. In pratica se i banchi selezionati sono lo 0 e il 2, il VIC-II vede SEMPRE la memoria $1000-$1fff (relativa all'inizio banco) dalla ROM caratteri, il resto dalla memoria RAM "vera" visibile in quel banco. E ripeto, RAM, ad esempio se si mette una bitmap a $e000-ff3f non e' nemmeno necessario switchare via il kernal, il VIC-II la visualizza comunque.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -