MS-DOSおよびその他のテキストモードプログラムは、どのようにして倍幅のCJK文字を表示できますか?


9

日本語と中国語の多くのテキストモードBIOSセットアップ画面を見てきました。最近、日本語でWindows XPのセットアップを見たことがあります。MS-DOSには日本語版もありました。Windowsコマンドプロンプトではなく、リアルDOSモード

日本語BIOSセットアップ

日本語MS-DOS 6.2

一般的なテキストモード画面のサイズは80x25です。日本語の文字は通常のラテン文字の2倍の幅であるため、画面に同時に表示できる日本語文字の最大数は約1000です。したがって、文字の左右部分を表示するには2000コードポイントが必要です。

デフォルトのテキストモードでは256文字しか表示できませんが、最初の128文字はASCIIに使用されるため、使用可能なものは高い128コードポイントに制限されます。必要に応じて512に拡張できますが、これでもディスプレイに十分なコードポイントをサポートできません。このような限られた文字数で大きな文字セットをどのように表示したのか、私はいつも疑問に思います。

[ 日本語XPインストーラー] 8]

Linuxのテキストモードは、Unicodeを表示でき、より多くの色があるため、グラフィックモードドライバを使用しているようです。しかし、MS-DOSとBIOSのセットアップ画面で、彼らがそれをどのように行うかを説明することはできません。


編集:DOS用の日本語テキスト入力も見つけました

日本語IME

テキストモードには韓国語もあります!

韓国語

VMWare韓国語DOS


おそらく、漢字などの日本語の「文字」ではなく、Unicodeマッピングを持つひらがなまたはカタカナを見ているでしょう。
おがくず

@sawdust:上の写真を見て、あなたはそれがすべての仮名だけでなく、漢字だけではなく表示できることがわかります
phuclv

1
ことに注意してくださいあなたはおそらくからOS / 2インストーラースクリーンショットを取ったページがすぐ隣に「OS / 2を起動する際に、グラフィカルテキストモードのサポートは、ほとんどすぐに初期化された」ことをスクリーンショットに述べています。キーワードグラフィカル
CVn 14

@それだけでOS / 2が、MS-DOSおよびBIOSセットアッププログラムがあまりにもテキストモードでこの能力を持っていませんMichaelKjörling
phuclv

回答:


6

通常の「80x25文字」モードは、実際には720x350ピクセルです(つまり、各文字セルは幅9ピクセル、高さ14ピクセルです)。倍幅文字モード(「40x25」)は、各列を2倍にしてビデオコンテンツメモリを節約する(必要な量のビデオコンテンツメモリを半分に削減する)ことでこれを単により広い幅に補間するか、追加のグリフメモリと同一の文字セルを18 * 14ピクセルに増やすためのビデオコンテンツメモリの量。

かなり早い段階で(EGAが導入されたときに行われたと思います)、ユーザー定義の文字グリフのサポートがIBM PCのテキスト表示モードに追加されました。

IBM PCの通常のテキストモードは、特定のアドレスにある連続した4000バイトのビデオコンテンツRAMです。これらは、1バイトの文字属性(元は点滅、太字、下線など。後でフォアグラウンドとバックグラウンドの色と点滅/ハイライトのために再利用されるため、テキストモードでは16色に制限されます)として読み取られます。表示されます。各文字バイト値に対して表示される実際のグリフは、別の場所に保存されます。

つまり、画面上の256個の個別のグリフを一度に処理でき、各グリフを9x14 1ビットビットマップとして表現できる限り、メモリ内のグリフを単純に置き換えて、文字を異なるように表示できます。 。一部は、これはmode con codepage selectDOSで行ったことの一部でした。これは比較的簡単です。

256個を超える個別のグリフが必要であるが、画面上のグリフの数を減らしても対応できる場合は、倍幅(幅18ピクセル)のグリフを使用した40x25スキームを使用できます。ビデオコンテンツRAMの総量が固定され、グリフビットマップメモリ​​を増やすことができると仮定すると、4バイトごとに2バイトを使用して画面上の1つのグリフを表し、2 ^ 16 = 65,536個の異なるグリフ(空白のグリフを含む)。大胆な気分になったら、2 ^ 24〜16.7M個の異なるグリフにアクセスできる2番目の属性バイトをスキップすることもできます。これらのアプローチは両方とも特別なソフトウェアサポートに依存していますが、ハードウェアとファームウェアの部分は非常に簡単です。18x14の1ビットピクセルの65,536個のグリフは、約2 MiBになります。これは、かなりの量ではありますが、克服できないメモリ量ではありません。

基本的なアメリカ英語には少なくとも62個の専用グリフ(数字0-9、大文字と小文字のA〜Z)が必要です。したがって、同じ英語のテキストも表示できるようにするには、180-190のグリフを使用できます。時間とグリフごとに8ビットで行く。初期のIBM PCアーキテクチャなどのリソースに制約のある環境で行うことを選択する可能性のある、米国英語の同時サポートなしで生活できる場合は、すべてのグリフにアクセスできます。

いくつかのトリックを使用すると、おそらく2つのスキームを組み合わせて一致させることもできます。

実際にどのように行われかはわかりませんが、これらの両方は、テキストモードでプレーンなIBM PC画面に特に文字数の限られた「派手な」アルファベットを取得するための実行可能なスキームです。スタック交換の これを実際に簡単にする追加のグラフィックモードがあることは完全に可能です。

また、テキストモードテキストを表示するグラフィカルモードの違いに留意してください。おそらく普遍的にサポートされているVESAを介してグラフィカルモードを使用している場合は、文字グリフの描画に関しては自分で行うことができますが、描画方法についてはさらに自由があります。たとえば、Windows NT(Windows XPが属する製品ファミリ)のテキストベースの部分は、Windows NT 4.0ブート画面やBSODなどのテキストを表示するためにグラフィカルモードを使用していると確信しています。


ダブル幅の日本語/韓国語の文字の横に通常幅のラテン文字があるため、40x25のダブル幅モードにできないことがわかります。したがって、4バイトごとに2バイトを組み合わせてグリフを表すことはできません。前景色のビット3を使用すると、512個のグリフを同時に表現できますが、画面のほとんどを文字で満たせば十分ではありませんen.wikipedia.org/wiki/VGA-compatible_text_mode#Fonts
phuclv

@LưuVĩnhPhúc上位ビットを取り戻すか、可能な限り他のトリックを使用して、マルチバイトが必要な文字とシングルバイトの文字を混在させることができます。私はまだ答えは冒頭の段落で行われた声明を認識することだと思います:文字を表示しているときでも、ある程度のピクセルを扱っているので、それらのピクセルは直接ではなくても処理できます
CVn

テキストベースとグラフィカルモード表示テキストのすべてを知っていますが、左右に2つのコードポイントが必要なため、マルチバイトに十分なコードポイントがある方法を混同しているだけです。しかし、あなたが言ったことから、私はそれを行う別の方法を考えました。あなたの答えは受け入れられると思う
-phuclv

1

これは、@ MichaelKjörlingが言っていることを単純化しています。

テキストモードでは、画面上の各文字に1バイトの「画面メモリ」があり、各画面位置にどの文字が表示されるかをアダプタに伝えます。(アダプターにどの色と下線、点滅などのようなものを伝える「属性」バイトもあります。)

アダプターは、このバイトを使用して、小さな8x12または文字のビットマップがある別の「文字テーブル」にインデックスを付けます。DOSは、この文字テーブルをコードページと呼びます。

CGAから始めて、アダプターのRAMの特定の場所で文字テーブルを取得するようにアダプターに指示できます。各アダプターには、そのカードのデフォルトの「フォント」(標準IBMフォント)を持つ文字ROMがありますが、アダプターにRAMの場所に切り替えてそこに独自のイメージを配置するように指示できます。

ソフトウェアが何が起こっているかを知っている限り、文字テーブル内の画像を指す画面メモリ内のコードは、ASCIIコードと整列していませんが、そうする方が簡単です。あなたはスクリーンメモリコード(および文字テーブルの形状)が印刷できないASCII文字で1-31のためにあります気づくでしょう-しかし、直接画面メモリに書き込むことにより、(の思い出DEFSEG = &HB800 : POKE 0,1GW-BASICではスマイリーに一番上の文字を変更するに来て心)あなたはまだそれらを表示することができます。

したがって、適切なイメージをアダプターのRAMに入れて必要なソフトウェアサポートを提供できる場合は、他の言語を表示しても問題ありません。


CGAと同じくらい早かったですか?私は年を取っている必要があります。(私の防御のために、私はその答えを主に記憶から書きました、そして、永遠に同じように楽しみのためにそれらのテクニックを実際に使用しませんでした。)
CVn

私はあなたがそれを調べた直後だと思う、それはEGAだった。
ローレンス

ポインタを変更することでテキストフォントを変更できることは知っていますが、数年前にそれを行う方法を学びましたが、256または512コードポイントは保持できないため、2バイト文字セットをどのように表現できるかわかりません複雑な文字セット全体をカウントしない、画面上の異なる文字の最大数
phuclv

1

ウィキペディアの「VGA互換テキストモード」ページと、VGAプログラミングの本で何かを見つけました

EGAとVGAの両方のテキストモードでは、画面上で同時に512個のグリフ、またはそれぞれ256個のグリフを持つ2つのバンクを使用できます。アトリビュートビット3(前景色)は、バンクAまたはBから選択することもできます。通常は、デフォルトでAおよびBの両方のフォントレジスタが同じアドレスを指し、256個のグリフしか与えられません。したがって、それが機能するには、フォントレジスタを正しいアドレスに設定する必要があります。

各バンクには8192バイトがあり、バンク内の256個のグリフのそれぞれには32バイト(幅8ピクセル、高さ32ピクセル)があります。スキャンラインカウントレジスタを設定して、キャラクターの正しい高さを知ることができます。VGAカードは画面に400スキャンラインを印刷し、EGAは画面に350スキャンラインを印刷します。したがって、25文字の行を表示するために、文字の高さをそれぞれ16と14スキャンラインに設定します。また、VGAでは各グリフの幅は8ドットまたは9ドットですが、9番目の列は空白または8番目の列の繰り返しです。両方のバンクのこれらすべてのグリフは、ユーザー定義できます。

一部の言語で256以上の異なる文字を画面に表示するにはどうすればよいですか?上記の例では、それぞれの特殊な外字は2つ(左と右)のグリフで構成されています。ASCIIテキスト用にバンクAの最初の128個のグリフを設定できますが、バンクAの128個のグリフ+バンクBの256個のグリフ= 384個のグリフをカスタマイズできます。

また、異なる左右を組み合わせて、巨大なキャラクターセットを作成できます。たとえば、384個のユーザー定義グリフから、左側に184個、右側に200個を予約するとします。184* 200 = 36800個の異なる文字を使用できます。(確かに、それらのほとんどはおそらくその言語では無効な文字ですが、それでもかなりの数の有効な組み合わせを取得できます)。

上記の日本語の例では、左側のグリフを共有する「ha」と「ba」の文字があります。「si」および「zi」文字についても同じです。「ko」と「ni」の右側は非常に似ているため、同じ右側のグリフを共有できます。「ru」と「ro」の文字についても同じことが言えます。優れたデザインを使用すると、キャラクターセットを非常にうまく拡張できます。「le」文字の右側のグリフが画面の左上(灰色)に表示され、垂直スクロールバーで上下ボタンも変更されました。つまり、銀行Aの少なくとも一部が新しいグリフに対応するためにも使用されました。

結論として、初期のPC時代のBIOS文字列関数はUnicodeに対応していませんでしたが、そうである必要はありません。512個のグリフをカスタマイズし、正しいEGAまたはVGAレジスタを設定するだけでした。たとえば、 "!@" "#$" "%^" "&*" "çé" "ñÑ"グリフを外国の文字(バンクAまたはB)にカスタマイズし、BIOSに "! @#S%^&*çéñÑ "文字列を一度に。BIOSはグリフをチェックしません。また、ビデオメモリに直接書き込むことができるため、BIOS機能をまったく使用できませんでした。バンクBのグリフを使用するには、文字の前景色属性を8〜15(明るい色)の値に設定するだけです。

(申し訳ありませんが私の悪い英語)


質問で述べたように、512文字を使用できることを知っています。ただし、上記のプログラムはかなではなく実際の漢字を表示しているため、同時に表示されるものの数が大幅に増えます。制限された符号化半角カタカナを備えたシステムで別個丸と同じコードポイントし及びじ、またははその両方のために使用することができるように、てんてん及びば、左と右の一部を共有する必要がない有し、使用される
phuclvを

0

VGAテキストモードでは512文字以上を使用する方法がないため、調査を行いましたが、予想どおり、グラフィックモードを使用するか、特別なハードウェアサポートが必要です。

DOS自体は、1バイトあたり1バイトを超える文字セットで印刷することはできません。これは、BIOS機能を使用し、さらに2 x 256文字以上のサイズのフォントを使用できないVGAハードウェアを使用するためです。そのため、これもドライバーの仕事のように聞こえます。ドライバーは、グラフィックモードを使用して広範なフォントをレンダリングします。いくつかのグラフィカルDOSテキストエディタなどでUnicodeフォントを既にサポートしています(ありがとう:-))。DBCSまたはUTF-8のどちらを使用する場合でも、「異常」を処理する「文字のサイズを1バイト以上にすることができます」 。

FreeDOSで日本語の公式サポートはありますか?

DOS日本語版(DOS / V)は、最初のアプローチを使用し、特殊なドライバーを使用してグラフィックモードで文字をレンダリングすることによりテキストモードシミュレートします。ドライバーは、DOSのテキスト表示機能を拡張するメカニズムであるIBM V-Text標準に従います。あなたは、様々な間で選択することができます24分の16/48分の32ドットフォント、このような

DOS / Vフォント

他の一部のテキストモードシステムも同じ手法を使用します。FreeDOSでは、日本語サポート用の特別なドライバーロードできます

FreeDOS日本語ドライバー

レンダラーはint 10hおよびint 21h呼び出しをインターセプトし、テキストを手動で描画するため、通常の英語プログラムでも機能します。ただし、VGAメモリに直接書き込むプログラムでは機能しません。日本語の文字を印刷するには、int 5hとint 17hもフックされます。

DOS / Vのマニュアルによれば、IBM BIOSは、以下の4つの新しい機能を備えたint 15hを介してV-Textのサポートも追加しました。

5010H Video extension information acquisition
5011H Video extension function registration
5012H Video extension driver release
5013H Video extension driver lock setting

これが、古いPCのBIOSで日本語のサポートを見た理由でもあると思います

それでも、グラフィックモードの速度が遅いと、スクロール中にグリッチが発生する可能性があり、特別な処理が必要です。

DOS / Vは実際には日本語テキストモードの最初のソフトウェアソリューションです

その間、1980年代初頭から日本IBMで、日本語の文字を表示する問題に対するソフトウェアソリューションを作成するための真剣な研究が行われていました。高解像度VGAモニター、高速プロセッサ、より大きなメモリとハードドライブの出現により、IBMの藤沢および大和研究所の設計者は、漢字の形状とサイズに関する情報をディスクに保存し、拡張メモリにロードできることに気付きました。グラフィックモードVRAMを介して表示されます。(ちなみに、DOS / Vの「V」は、ソフトウェアを介して日本語の文字を表示するために必要なVGAモニターから取得されます。)

DOS / V:ハード(ウェア)問題に対するソフト(ウェア)ソリューション

同じ記事によると、DOS / Vの発明の前に、他のシステムはすべてハードウェアに漢字ROMを必要とします

すべてのブランドのコンピューターは、ハードウェアソリューションを使用して日本語の文字の表示を処理し、すべての文字のデータを漢字ROMと呼ばれる特別なチップに保存しました。この方法では、キーボード入力の各文字の2バイトコードをCPUに送信する必要がありました。これにより、対応する文字が漢字ROMからフェッチされ、テキストモードVRAMを介して画面に送信されました。漢字ROMを使用すると、各文字の形状が固定され、テキストモードVRAMを使用すると各文字に標準の16x16ドットサイズが設定されます。

たとえば、日本語フォントの特別なグラフィックアダプタを使用するIBM Personal System / 55は、実際のテキストモードを取得します。

1980年代初頭、日本IBMは、アジア太平洋地域向けの2つのx86ベースのパーソナルコンピューターラインであるIBM 5550とIBM JXをリリースしました。5550は、ディスクから漢字フォントを読み取り、1024 x 768の高解像度モニターでグラフィック文字としてテキストを描画しました。

https://en.wikipedia.org/wiki/DOS/V#History

IBM 5550と同様に、テキストモードは8色で1040x725ピクセル(12x24および24x24ピクセルフォント、80x25文字)で、フォントROMから読み取った日本語文字を表示できます。

AXアーキテクチャは、代わりに標準EGAの特別JEGAアダプタを使用しています

AX(Architecture eXtended)は、1986年頃に開始された日本のコンピューティングイニシアチブであり、PCが特殊なハードウェアチップを介して2バイト(DBCS)の日本語テキストを処理できるようにし、外国のIBM PC用に作成されたソフトウェアとの互換性を可能にしました。

...

十分な明瞭さで漢字を表示するために、AXマシンには、当時一般的な640x350標準EGA解像度ではなく、640x480の解像度のJEGA(ja)画面がありました。ユーザーは通常、「JP」と「US」を入力することで日本語モードと英語モードを切り替えることができます。これにより、日本語文字の入力を可能にするAX-BIOSとIMEも呼び出されます。

それ以降のバージョンでは、VGAでのソフトウェアエミュレーション用に特別なAX-VGA / HハードウェアとAX-VGA / Sも追加されます。

ただし、AXのリリース後間もなく、IBMはAXが明らかに互換性のないVGA標準をリリースしました(非標準の「スーパーEGA」拡張機能を促進する唯一のものではありませんでした)。その結果、AXコンソーシアムは互換性のあるAX-VGA(ja)を設計する必要がありました。AX-VGA / HはAX-BIOSを使用したハードウェア実装でしたが、AX-VGA / Sはソフトウェアエミュレーションでした。

利用可能なソフトウェアやその他の問題により、AXは失敗し、日本でのPC-9801の優位性を破ることができませんでした。1990年、IBM Japanは、標準のVGAカードを使用してハードウェアを追加することなく、IBM PC / ATおよびそのクローンが日本語テキストを表示できるようにするDOS / Vを発表しました。その後まもなく、AXは消滅し、NEC PC-9801の衰退が始まりました。

NEC PC-98シリーズは、ディスプレイコントローラ内の文字ROMを持っています

標準のPC-98には、それぞれ12 KBのメインメモリと256 KBのビデオRAMを備えた2つのµPD7220ディスプレイコントローラー(マスターとスレーブ)があります。マスターディスプレイコントローラーは、フォントROMを処理し、JIS X 0201(7x13ピクセル)およびJIS X 0208(15x16ピクセル)文字を表示します。

中国語と韓国語の状況はわかりませんが、同じ手法が使用されていると思います。それを達成する他の方法があるかどうかはわかりません


-1

Unicodeテキストグリフを表示できるように、ハードコードされたテキストモードではなくグラフィックモードが必要です。次に、Unicodeフォントを使用するようにMS-DOSを設定し、それを使用するように言語マッピングを変更します。

http://www.mobilefish.com/tutorials/windows/windows_quickguide_dos_unicode.html


いいえ、私は投稿画像を見て、それは本当のDOSモードだ、窓にPROMTコマンドではない
phuclv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.