Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Z80 CPUでLチカを通じて、コンピュータの動作を理解しよう
Search
Akira kure
November 05, 2025
450
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Z80 CPUでLチカを通じて、コンピュータの動作を理解しよう
コンピュータ(CPU、メモリ、IO)の動きを理解するために、Z80でLチカしてみます。
Akira kure
November 05, 2025
More Decks by Akira kure
See All by Akira kure
Z80 NOPテスター買ってみた
kuredev
0
520
Featured
See All Featured
Designing for Timeless Needs
cassininazir
1
530
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
730
Odyssey Design
rkendrick25
PRO
2
880
The World Runs on Bad Software
bkeepers
PRO
72
12k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
300
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Designing for humans not robots
tammielis
254
26k
Transcript
Z80を用いてコンピュータの動き(CPU・メモリ・IO)を LEDで可視化する
CPUの基本動作 • プログラムカウンタ・・次に実行するメモリの番地 • メモリからプログラムカウンタにしたがって命令を呼び出す • 命令を実行する • 繰り返す
CPU メモリ データバス IO アドレスバス 一般的なコンピュータの構成概要と基本動作のイメージ コントロールバス
CPU メモリ データバス IO アドレスバス 一般的なコンピュータの構成概要と基本動作のイメージ コントロールバス 電源を投入する。 まずメモリから命令をロードするた めに、コントロールバスでメモリか
ら出力されるよう制御する
CPU メモリ データバス IO アドレスバス 一般的なコンピュータの構成概要と基本動作のイメージ コントロールバス メモリからプログラムカウンタの 番地の命令を出力するよう指定する
CPU メモリ データバス IO アドレスバス 一般的なコンピュータの構成概要と基本動作のイメージ コントロールバス メモリから命令をロードする
CPU メモリ データバス IO アドレスバス 一般的なコンピュータの構成概要と基本動作のイメージ コントロールバス (命令がIOへの出力だった場合) コントロールバスでIOへ出力するよ う制御する
CPU メモリ データバス IO アドレスバス 一般的なコンピュータの構成概要と基本動作のイメージ コントロールバス 実行する(IOに出力する)
CPU メモリ データバス IO アドレスバス 一般的なコンピュータの構成概要と基本動作のイメージ コントロールバス まとめ(言いたいこと) 要するに、3つのバスを用いて、 CPUがメモリとIOとやり取りする
・アドレスバス ・データバス ・コントロールバス
コントロールバスをもう少し詳しく
コントロールバスの種類 • CPU(Z80) • MREQ(メモリリクエスト)・・メモリとやり取りするときにEnable • IOREQ(IOリクエスト)・・IOとやり取りするときにEnable • RD(リード)・・読み取り命令 •
WR(ライト)・・書き込み命令 • RAM(ROMで代用) • CE(Chip Enbale)・・メモリを入出力する • OE(Output Enable)・・出力する • WE(Write Enable)・・入力する • IOラッチ • CLK・・入力データをラッチ(保持)する
CPUのコントロールピンの組み合わせでメモリ・ IOと読み・書きを使い分ける
全体をつなげたときのイメージ
CPU(Z80) メモリ (ROM) /MREQ データバス IO (ラッチIC) /IOREQ アドレスバス ・ROMからプログラムを読んで、IO(ラッチIC)に書き込む(LEDの点灯)
・メモリの代用でROMを用いる。読み取るだけなので、ROMのWEはHIGH(パッシブ)のまま。 ・IOから読み取りは行わないので、RDはROMにつながない (本当はIORQとWRの論理和回路をラッチのCLKにつなぐのがきれいかもしれないが、手抜きで) /RD /WR CLK /OE /CE /WE
CPU(Z80) メモリ (ROM) /MREQ データバス IO (ラッチIC) /IOREQ アドレスバス /RD
/WR CLK /OE /CE /WE 1. まずメモリからプログラムをロードする →MREQ+RDをEnableにして、アドレスバスにプログラムカウンタの値を出力してアドレスを 指定。データバスで命令を取り出す。
CPU(Z80) メモリ (ROM) /MREQ データバス IO (ラッチIC) /IOREQ アドレスバス /RD
/WR CLK /OE /CE /WE 2. 命令を解釈して、IOに出力する → IOREQ+WRをEnableに。
実際に回路を組んでCPUを動かしてみた • CPU・・・Z80 • メモリ・・・ROM • IO・・・IOラッチ&LED
構成概要 IO(ラッチIC) メモリ(ROM) CPU(Z80) クロック信号 (1Hz) LED 上から下位ビット IORQピン リフレッシュピ
ン等の制御ピン
プログラム: 1つずつインクリメントした値を出力していく あらかじめROMに書き込んでおく START: LD A, 0b00000001 ; Aレジスタに1を格納 OUT
(0x01), A ; Aレジスタの値(1)をアドレス1に出力 LD A, 0b00000010 ; Aレジスタに2を格納 OUT (0x01), A ; Aレジスタの値(2)をアドレス1に出力 LD A, 0b00000011 ; Aレジスタに3を格納 OUT (0x01), A ; Aレジスタの値(3)をアドレス1に出力
デモ: 1Hzで動作。8倍速で再生 https://youtu.be/mcbUE0Qiy2w
何が起きたか? • OUT命令実行時に、LEDが点灯していた
1を出力 START: LD A, 0b00000001 OUT (0x01), A LD A,
0b00000010 OUT (0x01), A LD A, 0b00000011 OUT (0x01), A
2を出力 START: LD A, 0b00000001 OUT (0x01), A LD A,
0b00000010 OUT (0x01), A LD A, 0b00000011 OUT (0x01), A
3を出力 START: LD A, 0b00000001 OUT (0x01), A LD A,
0b00000010 OUT (0x01), A LD A, 0b00000011 OUT (0x01), A この信号はIOREQの可視化 Enableのときに消灯する OUT命令の直前に消える
さらに詳細:クロックごとの処理内容 →1つの命令をするのに大体4クロック →8クロックごとにLEDをインクリメントしながら点灯 何クロック目 プログラム カウンタ アドレスバス 出力値 アドレスバス 出力内容
備考 1 0 0 PC オペコードフェッチ 2 1 1 PC オペランド読み込み 3 2 2 PC オペランド読み込み 4 2 1 実行 レジスタに値を保存 5 3 3 PC オペコードフェッチ 6 3 1 リフレッシュ 7 4 4 PC オペランド読み込み 8 5 5 PC オペランド読み込み 9 5 1 実行 LED点灯 10 6 6 PC オペコードフェッチ 11 6 2 リフレッシュ 12 7 7 PC オペランド読み込み 13 8 8 PC オペランド読み込み 14 8 1 実行 レジスタに値を保存
まとめ • コンピューター(Z80)の動きを可視化した • CPU、メモリ、IOが、CPUを中心にどのように連携するかの基本を 理解できた • ただし、最近のCPUはバス幅が広いので、MREQ/IOREQみたいな 信号の出し分けはしてなくて、メモリのアドレス上ですべてIO入出力 も
賄うらしい(メモリマップドIO)