CODINGCHRONIQUE A100% DES LOGON SYSTEM ★ LA SCAROLE VERTE Y CALE... ★

Logon System ACPC n°48 - Les scroll hard verticalCoding Chronique A100% Des Logon System
C'est sous ce jeu de mots douteux que je vais vous parler des scrolls hards verticaux, encore appelés scrolling-Registre 5 en raison de l'aide précieuse que fournit ce registre du CRTC pour décaler vers le haut (ou vers le bas), et avec fluidité, tout un écran.

Cette technique que nous allons vous décrire est employée dans le jeu Mission Genocide (un budget de Firebird que je ne saurais trop vous conseiller) ou dans quelques démos (comme le menu et la Nega-part de The Demo ou la BSC Megademo par exemple).

La méthode est relativement simple (encore fallait-il la trouver), et je m'en va vous l'expliquer de ce pas. Il suffit en fait de séparer l'écran en deux parties au moins, comme pour une rupture toute simple, ainsi que papy Longshot vous l'a expliqué il ya quelque temps dans un précédent numéro. Ce n'est qu'ensuite que le registre 5 intervient: grâce à lui. on décale sans se fatiguer d'une ligne ou plus un des écrans de la rupture, vers le haut ou vers le bas. Comme le registre 5 ne peut varier qu'entre 0 et 31, on ne se sert, en réalité, que des valeurs 0 à 7, et on décale alors l'écran également à l'aide du pointeur Video, autrement dit, les registres 12 et 13 du CRTC. Il faut juste faire attention à une chose, ne pas oublier de changer également la valeur du registre 5 des autres écrans de la rupture. Celle-ci doit être égale au complément à 7 de la valeur du registre 5 de l'écran qui scrolle. Cela doit être fait pour stabiliser les écrans et éviter qu'ils ne sautillent.

Voilà pour la partie hard, mais il reste encore la partie soft, autrement dit l'affichage des motifs du scroll. Eh bien, il suffit de descendre, à chaque balayage d'une ligne sur l'écran, si le scrolling est ascendant et réciproquement, afin de compenser le décalage généré par le scrolling hard. Sous des aspects compliqués, ce système est en réalité très simple, et il est beaucoup plus rapide qu'un scrolling vertical réalisé en soft. Son seul inconvénient est la nécessité d'une rupture, mais ce problème disparaît avec un usage avisé des interruptions, ce qui est en quelque sorte réalisé dans le programme ci-contre puisqu'il se synchronise sur des HALTs.

Voilà justement une parfaite transition pour vous parler du programme de cette fois-ci, mais je trouve qu'il est suffisamment commenté pour ne pas avoir à l'expliquer; disons simplement qu'il fait défiler un message à caractères géants grâce à un scrolling hard vertical. Par contre, je vais vous parler de la façon dont est générée la fonte géante du scrolling.

Etant donné que chaque caractère ne prend que 64 octets en mémoire et fait 256 lignes de haut sur 64 octets (256 pixels en mode 1) sur j'écran, soit 16 Ko, je crois que le mot « géant» n'est pas de trop. Nous avons déjà vaguement parlé de cette technique de compression lors du listing d'une démo. Chaque octet des caractères en mémoire correspond, en fait, à un morceau du caractère géant, un « bloc»utilisé par plusieurs caractères. Dans le programme, ces blocs sont définis grâce à des caractères Ascii assemblés pour ne pas prendre trop de place. Pour la même raison, il n'y a dans le programme que les matrices des caractères qui composent le mot « 100% ». Toutefois, il y a bien une gestion de texte, c'est-à-dire que vous pouvez très bien vous amuser à définir les matrices des autres caractères, avec une restriction cependant: ces caractères doivent être dans l'ordre Ascii. Voilà pourquoi, dans le programme, le « % » de « 1 00% » est remplacé par un « / » (slash), code qui est juste avant le « 0 » et le « 1 » dans l'ordre Ascii. Je rajouterai enfin que ce type de compression par bloc est utilisé, non seulement, dans les démos pour faire défiler des caractères, mais également dans les jeux pour les scrollings de décor.

Donc, le programme fait défiler l'écran du haut vers le bas à raison d'une ligne par balayage. Je vous laisse le soin de voir comment changer le sens ou la vitesse, ce n'est pas compliqué, mais cela demande rigueur et attention. De toute façon, on ne possède que ce dont on a l'expérience...

Sur ces paroles hautement philosophiques (si! si !) je vous laisse méditer. A bientôt!

;
; SCROLLING HARD VERTICAL
;
; (c)Pict / Logon system Mai 1993
;
; Assemble avec DAMS
;
; charge en banque #c4 (#4000)
;
ORG #3000
; ENT $
;
; largeur en mots de l'ecran:
;
r1 EQU 32
;
; Initialisation mode et texte
;
LD a,1
CALL #bc0e
CALL #bb4e
;
; Dessin de la matrice
; des blocs
; (6 blocs de 4 caracteres
; de hauteur)
;
LD b,6*4
LD hl,tabchr
lpaff1 PUSH bc
LD b,4

lpaff2
;
; on affiche une ligne
; de chaque bloc
;
LD a, (hl)
INC hl
CALL #bb5a
DJNZ lpaff2
POP bc
;
; on passe au debut de
; la ligne suivante grace
; aux codes de controle
;
LD a,10
CALL #bb5a
LD a,13
CALL #bb5a
DJNZ lpaffl
;
; On sauve les blocs
;
LD b,24*8
LD hl,#c000
LD de , matrix
lcopy PUSH bc
LD bC,8
LDIR
LD bc,#800-8
ADD hl,bc
JP nC,nocarry
LD bC,#c050
ADD hl,bc
nocarry POP bc
DJNZ lcopy
;
; Affiche le message
; en bas de l'ecran
;
XOR a
CALL #bc0e
LD h,15
LD 1,2
CALL #bb75
LD hl,mess
LD e,2
affmess
LD a,e
PUSH hl
CALL #bb90
POP hl
INC e
LD a, (hl)
OR a
JP z,messaff
INC hl
CALL #bb5a
JP affmess
messaff
; configure le format
; de l'ecran
;
LD bc,#bc01
OUT (C),C
LD BC,#BD00+r1
OUT (C),C
LD bc,#bc02
OUT (c),c
LD bC,#bd00+43
OUT (c) ,c
;
; On interrompt le
; firmware
;
DI
LD hl, (#38)
LD (syst+1),hl
LD hl,#c9fb
LD (#38) ,hl
;
; Passe en Banque #cO
; qui est en fait une
; partie de l'ecran.
;
LD bc,#7fc0
OUT (c) ,c
; Efface l'ecran en #4000
LD hl,#4000
LD (hl),0
PUSH hl
POP de
PUSH de
POP bc
INC de
DEC bc
LDIR
;
; Change les couleurs
; des encres
;
LD hl ,mess
LD bC,#7f00+13
colorip OUT (c),c
DEC hl
LD a, (hl)
OUT (c),a
DEC c
JP nz,colorlp
;
; Boucle principale
;
BCLP DI
;
; on attend la synchro Verticale
LD B,#F5
vs IN A, (C)
RRA
JP NC,vs
;
; Aussitot apres,on configure
; les registres pour la rupture
;
; On affiche 256 lignes
LD BC,#BC06
OUT (C),C
LD BC,#BD20
OUT (C),C
LD BC,#BC07
OUT (C),C
LD BC,#BD7F
OUT (C),C
;
; On passe en mode 1
; et on initialise le
; diviseur d'interruption
;
LD BC,#7F9d
EI
;
; On met en noir l'encre 1
; afin de cacher l'effet de
; saccade creer par le decalage
; de l'ecran
LD de,#0154
OUT (c),c
OUT (c) ,d
OUT (c) ,e
;
; Gestion Scroll Vertical
;
; on envoie l'adresse Hard
; de l'ecran aux registres
; du CRTC
;
OFFSET LD HL,#1000
LD BC,#BC0C
OUT (C),C
INC B
OUT (C) ,H
DEC b
INC c
OUT (C),C
INC B
OUT (C),L
;
; On fait monter l'ecran
; d'une ligne grace au
; registre 5,et toutes
; les 8 lignes,on change
; l'adresse Hard de l'ecran
;
charup LD de,rl
VERTY LD A,8
speed SUB 1
AND 7
LD (VERTY+1) ,A
JP nZ,ver
ADD HL,de
ver
;
; On s'assure que l'adresse
; hard de l'ecran scrollant
; ne deborde pas
;
LD c,a
LD a,h
AND %11
OR #10
LD h,a
LD (OFFSET+1) ,HL
;
; On envoie la valeur de
; decalage au registre 5
; du crtc
;
LD a,c
xor1 XOR 0
LD BC,#BC05
OUT (C),C
INC B
OUT (C) ,A
;
; on attend quelques lignes
;
LD bC,260
tempo
DEC bc
LD a,b
OR c
JP nz,tempo
;
; puis on initialise
; le reg 4 du CRTC
LD BC,#BCP4
OUT (C),C
LD BC,#BD1B
OUT (C),C
;
; ainsi que l'adresse
; du second écran
;
OFFSET2 LD HL,#3000
LD BC,#BC0C
OUT (C),C
INC B
OUT (C),H
DEC b
INC c
OUT (C),C
INC B
OUT (C) ,L
;
; Il faut alors
; complementer le
; registre 5
;
VERTICAL LD A, (VERTY+l)
LD BC,#BC05
OUT (C),C
INC B
xor2 XOR 7
OUT (C) ,A
; puis on affiche
; le 1er raster
LD bC,3
temp1 DEC bc
LD a,b
OR c
JP nz,temp1
LD hl,raster1
LD a,10
LD bC,#7f01
OUT (c) ,c
rastlp1 LD c, (hl)
OUT (c),c
INC hl
LD e,12
tempr1
DEC e
JP nz,temprl
NOP
NOP
DEC a
JP nz,rastlpl
;
; On a plus qu'a attendre
;
Nl HALT
N2 HALT
N3 HALT
N4 HALT
;
; ...attendre encore...
;
LD bC,324
temp2 DEC bc
LD a,b
OR c
JP nz,temp2
;
; et afficher le 2nd raster
;
LD hl,raster2
LD a,10
LD bC,#7f01
OUT (c),c
rastlp2 LD c, (hl)
OUT (c) ,c
INC hl
LD e,12
tempr2
DEC e
JP nz,tempr2
NOP
NOP
DEC a
JP nz,rastlp2
N5 HALT
;
; Passe en mode 0
1
LD bc,#7f8c
OUT (c) ,c
;
; Reconfigure les
; registres du CRTC
; pour le 2eme écran
;
LD BC,#BC04
OUT (C),C
LD BC,#BD07
OUT (C) ,C
LD BC,#BC07
OUT (C) ,C
LD BC,#BD05
OUT (C),C
LD BC,#BC06
OUT (C),C
LD BC,#BD05
OUT (C),C
;
; Gestion de l'affichage
;
; les blocs font 32 lignes
; de hauteur
;
ctmat LD a,#lf
INC a
AND #H
LD (ctmat+l),a
JP nZ,cnty
;
; les caracteres font 8 blocs de hauteur
;
ctchr LD a,7
INC a
AND 7
LD (ctchr+l) ,a
JP nz,chline
;
; gestion du texte
;
ctxt LD hl,text
LD a, (hl)
INC hl
OR a
JP nZ,charok
LD hl,text
LD a, (hl)
INC hl
charok
LD (ctxt+l) ,hl
CP 32
JP nz,nospace
;
; si c'est un caractere
; d'espacement,on affiche
; des octets nuls (qui sont
; en fait dans le 1er bloc)
LD hl,matrix
LD (chline+l) ,hl
;
; et on s'arrange pour qu'il
; fasse 4 blocs de haut
;
LD a,4
LD (ctchr+l),a
JP chline
;
; sinon gn trouve quelle
; matrice lui correspond
; (on multiplie par 64,
; ce qui est la taille
; de la matrice d'un
; caractere)
;
nospace
SUB 47
LD h,0
LD l,a
ADD hl,hl
ADD hl,hl
ADD hl,hl
ADD hl,hl
ADD hl,hl
ADD hl,hl
LD de,tabchar
ADD hl,de
LD (chline+l) ,hl
;
; on copie l'adresse de la
; des blocs dans un buffer
;
chline LD hl,tabchar
LD bC,matrix
PUSH iy
LD iy,buffer
LD a,8
nline
LD d, (hl)
LD e,0
EX de,hl
ADD hl,bc
EX de,hl
INC hl
LD (iy+1) ,d
LD (iy+0) ,e
INC iy
INC iy
DEC a
JP nZ,nline
POP iy
LD (chline+l) ,hl
;
; On descend sur llecran .
; d'une ligne pour compenser
; l'effet de scrolling
;
cnty LD hl,#4000
LD a,h
ADD a,8
LD h,3
AND #38
JP nZ,noca
LD a,h
SUB #40
LD h,a
LD a,l
ADD a,rl*2
LD l,a
JP nC,noca
INC h
LD a,h
AND 7
JP nZ,noca
LD a,h
SUB 8
LD h,a
noca
LD (cnty+l) ,hl
;
; on affiche une ligne de
; chacun des blocs du
; caractere grace a la pile
; qui pointe sur le buffer
; decrit plus haut
;
EX de,hl
DI
LD (stack+l),sp
LD sp,buffer
LD a,8
mlp
POP hl
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
PUSH hl
POP hl
DEC a
JP nz,mlp
stack LD sp,0
;
; Test de la barre espace
;
scan
LD BC,#F40E
OUT (C),C
LD BC,#F6C0
OUT (C) ,C
XOR a
OUT (c) ,a
LD BC,#F792
OUT (C),C
DEC b
LD C,#45
OUT (C),C
LD B,#F4
IN A, (C)
LD BC,#F782
OUT (C),C
DEC b
LD C,#00
OUT (C),C
EI
AND #80
JP NZ,BCLP
;
; Fin du programme:
; on restaure les registres
; du CRTC,les banques de
; memoire et le systeme
;
sys
DI
LD bC,#7fc4
LD de,#014b
OUT (c),c
OUT (c) ,d
OUT (c) ,e
LD BC,#BC04
OUT (C),C
INC B
LD C,38
OUT (C) ,C
LD BC,#BC02
OUT (C) ,C
INC B
LD C,46
OUT (C),C
LD BC,#BC01
OUT (C),C
INC B
LD C,40
OUT (C),C
LD BC,#BC07
OUT (C),C
INC B
LD C,30
OUT (C) ,C
LD bc,#bc06
OUT (c),c
INC b
LD c,25
OUT (c),c
syst LD HL,#0000
LD (#38) ,hl
EI
RET
;
; table des couleurs
; du raster du haut
;
raster1
DEFB #44,#44
DEFB #55
DEFB #57
DEFB #5f,#5f
DEFB #53,#4b,#5b
DEFB #4b
;
; table des couleurs
; du raster du bas
raster2
DEFB #43,#4b,#43
DEFB #4a,#4a
DEFB #4e
DEFB #4c
DEFB #5C,#5c
;
; Table des couleurs
; des encres
;
DEFB #54,#4b,#44,#55
DEFB #57,#5f,#53,#54
DEFB #4b,#43,#4a,#4e
DEFB #4c,#5c
;
; Message du bas de l'ecran
;
mess
DEFM Logon system
DEFB 0
;
; Message scrollant
;
text DEFM 100/
DEFB 0
; Matrices des blocs
;
tabchr
v EQU 128
DEFB v,v,v,v
DEFB v,v,v,v
DEFB v,v,v,v
DEFB v,v,v,v
p EQU 143
DEFB p,p,p,p
DEFB p,p,p,p
DEFB p,p,p,p
DEFB p,p,p,p
q EQU 212
DEFB p,p,p,q
DEFB p,p,q,v
DEFB p,q,v,v
DEFB q,v,v,v
s EQU 213
DEFB s,p,p,p
DEFB v,s,p,p
DEFB v,v,s,p
DEFB v,v,v,s
t EQU 214
DEFB V,V,v,t
DEFB V,v,t,p
DEFB v,t,p,p
DEFB t,p,p,p
u EQU 215
DEFB u,v,v,v
DEFB p,u,v,v
DEFB p,p,u,v
DEFB p,p,p,u
;
; Matrices des caracteres
;
tabchar
;% (Attention,on prend en
; fait le code ASCII du
; caractere "/"-slash")
;
DEFB 0,4,1,5,0,0,4,0
DEFB 0,1,0,1,0,4,2,0
DEFB 0,3,1,2,4,2,0,0
DEFB 0,0,0,4,2,0,rend en
; fait le code ASCII du
; caractere "/"-slash-)
;
DEFB 0,4,1,5,0,0,4,0
DEFB 0,1,0,1,0,4,2,0
DEFB 0,3,1,2,4,2,0,0
DEFB 0,0,0,4,2,0,0,0
DEFB 0,0,4,2,4,1,5,0
DEFB 0,4,2,0,1,0,1,0
DEFB 0,2,0,0,3,1,2,0
DEFB 0,0,0,0,0,0,0,0
;0
DEFB 0,4,1,1,1,1,5,0
DEFB 0,1,1,0,0,1,1,0
DEFB 0,1,1,0,4,1,1,0
DEFB 0,1,1,4,2,1,1,0
DEFB 0,1,1,2,0,1,1,0
DEFB 0,1,1,0,0,1,1,0
DEFB 0,3,1,1,1,1,2,0
DEFB 0,0,0,0,0,0,0,0
;1
DEFB 0,0,4,1,1,0,0,0
DEFB 0,0,1,1,1,0,0,0
DEFB 0,0,0,1,1,0,0,0
DEFB 0,0,0,1,1,0,0,0
DEFB 0,0,0,1,1,0,0,0
DEFB 0,0,0,1,1,0,0,0
DEFB 0,1,1,1,1,1,1,0
DEFB 0,0,0,0,0,0,0,0
;espace
;
; Buffer pour les blocs
matrix DEFS 64*24
;
; buffer pour l'affichage
; des lignes
buffer DEFS 2*8,0
end

Pict / Logon System, ACPC n°48 Juillet 93, p 20-21-22-23

★ ANNÉE: 1993
★ AUTEUR: PICT

Page précédente : Logon System ACPC n°47 - Sprites !!!!
★ AMSTRAD CPC ★ DOWNLOAD ★

Other platform tool:
» LOGON48  Scrollhard    LISTINGDATE: 2012-08-27
DL: 272
TYPE: text
SiZE: 12Ko
NOTE:

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Chronique A100% par les Logon System
» Coding » Logon System ACPC n°49 - Le soundtrack sur CPC
» Coding Src's » End Demo (Logon System)
» Coding » Logon System ACPC n°47 - Sprites !!!!
» Coding » Logon System ACPC n°36 - Rupture facile
» Coding » Logon System ACPC n°43 - Le PPI 8255A ( Programmable Peripheral Interface )
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 539 millisecondes et consultée 2800 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.