Vous ne le savez peut-être pas, mais il y a scrollings et scrollings. Non pas que je fasse la différence entre les scrollings horizontaux et verticaux, ceux en couleurs ou en noir et blanc, grands ou petits, CPC ou Amiga, mais entre les scrollings avec décalage en mémoire et scrollings HARD. C'est fou le temps que demande le décalage de 16 pour voir plus de lignes à l'écran. Imaginez un instant que Dieu nous donne le moyen de réduire ce temps à presque rien. Non, non, vous ne rêvez pas, nous sommes encore gâtés ce mois-ci. La solution passait bien par le CRTC et nous est donnée toute cuite par notre trop bon Rubi. Avant d'entrer dans les détails du source, laissez-moi vous parler du principe de ce scrolling. Nous allons faire scroller les 96 premières lignes de l'écran à raison d'un octet par affichage (deux pour le mois passé). On reformate donc l'écran, on sauve de manière particulière les 96*80 octets sous forme de sprites et on travaille sur deux écrans en plaçant une bascule pour afficher soit l'un, soit l'autre. Pour le source, on reformate l'écran et on stocke, dans KBASE1 et 2, les deux off sets correspondant aux écrans. Le sprite est formé de 80 colonnes de 12*8 octets, on efface l'écran pour arriver à la boucle. Le XOR FF sert de bascule pour choisir les deux offsets (celui pointé par IY sera affiché, alors que l'autre restera dans l'ombre du border). On calcule le prochain offset en se rappelant que le tout est modulo &400 (d'ou le AND 3 sur H). BASE0 calcule la colonne à afficher et BASE2 place la colonne dans les deux écrans. On effectue le scrolling proprement dit suivi d'un &BD19 pour attendre la synchro. Je ne vous parle pas du test clavier. Par contre, dans ENVOIE, le XOR &23 sert à placer une fois sur deux un INC HL pour avoir le décalage entre les deux écrans. Les deux SET pouvaient être remplacés par un OR &C0 et n'oubliez pas le RES 3,H qui nous manquait le mois passé et pouvait faire pétouiller légèrement le scrolling. BOU3 affiche la colonne. Vous verrez une multiplication et le &BC26 à la sauce Rubi. Amusez-vous bien, car vous avez sous la main un méga scrolling à la Logon que je salue au passage. Rien ne vous empêche d'afficher autre chose en fin des écrans, au lieu de boucler sur le même tout le temps. Cela reste une question de goût, n'est-ce pas? Le Hardas masqué ; ---------------- ; - RUBI_DOUILLE - ; ---------------- ; ; ---------------- ; - SCROLL HARD - ; ---------------- ; ORG #9800EBASE EQU #C000 BANK EQU %00110000 SPRI EQU #C000 SPRIH EQU 12*8 SPRIL EQU 30 TAMP EQU #5000 DI ; -------------------------------- ; - INITIALISATION DES VARIABLES - ; -------------------------------- LD BC, #BC06 OUT (C) ,C LD BC, &BD00+ 12 OUT (C) ,C ; LD HL,0 LD IY,KBASE1 LD (IY+0) ,L LD (IY+1) ,H ; LD HL,#01E0 LD IY, KBASE2 LD (IY+0) ,L LD (IY+1) ,H ; XOR A LD (ENC) ,A LD A, SPRIL-1 LD (BASE0+ 1) ,A ; ------------------------ ; - STOCKAGE D'UN SPRITE - ; ------------------------ LD HL,SPRI LD DE,TAMP LD B,SPRIL BOU1: LD C,SPRIH PUSH HL BOU2: LD A,(HL) LD (DE),A INC DE CALL RBC26 DEC C JR NZ,BOU2 POP HL INC HL DJNZ BOU1 ; LD HL,&C000 ;Efface écran LD DE,&C001 LD BC,#3FFF LD (HL),L LDIR ; BOUCLE: LD A,0 ;Systeme d'echange des écrans XOR &0FF LD IY, KBASE1 LD IX, KBASE2 LD (BOUCLE+1), A JR Z,BOUC1 LD IY, KBASE2 LD IX, KBASE2 BOUC1: LD L,(IY+0) ; Prochaine offset LD H,(IY+1) INC HL LD A,%11 AND H LD H,A LD (IY+1),H LD (IY+0),L ; ; BASE0: LD A,0 ; Prochaine colonne de sprite INC A LD (BASE0+1),A CP SPRIL JR NZ,BASE_2 XOR A LD (BASE0+1),A BASE_2: ; LD L,(IY+0) ; place colonne n LD H,(IY+1) CALL ENVOIE LD L,(IX+0) LD H,(IX+1) CALL ENVOIE ; -------------------- ; - DEPLACEMENT HARD - ; -------------------- LD L,(IY+0) LD A,(IY+1) OR BANK LD BC,&BC0C OUT (C),C INC B OUT (C),A DEC B INC C OUT (C),C INC B OUT (C),L ; ----------------- ; - ATTENDRE SYNC - ; ----------------- LD B,&F5 SYNC: IN A,(C) RRA JR NC,SYNC ; ---------------------- ; - TEST TOUCHE ESPACE - ; ---------------------- LD BC,&F40E OUT (C),C LD BC,&F6C0 OUT (C),C LD BC,&F792 OUT (C),C LD BC,&F645 OUT (C),C LD B,&F4 IN A ,(C) LD BC,&F782 OUT (C),C LD BC,&F609 OUT (C),C RLA JP C,BOUCLE LD BC,&FC06 OUT (C),C LD BC,&BD00+25 OUT (C),C RET ; ENVOIE: LD A, (BASE0+1) ; ACCA= Colonne n du sprite PUSH HL LD DE, SPRIH LD L,A LD H,0 CALL MULTI16 LD DE,TAMP ADD HL, DE ; HL = Adresse de la colone EX (SP), HL ADD HL,HL ENC: NOP LD A, (ENC) XOR &23 LD (ENC) ,A ; SET 6,H SET 7,H LD DE, SPRIL- 2 ADD HL,DE RES 3,H LD B, SPRIH POP DE BOU3: LD A, (DE) LD (HL) ,A INC DE CALL RBC26 DJNZ BOU3 RET MULTI16: ; DE*HL=IIL LD C,H LD A,L LD B,&10 LD HL,0 MULT16_1: SRL C RRA JR NC,MULT16_2 ADD HL,DE MULT16_2: EX DE,HL ADD HL,HL EX DE,HL DJNZ MULT16_1 RET ; ; RBC26: LD A,H ADD A,#08 LD H,A AND &38 RET NZ LD A,H SUB &40 LD H,A LD A,L ADD A,&50 LD L,A RET NC INC H LD A,H AND &07 RET NZ LD A,H SUB &08 LD H,A RET KBASE1 DW 0 KBASE2 DW 0 ; RUBI, ACPC n°26 Mai 1990, p68-69 | ★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
CPCrulez[Content Management System] v8.732-desktop Page créée en 439 millisecondes et consultée 2578 foisL'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. |
|
|