ちょっとしたログ


ポケコンパイラ1251動いた!(2018/01/07)

前々から試そうと思っていたポケコンパイラですが、やっと確認できました。

今回はエミュレータ側の問題はなく、すんなり動きました。

 


LUMMY-BAHN動いた!(2017/12/2)

LC-3コンパイラでLUMMY-BAHNが動きました!

グラフィック命令のGRADがちゃんと動かなくてハマっていましたが、VRAMのミラー処理をちゃんとやっていないのが原因でした。

0x2000-0x2880の内容を0x3000-0x3880にもコピーするようにしたら動きました。

やったー、嬉しい!


SC61860の動きで知らなかったことが結構あった(2017/11/12)

その後、色々調べたら、知らない情報が結構ありました。

例えば、

・INCr/DECr命令はQレジスタにrのポインタが書き込まれる

というのは割と知っている?ことだったのですが、

・P, Q, Rのポインタは7bitなので0x7fの次は0に戻る

・MVBD,  MVWD, FILD, EXWD, EXBD はブロック転送なんだけど、命令実行後のDPの値はIと異なりI-1

・JR系の相対ジャンプ命令はスタックを1段使う(痕跡を残す)

・MVWPなどもスタックにPCを書き込む(痕跡を残す)

などなど、最近知りました。

まぁ、スタックに痕跡を残す系は実際の動作に影響はないと思うのですが、もしかしたらこれをあてにしたプログラムもあるかもしれません。

ちなみに、LC-3コンパイラ、動かないです。。。何なんだろう。


PC-1261 de LC-3コンパイラ

PC-1261でLC-3コンパイラ動かしてみた。

sampleのソースは動いたけど、Lummy-Bahnというのがコンパイルエラーになる。何でだろう。。。

 

sampleが動いているところを動画に撮ってみた。


PC-1261情報

0x66e1 BASICプログラム開始アドレス(LOW)

0x66e2 BASICプログラム開始アドレス(HIGH)

0x66e3 BASICプログラム終了アドレス(LOW)

0x66e4 BASICプログラム終了アドレス(HIGH)

 

TEXT START 0x4080

CLOAD 0x9695

CSAVE 0x9513

BEEP 0xc147

 

VRAM

0x2000-0x203b, 0x2800-0x283b

0x2040-0x207b, 0x2840-0x287b

 

裏技?

通常は小文字にできないが、0x203cに0x08を書き込むと、SHIFT-8 で小文字入力ができるようになる。

0x80(?)を書き込むとカナに戻る。


Test Port の bit0,1 タイマー実装

Test Port で参照している bit0は500msec、bit1は2msecのタイマーなんだけど、どう実装すればいいいのかよくわからずに悩んでいた。

どうやらタイムアップした時にオンして、Test Portを参照した時にオフすればいいみたいですね。

 

<before>

500mescごとに変数div500をオン/オフ切り替え

Test Portを参照時に、

  if (div500 != 0) {

      test |= 1;

  }

この実装だと動きが変だった。。

 

<after>

500msecごとに変数div500をオンする

Test Port参照時に、

  if (div500 != 0) {

      div500 = 0;

      test |= 1;

  }

 

という感じにしてみたら良さげになった。

今までは、カーソルの点滅が高速でチカチカしていたけど、この対応で500mescで点滅するようになった。


BASICコマンドのアドレス

コマンドフックのためにコマンド実行時の飛び先アドレスを調べていたんだけど、単に関数テーブルがあるだけだった。

pc1401の場合、ROMの0xaa90付近にこんな感じのテーブルがあります。

CLOADだと、コマンドのコードの次に、B7 9E 25 C5 とあり、B7はCLOADの内部コード、9E 25がCLOAD関数のアドレス、C5はよくわからん。。

ちなみに、CLOAD/CSAVE以外でフックして面白そうなのはBEEPぐらいかなぁ。

なお、私が調べた限りでは、1401/1402/1460/1350は同じ感じでテーブルがあります。1350はROMに2バージョンあるので、バージョンで処理を分けないといけない。(FFF0がCEだとバージョン1、03だとバージョン2)

126x系もこのパターンですね。

pc1470Uの場合はバンク0のROMにテーブルがあるけど構成がちょっと違う。

CLOADの場合、コマンドコードのに、45 16 42 C1 とあり、16が内部コード、42 C1が関数のアドレス。

pc12xx系は文字コードが普通のASCIIコードじゃないので最初はよくわからなかった。

CLOADは43 4C 4F 41 44ではなく、53 5C 5F 51 54。

pc1245の場合はB7が内部コードで70 51が関数のアドレス。

なお、1250/51も2バージョンがある。(7FFFがF0だとバージョン0、00だとバージョン1)