การอินเตอร์รัพท์โหมด 2


        การอินเทอร์รัพต์ในโหมดนี้ จะเป็นวิธีที่มีประสิทธิภาพมากที่สุด โดยสามารถกำหนดตำแหน่งการกระโดดของโปรแกรมย่อยได้อย่างอิสระไม่ต้องเป็นตำแหน่งที่แน่นอนเหมือนการทำงานในโหมด 0 และสามารถกำหนดได้ถึง 128 ตำแหน่ง โดยวิธีการกำหนดตำแหน่งจะใช้รีจิสเตอร์ที่เป็นอินเทอร์รัพต์เวคเตอร์ (Interrupt Vector Register) คือ รีจิสเตอร์ I ร่วมกับข้อมูลที่อุปกรณ์ภายนอกส่งเข้ามาเป็นตัวกำหนดตำแหน่งแอดเดรสของหน่วยความจำที่จะให้บริการอินเทอร์รัพต์ โดยวิธีการกำหนดตำแหน่งจะเป็นดังนี้
        1.) เมื่อมีการกำหนดโหมดการทำงานด้วยคำสั่ง IM2 และมีสัญญาณอินเทอร์รัพต์เข้ามาทางขา INT ของ Z80 Z80 จะรีเซ็ตให้ค่าใน IFF1 และ IFF2 มีค่าเป็น 0 เพื่อจะไม่ตอบรับการอินเทอร์รัพต์จากอุปกรณ์อื่นๆอีกจนกว่าจะเสร็จสิ้นการให้บริการในส่วนนี้
        2.) ขา M1 และ IORQ จะมีค่าเป็น 0 เพื่อส่งสัญญาณไปบอกให้อุปกรณ์ภายนอกส่งข้อมูลขนาด 1 ไบต์เข้ามาที่บัสข้อมูล
        3.) Z80 จะนำข้อมูลดังกล่าวมาร่วมกับข้อมูลในรีจิสเตอร์ I เพื่อชี้ไปยังตำแหน่งหน่วยความจำที่เก็บค่า แอดเดรสของโปรแกรมย่อยที่จะตอบสนองการอินเทอร์รัพต์ เช่น ในกรณีที่ รีจิสเตอร์ I มีค่า 10 และข้อมูลที่ส่งมาจากอุปกรณ์ภายนอกมีค่า 20 H ก็จะประกอบกันเป็นตำแหน่ง 1020H จากนั้นจะนำค่าข้อมูลใน 1020Hและข้อมูลในแอดเดรสถัดไปคือ 1021H มาประกอบกันเป็นตำแหน่งแอดเดรสของหน่วยความจำที่จะกระโดดไปทำงาน โดยจากรูป คือแอดเดรส 80FF H

รูปแสดงการกำหนดแอดเดรสของอินเทอร์รัพต์โหมด 2

        4.) หลังจากทำโปรแกรมย่อยที่ตอบสนองการอินเทอร์รัพต์เสร็จสิ้น และได้รับคำสั่ง RETI ก็จะคืนกลับมายังโปรแกรมหลักตามเดิมในการต่อใช้งานอินเทอร์รัพต์ อุปกรณ์แต่ละตัวจะเข้ามา INT ร่วมกันดังรูป

รูปแสดงการต่ออุปกรณ์หลายตัวเข้ากับขา INT

        ซึ่งวิธีที่จะการตอบสนองการอินเทอร์รัพต์ ก็ขึ้นอยู่กับว่าอุปกรณ์ใดส่งสัญญาณอินเทอร์รัพต์มาให้ซีพียูก่อน แต่ถ้าอุปกรณ์ส่งสัญญาณมาพร้อมกัน ก็จะเกิดปัญหาขึ้นว่าจะให้บริการกับอุปกรณ์ใด วิธีง่ายๆในการแก้ปัญหาคือ เมื่อเกิดสภาวะการอินเทอร์รัพต์ขึ้นก็เขียนโปรแกรมให้ซีพียู ไล่สแกน (Scan) ไปทีละตัวตามลำดับ ถ้าเจอตัวใดก่อนก็จะให้บริการอุปกรณ์ตัวนั้น เราเรียกวิธีนี้ว่า วิธีอินเทอร์รัพต์แบบโพลลิ่ง (Polling Interrupt) ซึ่งคล้ายๆกับวิธีตรวจสอบอุปกรณ์แบบโพลลิ่งเพียงแต่จะทำการไล่ตรวจสอบเฉพาะเมื่อมีสัญญาณอินเทอร์รัพต์เข้ามาเท่านั้น
        การแก้ปัญหาด้วยวิธีโพลลิ่งแม้ว่าจะทำได้สะดวกเพราะดำเนินการโดยวิธีทางซอฟต์แวร์คือเขียนโปรแกรมจัดการโดยไม่ต้องใช้ฮาร์ดแวร์เพิ่มเติม แต่มีข้อเสีย คือจะทำงานช้าถ้ามีอุปกรณ์ต่อร่วมจำนวนมาก และไม่สามารถกำหนดความสำคัญของการให้บริการได้ว่าควรจะบริการให้อุปกรณ์ใดก่อนเป็นกรณีพิเศษ เพราะจะบริการตามลำดับของการตรวจสอบ วิธีแก้ไขข้อจำกัดดังกล่าวจึงอาจเพิ่มวงจรจัดลำดับความสำคัญ (Priority Logic) ของการบริการอินเทอร์รัพต์เข้าไปและเรียกวิธีนี้ว่า วิธีบริการอินเทอร์รัพต์แบบจำลำดับความสำคัญ (Priority Interrupt)
        ซึ่งจะเห็นว่าเมื่อมีการขอใช้บริการอินเทอร์รัพต์จะต้องผ่านวงจรจัดลำดับความสำคัญก่อน ซึ่งสามารถจัดลำดับได้ว่าควรส่งสัญญาณอินเทอร์รัพต์ของอุปกรณ์ใดไปให้ซีพียูก่อนดังนั้นซีพียูจึงไม่ต้องเสียเวลาไล่ตรวจาอบทีละตัวและสามารถกำหนดความสำคัญในการให้บริการได้ว่าจะให้บริการอุปกรณ์ใดก่อนอุปกรณ์ใด แต่ข้อเสียคือต้องเพิ่มวงจรทางฮาร์ดแวร์เข้าไปช่วย

รูปแสดงวิธีการต่อแบบ Priority Interrupt

        อีกวิธีหนึ่งที่นิยมกันคือการต่อแบบเป็นห่วงโซ่ หรือ Daisy Chain แต่วิธีนี้อุปกรณ์สนับสนุนที่ใช้จะต้องรองรับการต่อแบบDaisy Chain คือมีขา EI(Enable Input)และขา EO(Enable Output)เช่นไอซีZ80 PIO หรือ Z80 CTC โดยต่อร่วมแบบโยงกันไปตามรูป

รูปแสดงการต่ออุปกรณ์แบบ Daisy Chain

        จากรูป อุปกรณ์ 1 จะมีระดับความสำคัญสูงสุดในขณะที่อุปกรณ์อื่นๆจะมีความสำคัญรองลงมาตามลำดับดังนั้นถ้าอุปกรณ์ 1 ส่งสัญญาณอินเทอร์รัพต์ออกมาอุปกรณ์อื่นๆจะส่งสัญญาณ อินเทอร์รัพต์ออกมาไม่ได้ Z80 จึงต้องตอบสนองต่ออุปกรณ์ 1 ก่อนเสมอ ในกรณี 3 และ อุปกรณ์ 4 ก็จะไม่สามารถส่งสัญญาณบริการอินเทอร์รัพต์ออกมาได้เช่นกัน