CPU実験室

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

OCCAMプログラミング(2)

SCN2681OPCレジスタに0セットで全ビット出力、SETCレジスタに$AA(10101010)RSTCレジスタに$55(01010101)セットすることで1個おきにLED点灯・・・

これはうまくいきました

とさらっと書きましたが実はここに来るまでいろいろ紆余曲折があったのです

ひとつはソースコードの書き方にかなり制約があるようです。C言語ではセンテンスの塊を中括弧{}で括りますが、OCCAMでそれに相当するのがインデントになるようです。ところが以下のようにインデントが正しくないというエラーがなかなか消えません。

いろいろやってみるとインデント1段はスペース2個下げに限るようでこれがスペース1個でも4個でもタブ1個でもだめなのです

もう一つはOCCAM特有のメモリモデルです。最初SCN2681レジスタアドレスをハード設計通り

  PLACE OPC  AT #08000034:  --Output Port Conf. Register
  PLACE SETC AT #08000038:  --Set Output Port Bits Command
  PLACE RSTC AT #0800003C:  --Reset Output Port Bits Command

とやったのですがSCN2681に全くアクセスできません。マニュアルをよく見るとOCCAMのメモリモデルはメモリの底を0として1ワード(4byte)毎に進むとありました

ボードを作る前にIMST805のデータシートを眺めていた時以下のようにoccam mapの記述は見かけたのですが本文では触れてなく、まさに何だろうと思っていた所です

もともと物理アドレスを符号付きと見ていたものをそのままの順で符号なし4byte毎に変換:つまりマニュアルにあるように物理アドレスの最上位bitを反転して右に2シフトするということでレジスタI/Oアドレスは

  PLACE OPC  AT #2200000D:  --Output Port Conf. Register
  PLACE SETC AT #2200000E:  --Set Output Port Bits Command
  PLACE RSTC AT #2200000F:  --Reset Output Port Bits Command

にしなければならない、ということです