diff --git a/src/Action.s b/src/Action.s index fd92d73..2c48c2c 100644 --- a/src/Action.s +++ b/src/Action.s @@ -16,11 +16,11 @@ GetNextMov: _GetNextMov_newAct: move.w d0, Object.PrevChCode(a4) - clr.w Object.MovOffsetFromActBase(a4) | bank(2), ACT base ƫ + clr.w Object.MovOffsetFromActBase(a4) | 在 bank(2), 基于 ACT base 的偏移 clr.b Object.SpanTime(a4) | clear spanTime clr.b Object.HitBoxFlag(a4) | clear HitFlag clr.b Object.RecoveryFlags(a4) | clear FreezeTime - clr.w Object.MovIndexInAct(a4) | ǰִеmov, (ACT0,1,2...) + clr.w Object.MovIndexInAct(a4) | 当前执行到的mov编号, (在整个ACT中0,1,2...排列) bsr.w _GetNextMov_loadNewMov moveq #0, d0 rts @@ -47,7 +47,7 @@ _GetNextMov_zeroRet: | CODE XREF: GetNextMov+3Cj | --------------------------------------------------------------------------- _GetNextMov_nextMov: | CODE XREF: GetNextMov+42j - addq.w #6, Object.MovOffsetFromActBase(a4) | bank(2), ACT base ƫ + addq.w #6, Object.MovOffsetFromActBase(a4) | 在 bank(2), 基于 ACT base 的偏移 _GetNextMov_loadNewMov: | CODE XREF: GetNextMov+30p jsr GetMovOffset | ret: @@ -55,31 +55,31 @@ _GetNextMov_loadNewMov: | CODE XREF: GetNextMov+30p clr.w d0 move.b (a0), d0 bpl.s _GetNextMov_setSpanTime - neg.b d0 | ȡֵ - subq.w #1, d0 | һ + neg.b d0 | 取绝对值 + subq.w #1, d0 | 减一 add.w d0, d0 - add.w d0, d0 | 4Ϊֵ + add.w d0, d0 | 乘4作为索引值 movea.l off_58C4(pc,d0.w), a2 jsr (a2) bra.s _GetNextMov_sameAct | --------------------------------------------------------------------------- -off_58C4:.long _GetNextMov_againThisAct | FFʾǰActѭִе - .long _GetNextMov_endThisAct | FEʾǰAct - .long _GetNextMov_getBox | FD, ж־6ֽڰжʽж - .long _GetNextMov_loadSound | FC Ч־ - .long _GetNextMov_deltaX | FB λƱ־ - .long _GetNextMov_loadGraph | FA ͼ־ +off_58C4:.long _GetNextMov_againThisAct | FF表示当前Act是循环执行的 + .long _GetNextMov_endThisAct | FE表示当前Act结束 + .long _GetNextMov_getBox | FD, 判定标志,这6个字节包含了判定方式和判定框 + .long _GetNextMov_loadSound | FC 音效标志 + .long _GetNextMov_deltaX | FB 位移标志 + .long _GetNextMov_loadGraph | FA 附加图像标志 | --------------------------------------------------------------------------- _GetNextMov_setSpanTime: move.b d0, Object.SpanTime(a4) move.b 1(a0), Object.HitSpecialStatus(a4) move.b 4(a0), Object.HitBoxFlag(a4) - move.b 5(a0), Object.RecoveryFlags(a4) | bits0-1: 1, Կ׷; 2, ׷ - | bit2: 1, cancelӱɱ - | bit3: 1, cancel⼼ - | bits4-6: Ӳֱ - addq.w #1, Object.MovIndexInAct(a4) | ǰִеmov, (ACT0,1,2...) + move.b 5(a0), Object.RecoveryFlags(a4) | bits0-1: 1, 禁对空追打; 2, 倒地追加 + | bit2: 1, 可cancel接必杀技 + | bit3: 1, 可cancel接特殊技 + | bits4-6: 硬直类型 + addq.w #1, Object.MovIndexInAct(a4) | 当前执行到的mov编号, (在整个ACT中0,1,2...排列) move.w 2(a0), d1 | graph Index move.w Object.ChCode(a4), d2 move.w #1, d0 @@ -94,8 +94,8 @@ _GetNextMov_bankSwitchLoop: movea.l (a0,d2.w), a0 mulu.w #6, d1 adda.w d1, a0 - move.l a0, Object.pGraphInfoEntry(a4) | ָ4ֽXoffset,Yoffset - | Ȼһword SCB1 data offset from obj data base + move.l a0, Object.pGraphInfoEntry(a4) | 先指向4字节Xoffset,Yoffset + | 然后是一个word的 SCB1 data offset from obj data base move.w #2, d0 _GetNextMov__GetNextMov_bankSwitchLoop: | CODE XREF: GetNextMov+ECj @@ -108,7 +108,7 @@ _GetNextMov__GetNextMov_bankSwitchLoop: | CODE XREF: GetNe _GetNextMov_againThisAct: move.w #0xFFFA, Object.MovOffsetFromActBase(a4) | -6 - clr.w Object.MovIndexInAct(a4) | ǰִеmov, (ACT0,1,2...) + clr.w Object.MovIndexInAct(a4) | 当前执行到的mov编号, (在整个ACT中0,1,2...排列) rts | --------------------------------------------------------------------------- @@ -144,9 +144,9 @@ _GetNextMov_loadGraph: bne.s _GetNextMov_skipRet movem.l d1/a1, -(sp) | pushad move.l a0, -(sp) | push a0 - | a0: 6ֽ׵ַ + | a0: 6字节组首地址 move.w (a0), d0 - andi.w #0xFF, d0 | d0.low: Чֽ + andi.w #0xFF, d0 | d0.low: 附加效果字节 add.w d0, d0 add.w d0, d0 lea (ExtendEffectPropareTable).l, a0 @@ -164,15 +164,15 @@ _GetNextMov_loadGraph: move.b A5Seg.TempExGraphMask(a5), d0 or.b d0, Object.ExGraphFlags(a1) | bit0: 1, need to update SCB1 | bit1: 1, do not use extra graph - | bit2: 1, ʹûƲ㱳 + | bit2: 1, 使用缓移层背景 | bit3: ? - | bit4: 1, use own Shrinking, do not set InScreenX,Y Ӱ + | bit4: 1, use own Shrinking, do not set InScreenX,Y 倒影用 | bit5: 1, visible during freeze | bit7: 1, use sub SCB3 buf movea.l (sp)+, a0 | pop a0 move.b 1(a0), Object.selfBuf2+1(a1) - move.w 2(a0), Object.OriX(a1) | ͼԭ(ʮ)ĺ, ߼λ, صλ - move.w 4(a0), Object.OriY(a1) | ͼԭ(ʮ), ߼߶, صλ + move.w 2(a0), Object.OriX(a1) | 贴图原点(十字)的横坐标, 区域逻辑位置, 像素单位 + move.w 4(a0), Object.OriY(a1) | 贴图原点(十字)的纵坐标, 区域逻辑高度, 像素单位 movem.l (sp)+, d1/a1 | popad _GetNextMov_skipRet: | CODE XREF: GetNextMov+172j @@ -216,13 +216,13 @@ GetMovOffset: _GetMovOffset_swithLoop: | CODE XREF: GetMovOffset+2Cj move.w d0, (0x2FFFFE).l | BankSwitch(1) - | p2 rom 100000 offset 뵽 0x200000, 0x2FFFFF λ - | p2 rom δ, ʱڴ 0x200000 λÿԿ p2 rom 100000 offset + | 将p2 rom 从 100000 offset 载入到 0x200000, 0x2FFFFF 位置 + | p2 rom 未加密, 此时检测内存 0x200000 位置可以看到 p2 rom 的 100000 offset 镜像 cmp.w (0x200000).l, d0 - bne.s _GetMovOffset_swithLoop | switch ʧ¼ + bne.s _GetMovOffset_swithLoop | switch 失败则重新加载 lea (0x250000).l, a0 | == p2rom offset: 150000 - move.l (a0,d1.w), Object.pGraphDataSubmenuBase(a4) | Obj SCB1 ݵʼַ - | (ɫ, , , ߶, ...) + move.l (a0,d1.w), Object.pGraphDataSubmenuBase(a4) | 此 Obj 的 SCB1 数据的起始地址 + | (调色盘, 解析方法, 宽度, 高度, 数据...) move.w #2, d0 __GetMovOffset_swithLoop: | CODE XREF: GetMovOffset+4Aj @@ -230,11 +230,11 @@ __GetMovOffset_swithLoop: | CODE XREF: GetMovOffset+4 cmp.w (0x200000).l, d0 bne.s __GetMovOffset_swithLoop | BankSwitch(2) lea (0x200002).l, a0 | == p2rom offset: 200002 - movea.l (a0,d1.w), a0 | ʼַ + movea.l (a0,d1.w), a0 | 人物初始地址 add.w d2, d2 add.w d2, d2 movea.l (a0,d2.w), a0 | a0: Act Base - adda.w Object.MovOffsetFromActBase(a4), a0 | bank(2), ACT base ƫ + adda.w Object.MovOffsetFromActBase(a4), a0 | 在 bank(2), 基于 ACT base 的偏移 rts | End of function GetMovOffset diff --git a/src/Backgroud.s b/src/Backgroud.s index 7445e45..c33740a 100644 --- a/src/Backgroud.s +++ b/src/Backgroud.s @@ -75,7 +75,7 @@ InitBackGroundLayer5: | ret: | a1: screen obj InitBackGroundLayer: - lea A5Seg.BackGroundObjLayer0(a5), a1 | 㱳Obj + lea A5Seg.BackGroundObjLayer0(a5), a1 | 最顶层背景Obj move.w d0, -(sp) lsl.w #8, d0 | * 256 adda.w d0, a1 | a1: the layer obj @@ -117,7 +117,7 @@ InitLayerObj: move.w d0, ScreenObj.SCB3UpdateVramAddr(a4) addi.w #0x200, d0 move.w d0, ScreenObj.SCB4UpdateVramAddr(a4) - |move.w (a0)+, ScreenObj.WidthInTiles(a4) | ͼȰٸtile + |move.w (a0)+, ScreenObj.WidthInTiles(a4) | 图层宽度包含多少个tile |move.w (a0)+, ScreenObj.HeightInTiles(a4) | always $10 |moveq #0, d0 |move.w (a0)+, d0 @@ -132,13 +132,13 @@ InitLayerObj: |lsl.w #4, d0 |move.w d0, ScreenObj.Y(a4) | layer's Y, neg mean down, in pixels |subi.w #0x10, d0 - |move.w d0, ScreenObj.TopPixelsY(a4) | ʱʹ, 16ض - |clr.l ScreenObj.YFromGround(a4) | ĻϹƫ + |move.w d0, ScreenObj.TopPixelsY(a4) | 更新时使用, 16像素对齐 + |clr.l ScreenObj.YFromGround(a4) | 屏幕的向上滚动偏移 |addi.w #0x120, d0 |move.w d0, ScreenObj.BottomPixelsY(a4) - |move.l a0, ScreenObj.pBackgroundSCB1Data(a4) | p1 rom бSCB1 ̬ rom + |move.l a0, ScreenObj.pBackgroundSCB1Data(a4) | p1 rom 中保存的SCB1 静态 rom 数据 |move.w #0x20, ScreenObj.BackgroundSpriteHeight(a4) - move.w #0xFFFF, ScreenObj.ShrinkRate(a4) | + move.w #0xFFFF, ScreenObj.ShrinkRate(a4) | 人物整体比例 |clr.l ScreenObj.VertSpriteDeltaYBuf(a4) |clr.l ScreenObj.VertSpriteDeltaYBuf+4(a4) |clr.l ScreenObj.VertSpriteDeltaYBuf+8(a4) @@ -147,7 +147,7 @@ InitLayerObj: |clr.l ScreenObj.field_F4(a4) |clr.l ScreenObj.field_F8(a4) |clr.l ScreenObj.field_FC(a4) - clr.w A5Seg.GlobalCamaraYDelta(a5) | ȫ־ͷYƫ + clr.w A5Seg.GlobalCamaraYDelta(a5) | 全局镜头的Y偏移 rts | End of function InitLayerObj @@ -240,7 +240,7 @@ LoadBckgrdSCB1data: movea.l ScreenObj.pBackgroundSCB1Data(a4), a0 | move.w ScreenObj.Player2TilePaletteDelta(a4), d3 | player1: $00 | player2: $20 - | Ӧ A5Seg.GlobalTilePalettePaletteƫ + | 对应 A5Seg.GlobalTilePalette的Palette偏移量 | clr.b d3 move.w #1, 2(a1) @@ -313,24 +313,24 @@ _LoadSCB3_4fromScreenObj_addLoop: move.w d0, (a0)+ move.w d0, d7 move.w ScreenObj.Y(a4), d0 | layer's Y, neg mean down, in pixels - sub.w ScreenObj.YFromGround(a4), d0 | ĻcamaraϹƫ + sub.w ScreenObj.YFromGround(a4), d0 | 屏幕camara的向上滚动偏移 move.b ScreenObj.ShrinkRate+1(a4), d1 lsl.w #8, d1 | cmpi.w #0xFF00, d1 - add.w A5Seg.GlobalCamaraYDelta(a5), d0 | ȫ־ͷYƫ, Ч, neg ʾͷ - subi.w #0x10, d0 | Ϸ0x10زʾ + add.w A5Seg.GlobalCamaraYDelta(a5), d0 | 全局镜头的Y偏移, 如地震效果等, neg 表示镜头上移 + subi.w #0x10, d0 | 上方0x10像素不显示区 lsl.w #7, d0 move.w d0, d1 move.w d7, d0 lea A5Seg.BackgroundSpritesXTempBuf(a5), a1 moveq #0, d4 tst.b A5Seg.VideoSpecialModes(a5) | bit0: 1, not show back obj - | bit1: 1, ʾ + | bit1: 1, 显示分数排名 | bit2: 1, demo mod | bit3: 1, not show coin and difficulty | bit4: 1, role fast speed - | bit6: 1, 3 + | bit6: 1, 3倍慢速 | bit7: 1, not show background bmi.s _LoadSCB3_4fromScreenObj_testXoverflow btst #0, ScreenObj.Flag(a4) | bit0: 1, do not show this layer @@ -436,7 +436,7 @@ BackGroundLayerRoutine: |0x2110 | d0: addr | d1: width - 1 | d2: height - 1 - move.l #_BackGroundLayerRoutine_step2, ScreenObj(a4) | + move.l #_BackGroundLayerRoutine_step2, ScreenObj(a4) | 主例程 _BackGroundLayerRoutine_step2: move.w ScreenObj.VRamBaseOffsetInSCB1(a4), d0 @@ -447,7 +447,7 @@ _BackGroundLayerRoutine_step2: | bit1: Vertical flip | bit2: 2bit Auto-anim | bit3: 3bit Auto-anim - | ʵSCB1 tile ڶword ĵֽ + | 实际上是SCB1 tile 第二word 的低字节属性 | bne.s _BackGroundLayerRoutine_flip jsr LoadBckgrdSCB1data | params: | a4: screen obj @@ -465,7 +465,7 @@ _BackGroundLayerRoutine_step3: | | bit5: 1, do not ... ? | | bit6: 1, sticky | | bit7: 0, do not use layer proc -| move.l #loc_E646, ScreenObj(a4) | +| move.l #loc_E646, ScreenObj(a4) | 主例程 | bra.s _BackGroundLayerRoutine_step4 | --------------------------------------------------------------------------- @@ -476,7 +476,7 @@ _BackGroundLayerRoutine_step3: | | bit5: 1, do not ... ? | | bit6: 1, sticky | | bit7: 0, do not use layer proc -| move.l #_BackGroundLayerRoutine_step4, ScreenObj(a4) | +| move.l #_BackGroundLayerRoutine_step4, ScreenObj(a4) | 主例程 _BackGroundLayerRoutine_step4: | CODE XREF: BackGroundLayerRoutine+68j | BackGroundLayerRoutine+76j diff --git a/src/CH/20_effect.s b/src/CH/20_effect.s index 90ee1a6..98ef156 100644 --- a/src/CH/20_effect.s +++ b/src/CH/20_effect.s @@ -168,7 +168,7 @@ EffectRoutine0: | 0, hit spark move.w #0x20, Object.ChCode(a4) move.w Object.selfBuf2(a4), Object.ActCode(a4) movea.l Object.ParentObj(a4), a3 - btst #4, Object.RoleStatusFlags(a3) | bit4: 1, + btst #4, Object.RoleStatusFlags(a3) | bit4: 1, 曝气中 beq.w EffectRoutineContinue addq.w #3, Object.ActCode(a4) bra.w EffectRoutineContinue @@ -225,7 +225,7 @@ EffectRoutine9: | 9, big hit spark move.w #0x20, Object.ChCode(a4) move.w #2, Object.ActCode(a4) movea.l Object.ParentObj(a4), a3 - btst #4, Object.RoleStatusFlags(a3) | bit4: 1, + btst #4, Object.RoleStatusFlags(a3) | bit4: 1, 曝气中 beq.w EffectRoutineContinue move.w #5, Object.ActCode(a4) bra.w EffectRoutineContinue @@ -368,7 +368,7 @@ EffectRoutine2C: | 2c, land on ground sound EffectRoutine2D: | 2d, hit spark with sound (big) move.w #0x68, d0 movea.l Object.ParentObj(a4), a3 - btst #4, Object.RoleStatusFlags(a3) | bit4: 1, + btst #4, Object.RoleStatusFlags(a3) | bit4: 1, 曝气中 beq.s loc_2B628 move.w #0x69, d0 bra.s loc_2B628 @@ -377,7 +377,7 @@ EffectRoutine2D: | 2d, hit spark with sound (big) EffectRoutine2E: | 2e, hit spark with sound move.w #0x62, d0 movea.l Object.ParentObj(a4), a3 - btst #4, Object.RoleStatusFlags(a3) | bit4: 1, + btst #4, Object.RoleStatusFlags(a3) | bit4: 1, 曝气中 beq.s loc_2B628 move.w #0x66, d0 @@ -390,7 +390,7 @@ loc_2B628: EffectRoutine2F: | 2f, hit spark with sound move.w #0x63, d0 movea.l Object.ParentObj(a4), a3 - btst #4, Object.RoleStatusFlags(a3) | bit4: 1, + btst #4, Object.RoleStatusFlags(a3) | bit4: 1, 曝气中 beq.s loc_2B628 move.w #0x67, d0 bra.s loc_2B628 @@ -398,7 +398,7 @@ EffectRoutine2F: | 2f, hit spark with sound EffectRoutine30: | 30, hit spark with sound move.w #0x62, d0 movea.l Object.ParentObj(a4), a3 - btst #4, Object.RoleStatusFlags(a3)| bit4: 1, + btst #4, Object.RoleStatusFlags(a3)| bit4: 1, 曝气中 beq.s loc_2B666 move.w #0x66, d0 @@ -411,7 +411,7 @@ loc_2B666: EffectRoutine31: | 31, hit spark with sound move.w #0x63, d0 movea.l Object.ParentObj(a4), a3 - btst #4, Object.RoleStatusFlags(a3) | bit4: 1, + btst #4, Object.RoleStatusFlags(a3) | bit4: 1, 曝气中 beq.s loc_2B666 move.w #0x67, d0 bra.s loc_2B666 @@ -420,7 +420,7 @@ EffectRoutine31: | 31, hit spark with sound EffectRoutine32: | 32, hit spark with sound move.w #0x68, d0 movea.l Object.ParentObj(a4), a3 - btst #4, Object.RoleStatusFlags(a3) | bit4: 1, + btst #4, Object.RoleStatusFlags(a3) | bit4: 1, 曝气中 beq.s loc_2B666 move.w #0x69, d0 bra.s loc_2B666 @@ -563,32 +563,32 @@ EffectRoutineContinueEX: movea.l Object.ParentObj(a4), a3 EffectRoutineContinue: - move.w Object.Z(a3), d0 | bit 0~2: ͬһͼеϸȽ - | bit4: Zbuf е - add.w d0, Object.Z(a4) | bit 0~2: ͬһͼеϸȽ - | bit4: Zbuf е + move.w Object.Z(a3), d0 | bit 0~2: 同一图层中的细比较 + | bit4以上: 在 Zbuf 中的索引 + add.w d0, Object.Z(a4) | bit 0~2: 同一图层中的细比较 + | bit4以上: 在 Zbuf 中的索引 move.b Object.IsFaceToRight(a3), Object.IsFaceToRight(a4) | bit0: Horizontal flip | bit1: Vertical flip | bit2: 2bit Auto-anim | bit3: 3bit Auto-anim - | ʵSCB1 tile ڶword ĵֽ - move.w Object.OriX(a4), d0 | ͼԭ(ʮ)ĺ, ߼λ, صλ + | 实际上是SCB1 tile 第二word 的低字节属性 + move.w Object.OriX(a4), d0 | 贴图原点(十字)的横坐标, 区域逻辑位置, 像素单位 btst #0, Object.IsFaceToRight(a3) | bit0: Horizontal flip | bit1: Vertical flip | bit2: 2bit Auto-anim | bit3: 3bit Auto-anim - | ʵSCB1 tile ڶword ĵֽ + | 实际上是SCB1 tile 第二word 的低字节属性 beq.s loc_2B2A6 neg.w d0 loc_2B2A6: | CODE XREF: EffectRoutine0-A4j - add.w Object.OriX(a3), d0 | ͼԭ(ʮ)ĺ, ߼λ, صλ - move.w d0, Object.OriX(a4) | ͼԭ(ʮ)ĺ, ߼λ, صλ - move.w Object.OriY(a3), d0 | ͼԭ(ʮ), ߼߶, صλ - add.w d0, Object.OriY(a4) | ͼԭ(ʮ), ߼߶, صλ - move.w Object.YFromGround(a3), Object.YFromGround(a4) | ʱ߶, صλ + add.w Object.OriX(a3), d0 | 贴图原点(十字)的横坐标, 区域逻辑位置, 像素单位 + move.w d0, Object.OriX(a4) | 贴图原点(十字)的横坐标, 区域逻辑位置, 像素单位 + move.w Object.OriY(a3), d0 | 贴图原点(十字)的纵坐标, 区域逻辑高度, 像素单位 + add.w d0, Object.OriY(a4) | 贴图原点(十字)的纵坐标, 区域逻辑高度, 像素单位 + move.w Object.YFromGround(a3), Object.YFromGround(a4) | 起跳时距离地面高度, 像素单位 move.b #0xFF, Object.PrevActCode(a4) - move.w #0xFFFF, Object.RoleShrinkRate(a4) | + move.w #0xFFFF, Object.RoleShrinkRate(a4) | 人物整体比例 SetEffectWait: move.l #EffectWait, Object(a4) @@ -598,9 +598,9 @@ EffectWait: | bit1: 1, have hit box 1 | bit2: 1, have hit box 2 | bit3: 1, have hit box 3 - | bit4: 1, Ч, ƿշ - | bit5: 1, еߵķ1hit - | bit6: 1, ײbox0(һ֡ļ) + | bit4: 1, 曝气效果, 破空防 + | bit5: 1, 飞行道具的非最后1hit + | bit6: 1, 碰撞发生后持续清除box0(不参与下一帧后的检测) | bit7: 1, Act end bmi.s EffectDestroy jsr GetNextMov | ret: @@ -623,8 +623,8 @@ InitShakeScreenObj: move.w #0x50FF, d0 jsr (AllocateObjBlock).l move.l a4, Object.ParentObj(a1) - move.w #0xA, Object.selfBuf1(a1) | ʱ - move.w #0xFFFC, Object.selfBuf1+2(a1) | Yͷƫ + move.w #0xA, Object.selfBuf1(a1) | 持续时间 + move.w #0xFFFC, Object.selfBuf1+2(a1) | Y镜头偏移 rts @@ -650,7 +650,7 @@ InitShakeScreen3Obj: ShakeScreenRoutine: move.l #_ShakeScreenRoutine_step2, Object(a4) | moveq #0, d0 -| move.b A5Seg.BackgroundId(a5), d0 | սѡ07 +| move.b A5Seg.BackgroundId(a5), d0 | 对战场地选择,0~7 | add.w d0, d0 | add.w d0, d0 | lea off_2AAA6, a0 @@ -664,13 +664,13 @@ _ShakeScreenRoutine_step2: moveq #0, d1 loc_2AA90: - move.w d1, A5Seg.GlobalCamaraYDelta(a5) | ȫ־ͷYƫ, Ч, neg ʾͷ + move.w d1, A5Seg.GlobalCamaraYDelta(a5) | 全局镜头的Y偏移, 如地震效果等, neg 表示镜头上移 subq.w #1, Object.selfBuf1(a4) | time beq.s _ShakeScreenRoutine_destroy rts | --------------------------------------------------------------------------- _ShakeScreenRoutine_destroy: - clr.w A5Seg.GlobalCamaraYDelta(a5) | ȫ־ͷYƫ, Ч, neg ʾͷ + clr.w A5Seg.GlobalCamaraYDelta(a5) | 全局镜头的Y偏移, 如地震效果等, neg 表示镜头上移 jmp FreeObjBlock | params: | End of function ShakeScreenRoutine | a4: Obj diff --git a/src/FixLay.s b/src/FixLay.s index 12480a1..90a93ed 100644 --- a/src/FixLay.s +++ b/src/FixLay.s @@ -77,7 +77,7 @@ loc_6F9E: | CODE XREF: SetFixlayTextEx+6Ej bne.s _SetFixlayTextEx_putChar cmpi.b #0xA, (a0) bne.s _SetFixlayTextEx_putChar - tst.b (a0)+ | $D(\r) $A(\n) + tst.b (a0)+ | 如果是 $D(\r) 或 $A(\n) move.w A5Seg.TextOutputOffset(a5), d2 addq.w #1, d2 move.w A5Seg.TextOutputEntryHigh(a5), d0 @@ -96,7 +96,7 @@ _SetFixlayTextEx_putChar: move.w d1, d2 move.l d2, (REG_VRAMADDR).l swap d2 - addi.w #0x20, d2 | һ + addi.w #0x20, d2 | 向右一列 bra.s loc_6F9E | --------------------------------------------------------------------------- diff --git a/src/Help.s b/src/Help.s index ff8ec34..85ab1bb 100644 --- a/src/Help.s +++ b/src/Help.s @@ -88,17 +88,17 @@ _HelpRoutine_step4: HelpInit: - clr.l A5Seg.ScreenLeftX(a5) | ʾ˺, صλ 0-1C0 - clr.l A5Seg.ScreenTopY(a5) | صλ, ݳͬ㲻ͬ - | 㱳 + clr.l A5Seg.ScreenLeftX(a5) | 显示区域最左端横坐标, 像素单位 0-1C0 + clr.l A5Seg.ScreenTopY(a5) | 像素单位, 根据场景不同起点不同 + | 顶层背景 jsr SetBackgroundNoUse | clr.b A5Seg.PersonSelBlock1(a5) | if at sel mode, set this byte to 1 | clr.b A5Seg.PersonSelBlock2(a5) -| move.b #0, A5Seg.SelectedP1PID(a5) | ѡ˱ +| move.b #0, A5Seg.SelectedP1PID(a5) | 选人表 | move.b #8, A5Seg.SelectedP2PID(a5) -| clr.b A5Seg.ColorFlags1(a5) | ѡʱɫ, ɫ0, ɫ1 -| clr.b A5Seg.ColorFlags1+1(a5) | ѡʱɫ, ɫ0, ɫ1 -| clr.b A5Seg.ColorFlags1+2(a5) | ѡʱɫ, ɫ0, ɫ1 +| clr.b A5Seg.ColorFlags1(a5) | 选人时决定的颜色, 主颜色0, 副颜色1 +| clr.b A5Seg.ColorFlags1+1(a5) | 选人时决定的颜色, 主颜色0, 副颜色1 +| clr.b A5Seg.ColorFlags1+2(a5) | 选人时决定的颜色, 主颜色0, 副颜色1 | clr.b A5Seg.ColorFlags2(a5) | clr.b A5Seg.ColorFlags2+1(a5) | clr.b A5Seg.ColorFlags2+2(a5) @@ -141,9 +141,9 @@ HelpInitDataForSprites: | jsr LoadPalDoubleArrayEntries | params: | a0: ptr to idx in rom | a1: ptr to des idx - clr.l A5Seg.ScreenLeftX(a5) | ʾ˺, صλ 0-1C0 - clr.l A5Seg.ScreenTopY(a5) | صλ, ݳͬ㲻ͬ - | 㱳 + clr.l A5Seg.ScreenLeftX(a5) | 显示区域最左端横坐标, 像素单位 0-1C0 + clr.l A5Seg.ScreenTopY(a5) | 像素单位, 根据场景不同起点不同 + | 顶层背景 | move.w #0xFF00, A5Seg.SomeGlobalHoriShrinking(a5) | always ff00 | move.w #0xFF00, A5Seg.SomeGlobalVertShrinking(a5) | always ff00 | andi.b #0xFD, A5Seg.PaletteUpdateFlag(a5) | bit0: 0: use bank Index 1; 1: use bank Index 0 @@ -191,9 +191,9 @@ _InitFixlayHowToPlay_destroy: TextoutCursorRoutine: - move.w #0xFFFF, Object.RoleShrinkRate(a4) | - move.w #0xFFFF, Object.Z(a4) | bit 0~2: ͬһͼеϸȽ - | bit4: Zbuf е + move.w #0xFFFF, Object.RoleShrinkRate(a4) | 人物整体比例 + move.w #0xFFFF, Object.Z(a4) | bit 0~2: 同一图层中的细比较 + | bit4以上: 在 Zbuf 中的索引 move.w #0x22, Object.ChCode(a4) move.w #0xD5, Object.ActCode(a4) move.w Object.selfBuf1(a4), Object.selfBuf1+2(a4) @@ -274,10 +274,10 @@ _InitFixlayHowToPlay_destroy: CursorMove: move.w Object.selfBuf2(a4), d0 | current X add.w Object.selfBuf2+8(a4), d0 | delta X - move.w d0, Object.OriX(a4) | ͼԭ(ʮ)ĺ, ߼λ, صλ + move.w d0, Object.OriX(a4) | 贴图原点(十字)的横坐标, 区域逻辑位置, 像素单位 move.w Object.selfBuf2+2(a4), d0 | current Y add.w Object.selfBuf2+0xA(a4), d0 | delta Y - move.w d0, Object.OriY(a4) | ͼԭ(ʮ), ߼߶, صλ + move.w d0, Object.OriY(a4) | 贴图原点(十字)的纵坐标, 区域逻辑高度, 像素单位 rts | End of function CursorMove diff --git a/src/Object.s b/src/Object.s index 62b03b9..403fc63 100644 --- a/src/Object.s +++ b/src/Object.s @@ -44,24 +44,24 @@ AllocateObjBlock: |1f82 bmi.w _AllocateObjBlock_overflow | if (curIndex > 0x7F) | goto ...overflow subq.w #2, A5Seg.ObjPoolStackIndex(a5) | curIndex -= 2 - | עʱ d7 ûб + | 注意此时 d7 没有变 lea A5Seg.SpritePoolBaseTable(a5), a1 | 10a700 movea.w (a1,d7.w), a1 adda.l #0x100000, a1 move.l a0, Object(a1) - move.w d0, Object.Level(a1) | ֵԽС, Խȱִ (ȼԽ). - | ҲжǷ񶳽ử - lea -0x7F00(a5), a0 | 100100 ͷ + move.w d0, Object.Level(a1) | 数值越小, 处理程序越先被执行 (优先级越高). + | 也用于判断是否冻结画面 + lea -0x7F00(a5), a0 | 100100 链表头 move.l a0, d7 _AllocateObjBlock_findPosition: | CODE XREF: AllocateObjBlock+30j move.w Object.PNext(a0), d7 movea.l d7, a0 | a0 = 100000 + *(a0+4) - cmp.w Object.Level(a0), d0 | ֵԽС, Խȱִ (ȼԽ). - | ҲжǷ񶳽ử + cmp.w Object.Level(a0), d0 | 数值越小, 处理程序越先被执行 (优先级越高). + | 也用于判断是否冻结画面 bcc.s _AllocateObjBlock_findPosition | if(8(a0)<=d0) goto - move.w a0, Object.PNext(a1) | ҵһ level 㹻Ŀ - | ԭĿ鰴level˳ + move.w a0, Object.PNext(a1) | 找到了一个 level 足够大的块 + | 把原来的块按照level顺序插进链表 move.w Object.PPrev(a0), Object.PPrev(a1) move.w Object.PPrev(a0), d7 move.w a1, Object.PPrev(a0) @@ -75,7 +75,7 @@ _AllocateObjBlock_zeroLoop: move.l d7, (a0)+ move.l d7, (a0)+ move.l d7, (a0)+ - dbf d0, _AllocateObjBlock_zeroLoop | 0x1f0 + dbf d0, _AllocateObjBlock_zeroLoop | 清零 0x1f0 rts | --------------------------------------------------------------------------- @@ -103,15 +103,15 @@ FreeObjBlock: addq.w #2, A5Seg.ObjPoolStackIndex(a5) moveq #0, d0 move.w A5Seg.ObjPoolStackIndex(a5), d0 - move.w a4, (a0,d0.w) | ͷŵǰ200_Block + move.w a4, (a0,d0.w) | 释放当前的200_Block move.l #0x100000, d0 - move.w Object.PPrev(a4), d0 | BlockжϿ + move.w Object.PPrev(a4), d0 | 将此Block从链表中断开 movea.l d0, a0 move.w Object.PNext(a4), Object.PNext(a0) move.w Object.PNext(a4), d0 movea.l d0, a0 move.w Object.PPrev(a4), Object.PPrev(a0) - move.w #0xFFFF, Object.PPrev(a4) | ǰһڵΪ, ʾ + move.w #0xFFFF, Object.PPrev(a4) | 前一个节点为空, 表示不处在运行链中 rts | End of function FreeObjBlock @@ -131,9 +131,9 @@ _ZeroObjZbuf_dbfLoop: | CODE XREF: ZeroObjZbuf+18 move.l d0, (a0)+ move.l d0, (a0)+ dbf d1, _ZeroObjZbuf_dbfLoop - move.l #0x108700, A5Seg.pGhostBuf(a5) | ӰӰӵ - | ָõʱڹobjͷ, ÿ0x40, ܴС0x2000 - move.l #0xFFFE, A5Seg.FirstObjIndexInZBuf(a5) | ָʾһ0ObjZbufеƫ, -2 ʾZbufΪ + move.l #0x108700, A5Seg.pGhostBuf(a5) | 影跳的影子等 + | 指向可用的临时缓冲区用于构造obj头, 每块0x40, 总大小0x2000 + move.l #0xFFFE, A5Seg.FirstObjIndexInZBuf(a5) | 指示第一个带非0的Obj在Zbuf中的偏移, -2 表示Zbuf为空 clr.w A5Seg.NumInObjZBuf(a5) rts | End of function ZeroObjZbuf @@ -147,16 +147,16 @@ CallObjRoutine: move.l #OBJ_LIST_HEAD, d7 | btst #2, A5Seg.RoleObjMaskFlags(a5) | bit0: 1, lock p1 | | bit1: 1, lock p2 -| | bit2: 1, freeze mode, ɱ +| | bit2: 1, freeze mode, 必杀画面 | beq.s _CallObjRoutine_normalLoop | |_CallObjRoutine_freezeLoop: | CODE XREF: CallObjRoutine+32j | movea.l d7, a4 | set a4 = next obj -| move.w Object.Level(a4), d7 | жǷ񶳽ử -| cmp.w A5Seg.unfreezeLevelNum(a5), d7 | level +| move.w Object.Level(a4), d7 | 用于判断是否冻结画面 +| cmp.w A5Seg.unfreezeLevelNum(a5), d7 | 不冻结的level编号 | bne.w _CallObjRoutine_unfreezeObj | movea.l Object(a4), a0 -| jsr (a0) | ʱȻִobj +| jsr (a0) | 冻结的时候仍然会执行obj处理例程 | |_CallObjRoutine_goNextLoop: | CODE XREF: CallObjRoutine+3Ej | | CallObjRoutine+52j @@ -169,9 +169,9 @@ CallObjRoutine: |_CallObjRoutine_unfreezeObj: | CODE XREF: CallObjRoutine+24j | btst #5, Object.ExGraphFlags(a4) | bit0: 1, need to update SCB1 | | bit1: 1, do not use extra graph -| | bit2: 1, ʹûƲ㱳 +| | bit2: 1, 使用缓移层背景 | | bit3: ? -| | bit4: 1, use own Shrinking, do not set InScreenX,Y Ӱ +| | bit4: 1, use own Shrinking, do not set InScreenX,Y 倒影用 | | bit5: 1, visible during freeze | | bit7: 1, use sub SCB3 buf | beq.s _CallObjRoutine_goNextLoop @@ -192,7 +192,7 @@ _CallObjRoutine_normalLoop: jsr (a0) move.l a4, d7 move.w Object.PNext(a4), d7 - bpl.s _CallObjRoutine_normalLoop | ѭִÿobjĴ + bpl.s _CallObjRoutine_normalLoop | 循环执行每个obj的处理例程 lea (0x10B0B2).l, a4 | BackGroundObjLayer0 move.b #8, A5Seg.PendingNumOfBackgroundLayerToUpdate(a5) @@ -204,8 +204,8 @@ _CallObjRoutine_layerLoop: | CODE XREF: CallObjRouti | bit5: 1, do not ... ? | bit6: 1, sticky | bit7: 0, do not use layer proc - bpl.s _CallObjRoutine_nextLayer | Ϸʵֻ3㱳 - movea.l ScreenObj(a4), a0 | + bpl.s _CallObjRoutine_nextLayer | 游戏中实际只是用3层背景 + movea.l ScreenObj(a4), a0 | 主例程 jsr (a0) _CallObjRoutine_nextLayer: | CODE XREF: CallObjRoutine+94j @@ -230,19 +230,19 @@ InsertIntoObjZBuf: InsertIntoObjZBufGhost: | CODE XREF: ROM:00014E34p | ROM:00014E5Ep ... move.l Object.XinScreen(a4), d0 - move.l Object.OriX(a4), d1 | ͼԭ(ʮ)ĺ, ߼λ, صλ - move.l Object.OriY(a4), d2 | ͼԭ(ʮ), ߼߶, صλ - move.l Object.YFromGround(a4), d3 | ʱ߶, صλ - move.l Object.RoleShrinkRate(a4), d4 | - move.w Object.Z(a4), d5 | bit 0~2: ͬһͼеϸȽ - | bit4: Zbuf е - move.w Object.Palette(a4), d6 | obj Դ palette, SCB1 ڶ word ֽʹ - move.l Object.pGraphDataSubmenuBase(a4), d7 | Obj SCB1 ݵʼַ - | (ɫ, , , ߶, ...) - movea.l Object.pGraphInfoEntry(a4), a1 | ָ4ֽXoffset,Yoffset - | Ȼһword SCB1 data offset from obj data base - movea.l A5Seg.pGhostBuf(a5), a3 | ӰӰӵ - | ָõʱڹobjͷ, ÿ0x40, ܴС0x200 + move.l Object.OriX(a4), d1 | 贴图原点(十字)的横坐标, 区域逻辑位置, 像素单位 + move.l Object.OriY(a4), d2 | 贴图原点(十字)的纵坐标, 区域逻辑高度, 像素单位 + move.l Object.YFromGround(a4), d3 | 起跳时距离地面高度, 像素单位 + move.l Object.RoleShrinkRate(a4), d4 | 人物整体比例 + move.w Object.Z(a4), d5 | bit 0~2: 同一图层中的细比较 + | bit4以上: 在 Zbuf 中的索引 + move.w Object.Palette(a4), d6 | obj 自带 palette, SCB1 第二 word 高字节使用 + move.l Object.pGraphDataSubmenuBase(a4), d7 | 此 Obj 的 SCB1 数据的起始地址 + | (调色盘, 解析方法, 宽度, 高度, 数据...) + movea.l Object.pGraphInfoEntry(a4), a1 | 先指向4字节Xoffset,Yoffset + | 然后是一个word的 SCB1 data offset from obj data base + movea.l A5Seg.pGhostBuf(a5), a3 | 影跳的影子等 + | 指向可用的临时缓冲区用于构造obj头, 每块0x40, 总大小0x200 cmpa.l #ObjPoolBaseTable, a3 ble.s loc_5CE6 moveq #0xFFFFFFFF, d6 | -1: fail @@ -250,45 +250,45 @@ InsertIntoObjZBufGhost: | CODE XREF: ROM:00014E34p | --------------------------------------------------------------------------- loc_5CE6: | CODE XREF: InsertIntoObjZBuf+36j - st (a3) | ֽд FF + st (a3) | 单字节写入 FF addi.w #0x40, A5Seg.pGhostBuf+2(a5) | set next bufBlock move.l d0, Object.XinScreen(a3) - move.l d1, Object.OriX(a3) | ͼԭ(ʮ)ĺ, ߼λ, صλ - move.l d2, Object.OriY(a3) | ͼԭ(ʮ), ߼߶, صλ - move.l d3, Object.YFromGround(a3) | ʱ߶, صλ - move.l d4, Object.RoleShrinkRate(a3) | - move.w d5, Object.Z(a3) | bit 0~2: ͬһͼеϸȽ - | bit4: Zbuf е - move.w d6, Object.Palette(a3) | obj Դ palette, SCB1 ڶ word ֽʹ - move.l d7, Object.pGraphDataSubmenuBase(a3) | Obj SCB1 ݵʼַ - | (ɫ, , , ߶, ...) - move.l a1, Object.pGraphInfoEntry(a3) | ָ4ֽXoffset,Yoffset - | Ȼһword SCB1 data offset from obj data base + move.l d1, Object.OriX(a3) | 贴图原点(十字)的横坐标, 区域逻辑位置, 像素单位 + move.l d2, Object.OriY(a3) | 贴图原点(十字)的纵坐标, 区域逻辑高度, 像素单位 + move.l d3, Object.YFromGround(a3) | 起跳时距离地面高度, 像素单位 + move.l d4, Object.RoleShrinkRate(a3) | 人物整体比例 + move.w d5, Object.Z(a3) | bit 0~2: 同一图层中的细比较 + | bit4以上: 在 Zbuf 中的索引 + move.w d6, Object.Palette(a3) | obj 自带 palette, SCB1 第二 word 高字节使用 + move.l d7, Object.pGraphDataSubmenuBase(a3) | 此 Obj 的 SCB1 数据的起始地址 + | (调色盘, 解析方法, 宽度, 高度, 数据...) + move.l a1, Object.pGraphInfoEntry(a3) | 先指向4字节Xoffset,Yoffset + | 然后是一个word的 SCB1 data offset from obj data base _InsertIntoObjZBuf_inserIntoZBuf: | CODE XREF: InsertIntoObjZBuf+6j move.w a3, d1 | d5: Z | a3: obj (real or delayShadow) lea A5Seg.ObjZBuf(a5), a0 | size: 0x600 move.w d5, d0 - andi.w #0xFF8, d0 | bit 0~2 - lsr.w #2, d0 | 3λõ, 2õƫ + andi.w #0xFF8, d0 | bit 0~2 无用 + lsr.w #2, d0 | 右移3位得到索引, 乘2得到偏移 _InsertIntoObjZBuf_loop: moveq #0, d2 move.w (a0,d0.w), d2 - beq.s _InsertIntoObjZBuf_emptyEntry | ҵһеZbufλ + beq.s _InsertIntoObjZBuf_emptyEntry | 找到了一个空闲的Zbuf位置 movea.l #0x100000, a1 - adda.l d2, a1 | a1: ѾռZbufλõObj - move.w Object.Z(a1), d3 | bit 0~2: ͬһͼеϸȽ - | bit4: Zbuf е + adda.l d2, a1 | a1: 已经占用了这个Zbuf位置的Obj + move.w Object.Z(a1), d3 | bit 0~2: 同一图层中的细比较 + | bit4以上: 在 Zbuf 中的索引 cmp.w d3, d5 bhi.s loc_5D4A - cmp.w A5Seg.FirstObjIndexInZBuf+2(a5), d0 | ָʾһ0ObjZbufеƫ, -2 ʾZbufΪ + cmp.w A5Seg.FirstObjIndexInZBuf+2(a5), d0 | 指示第一个带非0的Obj在Zbuf中的偏移, -2 表示Zbuf为空 bhi.s loc_5D42 - move.w d0, A5Seg.FirstObjIndexInZBuf+2(a5) | ָʾһ0ObjZbufеƫ, -2 ʾZbufΪ + move.w d0, A5Seg.FirstObjIndexInZBuf+2(a5) | 指示第一个带非0的Obj在Zbuf中的偏移, -2 表示Zbuf为空 loc_5D42: | CODE XREF: InsertIntoObjZBuf+92j - move.w d1, (a0,d0.w) | װobj, ԭobjó, Ѱҿλ + move.w d1, (a0,d0.w) | 安装这个obj, 把原来的obj拿出来, 向后寻找空位置 move.w d2, d1 move.w d3, d4 @@ -298,9 +298,9 @@ loc_5D4A: | CODE XREF: InsertIntoObjZBuf+8Cj | --------------------------------------------------------------------------- _InsertIntoObjZBuf_emptyEntry: - cmp.w A5Seg.FirstObjIndexInZBuf+2(a5), d0 | ҵһеZbufλ + cmp.w A5Seg.FirstObjIndexInZBuf+2(a5), d0 | 找到了一个空闲的Zbuf位置 bhi.s loc_5D58 - move.w d0, A5Seg.FirstObjIndexInZBuf+2(a5) | ָʾһ0ObjZbufеƫ, -2 ʾZbufΪ + move.w d0, A5Seg.FirstObjIndexInZBuf+2(a5) | 指示第一个带非0的Obj在Zbuf中的偏移, -2 表示Zbuf为空 loc_5D58: | CODE XREF: InsertIntoObjZBuf+A8j move.w d1, (a0,d0.w) diff --git a/src/Palette.s b/src/Palette.s index b31a752..aeee1e0 100644 --- a/src/Palette.s +++ b/src/Palette.s @@ -9,12 +9,12 @@ FlushUpdatePalette: lea A5Seg.PaletteTempQueueStart(a5), a0 | 10c022 move.w (a0)+, d0 - bmi.s _flush_end | Ϊת + bmi.s _flush_end | 为负数则转移 _flush_loop: | CODE XREF: FlushUpdatePalette+46j lea (0x400000).l, a1 | Palette base lsl.w #5, d0 | times 32 - adda.w d0, a1 | ע $402000 ֮Ǿ, д entry Ǹ $400000 дû + adda.w d0, a1 | 注意 $402000 之后是镜像, 向这里写入 entry 是跟向 $400000 部分写入没区别 clr.w (a1)+ move.w (a0)+, (a1)+ move.l (a0)+, (a1)+ @@ -45,7 +45,7 @@ Append32PaletteToTail: lsr.l #6, d0 adda.l d0, a0 movea.l A5Seg.PAL_IN_POINT(a5), a1 - move.w #0x1F, d0 | 0x20 Palette + move.w #0x1F, d0 | 0x20 个 Palette _pal_append: move.l (a0)+, (a1)+ diff --git a/src/Sprites.s b/src/Sprites.s index e9a0481..658384b 100644 --- a/src/Sprites.s +++ b/src/Sprites.s @@ -16,14 +16,14 @@ UpdateSCB3: move d7, ccr | xnzvc | 43210 bcc.s _UpdateSCB3_subBuf - move.w A5Seg.TileOffsetInSCB1_Main(a5), d0 | ԴеĴ»ַ(SCB1 ), - | ǰһwordÿ֡һ - move.w A5Seg.BackUpTileOffsetInSCB1_Main(a5), A5Seg.TileOffsetInSCB1_Main(a5) | ԴеĴ»ַ(SCB1 ), - | ǰһwordÿ֡һ + move.w A5Seg.TileOffsetInSCB1_Main(a5), d0 | 显存中的待更新基地址(SCB1 中), + | 这个跟前一个word每帧交换一次 + move.w A5Seg.BackUpTileOffsetInSCB1_Main(a5), A5Seg.TileOffsetInSCB1_Main(a5) | 显存中的待更新基地址(SCB1 中), + | 这个跟前一个word每帧交换一次 move.w d0, A5Seg.BackUpTileOffsetInSCB1_Main(a5) lsr.w #6, d0 | 64 words per entry in SCB1 - move.w A5Seg.ObjTotalSpriteNumbers_Main(a5), d3 | obj ռõsprite - lea A5Seg.TileVertPositionsBuff_Main(a5), a0 | vert buf, Ϸʹ + move.w A5Seg.ObjTotalSpriteNumbers_Main(a5), d3 | obj 所占用的sprite总数 + lea A5Seg.TileVertPositionsBuff_Main(a5), a0 | 主vert buf, 游戏使用 move.w d0, d2 addi.w #0x8200, d2 | SCB3 (VRAM $8200~$83FF): vertical positions move.w d2, (a1) @@ -40,7 +40,7 @@ _UpdateSCB3_subBuf: | CODE XREF: UpdateSCB3+1Cj | move.w d0, A5Seg.BackUpTileOffsetInSCB1_Sub(a5) | lsr.w #6, d0 | move.w A5Seg.ObjTotalSpriteNumbers_Sub(a5), d3 -| lea A5Seg.TileVertPositionsBuff_Sub(a5), a0 | vert buf, , Чʹ, ͼڵ㱳֮ +| lea A5Seg.TileVertPositionsBuff_Sub(a5), a0 | 副 vert buf, 过场动画, 特效等使用, 图层在第三层背景之下 | move.w d0, d2 | addi.w #0x8200, d2 | move.w d2, (a1) @@ -50,7 +50,7 @@ _UpdateSCB3_subBuf: | CODE XREF: UpdateSCB3+1Cj | a1: REG_VRAMADDR _UpdateSCB3_TestZeroTheBackup: - clr.w A5Seg.SpriteAlreadyUsed_Main(a5) | Ѿʹõsprite + clr.w A5Seg.SpriteAlreadyUsed_Main(a5) | 已经使用的sprite个数 | clr.w A5Seg.SpriteAlreadyUsed_Sub(a5) lea (0x3C0000).l, a1 move.w #1, (0x3C0004).l @@ -66,14 +66,14 @@ _UpdateSCB3_TestZeroTheBackup: _UpdateSCB3_zeroTheBackup: | CODE XREF: UpdateSCB3+88j move d7, ccr bcc.s _UpdateSCB3_zeroSub - move.w A5Seg.TileOffsetInSCB1_Main(a5), d0 | ԴеĴ»ַ(SCB1 ), - | ǰһwordÿ֡һ + move.w A5Seg.TileOffsetInSCB1_Main(a5), d0 | 显存中的待更新基地址(SCB1 中), + | 这个跟前一个word每帧交换一次 move.w d0, d2 lsr.w #6, d2 addi.w #0x8200, d2 move.w d2, (a1) moveq #0, d2 - move.w A5Seg.ObjTotalSpriteNumbers_Main(a5), d3 | obj ռõsprite + move.w A5Seg.ObjTotalSpriteNumbers_Main(a5), d3 | obj 所占用的sprite总数 moveq #0, d0 bsr.w ZeroVertPositionsToSCB3Ebd | params: | d0: val to write @@ -81,7 +81,7 @@ _UpdateSCB3_zeroTheBackup: | CODE XREF: UpdateSCB3+88j | a1: REG_VRAMADDR moveq #0, d0 moveq #0xF, d1 - lea A5Seg.TileVertPositionsBuff_Main(a5), a0 | vert buf, Ϸʹ + lea A5Seg.TileVertPositionsBuff_Main(a5), a0 | 主vert buf, 游戏使用 _UpdateSCB3_dbfLoop: | CODE XREF: UpdateSCB3+BAj move.l d0, (a0)+ @@ -107,7 +107,7 @@ _UpdateSCB3_zeroSub: | CODE XREF: UpdateSCB3+8Ej | | a1: REG_VRAMADDR | moveq #0, d0 | moveq #0xF, d1 -| lea A5Seg.TileVertPositionsBuff_Sub(a5), a0 | vert buf, , Чʹ, ͼڵ㱳֮ +| lea A5Seg.TileVertPositionsBuff_Sub(a5), a0 | 副 vert buf, 过场动画, 特效等使用, 图层在第三层背景之下 | |_UpdateSCB3__UpdateSCB3_dbfLoop: | CODE XREF: UpdateSCB3+ECj | move.l d0, (a0)+ @@ -410,7 +410,7 @@ _ZeroVertPositionsToSCB3Ebd_repeatWrite: | updeate shirnk vals -| , ÿ32entry +| 按块更新, 每块最多包含32个entry UpdateSCB2: move.l #0x10BCFE, A5Seg.ShrinkUpdateBlocksStart(a5) @@ -569,7 +569,7 @@ _UpdateBackgroundSCB3_4_SCB3: rts | End of function UpdateBackgroundSCB3_4 -| Zbuf е obj µ VRAM +| 把 Zbuf 中的 obj 逐个更新到 VRAM 中 DisplayZbuf: | CODE XREF: GameLogicMainLoopEntry+104p move.w #1, d0 @@ -581,7 +581,7 @@ _DisplayZbuf_switchSpin: | CODE XREF: DisplayZbuf+10 tst.w A5Seg.NumInObjZBuf(a5) beq.w _DisplayZbuf_ghost lea A5Seg.ObjZBuf(a5), a6 | size: 0x600 - adda.l A5Seg.FirstObjIndexInZBuf(a5), a6 | ָʾһ0ObjZbufеƫ, -2 ʾZbufΪ + adda.l A5Seg.FirstObjIndexInZBuf(a5), a6 | 指示第一个带非0的Obj在Zbuf中的偏移, -2 表示Zbuf为空 _DisplayZbuf_nextObjLoop: | CODE XREF: DisplayZbuf+8Ej move.l a5, d0 @@ -592,12 +592,12 @@ _DisplayZbuf_noFindLoop: | CODE XREF: DisplayZbuf+26 clr.w -2(a6) movea.l d0, a4 | a4: obj to be draw move.l a6, -(sp) | a6: current pos in ObjZBuf - move.b Object.ExGraphFlags(a4), d0 | bit4: 1, use own Shrinking, do not set InScreenX,Y Ӱ + move.b Object.ExGraphFlags(a4), d0 | bit4: 1, use own Shrinking, do not set InScreenX,Y 倒影用 btst #4, d0 beq.s loc_5C08 - move.b Object.RoleShrinkRate(a4), A5Seg.SpriteDrawHoriCoefficient(a5) | - move.b Object.RoleShrinkRate+1(a4), A5Seg.SpriteDrawVertCoefficient(a5) | + move.b Object.RoleShrinkRate(a4), A5Seg.SpriteDrawHoriCoefficient(a5) | 人物整体比例 + move.b Object.RoleShrinkRate+1(a4), A5Seg.SpriteDrawVertCoefficient(a5) | 人物整体比例 bra.s loc_5C44 | --------------------------------------------------------------------------- @@ -606,27 +606,27 @@ loc_5C08: | CODE XREF: DisplayZbuf+38j | d0: ExGraphFlags | ret: | a1: pShinking - move.w (a1), A5Seg.SpriteDrawHoriCoefficient(a5) | ˮƽ, (1ֽ, ֱдSCB2) - move.w 8(a1), A5Seg.SpriteDrawVertCoefficient(a5) | ֱ + move.w (a1), A5Seg.SpriteDrawHoriCoefficient(a5) | 水平收缩因子, (1字节, 并非直接写入SCB2) + move.w 8(a1), A5Seg.SpriteDrawVertCoefficient(a5) | 垂直收缩因子 moveq #0, d0 - move.b Object.RoleShrinkRate(a4), d0 | - move.w A5Seg.SpriteDrawHoriCoefficient(a5), d1 | ˮƽ, (1ֽ, ֱдSCB2) + move.b Object.RoleShrinkRate(a4), d0 | 人物整体比例 + move.w A5Seg.SpriteDrawHoriCoefficient(a5), d1 | 水平收缩因子, (1字节, 并非直接写入SCB2) cmpi.w #0xFF00, d1 bcc.s loc_5C2A mulu.w d1, d0 swap d0 loc_5C2A: | CODE XREF: DisplayZbuf+64j - move.b d0, A5Seg.SpriteDrawHoriCoefficient(a5) | ˮƽ, (1ֽ, ֱдSCB2) - move.b Object.RoleShrinkRate+1(a4), d0 | - move.w A5Seg.SpriteDrawVertCoefficient(a5), d1 | ֱ + move.b d0, A5Seg.SpriteDrawHoriCoefficient(a5) | 水平收缩因子, (1字节, 并非直接写入SCB2) + move.b Object.RoleShrinkRate+1(a4), d0 | 人物整体比例 + move.w A5Seg.SpriteDrawVertCoefficient(a5), d1 | 垂直收缩因子 cmpi.w #0xFF00, d1 bcc.s loc_5C40 mulu.w d1, d0 swap d0 loc_5C40: | CODE XREF: DisplayZbuf+7Aj - move.b d0, A5Seg.SpriteDrawVertCoefficient(a5) | ֱ + move.b d0, A5Seg.SpriteDrawVertCoefficient(a5) | 垂直收缩因子 loc_5C44: | CODE XREF: DisplayZbuf+46j bsr.w DrawSpriteGroup @@ -635,11 +635,11 @@ loc_5C44: | CODE XREF: DisplayZbuf+46j bne.w _DisplayZbuf_nextObjLoop _DisplayZbuf_ghost: | CODE XREF: DisplayZbuf+16j - move.l #0x108700, A5Seg.pGhostBuf(a5) | ӰӰӵ - | ָõʱڹobjͷ, ÿ0x40, ܴС0x2000 - move.l #0xFFFE, A5Seg.FirstObjIndexInZBuf(a5) | ָʾһ0ObjZbufеƫ, -2 ʾZbufΪ + move.l #0x108700, A5Seg.pGhostBuf(a5) | 影跳的影子等 + | 指向可用的临时缓冲区用于构造obj头, 每块0x40, 总大小0x2000 + move.l #0xFFFE, A5Seg.FirstObjIndexInZBuf(a5) | 指示第一个带非0的Obj在Zbuf中的偏移, -2 表示Zbuf为空 clr.w A5Seg.NumInObjZBuf(a5) - |clr.w A5Seg.NumInObjZBufNoUse(a5) | ƺû, õֻNumInObjZBuf + |clr.w A5Seg.NumInObjZBufNoUse(a5) | 似乎没用, 有用的只是NumInObjZBuf move.w #2, d0 loc_5C6E: diff --git a/src/Title.s b/src/Title.s index 8946342..3429e42 100644 --- a/src/Title.s +++ b/src/Title.s @@ -88,14 +88,14 @@ InitTilesSprites: | clr.w A5Seg+0x592E(a5) | clr.w A5Seg+0x5930(a5) | clr.w A5Seg.field_5932(a5) -| clr.l A5Seg.ScreenLeftX(a5) | ʾ˺, صλ 0-1C0 -| clr.l A5Seg.ScreenTopY(a5) | صλ, ݳͬ㲻ͬ -| | 㱳 +| clr.l A5Seg.ScreenLeftX(a5) | 显示区域最左端横坐标, 像素单位 0-1C0 +| clr.l A5Seg.ScreenTopY(a5) | 像素单位, 根据场景不同起点不同 +| | 顶层背景 | move.w #0xFF00, A5Seg.SomeGlobalHoriShrinking(a5) | always ff00 | move.w #0xFF00, A5Seg.SomeGlobalVertShrinking(a5) | always ff00 -| clr.l Object.spACT5(a4) | D2 , ;ݾɱ -| clr.l Object.spACT5+4(a4) | D2 , ;ݾɱ -| clr.l Object.spACT5+8(a4) | D2 , ;ݾɱ +| clr.l Object.spACT5(a4) | 接 D2 处, 缓冲区的用途根据具体必杀技决定 +| clr.l Object.spACT5+4(a4) | 接 D2 处, 缓冲区的用途根据具体必杀技决定 +| clr.l Object.spACT5+8(a4) | 接 D2 处, 缓冲区的用途根据具体必杀技决定 | clr.l Object.field_CE(a4) | andi.b #0xFD, A5Seg.PaletteUpdateFlag(a5) | bit0: 0: use bank Index 1; 1: use bank Index 0 | | bit1: 1, mask flush screen diff --git a/src/def.inc b/src/def.inc index 6ca2448..eaf3e95 100644 --- a/src/def.inc +++ b/src/def.inc @@ -152,7 +152,7 @@ A5Seg.PalGradTargetB = 0x64aa A5Seg.FirstObjIndexInZBuf = 0x64d2 A5Seg.pGhostBuf = 0x64d6 A5Seg.SpriteDrawHoriCoefficient = 0x64e6 -A5Seg.SpriteDrawVertCoefficient = 0x6448 +A5Seg.SpriteDrawVertCoefficient = 0x64e8 A5Seg.TempGraphLevel = 0x64ee A5Seg.TempExGraphMask = 0x64f0 A5Seg.TextOutputOffset = 0x64f6 diff --git a/src/main.s b/src/main.s index da47ae5..5963811 100644 --- a/src/main.s +++ b/src/main.s @@ -329,10 +329,10 @@ _notPassToBios: loc_9F24: bsr.w UpdateSCB2 | updeate shirnk vals - bsr.w UpdateBackgroundSCB3_4 | ֻ SCB3, SCB4 + bsr.w UpdateBackgroundSCB3_4 | 只更新 SCB3, SCB4 部分 | tst.b A5Seg.InGameHUDFlag(a5) | bit0 & bit1: draw game | | bit2: -| | bit3: 1, ɱ +| | bit3: 1, 必杀不闪屏 | | bit4: 1, disable screen scroll | | bit7: 0, show HUD (fixed layer) | bmi.s @toRet @@ -435,7 +435,7 @@ _mainloop_spinLoop: bsr.w CallObjRoutine jsr (ShowPressStartButton).l - jsr DisplayZbuf | Zbuf е obj µ VRAM + jsr DisplayZbuf | 把 Zbuf 中的 obj 逐个更新到 VRAM 中 jsr ShowCoin @@ -683,11 +683,11 @@ _PLAYER_START_end: | bit6: 1, mask palette update | bit7: 1, only update current palette bank | andi.b #0x2F, A5Seg.VideoSpecialModes(a5) | bit0: 1, not show back obj - | bit1: 1, ʾ + | bit1: 1, 显示分数排名 | bit2: 1, demo mod | bit3: 1, not show coin and difficulty | bit4: 1, role fast speed - | bit6: 1, 3 + | bit6: 1, 3倍慢速 | bit7: 1, not show background | move.w #0, A5Seg.BackDoorColor(a5) | clr.b A5Seg.field_2784(a5) @@ -712,11 +712,11 @@ _PLAYER_START_noStart: _PLAYER_START_help: | andi.b #0xF1, A5Seg.VideoSpecialModes(a5) | bit0: 1, not show back obj - | bit1: 1, ʾ + | bit1: 1, 显示分数排名 | bit2: 1, demo mod | bit3: 1, not show coin and difficulty | bit4: 1, role fast speed - | bit6: 1, 3 + | bit6: 1, 3倍慢速 | bit7: 1, not show background | clr.w A5Seg.field_6BE4(a5) move.w #0, (0x3C0006).l | clear auto animation speed @@ -728,7 +728,7 @@ _PLAYER_START_help: | andi.b #0xFD, A5Seg.PauseFlag(a5) | bit1: 1, alow pause | bit3: 1, remap P1 Key A,B,C,D | bit4: 1, remap P2 Key A,B,C,D - | bit6: 0, need update by one frame(ͣʱĵ֡ģʽ) + | bit6: 0, need update by one frame(暂停时的单帧模式) | bit7: 1, game paused | move.b #0xFF, A5Seg.field_6C33(a5)