What's new
You guys did a real badass job ! Thank you so much, on behalf of the whole NeoGeo community.

i hope my friends on NGS will do the magic for the title and for burning this into a home made PCB so we can play on real hardware.
 
You guys did a real badass job ! Thank you so much, on behalf of the whole NeoGeo community.

i hope my friends on NGS will do the magic for the title and for burning this into a home made PCB so we can play on real hardware.
+Atomikwave will test the trad files soon on his custom pcb guys. Real badass job yep, he confirms that previous original works great on it.
 
there's nothing necessary to confirm though?

there exists a rom that has a japanese story mode

it was figured out how to use the pbin file to apply the patches necessary to the prg rom of the game so that the english story is applied

the emulation used in the pc title uses tricks and the game is not complete. the only way to play story mode is to have the game in japanese so everything but the story is in japanese.

the title screens are absent as well as they are injected with similar mechanisms

this at best was a prototype rom that they half-hacked an english translation into and then use tricks to jump the game around when playing via pc. there's quite a lot of work to make this mythical samshov perfect because the game doesn't exist.
 
Here is an updated version of the translation patch. It includes the following changes
  • Enable story mode for non-japan bios's
  • Disable translation if using a japan bios
Code:
// gcc -o ss_pbin_patch ss_pbin_patch.c
// version 1.1
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>
#include <byteswap.h>

#define ENTRY_OFFSET  0x068c8
#define STORY_OFFSET  0x10a7a
#define PATCH_OFFSET  0x9ddd0
#define PBIN_OFFSET   0x9e000

char entry_code[] = {
  0x4e, 0xf9, 0x00, 0x09, 0xdd, 0xd0, 0x4e, 0x71
};

char story_code[] = {
  0x60, 0x0e
};

char patch_code[] = {
  0x48, 0xe7, 0xe0, 0xc0, 0x4a, 0x2d, 0x7d, 0x83, 0x67, 0x1e, 0x43, 0xfa, 0x02,
  0x24, 0x20, 0x19, 0x58, 0x89, 0x53, 0x40, 0x20, 0x19, 0xb1, 0xd9, 0x67, 0x06,
  0x51, 0xc8, 0xff, 0xf8, 0x60, 0x08, 0xd0, 0xbc, 0x00, 0x09, 0xe0, 0x00, 0x20,
  0x40, 0x43, 0xed, 0x18, 0x8e, 0x4e, 0xf8, 0x68, 0xd0
};

int main(int argc, char **argv) {
  FILE *pbin, *rom;
  uint32_t num_patches;
  uint32_t data32;
  uint16_t data16;
  int32_t i, j;

  if(argc < 3) {
    printf("ss_pbin_patch <pbin> <rom>\n");
    return 1;
  }

  pbin = fopen(argv[1], "r");
  if(!pbin) {
    printf("Error: unable to open %s for reading.\n", argv[1]);
    return 1;
  }

  rom = fopen(argv[2], "r+");
  if(!rom) {
    printf("Error: unable to open %s for writing.\n", argv[2]);
    return 1;
  }

  // header part of pbin needs to be 32bit swapped
  fseek(rom, PBIN_OFFSET, SEEK_SET);
  fread(&num_patches, sizeof(uint32_t), 1, pbin);
  printf("Number of patches: %d\n", num_patches);
  fseek(pbin, 0, SEEK_SET);
  for(i = 0; i < (num_patches * 2) + 2;i++) {
    fread(&data32, sizeof(data32), 1, pbin);
    data32 = bswap_32(data32);
    fwrite(&data32, sizeof(data32), 1, rom);
  }

  // data part of pbin needs to be 16bit swapped
  while(fread(&data16, sizeof(data16), 1, pbin) == 1) {
    data16 = bswap_16(data16);
    fwrite(&data16, sizeof(data16), 1, rom);
  }

  fseek(rom, ENTRY_OFFSET, SEEK_SET);
  fwrite(&entry_code, sizeof(entry_code), 1, rom);

  fseek(rom, STORY_OFFSET, SEEK_SET);
  fwrite(&story_code, sizeof(story_code), 1, rom);

  fseek(rom, PATCH_OFFSET, SEEK_SET);
  fwrite(&patch_code, sizeof(patch_code), 1, rom);

  fclose(pbin);
  fclose(rom);
}

Same method for applying as before
Code:
$ ./ss_pbin_patch SamuraiShodown5_FE.pbin samsho5_fe.cslot1_maincpu
Number of patches: 110

$ dd if=samsho5_fe.cslot1_maincpu of=272-p1d.p1 conv=swab
16384+0 records in
16384+0 records out
8388608 bytes (8.4 MB, 8.0 MiB) copied, 0.0472177 s, 178 MB/s


$ md5sum 272-p1d.p1
9ff420915a1c9b0a4e2cc425e0769c0e  272-p1d.p1

Updated asm code for people that want to see it
Code:
; vasmm68k_mot -Fbin -m68000 -spaces -L ss_patch.asm.txt -chklabels -o ss_patch.bin ss_patch.asm
ENTRY_OFFSET            equ $68c8
STORY_ENTRY_OFFSET      equ $10a7a
STORY_EXIT_OFFSET       equ $10a8a
PATCH_OFFSET            equ $9ddd0
PBIN_OFFSET             equ $9e000      ; location pbin was written in p rom


        ; char entry_code[] = {} in c code
        org ENTRY_OFFSET

        jmp     patch_code
        nop
return_point:


        ; skip over code that would only enable story mode for japan bios
        ; char story_code[] = {} in c code
        org STORY_ENTRY_OFFSET
                bra     enable_story
        org STORY_EXIT_OFFSET
enable_story:


        ; a0 = string address we might want to override
        ; d0,d1,a1 is free to use
        ; char patch_code[] = {} in c code
        org PATCH_OFFSET

patch_code:
        movem.l d0-d2/a0-a1, -(a7)      ; instruction we overwrote for our jmp

        tst.b   ($7d83,A5)              ; 0x10FD83 (region) 0 = japan
        beq     .do_exit                ; skip patch if japan bios

        lea     PBIN_OFFSET, a1
        move.l  (a1)+, d0               ; number of entries
        addq.l  #4, a1                  ; skip 0x000000
        subq    #$1, d0

        ; struct {
        ;   long pbin_offset;           ; offset of override string within pbin file
        ;   long string_address         ; string we would want to override
        ; }
.loop_next_entry:
        move.l  (a1)+, d0               ; pbin_offset
        cmpa.l  (a1)+, a0               ; string_address
        beq     .found_match
        dbra    d0, .loop_next_entry
        bra     .do_exit

.found_match:
        add.l   #PBIN_OFFSET, d0        ; adjust target address based on where pbin is in the rom
        movea.l d0, a0

.do_exit:
        lea     ($188e,a5), a1          ; another instruction we overwrote from our jmp
        jmp     return_point
 
Our friends are NeoGeo-System have finished the artwork project.

We now have thanks to so many people but specially ACK, elrayzeur, a complete version of Samurai Shodown V Perfect.

I still don't have the AES Multi but already ordered one, in the meantime here's a picture of it running on Mister:

final-result.jpg
 
Wow. This is Awesome! Much respect to everyone involved with abilities that I wish I possessed. I selfishly hope sometime in the future, someone can create an Perfect "Perfect" version that restores the original Gore that was removed from Special.
 
Wow. This is Awesome! Much respect to everyone involved with abilities that I wish I possessed. I selfishly hope sometime in the future, someone can create an Perfect "Perfect" version that restores the original Gore that was removed from Special.
My memory could be wrong but I believe in the interview present on the collection or some other interview the director said the fatalities were restored but I'm not 100% sure.
 
My memory could be wrong but I believe in the interview present on the collection or some other interview the director said the fatalities were restored but I'm not 100% sure.
It's actually the other way. They said that they removed the dismemberment sprites/animations to make room for the Story assets. From what it appears to me, seems like they used Special's 2nd "less censored" AES release as it's base, as all the Overkills seems to match up with FE/Perfect, at least from the ones I've seen. I can't help but to feel the loss aversion after playing Special for so long. The "Story", while nice if not lackluster, just doesn't matter as much as seeing someone get split at the end of an intense PvP. The balance changes are minor (still waiting for an change list), and it was made for players back in 2005 which at this point everyone has moved beyond that after 15 years of Special. I do however appreciate that this lost Rom is finally available for everyone, as well has the hard work everyone has done to port the English text into something that original hardware can run.
 
My memory could be wrong but I believe in the interview present on the collection or some other interview the director said the fatalities were restored but I'm not 100% sure.
It's actually the other way. They said that they removed the dismemberment sprites/animations to make room for the Story assets. From what it appears to me, seems like they used Special's 2nd "less censored" AES release as it's base, as all the Overkills seems to match up with FE/Perfect, at least from the ones I've seen. I can't help but to feel the loss aversion after playing Special for so long. The "Story", while nice if not lackluster, just doesn't matter as much as seeing someone get split at the end of an intense PvP. The balance changes are minor (still waiting for an change list), and it was made for players back in 2005 which at this point everyone has moved beyond that after 15 years of Special. I do however appreciate that this lost Rom is finally available for everyone, as well has the hard work everyone has done to port the English text into something that original hardware can run.
What happens if you turn the cheats on for fatalities in the unibios using the new rom?

Also.. I know fatalities are half circle C+D or something like that.. but you need so much stuff to trigger it that I never managed.

You need to be low on health below some point.. activate rage mode that I don't remember how to perform and that bullet time stuff LoL.
If you know how to do it, feel free to explain and I'll try to test it here with the unibios.
 
you can actually perform that fatals in practice mode (set it in aes, then overkill on practice settings). Unibios doesnt recognize the recent English patch, so no cheats for it. I did have the earlier proto English patch (had to set it to japanese) so I guess I could try that when I get home. But I'm sure it going to be the same as when I use the special 2nd release, where the original fatals aren't restored even with cheats on.
 
I'm wondering what might be best.
The guys on the french forum changed the number of the game from 272 to 273 to avoid save games being overwrite.

So, should we wait for a new unibios version or should this be reverted back to 272 and this way unibios sees it as samsho5 special?
 
Yes it’s unlikely that Razoola will release a new unibios in the future.
in his final statement, he said that 4.0 is the final ever release
 
I paste here a post from Elrayzeur from NeoGeo-System.

beginning of quote———-
here is the final version of the rom.

——-Removed link——- edit YaYaLanD

The name is samsh5pf and not samsh5fe anymore.
p1/s1/c7/c8/ are different from the two sets.

Translation Patch. A huge thank you to everyone involved @ack, @fandangos (please add any other credit)
Modified palette, intro logo animation replaced by the word Perfect and new mini logo in game by @elrayzeur .
ngh number is 0273 so it won’t overwrite saves from special 0272.

The DAT

System: Neo
RomName: samsh5pf
Game: Samurai Shodown V Perfect
[Program]
273-p1.p1,0,800000,127EA408,0
[Text]
273-s1.s1,0,20000,ABB3BAF9,0
[Z80]
273-m1.m1,0,20000,654E9236,0
[Samples]
273-v1.v1,0,800000,3BF61586,0
273-v2.v2,800000,800000,95FE7646,0
[Graphics]
273-c1.c1,0,800000,EC9FDA8D,0
273-c2.c2,1,800000,D2FC888D,0
273-c3.c3,1000000,800000,B0EA781B,0
273-c4.c4,1000001,800000,D34AC591,0
273-c5.c5,2000000,800000,1B5C1EA2,0
273-c6.c6,2000001,800000,DEEAAD58,0
273-c7.c7,3000000,800000,AF90AFC8,0
273-c8.c8,3000001,800000,BA1F426A,0
[System]
CartridgeID: 273
GfxCrypt: 0
GfxKey: 0
ButLayout: 9
Fix: 0


end of quote——


You guys are amazing! Thank you very much for all the hard work !
 
Last edited:
Here is an updated version of the translation patch. It includes the following changes
  • Enable story mode for non-japan bios's
  • Disable translation if using a japan bios
Code:
// gcc -o ss_pbin_patch ss_pbin_patch.c
// version 1.1
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>
#include <byteswap.h>

#define ENTRY_OFFSET  0x068c8
#define STORY_OFFSET  0x10a7a
#define PATCH_OFFSET  0x9ddd0
#define PBIN_OFFSET   0x9e000

char entry_code[] = {
  0x4e, 0xf9, 0x00, 0x09, 0xdd, 0xd0, 0x4e, 0x71
};

char story_code[] = {
  0x60, 0x0e
};

char patch_code[] = {
  0x48, 0xe7, 0xe0, 0xc0, 0x4a, 0x2d, 0x7d, 0x83, 0x67, 0x1e, 0x43, 0xfa, 0x02,
  0x24, 0x20, 0x19, 0x58, 0x89, 0x53, 0x40, 0x20, 0x19, 0xb1, 0xd9, 0x67, 0x06,
  0x51, 0xc8, 0xff, 0xf8, 0x60, 0x08, 0xd0, 0xbc, 0x00, 0x09, 0xe0, 0x00, 0x20,
  0x40, 0x43, 0xed, 0x18, 0x8e, 0x4e, 0xf8, 0x68, 0xd0
};

int main(int argc, char **argv) {
  FILE *pbin, *rom;
  uint32_t num_patches;
  uint32_t data32;
  uint16_t data16;
  int32_t i, j;

  if(argc < 3) {
    printf("ss_pbin_patch <pbin> <rom>\n");
    return 1;
  }

  pbin = fopen(argv[1], "r");
  if(!pbin) {
    printf("Error: unable to open %s for reading.\n", argv[1]);
    return 1;
  }

  rom = fopen(argv[2], "r+");
  if(!rom) {
    printf("Error: unable to open %s for writing.\n", argv[2]);
    return 1;
  }

  // header part of pbin needs to be 32bit swapped
  fseek(rom, PBIN_OFFSET, SEEK_SET);
  fread(&num_patches, sizeof(uint32_t), 1, pbin);
  printf("Number of patches: %d\n", num_patches);
  fseek(pbin, 0, SEEK_SET);
  for(i = 0; i < (num_patches * 2) + 2;i++) {
    fread(&data32, sizeof(data32), 1, pbin);
    data32 = bswap_32(data32);
    fwrite(&data32, sizeof(data32), 1, rom);
  }

  // data part of pbin needs to be 16bit swapped
  while(fread(&data16, sizeof(data16), 1, pbin) == 1) {
    data16 = bswap_16(data16);
    fwrite(&data16, sizeof(data16), 1, rom);
  }

  fseek(rom, ENTRY_OFFSET, SEEK_SET);
  fwrite(&entry_code, sizeof(entry_code), 1, rom);

  fseek(rom, STORY_OFFSET, SEEK_SET);
  fwrite(&story_code, sizeof(story_code), 1, rom);

  fseek(rom, PATCH_OFFSET, SEEK_SET);
  fwrite(&patch_code, sizeof(patch_code), 1, rom);

  fclose(pbin);
  fclose(rom);
}
Same method for applying as before
Code:
$ ./ss_pbin_patch SamuraiShodown5_FE.pbin samsho5_fe.cslot1_maincpu
Number of patches: 110

$ dd if=samsho5_fe.cslot1_maincpu of=272-p1d.p1 conv=swab
16384+0 records in
16384+0 records out
8388608 bytes (8.4 MB, 8.0 MiB) copied, 0.0472177 s, 178 MB/s


$ md5sum 272-p1d.p1
9ff420915a1c9b0a4e2cc425e0769c0e  272-p1d.p1
Updated asm code for people that want to see it
Code:
; vasmm68k_mot -Fbin -m68000 -spaces -L ss_patch.asm.txt -chklabels -o ss_patch.bin ss_patch.asm
ENTRY_OFFSET            equ $68c8
STORY_ENTRY_OFFSET      equ $10a7a
STORY_EXIT_OFFSET       equ $10a8a
PATCH_OFFSET            equ $9ddd0
PBIN_OFFSET             equ $9e000      ; location pbin was written in p rom


        ; char entry_code[] = {} in c code
        org ENTRY_OFFSET

        jmp     patch_code
        nop
return_point:


        ; skip over code that would only enable story mode for japan bios
        ; char story_code[] = {} in c code
        org STORY_ENTRY_OFFSET
                bra     enable_story
        org STORY_EXIT_OFFSET
enable_story:


        ; a0 = string address we might want to override
        ; d0,d1,a1 is free to use
        ; char patch_code[] = {} in c code
        org PATCH_OFFSET

patch_code:
        movem.l d0-d2/a0-a1, -(a7)      ; instruction we overwrote for our jmp

        tst.b   ($7d83,A5)              ; 0x10FD83 (region) 0 = japan
        beq     .do_exit                ; skip patch if japan bios

        lea     PBIN_OFFSET, a1
        move.l  (a1)+, d0               ; number of entries
        addq.l  #4, a1                  ; skip 0x000000
        subq    #$1, d0

        ; struct {
        ;   long pbin_offset;           ; offset of override string within pbin file
        ;   long string_address         ; string we would want to override
        ; }
.loop_next_entry:
        move.l  (a1)+, d0               ; pbin_offset
        cmpa.l  (a1)+, a0               ; string_address
        beq     .found_match
        dbra    d0, .loop_next_entry
        bra     .do_exit

.found_match:
        add.l   #PBIN_OFFSET, d0        ; adjust target address based on where pbin is in the rom
        movea.l d0, a0

.do_exit:
        lea     ($188e,a5), a1          ; another instruction we overwrote from our jmp
        jmp     return_point
Fantastic work.

I got 8 MB P1 rom CRC32 70DE1BF5 after following what you have written, matching your MD5 9ff420915a1c9b0a4e2cc425e0769c0e 8 MB P1.

I have made an ips patch to apply to 8MB P1 CRC32 8856D0AF (simply byteswapped samsho5_fe.cslot1_maincpu) to get 8 MB P1 CRC32 70DE1BF5 :
 

Attachments

  • samsh5fe_ips_patch.zip
    63 KB · Views: 429
Last edited:
Back
Top