the cutting room mirror

Spirou (Game Gear)

This game was never completed and/or given a public release.
As a result of this, keep in mind that the developers might have used or deleted some of the content featured here, had the game actually been released.

To do:
Document any source code fragments that were missed and other development-related stuff that made its way into the ROM.

This page contains no introduction.
What makes this game notable or what is it about? Are you a bad enough dude to save this article?

Level Select#

Pause the game and press Down, Down, 1, Left, Right, 2, Down, Up, 2.

Source Code Fragments#

'...But what does it mean?'
This game has text or audio that needs to be translated. If you are fluent with this language, please read our translation guidelines and then submit a translation!

Present throughout much of the bottom third of the ROM space, alongside messages from the compiler used.

0x63E81#

<pre style='white-space: pre-wrap; overflow: auto; Width:550px; height: 300px''>

   and #0f
   PRTA    1,0,3

   ldal    PersoJump
   PRTA    2,0,3
   ENDIF

   ldal    vargen2
   inc a
   stal    vargen2
   PRTA    3,4,3
   is60    jr,$GUdiff_chdes    ; Origin is not a 60
   ldal    vargen2
   inc a
   stal    vargen2
   PRTA    3,4,3

+\2*8

   ldhll   var1
   PRTHL   3,4,5

   ldhll   var1
   PRTHL   3,4,5
   ldal    vargen2
   inc a
   stal    vargen2
   PRTA    3,4,3
   ldhll   var1
   PRTHL   3,0,5

   ldhll   var1
   PRTHL   3,0,5

   ldal    vargen2
   inc a
   stal    vargen2
   PRTA    3,4,3
   ldal    vargen2
   inc a
   stal    vargen2
   PRTA    3,4,3

$GUdiff_chdes

MARCA

   call    GetHigh60\1 ; X

   ld  c,a
   cmp #80

   if  narg=3
   \3  z
   else
   \3  z,\4
   endif

   bit 7,a
   jnz $\@yes

   ldal    Perso\2 ; Y
   and #0f
   cmp c

   if  narg=3
   \3  c
   else
   \3  c,\4
   endif

\1 ; $GUdiff_chdes

MARCA

   ;is60   jr,$GUdiff_chdes    ; Origin is not a 60
   jp  c,$GUdiff_chdes
   jp  $

jp z,$GUdiff_chdes
jp c,$GUdiff_chdes
MARCA

$adjwhenmovex

MARCA

   if  1
   endif
   lda vargen
   inc a
   sta vargen
   ;PRTA   3,0,3

   lda vargen
   inc a
   sta vargen
   ;PRTA   3,0,3
   lda vargen
   inc a
   sta vargen
   PRTA    3,0,3
   lda vargen
   inc a
   sta vargen
   PRTA    3,0,3
   ;Dani arreglo start

   ;ldal   WORLD
   ;cpx    AEREO
   ;jz          $GUdiff_in

   ;Dani arreglo end

   IF  0

   ENDIF
   IF  0

$GUadjAnt

   jz  $GUadjAnt
   jc          $GUadjAnt
   jz  $GUadjAnt
   jc          $GUadjAnt

MARCA START
MARCA END

   ld  a,(hl)
   cmp MAXSLOPE
   bcs $\@si
   ldhll
   ld  a,(hl)
   cmp MAXSLOPE
   bcs $\@si
   cp

MARCA END

   IF  0

MARCA START

   ; Origen en una inclinada

   call    GetHigh60XAnt
   ld  c,a
   cmp #80
   jp  z,$GUdiff_chdes
   bit 7,a
   jnz $yes

   ldal    PersoY
   and #0f
   cmp c
   jp  nc,$GUdiff_chdes

$yes

isin XAnt,Y,jp,$GUdiff_chdes
MARCA END

   ENDIF

   cp  MAXSLOPE
   jnc
   cp  MAXSLOPE
   jc  $GUdiff_chdes
   jr  $ok
   jc  $GUdiff_chdes

   push    af
   pop af
   ld  a,c

pop af

   IF  0

diff_chdes diff_chdes

   ld  c,a

   ld  a,c

ld a,c ldhll HOTY

   ld  a,(hl)

   IF  1
   ENDIF

AEREO PANTANO ;AEREO 512+40

   ;5/2
   ;4/2
   stal    CachoMuro

$cont CUEVA FABRICA

   IF  MASRNC

0x6587A#

<pre style='white-space: pre-wrap; overflow: auto; Width:550px; height: 300px''> $=S_TxtMenu

   dw  AL_TxtMenu

IdiomaOptions:

   dw  IN_TxtOptions
   dw  FR_TxtOptions
   dw  ES_TxtOptions
   dw  AL_TxtOptions

Rutina de menu

MenuMain:

$Whitechar = 128 ; Codigo pieza blanco $Codecursor = 0 ; Codigo pieza spr.cursor

   IF  GB

$InitPosYM = 68+16 ; Pos.inicial Y cursor menu $InitPosXM = 36+8 ; Pos.inicial X cursor menu $InitPosYO = 68+16 ; Pos.inicial Y cursor opt. $InitPosXO = 36+8 ; Pos.inicial X cursor opt.

   ELSE

$InitPosYM = 68+#17 ; Pos.inicial Y cursor menu $InitPosXM = 36+#30 ; Pos.inicial X cursor menu $InitPosYO = 68+#17 ; Pos.inicial Y cursor opt. $InitPosXO = 36+#30 ; Pos.inicial X cursor opt.

   ENDIF

$IncYMovCursor = 16 ; Incr.mov.Y cursor menu $IncYMovCursor2 = 48 ; Incr.mov.Y cursor opciones $LimDownYCursor = $IncYMovCursor*3 ; Lim.down Y cursor menu $LimDownYCursor2 = $IncYMovCursor2*2 ; Lim.down Y cursor opc. $OptStart = 0 $OptOptions = $IncYMovCursor $OptPassword = $IncYMovCursor*2

   if  GB
   ldal    IE
   push    af
   and 00000001b
   stal    IE
   endif

   xor a
   stal    PosCursorP  ; Init. posicion del cursor password
   dec a
   stal    NextWorld

   call    MakeClears

   IF  GB
   EI
   CallMusic   INIT_GBS
   HALT_
   DI
   ENDIF

   ldal    OkPassword
   and a

call nz,CheckPasswordBnk

$ReturnFromPass:

   DI

   IF  GB
   EI
   xor a
   stal    SGB_FlagMarkers
   ld  hl,PAL_TIT
   SGB SetPalette
   DI
   ENDIF

   ld  hl,IdiomaOptions
   ldal    Langua
   add a,a
   ld  c,a
   ADDHLA
   LDHLHL
   STHLL   ST_ALL2     ; Dir.texto idioma opciones

   xref    IdiomaLevels
   ld  hl,IdiomaLevels
   ld  a,c
   ADDHLA
   LDHLHL
   STHLL   ST_ALL3     ; Dir.texto idioma opciones

   IF  GB
   ld  hl,#8800
   callx   DumpWhite
   ENDIF

   callx   DumpChapeau     ; Vuelca gorrito
   callx   DumpCharsBig2   ; Vuelca graficos set gordo
   callx   DumpTitulo

$InitMenu xor a

   stal    PosCursorM  ; Init. posicion del cursor menu

   IF  GB
   ld  a,$Whitechar
   sta ST_ALL
   callx   BG1
   ELSE

   call    SetPalSt

   ld  a,FIRSTCHARBIGPIECE
   sta ST_ALL
   callx   BG1
   ENDIF

   call    PrintTitulo

   ld  hl,IdiomaMenu
   ldal    Langua
   add a,a
   ADDHLA
   LDHLHL

   IF  GB
   ld  de,#9800+8*32+6
   ELSE
   ld  de,#7800+8*64+6*2
   ENDIF

   call    DumpTxtBig

   IF  GB
   ldal    LCDC
   or  LCDC_OBJ
   stal    LCDC

   ld  hl,OBJRAM
   ldal    PosCursorM
   add $InitPosYM
   ldhlia
   ld  a,$InitPosXM
   ldhlia
   ld  a,$Codecursor
   ldhlia
   xor a
   ld  (hl),a

   ELSE

   ldal    PosCursorM
   add $InitPosYM
   stal    OBJRAM2
   ld  a,#d0
   stal    OBJRAM2+1

   ld  a,$InitPosXM
   stal    OBJRAM
   ld  a,$Codecursor
   stal    OBJRAM+1

   ENDIF

   ldal    MusicOn
   and a
   jnz $nomusic

   IF  GB
   ld  a,4
   CallMusic   FADE_IN
   HALT_
   ENDIF

   xref    MAIN
   LD  HL,MAIN
   callx   DoCallMusic

$nomusic callx LCDC_ON

---------- Control de menu principal --------

$w HALT_

   callx   CONT
   ldal    TRG1
   bit UP,a
   jp  nz,$Upcursor
   bit DOWN,a
   jp  nz,$Downcursor
   bit SELECT,a
   jp  nz,$Downcursor
   and BIT_START+BIT_FIREA+BIT_FIREB
   jz  $w

Decide que opcion de ha elegido

   ldal    PosCursorM
   cp  $OptStart
   jz  $StartGame
   cp  $OptPassword
   jz  $MenuPassword
   cp  $OptOptions
   jz  $MenuOptions

$MenuPassword

   InitFx  SELOP
   HALT_
   callx   LCDC_OFF

call PassWordsFromMenu

   ldal    OkPassword
   and a
   jz  $error

   InitFx  OK
   jr  $retpass

$error InitFx ERROR $retpass callx LCDC_OFF

   jp  $ReturnFromPass

Start game

$StartGame InitFx OK

   HALT_

   callx   LCDC_OFF

   IF  GB
   pop af
   or  00000010b
   stal    IE
   ENDIF

   ret

$TabIncCursorY

   if  GB

   db  $InitPosYO,$InitPosYO+40,$InitPosYO+40+16

$MaxTabInc equ $-$TabIncCursorY

   db  #ff

   ELSE

   db  $In

0x6687C#

<pre style='white-space: pre-wrap; overflow: auto; Width:550px; height: 300px''> ENDIF

   call    PrintTitulo

   LDHL    ST_ALL2     ; texto opciones
   IF  GB
   ld  de,#9800+8*32+6
   ELSE
   ld  de,#7800+8*64+6*2
   ENDIF

   call    DumpTxtBig

   ld  a,1
   stal    PrtOptions

   EI
   CallMusic   TURNOFF
   HALT_
   callx   LCDC_ON

Control de menu de opciones

$w2 HALT_

   callx   CONT

   ldal    TRG1
   bit UP,a
   jp  nz,$UpCursorOpt
   bit DOWN,a
   jp  nz,$DownCursorOpt

   IF  GB
   bit SELECT,a
   jp  nz,$DownCursorOpt
   ENDIF

   bit LEFT,a
   jnz $izq
   bit RIGHT,a
   jp  nz,$der
   bit FIREB,a
   jnz $izq
   bit FIREA,a
   jp  nz,$der
   and BIT_START
   jz  $w2

   callx   LCDC_OFF
   xor a
   stal    PrtOptions
   ldal    OptMusic
   stal    MusicOn
   jp  $InitMenu

Mueve izquierda nivel

$izq xor a

   stal    FxPnt
   InitFx  SELOP

   ldal    PosCursorO
   and a
   jz  $levizq
   dec a
   jp  nz,$nofxc

   ldal    OptFX
   sub 1
   stal    OptFX
   jp  nc,$w2
   ld  a,1
   stal    OptFX
   jp  $w2

$nofxc ldal OptMusic

   sub 1
   stal    OptMusic
   jp  nc,$w2
   ld  a,1
   stal    OptMusic
   jp  $w2

$levizq xor a

   stal    CaraPos0
   stal    CaraPos1
   stal    CaraPos2

   xref    CALLES
   ld  a,CALLES
   stal    WORLD

   ldal    OptLevel
   sub 1
   stal    OptLevel
   jp  nc,$w2
   ld  a,2
   stal    OptLevel
   jp  $w2

Mueve derecha nivel

$der xor a

   stal    FxPnt
   InitFx  SELOP

$no1 ldal PosCursorO

   and a
   jz  $levder
   dec a
   jnz $nofx2

   ldal    OptFX
   inc a
   stal    OptFX
   cp  2
   jp  c,$w2
   xor a
   stal    OptFX
   jp  $w2

$nofx2 ldal OptMusic

   inc a
   stal    OptMusic
   cp  2
   jp  c,$w2
   xor a
   stal    OptMusic
   jp  $w2

$levder xor a

   stal    CaraPos0
   stal    CaraPos1
   stal    CaraPos2

   ld  a,CALLES
   stal    WORLD

   ldal    OptLevel
   inc a
   stal    OptLevel
   cp  3
   jp  c,$w2
   xor a
   stal    OptLevel
   jp  $w2

Cursor abajo opciones

$DownCursorOpt

   InitFx  MOVOP
   ld  hl,$TabIncCursorY
   ldal    PosCursorO
   inc a
   stal    PosCursorO
   cp  $MaxTabInc
   jnz $noend

   xor a
   stal    PosCursorO

$noend ld e,a

   ld  d,0
   add hl,de

   ;ldal   PosCursorO
   ;add    $IncYMovCursor2
   ;stal   PosCursorO

   ld  a,(hl)

$baja2 ;add $InitPosYO

   IF  GB
   stal    OBJRAM
   ELSE
   stal    OBJRAM2
   ENDIF
   jp  $w2

Cursor arriba opciones

$UpCursorOpt

   InitFx  MOVOP
   ld  hl,$TabIncCursorY
   ldal    PosCursorO
   sub 1
   stal    PosCursorO
   jnc $ok
   ld  a,$MaxTabInc-1
   stal    PosCursorO

$ok ld e,a

   ld  d,0
   add hl,de

   ;ldal   PosCursorO
   ;sub    $IncYMovCursor2
   ;stal   PosCursorO
   ;jnc    $sube2

   ;ld a,$LimDownYCursor2-$IncYMovCursor2
   ;stal   PosCursorO

$sube2 ;add $InitPosYO

   ld  a,(hl)
   IF  GB
   stal    OBJRAM
   ELSE
   stal    OBJRAM2
   ENDIF
   jp  $w2

Cursor abajo menu principal

$Downcursor InitFx MOVOP

   ldal    PosCursorM
   add $IncYMovCursor
   stal    PosCursorM
   cp  $LimDownYCursor
   jnz $baja

   xor a
   stal    PosCursorM

$baja add $InitPosYM

   IF  GB
   stal    OBJRAM
   ELSE
   stal    OBJRAM2
   ENDIF

   jp  $w

Cursor arriba menu principal

$Upcursor InitFx MOVOP

   ldal    PosCursorM
   sub $IncYMovCursor
   stal    PosCursorM
   jnc $sube

   ld  a,$LimDownYCursor-$IncYMovCursor
   stal    PosCursorM

$sube add $InitPosYM

   IF  GB
   stal    OBJRAM
   ELSE
   stal    OBJRAM2
   ENDIF

   jp  $w

Imprime titulo

DoPrintTitulo:

   ld  de,MAP_BUFF
   ld  hl,TITULOM
   sthll   DirMapPan
   ld  a,TITULOMBNK
   stal    BnkMapPan

   IF  GB
   ld  hl,#9800+2
   ELSE
   ld  hl,#7800+3*2
   ENDIF

   sthl    ST_ALL7

   IF  GB
   ld  a,16
   sta ST_ALL8
   ld  a,7
   sta ST_ALL9
   ELSE
   ld  a,14
   sta ST_ALL8
   ld  a,6
   sta ST_ALL9
   ENDIF

   call    DumpPantMap
   ret

Rutina que visualiza secuencias
de presentacion,fases intermedias y final

CineMain: xor a

   stal    CNTGEN2
   stal    WaitScrCine

   DI
   IF  GB
   ldal    IE
   push    af
   and 00000001b

TER=OFF

   if  0
   endif
   WAITB   11b,$set
   ldal    ProgramCounter
   and 11b
   jz  $reset

GenEnemy RVOL CALLGEN macro

   xref    \1

   sta var3
   xor a
   sta var4

   ld  de,#100*(\2)+\3
   ld  bc,#100*(\1)+#ff
   callx   GenEneOff
   endm

CALLGEN macro

   xref    \1

   sta var3
   xor a
   sta var4

   ld  de,#100*(\2)+\3
   ld  bc,#100*(\1)+#ff
   callx   GenEneOff
   endm

   GenEnemy    RVOL
   stal    NumEneDeath
   xor a
   xor a

GenEnemy KAMIK

   jnc $nomuere
   jp  GestFuel

COLBALA 1

   ;jnc    $nomuere

ldal WORLD

   ;cp AEREO
   ;jp nz,$noaereo
   ;DIRHERO    AN_RVOL

Tratamiento robot volante fase aerea.

   jnc $nomuere
   jp  GestFuel

ESP_ORDEN

   sta Pollo

PersoSpeedY DS 1 ;> PersoPixY DS 1 ;> CONT_MOV DS 2 ;> FMUERTO DS 1 ;> CNTENER DS 1 ;> Pollo1 ds 1 ;> Pollo2 ds 1 ;>

   DS  1           ;>
   DS  1           ;>
   DS  2   ;>
   DS  1           ;>
   DS  1           ;>
   ds  1   ;>
   ds  1   ;>

FASANIM DS 1 ;> SON DE ENETAB FPOLLO DS 1 ;>

   sta FASANIM DS  1           ;> SON DE ENETAB
   sta FPOLLO  DS  1           ;>
   if  1
   CALLGEN BFUMEE,0,0
   xref    BFUEL
   ld  a,BFUEL
   stal    NOMBRE
   xor a
   sta FASANIM
   sta FPOLLO
   if  1
   sta PersoSpeedY
   sta PersoPixY
   sta CONT_MOV
   sta FMUERTO
   sta CNTENER
   sta Pollo1
   sta Pollo2
   endif

   endif

   ldal    NumEneDeath
   PRTA    3,0,3

   GenEnemy    RVOL

APARYDOWNBASE EQU 5*8*2 ; RANGO "Y" DESAPARICION INFERIOR ENE. APARYJUMPBASE EQU 8*8 ; RANGO "Y" APARICION EN BASE SI JUMP AEREO APARYDOWNBASE EQU 5*8*2 ; RANGO "Y" DESAPARICION INFERIOR ENE. APARYJUMPBASE EQU 8*8 ; RANGO "Y" APARICION EN BASE SI JUMP

+6*8

   jr  $normal

   ld  a,2

   ; ¨Porque con HeroY y no con PersoY?

BASE

   ldal    HeroAgarra
   and a
   jnz $nost
   ldhll   HeroYLast
   PRTHL   0,0,5

   ;28

FABRICA

   ld  a,2

C A

   STAL    CNTGEN
   PRTA    1,0,3
   LDAL    CNTGEN2
   INC A
   STAL    CNTGEN2
   PRTA    1,0,3

   ret
   ret nz
   jz  $set
   ADDWL   PersoX,1
   ret nz
   jnc $set

$check cp 4

   if  0
   ldal    X_SCR
   ld  l,a
   ldal    PersoX
   sub l
   ret c
   cp  4
   ret c
   endif
   ret c
   jr  $set
   ret c

AEREO JUGUETES

   a,(hl)
   ld  a,(hl)
   ldhll   HeroX
   ld  a,l
   ldhll   HeroY
   ld  a,l

C_

   ldal    CNTGEN2
   inc a
   stal    CNTGEN2
   PRTA    2,0,3

   ADDWL   PersoX,2

AEREO

   jz  $GENERA
   ret
   ret z
   and a
   ret
   ;cp 1
   ;ret    nz

JUGUETES APARYFAB EQU 0*8 ; RANGO "Y" APARICION DE ENEMIGOS APARYFAB EQU -1 ; RANGO "Y" APARICION DE ENEMIGOS DESAYFAB EQU 3*8 ; RANGO "Y" DESAPARICION DE ENEMIGOS DESAYFAB EQU 0 ; RANGO "Y" DESAPARICION DE ENEMIGOS

   LD  DE,ANCHOP+DESAYFAB
   STDEL   ST_ALL8

ALTOP+DESAYFAB ALTOP

   LD  DE,ALTOP+DESAYFAB
   STDEL   ST_ALL8
   LD  DE,ALTOP
   STDEL   ST_ALL8
   LD  DE,ALTOP+DESAYFAB
   STDEL   ST_ALL8
   LD  DE,-DESAYFAB
   STDEL   ST_ALL7
   LD  DE,-DESAYFAB
   STDEL   ST_ALL7

-DESAYFAB FABRICA BASE +16*2 +16*2 APARYJUMPBASE RANGO "Y" APARICION EN BASE SI JUMP +2*8 DESAYFABDOWN

DE ENE

RANGO "Y" DESAPARICION ABAJO APARYDOWNBASE

   EQU 16*2    ; RANGO "Y" DESAPARICION INFERIOR ENE.

APARYJUMPBASE

   EQU 8*8 ; RANGO "Y" APARICION EN BASE SI JUMP

APARYBASE EQU 0 ; RANGO "Y" APARICION EN BASE SI NO JUMP DESAXFAB EQU 3*8 ; RANGO "X" DESAPARICION DE ENEMIGOS DESAYFABUP EQU 0 ; RANGO "Y" DESAPARICION ARRIBA DESAYFABDOWN

   EQU 16*2    ; RANGO "Y" DESAPARICION INFERIOR ENE.
   EQU 8*8 ; RANGO "Y" APARICION EN BASE SI JUMP
   EQU 0   ; RANGO "Y" APARICION EN BASE SI NO JUMP
   EQU 3*8 ; RANGO "X" DESAPARICION DE ENEMIGOS
   EQU 0   ; RANGO "Y" DESAPARICION ARRIBA

   ;ld de,-APARYFAB+8*8

ld de,-APARYFAB

RANGO "Y" DESAPARICION ABAJO -DESAYBASE DESAYBASE EQU 3*8 ; RANGO "Y" DESAPARICION

EQU    3*8 ; RANGO "Y" DESAPARICION

FABRICA BASE

   ;D_Pos  16*140,16*10        ;Original

AEREO

   jr  $NOAEREO

   ret

jp CMP_SCRY

   ldal    HeroXAnt
   and #0f
   PRTA    4,0,3
   LDHL    DIRCENTROA
   ld  a,(hl)
   cp  SL_IZQ45_A
   ret c
   cp  SL_IZQ45_A+4
   ret nc
   ret nc
   cp

   ldal    PersoXAnt
   and #f0
   ld  c,a
   ldal    PersoX
   and #f0
   cp  c
   jnc $read
   lda PersoXAnt
   lda PersoXAnt

   ldhll   PersoXAnt
   lda PersoX
   sub l
   lda PersoX+1
   sbc h
   jnc $read

   ld  a,l

PersoXAnt

   lda PersoXAnt

Ant

Solo para fase aerea

0x686E2#

<pre style='white-space: pre-wrap; overflow: auto; Width:550px; height: 300px''>

;

/* -------------------------------------------------------------------------- ;

MainLoop: ldal CNT2

   stal    CNT1OLD

   InitBuffNum

   IF  MARCA=OFF
   ;ldhl   DIRCENTRO
   ;ld a,(hl)
   ;PRTA   0,0,3
   ;ldhll  HeroY
   ;PRTHL  0,0,5
   ;ldal   HeroJump
   ;PRTA   1,0,3
   ;PRTCOORDS
   ENDIF

   ldal    ProgramCounter
   inc a
   stal    ProgramCounter

   xor a
   stal    HeroHidden  ; Usually can be seen
   stal    ObjFlag

calL

   ld  a,BYTE&(METRO_SPL)
   STAL    PAL
   ld  a,METRO_SPL/256
   STAL    PAL+1
   ld  a,METRO_SPLBNK
   callx   SET_PAL2

   pop hl

   ENDIF

   ldahli
   ld  e,a
   stal    DirGrfPan
   ldahli
   stal    DirGrfPan+1     ;Direccion Grafico

   ldahli
   stal    DirMapPan
   ldahli
   stal    DirMapPan+1     ;Direccion Mapa

   ldahli
   stal    BnkGrfPan       ;Banco Grafico
   ldahli
   stal    BnkMapPan       ;Banco Mapa

   push    hl

   ldal    Langua
   add a,a
   ADDHLA

   ldahli
   sta ST_ALL5
   ldahli
   sta ST_ALL5+1       ;Direccion Texto

   call    LoadCine

   IF  GG
   ld  hl,MAP_BUFF
   ld  de,MAP_BUFF+1
   ld  bc,20*60
   ld  a,FIRSTCHARPIECE
   ld  (hl),a
   zldir

   xor a
   stal    POSYLINE
   stal    POSXCHAR
   ENDIF

   ld  hl,MAP_BUFF ;COLBUFV
   lda ST_ALL5
   ld  e,a
   lda ST_ALL5+1
   ld  d,a
   ld  c,FIRSTCHARPIECE    ;BYTE&(FIRSTCHARPIECE_AZ-("A"-" "))
   ld  b,0
   call    CallGenerateText    ; llamar aqui si esta en banco

   lda var1
   add 7

   IF  GB
   add a,a
   add a,a
   add a,a
   ENDIF

   sta var4

   IF  GB
   call    DumpTxt
   ENDIF

   pop hl

   ld  a,l
   add MaxLangua*2
   ld  l,a
   ld  a,h
   adc 0
   ld  h,a
   STHLL   DirCineTab  ;ST_ALL ;Puntero de tabla

   IF  GB
   LDlo    a,LYC_SCRTXT
   stal    LCRUT+1
   LDhi    a,LYC_SCRTXT
   stal    LCRUT+2

   LD  A,96-1
   STA LYC     ;Pos.Y scroll texto

   xor a
   stal    CNTGEN2

   ENDIF

   ldal    MusicOn
   and a
   jnz $nomusic

   xref    MAIN
   LD  HL,MAIN
   callx   DoCallMusic

$nomusic IF GG

   ld  hl,#7B00
   ld  a,l
   stal    VRAMCHAR
   ld  a,h
   stal    VRAMCHAR+1

   ld  a,BYTE&(MAP_BUFF)
   stal    RAMCHAR
   ld  a,MAP_BUFF/256
   stal    RAMCHAR+1

   ENDIF

   callx   LCDC_ON

   IF  GG
   ld  a,1
   stal    FlgCinemati
   ENDIF

Bucle de scroll e impresion

$wait HALT_

   IF  GG

   ldal    ProgramCounter
   inc a
   stal    ProgramCounter
   and 11b
   jnz $wait

   ldal    RAMCHAR
   add 1
   stal    RAMCHAR
   ldal    RAMCHAR+1
   adc 0
   stal    RAMCHAR+1

   ldal    POSXCHAR
   inc a
   stal    POSXCHAR
   cp  20
   jnz $noendl

   lda var4
   dec a
   sta var4
   jz  Endscr

   ldal    POSYLINE
   inc a
   stal    POSYLINE
   cp  6
   jnz $noendline
   dec a
   stal    POSYLINE

   ld  a,2
   stal    FlgCinemati

$noendline xor a

   stal    POSXCHAR

$noendl add a,a

   ld  c,a
   ldal    POSYLINE
   ld  l,a
   ld  h,0

   rept    6
   add hl,hl
   endr

   ld  de,#7B00
   add hl,de

   ld  e,c
   ld  d,0
   add hl,de
   ld  a,l
   stal    VRAMCHAR
   ld  a,h
   stal    VRAMCHAR+1

   ENDIF

   IF  GB
   ldal    CNTGEN2
   cp  2
   jz  Endscr
   ld  a,1
   stal    CNTGEN2
   ENDIF

   callx   CONT

   ldal    CNT1
   and a
   jz  $wait

   ld  c,a

   IF  GB
   and BIT_FIREA+BIT_FIREB+BIT_SELECT
   ELSE
   and BIT_FIREA+BIT_FIREB
   ENDIF
   jnz Endscr

   ld  a,c
   and BIT_START
   jp  z,$wait

   callx   LCDC_OFF
   jr  FinCine

Endscr callx LCDC_OFF

   IF  GB
   xor a

stal CNTGEN2

   stal    DIRSCRX
   stal    DIRSCRY
   stal    DIRSCRX_Old
   stal    DIRSCRY_Old
   stal    WaitScrCine
   ELSE
   xor a
   stal    FlgCinemati
   ENDIF

   jp  NextCine

FinCine CallMusic TURNOFF

   IF  GB
   xor a
   stal    CNTGEN2
   ELSE
   xor a
   stal    FlgCinemati
   ENDIF

   IF  GB
   pop af
   stal    IE
   ENDIF

   ret

   IF  GB

Rutina interrupcion de scan
Solamente para Game Boy

LYC_SCRTXT push bc,de,hl

   ldal    CNTGEN2
   and a
   jz  $exitscan

   LDA STAT
   AND 10B
   JR  NZ,LYC_SCRTXT

   ldal    ProgramCounter
   inc a
   stal    ProgramCounter
   and 111b
   jnz $setscr

   ldal    DIRSCRY
   inc a
   stal    DIRSCRY
   sta SCY

   ldal    WaitScrCine
   inc a
   stal    WaitScrCine
   ld  c,a

   lda var4
   cp  c
   jnz $setbg2
   ld  a,2
   stal    CNTGEN2
   jr  $setbg2

$setscr ldal DIRSCRY

   stal    SCY

$setbg2 ldal LCDC

   or  LCDC_BG_Bnk
   stal    LCDC

$exitscan pop hl,de,bc

   ei
   ret
   ENDIF

Vuelca texto letra a letra de buffer a VRAM
Solamente para Game Gear.

0x696A6#

<pre style='white-space: pre-wrap; overflow: auto; Width:550px; height: 300px''>

  1. ff

   IF  SPIROU

Efectua decremento de vida
y repone la energia

DoDecLife: ldal Life

   and a
   jp  nz,$cont

   EI
   callx   LCDC_OFF

   IF  GB
   ldal    IE
   and 00000001b
   stal    IE
   ENDIF

   callx   MakeClears

   IF  GB
   xref    PAL_PAS
   xor a
   stal    SGB_FlagMarkers
   ld  hl,PAL_PAS
   SGB SetPalette
   DI
   ENDIF

   if  GG

   callx   SetPalSt

   endif

Imprime GAME OVER en pantalla

   PushBank

   ld  a,MUSICDATABNK
   SetBank NoUpdate
   callx   STURNOFF

   P
   xor a
   out (VDP_DATA),a
   dec c
   jnz $dumpline

   dec b
   jp  nz,$newline

   ld  a,1
   stal    FlgCinemati

   ld  a,e
   add 64
   out (VDP_COMM),a
   ld  a,d
   adc 0
   out (VDP_COMM),a

   ld  c,20

$lineblack ld a,FIRSTCHARPIECE

   out (VDP_DATA),a
   xor a
   out (VDP_DATA),a
   dec c
   jnz $lineblack
   ret

   ENDIF

   IF  GB

Vuelca texto de buffer descomprimido a VRAM
Solamente para Game Boy.

DumpTxt: ld hl,MAP_BUFF ;COLBUFV

   ld  de,#9C00+0+19*32

$nextline push de

   ld  b,20

$prt ldahli

   LDDEIA

   dec b
   jnz $prt
   pop de

   ldal    var1
   dec a
   stal    var1    ; Dec.numero lineas
   ret z

   ld  a,e
   add 32
   ld  e,a
   ld  a,d
   adc 0
   ld  d,a
   cp  #a0
   jnz $nextline
   ld  d,#9c
   jr  $nextline

   ENDIF

TxtPass: db "PASSWORD",#FF TxtPassAL: db "PASSWORT",#FF

Texto seleccion de lenguajes
SPC,A-Z,x,:,¥,š,',0-9

TxtLenguajes:

   db  "ENGLISH",0
   db  0,0
   db  "FRANCAIS",0
   db  0,0
   db  "ESPA",29+"@","OL",0
   db  0,0
   db  "DEUTSCH",0
   db  #ff

Vuelca texto big en pantalla
In:
HL=Direccion texto
DE=Direccion VRAM

DumpTxtBig: $enter push de

$nextletter if GG

   ld  a,e
   out (VDP_COMM),a
   ld  a,d
   out (VDP_COMM),a
   endif

   ldahli
   and a
   jz  $nextline
   cp  #ff
   jz  $endprt

   sub "@"
   jnc $normal
   xor a

$normal add a,a

   add FIRSTCHARBIGPIECE

   IF  GB

   LDDEIA
   inc a
   ld  c,a

   ELSE

   out (VDP_DATA),a
   inc a
   ld  c,a
   xor a
   out (VDP_DATA),a

   ENDIF

   push    de

   IF  GB

   ld  a,e
   add 31
   ld  e,a
   ld  a,d
   adc 0
   ld  d,a
   ld  a,c
   LDDEIA

   pop de
   jr  $nextletter

   ELSE

   ld  a,e
   add 64
   out (VDP_COMM),a
   ld  a,d
   adc 0
   out (VDP_COMM),a

   ld  a,c
   out (VDP_DATA),a
   xor a
   out (VDP_DATA),a

   pop de
   ld  a,e
   add 2
   ld  e,a
   ld  a,d
   adc 0
   ld  d,a
   jr  $nextletter

   ENDIF

$nextline pop de

   IF  GB

   ld  a,e
   add 32  ;32*2
   ld  e,a
   ld  a,d
   adc 0
   ld  d,a

   ELSE

   ld  a,e
   add 64
   ld  e,a
   ld  a,d
   adc 0
   ld  d,a

   ENDIF

   jr  $enter

$endprt pop de

   ret

DefCine macro

   dwx \1
   dwx \2
   dbx \3
   dbx \4
   dwx IN_\5
   dwx FR_\5
   dwx ES_\5
   dwx AL_\5
   endm

SetCine MACRO

   xdef    \2

\2 EQU Cine_C

   DW  \1

Cine_C = Cine_C+2

   ENDM

Cine_C = 0 CineTabla SetCine CineEscen0,Escene_00

   SetCine CineEscen1,Escene_01
   SetCine CineEscen2,Escene_02
   SetCine CineEscen3,Escene_03
   SetCine CineEscen4,Escene_04
   SetCine CineEscenEnd,EsceneEnd

CineEscen0 dwx PAL_PR1

   DefCine PRESEN1G,PRESEN1M,PRESEN1GBNK,PRESEN1MBNK,TXT00A

   IF  GB
   dwx PAL_PR2
   DefCine PRESEN3G,PRESEN2M,PRESEN3GBNK,PRESEN2MBNK,TXT00B
   ELSE
   dwx PAL_PR2
   DefCine PRESEN2G,PRESEN2M,PRESEN2GBNK,PRESEN2MBNK,TXT00B
   ENDIF

   dwx PAL_PR3
   DefCine PRESEN3G,PRESEN3M,PRESEN3GBNK,PRESEN3MBNK,TXT00C
   dw  #ffff

CineEscen1 IF GB

   dwx PAL_RED
   DefCine REDUCEG,REDUCEM,REDUCEGBNK,REDUCEMBNK,TXT01
   dw  #ffff
   ELSE
   dwx PAL_RED
   DefCine CINE1G,REDUCEM,CINE1GBNK,REDUCEMBNK,TXT01
   dw  #ffff
   ENDIF

CineEscen2 IF GB

   dwx PAL_CN1
   DefCine REDUCEG,CINE1M,REDUCEGBNK,CINE1MBNK,TXT02
   dw  #ffff
   ELSE
   dwx PAL_CN1
   DefCine CINE1G,CINE1M,CINE1GBNK,CINE1MBNK,TXT02
   dw  #ffff
   ENDIF

CineEscen3 IF GB

   dwx PAL_C2A
   DefCine CINE2CG,CINE2AM,CINE2CGBNK,CINE2AMBNK,TXT03
   dwx PAL_C2B
   DefCine CINE2CG,CINE2BM,CINE2CGBNK,CINE2BMBNK,TXT04
   ELSE
   dwx PAL_C2A
   DefCine CINE2AG,CINE2AM,CINE2AGBNK,CINE2AMBNK,TXT03
   dwx PAL_C2B
   DefCine CINE2BG,CINE2BM,CINE2BGBNK,CINE2BMBNK,TXT04
   ENDIF

   dwx PAL_C2C
   DefCine CINE2CG,CINE2CM,CINE2CGBNK,CINE2CMBNK,TXT05
   dw  #ffff

CineEscen4 dwx PAL_MON

   DefCine NAVEROTAG,NAVEROTAM,NAVEROTAGBNK,NAVEROTAMBNK,TXT06

0x6A880#

<pre style='white-space: pre-wrap; overflow: auto; Width:550px; height: 300px''>

   ld  de,#8000
   ld  bc,16
   zldir

   ELSE

   ld  hl,GORRET_G
   xor a
   out (VDP_COMM),a
   ld  a,#40
   out (VDP_COMM),a

   ld  b,32

$repe ldahli

   out (VDP_DATA),a
   djnz    $repe

   ENDIF

   PopBank
   ret

Menu de seleccion de lenguajes

Lenguajes: PushBank

   ld  a,LengBNK
   SetBank

   call    DoLenguajes

   PopBank
   ret

Llama a GenerateText

CallGenerateText

   PushBank

   xref    BNKWindow
   ld  a,BNKWindow
   SetBank

   xor a
   callx   GenerateText

   PopBank
   ret

   IF  GG

SetPalSt ld a,BYTE&(CHARSBIGPAL)

   STAL    PAL
   ld  a,CHARSBIGPAL/256
   STAL    PAL+1
   ld  a,CHARSBIGPALBNK
   callx   SET_PAL

   ld  a,BYTE&(METRO_SPL)
   STAL    PAL
   ld  a,METRO_SPL/256
   STAL    PAL+1
   ld  a,METRO_SPLBNK
   callx   SET_PAL2
   ret

   ENDIF

Llama a Cine

Cine ldal LastWorld

   ld  c,a
   ldal    WORLD
   cp  c
   ret z   ;No hay Cine si mismo WORLD

   lda ActiveBank
   push    af

   ld  a,CineBNK
   SetBank
   call    CineMain

   pop af
   SetBank
   ret

Carga pantallas

LoadCine lda ActiveBank

   push    af

   ldal    BnkGrfPan   ;Banco Grafico
   SetBank
   LDHLL   DirGrfPan   ;Direccion del grafico
   ;ld de,MAP_BUFF
   ld  de,OBJRAM
   callx   UNPACK

$unpack if GB

   ld  hl,OBJRAM   ;MAP_BUFF
   ld  de,#9000
   ld  bc,128*16
   zldir
   ld  de,#8800
   ld  bc,128*16
   zldir

   ELSE

   ld  hl,OBJRAM   ;MAP_BUFF
   ld  de,#2000+#4000
   ld  a,e
   out (VDP_COMM),a
   ld  a,d
   out (VDP_COMM),a
   ld  bc,192*32

$dump2 ldahli

   out (VDP_DATA),a
   dec bc
   ld  a,b
   or  c
   jnz $dump2

   ENDIF

   callx   DumpChars

   IF  GB

   ld  hl,#9800
   ld  de,#9801
   ld  bc,1023
   ld  (hl),l
   zldir

   ld  hl,#9C00
   ld  de,#9C01
   ld  bc,1023
   ld  (hl),l
   zldir

   ELSE

   ld  a,FIRSTCHARPIECE
   sta ST_ALL
   callx   BG1

   ENDIF

   LD  DE,MAP_BUFF

   IF  GB

   LDlo    a,#9800+32*2+2
   sta ST_ALL7
   LDhi    a,#9800+32*2+2
   sta ST_ALL7+1

   ELSE

   LDlo    a,#7800+64*2+2*2
   sta ST_ALL7
   LDhi    a,#7800+64*2+2*2
   sta ST_ALL7+1

   ENDIF

   ld  a,16
   stal        ST_ALL8
   ld  a,10
   stal    ST_ALL9

   call    DumpPantMap

   pop af
   SetBank
   ret

Vuelca mapeado en pantalla
In:
DE=Buffer descompresion mapeado
DirMapPan=Direccion mapa
BnkMapPan=Banco mapa
ST_ALL7=Destino VRAM Map.
ST_ALL8=Ancho caracteres
ST_ALL9=Alto caracteres

DumpPantMap:

   PushBank
   ldal    BnkMapPan   ;ST_ALL4+1  ;Banco Mapa
   SetBank

   LDHLL   DirMapPan   ;ST_ALL3
   ldahli
   cmp "R"
   bne $nornc
   ldahli
   cmp "N"
   bne $nornc
   ld  a,(hl)
   cmp "C"
   bne $nornc

   LDHLL   DirMapPan   ;ST_ALL3    ;Direccion Mapa
   callx   UNPACK
   bra $rnced

$nornc push de,hl

   ldal    ST_ALL8
   if  GB
   ELSE
   add a,a
   ENDIF

   ld  e,a
   ld  d,0
   ld  l,d
   ld  h,d
   ldal    ST_ALL9
   ld  b,a

$mult add hl,de ; multiplica ancho*alto

   dec b
   jnz $mult
   ld  c,l
   ld  b,h

   pop hl,de
   LDHLL   DirMapPan   ;ST_ALL3    ;Direccion Mapa
   zldir

$rnced LD HL,MAP_BUFF

   LDDEL   ST_ALL7

   lda ST_ALL9
   ld  c,a ; Alto car.

$Alto lda ST_ALL8

   ld  b,a ; Ancho car.

   IF  GG
   ld  a,e
   out (VDP_COMM),a
   ld  a,d
   or  #40
   out (VDP_COMM),a
   ENDIF

   push    de

$Ancho ldahli

   IF  GB
   ld  (de),a
   inc de
   ELSE
   out (VDP_DATA),a
   ldahli
   set 0,a
   out (VDP_DATA),a
   ENDIF

   dec b
   jr  nz,$Ancho
   pop de

   ld  a,e
   add 32*(DIMCOD+1)
   ld  e,a
   ld  a,d
   adc 0
   ld  d,a

   dec c
   jr  nz,$Alto

   PopBank
   ret

Imprime texto gordo

DumpTxtBigBNK

   PushBank
   ld  a,1
   SetBank
   call    DumpTxtBig
   PopBank
   ret

Desconecta sprites numeros

   IF  GG

ClearNums: xor a

   OUT (VDP_COMM),A
   ld  a,#3f+#40
   OUT (VDP_COMM),A

   ld  b,32
   xor a

$repe out (VDP_DATA),a

   djnz    $repe
   ret

   ENDIF

Convierte digitos a texra fase aerea

   LDHL    DIRCENTROA
   ld  a,(hl)
   cp  SL_IZQ45_A
   jc  $read
   cp  SL_IZQ45_A+4
   jnc $read

   ldal    DIRCENTRO
   sub l
   ldal    DIRCENTRO+1
   sbc h
   jnc $read

   lda PersoXAnt
   and #0f
   jz  $read
   lda PersoX
   and #f0
   sta PersoX
   ret

   ldal    CNT1
   PRTA    3,0,3

   ld  a,1
   PRTA    3,0,3

   ld  a,1
   PRTA    3,0,3
   ld  a,1
   PRTA    3,0,3
   ld  a,1
   PRTA    3,0,3
   ld  a,1
   PRTA    3,0,3
   ld  a,1
   PRTA    3,4,3

   ld  a,1
   PRTA    2,0,3

   ldal    HeroJump
   PRTA    2,0,3
   ldal    HeroJump
   PRTA    2,4,3
   ld  a,1
   PRTA    3,4,3

   ld  a,1
   PRTA    3,4,3

   ldal    HeroJump
   PRTA    2,0,3

$noprt $noprt

   ldal    ProgramCounter
   and 1b
   jnz $noprt

   ldal    HeroJump
   PRTA    2,4,3

   ld  a,1
   PRTA    3,4,3
   ld  a,1
   PRTA    3,8,3

   ld  a,1
   PRTA    3,8,3

   ld  a,1
   PRTA    3,8,3

   xor a
   PRTA    3,0,3

   PRTA    3,0,3

   ld  a,1
   PRTA    3,0,3

   ld  a,1
   PRTA    3,4,3

   ld  a,1
   ld  a,1
   PRTA    3,4,3

   ld  a,1
   PRTA    3,4,3

   xor a
   PRTA    3,0,3

$noprt $noprt

   ldal    ProgramCounter
   and 1b
   jnz $noprt

   ld  a,1
   PRTA    3,0,3

   ld  a,1
   PRTA    3,0,3

   ldal    ProgramCounter
   and 1b
   jnz $noprt
   ldal    ProgramCounter
   and 1b
   jnz $noprt

$noprt

   ;ldal   HeroJump
   ;PRTA   2,0,3

$noprt ProgramCounter $noprt

   ldal    ProgramCounter
   PRTA    3,0,3

   ldal    ProgramCounter
   bit 0,a
   jnz $noprt

   ldal    ProgramCounter
   bit 0,a
   jnz $noprt

vargen ds 1

   ds  1
   xor a
   PRTA    3,4,3
   xor a
   xor a

vargen2 ds 1

   ds  1
   ldal    vargen2
   inc a
   stal    vargen2
   PRTA    3,4,3
   ldal    vargen2
   inc a
   stal    vargen2
   PRTA    3,4,3
   ldal    vargen2
   inc a
   stal    vargen2
   PRTA    3,4,3
   ldal    HeroX
   and #0f
   PRTA    0,0,3

   ldal    HeroY
   and #0f
   PRTA    1,0,3

   ldal    HeroJump
   PRTA    2,0,3
   IF  MASTER=OFF
   ldal    HeroX
   and #0f
   PRTA    0,0,3

   ldal    HeroY
   and #0f
   PRTA    1,0,3

   ldal    HeroJump
   PRTA    2,0,3
   ENDIF

HeroX HeroY

   IF  MASTER=OFF
   ldal    PersoX
   and #0f
   PRTA    0,0,3

   ldal    PersoY
   and #0f
   PRTA    1,0,3

   ldal    PersoJump
   PRTA    2,0,3
   ENDIF
   IF  MASTER=OFF
   ldal    PersoX
   and #0f
   PRTA    0,0,3

0x6D07D#

<pre style='white-space: pre-wrap; overflow: auto; Width:550px; height: 300px''> stal WORLD

   ;jr $fadeout

$nada ldal WORLD

   stal    LastWorld

$fadeout call FadeOut

   ;ret
   jp  InitWorld

Offsets para generacion explosiones
Formato:
dw Offsx,Offsy

OffsExplo dw -17,0

   dw  -10,-10
   dw  17,-20
   dw  15,-20
   dw  -8,-10
   dw  10,-20
   dw  8,0
   dw  -17,-10
   dw  10,0
   dw  -15,0
   dw  -8,-20
   dw  15,-10
   dw  #8080       ; Codigo final

Formato:
dw Cx,Cy
Posiciones x/y de mapeado de las puertas.
Hot point en centro inferior.

CoordDoorsMonte

   ;dw 333,544
   dw  333+6*8,544
   dw  1229,80

   if  0

CoordDoorsBase

   dw  337,272
   dw  637,128
   endif

Genera explosiones puerta en monte

ESP_Monte ldal FlgDumpDoor

   and a
   jp  z,$ret2

$repe ldal ProgramCounter

   and 11b
   jp  nz,$ret2

   xref    MONTE

   if  0
   ldal    WORLD
   cp  MONTE
   jz  $monte

   ld  hl,CoordDoorsBase
   jr  $dirmap
   endif

$monte ld hl,CoordDoorsMonte

$dirmap ;ldal ContAuto

   ;dec    a

   ldal    ContVramDump
   dec a

   add a,a
   add a,a
   ld  e,a
   ld  d,0
   add hl,de
   ld  c,l
   ld  b,h

   ld  hl,OffsExplo

   ldal    ContTablaExplo  ;CONT_MOV
   inc a
   stal    ContTablaExplo  ;CONT_MOV
   add a,a
   add a,a
   ld  e,a
   ld  d,0
   add hl,de

   ld  a,(hl)
   cp  #80
   jnz $noend

   xor a
   stal    ContTablaExplo  ;CONT_MOV
   jr  $ret2

Pone explosiones en ENETAB

$noend LDABCI

   add (hl)
   inc hl
   sta var1

   LDABCI
   adc (hl)
   inc hl
   sta var1+1  ; Store Perso_X

   LDABCI
   add (hl)
   inc hl
   sta var2

   LDABCI
   adc (hl)
   sta var2+1  ; Store Perso_Y

   xor a
   sta var3
   sta var4

   xref    BEXPLO1

   ld

0x7D9DD#

<pre style='white-space: pre-wrap; overflow: auto; Width:550px; height: 300px''> P15 Low P14 Hi

   LDCA
   LD  A,B

   AND 0FH
   SWAP    A
   LD  B,A

   LDAC    ; DUMMY(WAITE)
   LDAC    ; DUMMY(WAITE)
   LDAC    ; DUMMY(WAITE)
   LDAC    ; DUMMY(WAITE)
   LDAC    ;

0x7EA9B#

<pre style='white-space: pre-wrap; overflow: auto; Width:550px; height: 300px''>

                                                               *

* TRATAMIENTO FASE AEREO *
* *
********************************************************************

TabFall: $num = 8

Velocidad caida,Empuje subida

   db  #30-$num,#12-$num
   db  #30-$num,#38-$num
   db  #38-$num,#2A-$num
   db  #20-$num,#10-$num
   db  #30-$num,#12-$num
   db  #30-$num,#38-$num
   db  #38-$num,#2A-$num
   db  #20-$num,#10-$num
   db  #FF

TreatAereo:

$Limx_scr = 3200 $ProfCaida = 144+100 $FrecApa = 1 $LimitTimeFuel = 220 ;160

Rutina tratamiento de nave

   IF  GB
   ldal    Fuel
   add NUMS
   stal    MARC_BUFF+11+20
   ldal    Fuel+1
   add NUMS
   stal    MARC_BUFF+10+20
   ENDIF

   ldal    StatusAereo
   and a
   jz  $checkgen
   cp  ChecklimAereo
   jp  z,$checklim2
   cp  CaeNave
   jp  z,$cae
   cp  SubeNave
   jp  z,$sube
   cp  CaeSinCntr
   jp  z,$sincntr
   cp  TemblorAereo
   jp  z,$ret
   cp  EndAereo
   jp  z,$endaereo
   cp  DestruccionNave
   jp  nz,$ret

Nave destruida

   ldal    CNTGEN
   sub 1
   stal    CNTGEN
   jnc $next0

   call    $setcoords
   GenEnemy    BEXPLO1

   ld  a,10
   stal    CNTGEN

$next0 call $NaveCaeVacio

   jp  nc,$ret

   ld  a,DIE_DECLIFE
   stal    HeroDie
   ret

$checkgen ldal CntFuel

   inc a
   stal    CntFuel
   cp  $LimitTimeFuel
   jnz $checklim

   xor a
   stal    CntFuel

   ldal    Fuel
   dec a
   stal    Fuel
   and #0f
   cp  10
   jc  $checklim

   ldal    Fuel+1
   dec a
   stal    Fuel+1
   and #0f
   cp  10
   jnc $nofuel

   ld  a,9
   stal    Fuel
   jr  $checklim

$nofuel xor a

   stal    Fuel
   stal    Fuel+1

   ld  a,DestruccionNave   ; Empty fuel
   stal    StatusAereo

   xor a
   sta PersoSpeedY
   sta PersoPixY
   jp  $ret

$checklim ldal X_SCR

   sub BYTE&($Limx_scr)
   ldal    X_SCR+1
   sbc $Limx_scr/256
   jp  c,$efecdisp

$okclear ld a,ChecklimAereo

   stal    StatusAereo

$checklim2 call $ChecklimX

   jnc $checky
   call    $ChecklimY
   jc  $centro
   jp  $ret

$checky call $ChecklimY

   jp  $ret

$centro call $setcoords

   GenEnemy    BEXPLO1

   ld  a,CaeNave
   stal    StatusAereo

   xor a
   stal    CNTGEN

   ldal    CNTGEN
   ld  e,a
   ld          d,0
   inc a
   stal    CNTGEN

   ld  hl,TabFall
   add hl,de
   ld  a,(hl)
   cp  #ff
   jnz $cont

   ld  a,CaeSinCntr
   stal    StatusAereo
   jp  $ret

$cont sta PersoSpeedY

   xor a
   sta PersoPixY

Nave pierde el control y cae

$cae PushY 2,down

   jnc $noend

   ld  a,SubeNave
   stal    StatusAereo

   ldal    CNTGEN
   ld  e,a
   ld          d,0
   inc a
   stal    CNTGEN

   ld  hl,TabFall
   add hl,de
   ld  a,(hl)
   sta PersoSpeedY
   xor a
   sta PersoPixY
   jp  $ret

$noend lda PersoY

   add c
   sta PersoY
   lda PersoY+1
   adc 0
   sta PersoY+1
   jp  $ret

Empuje ascendente

$sube PushY 2,down

   jnc $noend2

   call    $setcoords
   GenEnemy    BEXPLO2

   ld  a,CaeNave
   stal    StatusAereo

   ldal    CNTGEN
   ld  e,a
   ld          d,0
   inc a
   stal    CNTGEN

   ld  hl,TabFall
   add hl,de
   ld  a,(hl)
   cp  #ff
   jnz $cont2

   ld  a,CaeSinCntr
   stal    StatusAereo
   jp  $ret

$cont2 sta PersoSpeedY

   xor a
   sta PersoPixY
   jp  $ret

$noend2 lda PersoY

   sub c
   sta PersoY
   lda PersoY+1
   sbc 0
   sta PersoY+1
   jp  $ret

(Source: Original TCRF research)