                    ;-------------------------------------------------------------------------------
                    ;
                    ; King's Valley (RC727)
                    ;
                    ; Copyright 1985 Konami
                    ;
                    ; Desensamblado e interpretado por Manuel Pazos (jose.manuel.pazos@gmail.com)
                    ; Santander,  17-07-2009
                    ;
                    ;-------------------------------------------------------------------------------
                    
                    
0001 =              VERSION2 equ 1 ; Segunda version de la ROM con correccion de fallos
                    
                    ;-------------------------------------------------------------------------------
                    ; Modificando la constante VERSION2 se pueden generar las dos versiones del juego que existen
                    ; La version 2 [A1] corrige algunos fallos de la version previa como:
                    ;
                    ; - Impide que se pueda lanzar un cuchillo cuando la puerta se esta abriendo.
                    ;   De esta forma se evita que se corrompa el grafico de la puerta al pasar el cuchillo sobre ella
                    ;
                    ; - Impide que se pueda lanzar un cuchillo cuando se esta pegado a un objeto (gema, pico, etc...)
                    ;   En la version original atravesaba el objeto al lanzar el cuchillo
                    ;
                    ; - Se puede picar sobre un muro trampa
                    ;
                    ; - Corregida la posicion del muro trampa de la piramide 10 de la pantalla de la izquierda, abajo a la izquierda (aparece al coger el cuchillo)
                    ;   La version original lo ten? en la pantalla de la derecha bajo las escaleras. Pero hacia falta cabar un par de ladrillos del suelo para que apareciese.
                    ;
                    ; - Modificaci? de la posicion del muro trampa de la pir?ide 12, en la pantalla de la derecha, abajo a la derecha (aparece al coger el pico) Se ha movido un tile a la derecha (?)
                    ;
                    ; - Los muros trampa se detienen al chocar contra un objeto. En la version anterior lo borraba (erroneamente decrementaba los decimales X en vez de la coordenada Y)
                    ;-------------------------------------------------------------------------------
                    
                    ; En la piramide 10-2 hay una momia que parece por encima del suelo (!?)
                    
                    ;-------------------------------------------------------------------------------
                    ; Estructuras
                    ;-------------------------------------------------------------------------------
                    
                    ;--------------------------------------
                    ; ACTOR
                    ;--------------------------------------
0000 =              ACTOR_STATUS:  equ 0
0001 =              ACTOR_CONTROL:  equ 1   ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha
0002 =              ACTOR_SENTIDO:  equ 2   ; 1 = Izquierda, 2 = Derecha
0003 =              ACTOR_Y:  equ 3
0004 =              ACTOR_X_DECIMAL: equ 4
0005 =              ACTOR_X:  equ 5
0006 =              ACTOR_ROOM:  equ 6
0007 =              ACTOR_SPEEDXDEC: equ 7
0008 =              ACTOR_SPEED_X:  equ 8
0009 =              ACTOR_SPEEDROOM: equ 9
000A =              ACTOR_MOV_CNT:  equ 0Ah
000B =              ACTOR_FRAME:  equ 0Bh
000C =              ACTOR_JMP_P:  equ 0Ch  ; Puntero a tabla con los valores del salto
000D =              ACTOR_JMP_P_H:  equ 0Dh
000E =              ACTOR_JUMPSENT:  equ 0Eh  ; 0 = Subiendo, 1 = Cayendo
000F =              ACTOR_SENT_ESC:  equ 0Fh  ; Sentido en el que van las escaleras. 0 = \  1 = /
0010 =              ACTOR_POS_RELAT: equ 10h  ; 0 = A la misma altura (o casi), 1 = Momia por encima, 2 = Por debajo
0011 =              ACTOR_TIMER:  equ 11h
0014 =              ACTOR_TIPO:  equ 14h
0015 =              ACTOR_STRESS:  equ 15h  ; Contador de stress de la momia (para saber si choca muy a menudo)
                    
                    ;--------------------------------------
                    ; Puerta giratoria
                    ;--------------------------------------
0000 =              SPINDOOR_STATUS: equ 0
0001 =              SPINDOOR_Y:  equ 1
0002 =              SPINDOOR_X_DEC:  equ 2
0003 =              SPINDOOR_X:  equ 3
0004 =              SPINDOOR_ROOM:  equ 4
0005 =              SPINDOOR_SENT:  equ 5
0006 =              SPINDOOR_TIMER:  equ 6
                    
                    ;--------------------------------------
                    ; MUSIC
                    ;--------------------------------------
0000 =              MUSIC_CNT_NOTA:  equ 0
0001 =              MUSIC_DURAC_NOTA: equ 1
0002 =              MUSIC_ID:  equ 2
0003 =              MUSIC_ADD_LOW:  equ 3
0004 =              MUSIC_ADD_HIGH:  equ 4
0005 =              MUSIC_OCTAVA:  equ 5   ; Octava?
0006 =              MUSIC_VOLUME_CH: equ 6   ; Volumen canal
0007 =              MUSIC_VOLUME:  equ 7
0009 =              MUSIC_CNT_LOOP:  equ 9   ; Veces que se ha reproducido un pattern
000A =              MUSIC_TEMPO:  equ 0Ah
                    
                    ;-------------------------------------------------------------------------------
                    ; BIOS
                    ;-------------------------------------------------------------------------------
                    
0006 =              byte_6:  equ 6
0007 =              byte_7:  equ 7
0047 =              WRTVDP:  equ #47
004A =              RDVRM:  equ #4a
004D =              WRTVRM:  equ #4d
0050 =              SETRD:  equ #50
0053 =              SETWR:  equ #53
0093 =              WRTPSG:  equ #93
0096 =              RDPSG:  equ #96
013E =              RDVDP:  equ #13e
0141 =              SNSMAT:  equ #141 ;  Read keyboard row
                    
FD9A =              H_TIMI:  equ #fd9a
                    
                    
                    
                    
                    
                    ;-------------------------------------------------------------------------------
                    ;
                    ; ROM header
                    ;
                    ;-------------------------------------------------------------------------------
                    ;  SIZE    16 * 1024       ; ROM de 16K
                    
4000                  org #4000
                    
4000: 4142            dw 4241h
4002: 6C40            dw startCode
4004: 0000            dw 0
4006: 0000            dw 0
4008: 0000            dw 0
400A: 0000            dw 0
400C: 0000            dw 0
400E: 0000            dw 0
                    
                    ;----------------------------------------------------
                    ; Suma HL + A
                    ;----------------------------------------------------
                    
4010 =              ADD_A_HL:
4010: 85              add a, l
4011: 6F              ld l, a
4012: D0              ret nc
4013: 24              inc h
4014: C9              ret
                    
                    ;----------------------------------------------------
                    ; Suma DE + A
                    ;----------------------------------------------------
                    
4015 =              ADD_A_DE:
4015: 83              add a, e
4016: 5F              ld e, a
4017: D0              ret nc
4018: 14              inc d
4019: C9              ret
                    
                    
                    ;-------------------------------------------------------------------------------
                    ;
                    ; MAIN
                    ;
                    ; Funcion principal llamada desde el gancho de interrupcion (50 o 60 Hz)
                    ; Actualiza el reproductor de sonido
                    ; Evita que se ejecute la logica al producirse una interrupcion si no ha
                    ; terminado la iteracion anterior
                    ;-------------------------------------------------------------------------------
                    
401A =              tickMain:
401A: CD3E01          call RDVDP  ; Borra el flag de interrupcion
401D: F3              di
401E: CD367B          call updateSound ; Actualiza el driver de sonido
                    
4021: 2105E0          ld hl, tickInProgress ; Si el bit0 esta a 1 no se ejecuta la logica del juego
4024: CB46            bit 0, (hl)
4026: 200C            jr nz, tickMain2 ; No se ha terminado la iteracion anterior
                    
4028: 34              inc (hl)  ; Indica que se va a realizar una iteracion
4029: FB              ei
402A: CDC845          call chkControls ; Actualiza el estado de los controles
402D: CDA340          call runGame  ; Ejecuta la logica del juego
                    
4030: AF              xor a
4031: 3205E0          ld (tickInProgress), a ; Indica que ha terminado la iteracion actual
                    
4034 =              tickMain2:
4034: CD3E01          call RDVDP  ; Lee y borra el flag de interrupcion
4037: B7              or a  ; Se ha producido una interrupcion mientras se ejecutaba logica del juego?
4038: F3              di
4039: FC367B          call m, updateSound ; Si, actualiza el sonido
403C: FB              ei
403D: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Lee el estado de las teclas
                    ; Proteccion anticopia (!?)
                    ; Si se ejecuta en RAM machaca el programa
                    ;----------------------------------------------------
                    
403E =              ReadKeys_AC:
403E: 21E440          ld hl, KonamiLogo2
4041: 3A4C40          ld a, (JumpIndex2)
4044: 77              ld (hl), a
4045: 23              inc hl
4046: 36C9            ld (hl), 0C9h ; RET opcode
4048: C3E845          jp ReadKeys
                    
                    ;----------------------------------------------------
                    ; Jump index
                    ; (SP) = Puntero a funciones
                    ;  A = Indice de la funcion
                    ;----------------------------------------------------
                    
404B =              jumpIndex:
404B: 87              add a, a
                    
404C =              JumpIndex2:
404C: E1              pop hl
404D: CD496D          call getIndexHL_A
4050: E9              jp (hl)
                    
                    
                    ;----------------------------------------------------
                    ; Igual que WriteDataVRAM pero escribiendo siempre 0
                    ;----------------------------------------------------
                    
4051 =              ClearDataVRAM:
4051: 0E00            ld c, 0  ; Mascara a aplicar con AND al byte a escribir
4053: 1802            jr writeDataVRAM2
                    
                    
                    ;----------------------------------------------------
                    ; Escribe en la VRAM datos con formato
                    ; In:
                    ;   C = Mascara AND aplicada al dato a escribir
                    ;  DE = direccion datos
                    ;  0-1: VRAM address
                    ;  2...: Datos
                    ; Datos:
                    ;  FE: next block (nueva direccion + datos)
                    ;  FF: end datos
                    ;----------------------------------------------------
                    
4055 =              WriteDataVRAM:
4055: 0EFF            ld c, 0FFh  ; Mascara a aplicar con AND al byte a escribir
                    
4057 =              writeDataVRAM2:
4057: EB              ex de, hl
4058: 5E              ld e, (hl)
4059: 23              inc hl
405A: 56              ld d, (hl)
405B: EB              ex de, hl
405C: 13              inc de
                    
405D =              writeDataVRAM3:
405D: 1A              ld a, (de)
405E: 13              inc de
405F: 47              ld b, a
4060: 04              inc b  ; Es #FF?
4061: C8              ret z  ; Fin de los datos
                    
4062: 04              inc b  ; Es #FE?
4063: 28F2            jr z, writeDataVRAM2 ; Cambia puntero a VRAM
                    
4065: A1              and c  ; Aplica mascara AND al dato a escribir en la VRAM
4066: CD4D00          call WRTVRM
4069: 23              inc hl
406A: 18F1            jr writeDataVRAM3
                    
                    ;-------------------------------------------------------------------------------
                    ;
                    ; Boot code
                    ;
                    ; Fija la rutina de interrupcion que llamara a la logica del juego cada frame
                    ; Borra el area de variables
                    ; Inicializa el hardware (modo de video, PSG)
                    ; Ejecuta un loop infinito, tipico de Konami.
                    ;-------------------------------------------------------------------------------
                    
406C =              startCode:
406C: F3              di
406D: ED56            im 1
406F: 3EC3            ld a, 0C3h
4071: 329AFD          ld (H_TIMI), a
4074: 211A40          ld hl, tickMain
4077: 229BFD          ld (H_TIMI+1), hl ; Pone la rutina de interrupcion que lleva la logica del juego
                    
407A: 3100E7          ld sp, stackTop ; Fija el lugar de la pila
407D: 2100E0          ld hl, GameStatus
4080: 1101E0          ld de, subStatus
4083: 01FF06          ld bc, 6FFh
4086: 3600            ld (hl), 0
4088: EDB0            ldir   ; Inicializa el area de variables del juego
                    
408A: 3E01            ld a, 1
408C: 3205E0          ld (tickInProgress), a ; Evita que se ejecute la logica del juego mientras se inicializa el hardware
408F: CD9B45          call initHardware ; Inicializa el modo de video y el PSG
                    
4092: AF              xor a
4093: 3205E0          ld (tickInProgress), a ; Permite que se ejecute la logica del juego en la proxima interrupcion
4096: CD3E01          call RDVDP  ; Borra el flag de interrupcion
4099: FB              ei
                    
409A =              dummyLoop:
409A: 18FE            jr $
                    
                    ;----------------------------------------------------
                    ; VRAM write con proteccion anticopia
                    ; Antes de escribir en la VRAM machaca el codigo si se ejecuta en RAM
                    ;----------------------------------------------------
                    
409C =              VRAM_writeAC:
409C: ED53C043        ld (copyProtect_+1), de ; Proteccion anticopia (!?)
40A0: C3AB44          jp setFillVRAM
                    
                    ;-------------------------------------------------------------------------------
                    ;
                    ; Tick game
                    ;
                    ;-------------------------------------------------------------------------------
                    
40A3 =              runGame:
40A3: 2103E0          ld hl, timer
40A6: 34              inc (hl)  ; Incrementa timer global del juego
                    
40A7: ED4B00E0        ld bc, (GameStatus) ;  C = Game status, B = Substatus
40AB: 3A02E0          ld a, (controlPlayer) ; bit 6 = Prota controlado por el jugador
40AE: CB77            bit 6, a  ; Se esta jugando?
40B0: 2004            jr nz, runGame2 ; Si, no esta en modo demo o en el menu
                    
40B2: 214446          ld hl, chkPushAnyKey ; Se a?de esta funcion para comprobar si se pulsa una tecla y hay que empezar una partida
40B5: E5              push hl
                    
40B6 =              runGame2:
40B6: 79              ld a, c
40B7: CD4B40          call jumpIndex
                    
40BA: D040            dw KonamiLogo  ; 0 = Muestra el logo de Konami
40BC: 0D41            dw WaitMainMenu  ; 1 = Espera en el menu. Si   no se pulsa una tecla salta a la demo
40BE: 1541            dw SetDemo  ; 2 = Prepara el modo demo
40C0: 9F42            dw iniciaPartida ; 3 = Reproduce musica inicio, parpadea PLAY START y pasa al modo de juego
40C2: 4141            dw StartGame  ; 4 = Borra menu, dibuja piramide, puerta y como entra el prota
40C4: D541            dw gameLogic  ; 5 = Logica del pergamino o del juego
40C6: F541            dw tickMuerto  ; 6 = Pierde una vida / Muestra mensaje de Game Over
40C8: 4342            dw tickGameOver  ; 7 = Game Over
40CA: 6642            dw stageClear  ; 8 = Stage clear (suma una vida y activa el pergamino)
40CC: 7B42            dw ScrollPantalla ; 9 = Scroll pantalla
40CE: 9C42            dw FinalJuego  ; 10 = Muestra el final del juego
                    
                    
                    ;----------------------------------------------------------------------------
                    ; Konami logo (0)
                    ; 0 = Inicializa logo: borra pantalla, carga graficos y pone modo grafico
                    ; 1 = Sube el logo cada 2 frames. Subraya Konami y pone el texto "SOFTWARE"
                    ; 2 = Espera un rato y borra la pantalla.
                    ; 3 = Dibuja el menu.
                    ;----------------------------------------------------------------------------
                    
40D0 =              KonamiLogo:
40D0: 1012            djnz KonamiLogo2
40D2: 3A03E0          ld a, (timer)
40D5: 1F              rra
40D6: D0              ret nc  ; Sube el logo cada dos frames
                    
40D7: CD4248          call dibujaLogo
40DA: C0              ret nz  ; Aun esta subiendo el logo
                    
40DB: 11FE47          ld de, TXT_Sofware
40DE: CD1445          call unpackGFXset ; Subraya Konami y pone texto "Software"
40E1: AF              xor a
40E2: 1855            jr UpdateSubstatus
                    
40E4 =              KonamiLogo2:
40E4: 1011            djnz KingsValleyLogo
40E6: 2104E0          ld hl, waitCounter
40E9: 35              dec (hl)
40EA: C0              ret nz  ; Espera un rato mostrando el logo
                    
40EB: CDA144          call clearScreen
40EE: CDC542          call setColor
40F1: AF              xor a
40F2: 320AE0          ld (gameLogoCnt), a ; Contador que indica que parte del logo del menu se esta pintando
40F5: 1813            jr doNextSubStatus
                    
40F7 =              KingsValleyLogo:
40F7: 1008            djnz InitLogo
40F9: CDB843          call drawGameLogo ; Dibuja el menu
40FC: D8              ret c
40FD: AF              xor a
40FE: C3AD41          jp NextGameStatus_
                    
4101 =              InitLogo:
4101: CDA144          call clearScreen
4104: CDCC42          call LoadIntroGfx
4107: CDAF45          call SetVideoMode
                    
410A =              doNextSubStatus:
410A: C33C41          jp NextSubStatus
                    
                    ;----------------------------------------------------------------------------
                    ; Menu (1)
                    ; Espera un rato y salta a la demo
                    ;----------------------------------------------------------------------------
                    
410D =              WaitMainMenu:
410D: 2104E0          ld hl, waitCounter
4110: 35              dec (hl)
4111: C0              ret nz  ; Hay que seguir esperando
                    
4112: C3AB41          jp NextGameStatusT ; Pasa al modo demo
                    
                    ;----------------------------------------------------------------------------
                    ;
                    ; Game demo (2)
                    ; Pone el status de juego e inicializa las variables de la demo
                    ;
                    ;----------------------------------------------------------------------------
                    
4115 =              SetDemo:
4115: 210400          ld hl, 4  ; Start game status, substatus = 0
4118: 2200E0          ld (GameStatus), hl
411B: 2E00            ld l, 0
411D: 2262E0          ld (PiramidesPasadas), hl ; Cada bit indica si la piramide correspondiente ya esta pasada/terminada
4120: 7D              ld a, l
4121: 3258E0          ld (numFinishGame), a ; Numero de veces que se ha terminado el juego
                    
4124: CD1743          call setDatosPartida
                    
4127: 210508          ld hl, 805h ; Piramide 5, puerta de la derecha
412A: 2255E0          ld (piramideDest), hl
                    
412D: 21CE4A          ld hl, DemoKeyData ; Controles grabados de la demo
4130: 2280E0          ld (keyPressDemo), hl ; Puntero a los controles grabados
                    
4133: 3E08            ld a, 8
4135: 3282E0          ld (KeyHoldCntDemo), a
4138: C9              ret
                    
4139 =              UpdateSubstatus:
4139: 3204E0          ld (waitCounter), a
                    
413C =              NextSubStatus:
413C: 2101E0          ld hl, subStatus
413F: 34              inc (hl)
                    
4140 =              doNothing:
4140: C9              ret
                    
                    ;----------------------------------------------------------------------------
                    ;
                    ; Start game (4)
                    ;
                    ;
                    ;----------------------------------------------------------------------------
                    
4141 =              StartGame:
4141: 3A51E0          ld a, (flagPiramideMap) ; 0 = Mostrando mapa, 1 = Dentro de la piramide
4144: 1F              rra   ; Se esta mostrando el mapa de piramides?
4145: D2B941          jp nc, showMap
                    
4148: 78              ld a, b  ; Substatus
4149: B7              or a  ; Si es igual a cero esta haciendo la cortinilla desde el menu
414A: 2805            jr z, waitEntrada ; No dibuja el brillo de las gemas
                    
414C: C5              push bc
414D: CDE44B          call drawBrilloGemas ; Dibuja el brillo de las gemas
4150: C1              pop bc
                    
                    ; Sub1: Espera en las escaleras de la entrada
                    
                    
4151 =              waitEntrada:
4151: 1007            djnz bajaEscaleras
4153: 2104E0          ld hl, waitCounter
4156: 35              dec (hl)
4157: C0              ret nz
4158: 18DF            jr UpdateSubstatus
                    
                    ; Sub2: Baja por las escaleras
                    
415A =              bajaEscaleras:
415A: 1030            djnz initStage2
415C: CD754B          call updateSprites
415F: C3F06D          jp escalerasEntrada
                    
                    
                    
                    ;-------------------------------------------------------------------------------
                    ; Se ejecuta tras perder una vida o al empezar una partida.
                    ; Borra lo que hay en pantalla con una cortinilla negra de izquierda a derecha.
                    ; Substatus = 0
                    ;-------------------------------------------------------------------------------
                    
4162 =              InitStage:
4162: CD3043          call drawCortinilla
4165: F0              ret p
                    
                    
4166: CD5643          call hideSprAttrib ; Quita sprites de la pantalla
4169: 2150E0          ld hl, Vidas
416C: 35              dec (hl)  ; Quita una vida
                    
416D: 3A5EE0          ld a, (flagMuerte)
4170: B7              or a
4171: 2000            jr nz, dummyJump ; (!?)
                    
4173 =              dummyJump:    ; Descomprime graficos y mapa con todos los elementos
4173: CD2A43          call unpackStage
4176: CDEA65          call AI_Salidas ; Pinta la salida abierta
4179: CDCB6E          call setSprDoorProta
417C: CDFA4C          call setAttribProta ; Actualiza atributos de los sprites del prota
417F: CD754B          call updateSprites ; Actualiza attributos de los sprites (RAM->VRAM)
4182: CDCB6C          call setupRoom ; Pinta pantalla
4185: CD0444          call renderHUD ; Dibuja el marcador, puntos, vidas
4188: 3E10            ld a, 10h
418A: 18AD            jr UpdateSubstatus
                    
                    ; Sub3: Comienza la fase
                    
418C =              initStage2:
418C: 10D4            djnz InitStage
                    ; Ha bajado las escaleras y ya se ha cerrado la puerta
418E: 2104E0          ld hl, waitCounter
4191: 35              dec (hl)
4192: C0              ret nz
                    
4193: AF              xor a
4194: 3233E1          ld (flagStageClear), a
4197: CDEA65          call AI_Salidas
                    
419A: 3A02E0          ld a, (controlPlayer) ; bit 6 = Prota controlado por el jugador
419D: CB77            bit 6, a
419F: 2805            jr z, initStage3
                    
41A1: 3E8B            ld a, 8Bh  ; Ingame music
41A3: CDA97A          call setMusic
                    
41A6 =              initStage3:
41A6: 2153E0          ld hl, flagVivo
41A9: 3601            ld (hl), 1
                    
41AB =              NextGameStatusT:
41AB: 3E20            ld a, 20h
                    
41AD =              NextGameStatus_:
41AD: 3204E0          ld (waitCounter), a
                    
41B0 =              NextGameStatus:
41B0: 2100E0          ld hl, GameStatus
41B3: 34              inc (hl)
                    
41B4 =              ResetSubStatus:
41B4: AF              xor a
41B5: 3201E0          ld (subStatus), a
41B8: C9              ret
                    
41B9 =              showMap:
41B9: 100D            djnz doCortinilla
41BB: 2104E0          ld hl, waitCounter
41BE: 35              dec (hl)
41BF: C0              ret nz
                    
41C0: CD0744          call renderMarcador
41C3: CD4877          call setupPergamino
41C6: 18DE            jr initStage3
                    
41C8 =              doCortinilla:
41C8: CD3043          call drawCortinilla
41CB: F0              ret p
                    
41CC: 2150E0          ld hl, Vidas
41CF: 35              dec (hl)
41D0: 3E01            ld a, 1
41D2: C33941          jp UpdateSubstatus
                    
                    ;----------------------------------------------------
                    ;
                    ; Logica del juego
                    ;
                    ;----------------------------------------------------
                    
41D5 =              gameLogic:
41D5: 3A51E0          ld a, (flagPiramideMap) ; 0 = Mostrando mapa, 1 = Dentro de la piramide
41D8: 1F              rra   ; Esta en modo juego o mapa?
41D9: F5              push af
41DA: DC0C4B          call c, tickGame ; Logica del juego
41DD: F1              pop af
41DE: D4C377          call nc, tickPergamino ; Logica del pergamino
                    
41E1: 3A0DE0          ld a, (flagEndPergamino) ; 1 = Ha terminado de mostar el pergamino/mapa
41E4: B7              or a
41E5: 2807            jr z, chkVivo
                    
41E7: 3E07            ld a, 7
41E9: 3200E0          ld (GameStatus), a
41EC: 18C2            jr NextGameStatus
                    
41EE =              chkVivo:
41EE: 3A53E0          ld a, (flagVivo)
41F1: B7              or a  ; Esta vivo?
41F2: C0              ret nz  ; Si
41F3: 18B6            jr NextGameStatusT ; No, pasa al siguiente status
                    
                    ;----------------------------------------------------
                    ;
                    ; Pierde una vida / Muestra Game over
                    ;
                    ;----------------------------------------------------
                    
41F5 =              tickMuerto:
41F5: 3A10E0          ld a, (MusicChanData)
41F8: B7              or a
41F9: C0              ret nz  ; Esta sonando la musica de muerte
                    
41FA: 3A02E0          ld a, (controlPlayer) ; bit 6 = Prota controlado por el jugador
41FD: CB77            bit 6, a  ; Esta en modo demo?
41FF: 2004            jr nz, pierdeVida
                    
4201: AF              xor a
4202: C33842          jp setGameStatus ; Reinicia el juego al morir en el modo demo
                    
4205 =              pierdeVida:
4205: 3A50E0          ld a, (Vidas)
4208: B7              or a
4209: 202B            jr nz, setGameMode
                    
                    ; Borra el area donde se imprimira el mensaje de GAME OVER
420B: AF              xor a
420C: 212939          ld hl, 3929h
420F: 0605            ld b, 5
                    
4211 =              clrGameOverArea:
4211: C5              push bc
4212: AF              xor a
4213: 010C00          ld bc, 0Ch
4216: CDAB44          call setFillVRAM
4219: 3E20            ld a, 20h
421B: CD1040          call ADD_A_HL
421E: C1              pop bc
421F: 10F0            djnz clrGameOverArea
                    
4221: 3E9A            ld a, 9Ah  ; Musica de GAME OVER
4223: CDA97A          call setMusic
                    
4226: 11F247          ld de, TXT_GameOver
4229: CD5540          call WriteDataVRAM ; Imprime mensaje de GAME OVER
                    
422C: 3E06            ld a, 6
422E: 3200E0          ld (GameStatus), a ; (!?) Para que pone esto si en la siguiente llamada se cambia?
4231: 3EB8            ld a, 0B8h
4233: C3AD41          jp NextGameStatus_ ; Pasa al estado de Game Over
                    
4236 =              setGameMode:
4236: 3E04            ld a, 4  ; Empezando la partida
                    
4238 =              setGameStatus:
4238: 3200E0          ld (GameStatus), a
423B: 3E20            ld a, 20h
423D: 3204E0          ld (waitCounter), a
4240: C3B441          jp ResetSubStatus
                    
                    ;----------------------------------------------------
                    ;
                    ; Logica del Game Over
                    ; Hace una pausa suficientemente larga como para que termine la musica
                    ; Si se esta pulsando alguna direccion vuelve al menu. De lo contrario muestra el logo de Konami.
                    ;
                    ;----------------------------------------------------
                    
4243 =              tickGameOver:
4243: 2103E0          ld hl, timer
4246: 7E              ld a, (hl)
4247: E601            and 1
4249: C8              ret z  ; Procesa una de cada dos iteraciones
                    
424A: 23              inc hl
424B: 35              dec (hl)
424C: C0              ret nz  ; Decrementa el tiempo de espera
                    
424D: CD4446          call chkPushAnyKey ; Comprueba si se pulsa una tecla para volver al menu
                    
4250: 3A00E0          ld a, (GameStatus)
4253: FE07            cp 7  ; Modo Game Over?
4255: 1102E0          ld de, controlPlayer ; bit 6 = Prota controlado por el jugador
4258: 2805            jr z, reiniciaJuego
                    
425A: 1A              ld a, (de)
425B: E6BF            and 10111111b ; Borra el bit 6
425D: 12              ld (de), a
425E: C9              ret
                    
425F =              reiniciaJuego:
425F: 1A              ld a, (de)
4260: E6BF            and 10111111b ; Borra el bit 6
4262: 12              ld (de), a
4263: AF              xor a
4264: 18D2            jr setGameStatus ; Muestra el logo de Konami
                    
                    ;----------------------------------------------------
                    ;
                    ; Stage clear
                    ;
                    ; Silencia el sonido, incrementa la vidas y activa el pergamino
                    ;
                    ;----------------------------------------------------
                    
4266 =              stageClear:
4266: 3E20            ld a, 20h  ; Silencio
4268: CDA97A          call setMusic
                    
426B: 2150E0          ld hl, Vidas
426E: 34              inc (hl)  ; Incrementa las vidas
426F: 23              inc hl
4270: 7E              ld a, (hl)
4271: C601            add a, 1
4273: 27              daa
4274: 77              ld (hl), a  ; Activa pergamino/mapa
4275: AF              xor a
4276: 320DE0          ld (flagEndPergamino), a ; 1 = Ha terminado de mostar el pergamino/mapa
4279: 18BB            jr setGameMode
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Scroll de la pantalla
                    ; Mueve la pantalla y actualiza la posicion del prota
                    ; al cambiar de una habitacion a otra
                    ;
                    ;----------------------------------------------------
                    
427B =              ScrollPantalla:
427B: CD195D          call tickScroll
427E: D8              ret c  ; No ha terminado el scroll
                    
427F: 2100E0          ld hl, GameStatus
4282: 3605            ld (hl), 5  ; Modo = jugando
4284: 3A36E1          ld a, (sentidoProta) ; 1 = Izquierda, 2 = Derecha
4287: 1F              rra
4288: 3A3AE1          ld a, (ProtaRoom) ; Parte alta de la coordenada X. Indica la habitacion de la piramide
428B: 0EF0            ld c, 0F0h  ; Coordena X del prota en la parte derecha de la pantalla
428D: 47              ld b, a
428E: 05              dec b  ; Mueve el prota una pantalla a la izquierda
428F: 3804            jr c, scrollPantalla2
4291: 04              inc b
4292: 04              inc b  ; Mueve el prota una pantalla a la derecha
4293: 0E04            ld c, 4  ; Coordenada X en la parte izquierda
                    
4295 =              scrollPantalla2:
4295: ED4339E1        ld (ProtaX), bc ; Coloca al prota en la posicion correcta
4299: C3FA4C          jp setAttribProta ; Actualiza atributos de los sprites del prota
                    
                    ;----------------------------------------------------
                    ;
                    ; Game ending
                    ;
                    ;----------------------------------------------------
                    
429C =              FinalJuego:
429C: C3BD75          jp ShowEnding
                    
                    ;----------------------------------------------------
                    ;
                    ; Inicia una partida
                    ;
                    ; - Reproduce musica de inicio de partida
                    ; - Parpadea PLAY START
                    ; - Inicia las variables de la partida y pasa el estado de juego
                    ;
                    ;----------------------------------------------------
                    
429F =              iniciaPartida:
429F: 1017            djnz PlayIntroMusic
42A1: 2104E0          ld hl, waitCounter
42A4: 35              dec (hl)
42A5: 280B            jr z, ComienzaPartida
                    
42A7: CB56            bit 2, (hl)  ; Parpadea cada 4 frames
42A9: 11E147          ld de, TXT_PLAY_START
42AC: C25140          jp nz, ClearDataVRAM ; Borra texto
                    
42AF: C35540          jp WriteDataVRAM ; Muestra "PLAY START"
                    
42B2 =              ComienzaPartida:
42B2: CD0A43          call IniciaDatosPartida
42B5: C3AB41          jp NextGameStatusT
                    
42B8 =              PlayIntroMusic:
42B8: 3E97            ld a, 97h  ; Musica de incio de partida
42BA: CDA97A          call setMusic
42BD: 3E50            ld a, 50h
42BF: 3204E0          ld (waitCounter), a
42C2: C33C41          jp NextSubStatus
                    
                    
                    ;----------------------------------------------------
                    ;
                    ;----------------------------------------------------
                    
42C5 =              setColor:
42C5: 06E0            ld b, 0E0h
42C7: 0E07            ld c, 7
42C9: C34700          jp WRTVDP
                    
                    ;----------------------------------------------------
                    ;
                    ; Cargar graficos del logo de Konami, la fuente y el menu
                    ;
                    ;----------------------------------------------------
                    
42CC =              LoadIntroGfx:
42CC: CD2348          call loadKonamiLogo ; Logo de Konami
                      
42CF: CDCF44          call loadFont ; Fuente
                      
42D2: 210800          ld hl, 8
42D5: 11A747          ld de, GFX_Space ; Espacio en blanco
42D8: CDF144          call UnpackPatterns ; Patron de espacio en blanco
                    
42DB =              setGfxMenu:
42DB: 110B49          ld de, GFX_Menu ; Logo de King's Valley y piramide del menu
42DE: 218024          ld hl, 2480h ; BG char
42E1: CDF144          call UnpackPatterns
                    
42E4: 11974A          ld de, ATTRIB_Menu ; Atributos de color de la piramide del menu
42E7: 218004          ld hl, 480h ; BG Attrib
42EA: CDF144          call UnpackPatterns
                    
42ED: 21D844          ld hl, 44D8h ; #4D8 = Tabla de color del logo
42F0: 0616            ld b, 16h
                    
42F2 =              coloreaLogo:
42F2: C5              push bc
42F3: E5              push hl
42F4: 11AB4A          ld de, COLORES_LOGO ; Atributos de color del logo de King's Valley del menu
42F7: CDF144          call UnpackPatterns
42FA: E1              pop hl
42FB: 011000          ld bc, 10h
42FE: 09              add hl, bc
42FF: C1              pop bc
4300: 10F0            djnz coloreaLogo
                    
4302: 3E40            ld a, 40h  ; Color
4304: 011000          ld bc, 10h  ; Bytes a rellenar
4307: C3E044          jp fillVRAM3Bank
                    
                    
                    ;----------------------------------------------------
                    ; Inicializa las variables para una partida nueva
                    ;----------------------------------------------------
                    
430A =              IniciaDatosPartida:
430A: 2149E0          ld hl, score_0000xx
430D: 01E700          ld bc, 0E7h
4310: 54              ld d, h
4311: 5D              ld e, l
4312: 1C              inc e
4313: 3600            ld (hl), 0
4315: EDB0            ldir
                    
                    ;----------------------------------------------------
                    ;
                    ; Inicializa los valores para una partida nueva
                    ;
                    ;----------------------------------------------------
                    
4317 =              setDatosPartida:
4317: 212343          ld hl, ValoresIniciales
431A: 1150E0          ld de, Vidas
431D: 010700          ld bc, 7
4320: EDB0            ldir
4322: C9              ret
4323: 05            ValoresIniciales:db     5
                         ; Vidas
4324: 01              db      1  ; No muestra el pergamino
4325: 00              db      0  ; Contador de vidas extra
4326: 02              db      2  ; Flag vivo
4327: 01              db      1  ; Piramide actual
4328: 01              db      1  ; Piramide destino
4329: 08              db      8  ; Direccion de la flecha
                    
                    ;----------------------------------------------------
                    ;
                    ; Carga los graficos y prepara la piramide actual
                    ;
                    ;----------------------------------------------------
                    
432A =              unpackStage:
432A: CDEE4F          call loadGameGfx ; Carga los graficos y sprites
432D: C3A36A          jp setupStage ; Descomprime el mapa actual
                    
                    ;----------------------------------------------------
                    ; Cortinilla vertical
                    ;----------------------------------------------------
                    
4330 =              drawCortinilla:
4330: 2103E0          ld hl, timer
4333: 35              dec (hl)
4334: 23              inc hl
4335: 35              dec (hl)
4336: F8              ret m
                      
4337: 7E              ld a, (hl)
4338: 2638            ld h, 38h  ; #3800 es el area del BG map
433A: EE1F            xor 1Fh
433C: 6F              ld l, a
433D: 0618            ld b, 18h  ; Numero de patrones a escribir verticales
433F: AF              xor a
                    
4340 =              drawCortinilla2:
4340: CD4D00          call WRTVRM
4343: 112000          ld de, 20h
4346: 19              add hl, de  ; Siguiente columna
4347: 10F7            djnz drawCortinilla2
                    
                    
                    ;----------------------------------------------------
                    ; Borra los atributos de los sprites de la VRAM
                    ;----------------------------------------------------
                    
4349 =              HideSprites:
4349: 21003B          ld hl, 3B00h ; Sprite attribute area
434C: 018000          ld bc, 80h  ; Numero de bytes a rellenar (32 sprites * 4 bytes)
434F: 3EC3            ld a, 0C3h  ; Valor a rellenar
4351: CDAB44          call setFillVRAM
4354: AF              xor a
4355: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Oculta los sprites colocando su coordenada Y de los
                    ; atributos RAM en #E1
                    ;----------------------------------------------------
                    
4356 =              hideSprAttrib:
4356: 0620            ld b, 20h
                    
4358 =              hideSprAttrib2:
4358: 21B0E0          ld hl, sprAttrib ; Tabla de atributos de los sprites en RAM (Y, X, Spr, Col)
                    
435B =              hideSprAttrib3:
435B: 36E1            ld (hl), 0E1h
435D: 23              inc hl
435E: 23              inc hl
435F: 23              inc hl
4360: 23              inc hl
4361: 10F8            djnz hideSprAttrib3
4363: C9              ret
                    
                    ;----------------------------------------------------
                    ; Quita momias
                    ;----------------------------------------------------
                    
4364 =              quitaMomias:
4364: 21C8E0          ld hl, enemyAttrib
4367: 060A            ld b, 0Ah
4369: 18F0            jr hideSprAttrib3
                    
                    
                    ;----------------------------------------------------
                    ; Dibuja los textos
                    ; (C) KONAMI PYRAMID-xx
                    ; El numero de la piramide se calcula:
                    ; veces que se ha terminado el juego * 15 + piramide actual
                    ;----------------------------------------------------
                    
436B =              drawPyramidNumber:
436B: 110E48          ld de, TXT_KONAMI_PYR
436E: CD5540          call WriteDataVRAM
4371: 3A58E0          ld a, (numFinishGame) ; Numero de veces que se ha terminado el juego
4374: 47              ld b, a
4375: 87              add a, a
4376: 87              add a, a
4377: 87              add a, a
4378: 87              add a, a
4379: 90              sub b  ; x15
437A: 47              ld b, a
437B: 3A54E0          ld a, (piramideActual)
437E: 80              add a, b
437F: 21F33A          ld hl, 3AF3h ; Coordenadas
4382: C38B43          jp drawDigit
                    
                    
                    ;----------------------------------------------------
                    ; Dibuja el numero de vidas
                    ;----------------------------------------------------
                    
4385 =              dibujaVidas:
4385: 211D38          ld hl, 381Dh ; VRAM address name table = coordendas de las vidas
4388: 3A50E0          ld a, (Vidas)
                    
438B =              drawDigit:
438B: CD9343          call convDecimal
438E: 0601            ld b, 1
4390: C37D44          jp renderNumber3
                    
                    ;----------------------------------------------------
                    ; Convierte un valor a decimal
                    ;----------------------------------------------------
                    
4393 =              convDecimal:
4393: 47              ld b, a
4394: D664            sub 64h
4396: 30FB            jr nc, convDecimal
4398: 0E00            ld c, 0
                    
439A =              convDecimal2:
439A: 78              ld a, b
439B: D60A            sub 0Ah
439D: 3809            jr c, convDecimal3
439F: F5              push af
43A0: 79              ld a, c
43A1: C610            add a, 10h
43A3: 4F              ld c, a
43A4: F1              pop af
43A5: 47              ld b, a
43A6: 20F2            jr nz, convDecimal2
                    
43A8 =              convDecimal3:
43A8: 79              ld a, c
43A9: B0              or b
43AA: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Setup menu
                    ;----------------------------------------------------
                    
43AB =              SetUpMenu:
43AB: CDDB42          call setGfxMenu ; Carga los graficos del logo del menu
43AE: AF              xor a
43AF: 320AE0          ld (gameLogoCnt), a
                    
43B2 =              loopDrawLogo:
43B2: CDB843          call drawGameLogo
43B5: 38FB            jr c, loopDrawLogo
43B7: C9              ret
                    ;---------------------------------------------------
                    ;
                    ; Dibuja el logo de KING'S VALLEY del menu
                    ; Lo hace pintando columna a columna cada palabra
                    ;
                    ;---------------------------------------------------
                    
43B8 =              drawGameLogo:
43B8: 210AE0          ld hl, gameLogoCnt ; Contador para saber que parte del logo del menu se esta pintado
43BB: 7E              ld a, (hl)
43BC: 34              inc (hl)
43BD: FE16            cp 16h  ; Ha terminado de pintar KING'S VALLEY?
                    
43BF =              copyProtect_:
43BF: D2F043          jp nc, drawMenuEnd
43C2: 21A738          ld hl, 38A7h ; Coordenadas de KING'S
43C5: FE09            cp 9  ; Ha terminado de pintar "KING'S"?
43C7: 3803            jr c, drawGameLogo2
43C9: 210439          ld hl, 3904h ; Coordenadas de VALLEY
                    
43CC =              drawGameLogo2:
43CC: 4F              ld c, a
43CD: 85              add a, l
43CE: 6F              ld l, a
43CF: 79              ld a, c
43D0: 87              add a, a
43D1: C69B            add a, 9Bh  ; #9B es el primer patron que forma el logo. KING'S(#9B-#AC), VALLEY(#AD-C6)
43D3: 4F              ld c, a
43D4: 0602            ld b, 2  ; Numero de patrones a pintar por iteracion
                    
43D6 =              drawGameLogo3:
43D6: 79              ld a, c
43D7: CD4D00          call WRTVRM
43DA: 3E20            ld a, 20h  ; Incrementa la coordenada Y (siguiente fila de patrones)
43DC: CD1040          call ADD_A_HL
43DF: 0C              inc c
43E0: 10F4            djnz drawGameLogo3
                    
43E2: 7D              ld a, l
43E3: D6EC            sub 0ECh  ; Nametable + #EC = Parte de abajo de la G
43E5: FE02            cp 2
43E7: 3005            jr nc, drawGameLogo4
43E9: C6C7            add a, 0C7h  ; Patron parte de abajo de la G de KING'S
43EB: CD4D00          call WRTVRM
                    
43EE =              drawGameLogo4:
43EE: 37              scf
43EF: C9              ret
                    
43F0 =              drawMenuEnd:
43F0: 11C147          ld de, TXT_MainMenu
43F3: CD5540          call WriteDataVRAM ; Imprime "KONAMI 1985" y "PUSH SPACE KEY"
                    
43F6: 11BC4A          ld de, GFX_PiramidLogo
43F9: 219238          ld hl, 3892h ; Coordenadas
43FC: 010603          ld bc, 306h ; Alto x ancho
43FF: CDC865          call DEtoVRAM_NXNY
4402: AF              xor a
4403: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Muestra informacion pantalla: marcador, vidas
                    ;----------------------------------------------------
                    
4404 =              renderHUD:
4404: CD6B43          call drawPyramidNumber
                    
4407 =              renderMarcador:
4407: 11AA47          ld de, TXT_Marcador ; "REST SCORE"
440A: CD5540          call WriteDataVRAM
440D: CD8543          call dibujaVidas
4410: 1859            jr renderRecord
                    
                    ;----------------------------------------------------
                    ; Actualiza la puntuacion y el record
                    ;
                    ; DE = Puntos a sumar
                    ; A los 10000 puntos vida extra
                    ; Luego cada 20000
                    ;----------------------------------------------------
                    
4412 =              SumaPuntos:
4412: 3A02E0          ld a, (controlPlayer) ; bit 6 = Prota controlado por el jugador
4415: 87              add a, a
4416: F0              ret p  ; Esta en modo demo, no suma puntos
                    
4417: 2149E0          ld hl, score_0000xx
441A: 7E              ld a, (hl)
441B: 83              add a, e
441C: 27              daa
441D: 77              ld (hl), a  ; Actualiza unidades/decenas
                    
441E: 5F              ld e, a
441F: 2C              inc l
4420: 7E              ld a, (hl)
4421: 8A              adc a, d  ; Suma el acarreo de la anterior operacion
4422: 27              daa
4423: 77              ld (hl), a  ; Actualiza centenas/unidades de millar
                    
4424: 57              ld d, a
4425: 23              inc hl
4426: 302B            jr nc, setRecord ; No han cambiado la decenas de millar
                    
4428: 7E              ld a, (hl)
4429: C601            add a, 1  ; Incrementa decenas de millar x0000
442B: 27              daa
442C: 77              ld (hl), a
442D: 300D            jr nc, chkExtraLife ; Comprueba si obtiene una vida extra
                    
442F: 019999          ld bc, 9999h ; Maxima puntuacion posible
4432: ED4343E0        ld (record_0000xx), bc
4436: ED4344E0        ld (record_0000xx+1), bc ; Recors = 999999
443A: 182F            jr renderRecord
                    
443C =              chkExtraLife:
443C: 3A52E0          ld a, (extraLifeCounter)
443F: BE              cp (hl)
4440: 3011            jr nc, setRecord
                    
4442: D5              push de
4443: E5              push hl
4444: C602            add a, 2  ; Cada 20000 puntos
4446: 27              daa
4447: 3002            jr nc, chkExtraLife2
4449: 3EFF            ld a, 0FFh
                    
444B =              chkExtraLife2:
444B: 3252E0          ld (extraLifeCounter), a ; Siguiente multiplo de 10.000 en el que obtendra una vida extra
444E: CDAC6E          call VidaExtra ; Suma vida extra
4451: E1              pop hl
4452: D1              pop de
                    
4453 =              setRecord:
4453: 3A45E0          ld a, (record_xx0000)
4456: 46              ld b, (hl)
4457: 90              sub b
4458: 3809            jr c, setRecord2 ; La puntuacion es mayor que el record actual. Actualiza el record
                    
445A: 2018            jr nz, renderScore ; Es menor
                    
445C: 2A43E0          ld hl, (record_0000xx)
445F: ED52            sbc hl, de
4461: 3011            jr nc, renderScore
                    
4463 =              setRecord2:
4463: ED5343E0        ld (record_0000xx), de
4467: 78              ld a, b
4468: 3245E0          ld (record_xx0000), a
                    
446B =              renderRecord:
446B: 1145E0          ld de, record_xx0000
446E: 211138          ld hl, 3811h ; Coordenadas / Direccion VRAM
4471: CD7A44          call renderNumber
                    
4474 =              renderScore:
4474: 210738          ld hl, 3807h ; Coordenadas / Direccion VRAM
4477: 114BE0          ld de, score_xx0000
                    
447A =              renderNumber:
447A: 0603            ld b, 3  ; Imprime 3 pares de numeros (cada byte son dos numeros)
                    
447C =              renderNumber2:
447C: 1A              ld a, (de)
                    
447D =              renderNumber3:
447D: C5              push bc
447E: CD9444          call AL_C__AH_B ; Copia el nibble alto de A en B y el bajo en C
4481: 78              ld a, b
4482: C610            add a, 10h  ; Numero de patron que corresponde con el '0'
4484: CD4D00          call WRTVRM
                    
4487: 23              inc hl  ; Incrementa la coordenada X
4488: 79              ld a, c
4489: C610            add a, 10h  ; Numero de patron que corresponde con el '0'
448B: CD4D00          call WRTVRM
                    
448E: 1B              dec de  ; Siguiente pareja (byte)
448F: 23              inc hl  ; Siguiente posicion VRAM
4490: C1              pop bc
4491: 10E9            djnz renderNumber2
4493: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Copia el nibble alto de A en B y el bajo en C
                    ;----------------------------------------------------
                    
4494 =              AL_C__AH_B:
4494: F5              push af  ; Copia el nibble alto de A en B y el bajo en C
4495: 1F              rra
4496: 1F              rra
4497: 1F              rra
4498: 1F              rra
4499: E60F            and 0Fh
449B: 47              ld b, a
449C: F1              pop af
449D: E60F            and 0Fh
449F: 4F              ld c, a
44A0: C9              ret
                    
                    ;----------------------------------------------------
                    ;
                    ; Borra la pantalla
                    ;
                    ; Oculta los sprites y borra la tabla de nombres
                    ;
                    ;----------------------------------------------------
                    
44A1 =              clearScreen:
44A1: CD4943          call HideSprites
44A4: 210078          ld hl, 7800h ; Tabla de nombres (#3800) VRAM = 16K #0000-#3FFF
44A7: 010003          ld bc, 300h ; Name table size
44AA: AF              xor a
                    
                    ;----------------------------------------------------
                    ; Rellena la VRAM
                    ; HL = Direccion VRAM
                    ; A = Dato
                    ; BC = Numero de bytes
                    ;----------------------------------------------------
                    
44AB =              setFillVRAM:
44AB: CD3645          call setVDPWrite
                    
44AE =              fillVRAM:
44AE: 08              ex af, af`
                    
44AF =              VRAM_write2:
44AF: 08              ex af, af`
44B0: D9              exx
44B1: ED79            out (c), a
44B3: D9              exx
44B4: 08              ex af, af`
44B5: 0B              dec bc
44B6: 78              ld a, b
44B7: B1              or c
44B8: 20F5            jr nz, VRAM_write2
44BA: 08              ex af, af`
44BB: C9              ret
                    
                    ;----------------------------------------------------
                    ; Rellena BC bytes de VRAM con el dato (DE)
                    ;----------------------------------------------------
                    
44BC =              fillVRAM_DE:
44BC: 1A              ld a, (de)
44BD: 13              inc de
44BE: 18EE            jr fillVRAM
                    
                    ;----------------------------------------------------
                    ;
                    ; Transfiere datos desde la RAM a la VRAM
                    ; HL = Direccion de destino en la VRAM
                    ; DE = Origen
                    ; BC = Numero de datos
                    ;
                    ;----------------------------------------------------
                    
44C0 =              DEtoVRAMset:
44C0: CD3645          call setVDPWrite
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Transfiere datos desde la RAM a la VRAM
                    ; DE = Origen
                    ; BC = Numero de datos
                    ;
                    ;----------------------------------------------------
                    
44C3 =              DEtoVRAM:
44C3: 1A              ld a, (de)
44C4: D9              exx
44C5: ED79            out (c), a
44C7: D9              exx
44C8: 13              inc de
44C9: 0B              dec bc
44CA: 78              ld a, b
44CB: B1              or c
44CC: 20F5            jr nz, DEtoVRAM
44CE: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Carga la fuente y rellena la tabla de color
                    ;----------------------------------------------------
                    
44CF =              loadFont:
44CF: 117D46          ld de, GFX_Font
44D2: 218020          ld hl, 2080h ; Pattern generator table addres (pattern 16)
44D5: CDF144          call UnpackPatterns
                    
44D8: 3EF0            ld a, 0F0h  ; Color blanco sobre negro
44DA: 218000          ld hl, 80h  ; Color table address (tile 16)
44DD: 018001          ld bc, 180h ; Numero de bytes a rellenar
                    
44E0 =              fillVRAM3Bank:
44E0: 1603            ld d, 3
                    
44E2 =              fillVRAM3Bank2:
44E2: C5              push bc
44E3: D5              push de
44E4: CDAB44          call setFillVRAM ; Rellena la tabla de color
44E7: 110008          ld de, 800h ; Siguiente banco
44EA: 19              add hl, de
44EB: D1              pop de
44EC: C1              pop bc
44ED: 15              dec d
44EE: 20F2            jr nz, fillVRAM3Bank2
44F0: C9              ret
                    ;----------------------------------------------------
                    ;
                    ; Descomprime datos de la tabla de patrones o de colores
                    ; en los tres bancos de la pantalla
                    ;
                    ;----------------------------------------------------
                    
44F1 =              UnpackPatterns:
44F1: 0603            ld b, 3
                    
44F3 =              setPatternDatax_:
44F3: C5              push bc
44F4: D5              push de
44F5: CD1A45          call unpackGFX
44F8: 110008          ld de, 800h ; Siguiente banco
44FB: 19              add hl, de
44FC: D1              pop de
44FD: C1              pop bc
44FE: 10F3            djnz setPatternDatax_
4500: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; (!?) Codigo no usado!!
                    ;----------------------------------------------------
4501: D9              exx
4502: 0603            ld b, 3
                    
4504 =              loc_4504:
4504: D9              exx
4505: C5              push bc
4506: D5              push de
4507: CDC044          call DEtoVRAMset
450A: 110008          ld de, 800h
450D: 19              add hl, de
450E: D1              pop de
450F: C1              pop bc
4510: D9              exx
4511: 10F1            djnz loc_4504
4513: C9              ret
                    
                    ;----------------------------------------------------
                    ; DE:
                    ; +0 DW direccion VRAM donde descomprimir
                    ;
                    ;----------------------------------------------------
                    
4514 =              unpackGFXset:
4514: EB              ex de, hl
4515: 5E              ld e, (hl)
4516: 23              inc hl
4517: 56              ld d, (hl)
4518: EB              ex de, hl  ; HL = Direccion de la VRAM
4519: 13              inc de
                    ;---------------------------------------------------------------
                    ; Interpreta los datos graficos
                    ;
                    ; DE = Datos a interpretar
                    ; HL = VRAM address
                    ;
                    ; +0: Numero de veces a repetir un dato
                    ; +1: Dato a repetir
                    ;
                    ; Si el bit7 del numero de veces a repetir esta activo:
                    ; +0: Cantidad de bytes a transferir a VRAM
                    ; +1: Datos a transferir
                    ;
                    ; 0 = Fin de datos
                    ;---------------------------------------------------------------
                    
                    
451A =              unpackGFX:
451A: CD3645          call setVDPWrite
                    
451D =              unpackGFX2:
451D: 1A              ld a, (de)
451E: E67F            and 7Fh
4520: 4F              ld c, a
4521: 1A              ld a, (de)
4522: 13              inc de
4523: 2004            jr nz, unpackGFX3
4525: B9              cp c
4526: 20EC            jr nz, unpackGFXset ; Cambia a una nueva posicion en la VRAM
4528: C9              ret
                    
4529 =              unpackGFX3:
4529: 0600            ld b, 0
452B: B9              cp c
452C: F5              push af
452D: C4C344          call nz, DEtoVRAM ; Transfiere desde DE a VRAM (BC bytes)
4530: F1              pop af
4531: CCBC44          call z, fillVRAM_DE
4534: 18E7            jr unpackGFX2
                    
                    ;----------------------------------------------------
                    ; Prepara el VDP para escritura
                    ;----------------------------------------------------
                    
4536 =              setVDPWrite:
4536: 08              ex af, af`
4537: CD5300          call SETWR
453A: D9              exx
453B: 3A0600          ld a, (byte_6)
453E: 4F              ld c, a
453F: D9              exx
4540: 08              ex af, af`
4541: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ;(!?) Codigo no usado
                    ;----------------------------------------------------
4542: CD5000          call SETRD  ; Prepara el VDP para lectura
4545: D9              exx
4546: 3A0700          ld a, (byte_7)
4549: 4F              ld c, a
454A: D9              exx
454B: C9              ret
                    
                    ;----------------------------------------------------
                    ; Invierte un sprite
                    ; HL = Direccion VRAM original
                    ; DE = Direccion VRAM invertido
                    ;----------------------------------------------------
                    
454C =              flipSprites:
454C: D5              push de
                    
454D =              flipSprite2:
454D: 0610            ld b, 10h
                    
454F =              flipSprite3:
454F: CD8F45          call InviertePatron
4552: 23              inc hl
4553: 1C              inc e
4554: 10F9            djnz flipSprite3
                    
4556: 7B              ld a, e
4557: D620            sub 20h
4559: 5F              ld e, a
455A: CB63            bit 4, e
455C: 28EF            jr z, flipSprite2
                    
455E: D1              pop de
455F: 3E20            ld a, 20h
4561: CD1540          call ADD_A_DE
4564: 0D              dec c
4565: 20E5            jr nz, flipSprites
4567: C9              ret
                    
                    ;----------------------------------------------------
                    ; Invierte patrones
                    ; HL = Direccion VRAM patrones originales
                    ; DE = Direccion VRAM patrones invertido
                    ; C = Numero de patrones a invertir
                    ;----------------------------------------------------
                    
4568 =              FlipPatrones:
4568: 0603            ld b, 3  ; Numero de bancos de tiles
                    
456A =              flipPatron2:
456A: C5              push bc
456B: E5              push hl
456C: D5              push de
                    
456D =              flipPatron3:
456D: 0608            ld b, 8
                    
456F =              flipPatron4:
456F: CD8F45          call InviertePatron
4572: 23              inc hl
4573: 13              inc de
4574: 10F9            djnz flipPatron4
4576: 0D              dec c
4577: 20F4            jr nz, flipPatron3
4579: E1              pop hl
457A: 110008          ld de, 800h ; Distancia al siguiente banco
457D: 19              add hl, de
457E: EB              ex de, hl
457F: E1              pop hl
4580: C1              pop bc
4581: 10E7            djnz flipPatron2
4583: C9              ret
                    
                    ;----------------------------------------------------
                    ; Invierte un byte
                    ; In: A = Byte a invertir
                    ; Out: A = byte invertido
                    ;----------------------------------------------------
                    
4584 =              invierteByte:
4584: C5              push bc
4585: 4F              ld c, a
4586: 0608            ld b, 8
                    
4588 =              invierteByte2:
4588: CB19            rr c
458A: 17              rla
458B: 10FB            djnz invierteByte2
458D: C1              pop bc
458E: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Invierte un patron en la VRAM
                    ; HL = Direccion patron original
                    ; DE = Direccion patron invertido
                    ;----------------------------------------------------
                    
458F =              InviertePatron:
458F: CD4A00          call RDVRM
4592: CD8445          call invierteByte
4595: EB              ex de, hl
4596: CD4D00          call WRTVRM
4599: EB              ex de, hl
459A: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Inicializa el hardware
                    ; Silencia el PSG, borra la VRAM y pone el modo de video
                    ;----------------------------------------------------
                    
459B =              initHardware:
459B: 3EB8            ld a, 10111000b
459D: CD2D7B          call SetPSGMixer
                    
45A0: 3E20            ld a, 20h  ; Silencio
45A2: CDA97A          call setMusic
                    
45A5: 110000          ld de, 0  ; (!?) No tendr? que ser HL? Aunque la proteccion anticopia use DE, la rutina "setFillVRAM" usa HL
45A8: 010040          ld bc, 4000h
45AB: AF              xor a
45AC: CD9C40          call VRAM_writeAC
                    
                    ;----------------------------------------------------
                    ;
                    ; Modo de video:
                    ;
                    ; Screen 2
                    ; Sprites 16x16 unzoomed
                    ; Pattern name table = #3800-#3AFF
                    ; Pattern color table = #0000-#17FF
                    ; Pattern generator table = #2000-#37FF
                    ; Sprite atribute table = #3b00-#3B7F
                    ; Sprite generator table = #1800-#1FFF
                    ; Background color = #E4 (Gris/Azul)
                    ;----------------------------------------------------
                    
45AF =              SetVideoMode:
45AF: 21C045          ld hl, VDP_InitData
45B2: 1608            ld d, 8
45B4: 0E00            ld c, 0
                    
45B6 =              setVideoMode2:
45B6: 46              ld b, (hl)
45B7: CD4700          call WRTVDP
45BA: 23              inc hl
45BB: 0C              inc c
45BC: 15              dec d
45BD: 20F7            jr nz, setVideoMode2
45BF: C9              ret
                    
45C0: 02            VDP_InitData: db 2
45C1: E2              db 0E2h
45C2: 0E              db 0Eh
45C3: 7F              db 7Fh
45C4: 07              db 7
45C5: 76              db 76h
45C6: 03              db 3
45C7: E4              db 0E4h
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Actualiza el estado de los controles
                    ;
                    ;----------------------------------------------------
                    
45C8 =              chkControls:
45C8: 2102E0          ld hl, controlPlayer ; bit 6 = Prota controlado por el jugador
45CB: CB76            bit 6, (hl)
45CD: 200C            jr nz, UpdateKeys ; No esta en modo demo
                    
45CF: 3A00E0          ld a, (GameStatus)
45D2: FE05            cp 5
45D4: 2005            jr nz, UpdateKeys ; No esta en modo de juego
                    
45D6 =              ReplaySavedMov:
45D6: CD2146          call ControlProtaDemo ; Lee los movimientos grabados de la demo
45D9: 1803            jr storeControls ; Actualiza el valor de los controles
                    
45DB =              UpdateKeys:
45DB: CDE845          call ReadKeys ; Lee el estado de los cursores y el joystick
                    
45DE =              storeControls:
45DE: 2109E0          ld hl, KeyHold ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha, #10 = Boton A, #20 =Boton B
                    
45E1 =              StoreKeyValues:
45E1: 4E              ld c, (hl)  ; Lee valores anteriores
45E2: 77              ld (hl), a  ; Guarda los nuevos en KeyHold
45E3: A9              xor c  ; Borra las teclas que siguen pulsadas
45E4: A6              and (hl)  ; Se queda con las que se acaban de pulsar
45E5: 2B              dec hl
45E6: 77              ld (hl), a  ; Lo guarda en KeyTrigger
45E7: C9              ret
                    
                    
                    
                    ;---------------------------------------------------------------------------
                    ; Lee el estado de los cursores y del joystick
                    ; 0: Arriba
                    ; 1: Abajo
                    ; 2: Izquierda
                    ; 3: Derecha
                    ; 4: Boton A / Space
                    ; 5: Boton B / Select
                    ;---------------------------------------------------------------------------
                    
45E8 =              ReadKeys:
45E8: 1E8F            ld e, 8Fh
45EA: 3E0F            ld a, 0Fh  ; I/O port B
45EC: CD9300          call WRTPSG  ; Write PSG
45EF: 3E0E            ld a, 0Eh
45F1: F3              di
45F2: CD9600          call RDPSG  ; Lee el estado del joystick
45F5: FB              ei
45F6: 2F              cpl
45F7: E63F            and 3Fh
                    
45F9: F5              push af
45FA: 3E07            ld a, 7
45FC: CD4101          call SNSMAT  ;  Read keyboard row
45FF: 2F              cpl
4600: 0F              rrca
4601: E620            and 20h
4603: 5F              ld e, a  ; SELECT
                    
4604: 3E08            ld a, 8
4606: CD4101          call SNSMAT  ;  Read keyboard row
4609: 2F              cpl
460A: 0F              rrca
460B: 0F              rrca
460C: 47              ld b, a
460D: E604            and 4
460F: B3              or e
4610: 4F              ld c, a
4611: 78              ld a, b
4612: 0F              rrca
4613: 0F              rrca
4614: 47              ld b, a
4615: E618            and 18h
4617: B1              or c
4618: 4F              ld c, a
4619: 78              ld a, b
461A: 0F              rrca
461B: E603            and 3
461D: B1              or c
461E: C1              pop bc
461F: B0              or b
4620: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Interpreta la secuencia de pulsaciones grabada para la demo
                    ;----------------------------------------------------
                    
4621 =              ControlProtaDemo:
4621: 2182E0          ld hl, KeyHoldCntDemo
4624: 35              dec (hl)  ; decrementa tiempo de la pulsacion
4625: 46              ld b, (hl)
                    
4626: 2A80E0          ld hl, (keyPressDemo) ; Puntero a los controles grabados
4629: 7E              ld a, (hl)  ; Controles pulsados
                    
462A: F5              push af
462B: 78              ld a, b
462C: B7              or a
462D: 2013            jr nz, controlDemo2 ; Aun sigue la tecla apretada
                    
462F: 23              inc hl
4630: 7E              ld a, (hl)  ; Tiempo que hay que mantener las nuevas pulsaciones
4631: FEFF            cp 0FFh  ; Ha terminado la demo?
4633: 2006            jr nz, controlDemo1
                    
4635: AF              xor a
4636: 3253E0          ld (flagVivo), a ; Fin de la demo
4639: 1807            jr controlDemo2
                    
463B =              controlDemo1:
463B: 3282E0          ld (KeyHoldCntDemo), a ; Actualiza el tiempo de pulsacion
463E: 23              inc hl
463F: 2280E0          ld (keyPressDemo), hl ; Puntero a los controles grabados
                    
4642 =              controlDemo2:
4642: F1              pop af
4643: C9              ret
                    ;----------------------------------------------------------------------------
                    ;
                    ; Funcion que comprueba si se pulsa una tecla mientras no se esta jugando
                    ; Si se pulsa, salta al menu
                    ; Si ya estaba en el menu comienza una partida.
                    ;
                    ;----------------------------------------------------------------------------
                    
4644 =              chkPushAnyKey:
4644: CD3E40          call ReadKeys_AC ; (!?) Cuidado
4647: 2141E0          ld hl, KeyHold2
464A: CDE145          call StoreKeyValues
464D: B7              or a
464E: C8              ret z  ; No se ha pulsado ninguna tecla
                    
464F: F5              push af
4650: 3E20            ld a, 20h  ; Silencio
4652: CDA97A          call setMusic
4655: F1              pop af
                    
4656: 47              ld b, a
4657: AF              xor a
4658: 3204E0          ld (waitCounter), a
465B: 3E01            ld a, 1  ; Status menu
465D: 2100E0          ld hl, GameStatus
4660: BE              cp (hl)
4661: 280A            jr z, StartGame_0 ; Si esta en el menu comienza una partida
                    
4663: 77              ld (hl), a  ; Pone status de menu
4664: CDA144          call clearScreen
4667: CDC542          call setColor
466A: C3AB43          jp SetUpMenu
                    
466D =              StartGame_0:
466D: 78              ld a, b
466E: E630            and 30h
4670: C8              ret z  ; No ha pulsado el disparo 1 o 2
                    
4671: 2102E0          ld hl, controlPlayer ; bit 6 = Prota controlado por el jugador
4674: CBF6            set 6, (hl)  ; Control manual
4676: 210300          ld hl, 3  ; Game start status
4679: 2200E0          ld (GameStatus), hl ; Status parpadea PUSH START
467C: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Graficos de la fuente
                    ;----------------------------------------------------
467D: 8B001C22636363221C0018380418CE7E  GFX_Font: db 8Bh, 0, 1Ch, 22h, 63h, 63h, 63h, 22h, 1Ch, 0, 18h, 38h, 4, 18h, 0CEh, 7Eh
468D: 003E63030E3C707F003E63030E03633E    db 0, 3Eh, 63h, 3, 0Eh, 3Ch, 70h, 7Fh, 0, 3Eh, 63h, 3, 0Eh, 3, 63h, 3Eh
469D: 000E1E3666667F06007F607E6303633E    db 0, 0Eh, 1Eh, 36h, 66h, 66h, 7Fh, 6, 0, 7Fh, 60h, 7Eh, 63h, 3, 63h, 3Eh
46AD: 003E63607E63633E007F63060C181818    db 0, 3Eh, 63h, 60h, 7Eh, 63h, 63h, 3Eh, 0, 7Fh, 63h, 6, 0Ch, 18h, 18h, 18h
46BD: 003E63633E63633E003E63633F03633E    db 0, 3Eh, 63h, 63h, 3Eh, 63h, 63h, 3Eh, 0, 3Eh, 63h, 63h, 3Fh, 3, 63h, 3Eh
46CD: 3C4299A1A199423C183C180810270001    db 3Ch, 42h, 99h, 0A1h, 0A1h, 99h, 42h, 3Ch, 18h, 3Ch, 18h, 8, 10h, 27h, 0, 1
46DD: 7E0400C11C3663637F6363007E63637E    db 7Eh, 4, 0, 0C1h, 1Ch, 36h, 63h, 63h, 7Fh, 63h, 63h, 0, 7Eh, 63h, 63h, 7Eh
46ED: 63637E003E63606060633E007C666363    db 63h, 63h, 7Eh, 0, 3Eh, 63h, 60h, 60h, 60h, 63h, 3Eh, 0, 7Ch, 66h, 63h, 63h
46FD: 63667C007F60607E60607F007F60607E    db 63h, 66h, 7Ch, 0, 7Fh, 60h, 60h, 7Eh, 60h, 60h, 7Fh, 0, 7Fh, 60h, 60h, 7Eh
470D: 606060003E63606763633F006363637F    db 60h, 60h, 60h, 0, 3Eh, 63h, 60h, 67h, 63h, 63h, 3Fh, 0, 63h, 63h, 63h, 7Fh
471D: 636363003C0518833C001F04068B663C    db 63h, 63h, 63h, 0, 3Ch, 5, 18h, 83h, 3Ch, 0, 1Fh, 4, 6, 8Bh, 66h, 3Ch
472D: 0063666C787C6E67000660937F006377    db 0, 63h, 66h, 6Ch, 78h, 7Ch, 6Eh, 67h, 0, 6, 60h, 93h, 7Fh, 0, 63h, 77h
473D: 7F7F6B63630063737B7F6F6763003E05    db 7Fh, 7Fh, 6Bh, 63h, 63h, 0, 63h, 73h, 7Bh, 7Fh, 6Fh, 67h, 63h, 0, 3Eh, 5
474D: 63A33E007E6363637E6060003E636363    db 63h, 0A3h, 3Eh, 0, 7Eh, 63h, 63h, 63h, 7Eh, 60h, 60h, 0, 3Eh, 63h, 63h, 63h
475D: 6F663D007E6363627C6663003E63603E    db 6Fh, 66h, 3Dh, 0, 7Eh, 63h, 63h, 62h, 7Ch, 66h, 63h, 0, 3Eh, 63h, 60h, 3Eh
476D: 03633E007E061801000663823E000463    db 3, 63h, 3Eh, 0, 7Eh, 6, 18h, 1, 0, 6, 63h, 82h, 3Eh, 0, 4, 63h
477D: A4361C080063636B6B7F77220063763C    db 0A4h, 36h, 1Ch, 8, 0, 63h, 63h, 6Bh, 6Bh, 7Fh, 77h, 22h, 0, 63h, 76h, 3Ch
478D: 1C1E37630066667E3C181818007F070E    db 1Ch, 1Eh, 37h, 63h, 0, 66h, 66h, 7Eh, 3Ch, 18h, 18h, 18h, 0, 7Fh, 7, 0Eh
479D: 1C38707F000324040000    db 1Ch, 38h, 70h, 7Fh, 0, 3, 24h, 4, 0, 0
                    
                    ; Grafico del espacio en blanco
47A7: 08            GFX_Space: db 8
47A8: FF              db 0FFh
47A9: 00              db 0
                    
                    
                    ;----------------------------------------------------
                    ; Textos del marcador
                    ; Formato:
                    ; - Coordenadas/direccion VRAM (2 bytes)
                    ; - Patrones
                    ; - #FE = Leer nuevas coordenadas y datos
                    ; - #FF = Fin
                    ;----------------------------------------------------
47AA: 1838          TXT_Marcador: dw 3818h
47AC: 3225333420      db 32h, 25h, 33h, 34h, 20h ; REST
47B1: FE              db 0FEh
                    
                    
47B2: 0138            dw 3801h
47B4: 33232F322520    db 33h, 23h, 2Fh, 32h, 25h, 20h ; SCORE
47BA: FE              db 0FEh
                    
                    
47BB: 0E38            dw 380Eh
47BD: 282920          db 28h, 29h, 20h ; HI
47C0: FF              db 0FFh
                    
                    
                    ;----------------------------------------------------
                    ; Textos del menu principal
                    ; "KONAMI 1985"
                    ; "PUSH SPACE KEY"
                    ;----------------------------------------------------
47C1: AA39          TXT_MainMenu: dw 39AAh
47C3: 1A2B2F2E212D290011191815    db 1Ah, 2Bh, 2Fh, 2Eh, 21h, 2Dh, 29h, 0, 11h, 19h, 18h, 15h ; KONAMI 1985
47CF: FE              db 0FEh
                    
                    
47D0: 493A            dw 3A49h
47D2: 30353328003330212325002B2539    db 30h, 35h, 33h, 28h, 0, 33h, 30h, 21h, 23h, 25h, 0, 2Bh, 25h, 39h ; PUSH SPACE KEY
47E0: FF              db 0FFh
                    
                    ;----------------------------------------------------
                    ; Texto "PLAY START"
                    ;----------------------------------------------------
47E1: 493A          TXT_PLAY_START: dw 3A49h
47E3: 0000302C213900    db 0, 0, 30h, 2Ch, 21h, 39h, 0 ; PLAY
                    
                    
47EA: 33342132340000    db 33h, 34h, 21h, 32h, 34h, 0, 0 ; START
47F1: FF              db 0FFh
                    
                    ;----------------------------------------------------
                    ; Mensaje de "GAME OVER"
                    ;----------------------------------------------------
47F2: 6B39          TXT_GameOver: dw 396Bh
47F4: 27212D25002F362532    db 27h, 21h, 2Dh, 25h, 0, 2Fh, 36h, 25h, 32h ; GAME OVER
47FD: FF              db 0FFh
                    
                    
47FE: 4A39          TXT_Sofware: dw 394Ah
4800: 0C              db 0Ch   ; Longitud linea subrayado
4801: 7A              db 7Ah   ; Patron de subrayado
4802: 16              db 16h   ; Numero de espacios (para cuadrar SOFWARE debajo de la raya)
4803: 00              db 0   ; Patron vacio
4804: 88              db 88h   ; Transferir 8 bytes a la posicion VRAM actual
4805: 332F263437213225    db 33h, 2Fh, 26h, 34h, 37h, 21h, 32h, 25h ; texto:SOFTWARE
480D: 00              db 0   ; Fin de los datos
                    
                    ;----------------------------------------------------
                    ; Texto informacion "(C)KONAMI" "PYRAMID-"
                    ;----------------------------------------------------
480E: E13A          TXT_KONAMI_PYR: dw 3AE1h
4810: 1A              db 1Ah   ; (C)
4811: 2B2F2E212D29    db 2Bh, 2Fh, 2Eh, 21h, 2Dh, 29h ; KONAMI
4817: FE              db 0FEh   ; Cambio de coordenadas
                    
                    
4818: EB3A            dw 3AEBh   ; Coordenadas
481A: 303932212D292420    db 30h, 39h, 32h, 21h, 2Dh, 29h, 24h, 20h ; texto: PYRAMID-
4822: FF              db 0FFh
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Descomprime los patrones que forman el logo de Konami
                    ; y los colorea de blanco
                    ;
                    ;----------------------------------------------------
                    
4823 =              loadKonamiLogo:
4823: 3E0E            ld a, 0Eh
4825: 320AE0          ld (gameLogoCnt), a ; Filas que sube el logo
                    
4828: 21AA3A          ld hl, 3AAAh ; Coordenadas iniciales del logo
482B: 220EE0          ld (CoordKonamiLogo), hl
                    
482E: 117448          ld de, GFX_KonamiLogo
4831: 210063          ld hl, 6300h ; #2300 Pattern generator table = Patter #60
4834: CDF144          call UnpackPatterns
                    
4837: 210003          ld hl, 300h ; Direccion de los atributos de color del logo
483A: 01D800          ld bc, 0D8h ; Tama?
483D: 3EF0            ld a, 0F0h  ; Blanco
483F: C3E044          jp fillVRAM3Bank ; Colorea el logo
                    
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Dibuja el logo de Konami y lo desplaza hacia arriba
                    ;
                    ; El logo esta formado por tres filas:
                    ; - Parte superior de la "K"
                    ; - Parte central del logo
                    ; - Parte inferior
                    ;----------------------------------------------------
                    
4842 =              dibujaLogo:
4842: 2A0EE0          ld hl, (CoordKonamiLogo)
4845: 11E0FF          ld de, 0-20h
4848: 19              add hl, de
4849: 220EE0          ld (CoordKonamiLogo), hl ; Lo desplaza hacia arriba una fila
                    
484C: 3E60            ld a, 60h  ; Primer patron del logo de Konami
484E: 0603            ld b, 3  ; Tres patrones de la parte alta de la "K"
4850: CD6648          call drawLogoRow ; Dibuja fila superior
                    
4853: 010C0B          ld bc, 0B0Ch
4856: CD6648          call drawLogoRow ; Dibuja fila central
                    
4859: 41              ld b, c
485A: CD6648          call drawLogoRow ; Dibuja fila inferior
                    
485D: AF              xor a
485E: CDAB44          call setFillVRAM ; Borra rasto inferior
4861: 210AE0          ld hl, gameLogoCnt
4864: 35              dec (hl)  ; Decrementa el numero de iteraciones restantes
4865: C9              ret
                    
                    ;----------------------------------------------------
                    ; Dibuja una fila del logo y desplaza el puntero a la siguiente fila
                    ;
                    ; A = Patron inicial de la fila
                    ; B = Numero de patrones a dibujar
                    ;----------------------------------------------------
                    
4866 =              drawLogoRow:
4866: E5              push hl
                    
4867 =              drawLogoRow2:
4867: CD4D00          call WRTVRM
486A: 23              inc hl
486B: 3C              inc a
486C: 10F9            djnz drawLogoRow2
486E: D1              pop de
486F: 212000          ld hl, 20h
4872: 19              add hl, de  ; Siguiente fila del logo
4873: C9              ret
                    
                    ;----------------------------------------------------
                    ;
                    ; Graficos del logo de Konami
                    ;
                    ;----------------------------------------------------
4874: 0F000101060082FFFE080F84C3C7CFDF  GFX_KonamiLogo: db 0Fh, 0, 1, 1, 6, 0, 82h, 0FFh, 0FEh, 8, 0Fh, 84h, 0C3h, 0C7h, 0CFh, 0DFh
4884: 03FF89FEFCF8F0E0C080070705008303    db 3, 0FFh, 89h, 0FEh, 0FCh, 0F8h, 0F0h, 0E0h, 0C0h, 80h, 7, 7, 5, 0, 83h, 3
4894: CFDF050083E1F97D050083EFFFF70500    db 0CFh, 0DFh, 5, 0, 83h, 0E1h, 0F9h, 7Dh, 5, 0, 83h, 0EFh, 0FFh, 0F7h, 5, 0
48A4: 83078F9E050083F0F878050083F7FFFB    db 83h, 7, 8Fh, 9Eh, 5, 0, 83h, 0F0h, 0F8h, 78h, 5, 0, 83h, 0F7h, 0FFh, 0FBh
48B4: 05008B8FDFF70C1E1E0C001E9E9E080F    db 5, 0, 8Bh, 8Fh, 0DFh, 0F7h, 0Ch, 1Eh, 1Eh, 0Ch, 0, 1Eh, 9Eh, 9Eh, 8, 0Fh
48C4: 90FFFFDFCFC7C3C1C00787C7EFFFFFFF    db 90h, 0FFh, 0FFh, 0DFh, 0CFh, 0C7h, 0C3h, 0C1h, 0C0h, 7, 87h, 0C7h, 0EFh, 0FFh, 0FFh, 0FFh
48D4: FC04DE849E9F0F03053D837DF9E108E3    db 0FCh, 4, 0DEh, 84h, 9Eh, 9Fh, 0Fh, 3, 5, 3Dh, 83h, 7Dh, 0F9h, 0E1h, 8, 0E3h
48E4: 90DCC0C7DEDCDECFC33C7CFC3C3C7CFC    db 90h, 0DCh, 0C0h, 0C7h, 0DEh, 0DCh, 0DEh, 0CFh, 0C3h, 3Ch, 7Ch, 0FCh, 3Ch, 3Ch, 7Ch, 0FCh
48F4: DE08F108E308DE883844BAAAB2AA4438    db 0DEh, 8, 0F1h, 8, 0E3h, 8, 0DEh, 88h, 38h, 44h, 0BAh, 0AAh, 0B2h, 0AAh, 44h, 38h
4904: 030001FF040000    db 3, 0, 1, 0FFh, 4, 0, 0
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Grafico del logo de King's Valley y piramide del menu
                    ;
                    ;----------------------------------------------------
490B: AC000307001F3F7F000003070F000000  GFX_Menu: db 0ACh, 0, 3, 7, 0, 1Fh, 3Fh, 7Fh, 0, 0, 3, 7, 0Fh, 0, 0, 0
491B: FF00FFFFFF000001FF0103010E033E07    db 0FFh, 0, 0FFh, 0FFh, 0FFh, 0, 0, 1, 0FFh, 1, 3, 1, 0Eh, 3, 3Eh, 7
492B: FC0FFCF81FF0F0E03F7FC0C08004FF94    db 0FCh, 0Fh, 0FCh, 0F8h, 1Fh, 0F0h, 0F0h, 0E0h, 3Fh, 7Fh, 0C0h, 0C0h, 80h, 4, 0FFh, 94h
493B: 80C0E000F800FE00FF0000FF000000FF    db 80h, 0C0h, 0E0h, 0, 0F8h, 0, 0FEh, 0, 0FFh, 0, 0, 0FFh, 0, 0, 0, 0FFh
494B: 800000F0030002FF030004FF8D800000    db 80h, 0, 0, 0F0h, 3, 0, 2, 0FFh, 3, 0, 4, 0FFh, 8Dh, 80h, 0, 0
495B: 00F8FCFEFF3F6F37170F0907970F1FC7    db 0, 0F8h, 0FCh, 0FEh, 0FFh, 3Fh, 6Fh, 37h, 17h, 0Fh, 9, 7, 97h, 0Fh, 1Fh, 0C7h
496B: 83070E3CF8F07C1E1E0E0F0F0F8FC787    db 83h, 7, 0Eh, 3Ch, 0F8h, 0F0h, 7Ch, 1Eh, 1Eh, 0Eh, 0Fh, 0Fh, 0Fh, 8Fh, 0C7h, 87h
497B: 0F07000F08078887EFCF0080001F9E03    db 0Fh, 7, 0, 0Fh, 8, 7, 88h, 87h, 0EFh, 0CFh, 0, 80h, 0, 1Fh, 9Eh, 3
498B: 0F060E898F9F00000078FCDE8E070E89    db 0Fh, 6, 0Eh, 89h, 8Fh, 9Fh, 0, 0, 0, 78h, 0FCh, 0DEh, 8Eh, 7, 0Eh, 89h
499B: 1FBF0000000F1F383004608E70703F1F    db 1Fh, 0BFh, 0, 0, 0, 0Fh, 1Fh, 38h, 30h, 4, 60h, 8Eh, 70h, 70h, 3Fh, 1Fh
49AB: 0F000000F9F3F3717071037003F0ADE0    db 0Fh, 0, 0, 0, 0F9h, 0F3h, 0F3h, 71h, 70h, 71h, 3, 70h, 3, 0F0h, 0ADh, 0E0h
49BB: 0000038FDEDF8F870100381C3E3F1F0F    db 0, 0, 3, 8Fh, 0DEh, 0DFh, 8Fh, 87h, 1, 0, 38h, 1Ch, 3Eh, 3Fh, 1Fh, 0Fh
49CB: 0000F0FC0E06C0F0F87C1C1E3EFEFCF8    db 0, 0, 0F0h, 0FCh, 0Eh, 6, 0C0h, 0F0h, 0F8h, 7Ch, 1Ch, 1Eh, 3Eh, 0FEh, 0FCh, 0F8h
49DB: 7FF17B11071F0707030301010400A9C3    db 7Fh, 0F1h, 7Bh, 11h, 7, 1Fh, 7, 7, 3, 3, 1, 1, 4, 0, 0A9h, 0C3h
49EB: 8F3B610103038686CCD8F8F0F060608F    db 8Fh, 3Bh, 61h, 1, 3, 3, 86h, 86h, 0CCh, 0D8h, 0F8h, 0F0h, 0F0h, 60h, 60h, 8Fh
49FB: DBDF878E0E1F1E383030747C7C3C18FE    db 0DBh, 0DFh, 87h, 8Eh, 0Eh, 1Fh, 1Eh, 38h, 30h, 30h, 74h, 7Ch, 7Ch, 3Ch, 18h, 0FEh
4A0B: F3773E7CFC9E1E1E030F0307830F0703    db 0F3h, 77h, 3Eh, 7Ch, 0FCh, 9Eh, 1Eh, 1Eh, 3, 0Fh, 3, 7, 83h, 0Fh, 7, 3
4A1B: 09018603878CCDE7E006C003C388E1C0    db 9, 1, 86h, 3, 87h, 8Ch, 0CDh, 0E7h, 0E0h, 6, 0C0h, 3, 0C3h, 88h, 0E1h, 0C0h
4A2B: 8E3FFFFF0F070803878387CFC8CB8FC0    db 8Eh, 3Fh, 0FFh, 0FFh, 0Fh, 7, 8, 3, 87h, 83h, 87h, 0CFh, 0C8h, 0CBh, 8Fh, 0C0h
4A3B: 06800386AEC3811D7FFFFF3F1F0F0F0F    db 6, 80h, 3, 86h, 0AEh, 0C3h, 81h, 1Dh, 7Fh, 0FFh, 0FFh, 3Fh, 1Fh, 0Fh, 0Fh, 0Fh
4A4B: 0E0D0D0E0F0F0F8F9FBF1FFF071E3860    db 0Eh, 0Dh, 0Dh, 0Eh, 0Fh, 0Fh, 0Fh, 8Fh, 9Fh, 0BFh, 1Fh, 0FFh, 7, 1Eh, 38h, 60h
4A5B: C0187CCC00000183FFFFFE3F732F0F07    db 0C0h, 18h, 7Ch, 0CCh, 0, 0, 1, 83h, 0FFh, 0FFh, 0FEh, 3Fh, 73h, 2Fh, 0Fh, 7
4A6B: 03010104008C808001038F7B0387CEDC    db 3, 1, 1, 4, 0, 8Ch, 80h, 80h, 1, 3, 8Fh, 7Bh, 3, 87h, 0CEh, 0DCh
4A7B: F8F806F085F8FC80C0800E008460703F    db 0F8h, 0F8h, 6, 0F0h, 85h, 0F8h, 0FCh, 80h, 0C0h, 80h, 0Eh, 0, 84h, 60h, 70h, 3Fh
4A8B: 3F0300857070F0E0C0030000    db 3Fh, 3, 0, 85h, 70h, 70h, 0F0h, 0E0h, 0C0h, 3, 0, 0
                    
                    
                    ;----------------------------------------------------
                    ; Atributos de la piramide del menu
                    ;----------------------------------------------------
4A97: 1CE088F0E0F0E0F0E0  ATTRIB_Menu: db 1Ch, 0E0h, 88h, 0F0h, 0E0h, 0F0h, 0E0h, 0F0h, 0E0h
4AA0: E0F003E002F003E02CF000    db 0E0h, 0F0h, 3, 0E0h, 2, 0F0h, 3, 0E0h, 2Ch, 0F0h, 0
                    
                    ;----------------------------------------------------
                    ;
                    ; Colores del logo KING'S VALLEY
                    ;
                    ;----------------------------------------------------
4AAB: 03608D80809090A0B0E030  COLORES_LOGO: db 3, 60h, 8Dh, 80h, 80h, 90h, 90h, 0A0h, 0B0h, 0E0h, 30h
4AB6: 705050404000    db 70h, 50h, 50h, 40h, 40h, 0
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Tabla de nombres de la piramide del menu
                    ;
                    ;----------------------------------------------------
4ABC: 000093960000  GFX_PiramidLogo:db 0, 0, 93h, 96h, 0, 0
4AC2: 009094979800    db 0, 90h, 94h, 97h, 98h, 0
4AC8: 91929599999A    db 91h, 92h, 95h, 99h, 99h, 9Ah
                    
                    ;----------------------------------------------------
                    ;
                    ; Pulsaciones de teclas de la demo
                    ;
                    ;----------------------------------------------------
4ACE: 0898          DemoKeyData: db 8, 98h
4AD0: 0638            db 6, 38h
4AD2: 0868            db 8, 68h
4AD4: 0508            db 5, 8
4AD6: 1480            db 14h, 80h
4AD8: 0408            db 4, 8
4ADA: 1448            db 14h, 48h
4ADC: 0848            db 8, 48h
4ADE: 0530            db 5, 30h
4AE0: 0840            db 8, 40h
4AE2: 0530            db 5, 30h
4AE4: 0840            db 8, 40h
4AE6: 0590            db 5, 90h
4AE8: 0938            db 9, 38h
4AEA: 0408            db 4, 8
4AEC: 1468            db 14h, 68h
4AEE: 0408            db 4, 8
4AF0: 1410            db 14h, 10h
4AF2: 0408            db 4, 8
4AF4: 1448            db 14h, 48h
4AF6: 0848            db 8, 48h
4AF8: 05A0            db 5,0A0h
4AFA: 0908            db 9, 8
4AFC: 1840            db 18h, 40h
4AFE: 0808            db 8, 8
4B00: 1890            db 18h, 90h
4B02: 0948            db 9, 48h
4B04: 0458            db 4, 58h
4B06: 0808            db 8, 8
4B08: 1880            db 18h, 80h
4B0A: 06FF            db 6,0FFh
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Logica del juego (jugando)
                    ;
                    ;----------------------------------------------------
                    
4B0C =              tickGame:
4B0C: 2133E1          ld hl, flagStageClear
4B0F: 7E              ld a, (hl)
4B10: B7              or a  ; Ha cogido todas la gemas?
4B11: 2810            jr z, tickGame2 ; No
                    
4B13: 3A12E0          ld a, (musicCh1)
4B16: 47              ld b, a
4B17: 3A20E0          ld a, (musicCh2)
4B1A: B0              or b  ; Esta sonando algo?
4B1B: 2006            jr nz, tickGame2 ; Si
                    
4B1D: 77              ld (hl), a
4B1E: 3E8B            ld a, 8Bh  ; Ingame music
4B20: CDA97A          call setMusic ; Hace sonar de nuevo la musica del juego tras la fanfarria de fase completada
                    
4B23 =              tickGame2:
4B23: CD754B          call updateSprites ; Actualiza los sprites RAM->VRAM
4B26: CDBC4B          call chkScroll ; Comprueba si el prota se sale de la pantalla e indica que hay que hacer scroll
4B29: CDE44B          call drawBrilloGemas ; Cambia el color del brillo de las gemas y de la palanca de la puerta
                    
4B2C: 3A32E1          ld a, (flagEntraSale) ; 1 = Entrando o saliendo de la piramide. Ejecuta una logica especial para este caso
4B2F: A7              and a  ; Esta entrando o saliendo de la piramide?
4B30: C2F06D          jp nz, escalerasEntrada ; Ejecuta logica especial para este caso
                    
4B33: CD114C          call chkPause ; Comprueba si se pausa el juego o ya esta pausado
4B36: CD646F          call AI_Momias ; Mueve a las momias
4B39: CD3265          call AI_Gemas ; Si se coge una se borra de la pantalla y del mapa
4B3C: CD594C          call AI_Prota ; Logica del prota
4B3F: CDFF57          call AI_Cuchillos ; Logica de los cuchillos
4B42: CDAD5B          call chkCogeKnife ; Comprueba si el prota coge un cuchillo del suelo
4B45: CD1F5C          call chkCogeGema ; Comprueba si el prota coge una gema
4B48: CDEA65          call AI_Salidas ; Logica de las puertas de la piramide
4B4B: CD0B68          call MurosTrampa ; Logica de los muros trampa que se cierran al pasar el prota
4B4E: CD515C          call chkCogePico ; Comprueba si el prota coge un pico
4B51: CDA85C          call chkTocaMomia ; Comprueba si el prota toca a una momia
4B54: CD4B69          call spiningDoors ; Logica de las puerta giratorias
                    
                    
                    ; Comprueba si se suicida pulsando F2
                    
4B57: 3A02E0          ld a, (controlPlayer) ; bit 6 = Prota controlado por el jugador
4B5A: CB77            bit 6, a
4B5C: C8              ret z  ; Esta en modo demo, no comprueba si se suicida pulsado F2
                    
4B5D: 3E06            ld a, 6  ; Si se pulsa F2 se suicida
4B5F: CD4101          call SNSMAT  ;  Read keyboard row
4B62: 2F              cpl
4B63: CB77            bit 6, a  ; F2 key
4B65: 280D            jr z, doNothing2
                    
4B67: AF              xor a
4B68: 3253E0          ld (flagVivo), a
4B6B: 3C              inc a
4B6C: 325EE0          ld (flagMuerte), a
4B6F: 3E1D            ld a, 1Dh  ; Musica muerte
4B71: CDA97A          call setMusic
                    
4B74 =              doNothing2:
4B74: C9              ret
                    
                    ;-----------------------------------------------------------------------------------------------------------
                    ;
                    ; Actualiza los atributos de los sprites RAM -> VRAM
                    ; Al prota y al cacho de puerta los pinta siempre en los mismos planos
                    ; A los enemigos los cambia de plano para evitar que desaparezcan si coinciden mas de 5 sprites en la misma Y
                    ;
                    ;-----------------------------------------------------------------------------------------------------------
                    
4B75 =              updateSprites:
4B75: 11B0E0          ld de, sprAttrib ; Tabla de atributos de los sprites en RAM (Y, X, Spr, Col)
4B78: 21003B          ld hl, 3B00h ; Tabla de atributos de los sprites
4B7B: 011800          ld bc, 18h  ; 6 sprites (6*4)
4B7E: CDC044          call DEtoVRAMset
                    
4B81: 2161E0          ld hl, offsetPlanoSpr ; Contador que modifica el plano en el que son pintados los sprites, asi se consigue que parpaden en vez de desaparecer
4B84: 34              inc (hl)  ; Incrementa el desplazamiento de plano de los enemigos
4B85: 7E              ld a, (hl)
4B86: E603            and 3  ; Rango de 0-3 (4 enemigos max.)
4B88: 4F              ld c, a  ; C = indice de desplazamiento
4B89: 87              add a, a
4B8A: 87              add a, a  ; x4 (sprite attribute size)
4B8B: 11C8E0          ld de, enemyAttrib ; Tabla de atributos de los enemigos en RAM
4B8E: CD1540          call ADD_A_DE ; Calcula el plano que le corresponde a ese desplazamiento
4B91: 21183B          ld hl, 3B18h ; Direccion VRAM de los atributos de los sprites de los enemigos
4B94: 0604            ld b, 4  ; Numero de enemigos/planos a rotar
                    
4B96 =              setSprAttrib2:
4B96: C5              push bc
4B97: 010400          ld bc, 4
4B9A: CDC044          call DEtoVRAMset ; Actualiza los atributos de un sprite/momia
4B9D: C1              pop bc
4B9E: 3E04            ld a, 4
4BA0: CD1040          call ADD_A_HL ; Siguiente momia
4BA3: 0C              inc c  ; Incrementa el indice de desplazamiento
4BA4: 79              ld a, c
4BA5: FE04            cp 4  ; Comprueba si ha llegado al ultimo plano reservado para enemigos
4BA7: 2005            jr nz, setSprAttrib3
                    
4BA9: 11C8E0          ld de, enemyAttrib ; Apunta al comienzo de la tabla de atributos de los enemigos
4BAC: 0E00            ld c, 0  ; Resetea el indice
                    
4BAE =              setSprAttrib3:
4BAE: 10E6            djnz setSprAttrib2
                    
4BB0: 11D8E0          ld de, unk_E0D8 ; Attributos del resto de sprites del juego
4BB3: 21283B          ld hl, 3B28h
4BB6: 015800          ld bc, 58h  ; Attrib. size
4BB9: C3C044          jp DEtoVRAMset ; Actualiza VRAM
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba si el prota llega a los limites laterales de la pantalla
                    ; Si es asi, indica que hay que realizar scroll y quita los sprites
                    ;----------------------------------------------------
                    
                    
4BBC =              chkScroll:
4BBC: 3A36E1          ld a, (sentidoProta) ; 1 = Izquierda, 2 = Derecha
4BBF: 1F              rra
4BC0: 3A39E1          ld a, (ProtaX)
4BC3: 3005            jr nc, chkScroll2
4BC5: FE02            cp 2  ; Limite parte derecha
4BC7: D0              ret nc
4BC8: 3803            jr c, chkScroll3
                    
4BCA =              chkScroll2:
4BCA: FEF4            cp 0F4h  ; Limite parte izquierda
4BCC: D8              ret c
                    
4BCD =              chkScroll3:
4BCD: 3E20            ld a, 20h
4BCF: 3204E0          ld (waitCounter), a ; Numero de desplazamientos o tiles a moverse
4BD2: 3E01            ld a, 1
4BD4: 3247E1          ld (flagScrolling), a ; Se esta realizando el scroll
4BD7: CD4943          call HideSprites ; Borra sprites dela VRAM
4BDA: CD5643          call hideSprAttrib ; Borra sprites de la RAM
4BDD: 3E09            ld a, 9  ; Scroll mode
4BDF: 3200E0          ld (GameStatus), a
4BE2: E1              pop hl
4BE3: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Cambia el color de los destellos de las gemas
                    ; y de la palanca de la puerta
                    ;----------------------------------------------------
                    
4BE4 =              drawBrilloGemas:
4BE4: 3A03E0          ld a, (timer)
4BE7: 1F              rra
4BE8: E603            and 3  ; Indice de color a usar
                    
4BEA: F5              push af
4BEB: 21094C          ld hl, coloresBrillo ; Colores de los destellos de las gemas
4BEE: 118802          ld de, 288h ; Color table address (destellos)
4BF1: 011800          ld bc, 18h  ; Numero de bytes (3 destellos por 8 bytes)
4BF4: CD014C          call chgColorBrillo ; Cambia el color de los destellos de las gemas
4BF7: F1              pop af
                    
4BF8: 010300          ld bc, 3  ; Numero de bytes a cambiar
4BFB: 11E502          ld de, 2E5h ; Color table address de la parte inferior de la palanca de la puerta
4BFE: 210D4C          ld hl, ColoresPalanca ; Colores de la palanca de la puerta
                    
4C01 =              chgColorBrillo:
4C01: CD1040          call ADD_A_HL
4C04: 7E              ld a, (hl)
4C05: EB              ex de, hl
4C06: C3E044          jp fillVRAM3Bank
                    
4C09: 10F0A0A0      coloresBrillo: db 10h, 0F0h, 0A0h, 0A0h
                         ; Colores de los destellos de las gemas
                    
4C0D: 16F6A6A6      ColoresPalanca: db 16h, 0F6h, 0A6h, 0A6h
                         ; Colores de la palanca de la puerta
                    
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Comprueba si se pulsa F1 para pausar el juego
                    ; Si se pausa, muestra el texto PAUSING en la esquina inferior derecha del mapa
                    ;
                    ;----------------------------------------------------
                    
4C11 =              chkPause:
4C11: 3A02E0          ld a, (controlPlayer) ; bit 6 = Prota controlado por el jugador
4C14: CB77            bit 6, a
4C16: C8              ret z  ; Esta en modo demo
                    
4C17: 3E06            ld a, 6  ; F3 F2 F1 CODE CAPS GRAPH CTRL SHIFT
4C19: CD4101          call SNSMAT  ;  Read keyboard row
4C1C: 2F              cpl
4C1D: 2165E0          ld hl, keyHoldMap
4C20: CDE145          call StoreKeyValues
4C23: CB6F            bit 5, a  ; keyTrigger F1
4C25: 23              inc hl
4C26: 23              inc hl
4C27: 7E              ld a, (hl)  ; Flag que indica si esta pausado
4C28: 2007            jr nz, chkPause2 ; Se ha pulsado F1
4C2A: A7              and a  ; Esta pausado?
4C2B: C8              ret z  ; No
                    
4C2C: CD384C          call blinkPausing ; Muestra el cartel de "PAUSING" parpadeando
4C2F: E1              pop hl
4C30: C9              ret
                    
4C31 =              chkPause2:
4C31: EE01            xor 1
4C33: 77              ld (hl), a  ; Invierte el flag de pausa
4C34: A7              and a
4C35: 280F            jr z, erasePausing ; Se acaba de quitar la pusa, borra el letrero
4C37: C9              ret
                    
4C38 =              blinkPausing:
4C38: 3A03E0          ld a, (timer)
4C3B: 47              ld b, a
4C3C: E607            and 7
4C3E: C0              ret nz  ; El parpadeo dura 8 frames
                    
4C3F: CB60            bit 4, b  ; Cada 8 frames muestra el texto o lo borra
4C41: 11524C          ld de, txtPAUSING
4C44: 2803            jr z, printPause
                    
4C46 =              erasePausing:
4C46: 118A65          ld de, eraseData
                    
4C49 =              printPause:
4C49: 21F63A          ld hl, 3AF6h ; Coordenadas de pantalla
4C4C: 010700          ld bc, 7
4C4F: C3C044          jp DEtoVRAMset
                    
                    
4C52: 30213533292E27  txtPAUSING: db 30h, 21h, 35h, 33h, 29h, 2Eh, 27h
                         ; PAUSING
                    
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Logica del prota
                    ;
                    ;----------------------------------------------------
                    
4C59 =              AI_Prota:
4C59: 21FA4C          ld hl, setAttribProta ; Actualiza atributos de los sprites del prota
4C5C: E5              push hl  ; Mete en la pila la funcion que actualiza los atributos del prota
4C5D: 3A34E1          ld a, (protaStatus) ; Obtiene el estado actual del prota
4C60: A7              and a
4C61: 2804            jr z, AI_Prota2 ; Estado 0 = Andando
                    
4C63: FE03            cp 3
4C65: 2012            jr nz, AI_Prota3 ; Estado 2 = Cayendo. No comprueba los controles
                    
4C67 =              AI_Prota2:
4C67: 2135E1          ld hl, protaControl ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha, #10 = Boton A, #20 =Boton B
4C6A: 3A09E0          ld a, (KeyHold) ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha, #10 = Boton A, #20 =Boton B
4C6D: 77              ld (hl), a  ; Copia los controles/teclas pulsados al control del prota
4C6E: A7              and a
4C6F: 2808            jr z, AI_Prota3 ; No hay ninguna tecla pulsada
                    
4C71: 1F              rra
4C72: 1F              rra
4C73: E603            and 3
4C75: 2802            jr z, AI_Prota3 ; No esta pulsado ni DERECHA ni IZQUIERDA
                    
4C77: 23              inc hl
4C78: 77              ld (hl), a  ; Sentido del prota
                    
4C79 =              AI_Prota3:
4C79: 3A34E1          ld a, (protaStatus) ; Estado del prota
4C7C: CD4B40          call jumpIndex
4C7F: 8D4C            dw protaAnda ; 0 = Andar
4C81: 6D4D            dw protaSalta ; 1 = Realiza el salto y comprueba si choca con algo
4C83: 974D            dw protaCayendo ; 2 = Cayendo
4C85: A14D            dw protaEscaleras ; 3 = Mueve al prota por las escaleras y comprueba si llega al final de estas
4C87: 1E4E            dw protaLanzaKnife ; 4 = Anima al prota para hacer la animacion de lanzamiento. Al terminar restaura el sprite y pasa al estado de andar
4C89: 784E            dw protaPicando ; 5 = Animacion del prota picando y rompiendo los ladrillos
4C8B: B84F            dw protaGiratoria ; 6 = Pasando por una puerta giratoria
                    
                    ;----------------------------------------------------
                    ; Prota status 0: Andar
                    ;----------------------------------------------------
                    
4C8D =              protaAnda:
4C8D: 3A08E0          ld a, (KeyTrigger)
4C90: CB67            bit 4, a  ; Acaba de pulsar FIRE1 / Boton A?
4C92: 2810            jr z, protaAnda2 ; No
                    
4C94: 3A44E1          ld a, (objetoCogido) ; #10 = Cuchillo, #20 = Pico
4C97: E6F0            and 0F0h  ; Tiene algun objeto el prota?
4C99: CA504D          jp z, setProtaSalta ; No, intenta saltar
                    
4C9C: FE10            cp 10h  ; Es un cuchillo?
4C9E: C2C14E          jp nz, chkProtaPica ; No, es un pico. Intenta hacer un agujero
                    
4CA1: C3BF4D          jp setLanzaKnife ; Lanza el cuchillo
                    
4CA4 =              protaAnda2:
4CA4: CD9550          call chkProtaCae ; Hay suelo bajo el prota?
4CA7: DA8E4D          jp c, setProtaCae ; No hay suelo
                    
4CAA: AF              xor a
4CAB: 324DE1          ld (modoSentEsc), a ; Si es 0 guarda en "sentidoEscalera" el tipo de escalera que se coge el prota. 0 = \, 1 = /
4CAE: CD3051          call chkCogeEscalera ; Comprueba si coge una escalera para subir o bajar
4CB1: C8              ret z  ; si, la ha cogido
                    
4CB2: 2135E1          ld hl, protaControl ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha, #10 = Boton A, #20 =Boton B
4CB5: 7E              ld a, (hl)
4CB6: E60C            and 1100b  ; Se queda solo con los controles DERECHA e IZQUIERDA
4CB8: CA394D          jp z, protaQuieto ; No se mueve hacia los lados
                    
4CBB: 213EE1          ld hl, protaMovCnt ; Contador usado cada vez que se mueve el prota. (!?) No se usa su valor
4CBE: 34              inc (hl)  ; Incrementa el contador de movimientos
                    
4CBF: CDD251          call chkChocaAndar
4CC2: 302C            jr nc, protaAnda3 ; No choca
                    
4CC4: 7E              ld a, (hl)  ; HL apunta al tile del mapa contra el que ha chocado
4CC5: E6F0            and 0F0h  ; Se queda con el tipo de tile/familia
4CC7: FE50            cp 50h  ; Es una puerta giratoria?
4CC9: 202C            jr nz, protaAnda5 ; No
                    
4CCB: 7E              ld a, (hl)
4CCC: E60F            and 0Fh  ; Tipo de tile de puerta giratoria
4CCE: D601            sub 1
4CD0: FE02            cp 2  ; Ha choacado contra la parte azul de la puerta?
4CD2: 3823            jr c, protaAnda5 ; No
                    
4CD4: 2146E1          ld hl, timerEmpuja ; Timer usado para saber el tiempo que se empuja una puerta giratoria
4CD7: 34              inc (hl)  ; Incrementa tiempo de empuje
4CD8: 3E10            ld a, 10h  ; Tiempo necesario de empuje para que se mueva la puerta
4CDA: BE              cp (hl)
4CDB: C2F74C          jp nz, protaAnda5 ; Aun no ha empujado lo suficiente
                    
4CDE: 3E06            ld a, 6  ; Estado: Pasando por una puerta giratoria
4CE0: 3234E1          ld (protaStatus), a ; Actualiza el estado del prota
4CE3: 3E20            ld a, 20h
4CE5: 3245E1          ld (accionWaitCnt), a ; Contador usado para controlar la animacion y duracion de la accion (lanzar cuchillo, cavar, pasar puerta giratoria)
                    
4CE8: 3E03            ld a, 3  ; Puerta giratoria
4CEA: CDA97A          call setMusic
4CED: C3DC69          jp chkGiratorias ; Identifia la puerta que esta empujando
                    
4CF0 =              protaAnda3:
4CF0: AF              xor a
4CF1: 3246E1          ld (timerEmpuja), a ; Resetea contador de empuje
                    
4CF4 =              protaAnda4:
4CF4: CDFB73          call mueveProta ; Actualiza las coordenadas del prota
                    
4CF7 =              protaAnda5:
4CF7: C32E4D          jp calcFrame ; Actualiza el fotograma de la animacion
                    
                    ;----------------------------------------------------
                    ; Actualiza los atributos de los dos sprite del prota en RAM
                    ; segun sus coordenadas
                    ;----------------------------------------------------
                    
4CFA =              setAttribProta:
4CFA: 2137E1          ld hl, ProtaY ; Actualiza atributos de los sprites del prota
4CFD: 4E              ld c, (hl)  ; Y prota
4CFE: 23              inc hl
4CFF: 23              inc hl  ; X prota
4D00: 46              ld b, (hl)  ; BC = XY
4D01: 3A3FE1          ld a, (protaFrame)
4D04: 21C0E0          ld hl, protaAttrib
4D07: 0D              dec c
4D08: 0D              dec c
4D09: CB47            bit 0, a  ; El frame es par o impar?
4D0B: 2801            jr z, setAttribProta2
4D0D: 0C              inc c  ; Los frames pares los mueve un pixel hacia arriba
                    
4D0E =              setAttribProta2:
4D0E: 11464D          ld de, framesProta ; Sprite a usar segun el frame
4D11: CD1540          call ADD_A_DE
4D14: 1A              ld a, (de)  ; Numero de sprite
4D15: 57              ld d, a
4D16: CD194D          call setAttribProta3
                    
4D19 =              setAttribProta3:   ; Y
4D19: 71              ld (hl), c
4D1A: 23              inc hl
4D1B: 70              ld (hl), b  ; X
4D1C: 23              inc hl
4D1D: 3A36E1          ld a, (sentidoProta) ; 1 = Izquierda, 2 = Derecha
4D20: 1F              rra   ; En que sentido mira?
4D21: 7A              ld a, d
4D22: 3002            jr nc, setAttribProta4 ; Derecha
4D24: C660            add a, 60h  ; Distancia a sprites girados a la izquierda
                    
4D26 =              setAttribProta4:
4D26: 77              ld (hl), a  ; Sprite
4D27: 7A              ld a, d
4D28: C604            add a, 4  ; Siguiente sprite 16x16
4D2A: 57              ld d, a
4D2B: 23              inc hl  ; Color
4D2C: 23              inc hl  ; Atributos del siguiente sprite
4D2D: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Pone el frame del elemento segun su contador de movimientos
                    ; Cada 4 movimientos se incrementa en 1 el numero de frame
                    ; El rango de valores es de 0 a 7
                    ;----------------------------------------------------
                    
4D2E =              calcFrame:
4D2E: 213EE1          ld hl, protaMovCnt ; Contador usado cada vez que se mueve el prota. (!?) No se usa su valor
                    
4D31 =              calcFrame2:
4D31: 7E              ld a, (hl)
4D32: 1F              rra
4D33: 1F              rra
4D34: E607            and 7
4D36: 23              inc hl
4D37: 77              ld (hl), a
4D38: C9              ret
                    
4D39 =              protaQuieto:
4D39: AF              xor a
4D3A: 3245E1          ld (accionWaitCnt), a ; Contador usado para controlar la animacion y duracion de la accion (lanzar cuchillo, cavar, pasar puerta giratoria)
4D3D: 3C              inc a  ; Pies juntos
4D3E: 1802            jr setProtaFrame
                    
                    
4D40: 3E02            ld a, 2  ; (!?) Esto no se ejecuta nunca!
                    
4D42 =              setProtaFrame:
4D42: 323FE1          ld (protaFrame), a
4D45: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Numero de sprite a usar en cada frame del prota
                    ;----------------------------------------------------
4D46: 08            framesProta: db 8
4D47: 00              db 0  ; 1 = Pies juntos
4D48: 10              db 10h  ; 2 = Saltando
4D49: 08              db 8  ; 3 = Andando
4D4A: 00              db 0  ; 4 = Pies juntos
4D4B: 10              db 10h  ; 5 = Pies separados
4D4C: 00              db 0  ; 6 = Pies juntos
4D4D: 10              db 10h  ; 7 = Pies separados
4D4E: 18              db 18h  ; 8 = Frame 1 accion (cavando, lanzando)
4D4F: 20              db 20h  ; 9 = Frame 2 accion
                    
                    
                    ;----------------------------------------------------
                    ; Se ha pulsado el boton de salto
                    ; El prota intenta saltar
                    ;----------------------------------------------------
                    
4D50 =              setProtaSalta:
4D50: 2137E1          ld hl, ProtaY
4D53: 7E              ld a, (hl)
4D54: A7              and a
4D55: C8              ret z  ; No salta. El prota esta en la parte superior de la pantalla, pegado arriba del todo
                    
4D56: CD3474          call chkSaltar ; Comprueba si puede saltar o hay algun obstaculo que se lo impide
4D59: D0              ret nc  ; Choca contra algo. No puede saltar
                    
4D5A: EB              ex de, hl
4D5B: 7E              ld a, (hl)  ; Puntero al mapa
4D5C: E6F0            and 0F0h
4D5E: FE10            cp 10h  ; Es una plataforma o muro?
4D60: C8              ret z  ; Si
                    
4D61 =              setProtaSalta_:
4D61: 3A09E0          ld a, (KeyHold) ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha, #10 = Boton A, #20 =Boton B
4D64: 3243E1          ld (sentidoEscalera), a ; Guarda el estado de las teclas al saltar
4D67: 2134E1          ld hl, protaStatus ; Puntero a los datos del prota
4D6A: C3D770          jp Salta
                    
                    ;----------------------------------------------------
                    ; Prota status 1: Saltar
                    ; Actualiza sus coordenadas y comprueba si choca con al al saltar
                    ; Si choca, pasa al estado de cayendo
                    ;----------------------------------------------------
                    
4D6D =              protaSalta:
4D6D: 2136E1          ld hl, sentidoProta ; 1 = Izquierda, 2 = Derecha
4D70: CDF474          call doSalto  ; Actualiza la posicion del prota al saltar
4D73: 2134E1          ld hl, protaStatus ; Puntero a los datos del prota
4D76: E5              push hl
4D77: DDE1            pop ix
4D79: CD8474          call chkChocaSalto ; Comprueba si choca con algo en el salto
4D7C: C0              ret nz  ; No ha chocado con nada
                    
4D7D: 3E03            ld a, 3
4D7F: 3234E1          ld (protaStatus), a ; (!?) Para que pone esto! Seguido se cambia a estatus cayendo
4D82: 1813            jr protaCayendo
                    
                    ;----------------------------------------------------
                    ; El prota ha llegado al suelo
                    ; Pone estado de andar/normal y reproduce efecto de aterrizaje
                    ;----------------------------------------------------
                    
4D84 =              protaAterriza:
4D84: 3E02            ld a, 2  ; SFX choca suelo
4D86: CDA97A          call setMusic
4D89: AF              xor a
4D8A: 3234E1          ld (protaStatus), a ; Pone estado de andar
4D8D: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Pone al prota en estado de caida
                    ;----------------------------------------------------
                    
4D8E =              setProtaCae:
4D8E: AF              xor a
4D8F: 323BE0          ld (flagSetCaeSnd), a ; Si es 0 hay que inicializar los datos del sonido de caida
4D92: 3E01            ld a, 1
4D94: CDA97A          call setMusic ; SFX caer
                    
                    ;----------------------------------------------------
                    ; Prota status 2: Caer
                    ; Actualiza las coordenadas del prota debido a la caida
                    ; Pone estado de caida
                    ; Comprueba si llega al suelo
                    ;----------------------------------------------------
                    
4D97 =              protaCayendo:
4D97: 2134E1          ld hl, protaStatus ; Puntero al estado del prota
4D9A: CD6475          call cayendo  ; Pone estado de cayendo y comprueba si llega al suelo
4D9D: D2844D          jp nc, protaAterriza ; Ha llegado al suelo
4DA0: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Prota status 3: Escaleras
                    ; Mueve al prota por las escaleras y comprueba si llega al final
                    ; Si llega al final pasa al estado de andar
                    ;----------------------------------------------------
                    
4DA1 =              protaEscaleras:
4DA1: 2135E1          ld hl, protaControl ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha, #10 = Boton A, #20 =Boton B
4DA4: 7E              ld a, (hl)
4DA5: E60C            and 0Ch
4DA7: C8              ret z  ; No esta pulsado DERECHA ni IZQUIERDA
                    
4DA8: 0601            ld b, 1  ; Velocidad del prota en las escaleras (mascara aplicada al timer)
4DAA: AF              xor a
4DAB: 325FE0          ld (quienEscalera), a ; (!?) Se usa esto? Quien esta en una escalera 0 = Prota. 1 = Momia
4DAE: CD7D75          call andaEscalera ; Mueve al prota por la escalera y comprueba si llega al final
4DB1: 2803            jr z, protaEscaleras2 ;  Ha llegado al final de las escaleras
4DB3: C32E4D          jp calcFrame ; Actualiaza el frame de la animacion
                    
4DB6 =              protaEscaleras2:
4DB6: AF              xor a  ; Estado: andar
4DB7: 1802            jr protaEscaleras3
                    
                    
                    
4DB9: 3E03            ld a, 3  ; (!?) Este codigo no se ejecuta nunca!
                    
4DBB =              protaEscaleras3:
4DBB: 3234E1          ld (protaStatus), a ; Esto solo se usa para poner al prota en estado de andar al terminar una escalera
4DBE: C9              ret
                    
                    ;----------------------------------------------------
                    ; El prota lanza un cuchillo
                    ;----------------------------------------------------
                    
4DBF =              setLanzaKnife:
                    ; IF (VERSION2)
4DBF: AF              xor a
4DC0: 21F4E1          ld hl,ElemEnProceso
4DC3: 77              ld (hl),a
4DC4 =              chkPuertaMov:  
4DC4: E5              push hl
4DC5: 3E04            ld a,04
4DC7: CD5B67          call getExitDat ; Obtiene puntero al estatus de la puerta que se est?procesando
4DCA: E6F0            and #F0  ; Se queda con el status (nibble alto)
4DCC: FE30            cp #30  ; Se esta abriendo?
4DCE: E1              pop hl
4DCF: C8              ret z  ; Impide lanzar el cuchillo mientras la puerta se abre para impedir que se corrompan los tiles al pasar el cuchillo sobre la puerta
4DD0: 34              inc (hl)
4DD1: 3E04            ld a,04  ; Numero m?imo de cuchillos
4DD3: BE              cp (hl)
4DD4: 20EE            jr nz,chkPuertaMov ; A? quedan cuchillos por comprobar
                    ; ENDIF
                    
4DD6: AF              xor a
4DD7: 3231E1          ld (lanzamFallido), a ; 1 = El cuchillo se ha lanzado contra un muro y directamente sale rebotando
                    
4DDA: 2136E1          ld hl, sentidoProta ; 1 = Izquierda, 2 = Derecha
4DDD: 7E              ld a, (hl)
4DDE: 23              inc hl  ; Apunta a la Y
4DDF: 1F              rra
4DE0: 0100FF          ld bc, 0FF00h ; X-1
4DE3: 3802            jr c, setLanzaKnife2 ;  Lo lanza a la izquierda
4DE5: 0612            ld b, 12h  ; X+18
                    
4DE7 =              setLanzaKnife2:
4DE7: C5              push bc
4DE8: CDB750          call chkTocaMuro ; Lo esta intentando lanzar pegado a un muro?
4DEB: C1              pop bc
4DEC: 2815            jr z, setLanzaKnife4 ; Si, asi no se puede a no ser que haya un hueco un tile por encima
                    
                    ; IF (VERSION2)
4DEE: C5              push bc
4DEF: 1A              ld a,(de)  ; Tile del mapa contra el que ha chocado
4DF0: CDC85A          call chkKnifeChoca ; Comprueba el tipo de tile que es
4DF3: C1              pop bc
4DF4: 280D            jr z,setLanzaKnife4 ; Es un muro, cuchillo, gema o pico
                    
                    ; ENDIF
                    
4DF6 =              setLanzaKnife3:
4DF6: 3E15            ld a, 15h
4DF8: 3245E1          ld (accionWaitCnt), a ; Contador usado para controlar la animacion y duracion de la accion (lanzar cuchillo, cavar, pasar puerta giratoria)
4DFB: 3E04            ld a, 4
4DFD: 3234E1          ld (protaStatus), a ; Cambia el estado del prota a "lanzando cuchillo"
4E00: C3674E          jp setFrameLanzar ; Pone fotograma de lanzar cuchillo
                    
                    ; Comprueba si al lanzar un cuchillo contra un muro
                    ; hay un hueco sobre este para que caiga el cuchillo
                    ; Por ejemplo: el prota esta en un agujero pero a los lados sobre su cabeza hay sitio libre
                    
4E03 =              setLanzaKnife4:
                    
                    ; IF (VERSION2)
4E03: FE10            cp #10  ; Es un muro?
4E05: C0              ret nz  ; No
                    ; ENDIF
                    
4E06: 0D              dec c  ; El tile que esta una fila por encima del prota
4E07: 2139E1          ld hl, ProtaX
4E0A: 7E              ld a, (hl)  ; X prota
4E0B: E607            and 7
4E0D: FE04            cp 4  ; En medio de un tile?
4E0F: C0              ret nz  ; No
                    
4E10: 2B              dec hl
4E11: 2B              dec hl  ; Apunta a la Y
4E12: CDB750          call chkTocaMuro ; Z = choca
4E15: 79              ld a, c  ; Tile comprobado
4E16: B7              or a  ; Es cero?
4E17: C0              ret nz  ; No esta libre
                    
4E18: 2131E1          ld hl, lanzamFallido ; 1 = El cuchillo se ha lanzado contra un muro y directamente sale rebotando
4E1B: 34              inc (hl)
4E1C: 18D8            jr setLanzaKnife3
                    
                    ;----------------------------------------------------
                    ; Prota status 4: El prota esta lanzando un cuchillo
                    ; Aqui llega el prota con el frame 1 de lanzar puesto
                    ; Tras unas iteraciones pasa al frame 2 de la animacion
                    ; Al terminar la animacion/espera, se restaura el sprite normal (sin objeto en las manos) y el estado de andar
                    ;----------------------------------------------------
                    
4E1E =              protaLanzaKnife:
4E1E: 2145E1          ld hl, accionWaitCnt ; Contador usado para controlar la animacion y duracion de la accion (lanzar cuchillo, cavar, pasar puerta giratoria)
4E21: CB66            bit 4, (hl)  ; Es menor de #10?
4E23: 2848            jr z, chkLanzaEnd
                    
4E25: 35              dec (hl)
4E26: 7E              ld a, (hl)
4E27: E60F            and 0Fh  ; Al llegar lanzaWaitCnt a #10 pone el segundo frame de la animacion de lanzar
4E29: C0              ret nz
                    
4E2A: 2161E2          ld hl, IDcuchilloCoge ; Cuchillo que coge el prota
4E2D: 7E              ld a, (hl)
4E2E: 23              inc hl
4E2F: 77              ld (hl), a  ; Cuchillo en proceso
                    
4E30: AF              xor a
4E31: CD175B          call getKnifeData
4E34: 3604            ld (hl), 4  ; Estado: lanzamiento
                    
4E36: 3A36E1          ld a, (sentidoProta) ; 1 = Izquierda, 2 = Derecha
4E39: E603            and 3
4E3B: 23              inc hl
4E3C: 77              ld (hl), a  ; Pone al cuchillo el mismo sentido que tiene el prota
                    
4E3D: 3A31E1          ld a, (lanzamFallido) ; 1 = El cuchillo se ha lanzado contra un muro y directamente sale rebotando
4E40: B7              or a  ; Sale directamente rebotando contra el muro?
4E41: 281F            jr z, setFrameLanzar2 ; Pone frame 2 del lanzamiento: brazo abajo
                    
                    
                    ; El cuchillo directamente sale rebotando para caer sobre el muro que esta delante
                    
4E43: 2B              dec hl
4E44: 3607            ld (hl), 7  ; estado: rebotando
4E46: 23              inc hl  ; sentido
4E47: 23              inc hl  ; Y
                    
4E48: 1137E1          ld de, ProtaY
4E4B: 1A              ld a, (de)  ; Y del prota
4E4C: D608            sub 8
4E4E: 77              ld (hl), a  ; Y del cuchillo 8 pixeles por encima del prota
                    
4E4F: 23              inc hl  ; X decimales
4E50: 23              inc hl  ; X cuchillo
4E51: 13              inc de  ; X decimales
4E52: 13              inc de  ; X prota
                    
4E53: 1A              ld a, (de)  ; X prota
4E54: C604            add a, 4
4E56: 77              ld (hl), a  ; X del cuchillo igual a X prota + 4
4E57: 23              inc hl
4E58: 13              inc de
4E59: 1A              ld a, (de)  ; Habitacion prota
4E5A: 77              ld (hl), a  ; Habitacion cuchillo
                    
4E5B: 3E04            ld a, 4
4E5D: CD1040          call ADD_A_HL
4E60: 3600            ld (hl), 0
                    
4E62 =              setFrameLanzar2:
4E62: 3E09            ld a, 9  ; Frame 2 de lanzar cuchillo (accion frame 2)
4E64: C3694E          jp setFrameProta
                    
4E67 =              setFrameLanzar:
4E67: 3E08            ld a, 8  ; Frame de lanzar cuchillo (accion frame 1)
                    
4E69 =              setFrameProta:
4E69: 323FE1          ld (protaFrame), a
4E6C: C9              ret
                    
                    ;----------------------------------------------------
                    ; Comprueba si termina el lanzamiento para restaurar el sprite y el estado de andar
                    ;----------------------------------------------------
                    
4E6D =              chkLanzaEnd:
4E6D: 2145E1          ld hl, accionWaitCnt ; Contador usado para controlar la animacion y duracion de la accion (lanzar cuchillo, cavar, pasar puerta giratoria)
4E70: 35              dec (hl)
4E71: C0              ret nz
                    
4E72: AF              xor a
4E73: 3234E1          ld (protaStatus), a ; Pone estado de andar
4E76: 1842            jr quitaObjeto ; Carga sprites normales (sin objeto)
                    
                    
                    
                    ;----------------------------------------------------
                    ; Status 5: Prota picando
                    ; Animacion del prota picando y rompiendo los ladrillos
                    ;----------------------------------------------------
                    
4E78 =              protaPicando:
4E78: 2145E1          ld hl, accionWaitCnt ; Contador usado para controlar la animacion y duracion de la accion (lanzar cuchillo, cavar, pasar puerta giratoria)
4E7B: 35              dec (hl)
4E7C: 7E              ld a, (hl)
4E7D: E60F            and 0Fh
4E7F: 280B            jr z, protaPicando3
                    
4E81: 7E              ld a, (hl)
4E82: CB67            bit 4, a
4E84: 3E09            ld a, 9  ; Frame 2 de la accion de picar
4E86: 2801            jr z, protaPicando2
4E88: 3D              dec a  ; Frame 1 de la accion de picar
                    
4E89 =              protaPicando2:
4E89: C3424D          jp setProtaFrame
                    
4E8C =              protaPicando3:
4E8C: 7E              ld a, (hl)  ; Contador de la accion de picar
4E8D: CB67            bit 4, a  ; Es multiplo de #20
4E8F: 0604            ld b, 4  ; Frames con el pico abajo
4E91: 200F            jr nz, protaPicando4
                    
4E93: 0608            ld b, 8  ; Frames con el pico arriba
4E95: C5              push bc
4E96: E5              push hl
4E97: 2148E1          ld hl, agujeroCnt ; Al comenzar a pica vale #15
4E9A: 35              dec (hl)
4E9B: 35              dec (hl)
4E9C: 35              dec (hl)
4E9D: CDF768          call drawAgujero ; Dibuja la animacion de como se rompen los ladrillos al picar y los borra del mapa
4EA0: E1              pop hl
4EA1: C1              pop bc
                    
4EA2 =              protaPicando4:
4EA2: 7E              ld a, (hl)  ; AccionWaitCnt
4EA3: E6F0            and 0F0h
4EA5: B0              or b  ; Numero de frames que se mantiene en la posicion actual
4EA6: EE10            xor 10h
4EA8: 77              ld (hl), a
                    
4EA9: 3A48E1          ld a, (agujeroCnt) ; Al comenzar a pica vale #15
4EAC: A7              and a
4EAD: C0              ret nz  ; No ha terminado de hacer el agujero
                    
4EAE: CDCF4F          call chkIncrust ; Comprueba que al terminar el agujero el prota no este incrustado (?)
                    
4EB1: 3E01            ld a, 1
4EB3: CD424D          call setProtaFrame ; Pone frame con los pies juntos
                    
4EB6: AF              xor a
4EB7: 3234E1          ld (protaStatus), a ; Restaura estado de andar
                    
                    ;----------------------------------------------------
                    ; Quita el objeto que se tiene.
                    ; Actualiza los sprites dependiendo de que se lleve en las manos
                    ;----------------------------------------------------
                    
4EBA =              quitaObjeto:
4EBA: AF              xor a
                    
4EBB =              cogeObjeto:
4EBB: 3244E1          ld (objetoCogido), a ; #10 = Cuchillo, #20 = Pico
4EBE: C35650          jp loadAnimation ; Actualiza los sprites del prota
                    
                    
                    ;----------------------------------------------------
                    ; Prota usa pico
                    ; Comprueba si el prota puede hacer un agujero con el pico
                    ; Para ello tiene que estar sobre suelo firme (plataforma de piedra)
                    ; y que debajo de la plataforma no haya una puerta giratoria
                    ; Tambien comprueba que sobre el lugar del agujero no haya un cuchillo o una gema
                    ;----------------------------------------------------
                    
4EC1 =              chkProtaPica:
4EC1: 2137E1          ld hl, ProtaY
4EC4: CDAD50          call chkPisaSuelo
4EC7: C0              ret nz  ; El prota no esta sobre suelo firme
                    
4EC8: 2B              dec hl
4EC9: E5              push hl  ; Apunta al sentido
4ECA: CDDA51          call chkChocaAndar3
4ECD: E1              pop hl
4ECE: 300C            jr nc, chkProtaPica2 ; No choca
                    
4ED0: 7E              ld a, (hl)  ; Sentido
4ED1: EE03            xor 3  ; Invierte el sentido
4ED3: 47              ld b, a  ; Lo guarda en B para pasarselo a la funcion
4ED4: E5              push hl
4ED5: CDDB51          call chkChocaAndar4
4ED8: E1              pop hl
4ED9: DA6C4F          jp c, picaLateral ; Si esta atrapado en un agujero pica uno de los muros lateralmente
                    
4EDC =              chkProtaPica2:
4EDC: 5E              ld e, (hl)  ; Sentido
4EDD: 23              inc hl
4EDE: 7E              ld a, (hl)  ; Y prota
4EDF: C610            add a, 10h  ; Le suma el alto del prota
4EE1: 57              ld d, a  ; Guarda en D la Y del suelo bajo los pies
4EE2: 23              inc hl
4EE3: 23              inc hl
4EE4: 7E              ld a, (hl)  ; X prota
4EE5: 011000          ld bc, 10h  ; Offset X: izquierda = 0, derecha = 16
4EE8: E607            and 7
4EEA: FE05            cp 5  ; Calcula la posicion relativa respecto al tile
4EEC: 3802            jr c, chkProtaPica3
                    
                    ; IF (VERSION2)
4EEE: 0608            ld b,#08
                    ; ELSE
                    ;  ld bc, 810h ; Offset: izquierda = 8, derecha = 16
                    ; ENDIF
                     
4EF0 =              chkProtaPica3:
4EF0: 7B              ld a, e  ; Sentido
4EF1: 1F              rra
4EF2: 78              ld a, b  ; Offset picando a la izquierda
4EF3: 3801            jr c, chkProtaPica4
4EF5: 79              ld a, c  ; Offset picando a la derecha
                    
4EF6 =              chkProtaPica4:
4EF6: 86              add a, (hl)  ; Suma el desplazamiento a la X del prota
4EF7: 5F              ld e, a
4EF8: E6F8            and 0F8h
4EFA: C8              ret z  ; Demasiado pegado a la izquierda
                    
4EFB: FEF8            cp 0F8h
4EFD: C8              ret z  ; Demasiado pegado a la derecha
                    
4EFE: 2149E1          ld hl, agujeroDat ; Y, X, habitacion
4F01: E5              push hl
4F02: 72              ld (hl), d  ; Y agujero
4F03: 23              inc hl
4F04: 23              inc hl
4F05: 73              ld (hl), e  ; X agujero
4F06: 13              inc de
4F07: 23              inc hl
4F08: 3A3AE1          ld a, (ProtaRoom) ; Parte alta de la coordenada X. Indica la habitacion de la piramide
4F0B: 77              ld (hl), a  ; Habitacion del agujero
4F0C: E1              pop hl
4F0D: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coordenadas apuntada por HL
4F10: E6F0            and 0F0h  ; Se queda con el tipo de tile
4F12: FE10            cp 10h  ; Es una plataforma, ladrillo o muro?
4F14: C0              ret nz  ; No
                    
4F15: 7E              ld a, (hl)
4F16: E60F            and 0Fh  ; Se queda con el tipo de ladrillo
4F18: FE04            cp 4  ; Es ladrillo de muro o plataforma?
                    
                    ; IF (VERSION2)
4F1A: 3803            jr c,chkProtaPica4b
4F1C: FE09            cp 9  ; Es un ladrillo de un muro trampa?
4F1E: C0              ret nz
                    ; ELSE
                    ;  ret nc  ; No
                    ; ENDIF
                     
4F1F =              chkProtaPica4b: 
4F1F: 3E60            ld a, 60h  ; Desplazamiento a una fila inferior
4F21: CD1040          call ADD_A_HL
4F24: 7E              ld a, (hl)  ; Tile del mapa que esta por debajo del anterior
4F25: E6F0            and 0F0h  ; Tipo de tile
4F27: FE50            cp 50h  ; Es una puerta giratoria?
4F29: C8              ret z  ; Si, aqui no se puede hacer un agujero (que nos cargamos la puerta!)
                    
                    
                    ; Esta comprobacion evita que se haga un agujero debajo de un cuchillo, pico o una gema
                    
4F2A: 0140FF          ld bc, 0-0C0h ; Desplazamiento 2 filas mas arriba. Justo un tile por encima del suelo
4F2D: 09              add hl, bc
4F2E: 7E              ld a, (hl)  ; Lee tile del mapa
4F2F: E6F0            and 0F0h  ; Esta vacio?
4F31: 2801            jr z, chkProtaPica5+1 ; (!?) Esto salta y ejecuta "JR NZ,#4ED1" Claro que nunca sera NZ si salta siendo Z
                    
4F33 =              chkProtaPica5:
4F33: FE20            cp 20h  ; Es una escalera?
4F35: C0              ret nz  ; Si, se puede hacer un agujero a los pies de una escalera
                    
4F36: 2134E1          ld hl, protaStatus ; Puntero al estado del prota
4F39: 3605            ld (hl), 5  ; Estado: Picando
                    
4F3B: 23              inc hl
4F3C: 23              inc hl
4F3D: 7E              ld a, (hl)  ; Sentido del prota
4F3E: 1F              rra
4F3F: 23              inc hl
4F40: 23              inc hl
4F41: 23              inc hl
4F42: 7E              ld a, (hl)  ; X
4F43: 3010            jr nc, chkProtaPica7 ; Mira a la derecha
                    
4F45: E607            and 7  ; Posicion relativa al tile
4F47: FE05            cp 5  ; Esta en los 4 pixeles derechos del tile?
4F49: 7E              ld a, (hl)  ; X
4F4A: 3806            jr c, chkProtaPica6 ; No
4F4C: C604            add a, 4  ; Pasa al siguiente tile
4F4E: E6F8            and 0F8h  ; Lo ajusta a la X del tile
4F50: C602            add a, 2  ; Le suma 2
                    
4F52 =              chkProtaPica6:
4F52: 77              ld (hl), a  ; Actualiza la X del prota
4F53: 180C            jr setPicarStatus
                    
                    ; El prota esta haciendo el agujero hacia la derecha
                    
4F55 =              chkProtaPica7:
4F55: E607            and 7  ; Posicion X relativa al tile
4F57: D601            sub 1
4F59: FE03            cp 3  ; Esta en la parte derecha o izquierda del tile?
4F5B: 7E              ld a, (hl)
4F5C: 3802            jr c, chkProtaPica8
4F5E: E6FC            and 0FCh  ; Ajusta la X del prota a la X del tile
                    
4F60 =              chkProtaPica8:
4F60: 77              ld (hl), a  ; Actualiza la X del prota
                    
4F61 =              setPicarStatus:
4F61: 3E15            ld a, 15h
4F63: 3248E1          ld (agujeroCnt), a ; Al comenzar a pica vale #15
4F66: 3E05            ld a, 5
4F68: 3234E1          ld (protaStatus), a ; Pone estado de picando
4F6B: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Cuando el prota esta atrapado entre dos muros en vez de
                    ; picar en el suelo, pica en la pared
                    ;----------------------------------------------------
                    
4F6C =              picaLateral:
4F6C: 1149E1          ld de, agujeroDat ; Y, X, habitacion
4F6F: 23              inc hl
4F70: 7E              ld a, (hl)  ; Y del prota
4F71: 12              ld (de), a  ; Y del agujero
4F72: 23              inc hl
4F73: 13              inc de
4F74: 13              inc de
4F75: 23              inc hl
4F76: 3A36E1          ld a, (sentidoProta) ; 1 = Izquierda, 2 = Derecha
4F79: 1F              rra
4F7A: 7E              ld a, (hl)  ; X del prota
4F7B: 3802            jr c, picaLateral2 ; Va a pizar hacia la izquierda
4F7D: C610            add a, 10h  ; Pica hacia la derecha, asi que le suma a la X el ancho del prota (16 pixeles)
                    
4F7F =              picaLateral2:
4F7F: 12              ld (de), a  ; X del agujero
4F80: E6F8            and 0F8h
4F82: C8              ret z  ; Esta picando el muro izquierdo que delimita la habitacion
                    
4F83: FEF8            cp 0F8h
4F85: C8              ret z  ; Esta intentando picar el muro derecho que delimita la habitacion
                    
4F86: 23              inc hl
4F87: 13              inc de
4F88: 7E              ld a, (hl)  ; Habitacion prota
4F89: 12              ld (de), a  ; Habitacion agujero
4F8A: CD614F          call setPicarStatus ; Pone al prota en estado de picar
                    
4F8D: 3E02            ld a, 2
4F8F: 3245E1          ld (accionWaitCnt), a ; Contador usado para controlar la animacion y duracion de la accion (lanzar cuchillo, cavar, pasar puerta giratoria)
4F92: 2137E1          ld hl, ProtaY
4F95: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
                    
4F98: 3A36E1          ld a, (sentidoProta) ; 1 = Izquierda, 2 = Derecha
4F9B: 1F              rra
4F9C: 3802            jr c, picaLateral3 ; Izquierda
                    
4F9E: 23              inc hl
4F9F: 23              inc hl  ; Apunta al tile que esta a la derecha del prota
                    
4FA0 =              picaLateral3:
4FA0: 7E              ld a, (hl)  ; Tile del mapa
4FA1: E6F0            and 0F0h
4FA3: FE10            cp 10h  ; Es un muro/plataforma?
4FA5: 280C            jr z, picaLateral4 ; Si
                    
                    
                    ; Si a la altura de la cabeza del prota no hay muro, comienza a picar un tile mas abajo
                    
4FA7: 2149E1          ld hl, agujeroDat ; Y, X, habitacion
4FAA: 7E              ld a, (hl)
4FAB: C608            add a, 8
4FAD: 77              ld (hl), a  ; Desplaza el orgigen del agujero un tile mas abajo
4FAE: 3E09            ld a, 9  ; Como solo va a picar un tile la duracion es la mitad
4FB0: 3248E1          ld (agujeroCnt), a ; Al comenzar a pica vale #15
                    
4FB3 =              picaLateral4:
4FB3: 3E45            ld a, 45h  ; SFX picar
4FB5: C3A97A          jp setMusic
                    
                    
                    ;----------------------------------------------------
                    ; Status 6: Prota pasando por una puerta giratoria
                    ;----------------------------------------------------
                    
4FB8 =              protaGiratoria:
4FB8: 3A03E0          ld a, (timer)
4FBB: E601            and 1
4FBD: C0              ret nz  ; Procesa uno de cada dos frames
                    
4FBE: 2145E1          ld hl, accionWaitCnt ; Contador usado para controlar la animacion y duracion de la accion (lanzar cuchillo, cavar, pasar puerta giratoria)
4FC1: 35              dec (hl)  ; Ha terminado de pasar la puerta?
4FC2: 2807            jr z, setProtaAndar ; si
                    
4FC4: 213EE1          ld hl, protaMovCnt ; Contador usado cada vez que se mueve el prota. (!?) No se usa su valor
4FC7: 34              inc (hl)  ; Incrementa contardor de movimiento y animacion
4FC8: C3F44C          jp protaAnda4 ; Mueve y anima al prota
                    
4FCB =              setProtaAndar:
4FCB: 3234E1          ld (protaStatus), a ; Pone el estado 0 (andar) en el prota
4FCE: C9              ret
                    
                    ;----------------------------------------------------
                    ; Comprueba si el prota esta incrustado despues de hacer un agujero con el pico
                    ; (Por si le baja un muro trampa?)
                    ;----------------------------------------------------
                    
4FCF =              chkIncrust:
4FCF: 2137E1          ld hl, ProtaY
4FD2: 010C04          ld bc, 40Ch ; Offset X+4, Y+12
4FD5: CD4D74          call chkIncrustUp
4FD8: 0604            ld b, 4
4FDA: 3009            jr nc, chkIncrust2
                    
4FDC: 010C0B          ld bc, 0B0Ch ; offset X+11, Y+12
4FDF: CD4D74          call chkIncrustUp
4FE2: D8              ret c
4FE3: 0600            ld b, 0
                    
4FE5 =              chkIncrust2:
4FE5: 2139E1          ld hl, ProtaX
4FE8: 7E              ld a, (hl)  ; X prota
4FE9: 80              add a, b  ; Le suma el desplazamiento
4FEA: E6FC            and 0FCh  ; Ajusta la coordenada X del prota a multiplo de 4
4FEC: 77              ld (hl), a  ; Actualiza la X del prota
4FED: C9              ret
                    ;----------------------------------------------------
                    ;
                    ; Carga los graficos y sprites del juego y
                    ; crea copias invertidas de algunos de ellos
                    ;
                    ;----------------------------------------------------
                    
4FEE =              loadGameGfx:
4FEE: 2130E1          ld hl, statusEntrada
4FF1: 1131E1          ld de, lanzamFallido ; 1 = El cuchillo se ha lanzado contra un muro y directamente sale rebotando
4FF4: 010005          ld bc, 500h
4FF7: AF              xor a
4FF8: 77              ld (hl), a
4FF9: EDB0            ldir   ; Borra RAM
                    
4FFB: 210022          ld hl, 2200h ; Destino = Patron #40 de la tabla
4FFE: 113856          ld de, GFX_InGame
5001: CDF144          call UnpackPatterns
                    
5004: 212802          ld hl, 228h ; Tabla de colores de los patrones del juego
5007: 117957          ld de, COLOR_InGame
500A: CDF144          call UnpackPatterns
                    
500D: 214023          ld hl, 2340h ; Origen = Patron #68 (Puerta)
5010: 11B823          ld de, 23B8h ; Destino = Patron #77
5013: 0E0F            ld c, 0Fh  ; Numero de patrones a invertir
5015: CD6845          call FlipPatrones ; Invierte algunos graficos como las escaleras y las puertas
                    
5018: 11DD57          ld de, COLOR_Flipped
501B: 21B803          ld hl, 3B8h
501E: CDF144          call UnpackPatterns ; Pone color a los patrones invertidos
                    
5021: 0606            ld b, 6  ; Numero de gemas
5023: 213024          ld hl, 2430h ; Destino = Patron #96 de la tabla (Gemas)
                    
5026 =              UnpackGema:
5026: 116F57          ld de, GFX_GEMA
5029: E5              push hl
502A: C5              push bc
502B: CDF144          call UnpackPatterns
502E: C1              pop bc
502F: E1              pop hl
5030: 110800          ld de, 8
5033: 19              add hl, de
5034: 10F0            djnz UnpackGema
                    
                    
5036: 11F257          ld de, COLOR_GEMAS
5039: 213004          ld hl, 430h
503C: CDF144          call UnpackPatterns
                    
503F: 119655          ld de, GFX_SPRITES2
5042: CD1445          call unpackGFXset
                    
5045: 113655          ld de, GFX_MOMIA
5048: CD1445          call unpackGFXset
                    
504B: 214019          ld hl, 1940h ; Datos GFX momia (Sprite generatos table address)
504E: 11501C          ld de, 1C50h ; Direccion SGT de la momia invertida
5051: 0E03            ld c, 3
5053: CD4C45          call flipSprites
                    
                    ; Carga los sprites que corresponden al estado del personaje
                    ; Nada en las manos, llevando un cuchillo o llevando un pico
                    
5056 =              loadAnimation:
5056: 3A44E1          ld a, (objetoCogido) ; #10 = Cuchillo, #20 = Pico
5059: 1F              rra
505A: 1F              rra
505B: 1F              rra
505C: E61E            and 1Eh
505E: 217550          ld hl, IndexSprites
5061: CD496D          call getIndexHL_A
5064: EB              ex de, hl
5065: 210018          ld hl, 1800h
5068: E5              push hl
5069: CD1445          call unpackGFXset
506C: E1              pop hl  ; Recupera la direccion de los sprites en VRAM
506D: 11101B          ld de, 1B10h ; Destino sprites invertidos (#60-#61)
5070: 0E0A            ld c, 0Ah  ; Numero de sprites a invertir
5072: C34C45          jp flipSprites
                    
                    
                    
5075: 0E52          IndexSprites: dw GFX_Prota
5077: CA52            dw GFX_ProtaKnife
5079: FD53            dw GFX_ProtaPico
                    
                    
507B: 2137E1          ld hl, ProtaY ; (!?) Este codigo no se ejecuta nunca!
                    
                    ;----------------------------------------------------
                    ; Comprueba si choca contra el suelo
                    ; Out:
                    ;   Z = Ha chocado
                    ;   C = No ha chocado
                    ;----------------------------------------------------
                    
507E =              chkChocaSuelo:
507E: E5              push hl
507F: 2B              dec hl
5080: 7E              ld a, (hl)  ; Sentido
5081: 23              inc hl
5082: 010F05          ld bc, 50Fh ; Parte inferior izquierda
5085: 1F              rra
5086: 3802            jr c, chkChocaSuelo2 ; Va hacia la izquierda
5088: 060B            ld b, 0Bh  ; Parte inferior derecha
                    
508A =              chkChocaSuelo2:
508A: CDE150          call getMapOffset ; Obtiene en HL la direccion del mapa que corresponde a las coordenadas
508D: E1              pop hl
508E: E6F0            and 0F0h  ; Se queda con la familia de tiles
5090: FE10            cp 10h  ; Es una plataforma?
5092: C8              ret z  ; Si, ha chocado
                    
5093: 37              scf
5094: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba si hay suelo bajo los pies del prota
                    ; Out:
                    ;    Z = Hay suelo
                    ;    C = No hay suelo
                    ;----------------------------------------------------
                    
5095 =              chkProtaCae:
5095: 2137E1          ld hl, ProtaY
                    
5098 =              chkCae: 
5098: CDAD50          call chkPisaSuelo
509B: C8              ret z  ; Esta pisando suelo
                    
509C: 23              inc hl
509D: 23              inc hl
509E: 7E              ld a, (hl)  ; X del elemento
509F: E607            and 7
50A1: FE04            cp 4  ; Se encuentra en los 4 primeros pixeles de un tile?
50A3: 7E              ld a, (hl)
50A4: 3002            jr nc, chkCae2 ; Dependiendo del lado por el que se cae, mueve el elemento 4 pixeles en esa direccion para separarlo de la plataforma
                    
50A6: C604            add a, 4  ; Desplaza el elemento 4 pixeles a la derecha
                    
50A8 =              chkCae2:
50A8: E6FC            and 0FCh  ; Ajusta la X a multiplo de 4
50AA: 77              ld (hl), a  ; Actualiza la X
50AB: 37              scf
50AC: C9              ret
                    
                    ;----------------------------------------------------
                    ; Comprueba si el elemento actual esta pisando suelo
                    ; Tanto el prota como las momias tienen una altura de 16
                    ; por lo que sumando 17 a su altura se miran lo que hay justo
                    ; debajo de sus pies
                    ; Out:
                    ;   DE = Puntero al tile del mapa
                    ;    Z = Choca
                    ;----------------------------------------------------
                    
50AD =              chkPisaSuelo:
50AD: 011106          ld bc, 611h ; Coordenadas X + 6, Y + 17
50B0: CDB750          call chkTocaMuro ; Z = choca
50B3: C8              ret z  ; Esta sobre una plataforma
                    
50B4: 01110A          ld bc, 0A11h ; X + 10, Y + 17
                    
50B7 =              chkTocaMuro:
50B7: E5              push hl  ; Z = choca
50B8: CDE150          call getMapOffset ; Obtiene en HL la direccion del mapa que corresponde a las coordenadas
50BB: EB              ex de, hl
50BC: E1              pop hl
                    
50BD: 2B              dec hl
50BE: 2B              dec hl
50BF: 2B              dec hl
                    
50C0: 46              ld b, (hl)  ; Status
50C1: 23              inc hl
50C2: 23              inc hl
50C3: 23              inc hl
50C4: E6F0            and 0F0h  ; Se queda con la familia a la que corresponde el tile del mapa
50C6: 4F              ld c, a
50C7: FE10            cp 10h  ; Plataformas
50C9: C8              ret z  ; Esta tocando una plataforma
                    
50CA: 78              ld a, b  ; Status
50CB: FE02            cp 2  ; Cayendo?
50CD: 79              ld a, c  ; Recupera el tipo de tile que toca
50CE: 2803            jr z, noTocaMuro
                    
50D0: FE50            cp 50h  ; Puerta giratoria
50D2: C9              ret
                    
50D3 =              noTocaMuro:
50D3: 79              ld a, c  ; (!?) No hace falta
50D4: 05              dec b  ; Set NZ
50D5: C9              ret
                    
50D6 =              getMapOffset00:
50D6: D5              push de  ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
50D7: C5              push bc
50D8: 010000          ld bc, 0
50DB: CDE150          call getMapOffset ; Obtiene en HL la direccion del mapa que corresponde a las coordenadas
50DE: C1              pop bc
50DF: D1              pop de
50E0: C9              ret
                    
                    ;----------------------------------------------------
                    ; Obtiene el tile del mapa que hay en la coordenadas a
                    ; las que apunta HL.
                    ;
                    ; In:
                    ;  HL = Puntero a coordenadas (Y, X decimales, X, Habitacion)
                    ;   B = Offset X (puede tener valores negativos)
                    ;   C = Offset Y
                    ; Out:
                    ;  HL = Puntero a la posicion del mapa de esas coordenadas
                    ;   A = Patron del mapa que hay en esas coordenadas
                    ;----------------------------------------------------
                    
50E1 =              getMapOffset:
50E1: 7E              ld a, (hl)  ; Y
50E2: 81              add a, c  ; Le suma el desplazamiento Y para poder comprobar un punto determinado
                         ; del elemento distinto de sus coordendas de origen
50E3: 1F              rra
50E4: 1F              rra
50E5: 1F              rra
50E6: E61F            and 1Fh  ; Ajusta la coordenada Y a patrones (/8)
                    
50E8: 5F              ld e, a
50E9: 1600            ld d, 0
50EB: EB              ex de, hl
50EC: 29              add hl, hl
50ED: 29              add hl, hl
50EE: 29              add hl, hl
50EF: 29              add hl, hl
50F0: 29              add hl, hl  ; x32
                    
50F1: C5              push bc
50F2: 44              ld b, h
50F3: 4D              ld c, l
50F4: 29              add hl, hl
50F5: 09              add hl, bc  ; x96 (#60) Tres pantallas en horizontal
50F6: C1              pop bc
                    
50F7: EB              ex de, hl  ; DE = Desplazamiento en el mapa correspondiente a la Y (Y * 96)
                         ; HL = Datos del elemento (coordenadas)
50F8: 23              inc hl  ; Decimales X
50F9: 23              inc hl
50FA: 7E              ld a, (hl)  ; X
50FB: 23              inc hl
50FC: 66              ld h, (hl)  ; Pantalla (0-2)
50FD: 6F              ld l, a  ; HL = Coordenada X global (Pantalla + X local)
50FE: C5              push bc
50FF: 48              ld c, b
5100: 0600            ld b, 0
5102: CB79            bit 7, c  ; Es negativo el offset X?
5104: 2801            jr z, getMapOff2 ; No
5106: 05              dec b  ; Convierte el valor en negativo
                    
5107 =              getMapOff2:
5107: 09              add hl, bc  ; Offset X
5108: 7D              ld a, l
5109: C1              pop bc
510A: CB3C            srl h
510C: 1F              rra
510D: CB3C            srl h
510F: 1F              rra
5110: CB3C            srl h
5112: 1F              rra
5113: 6F              ld l, a  ; Divide HL entre 8 para ajustar a patrones
5114: 19              add hl, de  ; Le suma el desplazamiento Y calculado anteriormente
5115: 1100E7          ld de, MapaRAMRoot ; La primera fila del mapa no se usa (ocupada por el marcador). Tambien usado como inicio de la pila
5118: 19              add hl, de  ; Calcula puntero a la posicion de mapa
5119: 7E              ld a, (hl)  ; Lee el contenido actual de esas coordenadas
511A: C9              ret
                    
511B: 37              scf   ; (!?) Este codigo no se ejecuta nunca!
511C: C9              ret
                    
                    ;----------------------------------------------------
                    ; Comprueba si ha llegado al final de la escalera
                    ; Out:
                    ;   Z = Ha llegado al final
                    ;  NZ = No ha llegado al final
                    ;----------------------------------------------------
                    
511D =              chkFinEscalera:
511D: 7E              ld a, (hl)
511E: E607            and 7
5120: C0              ret nz  ; La Y no es multiplo de 8
                    
5121: C5              push bc
5122: 011008          ld bc, 810h ; Offset parte central abajo (8,16)
5125: CDE150          call getMapOffset ; Obtiene el tile que esta en los pies
5128: E6F0            and 0F0h  ; Se queda con la familia o tipo
512A: FE10            cp 10h  ; Es una plataforma o incio de escalera?
512C: C1              pop bc
512D: C8              ret z  ; Si
                    
512E: A7              and a  ; No
512F: C9              ret
                    
                    ;----------------------------------------------------
                    ; Comprueba si coge una escalera
                    ; Lo primero que se comprueba es si estan los controles de ARRIBA o ABAJO pulsados
                    ; Dependiendo de la posicion relativa X respecto al tile del mapa se comprueba si sube a la derecha (0-3) o a la izquierda (4-7)
                    ; Luego se mira el tile que hay en los pies del personaje y se compara con el tipo de escalera anterior
                    ; Out:
                    ;    NZ = No la coge
                    ;----------------------------------------------------
                    
5130 =              chkCogeEscalera:
5130: 2135E1          ld hl, protaControl ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha, #10 = Boton A, #20 =Boton B
                    
5133 =              chkCogeEsc2:
5133: 7E              ld a, (hl)  ; Controles
5134: E603            and 3  ; Arriba o abajo?
5136: 285D            jr z, noCogeEscalera ; No
                    
5138: 1F              rra
5139: 305D            jr nc, chkBajaEscalera ; Abajo
                    
513B: 23              inc hl
513C: 23              inc hl
513D: 23              inc hl
513E: 23              inc hl
513F: 7E              ld a, (hl)  ; X
5140: E607            and 7
5142: 2851            jr z, noCogeEscalera ; No esta "dentro" del tile de escalera
                    
5144: D605            sub 5  ; Dependiendo de la posicion relativa X respecto al tile del mapa se compruba si sube a la derecha (0-3) o a la izquierda (4-7)
5146: 0622            ld b, 22h  ; Escaleras suben derecha
5148: 3801            jr c, chkCogeEsc3
514A: 05              dec b  ; Escaleras suben izquierda
                    
514B =              chkCogeEsc3:
514B: 2B              dec hl
514C: 2B              dec hl  ; Apunta a la Y
514D: E5              push hl
514E: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
5151: 3E61            ld a, 61h  ; 3 pantallas + 1 (tile abajo a la derecha = Piernas del elemento)
5153: CD1040          call ADD_A_HL
                    
5156: 7E              ld a, (hl)  ; Tile del mapa que esta en las piernas del elemento
5157: 4F              ld c, a
5158: E1              pop hl  ; Apunta a la Y
5159: B8              cp b  ; Es una escalera?
515A: 2809            jr z, chkSubeEsc2 ; si
                    
                    ; Comprueba si hay un cuchillo sobre el primer pelda? de la escalera
                    
515C: F5              push af
515D: 78              ld a, b
515E: C610            add a, 10h  ; B = #32 o #31? (tiles cuchillo sobre escalera)
5160: 47              ld b, a
5161: F1              pop af
5162: B8              cp b
5163: 2030            jr nz, noCogeEscalera
                    
5165 =              chkSubeEsc2:
5165: E601            and 1
5167: EE01            xor 1
5169: 47              ld b, a  ; 1 = Escaleras a la derecha, 0 = A la izquierda
                    
516A: 3A4DE1          ld a, (modoSentEsc) ; Si es 0 guarda en "sentidoEscalera" el tipo de escalera que se coge el prota. 0 = \, 1 = /
516D: A7              and a
516E: 2004            jr nz, chkSubeEsc3 ; No guarda en sentidoEscalera el sentido de la escalera
                    
5170: 78              ld a, b
5171: 3243E1          ld (sentidoEscalera), a ; 0 = \, 1 = /
                         ; Tambien usado para saber si el salto fue en vertical (guarda el estado de las teclas en el momento del salto.
                    
5174 =              chkSubeEsc3:
5174: 23              inc hl
5175: 23              inc hl
5176: 7E              ld a, (hl)  ; X
5177: 2B              dec hl
5178: 2B              dec hl  ; Apunta a la Y
5179: 118D51          ld de, distPeldano
517C: E607            and 7  ; Se queda con la X relativa del personaje respecto al tile de la escalera
517E: CD1540          call ADD_A_DE
5181: 1A              ld a, (de)  ; Desplazamiento vertical
5182: 86              add a, (hl)  ; Se lo suma a la Y
5183: 77              ld (hl), a
5184: 2B              dec hl
5185: 2B              dec hl
5186: 2B              dec hl
5187: 3603            ld (hl), 3  ; Status: subiendo o bajando escalera
                    
5189: AF              xor a
518A: FE00            cp 0  ; Set Z, NC
518C: C9              ret
                    
                    ;----------------------------------------------------
                    ; Tabla con las distancias al primer pelda? dependiendo
                    ; de la posicion del personaje respecto al tile del pelda?
                    ;
                    ;----------------------------------------------------
518D: 00            distPeldano: db 0
518E: FF              db 0-1
518F: FE              db 0-2
5190: FD              db 0-3
5191: FC              db 0-4
5192: FD              db 0-3
5193: FE              db 0-2
5194: FF              db 0-1
                    
5195 =              noCogeEscalera:
5195: AF              xor a
5196: 3D              dec a
5197: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba si hay escaleras para bajar bajo los pies del personaje
                    ; Out:
                    ;    NC/Z = Baja escaleras
                    ;----------------------------------------------------
                    
5198 =              chkBajaEscalera:
5198: 23              inc hl
5199: 23              inc hl
519A: 23              inc hl
519B: 23              inc hl
519C: 7E              ld a, (hl)  ; X
519D: E607            and 7
519F: FE04            cp 4
51A1: 20F2            jr nz, noCogeEscalera ; No esta justo en la mitad del tile de la escalera
                    
51A3: 2B              dec hl
51A4: 2B              dec hl
51A5: E5              push hl  ; Apunta a Y
51A6: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
51A9: 3EC1            ld a, 0C1h  ; Fila de patrones por debajo del personaje, justo bajo sus pies
                         ; #60 por fila * 2 (16 de altura) + 1 (8 pixeles) = justo bajo los pies
51AB: CD1040          call ADD_A_HL
51AE: 7E              ld a, (hl)  ; Tile del mapa bajo los pies
51AF: 4F              ld c, a
51B0: E1              pop hl
51B1: FE16            cp 16h  ; Tile incio de escaleras que bajan a la derecha
51B3: 2804            jr z, chkBajaEsc2
                    
51B5: FE17            cp 17h  ; Tile inicio de escaleras que bajan a la izquierda
51B7: 20DC            jr nz, noCogeEscalera
                    
51B9 =              chkBajaEsc2:
51B9: 3A4DE1          ld a, (modoSentEsc) ; Si es 0 guarda en "sentidoEscalera" el tipo de escalera que se coge el prota. 0 = \, 1 = /
51BC: A7              and a
51BD: 2006            jr nz, chkBajaEsc3
                    
51BF: 79              ld a, c
51C0: E601            and 1  ;  0 = \, 1 = /
51C2: 3243E1          ld (sentidoEscalera), a ; 0 = \, 1 = /
                         ; Tambien usado para saber si el salto fue en vertical (guarda el estado de las teclas en el momento del salto.
                    
51C5 =              chkBajaEsc3:
51C5: 7E              ld a, (hl)  ; Y
51C6: C604            add a, 4
51C8: 77              ld (hl), a  ; Desplaza al personaje 4 pixeles hacia abajo
51C9: 2B              dec hl
51CA: 2B              dec hl
51CB: 2B              dec hl
51CC: 3603            ld (hl), 3  ; Estado: Escaleras
51CE: AF              xor a
51CF: FE00            cp 0  ; Set Z, NC
51D1: C9              ret
                    
                    ;----------------------------------------------------
                    ; Comprueba si choca contra un muro o puerta giratoria al andar
                    ; No hace la comprobacion si no se pulsad DERECHA o IZQUIERDA
                    ; Si la X del elemento es multiplo de 8 comprueba si choca contra una puerta giratoria
                    ; Si la X esta en los 4 pixeles de la derecha del tile comprueba los muros
                    ; Out:
                    ;    Z = No choca
                    ;    C = Choca
                    ;----------------------------------------------------
                    
51D2 =              chkChocaAndar:
51D2: 2135E1          ld hl, protaControl ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha, #10 = Boton A, #20 =Boton B
                    
51D5 =              chkChocaAndar2:
51D5: 7E              ld a, (hl)
51D6: E60C            and 1100b  ; Esta pulsado DERECHA o IZQUIERDA?
51D8: C8              ret z  ; No
                    
51D9: 23              inc hl
                    
51DA =              chkChocaAndar3:
51DA: 46              ld b, (hl)  ; Sentido
                    
51DB =              chkChocaAndar4:
51DB: 23              inc hl  ; Y
51DC: 54              ld d, h
51DD: 5D              ld e, l
51DE: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
51E1: 13              inc de
51E2: 13              inc de
51E3: 1A              ld a, (de)  ; X
51E4: E607            and 7
51E6: 0E50            ld c, 50h  ; Puerta giratoria (tipo de tiles)
51E8: 2806            jr z, chkChocaAndar5 ; Es multiplo de 8
                    
51EA: FE04            cp 4
51EC: 0E10            ld c, 10h  ; Plataformas (tipo de tiles)
51EE: 201C            jr nz, noChocaAndar
                    
51F0 =              chkChocaAndar5:
51F0: CB40            bit 0, b  ; Sentido: 1 = Izquierda, 2 = derecha
51F2: 2005            jr nz, chkChocaAndar6 ; Va a la izquierda
                    
51F4: 23              inc hl  ; X tile mapa + 1
51F5: A7              and a  ; La coordenada X del elemento es multiplo de 8
51F6: 2801            jr z, chkChocaAndar6
                    
51F8: 23              inc hl  ; Incrementa en 1 la X del tile del mapa a comprobar
                    
51F9 =              chkChocaAndar6:
51F9: 7E              ld a, (hl)  ; Tile del mapa
51FA: E6F0            and 0F0h  ; Se queda con la familia o tipo de tile
51FC: B9              cp c  ; Es una puerta giratoria o muro?
51FD: 280B            jr z, chocaAndar ; Choca
                    
51FF: 3E60            ld a, 60h  ; Distancia al tile que esta justo debajo (Y + 1)
5201: CD1040          call ADD_A_HL
5204: 7E              ld a, (hl)  ; Obtiene tile del mapa
5205: E6F0            and 0F0h  ; Se queda con el tipo de tile
5207: B9              cp c
5208: 2002            jr nz, noChocaAndar ; No choca
                    
520A =              chocaAndar:
520A: 37              scf
520B: C9              ret
                    
520C =              noChocaAndar:
520C: A7              and a
520D: C9              ret
                    
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Sprite prota sin nada en las manos
                    ;
                    ;----------------------------------------------------
520E: 00188600010300070803008D01020201  GFX_Prota: db 0, 18h, 86h, 0, 1, 3, 0, 7, 8, 3, 0, 8Dh, 1, 2, 2, 1 ; ...
521E: 00000100C0E000F008030087C0    db 0, 0, 1, 0, 0C0h, 0E0h, 0, 0F0h, 8, 3, 0, 87h, 0C0h
522B: 6000C00000C003008C0300030703    db 60h, 0, 0C0h, 0, 0, 0C0h, 3, 0, 8Ch, 3, 0, 3, 7, 3
5239: 01000101000101040093E000F0E0    db 1, 0, 1, 1, 0, 1, 1, 4, 0, 93h, 0E0h, 0, 0F0h, 0E0h
5247: F0C00080E00080800000010300    db 0F0h, 0C0h, 0, 80h, 0E0h, 0, 80h, 80h, 0, 0, 1, 3, 0
5254: 0708030003030209030085C0E000F0    db 7, 8, 3, 0, 3, 3, 2, 9, 3, 0, 85h, 0C0h, 0E0h, 0, 0F0h
5263: 08030087C000C0C00000E00300    db 8, 3, 0, 87h, 0C0h, 0, 0C0h, 0C0h, 0, 0, 0E0h, 3, 0
5270: 8603000307030103000206050093E0    db 86h, 3, 0, 3, 7, 3, 1, 3, 0, 2, 6, 5, 0, 93h, 0E0h
527F: 00F0F0E0C000E00000C0C0    db 0, 0F0h, 0F0h, 0E0h, 0C0h, 0, 0E0h, 0, 0, 0C0h, 0C0h
528A: 0000010300070803000203020189000C    db 0, 0, 1, 3, 0, 7, 8, 3, 0, 2, 3, 2, 1, 89h, 0, 0Ch
529A: 0800C0E000F00803008660C0    db 8, 0, 0C0h, 0E0h, 0, 0F0h, 8, 3, 0, 86h, 60h, 0C0h
52A6: C0C8881804008C03000307030104    db 0C0h, 0C8h, 88h, 18h, 4, 0, 8Ch, 3, 0, 3, 7, 3, 1, 4
52B4: 0C0402070204008BE000F0F0E0    db 0Ch, 4, 2, 7, 2, 4, 0, 8Bh, 0E0h, 0, 0F0h, 0F0h, 0E0h
52C1: C08030200070010000    db 0C0h, 80h, 30h, 20h, 0, 70h, 1, 0, 0
                    
                    ;----------------------------------------------------
                    ;
                    ; Sprite prota con cuchillo
                    ;
                    ;----------------------------------------------------
52CA: 00188600010300070803008C01030301  GFX_ProtaKnife: db 0, 18h, 86h, 0, 1, 3, 0, 7, 8, 3, 0, 8Ch, 1, 3, 3, 1 ; ...
52DA: 00000100C0E40CFC040C87D6    db 0, 0, 1, 0, 0C0h, 0E4h, 0Ch, 0FCh, 4, 0Ch, 87h, 0D6h
52E6: F084CA0000C003008603000307    db 0F0h, 84h, 0CAh, 0, 0, 0C0h, 3, 0, 86h, 3, 0, 3, 7
52F3: 030104000201040093E000F0F0E0    db 3, 1, 4, 0, 2, 1, 4, 0, 93h, 0E0h, 0, 0F0h, 0F0h, 0E0h
5301: C0080C7000808000000103000708    db 0C0h, 8, 0Ch, 70h, 0, 80h, 80h, 0, 0, 1, 3, 0, 7, 8
530F: 030003030209030084C8D818F8    db 3, 0, 3, 3, 2, 9, 3, 0, 84h, 0C8h, 0D8h, 18h, 0F8h
531C: 0418877C00D4C00000E0030086    db 4, 18h, 87h, 7Ch, 0, 0D4h, 0C0h, 0, 0, 0E0h, 3, 0, 86h
5329: 03000307030103000206050082E00003    db 3, 0, 3, 7, 3, 1, 3, 0, 2, 6, 5, 0, 82h, 0E0h, 0, 3
5339: E08EC080F80000C0C00000    db 0E0h, 8Eh, 0C0h, 80h, 0F8h, 0, 0, 0C0h, 0C0h, 0, 0
5344: 010300070803000203020192000C0800    db 1, 3, 0, 7, 8, 3, 0, 2, 3, 2, 1, 92h, 0, 0Ch, 8, 0
5354: C2E606F60E06060F60E5C0    db 0C2h, 0E6h, 6, 0F6h, 0Eh, 6, 6, 0Fh, 60h, 0E5h, 0C0h
535F: C8881804008C030003070301040C    db 0C8h, 88h, 18h, 4, 0, 8Ch, 3, 0, 3, 7, 3, 1, 4, 0Ch
536D: 08020702040096E000F0F0E0C0    db 8, 2, 7, 2, 4, 0, 96h, 0E0h, 0, 0F0h, 0F0h, 0E0h, 0C0h
537A: 9E180000700000C0E1773003    db 9Eh, 18h, 0, 0, 70h, 0, 0, 0C0h, 0E1h, 77h, 30h, 3
5386: 2004020103030300910E00C0E000    db 20h, 4, 2, 1, 3, 3, 3, 0, 91h, 0Eh, 0, 0C0h, 0E0h, 0
5394: F088502000E0C080800000    db 0F0h, 88h, 50h, 20h, 0, 0E0h, 0C0h, 80h, 80h, 0, 0
539F: 380300860B1C0F1B1D0E0300    db 38h, 3, 0, 86h, 0Bh, 1Ch, 0Fh, 1Bh, 1Dh, 0Eh, 3, 0
53AB: 8303070604008CE00070A0C0E0    db 83h, 3, 7, 6, 4, 0, 8Ch, 0E0h, 0, 70h, 0A0h, 0C0h, 0E0h
53B8: 00006070303003008A0103040804    db 0, 0, 60h, 70h, 30h, 30h, 3, 0, 8Ah, 1, 3, 4, 8, 4
53C6: 000302070303008D0E0000C0E010    db 0, 3, 2, 7, 3, 3, 0, 8Dh, 0Eh, 0, 0, 0C0h, 0E0h, 10h
53D4: 08102040008040030081700400    db 8, 10h, 20h, 40h, 0, 80h, 40h, 3, 0, 81h, 70h, 4, 0
53E1: 8B030703010001000406060C05008CE0    db 8Bh, 3, 7, 3, 1, 0, 1, 0, 4, 6, 6, 0Ch, 5, 0, 8Ch, 0E0h
53F1: F0E0C080E07090E06060    db 0F0h, 0E0h, 0C0h, 80h, 0E0h, 70h, 90h, 0E0h, 60h, 60h
53FB: 0000            db 0, 0
                    
                    ;----------------------------------------------------
                    ;
                    ; Sprite prota con el pico
                    ;
                    ;----------------------------------------------------
53FD: 001896000103006704180C060103  GFX_ProtaPico: db 0, 18h, 96h, 0, 1, 3, 0, 67h, 4, 18h, 0Ch, 6, 1, 3
540B: 030100000100C0E000F008030002C0    db 3, 1, 0, 0, 1, 0, 0C0h, 0E0h, 0, 0F0h, 8, 3, 0, 2, 0C0h
541A: 8F80C00000C0000810031033    db 8Fh, 80h, 0C0h, 0, 0, 0C0h, 0, 8, 10h, 3, 10h, 33h
5426: 2723210203000201040096E000F0    db 27h, 23h, 21h, 2, 3, 0, 2, 1, 4, 0, 96h, 0E0h, 0, 0F0h
5434: F0E0C02010780080800000    db 0F0h, 0E0h, 0C0h, 20h, 10h, 78h, 0, 80h, 80h, 0, 0
543F: 010300076020080403030209030085C0    db 1, 3, 0, 7, 60h, 20h, 8, 4, 3, 3, 2, 9, 3, 0, 85h, 0C0h
544F: E000F008030095C000C0C000    db 0E0h, 0, 0F0h, 8, 3, 0, 95h, 0C0h, 0, 0C0h, 0C0h, 0
545B: 00E00000081B101317634140    db 0, 0E0h, 0, 0, 8, 1Bh, 10h, 13h, 17h, 63h, 41h, 40h
5467: 00000606050097E000F0F0E0C0    db 0, 0, 6, 6, 5, 0, 97h, 0E0h, 0, 0F0h, 0F0h, 0E0h, 0C0h
5474: 00E00000C0C00000010300074880    db 0, 0E0h, 0, 0, 0C0h, 0C0h, 0, 0, 1, 3, 0, 7, 48h, 80h
5482: 180E03030189000C0800C0E000    db 18h, 0Eh, 3, 3, 1, 89h, 0, 0Ch, 8, 0, 0C0h, 0E0h, 0
548F: F00803008660E8C0C88818    db 0F0h, 8, 3, 0, 86h, 60h, 0E8h, 0C0h, 0C8h, 88h, 18h
549A: 03008D1033202367E38184    db 3, 0, 8Dh, 10h, 33h, 20h, 23h, 67h, 0E3h, 81h, 84h
54A5: 8C0802070204008BE000F0F0E0    db 8Ch, 8, 2, 7, 2, 4, 0, 8Bh, 0E0h, 0, 0F0h, 0F0h, 0E0h
54B2: C090100000700300850103000708    db 0C0h, 90h, 10h, 0, 0, 70h, 3, 0, 85h, 1, 3, 0, 7, 8
54C0: 030003030300910E0000F010F010    db 3, 0, 3, 3, 3, 0, 91h, 0Eh, 0, 0, 0F0h, 10h, 0F0h, 10h
54CE: 100020A040808000001C030086    db 10h, 0, 20h, 0A0h, 40h, 80h, 80h, 0, 0, 1Ch, 3, 0, 86h
54DB: 0300030F07030300930307060010F8    db 3, 0, 3, 0Fh, 7, 3, 3, 0, 93h, 3, 7, 6, 0, 10h, 0F8h
54EA: 04E200E0E0F0D040806060    db 4, 0E2h, 0, 0E0h, 0E0h, 0F0h, 0D0h, 40h, 80h, 60h, 60h
54F5: 301803009E0103040804000302070300    db 30h, 18h, 3, 0, 9Eh, 1, 3, 4, 8, 4, 0, 3, 2, 7, 3, 0
5505: 00080E0000C0E01008102080    db 0, 8, 0Eh, 0, 0, 0C0h, 0E0h, 10h, 8, 10h, 20h, 80h
5511: 40A0501808006004008B030703    db 40h, 0A0h, 50h, 18h, 8, 0, 60h, 4, 0, 8Bh, 3, 7, 3
551E: 010001000406040405008CE0F0E0    db 1, 0, 1, 0, 4, 6, 4, 4, 5, 0, 8Ch, 0E0h, 0F0h, 0E0h
552C: C0008040A2C242460C00    db 0C0h, 0, 80h, 40h, 0A2h, 0C2h, 42h, 46h, 0Ch, 0
                    
                    ;----------------------------------------------------
                    ; Graficos de la momia
                    ;----------------------------------------------------
5536: 401982000304078603030704070704  GFX_MOMIA: db 40h, 19h, 82h, 0, 3, 4, 7, 86h, 3, 3, 7, 4, 7, 7, 4
5545: 039200C0E040E0E0C080E0    db 3, 92h, 0, 0C0h, 0E0h, 40h, 0E0h, 0E0h, 0C0h, 80h, 0E0h
5550: 80608080000080000304078E0303    db 80h, 60h, 80h, 80h, 0, 0, 80h, 0, 3, 4, 7, 8Eh, 3, 3
555E: 070407071F1E110100C0E04003    db 7, 4, 7, 7, 1Fh, 1Eh, 11h, 1, 0, 0C0h, 0E0h, 40h, 3
556B: E08BC080E0B0C0C08080    db 0E0h, 8Bh, 0C0h, 80h, 0E0h, 0B0h, 0C0h, 0C0h, 80h, 80h
5575: C0000304079A03030706050103070E    db 0C0h, 0, 3, 4, 7, 9Ah, 3, 3, 7, 6, 5, 1, 3, 7, 0Eh
5584: 0800C0E040E000E0C0E078    db 8, 0, 0C0h, 0E0h, 40h, 0E0h, 0, 0E0h, 0C0h, 0E0h, 78h
558F: 48C0E8F8180000    db 48h, 0C0h, 0E8h, 0F8h, 18h, 0, 0
                    
                    ;----------------------------------------------------------------------------
                    ;
                    ; Sprites secundarios:
                    ; Destello, muro, exploxion, cuchillo
                    ;
                    ;----------------------------------------------------------------------------
5596: A01E02008D200008040000B00000  GFX_SPRITES2: db 0A0h, 1Eh, 2, 0, 8Dh, 20h, 0, 8, 4, 0, 0, 0B0h, 0, 0 ; ...
55A4: 0408002003008D8200889000000D    db 4, 8, 0, 20h, 3, 0, 8Dh, 82h, 0, 88h, 90h, 0, 0, 0Dh
55B2: 0000908800820A000244857E10    db 0, 0, 90h, 88h, 0, 82h, 0Ah, 0, 2, 44h, 85h, 7Eh, 10h
55BF: 107E44180008FF10008F447E    db 10h, 7Eh, 44h, 18h, 0, 8, 0FFh, 10h, 0, 8Fh, 44h, 7Eh
55CB: 10107E44447E10107E4444    db 10h, 10h, 7Eh, 44h, 44h, 7Eh, 10h, 10h, 7Eh, 44h, 44h
55D6: 7E10110010FF12008C010A1F    db 7Eh, 10h, 11h, 0, 10h, 0FFh, 12h, 0, 8Ch, 1, 0Ah, 1Fh
55E2: 1F0F173F1F070F0B0604008C    db 1Fh, 0Fh, 17h, 3Fh, 1Fh, 7, 0Fh, 0Bh, 6, 4, 0, 8Ch
55EE: 80E0F0F0E0F0E8F8F8    db 80h, 0E0h, 0F0h, 0F0h, 0E0h, 0F0h, 0E8h, 0F8h, 0F8h
55F7: D0F0C00600870207030507030109    db 0D0h, 0F0h, 0C0h, 6, 0, 87h, 2, 7, 3, 5, 7, 3, 1, 9
5605: 0086C0A0F0D0E0A0060087    db 0, 86h, 0C0h, 0A0h, 0F0h, 0D0h, 0E0h, 0A0h, 6, 0, 87h
5610: C0E074381C2E041900870307    db 0C0h, 0E0h, 74h, 38h, 1Ch, 2Eh, 4, 19h, 0, 87h, 3, 7
561C: 2E1C38742019008740E870    db 2Eh, 1Ch, 38h, 74h, 20h, 19h, 0, 87h, 40h, 0E8h, 70h
5627: 385C0E0619008702170E1C3A    db 38h, 5Ch, 0Eh, 6, 19h, 0, 87h, 2, 17h, 0Eh, 1Ch, 3Ah
5633: 7060190000      db 70h, 60h, 19h, 0, 0
                    
                    ;----------------------------------------------------------------------------
                    ;
                    ; Graficos del juego (plataformas, escaleras, cuchillo, gemas...)
                    ;
                    ;----------------------------------------------------------------------------
5638: 03FE810003EF8300FFFF0600  GFX_InGame: db 3, 0FEh, 81h, 0, 3, 0EFh, 83h, 0, 0FFh, 0FFh, 6, 0
5644: 03FF05008480C1630003F782    db 3, 0FFh, 5, 0, 84h, 80h, 0C1h, 63h, 0, 3, 0F7h, 82h
5650: 0081040089C1E300C0E07438    db 0, 81h, 4, 0, 89h, 0C1h, 0E3h, 0, 0C0h, 0E0h, 74h, 38h
565C: 1C2806009205030702000060E0C0    db 1Ch, 28h, 6, 0, 92h, 5, 3, 7, 2, 0, 0, 60h, 0E0h, 0C0h
566A: 80008050E070B81C0C04008C    db 80h, 0, 80h, 50h, 0E0h, 70h, 0B8h, 1Ch, 0Ch, 4, 0, 8Ch
5676: 010001030706000040E0C0A00300    db 1, 0, 1, 3, 7, 6, 0, 0, 40h, 0E0h, 0C0h, 0A0h, 3, 0
5684: 842418187E03188820180C    db 84h, 24h, 18h, 18h, 7Eh, 3, 18h, 88h, 20h, 18h, 0Ch
568F: 0C1A3361C02600A2492A02    db 0Ch, 1Ah, 33h, 61h, 0C0h, 26h, 0, 0A2h, 49h, 2Ah, 2
569A: 0104020006000040802040006000    db 1, 4, 2, 0, 6, 0, 0, 40h, 80h, 20h, 40h, 0, 60h, 0
56A8: 00FF80EEEE80BBBB80FF    db 0, 0FFh, 80h, 0EEh, 0EEh, 80h, 0BBh, 0BBh, 80h, 0FFh
56B2: 01EFEF01BBBB013000827E81    db 1, 0EFh, 0EFh, 1, 0BBh, 0BBh, 1, 30h, 0, 82h, 7Eh, 81h
56BE: 0318023C85187EE7C3C303    db 3, 18h, 2, 3Ch, 85h, 18h, 7Eh, 0E7h, 0C3h, 0C3h, 3
56C9: E783FF817E060005F083B0    db 0E7h, 83h, 0FFh, 81h, 7Eh, 6, 0, 5, 0F0h, 83h, 0B0h
56D4: 10D0040F020E84080B707006    db 10h, 0D0h, 4, 0Fh, 2, 0Eh, 84h, 8, 0Bh, 70h, 70h, 6
56E0: F0080F81FF040087FCF0C0    db 0F0h, 8, 0Fh, 81h, 0FFh, 4, 0, 87h, 0FCh, 0F0h, 0C0h
56EB: FFFCF0C008000201020F020003    db 0FFh, 0FCh, 0F0h, 0C0h, 8, 0, 2, 1, 2, 0Fh, 2, 0, 3
56F8: 1F8DFF0000FF00FF0000FF00    db 1Fh, 8Dh, 0FFh, 0, 0, 0FFh, 0, 0FFh, 0, 0, 0FFh, 0
5704: 000A0A040E020A02E004A002E0    db 0, 0Ah, 0Ah, 4, 0Eh, 2, 0Ah, 2, 0E0h, 4, 0A0h, 2, 0E0h
5711: 083F0870B0FFDDDD81F7F7    db 8, 3Fh, 8, 70h, 0B0h, 0FFh, 0DDh, 0DDh, 81h, 0F7h, 0F7h
571C: 81DDDD81F7F781DDDD81    db 81h, 0DDh, 0DDh, 81h, 0F7h, 0F7h, 81h, 0DDh, 0DDh, 81h
5726: F7F781DDDD81F7FF0F0D    db 0F7h, 0F7h, 81h, 0DDh, 0DDh, 81h, 0F7h, 0FFh, 0Fh, 0Dh
5730: 0D080F0F080D0D080F0F080D    db 0Dh, 8, 0Fh, 0Fh, 8, 0Dh, 0Dh, 8, 0Fh, 0Fh, 8, 0Dh
573C: 0D08D010707010D0D01003    db 0Dh, 8, 0D0h, 10h, 70h, 70h, 10h, 0D0h, 0D0h, 10h, 3
5747: 0F9D080D0D080FF903006E2E    db 0Fh, 9Dh, 8, 0Dh, 0Dh, 8, 0Fh, 0F9h, 3, 0, 6Eh, 2Eh
5753: 000E06F90300F000E0E0EF00    db 0, 0Eh, 6, 0F9h, 3, 0, 0F0h, 0, 0E0h, 0E0h, 0EFh, 0
575F: EE6E2E000E0602030085F000E0    db 0EEh, 6Eh, 2Eh, 0, 0Eh, 6, 2, 3, 0, 85h, 0F0h, 0, 0E0h
576C: E0EF00          db 0E0h, 0EFh, 0
                    
                    
576F: 88003C7EBF9FDF7E3C00  GFX_GEMA: db 88h, 0, 3Ch, 7Eh, 0BFh, 9Fh, 0DFh, 7Eh, 3Ch, 0
                    ;----------------------------------------------------
                    ;
                    ; Colores de los patrones del juego
                    ;
                    ;----------------------------------------------------
5779: 03F005A005F003A007F004A0  COLOR_InGame: db 3, 0F0h, 5, 0A0h, 5, 0F0h, 3, 0A0h, 7, 0F0h, 4, 0A0h ; ...
5785: 05F005A003F005A003F005A0    db 5, 0F0h, 5, 0A0h, 3, 0F0h, 5, 0A0h, 3, 0F0h, 5, 0A0h
5791: 03F004900460200018A04050    db 3, 0F0h, 4, 90h, 4, 60h, 20h, 0, 18h, 0A0h, 40h, 50h
579D: 82909603F603A68160036A04    db 82h, 90h, 96h, 3, 0F6h, 3, 0A6h, 81h, 60h, 3, 6Ah, 4
57A9: 6F81960790813E043A033081    db 6Fh, 81h, 96h, 7, 90h, 81h, 3Eh, 4, 3Ah, 3, 30h, 81h
57B5: 3E033A06308E3E3F3F3E3F3F    db 3Eh, 3, 3Ah, 6, 30h, 8Eh, 3Eh, 3Fh, 3Fh, 3Eh, 3Fh, 3Fh
57C1: 3E3F3E3F3F3E3F3F05EA03    db 3Eh, 3Fh, 3Eh, 3Fh, 3Fh, 3Eh, 3Fh, 3Fh, 5, 0EAh, 3
57CC: A081EA07A005F083E0F0    db 0A0h, 81h, 0EAh, 7, 0A0h, 5, 0F0h, 83h, 0E0h, 0F0h
57D6: E003F002E00BFE    db 0E0h, 3, 0F0h, 2, 0E0h, 0Bh, 0FEh
                    ;----------------------------------------------------
                    ; Colores de los patrones invertidos (el mismo que los normales)
                    ;----------------------------------------------------
57DD: 085008F0085008F0383082EA  COLOR_Flipped: db 8, 50h, 8, 0F0h, 8, 50h, 8, 0F0h, 38h, 30h, 82h, 0EAh
57E9: F906F082EAEF16F000    db 0F9h, 6, 0F0h, 82h, 0EAh, 0EFh, 16h, 0F0h, 0
                    
57F2: 0840087008D008A0082008E000  COLOR_GEMAS: db 8, 40h, 8, 70h, 8, 0D0h, 8, 0A0h, 8, 20h, 8, 0E0h, 0 ; ...
                    
                    ;--------------------------------------------------------------------------------------------------------
                    ;
                    ; Logica de los cuchillos
                    ;
                    ;--------------------------------------------------------------------------------------------------------
                    
57FF =              AI_Cuchillos:
57FF: AF              xor a
5800: 3262E2          ld (knifeEnProceso), a
                    
5803 =              AI_Cuchillos2:
5803: 21005B          ld hl, chkLastKnife
5806: E5              push hl  ; Mete en la pila la rutina que comprueba si se han procesado todos los cuchillos
                    
5807: AF              xor a  ; Offset al status del cuchillo
5808: CD175B          call getKnifeData ; Obtiene el indice del cuchillo que se esta procesando
580B: CD4B40          call jumpIndex
                    
580E: 2058            dw initCuchillo  ; 0 - Inicializacion del cuchillo. Guarda tile de fondo
5810: 5958            dw doNothing_  ; 1 - Posado en el suelo
5812: 5958            dw doNothing_  ; 2 - Lo lleva el prota en la mano
5814: 5958            dw doNothing_
5816: 5A58            dw lanzaCuchillo ; 4 - Lanza un cuchillo
5818: B658            dw movKnife  ; 5 - Cuchillo por el aire
581A: E859            dw knifeChoca  ; 6 - Acaba de chocar el cuchillo
581C: 045A            dw knifeRebota  ; 7 - Esta rebotando
581E: 6B5A            dw knifeCae  ; 8 - Esta cayendo
                    ; IF (!VERSION2)
                    ;  dw updateKnifeAtt ; 9 - Actualiza los atributos RAM del sprite del cuchillo
                    ; ENDIF
                    
                    
                    ;----------------------------------------------------
                    ; Knife Status 0: Comprueba el tile que tiene de fondo y lo guarda
                    ; Si esta sobre un pelda? de escalera lo cambia por un tile de cuchillo especial que indica que hay escalera detras
                    ; Pasa al siguiente estado (1)
                    ;----------------------------------------------------
                    
5820 =              initCuchillo:
5820: AF              xor a
5821: CD175B          call getKnifeData ; Obtiene puntero a los datos del cuchillo
5824: 34              inc (hl)  ; Lo pasa al status 1
5825: 23              inc hl
5826: 23              inc hl  ; Apunta a la Y del cuchillo
5827: CDD650          call getMapOffset00 ; Obtiene el tile del mapa sobre el que esta el cuchillo
582A: EB              ex de, hl
582B: 3E0A            ld a, 0Ah  ; Offset tile backup
582D: CD175B          call getKnifeData
5830: 1A              ld a, (de)  ; Tile que hay en el mapa RAM
5831: 47              ld b, a
5832: E6F0            and 0F0h
5834: FE30            cp 30h  ; Comprueba si se trata de un cuchillo
5836: 2801            jr z, initCuchillo2
5838: 70              ld (hl), b  ; Guarda el tile que hay detras del cuchillo
                    
5839 =              initCuchillo2:
5839: 78              ld a, b
                    ; IF (VERSION2)
583A: D631            sub #31  ; Cuchillo sobre pelda??
583C: FE02            cp 2  ; Dos posibles direcciones de las escaleras (cuchillo sobre pelda? hacia la derecha y sobre pelda? a la izquierda)
583E: 78              ld a,b
583F: 380E            jr c,initCuchillo5
                      
5841: 78              ld a,b  ; (!?) No hace falta ponerlo! A ya es igual a B
5842: D621            sub #21  ; Pelda? de escalera que sube a la izquierda
5844: FE02            cp 2  ; Comprueba los dos tipos de pelda? (derecha e izquierda)
5846: 3005            jr nc,initCuchillo4
                      
5848: 78              ld a,b
                    ; ELSE
                    ;  cp 31h  ; Cuchillo sobre pelda??
                    ;  jr z, initCuchillo6
                    ;
                    ;  cp 21h  ; Pelda? escalera que sube a la izquierda
                    ;  jr z, initCuchillo3
                    ;
                    ;  cp 22h  ; Pelda? escalera que sube a la derecha
                    ;  jr nz, initCuchillo4
                    ; ENDIF
5849 =              initCuchillo3:
5849: C610            add a, 10h  ; Convierte el tile de cuchillo en "cuchillo sobre pelda?"
584B: 1802            jr initCuchillo5
                    
584D =              initCuchillo4:
584D: 3E30            ld a, 30h  ; ID tile cuchillo suelo
                    
584F =              initCuchillo5:
584F: 12              ld (de), a  ; Actualiza el mapa RAM
5850: AF              xor a
5851: CD175B          call getKnifeData
5854: 3E4B            ld a, 4Bh  ; Patron de cuchillo posado
5856: C3115C          jp drawTile
                    
                    ; IF (!VERSION2)
                    ;initCuchillo6:
                    ;  ld a, 31h
                    ;  jr initCuchillo5
                    ; ENDIF
                    
5859 =              doNothing_:
5859: C9              ret
                    
                    ;--------------------------------------------------------------------------------------------------------
                    ;
                    ; Lanza un cuchillo
                    ; Reproduce sonido de lanzar
                    ; Coloca el cuchillo en las coordendas del prota
                    ; Guarda los tiles del mapa sobre los que se pinta
                    ;
                    ;--------------------------------------------------------------------------------------------------------
                    
585A =              lanzaCuchillo:
585A: 3E06            ld a, 6
585C: CDA97A          call setMusic ; Sonido lanzar
                    
585F: 3E06            ld a, 6
5861: CD175B          call getKnifeData ; Obtiene puntero a la velocidad decimal
5864: EB              ex de, hl
5865: 218865          ld hl, knifeDataInicio
5868: 010B00          ld bc, 0Bh
586B: EDB0            ldir   ; Inicializa los valores de este cuchillo
                    
586D: CD115B          call knifeNextStatus ; Pasa al siguiente estado
5870: 23              inc hl
5871: 1136E1          ld de, sentidoProta ; 1 = Izquierda, 2 = Derecha
5874: EB              ex de, hl
5875: 7E              ld a, (hl)  ; Sentido del lanzamiento
5876: 010500          ld bc, 5
5879: EDB0            ldir   ; Copia el sentido y coordenadas del prota
                    
587B: 1B              dec de
587C: 1B              dec de  ; Cuchillo X
587D: 2B              dec hl
587E: 2B              dec hl  ; Prota X
587F: 0608            ld b, 8  ; Desplazamiento X cuando se lanza a la derecha
5881: CB1F            rr a  ; 1 = Izquierda, 2 = Derecha
5883: 3002            jr nc, lanzaCuchillo2
5885: 0600            ld b, 0  ; Desplazamiento cuando se lanza a la izquierda
                    
5887 =              lanzaCuchillo2:
5887: 7E              ld a, (hl)
5888: 80              add a, b  ; Suma desplazamiento a la X
5889: E6F8            and 0F8h  ; Lo ajusta a patrones (multiplo de 8)
588B: CBD7            set 2, a  ; Le suma 4
588D: 12              ld (de), a  ; Actualiza X del cuchillo
588E: 1B              dec de
588F: 1B              dec de  ; Y cuchillo
5890: EB              ex de, hl  ; HL apunta a las coordenadas del cuchillo
5891: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
5894: EB              ex de, hl
5895: 3E0A            ld a, 0Ah  ; Offset backup fondo
5897: CD175B          call getKnifeData
589A: EB              ex de, hl
589B: EDA0            ldi
589D: EDA0            ldi   ; Guarda tiles del mapa sobre los que se pinta el cuchillo
589F: C9              ret
                    
                    ;----------------------------------------------------
                    ; Obtiene el frame del cuchillo segun su posicion X en pantalla
                    ;----------------------------------------------------
                    
58A0 =              getFrameKnife:
58A0: 3E04            ld a, 4  ; Offset X cuchillo
58A2: CD175B          call getKnifeData
58A5: 1F              rra
58A6: 1F              rra
58A7: E603            and 3  ; Cambia el frame cada cuatro pixeles
58A9: 11B158          ld de, framesCuchillo
58AC: CD1540          call ADD_A_DE
58AF: 1A              ld a, (de)
58B0: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Patrones usados para pintar el cuchillo
                    ;----------------------------------------------------
58B1: 45            framesCuchillo: db 45h
                         ; Girando NO
58B2: 46              db 46h  ; Girando NE
58B3: 48              db 48h  ; Girando SE
58B4: 49              db 49h  ; Girando SO
58B5: 4B              db 4Bh  ; Clavado en el suelo
                    
                    ;--------------------------------------------------------------------------------------------------------
                    ; Mueve al cuchillo lanzado
                    ; Comprueba si choca contra una puerta giratoria
                    ; Copia y restaura el fondo sobre el que va pasando
                    ;--------------------------------------------------------------------------------------------------------
                    
58B6 =              movKnife:
58B6: 3E06            ld a, 6  ; Offset velocidad cuchillo
58B8: CD175B          call getKnifeData
58BB: 5E              ld e, (hl)
58BC: 23              inc hl
58BD: 56              ld d, (hl)  ; DE = velocidad del cuchillo
58BE: 3E03            ld a, 3  ; Offset X decimales
58C0: CD175B          call getKnifeData
58C3: CD0274          call mueveElemento ; Actualiza coordenadas del cuchillo segun su velocidad
                    
58C6: 7A              ld a, d  ; X cuchillo
58C7: E603            and 3
58C9: C0              ret nz  ; No es multiplo de 4
                    
58CA: 7A              ld a, d
58CB: E607            and 7
58CD: 284C            jr z, movKnife3 ; Es multiplo de 8
                    
                    ; Multiplo de 4
                    
58CF: 7A              ld a, d
58D0: FE08            cp 8
58D2: D8              ret c  ; Menor de 8. Pegado al limite izquierdo de la pantalla
                    
58D3: FEFC            cp 252
58D5: D0              ret nc  ; Mayor o igual a 252. Pegado al limite derecho de la pantalla
                    
58D6: CDA058          call getFrameKnife ; Obtiene frame actual de la animacion del cuchillo
58D9: 2B              dec hl
58DA: 2B              dec hl
58DB: 2B              dec hl
58DC: 2B              dec hl
58DD: CD115C          call drawTile ; Dibuja primer tile del cuchillo
                    
                    ; IF (VERSION2)
58E0: 2005             jr nz,movKnife1 ; Si no esta en pantalla no lo pinta
                    ; ENDIF
                     
58E2: 3C              inc a
58E3: 23              inc hl
58E4: CD4D00          call WRTVRM  ; segundo tile del cuchillo
58E7 =              movKnife1:
58E7: 3E01            ld a, 1  ; Offset sentido
58E9: CD175B          call getKnifeData
58EC: E5              push hl  ; Apunta al sentido
58ED: 7E              ld a, (hl)  ; Sentido
58EE: 23              inc hl  ; Apunta a la Y
58EF: F5              push af
58F0: CDD650          call getMapOffset00 ; Obtiene un puntero HL a la posicion del cuchillo en el mapa RAM
58F3: F1              pop af
58F4: 1F              rra
58F5: 3801            jr c, movKnife2 ; Izquierda
58F7: 23              inc hl  ; Tile de la derecha
                    
                    ; Restaura una puerta giratoria si el cuchillo choca contra ella
                    
58F8 =              movKnife2:
58F8: 7E              ld a, (hl)  ; Tile del mapa
58F9: E6F0            and 0F0h  ; Se queda con la familia o tipo de tile
58FB: FE50            cp 50h  ; Puerta giratoria
58FD: E1              pop hl  ; Apunta al sentido
58FE: C0              ret nz  ; No ha chocado con una puerta
                    
58FF: 2B              dec hl  ; Apunta al estado
5900: 34              inc (hl)  ; Pasa al siguiente estado del cuchillo (5)
5901: E5              push hl
5902: 3E0A            ld a, 0Ah  ; Offset tile de fondo
5904: CD175B          call getKnifeData
5907: EB              ex de, hl
5908: E1              pop hl
5909: D5              push de
590A: CD755D          call getTileFromID
590D: CD115C          call drawTile ; Restaura el tile de fondo 1
5910: D1              pop de
5911: C0              ret nz  ; No esta en la pantalla actual
                    
5912: 23              inc hl  ; Siguiente posicion VRAM (ocupa dos tiles)
5913: 13              inc de  ; Siguiente tile backup del cuchillo
5914: 1A              ld a, (de)
5915: CD755D          call getTileFromID ; Identifica tile que le corresponde
5918: C34D00          jp WRTVRM  ; Lo pinta
                    
                    ; Multiplo de 8
                    
591B =              movKnife3:
591B: 3E01            ld a, 1  ;  Offset sentido
591D: CD175B          call getKnifeData
5920: E5              push hl
5921: DDE1            pop ix
                    
5923: CDA058          call getFrameKnife ; Frame que le corresponde al cuchillo
5926: 47              ld b, a
                    
5927: AF              xor a
5928: CD175B          call getKnifeData ; Puntero a los datos del cuchillo
                    
592B: 78              ld a, b  ; Frame del cuchillo
592C: CD115C          call drawTile
                    
592F: 3E02            ld a, 2  ; Offset Y
5931: CD175B          call getKnifeData
5934: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
                    
5937: DD7E00          ld a, (ix+0) ; Sentido
593A: 23              inc hl  ; Tile de la derecha del cuchillo
593B: CB1F            rr a
593D: F5              push af
593E: 3002            jr nc, movKnife4 ; Derecha
5940: 2B              dec hl
5941: 2B              dec hl  ; Tile de la izquierda
                    
5942 =              movKnife4:
5942: F1              pop af
5943: 7E              ld a, (hl)  ; Tile del mapa de fondo
5944: 300E            jr nc, movKnife5 ; Derecha
                    
5946: DD560A          ld d, (ix+0Ah) ; tile de fondo 2
5949: DD4E09          ld c, (ix+9) ; tile de fondo 1
594C: DD710A          ld (ix+0Ah), c
594F: DD7709          ld (ix+9), a ; Actualiza la copia de los tiles de fondo
5952: 180C            jr movKnife6
                    
5954 =              movKnife5:
5954: DD5609          ld d, (ix+9) ; Tile backup 1
5957: DD4E0A          ld c, (ix+0Ah) ; Tile backup 2
595A: DD7109          ld (ix+9), c
595D: DD770A          ld (ix+0Ah), a ; Actualiza la copia de los tiles de fondo
                    
5960 =              movKnife6:
5960: DD4604          ld b, (ix+4) ; Pantalla en la que esta el cuchillo (xHigh)
5963: 3A3AE1          ld a, (ProtaRoom) ; Pantalla del prota
5966: B8              cp b
5967: 201E            jr nz, movKnife8 ; No estan en la misma, no hace falta pintarlo
                    
5969: 7A              ld a, d  ; Tile de fondo a restaurar
596A: CD755D          call getTileFromID
596D: F5              push af
596E: 3E02            ld a, 2  ; Offset Y
5970: CD175B          call getKnifeData
5973: 56              ld d, (hl)  ; Y
5974: 23              inc hl
5975: 23              inc hl  ; X
5976: 5E              ld e, (hl)  ; DE = YX
5977: CD285B          call coordVRAM_DE ; Obtiene puntero a la VRAM correspondiente a las coordenadas del cuchillo
                    
597A: 2B              dec hl  ; Puntero VRAM
597B: DD7E00          ld a, (ix+0) ; Sentido
597E: 1F              rra
597F: 3002            jr nc, movKnife7 ; Derecha
5981: 23              inc hl
5982: 23              inc hl
                    
5983 =              movKnife7:
5983: F1              pop af
5984: CD4D00          call WRTVRM  ; Restaura fondo
                    
5987 =              movKnife8:
5987: DDE5            push ix
5989: D5              push de
598A: CD485B          call chkKnifeMomia ; Comprueba si choca con una momia
598D: D1              pop de
598E: DDE1            pop ix
5990: 3006            jr nc, movKnife9 ;  No ha chocado contra una momia
                    
5992: AF              xor a
5993: CD175B          call getKnifeData
5996: 1821            jr movKnife11
                    
5998 =              movKnife9:
5998: 3E02            ld a, 2  ; Y
599A: CD175B          call getKnifeData
599D: E5              push hl
599E: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
59A1: 2B              dec hl
59A2: DD7E00          ld a, (ix+0) ; Sentido
59A5: 1F              rra
59A6: 3802            jr c, movKnife10 ; Izquierda
59A8: 23              inc hl
59A9: 23              inc hl
                    
59AA =              movKnife10:
59AA: 7E              ld a, (hl)
59AB: 47              ld b, a
59AC: E1              pop hl  ; Y
59AD: CDC85A          call chkKnifeChoca ; Comprueba si el tile es una plataforma, cuchillo, pico o gema
59B0: 2027            jr nz, knifeNoChoca ; No choca contra nada
                    
59B2: 78              ld a, b
59B3: FE40            cp 40h  ; Gemas
59B5: 2822            jr z, knifeNoChoca ; Contra las gemas no choca el cuchillo
                    
59B7: 2B              dec hl
59B8: 2B              dec hl  ; Apunta al status
                    
59B9 =              movKnife11:
59B9: 34              inc (hl)  ; Pasa al siguiente estado del cuchillo: choca
59BA: 23              inc hl
59BB: 46              ld b, (hl)  ; Sentido
59BC: 23              inc hl
59BD: 23              inc hl
59BE: 23              inc hl
                    
59BF =              movKnife12:
59BF: 23              inc hl
59C0: 3A3AE1          ld a, (ProtaRoom) ; Parte alta de la coordenada X. Indica la habitacion de la piramide
59C3: BE              cp (hl)  ; esta en la misma pantalla el cuchillo y el prota?
59C4: C0              ret nz  ; No esta en la pantalla actual. No se ve
                    
59C5: 3E05            ld a, 5
59C7: CD1040          call ADD_A_HL ; Puntero a los tiles de backup de fondo
59CA: CB18            rr b  ; Sentido
59CC: 3001            jr nc, knifeRestaura ; Derecha
59CE: 23              inc hl
                    
59CF =              knifeRestaura:
59CF: 7E              ld a, (hl)  ; Backup tile
59D0: CD755D          call getTileFromID ; Obtiene patron que le corresponde
59D3: CD285B          call coordVRAM_DE ; D = Y, E = X
59D6: C34D00          jp WRTVRM  ; Pinta el patron en pantalla
                    
59D9 =              knifeNoChoca:
59D9: 2B              dec hl
59DA: 46              ld b, (hl)
59DB: 23              inc hl
59DC: 23              inc hl
59DD: 23              inc hl
59DE: AF              xor a
59DF: BE              cp (hl)
59E0: 28DD            jr z, movKnife12
59E2: 3EF8            ld a, 0F8h
59E4: BE              cp (hl)
59E5: 28D8            jr z, movKnife12
59E7: C9              ret
                    
                    ;----------------------------------------------------
                    ;
                    ; Cuchillo choca
                    ; Pasa al estado de rebotando, invierte el sentido y lo mueve 4 pixeles hacia atras
                    ;----------------------------------------------------
                    
59E8 =              knifeChoca:
59E8: CD115B          call knifeNextStatus ; Pasa al estado de rebotando
59EB: 23              inc hl
59EC: 7E              ld a, (hl)
59ED: EE03            xor 3
59EF: 77              ld (hl), a  ; Invierte el sentido
59F0: 23              inc hl
59F1: 23              inc hl
59F2: 23              inc hl
59F3: 1F              rra
59F4: 7E              ld a, (hl)  ; X
59F5: 3802            jr c, knifeChoca2 ; Izquierda
59F7: C604            add a, 4
                    
59F9 =              knifeChoca2:
59F9: E6F8            and 0F8h
59FB: 77              ld (hl), a
59FC: 3E05            ld a, 5
59FE: CD1040          call ADD_A_HL
5A01: 3600            ld (hl), 0
5A03: C9              ret
                    
                    ;----------------------------------------------------
                    ;
                    ; Cuchillo rebotando
                    ; Realiza una parabola que simula un rebote.
                    ; Comprueba si choca contra algo mientras rebota.
                    ; Al terminar pasa al siguiente estado: caer
                    ;----------------------------------------------------
                    
5A04 =              knifeRebota:
5A04: 3A03E0          ld a, (timer)
5A07: E603            and 3
5A09: C2D75A          jp nz, updateKnifeAtt ; Actualiza las coordenadas 1 de cada 4 frames. El resto los atributos del sprite
                    
5A0C: 3E01            ld a, 1  ; Offset sentido
5A0E: CD175B          call getKnifeData
5A11: E5              push hl
5A12: 7E              ld a, (hl)  ; Sentido
5A13: 23              inc hl
5A14: 23              inc hl
5A15: 23              inc hl
5A16: 34              inc (hl)  ; Incrementa la X
5A17: 1F              rra
5A18: 3002            jr nc, knifeRebota2 ; Derecha
                    
5A1A: 35              dec (hl)
5A1B: 35              dec (hl)  ; Decrementa la X (rebota hacia la izquierda)
                    
5A1C =              knifeRebota2:
5A1C: E1              pop hl
5A1D: CD0B71          call chkPasaRoom ; Comprueba si pasa a otra habitacion
                    
5A20: 3E09            ld a, 9
5A22: CD175B          call getKnifeData
5A25: 7E              ld a, (hl)  ; Contador de movimiento
                    
5A26: 21635A          ld hl, parabolaKnife
5A29: CD1040          call ADD_A_HL
5A2C: 46              ld b, (hl)  ; Desplazamiento Y del rebote para simular una parabola
                    
5A2D: 3E02            ld a, 2  ; Y
5A2F: CD175B          call getKnifeData
5A32: 7E              ld a, (hl)  ; Y del cuchillo
5A33: 80              add a, b  ; Le suma el desplazamiento de la parabola
5A34: 77              ld (hl), a  ; Actualiza la Y del cuchillo
                    
5A35: E5              push hl
5A36: 010804          ld bc, 408h ; Offset X+4, Y+8
5A39: CDE150          call getMapOffset ; Lee tile del mapa
5A3C: 7E              ld a, (hl)  ; Obtiene el tile que hay justo debajo del cuchillo
5A3D: CDC85A          call chkKnifeChoca ; Comprueba si el tile es una plataforma, cuchillo, pico o gema
5A40: E1              pop hl
5A41: 2011            jr nz, knifeRebota3 ; No choca con nada
                    
5A43: 78              ld a, b  ; Tile del mapa
5A44: FE41            cp 41h  ; Brillo gema izquierda
5A46: 280C            jr z, knifeRebota3
                    
5A48: FE42            cp 42h  ; Brillo gema derecha
5A4A: 2808            jr z, knifeRebota3
                    
5A4C: E6F0            and 0F0h
5A4E: FE10            cp 10h  ; Es una plataforma, muro o ladrillo?
5A50: 205A            jr nz, setReboteKnife ; Da otro rebote para no caer sobre el objeto
                    
5A52: 184F            jr knifeEnd
                    
5A54 =              knifeRebota3:
5A54: 3E07            ld a, 7
5A56: CD1040          call ADD_A_HL
5A59: 34              inc (hl)  ; Incrementa contador de movimiento
                    
5A5A: 7E              ld a, (hl)
5A5B: FE08            cp 8  ; Ha terminado la parabola del rebote? (8 frames)
5A5D: CA115B          jp z, knifeNextStatus ; Si, pasa a estado de caer
5A60: C3D75A          jp updateKnifeAtt
                    
                    
                    ;----------------------------------------------------
                    ; Valores de la parabola del rebote del cuchillo
                    ;----------------------------------------------------
5A63: FB            parabolaKnife: db 0-5
5A64: FE              db 0-2
5A65: FF              db 0-1
5A66: 00              db 0
5A67: 00              db 0
5A68: 01              db 1
5A69: 02              db 2
5A6A: 05              db 5
                    
                    ;----------------------------------------------------
                    ; Status cuchillo = Caer
                    ;----------------------------------------------------
                    
5A6B =              knifeCae:
5A6B: 3A03E0          ld a, (timer)
5A6E: E603            and 3
5A70: C2D75A          jp nz, updateKnifeAtt ; Actualiza las coordenadas 1 de cada 4 frames
                    
5A73: 3E02            ld a, 2  ; Offset Y
5A75: CD175B          call getKnifeData
5A78: 7E              ld a, (hl)  ; Y del cuchillo
5A79: E6FC            and 0FCh  ; Lo ajusta a multiplo de 4
5A7B: 77              ld (hl), a
                    
5A7C: 56              ld d, (hl)  ; (!?) Por que no hace un LD D,A
5A7D: 7A              ld a, d
5A7E: E603            and 3  ; (!?) Si acaba de hacer un AND #FC como va a haber un NZ con un AND 3?
5A80: C2BA5A          jp nz, caeKnife4
                    
5A83: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
5A86: 3E60            ld a, 60h  ; Offset al tile que esta debajo del cuchillo
5A88: CD1040          call ADD_A_HL
5A8B: 7E              ld a, (hl)  ; Tile del mapa bajo el cuchillo
5A8C: CDC85A          call chkKnifeChoca ; Comprueba si el tile es una plataforma, cuchillo, pico o gema
5A8F: C2BA5A          jp nz, caeKnife4 ; No choca con nada
                    
5A92: 78              ld a, b
5A93: FE41            cp 41h  ; Brillo izquierdo
5A95: CABA5A          jp z, caeKnife4
                    
5A98: FE42            cp 42h  ; Brillo derecho
5A9A: CABA5A          jp z, caeKnife4 ; Si cae sobre los brillos no pasa nada
                    
5A9D: E6F0            and 0F0h
5A9F: FE10            cp 10h  ; Es ladrillo?
5AA1: 2009            jr nz, setReboteKnife ; Rebota si cae sobre un obstaculo que no es un brillo o ladrillo
                    
5AA3 =              knifeEnd:
5AA3: CD0B5B          call hideKnifeSpr
5AA6: AF              xor a
5AA7: CD175B          call getKnifeData
                     
                    ; IF (VERSION2)
5AAA: 180B            jr setReboteKnife2 ; Apa? para ahorrar un byte
                    ; ELSE
                    ;  ld (hl), 0
                    ;  ret
                    ; ENDIF
                    ;----------------------------------------------------
                    ; Reinicia el rebote del cuchillo
                    ;----------------------------------------------------
                    
5AAC =              setReboteKnife:
5AAC: AF              xor a
5AAD: CD175B          call getKnifeData
5AB0: 3607            ld (hl), 7  ; Status 7 = Rebote
5AB2: 3E09            ld a, 9
5AB4: CD1040          call ADD_A_HL
5AB7 =              setReboteKnife2:
5AB7: 3600            ld (hl), 0  ; Contador de movimiento/rebote = 0
5AB9: C9              ret
                    
                    ;----------------------------------------------------
                    ; Le suma 4 a la Y del cuchillo y lo ajusta a multiplo de 4
                    ;----------------------------------------------------
                    
5ABA =              caeKnife4:
5ABA: 3E02            ld a, 2  ; Y
5ABC: CD175B          call getKnifeData
                     
                    ; IF (VERSION2)
5ABF: 7E              ld a,(hl)
5AC0: C604            add a,4
                    ; ELSE 
                    ;  inc (hl)
                    ;  inc (hl)
                    ;  inc (hl)
                    ;  inc (hl)  ; Y+4
                    ;  ld a, (hl)
                    ; ENDIF
5AC2: E6FC            and 0FCh
5AC4: 77              ld (hl), a
5AC5: C3D75A          jp updateKnifeAtt
                    
                    ;----------------------------------------------------
                    ; Comprueba si el tile es una plataforma, gema, cuchillo o gema
                    ; Out:
                    ;   Z = Si es uno de esos elementos
                    ;   B = Tile de entrada
                    ;----------------------------------------------------
                    
5AC8 =              chkKnifeChoca:
5AC8: 47              ld b, a  ; Comprueba si el tile es una plataforma, cuchillo, pico o gema
5AC9: E6F0            and 0F0h
5ACB: FE10            cp 10h  ; Plataformas
5ACD: C8              ret z
                    
5ACE: FE30            cp 30h  ; Cuchillo
5AD0: C8              ret z
                    
5AD1: FE80            cp 80h  ; Pico
5AD3: C8              ret z
                    
5AD4: FE40            cp 40h  ; Gemas
5AD6: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Actualiza los atributos RAM del sprite del cuchillo
                    ;----------------------------------------------------
                    
5AD7 =              updateKnifeAtt:
5AD7: 3E05            ld a, 5  ; Offset pantalla en la que esta el cuchillo
5AD9: CD175B          call getKnifeData
5ADC: 3A3AE1          ld a, (ProtaRoom) ; Parte alta de la coordenada X. Indica la habitacion de la piramide
5ADF: BE              cp (hl)
5AE0: 2029            jr nz, hideKnifeSpr ; No esta en la pantalla actual, asi que lo oculta
                    
5AE2: 2B              dec hl
5AE3: 2B              dec hl
5AE4: 2B              dec hl  ; Y
5AE5: E5              push hl
5AE6: CD3F5B          call getKnifeAttib
5AE9: EB              ex de, hl
5AEA: E1              pop hl
5AEB: 7E              ld a, (hl)  ; Y
5AEC: 12              ld (de), a  ; Atributo Y
5AED: 23              inc hl
5AEE: 23              inc hl
5AEF: 7E              ld a, (hl)  ; X
5AF0: 13              inc de
5AF1: 12              ld (de), a  ; Atributo X
5AF2: 13              inc de
5AF3: 3A03E0          ld a, (timer)
5AF6: E60C            and 0Ch  ; Se queda con 4 sprites de 16x16 (0, 4, 8, 12)
5AF8: C6F0            add a, 0F0h  ; Primer sprite del cuchillo
5AFA: EB              ex de, hl
5AFB: 77              ld (hl), a  ; Sprite del cuchillo
5AFC: 23              inc hl
5AFD: 360F            ld (hl), 0Fh ; Color blanco
5AFF: C9              ret
                    
                    ;----------------------------------------------------
                    ; Comprueba si se han procesado todos los cuchillos
                    ;----------------------------------------------------
                    
5B00 =              chkLastKnife:
5B00: 2162E2          ld hl, knifeEnProceso
5B03: 34              inc (hl)
5B04: 7E              ld a, (hl)
5B05: 23              inc hl
5B06: BE              cp (hl)
5B07: C20358          jp nz, AI_Cuchillos2
5B0A: C9              ret
                    
                    ;----------------------------------------------------
                    ; Quita al cuchillo del area visible
                    ;----------------------------------------------------
                    
5B0B =              hideKnifeSpr:
5B0B: CD3F5B          call getKnifeAttib
5B0E: 36E0            ld (hl), 0E0h
5B10: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Pasa el cuchillo al siguiente estado
                    ;----------------------------------------------------
                    
5B11 =              knifeNextStatus:
5B11: AF              xor a
5B12: CD175B          call getKnifeData
5B15: 34              inc (hl)
5B16: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Obtiene puntero a los datos del cuchillo actual
                    ; In: A = Offset a la variable de la estructura
                    ; Out:
                    ;   HL = Puntero a los datos del cuchillo (variable indicada en A)
                    ;    A = Valor de la variable
                    ;----------------------------------------------------
                    
5B17 =              getKnifeData:
5B17: C5              push bc
5B18: 2164E2          ld hl, knifesData ; 0 = Status (1 = suelo, 2 = Cogido, 4 = Lanzamiento?, 5= lanzado, 7 =Rebotando)
                         ; 1 = Sentido (1 = izquierda, 2 = Derecha)
                         ; 2 = Y
                         ; 3 = X decimales
                         ; 4 = X
                         ; 5 = Habitacion
                         ; 6 = Velocidad decimales
                         ; 7 = Velocidad cuchillo
                         ; 8 = Velocidad cambio habitacion
                         ; 9 = Contador movimiento
                         ; A = Tile backup 1 (fondo)
                         ; B = Tile backup 2 (guarda dos tiles al lanzarlo)
5B1B: CD1040          call ADD_A_HL
5B1E: 3A62E2          ld a, (knifeEnProceso)
5B21: 47              ld b, a
5B22: 87              add a, a
5B23: CDBF65          call getIndexX8_masB
5B26: C1              pop bc
5B27: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Calcula la direccion de la tabla de nombres a la que apunta DE
                    ; In:
                    ;   D = Y
                    ;   E = X
                    ; Out:
                    ;   HL = Puntero VRAM
                    ;----------------------------------------------------
                    
5B28 =              coordVRAM_DE:
5B28: F5              push af  ; D = Y, E = X
5B29: 62              ld h, d
5B2A: 6B              ld l, e
5B2B: 7C              ld a, h
5B2C: 1F              rra
5B2D: 1F              rra
5B2E: 1F              rra
5B2F: 1F              rra
5B30: CB1D            rr l
5B32: 1F              rra
5B33: CB1D            rr l
5B35: 1F              rra
5B36: CB1D            rr l
5B38: E603            and 3
5B3A: C638            add a, 38h  ; Tabla de nombre en #3800
5B3C: 67              ld h, a
5B3D: F1              pop af
5B3E: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Obtiene un puntero a los atributos del cuchillo en proceso
                    ;----------------------------------------------------
                    
5B3F =              getKnifeAttib:
5B3F: 3A62E2          ld a, (knifeEnProceso)
5B42: 21ECE0          ld hl, knifeAttrib
5B45: C3F971          jp getMomiaAtrib2
                    
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Comprueba si el cuchillo choca contra una momia
                    ; Out:
                    ;   NC, Z = No ha chocado
                    ;   C = Ha chocado
                    ;----------------------------------------------------
                    
5B48 =              chkKnifeMomia:
5B48: 0E00            ld c, 0  ; Primera momia a procesar = 0
                    
5B4A =              chkKnifeMomia2:
5B4A: 79              ld a, c  ; Momia a procesar
5B4B: CDDF73          call getMomiaDat
                    
5B4E: DD7E00          ld a, (ix+ACTOR_STATUS) ; Status de la momia
5B51: FE04            cp 4  ; Esta en el limbo, apareciendo o explotando?
5B53: 3804            jr c, chkKnifeMomia3
                    
5B55: FE07            cp 7  ; Esta pensando?
5B57: 2020            jr nz, chkKnifeMomia4 ; Esta en un estado que no hay que comprobar la colision
                    
5B59 =              chkKnifeMomia3:
5B59: 3E02            ld a, 2  ; Offset Y
5B5B: CD175B          call getKnifeData
5B5E: 56              ld d, (hl)  ; Y
5B5F: 23              inc hl
5B60: 23              inc hl
5B61: 5E              ld e, (hl)  ; X
5B62: 23              inc hl
5B63: 7E              ld a, (hl)  ; habitacion
5B64: DDBE06          cp (ix+ACTOR_ROOM)
5B67: 2010            jr nz, chkKnifeMomia4 ; No estan en la misma habitacion
                    
5B69: C5              push bc
5B6A: DD4E03          ld c, (ix+ACTOR_Y) ; Y momia
5B6D: DD4605          ld b, (ix+ACTOR_X) ; X momia
5B70: 21A95B          ld hl, areaSizeMomia
5B73: CD0B5D          call chkArea
5B76: C1              pop bc
5B77: 380B            jr c, chkKnifeMomia5
                    
5B79 =              chkKnifeMomia4:
5B79: 0C              inc c
5B7A: 2164E1          ld hl, numMomias
5B7D: 79              ld a, c
5B7E: BE              cp (hl)  ; Ha comprobado todas las momias?
5B7F: C24A5B          jp nz, chkKnifeMomia2
5B82: A7              and a
5B83: C9              ret
                    
5B84 =              chkKnifeMomia5:
                    ; IF (VERSION2)
5B84: DDE5            push ix
5B86: 110001          ld de, 100h
5B89: CD1244          call SumaPuntos
5B8C: 3E08            ld a, 8  ; SFX explota momia
5B8E: CDA97A          call setMusic
5B91: DDE1            pop ix
                    ; ELSE
                    ;  ld de, 100h
                    ;  call SumaPuntos
                    ;  ld a, 8  ; SFX explota momia
                    ;  call setMusic
                    ; ENDIF 
5B93: DD360006        ld (ix+ACTOR_STATUS), 6 ; Estado: Destello
5B97: DD360104        ld (ix+ACTOR_CONTROL), 4 ; Control: IZQUIERDA
5B9B: DD7E03          ld a, (ix+ACTOR_Y) ; Y momia
5B9E: E6F8            and 0F8h
5BA0: DD7703          ld (ix+ACTOR_Y), a ; Ajusta la Y a multiplo de 8
5BA3: DD361122        ld (ix+ACTOR_TIMER), 22h ; Timer
5BA7: 37              scf
5BA8: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Area a comprobar el impacto del cuchillos
                    ;----------------------------------------------------
5BA9: 0818          areaSizeMomia: db 8, 18h
5BAB: 0818            db 8, 18h
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba si el prota coge un cuchillo
                    ; En caso de cogerlo, restaura en el mapa y en pantalla el tile sobre el que estaba el cuchillo
                    ;----------------------------------------------------
                    
5BAD =              chkCogeKnife:
5BAD: 3A44E1          ld a, (objetoCogido) ; #10 = Cuchillo, #20 = Pico
5BB0: A7              and a
5BB1: C0              ret nz  ; Ya lleva algo
                    
5BB2: 2162E2          ld hl, knifeEnProceso
5BB5: 77              ld (hl), a
5BB6: 23              inc hl
5BB7: BE              cp (hl)
5BB8: C8              ret z  ; No hay cuchillos en esta piramide
                    
5BB9 =              chkCogeKnife2:
5BB9: AF              xor a
5BBA: CD175B          call getKnifeData ; Datos del cuchillo
5BBD: CD025C          call getLocationDE ; Comprueba si esta en la misma habitacion que el prota
5BC0: 2009            jr nz, chkCogeKnife3 ;  No estan en la misma habitacion
                    
5BC2: FE01            cp 1  ; Esta en reposo en el suelo? (Status = 1)
5BC4: 2005            jr nz, chkCogeKnife3 ; No, comprueba el siguiente cuchillo
                    
5BC6: CDFA5C          call chkAreaItem ; Comprueba si el prota esta en contacto con el cuchillo
5BC9: 380A            jr c, chkCogeKnife4 ; Si!
                    
5BCB =              chkCogeKnife3:
5BCB: 2162E2          ld hl, knifeEnProceso
5BCE: 34              inc (hl)
5BCF: 7E              ld a, (hl)
5BD0: 23              inc hl
5BD1: BE              cp (hl)
5BD2: 20E5            jr nz, chkCogeKnife2
5BD4: C9              ret
                    
5BD5 =              chkCogeKnife4:
5BD5: 3A62E2          ld a, (knifeEnProceso)
5BD8: 3261E2          ld (IDcuchilloCoge), a ; Cuchillo que coge el prota
                    
5BDB: 3E04            ld a, 4  ; SFX coge objeto
5BDD: CDA97A          call setMusic
                    
5BE0: 3E10            ld a, 10h  ; Cuchillo
5BE2: CDBB4E          call cogeObjeto ; Carga los sprites del prota con el cuchillo
                    
5BE5: AF              xor a
5BE6: CD175B          call getKnifeData
5BE9: 34              inc (hl)  ; Pasa el cuchillo al siguiente estado (2 = Lo lleva el prota)
                    
5BEA: 54              ld d, h
5BEB: 5D              ld e, l
5BEC: E5              push hl
5BED: 010A00          ld bc, 0Ah  ; Offset tile backup del mapa
5BF0: 09              add hl, bc
5BF1: 46              ld b, (hl)  ; Tile sobre el que estaba el cuchillo
5BF2: E1              pop hl  ; Apunta al estado
                    
5BF3: 23              inc hl
5BF4: 23              inc hl  ; Apunta a la Y
5BF5: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
5BF8: 70              ld (hl), b  ; Restaura el tile del mapa
5BF9: 62              ld h, d
5BFA: 6B              ld l, e  ; Recupe puntero a los datos del cuchillo (status)
5BFB: 78              ld a, b  ; Tile del mapa
5BFC: CD755D          call getTileFromID ; Obtiene patron que le corresponde al tile
5BFF: C3115C          jp drawTile ; Lo dibuja en pantalla
                    
                    
                    ;----------------------------------------------------
                    ; Obtiene las coordenadas del elemento y comprueba si esta en la misma habitacion que el prota
                    ; In: HL = Puntero a Y, X, habitacion
                    ; Out:
                    ;    Z = Esta en la habitacion del prota
                    ;    D = Y
                    ;    E = X
                    ;----------------------------------------------------
                    
5C02 =              getLocationDE:
5C02: 23              inc hl
                    
5C03 =              getLocationDE2:
5C03: 23              inc hl
                    
5C04 =              getLocationDE3:
5C04: 56              ld d, (hl)  ; Y
5C05: 23              inc hl
5C06: 23              inc hl
5C07: 5E              ld e, (hl)  ; X
5C08: 23              inc hl
5C09: 47              ld b, a
5C0A: 4E              ld c, (hl)  ; Habitacion
5C0B: 3A3AE1          ld a, (ProtaRoom) ; Parte alta de la coordenada X. Indica la habitacion de la piramide
5C0E: B9              cp c  ; Esta en la misma pantalla que el prota?
5C0F: 78              ld a, b
5C10: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Dibuja un cuchillo
                    ; In: HL = Puntero a status, sentido, Y, X, habitacion
                    ;----------------------------------------------------
                    
5C11 =              drawTile:
5C11: CD025C          call getLocationDE
5C14: C0              ret nz  ; No esta en la habitacion visible
                    
5C15: CD285B          call coordVRAM_DE ; Pasa coordenadas en DE a direccion de VRAM
                    ; IF (VERSION2)
5C18: CD4D00          call WRTVRM
5C1B: 0601            ld b,1
5C1D: 05              dec b
5C1E: C9              ret
                    ; ELSE
                    ;  jp WRTVRM  ; Escribe un dato en la VRAM
                    ; ENDIF
                    
                    ;----------------------------------------------------
                    ;
                    ; Comprueba si el prota coge una gema
                    ;
                    ;----------------------------------------------------
                    
5C1F =              chkCogeGema:
5C1F: AF              xor a
5C20: 32F4E1          ld (ElemEnProceso), a ; Empezamos por la primera gema
                    
5C23 =              chkCogeGema2:
5C23: AF              xor a
5C24: CDB565          call getGemaDat ; Puntero a los datos de la gema
5C27: CD025C          call getLocationDE ; Esta en la pantalla del prota?
5C2A: 201B            jr nz, chkCogeGema3
                    
5C2C: E60F            and 0Fh  ; A = Color de la gema
5C2E: 2817            jr z, chkCogeGema3 ; Color 0
                    
5C30: CDFA5C          call chkAreaItem ; Comprueba si el prota esta tocando la gema
5C33: 3012            jr nc, chkCogeGema3 ; No
                    
5C35: 110005          ld de, 500h
5C38: CD1244          call SumaPuntos ; Suma 500 puntos
                    
5C3B: 3E09            ld a, 9  ; SFX coger gema
5C3D: CDA97A          call setMusic
                    
5C40: 3E01            ld a, 1  ; Offset status
5C42: CDB565          call getGemaDat
5C45: 3602            ld (hl), 2  ; Status = Gema cogida. Hay que borrarla
                    
5C47 =              chkCogeGema3:
                    ; IF (VERSION2)
5C47: CDAD65          call chkLastGema2
5C4A: 20D7            jr nz,chkCogeGema2
5C4C: C9              ret
                    ; ELSE
                    ;  ld hl, ElemEnProceso ; Usado para saber la gema o puerta que se esta procesando
                    ;  inc (hl)  ; Siguiente gema
                    ;  ld a, (hl)
                    ;  dec hl  ; Puntero a gemas totales en la piramide
                    ;  cp (hl)  ; Quedan gemas por comprobar?
                    ;  jr nz, chkCogeGema2
                    ;  ret
                    ; ENDIF
                    ;----------------------------------------------------
                    ; Offset X al centro del objeto, ancho area a comprobar (ancho prota)
                    ; Offset Y al centro del objeto, alto area (parte superior del prota)
                    ; Para colisiones con objetos se comprueba la parte superior del prota
                    ; con el centro superior del objeto
                    ;----------------------------------------------------
5C4D: 0511          itemHitArea: db 5, 11h
5C4F: 0109            db 1, 9
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba si el prota coge un pico
                    ;----------------------------------------------------
                    
5C51 =              chkCogePico:
5C51: 3A44E1          ld a, (objetoCogido) ; #10 = Cuchillo, #20 = Pico
5C54: A7              and a
5C55: C0              ret nz  ; Ya lleva algo
                    
                    
5C56: 21CBE2          ld hl, numPicos
5C59: 7E              ld a, (hl)
5C5A: B7              or a
5C5B: C8              ret z  ; No hay picos
                    
5C5C: AF              xor a
5C5D: 32F4E1          ld (ElemEnProceso), a ; Comienza a comprobar desde el primer pico
                    
                    ; IF (!VERSION2)
                    ;  inc hl  ; (!?) No se usa!
                    ; ENDIF
                    
5C60 =              chkNextPico:
5C60: AF              xor a
5C61: CD9E5C          call getPicoData ; Obtiene puntero a los datos del pico
5C64: CD035C          call getLocationDE2 ; Comprueba si esta en la misma habitacionq ue el prota
5C67: 202A            jr nz, chkLastPico ; No, pasa al siguiente pico
                    
5C69: A7              and a  ; Esta activo o ya ha sido cogido?
5C6A: 2827            jr z, chkLastPico ; No esta activo. Pasa al siguiente
                    
5C6C: CDFA5C          call chkAreaItem ; Comprueba si el prota toca el pico
5C6F: 3022            jr nc, chkLastPico ; No, pasa al siguiente
                    
5C71: 3E04            ld a, 4  ; SFX Coger objeto
5C73: CDA97A          call setMusic
                    
5C76: AF              xor a
5C77: CD9E5C          call getPicoData ; Puntero a los datos del pico
                    
5C7A: 3600            ld (hl), 0  ; Marca pico como usado (lo desactiva)
5C7C: E5              push hl
5C7D: 23              inc hl  ; Apunta a la Y
5C7E: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
                    
5C81: AF              xor a
5C82: 77              ld (hl), a  ; Borra el pico del mapa
5C83: E1              pop hl
5C84: 2B              dec hl
5C85: CD115C          call drawTile ; Borra el pico de la pantalla
                    
5C88: 3AF4E1          ld a, (ElemEnProceso) ; Usado para saber la gema o puerta que se esta procesando
5C8B: 32CAE2          ld (idxPicoCogido), a ; Indice del pico cogido por el prota
5C8E: 3E20            ld a, 20h  ; Pico
5C90: C3BB4E          jp cogeObjeto ; Carga los sprites del prota llevando el pico
                    
5C93 =              chkLastPico:
5C93: 21F4E1          ld hl, ElemEnProceso ; Usado para saber la gema o puerta que se esta procesando
5C96: 34              inc (hl)
5C97: 3ACBE2          ld a, (numPicos)
5C9A: BE              cp (hl)
5C9B: 20C3            jr nz, chkNextPico
5C9D: C9              ret
                    
                    ;----------------------------------------------------
                    ; Obtiene un puntero a los datos del pico en proceso
                    ;----------------------------------------------------
                    
5C9E =              getPicoData:
5C9E: 3AF4E1          ld a, (ElemEnProceso) ; Usado para saber la gema o puerta que se esta procesando
5CA1: 21CCE2          ld hl, picosData ; Datos de los picos
5CA4: 47              ld b, a
5CA5: C3C065          jp getIndexX4_masB
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba si el prota toca a una momia
                    ; La momia tiene que estar viva y en un estado activo
                    ; Si el prota o la momia esta en una escalera, ambos tendran que estar en escaleras para que se compruebe la colision
                    ;----------------------------------------------------
                    
5CA8 =              chkTocaMomia:
5CA8: 0E00            ld c, 0  ; Comienza por la primera momia
                    
5CAA =              chkNextMomia:
5CAA: 79              ld a, c
5CAB: CDDF73          call getMomiaDat ; Obtiene puntero a los datos de la momia
5CAE: 2A62E1          ld hl, (pMomiaProceso) ; Puntero a los datos de la momia en proceso
5CB1: 7E              ld a, (hl)
5CB2: FE04            cp 4  ; Esta andando, saltando, cayendo o en unas escaleras?
5CB4: 3804            jr c, chkTocaMomia2 ; Si
                    
5CB6: FE07            cp 7  ; Esta pensando?
5CB8: 2027            jr nz, chkLastACTOR_ ; No, pasa a la siguiete momia
                    
5CBA =              chkTocaMomia2:
5CBA: 3A34E1          ld a, (protaStatus) ; Status del prota
5CBD: 47              ld b, a
5CBE: FE03            cp 3  ; Esta en unas escaleras?
5CC0: 2805            jr z, chkTocaMomia3 ; si
                    
5CC2: 7E              ld a, (hl)  ; Status de la momia
5CC3: FE03            cp 3  ; Esta la momia en unas escaleras?
5CC5: 2004            jr nz, chkTocaMomia4 ; No
                    
5CC7 =              chkTocaMomia3:
5CC7: 78              ld a, b
5CC8: BE              cp (hl)  ; Estan ambos en unas escaleras?
5CC9: 2016            jr nz, chkLastACTOR_ ; No, entonces no se comprueba si se tocan
                    
5CCB =              chkTocaMomia4:
5CCB: 3A3AE1          ld a, (ProtaRoom) ; Habitacion en la que esta el prota
5CCE: DDBE06          cp (ix+ACTOR_ROOM) ; Habitacion en la que esta la momia
5CD1: 200E            jr nz, chkLastACTOR_ ; No estan en la misma habitacion
                    
5CD3: DD5603          ld d, (ix+ACTOR_Y) ; Y momia
5CD6: DD5E05          ld e, (ix+ACTOR_X) ; X momia
5CD9: 21F65C          ld hl, mummyHitArea
5CDC: CDFD5C          call chkTocaProta ; Comprueba si el prota toca a la momia
5CDF: 380B            jr c, momiaMataProta ; Si, se tocan. El prota muere
                    
5CE1 =              chkLastACTOR_:
5CE1: 0C              inc c  ; Siguiente momia
5CE2: 2164E1          ld hl, numMomias ; Numero de momias de la piramide
5CE5: 79              ld a, c
5CE6: BE              cp (hl)  ; Ha comprobado todas las momias?
5CE7: C2AA5C          jp nz, chkNextMomia ; No
                    
5CEA: A7              and a
5CEB: C9              ret
                    
5CEC =              momiaMataProta:
5CEC: 3E1D            ld a, 1Dh  ; Musica muere prota
5CEE: CDA97A          call setMusic
5CF1: AF              xor a
5CF2: 3253E0          ld (flagVivo), a ; Mata al prota
5CF5: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Offset X al centro de la momia, ancho del area a comprobar (ancho prota)
                    ; Offset Y al centro de la momia, alto del area (alto prota)
                    ; Para colisiones con momias se comprueba el area total del prota
                    ; con el centro de la momia
                    ;----------------------------------------------------
5CF6: 050A          mummyHitArea: db 5, 0Ah
5CF8: 0810            db 8, 10h
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba si el prota esta tocando las coordenadas
                    ; del objeto DE
                    ;----------------------------------------------------
                    
5CFA =              chkAreaItem:
5CFA: 214D5C          ld hl, itemHitArea
                    
5CFD =              chkTocaProta:
5CFD: C5              push bc
5CFE: 3A37E1          ld a, (ProtaY)
5D01: 4F              ld c, a
5D02: 3A39E1          ld a, (ProtaX)
5D05: 47              ld b, a
5D06: CD0B5D          call chkArea
5D09: C1              pop bc
5D0A: C9              ret
                    
                    ;----------------------------------------------------
                    ; Comprueba si las coordendas DE estan dentro de una
                    ; determinada area
                    ;
                    ; DE indica las coordenadas del punto a comprobar
                    ; E = X punto
                    ; D = Y punto
                    ; A DE se le aplica un desplazamiento para indicar que
                    ; punto exacto del elemento se quiere comprobar (por ejemplo el centro de una momia)
                    ;
                    ; BC incia las coordenadas del area a comprobar
                    ; B = X area
                    ; C = Y area
                    ; El Tama? del area viene indicado por HL+1 y HL+3
                    
                    ; HL:
                    ; +0 = Offset X1
                    ; +1 = Ancho area
                    ; +2 = Offset Y1
                    ; +3 = Alto area
                    ;
                    ;----------------------------------------------------
                    
5D0B =              chkArea:
5D0B: 78              ld a, b  ; X area
5D0C: 93              sub e  ; X punto
5D0D: 96              sub (hl)  ; Offset X del punto
5D0E: 23              inc hl
5D0F: 86              add a, (hl)  ; Ancho del area
5D10: 3006            jr nc, chkArea2 ; No esta dentro
                    
5D12: 79              ld a, c  ; Y area
5D13: 92              sub d  ; Y punto
5D14: 23              inc hl
5D15: 96              sub (hl)  ; Offset Y del punto
5D16: 23              inc hl
5D17: 86              add a, (hl)  ; Alto del area
                    
5D18 =              chkArea2:
5D18: C9              ret
                    
                    ;----------------------------------------------------
                    ;
                    ; Mueve el scroll 4 posiciones dependiendo del sentido del protagonista
                    ;
                    ; Si ha movido una pantalla completa o cambia el 'flagScrolling' termina.
                    ;
                    ;----------------------------------------------------
                    
5D19 =              tickScroll:
5D19: 2104E0          ld hl, waitCounter
                    ; IF (VERSION2)
5D1C: 7E              ld a,(hl)
5D1D: D604            sub 4
5D1F: 77              ld (hl),a
                    ; ELSE
                    ;  dec (hl)
                    ;  dec (hl)
                    ;  dec (hl)
                    ;  dec (hl)  ; Mueve el scroll 4 posiciones
                    ;  ld a, (hl)
                    ; ENDIF
5D20: FEFC            cp 0FCh
5D22: C8              ret z  ; Ha llegado al final
                    
5D23: 3A36E1          ld a, (sentidoProta) ; 1 = Izquierda, 2 = Derecha
5D26: 1F              rra
5D27: 7E              ld a, (hl)
5D28: 3804            jr c, tickScroll2
5D2A: D620            sub 20h
5D2C: ED44            neg
                    
5D2E =              tickScroll2:
5D2E: CD385D          call tickScroll3
5D31: 3A47E1          ld a, (flagScrolling)
5D34: A7              and a
5D35: C8              ret z
5D36: 37              scf
5D37: C9              ret
                    
5D38 =              tickScroll3:
5D38: 47              ld b, a  ; Desplazamiento relativo a la habitacion actual
5D39: 213AE1          ld hl, ProtaRoom ; Parte alta de la coordenada X. Indica la habitacion de la piramide
5D3C: 3A36E1          ld a, (sentidoProta) ; 1 = Izquierda, 2 = Derecha
5D3F: FE03            cp 3
5D41: 2002            jr nz, tickScroll4
5D43: 3E01            ld a, 1
                    
5D45 =              tickScroll4:
5D45: 86              add a, (hl)
5D46: FE03            cp 3
5D48: 3E20            ld a, 20h
5D4A: 2801            jr z, tickScroll5
5D4C: AF              xor a
                    
5D4D =              tickScroll5:
5D4D: 80              add a, b
5D4E: 1160E7          ld de, MapaRAM
5D51: CD1540          call ADD_A_DE ; Aplica desplazamiento
                    
                    
                    ;----------------------------------------------------
                    ; Dibuja la habitacion actual
                    ; In:
                    ;  DE = Puntero al mapa de la habitacion
                    ;----------------------------------------------------
                    
5D54 =              drawRoom:
5D54: 212038          ld hl, 3820h ; Segunda fila de la pantalla (la primera esta reservada para el marcador)
5D57: CD3645          call setVDPWrite
5D5A: 0616            ld b, 16h  ; Numero de filas (alto en tiles)
                    
5D5C =              drawRoom2:
5D5C: C5              push bc
5D5D: D5              push de
5D5E: 0620            ld b, 20h  ; Numero de columnas (ancho en tiles)
                    
5D60 =              drawRoom3:
5D60: 1A              ld a, (de)  ; ID tile
5D61: CD755D          call getTileFromID
5D64: D9              exx
5D65: ED79            out (c), a
5D67: D9              exx
5D68: 13              inc de
5D69: 10F5            djnz drawRoom3
                    
5D6B: D1              pop de
5D6C: 3E60            ld a, 60h  ; Desplazamiento a la siguiente fila (3*32)
5D6E: CD1540          call ADD_A_DE
5D71: C1              pop bc
5D72: 10E8            djnz drawRoom2 ; Dibuja siguiente fila
5D74: C9              ret
                    
                    ;----------------------------------------------------
                    ;
                    ; Obtiene el patron/tile que corresponde al "ID" del mapa
                    ; In:  A = Map ID
                    ; Out: A = Tile ID
                    ;
                    ;----------------------------------------------------
                    
5D75 =              getTileFromID:
5D75: E5              push hl
5D76: 4F              ld c, a
5D77: 1F              rra
5D78: 1F              rra
5D79: 1F              rra
5D7A: E61E            and 1Eh  ; El nibble alto indica el grupo de tiles
5D7C: 218B5D          ld hl, indexTiles
5D7F: CD496D          call getIndexHL_A
5D82: 79              ld a, c
5D83: E60F            and 0Fh  ; El nibble bajo indica el indice dentro del grupo
5D85: CD1040          call ADD_A_HL
5D88: 7E              ld a, (hl)  ; Obtiene el patron que corresponde con ese ID del mapa
5D89: E1              pop hl
5D8A: C9              ret
                    
                    
                    
5D8B: 9F5D          indexTiles: dw tilesNULL
5D8D: A15D            dw tilesPlataforma ; #10
5D8F: AF5D            dw tilesEscalera ; #20
5D91: B35D            dw tilesCuchillo ; #30
5D93: B65D            dw tilesGemas ; #40
5D95: BF5D            dw tilesGiratoria ; #50
5D97: C35D            dw tilesSalida ; #60
5D99: D35D            dw tilesSalida2 ; #70
5D9B: DD5D            dw tilePico ; #80
                     
                    ; IF (!VERSION2)
                    ;  dw byte_5DC3 ; #90 (!?) Estos bloques no se usan!
                    ;  dw byte_5DC4 ; #A0
                    ;  dw byte_5DC6 ; #B0
                    ;  dw byte_5DC7 ; #C0
                    ; ENDIF
5D9D: DE5D            dw tilesAgujero ; #D0
                    
5D9F: 00            tilesNULL: db 0
5DA0: 00              db 0
                    
5DA1: 00            tilesPlataforma:db 0
5DA2: 00              db 0  ; Vacio
5DA3: 40              db 40h
5DA4: 40              db 40h  ; Ladrillo
5DA5: 41              db 41h  ; Limite inferior
5DA6: 73              db 73h  ; Inicio de escalera que baja hacia la derecha (parte izquierda)
5DA7: 74              db 74h  ; Inicio de escalera que baja hacia la derecha (Parte derecha)
5DA8: 83              db 83h  ; Inicio de escalera que baja hacia la izquierda (parte derecha)
5DA9: 82              db 82h  ; Inicio de escalera que baja hacia la izquierda (parte izquierda)
5DAA: 40              db 40h  ; Ladrillo completo muro trampa
5DAB: 42              db 42h  ; Ladrillo simple muro trampa
5DAC: 43              db 43h  ; Ladrillo semiroto 1
5DAD: 44              db 44h  ; Ladrillo semiroto 2
5DAE: 44              db 44h
                    
                    
5DAF: 75            tilesEscalera: db 75h
5DB0: 76              db 76h  ; Pelda?s bajan derecha
5DB1: 85              db 85h
5DB2: 84              db 84h  ; Pelda?s bajan izquierda
                    
                    
5DB3: 4B            tilesCuchillo: db 4Bh
5DB4: 4B              db 4Bh
5DB5: 4B              db 4Bh  ; Cuchillo suelo
                    
                    
5DB6: 51            tilesGemas: db 51h
                         ; Brillo superior
5DB7: 52              db 52h  ; Brillo gema izquierda
5DB8: 53              db 53h  ; Brillo gema derecha
5DB9: 86              db 86h  ; Gema azul oscuro
5DBA: 87              db 87h  ; Gema azul claro
5DBB: 88              db 88h  ; Gema magenta
5DBC: 89              db 89h  ; Gema amarilla
5DBD: 8A              db 8Ah  ; Gema verde
5DBE: 8B              db 8Bh  ; Gema gris
                    
                    
5DBF: 68            tilesGiratoria: db 68h
5DC0: 69              db 69h  ; Puerta giratoria izquierda->derecha
5DC1: 78              db 78h
5DC2: 77              db 77h  ; Puerta giratoria derecha->izquierda
                    
                    
5DC3: 6C            tilesSalida: db 6Ch
5DC4: 7B              db 7Bh
5DC5: 6D              db 6Dh
5DC6: 7C              db 7Ch
5DC7: 6E              db 6Eh
5DC8: 7D              db 7Dh
5DC9: 63              db 63h  ; Interior superior amarillo salida 1
5DCA: 64              db 64h  ; Interior superior amarillo salida 2
5DCB: 65              db 65h
5DCC: 66              db 66h
5DCD: 67              db 67h  ; Escaleras
5DCE: 6F              db 6Fh  ; Ladrillos cerrandose
5DCF: 5F              db 5Fh
5DD0: 60              db 60h
5DD1: 7E              db 7Eh
5DD2: 70              db 70h
                    
                    
5DD3: 71            tilesSalida2: db 71h
5DD4: 80              db 80h
5DD5: 7F              db 7Fh
5DD6: 72              db 72h
5DD7: 61              db 61h
5DD8: 62              db 62h
5DD9: 81              db 81h
5DDA: 5C              db 5Ch  ; Palanca abajo
5DDB: 5D              db 5Dh  ; Palanca arriba
5DDC: 5E              db 5Eh  ; Parte inferior palanca
                    
5DDD: 4C            tilePico: db 4Ch
                    
                    ; IF (VERSION2)
5DDE: 4E            tilesAgujero: db #4e 
                    ; ELSE
                    ; 
                    ;byte_5DC3: db 4Eh
                    ;
                    ;byte_5DC4: db 4Fh
                    ;  db 50h
                    ;
                    ;byte_5DC6: db 0
                    ;
                    ;byte_5DC7: db 0
                    ;
                    ;tilesAgujero: db 43h
                    ;  db 44h  ; Ladrillo semiroto2
                    ; ENDIF
                    
                    
5DDF: C0008000800081FFFF0080008000FFC08000800080009FFF80008000800080008FF080038000F000FC00FFFF  halfMap1: db 0C0h, 0, 80h, 0, 80h, 0, 81h, 0FFh, 0FFh, 0, 80h, 0, 80h, 0, 0FFh, 0C0h, 80h, 0, 80h, 0, 80h, 0, 9Fh, 0FFh, 80h, 0, 80h, 0, 80h, 0, 80h, 0, 8Fh, 0F0h, 80h, 3, 80h, 0, 0F0h, 0, 0FCh, 0, 0FFh, 0FFh
5E0B: C00080008000FFFFC000C000C0FFF8FF800F800F80F180F1800F800F80FF80FF80F8FCF880FF800080008000    db 0C0h, 0, 80h, 0, 80h, 0, 0FFh, 0FFh, 0C0h, 0, 0C0h, 0, 0C0h, 0FFh, 0F8h, 0FFh, 80h, 0Fh, 80h, 0Fh, 80h, 0F1h, 80h, 0F1h, 80h, 0Fh, 80h, 0Fh, 80h, 0FFh, 80h, 0FFh, 80h, 0F8h, 0FCh, 0F8h, 80h, 0FFh, 80h, 0, 80h, 0, 80h, 0
5E37: C00080008000FFF880008000FC00800080FF80FFFFFF80FF80F080F0FFFF800080008000FFFF800080008000    db 0C0h, 0, 80h, 0, 80h, 0, 0FFh, 0F8h, 80h, 0, 80h, 0, 0FCh, 0, 80h, 0, 80h, 0FFh, 80h, 0FFh, 0FFh, 0FFh, 80h, 0FFh, 80h, 0F0h, 80h, 0F0h, 0FFh, 0FFh, 80h, 0, 80h, 0, 80h, 0, 0FFh, 0FFh, 80h, 0, 80h, 0, 80h, 0
5E63: C00080008000FFFFC000C000C000FFF080008000F000800080008000FFFFFF80808080809CFF80008000F000    db 0C0h, 0, 80h, 0, 80h, 0, 0FFh, 0FFh, 0C0h, 0, 0C0h, 0, 0C0h, 0, 0FFh, 0F0h, 80h, 0, 80h, 0, 0F0h, 0, 80h, 0, 80h, 0, 80h, 0, 0FFh, 0FFh, 0FFh, 80h, 80h, 80h, 80h, 80h, 9Ch, 0FFh, 80h, 0, 80h, 0, 0F0h, 0
                    
5E8F: 000000000000FFC00000000FFE00C000C000FFFF0000000000000000FFF0000000000FFF0000000000000FFF  halfMap2: db 0, 0, 0, 0, 0, 0, 0FFh, 0C0h, 0, 0, 0, 0Fh, 0FEh, 0, 0C0h, 0, 0C0h, 0, 0FFh, 0FFh, 0, 0, 0, 0, 0, 0, 0, 0, 0FFh, 0F0h, 0, 0, 0, 0, 0Fh, 0FFh, 0, 0, 0, 0, 0, 0, 0Fh, 0FFh
5EBB: 000000000000FF0003C003FF00800080F080F0FFF000F000F000F3F0F00000000000001FFF800000000001FF    db 0, 0, 0, 0, 0, 0, 0FFh, 0, 3, 0C0h, 3, 0FFh, 0, 80h, 0, 80h, 0F0h, 80h, 0F0h, 0FFh, 0F0h, 0, 0F0h, 0, 0F0h, 0, 0F3h, 0F0h, 0F0h, 0, 0, 0, 0, 0, 0, 1Fh, 0FFh, 80h, 0, 0, 0, 0, 1, 0FFh
5EE7: 0000000000000000000003FFFC00FC00FC00FCFF00FC00FCFCFCFCFCFC00FC000000007FFFC000000000000F    db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0FFh, 0FCh, 0, 0FCh, 0, 0FCh, 0, 0FCh, 0FFh, 0, 0FCh, 0, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0, 0FCh, 0, 0, 0, 0, 7Fh, 0FFh, 0C0h, 0, 0, 0, 0, 0, 0Fh
                    
5F13: 00000000000000000000FFFC000000000000FFFF000000003C0F003F00FF03F10FF1FFFF000000000000FFFF  halfMap3: db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0FFh, 0FCh, 0, 0, 0, 0, 0, 0, 0FFh, 0FFh, 0, 0, 0, 0, 3Ch, 0Fh, 0, 3Fh, 0, 0FFh, 3, 0F1h, 0Fh, 0F1h, 0FFh, 0FFh, 0, 0, 0, 0, 0, 0, 0FFh, 0FFh
5F3F: 000000000000000F00F0FF000000001F01F8FFF80FFF0C000C000C000FFF03FF0003F00303F000000000FFFF    db 0, 0, 0, 0, 0, 0, 0, 0Fh, 0, 0F0h, 0FFh, 0, 0, 0, 0, 1Fh, 1, 0F8h, 0FFh, 0F8h, 0Fh, 0FFh, 0Ch, 0, 0Ch, 0, 0Ch, 0, 0Fh, 0FFh, 3, 0FFh, 0, 3, 0F0h, 3, 3, 0F0h, 0, 0, 0, 0, 0FFh, 0FFh
5F6B: 00000000000001FF0100FF00001F00000000F00003FF00000000000007FF00000000FC0000FF00000000FFF8    db 0, 0, 0, 0, 0, 0, 1, 0FFh, 1, 0, 0FFh, 0, 0, 1Fh, 0, 0, 0, 0, 0F0h, 0, 3, 0FFh, 0, 0, 0, 0, 0, 0, 7, 0FFh, 0, 0, 0, 0, 0FCh, 0, 0, 0FFh, 0, 0, 0, 0, 0FFh, 0F8h
                    
5F97: 000300010001000107FF0001000100010001FFFF0001000100010001000100010001FFFF000100010001FFFF  halfMap4: db 0, 3, 0, 1, 0, 1, 0, 1, 7, 0FFh, 0, 1, 0, 1, 0, 1, 0, 1, 0FFh, 0FFh, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0FFh, 0FFh, 0, 1, 0, 1, 0, 1, 0FFh, 0FFh
5FC3: 000300010001FFFF00010001FFF1000100010001FFFF000100010001000100013FFF0001000100010001FFFF    db 0, 3, 0, 1, 0, 1, 0FFh, 0FFh, 0, 1, 0, 1, 0FFh, 0F1h, 0, 1, 0, 1, 0, 1, 0FFh, 0FFh, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 3Fh, 0FFh, 0, 1, 0, 1, 0, 1, 0, 1, 0FFh, 0FFh
5FEF: 000300010001FFF100210021FFF9001100110011FFF1001100110011FFF1001100110011FF91001F001F001F    db 0, 3, 0, 1, 0, 1, 0FFh, 0F1h, 0, 21h, 0, 21h, 0FFh, 0F9h, 0, 11h, 0, 11h, 0, 11h, 0FFh, 0F1h, 0, 11h, 0, 11h, 0, 11h, 0FFh, 0F1h, 0, 11h, 0, 11h, 0, 11h, 0FFh, 91h, 0, 1Fh, 0, 1Fh, 0, 1Fh
601B: 000300010001FF8100FF0001000103FF000100010001FFF900010001000100010FF1C0010001000F003FFFFF    db 0, 3, 0, 1, 0, 1, 0FFh, 81h, 0, 0FFh, 0, 1, 0, 1, 3, 0FFh, 0, 1, 0, 1, 0, 1, 0FFh, 0F9h, 0, 1, 0, 1, 0, 1, 0, 1, 0Fh, 0F1h, 0C0h, 1, 0, 1, 0, 0Fh, 0, 3Fh, 0FFh, 0FFh
                    
                    ;----------------------------------------------------
                    ;
                    ; Mapas: Piramides 1-15
                    ;
                    ;----------------------------------------------------
6047: 0033FFFFFF487824024848  MapStage1: db 0, 33h, 0FFh, 0FFh, 0FFh, 48h, 78h, 24h, 2, 48h, 48h ; ...
6052: 0048B002047018183118E042    db 0, 48h, 0B0h, 2, 4, 70h, 18h, 18h, 31h, 18h, 0E0h, 42h
605E: A0105478D001807800000008    db 0A0h, 10h, 54h, 78h, 0D0h, 1, 80h, 78h, 0, 0, 0, 8
606A: 302830C9502850C97841    db 30h, 28h, 30h, 0C9h, 50h, 28h, 50h, 0C9h, 78h, 41h
6074: 78B0A050A0A1    db 78h, 0B0h, 0A0h, 50h, 0A0h, 0A1h
                    
                    
                    
607A: 00112130FFFF70301878D1  MapStage2: db 0, 11h, 21h, 30h, 0FFh, 0FFh, 70h, 30h, 18h, 78h, 0D1h
6085: 340318D0003088046061010555    db 34h, 3, 18h, 0D0h, 0, 30h, 88h, 4, 60h, 61h, 1, 5, 55h
6092: 50907760B8881849693061    db 50h, 90h, 77h, 60h, 0B8h, 88h, 18h, 49h, 69h, 30h, 61h
609D: 436851031038A0C018D107    db 43h, 68h, 51h, 3, 10h, 38h, 0A0h, 0C0h, 18h, 0D1h, 7
60A8: 10B8401840C88070900848    db 10h, 0B8h, 40h, 18h, 40h, 0C8h, 80h, 70h, 90h, 8, 48h
60B3: 6990D1020220760228460278    db 69h, 90h, 0D1h, 2, 2, 20h, 76h, 2, 28h, 46h, 2, 78h
60BF: 7980910D3041503060D178    db 79h, 80h, 91h, 0Dh, 30h, 41h, 50h, 30h, 60h, 0D1h, 78h
60CA: 5180E0A050A891401340    db 51h, 80h, 0E0h, 0A0h, 50h, 0A8h, 91h, 40h, 13h, 40h
60D4: D28093A022A052A0B3    db 0D2h, 80h, 93h, 0A0h, 22h, 0A0h, 52h, 0A0h, 0B3h
                    
                    
                    
60DD: 0230FFFFA0686878E044  MapStage5: db 2, 30h, 0FFh, 0FFh, 0A0h, 68h, 68h, 78h, 0E0h, 44h
60E7: 0210B803803800043018D887    db 2, 10h, 0B8h, 3, 80h, 38h, 0, 4, 30h, 18h, 0D8h, 87h
60F3: 504879507848687001A080    db 50h, 48h, 79h, 50h, 78h, 48h, 68h, 70h, 1, 0A0h, 80h
60FE: 0518F03810781090E8A808    db 5, 18h, 0F0h, 38h, 10h, 78h, 10h, 90h, 0E8h, 0A8h, 8
6109: 0001A0180A281940994828    db 0, 1, 0A0h, 18h, 0Ah, 28h, 19h, 40h, 99h, 48h, 28h
6114: 682880A988288851A0A0    db 68h, 28h, 80h, 0A9h, 88h, 28h, 88h, 51h, 0A0h, 0A0h
611E: A0C9A831        db 0A0h, 0C9h, 0A8h, 31h
                    
                    
                    
6122: 00102030385138FF98D858  MapStage4: db 0, 10h, 20h, 30h, 38h, 51h, 38h, 0FFh, 98h, 0D8h, 58h
612D: FF0210180078D90106303010    db 0FFh, 2, 10h, 18h, 0, 78h, 0D9h, 1, 6, 30h, 30h, 10h
6139: 5280787798104818E16178    db 52h, 80h, 78h, 77h, 98h, 10h, 48h, 18h, 0E1h, 61h, 78h
6144: 515380690368B018A980B9    db 51h, 53h, 80h, 69h, 3, 68h, 0B0h, 18h, 0A9h, 80h, 0B9h
614F: 09403840905078682818F1    db 9, 40h, 38h, 40h, 90h, 50h, 78h, 68h, 28h, 18h, 0F1h
615A: 582970B9901190E9010028    db 58h, 29h, 70h, 0B9h, 90h, 11h, 90h, 0E9h, 1, 0, 28h
6165: 2200102898304140D15050    db 22h, 0, 10h, 28h, 98h, 30h, 41h, 40h, 0D1h, 50h, 50h
6170: 6889784080D0A048A889    db 68h, 89h, 78h, 40h, 80h, 0D0h, 0A0h, 48h, 0A8h, 89h
617A: 401B40AB581B5862809BA0    db 40h, 1Bh, 40h, 0ABh, 58h, 1Bh, 58h, 62h, 80h, 9Bh, 0A0h
6185: 2AA0CB          db 2Ah, 0A0h, 0CBh
                    
                    
                    
6188: 0333FFFF60282848B04102  MapStage3: db 3, 33h, 0FFh, 0FFh, 60h, 28h, 28h, 48h, 0B0h, 41h, 2 ; ...
6193: 089000601002053418D84750    db 8, 90h, 0, 60h, 10h, 2, 5, 34h, 18h, 0D8h, 47h, 50h
619F: E078481086885875A818    db 0E0h, 78h, 48h, 10h, 86h, 88h, 58h, 75h, 0A8h, 18h
61A9: 0230B078A003100820105808    db 2, 30h, 0B0h, 78h, 0A0h, 3, 10h, 8, 20h, 10h, 58h, 8
61B5: 0001788007301930C9509050    db 0, 1, 78h, 80h, 7, 30h, 19h, 30h, 0C9h, 50h, 90h, 50h
61C1: C9685078C8A089    db 0C9h, 68h, 50h, 78h, 0C8h, 0A0h, 89h
                    
                    
                    
61C8: 02112232FFFF80587480A1  MapStage6: db 2, 11h, 22h, 32h, 0FFh, 0FFh, 80h, 58h, 74h, 80h, 0A1h
61D3: 540310C00278E00140390006    db 54h, 3, 10h, 0C0h, 2, 78h, 0E0h, 1, 40h, 39h, 0, 6
61DF: 3320D84840D856585870    db 33h, 20h, 0D8h, 48h, 40h, 0D8h, 56h, 58h, 58h, 70h
61E9: 68686428E175489102A808    db 68h, 68h, 64h, 28h, 0E1h, 75h, 48h, 91h, 2, 0A8h, 8
61F4: 68290A100838085808607878    db 68h, 29h, 0Ah, 10h, 8, 38h, 8, 58h, 8, 60h, 78h, 78h
6200: 309840583968C990E1A8    db 30h, 98h, 40h, 58h, 39h, 68h, 0C9h, 90h, 0E1h, 0A8h
620A: E10102587E02A01880A010    db 0E1h, 1, 2, 58h, 7Eh, 2, 0A0h, 18h, 80h, 0A0h, 10h
6215: 281938603871482860C168    db 28h, 19h, 38h, 60h, 38h, 71h, 48h, 28h, 60h, 0C1h, 68h
6220: 118811A0C9A858286A48    db 11h, 88h, 11h, 0A0h, 0C9h, 0A8h, 58h, 28h, 6Ah, 48h
622A: AB685268B3885AA03BA8    db 0ABh, 68h, 52h, 68h, 0B3h, 88h, 5Ah, 0A0h, 3Bh, 0A8h
6234: A2              db 0A2h
                    
                    
                    
6235: 00122231FFFFA0987898D1  MapStage8: db 0, 12h, 22h, 31h, 0FFh, 0FFh, 0A0h, 98h, 78h, 98h, 0D1h
6240: 910318B00498E00260710005    db 91h, 3, 18h, 0B0h, 4, 98h, 0E0h, 2, 60h, 71h, 0, 5
624C: 3058A04580705718187940    db 30h, 58h, 0A0h, 45h, 80h, 70h, 57h, 18h, 18h, 79h, 40h
6257: 11836859041070785848B1    db 11h, 83h, 68h, 59h, 4, 10h, 70h, 78h, 58h, 48h, 0B1h
6262: 884107402040E068282031    db 88h, 41h, 7, 40h, 20h, 40h, 0E0h, 68h, 28h, 20h, 31h
626D: 386938B190B1010258360348    db 38h, 69h, 38h, 0B1h, 90h, 0B1h, 1, 2, 58h, 36h, 3, 48h
6279: 5070A178210C3011503878    db 50h, 70h, 0A1h, 78h, 21h, 0Ch, 30h, 11h, 50h, 38h, 78h
6284: 40A048A8C128CA484B48    db 40h, 0A0h, 48h, 0A8h, 0C1h, 28h, 0CAh, 48h, 4Bh, 48h
628E: 9378E2A02AA093A86A    db 93h, 78h, 0E2h, 0A0h, 2Ah, 0A0h, 93h, 0A8h, 6Ah
                    
                    
                    
6297: 0332FFFFA038C4A098A4  MapStage11: db 3, 32h, 0FFh, 0FFh, 0A0h, 38h, 0C4h, 0A0h, 98h, 0A4h ; ...
62A1: 0220A002A07803055228E068    db 2, 20h, 0A0h, 2, 0A0h, 78h, 3, 5, 52h, 28h, 0E0h, 68h
62AD: 30588668584090E835A0    db 30h, 58h, 86h, 68h, 58h, 40h, 90h, 0E8h, 35h, 0A0h
62B7: 100168380438B858085898A8    db 10h, 1, 68h, 38h, 4, 38h, 0B8h, 58h, 8, 58h, 98h, 0A8h
62C3: E00202786202789A000A2888    db 0E0h, 2, 2, 78h, 62h, 2, 78h, 9Ah, 0, 0Ah, 28h, 88h
62CF: 3041481148996820687968    db 30h, 41h, 48h, 11h, 48h, 99h, 68h, 20h, 68h, 79h, 68h
62DA: B88879A860A8C0    db 0B8h, 88h, 79h, 0A8h, 60h, 0A8h, 0C0h
                    
                    
                    
62E1: 0330FFFF60486478D08402  MapStage7: db 3, 30h, 0FFh, 0FFh, 60h, 48h, 64h, 78h, 0D0h, 84h, 2 ; ...
62EC: 10A802281800053018D84530    db 10h, 0A8h, 2, 28h, 18h, 0, 5, 30h, 18h, 0D8h, 45h, 30h
62F8: 4869481052882071885802    db 48h, 69h, 48h, 10h, 52h, 88h, 20h, 71h, 88h, 58h, 2
6303: 107080E803100818F05830    db 10h, 70h, 80h, 0E8h, 3, 10h, 8, 18h, 0F0h, 58h, 30h
630E: 000008303140E06811686980    db 0, 0, 8, 30h, 31h, 40h, 0E0h, 68h, 11h, 68h, 69h, 80h
631A: 918868A0D8A831    db 91h, 88h, 68h, 0A0h, 0D8h, 0A8h, 31h
                    
                    
                    
6321: 013240B888FFA020A8FF  MapStage9: db 1, 32h, 40h, 0B8h, 88h, 0FFh, 0A0h, 20h, 0A8h, 0FFh
632B: 012090020461485042689857    db 1, 20h, 90h, 2, 4, 61h, 48h, 50h, 42h, 68h, 98h, 57h
6337: 801874885002301888880610    db 80h, 18h, 74h, 88h, 50h, 2, 30h, 18h, 88h, 88h, 6, 10h
6343: D848D05868587058A898    db 0D8h, 48h, 0D0h, 58h, 68h, 58h, 70h, 58h, 0A8h, 98h
634D: 78000007285828B8488968C0    db 78h, 0, 0, 7, 28h, 58h, 28h, 0B8h, 48h, 89h, 68h, 0C0h
6359: 88A0A859A8C0    db 88h, 0A0h, 0A8h, 59h, 0A8h, 0C0h
                    
                    
                    
635F: 02122031FFFFA070B898  MapStage10: db 2, 12h, 20h, 31h, 0FFh, 0FFh, 0A0h, 70h, 0B8h, 98h
6369: B19403789003184903989104    db 0B1h, 94h, 3, 78h, 90h, 3, 18h, 49h, 3, 98h, 91h, 4
6375: 0641408853681837686864    db 6, 41h, 40h, 88h, 53h, 68h, 18h, 37h, 68h, 68h, 64h
6380: 10E175401186587103A808    db 10h, 0E1h, 75h, 40h, 11h, 86h, 58h, 71h, 3, 0A8h, 8
638B: 48E9806906101030E85808    db 48h, 0E9h, 80h, 69h, 6, 10h, 10h, 30h, 0E8h, 58h, 8
                    
                    ; IF (VERSION2)
6396: 7828303138B10003A01838    db 78h, 28h, 30h, 31h, 38h, 0B1h, 0, 3, 0A0h, #18, 38h ; Muro trampa con coordenadas (#18, #a0) Al coger el cuchillo de abajo a la izquierda
                    ; ELSE
                    ;  db 78h, 28h, 30h, 31h, 38h, 0B1h, 0, 3, 0A0h, 21h, 38h ; Muro trampa mal puesto en (#120,#a0) Hay que hacer un par de agujeros bajo la escalera para que aparezca.
                    ; ENDIF
                    
63A1: 2140E10D384040C94820    db 21h, 40h, 0E1h, 0Dh, 38h, 40h, 40h, 0C9h, 48h, 20h
63AB: 8840A838A8C128CA404A    db 88h, 40h, 0A8h, 38h, 0A8h, 0C1h, 28h, 0CAh, 40h, 4Ah
63B5: 4893581B789BA02AA0E2    db 48h, 93h, 58h, 1Bh, 78h, 9Bh, 0A0h, 2Ah, 0A0h, 0E2h
                    
                    
                    
63BF: 013140B8E2FF781818FF  MapStage15: db 1, 31h, 40h, 0B8h, 0E2h, 0FFh, 78h, 18h, 18h, 0FFh
63C9: 022090007810030630301845    db 2, 20h, 90h, 0, 78h, 10h, 3, 6, 30h, 30h, 18h, 45h
63D5: 4060695868787860618048    db 40h, 60h, 69h, 58h, 68h, 78h, 78h, 60h, 61h, 80h, 48h
63E0: 3488700228C0A81006100810    db 34h, 88h, 70h, 2, 28h, 0C0h, 0A8h, 10h, 6, 10h, 8, 10h
63EC: F028404840507068D80000    db 0F0h, 28h, 40h, 48h, 40h, 50h, 70h, 68h, 0D8h, 0, 0
63F7: 08286828A9489848E078B9    db 8, 28h, 68h, 28h, 0A9h, 48h, 98h, 48h, 0E0h, 78h, 0B9h
6402: A0B8A830A851    db 0A0h, 0B8h, 0A8h, 30h, 0A8h, 51h
                    
                    
                    
6408: 03102131FFFF60A0B470  MapStage12: db 3, 10h, 21h, 31h, 0FFh, 0FFh, 60h, 0A0h, 0B4h, 70h
6412: E1D40318E0022850049889    db 0E1h, 0D4h, 3, 18h, 0E0h, 2, 28h, 50h, 4, 98h, 89h
641D: 000630409845481069882078    db 0, 6, 30h, 40h, 98h, 45h, 48h, 10h, 69h, 88h, 20h, 78h
6429: 18497168395480710368D0    db 18h, 49h, 71h, 68h, 39h, 54h, 80h, 71h, 3, 68h, 0D0h
6434: 883110A10810F120102048    db 88h, 31h, 10h, 0A1h, 8, 10h, 0F1h, 20h, 10h, 20h, 48h
643F: 6840A01838918859A0F1    db 68h, 40h, 0A0h, 18h, 38h, 91h, 88h, 59h, 0A0h, 0F1h
                    
                    ; IF (VERSION2)
6449: 020038AA02585E0198E90C30    db 2, 0, 38h, 0AAh, 2, 58h, 5Eh, 1, 98h, #e9, 0Ch, 30h ; Mueve el muro trampa 8 pixeles a la derecha (!?) Estaba mejor en el original
                    ; ELSE
                    ;  db 2, 0, 38h, 0AAh, 2, 58h, 5Eh, 1, 98h, 0E1h, 0Ch, 30h ; Muro trampa en (#1e0, #98) Aparece al coger el pico de abajo a la derecha
                    ; ENDIF
                    
6455: 2940D0681980C08871A0    db 29h, 40h, 0D0h, 68h, 19h, 80h, 0C0h, 88h, 71h, 0A0h
645F: C1A87028BB48AA78B3A0    db 0C1h, 0A8h, 70h, 28h, 0BBh, 48h, 0AAh, 78h, 0B3h, 0A0h
6469: 52A0BB          db 52h, 0A0h, 0BBh
                    
                    
                    
646C: 0233FFFF8018C870C8E4  MapStage13: db 2, 33h, 0FFh, 0FFh, 80h, 18h, 0C8h, 70h, 0C8h, 0E4h
6476: 0228D003806001053018D842    db 2, 28h, 0D0h, 3, 80h, 60h, 1, 5, 30h, 18h, 0D8h, 42h
6482: 2828575068685850746868    db 28h, 28h, 57h, 50h, 68h, 68h, 58h, 50h, 74h, 68h, 68h
648D: 01A84008100820083810580878    db 1, 0A8h, 40h, 8, 10h, 8, 20h, 8, 38h, 10h, 58h, 8, 78h
649A: 3088D09808985000000A2811    db 30h, 88h, 0D0h, 98h, 8, 98h, 50h, 0, 0, 0Ah, 28h, 11h
64A6: 30B0482850D1681978A0    db 30h, 0B0h, 48h, 28h, 50h, 0D1h, 68h, 19h, 78h, 0A0h
64B0: 8848A0A9A820A868    db 88h, 48h, 0A0h, 0A9h, 0A8h, 20h, 0A8h, 68h
                    
                    
                    
64B8: 01122133FF9871F138D8D8  MapStage14: db 1, 12h, 21h, 33h, 0FFh, 98h, 71h, 0F1h, 38h, 0D8h, 0D8h
64C3: FF02A0800320100206304850    db 0FFh, 2, 0A0h, 80h, 3, 20h, 10h, 2, 6, 30h, 48h, 50h
64CF: 4368506888808138494468    db 43h, 68h, 50h, 68h, 88h, 80h, 81h, 38h, 49h, 44h, 68h
64DA: 4957884902A84880890C10    db 49h, 57h, 88h, 49h, 2, 0A8h, 48h, 80h, 89h, 0Ch, 10h
64E5: 0810101018106828A03010    db 8, 10h, 10h, 10h, 18h, 10h, 68h, 28h, 0A0h, 30h, 10h
64F0: 5860404010B13031486968    db 58h, 60h, 40h, 40h, 10h, 0B1h, 30h, 31h, 48h, 69h, 68h
64FB: A9010080A2000B28683019A8    db 0A9h, 1, 0, 80h, 0A2h, 0, 0Bh, 28h, 68h, 30h, 19h, 0A8h
6507: 30A8C9306B30C3401350    db 30h, 0A8h, 0C9h, 30h, 6Bh, 30h, 0C3h, 40h, 13h, 50h
6511: CB78C2A02AA08B    db 0CBh, 78h, 0C2h, 0A0h, 2Ah, 0A0h, 8Bh
                    
                    ;----------------------------------------------------
                    ; Marca la piramide como pasada
                    ; HL = Piramides pasadas
                    ; DE = Mascara de la piramide actual
                    ;----------------------------------------------------
                    
6518 =              setPiramidClear:
6518: 4E              ld c, (hl)
6519: 23              inc hl
651A: 46              ld b, (hl)
651B: 78              ld a, b
651C: B2              or d
651D: 77              ld (hl), a
651E: 2B              dec hl
651F: 79              ld a, c
6520: B3              or e
6521: 77              ld (hl), a
6522: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Devuelve en DE el bit activo que corresponde a la piramide actual
                    ;----------------------------------------------------
                    
6523 =              calcBitMask:
6523: 110100          ld de, 1  ; Devuelve en DE el bit activo que corresponde a la piramide actual
6526: 3A54E0          ld a, (piramideActual)
6529: 47              ld b, a
                    
652A =              calcBitMask2:
652A: 05              dec b
652B: C8              ret z
652C: CB23            sla e
652E: CB12            rl d
6530: 18F8            jr calcBitMask2
                    
                    ;----------------------------------------------------
                    ; AI Gemas
                    ;----------------------------------------------------
                    
6532 =              AI_Gemas:
6532: AF              xor a  ; Empezamos por la primera
6533: 32F4E1          ld (ElemEnProceso), a ; Usado para saber la gema o puerta que se esta procesando
                    
6536 =              nextGema:
6536: AF              xor a
6537: CDB565          call getGemaDat ; Obtiene puntero a los datos de la gema en proceso
653A: 23              inc hl
653B: 7E              ld a, (hl)  ; Status
653C: CD4B40          call jumpIndex
653F: 4765            dw gemaDoNothing
6541: 4765            dw gemaDoNothing
6543: 4A65            dw gemaCogida ; 2 = Borra la gema de la pantalla y del mapa e incrementa el numero de gemas cogidas
6545: 4765            dw gemaDoNothing ; 3 = Inactiva
                    
6547 =              gemaDoNothing:
6547: C3A665          jp chkLastGema
                    
                    
                    ;----------------------------------------------------
                    ; Borra la gema y los brillos tanto de la pantalla como del mapa
                    ; Incrementa el numero de gemas cogidas
                    ; Indica a los cuchillos que tienen que actualizar el fondo sobre el que estan
                    ;----------------------------------------------------
                    
654A =              gemaCogida:
654A: AF              xor a
654B: CDB565          call getGemaDat ; Obtiene puntero a los datos de la gema en proceso
654E: 7E              ld a, (hl)
654F: E6F0            and 0F0h
6551: 77              ld (hl), a  ; Desactiva gema del mapa
                    
6552: 23              inc hl
6553: 34              inc (hl)  ; Pasa al siguiente estado
                    
6554: 23              inc hl
6555: 7E              ld a, (hl)  ; Y
6556: D608            sub 8
6558: 57              ld d, a  ; Coordenada Y del brillo de arriba de la gema
6559: 23              inc hl
655A: 23              inc hl
655B: 5E              ld e, (hl)  ; X
655C: CD285B          call coordVRAM_DE ; Obtiene direccion de la VRAM de esas coordenadas en la tabla de nombres
655F: AF              xor a  ; Tile vacio
6560: CD4D00          call WRTVRM  ; Borra el brillo superior
                    
6563: 011F00          ld bc, 1Fh  ; Distancia al brillo de la izquierda (tile de abajo a la izquierda)
6566: 09              add hl, bc
6567: 118A65          ld de, eraseData ; Tiles vacios
656A: 010301          ld bc, 103h ; Ancho de 3 tiles
656D: CDC865          call DEtoVRAM_NXNY ; Borra de la pantalla el brillo de la izquierda, la gema y el brillo de la derecha
                    
6570: 3E02            ld a, 2  ; Offset variable Y
6572: CDB565          call getGemaDat
6575: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
6578: 118A65          ld de, eraseData
657B: CDD765          call putBrillosMap ; Borra los brillos del mapa
                    
657E: 21F2E1          ld hl, gemasCogidas
6581: 34              inc (hl)  ; Incrementa el numero de gemas cogidas
                    
6582: CD5366          call knifeUpdateBack ; Fuerza a los cuchillos a actualizar el tile de fondo sobre el que estan
                         ; Podia estar sobre el brillo de la gema y ahiora que se ha quitado hay que actualizarlo
6585: C3A665          jp chkLastGema
                    
                    ;----------------------------------------------------
                    ; Valores iniciales del cuchillo al lanzarse
                    ; Velocidad decimal, velocidad X...
                    ;----------------------------------------------------
6588: 00            knifeDataInicio:db 0
6589: 02              db 2  ; Velocidad del cuchillo
                    
658A: 000000        eraseData: db 0, 0, 0
658D: 000000          db 0, 0, 0
6590: 000000          db 0, 0, 0
                    
                    
                    ;----------------------------------------------------
                    ; Patrones usados para dibujar como se hace un agujero con el pico
                    ; Para calcular el indice se suma a esta lista el valor del contador de animacion
                    ; Este contador se decrementa de 3 en 3 y empieza en #15
                    ; El primer valor que se usa es #12 (tile = #43)
                    ; La animacion es #43, #44, 0, #43, #44, 0, 0
                    ;----------------------------------------------------
6593: 00            tilesAnimCavar: db 0
6594: 000000          db 0, 0, 0
6597: 000044          db 0, 0, 44h
659A: 000043          db 0, 0, 43h
659D: 000000          db 0, 0, 0
65A0: 000044          db 0, 0, 44h
65A3: 000043          db 0, 0, 43h
                    
                    ;----------------------------------------------------
                    ; Comprueba si ha procesado todas las gemas
                    ;----------------------------------------------------
                    ; IF (VERSION2)
                     
65A6 =              chkLastGema:
65A6: CDAD65          call chkLastGema2 ; Se han procesado todas las gemas?
65A9: C8              ret z  ; Si
65AA: C33665          jp nextGema ; No, sigue con otra
65AD =              chkLastGema2:  
65AD: 21F4E1          ld hl, ElemEnProceso ; Usado para saber la gema o puerta que se esta procesando
65B0: 34              inc (hl)  ; Siguiente gema
65B1: 7E              ld a, (hl)
65B2: 2B              dec hl
65B3: BE              cp (hl)  ; Ha procesado todas?
65B4: C9              ret
                    ; ELSE
                    ; 
                    ;chkLastGema:
                    ;  ld hl, ElemEnProceso ; Usado para saber la gema o puerta que se esta procesando
                    ;  inc (hl)  ; Siguiente gema
                    ;  ld a, (hl)
                    ;  dec hl
                    ;  cp (hl)  ; Ha procesado todas?
                    ;  ret z  ; Si, termina
                    ;  jp nextGema ; No, procesa la siguiente
                    ; ENDIF
                     
                    ;----------------------------------------------------
                    ; Devuelve en HL el puntero a los datos de la gema y en A la variable indicada
                    ; In:
                    ;   A = Offset a la variable de la estructura
                    ; Out:
                    ;  HL = Puntero a la variable indicada de la gema en proceso
                    ;   A = Valor de la variable
                    ;----------------------------------------------------
                    
                    
65B5 =              getGemaDat:
65B5: 21F5E1          ld hl, datosGemas ; 0 = Color/activa. Nibble alto indica el color. El bajo si esta activa (1) o no (0)
                         ; 1 = Status
                         ; 2 = Y
                         ; 3 = decimales X
                         ; 4 = X
                         ; 5 = habitacion
                         ; 6-8 = 0, 0, 0
65B8: CD1040          call ADD_A_HL
65BB: 3AF4E1          ld a, (ElemEnProceso) ; Usado para saber la gema o puerta que se esta procesando
                    
65BE =              getIndexX9:
65BE: 47              ld b, a
                    
65BF =              getIndexX8_masB:
65BF: 87              add a, a
                    
65C0 =              getIndexX4_masB:
65C0: 87              add a, a
65C1: 87              add a, a
65C2: 80              add a, b
65C3: CD1040          call ADD_A_HL
65C6: 7E              ld a, (hl)
65C7: C9              ret
                    ;----------------------------------------------------
                    ;
                    ; Envia a la VRAM los datos apuntados por DE.
                    ; B = Alto
                    ; C = Ancho
                    ;
                    ;----------------------------------------------------
                    
65C8 =              DEtoVRAM_NXNY:
65C8: C5              push bc
65C9: 0600            ld b, 0
65CB: CDC044          call DEtoVRAMset
65CE: 3E20            ld a, 20h  ; Siguiente fila (incrementa coordenada Y)
65D0: CD1040          call ADD_A_HL
65D3: C1              pop bc
65D4: 10F2            djnz DEtoVRAM_NXNY
65D6: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Pone en el mapa los destellos de una gema
                    ; HL = Puntero a la posicion de la gema en el mapa
                    ; DE = Puntero a patrones para brillos
                    ;----------------------------------------------------
                    
                    
65D7 =              putBrillosMap:
65D7: 01A0FF          ld bc, 0-60h ; Tama? de una fila del mapa (3 pantallas de 32 tiles)
65DA: 09              add hl, bc  ; Fila superior
65DB: EB              ex de, hl
65DC: EDA0            ldi   ; Pone brillo superior de la gema
65DE: 015E00          ld bc, 5Eh  ; Distancia al brillo de la izquierda
65E1: EB              ex de, hl
65E2: 09              add hl, bc
65E3: EB              ex de, hl
65E4: 0E03            ld c, 3
65E6: EDB0            ldir   ; Copia brillo de la izquierda, espacio, brillo de la derecha
65E8: EB              ex de, hl
65E9: C9              ret
                    
                    ;----------------------------------------------------------------
                    ;
                    ; Logica de las puertas de entrada y salida de la piramide
                    ;
                    ; La puerta por la que se entra en la piramide tiene status 1 (#10)
                    ; Las puertas por las que se sale tienen status 0 si no se ha pasado previamente la piramide
                    ; Si ya se habian cogido las gemas, las puertas tienen status 8 (#80)
                    ; Comprueba si se han cogido todas las gemas
                    ; Anima las puertas al entrar y salir de la piramide
                    ; Comprueba si se toca la palanca que abre la salida al terminar una fase
                    ; Si la piramide ya se ha visitado, no oculta la salida
                    ;
                    ;----------------------------------------------------------------
                    
65EA =              AI_Salidas:
65EA: AF              xor a
65EB: 32F4E1          ld (ElemEnProceso), a ; Usado para saber la gema o puerta que se esta procesando
65EE: 32C2E1          ld (puertaCerrada), a ; Vale 1 al cerrarse la salida
                    
65F1 =              chkNextExit:
65F1: 216767          ld hl, chkLastExit ; Comprueba si ya ha comprobado las cuatro salidas
65F4: E5              push hl  ; Mete esta funcion en la pila para que se ejecute al salir
                    
65F5: AF              xor a
65F6: CD5B67          call getExitDat ; Obtiene un puntero a la salida que se esta procesando
65F9: 3C              inc a  ; Es #ff su estatus?
65FA: C8              ret z  ; No existe esa salida
                    
65FB: 23              inc hl
65FC: 23              inc hl
65FD: 23              inc hl
65FE: 23              inc hl
65FF: 7E              ld a, (hl)  ; Status de la puerta
6600: 1F              rra
6601: 1F              rra
6602: 1F              rra
6603: 1F              rra
6604: E60F            and 0Fh  ; El nibble alto indica el status. El bajo se usa como contador de animacion o substatus
6606: CD4B40          call jumpIndex
                    
                    
6609: 1B66            dw chkAllGemas ; 0 = Comprueba si se han cogido todas las gemas
660B: 3766            dw paintEntrada ; 1 = Dibuja la puerta de entrada a la piramide
660D: 6A66            dw chkOpenExit ; 2 = Comprueba si toca la palanca que abre la puerta
660F: 9466            dw openCloseExit ; 3 = Abriendo salida
6611: E066            dw chkSalePiram ; 4 = Puerta abierta. Espera a que salga de la piramide
6613: 9466            dw openCloseExit ; 5 = Cerrando salida
6615: 3666            dw doNothing3 ; 6 = No hace nada. Mantiene la puerta esperando a la cortinilla
6617: 4567            dw finAnimEntrar ; 7 = Quita o deja la puerta dependiendo de si ya ha estado en la piramide
6619: 4266            dw paintCerrada ; 8 = La puerta permanece visible y cerrada
                    
                    ;----------------------------------------------------------------
                    ;
                    ; Comprueba si se han cogido todas las gemas de la fase
                    ;
                    ; Esta comprobacion la hace cada puerta existente (normalmente la de entrada y la de salida)
                    ; Con lo que ambas puertas pasan a estado 1 al pasarse la fase.
                    ;
                    ; Cuando se cogen todas:
                    ; - se marca la fase como terminada
                    ; - suena la musica de "stage clear"
                    ; - quita las puertas giratorias
                    ; - pasa la puerta al status 1 (#10)
                    ;----------------------------------------------------------------
                    
661B =              chkAllGemas:
661B: 21F2E1          ld hl, gemasCogidas ; Comprueba si ha cogido todas la gemas
661E: 7E              ld a, (hl)  ; Gemas recogidas
661F: 23              inc hl
6620: BE              cp (hl)  ; Numero de gemas que hay en esta piramide
6621: C0              ret nz  ; No las ha cogido todas
                    
6622: 3E01            ld a, 1
6624: 3233E1          ld (flagStageClear), a
                    
6627: 3E94            ld a, 94h
6629: CDA97A          call setMusic ; Musica de "stage clear"
                    
662C: CD316A          call quitaGiratorias ; Quita las puerta giratorias
662F: 3E04            ld a, 4  ; Offset al byte de status de la puerta
6631: CD5B67          call getExitDat ; Obtiene un puntero a la salida que se esta procesando
6634: 3610            ld (hl), 10h ; Status = #10
                    
6636 =              doNothing3:
6636: C9              ret
                    
                    
                    ;----------------------------------------------------------------
                    ;
                    ; Dibuja la puerta abierta si se esta entrando en la piramide
                    ; o cerrada si acaba de aparecer tras coger las gemas
                    ; Pasa la puerta al status 2 (#20) que comprueba si el prota toca la palanca que abre la puerta
                    ;----------------------------------------------------------------
                    
6637 =              paintEntrada:
6637: 3A00E0          ld a, (GameStatus)
663A: FE04            cp 4  ; Esta entrando en la piramide?
663C: F5              push af
663D: 3E02            ld a, 2  ; Frame salida abierta
663F: 2803            jr z, paintEntrada2
6641: F1              pop af
                    
6642 =              paintCerrada:
6642: F5              push af
6643: AF              xor a  ; Frame salida cerrada
                    
6644 =              paintEntrada2:
6644: CDC767          call getAnimExit ; Devuelve en DE un puntero a los tiles que forman la salida
6647: 3E04            ld a, 4  ; Offset al estado de la puerta
6649: CD5B67          call getExitDat ; Obtiene un puntero a la salida que se esta procesando
664C: 3620            ld (hl), 20h ; Cambia el estado a #20
664E: CD7267          call drawPuerta ; En DE se pasa el puntero a los tiles que forman la salida
6651: F1              pop af
6652: C8              ret z  ; Esta entrando en la piramide (animacion bajar escaleras)
                    
                    ;----------------------------------------------------
                    ; Fuerza a los cuchillos para que guarden el fondo sobre el que estan
                    ; Asi se evita que se corrompa el fondo mientras se abre o cierra una puerta
                    ; o cuando se coge una gema
                    ;----------------------------------------------------
                    
6653 =              knifeUpdateBack:
6653: 2162E2          ld hl, knifeEnProceso ; Indica a los cuchillos que hay en el suelo que guarden el tile de fondo sobre el que estan
6656: 3600            ld (hl), 0
6658: 23              inc hl
6659: 46              ld b, (hl)  ; Numero de cuchillos de la fase
                    
665A =              status0Knife2:
665A: AF              xor a  ; Offset status cuchillo
665B: CD175B          call getKnifeData
665E: 7E              ld a, (hl)  ; Status
665F: 3D              dec a  ; Es igual a 1 (en reposo)
6660: 2001            jr nz, status0Knife3
6662: 77              ld (hl), a  ; Lo pasa a 0
                    
6663 =              status0Knife3:
6663: 2162E2          ld hl, knifeEnProceso
6666: 34              inc (hl)  ; Siguiente cuchillo
6667: 10F1            djnz status0Knife2
6669: C9              ret
                    
                    ;----------------------------------------------------------------
                    ; Comprueba si toca la palanca que abre la salida
                    ; El prota tiene que estar saltando y tocando la palanca con la parte superior de su cuerpo (mano?)
                    ; Al abrir la puerta esta pasa al estado 3 (#30) = Abriendo la puerta
                    ;----------------------------------------------------------------
                    
666A =              chkOpenExit:
666A: 3A34E1          ld a, (protaStatus) ; Estado del prota
666D: FE01            cp 1  ; Esta saltando?
666F: C0              ret nz  ;  No
                    
6670: CDBF67          call chkSameScreenS ; Comprueba si la salida esta en la pantalla del prota
6673: C0              ret nz  ; No
                    
6674: 7A              ld a, d  ; Y
6675: D608            sub 8  ; Y - 8
6677: 57              ld d, a
6678: 7B              ld a, e  ; X
6679: D610            sub 10h  ; X - 16
667B: 5F              ld e, a
667C: E5              push hl
667D: 21D067          ld hl, palancaArea
6680: CDFD5C          call chkTocaProta ; Comrpeuba si el prota toca la palanca
6683: E1              pop hl
6684: D0              ret nc  ; No toca la palanca que abre la puerta
                    
6685: 3E01            ld a, 1
6687: 3233E1          ld (flagStageClear), a
                    
668A: 3E14            ld a, 14h
668C: 3203E0          ld (timer), a
668F: 23              inc hl
6690: 3630            ld (hl), 30h ; Estado de abriendo la puerta
6692: 1806            jr openCloseExit2
                    
                    
                    ;----------------------------------------------------------------
                    ;
                    ; Abre o cierra la puerta de la piramide
                    ;
                    ; Al terminar de abrirse tras accionar la palanca:
                    ; - pasa al estado 4 = Espera a que el prota salga de la piramide
                    ;
                    ; Al terminar de cerrarse:
                    ; - cuando se entra en la piramide pasa al estado 7 (#70) = puede dejar la puerta cerrada si ya se han cogido las gemas o quitarla si aun no esta pasada la fase
                    ; - cuando se sale pasa al estado 6 (#60) = espera a la cortinilla negra
                    ;----------------------------------------------------------------
                    
6694 =              openCloseExit:
6694: 3A03E0          ld a, (timer)
6697: E61F            and 1Fh
6699: C0              ret nz  ; Procesa uno de cada 32 frames. Espera 0.5s aprox.
                    
669A =              openCloseExit2:
669A: CD5366          call knifeUpdateBack ; Indica a los cuchillos que hay en el suelo que guarden el tile de fondo sobre el que estan
669D: 3E04            ld a, 4  ; Offset al status de la puerta
669F: CD5B67          call getExitDat ; Obtiene un puntero a la salida que se esta procesando
66A2: 34              inc (hl)  ; Incrementa el substatus de la puerta
                    
66A3: 7E              ld a, (hl)  ; Contador de animacion
66A4: E60F            and 0Fh
66A6: FE04            cp 4  ; Ha terminado la animacion de abrir o cerrar?
66A8: 2014            jr nz, openCloseExit5 ; Aun no
                    
66AA: 3A00E0          ld a, (GameStatus)
66AD: FE04            cp 4  ; Esta entrando en la piramide?
66AF: 2004            jr nz, openCloseExit3 ; No, esta saliendo.
                    
66B1: 3670            ld (hl), 70h ; Estado puerta: Ha terminado de cerrarse. Mira si hay que dejarla o quitarla
66B3: 1804            jr openCloseExit4
                    
66B5 =              openCloseExit3:
66B5: 7E              ld a, (hl)  ; Status puerta
66B6: C610            add a, 10h  ; Pasa al siguiente estado
66B8: 77              ld (hl), a  ; Si se esta abriendo para salir, tras accionar la palanca, pasa al estado 4
                         ; Si se ha cerrado tras salir, pasa al estado 6, que deja la puerta cerrada esperando a la cortinilla
                    
66B9 =              openCloseExit4:
66B9: 21C2E1          ld hl, puertaCerrada ; Vale 1 al cerrarse la salida
66BC: 34              inc (hl)
66BD: C9              ret
                    
66BE =              openCloseExit5:
66BE: 7E              ld a, (hl)  ; Status
66BF: E6F0            and 0F0h
66C1: FE50            cp 50h  ; Esta cerrando la puerta?
66C3: 7E              ld a, (hl)
66C4: 2006            jr nz, abreSalida ; No, se esta abriendo
                    
66C6: E60F            and 0Fh  ; Se queda con el contador de la animacion
66C8: D604            sub 4
66CA: ED44            neg   ; Los subestados van de 0 a 3 al cerrar
                    
66CC =              abreSalida:
66CC: E60F            and 0Fh
66CE: 3D              dec a
66CF: FE01            cp 1
66D1: 2007            jr nz, pintaSalida
                    
66D3: F5              push af
66D4: 3E8D            ld a, 8Dh  ; SFX abriendo/cerrando puerta
66D6: CDA97A          call setMusic ; Musica que suena al abrirse o cerrarse la puerta (si esta entrando no se oye porque tiene preferencia la que ya esta sonando)
66D9: F1              pop af
                    
66DA =              pintaSalida:
66DA: CDC767          call getAnimExit ; Devuelve en DE un puntero a los tiles que forman la salida
66DD: C37267          jp drawPuerta
                    
                    
                    ;----------------------------------------------------------------
                    ;
                    ; Puerta abierta y lista para que el prota salga de la piramide
                    ; Espera a que toque las escaleras para salir
                    ; Dependiendo por la puerta por la que se sale, se toma una direccion (norte, sur, este u oeste)
                    ; La puerta/direccion por la que se entra en la piramide es la opuesta a la que se ha salido en la anterior
                    ; (Ej: Si se sale por la puerta norte de una piramide, se entra por la sur de la siguiente)
                    ; Pone 4 sprites en parejas solapadas (16x32) para dibujar la parte derecha de la puerta y que el prota pase por detras
                    ;----------------------------------------------------------------
                    
66E0 =              chkSalePiram:
66E0: CDBF67          call chkSameScreenS ; Comprueba si la salida esta en la pantalla del prota
66E3: C0              ret nz  ; La puerta no esta en la misma habitacion que el prota
                    ; DE = YX
                    
66E4: 21D467          ld hl, salidaArea
66E7: CDFD5C          call chkTocaProta
66EA: D0              ret nc  ; No ha entrado en la salida
                    
66EB: CD6443          call quitaMomias ; Oculta las momias
                    
66EE: D9              exx
66EF: 3E04            ld a, 4  ; Offset status puerta
66F1: CD5B67          call getExitDat ; Obtiene un puntero a la salida que se esta procesando
66F4: 3650            ld (hl), 50h ; Cambia el status a 5 (#50) = Cerrando puerta
                    
66F6: 23              inc hl
66F7: 010200          ld bc, 2
66FA: 1155E0          ld de, piramideDest
66FD: EDB0            ldir   ; Copia la piramide de destino y la puerta por la que se entra (flecha del mapa)
66FF: D9              exx
                    
6700: 3AF4E1          ld a, (ElemEnProceso) ; Usado para saber la gema o puerta que se esta procesando
6703: 3C              inc a
6704: FE01            cp 1  ; Arriba?
6706: 2808            jr z, setFlechaSalida
                    
6708: 3D              dec a
6709: 87              add a, a
670A: FE06            cp 6
670C: 2002            jr nz, setFlechaSalida
670E: 3E08            ld a, 8
                    
6710 =              setFlechaSalida:
6710: 3257E0          ld (puertaSalida), a ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha
                    
                    
                    ; Pone los sprites de la parte derecha de la puerta que tapan al prota al entrar por las escaleras
                    
6713: 21B0E0          ld hl, sprAttrib ; Tabla de atributos de los sprites en RAM (Y, X, Spr, Col)
6716: 3E10            ld a, 10h
6718: 83              add a, e  ; X + 16
6719: 5F              ld e, a
671A: 7A              ld a, d
671B: D611            sub 11h
671D: 57              ld d, a  ; Y - 17
                    
671E: 0602            ld b, 2  ; 16x32 Dos sprites consecutivos en Y
                    
6720 =              setSprPuerta:
6720: 0E02            ld c, 2  ; 2 sprites solapados
                    
6722 =              setSprPuerta2:
6722: 72              ld (hl), d  ; Y del sprite
6723: 23              inc hl
6724: 73              ld (hl), e  ; X del sprite
6725: 23              inc hl
6726: 23              inc hl
6727: 23              inc hl  ; Puntero a los atributos del siguiente sprite
6728: 0D              dec c
6729: 20F7            jr nz, setSprPuerta2 ; Segundo sprite solapado
                    
672B: 7A              ld a, d
672C: C610            add a, 10h
672E: 57              ld d, a  ; Y = Y + 16
672F: 10EF            djnz setSprPuerta
                    
6731: 3E20            ld a, 20h
6733: CDA97A          call setMusic ; Silencio
                    
6736: AF              xor a
6737: 3230E1          ld (statusEntrada), a ; Status de la entrada a 0 = Saliendo en la piramide
673A: 3C              inc a
673B: 3232E1          ld (flagEntraSale), a ; 1 = Entrando o saliendo de la piramide. Ejecuta una logica especial para este caso
673E: 3C              inc a
673F: 3236E1          ld (sentidoProta), a ; Sentido a la derecha
6742: E1              pop hl
6743: E1              pop hl
6744: C9              ret
                    
                    ;----------------------------------------------------
                    ;
                    ; Al entrar en una piramide nueva, quita la puerta
                    ; Si ya ha estado la deja para poder salir
                    ;
                    ;----------------------------------------------------
                    
6745 =              finAnimEntrar:
6745: CD516D          call chkPiramPasada ; Comprueba si la piramide en la que entra ya ha estado
6748: F5              push af
6749: 3E04            ld a, 4  ; Offset status
674B: CD5B67          call getExitDat ; Obtiene un puntero a la salida que se esta procesando
674E: F1              pop af
674F: 3600            ld (hl), 0  ; Estado que oculta la puerta y comprueba si se cogen todas las gemas
6751: 2803            jr z, borraSalida
                    
6753: 3620            ld (hl), 20h ; Estado que deja la puerta visible y espera a que el prota toque la palanca para abrirla
6755: C9              ret
                    
6756 =              borraSalida:
6756: 118A65          ld de, eraseData
6759: 1817            jr drawPuerta
                    
                    ;----------------------------------------------------
                    ; Obtiene un puntero a la estructura de la salida que se esta procesando
                    ;----------------------------------------------------
                    
675B =              getExitDat:
675B: 21C5E1          ld hl, pyramidDoors ; Obtiene un puntero a la salida que se esta procesando
675E: CD1040          call ADD_A_HL
6761: 3AF4E1          ld a, (ElemEnProceso) ; Usado para saber la gema o puerta que se esta procesando
6764: C3256A          jp getHL_Ax7 ; Devuelve HL + A*7 y A=(HL)
                    
6767 =              chkLastExit:
6767: 21F4E1          ld hl, ElemEnProceso ; Comprueba si ya ha comprobado las cuatro salidas
676A: 34              inc (hl)
676B: 3E04            ld a, 4
676D: BE              cp (hl)
676E: C2F165          jp nz, chkNextExit
6771: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Dibuja una puerta de salida/entrada
                    ; In:
                    ;  DE = Tiles que forman la puerta
                    ;----------------------------------------------------
                    
6772 =              drawPuerta:
6772: AF              xor a
6773: CD5B67          call getExitDat ; Obtiene un puntero a la salida que se esta procesando
6776: 01F8F0          ld bc, 0F0F8h ; Offset X-16, Y-8
6779: D5              push de
677A: CDE150          call getMapOffset ; Obtiene en HL la direccion del mapa que corresponde a las coordenadas
677D: D1              pop de
677E: EB              ex de, hl
677F: E5              push hl
                    
6780: 0603            ld b, 3  ; Alto en patrones de la puerta
                    
6782 =              drawPuerta2:
6782: C5              push bc
6783: 010500          ld bc, 5  ; Ancho en patrones de la puerta
6786: EDB0            ldir
                    
6788: 3E5B            ld a, 5Bh  ; Desplazamiento a la fila inferior de la puerta en el mapa RAM
678A: CD1540          call ADD_A_DE
678D: C1              pop bc
678E: 10F2            djnz drawPuerta2
                    
6790: AF              xor a
6791: CD5B67          call getExitDat ; Obtiene un puntero a la salida que se esta procesando
6794: 2B              dec hl
6795: CD035C          call getLocationDE2 ; Esta en la misma pantalla que el prota? (se ve?)
6798: E1              pop hl
6799: C0              ret nz  ; No hace falta pintarla
                    
679A: E5              push hl
679B: CD285B          call coordVRAM_DE ; Calcula puntero a la tabla de nombres de las coordenadas en DE
679E: D1              pop de
679F: 01DEFF          ld bc, 0-22h
67A2: 09              add hl, bc
                    
67A3: 0603            ld b, 3  ; Patrones alto
                    
67A5 =              drawPuerta3:
67A5: 0E05            ld c, 5  ; Patrones ancho
                    
67A7 =              drawPuerta4:
67A7: C5              push bc
67A8: 1A              ld a, (de)  ; Tile de la puerta
67A9: CD755D          call getTileFromID ; Obtiene patron que le corresponde
67AC: CD4D00          call WRTVRM  ; Lo dibuja en pantalla
67AF: 23              inc hl
67B0: 13              inc de
67B1: C1              pop bc
67B2: 0D              dec c
67B3: 0D              dec c
67B4: 0C              inc c
67B5: 20F0            jr nz, drawPuerta4
                    
67B7: 3E1B            ld a, 1Bh  ; Distancia en VRAM a la fila inferior de la puerta (#20 - 5)
67B9: CD1040          call ADD_A_HL
67BC: 10E7            djnz drawPuerta3
67BE: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba si la salida esta en la habitacion actual
                    ; y obtiene sus coordenadas.
                    ; Out:
                    ;  D = Y
                    ;  E = X
                    ;----------------------------------------------------
                    
67BF =              chkSameScreenS:
67BF: AF              xor a  ; Comprueba si la salida esta en la pantalla del prota
67C0: CD5B67          call getExitDat ; Obtiene un puntero a la salida que se esta procesando
67C3: 2B              dec hl
67C4: C3035C          jp getLocationDE2
                    
                    
                    
                    ;----------------------------------------------------
                    ; Devuelve en DE un puntero a los patrones que forman
                    ; el framde la puerta indicado en A
                    ;----------------------------------------------------
                    
67C7 =              getAnimExit:
67C7: 87              add a, a  ; Devuelve en DE un puntero a los tiles que forman la salida
67C8: 21D867          ld hl, idxAnimExit
67CB: CD496D          call getIndexHL_A
67CE: EB              ex de, hl
67CF: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Offset X coordenada palanca, ancho del prota a comprobar
                    ; Offset Y palanca, alto del prota a comprobar
                    ;
                    ; Solo comprueba la parte de arriba del prota. Asi parece que le da con la mano al saltar
                    ;----------------------------------------------------
67D0: 0810          palancaArea: db 8, 10h
67D2: 0305            db 3, 5
                    
                    ;----------------------------------------------------
                    ; Punto que se comprueba para saber si se ha salido de la piramide
                    ;----------------------------------------------------
67D4: 0102          salidaArea: db 1, 2
67D6: 0406            db 4, 6
                    
67D8: DE67          idxAnimExit: dw animExitClosed ; ...
67DA: ED67            dw animExitClosing
67DC: FC67            dw animExitOpen
                    
67DE: 7700606100    animExitClosed: db 77h, 0, 60h, 61h, 0
67E3: 7900626300      db 79h, 0, 62h, 63h, 0
67E8: 0000646500      db 0, 0, 64h, 65h, 0
                    
67ED: 786B6C6D6E    animExitClosing:db 78h, 6Bh, 6Ch, 6Dh, 6Eh
67F2: 796F707172      db 79h, 6Fh, 70h, 71h, 72h
67F7: 0073747576      db 0, 73h, 74h, 75h, 76h
                    
67FC: 7860666761    animExitOpen: db 78h, 60h, 66h, 67h, 61h
6801: 7962006863      db 79h, 62h, 0, 68h, 63h
6806: 0064696A65      db 0, 64h, 69h, 6Ah, 65h
                    
                    
                    ;----------------------------------------------------
                    ; Logica de los muros trampa
                    ; Cuando la trampa no se ha activado se comprueba si el prota pasa por la posicion de esta para activarla
                    ; Una vez activada, se busca un techo desde el que comienza a cerrarse el muro.
                    ; El muro baja de 4 en 4 pixeles por lo que pinta ladrillos completos o solo la parte de arriba dependiendo de su posicion
                    ; Si choca contra un objeto, se detiene hasta que puede continuar
                    ; Si choca contra un muro, se da por terminada la trampa
                    ;----------------------------------------------------
                    
680B =              MurosTrampa:
680B: 21FDE3          ld hl, muroTrampProces
680E: 3600            ld (hl), 0  ; Empieza por el primero :P
6810: 23              inc hl
6811: 7E              ld a, (hl)  ; Numero de muros trampa de la piramide
6812: B7              or a
6813: C8              ret z  ; No hay ninguno
                    
6814 =              chkNextTrampa:
6814: 21E168          ld hl, chkLastMuro
6817: E5              push hl  ; Guarda en la pila la rutina que comprueba si ya se han procesado todos los muros trampa
                    
6818: AF              xor a
6819: CDD468          call getMuroDat
681C: A7              and a  ; Esta activado este muro trampa?
681D: CA8F68          jp z, chkActivaTrampa ; No comprueba si el prota lo activa
                    
6820: 3D              dec a
6821: C0              ret nz  ; Este muro ya se ha cerrado por completo
                    
6822: 3A03E0          ld a, (timer)
6825: E61F            and 1Fh
6827: C0              ret nz  ; El muro se mueve cada #20 iteraciones
                    
6828: 23              inc hl
6829: 7E              ld a, (hl)  ; Y muro
682A: C604            add a, 4  ; Se mueve 4 pixeles hacia abajo
682C: 77              ld (hl), a  ; Actualiza Y del muro
682D: E607            and 7  ; Su Y es multiplo de 8? (pinta medio ladrillo o uno entero?)
682F: 0E19            ld c, 19h  ; Map ID ladrillo completo
6831: 2001            jr nz, murosTrampa2
                    
6833: 0C              inc c  ; Map ID ladrillo simple (4 pixeles alto)
                    
6834 =              murosTrampa2:
6834: E5              push hl
6835: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
6838: EB              ex de, hl
6839: E1              pop hl
683A: 7E              ld a, (hl)  ; Y del muro
683B: E607            and 7  ; Ha bajado un tile completo o medio?
683D: 2004            jr nz, murosTrampa3 ; Medio
                    
683F: 1A              ld a, (de)  ; Tile del mapa
6840: A7              and a  ; Esta vacio?
6841: 2024            jr nz, trampaChoca ; No, comprueba con lo que choca
                    
6843 =              murosTrampa3:
6843: CD8268          call drawTrampa
6846: 2134E1          ld hl, protaStatus ; Datos del prota
6849: 7E              ld a, (hl)  ; Status prota
684A: B7              or a  ; Esta realizando alguna accion especial?
684B: C0              ret nz  ; Si
                    
684C: 2137E1          ld hl, ProtaY
684F: 010005          ld bc, 500h ; Offset X+5, Y+0
6852: CDEC68          call chkAplastaMuro ; Comprueba si el muro aplasta al prota
6855: 3806            jr c, trampaMataProta ; Si, lo aplasta
                    
6857: 060B            ld b, 0Bh  ; Offset X+11, Y+0
6859: CDEC68          call chkAplastaMuro ; Comprueba si aplasta al prota
685C: D0              ret nc  ; No
                    
685D =              trampaMataProta:
685D: 3E1D            ld a, 1Dh  ; Musica muere prota
685F: CDA97A          call setMusic
6862: AF              xor a
6863: 3253E0          ld (flagVivo), a ; Mata al prota
6866: C9              ret
                    
                    ;----------------------------------------------------
                    ; Comprueba si el muro choca contra una plataforma o contra un objeto
                    ; Si choca contra un objeto se detiene hasta que este desaparece
                    ; Si choca contra una plataforma, se da por terminada la trampa
                    ;----------------------------------------------------
                    
6867 =              trampaChoca:
6867: 1A              ld a, (de)  ; Tile del mapa
                    
                    ; IF (VERSION2)
6868: FE01            cp 1
686A: 280B            jr z,trampaLimite
                    ; ENDIF
                    
686C: E6F0            and 0F0h  ; Se queda con la familia/grupo
686E: FE10            cp 10h  ; Es una plataforma o muro?
6870: 2805            jr z, trampaLimite ; Si
                    
                    ; IF (!VERSION2)
                    ;  inc hl  ; (!?) Si incrementa HL pasa a los decimales de X. Deberia quedarse en la Y,
                    ; ENDIF
                    
6872: 7E              ld a, (hl)  ; Y muro
6873: D604            sub 4  ; Decrementa 4 su Y, con lo que detiene su avance (deja de bajar)
6875: 77              ld (hl), a  ; Actualiza la Y
6876: C9              ret
                    
                    ;----------------------------------------------------
                    ; Si el muro choca contra el limite inferior de la pantalla pinta el tile de ladrillo "limite inferior"
                    ; Si choa contra una plataforma o muro, pinta el tile de ladrillo normal
                    ;----------------------------------------------------
                    
6877 =              trampaLimite:
6877: 2B              dec hl  ; Apunta al status del muro
6878: 34              inc (hl)  ; Pasa al siguiente status = Muro cerrado por completo
6879: 23              inc hl  ; Apunta a la Y
687A: 1A              ld a, (de)  ; Map ID con el que ha chocado
687B: FE14            cp 14h  ; Limite inferior de la pantalla?
687D: 0E13            ld c, 13h  ; Tile de ladrillo normal
687F: 2001            jr nz, drawTrampa_
                    
6881: 0C              inc c  ; Tile de limite inferior de la pantalla
                    
6882 =              drawTrampa_:
                    ; IF (!VERSION2)
                    ;  call drawTrampa ; (!?) Para que pone un CALL y luego un RET?
                    ;  ret
                    ; ENDIF
6882 =              drawTrampa:
6882: 79              ld a, c
6883: 12              ld (de), a  ; Modifica el tile del mapa
6884: E5              push hl  ; Apunta a la Y
6885: CD755D          call getTileFromID ; Obtiene el patron que le corresponde a ese tile del mapa
6888: 2B              dec hl
6889: 2B              dec hl  ; Apunta a la Y menos 2 bytes, necesario para que "drawTile" recoja las coordenadas
688A: CD115C          call drawTile ; Dibuja el patron en pantalla
688D: E1              pop hl
688E: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba si el prota activa un muro trampa
                    ; Cuando el prota pasa por la posicion de la trampa esta se activa
                    ; En ese momento se hace una busqueda vertical desde esa posicion
                    ; hasta que se encuentra un muro o el limite superior de la pantalla
                    ; Ese punto es el que se toma como inicio del muro que se cierra
                    ;----------------------------------------------------
                    
688F =              chkActivaTrampa:
688F: 23              inc hl
6890: 54              ld d, h
6891: 5D              ld e, l
6892: 23              inc hl
6893: 23              inc hl
6894: 4E              ld c, (hl)  ; X trampa
6895: 23              inc hl
6896: 46              ld b, (hl)  ; Habitacion trampa
6897: 2A39E1          ld hl, (ProtaX)
689A: A7              and a
689B: ED42            sbc hl, bc
689D: C0              ret nz  ; El prota no esta en la misma X que la trampa
                    
689E: 1A              ld a, (de)  ; Y trampa
689F: 2137E1          ld hl, ProtaY
68A2: BE              cp (hl)
68A3: C0              ret nz  ; No estan en la misma Y
                    
68A4: 62              ld h, d
68A5: 6B              ld l, e
68A6: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
68A9: 0600            ld b, 0
                    
68AB =              trampaTecho:
68AB: E5              push hl  ; Puntero a la posicion en el mapa de la trampa
68AC: D5              push de  ; Puntero a la Y de la trampa
68AD: A7              and a
68AE: 1160E7          ld de, MapaRAM
68B1: ED52            sbc hl, de  ; Se sale del mapa por arriba?
68B3: D1              pop de
68B4: 380F            jr c, trampaOrigen ; Si, tomamos esta posicion como inicio del muro trampa
                    
68B6: E1              pop hl
68B7: 7E              ld a, (hl)  ; Tile del mapa en el que esta la trampa
68B8: A7              and a  ; Esta vacio?
68B9: 200D            jr nz, trampaOrigen2 ; No
                    
68BB: 04              inc b
68BC: 7D              ld a, l
68BD: D660            sub 60h  ; distancia a la fila superior del mapa
68BF: 6F              ld l, a
68C0: 3001            jr nc, trampaTecho2 ; No hay acarreo en la resta
                    
68C2: 25              dec h  ; Resta el acarreo a HL
                    
68C3 =              trampaTecho2:
68C3: 18E6            jr trampaTecho ; Sigue buscando donde poner el origen del muro que se cierra
                    
68C5 =              trampaOrigen:
68C5: E1              pop hl
68C6: 3612            ld (hl), 12h ; Map ID ladrillo/muro
                    
68C8 =              trampaOrigen2:
68C8: 78              ld a, b
68C9: 87              add a, a
68CA: 87              add a, a
68CB: 87              add a, a  ; Numero de tiles de distancia hasta el techo * 8
                    ; IF (!VERSION2)
                    ;  sub 4
                    ; ENDIF
68CC: 47              ld b, a
68CD: EB              ex de, hl
                    
68CE: 7E              ld a, (hl)  ; Y de la trampa
68CF: 90              sub b  ; Le resta la distacia en pixeles al techo u origen de la trampa
68D0: 77              ld (hl), a
68D1: 2B              dec hl  ; Apunta al status de la trampa
68D2: 34              inc (hl)  ; La trampa pasa al estado 1 = Bajando muro
                    
                    ; IF (!VERSION2)
                    ;  xor a
                    ;  ld (timer), a ;(!?) Para que sirve?
                    ; ENDIF
68D3: C9              ret
                    
                    ;----------------------------------------------------
                    ; Obtiene un puntero a los datos del muro trampa en proceso
                    ;----------------------------------------------------
                    
68D4 =              getMuroDat:
68D4: 21FFE3          ld hl, muroTrampaDat ; Y, decimales X, X, habitacion
68D7: CD1040          call ADD_A_HL
68DA: 3AFDE3          ld a, (muroTrampProces)
68DD: 47              ld b, a
68DE: C3C065          jp getIndexX4_masB
                    
68E1 =              chkLastMuro:
68E1: 21FDE3          ld hl, muroTrampProces
68E4: 34              inc (hl)  ; Siguiente muro
68E5: 7E              ld a, (hl)  ; Muro actual
68E6: 23              inc hl
68E7: BE              cp (hl)  ; Numero de muro totales
68E8: C21468          jp nz, chkNextTrampa
68EB: C9              ret
                    
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba si el prota es aplastado por un muro trampa
                    ; In:
                    ;   BC = Offset XY a la cabeza del prota
                    ; Out:
                    ;   Carry = Es aplastado
                    ;----------------------------------------------------
                    
68EC =              chkAplastaMuro:
68EC: C5              push bc
68ED: CDB750          call chkTocaMuro ; Z = choca
68F0: 1A              ld a, (de)  ; Tile del mapa
68F1: D619            sub 19h  ; #19 = Ladrillo completo muro trampa, #1A = Ladrillo simple muro trampa
68F3: FE02            cp 2  ; Es uno de esos dos tiles del muro trampa?
68F5: C1              pop bc
68F6: C9              ret
                    
                    
                    
                    ;----------------------------------------------------
                    ; Dibuja la animacion de como se rompen los ladrillos al picar
                    ; y borra del mapa RAM los rotos. Comprueba si lo que va a picar es una platarforma.
                    ; Para llevar el control de la animacion se usa "agujeroCnt"
                    ; Esta variable tiene un valor inicial y se decrementa en 3 a cada
                    ; golpe del pico. Sus valores son #12, #0F, #0C, #09, #06, #03
                    ; y los tiles de la animacion son #44 (semiroto), #43 (roto), #00 (vacio), #44, #43, #00
                    ;----------------------------------------------------
                    
68F7 =              drawAgujero:
68F7: 2148E1          ld hl, agujeroCnt ; Al comenzar a pica vale #15
68FA: 7E              ld a, (hl)
68FB: A7              and a
68FC: C8              ret z  ; Ha terminado de hacer el agujero
                    
68FD: 7E              ld a, (hl)
68FE: FE12            cp 12h  ; Es el primer golpe de pico?
6900: 23              inc hl
6901: 2803            jr z, drawAgujero2 ; Si, no hace falta incrementar la Y del agujero
                    
6903: 34              inc (hl)
6904: 34              inc (hl)
6905: 34              inc (hl)  ; Incrementa la Y del agujero en 3
                    
6906 =              drawAgujero2:
6906: 47              ld b, a
6907: E5              push hl
6908: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
690B: EB              ex de, hl
690C: E1              pop hl
690D: 78              ld a, b
690E: FE09            cp 9
6910: 2012            jr nz, drawAgujero3
                    
6912: 1A              ld a, (de)  ; Lee tile del mapa que se va a picar
6913: CD9444          call AL_C__AH_B ; Copia el nibble alto de A en B y el bajo en C
6916: 78              ld a, b  ; se queda con el nibble alto, que es la familia de tiles o tipo
6917: FE01            cp 1  ; es una plataforma?
6919: 202B            jr nz, endAgujero ; No, finaliza el agujero. Esto no se puede picar
                    
691B: 79              ld a, c
691C: FE04            cp 4  ; Es plataforma o vacio? (Map IDs #10-#13 = #00 (tile vacio), #00, #40 (tile ladrillo), #40)
691E: 3804            jr c, drawAgujero3
                    
6920: FE09            cp 9  ; Map ID #19 = Tile #40
6922: 2022            jr nz, endAgujero
                    
                    ; Comprueba si hay que borrar el ladrillo picado del mapa de la RAM
                    
6924 =              drawAgujero3:
6924: 2B              dec hl
6925: 7E              ld a, (hl)  ; agujeroCnt
6926: 23              inc hl
6927: FE0C            cp 0Ch  ; Valor de la animacion en el momento de romper totalmente el ladrillo de arriba
6929: 2804            jr z, drawAgujero4 ; Quita el ladrillo del mapa
                    
692B: FE03            cp 3  ; Valor de la animacion en el momento de romper totalmente el ladrillo de abajo
692D: 2003            jr nz, drawAgujero5
                    
692F =              drawAgujero4:
                    ; IF (VERSION2)
692F: 3E01            ld a,1
                    ; ELSE
                    ;  xor a
                    ; ENDIF
6931: 12              ld (de), a  ; Borra tile del mapa RAM
                    
6932 =              drawAgujero5:
6932: 3A48E1          ld a, (agujeroCnt) ; Al comenzar a pica vale #15
6935: 119365          ld de, tilesAnimCavar ; Tiles usados en la animacion del agujero
6938: CD1540          call ADD_A_DE ; Calcula indice
693B: 1A              ld a, (de)  ; Tile de la animacion (ladrillo semiroto, roto o vacio)
693C: 2B              dec hl
693D: 2B              dec hl  ; Apunta a la Y del agujero
693E: CD115C          call drawTile ; Dibuja en pantalla el tile de la animacion del agujero
6941: 3E45            ld a, 45h  ; SFX Pico
6943: C3A97A          jp setMusic
                    
6946 =              endAgujero:
6946: AF              xor a
6947: 3248E1          ld (agujeroCnt), a ; Al comenzar a picar vale #15
694A: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Puertas giratorias
                    ; Si estan en movimiento la anima (5 frames)
                    ; Dependiendo del sentido de giro hara la animacion hacia un lado o el otro
                    ;----------------------------------------------------
                    
694B =              spiningDoors:
694B: 211EE3          ld hl, doorGiraData ; 0 = Status (bit 0 = Girando, bits 2-1 = altura + 2)
                         ; 1 = Y
                         ; 2 = X decimal
                         ; 3 = X
                         ; 4 = Habitacion
                         ; 5 = Sentido giro
                         ; 6 = Contador giro
694E: 3A1DE3          ld a, (numDoorGira)
6951: 47              ld b, a
6952: B7              or a
6953: C8              ret z  ; No hay puertas giratorias en esta piramide
                    
6954 =              spiningDoors2:
6954: CB46            bit 0, (hl)  ; Esta girando esta puerta?
6956: 2007            jr nz, spiningDoors3 ; Si
                    
6958: 110700          ld de, 7  ; Tama? de la estructura de cada puerta giratoria
695B: 19              add hl, de  ; Puntero a la siguiente puerta
695C: 10F6            djnz spiningDoors2
695E: C9              ret
                    
695F =              spiningDoors3:
695F: 3A03E0          ld a, (timer)
6962: E607            and 7
6964: C0              ret nz  ; La puerta solo se mueve cada 8 frames
                    
6965: E5              push hl
6966: DDE1            pop ix
6968: DD7E06          ld a, (ix+SPINDOOR_TIMER) ; Counter
696B: DD3406          inc (ix+SPINDOOR_TIMER) ; Incrementa contador
696E: FE05            cp 5  ; Ha girado completamente?
6970: 2831            jr z, spiningDoorEnd ; Si, desactiva giro en puerta
                    
6972: 87              add a, a
6973: 87              add a, a
6974: 87              add a, a  ; x8 (patrones de la tabla que ocupa cada frame de giro de la puerta)
6975: 47              ld b, a
6976: DD7E05          ld a, (ix+SPINDOOR_SENT) ; Sentido del giro
6979: FE08            cp 8  ; Gira a la derecha o a la izquierda?
697B: 78              ld a, b
697C: 2803            jr z, spiningDoor4
                    
697E: 3E20            ld a, 20h  ; Invierte la animacion para el giro a la izquierda
6980: 90              sub b
                    
6981 =              spiningDoor4:
6981: 117B6A          ld de, tilesGiroDoor
6984: CD1540          call ADD_A_DE
                    
6987: 0E02            ld c, 2  ; Altura por defecto y ancho fijo
6989: DD7E00          ld a, (ix+SPINDOOR_STATUS)
698C: CB3F            srl a  ; Se queda con la altura
698E: 81              add a, c  ; Altura base + altura extra
698F: 47              ld b, a  ; B = Altura puerta
6990: DD6603          ld h, (ix+SPINDOOR_X) ; X
6993: DD6E01          ld l, (ix+SPINDOOR_Y) ; Y
                    
6996: 3A3AE1          ld a, (ProtaRoom) ; Parte alta de la coordenada X. Indica la habitacion de la piramide
6999: DDBE04          cp (ix+SPINDOOR_ROOM) ; Esta la puerta en la misma habitacion que el prota?
699C: C0              ret nz  ; No
                    
699D: CD716A          call coordVRAM_HL ; Obtiene direccion VRAM de la tabla de nombres a donde apunta HL
69A0: C3C865          jp DEtoVRAM_NXNY ; Dibuja puerta en la pantalla
                    
69A3 =              spiningDoorEnd:
69A3: DDCB0086        res 0, (ix+SPINDOOR_STATUS) ; Quita flag de girando
69A7: 3E0C            ld a, 1100b
69A9: DDAE05          xor (ix+SPINDOOR_SENT) ; Invierte sentido de la puerta
69AC: DD7705          ld (ix+SPINDOOR_SENT), a ; Actualiza sentido de la puerta
                    
                    ;----------------------------------------------------
                    ; Pone un apuerta giratoria en el mapa
                    ;----------------------------------------------------
                    
69AF =              putGiratMap:
69AF: DDE5            push ix  ; Pone puerta giratoria en el mapa
69B1: E1              pop hl
69B2: 23              inc hl
69B3: E5              push hl
69B4: D1              pop de
69B5: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
69B8: 1B              dec de
69B9: 1A              ld a, (de)  ; Los bits 2-1 indican la altura extra
69BA: 1F              rra
69BB: E603            and 3
69BD: C602            add a, 2  ; Le a?de la altura minima de la puerta (2)
69BF: 47              ld b, a  ; Altura de la puerta
69C0: 3E05            ld a, 5
69C2: CD1540          call ADD_A_DE
69C5: 1A              ld a, (de)  ; Sentido de giro
69C6: CB57            bit 2, a
69C8: 3E50            ld a, 50h  ; Map ID puerta izquierda
69CA: 2802            jr z, putGiratMap2
69CC: 3C              inc a
69CD: 3C              inc a  ; Map ID puerta derecha
                    
69CE =              putGiratMap2:
69CE: 4F              ld c, a
                    
69CF =              putGiratMap3:
69CF: 71              ld (hl), c  ; Parte izquierda de la puerta giratoria
69D0: 23              inc hl
69D1: 0C              inc c
69D2: 71              ld (hl), c  ; Parte derecha
69D3: 3E5F            ld a, 5Fh  ; Offset a la fila inferior del mapa
69D5: CD1040          call ADD_A_HL
69D8: 0D              dec c
69D9: 10F4            djnz putGiratMap3 ; Repite tantas veces como alta sea la puerta
69DB: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba cual es la puerta que esta empujando el prota
                    ;----------------------------------------------------
                    
69DC =              chkGiratorias:
69DC: AF              xor a
69DD: 321CE3          ld (GiratEnProceso), a
                    
69E0 =              chkGiratorias2:
69E0: AF              xor a
69E1: CD1C6A          call getGiratorData
69E4: E5              push hl
69E5: 23              inc hl  ; Apunta a la Y
69E6: 87              add a, a
69E7: 87              add a, a
69E8: E618            and 11000b
69EA: 86              add a, (hl)  ; Y puerta
69EB: 57              ld d, a
                    
69EC: 3A36E1          ld a, (sentidoProta) ; 1 = Izquierda, 2 = Derecha
69EF: 1F              rra
69F0: 3E08            ld a, 8  ; 8 pixeles a la derecha
69F2: 3802            jr c, chkGiratorias3 ; A la izquierda
69F4: ED44            neg   ; 8 pixeles a la izquierda
                    
69F6 =              chkGiratorias3:
69F6: 23              inc hl
69F7: 23              inc hl
69F8: 86              add a, (hl)  ; X puerta
69F9: 5F              ld e, a
                    
69FA: 2137E1          ld hl, ProtaY
69FD: 7E              ld a, (hl)  ; Y prota
69FE: 23              inc hl
69FF: 23              inc hl
6A00: 6E              ld l, (hl)  ; X Prota
6A01: 67              ld h, a
6A02: A7              and a
6A03: ED52            sbc hl, de  ; Resta las coordenadas del prota y las de la puerta
6A05: E1              pop hl  ; Recupera status puerta
6A06: 200A            jr nz, chkLastGirat
                    
6A08: CBC6            set 0, (hl)  ; Activa el bit 0 del estado de la puerta
6A0A: 3E06            ld a, 6
6A0C: CD1040          call ADD_A_HL
6A0F: 3600            ld (hl), 0
6A11: C9              ret
                    
6A12 =              chkLastGirat:
6A12: 211CE3          ld hl, GiratEnProceso
6A15: 34              inc (hl)
6A16: 7E              ld a, (hl)
6A17: 23              inc hl
6A18: BE              cp (hl)
6A19: 20C5            jr nz, chkGiratorias2
6A1B: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Obtiene en HL el puntero a los datos de la puerta giratoria en proceso
                    ; Out:
                    ;   A = Estado
                    ;----------------------------------------------------
                    
                    
6A1C =              getGiratorData:
6A1C: 211EE3          ld hl, doorGiraData ; 0 = Status (bit 0 = Girando, bits 2-1 = altura + 2)
                         ; 1 = Y
                         ; 2 = X decimal
                         ; 3 = X
                         ; 4 = Habitacion
                         ; 5 = Sentido giro
                         ; 6 = Contador giro
6A1F: CD1040          call ADD_A_HL
6A22: 3A1CE3          ld a, (GiratEnProceso)
                    
6A25 =              getHL_Ax7:
6A25: 47              ld b, a  ; Devuelve HL + A*7 y A=(HL)
6A26: CB20            sla b
6A28: 80              add a, b
6A29: CB20            sla b
6A2B: 80              add a, b
6A2C: CD1040          call ADD_A_HL
6A2F: 7E              ld a, (hl)
6A30: C9              ret
                    
                    ;----------------------------------------------------
                    ;
                    ; Quita las puertas giratorias del mapa
                    ; Si estan en la misma habitacion que el prota las borra de la pantalla
                    ;
                    ;----------------------------------------------------
                    
6A31 =              quitaGiratorias:
6A31: AF              xor a
6A32: 211DE3          ld hl, numDoorGira
6A35: BE              cp (hl)
6A36: C8              ret z  ; No hay puertas giratorias
                    
6A37: 321CE3          ld (GiratEnProceso), a ; Empieza por la primera
6A3A: 23              inc hl
                    
6A3B =              quitaGiratoria2:
6A3B: E5              push hl
6A3C: 7E              ld a, (hl)  ; Tama? de la puerta giratoria
6A3D: 1F              rra
6A3E: E603            and 3
6A40: C602            add a, 2
6A42: 47              ld b, a  ; Altura en patrones
6A43: C5              push bc
6A44: 23              inc hl
6A45: E5              push hl
6A46: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
6A49: 0E00            ld c, 0
6A4B: CDCF69          call putGiratMap3
6A4E: E1              pop hl
6A4F: CD045C          call getLocationDE3 ; Comprueba si la puerta esta en la misma pantalla que el prota
6A52: C1              pop bc
6A53: 0E02            ld c, 2
6A55: 2009            jr nz, quitaGiratoria3 ; No lo esta
6A57: CD285B          call coordVRAM_DE ; D = Y, E = X
6A5A: 118A65          ld de, eraseData
6A5D: CDC865          call DEtoVRAM_NXNY ; Borra la puerta de la pantalla
                    
6A60 =              quitaGiratoria3:
6A60: E1              pop hl
6A61: 110700          ld de, 7
6A64: 19              add hl, de
6A65: D9              exx
6A66: 211CE3          ld hl, GiratEnProceso
6A69: 34              inc (hl)  ; Incrementa el contador de puerta giratoria en proceso
6A6A: 7E              ld a, (hl)
6A6B: 23              inc hl
6A6C: BE              cp (hl)  ; Ha comprobado todas las puertas giratorias?
6A6D: D9              exx
6A6E: 20CB            jr nz, quitaGiratoria2
6A70: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Calcula la direccion de la tabla de nombres a la que apunta HL
                    ; In:
                    ;   H = X
                    ;   L = Y
                    ; Out:
                    ;  HL = Direccion VRAM de la tabla de nombres
                    ;----------------------------------------------------
                    
6A71 =              coordVRAM_HL:
6A71: D5              push de
6A72: EB              ex de, hl
6A73: 7A              ld a, d
6A74: 53              ld d, e
6A75: 5F              ld e, a
6A76: CD285B          call coordVRAM_DE ; D = Y, E = X
6A79: D1              pop de
6A7A: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Patrones usados para pintar una puerta giratoria en movimiento
                    ; Tiene 5 posiciones posibles y una altura maxima de 32 pixeles (4 patrones)
                    ; El ancho es de 16 pixeles (2 patrones)
                    ;----------------------------------------------------
6A7B: 6869686968696869  tilesGiroDoor: db 68h, 69h, 68h, 69h, 68h, 69h, 68h, 69h
6A83: 6A6B6A6B6A6B6A6B    db 6Ah, 6Bh, 6Ah, 6Bh, 6Ah, 6Bh, 6Ah, 6Bh ; Azul/Blanco girado ->
6A8B: 5455545554555455    db 54h, 55h, 54h, 55h, 54h, 55h, 54h, 55h ; Muro azul
6A93: 7A797A797A797A79    db 7Ah, 79h, 7Ah, 79h, 7Ah, 79h, 7Ah, 79h ; Blanco/azul girado <-
6A9B: 7877787778777877    db 78h, 77h, 78h, 77h, 78h, 77h, 78h, 77h ; Blanco/azul
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Descomprime la piramide actual y sus elementos:
                    ; Plataformas, salidas, momias, gemas, cuchillos,
                    ; picos, puertas giratorias, muros trampa y escaleras
                    ;
                    ;----------------------------------------------------
                    
6AA3 =              setupStage:
6AA3: AF              xor a
6AA4: 325EE0          ld (flagMuerte), a
6AA7: 325BE0          ld (UNKNOWN), a ; (!?) Se usa?
6AAA: CD9A6D          call BorraMapaRAM
6AAD: 3C              inc a
6AAE: 3253E0          ld (flagVivo), a
6AB1: CD5643          call hideSprAttrib ; Limpia los atributos de los sprites (los oculta)
                    
6AB4: 2155E0          ld hl, piramideDest
6AB7: 7E              ld a, (hl)
6AB8: 2B              dec hl
6AB9: 77              ld (hl), a  ; Piramide actual igual a la de destino
6ABA: CDA86D          call ChgStoneColor ; Cada 4 fases cambia el color de las piedras
                    
6ABD: 21706D          ld hl, indexPiramides ; Indice de las piramides
6AC0: 3A54E0          ld a, (piramideActual)
6AC3: 3D              dec a
6AC4: 87              add a, a
6AC5: CD496D          call getIndexHL_A ; Obtiene el puntero al mapa de la piramide actual
6AC8: EB              ex de, hl
6AC9: 0604            ld b, 4
6ACB: DD2100E7        ld ix, MapaRAMRoot ; La primera fila del mapa no se usa (ocupada por el marcador). Tambien usado como inicio de la pila
                    
6ACF =              unpackMap:
6ACF: 1A              ld a, (de)
6AD0: C5              push bc
6AD1: D5              push de
6AD2: 218E6D          ld hl, indexHalfMap
6AD5: 4F              ld c, a
6AD6: 1F              rra
6AD7: 1F              rra
6AD8: 1F              rra
6AD9: E61E            and 1Eh
6ADB: CD496D          call getIndexHL_A
6ADE: 79              ld a, c
6ADF: E60F            and 0Fh
6AE1: E5              push hl
6AE2: 2600            ld h, 0
6AE4: 6F              ld l, a
6AE5: 29              add hl, hl
6AE6: 29              add hl, hl  ; x4
6AE7: 54              ld d, h
6AE8: 5D              ld e, l
6AE9: 29              add hl, hl
6AEA: 29              add hl, hl  ; x16
6AEB: 44              ld b, h
6AEC: 4D              ld c, l
6AED: 29              add hl, hl  ; x32
6AEE: 09              add hl, bc  ; x48
6AEF: 44              ld b, h
6AF0: 4D              ld c, l
6AF1: E1              pop hl
6AF2: 09              add hl, bc
6AF3: A7              and a
6AF4: ED52            sbc hl, de  ; x44
6AF6: DDE5            push ix
6AF8: D1              pop de
6AF9: D9              exx
                    ;
                    ; Descomprime un cacho de mapa
                    ; 22 filas x 16 columnas (media pantalla)
                    ; Cada bit indica si hay ladrillo o esta vacio
                    ;
6AFA: 0616            ld b, 16h  ; Numero de filas por pantalla (22)
                    
6AFC =              unpackMap2:
6AFC: D9              exx
6AFD: 0602            ld b, 2  ; Dos bytes
                    
6AFF =              unpackMap3:
6AFF: C5              push bc
6B00: 0608            ld b, 8  ; Ocho bits
6B02: 4E              ld c, (hl)
                    
6B03 =              unpackMap4:
6B03: CB11            rl c  ; Rota el byte para mirar si el bit esta a 0 o a 1
6B05: 3E00            ld a, 0  ; Tile vacio
6B07: 3002            jr nc, unpackMap5
6B09: 3E12            ld a, 12h  ; Tile ladrillo
                    
6B0B =              unpackMap5:
6B0B: 12              ld (de), a  ; Pone el tile en el buffer del mapa
6B0C: 13              inc de
6B0D: 10F4            djnz unpackMap4
                    
6B0F: 23              inc hl  ; Siguiente byte (8 tiles)
6B10: C1              pop bc
6B11: 10EC            djnz unpackMap3
                    
6B13: 3E50            ld a, 50h  ; Distancia a la siguiente fila. Hay tres pantallas en horizontal
6B15: CD1540          call ADD_A_DE
6B18: D9              exx
6B19: 10E1            djnz unpackMap2
                    
6B1B: D9              exx
6B1C: 011000          ld bc, 10h  ; Distancia a la segunda mitad de la pantalla
6B1F: DD09            add ix, bc
6B21: D1              pop de
6B22: C1              pop bc
6B23: 1A              ld a, (de)
6B24: 13              inc de
6B25: E6F0            and 0F0h
6B27: FE30            cp 30h
6B29: 2802            jr z, getDoors
6B2B: 10A2            djnz unpackMap
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba las puertas de salida de la piramide
                    ; Si la Y (primer byte) es #FF la salida no existe
                    ; La puerta por la que se entra a la piramide la pone a status #10 (1)
                    ; Si ya se han cogido las gemas de esta piramide mantiene las puertas visibles y cerradas (status #80)
                    ; Si no se han cogido, deja la puerta en status 0 (comprobando si se cogen todas las gemas)
                    ;----------------------------------------------------
                    
6B2D =              getDoors:
6B2D: 21C4E1          ld hl, numPuertas
6B30: 3604            ld (hl), 4  ; Maximo numero de puertas que puede haber
6B32: 23              inc hl
6B33: EB              ex de, hl
6B34: D9              exx
6B35: 0600            ld b, 0  ; Contador de salidas
                    
6B37 =              getNextDoor:
6B37: D9              exx
6B38: 7E              ld a, (hl)  ; Y de la puerta
6B39: 3C              inc a  ; Es #FF (Existe esta salida?)
6B3A: 200A            jr nz, getDoors3 ; Si, existe
                    
6B3C: 3D              dec a
6B3D: 12              ld (de), a  ; Marca salida como no disponible
6B3E: 23              inc hl
6B3F: 3E07            ld a, 7  ; Tama? de la estructura de cada salida
6B41: CD1540          call ADD_A_DE ; DE apunta al buffer de la siguiente salida
6B44: 182C            jr chkLastDoor ; Comprueba si ya se han procesado todas las puertas
                    
6B46 =              getDoors3:
6B46: CD616D          call transfCoords ; Transfiere coordenadas desde HL a DE (Y, X)
                    
6B49: 3A56E0          ld a, (puertaEntrada)
6B4C: CB3F            srl a
6B4E: FE04            cp 4
6B50: 2001            jr nz, getDoors4
6B52: 3D              dec a
                    
6B53 =              getDoors4:
6B53: D9              exx
6B54: B8              cp b  ; Esta puerta es por la que se entra en la piramide?
6B55: D9              exx
6B56: 3E10            ld a, 10h  ; Status: Dibuja la puerta de entrada
6B58: 280B            jr z, getDoors6
                    
6B5A: D5              push de
6B5B: CD516D          call chkPiramPasada ; Comprueba si la piramide ya ha sido pasada para dejar o quitar la puerta de salida
6B5E: 3E00            ld a, 0  ; Quita la puerta y deja el estado que comprueba si se cogen todas las gemas
6B60: 2802            jr z, getDoors5
6B62: 3E80            ld a, 80h  ; Mantiene la puerta cerrada visible
                    
6B64 =              getDoors5:
6B64: D1              pop de
                    
6B65 =              getDoors6:
6B65: 12              ld (de), a  ; Status de la puerta
6B66: 13              inc de
6B67: 7E              ld a, (hl)
6B68: CD9444          call AL_C__AH_B ; Copia el nibble alto de A en B y el bajo en C
6B6B: 78              ld a, b
6B6C: 12              ld (de), a  ; Piramide a la que lleva esta puerta
6B6D: 13              inc de
6B6E: 79              ld a, c
6B6F: 12              ld (de), a  ; Direccion de la flecha del mapa / puerta de entrada / direccion de la salida
6B70: 13              inc de
6B71: 23              inc hl
                    
6B72 =              chkLastDoor:
6B72: D9              exx
6B73: 04              inc b
6B74: 3E04            ld a, 4  ; Numero maximo de salidas
6B76: B8              cp b
6B77: 20BE            jr nz, getNextDoor ; Aun quedan puertas por comprobar
                    
                    
                    
                    ;----------------------------------------------------
                    ;Actualiza momias de la piramide
                    ;----------------------------------------------------
6B79: D9              exx
6B7A: 7E              ld a, (hl)
6B7B: 3264E1          ld (numMomias), a
6B7E: 23              inc hl
6B7F: 47              ld b, a
6B80: 87              add a, a
6B81: 80              add a, b  ; 3 bytes por momia (y, x, tipo)
6B82: 0600            ld b, 0
6B84: 4F              ld c, a
6B85: 114EE1          ld de, momiasPiramid ; Datos de las momias que hay en la piramide actual: y, x (%xxxxx--p), tipo
6B88: EDB0            ldir
                    
                    
                    ;----------------------------------------------------
                    ; Actualiza gemas
                    ;----------------------------------------------------
6B8A: 11F3E1          ld de, gemasTotales
6B8D: 7E              ld a, (hl)  ; Numero de gemas de la piramide
6B8E: EDA0            ldi
6B90: 13              inc de
6B91: 47              ld b, a  ; Numero de gemas
                    
6B92 =              readGemas:
6B92: C5              push bc
6B93: 7E              ld a, (hl)  ; Color
6B94: E6F0            and 0F0h
6B96: F601            or 1  ; Activa gema
6B98: 12              ld (de), a  ; Tipo / color de la gema
                    
6B99: 23              inc hl
6B9A: 13              inc de
6B9B: 3E01            ld a, 1
6B9D: 12              ld (de), a  ; Status 1
                    
6B9E: 13              inc de
6B9F: CD616D          call transfCoords ; Transfiere coordenadas desde HL a DE (Y, X)
6BA2: 13              inc de
6BA3: 13              inc de
6BA4: 13              inc de  ; 9 bytes por gema
6BA5: C1              pop bc
6BA6: 10EA            djnz readGemas
                    
                    
6BA8: E5              push hl
6BA9: AF              xor a
6BAA: 32F4E1          ld (ElemEnProceso), a ; Empezamos a pintar las gemas desde la primera
                    
6BAD =              putNextGema:
6BAD: AF              xor a
6BAE: CDB565          call getGemaDat ; Puntero a la gema en proceso
6BB1: CD516D          call chkPiramPasada ; Hay que poner las gemas de esta piramide o ya se han cogido antes?
6BB4: 2809            jr z, putNextGema2 ; Hay que ponerlas
                    
6BB6: 7E              ld a, (hl)
6BB7: E6F0            and 0F0h
6BB9: 77              ld (hl), a  ; Desactiva gema
6BBA: 23              inc hl
6BBB: 3603            ld (hl), 3  ; Status 3 de la gema
6BBD: 1818            jr chkLastGema_
                    
6BBF =              putNextGema2:
6BBF: 23              inc hl
6BC0: 23              inc hl
6BC1: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
6BC4: E5              push hl
6BC5: 11966D          ld de, brillosGema ; Patrones que forman los destellos de la gema
6BC8: CDD765          call putBrillosMap ; Pone los destellos de la gema en el mapa
                    
6BCB: AF              xor a
6BCC: CDB565          call getGemaDat
6BCF: CD9444          call AL_C__AH_B ; Copia el nibble alto de A en B y el bajo en C
6BD2: 78              ld a, b  ; Color de la gema
6BD3: C640            add a, 40h  ; Map ID gemas
6BD5: E1              pop hl
6BD6: 77              ld (hl), a  ; Pone gema
                    
6BD7 =              chkLastGema_:
6BD7: 21F4E1          ld hl, ElemEnProceso ; Usado para saber la gema o puerta que se esta procesando
6BDA: 34              inc (hl)  ; siguiente gema
6BDB: 7E              ld a, (hl)
6BDC: 2B              dec hl
6BDD: BE              cp (hl)  ; Numero total de gemas
6BDE: 20CD            jr nz, putNextGema ; Faltan gemas por procesar
6BE0: E1              pop hl
                    
                    
                    
                    ;----------------------------------------------------
                    ; Actualiza cuchillos
                    ;----------------------------------------------------
6BE1: 1163E2          ld de, numKnifes
6BE4: 7E              ld a, (hl)  ; Numero de cuchillos
6BE5: 12              ld (de), a  ; Actualiza el numero de cuchillos de la piramide
6BE6: 23              inc hl
6BE7: 13              inc de
6BE8: B7              or a
6BE9: 280F            jr z, getPicos ; No hay ninguno
                    
6BEB: 47              ld b, a
                    
6BEC =              setKnifeCoords:
6BEC: C5              push bc
6BED: 13              inc de
6BEE: 13              inc de
6BEF: CD616D          call transfCoords ; Transfiere coordenadas desde HL a DE (Y, X)
6BF2: 3E0B            ld a, 0Bh
6BF4: CD1540          call ADD_A_DE
6BF7: C1              pop bc
6BF8: 10F2            djnz setKnifeCoords
                    
                    ;----------------------------------------------------
                    ; Actualiza picos
                    ;----------------------------------------------------
                    
6BFA =              getPicos:
6BFA: 11CBE2          ld de, numPicos
6BFD: 7E              ld a, (hl)  ; Numero de picos
6BFE: 12              ld (de), a  ; Actualiza el numero de picos de esta piramide
6BFF: 13              inc de
6C00: 23              inc hl
6C01: A7              and a
6C02: 2824            jr z, getGiratorias ; No hay picos
                    
6C04: 47              ld b, a  ; Numero de picos
                    
6C05 =              getPicos2:
6C05: C5              push bc
6C06: 3E01            ld a, 1
6C08: 12              ld (de), a  ; Status = 1
6C09: 13              inc de
6C0A: CD616D          call transfCoords ; Transfiere coordenadas desde HL a DE (Y, X)
6C0D: C1              pop bc
6C0E: 10F5            djnz getPicos2
                    
6C10: E5              push hl
6C11: 21CBE2          ld hl, numPicos
6C14: 46              ld b, (hl)  ; Numero de picos que hay en el mapa
6C15: 23              inc hl
6C16: 23              inc hl  ; Apunta a la Y del pico
                    
6C17 =              getPicos3:
6C17: C5              push bc
6C18: E5              push hl
6C19: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
6C1C: 3680            ld (hl), 80h ; Pone pico en el mapa
6C1E: E1              pop hl
6C1F: 3E05            ld a, 5
6C21: CD1040          call ADD_A_HL ; Pasa datos del pico para apuntar a las coordenadas del siguiente
6C24: C1              pop bc
6C25: 10F0            djnz getPicos3
6C27: E1              pop hl
                    
                    
                    ;----------------------------------------------------
                    ; Actualiza puertas giratorias
                    ;----------------------------------------------------
                    
6C28 =              getGiratorias:
6C28: 7E              ld a, (hl)  ; Numero de puertas giratorias
6C29: 23              inc hl
6C2A: 111DE3          ld de, numDoorGira
6C2D: 12              ld (de), a  ; Actualiza numero de puertas giratorias de la piramide
6C2E: B7              or a
6C2F: 2837            jr z, getMuroTrampa ; No hay puertas giratorias
                    
6C31: 13              inc de
6C32: 47              ld b, a
                    
6C33 =              getGiratorias2:
6C33: C5              push bc
6C34: EDA0            ldi   ; Altura puerta (luego se divide entre 2 y se le suma 2)
6C36: EDA0            ldi   ; Y
6C38: 13              inc de  ; Pasa decimales X
                    
6C39: 7E              ld a, (hl)  ; Coordenada X
6C3A: E6F8            and 0F8h  ; bits 7-3
6C3C: 12              ld (de), a  ; X ajustada a patrones
                    
6C3D: 13              inc de
6C3E: 7E              ld a, (hl)
6C3F: 1F              rra
6C40: 1F              rra   ; bit 2
6C41: E601            and 1
6C43: 12              ld (de), a  ; Habitacion
                    
6C44: 13              inc de
6C45: 7E              ld a, (hl)
6C46: 17              rla
6C47: 17              rla   ; bits 0-1
6C48: E60C            and 0Ch
6C4A: 12              ld (de), a  ; Sentido de giro
6C4B: 13              inc de
6C4C: 13              inc de
6C4D: 23              inc hl
6C4E: C1              pop bc
6C4F: 10E2            djnz getGiratorias2
                    
6C51: E5              push hl
6C52: DD211EE3        ld ix, doorGiraData ; 0 = Status (bit 0 = Girando, bits 2-1 = altura + 2)
                          ; 1 = Y
                          ; 2 = X decimal
                          ; 3 = X
                          ; 4 = Habitacion
                          ; 5 = Sentido giro
                          ; 6 = Contador giro
                    
6C56 =              getGiratorias3:
6C56: CDAF69          call putGiratMap ; Pone puerta giratoria en el mapa
6C59: 110700          ld de, 7
6C5C: DD19            add ix, de
6C5E: 211CE3          ld hl, GiratEnProceso
6C61: 34              inc (hl)
6C62: 7E              ld a, (hl)
6C63: 23              inc hl
6C64: BE              cp (hl)  ; Comprueba si estan todas puestas
6C65: 20EF            jr nz, getGiratorias3 ; Aun quedan puertas giratorias por poner en el mapa
6C67: E1              pop hl
                    
                    
                    ;----------------------------------------------------
                    ; Actualiza muros trampa
                    ;----------------------------------------------------
                    
6C68 =              getMuroTrampa:
6C68: 11FEE3          ld de, numMuroTrampa ; Numero de muros trampa que hay en la piramide
6C6B: 7E              ld a, (hl)
6C6C: EDA0            ldi   ; Copia el numero de muros trampa que hay en esta piramide
6C6E: B7              or a
6C6F: 2809            jr z, getStairs ;  No hay muros trampa
                    
6C71: 47              ld b, a
                    
6C72 =              getMuroTrampa2:
6C72: C5              push bc  ; Numero de muros trampa
6C73: 13              inc de
6C74: CD616D          call transfCoords ; Transfiere coordenadas desde HL a DE (Y, X)
6C77: C1              pop bc
6C78: 10F8            djnz getMuroTrampa2
                    
                    
                    ;----------------------------------------------------
                    ; Procesa escaleras
                    ;----------------------------------------------------
                    
6C7A =              getStairs:
6C7A: EB              ex de, hl
6C7B: 1A              ld a, (de)  ; Numero de escaleras
6C7C: 47              ld b, a
6C7D: 13              inc de
6C7E: A7              and a
6C7F: C8              ret z  ; No hay escaleras
                    
6C80 =              getStairs2:
6C80: C5              push bc
6C81: 2183E0          ld hl, escaleraData
6C84: EB              ex de, hl
6C85: D5              push de
6C86: EDA0            ldi   ; Y escalera
                    
6C88: AF              xor a
6C89: 12              ld (de), a  ; Decimales X
                    
6C8A: 13              inc de
6C8B: 7E              ld a, (hl)  ; X
6C8C: E6F8            and 0F8h
6C8E: 12              ld (de), a  ; Ajusta la X a multiplo de 8
                    
6C8F: 7E              ld a, (hl)  ; Bit 0 = Sentido. Bit 1 = Habitacion
6C90: E601            and 1
6C92: 47              ld b, a  ; Sentido
                    
6C93: 13              inc de
6C94: 7E              ld a, (hl)
6C95: 1F              rra
6C96: E601            and 1
6C98: 12              ld (de), a  ; Habitacion
                    
6C99: D1              pop de  ; Datos escaleras
6C9A: EB              ex de, hl
6C9B: D5              push de
6C9C: CDD650          call getMapOffset00 ; Obtiene en HL el puntero al mapa de las coodenadas apuntada por HL
                    
6C9F =              getStairs3:
6C9F: 7E              ld a, (hl)  ; Hay algo en ese lugar del mapa?
6CA0: A7              and a
6CA1: 2012            jr nz, getStairs5 ; Si, la escalera ha llegado a una plataforma
                    
6CA3: 0E20            ld c, 20h
6CA5: CDC06C          call putPeldanoMap
6CA8: A7              and a  ; Sentido?
6CA9: C5              push bc
6CAA: 019EFF          ld bc, 0-62h ; Desplazamiento a la fila superior del mapa si la escalera que sube hacia la izquierda
6CAD: 2802            jr z, getStairs4
6CAF: 03              inc bc
6CB0: 03              inc bc  ; Hacia la derecha
                    
6CB1 =              getStairs4:
6CB1: 09              add hl, bc
6CB2: C1              pop bc
6CB3: 18EA            jr getStairs3
                    
6CB5 =              getStairs5:
6CB5: 0E15            ld c, 15h
6CB7: CDC06C          call putPeldanoMap ; Pone pelda? especial de inicio/fin escalera
6CBA: D1              pop de
6CBB: 13              inc de
6CBC: C1              pop bc
6CBD: 10C1            djnz getStairs2
6CBF: C9              ret
                    
6CC0 =              putPeldanoMap:
6CC0: 78              ld a, b  ; Sentido
6CC1: A7              and a
6CC2: 2802            jr z, putPeldanoMap2
6CC4: 0C              inc c
6CC5: 0C              inc c  ; Pelda?s hacia la izquierda
                    
6CC6 =              putPeldanoMap2:
6CC6: 71              ld (hl), c
6CC7: 0C              inc c
6CC8: 23              inc hl
6CC9: 71              ld (hl), c
6CCA: C9              ret
                    
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Pinta la pantalla, los sprites, cuchillos y coloca las momias
                    ;
                    ;----------------------------------------------------
                    
6CCB =              setupRoom:
6CCB: 3E01            ld a, 1
6CCD: 3247E1          ld (flagScrolling), a
6CD0: 3A3AE1          ld a, (ProtaRoom) ; Habitacion del prota (xHigh)
6CD3: 87              add a, a
6CD4: 87              add a, a
6CD5: 87              add a, a
6CD6: 87              add a, a
6CD7: 87              add a, a  ; x32 (ancho de una pantalla)
6CD8: 1160E7          ld de, MapaRAM
6CDB: CD1540          call ADD_A_DE ; DE = Puntero a la pantalla en la que se encuentra el prota (puede haber 3 en horizontal)
6CDE: CD545D          call drawRoom ; Dibuja la habitacion en la que se encuentra el prota
6CE1: CD754B          call updateSprites ; Pone los sprites
6CE4: CDFF57          call AI_Cuchillos ; Pone los cuchillos
6CE7: AF              xor a
6CE8: 3265E1          ld (momiaEnProceso), a
                    
6CEB =              initMomias:
6CEB: CDF86C          call initMomia
6CEE: 2165E1          ld hl, momiaEnProceso
6CF1: 34              inc (hl)
6CF2: 7E              ld a, (hl)
6CF3: 2B              dec hl
6CF4: BE              cp (hl)  ; Se han procesado todas las momia?
6CF5: 20F4            jr nz, initMomias
6CF7: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Inicializa la momia en proceso
                    ;
                    ; Pasa los datos de la momia a su estructura
                    ; Pone el estado 4 que es el de aparecer
                    ; Fija su velocidad y color dependiendo del tipo de momia
                    ; El tipo de momia se ve incrementado por el numero de veces que se ha terminado el juego
                    ;----------------------------------------------------
                    
6CF8 =              initMomia:
6CF8: CDDB73          call getMomiaProcDat
6CFB: DDE5            push ix
6CFD: E1              pop hl  ; Puntero a la estructura de la momia
6CFE: 3604            ld (hl), 4  ; Accion momia aparecer
6D00: 23              inc hl
6D01: 23              inc hl
6D02: 23              inc hl
6D03: 114EE1          ld de, momiasPiramid ; Datos de las momias que hay en la piramide actual: y, x (%xxxxx--p), tipo
6D06: 3A65E1          ld a, (momiaEnProceso)
6D09: 4F              ld c, a
6D0A: 87              add a, a
6D0B: 81              add a, c  ; x3
6D0C: CD1540          call ADD_A_DE
6D0F: EB              ex de, hl  ; HL apunta a la definicion de momia
                    
                    ; IF (VERSION2)
6D10: CD616D          call transfCoords ; Transfiere coordenadas de la momia
                    ; ELSE
                    ;  ldi   ; Copia la Y
                    ;
                    ;  inc de  ; Pasa decimales X
                    ;
                    ;  ld a, (hl)
                    ;  and 0F8h  ; Ajusta la coordenada X a multiplo de 8
                    ;  ld (de), a  ; X
                    ;
                    ;  inc de
                    ;  ld a, (hl)
                    ;  and 1
                    ;  ld (de), a  ; Habitacion de inicio (xHigh)
                    ;
                    ;  inc de
                    ;  inc hl
                    ; ENDIF
                    
6D13: 7E              ld a, (hl)  ; Tipo de momia
6D14: 4F              ld c, a
6D15: 3A58E0          ld a, (numFinishGame) ; Numero de veces que se ha terminado el juego
6D18: 81              add a, c  ; Suma al tipo de momia las veces que se ha terminado el juego
6D19: FE05            cp 5  ; Comprueba si se sale del rango de tipos de momias existentes
6D1B: 3802            jr c, initMomia2
                    
6D1D: 3E04            ld a, 4  ; Tipo de momia mas inteligente
                    
6D1F =              initMomia2:
6D1F: 4F              ld c, a  ; Tipo de momia
6D20: EB              ex de, hl
6D21: 11446D          ld de, tiposMomia ; Caracteristicas de cada tipo de momia (color y velocidad)
6D24: CD1540          call ADD_A_DE
6D27: 1A              ld a, (de)
6D28: 47              ld b, a
6D29: E6F0            and 0F0h  ; El nibble alto indica la velocidad de la momia
6D2B: 77              ld (hl), a  ; Velocidad
                    
6D2C: 3E0A            ld a, 0Ah
6D2E: CD1040          call ADD_A_HL
6D31: 3610            ld (hl), 10h ; Timer (tiempo que tarda en aparecer)
6D33: 23              inc hl
6D34: 23              inc hl
6D35: 23              inc hl
6D36: 71              ld (hl), c  ; Tipo de momia
6D37: 13              inc de
6D38: CDF371          call getMomiaAtrib ; Attributos del sprite de la momia
6D3B: 23              inc hl
6D3C: 23              inc hl
6D3D: 23              inc hl
6D3E: 78              ld a, b
6D3F: CD9444          call AL_C__AH_B ; Copia el nibble alto de A en B y el bajo en C
6D42: 71              ld (hl), c  ; Color
6D43: C9              ret
                    
                    ;----------------------------------------------------
                    ; Tipos de momia
                    ; Nibble bajo = Color
                    ; Nibble alto = Velocidad
                    ;----------------------------------------------------
6D44: 5F            tiposMomia: db 5Fh
6D45: 59              db 59h
6D46: A4              db 0A4h
6D47: A8              db 0A8h
6D48: BA              db 0BAh
                    
                    ;----------------------------------------------------
                    ; Get index HL, A
                    ;
                    ; In: HL = Index pointer
                    ;      A = Index
                    ; Out: HL = (HL + A)
                    ;----------------------------------------------------
                    
6D49 =              getIndexHL_A:
6D49: CD1040          call ADD_A_HL
6D4C: 7E              ld a, (hl)
6D4D: 23              inc hl
6D4E: 66              ld h, (hl)
6D4F: 6F              ld l, a
6D50: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba si la piramide actual ya ha sido terminada
                    ; Out: NZ = Pasada
                    ; Z = No pasada
                    ;----------------------------------------------------
                    
6D51 =              chkPiramPasada:
6D51: ED4B62E0        ld bc, (PiramidesPasadas) ; Cada bit indica si la piramide correspondiente ya esta pasada/terminada
6D55: C5              push bc
6D56: CD2365          call calcBitMask ; Devuelve en DE el bit activo que corresponde a la piramide actual
6D59: C1              pop bc
6D5A: 78              ld a, b
6D5B: A2              and d
6D5C: 47              ld b, a
6D5D: 79              ld a, c
6D5E: A3              and e
6D5F: 80              add a, b
6D60: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Transfiere coordenadas desde HL a DE (Y, X)
                    ; In:
                    ;   HL = Y, X (XXXXXxxP) X = Coordenada X, P = Pantalla
                    ;----------------------------------------------------
                    
6D61 =              transfCoords:
6D61: EDA0            ldi   ; Copia coordenada Y
6D63: 13              inc de  ; Pasa los decimales de la X
6D64: 7E              ld a, (hl)
6D65: E6F8            and 0F8h  ; Ajusta coordenada X a multiplos de 8 (patrones)
6D67: 12              ld (de), a  ; Guarda coordenada X
                    
6D68: 13              inc de  ; Apunta al segundo byte de la coordenada X (habitacion)
6D69: 7E              ld a, (hl)  ; Vuelve a leer la coordenada X
6D6A: E601            and 1  ; Se queda con el bit 0 (!?) Solo pueden ponerse la gemas en la pantalla 0 o 1
6D6C: 12              ld (de), a  ; Interpreta el bit 0 como pantalla de destino (coordenada + 256*bit0)
6D6D: 13              inc de
6D6E: 23              inc hl
6D6F: C9              ret
                    
                    
                    
                    ;----------------------------------------------------
                    ; Mapas de las piramides
                    ;----------------------------------------------------
6D70: 4760          indexPiramides: dw MapStage1
6D72: 7A60            dw MapStage2
6D74: 8861            dw MapStage3
6D76: 2261            dw MapStage4
6D78: DD60            dw MapStage5
6D7A: C861            dw MapStage6
6D7C: E162            dw MapStage7
6D7E: 3562            dw MapStage8
6D80: 2163            dw MapStage9
6D82: 5F63            dw MapStage10
6D84: 9762            dw MapStage11
6D86: 0864            dw MapStage12
6D88: 6C64            dw MapStage13
6D8A: B864            dw MapStage14
6D8C: BF63            dw MapStage15
                    
6D8E: DF5D          indexHalfMap: dw halfMap1
6D90: 8F5E            dw halfMap2
6D92: 135F            dw halfMap3
6D94: 975F            dw halfMap4
                    
                    
                    ;----------------------------------------------------
                    ; Patrones que forman el destello de las gemas
                    ;----------------------------------------------------
6D96: 40            brillosGema: db 40h  ; Superior
6D97: 41              db 41h  ; Izquierda
6D98: 00              db 0  ; Espacio para la gema
6D99: 42              db 42h  ; Derecha
                    
                    
                    ;----------------------------------------------------
                    ; Borra el mapa de la RAM
                    ;----------------------------------------------------
                    
6D9A =              BorraMapaRAM:
6D9A: 2160E7          ld hl, MapaRAM
6D9D: 1161E7          ld de,  MapaRAM+1
6DA0: 01A008          ld bc, 8A0h
6DA3: 3614            ld (hl), 14h
6DA5: EDB0            ldir
6DA7: C9              ret
                    
                    ;----------------------------------------------------
                    ;
                    ; Cambia el color de los ladrillos cada 4 fases
                    ;
                    ;----------------------------------------------------
                    
6DA8 =              ChgStoneColor:
6DA8: 3A54E0          ld a, (piramideActual)
6DAB: 3D              dec a
6DAC: 1F              rra
6DAD: 1F              rra
6DAE: E603            and 3
6DB0: 21CC6D          ld hl, ColoresPiedra
6DB3: CDBE65          call getIndexX9
6DB6: EB              ex de, hl
6DB7: 210002          ld hl, 200h ; Destino = Patron #40 (Piedras/ladrillos)
6DBA: 0605            ld b, 5  ; Numero de patrones a pintar
                    
6DBC =              ChgStoneColor2:
6DBC: C5              push bc
6DBD: D5              push de
6DBE: E5              push hl
6DBF: CDF144          call UnpackPatterns
6DC2: E1              pop hl
6DC3: 110800          ld de, 8
6DC6: 19              add hl, de
6DC7: D1              pop de
6DC8: C1              pop bc
6DC9: 10F1            djnz ChgStoneColor2
6DCB: C9              ret
                    
                    ;----------------------------------------------------
                    ; Colores de los ladrillos
                    ; Formato: numero de filas, color
                    ;----------------------------------------------------
6DCC: 02A0026002A0026000  ColoresPiedra: db 2,0A0h, 2, 60h, 2,0A0h, 2, 60h, 0
6DD5: 024002700240027000    db 2, 40h, 2, 70h, 2, 40h, 2, 70h, 0
6DDE: 026002A0026002A000    db 2, 60h, 2,0A0h, 2, 60h, 2,0A0h, 0
6DE7: 02C002B002C0023000    db 2,0C0h, 2,0B0h, 2,0C0h, 2, 30h, 0
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Logica del prota en las escaleras cuando entra o sale de la piramide
                    ; Comprueba si las sube o las baja y actualiza las coordenadas del prota
                    ; Si sale, comprueba si hay que dar un bonus
                    ;
                    ;----------------------------------------------------
                    
6DF0 =              escalerasEntrada:
6DF0: 3A30E1          ld a, (statusEntrada) ; Status del prota en las escaleras de la entrada/salida
6DF3: CD4B40          call jumpIndex
                    
6DF6: FE6D            dw entraSale ; Subiendo o bajando por las escaleras
6DF8: 5E6E            dw quietoFinEsc ; Ha llegado al final de las escaleras. Espera un rato
6DFA: 856E            dw chkBonusStage ; Comprueba si hay que dar un bonus por pasarse la piramide
6DFC: B86E            dw haSalido ; Ha salido de la piramide. Pasa al pergamino
                    
6DFE =              entraSale:
6DFE: 213EE1          ld hl, protaMovCnt ; (!?) Donde se usa HL?
6E01: 3A03E0          ld a, (timer)
6E04: E603            and 3
6E06: C0              ret nz  ; Procesa una de cada cuatro iteraciones
                    
6E07: 21E001          ld hl, 1E0h
6E0A: 223BE1          ld (protaSpeed), hl ; Velocidad X mientras entra en la piramide
6E0D: CDFB73          call mueveProta ; Actualiza la posicion del prota
                    
6E10: 3A00E0          ld a, (GameStatus)
6E13: FE04            cp 4  ; Entrando o saliendo de la piramide?
6E15: 2013            jr nz, salePiramide
                    
6E17: 2137E1          ld hl, ProtaY
6E1A: 34              inc (hl)  ; Incrementa la Y del prota
6E1B: 7E              ld a, (hl)
6E1C: E607            and 7  ; Ha terminado de bajar las escaleras? (solo baja 1 tile)
6E1E: 201E            jr nz, animProta ; Siguiente frame de la animacion del prota
                    
6E20: 3E01            ld a, 1
6E22: 323FE1          ld (protaFrame), a ; Pone frame de quieto
6E25: CDFA4C          call setAttribProta ; Actualiza atributos de los sprites del prota
6E28: 181E            jr finEntraSale
                    
6E2A =              salePiramide:
6E2A: 2137E1          ld hl, ProtaY
6E2D: 35              dec (hl)  ; Decrementa la Y del prota
6E2E: 23              inc hl
6E2F: 23              inc hl
6E30: 7E              ld a, (hl)  ; X prota
6E31: C608            add a, 8
6E33: 21B1E0          ld hl, puertaXspr ; X sprite puerta (parte derecha)
6E36: BE              cp (hl)  ; Esta medio cuerpo del prota tapado por la puerta derecha?
6E37: 3805            jr c, animProta ; No
                    
6E39: CD5643          call hideSprAttrib ; Oculta todos los sprites (prota, puerta derecha...)
6E3C: 180A            jr finEntraSale
                    
6E3E =              animProta:
6E3E: 213FE1          ld hl, protaFrame
6E41: 34              inc (hl)  ; siguiente frame
6E42: E607            and 7  ; rango 0-7
6E44: 77              ld (hl), a
6E45: C3FA4C          jp setAttribProta ; Actualiza atributos de los sprites del prota
                    
6E48 =              finEntraSale:
6E48: 01A800          ld bc, 0A8h
6E4B: ED433BE1        ld (protaSpeed), bc ; El byte bajo indica la parte "decimal" y el alto la entera
6E4F: 0604            ld b, 4  ; Numero de sprites a quitar
6E51: CD5843          call hideSprAttrib2 ; Oculta los sprites de la puerta
                    
6E54: 2130E1          ld hl, statusEntrada ; Status del prota en las escaleras
6E57: 34              inc (hl)  ; Pasa al siguiente estado: quieto al pie de las escaleras
                    
6E58: 3E20            ld a, 20h
6E5A: 3203E0          ld (timer), a
6E5D: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; El prota ha llegado al final de las escaleras
                    ; al entrar o al salir de la piramide
                    ;----------------------------------------------------
                    
6E5E =              quietoFinEsc:
6E5E: CDEA65          call AI_Salidas
6E61: 3AC2E1          ld a, (puertaCerrada) ; Vale 1 al cerrarse la salida
6E64: B7              or a
6E65: C8              ret z  ; La puerta no se ha cerrado aun
                    
6E66: 3A00E0          ld a, (GameStatus)
6E69: FE04            cp 4  ; Entrando o saliendo de la piramide?
6E6B: 280E            jr z, estaDentro ; Entrando
                    
6E6D: 3E20            ld a, 20h  ; Silencio
6E6F: CDA97A          call setMusic
                    
6E72: 2130E1          ld hl, statusEntrada
6E75: 34              inc (hl)  ; Pasa al siguiente estado de las escaleras: comprueba si hay que dar un bonus por pasarse la fase
                    
6E76: AF              xor a
6E77: 32F4E1          ld (ElemEnProceso), a ; Usado para saber la gema o puerta que se esta procesando
6E7A: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Ya esta dentro de la piramide y la puerta se ha cerrado.
                    ; Pasa al siguiente substado que inicia la fase
                    ;----------------------------------------------------
                    
6E7B =              estaDentro:
6E7B: 3E28            ld a, 28h
6E7D: 3204E0          ld (waitCounter), a
6E80: 2101E0          ld hl, subStatus
6E83: 34              inc (hl)  ; Inicia la fase
6E84: C9              ret
                    
                    ;----------------------------------------------------
                    ;
                    ; Comprueba si hay que dar un bonus por pasarse la piramide
                    ; Si ya se ha pasado no hay bonus
                    ;
                    ;----------------------------------------------------
                    
6E85 =              chkBonusStage:
6E85: 2104E0          ld hl, waitCounter
6E88: 35              dec (hl)
6E89: F0              ret p
                    
6E8A: CD516D          call chkPiramPasada
6E8D: 200B            jr nz, chkBonusStage2 ; Ya se la habia pasado
                    
6E8F: 110020          ld de, 2000h
6E92: CD1244          call SumaPuntos ; Bonus de 2000 puntos
6E95: 3E8F            ld a, 8Fh  ; Bonus stage clear
6E97: CDA97A          call setMusic
                    
6E9A =              chkBonusStage2:
6E9A: 2130E1          ld hl, statusEntrada
6E9D: 34              inc (hl)  ; Pasa al siguiente estado
                    
6E9E: 3E70            ld a, 70h
6EA0: 3204E0          ld (waitCounter), a ; Tiempo que espera antes de finalizar el proceso de salida
                    
6EA3: CD2365          call calcBitMask ; Devuelve en DE el bit activo que corresponde a la piramide actual
6EA6: 2162E0          ld hl, PiramidesPasadas ; Cada bit indica si la piramide correspondiente ya esta pasada/terminada
6EA9: C31865          jp setPiramidClear ; Marca la piramide actual como pasada
                    
                    
                    ;----------------------------------------------------
                    ; Vida extra
                    ; Suma una vida y reproduce un SFX para indicarlo
                    ;----------------------------------------------------
                    
6EAC =              VidaExtra:
6EAC: 2150E0          ld hl, Vidas
6EAF: 34              inc (hl)  ; Incrementa el numero de vidas
                    
6EB0: 3E8A            ld a, 8Ah  ; SFX vida extra
6EB2: CDA97A          call setMusic
6EB5: C38543          jp dibujaVidas
                    
                    ;----------------------------------------------------
                    ; Ha salido de la piramide
                    ;
                    ;----------------------------------------------------
                    
6EB8 =              haSalido:
6EB8: 2103E0          ld hl, timer
6EBB: 7E              ld a, (hl)
6EBC: E603            and 3  ; (!?) Para que hace esto sin o vale para nada?
                    
6EBE: 23              inc hl
6EBF: 35              dec (hl)  ; Decrementa waitCounter
6EC0: C0              ret nz  ; Aun hay que esperar a que termine la fanfarria de "se salio de la piramide"
                    
6EC1: AF              xor a
6EC2: 3232E1          ld (flagEntraSale), a ; Continua con la logica normal del juego
                    
6EC5: 3E08            ld a, 8  ; Status = Stage clear
6EC7: 3200E0          ld (GameStatus), a
6ECA: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Inicializa los sprites del prota y de la puerta de entrada
                    ; Coloca al prota en la parte superior derecha de las escaleras e indica color de ropa y piel
                    ; Cambia el estado de la puerta a "cerrandose"
                    ; Coloca los sprites que forman la hoja derecha de la puerta que solapa al prota
                    ; Cuatro sprites en total (dos parejas solapadas)
                    ;----------------------------------------------------
                    
6ECB =              setSprDoorProta:
6ECB: 11B0E0          ld de, sprAttrib ; Tabla de atributos de los sprites en RAM (Y, X, Spr, Col)
6ECE: 21546F          ld hl, attribDoor ; Atributos de las puertas de la entrada
6ED1: 011000          ld bc, 10h  ; 4 sprites * 4 bytes
6ED4: EDB0            ldir
                    
6ED6: 3E0E            ld a, 0Eh
6ED8: 32C3E0          ld (protaColorRopa), a ; Color gris para la ropa y casco del prota
6EDB: 3E06            ld a, 6
6EDD: 32C7E0          ld (ProtaColorPiel), a ; Color naranja para la piel
                    
6EE0: 3A56E0          ld a, (puertaEntrada) ; Puerta por la que se esta entrando (direccion)
6EE3: CB3F            srl a  ; Los valores son 1,2,4,8
6EE5: FE04            cp 4
6EE7: 2001            jr nz, initDoorProta2
6EE9: 3D              dec a  ; Convierte numero de bit a decimal
                    
6EEA =              initDoorProta2:
6EEA: 21C5E1          ld hl, pyramidDoors ; Y (FF = Desactivado)
                         ; X decimales
                         ; X
                         ; Habitacion
                         ; Status (Nibble alto = Status, Nibble bajo = contador)
                         ; Piramide destino
                         ; Direccion por la que se entra / Flecha del mapa
6EED: CD256A          call getHL_Ax7 ; Obtiene puntero a los datos de la puerta por la que se entra
                    
6EF0: E5              push hl
6EF1: 1137E1          ld de, ProtaY
6EF4: 7E              ld a, (hl)  ; Y centro puerta
6EF5: D608            sub 8
6EF7: 12              ld (de), a  ; Coloca al prota 8 pixeles mas arriba
6EF8: 13              inc de
6EF9: 23              inc hl
6EFA: EDA0            ldi   ; X decimales
                    
6EFC: 7E              ld a, (hl)  ; X centro puerta
6EFD: C608            add a, 8
6EFF: 12              ld (de), a  ; Coloca al prota 8 pixeles a la derecha
                    
6F00: 13              inc de
6F01: 23              inc hl
6F02: EDA0            ldi   ; Misma habitacion para la puerta y para el prota
                    
6F04: 010500          ld bc, 5
6F07: 214F6F          ld hl, protaDataDoor
6F0A: EDB0            ldir   ; Pone valores por defecto al iniciar una fase
                    
6F0C: CDFA4C          call setAttribProta ; Actualiza los atributos RAM de los sprites del prota segun sus coordenadas y sentido
                    
6F0F: 3A56E0          ld a, (puertaEntrada)
6F12: CB3F            srl a
6F14: FE04            cp 4
6F16: 2001            jr nz, initDoorProta3 ; Guarda el indice de puerta por la que se entra a la piramide
6F18: 3D              dec a  ; Convierte numero de bit a decimal
                    
6F19 =              initDoorProta3:
6F19: 32F4E1          ld (ElemEnProceso), a ; Guarda el indice de puerta por la que se entra a la piramide
6F1C: 3E04            ld a, 4  ; Status
6F1E: CD5B67          call getExitDat ; Obtiene un puntero al estado de la puerta
6F21: 3650            ld (hl), 50h ; Estado de cerrando puerta
                    
6F23: E1              pop hl  ; Puntero a la puerta
6F24: 56              ld d, (hl)  ; Coordenada Y central de la puerta
6F25: 23              inc hl
6F26: 23              inc hl
6F27: 5E              ld e, (hl)  ; Coordenada X central de la puerta
                    
6F28: 21B0E0          ld hl, sprAttrib ; Tabla de atributos de los sprites en RAM (Y, X, Spr, Col)
6F2B: 3E10            ld a, 16
6F2D: 83              add a, e
6F2E: 5F              ld e, a  ; Suma 16 a la X de la puerta
                    
6F2F: 7A              ld a, d
6F30: D611            sub 17
6F32: 57              ld d, a  ; Resta 17 a la Y de la puerta
                    
6F33: 0602            ld b, 2
                    
6F35 =              initDoorProta4:
6F35: 0E02            ld c, 2  ; Son dos sprites solapados para conseguir color de fondo y de tinta
                    
6F37 =              initDoorProta5:
6F37: 72              ld (hl), d  ; Y
6F38: 23              inc hl
6F39: 73              ld (hl), e  ; X
6F3A: 23              inc hl  ; El sprite ya ha sido indicado antes mediante 'attribDoor'
6F3B: 23              inc hl  ; El color tambien ha sido indicado por 'atribDoor'
6F3C: 23              inc hl  ; Apunta a los atributos del siguiente sprite
6F3D: 0D              dec c
6F3E: 20F7            jr nz, initDoorProta5 ; Siguiente sprite solapado
                    
                    
6F40: 7A              ld a, d  ; Y del primer cacho de puerta
6F41: C610            add a, 16  ; Desplaza el alto del sprite (16 pixeles)
6F43: 57              ld d, a
6F44: 10EF            djnz initDoorProta4 ; Pone el siguiente par de sprites debajo del anterior
                    
6F46: AF              xor a
6F47: 3230E1          ld (statusEntrada), a ; Subestado de la puerta por la que entra en la piramide
6F4A: 3C              inc a
6F4B: 3236E1          ld (sentidoProta), a ; 1 = Izquierda, 2 = Derecha
6F4E: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Valores iniciales de las siguientes variables al
                    ; comenzar una fase
                    ;
                    ; Velocidad X decimales,
                    ; Velocidad X entero,
                    ; Velocidad X habitacion,
                    ; Contador movimiento,
                    ; Frame
                    ;----------------------------------------------------
6F4F: C800000101    protaDataDoor: db 0C8h, 0, 0, 1, 1
                    
                    
                    ;----------------------------------------------------
                    ; Attributos de la puerta de entrada
                    ; x, y, sprite, color
                    ;----------------------------------------------------
6F54: E0B0D801      attribDoor: db 0E0h, 0B0h, 0D8h, 1 ; Dibujo ladrillos
6F58: E0B0DC03        db 0E0h, 0B0h, 0DCh, 3 ; Relleno ladrillos
6F5C: E0B0E001        db 0E0h, 0B0h, 0E0h, 1 ; Dibujo ladrillos
6F60: E0B0E403        db 0E0h, 0B0h, 0E4h, 3 ; Relleno
                    
                    
                    ;----------------------------------------------------
                    ; AI Momias
                    ; Inteligencia de las momias
                    ; Dependiendo del tipo de momia, estas dudan mas o menos al tomar una decision
                    ; y van mas rapidas o lentas por las escaleras.
                    ; Itentan acercarse al prota y se aseguran de no aparecer por sorpresa por un lado de la pantalla cuando el prota esta cerca del borde
                    ;----------------------------------------------------
                    
6F64 =              AI_Momias:
6F64: AF              xor a  ; Empieza por la primera momia :)
6F65: 3265E1          ld (momiaEnProceso), a
                    
6F68 =              nextMomia:
6F68: CDDB73          call getMomiaProcDat ; Obtiene puntero a la momia en proceso
6F6B: D9              exx
6F6C: 62              ld h, d
6F6D: 6B              ld l, e
6F6E: 46              ld b, (hl)  ; Status de la momia
6F6F: 23              inc hl
6F70: 7E              ld a, (hl)  ; Sentido (1 = izquierda, 2 = derecha)
6F71: CB3F            srl a
6F73: CB3F            srl a
6F75: 23              inc hl
6F76: 77              ld (hl), a  ; Controles. Dependiendo del sentido "aprieta" DERECHA o IZQUIERDA
6F77: 78              ld a, b  ; Estado de la momia
6F78: D9              exx
                    
                    
6F79: 217D70          ld hl, updateMomiaAtr ; Actualiza los atributos RAM de la momia
6F7C: E5              push hl  ; Guarda esta funcion en la pila para ejecutarla al terminar el proceso actual
                    
                    
6F7D: CD4B40          call jumpIndex ; Dependiendo del estado de la momia salta a una de las siguientes funciones
                    
                    
6F80: 926F            dw momiaAnda ; 0 = Anda y comprueba si se cae o decide saltar. Al finalizar pasa al estado de pensar
6F82: EE70            dw momiaSaltando ; 1 = Procesa salto
6F84: 3E71            dw momiaCayendo ; 2 = Momia cayendo. Al llegar al suelo pasa al estado de andar
6F86: 4871            dw momiaEscaleras ; 3 = Mueve a la momia por las escaleras y comprueba si llega al final de las mismas
6F88: 7E71            dw momiaLimbo ; 4 = Espera un tiempo antes de pasar al siguiente estado (aparecer)
6F8A: 9C71            dw momiaAparece ; 5 = Proceso de aparicion de la momia mediante una nube de polvo
6F8C: C471            dw momiaSuicida ; 6 = Anda hacia la derecha y explota
6F8E: 0872            dw momiaPiensa ; 7 = Mira a los lados y decide como acercarse al prota
6F90: 6172            dw momiaDesaparece
                    
                    ;----------------------------------------------------
                    ; Momia anda
                    ; Si el timer de la momia es 0 pasa al estado de pensar y fija cuantas veces dudara antes de decidirse
                    ; Cuando la momia choca contra un muro se incrementa su nivel de stress.
                    ; Cada vez que consigue andar un rato sin chocarse, el nivel de stress disminuye.
                    ; Cuando se estresa mucho, la momia acaba explotando.
                    ; De esta forma se evita que se quede trabada en un agujero o en una ruta sin salida
                    ;----------------------------------------------------
                    
6F92 =              momiaAnda:
6F92: DD7E11          ld a, (ix+ACTOR_TIMER)
6F95: B7              or a  ; Esta andando?
6F96: 2012            jr nz, momiaAnda2 ; si
                    
6F98: DD360007        ld (ix+ACTOR_STATUS), 7 ; Estado: Pensando
6F9C: DD7E14          ld a, (ix+ACTOR_TIPO) ; Tipo de momia
6F9F: 117870          ld de, vecesDudaMomia
6FA2: CD1540          call ADD_A_DE
6FA5: 1A              ld a, (de)  ; Segun el tipo de momia, duda o mira mas tiempo a los lados
6FA6: DD7711          ld (ix+ACTOR_TIMER), a ; Veces que mira a los lados
6FA9: C9              ret
                    
6FAA =              momiaAnda2:
6FAA: 3A03E0          ld a, (timer)
6FAD: E60F            and 0Fh
6FAF: 2003            jr nz, momiaAnda3
                    
6FB1: DD3511          dec (ix+ACTOR_TIMER) ; Cada 16 iteraciones decrementa el tiempo de andar
                    
6FB4 =              momiaAnda3:
6FB4: E1              pop hl  ; Saca de la pila la rutina que actualiza los atributos de la momia
6FB5: CD8472          call evitaSorpresa ; Evita que una momia aparezca por un lateral cuando el prota esta cerca
                    
6FB8: 217D70          ld hl, updateMomiaAtr ; Funcion que actualiza los atributos RAM del sprite de la momia
6FBB: E5              push hl  ; Guarda la funcion en la pila para ejecutar al terminar el proceso
                    
6FBC: DD7E01          ld a, (ix+ACTOR_CONTROL) ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha
6FBF: CB67            bit 4, a  ; Boton A:Orden de saltar
6FC1: C2C970          jp nz, tryToJump ; Salta si no hay obstaculos
                    
6FC4: DDE5            push ix  ; Datos momia
6FC6: E1              pop hl
                    
                    
6FC7: 23              inc hl
6FC8: E5              push hl  ; Pointer a los controles de la momia
6FC9: 23              inc hl
6FCA: 23              inc hl  ; Apunta a la coordenada Y
6FCB: CD9850          call chkCae  ; Comprueba si tiene suelo bajo los pies
6FCE: E1              pop hl
6FCF: DA1F71          jp c, momiaSinSuelo ; Se va a caer o decide saltar
                    
6FD2: E5              push hl  ; Puntero a los controles (+#01)
6FD3: 3E01            ld a, 1  ; Las momias no actualizan la variable "sentidoEscalera" del prota
6FD5: 324DE1          ld (modoSentEsc), a ; Si es 0 guarda en "sentidoEscalera" el tipo de escalera que se coge el prota. 0 = \, 1 = /
6FD8: CD3351          call chkCogeEsc2 ; Comprueba si comienza a subir o bajr por una escalera
6FDB: E1              pop hl
6FDC: CA5C70          jp z, setSentEsc ; Ha cogido unas escaleras
                    
6FDF: CDD551          call chkChocaAndar2 ; Comprueba si choca contra un muro o puerta giratoria
                    
6FE2: F5              push af
6FE3: 3E15            ld a, ACTOR_STRESS ; Contador de veces que choca (stress)
6FE5: CD0072          call getVariableMomia
6FE8: F1              pop af
                    
6FE9: 7E              ld a, (hl)  ; Numero de veces que ha chocado
6FEA: 3016            jr nc, momiaDecStress ; No choca contra un muro o puerta giratoria. Decrementa numero de decisiones
                    
                    ; La momia ha chocado con un muro
                    ; Si el numero de veces que ha chocado casi consecutivamente es 9, la momia explota
                    ; De esta forma se evita que se quede trabada en un agujero o en una ruta sin salida
6FEC: E6F0            and 0F0h
6FEE: C61F            add a, 1Fh  ; Incrementa el stress de la momia
6FF0: 77              ld (hl), a
6FF1: FEAF            cp 0AFh
6FF3: 202D            jr nz, momiaHaChocado
                    
6FF5 =              momiaVanish:
6FF5: DD360008        ld (ix+ACTOR_STATUS), 8 ; Estado: momia explota y desaparece
6FF9: DD360104        ld (ix+ACTOR_CONTROL), 4 ; Va a la izquierda
6FFD: DD361122        ld (ix+ACTOR_TIMER), 22h
7001: C9              ret
                    
7002 =              momiaDecStress:
7002: FEF0            cp 0F0h
7004: 280A            jr z, momiaUpdate ; Si el contado de stress es 0 no lo decrementa
                    
7006: 3A03E0          ld a, (timer)
7009: E61F            and 1Fh
700B: 2003            jr nz, momiaUpdate ; Solo lo decrementa cada #20 iteraciones
                    
700D: 35              dec (hl)  ; Decrementa el stress de la momia
700E: 2000            jr nz, momiaUpdate ; (!?) Para que?
                    
                    ;----------------------------------------------------
                    ; Actualiza la posicion y frame de la momia
                    ;----------------------------------------------------
                    
7010 =              momiaUpdate:
7010: DD5E07          ld e, (ix+ACTOR_SPEEDXDEC)
7013: DD5608          ld d, (ix+ACTOR_SPEED_X) ; DE = Velocidad de la momia
7016: 3E04            ld a, 4  ; Offset X decimal
7018: CD0072          call getVariableMomia ; Obtiene puntero a la X con decimales de la momia
701B: CD0274          call mueveElemento ; Actualiza sus coordenadas al sumarle la velocidad
701E: CD5370          call momiaCalcFrame ; Actualiza si es necesario el frame de la animacion
7021: C9              ret
                    
                    ;----------------------------------------------------
                    ; Tras chocar contra un muro la momia salta o se da la vuelta
                    ; Si es la mas tonta y se queda entre dos muro se para a pensar
                    ;----------------------------------------------------
                    
7022 =              momiaHaChocado:
7022: 2B              dec hl
7023: 7E              ld a, (hl)  ; Tipo de momia
7024: B7              or a  ; Es la mas tonta? =0
7025: 2016            jr nz, saltaOVuelve ; No
                    
7027: CDFE71          call getYMomia
702A: 2B              dec hl
702B: 7E              ld a, (hl)  ; Sentido
702C: EE03            xor 3  ; Invierte derecha/izquierda
702E: 47              ld b, a  ; Cambia el sentido del movimiento (la gira)
702F: CDDB51          call chkChocaAndar4 ; Tambien choca por el otro lado?
7032: 3009            jr nc, saltaOVuelve ; No choca
                    
                    
                    ; La momia tonta (blanca) se queda atrapada entre dos muros
                    
7034: DD3611FF        ld (ix+ACTOR_TIMER), 0FFh
7038: DD360007        ld (ix+ACTOR_STATUS), 7 ; Estado de pensar
703C: C9              ret
                    
                    ;----------------------------------------------------
                    ; La momia salta si puede. Si no, se da la vuelta
                    ;----------------------------------------------------
                    
703D =              saltaOVuelve:
703D: CDFE71          call getYMomia
7040: FE08            cp 8
7042: 3806            jr c, daLaVuelta ; Esta muy arriba, da la vuelta
                    
7044: CD3474          call chkSaltar ; Puede saltar? (No tiene nada encima ni delante)
7047: DAD470          jp c, momiaSetSalta ; Salta
                    
704A =              daLaVuelta:
704A: DD7E01          ld a, (ix+ACTOR_CONTROL) ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha
704D: EE0C            xor 0Ch  ; Cambia de direccion
704F: DD7701          ld (ix+ACTOR_CONTROL), a ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha
7052: C9              ret
                    
                    ;----------------------------------------------------
                    ; Incrementa el contador de movimientos y actualiza el numero de frame
                    ;----------------------------------------------------
                    
7053 =              momiaCalcFrame:
7053: 3E0A            ld a, 0Ah  ; Offset a contador de movimientos
7055: CD0072          call getVariableMomia
7058: 34              inc (hl)  ; Incrementa el numero de movimientos
7059: C3314D          jp calcFrame2 ; Actualiza el numero de frame (0-7) segun  el numero de movimientos acumulados
                    
                    ;----------------------------------------------------
                    ; Guarda el sentido de las escaleras dentro de la estructura de la momia
                    ; In:
                    ;   C = tile mapa (escaleras)
                    ;----------------------------------------------------
                    
705C =              setSentEsc:
705C: DD7E01          ld a, (ix+ACTOR_CONTROL) ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha
705F: 1F              rra   ; Pasa control ARRIBA al carry
7060: 79              ld a, c
7061: 0608            ld b, 8  ; Control: DERECHA
7063: 3004            jr nc, setSentEsc2 ; No tiene ARRIBA apretado
                    
7065: 0604            ld b, 4  ; Control: IZQUIERDA
7067: EE01            xor 1
                    
7069 =              setSentEsc2:
7069: E601            and 1
706B: DD770F          ld (ix+ACTOR_SENT_ESC), a ; Sentido en el que van las escaleras. 0 = \  1 = /
706E: A7              and a
706F: 78              ld a, b
7070: 2802            jr z, setSentEsc3
7072: EE0C            xor 0Ch  ; Cambia sentido del movimiento
                    
7074 =              setSentEsc3:
7074: DD7701          ld (ix+ACTOR_CONTROL), a ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha
7077: C9              ret
                    
                    ;----------------------------------------------------
                    ; Numero de veces que duda (mira a los lados) cada momia
                    ; cuando esta decidiendo el siguiente movimiento
                    ;----------------------------------------------------
7078: 03            vecesDudaMomia: db 3
7079: 03              db 3
707A: 00              db 0
707B: 00              db 0
707C: 03              db 3
                    
                    
                    ;----------------------------------------------------
                    ; Actualiza los atributos RAM de una momia
                    ; Su posicion y frame. La oculta si esta en otra habitacion
                    ;----------------------------------------------------
                    
707D =              updateMomiaAtr:
707D: DD4E03          ld c, (ix+ACTOR_Y)
7080: DD4605          ld b, (ix+ACTOR_X)
7083: CDF371          call getMomiaAtrib
                    
7086: 3A3AE1          ld a, (ProtaRoom) ; Parte alta de la coordenada X. Indica la habitacion de la piramide
7089: DDBE06          cp (ix+ACTOR_ROOM)
708C: 2023            jr nz, hideMomia ; No estan en la misma habitacion
                    
708E: 0D              dec c
708F: 0D              dec c  ; Y = Y - 2
7090: DD7E0B          ld a, (ix+ACTOR_FRAME)
7093: F5              push af
7094: 1F              rra   ; Si el frame es par, mueve la momia un poco hacia arriba
7095: 3801            jr c, updateMomiaAt2
7097: 0C              inc c
                    
7098 =              updateMomiaAt2:
7098: F1              pop af
7099: 11BE70          ld de, framesMomia
709C: CD1540          call ADD_A_DE
709F: 1A              ld a, (de)
70A0: 57              ld d, a  ; Frame
70A1: 71              ld (hl), c  ; Coordenada Y
70A2: 23              inc hl
70A3: 70              ld (hl), b  ; Coordenada X
70A4: 23              inc hl
70A5: DD7E02          ld a, (ix+ACTOR_SENTIDO) ; 1 = Izquierda, 2 = Derecha
70A8: 1F              rra
70A9: 7A              ld a, d
70AA: 3002            jr nc, setFrameMomia
70AC: C660            add a, 60h  ; Desplazamiento a sprites invertidos
                    
70AE =              setFrameMomia:
70AE: 77              ld (hl), a
70AF: 1802            jr chkLastMomia ; Comprueba si faltan momias por procesar
                    
70B1 =              hideMomia:
70B1: 36E0            ld (hl), 0E0h ; Oculta el sprite (Y = #E0)
                    
70B3 =              chkLastMomia:
70B3: 2165E1          ld hl, momiaEnProceso ; Comprueba si faltan momias por procesar
70B6: 34              inc (hl)
70B7: 7E              ld a, (hl)
70B8: 2B              dec hl
70B9: BE              cp (hl)  ; Ha procesado todas las momias?
70BA: D0              ret nc  ; Si, termina
70BB: C3686F          jp nextMomia
                    
70BE: 2C            framesMomia: db 2Ch  ; Pie atras
70BF: 28              db 28h  ; Pies juntos
70C0: 30              db 30h  ; Pies separados
70C1: 2C              db 2Ch  ; Pie atras
70C2: 28              db 28h  ; Pies juntos
70C3: 30              db 30h  ; Pies separados
70C4: 28              db 28h  ; Pies juntos
70C5: 30              db 30h  ; Pies eparados
70C6: E8              db 0E8h  ; Nube grande
70C7: EC              db 0ECh  ; Nube peque?
70C8: D4              db 0D4h  ; Destello
                    
                    ;----------------------------------------------------
                    ; Intenta saltar
                    ; Salta si no esta muy arriba y no hay obstaculos
                    ;----------------------------------------------------
                    
70C9 =              tryToJump:
70C9: CDFE71          call getYMomia
70CC: 7E              ld a, (hl)
70CD: FE08            cp 8
70CF: D8              ret c
70D0: CD3474          call chkSaltar
70D3: D0              ret nc
                    
                    
                    ;----------------------------------------------------
                    ; Pone estado de salto
                    ; Guarda puntero a los valores de desplazamientos Y del salto
                    ;----------------------------------------------------
                    
70D4 =              momiaSetSalta:
70D4: DDE5            push ix
70D6: E1              pop hl  ; Datos momia
                    
70D7 =              Salta: 
70D7: 3601            ld (hl), 1  ; Status = Saltar
70D9: 23              inc hl
70DA: CBA6            res 4, (hl)  ; Quita "Boton A" del estado de las teclas del elemento
                    
70DC: 3E0A            ld a, 0Ah
70DE: CD1040          call ADD_A_HL
70E1: 3602            ld (hl), 2  ; Frame 2 = Piernas separadas
70E3: 23              inc hl
70E4: 115775          ld de, valoresSalto
70E7: 73              ld (hl), e
70E8: 23              inc hl
70E9: 72              ld (hl), d  ; Guarda puntero a los valores del salto
                    
70EA: 23              inc hl
70EB: 3600            ld (hl), 0  ; Salto subiendo (1 = cayendo)
70ED: C9              ret
                    
                    ;----------------------------------------------------
                    ; Momia saltando
                    ; Actualiza las coordenadas de la momia y comprueba si choca
                    ; contra algo para quitar el estado de salto y
                    ; poner el de andar o caida.
                    ;----------------------------------------------------
                    
70EE =              momiaSaltando:
70EE: CDFE71          call getYMomia ; Obtiene puntero a los datos de la momia
70F1: 2B              dec hl
70F2: E5              push hl
70F3: DDE5            push ix
70F5: CDF474          call doSalto  ; Procesa el salto
                    
70F8: DDE1            pop ix
70FA: E1              pop hl
70FB: CD0B71          call chkPasaRoom ; Comprueba si pasa a otra habitacion
70FE: DDE5            push ix
7100: E1              pop hl  ; Puntero a estructura de la momia
                    
                    ; IF (VERSION2)
7101: 23              inc hl
7102: AF              xor a
7103: FE01            cp 1
7105: CD8A74          call chkChocaSalto1
                    ; ELSE
                    ;  call chkChocaSalto ; Choca con algo al saltar?
                    ; ENDIF
7108: 2834            jr z, momiaCayendo ; Si, quita estado de salto y pone el de caida (si no hay suelo) o de andar (si hay suelo)
710A: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba si el elemento llega a los limites de la pantalla
                    ; y pasa de habitacion
                    ; Out:
                    ;   Z = Pasa a otra habitacion
                    ;  NZ = No pasa
                    ;----------------------------------------------------
                    
710B =              chkPasaRoom:
710B: 7E              ld a, (hl)  ; Sentido
710C: 23              inc hl
710D: 23              inc hl
710E: 23              inc hl  ; Apunta a la X
710F: 0600            ld b, 0  ; Limite izquierdo = 0
7111: 1F              rra   ; Derecha o izquierda?
7112: 3001            jr nc, chkPasaRoom2
7114: 05              dec b  ; Limite derecho = 255
                    
7115 =              chkPasaRoom2:
7115: 78              ld a, b  ; Limite
7116: BE              cp (hl)  ; Lo compara con la X del elemento
7117: 23              inc hl
7118: C0              ret nz  ; No ha llegado al limite de la habitacion
                    
7119: 34              inc (hl)  ; Pasa a la habitacion de la derecha
711A: A7              and a
711B: C8              ret z
                    
711C: 35              dec (hl)
711D: 35              dec (hl)  ; Pasa a la habitacion de la izquierda
711E: C9              ret
                    
                    ;----------------------------------------------------
                    ; Cuando la momia llega al borde de una plataforma
                    ; puede saltar o dejarse caer
                    ;----------------------------------------------------
                    
711F =              momiaSinSuelo:
711F: DD7E14          ld a, (ix+ACTOR_TIPO)
7122: A7              and a
7123: 2819            jr z, momiaCayendo ; Momia mas tonta. Nunca salta
                    
7125: FE03            cp 3
7127: 2815            jr z, momiaCayendo
                    
7129: DD7E10          ld a, (ix+ACTOR_POS_RELAT) ; 0 = A la misma altura (o casi), 1 = Momia por encima, 2 = Por debajo
712C: FE01            cp 1  ; La momia esta por encima del prota?
712E: 280E            jr z, momiaCayendo ; Si, se deja caer para bajar
                    
7130: CDFE71          call getYMomia ; Obtiene la Y de la momia
7133: 7E              ld a, (hl)  ; (!?) No hace falta
7134: FE08            cp 8  ; Esta muy cerca de la parte de arriba?
7136: 3806            jr c, momiaCayendo ; No salta
                    
                    ; Va a saltar
7138: CD3474          call chkSaltar ; Tiene espacio para saltar?
713B: DAD470          jp c, momiaSetSalta ; si, salta
                    
                    
                    ;----------------------------------------------------
                    ; Procesa la caida de la momia y comprueba si llega al suelo
                    ; Al llegar al suelo pone el estado de andar
                    ;----------------------------------------------------
                    
                    
713E =              momiaCayendo:
713E: DDE5            push ix
7140: E1              pop hl
7141: CD6475          call cayendo  ; Incrementa la Y y comprueba si choca contra el suelo
7144: D27071          jp nc, setMomiaAndar ; No esta cayendo, pone estado de andar
7147: C9              ret
                    
7148 =              momiaEscaleras:
7148: DDE5            push ix
714A: E1              pop hl
714B: 23              inc hl
714C: 7E              ld a, (hl)  ; Controles
714D: E60C            and 0Ch
714F: C8              ret z  ; No va ni a la derecha ni a la izquierda
                    
7150: DD7E14          ld a, (ix+ACTOR_TIPO)
7153: 117971          ld de, pausaEscalera
7156: CD1540          call ADD_A_DE
7159: 1A              ld a, (de)  ; Masca aplicada al timer para ralentizar el movimiento de la momia en la escalera
715A: 47              ld b, a
715B: 3E01            ld a, 1
715D: 325FE0          ld (quienEscalera), a ; (!?) Se usa esto? Quien esta en una escalera 0 = Prota. 1 = Momia
7160: 325FE0          ld (quienEscalera), a ; (!?) Para que lo pone dos veces?
7163: CD7D75          call andaEscalera
7166: 2804            jr z, setMomiaPensar ; Ha llegado al final de la escalera
7168: CD5370          call momiaCalcFrame
716B: C9              ret
                    
716C =              setMomiaPensar:
716C: DD361100        ld (ix+ACTOR_TIMER), 0 ; Al poner el timer a 0 y el estado de andar se consigue pasar al estado de pensar en la siguiente iteracion
                    
7170 =              setMomiaAndar:
7170: AF              xor a
7171: 1802            jr setMomiaStatus
                    
                    
                    
7173: 3E03            ld a, 3  ; (!?) Este codigo no se ejecuta nunca!
                    
7175 =              setMomiaStatus:
7175: DD7700          ld (ix+ACTOR_STATUS), a
7178: C9              ret
                    
                    ;----------------------------------------------------
                    ; Frames que los tipos de momia se paran en cada paso
                    ; que dan por las escaleras
                    ; 0 = Muy rapido, 3 = lento
                    ;----------------------------------------------------
7179: 03            pausaEscalera: db 3
717A: 00              db 0
717B: 01              db 1
717C: 00              db 0
717D: 03              db 3
                    
                    ;----------------------------------------------------
                    ; Estado por defecto de la momia al empezar una partida
                    ; Espera un tiempo antes de aparecer
                    ; El timer vale #10 para que no aparezca nada mas empezar
                    ;----------------------------------------------------
                    
717E =              momiaLimbo:
717E: E1              pop hl  ; Saca de la pila la funcion que actualiza los atributos de la momia (no es visible)
717F: 3A03E0          ld a, (timer)
7182: E601            and 1
7184: C2B370          jp nz, chkLastMomia ; Procesa solo una de cada dos iteraciones
                    
7187: DD3511          dec (ix+ACTOR_TIMER)
718A: C2B370          jp nz, chkLastMomia ; Aun falta tiempo para que aparezca
                    
718D: DD3400          inc (ix+ACTOR_STATUS) ; Siguiente estado de la momia: Aparece
7190: DD361182        ld (ix+ACTOR_TIMER), 82h
                    
7194: 3E87            ld a, 87h  ; SFX aparece momia
7196: CDA97A          call setMusic
7199: C3B370          jp chkLastMomia ; Comprueba si faltan momias por procesar
                    
                    ;----------------------------------------------------
                    ; Proceso de aparicion de una momia
                    ; Decrementa el tiempo de aparicion. Al llegar al final pasa al estado 0
                    ; Si faltan menos de 8 iteraciones muestra la momia con las piernas abiertas mirando a la izquierda
                    ; Cada 32 frames anima la nube que indica que va a aparecer una momia
                    ;----------------------------------------------------
                    
719C =              momiaAparece:
719C: DD360108        ld (ix+ACTOR_CONTROL), 8 ; Mirando a la derecha
71A0: DD3511          dec (ix+ACTOR_TIMER) ; Decrementa el tiempo de aparicion
71A3: CABC71          jp z, setMomiaViva ; Ha llegado al final
                    
71A6: DD7E11          ld a, (ix+ACTOR_TIMER)
71A9: FE07            cp 7  ; Falta poco para que vuelva a la vida?
71AB: 3812            jr c, momiaOpenLegs ; Muestra la momia con las piernas separadas
                    
71AD: 47              ld b, a
71AE: E61F            and 1Fh
71B0: C0              ret nz  ; No han pasado 32 iteraciones
                    
71B1: CB68            bit 5, b
71B3: 3E08            ld a, 8  ; Frame nube grande
71B5: 2801            jr z, setMomiaFrame
                    
71B7: 3C              inc a  ; Frame nube peque?
                    
71B8 =              setMomiaFrame:
71B8: DD770B          ld (ix+ACTOR_FRAME), a
71BB: C9              ret
                    
71BC =              setMomiaViva:
71BC: CD7071          call setMomiaAndar
                    
71BF =              momiaOpenLegs:
71BF: DD360B02        ld (ix+ACTOR_FRAME), 2 ; Piernas separadas
71C3: C9              ret
                    
71C4 =              momiaSuicida:
71C4: DD360108        ld (ix+ACTOR_CONTROL), 8 ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha
71C8: DD3511          dec (ix+ACTOR_TIMER)
71CB: DD7E11          ld a, (ix+ACTOR_TIMER)
71CE: 47              ld b, a  ; (!?) Donde se unsa B?
71CF: 2809            jr z, mataMomia
71D1: E61F            and 1Fh
71D3: C0              ret nz
                    
71D4: 3E0A            ld a, 0Ah  ; Frame destello desaparecer
71D6: DD770B          ld (ix+ACTOR_FRAME), a
71D9: C9              ret
                    
71DA =              mataMomia:
71DA: CDE171          call quitaMomia
71DD: E1              pop hl
71DE: C3B370          jp chkLastMomia ; Comprueba si faltan momias por procesar
                    
                    
                    ;----------------------------------------------------
                    ; Manda una momia al limbo.
                    ; Quita su sprite de la pantalla.
                    ; Tras explotar una momia se va al limbo un rato
                    ;----------------------------------------------------
                    
71E1 =              quitaMomia:
71E1: CDF371          call getMomiaAtrib
71E4: 36E0            ld (hl), 0E0h ; Y = #E0. Quita momia de la pantalla
71E6: DD360004        ld (ix+ACTOR_STATUS), 4 ; Limbo
71EA: DD361180        ld (ix+ACTOR_TIMER), 80h
71EE: DD360B09        ld (ix+ACTOR_FRAME), 9
71F2: C9              ret
                    
                    ;----------------------------------------------------
                    ; Obtiene un puntero a los atributos RAM de la momia en proceso
                    ; HL = Puntero
                    ;----------------------------------------------------
                    
71F3 =              getMomiaAtrib:
71F3: 3A65E1          ld a, (momiaEnProceso)
71F6: 21C8E0          ld hl, enemyAttrib
                    
71F9 =              getMomiaAtrib2:
71F9: 87              add a, a
71FA: 87              add a, a
71FB: C31040          jp ADD_A_HL
                    
71FE =              getYMomia:
71FE: 3E03            ld a, 3  ; Coordenada Y
                    
                    ;----------------------------------------------------
                    ; Devuelve el valor A de la estructura de la momia actual
                    ; In: A = Valor a leer
                    ; Out: A = Valor leido
                    ;----------------------------------------------------
                    
7200 =              getVariableMomia:
7200: 2A62E1          ld hl, (pMomiaProceso) ; Puntero a los datos de la momia en proceso
7203: CD1040          call ADD_A_HL
7206: 7E              ld a, (hl)
7207: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; La momia piensa que hacer
                    ; Mira a los lados tantas veces como vale TIMER
                    ; In:
                    ;    IX = Datos momia
                    ;----------------------------------------------------
                    
7208 =              momiaPiensa:
7208: DD7E11          ld a, (ix+ACTOR_TIMER) ; Veces que duda
720B: B7              or a
720C: 2817            jr z, momiaPiensa2 ; Ya se lo ha pensado
                    
720E: FEE0            cp 0E0h
7210: 281B            jr z, momiaUnknown
                    
7212: DD360B02        ld (ix+ACTOR_FRAME), 2 ; Frame piernas separadas
7216: E603            and 3
7218: DD7702          ld (ix+ACTOR_SENTIDO), a ; Sentido en el que mira
                    
721B: 3A03E0          ld a, (timer)
721E: E61F            and 1Fh
7220: C0              ret nz  ; Permanece 32 frames en esa postura
                    
7221: DD3511          dec (ix+ACTOR_TIMER) ; Decrementa las veces que mira a los lados
7224: C0              ret nz  ; Aun tiene que pensarselo un poco mas
                    
7225 =              momiaPiensa2:
7225: CDC872          call momiaDecide ; Toma una decision para acercarse al prota
7228: DD360000        ld (ix+ACTOR_STATUS), 0 ; Estado: andar
722C: C9              ret
                    
                    ; (!?) Para que sirve esto?
                    
722D =              momiaUnknown:
722D: DD7E01          ld a, (ix+ACTOR_CONTROL) ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha
7230: EE0C            xor 1100b
7232: DD7701          ld (ix+ACTOR_CONTROL), a ; Invierte el sentido de la momia
7235: 1F              rra
7236: 1F              rra
7237: E603            and 3
7239: DD7702          ld (ix+ACTOR_SENTIDO), a ; 1 = Izquierda, 2 = Derecha
                    
723C: CDFE71          call getYMomia
723F: 01FC00          ld bc, 0FCh ; X+15,Y+12
7242: CDE150          call getMapOffset ; Obtiene en HL la direccion del mapa que corresponde a las coordenadas
7245: 47              ld b, a  ; (!?) Guarda el tile del mapa en B. Para que?
7246: E6F0            and 0F0h  ; Se queda con la familia o tipo de tile
7248: FE10            cp 10h
724A: C2C970          jp nz, tryToJump ; Salta si no hay un muro/plataforma en su parte inferior derecha
                    
724D: CDFE71          call getYMomia
7250: 01FC10          ld bc, 10FCh ; X+16, Y-4
7253: CDE150          call getMapOffset ; Obtiene en HL la direccion del mapa que corresponde a las coordenadas
7256: 47              ld b, a  ; (!?) Para que lo guarda en B?
7257: E6F0            and 0F0h
7259: FE10            cp 10h
725B: C2C970          jp nz, tryToJump ; salta si no hay un muro/plataforma en su parte superior derecha
725E: C3F56F          jp momiaVanish
                    
7261 =              momiaDesaparece:
7261: DD360108        ld (ix+ACTOR_CONTROL), 8 ; Anda a la derecha
                    
7265: DD3511          dec (ix+ACTOR_TIMER) ; Decrementa el tiempo de exploxion
                    
7268: DD7E11          ld a, (ix+ACTOR_TIMER)
726B: 47              ld b, a
726C: 2808            jr z, quitaACTOR_ ; Ha terminado el tiempo. La momia desaparece
                    
726E: E61F            and 1Fh
7270: C0              ret nz  ; No es multiplo de #20
                    
7271: DD360B0A        ld (ix+ACTOR_FRAME), 0Ah ; Destello desaparece
7275: C9              ret
                    
7276 =              quitaACTOR_:
7276: CDE171          call quitaMomia ; Quita el sprite de la pantalla y manda la momia al limbo (estado 4)
7279: DD3611FF        ld (ix+ACTOR_TIMER), 0FFh
727D: CDF86C          call initMomia
7280: E1              pop hl
7281: C3B370          jp chkLastMomia ; Comprueba si faltan momias por procesar
                    
                    
                    ;----------------------------------------------------
                    ; Evita que una momia aparezca por un lateral cuando el prota esta cerca
                    ; Si una momia se encuentra cerca del lateral de una
                    ; habitacion contigua, y el prota esta en el lateral adyacente
                    ; se cambia el sentido de la momia para que no aparezca 'por sorpresa'
                    ; y sin tiempo a reaccionar para poder esquivarla
                    ;----------------------------------------------------
                    
7284 =              evitaSorpresa:
7284: D9              exx   ; DE = Puntero estructura momia
7285: 210600          ld hl, 6  ; Offset a la variable 'room'
7288: 19              add hl, de
7289: 3A3AE1          ld a, (ProtaRoom) ; Parte alta de la coordenada X. Indica la habitacion de la piramide
728C: 46              ld b, (hl)  ; B = Habitacion momia
728D: BE              cp (hl)  ; Comprueba si la momia esta en la habitacion actual
728E: 2836            jr z, evitaSorpresa6 ; si
                    
7290: 2B              dec hl
7291: 7E              ld a, (hl)  ; X momia
7292: 0E50            ld c, 50h
7294: B9              cp c
7295: 3807            jr c, evitaSorpresa2 ; La X de la momia es menor de #50
                    
7297: 0EB0            ld c, 0B0h
7299: B9              cp c
729A: 382A            jr c, evitaSorpresa6 ; La X de la momia es menor de #B0. No se encuentra cerca de los bordes laterales
                    
729C: 04              inc b
729D: 04              inc b
                    
729E =              evitaSorpresa2:
729E: 05              dec b
729F: 3A3AE1          ld a, (ProtaRoom) ; Parte alta de la coordenada X. Indica la habitacion de la piramide
72A2: B8              cp b  ; Se encuentra en el lateral cercano a la habitacion en la que esta el prota?
72A3: 2021            jr nz, evitaSorpresa6 ; No
                    
72A5: AF              xor a
72A6: 91              sub c
72A7: 4F              ld c, a
72A8: FE50            cp 50h
72AA: 3A39E1          ld a, (ProtaX)
72AD: 2814            jr z, evitaSorpresa5
                    
72AF: B9              cp c
72B0: 3814            jr c, evitaSorpresa6
                    
72B2 =              evitaSorpresa3:
72B2: 23              inc hl
72B3: 3A3AE1          ld a, (ProtaRoom) ; Parte alta de la coordenada X. Indica la habitacion de la piramide
72B6: BE              cp (hl)  ; Habitacion de la momia
72B7: 3E08            ld a, 8  ; Cambia el sentido hacia la derecha
72B9: 3802            jr c, evitaSorpresa4
                    
72BB: 3E04            ld a, 4  ; Cambia el sentido hacia la izquierda
                    
72BD =              evitaSorpresa4:
72BD: 62              ld h, d
72BE: 6B              ld l, e  ; Puntero a la estructura de la momia
72BF: 23              inc hl
72C0: 77              ld (hl), a  ; Sentido en el que anda la momia
72C1: D9              exx
72C2: C9              ret
                    
72C3 =              evitaSorpresa5:
72C3: B9              cp c
72C4: 38EC            jr c, evitaSorpresa3
                    
72C6 =              evitaSorpresa6:
72C6: D9              exx
72C7: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; La momia toma una decision
                    ; Busca al prota y se mueve hacia el
                    ;----------------------------------------------------
                    
72C8 =              momiaDecide:
72C8: 3E05            ld a, 5
72CA: DD7711          ld (ix+ACTOR_TIMER), a
                    
72CD: CD5673          call buscaCercanias ; Mira si hay escaleras para subir o bajar en las cercanias (5 tiles a cada lado)
72D0: CD3373          call buscaProta ; Comprueba la posicion de la momia relativa al prota
72D3: A7              and a
72D4: 2806            jr z, momiaDecide2 ; A la misma altura
                    
72D6: 3D              dec a
72D7: 2849            jr z, setOrdenBajar ; La momia esta por encima
                    
72D9: 3D              dec a
72DA: 2850            jr z, setOrdenSubir ; La momia esta por debajo
                    
72DC =              momiaDecide2:
72DC: 3A3AE1          ld a, (ProtaRoom) ; Parte alta de la coordenada X. Indica la habitacion de la piramide
72DF: DDBE06          cp (ix+ACTOR_ROOM)
72E2: 2006            jr nz, momiaDecide3 ; estan en habitaciones distintas
                    
72E4: 3A39E1          ld a, (ProtaX)
72E7: DDBE05          cp (ix+ACTOR_X) ; Compara la X del prota con la X de la momia
                    
72EA =              momiaDecide3:
72EA: 3E08            ld a, 8  ; Control: Anda a la DERECHA
72EC: 3002            jr nc, momiaDecide4 ; El prota esta a la derecha
                    
72EE: 3E04            ld a, 4  ; Control: anda a la IZQUIERDA
                    
72F0 =              momiaDecide4:
72F0: DD7701          ld (ix+ACTOR_CONTROL), a ; Fija la direccion que debe seguir la momia para acercarse al prota
                    
72F3: 4F              ld c, a
72F4: 2137E1          ld hl, ProtaY
72F7: CDD650          call getMapOffset00 ; Obtiene puntero a la posicion del mapa del prota
72FA: EB              ex de, hl
72FB: CDFE71          call getYMomia
72FE: CDD650          call getMapOffset00 ; Obtiene puntero a la posicion del mapa de la momia
                    
                    
                    ; Comprueba si entre la momia y el prota hay algun obstaculo
                    ; De ser asi, intentara subir o bajar de donde se encuentra
                    
7301: 0620            ld b, 20h  ; Ancho de la habitacion
                    
7303 =              momiaDecide5:
7303: A7              and a
7304: E5              push hl  ; Mapa momia
7305: ED52            sbc hl, de
7307: E1              pop hl
7308: C8              ret z  ; Ha llegado a la posicion del prota en la busqueda
                    
7309: 7E              ld a, (hl)  ; Tipo de tile
730A: E6F0            and 0F0h  ; Se queda con la familia
730C: FE10            cp 10h  ; Es una plataforma o muro?
730E: 280A            jr z, momiaDecide7 ; Si
                    
7310: 2B              dec hl  ; Tile de la izquierda del mapa
7311: CB51            bit 2, c  ; Sentido en el que se mueve la momia
7313: 2002            jr nz, momiaDecide6 ; Va a la izquierda
                    
7315: 23              inc hl
7316: 23              inc hl  ; Tile de la derecha
                    
7317 =              momiaDecide6:
7317: 10EA            djnz momiaDecide5
7319: C9              ret
                    
731A =              momiaDecide7:
731A: ED57            ld a, i  ; Valor aleatorio
731C: 1F              rra
731D: B1              or c  ; Sentido en el que se mueve la momia
731E: 1F              rra
731F: DC2C73          call c, setOrdenSubir
                    
7322 =              setOrdenBajar:
7322: 2168E1          ld hl, ordenBajar
7325: 7E              ld a, (hl)  ; Se mueve hacia la escaleras mas lejanas (dentro del radio de busqueda) que bajan
7326: A7              and a
                    
7327 =              momiaSetControl:
7327: C8              ret z
7328: DD7701          ld (ix+ACTOR_CONTROL), a ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha
732B: C9              ret
                    
732C =              setOrdenSubir:
732C: 2166E1          ld hl, ordenSubir
732F: 7E              ld a, (hl)  ; Controles para dirigirse a la escalera mas lejana (dentro del radio de busqueda) que sube
7330: A7              and a
7331: 18F4            jr momiaSetControl
                    
                    
                    ;----------------------------------------------------
                    ; Calcula la posicion relativa de la momia respecto al prota
                    ; Out: A y B
                    ;   0 = Estan casi a la misma altura
                    ;   1 = La momia esta por encima
                    ;   2 = La momia esta por debajo
                    ;----------------------------------------------------
                    
7333 =              buscaProta:
7333: 0600            ld b, 0
7335: 1137E1          ld de, ProtaY
7338: CDFE71          call getYMomia ; Obtiene la Y de la momia
733B: 3A34E1          ld a, (protaStatus) ; 0 = Normal
                         ; 1 = Salto
                         ; 2 = Cayendo
                         ; 3 = Escaleras
                         ; 4 = Lanzando un cuhillo
                         ; 5 = Picando
                         ; 6 = Pasando por un apuerta giratoria
733E: FE03            cp 3  ; Escaleras?
7340: 2809            jr z, buscaProta2
                    
7342: 1A              ld a, (de)  ; Y del prota
7343: 96              sub (hl)  ; Le resta la Y de la momia
7344: 4F              ld c, a
7345: D60A            sub 10
7347: C612            add a, 18
7349: 3806            jr c, buscaProta3 ; Estan casi a la misma altura
                    
734B =              buscaProta2:
734B: 04              inc b
734C: 1A              ld a, (de)  ; Y del prota
734D: 96              sub (hl)  ; Y de la momia
734E: 3001            jr nc, buscaProta3 ; La momia esta por encima
7350: 04              inc b  ; La momia esta por debajo
                    
7351 =              buscaProta3:
7351: 78              ld a, b
7352: DD7710          ld (ix+ACTOR_POS_RELAT), a ; 0 = A la misma altura (o casi), 1 = Momia por encima, 2 = Por debajo
7355: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Busca en las cercanias de la momia para ver si hay
                    ; escaleras que suben, bajan o un muro
                    ; Dependiendo de lo que encuentre guardara las ordenes de subir o bajar
                    ;----------------------------------------------------
                    
7356 =              buscaCercanias:
7356: 0604            ld b, 4
7358: 2166E1          ld hl, ordenSubir
                    
735B =              buscaCercanias2:
735B: 3600            ld (hl), 0
735D: 23              inc hl
735E: 10FB            djnz buscaCercanias2 ; Borra ordenes de subir o bajar anteriores
                    
7360: DDE5            push ix  ; Datos momia
7362: E1              pop hl
                    
7363: 23              inc hl
7364: 08              ex af, af`
7365: 7E              ld a, (hl)  ; Controles: Sentido en el que va
7366: 08              ex af, af`
                    
7367: 23              inc hl
7368: 23              inc hl
7369: E5              push hl  ; Y
736A: CD7273          call buscaCercanias3 ; Busca primero en el sentido actual
736D: E1              pop hl
736E: 08              ex af, af`
736F: EE0C            xor 0Ch  ; Invierte sentido para buscar en el contrario al que va
7371: 08              ex af, af`
                    
7372 =              buscaCercanias3:
7372: CDFE71          call getYMomia
7375: 010800          ld bc, 8  ; (!?) Con poner 'ld c,8' bastaria
7378: 41              ld b, c  ; Punto central de la momia
7379: CDE150          call getMapOffset ; Obtiene en HL la direccion del mapa que corresponde a las coordenadas
                    
737C: 08              ex af, af`
737D: 2B              dec hl  ; Tile a la izquierda de la momia
737E: CB57            bit 2, a  ; Va a la izquierda?
7380: 2002            jr nz, buscaCercanias4 ; Si, va a la izquierda
                    
7382: 23              inc hl
7383: 23              inc hl  ; Tile a la derecha de la momia
                    
7384 =              buscaCercanias4:
7384: 08              ex af, af`
7385: 0600            ld b, 0  ; contador de desplazamientos X en la busqueda
                    
7387 =              buscaCercanias5:
7387: 08              ex af, af`
7388: 2B              dec hl  ; desplaza la busqueda un tile a la izquierda
7389: CB57            bit 2, a  ; Va a la izquierda?
738B: 2002            jr nz, buscaCercanias6 ; si, va a la izquierda
                    
738D: 23              inc hl
738E: 23              inc hl  ; desplaza la busqueda un tile a la derecha
                    
738F =              buscaCercanias6:
738F: 08              ex af, af`
7390: 7E              ld a, (hl)  ; tile del mapa
7391: E6F0            and 0F0h  ; se queda con la familia o tipo de tile
7393: FE10            cp 10h  ; es un muro o plataforma?
7395: C8              ret z  ; si
                    
7396: FE20            cp 20h  ; Es una escalera?
7398: 2809            jr z, buscaCercanias7 ; Ha encontrado una escalera
                    
739A: FE30            cp 30h  ; Es un cuchillo?
739C: 200D            jr nz, buscaCercanias8
                    
739E: 7E              ld a, (hl)
739F: FE30            cp 30h  ; Es un cuchillo clavado en el suelo?
73A1: 2808            jr z, buscaCercanias8
                    
73A3 =              buscaCercanias7:
73A3: 0E01            ld c, 1  ; Orden subir
73A5: 1167E1          ld de, distSubida
73A8: CDCC73          call guardaOrden
                    
73AB =              buscaCercanias8:
73AB: E5              push hl
73AC: 3E60            ld a, 60h  ; Ancho de las 3 habitaciones
73AE: CD1040          call ADD_A_HL ; Apunta a la fila inferior (yTile+1)
73B1: 7E              ld a, (hl)  ; lee el tile del mapa
73B2: 4F              ld c, a
73B3: E1              pop hl
73B4: E6F0            and 0F0h  ; Se queda con el tipo de tile
73B6: 280F            jr z, momiaBaja ; Esta vacio
                    
73B8: 79              ld a, c  ; Tile del mapa
73B9: E60F            and 0Fh
73BB: FE05            cp 5  ; Escaleras que bajan?
73BD: D4C773          call nc, momiaBaja ; Si, da orden de bajar
                    
73C0: 04              inc b
73C1: 3E05            ld a, 5
73C3: B8              cp b  ; Ha buscado ya 5 posiciones en una direccion?
73C4: 20C1            jr nz, buscaCercanias5
73C6: C9              ret
                    
73C7 =              momiaBaja:
73C7: 0E02            ld c, 2  ; Orden bajar
73C9: 1169E1          ld de, distBajada
                    
73CC =              guardaOrden:
73CC: 1A              ld a, (de)
73CD: B8              cp b
73CE: D0              ret nc  ; La orden existente tiene mas prioridad (va a las escaleras mas lejanas?)
                    
73CF: 78              ld a, b
73D0: 12              ld (de), a  ; Distancia a las escaleras
73D1: 1B              dec de
73D2: 08              ex af, af`
73D3: F5              push af
73D4: E6FC            and 0FCh  ; Mantiene el sentido de la busqueda
73D6: B1              or c  ; A?de orden de subir o bajar
73D7: 12              ld (de), a  ; Guarda la orden
73D8: F1              pop af
73D9: 08              ex af, af`
73DA: C9              ret
                    
                    ;----------------------------------------------------
                    ; Obtiene datos de la momia en proceso
                    ; Out:
                    ; IX = Datos momia
                    ; (pMomiaData) = Puntero datos momia
                    ;----------------------------------------------------
                    
73DB =              getMomiaProcDat:
73DB: 2165E1          ld hl, momiaEnProceso
73DE: 7E              ld a, (hl)
                    
73DF =              getMomiaDat:
73DF: 47              ld b, a
73E0: CB20            sla b
73E2: 78              ld a, b
73E3: CB20            sla b
73E5: 80              add a, b
73E6: CB20            sla b
73E8: CB20            sla b
73EA: 80              add a, b  ; x22
73EB: D9              exx
73EC: 216AE1          ld hl, momiaDat ; Estructuras de las momias
73EF: CD1040          call ADD_A_HL
73F2: E5              push hl
73F3: 2262E1          ld (pMomiaProceso), hl ; Puntero a los datos de la momia en proceso
73F6: DDE1            pop ix
73F8: EB              ex de, hl
73F9: D9              exx
73FA: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Actualiza las coordenadas de un elemento segun su velocidad X
                    ; In:
                    ;  DE = velocida. D = Parte entera, E = Parte decimal
                    ; Out:
                    ;  A,D = Coordenada X
                    ;  E = Decimales X
                    ;----------------------------------------------------
                    
                    
73FB =              mueveProta:
73FB: 2138E1          ld hl, ProtaXdecimal ; 'Decimales' usados en el calculo de la X. Asi se consiguen velocidades menores a 1 pixel
73FE: ED5B3BE1        ld de, (protaSpeed) ; El byte bajo indica la parte "decimal" y el alto la entera
                    
7402 =              mueveElemento:
7402: DDE5            push ix
7404: E5              push hl
7405: E5              push hl
7406: 7E              ld a, (hl)
7407: 23              inc hl
7408: 66              ld h, (hl)
7409: 6F              ld l, a
740A: DDE1            pop ix
740C: DD4602          ld b, (ix+2) ; Habitacion
740F: DD4E05          ld c, (ix+5) ; Desplazamiento habitacion
7412: DD7EFE          ld a, (ix-2) ; Sentido del movimiento
7415: 1F              rra
7416: 300A            jr nc, mueveElemento2 ; Va hacia la derecha
7418: 79              ld a, c
7419: 2F              cpl
741A: 4F              ld c, a
741B: 7A              ld a, d
741C: 2F              cpl
741D: 57              ld d, a
741E: 7B              ld a, e
741F: 2F              cpl
7420: 5F              ld e, a
7421: 13              inc de
                    
7422 =              mueveElemento2:
7422: 19              add hl, de  ; Suma desplazamiento
7423: 78              ld a, b  ; Habitacion actual
7424: 89              adc a, c  ; Suma desplazamiento X alto, por si ha cambiado de habitacion
7425: 47              ld b, a
7426: DD7E01          ld a, (ix+1) ; Coordenada X
7429: EB              ex de, hl
742A: E1              pop hl
742B: 73              ld (hl), e  ; X decimales
742C: 23              inc hl
742D: 72              ld (hl), d  ; X
742E: DD7002          ld (ix+2), b ; Room
7431: DDE1            pop ix
7433: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba si puede realizar un salto mirando si hay
                    ; techo sobre el elemento, si el salto es solamente vertical
                    ; Si es con desplazamiento, comprueba si tienen un muro delante
                    ; (y si el techo es mazizo?)
                    ; Out:
                    ;   NC = No puede saltar
                    ;----------------------------------------------------
                    
7434 =              chkSaltar:
7434: E5              push hl
7435: 2B              dec hl
7436: 2B              dec hl
7437: 7E              ld a, (hl)  ; Controles del elemento
7438: E1              pop hl
7439: FE10            cp 10h  ; Salto vertical sin desplazamiento lateral?
743B: 282D            jr z, chkChocaTecho ; Si, solo comprueba que no tenga techo sobre la cabeza
                    
                    ;---------------------------------------
                    ; El salto es con desplazamiento lateral
                    ; Comprueba si tiene un muro delante
                    ;---------------------------------------
743D: CD6A74          call chkChocaTecho
7440: D0              ret nc  ; Ha chocado
                    
7441: 2B              dec hl
7442: 7E              ld a, (hl)  ; Sentido
7443: 23              inc hl
7444: 010403          ld bc, 304h ; Offset para la parte superior izquierda
7447: CB1F            rr a
7449: 3802            jr c, chkIncrustUp ; Izquierda
                    
744B: 060C            ld b, 0Ch  ; Offset X parte derecha
                    
744D =              chkIncrustUp:
744D: C5              push bc
744E: CDB750          call chkTocaMuro ; Z = choca
7451: C1              pop bc  ; Recupera offset coordendas de choque
7452: 2806            jr z, chkTechoMazizo ; Ha chocado
                    
7454: CD7A74          call chkTocaY_8 ; Decrementa en 8 el offset Y y comprueba si choca
7457: C8              ret z
                    
7458: 37              scf
7459: C9              ret
                    
745A =              chkTechoMazizo:
745A: CD7A74          call chkTocaY_8 ; Decrementa en 8 el offset Y y comprueba si choca
745D: C8              ret z  ; Choca
                    
745E: CD7A74          call chkTocaY_8 ; Decrementa en 8 el offset Y y comprueba si choca
7461: C8              ret z  ; Choca
                    
7462: 0608            ld b, 8  ; Parte central X del elemento
7464: CDB750          call chkTocaMuro ; Z = choca
7467: C8              ret z  ; Choca
                    
7468: 37              scf   ; No choca
7469: C9              ret
                    
                    ;----------------------------------------------------
                    ; Comprueba si choca mientras salta
                    ; Out: Carry = No choca
                    ;----------------------------------------------------
                    
746A =              chkChocaTecho:
746A: 01FE04          ld bc, 4FEh
746D: CDB750          call chkTocaMuro ; Z = choca
7470: C8              ret z
                    
7471: 01FE0A          ld bc, 0AFEh
7474: CDB750          call chkTocaMuro ; Z = choca
7477: C8              ret z
                    
7478: 37              scf   ; No choca
7479: C9              ret
                    
747A =              chkTocaY_8:
747A: 79              ld a, c  ; Decrementa en 8 el offset Y y comprueba si choca
747B: D608            sub 8
747D: 4F              ld c, a
747E: C5              push bc
747F: CDB750          call chkTocaMuro ; Z = choca
7482: C1              pop bc
7483: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Comprueba si choca con algo mientras salta, ya sea mientras
                    ; sube o mientras cae
                    ; Out:
                    ;   Z = Ha chocado con algo al saltar. Termina el salto
                    ;----------------------------------------------------
                    
7484 =              chkChocaSalto:
7484: 23              inc hl
7485: 3A43E1          ld a, (sentidoEscalera) ; Valor de los controles en el momento del salto. As?se sabe si fue un salto vertical
7488: FE10            cp 10h  ; Boton A apretado? (Hold jump)
748A =              chkChocaSalto1:
748A: 23              inc hl
748B: 56              ld d, (hl)  ; Sentido
748C: 23              inc hl
748D: 2837            jr z, chkChocaCae ; Esta apretado.
                    
748F: DD7E05          ld a, (ix+ACTOR_X)
7492: E607            and 7
7494: FE04            cp 4  ; Esta en medio de un tile?
7496: 202E            jr nz, chkChocaCae ; No
                    
                    ;------------------------------
                    ; Comprueba si choca por arriba
                    ;------------------------------
7498: 7A              ld a, d  ; Sentido
7499: 1F              rra
749A: 010003          ld bc, 300h ; Offset superior izquierdo
749D: 3802            jr c, chkChocaSalto2 ; Va a la izquierda
749F: 060C            ld b, 0Ch  ; Offset derecho
                    
74A1 =              chkChocaSalto2:
74A1: D5              push de
74A2: CDB750          call chkTocaMuro ; Z = choca
74A5: D1              pop de
74A6: 283A            jr z, ajustaPasillo ; Comprueba si se ha encajado en un pasillo (muro por arriba y por abajo)
                    
                    ;----------------------------------------
                    ; Comprueba si choca con la parte central
                    ;----------------------------------------
                    
74A8 =              chkChocaSalto3:
74A8: 7A              ld a, d  ; Sentido
74A9: 010803          ld bc, 308h ; Offset central izquierdo
74AC: 1F              rra
74AD: 3802            jr c, chkChocaSalto4 ; Va a la izquierda
74AF: 060C            ld b, 0Ch  ; Offset derecho
                    
74B1 =              chkChocaSalto4:
74B1: D5              push de
74B2: CDB750          call chkTocaMuro ; Conca con la parte central?
74B5: D1              pop de
74B6: 281A            jr z, setFinSalto ; Si, termina el salto
                    
                    ;------------------------------------------
                    ; Comprueba si choca con la parte de abajo
                    ;------------------------------------------
                    
74B8: 7A              ld a, d  ; Sentido
74B9: 1F              rra
74BA: 010E03          ld bc, 30Eh ; Offset inferior izquierdo
74BD: 3802            jr c, chkChocaSalto5 ; Va a la izquierda
74BF: 060C            ld b, 0Ch  ; Derecho
                    
74C1 =              chkChocaSalto5:
74C1: CDB750          call chkTocaMuro ; Z = choca
74C4: 280C            jr z, setFinSalto ; Si, termina el salto
                    
74C6 =              chkChocaCae:
74C6: DD7E0E          ld a, (ix+ACTOR_JUMPSENT) ; 0 = Subiendo, 1 = Cayendo
74C9: A7              and a  ; Esta subiendo o cayendo?
74CA: 2812            jr z, setNZ ; Subiendo
                    
74CC: CD7E50          call chkChocaSuelo ; Comprueba si choca con el suelo mientras cae
74CF: DAD974          jp c, chkLlegaSuelo ; No ha chocado
                    
74D2 =              setFinSalto:
74D2: 7E              ld a, (hl)  ; Y
74D3: E6F8            and 0F8h
74D5: 77              ld (hl), a  ; Ajusta la coordenada Y a multiplo de 8 descartando los valores menores de 8
                    
74D6: AF              xor a
74D7: A7              and a  ; Set Z, fin del salto
74D8: C9              ret
                    
                    ; Comprueba si ha llegado al nivel del suelo
                    
74D9 =              chkLlegaSuelo:
74D9: CDAD50          call chkPisaSuelo
74DC: 28F4            jr z, setFinSalto ; Si, esta en el suelo
                    
74DE =              setNZ: 
74DE: AF              xor a
74DF: FE01            cp 1  ; Set NZ
74E1: C9              ret
                    
                    ;----------------------------------------------------
                    ; Se llama a esta funcion si al saltar ha chocado con algo por la parte superior
                    ; Comprueba si bajo los pies hay suelo y ajusta la Y en ese caso
                    ;----------------------------------------------------
                    
74E2 =              ajustaPasillo:
74E2: 7A              ld a, d  ; Sentido
74E3: 011403          ld bc, 314h ; Offset medio tile por debajo del elemento (izquierda)
74E6: 1F              rra
74E7: 3802            jr c, ajustaPasillo2
74E9: 060C            ld b, 0Ch  ; Derecha
                    
74EB =              ajustaPasillo2:
74EB: D5              push de
74EC: CDB750          call chkTocaMuro ; Z = choca
74EF: D1              pop de
74F0: 28E0            jr z, setFinSalto ; Y
                    
74F2: 18B4            jr chkChocaSalto3
                    
                    
                    ;----------------------------------------------------
                    ; Salto
                    ; Si se esta ejecutando el ending, los valores del salto se multiplican x4
                    ; Dependiendo de la direccion que este pulsada, salta a la derecha o a la izquierda
                    ; Recorre la tabla de desplazamientos hasta llegar al final. Entonces
                    ; indica que hay que recorrerla al reves para caer de la misma forma que se subio
                    ; Si llega al final nuevamente (inicio), cae a velocidad maxima y continua asi
                    ;----------------------------------------------------
                    
74F4 =              doSalto:
74F4: 3A00E0          ld a, (GameStatus)
74F7: FE0A            cp 0Ah  ; Status = Final del juego (ending)?
74F9: 2804            jr z, doSalto2 ; Si, esta en el final del juego
                    
74FB: AF              xor a  ; No esta en el final del juego.
74FC: 3204E0          ld (waitCounter), a ; Lo pone a cero para no multiplicar los calores del salto x4
                    
74FF =              doSalto2:
74FF: E5              push hl
7500: E5              push hl
7501: 3E0A            ld a, 0Ah
7503: CD1040          call ADD_A_HL
7506: 5E              ld e, (hl)
7507: 23              inc hl
7508: 56              ld d, (hl)  ; DE = Puntero a los desplazamientos del salto
7509: 23              inc hl
750A: 46              ld b, (hl)  ; Sentido del salto: Subiendo o bajando?
750B: E1              pop hl
750C: DDE1            pop ix
750E: 2B              dec hl
                    
750F: 7E              ld a, (hl)  ; Teclas pulsadas
7510: 23              inc hl
7511: 23              inc hl
7512: 23              inc hl
7513: 23              inc hl
7514: E60C            and 0Ch  ; Se queda solo con derecha e izquierda
7516: 2807            jr z, doSalto3
                    
7518: 35              dec (hl)  ; Decrementa la X
7519: CB57            bit 2, a  ; Izquierda = 4
751B: 2002            jr nz, doSalto3
                    
751D: 34              inc (hl)  ; Derecha = 8
751E: 34              inc (hl)  ; Incrementa la X
                    
751F =              doSalto3:
751F: 1A              ld a, (de)  ; Desplazamiento Y del salto
7520: 3C              inc a  ; Ha llegado al final de la tabla?
7521: 282C            jr z, saltoCaeMax ; Si, cae a la maxima velocidad
                    
7523: 3D              dec a  ; Restaura el valor de desplazamiento
7524: 4F              ld c, a  ; Lo guarda en C
                    
7525: 3A04E0          ld a, (waitCounter)
7528: 3D              dec a
7529: 3D              dec a
752A: 79              ld a, c
752B: 2002            jr nz, chkSaltoSubBaj ; Salta si waitCounter no es 2
                    
752D: 87              add a, a
752E: 87              add a, a  ; Multiplica el desplazamiento x4
                    
752F =              chkSaltoSubBaj:
752F: 05              dec b
7530: 04              inc b  ; Sube o cae?
7531: 2002            jr nz, saltoUpdate ; Sube
7533: ED44            neg   ; Cae, asi que pasa el valor a negativo
                    
7535 =              saltoUpdate:
7535: CD5175          call saltoUpdateY ; Actualiza la coordenada Y del elemento que esta saltando
7538: 13              inc de  ; Siguiente posicion de la lista de desplazamientos
                    
7539: 78              ld a, b  ; Sentido del salto
753A: A7              and a  ; Sube o cae?
753B: 2802            jr z, saltoUpdate3 ; Sube
                    
753D: 1B              dec de  ; Recorre la lista hacia atras
                    
753E =              saltoUpdate2:
753E: 1B              dec de
                    
753F =              saltoUpdate3:
753F: DD730A          ld (ix+0Ah), e
7542: DD720B          ld (ix+0Bh), d ; Guarda puntero a los desplazamientos del salto
7545: 1A              ld a, (de)
7546: FEFE            cp 0FEh  ; Ha llegado al final de la tabla? (Punto mas alto del salto)
7548: C0              ret nz  ; No
                    
7549: DD360C01        ld (ix+0Ch), 1 ; Cambia el sentido del salto. Comienza a caer
                         ; Para ello recorre la misma lista hacia atras
754D: 18EF            jr saltoUpdate2 ; Decrementa el puntero para dejarlo en un valor valido
                    
754F =              saltoCaeMax:
754F: 3E04            ld a, 4
                    
7551 =              saltoUpdateY:
7551: 2B              dec hl
7552: 2B              dec hl
7553: 86              add a, (hl)
7554: 77              ld (hl), a
7555: C9              ret
                    
                    ;----------------------------------------------------
                    ; Desplazamientos aplicados a la Y del elemento cuando salta
                    ;----------------------------------------------------
7556: FF              db 0FFh  ; Fin del salto. Cae a maxima velocidad
7557: 04            valoresSalto: db 4
7558: 02              db 2
7559: 02              db 2
755A: 02              db 2
755B: 01              db 1
755C: 01              db 1
755D: 02              db 2
755E: 00              db 0
755F: 01              db 1
7560: 01              db 1
7561: 00              db 0
7562: 00              db 0
7563: FE              db 0-2  ; Final de la tabla. Comienza la caida
                    
                    ;----------------------------------------------------
                    ; Pone estado de cayendo
                    ; Actualiza coordenada Y debido a la caida y comprueba si choca contra el suelo
                    ; Out:
                    ;   C = Cae
                    ;  NC = Esta sobre suelo
                    ;----------------------------------------------------
                    
7564 =              cayendo:
7564: 3602            ld (hl), 2  ; Estado de cayendo
7566: 23              inc hl
7567: 23              inc hl
7568: 23              inc hl
7569: 7E              ld a, (hl)  ; Y
756A: E6FC            and 0FCh
756C: 77              ld (hl), a  ; Ajusta la Y a multiplo de 4
                    
756D: E5              push hl
756E: CD9850          call chkCae
7571: E1              pop hl
7572: D0              ret nc  ; Esta pisando algo
                    
7573: 7E              ld a, (hl)  ; Y
7574: C604            add a, 4  ; Incrementa la Y en 4
7576: E6FC            and 0FCh
7578: 77              ld (hl), a  ; Ajusta la Y a multiplo de 4
                    
7579: AF              xor a
757A: D601            sub 1  ; Set Carry
757C: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Mueve a un personaje por las escaleras
                    ; Out:
                    ;    Z = Ha llegado al final de las escaleras
                    ;----------------------------------------------------
                    
757D =              andaEscalera:
757D: 3A03E0          ld a, (timer)
7580: A0              and b  ; Mascara para ralentizar la velocidad en las escaleras
7581: C0              ret nz
                    
7582: 23              inc hl
7583: 4E              ld c, (hl)  ; Sentido
7584: 23              inc hl
7585: 23              inc hl
7586: 23              inc hl
7587: 7E              ld a, (hl)  ; X
7588: 2B              dec hl
7589: 2B              dec hl  ; Apunta a la Y
758A: E603            and 3
758C: 2006            jr nz, andaEscalera2 ; La X no es multiplo de 4
                    
758E: E5              push hl  ; Apunta a la Y
758F: CD1D51          call chkFinEscalera ; Comprueba si llega al final de la escalera
7592: E1              pop hl
7593: C8              ret z  ; Si, ha llegado al final
                    
7594 =              andaEscalera2:
7594: 79              ld a, c  ; Sentido
7595: 23              inc hl
7596: 23              inc hl
7597: 34              inc (hl)  ; Incrementa la X
7598: 1F              rra
7599: 3002            jr nc, andaEscalera3 ; Va a la derecha
759B: 35              dec (hl)
759C: 35              dec (hl)  ; Decrementa la X. Va a la izquierda
                    
759D =              andaEscalera3:
759D: E5              push hl
759E: 3E0A            ld a, 0Ah
75A0: CD1040          call ADD_A_HL ; Apunta al sentido de las escaleras (+#0f)
75A3: 7E              ld a, (hl)
75A4: 2B              dec hl
75A5: 2B              dec hl
75A6: 2B              dec hl
75A7: 2B              dec hl
75A8: 2B              dec hl
75A9: 34              inc (hl)  ; Contador de movimiento
75AA: E1              pop hl  ; Apunta a la X
                    
75AB: 81              add a, c  ; Sentido escalera + sentido movimiento
75AC: 0601            ld b, 1  ; Baja
75AE: CB47            bit 0, a
75B0: 2802            jr z, andaEscalera4
75B2: 06FF            ld b, 0-1  ; Sube
                    
75B4 =              andaEscalera4:
75B4: 2B              dec hl
75B5: 2B              dec hl  ; Apunta a la Y
75B6: 7E              ld a, (hl)  ; Y
75B7: 80              add a, b  ; Suma desplazamineto vertical
75B8: 77              ld (hl), a  ; Actualiza la coordenada Y dependiendo del sentido de la escalera y hacia donde se mueve
                    
75B9: AF              xor a
75BA: FE01            cp 1  ; Set NZ
75BC: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Muestra el final del juego
                    ;----------------------------------------------------
                    
75BD =              ShowEnding:
75BD: C5              push bc
75BE: CD754B          call updateSprites
75C1: C1              pop bc
75C2: 1020            djnz showEnding2
                    
75C4: 213C77          ld hl, protaEndingDat ; Datos preparados para el ending (el prota sale de la piramide, anda a la izquierda y salta)
75C7: 1134E1          ld de, protaStatus ; Destino: estructura del prota
75CA: 010C00          ld bc, 0Ch  ; Numero de datos a copiar
75CD: EDB0            ldir
                    
75CF: CDFA4C          call setAttribProta ; Actualiza atributos de los sprites del prota
75D2: 21E075          ld hl, controlsEnding ; Izquierda, Izquierda+Salto
75D5: 2280E0          ld (keyPressDemo), hl ; Puntero a los controles grabados
75D8: 3E88            ld a, 88h
75DA: 3282E0          ld (KeyHoldCntDemo), a
                    
75DD =              nextSubStatus_:
75DD: C33C41          jp NextSubStatus
                    
                    
75E0: 041B          controlsEnding: db 4, 1Bh
75E2: 14FF            db 14h, 0FFh ; Izquierda, Izquierda+Salto
                    
                    ;----------------------------------------------------
                    ; Anda hasta el centro de la pantalla y salta
                    ;----------------------------------------------------
                    
75E4 =              showEnding2:
75E4: 101C            djnz showEnding3
75E6: CDD645          call ReplaySavedMov ; Reproduce movimientos grabados del ending (andar izquierda y saltar)
75E9: CD594C          call AI_Prota ; Mueve y anima al prota
75EC: 3A53E0          ld a, (flagVivo)
75EF: A7              and a
75F0: C0              ret nz  ; Se ha terminado la demo
                    
75F1: CD614D          call setProtaSalta_ ; Salta
                    
75F4: 2136E1          ld hl, sentidoProta ; 1 = Izquierda, 2 = Derecha
75F7: 77              ld (hl), a  ; (!?) A = #3F No parece que tenga un valor puesto a proposito
75F8: 3D              dec a  ; #3E?
75F9: 2B              dec hl
75FA: 77              ld (hl), a  ; ProntaControl
75FB: 3E02            ld a, 2
75FD: 3204E0          ld (waitCounter), a
7600: 18DB            jr nextSubStatus_
                    
                    ;----------------------------------------------------
                    ; Espera a que termine el salto
                    ;----------------------------------------------------
                    
7602 =              showEnding3:
7602: 100A            djnz showSpecialBonus
7604: CD594C          call AI_Prota ; Mueve y anima al prota
7607: 3A42E1          ld a, (flagSalto) ; 0 = Saltando, 1 = En el suelo
760A: B7              or a
760B: C8              ret z  ; Aun no ha terminado el salto
760C: 18CF            jr nextSubStatus_
                    
                    ;----------------------------------------------------
                    ; Muestra texto de CONGRATULATIONS, SPECIAL BONUS y suma 10.000 puntos
                    ;----------------------------------------------------
                    
760E =              showSpecialBonus:
760E: 100D            djnz waitEnding
7610: CDAC6E          call VidaExtra ; Suma una vida extra
7613: CD1D78          call specialBonus ; Muestra texto de CONGARTULATIONS, SPECIAL BONUS y suma 10.000 puntos
7616: 3ED0            ld a, 0D0h
7618: 3204E0          ld (waitCounter), a
761B: 18C0            jr nextSubStatus_
                    
                    ;----------------------------------------------------
                    ; Espera un rato mientras esta el texto en pantalla
                    ; Pasa a estado "Stage clear"
                    ;----------------------------------------------------
                    
761D =              waitEnding:
761D: 100B            djnz setupEnding
761F: 2104E0          ld hl, waitCounter
7622: 35              dec (hl)
7623: C0              ret nz
                    
7624: 3E08            ld a, 8  ; status: Stage clear
7626: 3200E0          ld (GameStatus), a
7629: C9              ret
                    
                    ;----------------------------------------------------
                    ; Prepara todo para mostrar el final
                    ; - Oculta los sprites y muestra la cortinilla
                    ; - Carga los sprites del porta con el pico
                    ; - Pone la musica del juego
                    ; - Borra todo el mapa RAM
                    ;----------------------------------------------------
                    
762A =              setupEnding:
762A: CD5643          call hideSprAttrib ; Oculta los sprites
762D: CD3043          call drawCortinilla ; Dibuja la cortinilla
7630: F0              ret p  ; No ha terminado con la cortinilla
                    
7631: 3E20            ld a, 20h
7633: CDBB4E          call cogeObjeto ; Hace que el prota lleve el pico
                    
7636: 3E8B            ld a, 8Bh  ; Ingame music
7638: CDA97A          call setMusic
                    
763B: CD9A6D          call BorraMapaRAM
763E: 2100E7          ld hl, MapaRAMRoot ; La primera fila del mapa no se usa (ocupada por el marcador). Tambien usado como inicio de la pila
7641: 1101E7          ld de,  MapaRAMRoot+1 ; La primera fila del mapa no se usa (ocupada por el marcador). Tambien usado como inicio de la pila
7644: 012007          ld bc, 720h
7647: 3600            ld (hl), 0  ; Tile vacio
7649: EDB0            ldir
                    
764B: 218024          ld hl, 2480h ; VRAM address pattern generator table = Pattern #90
764E: 11E276          ld de, endingTiles
7651: CDF144          call UnpackPatterns
                    
7654: 218004          ld hl, 480h ; VRAM address color table = pattern #90
7657: 111377          ld de, endingColors
765A: CDF144          call UnpackPatterns
                    
765D: 211F39          ld hl, 391Fh ; VRAM address name table = Posicion pico piramide grande derecha
7660: 0E90            ld c, 90h
7662: AF              xor a
7663: CDB376          call drawHalfPiram
                    
7666: 21033A          ld hl, 3A03h ; VRAM address name table = Posicion vertice izquierdo piramide mediana izquierda
7669: 0E92            ld c, 92h
766B: CDB376          call drawHalfPiram
                    
766E: 212B3A          ld hl, 3A2Bh ; VRAM address name table = Posicion vert. izq. piramide peque? central
7671: CDB376          call drawHalfPiram
                    
7674: 21043A          ld hl, 3A04h ; VRAM address name table = Posicion vertice superior lado derecho piramide mediana izquierda
7677: 0E94            ld c, 94h
7679: 3C              inc a  ; Lado derecho de las piramides
767A: CDB376          call drawHalfPiram
                    
767D: 212C3A          ld hl, 3A2Ch ; VRAM address name table = Posicion vertice superior lado derecho piramide peque? central
7680: CDB376          call drawHalfPiram
                    
7683: 112F77          ld de, tilesEndDoor ; Patrones que forman la puerta de la piramide grande
7686: 010203          ld bc, 302h ; Alto = 3 tiles, ancho = 2 tiles
7689: 211E3A          ld hl, 3A1Eh ; VRAM address name table = Posicion de la puerta
768C: CDC865          call DEtoVRAM_NXNY ; Dibuja la puerta en pantalla
                    
768F: 3E96            ld a, 96h  ; Patron suelo de arena
7691: 21603A          ld hl, 3A60h ; VRAM address name table = Suelo
7694: 012000          ld bc, 20h  ; Ancho de la pantalla
7697: CDAB44          call setFillVRAM ; Dibuja el suelo
769A: CD0744          call renderMarcador
                    
769D: 113577          ld de, starsLocations
76A0: 0606            ld b, 6  ; Numero de estrellas en el cielo
                    
76A2 =              drawStars:
76A2: 1A              ld a, (de)  ; Byte bajo de la direccion VRAM tabla de nombres (semicoordenada) de la estrella
76A3: 6F              ld l, a
76A4: 2639            ld h, 39h  ; Byte alto de la direccion VRAM de la tabla de nombres
76A6: 3E97            ld a, 97h  ; Patron estrella
76A8: CD4D00          call WRTVRM  ; Dibuja la estrella
76AB: 13              inc de  ; Siguiente estrella
76AC: 10F4            djnz drawStars
                    
76AE =              nextSubstatus2:
76AE: 2101E0          ld hl, subStatus
76B1: 34              inc (hl)
76B2: C9              ret
                    
                    ;----------------------------------------------------
                    ; Dibuja media piramide (triangulo rectangulo)
                    ; Pinta la piramide desde la altura del vertice hasta que llega al suelo, incrementando el ancho en cada linea
                    ; In:
                    ;  HL = VRAM address name table
                    ;   C = Patron diagonal piramide / o \. (C+1)= Patron relleno
                    ;   A = Lado de la piramide que pinta (0 = izquierdo, 1 = derecho)
                    ;----------------------------------------------------
                    
76B3 =              drawHalfPiram:
76B3: 0600            ld b, 0  ; Contador del ancho de la fila actual de la piramide
                    
76B5 =              chkVertice:
76B5: E5              push hl  ; Guarda direccion VRAM del eje de la piramide
76B6: C5              push bc  ; Guarda el ancho de la linea actual de la piramide
76B7: 05              dec b
76B8: 04              inc b  ; Es cero el ancho? (Es el vertice superior?)
76B9: 280F            jr z, drawVertice ; Coloca el vertice de la piramide
                    
76BB =              drawRelleno:
76BB: 08              ex af, af`         ; Guarda la direccion de pintado
76BC: 79              ld a, c  ; Tile de arista / o \
76BD: 3C              inc a  ; Lo pasa a tile de relleno
76BE: CD4D00          call WRTVRM  ; Tile de relleno de la piramide
76C1: 08              ex af, af`         ; Recupera la direccion de pintado
76C2: 2B              dec hl  ; Se mueve un patron a la izquierda
76C3: A7              and a  ; Lado de la piramide que tiene que pintar?
76C4: 2802            jr z, drawRelleno2
                    
76C6: 23              inc hl
76C7: 23              inc hl  ; Se mueve un patron a la derecha
                    
76C8 =              drawRelleno2:
76C8: 10F1            djnz drawRelleno ; Aun faltan patrones por pintar de la fila actual de la piramide
                    
76CA =              drawVertice:
76CA: C1              pop bc  ; Recupera el ancho actual de la fila de la piramide
76CB: 04              inc b  ; Incrementa contador del ancho de la piramide
76CC: 08              ex af, af`         ; Guarda la direccion de pintado indicada en A
76CD: 79              ld a, c  ; Vertice de la piramide / patron diagonal
76CE: CD4D00          call WRTVRM  ; Dibuja el patron en pantalla
76D1: 08              ex af, af`         ; Recupera la direccion de pintado
                    
76D2: E1              pop hl  ; Recupera la direccion VRAM del eje central de la piramide
76D3: 112000          ld de, 20h  ; Distancia al tile inferior
76D6: 19              add hl, de  ; Coloca puntero VRAM un tile mas abajo
76D7: E5              push hl  ; Guarda direccion VRAM del eje central
76D8: A7              and a
76D9: 11803A          ld de, 3A80h ; VRAM address name table por debajo de la linea del suelo
76DC: ED52            sbc hl, de  ; Comprueba si ya se ha pintado la piramide hasta el suelo
76DE: E1              pop hl
76DF: 38D4            jr c, chkVertice ; Continua pintando otra fila de la piramide
                    
76E1: C9              ret
                    
                    
                    ;----------------------------------------------------
                    ; Tiles usados para dibujar el escenario final
                    ; Tiles:
                    ;   - Lateral dcho. ladrillo, relleno ladrillo (piramide cercana)
                    ;   - Lateral dcho. arenisca, relleno arenisca (piramide lejana)
                    ;   - Lateral izdo. arenisca oscura, relleno arenisca oscura
                    ;   - Arena del suelo
                    ;   - Estrella del cielo
                    ;----------------------------------------------------
76E2: 88000206000F2F6F0003FE8100  endingTiles: db 88h, 0, 2, 6, 0, 0Fh, 2Fh, 6Fh, 0, 3, 0FEh, 81h, 0
76EF: 03EF88000103070F1F3F7F09FF    db 3, 0EFh, 88h, 0, 1, 3, 7, 0Fh, 1Fh, 3Fh, 7Fh, 9, 0FFh
76FC: 8780C0E0F0F8FCFE09FF    db 87h, 80h, 0C0h, 0E0h, 0F0h, 0F8h, 0FCh, 0FEh, 9, 0FFh
7706: 8755AA55AA669966080081    db 87h, 55h, 0AAh, 55h, 0AAh, 66h, 99h, 66h, 8, 0, 81h
7711: C000            db 0C0h, 0
                    
                    ;----------------------------------------------------
                    ; Tabla de colores de los tiles de fondo anteriores
                    ;----------------------------------------------------
7713: 886060A0A06060A0A002  endingColors: db 88h, 60h, 60h, 0A0h, 0A0h, 60h, 60h, 0A0h, 0A0h, 2
771D: 6002A0026002A01080106004    db 60h, 2, 0A0h, 2, 60h, 2, 0A0h, 10h, 80h, 10h, 60h, 4
7729: 8A046A085000    db 8Ah, 4, 6Ah, 8, 50h, 0
                    
                    
                    ;----------------------------------------------------
                    ; Patrones que forman la puerta de la piramide del final del juego
                    ;----------------------------------------------------
772F: 636400656667  tilesEndDoor: db 63h, 64h, 0, 65h, 66h, 67h
                    
                    ;----------------------------------------------------
                    ; Bytes bajos de la direccion VRAM de la tabla de nombres donde se pintan las estrellas
                    ; El byte alto es fijo = #39
                    ;----------------------------------------------------
7735: 09163867748EA9  starsLocations: db 9, 16h, 38h, 67h, 74h, 8Eh, 0A9h
                    
                    
                    ;----------------------------------------------------
                    ; Datos del prota para el ending
                    ; Status, Control, sentido, Y, decimales, X, habitacion, speed decimales, speed X, Speed room, movCnt, frame
                    ; Andar, izquierda, izquierda, Y=#88, 0, X=#F0, 0, spd=#C0
                    ;----------------------------------------------------
773C: 0004018800F000C000000000  protaEndingDat: db 0, 4, 1, 88h, 0, 0F0h, 0, 0C0h, 0, 0, 0, 0
                    
                    
                    ;----------------------------------------------------
                    ; Setup pergamino
                    ;----------------------------------------------------
                    
7748 =              setupPergamino:
7748: CD5643          call hideSprAttrib
774B: 114178          ld de, gfxMap ; Patrones del pergamino con el mapa de piramides
774E: 210026          ld hl, 2600h ; VRAM address pattern #C0
7751: CDF144          call UnpackPatterns ; Descomprime los patrones en VRAM
                    
7754: 11EA78          ld de, colorTableMap ; Tabla de color de los patrones del mapa
7757: 210006          ld hl, 600h ; VRAM address color table pattern #C0
775A: CDF144          call UnpackPatterns ; Descomprime tabla de colores
                    
775D: 111379          ld de, gfxSprMapa ; Sprites usados en el mapa (silueta piramide y flechas)
7760: CD1445          call unpackGFXset ; Descomprime sprites
                    
7763: AF              xor a
7764: 3230E1          ld (statusEntrada), a
7767: 3240E1          ld (timerPergam2), a ; Se usa para hacer una pausa tras terminar de sonar la musica del pergamino al llegar al GOAL
                    
776A: 3E91            ld a, 91h  ; Musica pergamino
776C: CDA97A          call setMusic
                    
776F: 3A54E0          ld a, (piramideActual)
7772: CD2E78          call setPiramidMap ; Coloca la silueta para resaltar la piramide actual
                    
7775: 3A57E0          ld a, (puertaSalida) ; Direccion de la salida de la piramide
7778: 11797A          ld de, numSprFlechas ; Numero de sprites de las flechas
                    
777B =              setFlechaMap:
777B: D5              push de
777C: CB3F            srl a
777E: FE04            cp 4
7780: 2001            jr nz, setFlechaMap2
7782: 3D              dec a  ; Convierte valores 1,2,4,8 en 0,1,2,3
                    
7783 =              setFlechaMap2:
7783: F5              push af
7784: 87              add a, a
7785: 21717A          ld hl, offsetFlechas
7788: CD1040          call ADD_A_HL
778B: 11FCE0          ld de, attrPiramidMap ; Atributos del sprite usado para resaltar una piramide en el mapa (silueta)
778E: 0100E1          ld bc, attrFlechaMap ; Atributos de la flecha del mapa
7791: 1A              ld a, (de)  ; Y de la piramide
7792: 86              add a, (hl)  ; Le suma el desplazamiento que le corresponde a la flecha
7793: 02              ld (bc), a  ; Y de la flecha
7794: 23              inc hl
7795: 13              inc de
7796: 03              inc bc
7797: 1A              ld a, (de)  ; X de la piramide
7798: 86              add a, (hl)  ; Le suma el desplazamiento
7799: 02              ld (bc), a  ; X de la flecha
779A: 03              inc bc
779B: F1              pop af  ; Recupera la direccion de la flecha
779C: D1              pop de  ; Puntero al numero de sprite que corresponde cada direccion
779D: CD1540          call ADD_A_DE
77A0: 1A              ld a, (de)  ; Sprite que corresponde a la direccion de salida
77A1: 02              ld (bc), a  ; Sprite de la flecha
77A2: C9              ret
                    
                    ;----------------------------------------------------
                    ;
                    ; Coloca la flecha en la casilla "GOAL" del mapa
                    ;
                    ;----------------------------------------------------
                    
77A3 =              setFlechaGoal:
77A3: 21FCE0          ld hl, attrPiramidMap ; Atributos del sprite usado para resaltar una piramide en el mapa (silueta)
77A6: E5              push hl
77A7: 3697            ld (hl), 97h
77A9: 23              inc hl
77AA: 367B            ld (hl), 7Bh
77AC: 3E01            ld a, 1  ; Flecha por arriba
77AE: CDBE77          call setFlechaInvert
77B1: E1              pop hl
77B2: 36C3            ld (hl), 0C3h
77B4: C9              ret
                    
                    ;----------------------------------------------------
                    ;
                    ; Actualiza las coordenadas y los sprites del mapa de piramides
                    ; Sprites: flecha y silueta de piramide
                    ;
                    ;----------------------------------------------------
                    
77B5 =              setDestinoMap:
77B5: 3A55E0          ld a, (piramideDest)
77B8: CD2E78          call setPiramidMap
77BB: 3A56E0          ld a, (puertaEntrada)
                    
77BE =              setFlechaInvert:
77BE: 117D7A          ld de, numSprFlechInv
77C1: 18B8            jr setFlechaMap
                    
                    ;----------------------------------------------------
                    ;
                    ; Logica del mapa de piramides
                    ;
                    ;----------------------------------------------------
                    
77C3 =              tickPergamino:
77C3: 3A03E0          ld a, (timer)
77C6: E607            and 7  ; 8 colores de animacion
77C8: 214B7A          ld hl, coloresFlecha ; Colores usados para resaltar la flecha y piramide en el mapa
77CB: CD1040          call ADD_A_HL
77CE: 7E              ld a, (hl)
77CF: 32FFE0          ld (colorPiramidMap), a ; Color del outline de la piramide en el mapa
77D2: 3203E1          ld (colorFlechaMap), a ; Color de la flecha que indica a que piramide vamos en el mapa
77D5: CD754B          call updateSprites
                    
77D8: CD114C          call chkPause ; Comprueba si se pulsa F1 en el mapa
                    
77DB: 2154E0          ld hl, piramideActual
77DE: 7E              ld a, (hl)
77DF: 23              inc hl
77E0: 96              sub (hl)
77E1: 2130E1          ld hl, statusEntrada
77E4: 34              inc (hl)
77E5: FE0E            cp 0Eh  ; Ultima piramide?
77E7: 7E              ld a, (hl)
77E8: 280C            jr z, setEndingStat
                    
77EA: FE58            cp 58h  ; Ciclos que muestra la flecha de salida
77EC: 28C7            jr z, setDestinoMap
                    
77EE: FEE0            cp 0E0h  ; Ciclos que muestra la flecha de entrada
77F0: C0              ret nz
                    
77F1: 3C              inc a
77F2: 320DE0          ld (flagEndPergamino), a ; 1 = Ha terminado de mostar el pergamino/mapa
77F5: C9              ret
                    
77F6 =              setEndingStat:
77F6: FE58            cp 58h  ; Hay que cambiar la posicion de la flecha al destino?
77F8: 28A9            jr z, setFlechaGoal ; Coloca la flecha sobre GOAL
                    
77FA: 3A10E0          ld a, (MusicChanData)
77FD: B7              or a
77FE: C0              ret nz  ; Aun suena musica
                    
77FF: 2140E1          ld hl, timerPergam2 ; Se usa para hacer una pausa tras terminar de sonar la musica del pergamino al llegar al GOAL
7802: 7E              ld a, (hl)
7803: 34              inc (hl)
7804: FE80            cp 80h
7806: C0              ret nz  ; Hace una pausa al terminar de sonar la musica
                    
7807: 2158E0          ld hl, numFinishGame ; Numero de veces que se ha terminado el juego
780A: 34              inc (hl)  ; Incrementa el numero de veces que se ha terminado el juego
                    
780B: AF              xor a
780C: 23              inc hl
780D: 77              ld (hl), a
780E: 54              ld d, h
780F: 5D              ld e, l
7810: 13              inc de
7811: 010A00          ld bc, 0Ah
7814: 79              ld a, c  ; A = Status #A
7815: EDB0            ldir   ; Borra 10 bytes de variables desde numFinishedGame
                    
7817: CD3842          call setGameStatus ; Pone status #A = Ending
781A: C3B441          jp ResetSubStatus ; (!?) Ya lo hace en la anterior llamada
                    
                    ;----------------------------------------------------
                    ; Muestra texto de "CONGRATULATIONS" "SPECIAL BONUS"
                    ; Y suma 10.000 puntos
                    ;----------------------------------------------------
                    
781D =              specialBonus:
                    ; IF (VERSION2)
781D: 11817A          ld de, TXT_ENDING
7820: CD1445          call unpackGFXset
7823: 110050          ld de, 5000h
7826: D5              push de
7827: CD1244          call SumaPuntos
782A: D1              pop de
782B: C31244          jp SumaPuntos
                    ; ELSE
                    ;  ld de, TXT_ENDING
                    ;  call unpackGFXset
                    ;  ld de, 5000h
                    ;  call SumaPuntos
                    ;  ld de, 5000h
                    ;  jp SumaPuntos
                    ; ENDIF
                    
                    ;----------------------------------------------------
                    ; Pone las coordenadas de la silueta de la piramide actual
                    ;----------------------------------------------------
                    
782E =              setPiramidMap:
782E: 3D              dec a
782F: 87              add a, a
7830: 21537A          ld hl, coordPiramMap
7833: CD1040          call ADD_A_HL
7836: 11FCE0          ld de, attrPiramidMap ; Atributos del sprite usado para resaltar una piramide en el mapa (silueta)
7839: EDA0            ldi   ; Y
783B: EDA0            ldi   ; X
783D: EB              ex de, hl
783E: 36E4            ld (hl), 0E4h ; Sprite de la silueta de la piramide
7840: C9              ret
                    
                    ;----------------------------------------------------
                    ; Graficos del pergamino con el mapa de piramides
                    ;----------------------------------------------------
7841: A00103070F1F3F0F0380C0E0  gfxMap:  db 0A0h, 1, 3, 7, 0Fh, 1Fh, 3Fh, 0Fh, 3, 80h, 0C0h, 0E0h
784D: F0F8FCF0C00103070F1F3F    db 0F0h, 0F8h, 0FCh, 0F0h, 0C0h, 1, 3, 7, 0Fh, 1Fh, 3Fh
7858: 0F0380C0E0F0F8FCF0C0    db 0Fh, 3, 80h, 0C0h, 0E0h, 0F0h, 0F8h, 0FCh, 0F0h, 0C0h
7862: 050081FF0F8081FF070081FF    db 5, 0, 81h, 0FFh, 0Fh, 80h, 81h, 0FFh, 7, 0, 81h, 0FFh
786E: 070081FF0A01080308C0A3FF    db 7, 0, 81h, 0FFh, 0Ah, 1, 8, 3, 8, 0C0h, 0A3h, 0FFh
787A: 3849819D4938FFFFE113    db 38h, 49h, 81h, 9Dh, 49h, 38h, 0FFh, 0FFh, 0E1h, 13h
7884: 121312E2FFFFC86828E8    db 12h, 13h, 12h, 0E2h, 0FFh, 0FFh, 0C8h, 68h, 28h, 0E8h
788E: 282FFF0103070F1F3F7F7FF0    db 28h, 2Fh, 0FFh, 1, 3, 7, 0Fh, 1Fh, 3Fh, 7Fh, 7Fh, 0F0h
789A: F9FD07FF03DF91CB898000    db 0F9h, 0FDh, 7, 0FFh, 3, 0DFh, 91h, 0CBh, 89h, 80h, 0
78A5: 81D1F3F3FBFFFF0F1F3F    db 81h, 0D1h, 0F3h, 0F3h, 0FBh, 0FFh, 0FFh, 0Fh, 1Fh, 3Fh
78AF: 3F7F7F05FF8AF7F3D783    db 3Fh, 7Fh, 7Fh, 5, 0FFh, 8Ah, 0F7h, 0F3h, 0D7h, 83h
78B9: 85F8F8F0FAFE05FF047F    db 85h, 0F8h, 0F8h, 0F0h, 0FAh, 0FEh, 5, 0FFh, 4, 7Fh
78C3: 073F077F043F0B0F0D1F0480    db 7, 3Fh, 7, 7Fh, 4, 3Fh, 0Bh, 0Fh, 0Dh, 1Fh, 4, 80h
78CF: 0CC003F00CE00BF006E006    db 0Ch, 0C0h, 3, 0F0h, 0Ch, 0E0h, 0Bh, 0F0h, 6, 0E0h, 6
78DA: 80040007800CC0078006000480    db 80h, 4, 0, 7, 80h, 0Ch, 0C0h, 7, 80h, 6, 0, 4, 80h
78E7: 02C000          db 2, 0C0h, 0
                    
78EA: 058F036F059F088F83616F6F  colorTableMap: db 5, 8Fh, 3, 6Fh, 5, 9Fh, 8, 8Fh, 83h, 61h, 6Fh, 6Fh
78F6: 059F83818F8F301F116F064F    db 5, 9Fh, 83h, 81h, 8Fh, 8Fh, 30h, 1Fh, 11h, 6Fh, 6, 4Fh
7902: 026F064F026F064F816F08E078    db 2, 6Fh, 6, 4Fh, 2, 6Fh, 6, 4Fh, 81h, 6Fh, 8, 0E0h, 78h
790F: F048F000        db 0F0h, 48h, 0F0h, 0
                    
                    
                    ;----------------------------------------------------
                    ; Sprites usados en el mapa de piramides
                    ; Silueta piramide, flecha arriba, derecha, abajo, izquierda
                    ;----------------------------------------------------
7913: 201F          gfxSprMapa: dw 1F20h  ; Direccion VRAM sprite #E4
7915: 880609102040C0300F0A0085    db 88h, 6, 9, 10h, 20h, 40h, 0C0h, 30h, 0Fh, 0Ah, 0, 85h
7921: 80402030C009008410387C    db 80h, 40h, 20h, 30h, 0C0h, 9, 0, 84h, 10h, 38h, 7Ch
792C: FE03383200871018FCFEFC    db 0FEh, 3, 38h, 32h, 0, 87h, 10h, 18h, 0FCh, 0FEh, 0FCh
7937: 1810033884FE7C38103200    db 18h, 10h, 3, 38h, 84h, 0FEh, 7Ch, 38h, 10h, 32h, 0
7942: 8710307EFE7E301080    db 87h, 10h, 30h, 7Eh, 0FEh, 7Eh, 30h, 10h, 80h
                    
794B: 6738            dw #3867
794D: 91              db 91h  ; Transfiere #11 patrones
794E: 2000303932212D29241B33002D21300020    db 20h, 0, 30h, 39h, 32h, 21h, 2Dh, 29h, 24h, 1Bh, 33h, 0, 2Dh, 21h, 30h, 0, 20h ; Text: "- Pyramid's Map -"
                    
                    
                      ; Tabla de nombres del pergamino
795F: 4F0085CFD0      db 4Fh, 0, 85h, 0CFh, 0D0h
7964: 0101D2040188D0D3010101D2D0    db 1, 1, 0D2h, 4, 1, 88h, 0D0h, 0D3h, 1, 1, 1, 0D2h, 0D0h
7971: D50F0081D8100181DC0E00    db 0D5h, 0Fh, 0, 81h, 0D8h, 10h, 1, 81h, 0DCh, 0Eh, 0
797C: 92DB01C0C3C7C7C2C3C7    db 92h, 0DBh, 1, 0C0h, 0C3h, 0C7h, 0C7h, 0C2h, 0C3h, 0C7h
7986: C7C2C3C7C8010101DF0E00    db 0C7h, 0C2h, 0C3h, 0C7h, 0C8h, 1, 1, 1, 0DFh, 0Eh, 0
7991: 81D90C0185C9010101E00E00    db 81h, 0D9h, 0Ch, 1, 85h, 0C9h, 1, 1, 1, 0E0h, 0Eh, 0
799D: 92DA0101C4C7C2C3C7C7    db 92h, 0DAh, 1, 1, 0C4h, 0C7h, 0C2h, 0C3h, 0C7h, 0C7h
79A7: C7C2C3C7C2C10101E10E    db 0C7h, 0C2h, 0C3h, 0C7h, 0C2h, 0C1h, 1, 1, 0E1h, 0Eh
79B1: 0084D70101C50D0181DD0E00    db 0, 84h, 0D7h, 1, 1, 0C5h, 0Dh, 1, 81h, 0DDh, 0Eh, 0
79BD: 030189C6C2C3C7C7C2C3    db 3, 1, 89h, 0C6h, 0C2h, 0C3h, 0C7h, 0C7h, 0C2h, 0C3h
79C7: C7C8050181E20E0081D60A    db 0C7h, 0C8h, 5, 1, 81h, 0E2h, 0Eh, 0, 81h, 0D6h, 0Ah
79D2: 0181C9050181E30E008DD801    db 1, 81h, 0C9h, 5, 1, 81h, 0E3h, 0Eh, 0, 8Dh, 0D8h, 1
79DE: C4C2C3C7C2C3C7C7C7    db 0C4h, 0C2h, 0C3h, 0C7h, 0C2h, 0C3h, 0C7h, 0C7h, 0C7h
79E7: C2C1040181E40E0083DB01C5    db 0C2h, 0C1h, 4, 1, 81h, 0E4h, 0Eh, 0, 83h, 0DBh, 1, 0C5h
79F3: 0E0181DF0E0092D901C6C7    db 0Eh, 1, 81h, 0DFh, 0Eh, 0, 92h, 0D9h, 1, 0C6h, 0C7h
79FE: C7C7C2C3C7C2C3C7C7    db 0C7h, 0C7h, 0C2h, 0C3h, 0C7h, 0C2h, 0C3h, 0C7h, 0C7h
7A07: C2C10101E00E0081DA0C0185    db 0C2h, 0C1h, 1, 1, 0E0h, 0Eh, 0, 81h, 0DAh, 0Ch, 1, 85h
7A13: C9010101DE0E0081D7080189C4    db 0C9h, 1, 1, 1, 0DEh, 0Eh, 0, 81h, 0D7h, 8, 1, 89h, 0C4h
7A20: C7C7C7C2C10101E50E0007    db 0C7h, 0C7h, 0C7h, 0C2h, 0C1h, 1, 1, 0E5h, 0Eh, 0, 7
7A2B: 0185CACCCDCECB050181E6    db 1, 85h, 0CAh, 0CCh, 0CDh, 0CEh, 0CBh, 5, 1, 81h, 0E6h
7A36: 0E0084D6D1D4D104018AD4    db 0Eh, 0, 84h, 0D6h, 0D1h, 0D4h, 0D1h, 4, 1, 8Ah, 0D4h
7A41: 010101D1D10101D1E700    db 1, 1, 1, 0D1h, 0D1h, 1, 1, 0D1h, 0E7h, 0
                      
7A4B: 0106060A0A060606  coloresFlecha: db 1, 6, 6, 0Ah, 0Ah, 6, 6, 6 ; Colores usados para resaltar la flecha y piramide en el mapa
                    
                    
                    ;----------------------------------------------------
                    ;
                    ; Coordenadas en pantalla de las piramides del mapa
                    ; Y, X
                    ;----------------------------------------------------
7A53: 3F4A          coordPiramMap: db 3Fh, 4Ah
7A55: 3F6A            db 3Fh, 6Ah
7A57: 3F8A            db 3Fh, 8Ah
7A59: 4FA2            db 4Fh, 0A2h
7A5B: 4F8A            db 4Fh, 8Ah
7A5D: 4F62            db 4Fh, 62h
7A5F: 5F5A            db 5Fh, 5Ah
7A61: 5F7A            db 5Fh, 7Ah
7A63: 6F92            db 6Fh, 92h
7A65: 6F6A            db 6Fh, 6Ah
7A67: 6F52            db 6Fh, 52h
7A69: 7F6A            db 7Fh, 6Ah
7A6B: 7F82            db 7Fh, 82h
7A6D: 7FA2            db 7Fh, 0A2h
7A6F: 8FA2            db 8Fh, 0A2h
                    
7A71: F902          offsetFlechas: db 0F9h, 2
7A73: 0802            db 8, 2
7A75: F9F1            db 0F9h, 0F1h
7A77: F904            db 0F9h, 4
                    
                    ;----------------------------------------------------
                    ; Numero de sprites de las flechas
                    ;----------------------------------------------------
7A79: E8            numSprFlechas: db 0E8h
7A7A: F0              db 0F0h  ; Abajo
7A7B: F4              db 0F4h  ; Izquierda
7A7C: EC              db 0ECh  ; Derecha
                    
                    ;----------------------------------------------------
                    ; Numero de sprites de las flechas invertidas
                    ;----------------------------------------------------
7A7D: F0            numSprFlechInv: db 0F0h
7A7E: E8              db 0E8h  ; Arriba
7A7F: EC              db 0ECh  ; Derecha
7A80: F4              db 0F4h  ; Izquierda
                    
                    
7A81 =              TXT_ENDING:
7A81: C938            dw #38c9  ; Direccion VRAM
7A83: 8F              db 8Fh
7A84: 232F2E27322134352C2134292F2E33    db 23h, 2Fh, 2Eh, 27h, 32h, 21h, 34h, 35h, 2Ch, 21h, 34h, 29h, 2Fh, 2Eh, 33h ; "CONGRATULATIONS"
7A93: 2E00            db #2e, 0  ; Rellena #2e patrones
7A95: 90              db 90h  ; Transfiere #10 patrones
7A96: 3330252329212C00222F2E3533000011    db 33h, 30h, 25h, 23h, 29h, 21h, 2Ch, 0, 22h, 2Fh, 2Eh, 35h, 33h, 0, 0, 11h ; "SPECIAL BONUS  1"
                      
7AA6: 0410            db 4, 10h  ; "0000"
7AA8: 00              db 0  ; Fin
                    
                    ;----------------------------------------------------
                    ;
                    ; Set music
                    ; In:
                    ;   A = Numero de musica o efecto
                    ;----------------------------------------------------
                    
7AA9 =              setMusic:
                    ; IF (VERSION2)
7AA9: F3              di
7AAA: CDAF7A          call SetMusic_
7AAD: FB              ei
7AAE: C9              ret
                    ; ELSE
                    ;  di
                    ;  push hl
                    ;  push de
                    ;  push bc
                    ;  push af
                    ;  push ix
                    ;  call SetMusic_
                    ;  pop ix
                    ;  pop af
                    ;  pop bc
                    ;  pop de
                    ;  pop hl
                    ;  ei
                    ;  ret
                    ; ENDIF
                     
7AAF =              SetMusic_:
7AAF: 4F              ld c, a
7AB0: E63F            and 3Fh
7AB2: 0602            ld b, 2  ; Canales a usar
7AB4: 2112E0          ld hl, musicCh1
7AB7: FE0B            cp 0Bh  ; Es una efecto de sonido de los que suenan mientras suena la musica principal?
7AB9: 3807            jr c, setSFX
                    
7ABB: FE11            cp 11h  ; Es una musica que suena en solitario y usa los 3 canales?
7ABD: 3807            jr c, setMus
                    
7ABF: 04              inc b  ; Usa los 3 canales
7AC0: 1804            jr setMus
                    
7AC2 =              setSFX: 
7AC2: 05              dec b  ; Solo usa 1 canal
7AC3: 212EE0          ld hl, musicCh3 ; El canal 3 es el que reproduce los efectos de sonido
                    
7AC6 =              setMus: 
7AC6: 7E              ld a, (hl)  ; Musica que esta sonando en este canal
7AC7: E63F            and 3Fh  ; Descarta bits de configuracion y se queda solo con el numero de musica
7AC9: 5F              ld e, a  ; E = Sonido actual
7ACA: 79              ld a, c
7ACB: E63F            and 3Fh  ; A = Sonido que se quiere reproducir
7ACD: BB              cp e  ; Tiene mas prioridad el que esta sonando o el nuevo?
7ACE: D8              ret c  ; El que esta sonando tiene mas prioridad
                    
7ACF: 87              add a, a
7AD0: 11F37C          ld de, MusicIndex-2
7AD3: CD1540          call ADD_A_DE ; Obtiene puntero a los datos de la musica o efecto que hay que reproducir
7AD6: 2B              dec hl
7AD7: 2B              dec hl
                    
7AD8 =              setChanData:
7AD8: E5              push hl
7AD9: DDE1            pop ix
7ADB: 3601            ld (hl), 1  ; Contador de la duracion de la nota
7ADD: 23              inc hl
7ADE: 3601            ld (hl), 1  ; Duracion por defecto de la nota
7AE0: 23              inc hl
7AE1: 71              ld (hl), c  ; Musica que esta reproduciendo el canal
                    
7AE2: 23              inc hl
7AE3: 1A              ld a, (de)
7AE4: 77              ld (hl), a  ; Byte bajo del puntero a los datos de la musica/efecto
7AE5: 23              inc hl
7AE6: 13              inc de
7AE7: 1A              ld a, (de)
7AE8: 77              ld (hl), a  ; Byte alto del puntero
                    
7AE9: DD360900        ld (ix+9), 0
7AED: 3E0A            ld a, 0Ah
7AEF: CD1040          call ADD_A_HL ; Apunta al siguiente canal
7AF2: 13              inc de
7AF3: 10E3            djnz setChanData
7AF5: C9              ret
                    
                    ;----------------------------------------------------
                    ; Pattern loop
                    ; Comando = #FE xx
                    ;  xx = Numero de veces a repetir el pattern musical
                    ;  FF = Loop infinito
                    ;----------------------------------------------------
                    
7AF6 =              patternLoop:
7AF6: 23              inc hl  ; Parametro del comando loop
7AF7: DD7E09          ld a, (ix+MUSIC_CNT_LOOP) ; Veces que se ha reproducido un pattern
7AFA: 3C              inc a  ; Incrementa el numero de veces que ha sonado el pattern
7AFB: BE              cp (hl)  ; Ha sonado tantas veces como se indica?
7AFC: 2813            jr z, omiteLoop
                    
7AFE: FA027B          jp m, setMusPattern ; Es un loop infinito?
7B01: 3D              dec a  ; No incrementa el numero de veces que ha sonado
                    
7B02 =              setMusPattern:
7B02: DD7709          ld (ix+MUSIC_CNT_LOOP), a ; Veces que se ha reproducido un pattern
7B05: 23              inc hl
7B06: 7E              ld a, (hl)  ; Direccion baja del pattern
7B07: DD7703          ld (ix+MUSIC_ADD_LOW), a
7B0A: 23              inc hl
7B0B: 7E              ld a, (hl)  ; Direccion alta del pattern
7B0C: DD7704          ld (ix+MUSIC_ADD_HIGH), a
7B0F: 1809            jr contProcessSnd ; Interpretar el pattern
                    
7B11 =              omiteLoop:
7B11: 23              inc hl
7B12: 23              inc hl  ; Descarta direccion del loop
7B13: AF              xor a
7B14: DD7709          ld (ix+MUSIC_CNT_LOOP), a ; Inicializa contador de repeticiones del pattern
7B17: CDE17C          call incMusicPoint
                    
7B1A =              contProcessSnd:
7B1A: DD3400          inc (ix+MUSIC_CNT_NOTA) ; Este comando no modifica la duracion de la nota
7B1D: C3917B          jp processSndData
                    
                    ;----------------------------------------------------
                    ; Alterna entre el tono o ruido del canal 3
                    ; In:
                    ;   C = Canal en proceso 1, 3, 5 (1-3)
                    ;   D:
                    ;    1 = Activa tono canal 3 y desactiva ruido
                    ;    0 = Desactiva tono canal 3 y activa ruido
                    ;----------------------------------------------------
                    
7B20 =              switchCh3OnOff:
7B20: 79              ld a, c
7B21: FE05            cp 5  ; Es el canal 3?
7B23: C0              ret nz  ; No
                    
7B24: 15              dec d
7B25: 2804            jr z, toneOnCh123
                    
7B27: 3E9C            ld a, 10011100b
7B29: 1802            jr SetPSGMixer ; Desactiva el tono del canal 3 y activa el ruido
                    
7B2B =              toneOnCh123:
7B2B: 3EB8            ld a, 10111000b ; Activa los 3 canales de sonido y apaga los de ruido
                    
7B2D =              SetPSGMixer:
7B2D: 323AE0          ld (mixerValuePSG), a
7B30: 5F              ld e, a
7B31: 3E07            ld a, 7
7B33: C39300          jp WRTPSG
                    
                    
                    ;----------------------------------------------------
                    ; Actualiza el driver de sonido
                    ;----------------------------------------------------
                    
7B36 =              updateSound:
7B36: 3A3AE0          ld a, (mixerValuePSG)
7B39: CD2D7B          call SetPSGMixer ; Fija el estado de los canales del PSG
                    
7B3C: 0E01            ld c, 1
7B3E: DD2110E0        ld ix, MusicChanData
7B42: D9              exx
7B43: 0603            ld b, 3  ; Numero de canales
7B45: 110E00          ld de, 0Eh  ; Channel data size
                    
7B48 =              updateSound2:
7B48: D9              exx
7B49: DD7E02          ld a, (ix+MUSIC_ID) ; Musica que esta reproduciendo el canal
                    
7B4C: F5              push af
7B4D: 3D              dec a  ; Es el sonido de caer?
7B4E: CC5E7B          call z, updateSfxCaer
7B51: F1              pop af
                    
7B52: B7              or a  ; Esta sonando algo?
7B53: C4917B          call nz, processSndData ; si
                    
7B56: 0C              inc c
7B57: 0C              inc c  ; Siguiente canal
7B58: D9              exx
7B59: DD19            add ix, de  ; Apunta a los datos del siguiente canal
7B5B: 10EB            djnz updateSound2 ; Reproduce siguiente canal
7B5D: C9              ret
                    
7B5E =              updateSfxCaer:
7B5E: 79              ld a, c
7B5F: FE05            cp 5
7B61: D8              ret c  ; No es el canal 3
                    
7B62: 213EE0          ld hl, caidaSndDat ; Este byte y los dos anteriores controlan la frecuencia del sonido de caida
7B65: 11907B          ld de, caidaSndData
7B68: 3A3BE0          ld a, (flagSetCaeSnd) ; Si es 0 hay que inicializar los datos del sonido de caida
7B6B: FE01            cp 1
7B6D: 3810            jr c, initCaeSndDat ; Inicializa valores del sonido de caida
                    
7B6F: 3E08            ld a, 8
7B71: 86              add a, (hl)  ; Incrementa frecuencia del sonido de caida
7B72: 77              ld (hl), a
7B73: 2B              dec hl
7B74: 3001            jr nc, setFrqCaePoint ; Guarda el puntero a la frecuencia de caida
                    
7B76: 34              inc (hl)  ; Si hay acarreo, incrementa frecuencia byte alto
                    
7B77 =              setFrqCaePoint:
7B77: 2B              dec hl
7B78: DD7503          ld (ix+MUSIC_ADD_LOW), l
7B7B: DD7404          ld (ix+MUSIC_ADD_HIGH), h
7B7E: C9              ret
                    
7B7F =              initCaeSndDat:
7B7F: C5              push bc
7B80: EB              ex de, hl
7B81: 010400          ld bc, 4
7B84: EDB8            lddr
                    
7B86: EB              ex de, hl
7B87: C1              pop bc
7B88: 23              inc hl
7B89: 23              inc hl
7B8A: 23              inc hl
7B8B: 18EA            jr setFrqCaePoint
                    
                    
                    
7B8D: 01              db 1  ; Quita "flagSetCaeSnd"
7B8E: 21              db 21h
7B8F: B0              db 0B0h
7B90: 61            caidaSndData: db 61h
                    
7B91 =              processSndData:
7B91: CB77            bit 6, a
7B93: 1601            ld d, 1
7B95: CC207B          call z, switchCh3OnOff
                    
7B98: DD7E02          ld a, (ix+MUSIC_ID)
7B9B: B7              or a
7B9C: FA2C7C          jp m, loc_7C2D
                    
7B9F: DD3500          dec (ix+MUSIC_CNT_NOTA) ; Decrementa contador duracion nota
7BA2: C0              ret nz  ; No hay que actualizar la nota, sigue sonando la anterior
                    
7BA3 =              nextNote:
7BA3: DD6E03          ld l, (ix+MUSIC_ADD_LOW)
7BA6: DD6604          ld h, (ix+MUSIC_ADD_HIGH) ; Puntero a los datos de la musica
7BA9: 7E              ld a, (hl)  ; Dato
7BAA: FEFE            cp 0FEh  ; Hay que hacer un loop de un pattern?
7BAC: CAF67A          jp z, patternLoop ; Si
                    
7BAF: 3068            jr nc, endMusic ; #FF = Fin de los datos
                    
7BB1: DDCB027E        bit 7, (ix+MUSIC_ID)
7BB5: C25A7C          jp nz, setNote
                    
                    ; Duracion nota: #2x (x = duracion)
7BB8: E6F0            and 0F0h  ; Se queda con el comando (nibble alto)
7BBA: FE20            cp 20h  ; Comando: Cambiar duracion de la nota?
7BBC: 7E              ld a, (hl)  ; Vuelve a leer el dato
7BBD: 2007            jr nz, loc_7BC7
                    
7BBF: E60F            and 0Fh  ; Se queda con la duracion (nibble bajo)
7BC1: DD7701          ld (ix+MUSIC_DURAC_NOTA), a ; Cambia la duracion de la nota
7BC4: 23              inc hl
7BC5: 7E              ld a, (hl)  ; Lee el siguiente dato
                    
7BC6 =              loc_7BC7:
7BC6: 47              ld b, a
7BC7: E6F0            and 0F0h
7BC9: FE10            cp 10h
7BCB: 201C            jr nz, loc_7BEA
                    
7BCD: 7E              ld a, (hl)
7BCE: E61F            and 1Fh
7BD0: 5F              ld e, a
7BD1: 23              inc hl
7BD2: CB66            bit 4, (hl)
7BD4: 46              ld b, (hl)
7BD5: 2004            jr nz, loc_7BDC
                    
7BD7: 7B              ld a, e
7BD8: D610            sub 10h
7BDA: 5F              ld e, a
                    
7BDB =              loc_7BDC:
7BDB: CBA0            res 4, b
7BDD: 2B              dec hl
7BDE: 3E06            ld a, 6  ; Noise generator
7BE0: CD9300          call WRTPSG
7BE3: 1600            ld d, 0
7BE5: CD207B          call switchCh3OnOff
7BE8: 23              inc hl
                    
7BE9 =              loc_7BEA:
7BE9: DDCB0276        bit 6, (ix+MUSIC_ID)
7BED: 2807            jr z, loc_7BF7
                    
7BEF: 7E              ld a, (hl)  ; (!?) No se usa el valor
7BF0: CDE17C          call incMusicPoint
7BF3: 78              ld a, b
7BF4: 1813            jr setDuracion
                    
7BF6 =              loc_7BF7:
7BF6: E6F0            and 0F0h
7BF8: 47              ld b, a
7BF9: AE              xor (hl)
7BFA: 57              ld d, a  ; Frecuencia (high)
7BFB: 23              inc hl
7BFC: 5E              ld e, (hl)  ; Frecuencia (low)
7BFD: CDE17C          call incMusicPoint
7C00: EB              ex de, hl
7C01: CDD67C          call setFreq
7C04: 78              ld a, b
7C05: 0F              rrca
7C06: 0F              rrca
7C07: 0F              rrca
7C08: 0F              rrca
                    
7C09 =              setDuracion:
7C09: 67              ld h, a
7C0A: DD5E01          ld e, (ix+MUSIC_DURAC_NOTA) ; Valor de la duracion de la nota
7C0D: DD7300          ld (ix+MUSIC_CNT_NOTA), e ; Contador de la duracion de la nota
7C10: DD7E0C          ld a, (ix+0Ch)
7C13: 83              add a, e
7C14: DD7708          ld (ix+8), a
7C17: 1839            jr setVolume
                    
7C19 =              endMusic:
7C19: AF              xor a
7C1A: DD7709          ld (ix+MUSIC_CNT_LOOP), a ; Veces que se ha reproducido un pattern
7C1D: DD770B          ld (ix+0Bh), a
7C20: 1601            ld d, 1
7C22: CD207B          call switchCh3OnOff
7C25: AF              xor a
7C26: DD7702          ld (ix+MUSIC_ID), a ; Ninguna musica sonando
7C29: 67              ld h, a  ; Volumen 0
7C2A: 1826            jr setVolume
                    
7C2C =              loc_7C2D:
7C2C: DD3500          dec (ix+MUSIC_CNT_NOTA) ; Decrementa duracion contador nota
7C2F: CAA37B          jp z, nextNote ; Fin nota
                    
7C32: DD3508          dec (ix+8)
7C35: DD7E08          ld a, (ix+8)
7C38: DDBE00          cp (ix+MUSIC_CNT_NOTA)
7C3B: 2009            jr nz, loc_7C47
                    
7C3D: 5F              ld e, a
7C3E: DD7E0D          ld a, (ix+0Dh)
7C41: BB              cp e
7C42: 7B              ld a, e
7C43: 3004            jr nc, decVolume
7C45: C9              ret
                    
7C46 =              loc_7C47:
7C46: DD3508          dec (ix+8)
                    
7C49 =              decVolume:
7C49: DD7E07          ld a, (ix+MUSIC_VOLUME)
7C4C: 3D              dec a
7C4D: F8              ret m  ; El volumen era 0
7C4E: DD7707          ld (ix+MUSIC_VOLUME), a
7C51: 67              ld h, a
                    
                    ;----------------------------------------------------
                    ; Fija el volumen de un canal del PSG
                    ; In:
                    ;   C = Canal 1-3 (1,3,5)
                    ;   H = Volumen
                    ;----------------------------------------------------
                    
7C52 =              setVolume:
7C52: 79              ld a, c
7C53: 0F              rrca
7C54: C688            add a, 88h
7C56: 5C              ld e, h
7C57: C39300          jp WRTPSG
                    
7C5A =              setNote:
7C5A: 7E              ld a, (hl)
7C5B: E6F0            and 0F0h
7C5D: FED0            cp 0D0h  ; Comando #D = Tempo
7C5F: 7E              ld a, (hl)
7C60: 2007            jr nz, loc_7C6A
                    
7C62: E60F            and 0Fh
7C64: DD770A          ld (ix+MUSIC_TEMPO), a
7C67: 23              inc hl
7C68: 7E              ld a, (hl)
                    
7C69 =              loc_7C6A:
7C69: FEF0            cp 0F0h
7C6B: 3811            jr c, loc_7C7F
                    
7C6D: E60F            and 0Fh
7C6F: DD7706          ld (ix+MUSIC_VOLUME_CH), a ; Volumen canal
7C72: 23              inc hl
7C73: 7E              ld a, (hl)
7C74: DD770C          ld (ix+0Ch), a
7C77: 23              inc hl
7C78: 7E              ld a, (hl)
7C79: DD770D          ld (ix+0Dh), a
7C7C: 23              inc hl
7C7D: 7E              ld a, (hl)
                    
7C7E =              loc_7C7F:
7C7E: FEE0            cp 0E0h
7C80: 3811            jr c, loc_7C94
                    
7C82: E60F            and 0Fh
7C84: CB5F            bit 3, a
7C86: 2806            jr z, changOctave
                    
7C88: DD770B          ld (ix+0Bh), a
7C8B: 23              inc hl
7C8C: 18CC            jr setNote
                    
7C8E =              changOctave:
7C8E: DD7705          ld (ix+MUSIC_OCTAVA), a ; Octava?
7C91: 23              inc hl
7C92: 7E              ld a, (hl)  ; Nota+duracion
                    
7C93 =              loc_7C94:
7C93: E60F            and 0Fh  ; Nibble bajo = duracion
7C95: 47              ld b, a
7C96: DD7E0A          ld a, (ix+MUSIC_TEMPO)
7C99: 2805            jr z, setDuracionNota
                    
7C9B =              incDuracionNota:
7C9B: DD860A          add a, (ix+MUSIC_TEMPO)
7C9E: 10FB            djnz incDuracionNota
                    
7CA0 =              setDuracionNota:
7CA0: DD7701          ld (ix+MUSIC_DURAC_NOTA), a
                    
7CA3: 7E              ld a, (hl)
7CA4: CDE17C          call incMusicPoint
7CA7: E6F0            and 0F0h
7CA9: 0F              rrca
7CAA: 0F              rrca
7CAB: 0F              rrca
7CAC: 0F              rrca
7CAD: 47              ld b, a
7CAE: D60C            sub 0Ch
7CB0: 2803            jr z, defaultVolume
                    
7CB2: DD7E06          ld a, (ix+MUSIC_VOLUME_CH) ; Volumen canal
                    
7CB5 =              defaultVolume:
7CB5: DD7707          ld (ix+MUSIC_VOLUME), a
7CB8: CD097C          call setDuracion
                    
7CBB: 78              ld a, b
7CBC: 21E97C          ld hl, freqNotas
7CBF: CD1040          call ADD_A_HL
                    
7CC2: 6E              ld l, (hl)  ; Frecuencia
7CC3: 2600            ld h, 0
                    
7CC5: DD7E05          ld a, (ix+MUSIC_OCTAVA) ; Octava?
7CC8: B7              or a
7CC9: 2804            jr z, setOctave
                    
7CCB: 47              ld b, a
                    
7CCC =              addOctave:
7CCC: 29              add hl, hl
7CCD: 10FD            djnz addOctave
                    
7CCF =              setOctave:
7CCF: DD7E0B          ld a, (ix+0Bh)
7CD2: B7              or a
7CD3: 2801            jr z, setFreq
7CD5: 23              inc hl  ; Chorus?
                    
                    ; C = Canal 1,3,5 (1-3)
                    ; HL = Frecuencia
                    
7CD6 =              setFreq:
7CD6: 79              ld a, c  ; Registro PSG de la frecuencia del canal (high)
7CD7: 5C              ld e, h
7CD8: CD9300          call WRTPSG
7CDB: 79              ld a, c
7CDC: 3D              dec a  ; Registro frecuencia (low)
7CDD: 5D              ld e, l
7CDE: C39300          jp WRTPSG
                    
7CE1 =              incMusicPoint:
7CE1: 23              inc hl
7CE2: DD7503          ld (ix+MUSIC_ADD_LOW), l
7CE5: DD7404          ld (ix+MUSIC_ADD_HIGH), h
7CE8: C9              ret
                    
                    ;----------------------------------------------------
                    ; Frecuencias de las notas (segunda octava)
                    ;----------------------------------------------------
7CE9: 6A            freqNotas: db 6Ah
7CEA: 64              db 64h
7CEB: 5F              db 5Fh
7CEC: 59              db 59h
7CED: 54              db 54h
7CEE: 50              db 50h
7CEF: 4B              db 4Bh
7CF0: 47              db 47h
7CF1: 43              db 43h
7CF2: 3F              db 3Fh
7CF3: 3C              db 3Ch
7CF4: 38              db 38h
                    
7CF5 =              MusicIndex:
7CF5: 397D            dw SFX_Dummy ; 1 - Caer
7CF7: 397D            dw SFX_Dummy ; 2 - Choca suelo
7CF9: B27D            dw SFX_PuertaGir ; 3 - Puerta giratoria
7CFB: 8B7D            dw SFX_Coger ; 4 - Coge objeto:cuchillo o pico
7CFD: 977D            dw SFX_Picar ; 5 - Sonido del pico
7CFF: 9E7D            dw SFX_Lanzar ; 6 - Larzar cuchillo
7D01: 3A7D            dw SFX_Momia ; 7 - Aparece una momia
7D03: 617D            dw SFX_Hit  ; 8 - Explota momia al golpearla con cuchillo
7D05: 777D            dw SFX_Gema ; 9 - Coger gema
7D07: 547F            dw SFX_VidaExtra ; 10 - Vida extra
                    
7D09: 047E            dw MUS_Ingame ; 11 - Musica ingame
7D0B: 5B7E            dw MUS_Ingame2
                    
7D0D: 617F            dw MUS_CloseDoor ; 13 - Puerta cerrandose
7D0F: 7D7F            dw MUS_CloseDoor2
                    
7D11: DE7F            dw MUS_SalirPiram ; 15 - Campanilla al salir de la piramide
7D13: EA7F            dw MUS_SalirPiram2
                    
7D15: 997F            dw MUS_Mapa ; 17 - Fanfarria del pergamino
7D17: AF7F            dw MUS_Mapa2
7D19: C77F            dw MUS_Mapa3
                    
7D1B: 997E            dw MUS_StageClr ; 20 - Stage clear. Ha cogido todas las gemas
7D1D: 9A7E            dw MUS_StageClr2
7D1F: B37E            dw MUS_StageClr3
                    
7D21: 077F            dw MUS_Start ; 23 - Start game
7D23: 087F            dw MUS_Start2
7D25: 2D7F            dw MUS_Start3 ; 25
                    
7D27: CD7E            dw MUS_GameOver ; 26 - Game Over
7D29: CE7E            dw MUS_GameOver2
7D2B: E57E            dw MUS_GameOver3
                    
7D2D: CE7D            dw MUS_Muerte ; 29 - Prota muere
7D2F: E07D            dw MUS_Muerte2 ; 30
7D31: F27D            dw MUS_Muerte3
                    
7D33: 397D            dw SFX_Dummy ; 32 - Silencio
7D35: 397D            dw SFX_Dummy
7D37: 397D            dw SFX_Dummy
                    
7D39: FF            SFX_Dummy: db 0FFh
                    
7D3A: D1FC0303E200C010C020C0  SFX_Momia:      db 0D1h, 0FCh, 3, 3, 0E2h, 0, 0C0h, 10h, 0C0h, 20h, 0C0h
7D45: 20C040804080CEFD00C0    db 20h, 0C0h, 40h, 80h, 40h, 80h, 0CEh, 0FDh, 0, 0C0h
7D4F: 10C020C020C040804080    db 10h, 0C0h, 20h, 0C0h, 20h, 0C0h, 40h, 80h, 40h, 80h
7D59: CED2C6          db 0CEh, 0D2h, 0C6h
                    
7D5C: FE02            db 0FEh, 2
7D5E: 3A7D            dw SFX_Momia
7D60: FF              db 0FFh
                    
7D61: 21E0A0E0C0E0E0D060  SFX_Hit: db 21h, 0E0h, 0A0h, 0E0h, 0C0h, 0E0h, 0E0h, 0D0h, 60h
7D6A: D080D0A0D020C040C060    db 0D0h, 80h, 0D0h, 0A0h, 0D0h, 20h, 0C0h, 40h, 0C0h, 60h
7D74: C080FF          db 0C0h, 80h, 0FFh
                    
7D77: 22D0540000D0500000D047D0  SFX_Gema: db 22h, 0D0h, 54h, 0, 0, 0D0h, 50h, 0, 0, 0D0h, 47h, 0D0h
7D83: 420000D038D033FF    db 42h, 0, 0, 0D0h, 38h, 0D0h, 33h, 0FFh
                    
7D8B: 22C152E074C091F074D0  SFX_Coger: db 22h, 0C1h, 52h, 0E0h, 74h, 0C0h, 91h, 0F0h, 74h, 0D0h
7D95: 75FF            db 75h, 0FFh
                    
7D97: 221C1F08160CFF  SFX_Picar: db 22h, 1Ch, 1Fh, 8, 16h, 0Ch, 0FFh
                    
7D9E: 21E078C070C068E063D0  SFX_Lanzar: db 21h, 0E0h, 78h, 0C0h, 70h, 0C0h, 68h, 0E0h, 63h, 0D0h
7DA8: 5AD053B05390535053FF    db 5Ah, 0D0h, 53h, 0B0h, 53h, 90h, 53h, 50h, 53h, 0FFh
                    
7DB2: 26F694F68FF68FF68AE6  SFX_PuertaGir: db 26h, 0F6h, 94h, 0F6h, 8Fh, 0F6h, 8Fh, 0F6h, 8Ah, 0E6h
7DBC: 85E680D67AD675C670C6    db 85h, 0E6h, 80h, 0D6h, 7Ah, 0D6h, 75h, 0C6h, 70h, 0C6h
7DC6: 6AB685A670966AFF    db 6Ah, 0B6h, 85h, 0A6h, 70h, 96h, 6Ah, 0FFh
                    
7DCE: 26E180E280D200D300C280  MUS_Muerte: db 26h, 0E1h, 80h, 0E2h, 80h, 0D2h, 0, 0D3h, 0, 0C2h, 80h
7DD9: C380B300B400FF    db 0C3h, 80h, 0B3h, 0, 0B4h, 0, 0FFh
                    
7DE0: 26E080E180D100D200C180  MUS_Muerte2: db 26h, 0E0h, 80h, 0E1h, 80h, 0D1h, 0, 0D2h, 0, 0C1h, 80h
7DEB: C280B200B300FF    db 0C2h, 80h, 0B2h, 0, 0B3h, 0, 0FFh
                    
7DF2: 26E100E100D180D280C200  MUS_Muerte3: db 26h, 0E1h, 0, 0E1h, 0, 0D1h, 80h, 0D2h, 80h, 0C2h, 0 ; ...
7DFD: C300B280B380FF    db 0C3h, 0, 0B2h, 80h, 0B3h, 80h, 0FFh
                    
7E04: D8FC0303E24250425080C0  MUS_Ingame: db 0D8h, 0FCh, 3, 3, 0E2h, 42h, 50h, 42h, 50h, 80h, 0C0h
7E0F: 90C0B090805042504121    db 90h, 0C0h, 0B0h, 90h, 80h, 50h, 42h, 50h, 41h, 21h
7E19: 11214382908290B0C0E1    db 11h, 21h, 43h, 82h, 90h, 82h, 90h, 0B0h, 0C0h, 0E1h
7E23: 00C03000E2B0908090B090    db 0, 0C0h, 30h, 0, 0E2h, 0B0h, 90h, 80h, 90h, 0B0h, 90h
7E2E: 80C050C0425041B090B0    db 80h, 0C0h, 50h, 0C0h, 42h, 50h, 41h, 0B0h, 90h, 0B0h
7E38: E100304030C000C0E2B2E1    db 0E1h, 0, 30h, 40h, 30h, 0C0h, 0, 0C0h, 0E2h, 0B2h, 0E1h
7E43: 00E2B1B090B0E100304060    db 0, 0E2h, 0B1h, 0B0h, 90h, 0B0h, 0E1h, 0, 30h, 40h, 60h
7E4E: 403000E2B2E100E2B3FE    db 40h, 30h, 0, 0E2h, 0B2h, 0E1h, 0, 0E2h, 0B3h, 0FEh
7E58: FF              db 0FFh
7E59: 047E            dw MUS_Ingame
                    
7E5B: D8FC0303E3    MUS_Ingame2: db 0D8h, 0FCh, 3, 3, 0E3h
                    
7E60: 41808040C081FE04  byte_7E61: db 41h, 80h, 80h, 40h, 0C0h, 81h, 0FEh, 4
7E68: 607E            dw byte_7E61
                    
7E6A: 51909050C091FE02  byte_7E6B: db 51h, 90h, 90h, 50h, 0C0h, 91h, 0FEh, 2
7E72: 6A7E            dw byte_7E6B
                    
7E74: 41808040C081FE02  byte_7E75: db 41h, 80h, 80h, 40h, 0C0h, 81h, 0FEh, 2
7E7C: 747E            dw byte_7E75
                    
7E7E: 319090E4B0C0E391FE03  byte_7E7F: db 31h, 90h, 90h, 0E4h, 0B0h, 0C0h, 0E3h, 91h, 0FEh, 3
7E88: 7E7E            dw byte_7E7F
7E8A: 319090E4B0E33060B0FE    db 31h, 90h, 90h, 0E4h, 0B0h, 0E3h, 30h, 60h, 0B0h, 0FEh
7E94: FF              db 0FFh
7E95: 5B7E            dw MUS_Ingame2
7E97: FE              db 0FEh
7E98: FF              db 0FFh
                    
7E99: E8            MUS_StageClr: db 0E8h
7E9A: D6FC0101E1011141514111  MUS_StageClr2: db 0D6h, 0FCh, 1, 1, 0E1h, 1, 11h, 41h, 51h, 41h, 11h
7EA5: 01E2A1E10010001000100010    db 1, 0E2h, 0A1h, 0E1h, 0, 10h, 0, 10h, 0, 10h, 0, 10h
7EB1: 03FF            db 3, 0FFh
                    
7EB3: D6FB0101E3B1E211415141  MUS_StageClr3: db 0D6h, 0FBh, 1, 1, 0E3h, 0B1h, 0E2h, 11h, 41h, 51h, 41h
7EBE: 1101E3A1E200100010001000    db 11h, 1, 0E3h, 0A1h, 0E2h, 0, 10h, 0, 10h, 0, 10h, 0
7ECA: 1003FF          db 10h, 3, 0FFh
                    
7ECD: E8            MUS_GameOver: db 0E8h
7ECE: DAFC0202E173B3A3838070  MUS_GameOver2: db 0DAh, 0FCh, 2, 2, 0E1h, 73h, 0B3h, 0A3h, 83h, 80h, 70h
7ED9: 403040C070C0D580A0DA    db 40h, 30h, 40h, 0C0h, 70h, 0C0h, 0D5h, 80h, 0A0h, 0DAh
7EE3: 83FF            db 83h, 0FFh
                    
7EE5: DAFD0202E27080A0B0E1  MUS_GameOver3: db 0DAh, 0FDh, 2, 2, 0E2h, 70h, 80h, 0A0h, 0B0h, 0E1h
7EEF: 20C0E2B0C0A0C080C0    db 20h, 0C0h, 0E2h, 0B0h, 0C0h, 0A0h, 0C0h, 80h, 0C0h
7EF8: D5A0B0DAA28070403040    db 0D5h, 0A0h, 0B0h, 0DAh, 0A2h, 80h, 70h, 40h, 30h, 40h
7F02: C070C084FF      db 0C0h, 70h, 0C0h, 84h, 0FFh
                    
7F07: E8            MUS_Start: db 0E8h
7F08: D4FC0101E021C1E191C1  MUS_Start2: db 0D4h, 0FCh, 1, 1, 0E0h, 21h, 0C1h, 0E1h, 91h, 0C1h
7F12: E001E1A191C171A1E011    db 0E0h, 1, 0E1h, 0A1h, 91h, 0C1h, 71h, 0A1h, 0E0h, 11h
7F1C: E1A19731213161917191    db 0E1h, 0A1h, 97h, 31h, 21h, 31h, 61h, 91h, 71h, 91h
7F26: A19171613127FF    db 0A1h, 91h, 71h, 61h, 31h, 27h, 0FFh
                    
7F2D: D3FB0101E1C0D421C1E2  MUS_Start3: db 0D3h, 0FBh, 1, 1, 0E1h, 0C0h, 0D4h, 21h, 0C1h, 0E2h
7F37: 91C1E101E2A191C171A1    db 91h, 0C1h, 0E1h, 1, 0E2h, 0A1h, 91h, 0C1h, 71h, 0A1h
7F41: E111E2A1973121316191    db 0E1h, 11h, 0E2h, 0A1h, 97h, 31h, 21h, 31h, 61h, 91h
7F4B: 7191A19171613127FF    db 71h, 91h, 0A1h, 91h, 71h, 61h, 31h, 27h, 0FFh
                    
7F54: D4FD0303E2706070E17060  SFX_VidaExtra: db 0D4h, 0FDh, 3, 3, 0E2h, 70h, 60h, 70h, 0E1h, 70h, 60h
7F5F: 71FF            db 71h, 0FFh
                    
7F61: D1FC0101E301015151212171  MUS_CloseDoor: db 0D1h, 0FCh, 1, 1, 0E3h, 1, 1, 51h, 51h, 21h, 21h, 71h
7F6D: 71CE515191917171B1B1    db 71h, 0CEh, 51h, 51h, 91h, 91h, 71h, 71h, 0B1h, 0B1h
7F77: 9191E30101FF    db 91h, 91h, 0E3h, 1, 1, 0FFh
                    
7F7D: D1FC0101E201015151212171  MUS_CloseDoor2: db 0D1h, 0FCh, 1, 1, 0E2h, 1, 1, 51h, 51h, 21h, 21h, 71h
7F89: 71CF515191917171B1B1    db 71h, 0CFh, 51h, 51h, 91h, 91h, 71h, 71h, 0B1h, 0B1h
7F93: 9191E10101FF    db 91h, 91h, 0E1h, 1, 1, 0FFh
                    
7F99: D6FC0303E2B2B0D7B070  MUS_Mapa: db 0D6h, 0FCh, 3, 3, 0E2h, 0B2h, 0B0h, 0D7h, 0B0h, 70h
7FA3: D890D6B1E12020410040    db 0D8h, 90h, 0D6h, 0B1h, 0E1h, 20h, 20h, 41h, 0, 40h
7FAD: 7BFF            db 7Bh, 0FFh
                    
7FAF: D6            MUS_Mapa2: db 0D6h
7FB0: FC0303E27270D77020D850    db 0FCh, 3, 3, 0E2h, 72h, 70h, 0D7h, 70h, 20h, 0D8h, 50h
7FBB: D671B0B0E101E290E200    db 0D6h, 71h, 0B0h, 0B0h, 0E1h, 1, 0E2h, 90h, 0E2h, 0
7FC5: 2BFF            db 2Bh, 0FFh
                    
7FC7: D6FC0303E22220D720E3B0  MUS_Mapa3: db 0D6h, 0FCh, 3, 3, 0E2h, 22h, 20h, 0D7h, 20h, 0E3h, 0B0h
7FD2: D8E220D6217070915090    db 0D8h, 0E2h, 20h, 0D6h, 21h, 70h, 70h, 91h, 50h, 90h
7FDC: BBFF            db 0BBh, 0FFh
                    
7FDE: D4FC0303E170E040704070  MUS_SalirPiram: db 0D4h, 0FCh, 3, 3, 0E1h, 70h, 0E0h, 40h, 70h, 40h, 70h
7FE9: FF              db 0FFh
                    
7FEA: D4FC0303E140E000400040FF  MUS_SalirPiram2:db 0D4h, 0FCh, 3, 3, 0E1h, 40h, 0E0h, 0, 40h, 0, 40h, 0FFh
                    
                    ; IF (VERSION2)
7FF6: FF              db #ff
                    ; ENDIF
                     
                    ;------------------------------------------------------------------------------ 
                    ;
                    ; Identificador del juego de Konami: OUKE NO TANI
                    ;
                    ;    -00: #AA (Token)
                    ;    -01: N?ero RC7xx en formato BCD
                    ;    -02: N?ero de bytes usados para el nombre
                    ;    -03: Nombre en katakana (escrito al rev?)
                    ;
                    ;------------------------------------------------------------------------------
7FF7: 958F988882840627AA    db 95h, 8Fh, 98h, 88h, 82h, 84h, 6, 27h, 0AAh
                    
                    
                    
                    
                    ; ===========================================================================
                    ;  MAP     #e000
E000                  ORG     #e000
                      
E000: 00            GameStatus: DS 1
                         ; 0 = Konami Logo
                         ; 1 = Menu wait
                         ; 2 = Set demo
                         ; 3 = Musica de inicio, parpadea START PLAY, pone modo juego
                         ; 4 = Empezando partida
                         ; 5 = Jugando / Mapa
                         ; 6 = Perdiendo una vida / Game Over
                         ; 7 = Game Over
                         ; 8 = Stage Clear
                         ; 9 = Scroll pantalla
                         ; 10 = Muestra el final del juego
E001: 00            subStatus: DS 1
E002: 00            controlPlayer: DS 1  ; bit 6 = Prota controlado por el jugador
E003: 00            timer:  DS 1
E004: 00            waitCounter: DS 1
E005: 00            tickInProgress: DS 1  ; Si el bit0 esta a 1 no se ejecuta la logica del juego
                    
E006: 0000          dummy_1: DS 2
                    
E008: 00            KeyTrigger: DS 1
E009: 00            KeyHold: DS 1  ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha, #10 = Boton A, #20 =Boton B
E00A: 00            gameLogoCnt: DS 1
                    
E00B: 0000          dummy_2: DS 2
                    
E00D: 00            flagEndPergamino:DS 1
                         ; 1 = Ha terminado de mostar el pergamino/mapa
E00E: 0000          CoordKonamiLogo:DS 2  ; Direccion BG Map (name table) del logo
                    
                    
E010: 0000          MusicChanData: DS 2
E012: 000000000000000000000000  musicCh1: DS 12
                    
E01E: 0000          MusicChanData2: DS 2
E020: 000000000000000000000000  musicCh2: DS 12
                    
E02C: 0000          MusicChanData3: DS 2
E02E: 000000000000000000000000  musicCh3: DS 12
                    
E03A: 00            mixerValuePSG: DS 1
E03B: 00            flagSetCaeSnd: DS 1  ; Si es 0 hay que inicializar los datos del sonido de caida
E03C: 0000          dummy_3: DS 2
                    
E03E: 00            caidaSndDat: DS 1  ; Este byte y los dos anteriores controlan la frecuencia del sonido de caida
E03F: 00            dummy:  DS 1
                    
E040: 00            KeyTrigger2: DS 1
E041: 00            KeyHold2: DS 1
                    
E042: 00            dummy0:  DS 1
                    
E043: 0000          record_0000xx: DS 2
E045: 00            record_xx0000: DS 1
                    
E046: 000000        dummy_4: DS 3
                    
E049: 0000          score_0000xx: DS 2
E04B: 00            score_xx0000: DS 1
                    
E04C: 00000000      dummy_5: DS 4
                    
E050: 00            Vidas:  DS 1
E051: 00            flagPiramideMap:DS 1
                         ; 0 = Mostrando mapa, 1 = Dentro de la piramide
E052: 00            extraLifeCounter:DS 1
E053: 00            flagVivo: DS 1
                         ; 0 = Muerto, 1 = Vivo
E054: 00            piramideActual: DS 1
E055: 00            piramideDest: DS 1
E056: 00            puertaEntrada: DS 1
                         ; Indica la puerta/direccion por la que se esta entrando a la piramide
E057: 00            puertaSalida: DS 1
                         ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha
E058: 00            numFinishGame: DS 1
                         ; Numero de veces que se ha terminado el juego
E059: 0000          dummy_6: DS 2
                    
E05B: 00            UNKNOWN: DS 1  ; (!?) Se usa?
E05C: 0000          dummy_7: DS 2
                    
E05E: 00            flagMuerte: DS 1  ; No se usa (!?)
E05F: 00            quienEscalera: DS 1  ; (!?) Se usa esto? Quien esta en una escalera 0 = Prota. 1 = Momia
                    
E060: 00            dummy_8: DS 1
                    
E061: 00            offsetPlanoSpr: DS 1  ; Contador que modifica el plano en el que son pintados los sprites, asi se consigue que parpaden en vez de desaparecer
E062: 0000          PiramidesPasadas:DS 2  ; Cada bit indica si la piramide correspondiente ya esta pasada/terminada
E064: 00            keyTriggerMap: DS 1
E065: 00            keyHoldMap: DS 1
E066: 00            mapPaused: DS 1  ; 1 = Pausing
                    
E067: 00000000000000000000000000000000000000000000000000  dummy_9: DS 25
                    
E080: 0000          keyPressDemo: DS 2  ; Puntero a los controles grabados
E082: 00            KeyHoldCntDemo: DS 1
E083: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  escaleraData: DS 45
                    
                    ;----------------------------------------------------
                    ; Tabla de atributos de los sprites en RAM
                    ; Sprites:
                    ; 0-3 = Parte izquierda de la puerta de la piramide (usada para tapar al prota y dar sensacion de que pasa por detras)
                    ; 3 = Tambien usado como halo de la piramide en el mapa
                    ; 4-5 = Prota
                    ; 6-9 = Momias
                    ; 15 = Cuchillo o flecha mapa
                    ;----------------------------------------------------
E0B0: 00            sprAttrib: DS 1  ; Tabla de atributos de los sprites en RAM (Y, X, Spr, Col)
E0B1: 000000000000000000000000000000  puertaXspr: DS 15
E0C0: 000000        protaAttrib: DS 3
E0C3: 00000000      protaColorRopa: DS 4
E0C7: 00            ProtaColorPiel: DS 1
E0C8: 00000000000000000000000000000000  enemyAttrib: DS 16
E0D8: 0000000000000000000000000000000000000000  unk_E0D8: DS 20
                    
                    ; Atributos del cuchillo al rebotar
E0EC: 00000000000000000000000000000000  knifeAttrib: DS 16
E0FC: 000000        attrPiramidMap: DS 3  ; Atributos del sprite usado para resaltar una piramide en el mapa (silueta)
                    
E0FF: 00            colorPiramidMap:DS 1  ; Color del outline de la piramide en el mapa
E100: 000000        attrFlechaMap: DS 3  ; Atributos de la flecha del mapa
                    
E103: 00            colorFlechaMap: DS 1  ; Color de la flecha que indica a que piramide vamos en el mapa
                    
E104: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  dummy_10: DS 2Ch
                    
E130: 00            statusEntrada: DS 1  ; Timer usado en el mapa/pergamino de piramides
                         ; como status del prota en las escaleras de entrada/salida
E131: 00            lanzamFallido: DS 1  ; 1 = El cuchillo se ha lanzado contra un muro y directamente sale rebotando
E132: 00            flagEntraSale: DS 1  ; 1 = Entrando o saliendo de la piramide. Ejecuta una logica especial para este caso
E133: 00            flagStageClear: DS 1
E134: 00            protaStatus: DS 1  ; 0 = Normal
                         ; 1 = Salto
                         ; 2 = Cayendo
                         ; 3 = Escaleras
                         ; 4 = Lanzando un cuhillo
                         ; 5 = Picando
                         ; 6 = Pasando por un apuerta giratoria
                         
E135: 00            protaControl: DS 1  ; 1 = Arriba, 2 = Abajo, 4 = Izquierda, 8 = Derecha, #10 = Boton A, #20 =Boton B
E136: 00            sentidoProta: DS 1  ; 1 = Izquierda, 2 = Derecha
E137: 00            ProtaY:  DS 1
E138: 00            ProtaXdecimal: DS 1  ; 'Decimales' usados en el calculo de la X. Asi se consiguen velocidades menores a 1 pixel
E139: 00            ProtaX:  DS 1
E13A: 00            ProtaRoom: DS 1  ; Parte alta de la coordenada X. Indica la habitacion de la piramide
E13B: 0000          protaSpeed: DS 2  ; El byte bajo indica la parte "decimal" y el alto la entera
E13D: 00            speedRoom: DS 1  ; Usando para sumar/restar a la habitacion cuando se pasa de una a otra
E13E: 00            protaMovCnt: DS 1  ; Contador usado cada vez que se mueve el prota. (!?) No se usa su valor
E13F: 00            protaFrame: DS 1
                    
                    ; Los siguientes dos bytes se usan para guardar un puntero a una tabla con los valores del salto +#0C y +#0D
E140: 00            timerPergam2: DS 1  ; Se usa para hacer una pausa tras terminar de sonar la musica del pergamino al llegar al GOAL
E141: 00            dummy_11: DS 1
                    
E142: 00            flagSalto: DS 1  ; 0 = Saltando, 1 = En el suelo
E143: 00            sentidoEscalera:DS 1  ; 0 = \, 1 = /
                         ; Tambien usado para saber si el salto fue en vertical (guarda el estado de las teclas en el momento del salto.
E144: 00            objetoCogido: DS 1  ; #10 = Cuchillo, #20 = Pico
E145: 00            accionWaitCnt: DS 1  ; Contador usado para controlar la animacion y duracion de la accion (lanzar cuchillo, cavar, pasar puerta giratoria)
E146: 00            timerEmpuja: DS 1  ; Timer usado para saber el tiempo que se empuja una puerta giratoria
E147: 00            flagScrolling: DS 1
E148: 00            agujeroCnt: DS 1  ; Al comenzar a pica vale #15
                    
                    ; Datos del agujero que se esta picando
E149: 00000000      agujeroDat: DS 4  ; Y, X, habitacion
                    
E14D: 00            modoSentEsc: DS 1  ; Si es 0 guarda en "sentidoEscalera" el tipo de escalera que se coge el prota. 0 = \, 1 = /
E14E: 000000000000000000000000000000000000  momiasPiramid: DS 3*6  ; Datos de las momias que hay en la piramide actual: y, x (%xxxxx--p), tipo
                    
E160: 0000          dummy_12: DS 2
E162: 0000          pMomiaProceso: DS 2  ; Puntero a los datos de la momia en proceso
E164: 00            numMomias: DS 1
E165: 00            momiaEnProceso: DS 1
E166: 00            ordenSubir: DS 1
E167: 00            distSubida: DS 1
E168: 00            ordenBajar: DS 1
E169: 00            distBajada: DS 1
E16A: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  momiaDat: DS 16h*4  ; 0 = Andando
                         ; 1 = Salto
                         ; 2 = Cayendo
                         ; 3 = Escaleras
                         ; 4 = Limbo
                         ; 5 = Aparece
                         ; 6 = Suicida
                         ; 7 = pensando
                         ;
                         ; +#00 = Status
                         ; +#01 = Control
                         ; +#02 = Sentido
                         ; +#03 = Y
                         ; +#04 = X decimal
                         ; +#05 = X
                         ; +#06 = Room
                         ; +#07 = Speed X decimal
                         ; +#08 = Speed X
                         ; +#09 = Speed Room
                         ; +#0b = Frame
                         ; +#11 = Timer
                         ; +#14 = Tipo momia
                    
E1C2: 00            puertaCerrada: DS 1  ; Vale 1 al cerrarse la salida
                    
E1C3: 00            dummy_13: DS 1
                    
E1C4: 00            numPuertas: DS 1
E1C5: 000000000000000000000000000000000000000000000000  pyramidDoors: DS 18h  ; Y (FF = Desactivado)
                         ; X decimales
                         ; X
                         ; Habitacion
                         ; Status (Nibble alto = Status, Nibble bajo = contador)
                         ; Piramide destino
                         ; Direccion por la que se entra / Flecha del mapa
E1DD: 000000000000000000000000000000000000000000  dummy_14: DS 21
                    
E1F2: 00            gemasCogidas: DS 1
E1F3: 00            gemasTotales: DS 1
E1F4: 00            ElemEnProceso: DS 1  ; Usado para saber la gema o puerta que se esta procesando
E1F5: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  datosGemas: DS 6Ch  ; 0 = Color/activa. Nibble alto indica el color. El bajo si esta activa (1) o no (0)
                         ; 1 = Status
                         ; 2 = Y
                         ; 3 = decimales X
                         ; 4 = X
                         ; 5 = habitacion
                         ; 6-8 = 0, 0, 0
                         
                         
E261: 00            IDcuchilloCoge: DS 1  ; Cuchillo que coge el prota
E262: 00            knifeEnProceso: DS 1
E263: 00            numKnifes: DS 1
                    ;
                    ; Datos de los cuchillos
                    ; Numero maximo de cuchillos 6
                    ; Tama? de la estructura 17 bytes
                    ;
E264: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  knifesData: DS 66h  ; 0 = Status (1 = suelo, 2 = Cogido, 4 = Lanzamiento?, 5= lanzado, 7 =Rebotando)
                         ; 1 = Sentido (1 = izquierda, 2 = Derecha)
                         ; 2 = Y
                         ; 3 = X decimales
                         ; 4 = X
                         ; 5 = Habitacion
                         ; 6 = Velocidad decimales
                         ; 7 = Velocidad cuchillo
                         ; 8 = Velocidad cambio habitacion
                         ; 9 = Contador movimiento
                         ; A = Tile backup 1 (fondo)
                         ; B = Tile backup 2 (guarda dos tiles al lanzarlo)
                    
E2CA: 00            idxPicoCogido: DS 1  ; Indice del pico cogido por el prota
E2CB: 00            numPicos: DS 1
                    
                    ; 5 bytes por entrada
E2CC: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  picosData: DS 50h  ; 0 = Status
                         ; 1 = Y
                         ; 2 = X decimal
                         ; 3 = X
                         ; 4 = Habitacion
E31C: 00            GiratEnProceso: DS 1
E31D: 00            numDoorGira: DS 1
                    
                    ; 7 bytes por puerta
E31E: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  doorGiraData: DS 0DFh  ; 0 = Status (bit 0 = Girando, bits 2-1 = altura + 2)
                         ; 1 = Y
                         ; 2 = X decimal
                         ; 3 = X
                         ; 4 = Habitacion
                         ; 5 = Sentido giro
                         ; 6 = Contador giro
E3FD: 00            muroTrampProces:DS 1
E3FE: 00            numMuroTrampa: DS 1   ; Numero de muros trampa que hay en la piramide
E3FF: 0000000000000000000000000000000000000000  muroTrampaDat: DS 5*4  ; Y, decimales X, X, habitacion
                    
E413: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  stackArea: DS 2edh  ; 301h
E700 =              stackTop: ;DS 0
E700: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MapaRAMRoot: DS 60h  ; La primera fila del mapa no se usa (ocupada por el marcador). Tambien usado como inicio de la pila
E760: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MapaRAM: DS 8A0h  ; Mapa de las tres posibles habitaciones de la piramide. Cada fila ocupa #60 bytes (#20 * 3)
