メインページに戻る

2012年9月後半 (2012年第37~38週)

生きています。

ひと月ほどHPの更新をサボったら、「持病が悪化して入院したのか?」というメイルを頂きました。
体調はすこぶる快調なのですが、RETROF-16の画像生成回路(VGA信号の発生回路)に致命的な設計ミスを発見し、落ち込んでおります。

CPU自体は全ての命令が順調に動くのですが、画面がまともに表示更新できないので、BASICのコンパイラもインベーダーゲームも年内実現は厳しくなりました。

もちろん、本プロジェクトを放棄したわけではありません。

設計ミスの詳細は全て把握し、リカバリ方法も決定しました。但し、PCBはパターンのカットやジャンパの嵐で、満身創痍状態です。
思い切ってPCBを作り直すことにしました。 という訳で、回路図、パターン図の書き直しで手が一杯、このHPの更新まで手が廻らなくなり、このHPの更新はしばらくお休みしている次第です(年内には再開予定)。
再開までの作業状況や裏話はtwitter(ID=duo6750)で紹介中です。

2012年9月9日 (2012年第36週)

QtのSLOTを知る50行のサンプルソース

RETROF-16のコンパイラもQtで同時開発中です。ところがこのQt、純粋なC++ではなくC++の言語仕様を独自拡張しています。特にSLOTと呼ばれる独自のイベント通知機能は、VC++やC++builderに慣れている者にとっては、その本質を理解するのは大変です。ここではQtの紹介と私自身の備忘録を兼ね、SLOTに関するサンプルソースを掲示しておきます。
現在、RETROF-16のクロスコンパイラはこのソースに対してクラスや関数を追加することにより作成しています。

※このサンプルソースは、main.cppとmain.hの2つだけで、ビルド可能です。Qt自体は無料で入手できます。
※このソースは、「SLOT機構が動く最もシンプルなサンプル」として筆者自身がスクラッチで作りました。
※動作は確認済ですが、「SLOT機構の理解」や「全てのPCでの動作」を保証するものではありません。


左がmain.h。実体はCxiMainクラスのヘッダーです。実際の「画面作り」はコンストラクタ内で行ってみました。
下から3行目の「private slots」がQt独自の拡張部分です。簡単に言うと画面の操作(GUI)に対応する「処理」を行う関数であることを示すキーワードですが、純粋なC++erにとっては、この「private slots」や6行目の「Q_OBJECT」等は非常に違和感を感じるソースコードに見えると思います。



下はmain.cpp。 QApplicationクラスがアプリケーション実行に関する「面倒な儀式」を隠蔽しています。アプリケーション固有の処理はQMainWindowを継承したCxiMainクラスに任せています。

実行結果

上記が実行画面です。大きなテキストエリアが左右に2つあり、左にソースを書いて[Compile]ボタンを押すと、右にオブジェクトコードが現われます。但し、上記のソースはまだコンパイラ本体は実装する前のコードですので、[Compile]ボタンを押しても、単にそれがオブジェクトコードの表示領域にコピーされるだけです。


久々のソフト

今週は、ハードも完成していないのに、久々にソフト作りに「のめりこんで」しまいました。
私自身、スロットを本格的に扱うのは初めてであり、マクロを展開した後のソースを覗いたりして、Qtの絶妙な実装方法に驚いております。他にも面白いWindowsアプリの開発環境があれば試して見たく思い物色中です。

2012年9月2日 (2012年第35週)

RETROF-16の現状

早い物で、もう9月です。本来ならばとっくに完成しているはずのRETROF-16ですが、まだ画面表示が正常に動作しておりません。

画面表示が乱れる原因と対策(1)

詳細は8月5日の製作日誌にて記述済みですが、要するにVRAMにアドレスを与えてからデータが出てくるまでの遅延時間が原因です。現状この問題は別途ブレッドボード上に用意した74LS04で遅延回路を組み、それを無理矢理挿入する事で、応急処置をしています。

ブレッドボードをVRAMの上に両面テープで固定し、そこに74LS04を置いて、遅延回路としています。


回路的には上記の様にインバーターを6段重ねにしているだけです。

画面表示が乱れる原因と対策(2)

こちらの方はもっと深刻な問題で、「指定したアドレスではない所に書き込んでしまう」です。
これでは、はっきり言って使い物になりません。 現状、原因は確定していないのですが、VRAMに書き込む時のアドレスのホールドタイムが不足している様です。RAMのマニュアル上は「この時間は0でも書き込める」とあったのでので、本当に0として設計したのですが、これがアダにになったようです。

実際に試験に用いた、画面表示のテストプログラム

0000 9080       LD   R80H  // R80Hの初期値は不定でかまわない 
0001 D280       STV  R80H  // R80Hで表現される「色」をR80で示されるアドレスに書き込む
0002 8801       ADD  1     // 
0003 C480       ST   R80H  // R80の値がインクリメントされる
0004 3000 0000  JMP  0000  // 繰り返す

C言語だとこうなります

 下記は上記のアセンブラコードを、参考のためC言語で書いたもので、実際にコンパイルをしてものではありません

short int i ;         // iの初期値は不定でかまわない
for(;;++i){ 
    x = i & 0xFF ;    // 下位8bitをx座標とする   
    y = j >> 8 ;      // 上位8bitをy座標とする 
    poke(x,y,i) ;     // poke()は指定座標に指定データを書き込む関数とする
}

要するに

要するに、このプログラムは、画面上に、座標値と1対1に対応したデータを書き続けるものです。
無限ループになっておりますが、同じ場所には同じ値を書き込むので、見かけ上は「静止画」になるはずなのです。しかし実際は左の画像(動画ではないなので説明になりませんが)の様に、激しく画面がチカチカし、微妙に画面が揺れる(表示色が変わる)のです。

この不具合も、8月中には原因を確定したかったのですが、突然押しかけてきた親戚連中や、家の中を遊園地と勘違いしているガキンチョ連中に邪魔され、殆どデバッグができませんでした。


というわけで、本格的な作業は、夏休み終了後になりそうです。

メインページに戻る