Wait and See! is an unlicensed NES game based on the Russian cartoon Ну, погоди! (Nu, pogodi! - literally Well, Just You Wait!, closer to You dare!), but with Bugs Bunny and Wile E. Coyote instead of the protagonizing wolf and rabbit. This was seemingly a move done to use more recognizable characters (coincidentally, there are a few cartoons where Wile E. Coyote tries to get Bugs).
Development Text#
|
|
This needs some investigation. |
Text probably left by TomSoft Studio, the program used to develop this game.
0x2C:
TomSoft Studio. E-mail:tomsoft@ihw.co.cn. Tel:(029)7223482
0x3FFF0:
tomsoft-1997
The last string specifically is at the end of PRG.
Source Code#
The whole bank $1D is filled with a fragment of the game engine's source code. Unfortunately, the code is partially damaged by the regular data pattern FF FF ?? ?? 00 00 00 00 every 144 bytes (except at the start with 120 instead); some parts of the source code have been restored, but some are still missing.
(Wherever hard tabs made the text unreadable on a browser, they have been replaced with spaces; when a fixed version of the binary data is viewed through a text editor, it already looks readable enough as source code.)
___ #$08 ;下坡
BNE ?NoIceLand
LDA SPRITE
CLC
ADC #$02
STA SPRITE
LDA SPRITE+1
ADC #$0
STA SPRITE+1
; LDA SPRITE+7
; AND #$7F
; STA SPRITE+7
?NoIceLand:
RTS
;-----------------------------------------------------
Just__e:
LDA MOTION+4
AND #$04
BEQ ?NextBG0
LDA #$04
JMP ?JustEnd
?NextBG0:
LDA MOTION+4
AND #$08
BEQ ?JustEnd
LDA #$_8
?JustEnd:
RTS
;-----------------------------------------------------
ProceStage3:
LDA SCRPAGE_X
BEQ ?InBlackScreen
CMP #__
BEQ ?InBlackScreen
CMP #29
BEQ ?InBlackScreen
CMP #38
BNE ?NoInStar
?InBlackScreen:
LDA #$0
SEC
SBC SPRITE
CMP #48
BCS ?NoRightEnd
LDA PORT2001
AND #$E7
STA PORT2001 ;关显示屏
LDA MOTION+5
ORA #$60 ;主角置死亡标志,_时__亡动性结束
STA MOTION+5
LDA NUMBER_LIFE
CLC
ADC #$01
STA NUMBER_LIFE ;消除假死亡的生命减少
LDA SCRPAGE_X
CLC
ADC #$02
STA Countinue_X
LDA #$FF
STA CLOSE_FLAG ;表示不是真正的死亡
?NoRightEnd:
LDA #$FF
JMP ?ProceEnd
?NoInStar:
LDA MOTION+4
AND #$10
BEQ ?NoInRail
LDA MOTION
AND #$3F
BNE ?NoInRail
LDA #$FF
JMP ?ProceEnd
?NoInRail:
LDA __0
?ProceEnd:
RTS
;-----------------------------------------------------
PassStage:
LDX STAGE
CPX #$FF
BEQ ?OverStage
L__ StageData,X
CMP SCRPAGE_X
BNE ?NoOverStage
LDA SCREEN_X
SEC
SBC SPRITE
CMP #40
BCS ?NoOverStage
LDA #$FF
STA CLOSE_FLAG ;保持原有的心和生命的数值
?OverStage:
LDA STAGE
CLC
ADC #$01
STA H_BUFFER+1 ;保存关的数目
LDA #$2C
STA BG_PAL01
LDA #$0C
STA BG_PAL01+1
LDA #$0F
STA BG_PAL01+2
LDA #$17
STA BG_PAL02
LDA #$07
STA BG_PAL02+1
___ #$0F
STA BG_PAL02+2
LDA #$FF
JMP ?StageEnd
?NoOverStage:
LDA #$00
?StageEnd:
RTS
StageData:
DB 33,34,36,39__,3__
----
ProceTitle:
LDA #$7
STA STAGE
LDA #$17
STA BG_PAL01
LDA #$28
STA BG_PAL01+1
LDA #$0F
STA BG_PAL01+2
LDA #$17
STA BG_PAL02
LDA #$27
STA BG_PAL02+1
LDA #$0F
STA BG_PAL02+2
LDA #15
STA MOTION
LDA #$0
STA MOTION+1
LDA #108
STA SPRITE
LDA #$0
STA SPRITE+1
LDA #79
STA SPRITE__
LDA #$0
STA SPRITE+3
STA SPRITE+7
LDA #15
STA MOTION+6
LDA #$01
STA MOTION+7
LDA #120
STA SPRITE+10
LDA #$0
STA SPRITE+11
LDA #79
STA SPRITE+12
LDA #$0
STA SPRITE+13
STA SPRITE+17
LDA #53
STA MOTION+12
LDA #$0
STA MOTION+13
LDA #128
STA SPRITE+20
LDA #0
STA SPRITE+21
LDA #200
STA SPRITE+22
LDA #0
STA SPRITE+23
STA SPRITE+27
RTS
;-----------------------------------------------------
Game_Over:
LDA #$09
STA STAGE
LDA #$27
STA BG_PAL01
LDA #$27
STA BG_PAL01+1
LDA #$37
STA BG_PAL01+2
LDA #$3F
STA BG_PAL02
LDA #$2D
STA BG_PAL02+1
LDA #$00
STA BG_PAL02+2
LDA #51
ORA #$80 ;最后1个分镜不归0
STA MOTION
LDA #$0
STA MOTION+1
LDA #130
STA SPRITE
LDA #$0
STA SPRITE+1
LDA #200
STA SPRITE+2
LDA #$0
STA SPRITE+3
STA SPRITE+7
RTS
;-----------------------------------------------------
ProcePassStage:
LDA #52
STA MOTION
LDA H_BUFFER+1
CLC
ADC #$05
STA MOTION+1
LDA _20_
STA SPRITE
LDA #$0
STA SPRITE+1
LDA #160
STA SPRITE+2
LDA #$0
STA SPRITE+3
STA SPRITE+7 ;过关牌的起始坐_
LDA #$0
STA MOTION+6
LDA #$01
STA MOTION+7
LDA #8
STA SPRITE+10
LDA #$0
STA SPRITE+11
LDA #160
STA SPRITE+12
LDA #0
STA SPRITE+13
RTS
;-----------------------------------------------------
GameOverAction:
LDA MOTION+6
CMP #$06
BNE ?Countinue
LDA MOTION+7
BNE ?Countinue
JMP ?NoEndFrame
?Countinue:
LDA MOTION+5
AND #$40
BEQ ?NoEndFrame
___ MOTION+6
CMP #$06
BEQ ?NoFirst
LDA #$06
STA MOTION+6
LDA #$1
STA MOTION+7
STA MOTION+8
STA MOTION+9
STA MOTION+10
STA MOTION+11
LDA #8
STA SPRITE+10
LDA #$0
STA SPRITE+11
LDA #200
STA SPRITE+12
LDA #$0
STA SPRITE+13
STA SPRITE+17
?NoFirst:
LDA SPRITE+10
CMP #130
BCC ?NoEndFrame
LDA #$0
STA MOTION+7
STA MOTION+8
STA MOTION+9
___ _________
ORG C000H
_MainGetAction DS 3
_MainGetFrame DS 3
_ChangeNumber DS 3
_InstallKey DS _
5H ;DS 2
NMI_FLAG EQU 0027H ;DS 1
;======================================================
ADDR5 EQU 0028H ;DS _
ADDR6 EQU 002AH ;DS 2
ADDR7 EQU 002CH ;DS 2
JUMPCOUNT EQU 002EH ;DS 1 存放跳跃次数
ACTION_B__K EQU 002FH ;DS 1
Y_VERTICA EQU 0030H ;DS 1 存放主角自由落体偏移量
WINDOWBUFFER EQU 0031H ;DS 192 存放主角代码的PNT缓冲区
;以下单_用__乐的0页变量
;======================================================
;从$0200-$02C3,这一段用于CORE.INC
ORG 02C3H
DS _
;--------------------- MOTION ------------------------
;MOTION:
; Byte1: +---+---+---+---++---+---+---+---+FF即表明该动作为空。
; | | \-----------v----------/
; | | +----------->角色号。(0..62)
; | +-------------------------->X 向翻转。
; +------------------------------>初始化旗标。0:该动性未做初始化。
; 1:该动性初始化完成。
; Byte2: +---+---+---+---++---+---+---+---+
; | | | \------v--------/
; | | | +--------->动性编号。
; | | +---------------------->循环使能。0:不允许循环。
; | | 本动性完成后自动回到预备式。
; | | 1:允许循环。重复本动性。
; | | 对于主角,若该位使能且新动性
; | | 与旧动性相同,忽略这种变化。
; | +-------------------------->碰撞使能。0:不允许碰撞。
; | 1:允许碰撞。
; +------------------------------>按键使能。0:不允许接受按键。(仅用于主角)
; 1:允许接受按键。
; Byte3: +---+---+---+---++---+---+---+--->
; \--v--/ \-----------v----------/
; | +----------->分镜计数器,即第几张分镜。
; +---------------------------->敌物类型:
; 00:一般对象。
; 01:局部对象。
; 10:全局对象。
; 11:未定义。
; Byte4: +---+---+---+---++---+---+---+--->分__延时计数器。V_BLANK
; \------v------/ \------v------/
; | |
; | +------->延时计数值。
; +------------------------>应__长度。
; Byte5: +---+---+---+---++---+---+---+---+ActerID,角色id.
; Byte6: +---+---+---+---++---+---+---+---+部件控制字。初始化用,
; | | | \--------v---------/
; | | | |
; | | | +----------->控制字补充说明。
; | | +----------------------->控制字__
; | | 1: 位移移动控制字有效。
; | | 其动画移动位移由控
; | | 制字补充说明决定。
; | | _通性控制字,性质由
; | | 控制字扩充说明决定。
; | +--------------------------->初始化方向控制字。
; | 0: _动__原方向初始化。
; | 1: 根据主角位置初始化。
; +------------------------------->未用,系统保留。
; 注:对特定的动性,其解释_式__户自定义。该解释用于GetNextSnap。
MOTION DS 48
;=======================================================
ORG 0300H ;用于_____变量
;=======================================================
ORG 03CEH
LocalObject DS 16
;局部敌物表,每项一位,共128项/关。
;定_该__在本关是
Translation:
___ 08 ; Downhill
BNE ?NoIceLand
LDA SPRITE
CLC
ADC #$02
STA SPRITE
LDA SPRITE+1
ADC #$0
STA SPRITE+1
; LDA SPRITE+7
; AND #$7F
; STA SPRITE+7
?NoIceLand:
RTS
;-----------------------------------------------------
Just__e:
LDA MOTION+4
AND #$04
BEQ ?NextBG0
LDA #$04
JMP ?JustEnd
?NextBG0:
LDA MOTION+4
AND #$08
BEQ ?JustEnd
LDA ___8
?JustEnd:
RTS
;-----------------------------------------------------
ProceStage3:
LDA SCRPAGE_X
BEQ ?InBlackScreen
CMP #__
BEQ ?InBlackScreen
CMP #29
BEQ ?InBlackScreen
CMP #38
BNE ?NoInStar
?InBlackScreen:
LDA #$0
SEC
SBC SPRITE
CMP #48
BCS ?NoRightEnd
LDA PORT2001
AND #$E7
STA PORT2001 ; Turn off the display
LDA MOTION+5
ORA #$60 ; Set MC's death flag, [?] death animation ends when [??]
STA MOTION+5
LDA NUMBER_LIFE
CLC
ADC #$01
STA NUMBER_LIFE ; Revert life decrease caused by the fake death
LDA SCRPAGE_X
CLC
ADC #$02
STA Countinue_X
LDA #$FF
STA CLOSE_FLAG ; Mark it as not a real death
?NoRightEnd:
LDA #$FF
JMP ?ProceEnd
?NoInSt__:
LDA MOTION+4
AND #$10
BEQ ?NoInRail
LDA MOTION
AND #$3F
BNE ?NoInRail
LDA #$FF
JMP ?ProceEnd
?NoInRail:
LDA __0
?ProceEnd:
RTS
;-----------------------------------------------------
PassStage:
LDX STAGE
CPX #$FF
BEQ ?OverStage
L__ ____eData,X
CMP SCRPAGE_X
BNE ?NoOverStage
LDA SCREEN_X
SEC
SBC SPRITE
CMP #40
BCS ?NoOverStage
LDA #$FF
STA _LOSE_FLAG ; Keep the original amount of hearts and lives
?OverStage:
LDA STAGE
CLC
ADC #$01
STA H_BUFFER+1 ; Save level number
LDA #$2C
STA BG_PAL01
LDA #$0C
STA BG_PAL01+1
LDA #$0F
STA BG_PAL01+2
LDA #$17
STA BG_PAL02
LDA #$07
STA BG_PAL02+1
___ #$0F
STA BG_PAL02+2
LDA #$FF
JMP ?StageEnd
?NoOverStage:
LDA #$00
?StageEnd:
RTS
StageData:
DB 33,34,36,39__,3__
;-----------------------------------------------------
ProceTitle:
LDA #$7
STA STAGE
LDA #$17
STA BG_PAL01
LDA #$28
STA BG_PAL01+1
LDA #$0F
STA BG_PAL01+2
LDA #$17
STA BG_PAL02
LDA #$27
STA BG_PAL02+1
LDA #$0F
STA BG_PAL02__
LDA #15
STA MOTION
LDA #$0
STA MOTION+1
LDA #108
STA SPRITE
LDA #$0
STA SPRITE+1
LDA #79
STA SPRITE+_
LDA #$0
STA SPRITE+3
STA SPRITE+7
LDA #15
STA MOTION+6
LDA #$01
STA MOTION+7
LDA #120
STA SPRITE+1__
LDA #$0
STA SPRITE+11
LDA #79
STA SPRITE+12
LDA #$0
STA SPRITE+13
STA SPRITE+17
LDA #53
STA MOTION+12
LDA #$0
STA MOTION+13
LDA #128
STA SPRITE+20
LDA #0
STA SPRITE+21
LDA #200
STA SPRITE+22
LDA #0
STA SPRITE+__
STA SPRITE+27
RTS
;-----------------------------------------------------
Game_Over:
LDA #$09
STA STAGE
LDA #$27
STA BG_PAL01
LDA #$27
STA BG_PAL01+1
LDA #$37
STA BG_PAL01+2
LDA #$3F
STA BG_PAL02
LDA #$2D
STA BG_PAL02+1
LDA #$00
STA BG_PAL02+2
LDA #51
ORA #$80 ; At the last frame 1, don't return 0
STA MOTION
LDA #$0
STA MOTION+1
LDA #130
STA SPRITE
LDA #$0
STA SPRITE+1
LDA #200
STA SPRITE+2
LDA #$0
STA SPRITE+3
STA SPRITE+7
RTS
;-----------------------------------------------------
ProcePassStage:
LDA #52
STA MOTION
LDA H_BUFFER+1
CLC
ADC #$05
STA MOTION+1
LDA #20
STA SPRITE
LDA #$0
STA SPRITE+1
LDA #160
STA SPRITE+2
LDA #$0
STA SPRITE+3
STA SPRITE+7 ; Initial position of the signpost (TL note: "position" is inferred from the context)
LDA #$0
STA MOTION+6
LDA #$01
STA MOTION+7
LDA #8
STA SPRITE+10
LDA #$0
STA SPRITE+11
LDA #160
STA SPRITE+12
LDA #0
STA SPRITE+13
RTS
;-----------------------------------------------------
GameOverAction:
LDA MOTION+6
CMP __06__
BNE ?Countinue
LDA MOTION+7
BNE ?Countinue
JMP ?NoEndFrame
?Countinue:
LDA MOTION+5
AND #$40
BEQ ?NoEndFrame
___ MOTION+6
CMP #$06
BEQ ?NoFirst
LDA #$06
STA MOTION+6
LDA #$1
STA MOTION+7
STA MOTION+8
STA MOTION+9
STA MOTION+10
STA MOTION+11
LDA #8
STA SPRITE+10
LDA #$0
STA SPRITE+11
LDA #200
STA SPRITE+12
LDA #$0
STA SPRITE+13
STA SPRITE+17
?NoFirst:
LDA SPRITE+10
CMP #130
BCC ?NoEndFrame
LDA #$0
STA MOTION+7
STA MOTION+8
STA MOTION+9
___ _________
ORG C000H
_MainGetAction DS 3
_MainGetFrame DS 3
_ChangeNumber DS 3
_InstallKey DS _
____________ EQU 0025H ;DS 2
NMI_FLAG EQU 0027H ;DS 1
;======================================================
ADDR5 EQU 0028H ;____
ADDR6 EQU 002AH ;DS 2
ADDR7 EQU 002CH ;DS 2
JUMPCOUNT EQU 002EH ;DS 1 stores the amount of jumps
ACTION_B__K EQU 002FH ;DS 1
Y_VERTICA EQU 0030H ;DS 1 stores MC's freefall offset
WINDOWBUFFER EQU 0031H ;DS 192 stores the PNT buffer for MC's code
;The following unit is for [?]'s variable page 0 [??]
;======================================================
;This part from $0200-$02C3 is for CORE.INC
ORG 02C3H
DS
;--------------------- MOTION ------------------------
;MOTION:
; Byte1: +---+---+---+---++---+---+---+---+FF means that this action is empty.
; | | \-----------v----------/
; | | +----------->Actor ID. (0..62)
; | +-------------------------->X-axis flip flag.
; +------------------------------>Init flag. 0: This motion is uninitialized.
; 1: This motion was initialized.
; Byte2: +---+---+---+---++---+---+---+---+
; | | | \---------v--------/
; | | | +--------->Motion ID.
; | | +---------------------->Loop toggle. 0: Disallows looping.
; | | After this motion is completed, the initial motion is restored.
; | | 1: Allows looping. This motion will be repeated.
; | | For MC, if this flag is enabled [?] and the new motion
; | | is the same as the old one, the change is ignored.
; | +-------------------------->Collision toggle. 0: Disallows collision.
; | 1: Allows collision.
; +------------------------------>Input toggle. 0: Disallows input handling. (for the MC only)
; 1: Allows input handling.
; Byte3: +---+---+---+---++---+---+---+---+
; \--v--/ \-----------v----------/
; | +----------->Frame counter, i.e. the current frame.
; +---------------------------->Enemy type:
; 00: Normal object.
; 01: Local object.
; 10: Global object.
; 11: Undefined.
; Byte4: +---+---+---+---++---+---+---+---+Frame[???] delay counter. V_BLANK
; \------v------/ \------v------/
; | |
; | +------->Delay counter.
; +------------------------>Length of [???].
; Byte5: +---+---+---+---++---+---+---+---+ActerID, actor ID.
; Byte6: +---+---+---+---++---+---+---+---+Component control byte. for initialization,
; | | | \--------v---------/
; | | | |
; | | | +----------->Extra information for control bytes.
; | | +----------------------->[???] control byte.
; | | 1: Displacing[???] movement control byte is valid.
; | | The amount of displacing in the animation [???]
; | | is decided by the extra information control byte.
; | | [garbled]
; | | by the extra information control byte.
; | +--------------------------->Initial direction control byte.
; | 0: Initialized according to the original direction of the [???].
; | 1: Initialized according to MC's position.
; +------------------------------->Unused, reversed for the system.
; Note: For specific motions, the explanation of [??] is user-defined[?].
; The explanation here is relevant to GetNextSnap.
MOTION DS 48
;=======================================================
ORG 0300H ; For the [????] variable
;=======================================================
ORG 03CEH
LocalObject DS 16
;Local enemy table, one bit for every entry, 128 entries total for every level.
;Defines whether this [??] is [????] in this level
For some reason, offset 12F3-1301 (the blanked out instruction on line 302) is completely nulled out - except for the first byte being 1A - and it does not conflict with the pattern corrupting the source code every 144 bytes.