อ่านรอบสุดท้ายก่อนเข้าห้อง

สรุปแผ่นเดียว

ทุกอย่างที่ต้องจำ ไม่มีคำอธิบายยาว ๆ — ถ้าตรงไหนงงให้กลับไปดูหน้าของข้อนั้น

1. ตารางสัญญาณ Machine Cycle

Machine CycleM1MREQ IORQRDWRT
Opcode Fetch (M1)001014
Memory Read101013
Memory Write101103
I/O Read110014
I/O Write110104
Interrupt Acknowledge010116
NMI Acknowledge001015
Bus Acknowledge1ZZZZ—

0 = active · 1 = inactive · Z = high impedance · I/O cycle ยาว 4 T เพราะ Z80 แทรก Tw ให้เอง

2. ขอบสัญญาณสำคัญ

M1 Opcode Fetch (4 T)

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

Memory Read / Write (3 T)

อ่าน:
T1 ↑  วาง address
T1 ↓  MREQ = 0, RD = 0
T3 ↓  รับข้อมูล · ปลดทั้งคู่

เขียน:
T1 ↑  วาง address
T1 ↓  MREQ = 0 · CPU ขับข้อมูลลงบัส
T2 ↓  WR = 0   ← ช้ากว่า MREQ เต็ม 1 T
T3 ↓  ปลด WR MREQ

I/O Read / Write (4 T)

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

สัญญาณรวม — วาดเป็น NAND ที่มีวงกลมขาเข้า

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)

3. ขนาดชิป ↔ สาย address

ขนาดnเข้าชิปบล็อกเป็น hexเหลือ decode
1 KB10A9–A00400A15–A10 (6)
2 KB11A10–A00800A15–A11 (5)
4 KB12A11–A01000A15–A12 (4)
8 KB13A12–A02000A15–A13 (3)
16 KB14A13–A04000A15–A14 (2)
32 KB15A14–A08000A15 (1)
64 KB16A15–A010000—

สูตร Foldback

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

4. รหัสสำหรับหา opcode

r (8 บิต)

000 B    100 H
001 C    101 L
010 D    110 (HL)
011 E    111 A

dd / qq

     dd    qq
00   BC    BC
01   DE    DE
10   HL    HL
11   SP    AF

cc

000 NZ   100 PO
001 Z    101 PE
010 NC   110 P
011 C    111 M
รูปแบบคำสั่งรูปแบบคำสั่ง
01 d sLD r, r′00 r 100INC r
00 r 110 nLD r, n00 r 101DEC r
00 dd0 001 nnLD dd, nn00 dd0 011INC dd
10 000 sADD A, r11 qq0 101PUSH qq
10 010 sSUB r11 qq0 001POP qq
10 100 sAND r11 cc 010 nnJP cc, nn
10 101 sXOR r11 cc 100 nnCALL cc, nn
10 110 sOR r11 cc 000RET cc
10 111 sCP r11 p 111RST p

Prefix: CB = จัดการบิต · ED = คำสั่งขยาย/บล็อก · DD = HL→IX · FD = HL→IY · แต่ละ prefix เพิ่ม M1 cycle อีกรอบ

5. opcode ที่ท่องไว้จะได้เร็ว

คำสั่งHexBMTคำสั่งHexBMT
NOP00114LD A,(BC)0A127
HALT76114LD A,(DE)1A127
LD r,r′40–7F114LD (BC),A02127
LD r,n06…3E227LD (DE),A12127
LD A,(HL)7E127LD A,(nn)3A3413
LD (HL),A77127LD (nn),A323413
LD (HL),n362310LD HL,(nn)2A3516
LD dd,nn01/11/21/313310LD (nn),HL223516
ADD A,r80–87114ADD A,(HL)86127
INC r04…3C114INC dd03/13/23/33116
XOR AAF114CPL2F114
JP nnC33310JP cc,nnC2…FA3310
JR e182312JR cc,e20/28/30/382312 / 7
DJNZ e102313 / 8CALL nnCD3517
RETC91310RET ccC0…F81311 / 5
PUSH qqC5/D5/E5/F51311POP qqC1/D1/E1/F11310
IN A,(n)DB2311OUT (n),AD32311
IN r,(C)ED 40…782312OUT (C),rED 41…792312
LDIRED B02521 / 16EX DE,HLEB114

ค่าที่มี “/” คือ กรณีเงื่อนไขจริง / เงื่อนไขเท็จ

6. คำนวณเร็ว ๆ

เวลา

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

Displacement ของ JR / DJNZ

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

6.5 โปรแกรมหน่วงเวลา (Delay)

สมการเดียวที่ต้องจำ

โครงโปรแกรม:
        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 พอดี

ขั้นตอนทำข้อนี้

  1. T = 1/f · N = เวลาเป็น µs × f เป็น MHz
  2. เช็กว่าลูปเดียวพอไหม (สูงสุด 3,334 T)
  3. เลือก P ให้ (P+13) หารง่าย เช่น 20 หรือ 40
  4. แก้หา n แล้วเอาเศษไปทำเป็น Q
  5. เขียนตารางบวกกลับให้ได้ N พอดี
  6. คูณกลับเป็นเวลา แล้วสรุป
ตัวถ่วงTตัวถ่วงT
NOP4LD r,n7
LD r,r′4ADD A,n7
INC/DEC dd6LD dd,nn10
DJNZ (กระโดด)13DJNZ (รอบสุดท้าย)8

ทำ Q ไม่ได้ถ้าเป็น 1, 2, 3, 5 หรือ 9 — ให้ขยับ n ลง 1 แล้วคิดใหม่

คำตอบสำเร็จรูป: 1 ms ที่ 2 MHz = 2,000 T
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 ✓

7. ลำดับขั้นตอบข้อสอบ

ข้อ 1 — วาดวงจร (25)

  1. ทำตารางแผนที่ก่อน (ชิป/ขนาด/ช่วง/บิตที่ decode)
  2. วาด Z80 + address bus + data bus
  3. วาดเกต 4 ตัวสร้าง MEMRD MEMWR IORD IOWR
  4. วาด decode → CE ของแต่ละชิป (เขียนสมการกำกับ)
  5. ต่อ OE ← MEMRD, WE ← MEMWR
  6. I/O: decode A7–A0 → latch (out) / buffer (in)
  7. เขียนช่วง address และเลขพอร์ตกำกับทุกกล่อง · ขีดเส้นบนทุกสัญญาณ active-low

ข้อ 2 / 6 — อธิบาย + Foldback (20 + 10)

  1. ตารางเงื่อนไขการเลือกชิปแต่ละตัว
  2. ยกตัวอย่าง address จริง 1 ค่า ไล่บิตให้ดู (A บน = decode, A ล่าง = ในชิป)
  3. คำนวณ d = 16 − n − k ของทุกชิป
  4. สรุปว่ามี/ไม่มี foldback · ถ้ามีให้ลิสต์ช่วงของทุกภาพ
  5. บอกช่วงที่ยังว่าง และผลกระทบ
  6. ข้อ 6 เพิ่ม: RESET → PC = 0000H ⇒ RAM ที่ 0000H ทำให้บูตไม่ขึ้น + เสีย RST/NMI vector

ข้อ 3 / 4 — โค้ด + Opcode (20 + 25)

  1. ขึ้นต้นด้วย cpu "z80.tbl" + hof "INT8" (directive ไม่กิน address)
  2. ใส่ ORG ให้ตรงกับ ROM · ตั้ง SP ในช่วง RAM
  3. ให้โค้ดมีครบ: อ่าน/เขียน memory + IN + OUT
  4. ถ้าโจทย์เป็น delay ให้ใช้สมการหัวข้อ 6.5 + ตารางบวกกลับ
  5. ใส่ comment ทุกบรรทัด
  6. ตาราง 6 คอลัมน์: Address / Machine code / Instruction / Bytes / M / T
  7. ระวัง little-endian และ displacement ของ JR/DJNZ
  8. ตรวจ: address สุดท้าย − address แรก = ผลรวมไบต์

ข้อ 5 — Timing (20)

  1. เลือก 4 คำสั่งให้ครบทั้ง 5 ชนิด machine cycle
  2. กำหนด f (ใช้ 4 MHz) และค่าข้อมูลเอง แล้วเขียนบอกว่ากำหนดอะไรไว้
  3. แถวที่ต้องมี: CLK, A15–A0, D7–D0, M1, MREQ, IORQ, RD, WR, RFSH
  4. เขียนกำกับหัวแต่ละบล็อกว่าเป็น machine cycle อะไร กี่ T
  5. อย่าลืม: MREQ พัลส์ที่ 2 ตอน refresh · Tw ใน I/O · WR หน่วง 1 T
  6. สรุปเวลารวมตอนท้าย

8. กับดักที่เสียคะแนนฟรี

✕ ลืมขีดเส้นบนสัญญาณ active-low
✕ เขียน operand 16 บิตแบบไบต์สูงก่อน (ต้องต่ำก่อน)
✕ ใช้ AND gate รวมสัญญาณ active-low (ต้อง OR)
✕ เอา MREQ ต่อ G1 ของ 74LS138 (ต้อง G2A/G2B)
✕ สลับ C กับ A ของ 74LS138 (C คือ MSB)
✕ ลืมว่า I/O cycle ยาว 4 T ไม่ใช่ 3 T
✕ วาด MREQ พัลส์เดียวใน M1 cycle
✕ คิด d ของ JR จาก address ของ JR โดยไม่ +2
✕ ลืมตั้ง SP ก่อนใช้ CALL/PUSH
✕ เขียนว่า D15–D0 (Z80 มีแค่ D7–D0)
✕ ต่อ CS2 ของ 6264 ลงกราวด์ (เป็น active HIGH)
✕ เอา WE มาจาก decoder แทนที่จะมาจาก WR
✕ คิด DJNZ เป็น 13 T ทุกรอบ (รอบสุดท้าย 8 T)
✕ เขียนโปรแกรม delay แต่ไม่แสดงวิธีคำนวณ
✕ ลืมเขียนชื่อ-รหัสทุกหน้า (หน้าที่ไม่เขียนไม่ตรวจ)
← สไลด์ผิด กลับหน้าแรก