En esta ocasión vamos a examinar lo que se puede considerar el bloque principal del programa. En cada stage hay cuatro fases diferenciadas:
Ataque sin disparos
Primer ataque de pantalla verde en el que salen pocas naves disparando
Segundo ataque con disparos
Si hemos conseguido destruir el número suficiente de naves a la fase del BOSS, sino, repite el stage.
LD IX,(GIX) ;IX=stage
LD A,(IX+9) ;número de stage
CALL IMPSTAG ;imprime el número de stage XOR A ;atributo a cero
LD (ATPAN+1),A
CALL BORRPAN ;borramos la pantalla
CALL VOLCADO1 ;volcamos el buffer en la pantalla para que
;se vea borrada
CALL COLOCAFASE ;inicializa ciertas variables para empezar LD A,(IX+12) ;mira si sale el meteorito. CHECKS BIT2 OF IX+12
BIT 2,A ;chequea el bit 2 de (IX+12)
JR Z, NOMES ;si es =0 no sale
LD A,1 ;meteorito sí
JR SIMES
NOMES XOR A ;meteorito no
SIMES LD (METEO),A ;METEO nos dice si hay meteorito o no
XOR A
LD (DISPR),A ;En esta fase no hay disparos, DISPR=0
LD (MALOSI),A ;No estamos en la pantalla del BOSS, MALOSI=0
CALL GFASES2 ;Aquí es donde se desarrolla toda la acción
LD IX,(GIX) ;recupera IX de nuevo (STAGE actual)DESMU4 CALL ATAQUE1 ;Primera fase de pantalla verde (no BOSS) ;fase de ataque con disparos
DESMU1 CALL COLOCAFASE
LD A,(IX+7) ;BIT6 de (IX+7) =1 disparos rápidos =0 disparos lentos
BIT 6,A
JR Z, PDISPA2
CALL DISPA4 ;prepara los disparos rápidos
JR NODISPR
PDISPA2 CALL DISPA2 ;prepara los disparos lentos
NODISPR LD A,(IX+8)
LD (DISPR),A ;Número de disparos de los enemigos
LD A,(IX+12) ;Meteorito
BIT 1,A
JR Z, NOMEC
LD A,1
JR SIMEC
NOMEC XOR A
SIMEC LD (METEO),A
CALL GFASES2 ;De nuevo a la acción!!!!
LD A,(MUERT1) ;Si hemos matado al número suficiente de enemigos
OR A JR Z, SIATA ;Va a la pantalla del BOSS
DESMU2 CALL IMPREPORT ;Si no, nos dice que hemos fallado y tenemos
LD HL, FALLO ;que repetir la fase
CALL TXTCPIR
LD HL,TOOMANY
CALL MUSICAG
LD B, 11
TOO1 CALL NEXTNOTE
DJNZ TOO1
CALL NPULTEC
CALL PULTEC
JP INIC1 ;REPEATS STAGE Seguiré explicando las rutinas por orden de aparición en el listado.
IMPSTAG
CALL PANNEG ;borra el buffer y pone atributo azul
CALL VOLCADO1
LD A,65
LD (ATPAN+1),A
CALL BORRPAN
CALL BORRAT
CALL IMPREPORT ;Imprime el informe de la misión
LD A,(IX+9) ;si el stage es el 10, imprime el último
CP 10 ;infome
JR NZ, IMPS4
LD HL, LASTM ;FINAL REPORT
LD B,7
CALL TXTCPIR
JR PAUUU
IMPS4 LD HL,KILL ;Imprime el número de enemigos a matar
CALL PrintString_8x8
LD HL,EXTLIFE ;los puntos para una vida extra
CALL PrintString_8x8
LD A,(IX+9) ;Si el stage es 1, imprime el aviso sobre el
CP 1 ;color de las gemas
JR NZ, IMS44
LD HL,GEMS
CALL PrintString_8x8
LD HL,GEMS1
CALL PrintString_8x8
LD HL,GEMS2
CALL PrintString_8x8
IMS44 LD A,9
LD (STGY+1),A
LD A,13
LD (STGX+1),A
LD A,(IX+9)
CALL STG ;Imprime el número del stage en el centro
;de la pantalla
LD A,12
LD (STGY+1),A ;devuelve el valor de las coordenadas originales
LD A,18 ;fuera de la pantalla de juego
LD (STGX+1),A
LD A,(IX+6)
CALL STG
LD HL,TSTAGE
CALL PrintString_8x8
LD B,180
PAUUU LD HL,FASES
CALL MUSICAG
LD B, 13
FFF1 CALL NEXTNOTE ;Toca la musiquilla
DJNZ FFF1
LD IX,(GIX)
CALL NPULTEC
JP PULTEC
IMPREPORT ;Imprime el informe de la misión
LD A,65
LD (ATPAN+1),A
CALL BORRAT
LD HL,REPORT
JP PrintString_8x8En VOLCADO1 se vuelca la pantalla virtual en la real cuando no se está en la acción del juego. Por ello no se usa LDI. Esto se hace por motivos prácticos que más adelante veremos. Cada vez que se ejecuta vemos el contenido del buffer en pantalla
VOLCADO1
LD HL,$E900 ;inicio buffer
LD DE,$4041 ;inicio pantalla
LD B,160 ;160 líneas
VOLCAD1 PUSH BC
PUSH DE
LD BC,20
LDIR
POP DE
EX DE,HL
CALL SIGLIN ;calcula siguiente scan
EX DE,HL
POP BC
DJNZ VOLCAD1En colocafase se inicializan variables y se prepara el juego para la primera fase
COLOCAFASE
XOR A
LD (MUERT),A ;número de muertos=0
LD L,(IX+0) ;guarda el stage actual
LD H,(IX+1)
LD (FACTUAL),HL
CALL BORRPAN
CALL TODOACERO ;pone valores iniciales
CALL VERSILETALYMETEORITO ;mira si el contacto es letal
JP ALEATORIO ;Actualiza la tabla de números aleatorios
PONECOLORBORDEPARALETAL: ;Pone color rojo o azul a las gemas dependiendo
;de si el contacto es letal o no.
Se usa una tabla de incrementos para localizar las direcciones atributos. LD HL,$5820
LD DE,TABLALETAL
CALL PONER
LD HL,$5820+32*10
LD DE,TABLET
CALL PONER
LD HL,$5820+32*21
LD DE,TABLALETAL
PONER
PONE1 LD (HL),68 ;este color de carga más abajo
LD A,(DE)
OR A
RET Z
ADD A,L
LD L,A
JR NC,PONE
INC H
PONE INC DE
JR PONE1
TABLALETAL
DB 10,1,10,0 ;contiene los incrementos a sumar a la dirección
TABLET DB 21,11,21,0 ;de los atributos
VERSILETALYMETEORITO: ;pone color azul o rojo
VERSIL LD A,(IX+12) ;Letal depende de IX+12
BIT 0,A
JR Z, NOCO
LD A,2+64 ;BIT 0=1, Rojo
LD (PONE1+1),A ;mete el color para PONECOLORBORDEPARALETAL
LD A,1 ;colisión=1
JR SICO
NOCO
LD A,64+5 ;BIT 0=0, Cyan
LD (PONE1+1),A ;mete el color para PONECOLORBORDEPARALETAL
XOR A ;colisión=0
SICO LD (COLIS),A
JR PONECOLORBORDEPARALETAL
TODOACERO ;inicializa variables
XOR A
LD (CONTAD),A ;número de enemigos destruidos
LD (DISPS1+24),A ;desactiva todos los disparos y el meteorito
LD (DISPS2+24),A
LD (DISP1+24),A
LD (MET+24),A
RET
ALEATORIO: ;Crea la tabla de números aleatorios a partir de
LD HL,$F600 ;$F600
LD (NUMAL),HL
AL3 PUSH HL ;usa los valores de la ROM y hace un XOR con
LD D,0 ;tres valores determinados por el registro R
LD A,R
LD HL,(ALEAT)
LD E,A
ADD HL,DE
LD A,H
CP $40 ;Si H=$40 es el final de la ROM
JR C, AL1
LD H,D
AL1 LD (ALEAT),HL
LD B,3
AL2 LD A,(HL)
INC HL
XOR (HL)
DJNZ AL2
RES 7,A ;para que sea <128
POP HL
LD (HL),A
INC HL
LD A,L
CP 245
JR NZ, AL3
LD (HL),255
RET



