the cutting room mirror

Rollerball (NES)

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

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: Rachel Mae)

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

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

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

Japan

US/Australia

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.