C'est du rapide
merci bcp.
Effectivement c'est bien stable maintenant !
J'ai fait un programme de test un peu plus léger qui affiche une ligne blanche sur la ligne n°100 au moment du boot.
Fichier(s) joint(s):
debug-timer.zip [1.25 Kio]
Téléchargé 125 fois
Ci dessous le code de test.
Il y a peut être mieux pour se caler en bordure d'écran, on peut en discuter dans un autre fil de la rubrique programmation si vous avez trouvé d'autres techniques.
Pour le test ça suffit amplement pour vérifier qu'il n'y a pas de dérive du timer.
Code:
org $6200
irq_routine equ $6027
irq_timer_ctrl equ $E7C5
irq_timer equ $E7C6
irq_one_frame equ 312*64-1 ; one frame timer (lines*cycles_per_lines-1), timer launch at -1
Boot
lda #$E7 ; at boot time, DP is $60, change to $E7
tfr a,dp
ldd #PaletteEffect
std irq_routine
lda #100 ; screen line to sync
ldx #irq_one_frame ; on every frame
IrqSync
ldb #$42
stb irq_timer_ctrl
ldb #64/8 ; 64 (cycles per line) / 8 (cycles of the wait loop)
mul
tfr d,y
leay -21,y ; manual adjustment
lda #32
! tst <$E7
bmi < ; while spot is in a visible screen line
! tst <$E7
bpl < ; while spot is not in a visible screen line
! bita <$E7
beq < ; while spot is not in a visible screen col
! bita <$E7
bne < ; while spot is in a visible screen col
! leay -1,y ; loop that wait until spot is at the desired place in steps of 8 cycles
bne <
stx irq_timer ; spot is at the end of desired line, set the timer to one frame
IrqOn
lda $6019
ora #$20
sta $6019 ; STATUS register
andcc #$EF ; tell 6809 to activate irq
bra * ; infinite loop
PaletteEffect
; from here --->
lda #8*2 ; set color index
sta <$DB
ldd #$0FFF ; set color value
stb <$DA
sta <$DA
mul ; tempo
mul ; tempo
mul ; tempo
mul ; tempo
brn * ; tempo
; ---> to here : 64 cycles = one line on screen
lda #8*2 ; set color index
sta <$DB
ldd #$0777 ; set color value
stb <$DA
sta <$DA
jmp $E830 ; return to caller
align $6278 ; boot tag
fcb $42 ; B
fcb $41 ; A
fcb $53 ; S
fcb $49 ; I
fcb $43 ; C
fcb $32 ; 2
fcb $00 ;
fcb $00 ;