!!!高機能MINICPU *配列を処理するための命令を追加 *MINICPUの命令セット !!!ソースコード集 !!MINICPUのVerilog HDL記述 , ,言語,説明 ,[[各種定数宣言|defsm.v]],Verilog HDL,MINICPUで用いる各種定数の定義 ,[[算術論理演算回路|alu.v]],Verilog HDL,MINICPUの算術論理演算回路(TINYCPUと同じ) ,[[ステートマシン|statef.v]],Verilog HDL,MINICPUのステーマシン(TINYCPU-Fと同じ) ,[[スタック|stackm.v]],Verilog HDL,MINICPUのデータスタック ,[[メモリ|dpram.v]],Verilog HDL,MINICPUのデュアルポートブロックRAM ,[[MINICPU|minicpu.v]],Verilog HDL,MINICPU本体 !!アセンブラとコンパイラ MINICPUをターゲットとするアセンブラとコンパイラ , ,言語,説明 ,[[アセンブラ|miniasm]],Perl,MINICPU用アセンブラ ,[[字句解析|tinyc.l]],Flex,コンパイラの字句解析(TINYCと同じ) ,[[構文解析|minic.y]],Bison,MINICPU用コンパイラの構文解析 ,[[メモリ形式への変換|mac2mem]],Perl,オブジェクト形式をメモリ形式に変換 !!C言語風プログラムのコンパイル・アセンブル例 フィボナッチ数列を配列に求め,それを順に出力するプログラム. 配列の宣言は,サイズを指定するのではなく,要素を並べる. 同じ値が繰り返す場合は,後ろに[]をつけて,繰り返し回数を指定する. 例えば,次のC言語風プログラムでは,配列aの要素は,1が10回繰り返したあと0が続く大きさ11の配列となる. !!C言語風プログラム while(a[i]){ a[i]=a[i-1]+a[i-2]; i=i+1; } i=0; while(a[i]){ out(a[i]); i=i+1; } halt; int i=2; int a={1[10],0}; !!コンパイル結果 _001T: PUSHI a PUSH i ADD LD JZ _001F PUSHI a PUSH i ADD PUSHI a PUSH i PUSHI 1 SUB ADD LD PUSHI a PUSH i PUSHI 2 SUB ADD LD ADD ST PUSH i PUSHI 1 ADD POP i JMP _001T _001F: PUSHI 0 POP i _002T: PUSHI a PUSH i ADD LD JZ _002F PUSHI a PUSH i ADD LD OUT PUSH i PUSHI 1 ADD POP i JMP _002T _002F: HALT i: 2 a: 1 1 1 1 1 1 1 1 1 1 0 !!アセンブル結果 *** LABEL LIST *** _001F 01B _001T 000 _002F 02C _002T 01D a 02E i 02D *** MACHINE PROGRAM *** _001T: 000:102E PUSHI a 001:202D PUSH i 002:F000 ADD 003:7000 LD 004:501B JZ _001F 005:102E PUSHI a 006:202D PUSH i 007:F000 ADD 008:102E PUSHI a 009:202D PUSH i 00A:1001 PUSHI 1 00B:F001 SUB 00C:F000 ADD 00D:7000 LD 00E:102E PUSHI a 00F:202D PUSH i 010:1002 PUSHI 2 011:F001 SUB 012:F000 ADD 013:7000 LD 014:F000 ADD 015:8000 ST 016:202D PUSH i 017:1001 PUSHI 1 018:F000 ADD 019:302D POP i 01A:4000 JMP _001T _001F: 01B:1000 PUSHI 0 01C:302D POP i _002T: 01D:102E PUSHI a 01E:202D PUSH i 01F:F000 ADD 020:7000 LD 021:502C JZ _002F 022:102E PUSHI a 023:202D PUSH i 024:F000 ADD 025:7000 LD 026:E000 OUT 027:202D PUSH i 028:1001 PUSHI 1 029:F000 ADD 02A:302D POP i 02B:401D JMP _002T _002F: 02C:0000 HALT 02D:0002 i: 2 02E:0001 a: 1 02F:0001 1 030:0001 1 031:0001 1 032:0001 1 033:0001 1 034:0001 1 035:0001 1 036:0001 1 037:0001 1 038:0000 0