Vous pouvez désormais oublié ce blog et partir sur ma nouvelle adresse :
http://debuglife.free.fr
++
mercredi 26 août 2009
mardi 16 juin 2009
News
Pas de mise à jour depuis quelques semaines car je prépare un nouveau blog que j'ai écris entièrement en xhtml et css, le tout publié avec spip.
Donc migration très bientôt sur celui ci ;)
Donc migration très bientôt sur celui ci ;)
jeudi 23 avril 2009
Optimisation code
J'ai optimisé l'envoi du tileset en mapant les bank les contenant chacune leur tour sur MPR2 au lieu des 5 qui étaient mappés sur 5 MPR à l'origine !
Au lieu de :
d01:
lda #bank(test_set)
tam #page(test_set)
inc a
tam #3
inc a
tam #4
inc a
tam #5
inc a
tam #6
st0 #0
st1 #0
st2 #$10
st0 #2
tia test_set,$0002,$7000
Maintenant on à ça :
d01:
ldx #4
lda #bank(test_set)
tam #page(test_set)
sta <$01
st0 #0
st1 #0
st2 #$10
st0 #2
l1:
tia test_set,$0002,$2000
inc <$01
lda <$01
tam #page(test_set)
dex
bne l1
Au lieu de :
d01:
lda #bank(test_set)
tam #page(test_set)
inc a
tam #3
inc a
tam #4
inc a
tam #5
inc a
tam #6
st0 #0
st1 #0
st2 #$10
st0 #2
tia test_set,$0002,$7000
Maintenant on à ça :
d01:
ldx #4
lda #bank(test_set)
tam #page(test_set)
sta <$01
st0 #0
st1 #0
st2 #$10
st0 #2
l1:
tia test_set,$0002,$2000
inc <$01
lda <$01
tam #page(test_set)
dex
bne l1
dimanche 15 mars 2009
Timer_irq
Dans cet exemple je fais clignoter le background à l'aide du timer.
De mémoire, le compteur du timer est décrémenté tous les 1024 cylcles CPU. Une fois que le timer counter arrive à zero, l'interruption est effectuée (toujours sur irq1).
timer_irq.7z
Nb: J'ai du retirer les symboles "<" pour l'adressage en page zero dans le précédent poste, celui ci est mal interprété sur ce site! Vous trouverez la syntaxe correcte dans les sources.
De mémoire, le compteur du timer est décrémenté tous les 1024 cylcles CPU. Une fois que le timer counter arrive à zero, l'interruption est effectuée (toujours sur irq1).
timer_irq.7z
Nb: J'ai du retirer les symboles "<" pour l'adressage en page zero dans le précédent poste, celui ci est mal interprété sur ce site! Vous trouverez la syntaxe correcte dans les sources.
lundi 23 février 2009
Exemple d'interruption sur Vblank
Dans cet exemple on va simplement desactiver le Background grâce au Vblank interrupt sur IRQ1. A l'aide d'un compteur initialisé à 60 et décrémenté à chaque Vblank, on désactivera l'affichage lorque celui arrivera à 0 (ce qui doit faire une seconde).
Cet exemple sert surtout à comprendre comment fonctionne les IRQs sur PC Engine.
Quelque soit l'interruption provoqué par le VDC, c'est l'irq1 qui receptionne, du coup il est important de tester tous les bits du VDC Status Register $0000, ce qui nous permettra d'identifier l'origine de l'interruption.
Pour cela nous avons l'instruction BBS ou BBR qui testera le bit voulu et effectuera un branchement en fonction de son statut.
L'ensemble des sources (code et binaires) est disponible ici : vblank_irq.7z
Cet exemple sert surtout à comprendre comment fonctionne les IRQs sur PC Engine.
Quelque soit l'interruption provoqué par le VDC, c'est l'irq1 qui receptionne, du coup il est important de tester tous les bits du VDC Status Register $0000, ce qui nous permettra d'identifier l'origine de l'interruption.
Pour cela nous avons l'instruction BBS ou BBR qui testera le bit voulu et effectuera un branchement en fonction de son statut.
L'ensemble des sources (code et binaires) est disponible ici : vblank_irq.7z
; ----------------J'utiliserais le timer la prochaine fois pour vous montrer comment on fait clignoter un background ou un sprite....
; DISPLAY A BACKGROUND
; 02/03/2009
; Enguerrand SOULIER
; -----------------
vdc_sr = $20F6 ; vdc status register copy
bg_display = $20F7 ; vdc control register copy
.org $2200
irq_cnt: .ds 1
.bank 0
.org $FFF6
.dw _irq2
.dw _irq1
.dw _timer
.dw _nmi
.dw _reset
.org $E000
.db "Create by Peperocket"
; -------------
; INTERRUPT HANDLER
; -------------
_irq2:
nop
rti
_irq1:
pha
lda $0000
sta vdc_sr ; copy of video status register
bbs5 vdc_sr,l5 ; goto l5 if vblank
pla
rti
_timer:
pha
stz $1403 ; write for avoid infinity loop !
rti
_nmi:
nop
rti
_reset:
sei
csh
cld
lda #$FF
tam #0
lda #$F8
tam #1
stz $2000
tii $2000,$2001,$1FFF
ldx #$FF
txs
lda #$01
tam #2
lda #$3C
sta $2200
jmp main
;------------------------
; vsync interrupt
; ----------------------
l5:
dec irq_cnt
beq .cnt_int ; if equal zero, goto cnt_int for disable display
pla
rti
.cnt_int:
st0 #5 ; disable display
lda #$00
sta $0002
pla
rti
; -------------
; CODE
; -------------
main:
cli
lda #$05 ; enable irq1
sta $1402
st0 #5 ; disable display
lda #$00
sta $0002
st0 #$0B ; HDR Horizontal Display Width for 256*240 display
st1 #$1F
st2 #$03
st0 #$0D ; VDR Vertical Diplay Width for 256*240 display
st1 #$EF
st2 #$00
st0 #9 ; init bat size 32*32
st1 #0
st2 #0
d01:
lda #bank(test_set)
tam #page(test_set)
inc a
tam #3
inc a
tam #4
inc a
tam #5
inc a
tam #6
st0 #0
st1 #0
st2 #$10
st0 #2
tia test_set,$0002,$7000
d02:
lda #bank(test_pal)
tam #page(test_pal)
stz $402
stz $403
tia test_pal,$404,$200
d03:
lda #bank(test_map)
tam #page(test_map)
st0 #0
st1 #0
st2 #0
st0 #2
tia test_map,$0002,$700
st0 #5
lda #$C8
sta $0002
.inf_loop:
jmp .inf_loop
; -----------
; DATA
; -----------
.bank 1
.org $4000
test_pal:
.incbin "pce_pal.bin"
test_map:
.incbin "pce_map.bin"
test_set:
.incbin "pce_set.bin"
dimanche 15 février 2009
Les TILES en VRAM, mode PLANAR
Pour rappel :
Mais comment sont ordonnées les tiles en VRAM ?
Vram offset
Pour la ligne 1, le byte 1 sera composé du premier bit de chaque pixel et le byte 2 sera quand à lui composé du deuxiéme byte de chaque pixel, qui composent au final le WORD (16bits). On fera de même pour toutes les lignes et on terminera enfin avec les bits 3 et 4 des 8 lignes, 16 bytes plus tard ;)
Enfin il en est de même pour les sprites (16*16 pixels) sauf que ceux ci ne seront pas entrelacés, on aura donc les 4 bytes de chaque ligne, placés consécutivements en VRAM.
- Un background sur PC Engine est composé de tiles.
- Une tile fait 8*8 pixels et est associée à une palette de 16 couleurs.
- 16 palettes sont disponibles donc ça nous ferait 256 couleurs si la couleur couleur 0 (transparente) n'était pas sur chaque palette, ce qui nous fait quand même 240 couleurs.
- Chaque pixel dans une tile est codé sur 4bits (donc 16 possibilités) qui correspond a une couleur de sa palette.
- Une tile et sa palette sont associées par la BAT (Background Attribut Table).
- Les donnés en VRAM sont en WORD (16bits) et non en BYTE (8bits) le processeur graphique étant 16 bits !
Mais comment sont ordonnées les tiles en VRAM ?
Vram offset
- 0 [ Bytes 1 & 2 ] Line 1
- 2 [ Bytes 1 & 2 ] Line 2
- 4 [ Bytes 1 & 2 ] Line 3
- 6 [ Bytes 1 & 2 ] Line 4
- 8 [ Bytes 1 & 2 ] Line 5
- 10 [ Bytes 1 & 2 ] Line 6
- 12 [ Bytes 1 & 2 ] Line 7
- 14 [ Bytes 1 & 2 ] Line 8
- 16 [ Bytes 3 & 4 ] Line 1
- etc ...
Pour la ligne 1, le byte 1 sera composé du premier bit de chaque pixel et le byte 2 sera quand à lui composé du deuxiéme byte de chaque pixel, qui composent au final le WORD (16bits). On fera de même pour toutes les lignes et on terminera enfin avec les bits 3 et 4 des 8 lignes, 16 bytes plus tard ;)
Enfin il en est de même pour les sprites (16*16 pixels) sauf que ceux ci ne seront pas entrelacés, on aura donc les 4 bytes de chaque ligne, placés consécutivements en VRAM.
mardi 30 décembre 2008
Rasters Leçon 2 : RCR et BYR
La PC Engine posséde un registre RCR (Raster Count Register [$6]) qui doit être informé par le numéro de ligne que l'on veut interrompre et que l'on réinitialise à zero chaque Vsync.
Lorsque l'affichage balaye cette ligne, lors du Hsync le RCR provoque une IRQ (Interuption ReQuest) qui va, par exemple, déplacer la ligne courante grâce au registre BYR (Background Y scroll Register [$8]), en incrémentant le RCR, le scénario se répète ainsi pour chaque ligne.
On peut ainsi facilement créer des effets de distorsions horizontal mais aussi bien vertical, le registre BXR (Background X scroll register [$7]) fonctionnant de la même façon.
Je mettrais prochainement un exemple pratique en téléchargement ;)
Lorsque l'affichage balaye cette ligne, lors du Hsync le RCR provoque une IRQ (Interuption ReQuest) qui va, par exemple, déplacer la ligne courante grâce au registre BYR (Background Y scroll Register [$8]), en incrémentant le RCR, le scénario se répète ainsi pour chaque ligne.
On peut ainsi facilement créer des effets de distorsions horizontal mais aussi bien vertical, le registre BXR (Background X scroll register [$7]) fonctionnant de la même façon.
Je mettrais prochainement un exemple pratique en téléchargement ;)
Inscription à :
Messages (Atom)