If you appreciate the work done within the wiki, please consider supporting The Cutting Room Floor on Patreon. Thanks for all your support!

Turok: Battle of the Bionosaurs

From The Cutting Room Floor
Jump to navigation Jump to search

Title Screen

Turok: Battle of the Bionosaurs

Also known as: Turok (JP)
Developer: Bit Managers
Publishers: Acclaim Entertainment (US/EU), Starfish (JP)
Platform: Game Boy
Released in JP: August 7, 1998
Released in US: December 1, 1997
Released in EU: 1998


SourceIcon.png This game has uncompiled source code.
DevMessageIcon.png This game has a hidden developer message.
DevTextIcon.png This game has hidden development-related text.
DebugIcon.png This game has debugging material.
SoundtestIcon.png This game has a hidden sound test.
LevelSelectIcon.png This game has a hidden level select.


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

Level Select

Turok Battle of the Bionosaurs Level Select.png

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

Turok Battle of the Bionosaurs Free Movement Mode.png

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

Turok - Battle of the Bionosaurs (GB)-dedication.png

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

Turok - Battle of the Bionosaurs (GB)-soundtest.png

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

Turok - Battle of the Bionosaurs (Game Boy)-memoryview.png

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