Help with modifying ProYakyuu and ProYakyuu 87 games.

Started by ProfessorW, 09/12/25, 11:08:11 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

NoroNoro

#20
I also use patches from this person (Mayutch) to edit and play with Famista '93. I haven't really worked with the first Famista.

I think 2PTime.ips should work as well. (However, since it's the type of patch that writes a subroutine into a free area, it may break if another patch overlaps that area. In that case, you just need to relocate the address.)

About enabling "Time Call" with the second controller

1. Find the routine that checks controller 1's input address $0B for the value #$10 (Start button), and identify the time-call check
2. Turn that time-call check into a new subroutine and branch to it
3. In the new subroutine, reuse the controller 1 check, and also check controller 2's $0C. If either is pressed, jump to the original time-call routine and then return

First Famista
=============
(before)
A5 0B          LDA $0B
29 10          AND #$10
D0 06          BNE $AAF6
--------
(after)
20 78 EF       JSR $EF78  ; jump to a free area (address is up to you)
EA             NOP
EA             NOP
EA             NOP
(new) subroutine (place it at $EF78 or any free area you prefer)
$EF78:
A5 0B          LDA $0B
29 10          AND #$10
D0 07          BNE $EF85
A5 0C          LDA $0C
29 10          AND #$10
D0 01          BNE $EF85
60             RTS
$EF85:
4C F6 AA       JMP $AAF6

->I have updated the code.

-------------------------------------------------------------------------------
私もこの方(Mayutchさん)のパッチを利用させてもらってファミスタ'93を編集して遊んでいます。私は初代ファミスタは使ったことがありません。

2PTime.ipsも動作すると思いますよ。(ただし、空きエリアにサブルーチンを書いているタイプのパッチなので、他のパッチとエリアが被ると壊れる可能性があります。その場合はアドレスを変えてあげれば大丈夫です。)

2コントローラーでの「タイムコール」について

1) 1コントローラの入力アドレスの$0Bの値#$10(スタートボタン)を確認する処理を探し、タイムコール判定を見つける
2) 判明したタイムコール判定を新しくサブルーチン化し、そこにジャンプさせる
3) サブルーチンでは1コントローラーの判定を移植し、2コントローラーの$0Cでも判定し、今までどおりタイムコールサブルーチンへジャンプさせ、サブルーチンから抜ける

初代ファミスタ
==============
(before)
A5 0B          LDA $0B
29 10          AND #$10
D0 06          BNE $AAF6
--------
(after)
20 78 EF       JSR $EF78  ; 空きエリアにジャンプ(アドレスはお好みで)
EA             NOP
EA             NOP
EA             NOP
(new) サブルーチン($EF78 または任意の空きエリアに配置)
$EF78:
A5 0B          LDA $0B
29 10          AND #$10
D0 07          BNE $EF85
A5 0C          LDA $0C
29 10          AND #$10
D0 01          BNE $EF85
60             RTS
$EF85:
4C F6 AA       JMP $AAF6

-> コードを修正しました。
I'm Japanese, so please excuse any mistakes in my English!
(日本語を話す日本人です。英語に間違いがあってもご容赦ください!)

NoroNoro

Quick way to enable the monitor in the first Famista

Reference: https://tcrf.net/R.B.I._Baseball

Memory address $183:
#$00 → Monitor ON
#$01 → Monitor OFF
-------------------------------------------------------------------------------
初代ファミスタで簡単にモニターを起動する方法

参考:https://tcrf.net/R.B.I._Baseball

メモリアドレス $183:
#$00 → モニターON
#$01 → モニターOFF
I'm Japanese, so please excuse any mistakes in my English!
(日本語を話す日本人です。英語に間違いがあってもご容赦ください!)

ProfessorW

Quote from: NoroNoro on 09/19/25, 11:57:16 PMI also use patches from this person (Mayutch) to edit and play with Famista '93. I haven't really worked with the first Famista.

I think 2PTime.ips should work as well. (However, since it's the type of patch that writes a subroutine into a free area, it may break if another patch overlaps that area. In that case, you just need to relocate the address.)

About enabling "Time Call" with the second controller

1. Find the routine that checks controller 1's input address $0B for the value #$10 (Start button), and identify the time-call check
2. Turn that time-call check into a new subroutine and branch to it
3. In the new subroutine, reuse the controller 1 check, and also check controller 2's $0C. If either is pressed, jump to the original time-call routine and then return

First Famista
=============
(before)
A5 0B          LDA $0B
29 10          AND #$10
D0 06          BNE $AAF6
--------
(after)
20 78 EF       JSR $EF78  ; jump to a free area (address is up to you)
EA             NOP
EA             NOP
EA             NOP
(new) subroutine (place it at $EF78 or any free area you prefer)
$EF78:
A5 0B          LDA $0B
29 10          AND #$10
D0 07          BNE $EF85
A5 0C          LDA $0C
29 10          AND #$10
D0 01          BNE $EF85
60             RTS
$EF85:
4C F6 AA       JMP $AAF6

->I have updated the code.

-------------------------------------------------------------------------------
私もこの方(Mayutchさん)のパッチを利用させてもらってファミスタ'93を編集して遊んでいます。私は初代ファミスタは使ったことがありません。

2PTime.ipsも動作すると思いますよ。(ただし、空きエリアにサブルーチンを書いているタイプのパッチなので、他のパッチとエリアが被ると壊れる可能性があります。その場合はアドレスを変えてあげれば大丈夫です。)

2コントローラーでの「タイムコール」について

1) 1コントローラの入力アドレスの$0Bの値#$10(スタートボタン)を確認する処理を探し、タイムコール判定を見つける
2) 判明したタイムコール判定を新しくサブルーチン化し、そこにジャンプさせる
3) サブルーチンでは1コントローラーの判定を移植し、2コントローラーの$0Cでも判定し、今までどおりタイムコールサブルーチンへジャンプさせ、サブルーチンから抜ける

初代ファミスタ
==============
(before)
A5 0B          LDA $0B
29 10          AND #$10
D0 06          BNE $AAF6
--------
(after)
20 78 EF       JSR $EF78  ; 空きエリアにジャンプ(アドレスはお好みで)
EA             NOP
EA             NOP
EA             NOP
(new) subroutine (place it at $EF78 or any free area you prefer)
$EF78:
A5 0B          LDA $0B
29 10          AND #$10
D0 07          BNE $EF85
A5 0C          LDA $0C
29 10          AND #$10
D0 01          BNE $EF85
60             RTS
$EF85:
4C F6 AA       JMP $AAF6

-> コードを修正しました。

WOW, I'm amazed. I can grasp some concepts in this explanation, but still lacking the needed how-to.
So basically any assembly instruction it's the same when translated to byte? Amazing, I'll look at patched files with new eyes.

NoroNoro

#23
Quote from: ProfessorW on 09/18/25, 03:37:58 PMI forgot. The IP Patches I mentioned were downloaded from this site (use Google Translate)

http://www.ttttom.website/Mayuemp/Famista/Patch/Patch.html

Basically are zips with a lot of IPS patches, including a README in japanese. The description of some patches in the README did not make too much sense to me, but probably the same README file was used in all the packs for all the different FamSta games.

@NoroNoro, I was more interested in what the README says for some of the patches, that was I tried to wrote in the previous post.

Many of them break the game, but a couple of them are interesting: DH, Uniform_94 (including screenshot of this one when applied to the game). I want to test the 2P one, which if I understood the file, allows second player to pause the game.


I checked the screenshot and wanted to share a few points.
The batter's name "YASHIKI" is correct, so no problem there.

However, Japanese hiragana has 46 basic characters, and including voiced marks (like "ka" + dakuten = "ga") and semi-voiced marks (like "pa") brings the total to 71.
If you are aware of this, no problem, but I wanted to mention it for reference.

The idea of converting each hiragana character into romaji is excellent.
That said, implementing this on the Famicom may be quite difficult.

For example, with "ka" and "ga":

- G team 'Egawa' -> 'E' 'GA' 'WA'
- T team 'Kakefu' -> 'KA' 'KE' 'FU'

Japanese names can be converted this way.
However, some names cannot be split neatly character by character. A famous example:
- Dodgers 'Ohtani' -> 'Oh' 'Ta' 'Ni'

By the way, ProfessorW, can you see Japanese characters displayed correctly on your side?

=======================================================================================

スクリーンショットを確認しました。少し気になる点があったので共有します。
打者の名前「YASHIKI」は正しい表記ですので問題ありません。

ただ、日本語の平仮名は基本46文字ですが、濁点(「か」+「゛」で「が」など)や半濁点(「ぱ」など)を含めると71文字になります。
ご存知のうえで計画されていれば問題ありませんが、皆さんへの参考としてお知らせしておきます。

平仮名1文字をローマ字に変換するアイデアはとても良いと思います。
ただし、ファミコン上での実装はかなり難しいかもしれません。

例えば「か」「が」の場合:
・Gチーム「えか゛わ」→ 'E' 'GA' 'WA'
・Tチーム「かけふ」→ 'KA' 'KE' 'FU'

日本人の名前はこのように変換されます。
ただし1文字ずつ変換できない場合もあります。有名な例:
・ドジャース「おおたに」→ 'Oh' 'Ta' 'Ni'

ちなみに、ProfessorWさんの環境で日本語が正しく表示されていますか?
I'm Japanese, so please excuse any mistakes in my English!
(日本語を話す日本人です。英語に間違いがあってもご容赦ください!)

ProfessorW

 ;D Didn't notice I used the full patched version for the screenshot, but it's fine, because I can explain how I handled romanizing the kanji.

Before explaining: My goal is to use rosters from NPB, MLB and LMB (Mexican League). Consider that when reading.

There are two steps:
1) Romanize the kanji in the tiles is the first step, but I found the issue of how to handle both "゛" and "゜" which are not unique letters, like the acute(´) or tilde(~) in western alphabets. Simple, I converted them to "ez" and "sn" (for "son"). Both are common endings of last names meaning "son of" in english and spanish, like "Henderson", "Tyson", "Perez" or "Hernández", and not used in japanese. But only using that would leave out many japanese names, and that goes against the goal.

2) So, when realizing that "゛" and "゜" were used always alongside other letter, using TWO spots of the name, why not changing the reference in the table to use other TWO letters? Let's use Egawa as example, and it's easier to check since it's the first pitcher of the first team.
He appears displayed like this "えか゛わ" which in the rom appears as "2B 2D 56 53" (see the screenshot as reference for the table) so, when translated I had to modify the name to "2B 10 28 53". This change in a non-translated, or original, rom it would display as "えGあわ" in the game. I know, in japanese it would not make sense, but it does when translated to western audiences.

BTW, if not changed the bytes of the name "Egawa" in the translated rom, it would display as "ekaeza".  ;D

In the first post I uploaded the IPS to translate the original rom, including the names modified.

I hope the explanation is not confusing.


ProfessorW

I'm including here the table used in names of the translated rom. If there is other standarized way of displaying romanized japanese characters, please let me know.

Beastmode

Quote from: Gantry on 09/19/25, 01:19:46 PMI'm pretty sure I wrote/modified the code for the second player pause in US RBI, but I don't remember any details. I doubt I have any files on it, unless I made a forum post with the specifics.

Here is the og post on it I believe https://forums.dee-nee.com/index.php?topic=2764.msg33993#msg33993
Why is there crying in RBI?? There's no crying in baseball!

Beastmode

Quote from: ProfessorW on 09/18/25, 12:35:46 PMThis is the layout of the ROM (included in the zip, alongside patch for the WIP translation) according to my notes:

Player Data
Starts at $10
16 bytes per player
BOTH BATTER AND PITCHER
 Byte 0 - numPlayer
 Byte 1 to 4 - Name

BATTER
 Byte 5 - Bats (0 R, 1 L)
 Byte 6 - Batting Average - 150
 Byte 7 - Homeruns
 Byte 8 - Contact
 Byte 9 - 2nd byte of power
 Byte A - 1st byte of power (ie, if $19 = B8, and $1A = 02, it should be read as x2B8)
 Byte B - Speed 

PITCHER
 Byte 5 - Throws (values 0 to 3)
   00 - Right Over
   01 - Left Over
   02 - Right SideArm
   03 - Left SideArm
 Byte 6 - ERA * 10
 Byte 7 - Sink Speed
 Byte 8 - Curve Speed
 Byte 9 - Fastball
 Byte A - Curve Right
 Byte B - Curve Left
 Byte C - Sink Skill
 Byte D - Stamina

TEXT AT INTRO SCREEN
 Copyright: $2F51 (17 bytes)
 License: $2F65 (19 bytes)
 Teams: $30EA (24 bytes)

TEAM INFO
NAME: 1 byte, starts at $B058, 10 continuous bytes.

COLORS
Two Sections:
SECTION 1: Starts at $3239, 3 bytes per team
 Byte 1 - Cap
 Byte 2 - Skin
 Byte 3 - Uniform

SECTION 2: Starts at $9E76, 4 bytes per team
 Bytes 1-3: same as above
 Byte 4: Color of public when team is playing, look at screenshot in the post

*** TILES, not direct data.
LOGOS (Used in Scoreboard)
Even when there is one letter, it uses two sprites
Team G (1): $11818 (Letter 1), $11838 (Letter 2)
Team L (2): $11858 (Letter 1), $11878 (Letter 2)
Team R (3): $11898 (Letter 1), $118B8 (Letter 2)
Team C (4): $118D8 (Letter 1), $118F8 (Letter 2)
Team T (5): $11918 (Letter 1), $11938 (Letter 2)
Team F (6): $11958 (Letter 1), $11978 (Letter 2)
Team W (7): $11998 (Letter 1), $119B8 (Letter 2)
Team D (8): $119D8 (Letter 1), $119F8 (Letter 2)
Team S (9): $11828 (Letter 1), $11848 (Letter 2)
Team N (10): $11868 (Letter 1), $11888 (Letter 2)

Also in these places
Team G (1): $150B8
Team L (2): $150C8
Team R (3): $150F8
Team C (4): $15108
Team T (5): $15138
Team F (6): $15148
Team W (7): $15178
Team D (8): $15188
Team S (9): $151B8
Team N (10): $151C8

LOGOS in NEWSPAPER at end of match
Even when there is one letter, it uses two sprites
Team G (1): $10C10 (Letter 1), $10C30 (Letter 2)
Team L (2): $10C50 (Letter 1), $10C70 (Letter 2)
Team R (3): $10C90 (Letter 1), $10CB0 (Letter 2)
Team C (4): $10CD0 (Letter 1), $10CF0 (Letter 2)
Team T (5): $10D10 (Letter 1), $10D30 (Letter 2)
Team F (6): $10D50 (Letter 1), $10D70 (Letter 2)
Team W (7): $10D90 (Letter 1), $10DB0 (Letter 2)
Team D (8): $10DD0 (Letter 1), $10DF0 (Letter 2)
Team S (9): $10E10 (Letter 1), $10E30 (Letter 2)
Team N (10): $10E50 (Letter 1), $10E70 (Letter 2)

Hope it helps.





Ok so just to be sure, you want me to help you with extending the player names with the patch u put in the first post that you cant access but has instructions?
Why is there crying in RBI?? There's no crying in baseball!

ProfessorW

Quote from: Beastmode on 09/21/25, 10:05:40 PMOk so just to be sure, you want me to help you with extending the player names with the patch u put in the first post that you cant access but has instructions?

Well, probably the most clean solution would be a patch to extend the player names to 5 letters, independent from other patches. I just included in the first post my patch in case it's easier to debug with romanized characters.

Since NoroNoro told us about the use of the last two bytes of PITCHER data, I suggest the following approach:

store the 5th character in an empty or unused section in the rom (unfortunately I don't know how to properly identify it) of 160 continuous bytes, one per player, and calculated:

Offset + ((teamNumber * 16) + playerNumber)

Both teamNumber and playerNumber starts counting at 0.

But the final word and implementation is yours, I don't know how hard to achieve is this approach. If you find it easier to work with the clean rom, or with the translated (patch in the first post), or do you have another approach, no problem from me.

Many thanks.

NoroNoro

#29
ProfessorW,
Thank you for your detailed explanation.
I'm amazed by the technique you used for the Japanese translation.
I immediately tried reproducing "Egawa vs. Kakefu" using the screenshot of the character table you provided, and it works perfectly in my environmentw :thumbsup:
It's also reassuring to see that Japanese characters are displaying correctly.
I'm also amazed at how well you understood the handling of voiced and semi-voiced marks.

Making player names 5 letters long might be a bit challenging for mew
New hacks might exist, so it could be fun to try looking for them.
I will help as much as I can.

By the way, to make it easier for Japanese users like me to find this thread, it might be better to give the thread a title like "Family Stadium" or "Famista." That way, it's easier to read via Google Translate.
==============================================================================

ProfessorWさん、
丁寧にご説明いただきありがとうございます。
日本語翻訳の技を見せていただいたことに驚いております。
早速、頂いた文字テーブルのスクショを使って「えがわvs.かけふ」を私の環境でも再現してみました。納得ですw :thumbsup:
日本語フォントも問題なく見えているようで安心しました。
また、濁点や半濁点の扱いについてもよく理解されていることに驚きました。

5文字化は少々ハードルが高いかもしれませんw
新しいハックがあるかもしれないので、探してみるのも面白いかもしれません。
できるかぎりお手伝いしますよ。

ちなみに、私のような日本人がここにたどり着きやすいように、スレッドタイトルは「Family Stadium」や「Famista」にすると、Google翻訳でも理解されやすくて良いかもしれませんね。
I'm Japanese, so please excuse any mistakes in my English!
(日本語を話す日本人です。英語に間違いがあってもご容赦ください!)