BUILDSNA : BANKSET 0
SNASET CPC_TYPE,4 ; modèle 6128+ conseillé
ORG #100 : RUN #100
;*** RMR2 tags + macro ***
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+%00 : out (c),c ; MODE 0
call UnlockAsic : RMR2 ASICON
ld hl,palettePlus : ld de,#6400 : ld bc,32 : ldir : ld hl,#000 : ld (#6420),hl ; +border noir
ld bc,#BC00+1 : out (c),c : ld bc,#BD00+28 : out (c),c ; Notre map fait 112 pixels de large, adaptez selon VOS besoins
ld bc,#BC00+2 : out (c),c : ld bc,#BD00+39 : out (c),c ; Centrer l'écran en X
ld bc,#BC00+6 : out (c),c : ld bc,#BD00+34 : out (c),c ; Hauteur de l'écran visible en lignes de caractères
ld bc,#BC00+7 : out (c),c : ld bc,#BD00+35 : out (c),c ; Centrer l'écran en Y
ld bc,#BC00+12 : out (c),c : ld bc,#BD30 : out (c),c ; adresse par défaut
ld bc,#BC00+13 : out (c),c : ld bc,#BD00 : out (c),c
LaBoucle
call WaitVBL
RMR2 ASICON : ld hl,#6804 ; activer la page ASIC, précharger l'adresse du SSR
ld a,0 : decalageCourant=$-1 : add #10 : and #70 : ld (decalageCourant),a : ld (hl),a ; on incrémente le décalage vertical
; si on a rebouclé de #70 à #00, alors le flag Z a été monté par le AND #70
jr nz,pasCRTC
ld hl,0 : adresseCRTCcourante=$-2 : ld bc,28 : add hl,bc : res 2,h : ld (adresseCRTCcourante),hl
ld bc,#BC00+12 : out (c),c : inc b : ld a,h : or #30 : out (c),a : dec b : inc c : out (c),c : inc b : out (c),l
pasCRTC
RMR2 ASICOFF ; on ferme la page puisqu'on ne la nécessite plus et que nos données sous dessous!
; nos tiles font 8x16, il faut gérer le 'curseur' à l'intérieur des tiles et on en a 14 en largeur...
ld hl,(adresseTuileEcran) : ld (adresseTuileCourante),hl
ld ix,tileMap : adresseTileMap=$-2
ld b,14 ; on a 14 tuiles à parcourir
AfficheLigneTuile
exx ; on met le compteur dans les registres secondaires
ld hl,(ix+0) : inc lx : inc ix ; index de la tuile 16 bits car +256 tuiles
; HL = index x 64 / au lieu de décaler 6 fois vers la gauche, je décale deux fois à droite et je permute les registres (équivalent à 8 décalages - 2)
xor a : srl hl : rra : srl hl : rra : ld h,l : ld l,a
ld de,tuiles : add hl,de ; HL=adresse de la tuile courante
ld a,(ligneTuileCourante) : add a : add a ; ligne x 4
add l : ld l,a : ld a,h : adc 0 : ld h,a ; c'est vraiment pas optimisé tout ce code :p
ld de,(adresseTuileCourante)
; afficher la ligne courante de la tuile courante
ldi 4 ; copie de la largeur de la tuile, à la bonne ligne
; besoin impératif d'ajuster DE au cas où on se retrouve sur le rebouclage de la ligne de bloc!
; si la partie de l'adresse correspondant à la position dans le bloc (0-#7FF) est nulle, alors on vient de reboucler
ld a,d : and 7 : or e : jr nz,.pasDeRebouclage : ld a,d : sub 8 : ld d,a : .pasDeRebouclage
ld (adresseTuileCourante),de ; on garde la position
exx
djnz AfficheLigneTuile
; ligne de tuiles terminée, on prépare la prochaine adresse, ligne en dessous!
ld hl,(adresseTuileEcran) : ld a,h : add 8 : ld h,a : jr nc,.novf
ld a,56 : add l : ld l,a
ld a,#C0 : adc h : ld h,a
res 3,h ; rebouclage de bloc en plein début de ligne, ça PEUT arriver
.novf ld (adresseTuileEcran),hl ; prêt pour la nouvelle ligne
ld a,(ligneTuileCourante) : inc a : and 15 : ld (ligneTuileCourante),a : jr nz,.memesTuiles
ld hl,(adresseTileMap) : ld de,14*2 : add hl,de : ld (adresseTileMap),hl ; changer de ligne sur la tileMap
ld a,(hl) : inc a : jr nz,.memesTuiles : inc l : ld a,(hl) : inc a : jr nz,.memesTuiles ; test du marqueur de fin
ld hl,tileMap : ld (adresseTileMap),hl ; Rebouclage de la tileMap !
.memesTuiles
jp LaBoucle
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
palettePlus defw #213,#231,#223,#333,#342,#443,#453,#554,#564,#664,#684,#777,#8A4,#AD6,#CD8,#FFE
adresseTuileEcran defw #C000+56*34 ; avant le premier scroll, cette adresse correspond à la 272 ligne (hors écran, 1 ligne dessous)
adresseTuileCourante defw 0
ligneTuileCourante defb 0
tuiles incbin 'Map16.bin'
align 2 : tileMap include 'Map16.tilemap' : defw #FFFF ; marqueur de fin
|