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