Discussion in 'Engineering & Reverse Engineering' started by Tweaker, May 29, 2008.

1. ### Sik

Sik is pronounced as "seek", not as "sick". Tech Member
6,718
1
0
being an asshole =P
SMI = Set if minus
SNE = Set if Not Equal

These instructions set the contents of a register to all 1s if the condition is met. Also works with practically any condition branches support too (for always setting, use ST, which is Set if True).

I don't remember exactly how it worked but it's something used by compilers so you don't want to mess with it...

2. ### shobiz

Tech Member
PEA just pushes an effective address onto the stack. And a couple of other things to note about the Scc instructions is that they're always byte-sized, and they set the target address to false (all 0s) in case the condition isn't met (and set it to true (all 1s) if it is met, as Sik said above).

3. ### Selbi

The Euphonic Mess Member
1,503
58
28
Northern Germany
Sonic ERaZor
So it works basically like this?
Code (ASM):
1.         moveq   #5,d0       ; set d0 to \$5
2.         cmpi.b  #6,d0       ; is d0 \$6?
3.         sne d0      ; if not, set d0 to \$0
4.         cmpi.b  #0,d0       ; is d0 \$0?
5.         seq d0      ; if yes, set d0 to \$1
(Ignore the stupidity in this code, it's just so I can understand it better.)

4. ### shobiz

Tech Member
It sets d0 to \$FF, not 1 (by all 1s I was referring to the individual bits). Basically, to give another example:
Code (ASM):
1.     cmp.b   #3,d5   ; is d5 3?
2.     seq d1  ; if it is, the lowest byte of d1 becomes \$FF, otherwise it becomes \$0
3.     cmp.w   #10,(\$FFFFFE20).w
4.     scc d2  ;   ; if Sonic has >= 10 rings the lowest byte of d2 becomes \$FF, otherwise it becomes 0
5.     st  (\$FFFFFFB0).w   ; always set a random address, same as move.b #\$FF,(\$FFFFFFB0).w
6.     sf  (\$FFFFFFB1).w   ; always clear a random address, same as clr.b (\$FFFFFFB1).w

5. ### Hanoch

Also known as TheKnock, Birashot Member
491
0
0
Israel
everything
If I remember correctly it always sets to \$FF

6. ### Selbi

The Euphonic Mess Member
1,503
58
28
Northern Germany
Sonic ERaZor
Ah got it (I wasn't sure about that 1s being bytes or bits).

Just one last question:
Is there any technical difference when using those commands, like it's faster, takes less space, etc?

7. ### shobiz

Tech Member
There's no speed difference as long as the operand isn't a data register, but st X takes up two bytes less than move.b #\$FF,X. sf X and clr.b X take up the same amount of space, which is two bytes less than move.b #0,X.

8. ### Irixion

Member
So, I'm porting Knuckles into a clean S2 Rom as an extra character, and I'm having a few troubles along the way:

First of all, If I am standing on an object (such as a bridge) and I jump, and land on it, I sink 4 pixels into the floor.

Second is gliding into a spring—the glide continues instead of getting canceled out as they're supposed to.

Lastly, If I glide and then land on an object, instead of landing into a walk like in S2K/S3K, the falling stays for a bit, and then I am standing on the object.

These are all flags not getting cleared I believe, but I cannot for the life in me find anything to fix these. Can anyone help? Thanks in advance

Anything to do with loc_3F976? I'm at a loss

9. ### Selbi

The Euphonic Mess Member
1,503
58
28
Northern Germany
Sonic ERaZor
I doubt that, but I can tell you, the flag when the player is on an object, but shouldn't fall (when he's standing on something like a bridge) is bit 3 in \$22(aX). The absolute RAM address to player one is \$FFFFB022.
I would try to find the correct locations and use one of these 2 lines:
Code (ASM):
1.     bset    #3,(\$FFFFB022).w    ; set standing on object flag
2.     bclr    #3,(\$FFFFB022).w    ; clear standing on object flag

10. ### Irixion

Member
Sonic's object doesn't set the on object flag, except in a few areas. For anyone who's ported knuckles—Shobiz, Rika, SOTI, how did you get around this?

11. ### shobiz

Tech Member
I've never ported Knuckles actually, but the spring problem should just be a matter of locating the part inside the spring's code which sets the player's flags and adding a clr.b \$21(a1) and clr.b \$1F(a1) there as well (assuming it keeps the player object in a1). No idea about the other problems though.

12. ### Vinchenz

Yo! Hustle! Hustle! Member
Anyone know where to edit the level... err, vector? In Sonic 1. I'm not sure what they would be called in ASM...

But anyway, I want to change it so that the levels are two acts instead of three and I also want to add two extra zones. Where in the code can I do this? (There's probably multiple places where I have to chance it, though...)

13. ### Selbi

The Euphonic Mess Member
1,503
58
28
Northern Germany
Sonic ERaZor
You can edit the Level Order (misc\lvl_ord.bin). The format is a little hard to understand, but it goes basically like this (converted into ASM, but you should also get the point in a hex editor):
Code (ASM):
1.         dc.w    \$0001, \$0002    ; 1. GHZ 2 and 3 (1 is being loaded by default)
2.         dc.w    \$0200, \$0000    ; 1. Go to MZ and play its first level
3.         dc.w    \$0101, \$0102    ; 4. LZ 2 and 3
4.         dc.w    \$0300, \$0502    ; 4. Go to SLZ and play its first level (also, set up FZ, somehow...)
5.         dc.w    \$0201, \$0202    ; 2. MZ 2 and 3
6.         dc.w    \$0400, \$0000    ; 2. Go to SYZ and play its first level
7.         dc.w    \$0301, \$0302    ; 5. SLZ 2 and 3
8.         dc.w    \$0500, \$0000    ; 5. Go to SBZ and play its first level
9.         dc.w    \$0401, \$0402    ; 3. SYZ 2 and 3
10.         dc.w    \$0100, \$0000    ; 3. Go to LZ and play its first level
11.         dc.w    \$0501, \$0103    ; 6. SBZ 2 and LZ 4 (SBZ 3)
12.         dc.w    \$0000, \$0000    ; 6. either null or play LZ, dunno...
For the new zones, you can at least add one with this: http://info.sonicretro.org/SCHG_How-to:Add...zone_in_Sonic_1

14. ### MainMemory

Kate the Wolf Tech Member
4,758
341
63
SonLVL
Since asking #techies has been unhelpful, I'll have to ask here: Does anybody know where the the part of the Wing Fortress Zone cutscene that pushes the A button is? Right now he boosts off the platform and dies, so I need to change it to press the C button. fixed.

15. ### GT Koopa

Member
2,023
18
18
Elgin, IL
Flicky Turncoat DX, T.L.W.S. Vs M.G.W.
I didn't want to go public with this, but I have a problem.

I asked MarkeyJester on this, but he couldn't find anything wrong with the code.

We ruled out that it is a ram location problem (he suggested trying FFF7)

That is a problem with my coding, I get the right idea of what to do and it seems plausible but doesn't work most of the time, thanks to some slight error that I overlooked. Fixing that slight error makes the cogs go, so to speak. I believe it is the same problem here.

16. ### Selbi

The Euphonic Mess Member
1,503
58
28
Northern Germany
Sonic ERaZor
May I ask again what you really wanted? You want a monitor, that gives the player an emerald when he finishes a level? You didn't want the emerald to be added just when the monitor got opened? You can do this:
Code (ASM):
1. Obj2E_ChkEggman:
2.         cmpi.b  #1,d0           ; does monitor contain Eggman (or emerald in this case)?
3.         bne.s   Obj2E_ChkSonic      ; if not, branch
4.         move.b  #\$A4,d0         ; set sound \$A4 by default
5.         tst.b   (\$FFFFFF90).w       ; was flag already set?
6.         bne.s   Obj2E_PlaySnd_Emerald   ; if yes, branch
8.         move.b  #\$BF,d0         ; play sound \$BF instead
9.         move.b  #1,(\$FFFFFF90).w    ; make sure this code doesn't get used again
10.
11. Obj2E_PlaySnd_Emerald:
12.         jmp PlaySound       ; play whatever sound is in d0
Just clear \$FFFFFF90 when the next level starts (Obj3A_NextLevel).

17. ### E-122-Psi

Member
2,471
612
93
Sorry if this is a dumb question (I've only edited Sonic 1 before) is there coding in the Sonic 2 dissassembly to edit the animations similar to S1's anim folder?

18. ### Selbi

The Euphonic Mess Member
1,503
58
28
Northern Germany
Sonic ERaZor
There is, it's just not splitted into seperate files, but right in s2.asm. Sonic's animation script is for example at SonicAniData.

19. ### GT Koopa

Member
2,023
18
18
Elgin, IL
Flicky Turncoat DX, T.L.W.S. Vs M.G.W.
I did a hybrid of your code and mine and it works! Thank you.

Code (Text):
1. Obj2E_ChkEggman:    ; XREF: Obj2E_Move
3.         move.w    #29,\$1E(a0)
4.         move.b    \$1C(a0),d0
5.         cmpi.b    #1,d0; does monitor contain Eggman?
6.         bne.s    Obj2E_ChkSonic
7.         cmpi.w    #50,(\$FFFFFE20).w; do you have    at least 50 rings?
8.         bcc.s    Obj2E_Emerald; if yes, branch
9.         move.b    #\$A4,(\$FFFFF00A).w
10.         rts    ; Eggman monitor does nothing
11.
12. Obj2E_Emerald:
13.         move.b    #\$A4,d0    ; set sound \$A4 by default
14.         tst.b    (\$FFFFFF90).w; was flag already set?
15.         bne.s    Obj2E_PlaySnd_Emerald; if yes, branch
17.         move.b    #\$BF,d0    ; play sound \$BF instead
18.         move.b    #1,(\$FFFFFF90).w; make sure this code doesn't get used again
19.
20.         Obj2E_PlaySnd_Emerald:
21.         jmp    PlaySound; play whatever sound is in d0
Code (Text):
1. Obj3A_NextLevel:    ; XREF: Obj3A_Index
2.         clr.b    (\$FFFFFF90).w; emerald clear
3.         move.b    (\$FFFFFE10).w,d0
4.         andi.w    #7,d0
5.         lsl.w    #3,d0
6.         move.b    (\$FFFFFE11).w,d1
7.         andi.w    #3,d1
10.         move.w    LevelOrder(pc,d0.w),d0; load level from level order array
11.         move.w    d0,(\$FFFFFE10).w; set level number
12.         tst.w    d0
13.         bne.s    Obj3A_ChkSS
14.         move.b    #0,(\$FFFFF600).w; set game mode to level (00)
15. ;fish
16.
17.
18.         bra.s    Obj3A_Display2

20. ### Vinchenz

Yo! Hustle! Hustle! Member
Ehh... thanks for trying to help, but this is too much of a hassle for me after all. I think I'll just stick to creating engines from scratch, ones that I can read. :/