仮想入力装置付き仮想コンピュータ

その仮想コンピュータのC言語ソースファイルがこれ。

#include <stdio.h>
#include <windows.h>

int main(void)
{
   /*命令コードの構造*/
   union c{
      struct{
         unsigned char operand : 8; //オペランド
         unsigned char opecode : 8; //オペコード
      }part;
      unsigned short int code;
   };

   union c meirei[8]; //命令コードは8つ格納できるようにする

   int i = 0;
   int command = 0;

   unsigned char input_data = 0; //仮想入力装置の入力状態のデータ

   /*仮想レジスタの設定*/
   int program_counter = 0; //仮想プログラムカウンター
   unsigned char accumulator = 0;  //仮想アキュムレーター

   system("cls");
   while(1){
      switch(command){
         case 1: //命令コードのリストと入力中の数値を表示
            for(i=0;i<8;i++) printf("%x:%x\n",i,meirei[i].code);
            putchar('\n');
            printf("入力されている数値:%x\n\n",input_data);
            break;
         case 2: //命令コードを変えれるようにする
            printf("どのアドレスの命令コードを入力しますか?:");
            scanf("%x",&i);
            printf("%x:",i);
            scanf("%x",&meirei[i].code);
            putchar('\n');
            break;
         case 3:
            printf("仮想入力装置から入力する数値を16進数で設定してください。入力できる数値は0からFFまでです。");
            scanf("%x",&input_data);
            putchar('\n');
            break;
         case 4: //プログラムの実行
            for(program_counter=0;program_counter<8;program_counter++){
               switch(meirei[program_counter].part.opecode){
                  case 0: //加算
                     accumulator += meirei[program_counter].part.operand;
                     break;
                  case 1: //減算
                     accumulator -= meirei[program_counter].part.operand;
                     break;
                  case 2: //出力
                     printf("%x\n",accumulator);
                     break;
                  case 3: //入力
                     accumulator = input_data;
                     break;
                  case 4: //仮想アキュムレータに数値を格納
                     accumulator = meirei[program_counter].part.operand;
                     break;
               }
            }
            accumulator = 0;
            putchar('\n');
            break;
         case 5: //仮想マシンの電源を切る
            goto EXIT;
            break;
         default:
            break;
      }

      printf("何をしますか?\n");
      printf("1:命令コードのリストと入力中の数値を見る\n2:命令コードを変える\n3:入力装置の入力状態を変える\n4:プログラムを実行する\n5:仮想マシンの電源を切る\n");
      scanf("%d",&command);

      system("cls");     
   }

   EXIT:
  
   return 0;
}

格納できる命令の数:8ワード(オペコード、オペランド共に1バイト)
命令の長さ:2バイト(16ビット)
アキュムレーターの大きさ:8ビット
入力データの大きさ:8ビット

オペコードとその性能
オペコードが0の場合:アキュムレータ内の数値をオペランドの数値の分増やす
オペコードが1の場合:アキュムレータ内の数値をオペランドの数値の分減らす
オペコードが2の場合:アキュムレータ内の数値を画面に16進数で出力
オペコードが3の場合:アキュムレータに、入力中の数値を格納
オペコードが4の場合:アキュムレータ内の数値を、オペランドと同じに