ComProcのメモリ読み書き命令の即値幅
2023年5月末時点(コミット 0e80005)の仕様
code:命令表(抜粋)
mnemonic 15 87 0 説明
------------------------------------
LD X+simm10 |0010xx simm9 0| memX+simm10 から読んだ値を stack にプッシュ ST X+simm10 |0010xx simm9 1| stack からポップした値を memX+simm10 に書く 10ビットあるので、±512Bの範囲をアクセス可能
code:メモリマップ
addr 説明
---------------
000h-07fh CPU 内蔵機能
080h-0ffh 周辺機器
100h-2ffh データメモリ
300h-fffh プログラムメモリ
LD, ST 命令でアクセスしたいのは先頭0x300=768バイトの範囲が主
ローカル変数のアクセス
関数内のローカル変数は、LD cstack+Nのように、cstack0を基点にアドレッシング
1つの関数内で使うローカル変数が256バイト未満なら、即値幅はuimm8で足りる
cstackに負の値を足すことは無いので、simm(符号付き即値)である必要はない
将来的にfpを基点にアドレッシングしようと思うと、符号付きの効果が出てくる
グローバル変数とヒープ領域
I/O操作を頻繁に行うアプリケーションでは000h~0ffhの読み書きコストが低いと良い
即値幅は最低でも8ビット欲しい
2023年5月末時点(コミット 0e80005)では、グローバル変数は未サポート
サポートするなら、100h~2ffhの先頭あたりか、増設したメモリ(1000h以降)を使うか
100h~2ffhの512バイトに、関数スタックフレームとグローバル変数を共存させるのは、ちょっと狭い
マイクロマウス(ハーフサイズ)では、32×32区画の迷路になるので、それだけで1K個のマス目
1マス=1バイトでマップを作ると、それだけで1KiB
1マス=4ビットに圧縮できても、512B
大きなデータ構造を置きたくなるグローバル変数は1000h以降に配置することになりそう
アドレス幅が12ビットを超えてくるので、即値でアドレッシングできるメモリ読み書き命令は非現実的
バイトアクセス命令
LDやSTは即値でアドレスが指定できるが、バイトアクセスは今のところ即値アドレス命令が無い
プログラムによっては多様するので、可能であれば準備したい
命令の予約領域
即値幅を8ビットに短縮すれば、空いた2ビットでバイトアクセス命令を増やせる
しかし、現時点で0101xxxxxxxxxxxxと0110xxxxxxxxxxxxが空いてるので、ここを活用する方がいいか
即値有りメモリ読み書き命令の変更案
code:新しい命令表(案)
mnemonic 15 87 0 説明
------------------------------------
PUSH uimm15 |1 uimm15 | uimm15 を stack にプッシュ
JMP simm12 |0000 simm11 0| pc+simm12 にジャンプ
CALL simm12 |0000 simm11 1| コールスタックに pc+2 をプッシュし、pc+simm12 にジャンプ
JZ simm12 |0001 simm11 0| stack から値をポップし、0 なら pc+simm12 にジャンプ
JNZ simm12 |0001 simm11 1| stack から値をポップし、1 なら pc+simm12 にジャンプ
LD.1 X+simm10 |0010xx simm10 | バイトバージョン
ST.1 X+simm10 |0011xx simm10 | バイトバージョン
LD X+simm10 |0100xx simm9 0| memX+simm10 から読んだ値を stack にプッシュ ST X+simm10 |0100xx simm9 1| stack からポップした値を memX+simm10 に書く PUSH X+simm10 |0101xx simm10 | X+simm10 を stack にプッシュ
X の選択: 0=0, 1=fp, 2=ip, 3=cstack0 ADD FP,simm10 |011000 simm10 | fp += simm10
|011001xxxxxxxxxx| 予約
|01101xxxxxxxxxxx| 予約
|0111xxxxxxxxxxxx| 即値なし命令(別表)