;*******************************************
;*** POUR CREATION FICHIER BASIC/BINAIRE ***
;*******************************************
ORG #0260
DI
LD HL,&0280
LD DE,&6000
LD BC,&196C
LDIR
CALL &6000 ;afficher l'image
CALL &77BC ;afficher les rasters
EI
RET
;fin &0274
;chargement du fichier IMAGE + RASTER
ORG #A000
LD B,&0C
LD HL,fichier_ecran
LD DE,&C000
CALL &BC77 ;lecture entete
LD HL,&0280
CALL &BC83 ;lecture fichier
CALL &BC7A ;ferme le fichier
;fichier raster
LD B,&0C
LD HL,fichier_raster
LD DE,&C000
CALL &BC77 ;lecture entete
LD HL,&1A3C
CALL &BC83 ;lecture fichier
CALL &BC7A ;ferme le fichier
;sauvegarde du nouveau fichier BASIC/BINAIRE
LD B,&0C
LD HL,fichier_sortie
LD DE,&C000
CALL &BC8C
LD HL,&0170 ;'debut basic
LD DE,&1A80 ;longueur du fichier
LD BC,&FADA ;'adresse execution
XOR A ;fichier Basic
CALL &BC98
CALL &BC8F
CALL &BC89
CALL &BC92
RET
fichier_ecran :
DEFM "MENU .EC1"
fichier_raster :
DEFM "RASTER .BIN"
fichier_sortie :
DEFM "DISC .BAS"
;********************************************************************
;*** MENU ***
;************
tailleraster1 EQU 26
tailleraster2 EQU 20
ORG &77BC
DI ; Desactiver les interruptions
LD HL,(&38) ; Lire l'ancienne interruption
LD (Sauver),HL ; Sauvegarder la valeur 16 bits
LD HL,&C9FB ; Registre 16 bits EI (&FB) + RET (&C9)
LD (&38),HL ; Ecrire en &0038 et &0039 le contenu du registre HL
EI ; Interruption autorisees
.Programme
;raster1b rotation vers le bas
LD A,(Raster1b+tailleraster1-1)
LD HL,Raster1b+tailleraster1-2
LD DE,Raster1b+tailleraster1-1
LD BC,tailleraster1-1
LDDR
LD (Raster1b),A
;raster 2 rotation vers le haut
LD A,(Raster2)
LD HL,Raster2+1
LD DE,Raster2
LD BC,tailleraster2-1
LDIR
LD (Raster2+tailleraster2-1),A
LD B,&F5 ; Se connecter au PPI/8255 port B accessible via &F5xx
.Balayage
IN A,(C) ; Lire le contenu
RRA ; On teste si le bit 0 = 1
JP NC,Balayage ; Si le bit 0 = 0 on boucle jusqu'a la fin du balayage
; On est en haut de l'ecran, on peut continuer le programme
HALT ; Attendre interruption 1
HALT ; Attendre interruption 2
DS 20 ; 20 nop - pour une position en debut de ligne
LD B,&7F ; On selection le Gate Array
LD HL,Raster ; HL pointe sur la table de couleurs
.BoucleRaster
LD a,(hl) ; On charge la couleur dans A
CP &00 ; Si A=0 alors
JP Z,Touche ; Saut au test clavier
LD C,16
OUT (C),C ; Selection du border
OUT (C),A ; Ecrire la couleur
LD C,2
OUT (C),C ; Selection encre 2
OUT (C),A ; Ecrire la couleur
INC HL ; Couleur suivante dans le tableau
DS 32 ; On attend la fin de la ligne... (32 nops)
JP BoucleRaster
; Test touche
.Touche
LD BC,&F40E
OUT (C),C ;[PIO A] PSG -> Select Reg14
LD BC,&F6C0 ;PPI I/O
OUT (C),C
XOR A
OUT (C),A
LD BC,&F792 ;PPI I/O C Control
OUT (C),C
LD BC,&F645 ;PPI I/O C - &45 = ligne 5
OUT (C),C
LD B,&F4 ;PPI I/O A - lire ligne clavier
IN A,(C)
LD BC,&F782 ;PPI I/O C Control
OUT (C),C
LD BC,&F600 ;PPI I/O C
OUT (C),C
RLA ;Rotation a gauche - bit 7 (touche ESPACE)
RLA ;Rotation a gauche - bit 6 (touche N)
JR NC,ToucheN ;Si la touche N est enfoncee on quit
RLA ;Rotation a gauche - bit 5 (touche J)
RLA ;Rotation a gauche - bit 4 (touche H)
RLA ;Rotation a gauche - bit 3 (touche Y)
JP C,Programme ;Si la touche Y n'est pas enfoncee on boucle
.ToucheY
LD A,1
LD (&BE80),A ;Ecrire 1 en &BE80
CALL Restaurer
RET
.ToucheN
LD A,2
LD (&BE80),A ;Ecrire 2 en &BE80
CALL Restaurer
RET
.Restaurer
DI ; Desactiver les interruptions
LD HL,(Sauver) ; Restauration des anciennes interruptions
LD (&38),hl ; Ecrire
EI ; Interruption autorisees
RET ; Retour
.Sauver
DW #0000 ;Sauvegarde valeur 16 bits
.Raster
;&54 noir &44 bleu &55 bleu vif &5C rouge fonce &58 magenta &5D mauve
;&4C rouge vif &45 pourpre &4D magenta vif &56 vert &46 turquoise &57 bleu ciel
;&5E jaune &40 gris &5F bleu pastel &4E orange &47 rose &4F magenta pastel
;&52 vert vif &42 vert marin &53 turquoise vif &5A vert citron &59 vert pastel &5B turquoise pastel
;&4A jaune vif &43 jaune pastel &4B blanc
DB &5F ;border bleu pastel
.Raster1
;zone fixe
DB &58 ;magenta
DB &5F ;bleu pastel
DB &58,&58 ;magenta
DB &5F ;bleu pastel
DB &58,&58,&58 ;magenta
DB &4D,&4D ;magenta vif
DB &58 ;magenta
DB &4D,&4D,&4D ;magenta vif
DB &4F ;magenta pastel
DB &4D,&4D ;magenta vif
DB &4F,&4F ;magenta pastel
.Raster1b
DB &56 ;vert
DB &5A,&5A,&5A ;vert citron
DB &56 ;vert
DB &5A,&5A ;vert citron
DB &4A ;jaune vif
DB &43,&43 ;jaune pastel
DB &42,&42 ;vert marin
DB &4B ;blanc
;zone fixe
DB &4B ;blanc
DB &42,&42 ;vert marin
DB &43,&43 ;jaune pastel
DB &4A ;jaune vif
DB &5A,&5A ;vert citron
DB &56 ;vert
DB &5A,&5A,&5A ;vert citron
DB &56 ;vert
DB &4F,&4F ;magenta pastel
DB &4D,&4D ;magenta vif
DB &4F,&4F ;magenta pastel
DB &4D,&4D ;magenta vif
DB &4F ;magenta pastel
DB &4D,&4D,&4D ;magenta vif
DB &58 ;magenta
DB &4D,&4D ;magenta vif
DB &58,&58,&58 ;magenta
DB &5F ;bleu pastel
DB &58,&58 ;magenta
DB &5F ;bleu pastel
DB &58 ;magenta
DB &5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F
DB &5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F
DB &5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F
DB &5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F
DB &5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F
DB &5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F
DB &5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F
DB &5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F,&5F
.Raster2
DB &5C ;rouge fonce
DB &4C,&4C ;rouge vif
DB &4E,&4E ;orange
DB &4A,&4A ;jaune vif
DB &43,&43 ;jaune pastel
DB &4B,&4B ;blanc
DB &43,&43 ;jaune pastel
DB &4A,&4A ;jaune vif
DB &4E,&4E ;orange
DB &4C,&4C ;rouge vif
DB &5C ;rouge fonce
DB &5F ;border bleu pastel
DB 0 ;fin
NOTICE TEXTE n° 2 (5.1 Ko)
;*******************************************
;*** POUR CREATION FICHIER BASIC/BINAIRE ***
;*******************************************
ORG #3F19
DI
LD HL,&2E98
LD DE,&A000
LD BC,&01DF
LDIR
LD HL,&3078
LD DE,&C000
LD BC,&0EA0
LDIR
EI
RET
ORG #A000
;chargement du fichier OVERSCAN
LD B,&0C
LD HL,fichier_overscan
LD DE,&C000
CALL &BC77 ;lecture entete
LD HL,&01F0
CALL &BC83 ;lecture fichier
CALL &BC7A ;ferme le fichier
;chargement du fichier ANIMATION
LD B,&0C
LD HL,fichier_animation
LD DE,&C000
CALL &BC77 ;lecture entete
LD HL,&2E98
CALL &BC83 ;lecture fichier
CALL &BC7A ;ferme le fichier
;chargement du fichier MUSIQUE
LD B,&0C
LD HL,fichier_musique
LD DE,&C000
CALL &BC77 ;lecture entete
LD HL,&3078
CALL &BC83 ;lecture fichier
CALL &BC7A ;ferme le fichier
;sauvegarde du nouveau fichier BASIC/BINAIRE
LD B,&0C
LD HL,fichier_sortie
LD DE,&C000
CALL &BC8C
LD HL,&0170 ;'debut basic
LD DE,&3DDD ;longueur du fichier
LD BC,&FADA ;'adresse execution
XOR A ;fichier Basic
CALL &BC98
CALL &BC8F
CALL &BC89
CALL &BC92
RET
fichier_overscan :
DEFM "INTRO .SCA"
fichier_animation :
DEFM "INTRO .BIN"
fichier_musique :
DEFM "INTRO .MUS"
fichier_sortie :
DEFM "DISC .BAS"
;****************************************************************************************
;*** OVERSCAN INTRO AVEC MUSIQUE ***
;***********************************
ORG #A000
DI
;MODE 1
;LD A,1
;CALL &BC0E
;BORDER 0 (Noir)
LD BC,&0000
CALL &BC38
;INK 0,0 (Noir)
XOR A
LD BC,&0000
CALL &BC32
;INK 1,3 (Rouge fonce)
LD A,1
LD BC,&0303
CALL &BC32
;INK 2,14 (Bleu)
LD A,2
LD BC,&0E0E
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 ;compacte
;CALL &BC83
CALL &2E46 ;decompactage
;correction du probleme avec Zenith II (1er octet mange)
LD A,&5A
LD (&1FE),a
;correction du probleme avec convimgcpc (8x8 absent)
LD A,&33
LD (&07FE),a
LD (&07FF),a
LD A,&CC
LD (&0FFE),a
LD (&0FFF),a
LD A,&33
LD (&17FE),a
LD (&17FF),a
LD A,&CC
LD (&1FFE),a
LD (&1FFF),a
LD A,&33
LD (&27FE),a
LD (&27FF),a
LD A,&CC
LD (&2FFE),a
XOR A
LD (&2FFF),a
LD A,&33
LD (&37FE),a
XOR A
LD (&37FF),a
LD A,&CC
LD (&3FFE),a
LD A,&88
LD (&3FFF),a
;OUT overscan
;largeur
LD BC,&BC01
OUT (C),C
LD BC,&BD30
OUT (C),C
;hauteur (&22)
LD BC,&BC06
OUT (C),C
LD BC,&BD0B ;11 lignes texte uniquement
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
CALL tempo
;petite animation pour centrer le titre
;animation sur R7 = &23 a &18
LD BC,&BC07
OUT (C),C
LD B,&BD
LD A,&23-&18 ;Dec 11 fois
LD C,&23
OUT (C),C
.anim1
DEC C
OUT (C),C
;ralentissement
CALL &BD19:CALL &BD19:CALL &BD19
DEC A
CP 0
JP NZ,anim1
CALL tempo
;petite animation pour positionner le titre tout en bas
;animation sur R7 = &18 a &C
LD BC,&BC07
OUT (C),C
LD B,&BD
LD A,&18-&C ;DEC nb fois
LD C,&18
OUT (C),C
.anim2
DEC C
OUT (C),C
;ralentissement
CALL &BD19:CALL &BD19:CALL &BD19
DEC A
CP 0
JP NZ,anim2
;CALL tempo
;petite animation pour remonter le titre
;animation sur R7 = &C a &23
LD BC,&BC07
OUT (C),C
LD B,&BD
LD A,&17 ;INC nb fois
LD C,&C
OUT (C),C
.anim3
INC C
OUT (C),C
;ralentissement
CALL &BD19:CALL &BD19:CALL &BD19
DEC A
CP 0
JP NZ,anim3
;CALL tempo
;animation sur R6 = &B a &22
LD BC,&BC06
OUT (C),C
LD B,&BD
LD A,&17
LD C,&B
OUT (C),C
.anim4
INC C
OUT (C),C
ralentissement
PUSH AF
CALL tempo2
POP AF
DEC A
CP 0
JP NZ,anim4
;transfert musique en C000
;LD HL,&8000
;LD DE,&C000
;LD BC,&0EA0
;LDIR
;Init musique
CALL &C000
loop:
CALL &BD19 ;attente debut balayage
CALL &C006 ;joueur musique
LD A,&2F ;barre d'espace
CALL &BB1E
CP &80
JP Z,exit
JP loop
exit:
CALL &BCA7 ;nettoyage queue sonore
;animation sur la hauteur R6 = &22 a 0 (masquer)
LD BC,&BC06
OUT (C),C
LD B,&BD
LD A,&22
LD C,&22
OUT (C),C
.anim5
DEC 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,anim5
;OUT R1=32 R6=0 (On masque reste masque)
;largeur
LD BC,&BC01
OUT (C),C
LD BC,&BD20
OUT (C),C
;hauteur
LD BC,&BC06
OUT (C),C
LD BC,&BD0
OUT (C),C
;decalage horizontal
LD BC,&BC02
OUT (C),C
LD BC,&BD2A
OUT (C),C
;decalage vertical
LD BC,&BC07
OUT (C),C
LD BC,&BD22
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
;effacer l'ecran
CALL &BB6C
EI
RET
tempo2:
LD A,8
LOOPtempo2:
CALL &BD19
DEC A
CP 0
JP NZ,LOOPtempo2
RET
;ralentissement
tempo:
LD A,&A0
LOOPtempo:
CALL &BD19
DEC A
CP 0
JP NZ,LOOPtempo
RET
;fichier_overscan :
;DEFM "INTRO .SCA" ;32 ko
NOTICE TEXTE n° 3 (15 Ko)
ADRSCORE EQU &A000
TILESFONTE EQU &7078
;adr = &67E0 + recompense (4*3*11 = 132) + chiffres (10*2*11 = 220) + vide/mur/virus (14*6*22 = 1848)
ORG &9000
; Kukulcan 2016
; ****************************
; *** 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 CONV_LINEAIRE
JP AFF_CIBLE
JP AFF_SPRITE
JP OUT40
JP OUT32
JP MENU
JP ROUTINEHIST
JP ROUTINECONTROLS
JP ROUTINECREDIT
JP MSG
JP SCORECLEAN
JP STATS
JP FX
JP AFFRESULT
JP TILE8
JP CLS
.RSX_Mots_Clefs
DEFB "CON","V"+&80
DEFB "CIBL","E"+&80
DEFB "SP","R"+&80
DEFB "OUT4","0"+&80
DEFB "OUT3","2"+&80
DEFB "MEN","U"+&80
DEFB "AFFHIS","T"+&80
DEFB "AFFCTR","L"+&80
DEFB "AFFCREDIT","S"+&80
DEFB "MS","G"+&80
DEFB "SCORECLEA","N"+&80
DEFB "STAT","S"+&80
DEFB "F","X"+&80
DEFB "AFFRESUL","T"+&80
DEFB "TILE","8"+&80
DEFB "CL","S"+&80
DEFB 0 ; Fin de la table.
;syntax |CONV,adresse_ecran,adresse_destination,largeur,hauteur
CONV_LINEAIRE
;lecture valeur hauteur
LD A,(IX+0)
LD (conv_hauteur+1),A
;lecture valeur largeur
LD A,(IX+2)
LD (conv_largeur+1),A
;lecture valeur adresse_destination
LD D,(IX+5)
LD E,(IX+4)
;lecture valeur adresse_ecran
LD H,(IX+7)
LD L,(IX+6)
conv_hauteur:
LD B,0 ;//nb de ligne (Hauteur)
conv_infos:
PUSH BC ;//ecrire BC dans la pile
PUSH HL ;//ecrire HL dans la pile
conv_largeur
LD B,0 ;//largeur du sprite (en octet)
conv_ligne:
LD A,(HL) ;//a = valeur de l'octet a l'ecran
LD (DE),A ;//ecrire dans destination la valeur de a
INC DE ;//adresse de destination suivante
INC HL ;//adresse ecran suivante
DJNZ conv_ligne ;//B=B-1 si B est <> 0 alors on boucle sur ligne
;B=0, calculer l'adresse de la prochaine ligne a l'ecran
POP HL ;//recuperer HL de la pile
;CALL &BC26 ;//Calcul ligne ecran suivante (vers le BAS)
CALL conv_ligne_suivante
POP BC ;//recuperer BC de la pile (C'est surtout pour le registre B
;//contenant le nombre de ligne que c'est interessant, vu qu'on
;//l'utilise 2 fois ce registre dans la routine)
DJNZ conv_infos ;//B=B-1 si B <>0 on boucle dans infos
RET ;//retour au basic, toutes les lignes ont ete traitees
conv_ligne_suivante:
LD A,H
ADD A,#08
LD H,A
RET NC
LD BC,#C050
ADD HL,BC
RET
;syntax |CIBLE,adresse_ecran,adresse_sprite,largeur,hauteur
;Routine de Christphe PETIT - Affichage d'un sprite entier avec transparence sur l'encre 0 en mode 1
.AFF_CIBLE
;lecture valeur hauteur
LD A,(IX+0)
LD (cible_hauteur+1),A
;lecture valeur largeur
LD A,(IX+2)
LD (cible_largeur+1),A
;lecture valeur adresse_sprite
LD H,(IX+5)
LD L,(IX+4)
;lecture valeur adresse_ecran
LD D,(IX+7)
LD E,(IX+6)
cible_hauteur LD C,0
AFF_CIBLE1 PUSH DE
cible_largeur LD B,0 ; B = nombre d'octets a copier par ligne
AFF_CIBLE2 PUSH BC
LD A,(HL) ; A = octet courant du sprite
LD C,A ; puis C
RLCA
RLCA
RLCA
RLCA ; Inversion poids faible <-> poids fort
OR C ; A = masque des couleurs de sprite a conserver
CPL ; inversion pour masque des couleurs de fond a supprimer
LD B,A ; B = masque des couleurs a supprimer
LD A,(DE) ; A = octet de fond d'ecran courant
AND B ; suppression des couleurs genantes
OR C ; ajout des couleurs du sprite
LD (DE),A ; affichage du resultat
INC HL
INC DE
POP BC
DJNZ AFF_CIBLE2 ; Rebouclage jusqu'a traitement complet de la ligne
POP DE
PUSH BC
CALL ligne_suivante_suivant_R1
POP BC
DEC C
JR NZ,AFF_CIBLE1
RET
;syntax |FX,valeur (0 ou 1)
.FX
LD A,(IX+0)
LD C,8 ;la parenthese ouverte commence a la position 8
ADD C
LD L,A ;L = A
LD H,0 ;H = 0
;HL contient A (A * 2*8=16)
ADD HL,HL ;*2
ADD HL,HL ;*4
ADD HL,HL ;*8
ADD HL,HL ;*16
LD DE,TILESFONTE
ADD HL,DE ;HL contient l'adresse du tiles
LD A,8
LD (spr_hauteur+1),A
LD A,2
LD (spr_largeur+1),A
LD DE,&DF95
CALL spr_hauteur
RET
;syntax |SPR,adresse_ecran,adresse_sprite,largeur,hauteur
.AFF_SPRITE
;lecture valeur hauteur
LD A,(IX+0)
LD (spr_hauteur+1),A
;lecture valeur largeur
LD A,(IX+2)
LD (spr_largeur+1),A
;lecture valeur adresse_sprite
LD H,(IX+5)
LD L,(IX+4)
;lecture valeur adresse_ecran
LD D,(IX+7)
LD E,(IX+6)
spr_hauteur
LD A,&20 ;hauteur
spr_loop
PUSH AF
PUSH DE
spr_largeur
LD BC,&0000 ;largeur
LDIR
POP DE
CALL ligne_suivante_suivant_R1
POP AF
DEC A
JR NZ,spr_loop
.ligne_suivante_suivant_R1
LD A,D
ADD A,8
LD D,A
AND &38
RET NZ
LD A,D
SUB &40
LD D,A
LD A,E
ADD A,&40 ;si R1=40 alors &50 si R1=41 alors &52 si R1=32 alors &40
LD E,A
RET NC
INC D
LD A,D
AND 7
RET NZ
LD A,D
SUB 8
LD D,A
RET
.OUT40
LD BC,&BC01
OUT(C),C
LD BC,&BD00+40
OUT(C),C
LD BC,&BC02
OUT(C),C
LD BC,&BD00+46
OUT(C),C
LD BC,&BC06
OUT(C),C
LD BC,&BD00+25
OUT(C),C
LD BC,&BC07
OUT(C),C
LD BC,&BD00+30
OUT(C),C
RET
.OUT32
;largeur
LD BC,&BC01
OUT (C),C
LD BC,&BD20
OUT (C),C
;hauteur
LD BC,&BC06
OUT (C),C
LD BC,&BD20
OUT (C),C
;decalage horizontal
LD BC,&BC02
OUT (C),C
LD BC,&BD2A
OUT (C),C
;decalage vertical
LD BC,&BC07
OUT (C),C
LD BC,&BD22
OUT (C),C
RET
.MENU
AFFICHAGE_MENU_PRINCIPAL
LD HL,MENU0
LD DE,&D957
CALL directmini
LD HL,MENU1
LD DE,&FA94
CALL directmini
LD HL,MENU2
LD DE,&EB54
CALL directmini
LD HL,MENU3
LD DE,&DC14
CALL directmini
LD HL,MENU4
LD DE,&CCD4
CALL directmini
LD HL,MENU5
LD DE,&FD54
CALL directmini
LD HL,MENU6
LD DE,&EE08
CALL directmini
RET
MENU0 DEFB "*M*E*N*U*"
DB 0 ;fin d'affichage
MENU1 DEFB "1 - PLAY"
DB 0 ;fin d'affichage
MENU2 DEFB "2 - THE STORY"
DB 0 ;fin d'affichage
MENU3 DEFB "3 - CONTROLS"
DB 0 ;fin d'affichage
MENU4 DEFB "4 - CREDITS"
DB 0 ;fin d'affichage
MENU5 DEFB "5 - RESULTS"
DB 0 ;fin d'affichage
MENU6 DEFB "2016 @ WWW.CPC-POWER.COM"
DB 0 ;fin d'affichage
ROUTINEHIST
LD HL,HIST0
LD DE,&D951
CALL directmini
LD HL,HIST1
LD DE,&FA85+1
CALL directmini
LD HL,HIST2
LD DE,&EB45+1
CALL directmini
LD HL,HIST3
LD DE,&DC05+1
CALL directmini
LD HL,HIST4
LD DE,&CCC5+1
CALL directmini
LD HL,HIST5
LD DE,&FD45+1
CALL directmini
LD HL,HIST6
LD DE,&EE05+1
CALL directmini
RET
;012345678901234567890123456
HIST0 DEFB "**THE***STORY**"
DB 0 ;fin d'affichage
HIST1 DEFB "YOUR DOG W.CAMELOT IS ILL."
DB 0 ;fin d'affichage
HIST2 DEFB "VIRUSES ARE ATTACKING HIM."
DB 0 ;fin d'affichage
HIST3 DEFB "YOUR MISSION IS TO GET RID"
DB 0 ;fin d'affichage
HIST4 DEFB "OF THEM THROUGHOUT THE "
DB 0 ;fin d'affichage
HIST5 DEFB "50 LEVELS. BEWARE!!!"
DB 0 ;fin d'affichage
HIST6 DEFB " VIRUSES ARE CLEVER!!!"
DB 0 ;fin d'affichage
ROUTINECONTROLS
LD HL,CTRL0
LD DE,&D94F
CALL directmini
LD HL,CTRL1
LD DE,&FA85+1
CALL directmini
LD HL,CTRL2
LD DE,&EB45+1
CALL directmini
LD HL,CTRL3
LD DE,&DC05+1
CALL directmini
LD HL,CTRL4
LD DE,&CCC5+1
CALL directmini
LD HL,CTRL5
LD DE,&FD45+1
CALL directmini
LD HL,CTRL6
LD DE,&EE05+1
CALL directmini
RET
;012345678901234567890123456
CTRL0 DEFB "*C*O*N*T*R*O*L*S*"
DB 0 ;fin d'affichage
CTRL1 DEFB "MOVE CURSOR AND VIRUS WITH"
DB 0 ;fin d'affichage
CTRL2 DEFB "JOYSTICK OR ARROW KEYS."
DB 0 ;fin d'affichage
CTRL3 DEFB " R=RESTART LEVEL "
DB 0 ;fin d'affichage
CTRL4 DEFB "A=ABORT GAME M=( OR )"
DB 0 ;fin d'affichage
CTRL5 DEFB "KILL EVERY VIRUS TO ACCESS"
DB 0 ;fin d'affichage
CTRL6 DEFB " TO THE NEXT LEVEL. "
DB 0 ;fin d'affichage
ROUTINECREDIT
LD HL,CREDIT0
LD DE,&D951
CALL directmini
LD HL,CREDIT1
LD DE,&FA85
CALL directmini
LD HL,CREDIT2
LD DE,&EB45
CALL directmini
LD HL,CREDIT3
LD DE,&DC05
CALL directmini
LD HL,CREDIT4
LD DE,&CCC5
CALL directmini
LD HL,CREDIT5
LD DE,&FD45
CALL directmini
LD HL,CREDIT6
LD DE,&EE05
CALL directmini
RET
;012345678901234567890123456
CREDIT0 DEFB "*C*R*E*D*I*T*S*"
DB 0 ;fin d'affichage
CREDIT1 DEFB " IDEA & CODE: KUKULCAN "
DB 0 ;fin d'affichage
CREDIT2 DEFB " GFX: KUKULCAN & CED "
DB 0 ;fin d'affichage
CREDIT3 DEFB " MUSIC: T&J/GPA "
DB 0 ;fin d'affichage
CREDIT4 DEFB " COVER & MANUAL: IXIEN "
DB 0 ;fin d'affichage
CREDIT5 DEFB "TESTERS: AST*GALAMOTH*LONE*"
DB 0 ;fin d'affichage
CREDIT6 DEFB " *MAXIT*C.PETIT*FREDOUILLE*"
DB 0 ;fin d'affichage
;
.AFFRESULT
LD HL,AFFRES0
LD DE,&D951
CALL directmini
;cadre
LD HL,resultligne
LD DE,&D4D3
CALL directmini
LD HL,&70C8
LD DE,&D513
CALL stats_aff_TILES_1
LD HL,&70C8
LD DE,&D513+22
CALL stats_aff_TILES_1
LD HL,&70C8
LD DE,&D553
CALL stats_aff_TILES_1
LD HL,&70C8
LD DE,&D553+22
CALL stats_aff_TILES_1
LD HL,&70C8
LD DE,&D593
CALL stats_aff_TILES_1
LD HL,&70C8
LD DE,&D593+22
CALL stats_aff_TILES_1
LD HL,&70C8
LD DE,&D5D3
CALL stats_aff_TILES_1
LD HL,&70C8
LD DE,&D5D3+22
CALL stats_aff_TILES_1
LD HL,&70C8
LD DE,&D613
CALL stats_aff_TILES_1
LD HL,&70C8
LD DE,&D613+22
CALL stats_aff_TILES_1
LD HL,resultligne
LD DE,&D653
CALL directmini
;sprite
LD A,40
LD (spr_hauteur+1),A
LD A,20
LD (spr_largeur+1),A
LD HL,&A1D0
LD DE,&D515
CALL spr_hauteur
RET
resultligne DEFB "%%%%%%%%%%%%"
DB 0;fin d'affichage
AFFRES0 DEFB "*R*E*S*U*L*T*S*"
DB 0 ;fin d'affichage
AFFICHAGE_MINI_TEXTE
; LD HL,TEXTE1
; LD DE,&C000 ;adresse affichage a l'ecran
;le texte devra obligatoirement avoir un zero a la fin
;lecture valeur adresse_texte
LD H,(IX+3)
LD L,(IX+2)
;lecture valeur adresse_ecran
LD D,(IX+1)
LD E,(IX+0)
directmini
;lecture valeur hauteur
LD A,8
LD (spr_hauteur+1),A
;lecture valeur largeur
LD A,2
LD (spr_largeur+1),A
loop_affichage_mini_texte
LD A,(HL)
CP 0
RET Z
LD C,32
SUB C ;A = A-32
PUSH HL ;sauver HL
PUSH DE ;sauver DE
;CALL &BB5A
LD L,A ;L = A
LD H,0 ;H = 0
;HL contient A (A * 2*8=16)
ADD HL,HL ;*2
ADD HL,HL ;*4
ADD HL,HL ;*8
ADD HL,HL ;*16
LD DE,TILESFONTE
ADD HL,DE ;HL contient l'adresse du tiles
POP DE ;recuperer l'adresse d'affichage a l'ecran
PUSH DE ;on resauve DE
CALL spr_hauteur ;affichage du sprite
POP DE ;on recupere
INC DE
INC DE ;position suivante a l'ecran +2
POP HL ;recuperer HL
INC HL ;position caractere suivant
JR loop_affichage_mini_texte
;syntax |MSG,numero_texte
.MSG
LD A,(IX+0)
LD HL,adresse_messages-26
.msgloop
LD DE,26
ADD HL,DE
DEC A
CP -1
JP NZ,msgloop
LD DE,&D6C7
CALL directmini
RET
.adresse_messages
;"0123456789012345678901234" 25 caracteres + 1 a zero
DEFB " EMPTY ":DB 0 ;0
DEFB " OBSTACLE ":DB 0 ;1
DEFB " VIRUS *BDCIRON* TYPE # ":DB 0 ;2
DEFB " VIRUS *PLISSKEN* TYPE # ":DB 0 ;3
DEFB " VIRUS *DECKARD* TYPE # ":DB 0 ;4
DEFB " VIRUS *XTRABET* TYPE # ":DB 0 ;5
DEFB " VIRUS *KALIDOR* TYPE # ":DB 0 ;6
DEFB " VIRUS *ZISQUIER* TYPE # ":DB 0 ;7
DEFB " VIRUS *BDCIRON* TYPE $ ":DB 0 ;8
DEFB " VIRUS *PLISSKEN* TYPE $ ":DB 0 ;9
DEFB " VIRUS *DECKARD* TYPE $ ":DB 0 ;10
DEFB " VIRUS *XTRABET* TYPE $ ":DB 0 ;11
DEFB " VIRUS *KALIDOR* TYPE $ ":DB 0 ;12
DEFB " VIRUS *ZISQUIER* TYPE $ ":DB 0 ;13
DEFB "WARNING, IT'S NOT A VIRUS":DB 0 ;14
DEFB "VIRUS SELECTED, MOVE NOW?":DB 0 ;15
DEFB " ILLEGAL MOVE ":DB 0 ;16
DEFB "WELL DONE VIRUS DESTROYED":DB 0 ;17
DEFB " VIRUS UNSELECTED ":DB 0 ;18
DEFB " ":DB 0 ;19
DEFB " WAIT FOR LEVEL RELOAD ":DB 0 ;20
DEFB " GAME ABORDED ":DB 0 ;21
DEFB " WELCOME TO VIRUSDOG ":DB 0 ;22
DEFB "***** LEVEL FINISHED ****":DB 0 ;23
DEFB " SCORES LOADED ":DB 0 ;24
DEFB " SCORES SAVED ":DB 0 ;25
DEFB " SCORES RESET ":DB 0 ;26
;syntax |SCORECLEAN
.SCORECLEAN
LD HL,ADRSCORE
LD DE,ADRSCORE+1
LD BC,150 ;(2 scores + 1 rank)*50 niveaux
LD (HL),0
LDIR
;lvlunlock
LD A,4
LD (ADRSCORE+151),A
RET
;|STATS
.STATS
LD IX,stats_texte
LD DE,&C20F ;affichage ecran
LD A,11 ;nombre de ligne a afficher
.stats_aff_3
PUSH AF
PUSH DE ; on sauvegarde l'adresse video de la premiere ligne de sprites a afficher
LD A,17 ;nombre de colonne a afficher
.stats_aff_2
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 (largeur 2 octets x 8 lignes pour un tile en 8x8)
LD BC,TILESFONTE-&200 ;(evite une soustraction sur A avec 32caracteres*2octets*8lignes)
ADD HL,BC
PUSH DE
CALL stats_aff_TILES_1
POP DE
.stats_aff_1
INC DE ;Case suivante (decalage de 2 octets sur la droite)
INC DE
POP AF
DEC A
JR NZ,stats_aff_2
POP HL
LD BC,&0040 ;&50 = normal - R1=32 alors &40
ADD HL,BC
EX DE,HL ;Ligne suivante
POP AF
DEC A
JR NZ,stats_aff_3
RET
;syntax |tile8,adresse_memoire,adresse_ecran
.TILE8
;lecture valeur adresse_memoire
LD H,(IX+3)
LD L,(IX+2)
;lecture valeur adresse_ecran
LD D,(IX+1)
LD E,(IX+0)
.stats_aff_TILES_1
LD A,8 ;Hauteur_du_tile
.stats_aff_TILES_2
LDI
LDI ;8 pixels = 2 octets en MODE 1
EX DE,HL
LD BC,&07FE ;&800 - 2 octets (largeur ecran - largeur tiles)
ADD HL,BC
JR NC,stats_aff_TILES_3
LD BC,&C040 ;R1=40 alors &C050 (normal) - R1=32 alors &C040 (reduit)
ADD HL,BC
.stats_aff_TILES_3
EX DE,HL
DEC A
JR NZ,stats_aff_TILES_2
RET
;syntax |CLS,adresse_ecran,numero
.CLS
;&5D10 effacement,1
;&5D94 effacement,2
;&5E18 effacement,3
;&5E9C effacement,4
;&5F20 effacement,5
;&5FA4 effacement,6
LD A,(IX+0)
LD HL,&5D10-132
.clsloop
LD DE,132
ADD HL,DE
DEC A
CP -1
JP NZ,clsloop
;lecture valeur adresse_ecran
LD D,(IX+3)
LD E,(IX+2)
;ecriture valeur hauteur
LD A,22
LD (cible_hauteur+1),A
;ecriture valeur largeur
LD A,6
LD (cible_largeur+1),A
;lecture valeur adresse_sprite
CALL cible_hauteur
RET
org #9F00
.stats_texte
DEFB "%%%%%%%%%%%%%%%%%"
DEFB "% *L*E*V*E*L*S* %"
DEFB "%+++++++++++++++%"
DEFB "%1-PERFECT % 00 %"
DEFB "%++++++++++%++++%"
DEFB "%2-GOOD % 00 %"
DEFB "%++++++++++%++++%"
DEFB "%3-BAD % 00 %"
DEFB "%++++++++++%++++%"
DEFB "%X-NOTHING % 00 %"
DEFB "%++++++++++%++++%"
DEFB 0