JMB-X1 特設ページ


img
主に付属のドライバ(NRTDRV88J) やソフトウェア面についての情報をアップデートしていきます。



■ NRTDRV88 for JMB-X1 (NRTDRV88J)

・2021.10.xx 初版 release.

NRTDRV88J のプレイヤーディスクは N88-Disk BASIC 互換ファイルシステムです。
BASIC から FILES を取ったり SAVE/LOAD をすることができる他、PC 上で BASIC 互換ディスクイメージを操作するツールを使って曲データを追記することが出来ます。

拙作 D88SAVER を使って追記する場合は以下のようにします。


> d88saver NRTDRV88J.d88 xxxxxx.NRD -bin 0x4004 


ディスク周りは FDD サブシステムを使った高速ハンドシェイクで、ファイル検索やファイル列挙も備えています。
改良の余地はありますが速度・サイズ共にそこそこだと思います。
ソースも付属しているので自作に組み込むなど自由に使ってもらって構いません。


■ Software Information

ある程度分かっている方向けに主にマシン語で解説していきます。
I/O ポートを直接叩けば BASIC からでも問題なくコントロールできます。

JMB-X1 は OPM = YM2151 が 2 つ、SSG(PSG) = AY-3-8910/YM2149/YMZ294 が 1 つ搭載されています。
以下、説明ではそれぞれ OPM#1, OPM#2, PSG として解説していきます。

JMB-X1 は PC80/88 の I/O ポートを 6 つ使用してコントロールします。

OPM #1OPM #2PSG
$C8Wレジスタアドレス指定 $CAWレジスタアドレス指定 $CCWレジスタアドレス指定
$C9R/Wステータス読み出し
レジスタデータ出力
$CBWレジスタデータ出力 $CDWレジスタデータ出力

PSG は YMZ294 の場合は Read ができないので、互換性を保つために JMB-X1 では Read 動作が必要な処理は行わない方が良いでしょう。

OPM#1 からはタイマー割込みが PC80/88 に発行されるようになっています。
割込みレベルは Lv.3(INT4) で PC80/88 共通です。
PC88 の内蔵音源とはバッティングする可能性があるので配慮した方が良いでしょう。

N88-BASIC での割り込みテーブル
Lv.0$F300-$F301RXRDYRS-232C 受信割り込み




Lv.1$F302-$F303VRTC画面終了割り込み 1/60 秒
Lv.2$F304-$F305CLOCKリアルタイムクロック 1/600 秒
Lv.3$F306-$F307INT4ユーザー割り込み (音源)
Lv.4$F308-$F309INT3ユーザー割り込み (音源)
Lv.5$F30A-$F30BINT2ユーザー割り込み
Lv.6$F30C-$F30DFDINT1FDD 用リザーブ
Lv.7$F30E-$F30FFDINT0FDD 用リザーブ


JMB-X1 の存在を確認するためには、以下のように OPM ステータスレジスタ($C9 or $CB)を読んで返ってくる値から判別します。


CheckDevice:
    ld          b,0
    ld          c,$C9
    call        Check_OPM
    jr          c,.skip1
    set         0,b			;JMB-X1 OPM#1 存在確認 
.skip1:
    ld		c,$CB
    call        Check_OPM
    jr          c,.skip2
    set         1,b                     ;JMB-X1 OPM#2 存在確認
.skip2:
    ret                                 ;b=0 なら JMB-X1 なし

Check_OPM:
    push        de
    ld          de,0
.loop:
    in          a,(c)                   ;OPMステータスレジスタ
    cpl
    or          e
    ld          e,a
    dec         d
    jr          nz,.loop
    or          a
    pop         de
    ret         nz                      ;cf=0:存在する
    scf
    ret                                 ;cf=1:存在しない


BASIC なら以下のようにします。


10 IF INP(&HC9)=0 THEN PRINT "found: JMB-X1"  


OPM への供給ベースクロックは 4.0MHz で PSG は 2.0MHz です。ボード搭載の発振器から供給されます。
音源チップの各パラメータはこの数値をもとに決定する必要があります。

BASIC で OPM#1 から音を鳴らすサンプルを置いておきます。


10 'fm(opm) sound test
20 DEFINT A-Z:CH=0:OCT=3:LR=3:KC=&HC:KF=0 'o4c
30 READ AL,FB,WF,SY,SPD,PMD,AMD,PMS,AMS
40 REG=&H18:DAT=SPD:GOSUB 460
50 REG=&H19:DAT=&H80+PMD:GOSUB 460
60 REG=&H19:DAT=AMD:GOSUB 460
70 REG=&H1B:DAT=WF:GOSUB 460
80 REG=&H20+CH:DAT=LR*64+FB*8+AL:GOSUB 460
90 REG=&H38+CH:DAT=PMS*16+AMS:GOSUB 460
100 OP=0:GOSUB 370:OP=2:GOSUB 370:OP=1:GOSUB 370:OP=3:GOSUB 370  
110 '
120 REG=&H28+CH:DAT=OCT*16+KC:GOSUB 460
130 REG=&H30+CH:DAT=KF*4:GOSUB 460
140 REG=&H8:DAT=&H78+CH:GOSUB 460
150 PRINT"PUSH SPACE TO KEYOFF"
160 IF INP(9)<>191 THEN 160
170 REG=&H8:DAT=CH:GOSUB 460
180 END
370 'write fm parameter to (op)
380 READ AR,DR,SR,RR,SL,TL,KS,ML,DT1,DT2,AME
390 REG=&H40+CH+OP*8:DAT=DT1*16+ML:GOSUB 460
400 REG=&H60+CH+OP*8:DAT=TL:GOSUB 460
410 REG=&H80+CH+OP*8:DAT=KS*64+AR:GOSUB 460
420 REG=&HA0+CH+OP*8:DAT=AME*128+DR:GOSUB 460
430 REG=&HC0+CH+OP*8:DAT=DT2*64+SR:GOSUB 460
440 REG=&HE0+CH+OP*8:DAT=SL*16+RR:GOSUB 460
450 RETURN
460 'write fm register
470 OUT &HC8,REG
480 OUT &HC9,DAT
490 RETURN
500 '    AL FB WF SY SPD PMD AMD PMS AMS
510 DATA 2, 7,  2, 1,220,  0, 4, 1,  1
520 '    AR DR SR RR SL TL KS ML DT1 DT2 AME
530 DATA 31, 5, 7, 4, 9,37, 1, 1, 5, 0,  0
540 DATA 22, 0, 4, 5, 4,62, 1, 5, 2, 0,  0
550 DATA 29, 0, 4, 5, 4,77, 1, 1, 7, 0,  0
560 DATA 31, 7, 6, 5, 4, 0, 2, 1, 1, 0,  1


OPMx2, PSGx1 という構成は Z80 システムにとっては結構重いので、組み込みで動かす場合は設計をしっかりしておかないと
CPU 負荷やメモリ負荷で苦労することになります。

▲ TOP