自作TTLコンピュータで円周率を計算する(非公式編)

ほとんどアセンブラ

本サイトは1970年代にオリジナルCPUの設計と、そのCPUを使ったコンピュータの自作を夢見ていた青年(当時)が40年の月日を経て、完成させたTTLコンピュータ、RETROF-8のソフトウェア作成編です

円周率を求める自作TTLコンピュータ
 2013年7月19日公開

ほとんどアセンブラ

これでもCです。

第4話のプログラムを原則1行1命令とし、do〜whileをgoto化したプログラムをご参考までにUpします。これでも普通のCコンパイラでコンパイル可能な正規のC言語記述です。

//=================================================================
// 8bit変数と加減算のみで円周率を小数点152桁まで正しく表示する
// TTLコンピュータ、RETROF-8への移植用。Aug2010 T.GATARO as duo6750
//=================================================================
#include "stdafx.h" // ヘッダは処理系に依存する
void main(void) {
          
unsigned char C,I[2],J[2],K[2],M[2],N[2];
unsigned char H0[256],L0[256],H1[256],L1[256],dig[256];
        
    C               = 0;                     
L0: 
    H0[C]           = 0;
    H1[C]           = 0; 
    L0[C]           = 2;
    L1[C]           = 2; 
    ++C;
    if(C)           goto L0 ;             
    I[0]            = 1;
    I[1]            = 255; 
L1: 
    M[0]            = 0;
    M[1]            = 0; 
    J[0]            = I[0];
    J[1]            = I[1]; 
    if(J[1])        goto J1;
    --J[0];
J1:     
    --J[1]; 
L2:     
    if(J[0])        goto L2M;
    if(!J[1])       goto L2E; 
L2M:
    N[0]            = 0;
    N[1]            = 0;
    K[0]            = 0;
    K[1]            = 0;
L3:
    C               = N[1];
    N[0]           += M[0];
    N[1]           += M[1];
    if(N[1]<C)     ++ N[0]; 
    ++K[1]; 
    if(!K[1])      ++ K[0];
    if (K[0]<J[0])  goto L3;
    if (K[0]!=J[0]) goto L3M;
    if (K[1]<J[1])  goto L3;
L3M:
    M[0]            = 0;
    M[1]            = 0; 
    K[0]            = 0; 
    K[1]            = 0; 
L4:
    if(J[0])        goto J4I; 
    C               = M[1];
    M[0]           += H0[J[1]];
    M[1]           += L0[J[1]];
    if(M[1]<C)     ++M[0];
    goto J4E;
J4I:
    C               = M[1];
    M[0]           += H1[J[1]];
    M[1]           += L1[J[1]];
    if(M[1]<C)     ++ M[0];
J4E:
    ++K[1];
    if(!K[1])      ++K[0] ;
    if (K[1]<10)    goto L4;

    C               = M[1];
    M[0]           += N[0];
    M[1]           += N[1];
    if(M[1]<C)     ++ M[0]; 
    N[0]            = J[0];
    N[1]            = J[1]; 
    C               = N[1];
    N[0]           += J[0];
    N[1]           += J[1];
    if(N[1]<C)     ++ N[0]; 
    if(!N[1])      -- N[0]; 
    --N[1];
    K[0]            = 0;
    K[1]            = 0; 
L5: 
    if(M[0] <N[0])  goto L5E;
    if(M[0]!=N[0])  goto L5M;
    if(M[1] <N[1])  goto L5E; 
L5M:
    C               = M[1];
    M[0]           -= N[0];
    M[1]           -= N[1];
    if(M[1]>C)     -- M[0]; 
    ++K[1];
    if(!K[1])      ++ K[0];
    goto L5; 
L5E:
    if(!J[0])       goto J2; 
    H1[J[1]]        = M[0];
    L1[J[1]]        = M[1];
    goto J2E;
J2:
    H0[J[1]]        = M[0];
    L0[J[1]]        = M[1];
J2E:
    M[0]            = K[0];
    M[1]            = K[1]; 
    if(!J[1])      -- J[0];
    --J[1]; 
    goto L2;
L2E:
    if(I[0]!=1)     goto J5; 
    dig[I[1]]       = M[1]; 
J5:
    --I[1]; 
    if(I[1]==255)  -- I[0];
    if(I[0])        goto L1;
    if(I[1])        goto L1; 
    C=0;
L6: 
    if (dig[C]<10)  goto L6M; 
    dig[C]         -= 10;
    ++dig[C+1];
L6M:
    ++C;
    if (C<255)      goto L6;

/****///試験用コード。実機では結果は配列に格納に付、以下は不要 
/****/  for(C=255; C >= 56; --C) {
/****/      if (C%20==15) printf("\n") ;
/****/      printf("%d",dig[C]) ; 
/****/  }
/****/  getchar(); //一時停止(VC++コンソールアプリ用)
}

TTLコンピュータ

円周率編

  1. C言語でのアルゴリズム検証
  2. 乗除算を加減算に書き換えた
  3. 8bitメモリにshort intを格納
  4. 人間プリプロセッサ
  5. 殆どアセンブラ