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

Rollerball (NES)

From The Cutting Room Floor
Jump to navigation Jump to search

Title Screen

Rollerball

Developer: HAL Laboratory
Publishers: HAL Laboratory (JP/AU), HAL America (US)
Platform: NES
Released in JP: December 12, 1988
Released in US: February 1990
Released in AU: 1992


SourceIcon.png This game has uncompiled source code.
GraphicsIcon.png This game has unused graphics.
RegionIcon.png This game has regional differences.


DCIcon.png This game has a Data Crystal page

Rollerball is a pinball game that was first released on the MSX in 1984.

Unused Screen Data

Rollerball-TitleUnused.png

The remains of an unused screen are present at the end of the title screen data, below the point where the screen normally stops scrolling. It contains a duplicate copy of the final copyright text, two tiles from the top of the skyscraper (normally rendered as sprites), and unused border tiles on the left and right sides. The tilemap was not updated to match the reorganized CHR data in the international versions, causing the duplicate copyright string to be rendered as gibberish.

(Source: BMF54123)

Source Code

The Japanese version has a large section of source code left in the ROM, some of which is commented. It covers various elements of the "Sky High" (or "Floor A") screen at the very top of the table, including the bumpers, arrows, and "SHOOT AGAIN" and "ADV. MULT." indicators. (NOTE: The value 0xFE was originally used as a new line character; this has been replaced with a proper new line here for readability.)

At 0x2810:

BLINK_RLOV##
	CPX	#$FF
	BEQ	SKYHIGH1
	DEC	BLINK_COUNT
	BNE	SKYHIGH1
	LDY	#30		;消えている期間の長さ
	LDA	BLINK_FLAG
	EOR	#$FF
	STA	BLINK_FLAG
	BEQ	SKYHIGH0
	LDY	#30		;光っている期間の長さ
SKYHIGH0::
	STY	BLINK_COUNT
SKYHIGH1::
	ldx	#7-1
	stx	@i
1$		ldx	@i
		CPX	BLINK_RLOV##
		BNE	2$
		LDA	BLINK_FLAG
		BNE	3$
		BEQ	9$
2$		lda	skyhigh_stat##,x
;		cmp	#OFF
		beq	9$
3$		ldy	skyhigh_dat_y,x
		lda	skyhigh_dat_x,x
		tax
		lda	#low.skyhigh_obj
		sta	@arg
		lda	#high.skyhigh_obj
		sta	@arg+1
		call	wobj##
9$		dec	@i
		bpl	1$

	rts

 endproc skyhigh
 
;--------------------------------------
; Data Table for displaying 'SKYHIGH'.
;--------------------------------------
 data skyhigh_dat
skyhigh_dat_x::
	db	9*8+4,16*8+0,22*8+4,8*8+4,13*8+4,18*8+4,23*8+4
skyhigh_dat_y::
	db	12*8+4,11*8+4,12*8+4,19*8+4,16*8+4,16*8+4,19*8+4
 enddata skyhigh_dat
 
 data skyhigh_obj
	db	1
	db	-5, $10, %00100010, -4
 enddata skyhigh_obj


;・・・・・・・・・
;・A面:バンパー・
;・・・・・・・・・

;
; Screen Address of each Bumper in Floor A
SCRBUMP_S	EQU	$2000+$20*$B+8		;What was 'S'
SCRBUMP_K	EQU	$2000+$20*$A+$E		;What was 'K'
SCRBUMP_Y	EQU	$2000+$20*$B+$15	;What was 'Y'
SCRBUMP_H1	EQU	$2000+$20*$12+7		;What was left 'H'
SCRBUMP_I	EQU	$2000+$20*$F+$C		;What was 'I'
SCRBUMP_G	EQU	$2000+$20*$F+$11	;What was 'G'
SCRBUMP_H2	EQU	$2000+$20*$12+$16	;What was right 'H'



;==========================================
; Initialize the workarea for the Bumpers.
;==========================================
 proc		INIT_BUMPER_A

	LDX	#7
	STX	REST_BUMP##
1$	LDA	#10
	STA	BUMPER_STAT##-1,X
	LDA	#0
	STA	FLBUMP_CNT-1,X
	DEX
	BNE	1$
	RTS

 endproc	INIT_BUMPER_A

;============================================
; Device Routine for the Bumpers in Floor A.
;============================================
 proc		FLASHBUMP_A
	assign	@I, @W5

	JSR	CHECK_FLOOR_A
	BCC	FLBUMP_A_EXIT
	LDA	@PHASE_A
	CMP	#PHASE_BUMP0
	BEQ	1$
	CMP	#PHASE_BUMP1
	BNE	FLBUMP_A_EXIT
1$	LDA	#6
	STA	@I
FLBUMP_A_LP::
	LDX	@I
	LDA	FLBUMP_CNT,X
	BEQ	FLBUMP_A_NXT
	DEC	FLBUMP_CNT,X
	BNE	FLBUMP_A_NXT
	LDA	BUMPE_a
	sta	@arg
	lda	#high.arch_data_a
	sta	@arg+1
	ldx	#$0E*8
	ldy	#29*8
	call	wobj##
9$	rts
 endproc arch_a

 data arch_data_a
	db	4
	db	-1,$54,%00000000,0
	db	-1,$64,%00000000,8
	db	-1,$74,%00000000,16
	db	-1,$84,%00000000,24
 enddata arch_data_a



;
; 変数 openandlocked を状態をみてチェック
;

 proc check_openlock
	lda	


 endproc check_openlock





;==================================
; Change the Phase of the Floor A.
;==================================
 proc		CHANGE_PHASE

	LDA	CHNGPHASECNT
	BEQ	99$
	DEC	CHNGPHASECNT
	BNE	99$
	LDA	@PHASE_A
	CMP	#PHASE_RLOV0
	BNE	1$
	LDA	#PHASE_RLOV1
	STA	@PHASE_A
	LDA	#$FF
	STA	BLINK_RLOV##		;Disable the Rollover Blinking
	RTS
1$	CMP	#PHASE_RLOV1
	BNE	2$
					;Change Rollovers to Bumpers.
	JSR	WRITEALLBUMPER
	LDA	#PHASE_BUMP0
	STA	@PHASE_A
	JSR	INIT_BUMPER_A
	LDA	#BGM_FEVER##
	JSR	REQBGM##		;
	RTS
2$	CMP	#PHASE_BUMP0
	BNE	3$
	LDA	#SND_YAKU1##
	JSR	REQSOUND##
	LDA	#PHASE_BUMP1
	STA	@PHASE_A
	RTS
3$	CMP	#PHASE_BUMP1
	BNE	99$
	JSR	INIT_FLOOR_A1		;Initialize the Floor A again.
	JSR	DISPSKYHIGH
	lda	@bstat+0
	beq	4$
	lda	@bstat+1
	beq	4$
	lda	#BGM_MULTI##
	skip2
4$	LDA	#BGM_DAY##
	JSR	REQBGM##
99$	RTS


 endproc	CHANGE_PHASE



;・・・・・・・・・・・・
;・A面:ロールオーバー・
;・・・・・・・・・・・・

;=====================================
; Initialize the Status of 'SKYHIGH'.
;=====================================
 proc init_skyhigh
	ldx	#7-1
	lda	#OFF
1$		sta	skyhigh_stat##,x
		dex
		bpl	1$
;	JSR	DISPSKYHIGH
	rts
 endproc init_skyhigh

;================================================
; Initialize the workarea for Rollover Blinking.
;================================================
 proc init_blink

	LDA	#0
	STA	BLINK_FLAG
	LDA	#30
	STA	BLINK_COUNT
	RTS

 endproc init_blink


;=================================
; Display the Rollover 'SKYHIGH'.
;=================================
 proc		DISPSKYHIGH

	JSR	WRTVRM##
	dw	RLOV_S_FIG
	JSR	WRTVRM##
	dw	RLOV_K_FIG
	JSR	WRTVRM##
	dw	RLOV_Y_FIG
	JSR	WRTVRM##
	dw	RLOV_H1_FIG
	JSR	WRTVRM##
	dw	RLOV_I_FIG
	JSR	WRTVRM##
	dw	RLOV_G_FIG
	JSRR_STAT##,X
	BEQ	FLBUMP_A_NXT
	JSR	WRITEBUMPER
FLBUMP_A_NXT::
	DEC	@I
	BPL	FLBUMP_A_LP
FLBUMP_A_EXIT::
	RTS

 endproc	FLASHBUMP_A

;===================================================================
; Write a Bumper on the Screen.
;	Entry  - Xreg holds the Number of the Bumper to write(0-6).
;===================================================================
 proc		WRITEBUMPER

	LDA	WRTBUMPADRL,X
	STA	@P1
	LDA	WRTBUMPADRH,X
	STA	@P1+1
	CPX	#1		;Bumper 'K' ?
	BEQ	1$
	CPX	#3		;Bumper left 'H' ?
	BEQ	2$
	CPX	#6		;Bumper right 'H' ?
	BEQ	3$
	JSR	WVRMP1##
	DW	BUMP_A_FIG0
	RTS
1$	JSR	WVRMP1##
	DW	BUMP_A_FIG1
	RTS
2$	JSR	WVRMP1##
	DW	BUMP_A_FIG2	;Left 'H'
	RTS
3$	JSR	WVRMP1##
	DW	BUMP_A_FIG3	;Right 'H'
	RTS

 endproc	WRITEBUMPER


 proc		WRITEALLBUMPER

	assign	@i, @w5

	LDA	#6
	STA	@I
1$	LDX	@I
	JSR	WRITEBUMPER
	DEC	@I
	BPL	1$
	RTS

 endproc	WRITEALLBUMPER


;===================================================================
; Clear a Bumper on the Screen.
;	Entry  - Xreg holds the Number of the Bumper to clear(0

At 0x6410:

===============================
 proc		INIT_S_ARROW

	LDA	#OFF
	STA	S_ARROW_FLG
INIT_S_ARROW1::
	LDA	#10
	STA	S_ARROW_CNT
	RTS

 endproc	INIT_S_ARROW

;=================================
; Device Routine for Shoot-Arrow.
;=================================
 proc		SHOOTARROW

	JSR	CHECK_FLOOR_A		;Current Floor is A ?
	BCC	SHOOTARW_EXIT
	LDA	@PHASE_A
	CMP	#PHASE_RLOV1
	BEQ	SHOOTARROW1
	CMP	#PHASE_BUMP1
	BEQ	SHOOTARROW1
	RTS
SHOOTARROW1::
	DEC	S_ARROW_CNT
	BNE	SHOOTARROW2
	LDA	S_ARROW_FLG
	EOR	#$FF
	STA	S_ARROW_FLG
	JSR	INIT_S_ARROW1
SHOOTARROW2::
	LDA	CHNGPHASECNT		;0以外ならボールは打ち込まれた
	BNE	SHOOTARW_EXIT
	LDA	S_ARROW_FLG
	CMP	#OFF
	BEQ	SHOOTARW_EXIT
	LDA	#low.S_ARROWFIG
	STA	@ARG
	LDA	#high.S_ARROWFIG
	STA	@ARG+1
	LDX	#SHOOTARROW_X
	LDY	#SHOOTARROW_Y
	JSR	WOBJ##
SHOOTARW_EXIT::
	RTS

 endproc	SHOOTARROW

 data		S_ARROWFIG

	db	2
	db	0,$04,%00000010,0
	db	0,$04,%00000010,$4E

 enddata	S_ARROWFIG



;=========================================================
; Device Routine for the Shoot Again Lump in the Floor A.
;=========================================================
 proc		DispSHOOTAGAIN_A

	LDA	EXTRABLKCNT_A
	BEQ	99$
	DEC	EXTRABLKCNT_A
	JSR	CHECK_FLOOR_A
	BCC	99$
	LDA	EXTRABLKCNT_A
	AND	#8
	Bne	1$
99$	rts
;
1$	lda	advmultf
	bne	10$
	LDA	#low. SHOOTAGAINFIG_A	;"shoot again"
	STA	@ARG
	LDA	#high.SHOOTAGAINFIG_A
	jmp	11$
;
10$	LDA	#low. advmultfig_a	;"adv. mult."
	STA	@ARG
	LDA	#high.advmultfig_a
11$	STA	@ARG+1
	LDX	#$70
	LDY	#$A8
	jmp	WOBJ##

 endproc	DispSHOOTAGAIN_A


 data		SHOOTAGAINFIG_A

	db	4
	db	-1,$48,%00000001,0
	db	-1,$58,%00000001,8
	db	-1,$E0,%00000001,16
	db	-1,$F0,%00000001,24

 enddata	SHOOTAGAINFIG_A

 data advmultfig_a
	db	5
	db	-1,$D6,%00000010,-4
	db	-1,$E6,%00000010,4
	db	-1,$F6,%00000010,12
	db	-1,$5A,%00000010,20
	db	-1,$6A,%00000010,28
	

 enddata advmultfig_a





;**************************************************************************
;使用方法							          *
;	 花火セットルーチンはセットしたい時に花火onルーチンの前に       *
;	 Aレジに花火の位置ナンバーを入れてコールする		          *
;	 位置は爆発するバンパーに反映するため(0ー6)である	          *
;	 初期かルーチンは1回のみコールすればいい		          *
;	 花火onルーチンは毎回コールする			        *
;	 最大3発まで表示できて7発までバッファ(スタック)にためられる   *
;**************************************************************************


;************************
;マクロ命令の定義	*
;************************

upx	macro	jj
	inx
	cpx	#jj+1
	bcc	$+4
	ldx	#0
	endm

upy	macro	jj
	iny
	cpy	#jj+1
	bcc	$+4
	ldy	#0
	endm
;************************


;************
;花火の初期化
;************

hanabi_ini::		;7バイト(haxybf)のバッファに$80を入れて
			;hanapotとhanspotをクリアーする
	ldx	#0
	lda	#$80
100$	sta	haxybf,x
	inx
	cpx	#7
	bne	100$
	lda	#0
	sta	hanapot
	sta	hanspot
	sta	hana_stat
	rts
;************************
;表示する花火をセットする
;************************

hanabi_set::

	ldx	hanspot
	sta	haxybf,x
	lda	#0
	sta	hanobf,x
	upx	6
	stx	hanspot
	rts

;**************
;花火を表示する
;**************

hanabi_on::
	dw	$2000+$20*$18+$1C
	db	2,2
	db	$34,$01,$0C,$1C

 enddata	CLOSEGATEFIG_A

;・・・・・・・・
;・A面:ポスト・
;・・・・・・・・

;=============================
; Initialize the Saving Post.
;=============================
 proc		INIT_POST

	LDA	#0
	STA	POST_CNT
	RTS

 endproc	INIT_POST


;==========================================================
; Device Routine for the Saving Post.
;	(Called not in dev_a but col_post and col_target0)
;==========================================================
 proc		WRTPOST

WRTPOST_OFF::
	JSR	WRTVRM##
	DW	CLRPOSTFIG
	RTS

WRTPOST_ON1::
	JSR	WRTVRM##
	DW	WRTPOSTFIG1
	RTS

WRTPOST_ON2::
	JSR	WRTVRM##
	DW	WRTPOSTFIG2
	RTS

 endproc	WRTPOST

;----------------------------------------------
; BG data for the Saving Post in the Floor A.
;----------------------------------------------
 data		CLRPOSTFIG
	DW	$2000+$20*$12+2
	DB	2,2
	DB	$11,$10
	DB	$11,$22
 enddata	CLRPOSTFIG

 data		CLRPOSTATR
	DW	$23C0+32
	DB	1,1
	DB	%11001000
 enddata	CLRPOSTATR

 data		WRTPOSTFIG2
	DW	$2000+$20*$12+2
	DB	2,2
	DB	$CF,$DF
	DB	$D5,$E5
 enddata	WRTPOSTFIG2

 data		WRTPOSTFIG1
	DW	$2000+$20*$12+2
	DB	2,2
	DB	$DB,$EB
	DB	$D5,$E5
 enddata	WRTPOSTFIG1

 data		WRTPOSTATR1
	DW	$23C0+32
	DB	1,1
	DB	%11001000
 enddata	WRTPOSTATR1

 data		WRTPOSTATR2
	DW	$23C0+32
	DB	1,1
	DB	%11001000
 enddata	WRTPOSTATR2


;・・・・・・・・・・・・
;・A面:・Lock・表示・
;・・・・・・・・・・・・
LOCKARROW_X	EQU	$C8	;The Position of the Arrow in the Screen.
LOCKARROW_Y	EQU	$79

;====================================================
; Initialize the Workarea for Displaying Lock-Arrow.
;====================================================
 proc		INIT_L_ARROW

	LDA	#ON
	STA	L_ARROW_FLG
INIT_L_ARROW1::
	LDA	#10
	STA	L_ARROW_CNT
	RTS

 endproc	INIT_L_ARROW

;================================
; Device Routine for Lock-Arrow.
;================================
 proc		LOCKARROW

	JSR	CHECK_FLOOR_A		;Current Floor is A ?
	BCC	LOCKARW_EXIT
	LDA	@PHASE_A
	CMP	#PHASE_RLOV0
	BEQ	LOCKARROW1
	CMP	#PHASE_RLOV1
	BEQ	LOCKARROW1
	RTS
LOCKARROW1

At 0xA010 and 0x14010:

echo off
if not exist %1\nx298.86 goto error4
cd %1
init s=72 f=%1\nx298.86 hi=0
if errorlevel 1 goto error2
isloaded
if errorlevel 1 goto error1
driver
:lab1
if not exist %1\net goto error5
drcntl -r
if errorlevel 1 goto error6
netload  -p 2 -t 0 %1\net
if errorlevel 1 goto error3
echo EXOS :TCP/IP Up and Running:Release 3.2.3 
echo EXOS :Excelan (C) 1985, 1986 
goto ok
:error1
echo EXOS 8098: Driver がすでにロードされていますので,
echo EXOS 8098: 再ロードは行いません.
goto lab1
:error2
echo EXOS 8098: INIT に失敗しました. コンフィギュレーションファイルと
echo EXOS 8098: ボードの設定を確認してください.
goto notok
:error3
echo EXOS 8098: NETLOAD に失敗しました. "トラブルシューティング"
echo EXOS 8098: のセクションを参照してください
goto notok
:error6
echo EXOS 8098: DRCNTL に失敗しました. "トラブルシューティング"
echo EXOS 8098: のセクションを参照してください
goto notok
:error4
echo EXOS 8098: %1 に NX298.86 がありません !!!
goto notok
:error5
echo EXOS 8098: %1 に NET がありません !!!
:ok
:notok
cd \

Regional Differences

Title Screen

Japan US/Australia
Rollerball-Title-JP.png RollerballNESTitle.png

The title logo was modified to separate "Roller" and "Ball" into two words, and the capital "R" was made smaller. The scrolling text at the bottom of the screen was also changed to fix some grammatical errors.

Japan
WELCOME TO ROLLERBALL     MAKE YOU FEEL EXCITED AND AMUSED WITH THIS SUPER REAL PINBALL GAME
US
WELCOME TO ROLLER BALL THE SUPER PINBALL GAME THAT WILL EXCITE AND AMUSE YOU

Skyscraper

On the main pinball table, all instances of the "HAL" name were changed to "HAI" (HAL America, Inc.) for the US release.

Match Play

Japan US/Australia
Rollerball-InitialShare-JP.png Rollerball-InitialShare-US.png

In the versus mode, the options for initial starting points for both players were reduced.

Japan US/Australia
Rollerball-MatchPlay-JP.png Rollerball-MatchPlay-US.png

Player 2's avatar was changed from a giraffe to a donkey, likely to make the two characters a reference to the Republican and Democratic US political parties, respectively.