これなんですか？
PC-98のDOS用PCMCIA-ATAドライバHDCARD.SYSとフォーマッタHDCARDF.EXEに存在する504MBの壁を突破するパッチです。

PC-98のDOSでPCMCIA-ATAを使うにはSSDRV.SYSが収められているバックアップCDなどが必要です。
その時代にはほぼWindowsが使われていたこともありDOSでのPCMCIAを使う人は相当少ないことから大問題にはならなかったのだと思います。
例えば他のOSで初期化してきた2GB程度のCFをDOSから読むと一見読み書きできているように見えます。しかし実はある容量より後ろでは盛大におかしくなります。dirを取るだけでも確認ができます。それを修正しようとする試みです。
PC-DOS2000にもドライバが入っていておそらく同じ壁があると思います。こっちには手をつけません。


お約束
読み書きのテストは行いましたが必ず動くことを保証するものではありません。98と常用機のデータ移行のために使うと便利なだけです。
ネットワークにつなげればこんなものはいりません。もちろんMOなどでも移動できます。私が便利だから作成したものです。
CONFIG.SYSの書き方の説明はしません。このパッチをあてたhdcard.sysのファイルを個人的使用以外に使うことを認めません。
ドライバの一般的な使用条件を破って逆アセンブルしています。ハッキングが嫌いな方は見なかったことにして削除してください。
もちろんあなたの大事なファイルが壊れたとしても私は責任を取りません。
2021年6月15日　以前のパッチではchkdskやその他タイミング次第でMBRを読ませる作業をしたあとエラーが起きるはずでした。とうとう入れ替えられるようになったと思います。

パッチ方法
ビナパッチ
https://www.vector.co.jp/soft/winnt/util/se492248.html
をダウンロードしてきてください。それ用のパッチファイルを添付しました。
patchstr.txtがパッチ情報ファイルです。
後は説明書を読んでください。バックアップを取ってからやりましょう。
パッチファイルに直接値を書いているので何をやってるか分かる人はお気に入りのバイナリエディタで作業していただいても構いません。

注意点
PC-98でATAカードを使うにはPFDISK.EXEで初期化後HDCARDF.EXEでパーティション作成という順序で行います。
初版はHDCARDF.EXE側に問題があったのでしないでくださいと書きましたが、できるようにHDCARDF.EXEのパッチも同梱しました。手元では問題なくFAT16でフォーマットできました。
不安でしたらWindowsなど他OSで初期化してください。
試したものは
Nr166/X付属の96年9月6日8726bytesのものと
Ne3付属の95年5月15日8686bytesのものだけです。
またhttp://121ware.com/psp/PA121/121ETC2/CRM/s/WEBLIB_NECS_DID.PRODUCT_ID.FieldFormula.IScript_VDown_Details?modId=61
ここにあったものはNe3付属のものと同一のものでした。
それ以外のものが存在するかは知りません。
違っていれば下の解説を読んでそれっぽいところにパッチをあててぜひ試してみてください。
HDCARDF.EXEは39856bytesのものしか持っていません。
LtにNr166/X付属のものを持っていくとドライバロード時にフリーズして動きませんでした。
古いものには121ware版の少し古いものが必要なこともあるようです。混ぜて使っている人は注意してみてください。


やってること解説
かつてIDEの時代には504MBの壁がありました。DOS用ATAカードのドライバはその壁にひっかかるような書かれ方をしています。
シリンダ数とセクタ数を合わせて16bitに収めるための工夫だったのだとは思いますが今となっては困ることになりました。
ドライバの中でシリンダ数の上6bitが捨てられるような書かれ方をしています。
その部分で捨てられる前にシリンダ数上位8bitを保存しATAのIO操作で使うように変更しました。
パッチ場所は以下の場所です。


パッチ前
HDCARD.SYS
0749 59				POP	CX
074A 86E9			XCHG	CL,CH
074C FEC2			INC	DL
074E 80E103			AND	CL,03H
0751 D0E1			SHL	CL,1
0753 D0E1			SHL	CL,1
0755 D0E1			SHL	CL,1
0757 D0E1			SHL	CL,1
0759 D0E1			SHL	CL,1
075B D0E1			SHL	CL,1
075D 0ACA			OR	CL,DL

08BC 80E103			AND	CL,03H
08BF D0E1			SHL	CL,1
08C1 D0E1			SHL	CL,1
08C3 D0E1			SHL	CL,1
08C5 D0E1			SHL	CL,1
08C7 D0E1			SHL	CL,1
08C9 D0E1			SHL	CL,1
08CB 0ACA			OR	CL,DL

0799 B80102			MOV	AX,0201H	20==読み込みコマンド　連続セクタ数１
079C B90100			MOV	CX,0001H	0001　先頭セクタ指定
079F B600			MOV	DH,00H		先頭シリンダ指定？

1070 2E 88 2E 63 10		MOV	CS:[L1063],CH

パッチ後
079C E8 4301			CALL	L08E2

074E 2E880E6310		MOV	CS:[L1063],CL
0753 C0E106			SHL	CL,06H
0756　詰める

0760 2E882E6310		MOV	CS:[L1063],CH
0765 C3			RET
0766 90			NOP

08BC 2E880E6310		MOV	CS:[L1063],CL
08C1 C0E106			SHL	CL,06H
08C4 詰める

08E2 B90100			MOV	CX,0001H
08E5 E9 78 FE			JMP	0760
08E8 90			NOP

1070 2E 8A 2E 63 10		MOV	CH,CS:[L1063]

以前の解説と同様にシリンダ数が10bitにまるめられるところで乗っ取りその上位8bitを保管しています。
L1063に保管するように戻しました。
どうやらIdenitfyコマンド直後にCHS=001を読もうとするときにちがう位置を読ませてしまっていました。
今まで入れ替えでおかしくなっていたのはそのためです。

参考
以前のパッチ

HDCARD.SYS
パッチ前
1070 2E882E6310			MOV	CS:[L1063],CH
1075 2E880E6410			MOV	CS:[L1064],CL	
107A 2E88166510			MOV	CS:[L1065],DL	
107F 2E88366610			MOV	CS:[L1066],DH

中略

109F 2EA06410			MOV	AL,CS:[L1064]			シリンダ数下位8bit
10A3 2E8B16B80C			MOV	DX,CS:[L0CB8]		CS:[L0CB8]にはPCMCIAのIO=3D0が入っている
10A8 83C204			ADD	DX,+04H			ATAでいうIO=10f4
10AB EE				OUT	DX,AL		
10AC E82702			CALL	L12D6			
10AF 2EA06310			MOV	AL,CS:[L1063]			シリンダ数上位8bitのはず
10B3 42				INC	DX			IO=10f5
10B4 EE				OUT	DX,AL		

このL1063にシリンダ上位が入ってるつもりでATAのIO5でアクセスしますが　1070のときにやってくるCHには2bitしかいません。
なので1070の命令はつぶしました。

パッチ前
0749 59			POP	CX		受け取ったCXは16bitシリンダ
074A 86E9			XCHG	CL,CH		
074C FEC2			INC	DL		
074E 80E103			AND	CL,03H		ここから10bitシリンダに落とされてCXに保存される
0751 D0E1			SHL	CL,1		
0753 D0E1			SHL	CL,1		
0755 D0E1			SHL	CL,1		
0757 D0E1			SHL	CL,1		
0759 D0E1			SHL	CL,1		
075B D0E1			SHL	CL,1		
075D 0ACA			OR	CL,DL		
075F 8AF0			MOV	DH,AL		

ここの処理でシリンダ数が10bitに丸められセクタ数6bitと合わされます。
なのでここで落とされる前のシリンダ上位をL1063に入れるようにしました。
同じ処理が8BEh付近にもいたのでそちらにも処理をいれています。ただどうもこちらは必要なさそうな気配です。
私はそっちは触っていないものを使用することにしました。

パッチ後
1070 EB 03			JMP　1075

074E 2E 88 0E 63 10		MOV	CS:[L1063],CL
0753 C0 E1 06			SHL	CL,6
0756 EB 05			JMP	75D

HDCARDF.EXE
パッチ前
09B3 C45E04		L09B3:	LES	BX,SS:[BP+4]
09B6 2BC0			SUB	AX,AX		
09B8 50				PUSH	AX	
09B9 26FF7704			PUSH	ES:[BX+4]	
09BD 50				PUSH	AX	
09BE 26FF7706			PUSH	ES:[BX+6]	PUSHされるものは本物LBA
09C2 26FF7702			PUSH	ES:[BX+2]	ここまでまだ本物LBAがいてる
09C6 26FF37			PUSH	ES:[BX]	
09C9 E8C449			CALL	L5390		
09CC 52				PUSH	DX	
09CD 50				PUSH	AX	
09CE E8BF49			CALL	L5390		
09D1 8946F8			MOV	SS:[BP-8],AX		帰ってきたときのAXにはシリンダ数16bit
09D4 48				DEC	AX	
09D5 3B46FA			CMP	AX,SS:[BP-6]		ここに10bitに丸められたシリンダが入ってる　これより小さいとやり直し？
09D8 7303			JNB	SHORT L09DD	

パッチ後
09D5 8946FA			MOV	SS:[BP-6],AX		16bitシリンダ数を入れ直し
09D8 EB03			JMP	SHORT L09DD	

計算を繰り返してる部分を完全に無視してSS:[BP-6]を上書きします。それだけ

別解
こんな不安定なパッチを使わなくとも504MB以下のCFを使えば何も心配ありません。
実際私はかなり長い間256MBのCFを使ってやりとりしていました。
それ以上の容量のものも他のOSやツールを使ってパーティションをうまく切ればDOSからのアクセスに心配なく使えることをweb上で発表している人もいます。

最後に
Windows98やFreeDOS(98)でならFAT32が使えます。その場合2GBを越えるファイルシステムが使えます。
このパッチはヘッダ16セクタ63の壁は突破するように作っていません。シリンダ1023の壁をつぶしただけです。
よって32GBにも壁がありますがそんな大容量が必要な場合は違う手段を使ってください。
その前にまずCFが申告してくるほうのCHS8GBの壁にひっかかるとは思います。ここをつぶすのは大変だと思います。やりません。

その後、CHKDSKをかけた後に入れ替えを行うと読み書きができなくなることが判明しました。なぜかWindows98Seでだけはその現象が起きません。
このパッチをあてたならwin98se以外ではCHKDSKは使わないでください。（そもそもDOS用チェッカより別OSでのチェックの方が信頼性が高いと思いますしエラーが出るようなものは買い換えるべきです。）
12月10日に追加したファイルでは入れ替えができることは確認しました。
全然できていませんでした。
2021年6月15日版は直したつもりです。


21世紀初め　		壁があることには気づいていたが能力がなかったので諦めて小容量のものを使うことを選択
令和元年11月14日		できたので公開
	11月16日		HDCARDF.EXEの方をパッチできたので改版
	11月30日		CHKDSK.EXEを使った後の入れ替えでの挙動について付け足し
令和二年12月10日		入れ替えもできるようになった（と思う）ものを追加
令和三年６月16日		入れ替えもできるようになったものに変更

文責リウ
https://twitter.com/drachen6jp
