Revenir au plan du site


Programmation des interruptions pour rendre deux zones écran totalement indépendantes


Voici un petit programme de démonstration d'un split-screen stable malgré le SSR qui change pour faire scroller l'écran du haut.

Deux routines sont appelées. L'une au moment du split-screen pour mettre le SSR comme il faut. L'autre à la fin de l'écran visible pour préparer à l'avance les réglages de l'écran du haut. Dans notre programme, le SSR suit une courbe sinus/cosinus, dans les limites possibles par le SSR, le but n'était pas de faire un copié-collé inutile de l'article sur les scrollings multi-directionnels.

L'utilisation du PRI est classique, il faut que chaque interruption reprogramme le PRI à chaque fois pour indiquer à quelle ligne l'interruption suivante aura lieu, ainsi que l'adresse du saut pour exécuter la bonne routine. C'est la méthode naïve de programmation, nous verrons plus tard comment améliorer ça.


BUILDSNA
SNASET CPC_TYPE,4 ; 6128+
bankset 0
org #38
ei : ret
org #100
run #100
ld sp,#100
ld bc,#7F80+%1101 ; MODE 1
call UnlockAsic
ld bc,#7FB8 : out (c),c ; Activer le mapping de l'ASIC en #4000

ld hl,#0030 : ld (#6802),hl ; split en #C000
ld a,167 : ld (#6801),a ; split ligne 168

ld hl,#C000
junk ld a,r : ld (hl),a : inc l : jr nz,junk : inc h : jr nz,junk

; installer interruptions
ld hl,interrupt199 : ld (#39),hl
ld a,#C3 : ld (#38),a ; JP
ld a,199 : ld (#6800),a
ei

;**************************
splitScreen
;**************************
; mettre ici la logique du programme, blablabla
jr splitScreen




interrupt167 push af : xor a : ld (#6804),a : push hl ; reset du SSR pour avoir le HUD en bas stable
ld hl,interrupt199 : ld (#39),hl ; change interrupt vector
ld a,199 : ld (#6800),a
pop hl,af
ei : ret

interrupt199 push af,hl
.ssr ld hl,SSR_list : inc l : ld (.ssr+1),hl : ld a,(hl) : ld (#6804),a
ld hl,interrupt167 : ld (#39),hl ; change interrupt vector
ld a,167 : ld (#6800),a
pop hl,af
ei : ret


align 256
SSR_list
x=0
repeat 256
vx=cos(x*360/256)*2+2.5
vy=sin(x*360/256)*4+4.5
if vx<0 : vx=0 : endif
if vy<0 : vy=0 : endif
if vx>3 : vx=3 : endif
if vy>7 : vy=7 : endif
x=x+4
defb #80|(vy<<4)|(vx<<1) ; SSR en accord avec décalage vertical et horizontal
rend

UnlockAsic
ld bc,#BCFF
out (c),c
out (c),0
ld hl,%1001000011101010
.loop
out (c),c
ld a,h:rlca:ld h,l:ld l,a
srl c:res 3,c
and #88
or c
ld c,a
cp #4D
jr nz,.loop
ld a,#CD
out (c),a : out (c),a
ret




Les traits verts correspondent à l'exécution de nos deux routines d'interruption (activer le highlight interrupts)


La suite se passe dans l'article suivant.