Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90
Publié : 12 juin 2013 15:20
Bon courage dans cette aventure (tu multiplies les projets en ce moment). Je vais suivre l'avancée de ce jeu.
Forum des collectionneurs et utilisateurs d'ordinateurs anciens
https://forum.system-cfg.com/
Code : Tout sélectionner
; CLEAR SCREEN
;---------------------
CLEARSCREEN
LDAA #32
STAA R1 ; selection generateur
LDAA #01
STAA R2 ; et caractère
LDAA #112
STAA R3 ;Attribut caractère
LDAA #0
STAA R6 ; ligne vdp
STAA R7 ; colonne vdp
LDX #25 ; nombre de ligne a effacer
REPEAT_LINE
LDAB #40 ; nombre de colonne par ligne
LOOP_WRITE_LINE
LDAA #$01 ; commande
STAA R0+EXEC ; execution
JSR BUSY ; attente flag vdp
DECB
CMPB #0 ; colonne = zero ?
BNE LOOP_WRITE_LINE ; non on continue
CPX #25 ; ligne = 25 ?
BNE NOTFIRSTLINE ; ce n'est pas la premiere ligne ?
LDAA #7 ; si oui on saute à 7 ( le vdp ne sait pas compter de 1 à 6 )
STAA R6 ; ligne vdp
NOTFIRSTLINE
INC R6 ; sinon incremente ligne
CLR R7 ; positionne colonne à 0
DEX
CPX #0 ; derniere ligne ?
BNE REPEAT_LINE ; on repete
RTS ; fin de la routine on sort
Code : Tout sélectionner
BUSY
TST R0
BMI BUSY
RTS
Code : Tout sélectionner
; X contient l'adresse du caractère a redefinir.
; R4 et R5 doivent être définis avec la bonne adresse de bloc et tampon.
REDEF_CHARS
LDAB #$0A ; 10 lignes pour un caractère
BI010
LDAA $0,X
STAA R1 ; dessin du caractère écrit en R1
LDAA #$34 ; commande OCT
STAA R0+EXEC ; execution de la commande
BSR BUSY
INC R5
INC R5
INC R5
INC R5
INX
DECB
BNE BI010
RTS
Code : Tout sélectionner
;-------------------------------
; AFFICHE TEXTE
; X contient l'adresse du texte
; $EE fin d'une ligne et pause
; $FF fin du texte
; la zone texte doit commencer par :
; 1-2 = coordonnées
; 3 = couleurs
; 4 = attibut ( double hauteur / largeur )
; 5 = timing 1=on 0=off
; 6 = debut texte
;-------------------------------
SPRINTF_
LDAA #50 ; RAZ timeur
STAA TIMEUR ;
LDAA #255 ;
STAA TIMEUR+1 ;
LDD #$3501 ; selectionne JEU G0
STD R1
LDAA $0,X ; lit premiere donnée
STAA R6 ; ligne VDP
INX
LDAA $0,X ; lit donnée suivante
STAA R7 ; colonne VDP
STAA SAUVER7_ATTRIBUT ; sauvegarde colonne VDP
INX
LDAA $0,X ; lit donnée suivante
STAA R3 ; couleur VDP
INX
LDAA $0,X ; lit donnée suivante
STAA R2 ; atribut VDP
INX
LDAA $0,X ; lit donnée suivante
STAA TIMEUR+2 ; Timing
INX
BOUCLE_Sprintf_ ; debut boucle affichage
LDAA $0,X ; lit donnée suivante
STAA R1 ; caractère VDP
LDAA #$01
STAA R0+EXEC
JSR BUSY
INX
LDAA TIMEUR+2 ; Timeur ?
CMPA #01
BNE Not_Timing ; pas de timing
JSR Timing ; saut a la routine de timing
Not_Timing
LDAA $0,X ; lit donnée suivante
CMPA #$EE ; fin de ligne ?
BNE Not_Feed ; pas fin de ligne
INX ; fin de ligne alors incremente index
LDAA SAUVER7_ATTRIBUT ; recupere colonne VDP
STAA R7 ; colone VDP
INC R6 ; increment ligne VDP
JMP BOUCLE_Sprintf_ ; continue ligne suivante
Not_Feed
CMPA #$FF ; fin de texte ?
BNE BOUCLE_Sprintf_ ; non alors on continu affichage sans avoir incrémenté 2 fois l'index ;)
FIN_Sprintf_
RTS
;-------------------------------
SAUVER7_ATTRIBUT .DB $00
TIMEUR .DB 50,$FF,$00
Timing
DEC TIMEUR+1
BNE Timing
DEC TIMEUR
BNE Timing
LDAA #50
STAA TIMEUR
LDAA #255
STAA TIMEUR+1
RTS
Code : Tout sélectionner
CMPA #$FF ; fin de texte ?
BEQ FIN_Sprintf_ ;oui alors fin et sortie de la routine
JMP BOUCLE_Sprintf_ ; on continu affichage sans avoir incrementé 2 fois l'index ;)
FIN_Sprintf_
RTS
Code : Tout sélectionner
CMPA #$FF ; fin de texte ?
BNE BOUCLE_Sprintf_ ; non ? alors on continue la boucle
FIN_Sprintf_ ; voilà tu es sorti de ta boucle en économisant un JMP inutile.
RTS
Code : Tout sélectionner
* les 3 premiers octets définissent ligne, colonne, et couleur
* $00 = caractère vide.
* $EF = fin d'une ligne de sprites
* $FF = fin du sprites
;---------------
; KLINGONS
;---------------
MAP_PROIE1
.DB 24,11,16
.DB 60,61,62,63,$EF
.DB $FF
MAP_PROIE2
.DB 24,18,16
.DB 64,65,66,67,68,69,70,$EF
.DB 71,72,73,74,75,00,76,$EF
.DB $FF
MAP_PROIE3
.DB 24,10,16
.DB 000,077,078,079,080,081,082,083,000,$EF
.DB 084,085,086,087,088,089,090,091,092,$EF
.DB 093,000,000,000,094,000,000,000,095,$EF
.DB $FF
Code : Tout sélectionner
;-----------------------------------------
; AFFICHE MAP
; X : adresse de la carte map
; 1-2 : position sur l'ecran (ligne colonne)
; 3 : couleur
;
; $00 : affiche un espace (32) du generateur normal
; $DD : affiche le premier caractère du generateur redefini
; $FF : fin affichage MAP
;-----------------------------------------
AFFICHE_MAP_
LDAA $0,X
STAA R6
INX
LDAA $0,X
STAA R7
STAA IDX_R7
INX
LDAA $0,X
STAA R3
INX
LDD #$3681 ;JEU G0
STD R1
BOUCLE_AFFIC_TITRE_
LDAA $0,X
BNE NOT_CLEAR_
LDAA #32
STAA R1
LDAA #01
STAA R2
JMP EXEC_VDP_
NOT_CLEAR_
CMPA #$FF
BEQ FIN_AFFICHEMAP_
CMPA #$EF
BNE NOT_ENDline
INC R6 ; changement de ligne
LDAA IDX_R7
STAA R7
INX
JMP BOUCLE_AFFIC_TITRE_
NOT_ENDline
CMPA #$DD
BNE NOTSTARTCHAR
LDAA #32
STAA R1
JMP ZZ1
NOTSTARTCHAR
ADDA #32
STAA R1
ZZ1
LDAA #$81
STAA R2
EXEC_VDP_
LDAA #$01
STAA R0+EXEC
BSR BUSY
INX
JMP BOUCLE_AFFIC_TITRE_
FIN_AFFICHEMAP_
RTS
;-------------------------------
IDX_R7 .DB 00
Code : Tout sélectionner
BOUCLE_AFFIC_TITRE_
LDAA $0,X
BNE NOT_CLEAR_
LDAA #32
STAA R1
LDAA #01
STAA R2
JMP EXEC_VDP_
...
EXEC_VDP_
LDAA #$01
STAA R0+EXEC
BSR BUSY
INX
JMP BOUCLE_AFFIC_TITRE_
Code : Tout sélectionner
BOUCLE_AFFIC_TITRE_
LDAA $0,X
BNE NOT_CLEAR_
LDAA #32
STAA R1
LDAA #01
STAA R2
LDAA #$01
STAA R0+EXEC
BSR BUSY
INX
JMP BOUCLE_AFFIC_TITRE_
Code : Tout sélectionner
BOUCLE_Sprintf_ ; debut boucle affichage
LDAA $0,X ; lit donnée suivante
STAA R1 ; caractère VDP
LDAA #$01
STAA R0+EXEC
JSR BUSY
INX
LDAA TIMEUR+2 ; Timeur ?
CMPA #01
BNE Not_Timing ; pas de timing
JSR Timing ; saut a la routine de timing
Not_Timing
Code : Tout sélectionner
LDAA TIMEUR+2 ; Timeur ?
CMPA #01
BNE Not_Timing
Timing
DEC TIMEUR+1
BNE Timing
DEC TIMEUR
BNE Timing
LDAA #50
STAA TIMEUR
LDAA #255
STAA TIMEUR+1
Not_Timing
Code : Tout sélectionner
; Chaque secteur est délimité par un carré de 20,12
; construit a chaque changement de secteur
MapSecteur ; map du secteur en cours
.db 6,0,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1; 1
.db 1,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0;
.db 2,0,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,2;
.db 1,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0;
.db 2,0,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0; 5
.db 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1;
.db 1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0;
.db 1,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0;
.db 1,0,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0;
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2; 10
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 15
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 20
JX .DB 10 ; coordonnés X joueur
JY .DB 6 ; coordonnés Y joueur
Rotation_J .DB 00 ; rotation du joueur 8 position à un 1/8 de tour
Klingons ; 2 octets par klingons pour les coordonnées
.db 01,01
.db 02,02
.db 03,03
.db 04,04
.db 05,05
.db 06,06
.db 07,07
.db 08,08
.db 09,09
.db 10,12 ; 10
.....
.....
....
Sectors
; chaque secteur détaillé comme suit :
; - 1 octet pour le nombre de klingons (max 10)
; - 1 octet pour le nombre de bases (max 5)
; - 1 octet pour le nombre de saucer (max 4)
; - 1 octet pour le nombre de météorite (max 10)
; - 1 octet pour le nombre de UNKNOW (max 5)
;Sector 01
.db 3,1,0,0,0
;Sector 02
.db 4,1,1,0,0
;Sector 03
.db 5,2,1,0,0
Code : Tout sélectionner
GAUCHE
lDAA Rotation_J
SUBA #01
CMPA #$FF
BNE RETOURGauche
LDAA #07
RETOURGauche
STAA Rotation_J
JMP FIN_ScanKey
DROITE
lDAA Rotation_J
ADDA #01
CMPA #08
BNE RETOURDroite
CLRA
RETOURDroite
STAA Rotation_J
JMP FIN_ScanKey
Code : Tout sélectionner
AVANCE
CLR Depl_Center_XPlus ; initialise index de deplc.
CLR Depl_Center_XMoins ; " "
CLR Depl_Center_YPlus ; " "
CLR Depl_Center_YMoins ; " "
lDAA Rotation_J
CMPA #00 ; Avance à 12 H
BNE Not_12H
LDAA #01
STAA Depl_Center_YPlus
JSR Deplac_Center_Radar
JMP FIN_Avanc
Not_12H
CMPA #01 ; Avance à 1,5 H
BNE Not_1H
LDAA #01
STAA Depl_Center_YPlus
STAA Depl_Center_XMoins
JSR Deplac_Center_Radar
JMP FIN_Avanc
Not_1H
CMPA #02
BNE Not_3H ; Avance à 3 H
LDAA #01
STAA Depl_Center_XMoins
JSR Deplac_Center_Radar
JMP FIN_Avanc
Not_3H
CMPA #03 ; Avance à 4,5 H
BNE Not_5H
LDAA #01
STAA Depl_Center_YMoins
STAA Depl_Center_XMoins
JSR Deplac_Center_Radar
JMP FIN_Avanc
Not_5H
CMPA #04 ; Avance à 6 H
BNE Not_6H
LDAA #01
STAA Depl_Center_YMoins
JSR Deplac_Center_Radar
JMP FIN_Avanc
Not_6H
CMPA #05 ; Avance à 7,5 H
BNE Not_7H
LDAA #01
STAA Depl_Center_YMoins
STAA Depl_Center_XPlus
JSR Deplac_Center_Radar
JMP FIN_Avanc
Not_7H
CMPA #06 ; Avance à 9 H
BNE Not_9H
LDAA #01
STAA Depl_Center_XPlus
JSR Deplac_Center_Radar
JMP FIN_Avanc
Not_9H
CMPA #07 ; Avance à 10,5 H
BNE FIN_Avanc
LDAA #01
STAA Depl_Center_YPlus
STAA Depl_Center_XPlus
JSR Deplac_Center_Radar
JMP FIN_Avanc
FIN_Avanc
JMP FIN_ScanKey
Deplac_Center_Radar
LDX #Klingons
LDAB #34
Bcl_Depl_Center_Radar
LDAA $0,X
ADDA Depl_Center_XPlus
SUBA Depl_Center_XMoins
CMPA #0
BNE Valid_Dplc_CentX
LDAA #20
JMP Ok_Dplc_CentX
Valid_Dplc_CentX
CMPA #21
BNE Ok_Dplc_CentX
LDAA #1
Ok_Dplc_CentX
STAA $0,X
INX
LDAA $0,X
ADDA Depl_Center_YPlus
SUBA Depl_Center_YMoins
CMPA #0
BNE Valid_Dplc_CentY
LDAA #12
JMP Ok_Dplc_CentY
Valid_Dplc_CentY
CMPA #13
BNE Ok_Dplc_CentY
LDAA #1
Ok_Dplc_CentY
STAA $0,X
INX
DECB
BNE Bcl_Depl_Center_Radar
RTS
Depl_Center_XPlus .db 00
Depl_Center_XMoins .db 00
Depl_Center_YPlus .db 00
Depl_Center_YMoins .db 00
Code : Tout sélectionner
RADAR_POV_12H
.db 67,68,69,70,71,72,73 ; POV 12 H
.db 88,89,90,91,92
.db 109,110,111
RADAR_POV_1_5H ; POV 1,5 H
.db 70,71,72,73,93,113,133
.db 90,91,92,112,132
.db 110,111,131
....
....
....
Code : Tout sélectionner
;-------------------------------------------------
; POINT OF VIEW
;
; routine d'affichage vue avant de l'enterprise
;
PointOfView
LDAA #03 ; prepare coordonnées ecran colonne
STAA POV_X ; stock dans variable temporaire
LDAA Rotation_J ; en fonction de l'orientation de la vue
CMPA #00 ;
BEQ POV_12H ;
CMPA #01 ;
BEQ POV_1_5H ;
CMPA #02 ;
BEQ POV_3H ;
CMPA #03 ;
BEQ POV_4_5H ;
CMPA #04 ;
BEQ POV_6H ;
CMPA #05 ;
BEQ POV_7_5H ;
CMPA #06 ;
BEQ POV_9H ;
CMPA #07 ;
BEQ POV_10_5H ;
POV_12H
LDX #RADAR_POV_12H ; stock adresse de la table...
STX POV_idx ; ...precalculée des cases visibles
JSR POV_Render ; on va à la routine RENDER.
RTS
POV_1_5H
LDX #RADAR_POV_1_5H ; stock adresse de la table ...
STX POV_idx ; ...precalculée des cases visibles
JSR POV_Render ; on va à la routine RENDER.
RTS
POV_3H
LDX #RADAR_POV_3H ; stock adresse de la table ..
STX POV_idx ; ..precalculée des cases visibles
JSR POV_Render
RTS
POV_4_5H
LDX #RADAR_POV_4_5H ; stock adresse de la table
STX POV_idx ; precalculée des cases visibles
JSR POV_Render
RTS
POV_6H
LDX #RADAR_POV_6H ; stock adresse de la table ..
STX POV_idx ; ..precalculée des cases visibles
JSR POV_Render
RTS
POV_7_5H
LDX #RADAR_POV_7_5H ; stock adresse de la table
STX POV_idx ; precalculée des cases visibles
JSR POV_Render
RTS
POV_9H
LDX #RADAR_POV_9H ; stock adresse de la table ..
STX POV_idx ; ..precalculée des cases visibles
JSR POV_Render
RTS
POV_10_5H
LDX #RADAR_POV_10_5H ; stock adresse de la table
STX POV_idx ; precalculée des cases visibles
JSR POV_Render
RTS
POV_Render
;-------------------------------------------------------------------
; POV +3
LDAB #07 ; 7 octets a lire
STAB POV_cpt ; compteur
Boucl_Pov_Enemy1
LDX POV_idx ; qu'un seul registre d'index donc on utilise une variable mémoire pour sauvegarder le pointeur de la table précalculée ..
LDAB $0,X ; lit en B la coordonnée de la case a lire
LDX #MapSecteur ; pointe le registre d'index sur la table "MAPSECTEUR"
ABX ; rajoute la coordonnée de la case à lire au registre d'index
LDAA $0,X ; lit la case concernée
CMPA #0 ; est elle vide ?
BEQ Pov_Not_Ennemy1 ; si oui on passe a la suite
CMPA #50 ; sinon est ce une starbase ?
BMI Pov_Not_Starbase ; si inférieur ce n'est pas une starbase
LDAA POV_X ; sinon on renseigne coordonnée horisontale a afficher
STAA MAP_STARBASE1+1
LDX #MAP_STARBASE1 ; on pointe l'adresse de la MAP du sprite à afficher
JSR AfficheObjet_POV ; on saute a la routine d'affichage des objets
JMP Pov_Not_Ennemy1 ; on a fini pour cette case et on continue
Pov_Not_Starbase
CMPA #20 ; est ce un Klingon ?
BHI Pov_Not_Ennemy1 ;si plus grand ce n'est pas un klingon
LDAA POV_X ; si oui on affiche un klingon
STAA MAP_PROIE1+1
LDX #MAP_PROIE1
JSR AfficheObjet_POV
JMP Pov_Not_Ennemy1
Pov_Not_Ennemy1
LDX POV_idx ; on incremente l'index de la table précalculée
INX ; " " " "
STX POV_idx ; " " " "
LDAA POV_X ; on décale coordonnée d'affichage horizontale
ADDA #05 ; " " " "
STAA POV_X ; " " " "
DEC POV_cpt ; on décrémente le compteur
BNE Boucl_Pov_Enemy1 ; on est pas à zero ? alors on continue
;-------------------------------------------------------------------
; POV +2
LDAA #03 ; réinitialise coordonnées ecran colonne
STAA POV_X ;
LDAB #05
STAB POV_cpt
Boucl_Pov_Enemy2
LDX POV_idx
LDAB $0,X
LDX #MapSecteur
ABX
LDAA $0,X
CMPA #0
BEQ Pov_Not_Ennemy2
CMPA #50
BMI Pov_Not_Starbase2
LDAA POV_X
STAA MAP_STARBASE2+1
LDX #MAP_STARBASE2
JSR AfficheObjet_POV
JMP Pov_Not_Ennemy2
Pov_Not_Starbase2
CMPA #20
BHI Pov_Not_Ennemy2
LDAA POV_X
STAA MAP_PROIE2+1
LDX #MAP_PROIE2
JSR AfficheObjet_POV
JMP Pov_Not_Ennemy2
Pov_Not_Ennemy2
LDX POV_idx
INX
STX POV_idx
LDAA POV_X
ADDA #07
STAA POV_X
DEC POV_cpt
BNE Boucl_Pov_Enemy2
;-------------------------------------------------------------------
; POV +1
LDAA #03 ; réinitialise coordonnées ecran colonne
STAA POV_X ;
LDAB #03
STAB POV_cpt
Boucl_Pov_Enemy3
LDX POV_idx
LDAB $0,X
LDX #MapSecteur
ABX
LDAA $0,X
CMPA #0
BEQ Pov_Not_Ennemy3
CMPA #50
BMI Pov_Not_Starbase3
LDAA POV_X
STAA MAP_STARBASE3+1
LDX #MAP_STARBASE3
JSR AfficheObjet_POV
JMP Pov_Not_Ennemy3
Pov_Not_Starbase3
CMPA #20
BHI Pov_Not_Ennemy3
LDAA POV_X
STAA MAP_PROIE3+1
LDX #MAP_PROIE3
JSR AfficheObjet_POV
JMP Pov_Not_Ennemy3
Pov_Not_Ennemy3
LDX POV_idx
INX
STX POV_idx
LDAA POV_X
ADDA #11
STAA POV_X
DEC POV_cpt
BNE Boucl_Pov_Enemy3
RTS
POV_X .db 00
POV_Y .db 00
POV_idx .db 00,00
POV_cpt .db 00
;-------------------------------------------------
AfficheObjet_POV
JSR AFFICHE_MAP_
RTS