[ บทความ : เรียนรู้ 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 เย้ ลุย!)