ทุกอย่างที่ต้องจำ ไม่มีคำอธิบายยาว ๆ — ถ้าตรงไหนงงให้กลับไปดูหน้าของข้อนั้น
| Machine Cycle | M1 | MREQ | IORQ | RD | WR | T |
|---|---|---|---|---|---|---|
| Opcode Fetch (M1) | 0 | 0 | 1 | 0 | 1 | 4 |
| Memory Read | 1 | 0 | 1 | 0 | 1 | 3 |
| Memory Write | 1 | 0 | 1 | 1 | 0 | 3 |
| I/O Read | 1 | 1 | 0 | 0 | 1 | 4 |
| I/O Write | 1 | 1 | 0 | 1 | 0 | 4 |
| Interrupt Acknowledge | 0 | 1 | 0 | 1 | 1 | 6 |
| NMI Acknowledge | 0 | 0 | 1 | 0 | 1 | 5 |
| Bus Acknowledge | 1 | Z | Z | Z | Z | — |
0 = active · 1 = inactive · Z = high impedance · I/O cycle ยาว 4 T เพราะ Z80 แทรก Tw ให้เอง
T1 ↑ วาง PC บน A15–A0 · M1 = 0
T1 ↓ MREQ = 0, RD = 0
T2 ↓ sample WAIT
T3 ↑ latch ข้อมูล · ปลด MREQ RD M1
T3 RFSH = 0 · A0–A6 = R, A8–A15 = I
T3 ↓ MREQ พัลส์ที่ 2 (refresh)
T4 ↓ ปลด MREQ · T3–T4 = decode + execute
อ่าน:
T1 ↑ วาง address
T1 ↓ MREQ = 0, RD = 0
T3 ↓ รับข้อมูล · ปลดทั้งคู่
เขียน:
T1 ↑ วาง address
T1 ↓ MREQ = 0 · CPU ขับข้อมูลลงบัส
T2 ↓ WR = 0 ← ช้ากว่า MREQ เต็ม 1 T
T3 ↓ ปลด WR MREQ
T1 ↑ A0–A7 = port · A8–A15 = A (หรือ B)
T2 ↑ IORQ = 0 พร้อม RD หรือ WR
Tw wait อัตโนมัติ 1 state
Tw ↓ sample WAIT
T3 ↓ ปลดทั้งหมด
ต่างจาก memory: IORQ ลงที่ขอบขาขึ้น T2 และ WR ไม่หน่วง 1 T
MEMRD = NAND(MREQ⚬, RD⚬) = MREQ + RD
MEMWR = NAND(MREQ⚬, WR⚬) = MREQ + WR
IORD = NAND(IORQ⚬, RD⚬) = IORQ + RD
IOWR = NAND(IORQ⚬, WR⚬) = IORQ + WR
⚬ = วงกลมที่ขาเข้า · วาดแบบนี้ทุกเกต เหมือน LectureNote หน้า 57 — เขียนสมการเป็น OR ก็ได้คำตอบเดียวกัน (De Morgan)
| ขนาด | n | เข้าชิป | บล็อกเป็น hex | เหลือ decode |
|---|---|---|---|---|
| 1 KB | 10 | A9–A0 | 0400 | A15–A10 (6) |
| 2 KB | 11 | A10–A0 | 0800 | A15–A11 (5) |
| 4 KB | 12 | A11–A0 | 1000 | A15–A12 (4) |
| 8 KB | 13 | A12–A0 | 2000 | A15–A13 (3) |
| 16 KB | 14 | A13–A0 | 4000 | A15–A14 (2) |
| 32 KB | 15 | A14–A0 | 8000 | A15 (1) |
| 64 KB | 16 | A15–A0 | 10000 | — |
d = 16 − n − k
n = สายที่เข้าชิป (ชิป 2ⁿ ไบต์)
k = สายที่วงจร decode ใช้
จำนวนภาพ = 2ᵈ
พื้นที่ที่กิน = 2^(16−k) ไบต์
d = 0 ⇒ full decoding, ไม่มี foldback
d > 0 ⇒ partial, มีภาพซ้ำ 2ᵈ ภาพ
สาย don't care ที่บิต j
⇒ ภาพห่างกัน 2ʲ ไบต์
สำหรับ I/O ใช้ 8 บิต: จำนวนพอร์ตซ้ำ = 28−k
000 B 100 H
001 C 101 L
010 D 110 (HL)
011 E 111 A
dd qq
00 BC BC
01 DE DE
10 HL HL
11 SP AF
000 NZ 100 PO
001 Z 101 PE
010 NC 110 P
011 C 111 M
| รูปแบบ | คำสั่ง | รูปแบบ | คำสั่ง |
|---|---|---|---|
| 01 d s | LD r, r′ | 00 r 100 | INC r |
| 00 r 110 n | LD r, n | 00 r 101 | DEC r |
| 00 dd0 001 nn | LD dd, nn | 00 dd0 011 | INC dd |
| 10 000 s | ADD A, r | 11 qq0 101 | PUSH qq |
| 10 010 s | SUB r | 11 qq0 001 | POP qq |
| 10 100 s | AND r | 11 cc 010 nn | JP cc, nn |
| 10 101 s | XOR r | 11 cc 100 nn | CALL cc, nn |
| 10 110 s | OR r | 11 cc 000 | RET cc |
| 10 111 s | CP r | 11 p 111 | RST p |
Prefix: CB = จัดการบิต · ED = คำสั่งขยาย/บล็อก · DD = HL→IX · FD = HL→IY · แต่ละ prefix เพิ่ม M1 cycle อีกรอบ
| คำสั่ง | Hex | B | M | T | คำสั่ง | Hex | B | M | T |
|---|---|---|---|---|---|---|---|---|---|
| NOP | 00 | 1 | 1 | 4 | LD A,(BC) | 0A | 1 | 2 | 7 |
| HALT | 76 | 1 | 1 | 4 | LD A,(DE) | 1A | 1 | 2 | 7 |
| LD r,r′ | 40–7F | 1 | 1 | 4 | LD (BC),A | 02 | 1 | 2 | 7 |
| LD r,n | 06…3E | 2 | 2 | 7 | LD (DE),A | 12 | 1 | 2 | 7 |
| LD A,(HL) | 7E | 1 | 2 | 7 | LD A,(nn) | 3A | 3 | 4 | 13 |
| LD (HL),A | 77 | 1 | 2 | 7 | LD (nn),A | 32 | 3 | 4 | 13 |
| LD (HL),n | 36 | 2 | 3 | 10 | LD HL,(nn) | 2A | 3 | 5 | 16 |
| LD dd,nn | 01/11/21/31 | 3 | 3 | 10 | LD (nn),HL | 22 | 3 | 5 | 16 |
| ADD A,r | 80–87 | 1 | 1 | 4 | ADD A,(HL) | 86 | 1 | 2 | 7 |
| INC r | 04…3C | 1 | 1 | 4 | INC dd | 03/13/23/33 | 1 | 1 | 6 |
| XOR A | AF | 1 | 1 | 4 | CPL | 2F | 1 | 1 | 4 |
| JP nn | C3 | 3 | 3 | 10 | JP cc,nn | C2…FA | 3 | 3 | 10 |
| JR e | 18 | 2 | 3 | 12 | JR cc,e | 20/28/30/38 | 2 | 3 | 12 / 7 |
| DJNZ e | 10 | 2 | 3 | 13 / 8 | CALL nn | CD | 3 | 5 | 17 |
| RET | C9 | 1 | 3 | 10 | RET cc | C0…F8 | 1 | 3 | 11 / 5 |
| PUSH qq | C5/D5/E5/F5 | 1 | 3 | 11 | POP qq | C1/D1/E1/F1 | 1 | 3 | 10 |
| IN A,(n) | DB | 2 | 3 | 11 | OUT (n),A | D3 | 2 | 3 | 11 |
| IN r,(C) | ED 40…78 | 2 | 3 | 12 | OUT (C),r | ED 41…79 | 2 | 3 | 12 |
| LDIR | ED B0 | 2 | 5 | 21 / 16 | EX DE,HL | EB | 1 | 1 | 4 |
ค่าที่มี “/” คือ กรณีเงื่อนไขจริง / เงื่อนไขเท็จ
T = 1/f
f = 1 MHz ⇒ T = 1.00 µs
f = 2 MHz ⇒ T = 0.50 µs
f = 4 MHz ⇒ T = 0.25 µs ← ใช้บ่อยสุด
f = 8 MHz ⇒ T = 0.125 µs
เวลา = จำนวน T × T
d = ปลายทาง − (address ของ JR + 2)
ถ้า d ติดลบ ⇒ two's complement 8 บิต
−1 = FF −5 = FB
−2 = FE −6 = FA
−3 = FD −10 = F6
−4 = FC −16 = F0
ช่วงที่ทำได้: −128 … +127
โครงโปรแกรม:
LD B, n ; 7 T
LOOP: <ตัวถ่วง P T>
DJNZ LOOP ; 13 / 8 T
<ตัวถ่วง Q T>
HALT ; 4 T
N = (P + 13)·n + 6 + Q
ลูปซ้อน 2 ชั้น (LD C,nc / DEC C / JP NZ):
N = (20 + 14·nc)·nb + 6 + Q
ตรวจแล้วกับ Lab 3 ของอาจารย์: P=27, n=30, Q=28 ⇒ ได้ 1234 พอดี
| ตัวถ่วง | T | ตัวถ่วง | T |
|---|---|---|---|
| NOP | 4 | LD r,n | 7 |
| LD r,r′ | 4 | ADD A,n | 7 |
| INC/DEC dd | 6 | LD dd,nn | 10 |
| DJNZ (กระโดด) | 13 | DJNZ (รอบสุดท้าย) | 8 |
ทำ Q ไม่ได้ถ้าเป็น 1, 2, 3, 5 หรือ 9 — ให้ขยับ n ลง 1 แล้วคิดใหม่
LD B, 152 / LOOP: DJNZ LOOP / NOP / LD A,1 / LD A,2 / HALT
= 7 + 13×151 + 8 + 4 + 7 + 7 + 4 = 2000 T = 1000 µs ✓
cpu "z80.tbl" + hof "INT8" (directive ไม่กิน address)ORG ให้ตรงกับ ROM · ตั้ง SP ในช่วง RAMIN + OUT