『CODE コードから見たコンピュータのからくり』
https://gyazo.com/1e9feae26c498a24390df0ab3e75470a
第1章 親友
第2章 コードと組み合わせ
第3章 点字とバイナリーコード
グレード2点字: 32
点字のシフトコードやエスケープコード: 34
第4章 懐中電灯の解剖学
第5章 角を曲がったやり取り
第6章 スイッチを使ったロジック
第7章 電信とリレー
電線は電気抵抗によって長さに制限がある
リレーによって擬似的に伸長させることができる
バッファーの役割
第8章 リレーとゲート
NANDかNORのみで他の全ての論理ゲートを構成できる NOTを作れるから
第9章 私たちが使う10種類の数字
第10章 10に代わる数
3-to-8デコーダ
8-to-3エンコーダ
第11章 ビットでちょびっとずつ
ガードパターン
パリティ
第12章 バイトと16進数
#E74536
第13章 ASCIIからUnicodeへ
ボーコード: 201
数字シフト
文字シフト
シフトに関しての運用ルールがないと文字化けしてしまう
プロジェクト・グーテンベルク: 212
8ビットから16ビットに文字コードを移行ときの問題: 219
Most Significant Byte; MSB
0x20 0xac
ビッグエンディアン
0x20ac
リトルエンディアン
0xac20
Byte Order Mark; BOM
U+FEFF
Unicode Transformation Format; UTF
Unicodeマッピングから実際のバイト列に読み替える
第14章 論理ゲートによる加算
加算表
code:tex
\begin{array}{c|cc}
\mathrm{+}
& 0 & 1\\
\hline
0 & 00 & 01\\
1 & 01 & 10\\
\end{array}
サムビット
code:tex
\begin{array}{c|cc}
\mathrm{sum}
& 0 & 1\\
\hline
0 & 0 & 1\\
1 & 1 & 0\\
\end{array}
キャリービット
code:tex
\begin{array}{c|cc}
\mathrm{carry}
& 0 & 1\\
\hline
0 & 0 & 0\\
1 & 0 & 1\\
\end{array}
最下位ビット
Least Significant Bit; LSB
最上位ビット
Most Significant Bit; MSB
表を見比べると論理積をとればいいことがわかるあんも.icon
8ビット加算器を組み合わせて16ビット加算器を構成できる
ローバイト: 下位8ビット
ハイバイト: 上位8ビット
キャリーアウト
第15章 これは本当なのか?
リレー計算機
Model K
自動順序制御計算機
Automatic Sequence Controlled Calculator; ASCC
半導体
ドープ
N型半導体
Negative
P型半導体
Positive
NPNトランジスタ
組み上げる作業はリレーの場合と同程度に難しい
小型にできる
TTL7400シリーズ: 257
7400
Quadruple 2-Input Positive-NAND Gates
74182
look ahead carry generator
キャリーを効率的に処理できる
全加算器を連結させた加算器では、繰り上げは段階的に処理される
ripple carry: リップルキャリー
繰り上がりが多いと遅くなってしまう
先読みして処理するように回路を組む
第16章 でも、減算はどうする?
-176 + 253
999 - 176 + 253 + 1 - 1000
823 + 253 + 1 - 1000
1077 - 1000 = 77
-253 + 176
999 -253 + 176 - 999
746 + 176 - 999
922 - 999
-(999 - 922) = -77
減算を工夫して加算で処理したい
-10110000 + 11111101
11111111 - 10110000 + 11111101 + 00000001 - 100000000
01001111 + 11111101 + 00000001 - 100000000
1の補数はビット反転で得られる
101001100 + 00000001 - 100000000
101001101 - 100000000 = 01001101
最上位ビットを落とす
-11111101 + 10110000
11111111 - 11111101 + 10110000 - 11111111
00000010 + 10110000 - 11111111
10110010 - 11111111
-(11111111 - 10110010) = -01001101
符号付き: 273
500 501 ... 998 999 000 001 002 ... 498 499
半分で切って、頭を反対側にくっつける
マイナス記号なしで負の数を表現できる
第17章 フィードバックとフリップフロップ
発振器
情報を保持できる
最後に閉じられたスイッチを知ることができる
Reset-Set; R-Sフリップフロップ
2つの入力のどちらに電圧がかかっていたかを記憶できる
オシレータとフリップフロップを組み合わせる
変更を受け付けるタイミングを制御する
クロック入力が1のとき
レベルトリガー型Dタイプフリップフロップ
Level-Triggered D-Type Flip-Flop
D: data
クロック入力が1になっている間に加算が行われ、データが変わる
データが変わる速度が十分遅ければ、レベルトリガーでも機能する
入力が意図通りにならずに計算が進んでしまう
クロック入力が変化するとき
エッジトリガー型Dタイプフリップフロップ
レベルトリガー型を2つ組み合わせて構成できる
分周器
エッジトリガー型Dタイプフリップフロップの$ \bar{Q} の出力を再入力する
どんどん連結させればクロック入力の周期を半分に落としていける
2進数のインクリメントになっている
このあたりからは実装が難しそう?あんも.icon
フィードバック回路の性質が多様されていて、再現しにくい
第18章 時計を作ろう!
12 : 30 : 47
1100 : 11110 : 101111
読めない!
0001 0010 : 0011 0000 : 0100 0111
冷陰極管ディスプレイ
ニキシー管
7セグメントディスプレイ
ドットマトリクス
LED
第19章 メモリーの組み立て
第20章 計算の自動化
8ビット自動加算器で3バイトの値を加算したい: 393
規模を拡張する
24ビット加算器に取り替える
富豪的解決
複数のメモリーセルに分けて保存する
どの順番で格納する?
ハイバイト→ミドルバイト→ローバイト
書き込む順番
ローバイト→ミドルバイト→ハイバイト
メモリから読み出して加算する場合、ローバイトから取り出すとキャリーの処理に便利
オペコード: 397
データと一緒にメモリに保存して、データに対して行う処理を読み出せるようにする
うまく割り当てるとそれぞれの命令のデコードが不要になる
加算コード
減算コード
保存コード
停止コード
マイクロプロセッサ: 410
Intel 8080
第21章 算術論理演算装置(ALU)
第22章 レジスターとバス
第23章 CPU制御信号
第24章 ループ、ジャンプ、コール
第25章 周辺機器
第26章 オペレーティングシステム
第27章 コーディング
第28章 世界頭脳