Auxiliary Video Extension (AVE)は単なるVGAスルー出力ではない [PS/55]

Image: Auxiliary Video Extension (AVE)は単なるVGAスルー出力ではない [PS/55]

Micro Channelは32ビット拡張バスの一種で、そのスロットには32ビットと16ビットがあり、また、16ビットスロットには Auxiliary Video Extension(ハードウェア・インターフェース技術解説書での日本語訳は『補助ビデオ拡張』)という、システムボードのビデオデータ(基本的にはVGA回路の出力)を拡張カードに渡すためのピンが追加されている。

Image: Micro Channel

XGA表示アダプター/AやPS/55の日本語ディスプレイ・アダプターは、これによってVGA上位互換のグラフィック機能を実装していた。

Image: Auxiliary Video Extension
この図はAuxiliary Video Extension (AVE) - Ardent Tool of Capitalismより。

私は、AVEコネクターは単にVGAのアナログRGB出力をカードにスルー出力するものだと思っていたが、どうもそうではないことに最近気付いた。下の回路図を見ると、AVEコネクターには同期信号とピクセルクロック信号の他に、ビデオメモリーの8ビットデジタルデータが結線されていることが分かる。

Image: Auxiliary Video Extension

カードにHDMI-VGA変換アダプターのようなシンプルなDACを搭載すればいいのかというと、実はそんな単純な話ではない。というのは、VGAが出力する8ビットデジタルデータは262,144色から256色を選んだ結果のパレット番号であり、パレットデータ (Color Look-up Table) に基づいてRGB値に変換した上でアナログ信号に変換する必要がある。

しかしながら、上の回路図を見る限り、パレットデータはAVEコネクターを通して受け渡しされるわけではなさそうだ。つまり、システムボードのDACと同じ仕様のパレットを持つDACチップをカード側にも搭載し、I/Oポートも一致させてデータバス経由でDACのパレットレジスターへアクセスできるようにする必要がある。Micro Channelは各スロットへのアクセスを有効・無効に切り替える機構を持つが、オンボードVGAのことしか考慮していないソフトウェアと互換性を保つためには、この機構を無視してDACのパレットにアクセスできるようにしておく必要があるだろう。

PS/55の話に置き換えるなら、システムユニットの電源投入時は日本語ディスプレイ・アダプターの機能は無効の状態で、オンボードVGAのビデオ信号がディスプレイ・アダプター上のモニター端子にスルー出力されているように見える。実際にはこれは完全なスルー出力ではなく、ディスプレイ・アダプター上のDACはパレットとともに常に有効になっていて、システムROMのVGA初期化ルーチンはVGAのパレットを初期化すると同時に、ディスプレイ・アダプター上のDACも初期化していたことになる。

カード上の回路をマザーボードのI/Oポートとわざと重複させるなんて、そんな事が許されるのだろうか。ただ1本の出力端子にディスプレイ出力信号をまとめるためだけに、そんなハードウェアに制約を課すようなことをするだろうか。しかし、そうでないと説明が付かない。とても奇妙だ。

記事中の画像は IBM Personal System/2 Model 80 Technical Reference First Edition (April 1987), IBMより。

260408 Japanese only -> Japanese speakers only

海外コミュニティがこの話題で盛り上がっているのを見ると、ああまたこの話か、とうんざりさせられるのだけど。

日本の飲食店の入口に “Japanese only” という看板が掲げられているのを見ると、外国人はこれを「日本人以外断る」と読んで、これは人種差別だと思うらしい。店側のことを思うと、そもそも日本にある店なのに英語で応対できることを一般常識レベルと考える、その自意識とホスピタリティは他のどの国にも勝る。これは素晴らしいことだが、丁寧に書くなら “We speak in Japanese only.” とすべきか。特に “in” を置くことが重要だ。この文面で “in Japanese” は日本語としか読みようが無い。逆に、炎上したいなら “in” を “to” に置き換えればいい。「○○語」だからといって"language"まで付けてしまうと堅苦しい。

しかし、日本人の大半は日本語話者と日本人と日本在住者を同一視しているので、こうなることは予想しないわけだ。ん?前にも同じ話をしたような気がする。

260407 ブログを全文表示するかどうかの悩み

私は15年以上ブログを書いているけど、未だに悩むのが記事をインデックスに全文表示するかどうかの設定。gooブログ時代は長文のTipsを書くことが多かったから、半分以上の記事は概要表示だったと思う。全文表示にすると検索結果にインデックスページが出てきて、そのページを開くと目的の内容は書かれていない(新しい記事が増えた分だけ古いインデックスページへ押し込まれるが、それが検索結果に反映されるまでラグがある)という問題もあった。雑多な内容を書くようになってからは、3段落を超えるような長文は概要表示するようになったが、判断は自動では無く投稿の都度私が考えている。

最近、というかここ数年思うことは、じっくり読む読まないは自分で選ぶから、全文表示しておいてくれということ。私は小説で速読することに慣れているので、基本的には流し読みして、内容をかみ砕く必要があるときだけじっくり読みたい。だから、クリックやタップが必要な概要表示では無く、全文表示をスクロールで読みたい。MSNニュースとかに時々出てくる、数枚から数十枚の画像をめくる系のキュレーションサイトに出会うと最悪な気分になる。日経やITmediaみたいに後からログインを要求するサイトはウザっ!て思うが、プロのライターが書いている記事だから仕方ないという気持ちもある(日本の無料ニュースサイトは動画広告をすかさず随所に挟むことはしないので、その分は良心的である)。

そういうことで基本的には全文表示にしていこうと思う。概要だけほしいという人のために既にRSSを配信しているわけだし。長文のソースコードがあったり画像が多くて重かったり、専ら自分のゲーム体験を書いた記事とかは概要にする。

IBM 5576-B01キーボードの無反応キーを直す

全く反応しないキーがあるので修理してみることにした。

このキーボードはカバーを外すのはネジ3本でいけるが、接点を見るとなると途端にハードルが上がる。

Image: IBM 5576-B01

キーボードの分厚いプラスチック製ベースは20個以上のツメで鉄板に固定され、組立は簡単そうだが、分解メンテナンスのことは全く考えられていない。このツメを折らないように1個1個外していく。

Image: IBM 5576-B01

制御基板とメンブレンシートを繋ぐフラットケーブルは白枠のパーツをずらして外してから、フラットケーブルを引き抜く。

ラバードームとシートの両方をじっくり見たが、異常は見当たらない。基板を短絡させないよう注意しながら通電して、金属製のピンセットでシートの導通を調べたところ、1本の配線が繋がっていないことが判明した。

以前にラジオの修理で使った銅箔テープを使う。

Image: IBM 5576-B01

断線していると思われる配線をバイパスするように銅箔テープを貼る。接点が対面構造になっていないからこの方法で上手くいった。普通のメンブレンキーボードだとシートの間に挟むことになるから、難しかったかもしれない。

Image: IBM 5576-B01

IBM 5576-B01キーボードの技術詳細

Image: IBM 5576-B01キーボードの技術詳細
IBM 5576-B01キーボードのキーボードIDは83ABh、サポートするスキャンコードセットは1, 2, 3で、これは2026年時点で市販されている一般的なキーボードと同じという、平凡な結果に終わった。本当は、スキャンコードセット8Ahについて色々調べたかったのだが、これではなんともつまらない。あんな見得を切っていながらこれで終わるのは忍びないので、調べて判明したことを書いておく。
本文を読む…

IBM 5576-B01キーボードはJ-DOSで使えるか?

J-DOSを動かすにはMicro Channelを備えるPS/55とそれ用のキーボードが必要になる。必要なキーボードの技術的条件は、スキャンコードセット8Ahをサポートしていること。このスキャンコードセットはマルチステーション5550のⅠ型鍵盤と互換性があり、米国英語PS/2キーボードでサポートされるスキャンコードセット (1, 2, 3) とは全く別物。また、一般的な日本語配列のキーボードはスキャンコードセット2相当で、スキャンコードセット8Aはサポートされていない。

5576-001, 002, 003の3つのキーボードはDOS/V発売前に発売されているので、J-DOSで使えることは間違いない。問題は、これらは機械鍵盤マニアの間で評価が高いようで、中古市場で見つけにくいか、見つかっても値段が高いことだ。あとは些細な問題だが、キー配列が今の業界標準と少し異なることか。これら3つは旧世代と呼ぶことにする。

他に5576型番のキーボードは主に5576-A01, B01, C01がある。A01は1991年5月にOADGリファレンスモデルであるPS/55モデル5510Zとともに発売された。B01は1993年5月にコストダウンDOS/V機の第2世代PS/Vシリーズとともに発売された。C01はTrackPoint IIを備え、1993年10月にスリムデスクトップPCのPS/55Eとともに発売された。これらのキーボードが標準で付属したモデルは、いずれもMicro ChannelではなくATバスを搭載しているため、J-DOSは動かない。これらのキーボードをMicro Channelバスモデルに装着したときにJ-DOSが動くかどうかは分からない。ネットを調べてもこのキーボードをPS/55で使用しているという情報は全くない。

これらの第2世代5576キーボードがJ-DOSで使えるかどうかは長らく謎だった。少なくとも、DOS J5.0のマニュアルにはB01とC01はサポートされるキーボードの中に書かれていなかったはず(DOS J5.0の発売が1991年末だったため、単に記載されていないだけの可能性もある)。A01がどうだったかは記憶が曖昧だが、モデル5560-Nのカタログによれば、DOS J5.0ではサポートされているようだ。

近々、このキーボードが入荷する見込みがあるので、調査用のツールを準備して、調べてみようと思う。

データをコードセグメントに配置する方法 [MS-C]

DOSでマウスのボタンをクリックしたらアプリケーションを終了するというだけのプログラムをC言語で作りたかったんだけど、これが上手くいかなかった。マウスドライバーの機能12(割り込みサブルーチンの設定)を使って、マウスが操作されたときにユーザーサブルーチンが呼び出されるようにしていた。このルーチンからアクセスする変数がデータセグメントにあり、一方、サブルーチン呼び出し時点でデータセグメントアドレスはマウスドライバーを挿していたため、一致していないことが問題だった。

MASMなら.CODEディレクティブの後に変数宣言を入れれば、そのデータはコードセグメントに配置されることは知っていたけど、MS-C 8.0 (Visual C++ 1.5)での方法を知らなかった。この方法はサポート技術情報 KB401803 - [MSVC] データをコードセグメントに確保する方法に書いてあった。変数宣言の後に__based(__segname("_CODE"))を書けばいいらしい。このキーワードはMS-C 6.0以降でサポートされている。

以下、DOS用の簡単なマウスプログラム。この程度ならアセンブリ言語で書くのと大差ないが、コードが増えていくとアセンブリ言語は一気に可読性が下がるから、先人達がやっていたように、ハードウェア制御のコア部分だけインラインアセンブリで書くというのは、理にかなっていると思う。

#include <stdio.h>
#include <dos.h>
#define LOOP_TOEXIT 1

int __based(__segname("_CODE")) nextcmd = 0;

void far mouse_handler(void)
{
    nextcmd = LOOP_TOEXIT;
    return;
}

void main(void)
{
    struct SREGS segregs;
    union REGS regs;
    regs.x.ax = 0; /* Init DOS mouse driver */
    int86(0x33, &regs, &regs);
    if (regs.x.ax == -1)
    {
        regs.x.ax = 12; /* MS MOUSE v1.0+ - DEFINE INTERRUPT SUBROUTINE PARAMETERS */
        regs.x.cx = 2; /* Call the mouse handler when the left button pressed */
        regs.x.dx = (int)mouse_handler;
        segregs.es = ((long)mouse_handler) >> 16;
        int86x(0x33, &regs, &regs, &segregs);
        printf("Press the left mouse button to exit.\n");
    }
    else
    {
        printf("Error: Can't capture the mouse.\n");
        return;
    }
    /* Main loop */
    while (1)
    {
        if (nextcmd == LOOP_TOEXIT)
            break;
    }
    /* Reset the mouse driver to release the interrupt */
    regs.x.ax = 0;
    int86(0x33, &regs, &regs);
    return;
}

260402 RTS『Age of Empires II』(1999年)[1]チュートリアルをプレイ

Image: 260402 RTS『Age of Empires II』(1999年)[1]チュートリアルをプレイ
RTSゲーム『Age of Empires II』(1999年 / Ensemble Studio)Gold Edition版をプレイ。昔、ゲーム雑誌の記事でこれを見つけて面白そうだと思いながらも、いつの間にか忘れていた。私は世界史に詳しくないし、RTS(リアルタイム・ストラテジー)というゲームジャンルではPCで Command and Conquer RA 3 (英語版)を少し触ったことがあるくらい。本作AoE2はRTSをオンラインゲームのジャンルとして確立した作品であり、根強い人気もあって、
本文を読む…