                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              
