CAP-X

**CAP-X** とは、かつて情報処理技術者試験でのプログラミング能力試験のために使用されていたアセンブリ言語である。後継のCASLに置き換えられ、現在はCASL IIが使われている。

## 概要
情報処理技術者試験にはプログラミング能力試験があり、その試験内容はプログラミング言語別に分かれていた。第二種情報処理技術者試験（現基本情報技術者試験）では、受験者が最も得意とする言語による試験を選択することで、特定の言語が得意なプログラマが有利になることを防いでいる。

CAP-X はこの試験で使用するアセンブリ言語として開発されたもので、特定のコンピュータ・アーキテクチャをよく知る受験者に有利に働かないよう、実在しない仮想計算機のアーキテクチャに基づいて仕様が決められている。この仮想計算機を **COMP-X** と呼ぶ。**CAP-X** は COMP-X 上のアセンブリ言語の名称である。1977年以降、第一種情報処理技術者試験では CAP-X を使った問題は選択ではなく必須問題となった。

1986年、CAP-X は後継の CASL に代わる。ワード長などの基本的なアーキテクチャは変わっていない。レジスタ-メモリ間の演算のみだったものが、レジスタ-レジスタ間の演算も可能となり、命令の種類も増えている。

## COMP-X の仕様
COMP-X はデータワード長が16ビット、メモリアドレス長も16ビットのコンピュータである。アドレスはバイト単位ではなくワード単位に付与される。ワード中のビットの番号付けは、最上位ビットを 0 番、最下位ビットを 15 番とする。バイト単位の処理という概念がないため、エンディアンも規定されていない。また、COMP-X には入出力の概念が規定されておらず、何らかの手段でメモリ上にプログラムとデータを格納し、実行し、その結果はメモリを読み取ることでわかるようになっている。従って、入出力命令は存在しない。扱う数は整数のみで、2の補数表現を採用している。

レジスタは次の通り。
;汎用レジスタ GR0、GR1、GR2、GR3
:16ビットのレジスタ。算術演算と論理演算に用いる。このうち GR1、GR2、GR3 は指標（インデックス）レジスタとしても用いる。
;基底レジスタ BR
:実効アドレス16ビットの上位8ビットを格納してあるレジスタ。BR の下位8ビットは常に 0 である。
;制御カウンタ SC
:実行中の命令のアドレスが格納される。いわゆるプログラムカウンタである。
;条件コードレジスタ CC
:加算命令と減算命令の完了時に、演算結果に従って 1 か 0 がセットされる 1 ビットのレジスタ。いわゆるステータスレジスタである。

命令語は全て 1 ワードであり、先頭から順に OP フィールド（4ビット）、GR フィールド（2ビット）、XR フィールド（2ビット）、AD フィールド（8ビット）で構成される。OP フィールドは命令の種類を表すコード（オペコード）であり、COMP-X には 12 種類の命令しかない。GR フィールドでは演算で使用する GR の番号が指定される。また、JC命令では分岐条件の指定に使われる。XR フィールドではアドレス修飾を行う GR の番号が指定され、内容が 0 の場合は GR0 を意味するのではなく、GR によるアドレス修飾をしない。AD フィールドはアドレスの下位8ビットを指定する。

実効アドレスとは命令で使用するメモリアドレスであり、上位8ビットは BR で、下位8ビットは AD フィールドで指定される。XR フィールドが 0 以外の場合、指定された GR の下位8ビットと AD フィールドの値を加算し、結果の下位8ビットを実効アドレスの下位8ビットとする。

命令コードと各命令の概要は以下の通り。
; HJ (0x0) - halt and jump
: SC に実効アドレスを入れて停止。その後スタートボタンを押すと SC の示すアドレスから実行が再開される。GR フィールドは無視される。
; JNZ (0x1) - jump if GR is not zero
: GR フィールドで指定される GR の内容が 0 でないとき、実効アドレスにジャンプする。
; JC (0x2) - jump on condition
: GR フィールドが 00 ならば、何もしないで次の命令に移る。01 ならば、CC が 1 のときに実効アドレスにジャンプ。10 ならば、CC が 0 のときに実効アドレスにジャンプ。11 ならば無条件で実効アドレスにジャンプ。
; JSR (0x3) - jump to subroutine
: GR フィールドで指定した GR に現在の SC の内容に 1 を加算したものを格納し、実効アドレスが指すワードの内容を SC と BR に格納する。BR の内容を変更する唯一の命令である。従って、アドレスの上位8ビットの変化を伴うサブルーチン呼び出しとサブルーチンからの復帰は、必ず JSR 命令を使う。
; SFT (0x4) - shift
: GR フィールドで指定された GR の内容をシフトする。XR フィールドでシフトの方向（0 なら右へ、1 なら左へ）を指定し、AD フィールドでシフトするビット数を指定する。算術シフトであるため、第0ビットはシフトされず、右シフトでは第0ビット（符号ビット）がシフトされて空いた部分にコピーされる。
; LAI (0x8) - load address immediate
: 実効アドレスの下位 8 ビットが GR フィールドで指定された GR の下位 8 ビットに格納され、上位 8 ビットは 0 にされる。いわゆる即値を汎用レジスタにセットする命令。
; ADD (0xA) - add
: GR フィールドで指定された GR の内容と実効アドレスで示されたメモリワードの内容を加算し、同じ GR に格納する。演算結果が負なら CC に 1 をセットし、0 か正なら CC に 0 をセットする。
; SUB (0xB) - subtract
: GR フィールドで指定された GR の内容から、実効アドレスで示されたメモリワードの内容を減算し、結果を同じ GR に格納する。演算結果が負なら CC に 1 をセットし、0 か正なら CC に 0 をセットする。
; LD (0xC) - load
: 実効アドレスで示されたメモリワードの内容を、指定された GR に格納する。
; ST (0xD) - store
: 指定された GR の内容を、実効アドレスで示されたメモリワードに格納する。GR の内容は変化しない。
; AND (0xE) - and
: 指定された GR の内容と実効アドレスで示されたメモリワードの内容のビット毎の論理積をとり、同じ GR に格納する。
; EOR (0xF) - exclusive or
: 指定された GR の内容と実効アドレスで示されたメモリワードの内容のビット毎の排他的論理和をとり、同じ GR に格納する。

## CAP-X の仕様
CAP-X は1行に、ラベル、命令コード、オペランドの順に記述する。ラベルは記述しない場合もある。ラベルは3文字以内で、先頭は英大文字、それ以外は英大文字または数字である。オペランドでアドレスを指定する際に数値の代わりにラベルを記述できる。機械語命令のオペランドは "g, n, x" の順に記述され、それぞれ順に GR フィールド、AD フィールド、XR フィールドに対応している。x フィールドは省略可能で、省略すると XR フィールドは 0 となる。

CAP-X には次の擬似命令がある。
; START n
: プログラムの先頭に必ず書かれる。n は十進数で、プログラムの格納開始アドレスを示す。
; END n
: プログラムの最後に必ず書かれる。n はラベルか十進数で、プログラムの実行開始アドレスを示す（省略可能）。
; CONST h
: h には4桁の16進数が書かれ、その値がメモリワードの内容として格納される。
; RESV n
: n には十進数が書かれ、n ワードの領域が確保されることを意味する。プログラム格納時にはその領域の内容は変更されない。
; ADCON n
: アドレス定数。n はラベルまたは十進数。ラベルが同一プログラム内にあれば、そのラベルのアドレスが設定される。同一プログラム内にないラベルの場合、外部のシステムライブラリによってアドレスが決定され、対応するプログラムのSTART命令のアドレスに設定される。

## CAP-Xの学習

1979年まではCOMP-X、CAP-Xに関する参考書は皆無であった。CAP-Xで受験しようとする受験者にとって参考にできるものは、試験の際に配布される仕様書が唯一であった。COMP-Xは仮想のコンピュータなので、プログラムを作って実行してみることもできず、紙と鉛筆を使用して頭の中でシミュレートするしかなかった。そこで明石ミニコン研究会は、I/O（アイオー）誌の昭和55年 (1980年) 2月号から6回にわたり解説記事、過去に出題された問題の解説、練習問題を連載した。読者が練習問題の解答を郵送するとOKITAC-4300 (ミニコン) 上で稼働するCAP-Xシミュレータで実行した上、結果を返送するサービスを行っていた。なお、CAP-Xには入出力命令が無いので、実行するためのREAD (入力命令)、WRITE (出力命令) が付け加えられていた。

## 脚注

## 参考文献
* 赤松徹（著）、『CAP-X入門』工学社（1980年）