[ บทความ : เรียนรู้ z80 ] ตอนที่ 14 เรื่อง คำสั่งจัดการกับบิต |
เรียนรู้ Z80 ตอนที่ 14
คำสั่งจัดการกับบิต
คำสั่งกลุ่มนี้ จะเป็นการติดต่อกับข้อมูลในระดับบิต คือ เราสามารถตรวจสอบได้ว่า ค่า ณ บิตที่เราต้องการนั้น ใช่ 0 หรือ 1 หรือไม่ (ตรวจสอบด้วยคำสั่งกลุ่ม BIT) ... ซึ่งถ้าใช่หรือไม่ใช่ตามที่เราต้องการ เราก็สามารถกำหนดให้มันเป็น 0 (ใช้คำสั่ง RES) หรือ 1 (ใช้คำสั่ง SET) ก็ได้ ... ตัวอย่างเช่น ... เราต้องการจะทราบว่า ค่าใน register A นั้น เป็นเลขจำนวนแบบคี่ หรือคู่ ... วิธีการที่เราจะใช้ก็คือ ดูว่า บิตหลักแรก หรือบิต 0 นั้น มีค่าเป็น 1 หรือไม่ เราก็ใช้คำสั่ง BIT ในการทดสอบค่า ณ บิต หลักที่ 0 แล้วเราก็ดูผลตอบกลับจาก flag ซึ่ง ถ้า Zero flag มีค่าเป็น 1 ก็หมายความว่า บิตที่เราทดสอบนั้น มีค่าเป็น 0 แต่ถ้า Zero flag มีค่าเป็น 0 ก็แสดงว่า บอตนั้น มีค่าเป็น 1 นั่นเอง ... เรามาดูรูปแบบของคำสั่ง BIT, SET และ RES กันก่อนครับ
ตาราง 14-1 คำสั่งตรวจสอบค่าของบิตที่ b ของข้อมูล
Instruction Source/Target Flag Operation BIT b, r Z, N=0, H=1 Z <- complement of bit no.b in register r. BIT b, (HL) Z, N=0, H=1 Z <- complement of bit no.b in (HL). BIT b, (IY+d) Z, N=0, H=1 Z <- complement of bit no.b in (IY + d). BIT b, (IX + d) Z, N=0, H=1 Z <- complement of bit no.b in (IX + d).
ตาราง 14-2 คำสั่งกำหนดให้ค่าของบิตที่ b เป็น 1
Instruction Source/Target Flag Operation SET b, r ไม่มีผลกับแฟล็ก Bit no.b in r <- 1. SET b, (HL) ไม่มีผลกับแฟล็ก Bit no.b in (HL) <- 1. SET b, (IY+d) ไม่มีผลกับแฟล็ก Bit no.b in (IY + d) <- 1. SET b, (IX + d) ไม่มีผลกับแฟล็ก Bit no.b in (IX + d) <- 1.
ตาราง 14-3 คำสั่งกำหนดให้ค่าของบิตที่ b เป็น 0
Instruction Source/Target Flag Operation RES b, r ไม่มีผลกับแฟล็ก Bit no.b in r <- 0. RES b, (HL) ไม่มีผลกับแฟล็ก Bit no.b in (HL) <- 0. RES b, (IY+d) ไม่มีผลกับแฟล็ก Bit no.b in (IY + d) <- 0. RES b, (IX + d) ไม่มีผลกับแฟล็ก Bit no.b in (IX + d) <- 0.
หมายเหตุ
r คือ B,C,D,E,H หรือ L
s คือ (HL), (IX + d), (IY + d), B,C,D,E,H หรือ L
b คือ หมายเลขหลักของบิตที่เราต้องการ อันได้แก่ 0,1,2,3,4,5,6 หรือ 7
ตัวอย่างโปรแกรมสำหรับ ET-BOARD V6 เป็นดังนี้เลยครับ
ผลลัพธ์ที่ได้สำหรับ Et-BOARD V6 เป็นดังนี้
,ตัวอย่างโปรแกรมสำหรับ ET-BOARD V3 เป็นดังนี้เลยครับ
ผลลัพธ์ที่ได้สำหรับ Et-BOARD V3.5 เป็นดังนี้
,ส่วนหลักการทำงานของโปรแกรม ก็มีอยู่ว่า เรากำหนดให้ A มีค่าจาก 7 ไปยัง 0 แล้วเราก็ตรวจสอบว่า บิตแรกของ A (บิตหมายเลข 0) นั้นถ้าเป็น 1จะทำการ RES บิต 3 และ 7 ของ Register D แต่ถ้าเป็น 0 จะทำการ SET บิต 3 และ 7 ของ D แล้ว จึงนำค่าของ D ไปแสดงที่พอร์ตของ Z80 (เราใช้ LED เป็นส่วนแสดงผล) ดังนั้น ผลที่ได้ก็คือ ถ้าบิต 0 ของ A เป็น 1 ที่ LED จะดับทั้งหมด แต่ถ้าค่าบิต 0 ของ A เป็น 0 ที่ LED จะสว่างเพียง 2 ดวง ดังรูปด้านบนนั่นเองครับ ... มาดู Flowchart กันครับ
เป็นอันจบคำสั่งเกี่ยวกับบิต ของ Z80 ไปเรียบร้อยแล้ว ... คราวหน้าจะเป็นคำสั่งที่เกี่ยวกับ ลอจิก ... มาถึงตรงนี้ เราก็ใกล้จะจบบทความ Z80 เข้าไปทุกทีแล้วนะครับ ... พอหมดบทความชุดนี้ ที่เหลือ ก็จะเป็นการนำ ตัวอย่างของทาง ETT มาให้ดูเป็นตัวอย่างครับ .... สัปดาห์นี้ขอจบเท่านี้ก่อน เจอกันคราวหน้าครับ