buildsna : bankset 0
org #100 : run #100
ld sp,#100 : ld hl,#C9FB : ld (#38),hl : ei ; init pile+INT
ld bc,#BC06 : out (c),c : ld bc,#BD00+19 : out (c),c
ld bc,#7F00 : out (c),c : ld a,#54 : out (c),a
ld bc,#7F01 : out (c),c : ld a,#4E : out (c),a
ld bc,#7F02 : out (c),c : ld a,#43 : out (c),a
ld bc,#7F03 : out (c),c : ld a,#4B : out (c),a
call LaPause
novbl ld b,#F5
.vbl in a,(c) : rra : jr nc,.vbl
.novbl in a,(c) : rra : jr c,.novbl
ld b,0 : djnz $
; il nous reste presque 2000 nops avant l'interruption à venir
; largement le temps de préparer notre vecteur, mais attention!
; le point critique reste l'initialisation!
di ; facultatif ici car on SAIT
ld a,#C3 : ld hl,int01
ld (#38),a : ld (#39),hl
ei ; idem
;***********************************
programmeInterruptible
;***********************************
; copier la bank 3 en bank 1 puis effacer la bank 3
ld hl,#C000 : ld de,#4000 : ld bc,16384 : ldir
ld hl,#C000 : ld de,#C001 : ld bc,16383 : ld (hl),0 : ldir : call LaPause
; copier la bank 2 en bank 3 puis effacer la bank 2
ld hl,#8000 : ld de,#C000 : ld bc,16384 : ldir
ld hl,#8000 : ld de,#8001 : ld bc,16383 : ld (hl),0 : ldir : call LaPause
; copier la bank 1 en bank 2 puis effacer la bank 1
ld hl,#4000 : ld de,#8000 : ld bc,16384 : ldir
ld hl,#4000 : ld de,#4001 : ld bc,16383 : ld (hl),0 : ldir : call LaPause
jr programmeInterruptible
LaPause
ld bc,0 : ld a,5
.unepause djnz $ : dec c : jr nz,.unepause : dec a : jr nz,.unepause
ret
;***********************************
; pool d'interruptions
;***********************************
align 256
int01 push af : ld a,lo(int02) : ld (#39),a : pop af : ei : ret
int02 push af,bc
ld bc,#BC07 : out (c),c : ld bc,#BD00+255 : out (c),c ; desactiver la VBL
ld bc,#BC06 : out (c),c : ld bc,#BD00+19 : out (c),c ; notre écran visible fait 19 blocs
ld bc,#BC04 : out (c),c : ld bc,#BD00+18 : out (c),c ; notre écran "complet" fait 19 blocs (R4=19-1)
ld a,lo(int03) : ld (#39),a
pop bc,af : ei : ret
int03 push af : ld a,lo(int04) : ld (#39),a : pop af : ei : ret
int04 push af,bc
; changer l'adresse de l'écran suivant AVANT qu'il arrive!
ld bc,#BC00+12 : out (c),c : ld bc,#BD20 : out (c),c ; écran suivant en #8000
; attendre 16 lignes soit 16x64 nops ou 4x256 nops, le DJNZ qui saute prend 4 nops
ld b,0 : djnz $
ld bc,#7F02 : out (c),c : ld a,#47 : out (c),a ; petit changement de couleur
ld bc,#BC07 : out (c),c : ld bc,#BD00+11 : out (c),c
ld bc,#BC06 : out (c),c : ld bc,#BD00+8 : out (c),c ; on raccourci le deuxième écran visible
ld bc,#BC04 : out (c),c : ld bc,#BD00+19 : out (c),c ; le deuxième écran "complet" fait 20 blocs pour avoir 39 au total
ld a,lo(int05) : ld (#39),a
pop bc,af : ei : ret
int05 push af : ld a,lo(int06) : ld (#39),a : pop af : ei : ret
int06 push af,bc
ld bc,#7F02 : out (c),c : ld a,#43 : out (c),a ; petit changement de couleur pendant la VBL :)
ld bc,#BC00+12 : out (c),c : ld bc,#BD30 : out (c),c ; écran du haut en #C000
ld a,lo(int01) : ld (#39),a ; et on revient à la première INT
pop bc,af : ei : ret
teucha defb #54,#4E,#43,#4B
org #8000 : incbin 'iench.bin'
org #C000 : incbin 'teucha.bin' ; petite image
|