Editor, Expert player (2330)
Joined: 5/15/2007
Posts: 3933
Location: Germany
No, I didn't know there were separate dtms
RachelB
She/Her
Player (129)
Joined: 12/3/2011
Posts: 1579
Sorry, you're out of luck then. The movie isn't saved in the save state, it's a separate file.
RachelB
She/Her
Player (129)
Joined: 12/3/2011
Posts: 1579
https://dl.dropbox.com/u/11111638/save-settings-to-dtm.zip (patches only, no builds yet). Saves settings for dual core, idle skipping, dsp, progressive scan, and fast disc access to the .dtm, and loads them when playing it back. I still need to figure out how to get some of the other settings, but it's a start.
Editor, Experienced player (570)
Joined: 11/8/2010
Posts: 4036
So we can TAS with dual core mode on now? That's pretty useful.
RachelB
She/Her
Player (129)
Joined: 12/3/2011
Posts: 1579
CoolKirby wrote:
So we can TAS with dual core mode on now? That's pretty useful.
Well you can, but it might still cause desyncs. All i'm doing is saving settings that were used to record a movie, then loading them when playing it back. If they caused problems before, they still will. The idea here is to prevent the guessing games of what settings were used when trying to play back someone else's movie file (or your own, if you changed some settings and forgot to change them back). For now, the only setting that is saved which should ever be different is progressive scan. All the others should always be off, but i saved them anyway, just in case someone records a movie with them on.
RachelB
She/Her
Player (129)
Joined: 12/3/2011
Posts: 1579
https://dl.dropbox.com/u/11111638/Dolphin%20dtm-config%20x64.exe https://dl.dropbox.com/u/11111638/Dolphin%20dtm-config%20x86.exe patches - https://dl.dropbox.com/u/11111638/0001-save-settings-necessary-for-syncing-a-movie-to-the-..patch edit: don't use the above builds. Use the latest official build instead. Header format is here. Graphics settings are all set every frame when playing back. Manually enabling/disabling efb copies during play back can sometimes cause crashes, at the moment. I'm not sure why you'd ever do that, but if you do, and it crashes, i'm aware. If any other setting causes crashes, do let me know. There is no way to prevent it from forcing the settings changes, except by editing the .dtm. You can either set the specific setting to the value you want, or set 0x89 to 0, and it won't load any settings at all, if you need to use different settings than were used to record it, for whatever reason. Your active graphics settings are rechecked each time a .dtm is saved, and will overwrite the values in the .dtm if you have changed them. The other settings are NOT overwritten if you change them...should they be? All of them will prevent sync if you change them, and cannot even be changed while a game is running (the only time this would matter is if you start a game without a movie, then load one later), so i think this behavior is fine as is, but if anyone disagrees, please say so. If you load an old dtm, then save it, it will save your graphics settings, but not the others (which will then make it impossible to playback). I'll fix that later. In the mean time, you can start a new recording, load a save state from your other movie, and it will then save correctly. fixed Let me know if you have any issues with it, whether it's crashes, or my broken logic is doing retarded shit.
RachelB
She/Her
Player (129)
Joined: 12/3/2011
Posts: 1579
Editor, Experienced player (570)
Joined: 11/8/2010
Posts: 4036
I love news about Dolphin! Good to hear that issue's fixed.
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Will these fixes ever be implemented to the main branch? Or has it already been done?
RachelB
She/Her
Player (129)
Joined: 12/3/2011
Posts: 1579
They will be soon.
RachelB
She/Her
Player (129)
Joined: 12/3/2011
Posts: 1579
I've got undo load state and load last overwritten state working. While i'm at it, is there any other simple tas related features that are broken or missing?
RachelB
She/Her
Player (129)
Joined: 12/3/2011
Posts: 1579
Who said dolphin was a pain to tas with? We can now save a memory card to a separate location when playing back a movie, and delete it if it already exists. No more manually deleting it each time you want to play back a movie.
Editor, Experienced player (570)
Joined: 11/8/2010
Posts: 4036
Great job, rog. That should save everyone a lot of headache.
Emulator Coder, Skilled player (1113)
Joined: 5/1/2010
Posts: 1217
Now if mainline could dump with proper timings...
RachelB
She/Her
Player (129)
Joined: 12/3/2011
Posts: 1579
Ilari wrote:
Now if mainline could dump with proper timings...
hahahahah. Oh, you were serious?
Active player (322)
Joined: 1/15/2012
Posts: 343
I suppose that a RAM watch would take forever to be made ? (I don't know anything about it actually, is anybody working on it ?)
RachelB
She/Her
Player (129)
Joined: 12/3/2011
Posts: 1579
Probably. Cheat engine works just fine anyway. I got commit access for dolphin, so i'll start committing my stuff tomorrow. everything i've done is committed. Also, in regards to the memory card stuff, 0x98 of the header sets whether it should be used. Currently it only checks whether a memory card file exists, and if it does, it assumes the movie is not supposed to start from a blank memory card. So if you start recording with a memory card file but no save data, you'll need to hex that byte. Maybe i'll eventually figure out how to check if save data for the game is actually on the memory card, but probably not.
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
rog wrote:
I've got undo load state and load last overwritten state working. While i'm at it, is there any other simple tas related features that are broken or missing?
Just curious, is disc switching (even) supported? Resident Evil 4 (GCN) is a game that comes to mind that needs this feature.
RachelB
She/Her
Player (129)
Joined: 12/3/2011
Posts: 1579
No, it's not. I'm not sure i'll be able to do that though. edit: On second thought, maybe i can. I'll look into it.
Emulator Coder, Skilled player (1113)
Joined: 5/1/2010
Posts: 1217
rog wrote:
Ilari wrote:
Now if mainline could dump with proper timings...
Oh, you were serious?
Yeah, either properly A/V synced dump (multisegment on framerate changes) or at least dump information needed to fix A/V sync.[1] [1] The information needed: - Timestamp for each frame. - Timestamp for each sound DMA block. - Rate (32kHz or 48kHz) for each sound DMA block.
Joined: 7/16/2006
Posts: 635
Cheat engine works, but I wouldn't say it works fine. For starters, it can't even search for float values. Meanwhile, debug mode already has a RAM watch, but it doesn't update them in real time. How easy would these be to change?
RachelB
She/Her
Player (129)
Joined: 12/3/2011
Posts: 1579
petrie911 wrote:
Cheat engine works, but I wouldn't say it works fine. For starters, it can't even search for float values. Meanwhile, debug mode already has a RAM watch, but it doesn't update them in real time. How easy would these be to change?
Yes you can, just add a big endian float data type. I don't know how difficult it would be to fix, but CE really does work just fine. I'd need a lot of convincing to even consider looking at it, and even if i did, i can't promise i'd even be able to make it work properly.
Former player
Joined: 5/4/2005
Posts: 502
Location: Onett, Eagleland
Rog is correct, you need to search for values in big endian format since the Wii CPU is powerPC (big endian). You can create a custom data type that does this for you. I posted this a while back. 2 Byte Big Endian:

alloc(TypeName,256)
alloc(ByteSize,4)
alloc(ConvertRoutine,1024)
alloc(ConvertBackRoutine,1024)

TypeName:
db '2 Byte Big Endian',0

ByteSize:
dd 2

//The convert routine should hold a routine that converts the data to an integer (in eax)
//function declared as: stdcall int ConvertRoutine(unsigned char *input);
//Note: Keep in mind that this routine can be called by multiple threads at the same time.
ConvertRoutine:
//jmp dllname.functionname
[64-bit]
//or manual:
//parameters: (64-bit)
//rcx=address of input
xor eax,eax
mov ax,[rcx] //eax now contains the bytes 'input' pointed to
xchg ah,al //convert to big endian

ret
[/64-bit]

[32-bit]
//jmp dllname.functionname
//or manual:
//parameters: (32-bit)
push ebp
mov ebp,esp
//[ebp+8]=input
//example:
mov eax,[ebp+8] //place the address that contains the bytes into eax
mov ax,[eax] //place the bytes into eax so it's handled as a normal 4 byte value
and eax,ffff //cleanup
xchg ah,al //convert to big endian

pop ebp
ret 4
[/32-bit]

//The convert back routine should hold a routine that converts the given integer back to a row of bytes (e.g when the user wats to write a new value)
//function declared as: stdcall void ConvertBackRoutine(int i, unsigned char *output);
ConvertBackRoutine:
//jmp dllname.functionname
//or manual:
[64-bit]
//parameters: (64-bit)
//ecx=input
//rdx=address of output
//example:
xchg ch,cl //convert the little endian input into a big endian input
mov [rdx],cx //place the integer the 4 bytes pointed to by rdx

ret
[/64-bit]

[32-bit]
//parameters: (32-bit)
push ebp
mov ebp,esp
//[ebp+8]=input
//[ebp+c]=address of output
//example:
push eax
push ebx
mov eax,[ebp+8] //load the value into eax
mov ebx,[ebp+c] //load the address into ebx

//convert the value to big endian
xchg ah,al

mov [ebx],ax //write the value into the address
pop ebx
pop eax

pop ebp
ret 8
[/32-bit] 

4 Byte Big Endian:
alloc(TypeName,256)
alloc(ByteSize,4)
alloc(ConvertRoutine,1024)
alloc(ConvertBackRoutine,1024)

TypeName:
db '4 Byte Big Endian',0

ByteSize:
dd 4

//The convert routine should hold a routine that converts the data to an integer (in eax)
//function declared as: stdcall int ConvertRoutine(unsigned char *input);
//Note: Keep in mind that this routine can be called by multiple threads at the same time.
ConvertRoutine:
//jmp dllname.functionname
[64-bit]
//or manual:
//parameters: (64-bit)
//rcx=address of input
xor eax,eax
mov eax,[rcx] //eax now contains the bytes 'input' pointed to
bswap eax //convert to big endian

ret
[/64-bit]

[32-bit]
//jmp dllname.functionname
//or manual:
//parameters: (32-bit)
push ebp
mov ebp,esp
//[ebp+8]=input
//example:
mov eax,[ebp+8] //place the address that contains the bytes into eax
mov eax,[eax] //place the bytes into eax so it's handled as a normal 4 byte value

bswap eax

pop ebp
ret 4
[/32-bit]

//The convert back routine should hold a routine that converts the given integer back to a row of bytes (e.g when the user wats to write a new value)
//function declared as: stdcall void ConvertBackRoutine(int i, unsigned char *output);
ConvertBackRoutine:
//jmp dllname.functionname
//or manual:
[64-bit]
//parameters: (64-bit)
//ecx=input
//rdx=address of output
//example:
bswap ecx //convert the little endian input into a big endian input
mov [rdx],ecx //place the integer the 4 bytes pointed to by rdx

ret
[/64-bit]

[32-bit]
//parameters: (32-bit)
push ebp
mov ebp,esp
//[ebp+8]=input
//[ebp+c]=address of output
//example:
push eax
push ebx
mov eax,[ebp+8] //load the value into eax
mov ebx,[ebp+c] //load the address into ebx

//convert the value to big endian
bswap eax

mov [ebx],eax //write the value into the address
pop ebx
pop eax

pop ebp
ret 8
[/32-bit]
I think.....therefore I am not Barry Burton
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Pasky13 wrote:
Rog is correct, you need to search for values in big endian format since the Wii CPU is powerPC (big endian). You can create a custom data type that does this for you. I posted this a while back. 2 Byte Big Endian: CODE
Thanks, but what exactly do I do with it? Sorry if this is a dumb question.
Former player
Joined: 5/4/2005
Posts: 502
Location: Onett, Eagleland
In Cheat Engine 6.2 right click the value type drop down. Select "Define new custom type (Auto Assembler)" Paste the code in there. Preess ok, it should show up in the drop down box now. You can also re-write that in lua. I made that before CE had lua support.
I think.....therefore I am not Barry Burton