Autore Topic: Raster Split + Image + Custom Character Set  (Letto 2833 volte)

Elder0010

  • Utente
  • **
  • Post: 75
    • http://csdb.dk/scener/?id=22731
  • Gioco Preferito: Rampage
Raster Split + Image + Custom Character Set
« il: 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!


   
Codice: [Seleziona]
;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"
  
« Ultima modifica: 22 Gennaio 2015, 00:21:21 da eregil »
lda #0 sta $d020 sta $d021

med

  • Utente
  • **
  • Post: 103
    • med64.tk
  • Gioco Preferito: Turrican 2
Raster Split + Image + Custom Character Set
« Risposta #1 il: 10 Febbraio 2011, 23:26:35 »
 Scusa (spero di non dire una scemenza), ma mi spieghi il senso di questo???

Citazione
*=$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ò...
 

med

  • Utente
  • **
  • Post: 103
    • med64.tk
  • Gioco Preferito: Turrican 2
Raster Split + Image + Custom Character Set
« Risposta #2 il: 10 Febbraio 2011, 23:33:35 »
 Se infatti fai la prova a non far caricare il set di caratteri eliminando le istruzioni:

Citazione
*=$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"
Citazione
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:  

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Raster Split + Image + Custom Character Set
« Risposta #3 il: 10 Febbraio 2011, 23:51:01 »
 L'ideale sarebbe
Codice: [Seleziona]
*=$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.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

med

  • Utente
  • **
  • Post: 103
    • med64.tk
  • Gioco Preferito: Turrican 2
Raster Split + Image + Custom Character Set
« Risposta #4 il: 10 Febbraio 2011, 23:59:59 »
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:

Codice: [Seleziona]
;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...
« Ultima modifica: 22 Gennaio 2015, 00:21:56 da eregil »

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Raster Split + Image + Custom Character Set
« Risposta #5 il: 11 Febbraio 2011, 00:09:49 »
 siete pregati di usare un vostro numero di linea, 7102 e' © iAN CooG :P:P:P
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Elder0010

  • Utente
  • **
  • Post: 75
    • http://csdb.dk/scener/?id=22731
  • Gioco Preferito: Rampage
Raster Split + Image + Custom Character Set
« Risposta #6 il: 11 Febbraio 2011, 09:58:13 »
 loool ho niubbato :)

grazie! quanto prima vado avanti con gli studi e posto qualche risultato :D
lda #0 sta $d020 sta $d021

Elder0010

  • Utente
  • **
  • Post: 75
    • http://csdb.dk/scener/?id=22731
  • Gioco Preferito: Rampage
Raster Split + Image + Custom Character Set
« Risposta #7 il: 13 Febbraio 2011, 15:37:36 »
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.

Codice: [Seleziona]
;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
« Ultima modifica: 22 Gennaio 2015, 00:22:21 da eregil »
lda #0 sta $d020 sta $d021

med

  • Utente
  • **
  • Post: 103
    • med64.tk
  • Gioco Preferito: Turrican 2
Raster Split + Image + Custom Character Set
« Risposta #8 il: 13 Febbraio 2011, 18:17:23 »
 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?

Elder0010

  • Utente
  • **
  • Post: 75
    • http://csdb.dk/scener/?id=22731
  • Gioco Preferito: Rampage
Raster Split + Image + Custom Character Set
« Risposta #9 il: 13 Febbraio 2011, 21:39:11 »
 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
lda #0 sta $d020 sta $d021