| ; http://www.cpcrulez.2ya.com
; ; ; 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 ecran ; 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 ecran ; 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 |