/* いずみ written by t-izumi@se.ritsumei.ac.jp (7,4)ハミング符復号をするためのアセンブリコード …の参考のためのCプログラム コンパイル gcc -g -Wall -ohamming.exe hamming.c 実行 hamming.exe 数 付加エラー 補足…わかりやすいようにあまりチューンアップはしていません。    動作の本質を把握するための参考まで。 */ #include #include unsigned char memory[256]; unsigned char R0,R1,R2,R3,R4,R5,R6,R7,SP; int tmp; unsigned char FC,FZ,FS,FV; void printstatus(char *str){ static int heading=0; int i; if (!heading) { printf(" R0 R1 R2 R3 R4 R5 R6 R7 FC FZ FS FV\n"); heading=1; } printf("%-3s ",str); printf("%02x %02x %02x %02x %02x %02x %02x %02x %2x %2x %2x %2x ", R0,R1,R2,R3,R4,R5,R6,R7,FC,FZ,FS,FV); printf("\n"); return ; } void printbinary(int x, int l){ int i; int v; v=1; for (i=0;i=v) { printf("1"); x=x-v; } else { printf("0"); } } return; } void hammingcode(void){ /* R0…入力 */ /* R1…符号出力 */ /* R2…対象ビットの判定用 */ R1=0; R2=R0; R2=R2&0x8;FZ=(R2==0)?1:0; if (!FZ) { R1=R1^0x45; } R2=R0; R2=R2&0x4;FZ=(R2==0)?1:0; if (!FZ) { R1=R1^0x27; } R2=R0; R2=R2&0x2;FZ=(R2==0)?1:0; if (!FZ) { R1=R1^0x16; } R2=R0; R2=R2&0x1;FZ=(R2==0)?1:0; if (!FZ) { R1=R1^0xb; } return; } void hammingdecode(void){ /* R0…入力符号 */ /* R1…訂正結果出力 */ /* R2…シンドローム */ /* R3…対象ビットの判定用、シンドローム値の判定用 */ /* シンドロームの計算 */ R2=0; R3=R0; R3=R3&0x40;FZ=(R3==0)?1:0; if (!FZ) { R2=R2^0x5; } R3=R0; R3=R3&0x20;FZ=(R3==0)?1:0; if (!FZ) { R2=R2^0x7; } R3=R0; R3=R3&0x10;FZ=(R3==0)?1:0; if (!FZ) { R2=R2^0x6; } R3=R0; R3=R3&0x08;FZ=(R3==0)?1:0; if (!FZ) { R2=R2^0x3; } R3=R0; R3=R3&0x04;FZ=(R3==0)?1:0; if (!FZ) { R2=R2^0x4; } R3=R0; R3=R3&0x02;FZ=(R3==0)?1:0; if (!FZ) { R2=R2^0x2; } R3=R0; R3=R3&0x01;FZ=(R3==0)?1:0; if (!FZ) { R2=R2^0x1; } /* 訂正 */ R1=R0; R3=R2;FZ=(R3==0)?1:0; if (FZ) { /* s = 000 */ return; } R3=R3-1;FZ=(R3==0)?1:0; if (FZ) { /* s = 001 */ R1=R1^0x01; return; } R3=R3-1;FZ=(R3==0)?1:0; if (FZ) { /* s = 010 */ R1=R1^0x02; return; } R3=R3-1;FZ=(R3==0)?1:0; if (FZ) { /* s = 011 */ R1=R1^0x08; return; } R3=R3-1;FZ=(R3==0)?1:0; if (FZ) { /* s = 100 */ R1=R1^0x04; return; } R3=R3-1;FZ=(R3==0)?1:0; if (FZ) { /* s = 101 */ R1=R1^0x40; return; } R3=R3-1;FZ=(R3==0)?1:0; if (FZ) { /* s = 110 */ R1=R1^0x10; return; } R3=R3-1;FZ=(R3==0)?1:0; if (FZ) { /* s = 111 */ R1=R1^0x20; return; } return; } int main(int argc, char **argv){ unsigned long x,error,y,y_error,y_corrected; SP=255; if (argc>=3) { x=atoi(argv[1]); error=atoi(argv[2]); } else { x=0x01; error=0x4; } R0=x; printstatus("ENC0"); hammingcode(); printstatus("ENC1"); y=R1; y_error=y^error; R0=y_error; printstatus("DEC0"); hammingdecode(); printstatus("DEC0"); y_corrected=R1; printbinary(x,4);printf("\n"); printbinary(y,7);printf("\n"); printbinary(y_error,7);printf("\n"); printbinary(y_corrected,7);printf(" ... "); if (y_corrected==y) { printf("OK\n"); } else { printf("NG\n"); } return 0; }