ตรวจสอบกับแหล่งปฐมภูมิแล้ว

จุดที่สไลด์และเอกสารเรียนคลาดเคลื่อน

อาจารย์บอกเองว่าสไลด์ผิดเยอะ หน้านี้คือรายการที่ตรวจสอบแล้วจริง ๆ โดยเทียบกับ Zilog Z80 CPU User Manual (UM0080), Z8400/Z84C00 datasheet และ datasheet ของ IC ที่เกี่ยวข้อง — พร้อมลิงก์อ้างอิงทุกข้อ

ใช้หน้านี้ยังไง

ข้อที่ติดป้าย สำคัญ คือจุดที่ถ้าตอบตามเอกสารจะผิด ส่วน ควรรู้ คือรายละเอียดที่ถ้าเขียนถูกจะได้คะแนนความเข้าใจเพิ่ม และ พิมพ์ผิด คือคำผิดเล็ก ๆ ไม่กระทบคำตอบ
ข้อควรระวัง: ถ้าอาจารย์ยึดตามสไลด์ในการตรวจ ให้ตอบตามสไลด์แล้ววงเล็บกำกับว่า “ตาม datasheet จริงคือ …” จะปลอดภัยที่สุด

ก. ตัวเลข/ข้อความในเอกสารของคอร์ส

A1ตัวอย่างที่ 5.2 — เลข 9EH ควรเป็น 9FHสำคัญ
เอกสารเขียนว่า “คำสั่งเครื่อง (machine codes) 2 คำสั่ง 0011 1110 (3EH) และ 1001 1110 (9EH) ถูกเก็บไว้ที่ memory ตำแหน่ง 2000H และ 2001H”
ที่ถูกคือ 1001 1111 (9FH) — ตารางในหน้าเดียวกันเขียนไว้เองว่า 2001H : 1 0 0 1 1 1 1 1 → 9F และเนื้อความถัดไปก็เรียก “(9FH)” รวมทั้งรูป timing ก็วาด 9FH ⇒ เลข 9E เป็นการพิมพ์ผิดจุดเดียว

ทำไมสำคัญ: ถ้าลอกเลข 9E มาใช้ในคำตอบ รูป timing กับตัวเลขจะไม่ตรงกัน · และ 9EH คือ SBC A,(HL) ไม่ใช่ข้อมูล

A2ตัวอย่างที่ 5.3 — “เก็บที่ memory ตำแหน่ง 77H”สำคัญ
เอกสารเขียนว่า “…ใน Machine cycle ที่สอง Z80 จะคัดลอก byte 9FH จาก accumulator ไปไว้ที่ memory ตำแหน่ง 77H”
ที่ถูกคือ ไปไว้ที่ ตำแหน่ง 2350H ซึ่งเป็นค่าใน register HL
77H คือ opcode ของคำสั่ง LD (HL),A ไม่ใช่ address ปลายทาง — รูป timing ในหน้าเดียวกันก็วาด A15–A0 = 2350H ระหว่าง memory write ไว้ถูกแล้ว

ทำไมสำคัญ: ข้อ 5 ของข้อสอบให้วาด timing ถ้าเขียน address ผิดจะเสียคะแนนทั้งบล็อก

A3รูป timing บทที่ 5 ติดป้าย data bus ว่า “D15–D0”ควรรู้
เอกสารเขียนว่า แถวล่างสุดของรูปที่ 5.3 / 5.4 / 5.5 เขียนว่า D15–D0
ที่ถูกคือ D7–D0 — Z80 มี data bus แค่ 8 บิต (ขา 7, 8, 9, 10, 12, 13, 14, 15) ส่วนที่มี 16 เส้นคือ address bus A15–A0

ถ้าลอกไปวาดในข้อสอบจะดูเหมือนไม่เข้าใจสถาปัตยกรรมพื้นฐาน — ให้เขียน D7–D0 เสมอ

A4ตารางเทียบ address บทที่ 6.2 ไม่สอดคล้องกับวงจรที่วาดควรรู้
เอกสารเขียนว่า
Address ที่ CPU ใช้   Address ภายใน memory chip
   3000                    1000
   3FFF                    1FFF
   4000                    0000
   4FFF                    0FFF
ปัญหา ตัวอย่างในหน้านั้นคือ ROM 4 KB ที่ 0000–0FFF และ RWM 4 KB ที่ 1000–1FFF โดย decode A15–A12 ครบ
  • ชิป 4 KB มี address ภายในแค่ 000H–FFFH (12 บิต) จึงเป็นไปไม่ได้ที่จะมี “address ภายใน = 1000–1FFF”
  • ด้วยวงจรที่วาดไว้ CPU address 3000H และ 4000H ไม่ตรงกับชิปใดเลย

ให้ยึดหลักแทน: address ภายในชิป = An−1–A0 ของ address ที่ CPU ส่งมา เช่น CPU ใช้ 1234H กับ RWM 4 KB ที่ 1000H ⇒ ภายในชิปคือ 234H

A5เบอร์ EPROM “27120” ไม่มีอยู่จริงพิมพ์ผิด
เอกสารเขียนว่า EPROM: 2716, 2732, 2764, 27120, 27256
ที่ถูกคือ 27128 (16K × 8) — ลำดับเบอร์คือ 2716 (2K) → 2732 (4K) → 2764 (8K) → 27128 (16K) → 27256 (32K) → 27512 (64K)
ตัวเลขหลัง 27 คือขนาดเป็น กิโลบิต: 27128 = 128 Kbit = 16 KB
A6“74LD138 / 74LD139” — ตระกูลชิปพิมพ์ผิดพิมพ์ผิด
เอกสารเขียนว่า “2-line-to-4-line decoder 1-of-4 74LD139, 155, 156 · 3-line-to-8-line decoder 1-of-8 74LD138”
ที่ถูกคือ 74LS138, 74LS139, 74LS155, 74LS156 — “LS” = Low-power Schottky ไม่มีตระกูล “LD”

ข. รายละเอียด timing ที่ต้องดูจาก datasheet

ส่วนนี้ไม่ได้แปลว่าเอกสารเขียนผิดเสมอไป แต่เป็นจุดที่รูปวาดแบบย่อมักละไว้ หรือคนจำต่อ ๆ กันมาผิด — ถ้าเขียนถูกในข้อ 5 จะได้เปรียบมาก

B1MREQ ลงสองครั้งใน M1 cycle ไม่ใช่ครั้งเดียวสำคัญ
รูปย่อมักวาดว่า MREQ ลงพัลส์เดียวช่วง T1–T3 แล้วขึ้นยาวจนจบ
ของจริงตาม UM0080 มี 2 พัลส์
พัลส์ที่ 1 (fetch): ขอบขาลง T1 → ขอบขาขึ้น T3
พัลส์ที่ 2 (refresh): ขอบขาลง T3 → ขอบขาลง T4
โดยที่ RD ไม่ลงตอน refresh — Zilog เขียนไว้ว่า “To prevent data from different memory segments from being gated onto the data bus, an RD signal is not generated during this refresh period.”

นี่คือเหตุผลว่าทำไมสัญญาณ MEMRD = MREQ + RD จึงไม่ active ตอน refresh — ดูได้จากไดอะแกรมใน ข้อ 5

B2IORQ ลงที่ขอบ ขาขึ้น ของ T2สำคัญ
มักจำกันว่า IORQ ลงที่ขอบขาลงของ T2 เหมือน MREQ ที่ลงตอนขาลงของ T1
ของจริง ลงที่ขอบขาขึ้นของ T2 — ช้ากว่า memory cycle ครึ่ง T-state
ยืนยันจากชื่อพารามิเตอร์ AC ใน Z8400 datasheet: TdCr(IORQf) = “Clock Rise to IORQ Fall delay”
และ RD/WR ก็ลงพร้อมกันที่ขอบเดียวกันนี้

ที่ขอบขาลงของ T2 จริง ๆ คือ INTACK — interrupt acknowledge ใช้พารามิเตอร์ TdM1f(IORQf) และแทรก wait 2 state ไม่ใช่ 1

B3WR ช้ากว่า MREQ เต็ม 1 T-state (ตรงนี้เอกสารเขียนถูก)ควรรู้
เอกสารของคอร์สเขียนถูกแล้ว “รอให้ 1 T-state ผ่านไป (หลัง MREQ active) เพื่อให้ตำแหน่งที่จะเขียนข้อมูลมีความเสถียร แล้ว Z80 จะทำให้สัญญาณ WR active”
แต่คนมักจำสลับเป็น “WR ช้ากว่า MREQ ครึ่ง T-state”

ตัวเลข “ครึ่ง T” มีจริง แต่เป็นตอนปลด: UM0080 เขียนว่า WR “goes inactive one-half T state before the address and data bus contents are changed” — เพื่อรับประกัน hold time
ส่วนใน I/O write ไม่มีการหน่วงนี้เลย WR ลงพร้อม IORQ

B4M1 กับ Memory Read ปลดสัญญาณคนละขอบกันควรรู้
ของจริง M1 cycle: MREQ และ RD ปลดที่ขอบขาขึ้นของ T3 (เพื่อรีบปล่อยบัสให้ refresh)
Memory read ธรรมดา: ปลดที่ขอบขาลงของ T3
ยืนยันได้จากที่ Z8400 datasheet มีทั้ง TdCr(MREQr) และ TdCf(MREQr) — ถ้าใช้ขอบเดียวกันก็คงมีพารามิเตอร์เดียว

เอกสารของคอร์สเขียนว่า “หลังจากขาลงของ T3 ใน Memory read cycle สัญญาณควบคุมทั้งสองจะกลับไปเป็น high” — ถูกต้องสำหรับ memory read และ “หลังจากขาขึ้นของ T3 … inactive สัญญาณควบคุมต่าง ๆ” — ถูกต้องสำหรับ M1 · จุดนี้เอกสารแม่นแล้ว

B5A8–A15 ระหว่าง I/O cycle ไม่ได้ว่างสำคัญ
รูปในสไลด์วาดว่า ระหว่าง M3 (I/O Write) แถว A15–A8 ถูกปล่อยว่างหรือไม่ระบุ
ของจริง
IN A,(n) / OUT (n),AA0–A7 = nA8–A15 = ค่าใน A
IN r,(C) / OUT (C),rA0–A7 = CA8–A15 = ค่าใน B
บล็อก I/O (INI, OUTI, …)A0–A7 = CA8–A15 = ค่าใน B
Sean Young, The Undocumented Z80 Documented: “IN A,(n) and OUT (n),A put A×256+n on the address bus”

แปลว่า Z80 ไม่ได้มีแค่ 256 พอร์ต ถ้าจะ decode 16 บิตก็ทำได้ (ZX Spectrum และ Amstrad CPC ทำจริง) แต่ในข้อสอบให้ decode A0–A7 ตามปกติ แล้วเขียนกำกับว่า A8–A15 มีค่าอะไร — ได้คะแนนความเข้าใจแน่นอน

B6Register R เป็น 8 บิต ไม่ใช่ 7 บิตควรรู้
มักเขียนกันว่า “R <Memory Refresh register> = ใช้ 7 bit only”
ของจริงตาม UM0080 R เป็น register 8 บิตเต็ม — “Seven bits of this 8-bit register are automatically incremented after each instruction fetch. The eighth bit remains as programmed.”
คือ บิต 0–6 นับเอง ส่วนบิต 7 คงค่าเดิม เปลี่ยนได้ด้วย LD R,A เท่านั้น
เหตุผลเชิงประวัติศาสตร์: DRAM 16 Kbit ในยุคนั้นจัดเป็นเมทริกซ์ 128×128 จึงต้องการ refresh address แค่ 7 บิต

บนบัสตอน refresh: A0–A6 = R บิต 0–6, A7 = R บิต 7, A8–A15 = register I — ทั้งคู่ I:R ถูกขับออกจริง

B7คำสั่ง HALT ไม่ได้หยุด CPUควรรู้
มักเข้าใจกันว่า HALT = CPU หยุดนิ่ง บัสหยุดหมด
ของจริง UM0080: “While in the HALT state, the processor executes NOPs to maintain memory refresh logic.”
CPU ยังวน M1 cycle ต่อไปเรื่อย ๆ — R ยังนับ, DRAM ยังได้ refresh, ขา HALT ลงเป็น 0 ออกจากสถานะนี้ได้ด้วย interrupt หรือ reset เท่านั้น
B8WAIT ถูก sample แค่ขอบเดียว ไม่ได้เฝ้าตลอดควรรู้
ของจริง Zilog Z80 Technical Manual: “During T2 and every subsequent Tw, the CPU samples the WAIT line with the falling edge of φ.”
⇒ ถ้า WAIT ไม่ low ตรงขอบนั้นพอดี จะไม่มีการแทรก wait state ไม่ว่าจะ low ตอนอื่นก็ตาม
ใน I/O cycle จุด sample เลื่อนไปที่ขอบขาลงของ Tw
B9I/O cycle มี Tw แถมเสมอ — และเหตุผลที่ต้องมีควรรู้
เอกสารของคอร์สเขียนถูกแล้ว “Z80 จะเพิ่ม Tw 1 state สำหรับ I/O โดยอัตโนมัติ”
เหตุผลตาม UM0080: “the period from when the IORQ signal goes active until the CPU must sample the WAIT line is short. Without this extra state, sufficient time does not exist for an I/O port to decode its address and activate the WAIT line if a wait is required.”

เหตุผลนี้เชื่อมโยงกับ B2 พอดี: เพราะ IORQ ลงช้ากว่า (ขอบขาขึ้น T2) เวลาที่เหลือก่อน sample WAIT จึงเหลือแค่ครึ่ง T — Zilog จึงยืดให้เป็น 1.5 T ด้วยการแทรก Tw

ค. จุดพลาดฝั่งฮาร์ดแวร์

C1รวมสัญญาณ active-low ต้องวาด NAND ที่มีวงกลมขาเข้า ไม่ใช่ AND เปล่าสำคัญ
มักเขียนผิดเป็น “IORD = IORQ AND RD จึงวาด AND gate เปล่า ๆ”
ที่ถูกคือ เจตนาถูก (ต้อง active ทั้งคู่) แต่รูปที่วาดคือ NAND ที่มีวงกลมทั้งสองขาเข้า
NOT( NOT A · NOT B ) = A + B → 0 + 0 = 0 · กรณีอื่นได้ 1 ⇒ ตรงกับ active-low พอดี
LectureNote หน้า 57 วาดแบบนี้ทั้งสี่สัญญาณ

ระวังสองแบบที่ผิด: AND เปล่า ๆ จะ active ตอน input เป็น 1 ทั้งคู่ (กลับด้าน) และ NAND ที่ไม่มีวงกลมขาเข้า จะให้ output = 1 ตอนที่ควร active → กลายเป็นสัญญาณ active-HIGH ทันที
เขียนสมการเป็น + (OR) ได้ ไม่ผิด — แต่ตอนวาดรูปต้องมีวงกลมให้ครบ

C274LS138 — C คือ MSB และ MREQ ห้ามต่อ G1สำคัญ
ผิดที่เจอบ่อย ต่อ A13→C, A14→B, A15→A (สลับหัวท้าย) หรือเอา MREQ ไปเข้า G1
ที่ถูกคือ C (ขา 3) = MSB ⇒ A15→C, A14→B, A13→A
G1 (ขา 6) เป็น active HIGH ⇒ ถ้าต่อ MREQ ที่นี่ ตรรกะจะกลับด้าน: decoder จะ enable เฉพาะตอนที่ ไม่มี memory cycle และปิดตอนที่ควรทำงาน ⇒ ชิปไม่เคยถูกเลือกตอนที่ต้องการ แถมยังเสี่ยงบัสชนตอนอื่น
ต้องต่อที่ G2A (ขา 4) หรือ G2B (ขา 5) แทน
เงื่อนไข enable = G1 · G2A · G2B

ถ้าสลับ C↔A วงจรยัง “ทำงาน” แต่แผนที่จะกลับบิต — Y1 กลายเป็น 8000–9FFF แทนที่จะเป็น 2000–3FFF · เป็นบั๊กที่หายากมากเวลาดีบัก

C36264 มีขาเลือกชิป 2 ขา และ CS2 เป็น active HIGHควรรู้
ของจริง 6264 (8K × 8 SRAM, DIP-28) มี CS1 ที่ขา 20 (active LOW) และ CS2 ที่ขา 26 (active HIGH)
ต้องต่อ CS2 ไปที่ +5V ไม่ใช่กราวด์ ไม่งั้นชิปถูกปิดตลอดเวลา

62256 ไม่ใช่ drop-in ของ 6264 — ขา 1 ของ 62256 เป็น A14 (6264 เป็น NC) และขา 26 เป็น A13 (6264 เป็น CS2)

C4อย่าเอา WE มาจาก output ของ decoderควรรู้
หลักการ WE ต้องมาจาก WR ของ Z80 (หรือ MEMWR) และ OE ต้องมาจาก RD ส่วน decoder ใช้กับ CE เท่านั้น
เพราะ output ของ decoder มี glitch ตอน address กำลังเปลี่ยน — ถ้าเอาไปคุมการเขียนจะเขียนข้อมูลมั่ว Zilog ออกแบบ WR ให้ active เฉพาะตอน data นิ่งแล้วโดยเฉพาะ
C52716 มีขา OE อยู่แล้ว — ไม่ใช่ 2732 ที่เพิ่มเข้ามาพิมพ์ผิด
ของจริง 2716 มี CE (ขา 18) และ OE (ขา 20) แยกกันอยู่แล้ว โดยมี VPP อยู่ขา 21
สิ่งที่ 2732 เปลี่ยนคือ ยุบ VPP เข้าไปรวมกับขา OE เพื่อปลดขา 21 ออกมาใช้เป็น A11 — จึงได้ความจุ 4 KB บนแพ็กเกจ 24 ขาเท่าเดิม
C674LS373 กับ 74LS273 ใช้แทนกันตรง ๆ ไม่ได้ควรรู้
ต่างกันตรงนี้
74LS273D flip-flop · CLK ขอบขาขึ้น (ขา 11)มี MR (ขา 1) ต่อ RESET ได้
74LS373Transparent latch · LE active HIGH (ขา 11)มี OE ทำ tri-state ได้
LE ของ 74LS373 เป็น active HIGH — ต้องวาดเป็น AND ที่มีวงกลมเฉพาะขาเข้า (ไม่มีวงกลมขาออก) ตามรูป 7.3 ใน LectureNote
⇒ สำหรับพอร์ตเอาต์พุตธรรมดา 74LS273 สะดวกกว่า เพราะได้ค่าเริ่มต้นตอนเปิดเครื่องฟรี ๆ

แหล่งอ้างอิง

หมายเหตุถึงความไม่แน่นอน

มีจุดหนึ่งที่แม้แต่แหล่งปฐมภูมิก็ไม่ชี้ชัด: ค่าใน R ที่ปรากฏบนบัสตอน refresh เป็นค่าก่อนหรือหลังเพิ่ม 1 — Sean Young เขียนว่า “It is unclear whether the Z80 increases the R register before or after putting IR on the bus” · การจำลอง netlist ชี้ว่าเป็นค่าก่อนเพิ่ม แต่ไม่ใช่ข้อพิสูจน์
ประเด็นนี้ไม่มีผลกับข้อสอบ — แค่บอกไว้เพื่อความซื่อตรงว่าเราไม่ได้ตอบเกินกว่าที่หลักฐานรองรับ

← ข้อ 6 · RAM ก่อน สรุปแผ่นเดียว →