lunes, 16 de enero de 2012

El bucle principal


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_8x8


En 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 VOLCAD1


En 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

 

lunes, 9 de enero de 2012

Una de tablas


Durante el juego se manejan una serie de tablas. Creo que es el momento de pasar a explicarlas, para que las siguientes entradas sean lo más claras posible.

Comenzaré con las tablas de cada STAGE:

STAGE   DEFW FASE11,FASEMALON1,FASEA1 ;0,1,2,3,4,5  
        DEFB 35,0,1,1;6,7,8,9
        DEFB 0,0;10,11
        DB 0+0 ; 1 COLISION 2 METEORITO  


0,1: tabla de movimiento de los enemigos 
2,3: tabla del Boss
4,5: tabla para el ataque (fase de atributo en verde)
6: Enemigos a destruir en cada fase
7: Controla distintas cosas según sus bits
   Bit 0=1, sale meteorito
   Bit 6=1, los disparos de los enemigos van rápido
   Bit 7=1, disparos rápidos de los enemigos en la fase verde
8: número de disparos de los enemigos
9: número de STAGE
10: libre
11: número del planeta a poner en el fondo (0 a 6)
12: Controla distintas cosas según sus bits
   Bit 0=1, contacto letal
   Bit 1=1, sale el meteorito en las fases con disparos de enemigos
   Bit 2=1, meteorito en las fases sin disparos 



Ahora explico las tablas de cada fase:


FASE11   DEFB 10,0 ;
         DEFB 9,9,2
         DEFW FASE11T
         DEFB 9,3,64+5,0,0,0,0,0,0


0: pausa entre entre enemigos a la hora de salir
1: libre
2: sprites que terminan la tabla
3: enemigos muertos por ataque
4: número de repeticiones de los ataques
5,6: tablas de control de los sprites
7: número de enemigos en cada ataque
8: número de ataques 
9: color de la pantalla
10,15: libres


Tablas de control de sprites en cada fase

FASE11
        Grupo 1
        DB 5                   
        DW TABLA3D,INVADER1G
        DW INVADER1M,INVADER1P
        DB 0    

        
        Grupo 2
        DB 4
        DW ATA2,INVADER1G
        DW INVADER1M,INVADER1P
        DB 0

En pantalla hay 2 grupos de sprites distintos que tienen su propia trayectoria:


Byte 0: número de sprites del grupo
Byte 1,2: tabla de movimiento de los sprites del grupo
Byte 3,4: Gráfico grande de los enemigos del grupo
Byte 5,6: Gráfico mediano de los enemigos del grupo
Byte 7,8: Gráfico pequeño de los enemigos del grupo
Byte 9: libre

El comportamiento de la fase del boss lo explicaré cuando lleguemos.


En general esta es una tabla standard de control de sprite.

PROTA   DEFB 160-16,72,2,16     ;0,1,2,3
        DEFW NAVE0      ;4,5
        DEFB 0,0,64,0   ;6,7,8,9
        DEFB 0,2,0      ;10,11,12
        DEFW NAVE0 ,NAVE0       ;13,14,15,16
        DEFB 0,1;17,18
        DEFW NAVE0;19,20
        DB 16   ;21
        DEFB 0,0,0,2,4,0,0,0,0 ;22,23,24,25,26,27,28,29,30
        DEFB 0,0,0,0,0,0
        DEFW PROTAMEDIO,PROTAPEQUE ;31,32,33,34,35,36,37,38,39,40


0: coordenada Y
1: coordenada X
2: ancho del sprite en baja
3; alto del sprite en alta
4,5: dirección del grafico en curso. 

6,7,9: no se usan
9: tamaño del sprite con máscara: 2x16x2 
10: pausa para cambio de fase del sprite
11: alto del sprite en baja
12: coordenadaY/8
13,14: no se usan
15,16: se usan solo para sprites dirigidos a un determinado punto (BC).
Más adelante explicaré estos sprites. Son disparos, meteorito...
17: número de fases de animación -1
18: contador para cambiar el tamaño del disparo del protagonista.
19,20: gráfico de tamaño grande.
Los sprites tienen 3 tamaños dependiendo de la situación   en    pantalla para simular un efecto 3D
21: ancho del sprite*8 
22,23: se usan solo para sprites dirigidos a un determinado punto (HL).
24: status del sprite. 
Dependiendo del status los sprites hacen unas cosas u otras que veremos en GESTION
27,28: no se usan
29,30: tabla de movimiento en curso para los enemigos
31,32: Gráfico de la explosión
33: contador para que termine la explosión de un sprite
34,35: inicio de la tabla de movimiento del sprite
25,26,29,30,31,32,33,34: variables para los disparos
36: tipo de sprite según su tamaño
37,38: gráfico mediano del sprite
39,40: gráfico pequeño del sprite


La verdad es que no estoy muy orgulloso de cómo he organizado las tablas ya que fui metiendo variables y como todo funcionaba bien en velocidad y memoria no lo optimicé. Pero bueno, espero que para el próximo lo haga mejor.









lunes, 19 de diciembre de 2011

Inicio del meollo

Al pulsar la tecla 2 en el menú, salta a INICIO. Primero pinta el fondo de los records y las estrellas en FONDOR y después imprime el texto con las instrucciones que se encuetra a partir de IN1.

INICIO                             
        CALL FONDOR    
        LD HL,IN1
        LD B,12
        CALL TXTCPIR
        CALL NPULTEC
        CALL PULTEC
        JP INIC2


INSX    EQU 6
INSY    EQU 1

IN1     DEFB INSX,INSY,87,"EARTH IS ALMOST GONE",0
IN2     DEFB INSX,INSY+2,64+6,"DESTROY ALL WHO COME",0
IN3     DEFB INSX,INSY+3,64+6,"THROUGH OUR WORMHOLE",0
IN4     DEFB INSX,INSY+5,64+6,"TRAVEL THIS CHAIN OF",0
IN5     DEFB INSX,INSY+6,64+6,"WORMHOLES TO FIND &",0
IN6     DEFB INSX,INSY+7,64+6,"KILL THE MOTHERSHIPS",0
IN7     DEFB INSX,INSY+9,64+6,"AVOID FEEDING THEIR",0
IN8     DEFB INSX,INSY+10,64+6,"POWER HUNGRY ARMOUR!",0
IN9     DEFB INSX,INSY+12,64+6,"THEY ALL HAVE A WEAK",0
IN10    DEFB INSX,INSY+13,64+6,"SPOT - FIND IT !!!!!",0
IN11    DEFB INSX,INSY+15,64+6,"KILL THE LAST ONE TO",0
IN12    DEFB INSX,INSY+16,64+6,"ENSURE LASTING PEACE",0

En INIC2 empieza lo que es el juego en sí.


INIC2         
        LD A,6
        LD (VIDAS),A     ;poke interesante: número de vidas
        LD HL,EXT        ;vida extra cada 500 puntos (EXT equ 500)
        LD (EXTRA),HL  
        LD HL,0
        LD (SCORE),HL    ;puntuación inicial=0
        XOR A            ;MALOSI=1 significa que estamos en la
        LD (MALOSI),A    ;pantalla del jefe final

        LD IX,STAGE
        LD (GIX),IX      ;GIX= tabla del Stage actual        
INIC1   LD IX,(GIX)
        PUSH IX
        XOR A
        LD (ATREAL+1),A
        CALL BOREAL      ;borra la pantalla real
        LD HL,CAMPOJ     ;pinta todos los adornos de la pantalla
        LD DE,$4000      ;de juego
        CALL deexo


Como el avezado lector se habrá dado cuenta, lo que se podría llamar el campo de juego (pantallazo del final del post) es una pantalla comprimida, ya que entre pitos y flautas me ocupaba parecido que irla imprimiendo con rutinas y me ahorraba trabajo (evidentemente gracias a deexo)

        POP IX
        LD A,(IX+6)     
;número de enemigos a matar para pasar
        LD (MUERT1),A    ;a la pantalla del jefe
        CALL IMPVID      ;imprime las vidas
        LD A,27
        LD (STGX+1),A    ;coloca las coordenadas para imprimir
        LD A,9           ;el stage actual en la zona de los
        LD (STGY+1),A    ;puntos las vidas, etc
        LD A,(IX+9)
        CALL STG         ;imprime el stage
       
        CALL IMPHCOR     ;imprime la puntuación máxima
        CALL IMPSCOR     ;la puntuación, el número de enmigos
        CALL IMPMUER     ;a derribar...
        LD HL,LEFT       ;imprime "ENEMIES" en vez de "POWER"
        CALL PrintString_8x8  ;ya que no estamos en la pantalla

                              ;del jefe
        CALL PANNEG     ;borra el buffer de pantalla
        LD IY,63378     ;IY tiene la información para el borrado

        LD (IY+0),0     ;de sprites que veremos más adelante
        LD IX, DISP1    ;ponemos el gráfico de disparo grande en la
        LD HL, GDISP    ;tabla del sprite de disparo, ya que cuando
        LD (IX+4),L     ;sale el gráfico del disparo
        LD (IX+5),H     ;
ha de ser grande
        LD (IX+13),L
        LD (IX+14),H
        CALL COLOCA     ;inicializa variables necesarias



Ahora paso a explicar las rutinas a las que hemos llamado:

IMPVID  LD A,(VIDAS)            ;imprime las vidas  
        LD L,A
        CALL Int2String_8
        LD A, 64+4
        LD (FONT_ATTRIB), A
        LD HL,conv2string
        LD A,28
VIVI1   LD (FONT_X), A
        LD A, 14
        LD (FONT_Y), A
        CALL INC_HL_Remove_Leading_ZerosP
        RET


STG                               ;imprime el stage actual
        LD L,A
        CALL Int2String_8
        LD A, 64+5
        LD (FONT_ATTRIB), A
        LD HL,conv2string
       
STGX    LD A,13
       
        LD (FONT_X), A
STGY    LD A, 12
        LD (FONT_Y), A
        JP INC_HL_Remove_Leading_ZerosP  

IMPHCOR        
IMPH
        LD HL,(THONOR)         ;imprime el Highscore
        CALL Int2String_16
        LD A, 64+5
        LD (FONT_ATTRIB), A
        LD HL,conv2string
        LD A, 25
        LD (FONT_X), A
        LD A,3
        LD (FONT_Y), A
        CALL PRST1
        RET

IMPSCOR                         ;imprime la puntuación   
IMPSC   LD HL,(SCORE)
        PUSH HL
        CALL Int2String_16
        LD A, 64+5
        LD (FONT_ATTRIB), A
        LD HL,conv2string
        LD A, 25
        LD (FONT_X), A
        LD A, 6
        LD (FONT_Y), A
        CALL PRST1
        POP DE
        LD HL,(EXTRA)            ;si hemos llegado a la puntuación
        AND A                    ;necesaria para una vida extra
        SBC HL,DE                       
        JR Z, VIII
        RET NC
VIII    LD A,(VIDAS)             ;incrementa una vida
        INC A
        LD (VIDAS),A
        CALL IMPVID              ;y la imprime
        LD DE,EXT                ;multiplica EXTRA por 2 para la
        LD HL,(EXTRA)            ;siguiente vida extra
        ADD HL,DE
        LD (EXTRA),HL
        LD HL,INVENTION          ;Toca tres notas de INVENTION
        CALL MUSICAG
        LD B,2
ARMED3  CALL NEXTNOTE
        DJNZ ARMED3
        RET


IMPMUER:                          ;imprime los enemigos caídos     
IMM1    LD A,(MUERT1)       
        LD L,A
        CALL Int2String_8
        LD A, 64+5
        LD (FONT_ATTRIB), A
        LD HL,conv2string
        LD A,27
        LD (FONT_X), A
        LD A, 12
        LD (FONT_Y), A
        CALL INC_HL_Remove_Leading_ZerosP
        RET

 

PANNEG  LD HL,$E900     ;borra el buffer
        LD DE,$E901
        LD (HL),0
        LD BC,3200      ;20 filas X 20 columnas
        RET             ;
X 8 bites por cada fila



COLOCA 
        LD A,160-16     ;coordenadas iniciales de
        LD (PROTA),A    ;la nave protagonista
        LD A,72
        LD (PROTA+1),A 
        LD HL,TABLA1    ; inicializa la tabla de movimiento
        LD (TABLA),HL   ;de
la nave protagonista
        XOR A           ;DESI controla dónde se haya la
        LD (DESI),A     ;
nave protagonista
        LD (FNAV1),A
        LD A,7
        LD (FASENAVE),A   ;contador para cambiar la fase de la
        PUSH IX           ;dependiendo de la posición de pantalla
        LD IX,PROTA
        CALL DIEXDIE    ;cambia el tamaño de la nave. Mejor lo
        POP IX          ;explicaré más adelante
        RET



Después de todas estas rutinas, la pantalla queda preparada para que empiece la madre de todas las batallas...

 







lunes, 5 de diciembre de 2011

Introducción del nombre en los records


En esta entrega voy a explicar las rutinas implicadas en la introducción del nombre cuando se consigue un record.

Primero lo comprobamos. Para ello compara la puntuación con el record más bajo. Éste está en THONOR +44, ya que la información de cada record ocupa en la tabla 10 bytes. Si la puntuación es menor, no tocamos nada y nos vamos

ORDENHONOR:
        XOR A          
;MHON=0 para que no suene
        LD (MHON),A     ;
la música del menú
        LD HL,(SCORE)
        LD (SCORM),HL   ;guarda la puntuación
        LD IX,THONOR    ;IX=incio de la tabla de records
        LD E,(IX+44)    ;DE=el menor record.
        LD D,(IX+45)    ;si la puntuación es menor, no toca nada
        AND A          
        SBC HL,DE
        JR NC, NOH55   
;si la puntuación es menor, no toca nada
        CALL HONOR
        JP MENU

  

En caso de que sea mayor, lo primero que hacemos es colocar el nuevo record en su sitio de la tabla. Va comparando la puntuación con todas las puntuaciones de los records y en caso de ser mayor que alguna, mueve todos los records que están debajo de ésta una posición. De esta manera el último record desaparece

NOH55   LD B, 4
NOH2    LD L,(IX+0)     ;HL=el record mayor la primera vez
        LD H,(IX+1)     ;luego va cambiando al sumarle 11
        EX DE,HL        ;DE=
el record mayor
        LD HL,(SCORM)   ;HL=puntuación
        SBC HL,DE       ;resta la puntuación del record
        JR NC, NOH5     ;Si es mayor, lo incluye.
        LD DE, 11       ;un record ocupa 10 bytes en la tabla
        ADD IX,DE
        DJNZ NOH2      
;sino, compara con el siguiente record
        LD E,(IX+0)     ;si puntuación>último record, no cambia
        LD D,(IX+1)     ;la tabla y sólo cambia el último record
        SBC HL,DE
        JR NC, NOH4
        CALL HONOR
        JP MENU

Para mover los records lo que hace es coger todos los que están por debajo de la puntuación obtenida y moverlos de uno en uno desde el penúltimo al ultimo, del antepenúltimo al penúltimo, etc.


NOH5    LD HL,FHO       ;HL=el menor record
NOH6    PUSH HL
        LD DE,-11       ;DE=bytes que ocupa un record en la tabla
        ADD HL,DE       ;HL=el penúltimo record
        POP DE          ;DE=el menor record
        PUSH HL
        PUSH BC
        LD BC,11        ;mueve todos los records por debajo
        LDIR
        POP BC
        POP HL
        DJNZ NOH6       ;el registro B viene con el valor de NOH55


Ahora metemos el nombre para quedar inmortalizados.

Una cadena de record tiene la siguiente estructura:
Los 2 primeros bytes son la puntuación los tres siguientes la coorx,coordy y el atributo y los 5 siguientes el nombre del jugador. 

Empezamos con una cadena="....." y a medida que el juegador va seleccionando letras, ésta va cambiando.

        ;Introducción del nombre del jugador
        ;IX tiene el inicio de la tabla del record a registrar



NOH4    LD HL,(SCORM)      
        LD (IX+0),L     ;HL=puntuación
        LD (IX+1),H
        LD (IX+5),"."   ;de momento el nombre es "....."
        LD (IX+6),"."
        LD (IX+7),"."
        LD (IX+8),"."
        LD (IX+9),"."
        LD (GIXT),IX    ;guarda IX (record a registrar)
        

Metemos 5 letras y empezamos con el código ASCII="." 
A medida que pulsamos las teclas izquierda y derecha el código se va decrementando o incrementando respectivamente. Cuando pulsamos la tecla de disparo, la letra queda elegida.       
       
       
        CALL IMPENTR          
        CALL BOREAL
        LD HL,TEXSCO          ;imprime "BE REMEMBERED..."
        CALL PrintString_8x8   
        LD HL,TEXSCO1
        CALL PrintString_8x8
        LD A,"."              ;A empieza con "." y el jugador lo va
        LD (LETIN),A          ;cambiando con las teclas
        LD IY,(GIXT)          ;IY=cadena del record a meter el nombre.
        LD (IY+5),A           ;mete el "." en la cadena
        XOR A
        LD (VEZ1),A           ;VEZ1=controla el número de letras a meter
        LD HL,23021           ;inicio del atributo para hacer el FLASH
        LD (FLASH),HL
NOH7    LD A,(VEZ1)           ;si hemos metido 5 letras, nos vamos
        CP 5
        JR NZ, NOH77           
        CALL HONOR
        JP MENU
NOH77   LD A,(LETIN)         ;mete la letra en la cadena del record
        LD (IY+5),A
        CALL IMPENTR         ;imprime la cadena
        CALL NPULTEC
       
MIT    
        LD HL,(FLASH)  
;activa el FLASH del atributo de la letra
        SET 7,(HL)      ;que estamos metiendo
MIT2    LD A, $DF       ; chequea la tecla de la derecha
        IN A, ($FE)
        CPL
MIT1    AND 1    
        JR Z, IZSCO     ;si no está pulsada, chequea la izquierda
        CALL SONID      ;si lo está, hace un sonido
DERSCO  LD A,(LETIN)    ;si el código ASCII="Z"
        CP "Z"
        JR NZ, NOH14
        LD A,"."        ;lo cambia a "."
        JR NOH15
NOH14   CP "."          ;Si el código ASCII="." lo cambia a "A-1"
        JR NZ, NOH16
        LD A,"A"-1      ;si no,
NOH16   INC A
NOH15   LD (LETIN),A    ;incrementa el código ASCII y lo mete en
        LD (IY+5),A     ;la cadena
        CALL IMPENTR    ;imprime la cadena
        CALL NPULTEC
        JR MIT          ;continua
IZSCO   LD A,$DF        ; tecla izquierda
        IN A, ($FE)
        CPL 

IZSCO1  AND 2        
        JR Z, CONFI    
        CALL SONID
        LD A,(LETIN)
        CP "A"
        JR NZ, NOH12    ;controla igual que si hemos llegado a
        LD A,"."        ;"." cambie el código a "Z+1"
        JR NOH11
NOH12   CP "."
        JR NZ, NOH10
        LD A,"Z"+1
NOH10   DEC A           ;sino, decrementa el código ASCII
NOH11   LD (LETIN),A
        LD (IY+5),A
        CALL IMPENTR   ;e imprime la cadena
        CALL NPULTEC
        JR MIT
CONFI   LD A,$7F       ;tecla de disparo
        IN A,($FE)
        CPL 

CONFI1  AND 1
        JR Z, MIT
        CALL ELIGIO     ;hace el sonido de elegir la letra
        LD A,"."        ;pone "." para la siguiente letra
        LD (LETIN),A
        LD HL,VEZ1      ;incrementa el contador de teclas elegidas
        INC (HL)
        INC IY          ;y la posición de la cadena del record
        LD HL,(FLASH)
        RES 7,(HL)      ; apaga el FLASH e incrementa la dirección
        INC HL          ;del atributo para el siguiente
        LD (FLASH),HL
        JP NOH7
       

Para imprimir la cadena del nombre provisional se usa la siguiente rutina, que lo que hace es ir imprimiendo una cadena de un solo caracter, la cual se va alimentando con la cadena del nombre que estamos metiendo
       
        ;Imprime la cadena del record que estamos metiendo       
       
IMPENTR                
        LD IX,(GIXT)    ;IX=inicio de la cadena del record a meter
        LD A,13         ;coordenada X
NOH19   LD HL,ENTRD     ;cadena standard con "."
        LD (HL),A       ;Pone la coordenada X
        PUSH AF
        PUSH HL
        LD A,(IX+5)     ;A=letra de la cadena. Va cambiando al INC IX
        INC HL          ;incrementa la cadena standard tres veces
        INC HL          ;para llegar al caracter ASCII a imprimir
        INC HL         
        LD (HL),A       ;y pone la letra
        POP HL          ;HL=cadena standard
        CALL PrintString_8x8   ;imprime el caracter
        POP AF
        CP 17           ;si la coodX=17, deja de imprimir
        RET Z
        INC A
        INC IX          ;imprime el siguiente caracter de la cadena
        JR NOH19