the cutting room mirror

Turok: Battle of the Bionosaurs

This article has a talk page!This article has a talk page!
view on tcrf.net

A port of Turok: Dinosaur Hunter in which unlike the other Turok Game Boy Color games remains faithful to its N64 counterpart.

Level Select#

Enter ZYDRTRKLVL as a password, then during gameplay, pause and press A + B. Press Left or Right to choose a level, and A, B, or Start to go to the chosen level.

Free-Movement Mode#

Enter ZYDRTRKBRD as a password, then during gameplay, hold Select and press A. Use the D-Pad to move Turok around and hold Select, then press A again to place him.

Dedication Screen#

Enter CGRZYDLYNY as a password, the "BAD PASSWORD" will be displayed. Hold B + Up + Right and press Start, the dedication to Carol, the same as in some other games of the same developers will appear.

Sound Test#

At the title screen, press Up once, then one more and hold it. The cursor must point to the "START" option. Press Start to access the Sound Test mode instead of the starting new game. Use A / B / Left / Right to change the music/fx numbers, or Up / Down / Select to select menu items. Press Start to play music or exit this menu.

Debug Leftovers#

Memory Watch#

Use the Game Genie code 489-16A-D5F to re-enable the debug Memory Watch function. To use it, enter the Level Select cheat, and press A + B on pause. Then use Up / Down to change the current address, hold A or B additionally to increase address by 0x10 or 0x100 correspondingly.

Frame Advance#

Use the Game Genie codes 009-1CA-80A+009-1DA-D55 (for the US version) to re-enable the frame advance mode instead of the pause mode. Press Start to toggle this mode on or off. When on, press Select to advance the game frame by frame.

Unused Text#

There is a lot of garbage data, which is random data from the memory of the PC where the game is compiled. Different versions of the same game may have different data. This is a very common thing for at least Bit Managers' development tools. Sometimes, inside the garbage you may find development-related text or something more interesting.

In the Japanese version, the first chunk of garbage starts at 0x33E0, but has text sitting at 0x3889. This is portions of the OBJ data files for compilator or debugger with lists of labels. The same area of the US version contains some early version of the level data block from BANK1 of its ROM. Level data is the same, but offsets to chunks are shifted, so it just was placed in a different location previously. The following is a clean list of the labels, extracted from the data structures in this garbage data.

FPOLLO4
MIN_X_HID_RUINAS
CAMPAIGNER_ENERGY
CondorEndStatus
YDOWNENEIN
DURMIN1
HeroAttLoaded
LevelAliveTab
DumpWeapon
BulletDown
TROMPIEZA_LEV
LIMITE_YUPSPRINT
MIN_Y_HID_RUINAS
PersoFlags_HIDDEN
LCDCINT
DURMIN2
ObjHeroX
BlockCNT1
CARACTERISTICA
MAX_X_HID_RUINAS
DURMAX1
DURMIN3
AGUAMIN
ObjHeroY
CommonRexEnergy
ALIENW_BUL
ROCKET_AMM
POSMARK_BONUS
BNK_POSTAB
COLBUFH
DURMAX2
TiempoGenSuelos
BullFusion
BNK_ENEPOS
TXTFLAG_Mark
CENTROYCON
COPY_CARAS
DURMAX3
AGUAMAX
W_GUN2_FUSION
LIM_ABA
ALTURA_COL
CommonCampLIM_DER
TIEMPO_HUGO_HA_CAIDO
HUGO_SALTA
TalkParX
HeroApoY
LIVETAB
HeroTalkedCnt
TalkParY
COMP_VARS_LEN
TITULSBUFF
DURMIN_OBJ
HeroXAnt
GameTime
SaveData
ALIENW_GOT
MINDETECCIONX_BOLAOBJETO
PALSP_MARK
BitBITSCR_Up
LockRama
PuzzleTimeSpeed
WORLD_SPRSBNK
WORLD_PSEUDOS
HeroYAnt
JumpLittle
OBJECTS
Error
RoadCircuitLenEasy
CommonMantisLIM_IZQ
W_PARTICLE
BullPistol
ROCKET_BUL
MINDETECCIONY_BOLAOBJETO
Psize
DiffEasy
PuertoTalk
DURMAX_OBJ
CrisFlag
OffXDown
MAXDETECCIONX_BOLAOBJETO
LIFT_ENTER
SPECIAL_HIDDEN
Cha
LIVE_NoReapear
HeroEsperandoPacha
DECSCRX
VelDecOxigeno
DataSW5A1A
CommonMantisOnFlag
OffYDown
MAXDETECCIONY_BOLAOBJETO
RUT_CHQ_DESPL
MAXSPRSGRF
MAPSPR_BNK
PAL0
AGABLALEMIN
SnowManSpeedY
DataSW5A1B
MAX_BULLET
OffXFrnt
PAL1
FlagDoor
HeroAttReload
DataSW5A1C
FUSION_AMM
OffYFrnt
BNK_VBLEXT
OBJECTS_TABLE_LEN
TROMPIEZA_RUN
MAX_CHR_GG
WIND_RIGHT
MAX_WEAPON
XLEFTSPRIN
RoadCars
AGABLALEMAX
LevelTab
DataSW5A1D
CommonCampCnt
PIEDRAS_LEVEL1
CONDOR_DERECHA
Che
RoadPixY
CodeMap3D
PosXSaco
DataSW6D

The second garbage chunk in the Japanese version is at 0x7B42.

ASHOTGUN_GOT
SnowDummy
BLAMIN
SuperGameBoy
HeroHit
CommonRexOff
FINALPOSX
AguaVRAM
PuzzleFinished
FLAG_SIZE
CommonRexLIM_DER
TIEMPO_VAPOR
BLAMAX
LADMIN
FLG_SIZEB
TalkSeq
MaxAnimacion
TIME_PIEDRAS_MEDIUM
JumpLevelOne
VER_64
MonjeOn
PlatCnt
ENELEN
UPOUTFLAG
VARSINCRO
RoadSpeedTxt
LADMAX
PuzzleLastAuto
V01
SnowBallWait
CommonRexGrf
ScrollSpeedX
MuseoAlbertTalked
AguaAdd1
ProgramCounter
V11
MULDEA
ANCHOP
B_ATTACK_RELEASE
KW_ATTACK
W_GUN1_PULSE
AguaAdd2
DoorCnt
MaxEnergyVar
HeroDoorNextLevel
CounterPMira
FlgGenSaco
GRFBNK
MARC_PIEZ
YETI_DERE
PresentFLG
LIMX_DERF
AguaAdd3
DiffiOnOff
FLAGDOOR_BAJA
HEROAL
AutoTbl
RoadCarLen
HeroCreeping
OBJRAM
LIMITE_XRIGHTENEINT
WIND_LEFT
BIT_RIGHT
ACode
END_HOT_VARS
DMASUB
CHTWeapons
NORMAL_CONDOR_SPEED
FUSIL_AMM
LCDC_WinBnk
MAXENE
BITSCR_Down
AutoCnt
WORLD_TAB
SnowBallJump
DOOR_MASK
HUGO_SEAGACHA
OffsetX
PosXHeadSnowMan
OldRoadFas
TMP0cred
AddGrenade
GrenadeFront
ALTURA_DE_PIE_HEROE
SELECT
OffsetY

The same place in the US version is filled with this garbage:

MURIENDO
VDP_DATA
HIGHC
MAX_SPEEDY_GRENADE
SAVE_CHK
TreatCrouch
HeroInRam
PreviousWorld
CondorPosMP1
DTMP0
DO_SCROLLXL
CampaignerDead
POSMARK_KEY
BNK_MISC
DTMP1
DO_SCROLLYL
HeroAttAn
CAIDA_PIEDRA
BIT_REAP
LevelTab_Level
BullMinigun
BNK_WEAP
PasoAPaso
DTMP2
TabDataPiedros
CONDOR_MURO
FIREA
P_ATTACK
DTMP3
NUM_PIEZAS_WIN
FIREB
STONED_JUMP
SaveHighY
ROW_HEAD
DTMP4
callfarHL
LIMITE_XLEFTENEINT
MAXSLOPE
BIT_LEFT
FXSPLASH
Piedras3Scroll
PuzzleCounter
Energy
CheatMode
DTMP5
MusicNumber
Weapon
DERECHA_PANTALLA_HEROE
WT_Select
SWIM_SPLASH
SHOTGUN_BUL
TalkTemWindSpd
DTMP6
SPRITESA
DO_SCROLLXR
CLIMB_UP
TIME_AGARRED_SWING
H_Message
AguaROM
Inmune
DTMP7
DO_SCROLLYR
LASTDOWN
SnowBallSpeedY
WIDEC
SELWORLD
YUPENEIN
DTMP8
RANDH
PointToTray
TreatAttackTurok
FINAL_PANTALLAX
AgaAdjRightX
SPRS_8X8
ObjHeroLastJoy
NumeroSacos
DelayShoots
STONED_STGU
FXPUERTA
HeroControl
POS_GAP_CONDORPSEUDOS
NUMENE_ORGMOVIBLES
HUGO_MUEREBUCEA
FXMUERTE

Data between 0xADE8 and 0xC000 in the Japanese version is a partial binary bank of the very early version of BANK1 for the other Bit Managers' game Otto's Ottifanten: Baby Bruno's Nightmare. It contains the early version of the "Dedication" cheat, which is only present in the early proto, but all menus are the same as in the final game, except there are no strings for other languages, scenario texts and other evidences of the game name itself. However, text and code for the Language selection menu is present in this data chunk. Offsets in this code matches the actual data offsets in BANK1, but shifted to 0x2000 higher.

The same area of the US version filled mostly with a copy of the BANK3 data and code with just a few additional garbage leftovers.

HeroClimbCnt1
LastHeroXR
RoadCarNum
WIDESP
WORLD_OBJECTSBNK

And finally, the Japanese version has a lot of binary data with sources, it seems the internal structures of the compilator as well.

PSEUDOS
;   LDBCL   WORLD_LENPSEUDOS
    ld  bc,MAXLENPSEUDOS    ;LALALA
    CALLX   UNPACK

;   LD  A,E
;   SUB PSEUDOS&BYTE
;   STAL    WORLD_LENPSEUDOS
;   LD  A,D
;   SBC (PSEUDOS>>8)&BYTE
;   STAL    WORLD_LENPSEUDOS+1  ;LALALA

    ;Mete los bloques del mapeado en la pantalla...

    LD  HL,#9800
    LD  DE,#9801
    SUB A
    LD  (HL),A
    LD  BC,#9C00-#9800-1
    ZLDIR

    ldal    Level
    cpx W8c1
    bne $noloadrex

    ld  hl,#8800+(NUM_PIEZAS_MARCADOR)*#10
    ld  de,#8800+(NUM_PIEZAS_MARCADOR)*#10+1
    ld  bc,#10-1
    ld  (hl),0
    zldir

    StBnkLenx   REXGRF
    ld  de,#8800+(NUM_PIEZAS_MARCADOR+1)*#10
    call    UNPACK

    ; Clears T-REX buffer

    ld  hl,#9c00
    ld  b,32;10
$cline  ld  c,32
    xor a
$cbyte  ldhlia
    dec c
    bne $cbyte
    dec b
    bne $cline

$noloadrex  LDAL    WORLD_GRAFICSBNK
    SetBank

    LD  DE,#8800
    LDAL    PIEZAS_MARCADOR
    LD  L,A
    LD  H,0
    REPT    4
    ADD HL,HL
    ENDR
    ADD HL,DE
    LD  E,L
    LD  D,H

    LDHLL   WORLD_GRAFICS
    LD  BC,512  ;Tama¤o por defecto
    CALLX   UNPACK  ;Descomprime los gr ficos...

    ;*** Entra en DE con por donde se quedo el compresor

    PUSH    DE
    CALL    INTERCHANGE ;Intercambia las posiciones de las piezas
            ;de background

    ldal    Level
    cmp W8c1
    bne $nomapREX

    StBnkLenx   REXMP1
    ld  de,MAPREX
    callx   UNPACK

    ld  hl,MAPREX
    ld  bc,ce
    ret nc

    ldal    HeroSwim
    and a
    bne $kwater

    ldal    HeroCreeping
    and a
    bne $kcreep

    ld  de,#10
    bra $kt

$kcreep ld  de,#18
    bra $kt

$kwater ld  de,#18
    bra $kt

$kt ldal    HeroLastJoy
    bit RIGHT,a
    bne $nn
    ld  a,e
    cpl
    ld  e,a
    ld  a,d
    cpl
    ld  d,a
    inc de
$nn
    ld  a,BullKnife
    ldhlia
    lda HeroY
    ldhlia
    lda HeroY+1
    ldhlia
    lda HeroX
    add e
    ldhlia
    lda HeroX+1
    adc d
    ldhlia

    ld  a,#0a   ; Time on
    ldhlia

    ret

AddGrenade: ; C=Type of bullet
    ; DE=Main speed of bullet

    ld  hl,GrenadeIniTab
    call    IniBullCommon
    ret nc

    ld  b,0

    ; BC=Speed Y
    ; DE=Speed X

    call    SaveBullData

    ret

AddBullet:  ; C=Type of bullet
    ; DE=Main speed of bullet

    ld  hl,BulletIniTab
    call    IniBullCommon
    ret nc

    call    SaveBullData

    ret

IniBullCommon:
    STHL    var1

    ldal    WeapFX
    rst #10

    call    FindBullPlace
    ret nc  ; Full!

    ld  a,c
    ldhlia

    push    hl

    LDHL    var1
    call    AdjBullData

    pop hl

    scf

    ret

AdjBullData:
    ldal    HeroJump
    and a
    beq $floor

    bra $ok ; In air, only front!

$floor  ldal    HeroAttAn
    cmp AnimShtFrnt
    beq $ok

    inc hl
    inc hl
    cmp AnimShtUp
    beq $ok

    inc hl
    inc hl
    cmp AnimShtTop
    beq $ok

    inc hl
    inc hl
    cmp AnimShtDwn
    beq $ok

    ret

$ok ldahli
    ld  h,(hl)
    ld  l,a
    jp  (hl)

GrenadeIniTab:
    dw  GrenadeFront,GrenadeUp,GrenadeTop,GrenadeDown

GrenadeFront:
    ld  c,#10+#80

    ret

GrenadeUp:
    ld  c,#60+#80

    ret

GrenadeTop:
    ld  de,1

    ld  c,#60+#80

    ret

GrenadeDown:
    ld  c,+#28

    ret

BulletIniTab:
    dw  BulletFront,BulletUp,BulletTop,BulletDown

BulletFront:
    ld  bc,0

    ret

BulletUp:
    ld  a,e
    cpl
    ld  c,a
    ld  a,d
    cpl
    ld  b,a
    inc bc

    ret

BulletTop:
    ld  a,e
    cpl
    ld  c,a
    ld  a,d
    cpl
    ld  b,a
    inc bc

    ld  de,0

    ret

BulletDown:
    ld  c,e
    ld  b,d

    ret

FindBullPlace:
    ld  hl,BULTABLE
    ld  b,MAX_BUL
$search ld  a,(hl)
    cmp #ff
    beq $found

    ADDHL   LENBT
    dec b
    bne $search

    and a
    ret

$found  scf
    ret

        ; No, Bow, Pis, Gu1, Gu2

        ; No, Bow, Pis, Gu1, Gu2
OffXUp: dw     0,  14,  16,  18,  18
OffYUp: dw     0, -28, -32, -26, -26

        ; No, Bow, Pis, Gu1, Gu2
OffXTop:    dw     0,   2,  -2,  -1,   0
OffYTop:    dw     0, -32, -40, -32, -32

        ; No, Bow, Pis, Gu1, Gu2

OffYDown:   dw     0,  -8, -16, -16,  -4

SaveBullData:
    ldal    HeroJump
    and a
    beq $floor

    bra $front  ; In air, only front!

$floor  ldal    HeroAttAn
    cmp AnimShtFrnt
    beq $front

    cmp AnimShtUp
    beq $up

    cmp AnimShtTop
    beq $top

    cmp AnimShtDwn
    beq $down

    xor a
    sta var1
    sta var1+1
    sta var2
    sta var2+1

    bra $put

$front  stw var1,OffYFrnt
    stw var2,OffXFrnt

    bra $put

$up stw var1,OffYUp
    stw var2,OffXUp

    bra $put

$top    stw var1,OffYTop
    stw var2,OffXTop

    bra $put

    stw var2,OffXDown

$put    push    h11*5+10*5*4",0
    lda var1
    ld  e,a

$bytere