アプリ版:「スタンプのみでお礼する」機能のリリースについて

よろしくお願いいたします。

Q1:PC98(のMS-DOS)で動作していたソフトをWindows XP上で動作させることが出来るのでしょうか?試してみたのですが、表示がおかしくなってしまい、まともに動作しません。

Q2:Q1のソフトはC++言語で作ってあるのですが、このPC98用のソフトをWindows XP用にするにはどういった方法があるでしょうか?簡単に行う方法はあるのでしょうか?

A 回答 (4件)

Q1:PC98xxと所謂DOS/Vは別物です。

PC98xxのソフトは本来PC98xx上で使うためのものです。
(MS-DOSだけでなく)WindowsもPC98xx用という専用版がありましたが、それもWindows 2000迄です。
DOS/V機上で動くWindowsではMS-DOS互換といってもそれはDOS/V版MS-DOSであって、
PC98xx版MS-DOSとは違います。PC98xx互換で動くには、PC98xx版Windowsが必要ですが、XPはPC98xxに対応してません。
つまり、この方向性では無理ということです。

エミュレータは世にありますし、それを使う手があると思いますが、
動作するかどうかは使いたいソフトウェア次第です。
(当時のソフトの移植性は、個別に考えるしかありません)

Q2:ソースがあるなら、Visual Studio 2008等が無料で入手できますので、
ISO/IEC14882の範囲で可搬的に書いてあれば
Win32 Console applicationとして移植するのが早いかも知れません。
(当時はやむをえないものも含め)可搬性が低いのは、例えばこういうのです。
・ポインタサイズに直接依存している
・ハードウェアに依存してる(例えばVRAMでグラフィックを描いている。マウスを制御している等)
・MS-DOSのシステムコール(int 21等)を直接利用している
・表示にエスケープシーケンスを利用してる(conio.h等)
・インラインアセンブリで特権命令を用いている
・…

# MS-DOSとあるのでWindows APIは(Win16も含め)利用してないはず。
    • good
    • 0
この回答へのお礼

こんにちは。
御回答、ありがとうございまいた。
「Win32 Console application」等、色々用語があって、さらに調査する手がかりになりました。
また質問すると思いますので、その時はよろしくお願いいたします。

お礼日時:2009/04/10 22:12

動けばもうけもの


ぐらいに考えてください。

まず、PC-98がいわゆるIBM-PCとは異なる独自規格です。
この段階で既に怪しいです。

また、MS-DOSも引っ掛かります。
MS-DOSの時代はアプリケーションが自由に周辺機器を制御できていました。
Windows95系ではそれをエミュレーションしていましたが、
NT系(2000/XP/Vista)
ではエミュレーションを止めてしまいました。
専用の"ドライバ"が必要になりました。

ま、それだけでしたら
周辺機器を制御している部分を探して
ドライバを作り
ドライバ経由でアクセスするよう
移植すればよいのです。
(といっても、結構大変ですが)

たちの悪いのは
MS-DOSがシングル・タスクであることを利用してしまった
プログラムです。

特に、ゲームや機器制御に多いのですが
例えば
for (i = 0; i < 65535;++i)
;
などとやって、消費クロック数を計測し
タイミング制御に利用したりするプログラムを
MS-DOSでは当たり前に見かけます。

アプリがCPUを独占できた時代の技です。
MS-DOSの時代はこの手で
例えば
10msec毎に信号をON/OFFする
などということを実装していました。

Windowsでは話はそう単純ではありません。
10msecの間"眠る"には
Sleep(10)
でできそうですが
正確には
10msec以上眠るの意味で
目を覚ますのは
10ms後かもしれないし、11ms後かも知れない。
極端な話
”100ms眠り続けても文句はいうな”
という仕様です。

Win32APIの段階で"正確に"10msを待つ方法はありません。
どうしても正確性が必要なら
外部クロックの割り込みに頼るしかありません。

このようなコードがあったら
如何にソースがC++で書かれていてもお手上げです。
移植は大変なものになるでしょう。

結局安心できるのは
Cの標準関数やSTLなどANSI規格の範囲で
書かれたものだけです。
これなら
16ビット ==> 32ビットへの対応をするだけです。

int a[10]
の大きさを正しく
sizeof (a)
で計算していれば安心ですが
手抜きで
20バイト決め打ちだったりしていると
問題を引き起こす可能性があります

ex
int a[10]
memset(a, 0, 20)

XPでは後半が0で埋まっていない
DOSでは問題ない

memset(a, 0, sizeof (a))
DOSでもXPでも配列全体が0で埋まる

こういうのがないかチェックする必要があります。
    • good
    • 0
この回答へのお礼

こんにちは。
御回答、ありがとうございまいた。
具体的な内容で、今からソースを見ていくのですが、大変参考になります。
また質問すると思いますので、その時はよろしくお願いいたします。

お礼日時:2009/04/10 22:15

>Q1:表示がおかしくなってしまい、まともに動作しません。


単純にエスケープ・シーケンスが動いていないだけらなDOSエミュレータを使用すれば動くと思います。
DOSBoxと言う見た目はシェルツールとそっくりなフリーソフトがあるので(主に使い方を)検索してみてください。
デイフォルトでEnterキーが画面切り替えに割り当てられえているので、最初にキーコンフィグを変更しないと何も出来ません。
    • good
    • 0
この回答へのお礼

こんにちは。
御回答、ありがとうございまいた。
「DOSBox」、調べます。

お礼日時:2009/04/10 22:17

PC98のMS-DOSという事は16bitのAPであると推測します。


WindowsXPは32bitであり完全互換はありません。Windows95等の16bitのOSの場合は多少の互換があり、互換モードも備えていました。
WindowsXP上で動作させる場合は16bitのアプリケーションを動作させるエミュレーションプログラムが必要になります。申し訳ありませんがその様な物が現時点で存在するかは分かりません。(詳しい方がいればお願いします。)

移植についてですが、WindowsAPIを利用しているのであれば少なくともその部分は書き換えが必要です。
    • good
    • 0
この回答へのお礼

こんにちは。
御回答、ありがとうございまいた。
エミュレータで「T98-Next」というのを見つけ、現行のソフトをこれで動作させようと思っています。
また質問すると思いますので、その時はよろしくお願いいたします。

お礼日時:2009/04/10 22:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!