ORG &A000
; ****************************
; *** RSX - INITIALISATION ***
; ****************************
.RSX_Init :
LD HL,RSX_Init
LD (HL),&C9 ; Ecrire un RET pour empecher une nouvelle initialisation
LD BC,RSX_Commandes ; BC pointe sur la table des Commandes RSX
LD HL,RSX_Tampon ; HL pointe sur 4 octets libres.
JP &BCD1
.RSX_Tampon :
DEFS 4 ; Tampon de quatre octets.
.RSX_Commandes :
DEFW RSX_Mots_Clefs ; Adresse des mots clefs
JP APLIB_DECOMPILATION
JP UNLOCK_ASIC
JP REFRESH_OFF
JP ASIC_ON
JP ASIC_OFF
JP SPRITE_X
JP SPRITE_Y
JP SPRITE_XY
JP SPRITE_ZOOM
JP BORDER
JP COULEURS
JP SCROLLHAUT
.RSX_Mots_Clefs
DEFB "AF","F"+&80 ; Mot clef avec le bit 7 du dernier caractere a 1.
DEFB "UNLOC","K"+&80
DEFB "NOREFRES","H"+&80
DEFB "O","N"+&80
DEFB "OF","F"+&80
DEFB "SPR","X"+&80
DEFB "SPR","Y"+&80
DEFB "SPRX","Y"+&80
DEFB "SPR","Z"+&80
DEFB "BORDE","R"+&80
DEFB "COULEUR","S"+&80
DEFB "SCROLL","H"+&80
DEFB 0 ; Fin de la table.
; *********************
; *** LES FONCTIONS ***
; *********************
;Zone de stockage temporaire
.SPRITEADR : DEFS 2
.SPRITENUM : DEFS 1
.SPRITEX : DEFS 2
.SPRITEY : DEFS 2
.SPRITEZOOM : DEFS 1
;syntax |SPRX,num_sprite(0 a 15),position X (0 a 639) si 640 = cache
.SPRITE_X :
DI
;lecture valeur X et stockage
LD H,(IX+1)
LD L,(IX+0)
LD (SPRITEX),HL
;lecture valeur sprite numero
LD A,(IX+2)
LD (SPRITENUM),A
;adresse ecriture dans ASIC (&6000 + (sprite_num * 8))
LD HL,&6000
;num du sprite * 8
LD A,(SPRITENUM)
.sprite_X_boucle
CP 0
jp z, sprite_X_ecrire
CALL additionner_plus_huit
jp nz,sprite_X_boucle
.sprite_X_ecrire :
;ecrire les donnees pour X
LD A,(SPRITEX)
LD (HL),A
LD A,(SPRITEX+1)
INC HL
LD (HL),A
EI
RET
;syntax |SPRY,num_sprite(0 a 15),position Y (0 a 399)
.SPRITE_Y :
DI
;lecture valeur Y et stockage
LD H,(IX+1)
LD L,(IX+0)
LD (SPRITEY),HL
;lecture valeur sprite numero
LD A,(IX+2)
LD (SPRITENUM),A
;adresse ecriture dans ASIC (&6002 + (sprite_num * 8))
LD HL,&6002
;num du sprite * 8
LD A,(SPRITENUM)
.sprite_Y_boucle
CP 0
jp z, sprite_Y_ecrire
CALL additionner_plus_huit
jp nz,sprite_Y_boucle
.sprite_Y_ecrire :
;ecrire les donnees pour Y
LD A,(SPRITEY)
LD (HL),A
LD A,(SPRITEY+1)
INC HL
LD (HL),A
EI
RET
;syntax |SPRXY,num_sprite(0 a 15),position X (0 a 639), position Y (0 a 399)
.SPRITE_XY :
DI
;lecture valeur Y et stockage
LD H,(IX+1)
LD L,(IX+0)
LD (SPRITEY),HL
;lecture valeur X et stockage
LD H,(IX+3)
LD L,(IX+2)
LD (SPRITEX),HL
;lecture valeur sprite numero
LD A,(IX+4)
LD (SPRITENUM),A
;adresse ecriture dans ASIC X=(&6000 + (sprite_num * 8))
LD HL,&6000
;num du sprite * 8
LD A,(SPRITENUM)
.sprite_XY_boucle
CP 0
jp z, sprite_XY_ecrire
CALL additionner_plus_huit
jp nz,sprite_XY_boucle
.sprite_XY_ecrire :
;ecrire les donnees pour X
LD A,(SPRITEX)
LD (HL),A
LD A,(SPRITEX+1)
INC HL
LD (HL),A
;ecrire les donnees pour Y
INC HL
LD A,(SPRITEY)
LD (HL),A
LD A,(SPRITEY+1)
INC HL
LD (HL),A
EI
RET
;syntax |SPRZ,num_sprite(0 a 15),ZOOM = 0000XXYY en basic ex &X00001111
;00 = non visible
;01 = 1 pixel (equivalent MODE 2)
;10 = 2 pixels (equivalent MODE 1)
;11 = 4 pixels (equivalent MODE 0)
.SPRITE_ZOOM :
DI
;lecture valeur ZOOM
LD A,(IX+0)
LD (SPRITEZOOM),A
;lecture valeur sprite numero
LD A,(IX+2)
LD (SPRITENUM),A
;adresse ecriture dans ASIC (&6004 + (sprite_num * 8))
LD HL,&6004
;num du sprite * 8
LD A,(SPRITENUM)
.sprite_ZOOM_boucle
CP 0
jp z, sprite_ZOOM_ecrire
CALL additionner_plus_huit
jp nz,sprite_ZOOM_boucle
.sprite_ZOOM_ecrire :
;ecrire les donnees pour le ZOOM
LD A,(SPRITEZOOM)
LD (HL),A
EI
RET
;syntax |BORDER, R(0 a 15), V(0 a 15), B(0 a 15)
.BORDER
DI
;lecture valeur R, V, B
LD B,(IX+4) ;Bleu
LD C,(IX+2) ;Vert
LD D,(IX+0) ;Rouge
;ecriture Vert
LD A,C
LD (&6421),A
;ecriture Bleu/Rouge
;Bleu*16 (decalage de 4 bit a gauche)
LD A,B
SLA A
SLA A
SLA A
SLA A
;Bleu+Rouge
ADD A,D
LD (&6420),A
EI
RET
.additionner_plus_huit
LD BC,8
ADD HL,BC
DEC A
RET
.COULEURS
;Choix du mode sans CLS
LD A,(&FFDD)
CALL &BD1C
;Changer la couleur de la bordure
LD A,(&FFDE)
LD (&6420),A
LD A,(&FFDF)
LD (&6421),A
;Transfert des encres de l'image dans l'asic
LD HL,&FFE0 ;adresse de debut pour la source
LD DE,&6400 ;adresse de debut pour la destination
LD BC,&0020 ;nombre d'octets a transferer (32)
LDIR ;Transfert des donnees
EI
RET
;syntax |UNLOCK
;Debloquer l'acces a l'ASIC
.UNLOCK_ASIC :
DI
LD A,17
LD HL,Sequence_Asic_unlock
.asic_loop:
LD B,&BD
OUTI
DEC A
JR NZ,asic_loop
EI
CALL ASIC_ON
CALL REFRESH_OFF
RET
.Sequence_Asic_unlock:
DB 255, 0, 255, 119, 179, 81, 168, 212, 98, 57, 156, 70, 43, 21, 138, 205, 238
;syntax |ON
; Connexion page Asic (&4000-&7fff)
.ASIC_ON
LD BC,&7FB8
OUT (C),C
RET
;syntax |OFF
; Deconnexion page Asic (&4000-&7fff)
.ASIC_OFF
LD BC,&7FA0
OUT (C),C
RET
;syntax |NOREFRESH
;Desactiver le bloc evenement du REFRESH des couleurs (Reviendra avec un changement de MODE)
.REFRESH_OFF
LD HL,&B7F9 ; Bloc evenement
CALL &BCDD
RET
;syntax |SCROLLH
;Scrolling HAUT
.SCROLLHAUT
LD B,8;decalage vers le haut de combien de ligne graphique
.loopscrollC
PUSH BC
LD HL,&C1E0;adresse de debut (7eme ligne texte)
LD B,19;combien de ligne texte
.loopscrollB
PUSH BC
PUSH HL
LD B,7;hauteur d'une ligne texte (0 a 7)
.loopscrollA
PUSH BC
PUSH HL
POP DE
LD BC,&800;calcul ligne suivante
ADD HL,BC
PUSH HL
LD BC,&0050;largeur d'une ligne
LDIR
POP HL
POP BC
DJNZ loopscrollA
POP DE
EX DE,HL
LD BC,&0050
ADD HL,BC
PUSH HL
LDIR
POP HL
POP BC
DJNZ loopscrollB
;vider la derniere ligne
LD HL,&FF80
LD DE,&FF81
LD BC,&004F
LD (HL),0
LDIR
POP BC
DJNZ loopscrollC
RET
; Aplib decrunching routine
; (c) CNGSOFT
; Maxam source by T&J/GPA - 01/18/2008
; Nothing changed, except thy damned hidden opcodes
; and a new variable for Maxam ( 13+8*0 = 0 for Maxam )
aplib8flag equ &0 ; = DEC &00 pour INC
flagdecde equ aplib8flag*8 ; for Maxam compatibility
; En entree, on a :
; HL = implantation du code compacte
; DE = implantation du code decompacte
APLIB_DECOMPILATION
;syntax |AFF,adresse_memoire
;lecture valeur adresse_memoire
;LD L,(IX+00)
;LD H,(IX+01)
Start
DI
LD HL,&4000 ;adr en memoire
LD DE,&C000 ;adresse de decompression
CALL boot
EI
JP &000F
Boot
PUSH HL ; used for EX HL,(SP)
PUSH HL
POP IX
DB &FD,&26,&80 ; LD IYh,&80
aplib8literal
LD A,(IX+ &00)
DB &DD,&23 + flagdecde ; INC IX/DEC IX
LD (DE),A
DB &13 + flagdecde ; INC DE/DEC DE
DB &FD,&2E,&02 ; LD IYl,&2
aplib8nexttag
CALL aplib8getbit
JR NC, aplib8literal
LD BC,&0000
CALL aplib8getbit
JR NC, aplib8codepair
LD H,B
CALL aplib8getbit
JR NC, aplib8shortmatch
DB &FD,&2E,&02 ; LD IYl,2
INC C ; bc
LD L,&10
aplib8getmorebits
CALL aplib8getbit
RL L
JR NC, aplib8getmorebits
JR NZ, aplib8domatch
LD A,L
LD (DE),A
DB &13+ flagdecde ; INC DE/DEC DE
JR aplib8nexttag
aplib8codepair
CALL aplib8getgamma
DB &FD,&4D ; LD C,IYl
SBC HL,BC
JR NZ, aplib8normalcodepair
CALL aplib8getgamma
LD B,H
JR aplib8domatch_lastpos
aplib8normalcodepair
DEC L
LD H,L
LD L,(IX + &00)
DB &DD,&23+ flagdecde ; INC IX/DEC IX
PUSH HL
CALL aplib8getgamma
LD B,H
POP HL
LD A,H
CP 125 ; cmp eax,32000
JR NC, aplib8domatch_with_2inc
CP &05
JR NC, aplib8domatch_with_inc
AND A
JR NZ, aplib8domatch_new_lastpos
LD A,L
ADD A
JR C, aplib8domatch_new_lastpos
aplib8domatch_with_2inc
INC BC
aplib8domatch_with_inc
INC BC
aplib8domatch_new_lastpos
EX (SP),HL
aplib8domatch_lastpos
POP HL
PUSH HL
DB &FD,&2E,&01 ; LD IYl,1
aplib8domatch
if aplib8flag ; LDIR/LDDR
ADD HL,DE
LDDR
else
AND A
EX DE,HL
SBC HL,DE
EX DE,HL
ADD HL,DE
EX DE,HL
LDIR
endif
JR aplib8nexttag
aplib8shortmatch
LD L,(IX+&00)
DB &DD,&23+ flagdecde ; INC IX/DEC IX
SRL L
JR Z, aplib8donedepacking
RL C
JR aplib8domatch_with_2inc
aplib8getbit
DB &FD,&7C ; LD A,IYh
ADD A
JR NZ,aplib8getbit_
LD A,(IX + &00)
DB &DD,&23+ flagdecde ; INC IX/DEC IX
ADC A
aplib8getbit_
DB &FD,&67 ; LD IYh,A
RET
aplib8getgamma
LD HL,&0001
aplib8getgamma_
CALL aplib8getbit
ADC HL,HL
CALL aplib8getbit
JR C, aplib8getgamma_
LD C,L
RET
aplib8donedepacking
POP HL ; used for EX HL,(SP)
PUSH IX
POP HL
RET ; Warning, A might not be 0!