ここから本文です
Dr.KIKKIE(KIKI) MSX DeuxLaque
免責:記載誤りによる損害一切

書庫全体表示

記事検索
検索

オシロ(2)

とりあえず動作実験を行ったところで、書店で「ディジタル・オシロスコープ活用ノート」(CQ出版2007年7月発行)を買ってくる。
普通は書籍等でオシロの基本原理を学んでからオシロの製作に入るのが定石であろうが、順序が逆である。やっていることと、していることが違うとよく言われる。
資料を半分読んだところで、改良点を考え始める。(最後まで読まないで始めるところが、イラチのイラチたる所以である。)

■アセンブラソースの見直し
前回は、データの取得から表示まで全てアセンブラ側で行っていた。取得データをリアルタイムで表示したかったためだが、処理が遅れる原因となっていた。データ取得と表示を切り離し、アセンブラ部分は前者に専念することとする。
PSG#14レジスタのデータを8ビットのままサンプリングし、ひたすらメモリに溜め込む。当面は、BASICから機械語ルーチン呼び出された瞬間から1KB(1024バイト)分サンプリングするモードとするが、そのうちトリガモードも実装したい。

■BASICプログラムの見直し
グラフ表示はBASIC側で受け持つ。いったんメモリに取り込まれたデータの内容を見ながら、適宜処理を加えて表示する。料理の仕方次第では4ch表示も可能である。トリガモードの変更やサンプリング・レートの変更など、操作インタフェースの機能も受け持つ。

■まとめ
機械語部分をデータ取得に専念させた結果、ノーウエイトだと1KBのサンプリングも体感的には一瞬である。
今のところ、BASIC部分はバラック状態で、生データを表示するにとどまっているが、まあなんとかなるでしょう。
思うに、デジタルオシロの要点は、サンプリングレートの設定(=ウエイトのかけ方)とトリガモードにあると思う。
などとエラそうに言えるのも一夜漬けで勉強したおかげである。自作オシロの完成はまだ先のことであるが、今まで使ったことのないオシロについて、すっかり詳しくなっちまったい。
コトに着手する前にちゃんと勉強したほうが、回り道に見えて結局、早道であることを再認識した正月の一日である。

オシロ(1)

イメージ 1
明けましてどうもです。

さて、一年の計は元旦にありなどと陳腐なことを口走りつつ、やはり男子たるもの一国一城の野望を持つべきなりと一念発起、今年はとりあえずお城を持つことを目指す。
安いものなら3万円台から市販されているが、実のところそれほど出番もなければ使いこなすアテもない。やっつけ仕事で自作しちまおうというわけで、正月早々からプログラムに取り組んだ。

とりあえず、出来た。概要は次のとおり。
MSXの汎用入出力ポートの1ピン及び2ピンの信号の変化を時系列的に表示する。
HIGH(5V)とLOW(0V)の2値で表現。デジタルしか対応しない点で、オシログラフというより2chのデジタルアナライザと言ったほうがいいかもしれない。クロックと出力のタイミングの確認といった用途を想定。

30回のサンプリングで元の表示開始位置に戻るループ表示。アセンブラで書いたプログラム本体をBASICプログラムから呼び出しており、サンプリング・レートはBASICから簡単に可変。1回のサンプリング及び表示に少なくとも数100μ秒かかる。どうせ実験(イタズラ)の動作確認用なので十分であろう。
右写真では、ジョイスティックを上下に動かし、上下のスイッチのON/OFFの状態を示している。

とはいえ、さっそく改良したい点がある。
まず、もう少し動作を早くしたい。表示に時間がかかり過ぎている。BIOSを使わず、I/OポートからVRAM直書きすればもっと早くなるはず。場合によっては1ch化も検討する。
次に、信号の変化時(ネガティブ・エッジ又はポジティブ・エッジ)からサンプリングを開始するトリガ動作を実装したい。
もう一点、是非改良したいのは正確なサンプリング・レートの把握である。実はテキトーにウエイトを入れているので、いったいどれぐらいのサンプリング・レートか分からない。最も肝心な点が疎かになっているところが、このブログらしいところである。
ハードウエアも少し考えたい。
とりあえずは5V以上の電圧や逆電流からMSXを保護したい。また、せっかくA・Bボタンの入力もできるので、何らかの活用をしたい。

振り返ってみると、昔からツール類はよく作ってきたが、そのツールを使って何かを作ったことがほとんどない。作ったツールを使って作るのは、またツール、だったりする。
早くも、今回のオシロの較正用に正確な発振器を作ってみようかなどと考え始めている。
「手段の目的化」がこのブログの目的であると言い切ってしまおう。本末転倒、これすなわち本年の一年の計である。

マウス・メモ(9)

イメージ 1
さて、前回作成した自作マウス・ルーチンは、MSX1、MSX2及びMSXPlayer(MSX2+版)を用いて無事動作確認でき、「ようやく一年ぶりに宿題を提出した気分」と書いたところである。
が、気になり出すと確かめないでいられないのが悪いクセ。
手順を「素直に展開している」と書いたものの、本当にそうか確かめてみた。

■MSXにおけるステート数
Z80では、例えば「LD r,n」は7ステート(7T)であるが、MSXの場合、1マシンサイクル(1M)にも1回、1Tのウエイトが入る。
「LD r,n」は2M要するので、7T+2T=9Tとして計算しなければならない。
また、IN命令やOUT命令の場合も1〜2Tのウエイトが入るが、これは命令表をみても分からない。どこかに入出力命令の正確なウエイトの資料があるかもしれないが、了知しない。

■右表の見方
前々回の手順のうち、5回目のデータ読み込みの「8ピンLAW (95μs) 後、1〜4ピン読込み」に関係する部分を抜き出し、それぞれのステップにかかるステート数を表にまとめた。
「LN」は説明の便宜上付した行番号、「CODE」はニーモニック、「M」はマシンサイクル、「T」はZ80本来のステート数、「IO」は入出力命令に加算するウエイト(とりあえず1Tと仮定)、「SUM」は1ステップにかかるステート数。
このうち、「95μsのウエイト」に関わる部分に着色。水色は1回だけ実行される部分、黄色は30回ループする部分である。式にすれば、
(水色部分)+(黄色部分×30回)=(ウエイトにかかる総ステート数)
となる。

■プログラムの動き
1〜4行がメインで、残りはサブルーチン群である。CALLの呼び出し先を追っていけば流れが掴めると思う。
1行目で「CALL LOW」しているが、この時点ではまだ8ピンはLOWになっていない。実際にLOWになるのは、12行目の「OUT (0A1H),A」が終了した時点であり、13行目からLOW状態が始まる。
ウエイトの終了は、4行目の「CALL READ」の呼び出し先でさらに呼び出される19行目の「IN A,(0A2H)」までとした。

■ナゾの結果
水色部分は計140T、黄色のループは延べ540T、両者合わせて680T。1T=0.2794μsだから、0.2794μs×680T=189.97μs
おんや? 「95μsのウエイト」に対して、ほぼ倍になっているなあ?
どこか計算を間違えたかと、23〜24行のループ部分をZ80本来のステート数だけと仮定して計算してみる。
(4T+10T)×30回=420T
0.2794μs×420T=117.33μs
う〜む、まだ22μsほど長いなあ。
ちなみに、手順の3回目データ読み込みの「8ピンLAW (25μs) 後、1〜4ピン読込み」についても同様に試算すると、79.34μsとなって25μsより3倍ほど長いじゃん? ループ部分を少なめに見積もっても31μsとまだ長いし。

■まとめ
マウスからのデータ取得は、8ピンで同期を取っているのは間違いないだろう。
ただ、上記結果から見ると、そのタイミングは「95μs以上」といったものなのかもしれない。厳しくチューニングして確かめてみたいところである。
まあ、どっちか言うと計算間違いの可能性のほうが高いけどね。
年末の忙しいはずの時期になにやってんだろうね。

マウス・メモ(8)

イメージ 1
2007年12月27日付「マウス・メモ(7)」の一年ぶりの続き。
「MSXテクニカルガイドブック」(第四版)附属サンプルプログラムディスクには、MOUSE.BAS及びMOUSE.MACの二つが含まれる。前者はMSX1でマウス又はトラックボールを使ってSCREEN2の画面に線を引くことができるBASICプログラム。後者は前者で使用される機械語部分のアセンブラソース。

■アセンブラソースの改変
MOUSE.MACを紹介したいところであるが、なにぶんそのまま掲載するわけにはいかない。要点だけ触れる。
キモはウエイトであろう。MOUSE.MACでは、Aレジスタに所定の値を設定し、ループでウエイトを行っている。システムタイマーではなくステート数に依存するウエイトなので、turboRでは使用できないが、そもそもMSX1用だから気にしなくていい。17μs、25μs、33μs、95μsの4種類のウエイトのため、Aレジスタに3、8、10、30を設定している。
もうひとつのキモは、マウスかトラックボールかの判断部分であろう。簡潔な条件分岐となっている。

さて、ここまで分かったところでサンプルを改変する。要点は次のとおり。
(1) マウスがポートAかポートBのどちらに接続されているかで実行開始アドレスが異なることを明示する。
(2) BASICに渡すデータのアドレスを先頭近くに置く。これによって、ソースを書き換えても渡すデータのアドレスは変化せず、参照するBASICプログラムを書き換えなくていい。
(3) 例によってASM.COMでアセンブルできるようにする。
これらを踏まえ、自分流に書き換えたのが右リストである。基本的にはMOUSE.MACと同じながら、そこそこ書き換えたので掲載してもよかろう。MAIN部分は、前回書いた手順を素直に展開している。なお、「+0」等は、開始アドレスからのオフセットを示す。データのスタック渡しはあまり好みではないが、いじると失敗するのでオリジナルのままにした。
ASM.COMでM.OBJを作成する。

■BASICプログラムの改変
オリジナルのプログラムではマシン語部分をDATA文にしていたが、アセンブラソースを書き換えるたびに変更するのは面倒なので、外部ファイルを読み込むことにした。
また、マウス等が、ポートA、Bのどちらに接続されているかユーザーに選択させることとした。
リストは次のとおり。描画ルーチンはオリジナルのままだが、リストの見た目がガラッと変わっているので掲載してもよかろう。

1000 '=============================
1010 ' M.BAS
1020 ' BASED ON MOUSE.BAS BY ASCAT.
1030 ' MODEFIED BY KIKI 2008.12
1040 '=============================
1050 'SAVE"M.BAS"
1060 CLS:CLEAR 200,&HCFFF:BLOAD "M.OBJ"
1080 DEFUSR=&HD000:TRG=1
1090 PRINT:PRINT"ENTER 1 OR 2"
1100 PRINT"(PORT A=1,PORT B=2):";
1110 I$=INPUT$(1)
1120 IF INSTR("12",I$)=0 THEN PRINT I$:GOTO 1090
1130 IF I$="2"THEN DEFUSR=&HD003:TRG=2
1140 SCREEN2:V=0:X=0:Y=0
1150 A=USR(0)
1160 IF STRIG(TRG)THEN LINE-(X,Y),15:GOTO 1180
1170 C=POINT(X,Y):PSET(X,Y),15
1180 DX=PEEK(&HD007):DY=PEEK(&HD006)
1190 IF DX>127 THEN DX=DX-256
1200 IF DY>127 THEN DY=DY-256
1210 IF C<0 THEN C=0
1220 PSET(X,Y),C:X=X+DX\1:Y=Y+DY\2
1230 GOTO 1150

MSXのバージョンを確認し、MSX2以上であれば内蔵BIOSを使うように手を加えれば、どのMSXでも動作するプログラムになる。

■まとめ
ようやく一年ぶりに宿題を提出した気分の今日この頃である。
さて、たまには掃除のひとつでもするか。おや?こんなところにFPGAボードが。

テクガイ

2008年12月17日付け「パドル(18)」で、わたなべNさんにリマインドいただいたASCATさんの「テクニカルガイドブック」について、「そこかしこにインスパイアのシードが。後日、改めて紹介したい。」と書いた。
2点紹介する。(以下「MSXテクニカルガイドブック」(第四版)に基づく。)

(ASCAT home page)
http://fetish-jp.org/ascat/

■マウス情報取得
2007年12月27日付け「マウス・メモ(7)」では、「BASICのマウス関係を含むPAD(8)以降の関数は、MSX2で追加されたはずである。MSXマウスの出力の仕方が分かれば、MSX1でもマウスが使えるようになるかも知れない。」と書いた。
まさにそのことがテクガイに記載されていた。要点だけメモする。

割込み禁止
8ピンLAW後、1〜4ピン読込み(無意味)
8ピンHIGH(33μs) 後、1〜4ピン読込み(X座標上位)
8ピンLAW (25μs) 後、1〜4ピン読込み(X座標下位)
8ピンHIGH(25μs) 後、1〜4ピン読込み(Y座標上位)
8ピンLAW (95μs) 後、1〜4ピン読込み(Y座標下位)
8ピンHIGH(33μs) 後、1〜4ピン読込み(※)
8ピンLAW(17μs) 後、
8ピンHIGH(17μs)
割込み禁止解除
※:1000B、1001B、0111B以外の値

8ピンでタイミングを取りながら4ビットずつ取り込んでいることが分かる。
まだ実験していないが、「冬休みの自由研究」に使えるかもしれない。

■逆スクロール
昔、アスキーネットMSXで「逆スクロール」のワザを読んだことがある。自分でも試したはずなのだが、方法をすっかり忘れてしまっていた。
それを今回、再発見した。

ワークエリアNORUSE(FAFDH)。
この第6ビットを「1」にすると、シフト+上下キーで画面スクロールできる。(ただし、漢字モードのみ、ANKモード不可。)
1画面を超える長さのBASICリストをロードし、リストすると、先頭が画面の上に消えてしまう。普通に上キーを押してもカーソルは画面上部でストップし、それより上のリストは表示されない。
ここでシフト+上キーを押すと、画面から消えたリストが遡って表示される。逆に、画面下に続いているはずのリストは、シフト+下キーで表示できる。
1行でもリストが表示されていれば、シフト+上下キーで、その行の前後を表示できる。

今のところBASICのリストでしか使い途を発見できないが、それでも便利な機能である。
それが一種の「隠し機能」扱いとなっているのは不思議であるが、確か、以前に試してみたときもうまく修正できなかったケースがあったように思う。
実装が不完全な部分があるのかもしれない。

■まとめ
印刷物にはないが、オンライン版テクガイの「序文」には、「本書の作成に当たっては青春という名の貴重な時間が大量に投資されています。」との一文がある。
く〜、泣かせるねえ。
これだけの情報を調べ上げるには、相当の手間ヒマがかかったに違いない。
手元にはテクガイを初めとする膨大な資料がある。これらを活用して先人たちの努力に報いないと、バチが当たるような気がする。
来年はいっそう隠忍自重し研鑽修養に努めるぞ!とか言って、要するに先送りしてしまうわけだがね。
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Dr.KIKKIE(KIKI)
Dr.KIKKIE(KIKI)
非公開 / 非公開
人気度
Yahoo!ブログヘルプ - ブログ人気度について

よしもとブログランキング

もっと見る
本文はここまでですこのページの先頭へ

[PR]お得情報

ふるさと納税サイト『さとふる』
お米、お肉などの好きなお礼品を選べる
毎日人気ランキング更新中!
ふるさと納税サイト『さとふる』
実質2000円で特産品がお手元に
11/30までキャンペーン実施中!
コンタクトレンズで遠近両用?
「2WEEKメニコンプレミオ遠近両用」
無料モニター募集中!

その他のキャンペーン

みんなの更新記事