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