Ready64 Forum
Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: iAN CooG - 28 Aprile 2005, 02:09:47
-
Ma come, non c'e' ancora una routine di visualizzazione di files KoalaPaint sul forum?
Eccola:
;---------------------------------
;Koalaview by iAN CooG/HokutoForce
;C64ASM version
;---------------------------------
scrpos = $7f40
scr = $5c00
colpos = $8328
col = $d800
bkgcol = $8710
;---------------------------------
;sysline
;---------------------------------
*= $0801
.word eop
.word 7102
.byte $9e
.byte $32,$30,$36,$31,$00
eop
.word 0
;---------------------------------
;to avoid unnecessary waste of mem
;stick the routine just after
;the koalapic, comment the above
;sysline and set *= $8711 instead
;---------------------------------
;*= $8711
sei
lda #$00
sta $d011
sta $d020
ldx #$00
copy
lda scrpos ,x
sta scr ,x
lda scrpos+$100,x
sta scr +$100,x
lda scrpos+$200,x
sta scr +$200,x
lda scrpos+$300,x
sta scr +$300,x
lda colpos ,x
sta col ,x
lda colpos+$100,x
sta col +$100,x
lda colpos+$200,x
sta col +$200,x
lda colpos+$300,x
sta col +$300,x
dex
bne copy
lda bkgcol
sta $d021
lda #$2e
sta $d012
lda #$78
sta $d018
lda #$02
sta $dd00
lda #$d8
sta $d016
lda #$3b
sta $d011
kmain
;wait for any fire/space
lda $dc01
and $dc00
and #$10
bne kmain
cli
;remove the space from buffer, if any
;cyclewaste, to wait $C6
beq *+2
sta $c6
jsr $fda3
jsr $e5a0
lda $0286
ldx #$00
cram
sta col ,x
sta col+$0100 ,x
sta col+$0200 ,x
sta col+$0300 ,x
dex
bne cram
rts
*= $6000
.incbin nomefile.KOA
Con la sysline si viene a creare un file di 32Kb (129blocchi!) e inutilmente, dato che il codice e' meno di 150 byte, e l'immagine di 10001 bytes. Pero' ai fini di una prova veloce puo' andare.
Rinunciando alla sysline invece si ottiene un file grande 10149 (rimane di 40 blocchi come un immagine koala), lo stretto necessario.
Inutile dire che occorre sempre compattare i files, per ottenere la minima occupazione.
Edit: ridotta all'osso la pulizia del buffer in caso di pressione di spazio/fire 1; dopo un attenta osservazione con il debugger mi sono accorto che e' sufficiente perdere qualche ciclo (con una beq *-2) affinche' le routine del kernal riempiano $c6 con il valore 1... e solo a quel punto vale la pena azzerarlo.
-
Ho notato che per caricare un .koa fatto con ConGo v5, è necessario caricare il file a *=indirizzo-2 altrimenti si vede un po sballato.
Oppure, basta utilizzare INCPRG nomefile.koa al posto di .incbin
-
Ho notato che per caricare un .koa fatto con ConGo v5, è necessario caricare il file a *=indirizzo-2 altrimenti si vede un po sballato.
Oppure, basta utilizzare INCPRG nomefile.koa al posto di .incbin
Questo perché il file è un tipico "PRG", con i primi due byte contenenti l'indirizzo di default nel quale caricare lo stesso (low byte - hi byte).
-
Giusto per chiarire
;C64ASM version
Come specificato, il sorgente lo realizzai per C64asm e non Dasm, da qui il comportamento diverso.
In C64asm .Incbin tiene conto del load address (ma carica SOLO al load address indicato nel file) mentre in Dasm carica TUTTO il file binario all'org attuale, compresi i primi 2 byte se non li si e' eliminati preventivamente con un hexeditor.
In Dasm ho implementato Incprg cercando di ovviare al noioso comportamento di incbin, ma ho dovuto mantenere il vecchio comando per compatibilita' anziche' rimpiazzarlo con la nuova routine.
-
Mi permetto (ma come mi permetto?) di provare ad operare una piccola e banalissima modifica che consentirà di visualizzare le immagini di un altro popolare (?) formato, ovvero quello di OCP ArtStudio (hi-res, due colori):
;---------------------------------
;ArtView, based on:
;Koalaview by iAN CooG/HokutoForce
;(Do not blame iAN for bugs)
;C64ASM version
;---------------------------------
scrpos = $7f40
scr = $5c00
bkgcol = $832e
;---------------------------------
;sysline
;---------------------------------
*= $0801
.word eop
.word 7102
.byte $9e
.byte $32,$30,$36,$31,$00
eop
.word 0
;---------------------------------
;to avoid unnecessary waste of mem
;stick the routine just after
;the artapic, comment the above
;sysline and set *= $832f instead
;---------------------------------
;*= $832f
sei
lda #$00
sta $d011
sta $d020
ldx #$00
copy
lda scrpos ,x
sta scr ,x
lda scrpos+$100,x
sta scr +$100,x
lda scrpos+$200,x
sta scr +$200,x
lda scrpos+$300,x
sta scr +$300,x
dex
bne copy
lda bkgcol
sta $d021
lda #$2e
sta $d012
lda #$78
sta $d018
lda #$02
sta $dd00
lda #$c8 ;<--- no multi-colour!
sta $d016
lda #$3b
sta $d011
kmain
;wait for any fire/space
lda $dc01
and $dc00
and #$10
bne kmain
cli
;remove the space from buffer, if any
;cyclewaste, to wait $C6
beq *+2
sta $c6
jsr $fda3
jsr $e5a0
;insert some other cool routine here
rts
*= $6000
.incbin nomefile.ART
;OR, for DASM:
;.incprg nomefile.ART.PRG
Notare che tipicamente, nonché per default, i file di Art Paint vengono caricati in $2000 (anziché $6000), ma per semplicità (leggasi pigrizia) ho tenuto invariato l'indirizzo.
N.B.: non ho compilato questo codice, perché uso un diverso assembler e sono troppo pigro/assonnato per convertirlo. Il che significa che potrebbe non funzionare, causare danni permanenti al vostro PC/C64, provocare improvvise variazioni climatiche e/o farvi crescere ciuffi di peli in posti strani.