;*************************
;*** OVERSCAN DE DEBUT ***
;*************************
ORG #A300
DI
;MODE 1
LD A,1
CALL &BC0E
;largeur a zero (masque l'écran)
LD BC,&BC01
OUT (C),C
LD BC,&BD00
OUT (C),C
;BORDER 11 (Bleu)
LD BC,&0B0B
CALL &BC38
;INK 0,0 (Noir)
XOR A
LD BC,&0000
CALL &BC32
;INK 1,11 (Bleu)
LD A,1
LD BC,&0B0B
CALL &BC32
;INK 2,15 (Orange)
LD A,2
LD BC,&0F0F
CALL &BC32
;INK 3,26 (Blanc)
LD A,3
LD BC,&1A1A
CALL &BC32
;chargement du fichier
LD B,&0C
LD HL,fichier_overscan
LD DE,&C000
CALL &BC77
;LD HL,&01FE ;normal
LD HL,&01F0 ;version compressée
CALL &BC83
CALL &55C6 ;décompression
;correction du soucis de compression avec Zenith 2 (1er octet de mangé)
LD a,&F0
LD (&01FE),a
;correction du problème avec convimgcpc (overscan FIN)
LD A,&F1
LD (&07FE),a
LD (&07FF),a
LD A,&F4
LD (&0FFE),a
LD (&0FFF),a
LD A,&F1
LD (&17FE),a
LD (&17FF),a
LD A,&F4
LD (&1FFE),a
LD (&1FFF),a
LD A,&F1
LD (&27FE),a
LD (&27FF),a
LD A,&F4
LD (&2FFE),a
LD (&2FFF),a
LD A,&F1
LD (&37FE),a
LD (&37FF),a
LD A,&F4
LD (&3FFE),a
LD (&3FFF),a
;OUT overscan
;largeur
LD BC,&BC01
OUT (C),C
LD BC,&BD30
OUT (C),C
;hauteur
LD BC,&BC06
OUT (C),C
;LD BC,&BD22
LD BC,&BD00
OUT (C),C
;decalage horizontal
LD BC,&BC02
OUT (C),C
LD BC,&BD32
OUT (C),C
;decalage vertical
LD BC,&BC07
OUT (C),C
LD BC,&BD23
OUT (C),C
;ecran 32 ko (&000 a &7FFF)
LD BC,&BC0C
OUT (C),C
LD BC,&BD0C
OUT (C),C
;debut offset (en &01FE)
LD BC,&BC0D
OUT (C),C
LD BC,&BDFF
OUT (C),C
;animation sur la hauteur R6 = 0 a 34
LD BC,&BC06
OUT (C),C
LD B,&BD
LD A,34
LD C,0
OUT (C),C
.anim2
INC C
OUT (C),C
;ralentissement
CALL &BD19
CALL &BD19
CALL &BD19
CALL &BD19
CALL &BD19
CALL &BD19
CALL &BD19
CALL &BD19
DEC A
CP 0
JP NZ,anim2
;attente de l'appuie d'une touche
CALL &BB06
;animation sur la largeur R1 = 48 a 0
LD BC,&BC01
OUT (C),C
LD B,&BD
LD A,47
LD C,47
OUT (C),C
.anim1
DEC C
OUT (C),C
;ralentissement
CALL &BD19
CALL &BD19
CALL &BD19
CALL &BD19
DEC A
CP 0
JP NZ,anim1
;OUT normal
;largeur
LD BC,&BC01
OUT (C),C
LD BC,&BD28
OUT (C),C
;hauteur
LD BC,&BC06
OUT (C),C
LD BC,&BD19
OUT (C),C
;decalage horizontal
LD BC,&BC02
OUT (C),C
LD BC,&BD2E
OUT (C),C
;decalage vertical
LD BC,&BC07
OUT (C),C
LD BC,&BD1E
OUT (C),C
;ecran 17 ko (&C00 a &FFFF)
LD BC,&BC0C
OUT (C),C
LD BC,&BD3C
OUT (C),C
;debut offset (en &C000)
LD BC,&BC0D
OUT (C),C
LD BC,&BD00
OUT (C),C
;vider la mémoire
LD HL,&01FE
LD DE,&01FF
LD BC,&8000
LD (HL),0
LDIR
EI
RET
fichier_overscan :
;DEFM "OVER1 .SCR" ;normal 32 ko
DEFM "OVER1 .SCA" ;compressée 22 ko
;***********************
;*** OVERSCAN DE FIN ***
;***********************
ORG #A000
DI
;MODE 1
LD A,1
CALL &BC0E
;VERIFIER QU'ON A LE DROIT DE VOIR LA FIN
LD a,(&BE80)
CP &01
JP Z,VOIRFIN
;non autorisé
;remplir la mémoire de zéro de &01F0 a &9FFF
LD HL,&01F0
LD DE,&01F1
LD BC,&9E0F
LD (HL),0
LDIR
;deformation de l'écran pour voir uniquement 4 lignes sur toutes la largeur
;largeur
LD BC,&BC01
OUT (C),C
;LD BC,&BD30
LD BC,&BD32
OUT (C),C
;hauteur
LD BC,&BC06
OUT (C),C
LD BC,&BD04
OUT (C),C
;decalage horizontal
LD BC,&BC02
OUT (C),C
LD BC,&BD33
OUT (C),C
;decalage vertical
LD BC,&BC07
OUT (C),C
LD BC,&BD15
OUT (C),C
;affichage text
;BORDER 3 (Rouge foncé, Rouge vif)
LD BC,&0306
CALL &BC38
;INK 0,26 (Blanc)
XOR A
LD BC,&1A1A
CALL &BC32
;INK 1,0 (Noir)
LD A,1
LD BC,&0000
CALL &BC32
LD a,1
CALL &BB90 ; PEN 1
CALL routinetexte
.nepasredonnerlamain
JR nepasredonnerlamain
RET
.routinetexte
LD H,1
LD L,1
CALL &BB75 ;LOCATE H,L
LD HL,letexte
.boucletexte
LD A,(HL)
CP 0
RET Z
CALL &BB5A
INC HL
JR boucletexte
.letexte
DEFM " "
DEFM " WARNING "
DEFM " YOU NEED TO FINISH ALL LEVELS - DON'T CHEAT "
nop
.VOIRFIN
;BORDER 11 (Bleu)
LD BC,&0B0B
CALL &BC38
;INK 0,0 (Noir)
XOR A
LD BC,&0000
CALL &BC32
;INK 1,11 (Bleu)
LD A,1
LD BC,&0B0B
CALL &BC32
;INK 2,15 (Orange)
LD A,2
LD BC,&0F0F
CALL &BC32
;INK 3,26 (Blanc)
LD A,3
LD BC,&1A1A
CALL &BC32
;largeur a zero (masque l'écran)
LD BC,&BC01
OUT (C),C
LD BC,&BD00
OUT (C),C
;DEPLACER la musique en &C000
LD HL,&382F
LD DE,&C000
LD BC,&0E98
LDIR
;décompression overscan
CALL &37DD
;correction du soucis de compression avec Zenith 2 (1er octet de mangé)
LD a,&F0
LD (&01FE),a
;correction du problème avec convimgcpc (overscan FIN)
LD A,&F5
LD (&07FE),a
LD (&07FF),a
LD (&0FFE),a
LD (&0FFF),a
LD (&17FE),a
LD (&17FF),a
LD (&1FFE),a
LD (&1FFF),a
LD (&27FE),a
LD (&27FF),a
LD (&2FFE),a
LD (&2FFF),a
LD (&37FE),a
LD (&37FF),a
;OUT overscan
;largeur
LD BC,&BC01
OUT (C),C
;LD BC,&BD30
LD BC,&BD00
OUT (C),C
;hauteur
LD BC,&BC06
OUT (C),C
LD BC,&BD22
OUT (C),C
;decalage horizontal
LD BC,&BC02
OUT (C),C
LD BC,&BD32
OUT (C),C
;decalage vertical
LD BC,&BC07
OUT (C),C
LD BC,&BD23
OUT (C),C
;ecran 32 ko (&000 a &7FFF)
LD BC,&BC0C
OUT (C),C
LD BC,&BD0C
OUT (C),C
;debut offset (en &01FE)
LD BC,&BC0D
OUT (C),C
LD BC,&BDFF
OUT (C),C
;animation sur la largeur R1 = 0 a 48
LD BC,&BC01
OUT (C),C
LD B,&BD
LD A,47
LD C,1
OUT (C),C
.anim1
INC C
OUT (C),C
;ralentissement
CALL &BD19
CALL &BD19
CALL &BD19
CALL &BD19
DEC A
CP 0
JP NZ,anim1
;initialiser la musique
CALL &C000
.loopzic
CALL &BD19
CALL &C006
JP loopzic
RET
NOTICE TEXTE n° 2 (6.39 Ko)
;***************
;*** VUMETRE ***
;***************
ORG &5400
DI
;position courante x,y
CALL &BBC6
push de
push hl
CALL lirelescanaux
CALL afficheVUMETRE
;restaurer la position courante
;(évite le bug avec le rectangle qui entoure le slider)
pop hl
pop de
CALL &BBC0
EI
RET
.blockevenement
ds 10
;stocker les valeurs des 3 canaux (A, B, C)
.valuecanaux
ds 3
.lirelescanaux
LD B,&03
LD HL,valuecanaux
.LIRECANAUX
PUSH BC
LD A,B
ADD &07
LD C,A
LD B,&74
OUT (C),C
LD B,&76
IN A,(C)
OR &C0
OUT (C),A
AND &30
OUT (C),A
LD BC,&F792
OUT (C),C
LD C,A
PUSH BC
DEC B
OR &40
OUT (C),A
IN A,(&F4)
AND &0F
LD (HL),A
POP BC
LD A,&82
OUT (C),A
DEC B
OUT (C),C
INC HL
POP BC
DJNZ LIRECANAUX
RET
.afficheVUMETRE
;***********************
;*** affiche CANAL A ***
;***********************
;barre 1 - effacer
LD A,2
CALL &BBDE ;pen 2
LD DE,476 ;x
LD HL,364 ;y
CALL &BBEA ;plot x,y,2
LD DE,0 ;x
LD HL,30 ;y
CALL &BBF9 ;drawr x,y,2
;barre 1 - afficher
LD A,1
CALL &BBDE ;pen 1
LD DE,476 ;x
LD HL,364 ;y
CALL &BBEA ;plot x,y,1
LD A,(valuecanaux) ;la valeur de notre canal (&00 a &0F)
ADD A,A ;A*2
LD DE,0 ;x
LD HL,0 ;y
LD L,A ;y=a
CALL &BBF9 ;drawr x,VOL*2,1
;***********************
;*** affiche CANAL B ***
;***********************
;barre 1 - effacer
LD A,2
CALL &BBDE ;pen 2
LD DE,476+12 ;x
LD HL,364 ;y
CALL &BBEA ;plot x,y,2
LD DE,0 ;x
LD HL,30 ;y
CALL &BBF9 ;drawr x,y,2
;barre 1 - afficher
LD A,1
CALL &BBDE ;pen 1
LD DE,476+12 ;x
LD HL,364 ;y
CALL &BBEA ;plot x,y,1
LD A,(valuecanaux+1) ;la valeur de notre canal (&00 a &0F)
ADD A,A ;A*2
LD DE,0 ;x
LD HL,0 ;y
LD L,A ;y=a
CALL &BBF9 ;drawr x,VOL*2,1
;***********************
;*** affiche CANAL C ***
;***********************
;barre 1 - effacer
LD A,2
CALL &BBDE ;pen 2
LD DE,476+24 ;x
LD HL,364 ;y
CALL &BBEA ;plot x,y,2
LD DE,0 ;x
LD HL,30 ;y
CALL &BBF9 ;drawr x,y,2
;barre 1 - afficher
LD A,1
CALL &BBDE ;pen 1
LD DE,476+24 ;x
LD HL,364 ;y
CALL &BBEA ;plot x,y,1
LD A,(valuecanaux+2) ;la valeur de notre canal (&00 a &0F)
ADD A,A ;A*2
LD DE,0 ;x
LD HL,0 ;y
LD L,A ;y=a
CALL &BBF9 ;drawr x,VOL*2,1
RET
;******************
;*** EDITOR.RSX ***
;******************
ORG &A000
;WRITE "EDITOR.RSX"
Hauteur_du_tile EQU 16
longueur_tableau EQU 16
hauteur_tableau EQU 11
ecran_tableau EQU &C000
gfx_des_tiles EQU &9900
resultat_target1 EQU &A600
resultat_target2 EQU &A601
resultat_target3 EQU &A602
resultat_target4 EQU &A603
resultat_slider1 EQU &A604
resultat_slider2 EQU &A605
resultat_slider3 EQU &A606
resultat_slider4 EQU &A607
; ****************************
; *** RSX - INITIALISATION ***
; ****************************
.RSX_Init :
LD HL,RSX_Init
LD (HL),&C9 ; Ecrire un RET pour empêcher 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 TILES_AFF
JP LEVEL_AFF
JP TARGET_SLIDER_CHECK
.RSX_Mots_Clefs
DEFB "TIL","E"+&80 ; Mot clef avec le bit 7 du dernier caractere a 1.
DEFB "LEVE","L"+&80
DEFB "CHEC","K"+&80
DEFB 0 ; Fin de la table.
; *********************
; *** LES FONCTIONS ***
; *********************
;syntax |TILE,adresse_ecran,adresse_tiles
.TILES_AFF
;lecture valeur adresse_tiles
LD L,(IX+00)
LD H,(IX+01)
;lecture valeur adresse_ecran
LD E,(IX+02)
LD D,(IX+03)
.TILES_1
LD A,Hauteur_du_tile
.TILES_2
LDI ;16 pixels = 4 octets en MODE 1
LDI
LDI
LDI
EX DE,HL
LD BC,&07FC
ADD HL,BC
JR NC,TILES_3
LD BC,&C050
ADD HL,BC
.TILES_3
EX DE,HL
DEC A
JR NZ,TILES_2
RET
;syntax |LEVEL,adresse_niveau
.LEVEL_AFF
;lecture valeur adresse_niveau
LD L,(IX+00)
LD H,(IX+01)
PUSH HL ;Sauver HL dans la Pile
POP IX ;Restaurer la Pile dans IX
LD DE,ecran_tableau
LD A,hauteur_tableau
.aff_tableau3
PUSH AF
PUSH DE ; on sauvegarde l'adresse video de la premiere ligne de sprites a afficher
LD A,longueur_tableau
.aff_tableau2
PUSH AF
LD A,(IX+&00)
INC IX
LD L,A
LD H,0
ADD HL,HL ; x2
ADD HL,HL ; x4
ADD HL,HL ; x8
ADD HL,HL ; x16
ADD HL,HL ; x32
ADD HL,HL ; x64
LD BC,gfx_des_tiles
ADD HL,BC
PUSH DE
CALL TILES_1
POP DE
.aff_tableau1
INC DE ;Case suivante (decalage de 4 octets sur la droite)
INC DE
INC DE
INC DE
POP AF
DEC A
JR NZ,aff_tableau2
POP HL
LD BC,&00A0
ADD HL,BC
EX DE,HL ;Ligne suivante
POP AF
DEC A
JR NZ,aff_tableau3
RET
;syntax |CHECK,adresse_niveau
.TARGET_SLIDER_CHECK
;Mise a zero des resultats
LD HL,resultat_target1
LD DE,resultat_target1+1
LD BC,&07 ;LG
LD (HL),&00 ;valeur a ecrire
LDIR
;lecture valeur adresse_niveau
LD L,(IX+00)
LD H,(IX+01)
LD C,16*11
.LOOPCHECK
LD A,(HL)
PUSH HL
CP &01
CALL Z,TARGET1
CP &02
CALL Z,TARGET2
CP &03
CALL Z,TARGET3
CP &04
CALL Z,TARGET4
CP &05
CALL Z,SLIDER1
CP &06
CALL Z,SLIDER2
CP &07
CALL Z,SLIDER3
CP &08
CALL Z,SLIDER4
DEC C
POP HL
INC HL
JR NZ,LOOPCHECK
RET
.TARGET1
LD HL,resultat_target1
INC (HL)
RET
.TARGET2
LD HL,resultat_target2
INC (HL)
RET
.TARGET3
LD HL,resultat_target3
INC (HL)
RET
.TARGET4
LD HL,resultat_target4
INC (HL)
RET
.SLIDER1
LD HL,resultat_slider1
INC (HL)
RET
.SLIDER2
LD HL,resultat_slider2
INC (HL)
RET
.SLIDER3
LD HL,resultat_slider3
INC (HL)
RET
.SLIDER4
LD HL,resultat_slider4
INC (HL)
RET
NOTICE TEXTE n° 3 (14.81 Ko)
;******************
;*** RSX ingame ***
;******************
ORG &9FC1
;WRITE "INGAME.RSX"
Hauteur_du_tile EQU 16
longueur_tableau EQU 16
hauteur_tableau EQU 11
ecran_tableau EQU &F0A1
gfx_des_tiles EQU &9861
niveau_courant EQU &9EA2
;9FB8 = level le plus haut fini
resultat_target1 EQU &9FB9
resultat_target2 EQU &9FBA
resultat_target3 EQU &9FBB
resultat_target4 EQU &9FBC
resultat_slider1 EQU &9FBD
resultat_slider2 EQU &9FBE
resultat_slider3 EQU &9FBF
resultat_slider4 EQU &9FC0
; ****************************
; *** RSX - INITIALISATION ***
; ****************************
.RSX_Init :
LD HL,RSX_Init
LD (HL),&C9 ; Ecrire un RET pour empêcher 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 TILES_AFF
JP LEVEL_AFF
JP START_AFF
JP RESET_SAV
JP DECOR_SAV
JP DECOR_AFF
JP SPRITE_AFF
JP LEVEL_CLEAR
JP CART_PRS
JP CART_INFO
JP RECT_INFO
JP BOUCHES
JP CLS3
.RSX_Mots_Clefs
DEFB "TIL","E"+&80 ; Mot clef avec le bit 7 du dernier caractere a 1.
DEFB "LEVE","L"+&80
DEFB "STAR","T"+&80
DEFB "RESETDAT","A"+&80
DEFB "DECORSAV","E"+&80
DEFB "DECORAF","F"+&80
DEFB "SPRIT","E"+&80
DEFB "LEVELCLEA","R"+&80
DEFB "CAR","T"+&80
DEFB "INF","O"+&80
DEFB "REC","T"+&80
DEFB "BLABL","A"+&80
DEFB "CLS","3"+&80
DEFB 0 ; Fin de la table.
; *********************
; *** LES FONCTIONS ***
; *********************
;syntax |TILE,adresse_ecran,adresse_tiles
.TILES_AFF
;lecture valeur adresse_tiles
LD L,(IX+00)
LD H,(IX+01)
;lecture valeur adresse_ecran
LD E,(IX+02)
LD D,(IX+03)
.TILES_1
LD A,Hauteur_du_tile
.TILES_2
LDI ;16 pixels = 4 octets en MODE 1
LDI
LDI
LDI
EX DE,HL
LD BC,&07FC
ADD HL,BC
JR NC,TILES_3
LD BC,&C050
ADD HL,BC
.TILES_3
EX DE,HL
DEC A
JR NZ,TILES_2
RET
;syntax |LEVEL
.LEVEL_AFF
;adresse_niveau
LD IX,niveau_courant
LD DE,ecran_tableau
LD A,hauteur_tableau
.aff_tableau3
PUSH AF
PUSH DE ; on sauvegarde l'adresse video de la premiere ligne de sprites a afficher
LD A,longueur_tableau
.aff_tableau2
PUSH AF
LD A,(IX+&00)
INC IX
LD L,A
LD H,0
ADD HL,HL ; x2
ADD HL,HL ; x4
ADD HL,HL ; x8
ADD HL,HL ; x16
ADD HL,HL ; x32
ADD HL,HL ; x64
LD BC,gfx_des_tiles
ADD HL,BC
PUSH DE
CALL TILES_1
POP DE
.aff_tableau1
INC DE ;Case suivante (decalage de 4 octets sur la droite)
INC DE
INC DE
INC DE
POP AF
DEC A
JR NZ,aff_tableau2
POP HL
LD BC,&00A0
ADD HL,BC
EX DE,HL ;Ligne suivante
POP AF
DEC A
JR NZ,aff_tableau3
RET
;syntax |START,adresse_niveau_dans_le_pack
.START_AFF
;lecture valeur adresse_niveau
LD L,(IX+00)
LD H,(IX+01)
LD DE,niveau_courant
LD BC,176 ;16x11
LDIR ;transfeert des données
;affichage du niveau
;CALL LEVEL_AFF
;calcul positions target et slider
;suppression des valeurs des sliders dans le tableau
LD HL,niveau_courant
LD C,176 ;16x11
.LOOPCHECK
LD A,(HL)
PUSH HL
CP &01
CALL Z,TARGET1
CP &02
CALL Z,TARGET2
CP &03
CALL Z,TARGET3
CP &04
CALL Z,TARGET4
CP &05
CALL Z,SLIDER1
CP &06
CALL Z,SLIDER2
CP &07
CALL Z,SLIDER3
CP &08
CALL Z,SLIDER4
DEC C
POP HL
INC HL
JR NZ,LOOPCHECK
;affichage du niveau
LD HL,niveau_courant
LD DE,niveau_courant
CALL LEVEL_AFF
RET
.TARGET1
;position
LD a,c
LD (resultat_target1),a
XOR A
RET
.TARGET2
;position
LD a,c
LD (resultat_target2),a
XOR A
RET
.TARGET3
;position
LD a,c
LD (resultat_target3),a
XOR A
RET
.TARGET4
;position
LD a,c
LD (resultat_target4),a
XOR A
RET
.SLIDER1
;position
LD a,c
LD (resultat_slider1),a
;mise a zéro
XOR A
LD (HL),a
RET
.SLIDER2
;position
LD a,c
LD (resultat_slider2),a
;mise a zéro
XOR A
LD (HL),a
RET
.SLIDER3
;position
LD a,c
LD (resultat_slider3),a
;mise a zéro
XOR A
LD (HL),a
RET
.SLIDER4
;position
LD a,c
LD (resultat_slider4),a
;mise a zéro
XOR A
LD (HL),a
RET
;syntax |RESETDATA
.RESET_SAV
LD HL,&9F53
LD DE,&9F54
LD BC,100 ;101 valeurs
LD (HL),0
LDIR
RET
;syntax |LEVELCLEAR
.LEVEL_CLEAR
LD HL,niveau_courant
LD DE,niveau_courant+1
LD BC,(16*11)-1
LD (HL),0
LDIR
RET
;*****************************
;*** gestion des 4 sprites ***
;*****************************
.fond_Tampon1 :
DEFS 64 ; MODE 1 : 16px*16px = 4*16 = 64 octets
.fond_Tampon2 :
DEFS 64
.fond_Tampon3 :
DEFS 64
.fond_Tampon4 :
DEFS 64
.DECOR_SAV
;syntax |DECORSAVE,slider,adresse_ecran
;lecture slider
LD A,(IX+02)
;lecture adresse_ecran
LD E,(IX+00)
LD D,(IX+01)
;HL adresse pour sauver
CP &05
CALL Z,FOND_SLIDER1
CP &06
CALL Z,FOND_SLIDER2
CP &07
CALL Z,FOND_SLIDER3
CP &08
CALL Z,FOND_SLIDER4
LD A,Hauteur_du_tile
EX DE,HL
.sauver_fond1
LDI ; 16 pixels = 4 octets en MODE 1
LDI
LDI
LDI
LD BC,&7FC
ADD HL,BC
JR NC,sauver_fond2
LD BC,&C050
ADD HL,BC
.sauver_fond2
DEC A
JR NZ,sauver_fond1
RET
.DECOR_AFF
;syntax |DECORAFF,slider,adresse_ecran
;lecture slider
LD A,(IX+02)
;lecture adresse_ecran
LD E,(IX+00)
LD D,(IX+01)
;HL adresse pour sauver
CP &05
CALL Z,FOND_SLIDER1
CP &06
CALL Z,FOND_SLIDER2
CP &07
CALL Z,FOND_SLIDER3
CP &08
CALL Z,FOND_SLIDER4
LD A,Hauteur_du_tile
.restore_fond1
LDI ; 16 pixels = 4 octets en MODE 1
LDI
LDI
LDI
EX DE,HL
LD BC,&7FC
ADD HL,BC
JR NC,restore_fond2
LD BC,&C050
ADD HL,BC
.restore_fond2
EX DE,HL
DEC A
JR NZ,restore_fond1
RET
.FOND_SLIDER1
LD HL,fond_Tampon1
RET
.FOND_SLIDER2
LD HL,fond_Tampon2
RET
.FOND_SLIDER3
LD HL,fond_Tampon3
RET
.FOND_SLIDER4
LD HL,fond_Tampon4
RET
;syntax |SPRITE,slider(adresse_memoire),adresse_ecran
.SPRITE_AFF
;lecture valeur adresse_ecran
LD E,(IX+02)
LD D,(IX+03)
;lecture valeur adresse_tiles/sprite
LD L,(IX+00)
LD H,(IX+01)
;EX DE,HL ; en inversant HL et DE, on peut gagner sur le calcul final de ligne suivante.
LD A,Hauteur_du_tile
.aff_sp0
DI ;desactiver les interruptions (a cause du EX AF,AF')
EX AF,AF'
; traitement premier octet
LD A,(DE)
LD B,A
AND &88 ; pixel 4
JR NZ,aff_sp11
LD A,(HL)
AND &88
.aff_sp11
LD C,A ; on sauvegarde dans C le pixel traite
LD A,B
AND &44
JR NZ,aff_sp12
LD A,(HL)
AND &44
.aff_sp12
ADD A,C
LD C,A
LD A,B
AND &22
JR NZ,aff_sp13
LD A,(HL)
AND &22
.aff_sp13
ADD A,C
LD C,A
LD A,B
AND &11
JR NZ,aff_sp14
LD A,(HL)
AND &11
.aff_sp14
ADD A,C
LD (HL),A ; on poke en memoire video le resultat final
INC HL
INC DE
; traitement deuxieme octet
LD A,(DE)
LD B,A
AND &88 ; pixel 4
JR NZ,aff_sp21
LD A,(HL)
AND &88
.aff_sp21
LD C,A ; on sauvegarde dans C le pixel traite
LD A,B
AND &44
JR NZ,aff_sp22
LD A,(HL)
AND &44
.aff_sp22
ADD A,C
LD C,A
LD A,B
AND &22
JR NZ,aff_sp23
LD A,(HL)
AND &22
.aff_sp23
ADD A,C
LD C,A
LD A,B
AND &11
JR NZ,aff_sp24
LD A,(HL)
AND &11
.aff_sp24
ADD A,C
LD (HL),A ; on poke en memoire video le resultat final
INC HL
INC DE
; traitement troisieme octet
LD A,(DE)
LD B,A
AND &88 ; pixel 4
JR NZ,aff_sp31
LD A,(HL)
AND &88
.aff_sp31
LD C,A ; on sauvegarde dans C le pixel traite
LD A,B
AND &44
JR NZ,aff_sp32
LD A,(HL)
AND &44
.aff_sp32
ADD A,C
LD C,A
LD A,B
AND &22
JR NZ,aff_sp33
LD A,(HL)
AND &22
.aff_sp33
ADD A,C
LD C,A
LD A,B
AND &11
JR NZ,aff_sp34
LD A,(HL)
AND &11
.aff_sp34
ADD A,C
LD (HL),A ; on poke en memoire video le resultat final
INC HL
INC DE
; traitement quatrieme octet
LD A,(DE)
LD B,A
AND &88 ; pixel 4
JR NZ,aff_sp41
LD A,(HL)
AND &88
.aff_sp41
LD C,A ; on sauvegarde dans C le pixel traite
LD A,B
AND &44
JR NZ,aff_sp42
LD A,(HL)
AND &44
.aff_sp42
ADD A,C
LD C,A
LD A,B
AND &22
JR NZ,aff_sp43
LD A,(HL)
AND &22
.aff_sp43
ADD A,C
LD C,A
LD A,B
AND &11
JR NZ,aff_sp44
LD A,(HL)
AND &11
.aff_sp44
ADD A,C
LD (HL),A ; on poke en memoire video le resultat final
INC DE
LD BC,&7FD
ADD HL,BC
JR NC,aff_sp5
LD BC,&C050
ADD HL,BC
aff_sp5 EX AF,AF'
DEC A
JP NZ,aff_sp0
EI ;réactiver les interruptions
RET
;syntax |CART
.CART_PRS
LD DE,&F8AD
LD HL,&9C21
CALL TILES_1 ;coin haut gauche
LD DE,&F14D
LD HL,&9DA1
CALL TILES_1 ;coin bas gauche
LD DE,&F8CD
LD HL,&9B61
CALL TILES_1 ;coin haut droit
LD DE,&F16D
LD HL,&9CE1
CALL TILES_1 ;coin bas droit
;Utilisation de la zone graphique comme d'un FILL
;bord gauche et droit
ld de,130
ld hl,368
call #BBCF
;bord haut et bas
ld de,351
ld hl,294
call #BBD2
;couleur du paper
ld a,2
call #BBE4
;cls fenetre graphique
call #BBDB
;parametre par defaut pour la zone graphique
;bord gauche et droit
ld de,0
ld hl,640
call #BBCF
;bord haut et bas
ld de,0
ld hl,400
call #BBD2
;refaire le trait blanc
;PEN 1
ld a,1
call #BBDE
;plot
ld de,128 ;x
ld hl,344 ;y
call #BBEA
;draw
ld de,374
ld hl,344
call #BBF6
;plot
ld de,128 ;x
ld hl,346 ;y
call #BBEA
;draw
ld de,374
ld hl,346
call #BBF6
;plot
ld de,128 ;x
ld hl,348 ;y
call #BBEA
;draw
ld de,374
ld hl,348
call #BBF6
RET
;syntax |INFO
.CART_INFO
LD DE,&F329
LD HL,&9BA1
CALL TILES_1 ;coin gauche
LD DE,&F355
LD HL,&9AE1
CALL TILES_1 ;coin droit
;Utilisation de la zone graphique comme d'un FILL
;bord gauche et droit
;104;225
;423;198
ld de,104
ld hl,423
call #BBCF
;bord haut et bas
ld de,225
ld hl,198
call #BBD2
;couleur du paper
ld a,2
call #BBE4
;cls fenetre graphique
call #BBDB
;parametre par defaut pour la zone graphique
;bord gauche et droit
ld de,0
ld hl,640
call #BBCF
;bord haut et bas
ld de,0
ld hl,400
call #BBD2
RET
;syntax |RECT
.RECT_INFO
;Utilisation de la zone graphique comme d'un FILL
;bord gauche et droit
ld de,148-16
ld hl,366+16
call #BBCF
;bord haut et bas
ld de,160
ld hl,238
call #BBD2
;couleur du paper
ld a,0 ;NOIR
call #BBE4
;cls fenetre graphique
call #BBDB
;Utilisation de la zone graphique comme d'un FILL
;bord gauche et droit
ld de,148-8
ld hl,366+8
call #BBCF
;bord haut et bas
ld de,160+8
ld hl,238-8
call #BBD2
;couleur du paper
ld a,3 ;BLEU
call #BBE4
;cls fenetre graphique
call #BBDB
;Utilisation de la zone graphique comme d'un FILL
;bord gauche et droit
ld de,148
ld hl,366
call #BBCF
;bord haut et bas
ld de,160+16
ld hl,238-16
call #BBD2
;couleur du paper
ld a,1 ;BLANC
call #BBE4
;cls fenetre graphique
call #BBDB
;Utilisation de la zone graphique comme d'un FILL
;bord gauche et droit
ld de,148+8
ld hl,366-8
call #BBCF
;bord haut et bas
ld de,160+24
ld hl,238-24
call #BBD2
;couleur du paper
ld a,3 ;BLEU
call #BBE4
;cls fenetre graphique
call #BBDB
;parametre par defaut pour la zone graphique
;bord gauche et droit
ld de,0
ld hl,640
call #BBCF
;bord haut et bas
ld de,0
ld hl,400
call #BBD2
RET
;syntax |BLABLA
.valbouche
DEFB 0
.BOUCHES
LD A,(valbouche)
CP &00
CALL Z,BOUCHE1
CP &01
CALL Z,BOUCHE2
RET
.BOUCHE1
;changer 8 valeurs
LD A,&0F
LD (&E3B8),A
LD (&E3B9),A
LD (&FBB8),A
LD (&FBB9),A
LD A,&F0
LD (&EBB8),A
LD (&F3B8),A
LD A,&E1
LD (&EBB9),A
LD (&F3B9),A
;on change pour le prochain appel
LD A,1
LD (valbouche),A
;en sortant de cette sous-routine on évite d'aller dans la suivante
LD A,7
RET
.BOUCHE2
;changer 8 valeurs
LD A,&F0
LD (&E3B8),A
LD (&FBB8),A
LD A,&E1
LD (&E3B9),A
LD (&FBB9),A
XOR A
LD (&EBB8),A
LD (&F3B8),A
LD A,&01
LD (&EBB9),A
LD (&F3B9),A
;on change pour le prochain appel
XOR A
LD (valbouche),A
RET
;syntax |CLS3
;petit effet pour vider l'écran du dernier niveau
.CLS3
LD HL,&C000
LD BC,&4000
clsloop2:
LD (HL),&FF;remplir avec l'encre 3 (bleu)
LD DE,&0059
ADD HL,DE
JR NC,clsloop1
LD DE,&C000
ADD HL,DE
clsloop1:
DEC BC
LD A,B
OR C
JR NZ,clsloop2
RET