CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

しくじり先生 2

これはやっちまったパタンですね
 
単に目視のためのインジケータであれば、下位バイトに表示したいデータをセットして出力すれば一瞬上位バイトが表示された後、下位バイトが表示され安定するので用は足ります。
しかしこのパルス出力を外部の制御に使おうとすると余計なデータ出力は邪魔です。
 
本来であればパラレル出力のクロック生成にアドレスバスの最下位ビットA15もデコードに加えてやるべきでした。これによって上位側、あるいは下位側バイトだけをラッチできたのに・・
パラレル出力へのクロック信号/DO_WRはGAL22V10で生成していますがA15を引き込み忘れてます。
デコードに使用していないA8,A9があるので、このパタンを切ってA15からジャンパを飛ばせばOKですがいままでノーミスできたのに(あ、2か所目でした)。
 
 
イメージ 1
 
 
ではファーム側で、何とかならないか。ですが
要は8ビット幅転送MOVBがコード生成できればいいわけです。
 
ということで引数の型をcharにしたのですが、これでは生成コードは全く変わらず。次にポインタをchar型へのポインタとしてキャストしてみたのですが
 
                        *(char *)(0xF100)=x;
 
これはコンパイラがキャスト自体をサポートしてないみたいでエラーになります
しかも理解できない構文にはフリーズするという塩対応。
 
イメージ 3
 
そうくるか、と。
もういっそインラインアセンブラで書いてしまいました。スタックから引数の取り出しは容易なのでついでに8ビット左シフトして上位バイトに詰めてからMOVBでバイト出力します。
 
イメージ 2
 
結局これが正解でした。