16201
EDUCATIONAL -> Course, TutorialUTILITY -> GraphicsDEMO -> Graphics
© _Public_Domain_ (2013)
 
 
 
Double Buffer RSX
cpc
 
 

Last Update : Tuesday 28 May 2019 at 11 h 30

Manual n° 1

ORG #9C00 ; a revoir en fonction... .KL_LOG_EXT equ #bcd1 .SCR_GET_MODE equ #bc11 .MC_WAIT_FLYBACK equ #bd19 ;------------------------------------------------------------------------------------------------- ; Necessaire pour les RSX ;------------------------------------------------------------------------------------------------- LD BC,RSX01 LD HL,VIDE01 CALL KL_LOG_EXT LD BC,RSX02 LD HL,VIDE02 CALL KL_LOG_EXT LD BC,RSX03 LD HL,VIDE03 CALL KL_LOG_EXT LD BC,RSX04 LD HL,VIDE04 CALL KL_LOG_EXT LD BC,RSX05 LD HL,VIDE05 CALL KL_LOG_EXT LD BC,RSX06 LD HL,VIDE06 CALL KL_LOG_EXT LD BC,RSX07 LD HL,VIDE07 CALL KL_LOG_EXT LD BC,RSX08 LD HL,VIDE08 CALL KL_LOG_EXT LD BC,RSX09 LD HL,VIDE09 CALL KL_LOG_EXT LD BC,RSX10 LD HL,VIDE10 CALL KL_LOG_EXT RET ;------------------------------------------------------------------------------------------------- .VIDE01 DB 0,0,0,0 .VIDE02 DB 0,0,0,0 .VIDE03 DB 0,0,0,0 .VIDE04 DB 0,0,0,0 .VIDE05 DB 0,0,0,0 .VIDE06 DB 0,0,0,0 .VIDE07 DB 0,0,0,0 .VIDE08 DB 0,0,0,0 .VIDE09 DB 0,0,0,0 .VIDE10 DB 0,0,0,0 .RSX01 DW SCRLOW JP SWAPC000 .RSX02 DW SCRHIGH JP SWAP4000 .RSX03 DW PUTBLOCK JP PUTSPR0 .RSX04 DW PUTBLXOR JP PUTSPR1 .RSX05 DW GETBLOCK JP GETSPR .RSX06 DW CLSZONE JP CLSCOLOR .RSX07 DW SAVESCR JP COPY4000 .RSX08 DW FLIP JP FLIPSCRN .RSX09 DW PUTSPR JP PUTSPR2 .RSX10 DW GETSPRBG JP GETBG ;------------------------------------------------------------------------------------------------- .SCRLOW DB 'SCRLO','W'+#80,0 .SCRHIGH DB 'SCRHIG','H'+#80,0 .PUTBLOCK DB 'PUTBLOC','K'+#80,0 .PUTBLXOR DB 'PUTBLXO','R'+#80,0 .GETBLOCK DB 'GETBLOC','K'+#80,0 .CLSZONE DB 'CLSZON','E'+#80,0 .SAVESCR DB 'SAVESC','R'+#80,0 .FLIP DB 'FLI','P'+#80,0 .PUTSPR DB 'PUTSP','R'+#80,0 .GETSPRBG DB 'GETSPRB','G'+#80,0 ;------------------------------------------------------------------------------------------------- ; SCRLOW ... Swapping de l'ecran pour Dual-Buffer. Affiche #C000 et travaille sur #4000 ;------------------------------------------------------------------------------------------------- SWAPC000 CALL MC_WAIT_FLYBACK ; Place memoire video en #C000 LD BC,#BC00+12 OUT (C),C LD BC,#BD00+%00110000 ; #C000 OUT (C),C LD BC,#BC00+13 OUT (C),C LD BC,#BD00+0 OUT (C),C LD A,#80 ; Additionnera '#80' au HighByte #40 de l'adresse ecran de travail LD (HSCNMEM),A RET ;------------------------------------------------------------------------------------------------- ; SCRHIGH ... Swapping de l'ecran pour Dual-Buffer. Affiche #4000 et travaille sur #C000 ;------------------------------------------------------------------------------------------------- SWAP4000 CALL MC_WAIT_FLYBACK ; Place memoire video en #4000 LD BC,#BC00+12 OUT (C),C LD BC,#BD00+%00010000 ; #4000 OUT (C),C LD BC,#BC00+13 OUT (C),C LD BC,#BD00+0 OUT (C),C LD A,#00 ; Additionnera '#00' au HighByte #C0 de l'adresse ecran de travail LD (HSCNMEM),A RET HSCNMEM DB 0 ;------------------------------------------------------------------------------------------------- ; FLIP ... Declancher un echange d'ecran automatiquement ;------------------------------------------------------------------------------------------------- FLIPSCRN LD A,(HSCNMEM) CP #80 JR Z,SWAP4000 JR SWAPC000 ;------------------------------------------------------------------------------------------------- ; PUTBLOCK ... Tracer un sprite sans masque de fusion sur l'ecran en cours (visible apres swapping) ;------------------------------------------------------------------------------------------------- PUTSPR0 CALL GETBOX DI LD A,(HSCNMEM) LD (SCNOFF),A LD HL,(SCNADR) ; HL contient l'adresse ecran basee sur #C000. LD DE,(SPRADR) ; DE contient l'adresse du sprite. LD BC,(SPRH) ; Longueur du sprite (2 pixels par octet), et hauteur charges en B et C PUSH HL ; Memorise l'adresse ecran ... LD A,(SCNOFF) ADD H LD H,A ; Et la transpose si elle est dans la zone #4000-#4FFF PUTLINE0 LD A,(DE) LD (HL),A INC DE INC HL DJNZ PUTLINE0 POP HL DEC C JR Z,SPREND0 LD A,H ADD #08 LD H,A ; Calcul de la prochaine ligne ecran. JR C,SPRERR0 ; Rectifier en cas de depassement. SPRNEXT0 PUSH HL LD A,(SCNOFF) ADD H LD H,A LD A,(SPRW) LD B,A JR PUTLINE0 SPRERR0 PUSH DE LD DE,#C050 ADD HL,DE POP DE JR SPRNEXT0 SPREND0 EI RET SCNOFF DB #00 SCNADR DW #C000 SPRADR DW #A000 SPRH DB #04 SPRW DB #08 ;------------------------------------------------------------------------------------------------- ; PUTBLXOR ... Tracer un sprite en mode XOR sur l'ecran en cours (visible apres swapping) ;------------------------------------------------------------------------------------------------- PUTSPR1 CALL GETBOX DI LD A,(HSCNMEM) LD (SCNOFF),A LD DE,(SPRADR) ; DE contient l'adresse du sprite. LD HL,(SCNADR) ; HL contient l'adresse ecran basee sur #C000. LD BC,(SPRH) ; Longueur du sprite (2 pixels par octet), et hauteur charges en B et C PUSH HL ; Memorise l'adresse ecran ... LD A,(SCNOFF) ADD H LD H,A ; Et la transpose si elle est dans la zone #4000-#4FFF PUTLINE1 LD A,(DE) XOR (HL) LD (HL),A INC DE INC HL DJNZ PUTLINE1 POP HL DEC C JR Z,SPREND1 LD A,H ADD #08 LD H,A ; Calcul de la prochaine ligne ecran. JR C,SPRERR1 ; Rectifier en cas de depassement. SPRNEXT1 PUSH HL LD A,(SCNOFF) ADD H LD H,A LD A,(SPRW) LD B,A JR PUTLINE1 SPRERR1 PUSH DE LD DE,#C050 ADD HL,DE POP DE JR SPRNEXT1 SPREND1 EI RET ;------------------------------------------------------------------------------------------------- ; GETBLOCK ... Memoriser un sprite provenant de l'ecran de base #C000-#FFFF ;------------------------------------------------------------------------------------------------- GETSPR CALL GETBOX DI LD DE,(SPRADR) ; DE contient l'adresse du sprite. LD HL,(SCNADR) ; HL contient l'adresse ecran basee sur #C000. LD BC,(SPRH) ; Longueur du sprite (2 pixels par octet), et hauteur charges en B et C PUSH HL GETSPLINE LD A,(HL) LD (DE),A INC DE INC HL DJNZ GETSPLINE POP HL DEC C JR Z,GETSPEND LD A,H ADD #08 LD H,A ; Calcul de la prochaine ligne ecran. JR C,GETSPERR ; Rectifier en cas de depassement. GETSPNEXT PUSH HL LD A,(SPRW) LD B,A JR GETSPLINE GETSPERR PUSH DE LD DE,#C050 ADD HL,DE POP DE JR GETSPNEXT GETSPEND EI RET ;------------------------------------------------------------------------------------------------- ; GETBG ... Memorise le Background d'un sprite de l'ecran actif pour ;------------------------------------------------------------------------------------------------- GETBG CALL GETBOX DI LD A,(HSCNMEM) LD (SCNOFF),A LD DE,(SPRADR) ; DE contient l'adresse du sprite. LD HL,(SCNADR) ; HL contient l'adresse ecran basee sur le buffer LD BC,(SPRH) ; Longueur du sprite (2 pixels par octet), et hauteur charges en B et C PUSH HL ; Memorise l'adresse ecran ... LD A,(SCNOFF) ADD H LD H,A ; Et la transpose si elle est dans la zone #4000-#4FFF GETBGLINE LD A,(HL) LD (DE),A INC DE INC HL DJNZ GETBGLINE POP HL DEC C JR Z,GETBGEND LD A,H ADD #08 LD H,A ; Calcul de la prochaine ligne ecran. JR C,GETBGERR ; Rectifier en cas de depassement. GETBGNEXT PUSH HL LD A,(SCNOFF) ADD H LD H,A LD A,(SPRW) LD B,A JR GETBGLINE GETBGERR PUSH DE LD DE,#C050 ADD HL,DE POP DE JR GETBGNEXT GETBGEND EI RET ;------------------------------------------------------------------------------------------------- ; CLSZONE ... Remplir une zone de l'ecran actuel avec le meme octet ;------------------------------------------------------------------------------------------------- CLSCOLOR CALL GETBOX2 DI LD A,(HSCNMEM) LD (SCNOFF),A LD HL,(SCNADR) ; HL contient l'adresse ecran basee sur #C000. LD BC,(SPRH) ; Longueur du sprite (2 pixels par octet), et hauteur charges en B et C PUSH HL LD A,(SCNOFF) ADD H LD H,A LD A,(CLSBYTE) CLSLINE LD (HL),A INC HL DJNZ CLSLINE POP HL DEC C JR Z,CLSEND LD A,H ADD #08 LD H,A ; Calcul de la prochaine ligne ecran. JR C,CLSERR ; Rectifier en cas de depassement. CLSNEXT PUSH HL LD A,(SCNOFF) ADD H LD H,A LD A,(SPRW) LD B,A LD A,(CLSBYTE) JR CLSLINE CLSERR PUSH DE LD DE,#C050 ADD HL,DE POP DE JR CLSNEXT CLSEND EI RET CLSBYTE DB 0 ;------------------------------------------------------------------------------------------------- ; SAVESCR... Copie l'ecran entier de #C000 vers #4000 ;------------------------------------------------------------------------------------------------- COPY4000 LD DE,#4000 LD HL,#C000 LD BC,#4000 LDIR RET ;------------------------------------------------------------------------------------------------- ; Fonctions interne aux routines ;------------------------------------------------------------------------------------------------- GETBOX LD H,(IX+7) LD L,(IX+6) LD (SCNADR),HL LD H,(IX+5) LD L,(IX+4) LD (SPRADR),HL LD A,(IX+2) LD (SPRW),A LD A,(IX+0) LD (SPRH),A RET GETBOX2 LD H,(IX+7) LD L,(IX+6) LD (SCNADR),HL LD A,(IX+4) LD (CLSBYTE),A LD A,(IX+2) LD (SPRW),A LD A,(IX+0) LD (SPRH),A RET POKEUR LD A,(GRAFMODE) AND #03 CP 0 JP Z,POKEUR0 CP 1 JP Z,POKEUR1 CP 2 JP Z,POKEUR2 POKEUR0 LD A,(DE) AND #AA CP 0 JR Z,POKEUR02 PUSH DE LD E,A LD A,(HL) AND #55 OR E POP DE LD (HL),A POKEUR02 LD A,(DE) AND #55 CP 0 RET Z PUSH DE LD E,A LD A,(HL) AND #AA OR E POP DE LD (HL),A RET POKEUR1 LD A,(DE) AND #88 CP 0 JR Z,POKEUR12 PUSH DE LD E,A LD A,(HL) AND #77 OR E POP DE LD (HL),A POKEUR12 LD A,(DE) AND #44 CP 0 JR Z,POKEUR13 PUSH DE LD E,A LD A,(HL) AND #BB OR E POP DE LD (HL),A POKEUR13 LD A,(DE) AND #22 CP 0 JR Z,POKEUR14 PUSH DE LD E,A LD A,(HL) AND #DD OR E POP DE LD (HL),A POKEUR14 LD A,(DE) AND #11 CP 0 RET Z PUSH DE LD E,A LD A,(HL) AND #EE OR E POP DE LD (HL),A RET POKEUR2 LD A,(DE) OR (HL) LD (HL),A RET ;------------------------------------------------------------------------------------------------- ; PUTSPR ... Tracer un sprite en transparence (couleur 0 transparente) ;------------------------------------------------------------------------------------------------- PUTSPR2 CALL GETBOX CALL SCR_GET_MODE LD (GRAFMODE),A DI LD A,(HSCNMEM) LD (SCNOFF),A LD HL,(SCNADR) ; HL contient l'adresse ecran basee sur #C000. LD DE,(SPRADR) ; DE contient l'adresse du sprite. LD BC,(SPRH) ; Longueur du sprite (2 pixels par octet), et hauteur charges en B et C PUSH HL ; Memorise l'adresse ecran ... LD A,(SCNOFF) ADD H LD H,A ; Et la transpose si elle est dans la zone #4000-#4FFF PUTLINE2 CALL POKEUR INC DE INC HL DJNZ PUTLINE2 POP HL DEC C JR Z,SPREND2 LD A,H ADD #08 LD H,A ; Calcul de la prochaine ligne ecran. JR C,SPRERR2 ; Rectifier en cas de depassement. SPRNEXT2 PUSH HL LD A,(SCNOFF) ADD H LD H,A LD A,(SPRW) LD B,A JR PUTLINE2 SPRERR2 PUSH DE LD DE,#C050 ADD HL,DE POP DE JR SPRNEXT2 SPREND2 EI RET GRAFMODE: DB 0


Goto Top
CPC-POWER/CPCSOFTS, programming by Kukulcan © 2007-2021 all rights reserved.
Reproduction forbidden without any express authorization. All the game titles used belong to their respective owners.
Hébergement Web, Mail et serveurs de jeux haute performance