[ Laboratory for PC-9821 ]



ここではPC-98x1のハードウェアを制御するプログラムを公開しています。

開発者向きな情報ばかりです。

・ターゲットのOSは MS-DOS です。

・特に記述がない場合は Turbo C++ Ver 1.01 で作成しています。

・暫定版(ソースの無い物)は公開までお待ちください。

・公開しているプログラムによって、障害が発生しても
 一切の責任を問わないものとします。

以上、実行は自己責任でお願いします。


menu

2002/09/24 9821-256色モードのリニアアクセス jump
2011/09/11 VSync の監視 jump
2012/04/01 GD5428/5430/5440を使う jump
2012/08/14 GA-1024A/1280A を使う jump
2012/02/26 Mystique 相当品の解析 jump
2011/10/16 カレンダ割り込み jump
2011/02/26 マウス制御 jump
2003/01/15 キーボード I/O 制御 jump
2002/09/12 118音源のMIDIを初期化する jump
2011/02/27 CバスのPnP検出 jump
2011/08/20 MM 関連機能の I/O の再配置 jump
2011/05/04 MATE-X PCM で再生 jump
2011/09/04 86音源 PCM で再生 jump
2011/08/28 SB16/98 PCM で再生 jump
2011/04/29 CanBe リモコンを使う jump
2002/09/14 FM音源の存在チェック jump
2011/07/17 FM音源の OPL3 を使う jump
2011/06/01 音源チップのI/O Port表 jump
2002/09/14 BEEP音でPCM再生 jump
2002/09/14 PC-98x1 とAT互換機の判別方法 jump
2002/12/05 Reset for PC-98x1 jump
2002/09/24 Wait for PC-9821 jump
2002/09/14 Windows の存在チェック jump
2011/06/04 IF-SEGA/98 を制御する jump
2011/12/21 98 de PCI-BIOS jump
2002/10/29 ゲームポートの制御 jump
2002/10/05 予定 jump


●テスト環境
・PC-9821Ls150
 @Mate-X PCM
・Anex86 Ver 2.78

●旧テスト環境(いくつかのプログラムは旧PCでテストしています。)
・PC-9821Xt16 /R16(売却済み)
・PC-9821Xa7e /S15(売却済み)
 @PC-9801-118 ( YMF297-F + CS4232 ) + MIDI Ster/GS(売却済み)
・PC-9821Cx3 /S7A(売却済み)

ソフトウェア:
・MS-DOS 6.2 + VEM486 Ver 1.31
・Turbo C++ Ver 1.01
・Turbo Assembler Ver 2.0
・Watcom C++ Ver 11.0J
・Open Watcom C++ Ver 1.9


9821-256色モードのリニアアクセス


「PC-9821初代」以降に搭載された 256色モードですが、
VRAMバンク切り替え方式なのでプログラムが面倒です。
これには実はリニアなVRAMアクセス方法があるのです。
非常に単純なのですが実現は困難です。

メモリアドレス 0xE0102 に 0x01 を書き込む事により、
「16MBシステム空間」にリニアなVRAMが出現します。
そこにアクセスするのです。

8086なCPUで1[MB]の壁を超えなくては使用できません・・・よって
・プロテクトモード(32ビット)に移行する必要がある。
 プロテクトモード(16ビット)では64[KB]制限があるので意味が無い。
・仮想記憶が働いているので物理アドレスをマップしなくてはいけない。

これは DPMI に対応したプログラムで対処できます。がっ、
・DPMI + プロテクトモード<32ビット>をアセンブラで記述する。
・DOSエクステンダに対応したCコンパイラを使う。
386 の知識も(少し)必要なので初心者お断りな状態です。

Watcom C++ 専用(動作可)とDJGPP用(超作りかけ)。
vram9821.lzh 2002/09/24


VSync の監視


CRTC(グラフィックGDC) の垂直同期(VSync)周波数を使用します。

サンプルは VSync を利用して一定のウエイトを取ります。
(常に監視するタイプと割り込みを使用するタイプの2つ。)

VSync はいろいろな使い方が出来るので知っていれば便利だと思います。

vsync98.lzh 2011/09/11


GD5428/5430/5440を使う


Cirrus Logic の低速と言われたグラフィックチップ GD5440 を使用します。
(ただし、ビデオ・アクセラレーションは ViRGE を超える性能を持つ。)
世代の遅れたチップをいつまでも使い続けたNECは何を考えているのやら。

対応機種は BX4,Bp,Bs,Be,Bf,Cb2以降,Cx2以降,Xe10,Xa7e,V7以降等。
(EPSON PC-486/586 で GD5428/GD5429 を搭載した機種も仮対応。)
また拡張ボード PC-9801-96,GA_98NB,WAB,WSN_A も動作可能なハズ。
解像度は 640x480 および 800x600 に対応、(1024x768は調整中)
色深度は256色およびハイカラー(16bit)に対応しています。

低解像度の周波数の調整が甘いかも知れない。
(水平同期が 31.4KHz になってるのを 31.5KHz にすべきか。)

gd54xx.lzh 2012/04/01


GA-1024A/1280A を使う


I/O DATA の自社開発チップを搭載した GA-1024A もしくは GA-1280 を
制御します。

I/O DATA よりダウンロードできるWindows用ドライバに同封されている
開発者向けライブラリは使用しませんが、GAINIT.EXE は必要です。

まだ、解析途中な部分もあります。

ga1024.lzh 2012/08/14
参考:I/O DATA - DL GA-1024A


Mystique 相当品の解析


V166,V200,V233 用の作りかけソース。
動作せず。
1MB を超えるメモリにアクセスする必要があるのでDOSエクステンダ仕様。

mga98_32.lzh 2012/02/26


カレンダ割り込み


PC-9821 の高解像度タイマーを使って10秒間待ちます。
対応機種は An,As3,Ap3,MATE-X,CanBe2(Cb,Cx,Cf),ValueStar 以降です。
(後期のPC-9801やAs2,Ap2の一部ロットも対応しているらしいですが未確認。)

calend98.lzh 2011/10/16


マウス制御


mouse.com (INT 33h) と直接 I/O を使った2つのサンプルソースです。

mouse98.lzh 2011/02/26


キーボード I/O 制御


BIOS を使わずにキーボードを制御します。
そのため、システム共通域のキーバッファは変化しません。
よってバッファ・オーバーのビープ音も鳴りません。

32ビット動作時にBIOS(16ビット)が使用できない時や、
高速にキーボードを使用したい時に使います。
key_io.lzh 2003/01/15


118音源のMIDIを初期化する


悪名高い118音源(PC-9801-118)の初期化をします。
えらー15 さんの作成した init118.com のアセンブラソースを
C言語で書き直したものです。
(FreeBSD/98 で使われているかも?)

なお、118音源を PnP モードで使用している場合は
ISA PnP Tolls 1.27 for PC-9821 で初期化後に
MIDI 初期化が出来るようになります。

ソースのみ。
init118c.lzh 2002/09/12

参考:えらー15の小屋 init118 ソース&資料
関連:ISA PnP Tolls 1.27 for PC-9821


CバスのPnP検出


いろいろ調査中・・・

pnp98.lzh 2011/02/27
関連:ISA PnP Tolls 1.27 for PC-9821


MM 関連機能の I/O の再配置


CanBe あたりから追加された機能でマルチメディア機能の
FM音源、WSS-PCM 等の再配置可能な I/O を検索します。

I/O Port 0x0c24 で機能インデックス(FM,PCM,Remocon)を指定して
I/O Port 0x0c2b / 0x0c2d で I/O アドレスの読み出し、書き込みを行います。

move_io.lzh 2011/04/22


MATE-X PCM で再生


WSS-PCM と呼ばれる機能を使用します。
PC-9821では MATE-X PCM や CanBe Sound などが該当します。
(CS4231,CS4232,YMF701,YMF715 等)

KAJAさんの資料を参考にすべてC言語で書きました。
PIOモードとDMAモードの二つが入っています。
しかも希少なフルC言語ソース !!

DMAモードが正しく動作しない時は強制リソース指定に
変更してからコンパイルしてね。
wss_test.lzh 2011/05/04

参考:[かぢゃぽんのお部屋] WP ソース&資料

感謝:sfish さん、reiria さん
→不具合の指摘、修正コードは非常に助かりました。


86音源 PCM で再生


DOS時代は標準だった PC-9801-86 の PCM 機能を使用します。
PC-9821Aシリーズや初期PC-9821Cシリーズなどが該当します。
(YM2608,WaveStar,WaveSMIT,WaveMaster,Card86等)

割り込み使用版と未使用版の二つが入っています。
しかも希少なフルC言語ソース !!

割り込みは INT5 固定ですがコード自体は変更できるように作っています。

実際の86音源で確認していないので注意が必要です。

p86_test.lzh 2011/09/04


SB16/98 PCM で再生


SoundBLASTER16 の98版。

海外サイトでゲットしたC言語ソースを98に移植。
PIO 転送版、DMA 転送版の2つが入っています。
しかも希少なフルC言語ソース !!

環境変数 SET BLASTER A20D2 I12 D3 とするのが面倒なので
自力でハードウェアのリソースを検索するツールも含めました。
(DMAは検索できないけど。)

さらに EPSON PC-486MU以降の内蔵音源 ES688 (SB Pro互換)でも
動くように SB Pro 用のコードを追加しました。

sb16_98.lzh 2011/08/28


CanBe リモコンを使う


資料はあるので作ってみた。

第1世代 CanBe Cb / Cx / Cf は不明。
第2世代 CanBe Cx3 / Cx13 / Cb10 は動作する?
第3世代 CanBe Cu10 / Ct16 は動作せず。

canbe.lzh 2011/04/29


FM音源の存在チェック


Sound ID に対応していない26音源とかスピークボードとか。

#include < stdio.h >
#include < dos.h >

void main(void)
{
// YM2203,YM2608,YMF288,YMF297
int i,x;

for(i=0;i<100;i++){
x = inportb(0x0188);
if(x == 0x00ff)
break;
}
if(x == 0x00ff)
printf("OPNがありません。\n");
else
printf("OPNがあります。\n");
}


FM音源の OPL3 を使う


SB16/98 のFM音源 OPL3(YMF262) を使います。

CanBe の OPL3 はまだ音が出ません。

fm_opl3.lzh 2011/07/17


音源チップのI/O Port表


I/O Port AT互換機 PC-9821/9801
WSS SA/2/3/x WSS 86 118 YMF715
SB16 - 0x0220-0x022F - - - -
OPL3 - 0x0388-0x038B - - 0x1488-0x148B 0x1488-0x148B
OPN - - - 0x0188-0x018B 0x0188-0x018B -
Board
Control
- - - - 0x0480-0x048F -
OPL3SA
Control
- 0x0370-0x0371
(0x0310)
(0x0538)
- - - 0x0480-0x0481
MIDI - 0x0330 - - 0x148C-0x148D 0x148C-0x148D
WSS 0x0530-0x0537
(0x0e80)
(0x0f40)
(0x0604)
0x0530-0x0537 0x0f40-0x0f47 - 0x0f40-0x0f47 0x0f40-0x0f47
Joy port - 0x0200 - - 0x1480-0x1487 0x1480-0x1487


I/O Port AT互換機 PC-9821/9801
SB16 SB AWE32 SB16/98 SB AWE32/98 MPU/98
SB16 0x0220 - 0x022F 0x0220 - 0x022F 0x20D2,2?D2 0xC000 - 0xC00F -
OPL3 0x0388 - 0x038B 0x0388 - 0x038B 0xC8D2,C?D2 0xC000 - 0xC003 -
MIDI 0x0330,0x0331 0x0330,0x0331 0x80D2,0x81D2 0xC010,0xC011 0xE0D0,0xE0D2
AWE32
WaveTable
- 0x0620 - 0x0623
0x0A20 - 0x0A23
0x0E20 - 0x0E23
- 0xC014 - 0xC017
0xD008 - 0xD00B
0xE00C - 0xE00F
-
3D Stereo - - - 0xC020 - 0xC020
0xC012 - 0xC012
-
Joy port 0x0200 - 0x0207 0x0200 - 0x0207 0x04D2 0xC200 - 0xC207 -



BEEP音でPCM再生


昔のソースをあさってたらこんなのがっ。
いろいろ作(パク)っていたんだなぁ~・・・
タイトルどおりです。ソースのみ。
beep_ply.lzh 2002/09/14


PC-98x1 とAT互換機の判別方法


INT 10h を使って調べる事ができます。
PC-98x1 では NDP 割り込み。
AT互換機ではビデオ・BIOSです。

#include < stdio.h >
#include < dos.h >

void main(void)
{
union REGS reg;

reg.h.ah = 0x0f;
int86(0x10,& reg,& reg);

if(reg.h.ah == 0x0f){
if(peek(0xfd80,0x0002) == 0x2a27)
printf("EPSON PC-9801 互換機です。\n");
else
printf("NEC PC-98x1 Series です。\n");
}
else
printf("IBM PC/AT 互換機です。\n");
}

これで機種判別できますが、誤動作する可能性がゼロとは言えません。
(今のところ、誤動作したと言う報告はありません。)


Reset for PC-98x1


↓のサンプルプログラムは完全リセットですが、
復帰再開アドレス(?)を指定するようにすれば
HSB みたいなソフトが作れます。多分・・・

#include < stdio.h >
#include < dos.h >

void main(void)
{
outportb(0x37,0x0b); // SHUT1 = 1
outportb(0x37,0x0f); // SHUT0 = 1

outportb(0xf0,0x00); // CPU RESET
}


Wait for PC-9821


デバイス制御のプログラムをしていると、
デバイスに対してウエイトが必要になる事があります。
現在のCPUは高速化が激しく、過去に作られたLSI(FM音源等)が
その高速化された速度について行けずに誤動作することがあるからです。

空ループなどでウエイトを取っていれば、将来性に不安があります。
(新規開発の無い PC-9821 の将来性は無いに等しいですが・・・)
その為には一定間隔のウエイトが必要です。

対処方法として、本来の使用目的は不明ですが、
ウエイトに良く使われる I/O Port 0x5f があります。

I/O Port 0x5f に出力(値は任意)すると、
PC-9821 において、0.6 μ秒のウエイトが取る事ができます。
仮想86モードでは 1.8 μ秒のウエイトになるらしいです。

PC-9801 でも使用可能ですが、ウエイトの時間が機種ごとに異なります。

#include < stdio.h >
#include < dos.h >

void main(void)
{
// real mode 0.6usec / v86 mode 1.8usec outportb(0x005f,0x00);
}


Windows の存在チェック


Windows95のDOS窓の設定で”Windowsを検出させない”に
チェックをつけていると、このプログラムは意味を持ちません。
多分、DOS汎用。

#include < stdio.h >
#include < dos.h >

void main(void)
{
union REGS reg;

reg.x.ax = 0x1600;
int86(0x2f,& reg,& reg);

if((reg.h.al & 0x7f) == 0x00)
printf("Windows が存在しません。\n");
else
printf("Windows が存在します。\n");
}


IF-SEGA/98 を制御する


IF-SEGA/98 からコントローラ情報を読み出します。

ただし、PnP でハードウェアが初期化されている必要があります。

ifsega.lzh 2011/06/04
関連:ISA PnP Tolls 1.27 for PC-9821


98 de PCI-BIOS


PC-9821 とAT互換機のPCI-BIOS (INT 1Ah) は共通仕様です。
BIOSコールのみであればDOS汎用ソフトになります。
いろいろ調査中・・・

簡単な「BIOS実装状況の取得」プログラム。
AT互換機でも動作可。
pci_bios.lzh 2011/12/21


ゲームポートの制御


D-SUB15ピンのゲームポートに接続されたゲームパッドを制御します。
アナログゲームパッドとMS サイドワインダーゲームパッド用です。
AT互換機のゲームポートとは共通仕様なので I/O Port の
変更だけで移植できます。
CPU速度によってはループ回数を増やす必要があるかもしれません。

joypad.lzh 2002/10/29


予定


「98 de PCI-BIOS」研究中。




Back