[ บทความ : เรียนรู้ z80 ] ตอนที่ 15 เรื่อง คำสั่งทำงานกับลอจิก

เรียนรู้ Z80 ตอนที่ 15

คำสั่งทำงานกับลอจิก

และแล้วก็ถึง คำสั่งชุดสำคัญล่ะครับ ทั้งนี้เพราะ เรานิยมใช้คำสั่งทางด้าน ลอจิก ในการเขียนโปรแกรม ค่อนข้างบ่อยเลยล่ะครับ ... แต่ข้อเสียอย่างนึงของ Z80 ก็คือ มันทำคำสั่งทางด้าน ลอจิก ได้เพียง 8 บิตเท่านั้น ดังนั้น ถ้าจะทำการเปรียบเทียบ หรือกระทำทางลอจิก แบบ ที่มากกว่า 8 บิต เราจะต้องเขียนเอาเองล่ะครับ .... มาดูรูปแบบของคำสั่งกันก่อนครับ

ตาราง 15-1 คำสั่งเกี่ยวกับลอจิก

Instruction
Source/Target
Flag
Operation
AND
s
C=0,Z, P, S=1, N=0, H
A <- A and s
OR
s
C=0,Z, P, S=1, N=0, H
A <- A or s
XOR
s
C=0,Z, P, S=1, N=0, H
A <- A xor s
CP
s
C,Z, V, S, N=1, H
A-s , ทำหน้าที่เปรียบเทียบระหว่าง A กับ s และไม่ทำให้ค่าใน A เสียหาย
CPL
ไม่มี
N=1,H=1
A <- not A , เป็นการทำ complement
NEG
ไม่มี
C,Z, V, S, N=1, H
A <- 0 - A , ทำการหน้า 2's complement ของ A

หมายเหตุ

s คือ (HL), (IX + d), (IY + d), B,C,D,E,H หรือ L

ตารางค่าความจริง

ตัวอย่าง 1

ตัวอย่างแรกเลยนะครับ เป็นการทดลองทำการลบค่า ด้วยการบวก (งงไหม .. ก็เอาตัวที่จะมาลบ ไปทำเป็น 2's complement แล้วก็ เอาค่าที่ได้ไปบวกกับตัวตั้งไงครับ) ... ส่วนตัวอย่างจะหาค่า 8-7 = ? หรือเขียนอีกอย่างหนึ่งก็คือ 8 + (-7) = ? นั่นเอง ... มาดู source code กันครับ

ตามด้วยผลลัพธ์ครับ
ทำไม LED ติดหลอดเดียวใช่ไหมครับ ... ทั้งนี้เพราะผลลัพธ์ คือ 1 เขียนเป็นเลขฐานสองได้เป็น 00000001 ไงครับ หลอด LED เลยติดหลอดเดียวตามหลัก ของเลขฐานสองครับ ...

ตัวอย่างที่ 2

ตัวอย่างนี้เป็นการสั่งให้ LED ทั้งแปดดวง สว่าง และดับ สลับกันไป ... แต่เดิมนั้น เราใช้ค่า FF ในการคำนวณหาค่า ผลลัพธ์ แต่คราวนี้เราเปลี่ยนมาใช้คำสั่ง XOR โดยตอนเริ่ม ผมให้ D เป็น 000000b แล้วก็เอามา XOR กับ 11111111b ผลที่ได้คือ D = 11111111b ในรอบต่อมา นำมา XOR อีกครั้ง จะได้ผลออกมาเป็น 00000000b แล้วพอเอามา XOR อีกรอบ ก็ได้เป็น 11111111b สลับกันไปมาเรื่อยๆ ครับ ... code ของโปรแกรมเป็นดังนี้ครับ

ส่วนการทำงานก็จะเป็นดังรูปด้านล่าง

ตัวอย่างที่ 3

ตัวอย่างสุดท้ายเป็นการเขียนโปรแกรมที่ซับซ้อนกว่าเดิมนิดหน่อย คือ ผมต้องการให้ที่ LED แสดงผลเป็น 01010101 (0 แทนดับ, 1 แทนสว่าง) สลับไปมากับ 10101010 โดยมีข้อกำหนดว่า ถ้า A เป็นเลขคู่ ที่ LED จะแสดงเป็น 01010101 และถ้า A เป็นเลขคี่ ที่ LED จะแสดง 10101010 แล้วก็ทำการบวก A ด้วย 1 ไปเรื่อยๆ (เป็นผล ทำให้ LED ติดเป็น 01010101 กับ 10101010 สลับกันไปเรื่อยๆ นั่นเอง) ... โปรแกรมเขียนอย่างนี้เลยล่ะครับ

ผลลัพธ์คือ

... ฟู่ ... จบแล้วครับ บทความตอนที่ 15 เรื่อง Z80 กับคำสั่ง Logic จะเห็นว่า โปรแกรมตัวอย่างรอบนี้มีถึง 3 ตัวอย่าง เลยใช่ไหมครับ ... ทำให้ผมไม่ได้ใส่ flowchart .. หวังว่าคงอ่านโปรแกรมได้ไม่ยากครับ เพราะมันเหมือนกับ บทความที่ผ่านๆ มา เพียง แต่ผมเปลี่ยนหลายๆ คำสั่งให้เหมาะสมกับคำสั่งที่เรากล่าวถึงเท่านั้นเอง ... คราวหน้า จะเป็นคำสั่งเกี่ยวกับการ shift และ rotate bit หรือที่เรียกเป็นไทยๆ ว่า การเลื่อนและหมุนบิต ... ตอนนี้ขอลาไปก่อนครับ (เหลืออีก 3 บทความล่ะนะ ... :D เย้ ลุย!)



เขียนโดย : ศุภชัย บุศราทิจ
Author : Supachai Budsaratij
e-mail : raek@se-ed.net
วันที่ทำการปรับปรุง : ๑๖ เม.ย. ๒๕๔๔