BUILDSNA : BANKSET 0
SNASET CPC_TYPE,4 ; modèle 6128+ conseillé
ORG #100 : RUN #100
;*** RMR2 tags ***
ASICOFF equ 0
ROM0000 equ 0
ROM4000 equ %01000
ROM8000 equ %10000
ASICON equ %11000
ROM0 equ 0 : ROM1 equ 1 : ROM2 equ 2 : ROM3 equ 3 : ROM4 equ 4 : ROM5 equ 5 : ROM6 equ 6 : ROM7 equ 7
macro RMR2 tags
ld a,{tags}+%10100000
ld b,#7F
out (c),a
mend
ld bc,#7F00+%10001100+%01 : out (c),c ; MODE 1
ld bc,#7F10 : out (c),c : ld a,#58 : out (c),a
ld bc,#7F00 : out (c),c : ld a,#58 : out (c),a
ld bc,#7F01 : out (c),c : ld a,#47 : 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 UnlockAsic
LaBoucle
call DoScroll
ld yl,12
.softScroll
call WaitVBL : RMR2 ASICON : ld a,yl : or #80 : ld (#6804),a : RMR2 ASICOFF
ld a,yl : or a : jr z,LaBoucle : sub 2 : ld yl,a
jr .softScroll
DoScroll
call WaitVBL
RMR2 ASICON : ld a,#80+14 : ld (#6804),a : RMR2 ASICOFF
; incrémenter l'adresse dans la ligne de bloc avec gestion de débordement
ld hl,(adresseBloc) : inc hl : res 2,h : ld (adresseBloc),hl
; envoyer au CRTC
ld bc,#BC00+12 : out (c),c : ld a,h : or #30 : inc b : out (c),a
dec b : inc c : out (c),c : inc b : out (c),l
; tracer le sprite avant que le balayage arrive :)
ld xl,100
ld hl,(spriteCourant)
ld de,(adresseSpriteEcran)
.envoie100lignes
ldi : ld a,(hl) : ld (de),a : inc hl : dec e ; incrémenter les données mais revenir à l'adresse initiale écran
ld a,d : add 8 : ld d,a ; ajouter #800 à DE
jr nc,.okLigne ; pas de retenue, on est toujours dans le même bloc de lignes
ld a,80 : add e : ld e,a ; on ajoute 80 (largeur d'une ligne en octets) pour passer au bloc suivant
ld a,#C0 : adc d : ld d,a ; et on enlève #4000 (additionner #C000 c'est comme enlever #4000)
res 3,d ; au cas où on reboucle dans la ligne de bloc (trait bleu), on ajuste dans tous les cas
.okLigne
dec xl : jr nz,.envoie100lignes
; gérer le déroulé des sprites
ld a,(spriteNumero) : inc a : cp 120 : jr nz,.enregistreAdresseSprite
xor a : ld hl,bandesSprites ; réarmer les compteurs
.enregistreAdresseSprite ld (spriteCourant),hl : ld (spriteNumero),a
ex hl,de ; on va utiliser HL plutôt que DE pour effacer, les adressages sont plus nombreux
ld xl,50 ; compteur à 50, on va effacer en zig-zag :)
ld bc,%1010111101011111 ; on précharge une trame sur les encres 2 et 3
Raz100
ld (hl),b : inc l : ld (hl),b : ld a,h : add 8 : ld h,a ; ligne paire, on sait que la ligne suivante est dans le bloc
ld (hl),c : dec l : ld (hl),c : ld a,h : add 8 : ld h,a : jr nc,.okRaz
ld a,80 : add l : ld l,a
ld a,#C0 : adc h : ld h,a
res 3,h
.okRaz
dec xl : jr nz,Raz100
ld hl,(adresseSpriteEcran) : inc hl : inc hl : res 3,h ; gérer le débordement à #C800
ld (adresseSpriteEcran),hl
ret
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
WaitVBL
ld b,#F5 : noVBL in a,(c) : rra : jr c,noVBL
VBL in a,(c) : rra : jr nc,VBL : ret
adresseBloc defw #0000 ; notre écran démarre sur le premier octet de la ligne de bloc
adresseSpriteEcran defw #C000+80 ; avant le premier scroll, cette adresse correspond à la ligne suivante
spriteNumero defb 0
spriteCourant defw bandesSprites
bandesSprites incbin 'BobWinnerFrance.bin'
|