Register และ ALU

โครงสร้างภายในของ Z-80 CPU ประกอบด้วย รีจิสเตอร์ภายในที่สามารถ เขียน และอ่านได้ถึง 208 บิท โดยแยกเป็นกลุ่มของรีจิสเตอร์ขนาด 8 บิท 18 รีจิสเตอร์ และรีจิสเตอร์ขนาด 16 บิท อีก 4 รีจิสเตอร์

รูปภาพแสดงรีจิสเตอร์ภายในทั้งหมดของ CPU Z-80

1. รีจิสเตอร์หลักที่ใช้งานทั่วไป
รีจิสเตอร์ในกลุ่มแรก คือ A,F,B,C,D,E,H,L เป็นรีจิสเตอร์ขนาด 8บิท ที่ใช้งาน ทั่วไปโดย รีจิสเตอร์ เหล่านี้สามารถประกอบรวมกันเป็นคู่รีจิสเตอร์ได้ คือ AF, BC,DE และ HLโดยคู่ รีจิสเตอร์เหล่านี้ได้รับการใช้งานในลักษณะของรีจิสเตอร์ ขนาด 16 บิท การกระทำภายใน CPU อาจจะอาศัยเพียงรีจิสเตอร์เดียวหรือกระ
ทำเป็นคู่รีจิสเตอร์ได้ โดยที่ A คือ Accumulator , F คือ flag , flagของ Z-80 จะมีด้วยกันทั้งหมด 6 ตัว จึงใช้เพียง 6 บิท แต่ Z-80 อาศัยการเพิ่มบิทขึ้นอีก 2 บิท และกลาย เป็นรีจิสเตอร์ F รีจิสเตอร์ F นี้ ได้รับการ set , reset การกระทำ ตามคำสั่งทาง คณิตศาสตร์ หรือ ลอจิกได้และเราสามารถใช้ F เหมือนรีจิสเตอร์
หนึ่ง ซึ่งเมื่อรวมกับ A แล้ว จะกลายเป็นรีจิสเตอร์ขนาด 16บิทได้

 

 

รูปภาพแสดงกลุ่มรีจิสเตอร์หลักใช้งานทั่วไป

2. กลุ่มรีจิสเตอร์สำรอง
เป็นกลุ่มรีจิสเตอร์ที่สามารถเก็บข้อมูลได้ โดยเป็นตัวเก็บข้อมูลที่มาจากรีจิส- เตอร์หลัก รีจิสเตอร์ ชุดนี้จึงมีด้วยกัน 8 ตัว คือ A', F', B', C', D', E', H' ,L' รีจิสเตอร์เหล่านี้เป็นรีจิสเตอร์ที่ใช้ในการ เก็บข้อมูลชั่วคราว ในการที่ต้องการ ใช้รีจิสเตอร์หลักทำงานอย่างอื่นก่อน ดังนั้นรีจิสเตอร์กลุ่ม นี้จึงไม่สามารถกระทำ ทางคณิตศาสตร์และลอจิกได้

รูปภาพแสดกลุ่มรีจิสเตอร์สำรอง

3. กลุ่มรีจิสเตอร์ที่ใช้งานเฉพาะอย่าง

3.1 โปรแกรมเคาน์เตอร์ (PC - Program counter)

โปรแกรมเคาน์เตอร์เป็นรีจิสเตอร์ขนาด 16บิท ที่เป็นตัวกำหนดตำแหน่งของ โปรแกรมในขณะสภาวะการกระทำการเฟทช์โดยขณะทำ การเฟทช์ค่าที่อยู่ใน โปรแกรมเคาน์เตอร์จะไปปรากฎอยู่ที่แอดเดรสบัสเพื่อชี้ไปยังตำแหน่งในหน่วย ความจำ ให้ CPU อ่านคำสั่งมาตีความหมายค่าที่อยู่ในโปรแกรมเคาน์เตอร์จะเพิ่มค่าขึ้นได้อย่างอัตโนมัติ หลังการกระทำการเฟทช์ แต่ถ้าหาก CPU กระทำ คำสั่งให้ข้ามไป ยังตำแหน่งอื่น (Jump) ค่าแอดเดรส ที่จะกระโดดข้ามนั้นจะโหลด เข้ามายังโปรแกรม เคาน์เตอร์ได้อย่างอัตโนมัติ

3.2 สแตคพอยท์เตอร์ (SP - Stack pointer)
เป็นรีจิสเตอร์ที่มีขนาด 16 บิทที่ใช้สำหรับชี้ไปยัง แอดเดรสชั้นบนสุดของสแตค ที่อยู่ใน RAM โดยส่วนของสแตคมีลักษณะโครงสร้าง เป็นหน่วยความจำ เป็นแบบเก็บทีหลังเรียกออกก่อน (last in first out) ข้อมูลในสแตค อาจได้รับการ push หรือ pop มาจาก รีจิสเตอร์ภายในCPU ลักษณะของสแตคในที่นี้ยังเป็น ส่วนช่วย ในการกระทำ interrupt และการเรียก โปรแกรมย่อย กล่าวคือ ในการ interrupt ค่าของโปรแกรมเคาน์เตอร์จะได้รับการรักษาไว้ในชั้นสแตคครั้นเมื่อโปรแกรมกลับ จาก interrupt ไปกระทำยังโปรแกรมหลักก็จะนำค่าจากสแตคกลับเข้ามายังโปร- แกรมเคาน์เตอร์ ใหม่ ในทำนองเดียวกัน การกระโดดไปกระทำยังโปรแกรมย่อยก็เช่นเดียวกัน ดังนั้น การกระทำในรูปของ interrupt ของ โปรแกรมย่อยสามารถ
ซ้อนกันได้ไม่มีสิ้นสุด

3.3 อินเดครีจิสเตอร์ (IX,IY - index register)
CPU Z-80 มีอินเดครีจิสเตอร์ขนาน 16 บิท 2 ตัว แต่ละตัวใช้ประโยชน์หลักใน การ ทำหน้าที่เป็นตัวเก็บแอดเดรสฐาน (base address) เพื่อ ทำหน้าที่อ้างแอด-
เดรสแบบอินเดคแอดเดรสซิ่ง (index addressing)ในโหมดของอินเดคแอดเดรส
ซิ่งมีข้อมูลที่ อยู่ในอินเดครีจิสเตอร์นี้จะรวมกับข้อมูลที่ติดมากับคำสั่งอีก 8 บิท
เพื่อเป็นตัวกำหนดแอดเดรสให้กับ คำสั่งข้อมูลที่ติดมากับคำสั่งนี้เราเรียกว่า displacement ซึ่งจะเก็บในรูปของตัวเลข 2's complement

3.4 อินเตอรร์รัพท์เพจแอดเดรสรีจิสเตอร์ (I-Interrupt page address register)
การอินเตอร์รัพท์ ของ Z-80 มี หลายโหมดและโหมดหนึ่งที่ทำให้การอินเตอร์รัพท์ ของ Z-80มีประสิทธิภาพ สูง กล่าวคือ เมื่อเกิดการอินเตอร์รัพท์ในโหมดนี้ขึ้น มัน สามารถอ้างแอดเดรสโดยทางอ้อม ไปกระทำโปรแกรมใน ที่ใดก็ได้ในหน่วยความจำ โดยอาศัยค่าในรีจิสเตอร์ Iรวมกับค่าที่ส่ง มาจากอุปกรณ์เพอริเฟอรัลอีก 8 บิท ชี้ไปยังค่าในหน่วยความจำเพื่อนำค่านั้นมาโหลดเข้าใน โปรแกรมเคาวน์เตอร์เพื่อ
กระทำต่อไป ด้วยวิธีการนี้เราจึงสามารถกระโดดเข้าไปทำที่ส่วนใดก็ได้ในหน่วย ความจุ

3.5 รีจิสเตอร์รีเฟรชหน่วยความจำ (R-memory reflesh register)
การต่อ ซีพียูกับหน่วยความจำนั้น โดย ปกติจะต่อกับหน่วยความจำชนิด static ได้โดยง่าย แต่ชนิด dynamic ที่ต้องการรีเฟรช มีราคาถูกกว่ามีความหนาแน่น สูงกว่า Z-80 ให้ข้อดีกว่าประการหนึ่งคือมันสามารถให้การ รีเฟรชหน่วยความจำได้ อย่างอัตโนมัติ โดยค่าใน R รีจิสเตอร์จะเพิ่มค่าขึ้นอีก 1 ทุกครั้งที่มีการกระทำ
การ fetch คำสั่ง และ ข้อมูลในรีจิสเตอร์ R นี้ จะถูกส่งออกไปยังแอดเดรสบัส ในส่วนบิทที่มีนัยสำคัญต่ำกว่าจังหวะของการส่งนี้จะเป็นจังหวะเดียวกันกับที่ซีพียู ส่งสัญ- ญาณ รีเฟรชออกมา ผู้โปรแกรมสามารถกำหนดค่าให้กับ รีจิสเตอร์ R นี้ได้แต่ค่าในรีจิสเตอร์ นี้จะเรียกใช้โดยผู้โปรแกรมทางคำสั่งโดยตรงไม่ได้

3.6 แอคคิวมูเลเตอร์ (accumulator) และแฟลก (flag)
ซีพียูจะมีรีจิสเตอร์ที่ใช้เป็นหลักในการ เป็นตัว operand สำหรับกระทำทาง คณิตศาสตร์และลอจิก โดยรีจิสเตอร์หลักนี้จะมีเพียง 8 บิท เรียกว่า "แอคคิวมูเลเตอร์ (accumulator)" การกระทำในส่วนของหน่วยคณิตศาสตร์ และลอจิกย่อมเกิดเงื่อนไขได้หลายอย่างที่จะต้องแสดงสถานะภาพของเงื่อนไข เหล่านั้น เช่น เงื่อนไขผลลัพธ์เป็นศูนย์ผลลัพธ์เป็นบวกหรือลบมีตัวทดหรือ ตัวขอยืมในการกระทำ ทางคณิตศาสตร์ แสดงเงื่อนไขพาริตี้คู่หรือคี่สิ่งเหล่านี้ จะให้ผลลัพธ์แสดงสถานะ ได้ด้วย แฟลก (flag) แฟลกเป็นรีจิสเตอ์ขนาด 8 บิท
ซึ่ง สามารถรวมกับแอคคิวมูเลเตอร์เป็น รีจิสเตอร์ขนาด 16 บิท ได้ผู้โปรแกรม ยังสามารถใช้คำสั่งในการเคลื่อนย้ายข้อมูลจาก แอคคิวมูเลเตอร์ A และแฟลก F ไปเก็บไว้ใน A' และ F' ได้ เพื่อทำให้การใช้งาน ของ A และ F มีประสิทธิภาพ ดียิ่งขึ้น

รูปภาพแสดงกลุ่มรีจิสเตอร์ใช้งานเฉพาะอย่าง

 

 

4. หน่วยคำนวณทางคณิตศาสตร์และลอจิก (ALU - arithmetic and logic unit)
การประมวลผลที่สำคัญของ CPUของคอมพิวเตอร์ยังขึ้นอยู่กับหน่วยคำนวณทาง คณิตศาสตร์และ ลอจิก (ALU) ส่วน ALU นี้จะนำข้อมูลซึ่งอาจจะมาจากภายนอก CPU หรือภายใน CPU ก็ได้มา ประมวลผล การ ประมวลผลในส่วน ALU ที่ สำคัญจะประกอบด้วย การบวก (add) , การลบ (subtract) , ลอจิก AND , ลอจิก OR , ลอจิก EX-OR , เปรียบเทียบ (compare) , การเลื่อนบิททางซ้ายหรือขวา ,การ เพิ่มค่า (increment) , การลดค่า (decrement) , การเซ็ทบิท (set bit) , การรีเซ็ทบิท (reset bit) , การทดสอบบิท (test bit)

รูปภาพแสดงการทำงานของ ALU ภายใน

 
 
 
 
 

Data Representation

พัฒนาจาก 8080 เก็บข้อมูลแบบ 8 bit และเก็บ address ขนาด 16 bit สามรถทำทุก opcode ของ 8080 ได้ และเพิ่มอีก 80 ชุด ชุดคำสั่งที่มีขนาด 1,4,8 และ 16 bit ชุดของ register มี เป็น 2 เท่า นอกจากนี้ยังมีระบบปฏิบัติการที่รวดเร็ว หรือ การ interrupt z80 เพิ่ม register ที่ใช้เป็น index 2 ตัวฃ คือ IX,IY และ interrupt มีลักษณะเป็นเวกเตอร์ ซึ่งทำการ relocate ได้ ทำงานที่ อัตรา clock ของ z-80 = 2.5 MHz Z-80-H = 6MHz

 

 

 

 

 

 

 

 

 

 

 
 
 
 
 
 
 
 
 
Instruction Format
1. กลุ่มคำสั่งเกี่ยวกับการโหลดข้อมูลและแลกเปลี่ยนข้อมูล
การโหลดเป็นการเคลื่อนย้ายข้อมูลที่สำคัญ ใน Z-80 นั้นเราสามารเคลื่อนย้ายข้อมูลได้อย่างมีประสิทธิภาพดี
เพื่อทำความเข้าใจกลุ่มคำสั่งโหลดเราพิจารณาตัวอย่างต่างๆ ดังนี้
LD E, (IX + 08)
ชุดคำสั่งนี้ในหน่วยความจำจะเป็น

 

คำสั่งป็นการเคลื่อนย้ายข้อมูลจากหน่วยความจำแอดเดรสที่หาค่ามาจากค่าของ IX รวมกับตัวเลข 08 มาเก็ใน
รีจิสเตอร์ E
จะเห็นว่าเห็นคำสั่งขนาดเพียง 3 ไบท์เท่านั้น และจากคำสั่งขนาด 3 ไบท์ เราสามารถใช้วิธีการเพิ่มขนาดของแอดเดรส (extended addressing) ได้เช่น
LD A, (6F32H) ชุดคำสั่งจะเป็น
ในกรณีนี้เป็นการโหลดข้อมูลในแอดเดรส 6F32H มาเก็บไว้ยังรีจิสเตอร์ A สิ่งที่น่าสังเกตคือ 32H จะอยู่ในไบท์ที่ 2 ส่วน 6FH จะอยู่ในไบท์ที่ 3
เรายังมีวิธีการโหลดแบบอิมมีเดียทได้ดังนี้เช่น
LD H, 36
การวางรูปคำสั่งในหน่วยความจำจะเป็น

 

แต่การโหลดข้อมูลลงในหน่วยความจำที่มีความสามารถสูงวิธีหนึ่งคือ การโหลใช้อินเดครีจิสเตอร์เป็นตัวรับ
ข้อมูล และใช้วิธีการอิมมีเดียทเป็นการกำหนแหล่งเริ่มต้น (source) ของข้อมูล เช่น
LD (IX - 15), 21
การวางรูปคำสั่งในหน่วยความจำจะเป็นขนาด 4 ไบท์
จากลักษณะคำสั่งนี้จะเป็นการเอาตัวเลข 21 ไปเก็บไว้ในหน่วยความจำตำแหน่งหน่วยความจำแอดเดรส IX –
15
เรายังสามารถใช้คำสั่งโหลดทำการโหลดข้อมูลในรูปแบบของการโหลดข้อมูล 16 บิท ได้อีกด้วย และเพื่อลดขนาด ของคำสั่งให้สั้นขึ้น ตัวคำสั่งจึงเป็นลักษณะของการแลกเปลี่ยนข้อมูลของคู่รีจิสเตอร์ต่างๆ
ตัวอย่างของคำสั่งการโหลดข้อมูลชนาด 16 บิท เช่น
LD IX, nn

DD
21
n
n

 
เป็นคำสั่งที่ทำการโหลดตัวเลข nn ที่อยู่ในคำสั่ง เช้าไปเก็บไว้ยังรีจิสเตอร์ IX หรือ IX nn เรายังโหลดข้อมูล หน่วยความจำทีละ 2 ไบท์ก็ได้เช่น
LD dd, (nn)

11101101
01dd1011
n
n

dd
00 = BC
01 = DE
10 = HL
11 = SP
ในกรณีที่เราใช้รหัส dd เป็นคู่รีจิสเตอร์ ซึ่งถ้าสมมุติว่า dd = 00 จะมีความหมายถึง การโหลดข้อมูลจาก
แอดเดรส nn และ nn + 1 โดยข้อมูลในแอดเดรส nn + 1 เก็บไว้ที่รีจิสเตอร์ B และข้อมูลในแอดเดรส nn เก็บไว้ที่รีจิสเตอร์ c

 

 
 
 
2. กลุ่มคำสั่งในการค้นหาข้อมูลและเคลื่อนย้ายข้อมูลเป็นกลุ่ม
Z-80 มีคำสั่งที่ทำให้การทำงานเป็นไปอย่างมีประสิทธิภาพโดยทำให้ลดขนาดของตัวโปรแกรมลงได้มาก มีลักษณะของกลุ่มคำสั่งในกลุ่มนี้จะอาศัยการทำงานรวมกันของคู่ รีจิสเตอร์ ภายใน CPU 3 คู่คือ
HL เป็นคู่รีจิสเตอร์ที่อ้างตำแหน่งจุดต้นทาง
DE เป็นคู่รีจิสเตอร์ที่อ้างถึงตำแหน่งจุดปลายทาง
BC เป็นตัวนับจำนวนไบท์
ในการค้นหาข้อมูล เราใช้วิธีการดังนี้เช่น
CPI (Compare with increment)

การทำงานจะเป็นไปดังนี้ CPU จะนำข้อมูลจากหน่วยความจำที่มีแอเดรสค่าอยู่ในคู่รีจิสเตอร์ HL มาเปรียบเทียบกับ รีจิสเตอร์ A หลังจากนี้ค่าของคู่รีจิสเตอร์ HL จะเพิ่มค่าอีก 1 และค่าของคู่รีจิสเตอร์ BC จะลดค่าตัวเองลงไปทีละ 1 ลักษณะการเปรียบเทียบ จะให้ผลลัพธ์ที่แฟลก จากคำสั่งนี้เราจะให้การเซทค่า BC เป็นจำนวนไบท์ที่ต้องการเปรียบเทียบ ค่าของ BC จะลดลงมาจนเป็น 0 แล้วเราทดสอบค่า BC = 0 จะเห็นว่าทุกครßงที่ทำคำสั่งนี้ค่าคู่รีจิสเตอร์ HL จะเพิ่มค่า ดังนั้นถ้าให้การกระทำคำสั่งนี้ใหม่ แอดเดรสในหน่วยความจำจะเพิ่มทีละหนึ่งเรื่อยๆ ไป เพื่อเพิ่มประสิทธิภาพของ Z-80 เรามีคำสั่งที่สามารถให้ กระทำคำสั่งจนครบตามจำนวนไบท์ที่

วางไว้ เช่น

CPIR (Compare with increment and repeat)
การจัดวางคำสั่งในหน่วยความจำจะเป็น
การทำคำสั่งนี้จะเหมือนคำสั่ง CPI แต่ CPU จะเพิ่มการทดสอบค่าในคู่รีจิสเตอร์ BC ว่าเป็น 0 แล้วหรือยัง ถ้ายังก็จะกระทำคำสั่งเดิมนี้ซ้ำอีก ซึ่งค่าใน BC จะลดลงมาทีละ 1 จนเป็น 0 จึงหยุดกระทำ
นอกจากนี้เรายังสามารถให้ค่าแอดเดรส ในคู่รีจิสเตอร์ HL ลดค่าลงทีละ 1 ได้เช่นกัน โดยใช้คำสั่ง CPD และ CPDR
สำหรับการเคลื่อนย้ายข้อมูลเป็นบล็อก (block) ก็กระทำเช่นเดียวกับการเปรียบเทียบโดยใช้คู่รีจิสเตอร์ HL เป็นตัวบอก แอดเดรสของหน่วยความจำที่ต้องการย้าย และคู่รีจิสเตอร์ DE เป็นตัวบอกวค่าแอดเดรสที่จะนำไปเก็บอยู่ที่ใด ดังตัวอย่าง
LDI load location (DE) with location (HL) increment
LDI (DE), (HL)
การกระทำรูปคำสั่งในหน่วยความจำจะเป็นดังนี้
การทำงานในลักษณะนี้ CPU นำข้อมูลในหน่วยคู่ความจำที่แอดเดรส (HL) ไปเก็บไว้ที่ในหน่วยความจำที่แอดเดรส (DE) และหลังจากนั้นค่าในรีจิสเตอร์ (BC) ลดลงไปหนึ่ง และค่าในคู่รีจิสเตอร์ HL และ DE จะเพิ่มค่าขึ้น 1 ในทำนองเดียวกันเราสามารถ ใช้ลำพังเพียงคำสั่งเดียวในการเคลื่อนย้ายข้อมูลททั้งบล็อกได้ด้วยการเอาจำนวนข้อมูลไว้ในคู่รีจิสเตอร์ BC แล้วใช้คำสั่ง LDIR การทำงานของคำสั่งนี้จะคล้ายกับ LDI แต่จะทำซ้ำๆ ซากๆ ไปเรื่อยๆ จนกระทั่งค่าในคู่รีจิสเตอร์ BC เป็น 0 ก็จะหยุด ไปกระทำคำสั่งถัดไป
กลุ่มคำสั่งชุดนี้เป็นกลุ่มคำสั่งที่ไม่มีใน 8080 แต่อย่างไรก็ตามเมื่อพิจารณาช่วงเวลาในการทำงาน ในแต่ละแมชีนไซเคิล ดังได้กล่าวมาแล้วในบทก่อนจะเห็นว่า การกระทำคำสั่งที่กระทำซ้ำก็คือ การเฟทช์คำสั่งเดิมหลายๆ ครั้งนั่นเอง

 

 
 
 
3. กลุ่มคำสั่งการกระทำทางคณิตศาสตร์และลอจิก
คำสั่งนี้จะกระทำด้วยรีจิสเตอร์ A เป็นส่วนใหญ่ลักษณะของกลุ่มคำสั่งประกอบด้วยลักษณะการ ADD, SUB, ADC, SBC, INC, DEC, AND, OR, XOR ในการอ้างแอดเดรสของตัวโอเปอร์แรนด์ นั้นเราทำได้หลายแบบ ขึ้นอยู่กับผู้เขียนและผู้ใช้งาน
การกระทำในกลุ่มคำสั่งนี้จะให้ผลลัพท์เก็บซ้ำที่ในรีจิสเตอร์ Aและนอกจากนี้แล้วค่าของแฟลกจะมีผลต่อการกระทำ ของคำสั่งด้วย เช่น ถ้าค่าในรีจิสเตอร์ A เป็น 0 แฟลกตัวศูนย์ (Z flag) ก็ได้รับการเซทค่าไว้
เป็นที่น่าสังเกตุสำหรับการกระทำในกลุ่มคำสั่งนี้คือ เราแยกแยะการกระทำเป็นการกระทำทางคณิตศาสตร์ กลุ่มหนึ่ง (ADD, SUB) และการกระทำทางลอจิก (AND, OR, XOR) ซึ่งทั้งสองกลุ่มย่อยนี้จะให้ผลลัพท์ที่มีผลต่อแฟลก กล่าวคือถ้าผลลัพท์เป็นศูนย์ Z แฟลกจะมีค่าเป็น 1 ถ้าผลลัพท์เป็นเลขลบ (บิท D7 = 1) S แฟลกจะเป็น "1" ถ้ามีการทดก็จะให้ผลที่ C แฟลก แต่สำหรับ P/V แฟลกนี้ ในกรณีของกลุ่มคำสั่งทางคณิตศาสตร์ แฟลกนี้ทำหน้าที่เป็นโอเวอร์โฟลว ในกรณีคำสั่งทางลอจิก แฟลกนี้ทำหน้าที่เป็นบิทพาริตี้ และที่น่าสังเกตอีกประการหนึ่งคือคำสั่ง INC และ DEC จะไม่มีผลต่อแฟลกตัวทด
Z-80 ยังมีกลุ่มคำสั่งที่กรทำทางคณิตศาสตร์และลอจิกโดยเฉพาะบางอย่างเช่น การกระทำการเปลี่ยนรหัสตัวเลขไบนารี่ ให้เป็น BCD ได้ด้วยคำสั่ง DAA คำสั่งเกี่ยวกับการทำคอมพลีเมนท์ การทำให้เป็นเลขลบ การเซทและรีเซท แฟลกบางตัว และยังมีคำสั่งในการควบคุมการทำงานของ CPU เช่น คำสั่ง NOP คือไม่ต้องทำอะไร HALT ให้หยุดโปรแกรม และนอกจากนี้ ก็มีคำสั่งเกี่ยวกับอินเตอร์รัพท์ของ CPU
การกระทำทางคณิตศาสตร์ของ Z-80 ยังสามารถกระทำในรูปการบวกลบตัวเลข 16 บิทได้อีกด้วยการบวกในกรณีนี้ จะใช้การบวกระหว่างคู่รีจิสเตอร์เช่น HL กับ BC เป็นต้น ในการบวกเช่นนี้จะทำให้การกระทำทางคณิตศาสตร์มีประสิทธิภาพ เพิ่มขึ้น

 

 
 
 
 
 
4. กลุ่มคำสั่งในการเลื่อนข้อมูลเป็นวง (rotate) และการชิฟท์ (shift)
ความสามารถพื้นฐานของ Z-80 ในการทำข้อมูลและชิฟท์ก็เหมือนกันใน CPU ของคอมพิวเตอร์ทั่วไป เช่น มักจะเลื่อนบิท ไปทางซ้าย ไปทางขวา เลื่อนเป็นวงรอบ โดยผ่านบิททดหรือไม่ผ่านบิททด แต่ Z-80 มีคำสั่งเกี่ยวกับการเลื่อนข้อมูลตัวเลข BCD อยู่ 2 คำสั่งคือ RRD และ RLD ทั้ง 2 คำสั่งนี้จะทำให้ข้อมูล 1 ตัวเลข (BCD) ในแอคคิวมูเลเตอร์เลื่อนเป็นวงรวมกับข้อมูล 2 ตัว เลข (BCD) ในหน่วยความจำที่อ้างแอดเดรสโดย HL ลักษณะการกระทำเป็นดังนี้
การกระทำในกลุ่มคำสั่งนี้เกิดขึ้นภายใน ALU โดยมีการกระทำร่วมกับแฟลก ดังนั้นจึงมีผลเกี่ยวข้องโดยตรง

แฟลกบางตัว เช่น แฟลกการทด แฟลกเครื่องหมายและแฟลกศูนย์เป็นต้น

 

 
 
 
 
 
 
5. กลุ่มคำสั่งเกี่ยวกับการกระทำภายในข้อมูลบิทต่างๆ
 ใน Z-80 มีความสามารถพิเศษในการเซท รีเซท หรือทดสอบบิทใดบิทหนึ่งในรีจิสเตอร์ต่างๆ และในหน่วยความจำได้รายละเอียดของการเซท รีเซท และการทดสอบสามารถแยกเป็นคำสั่งย่อยๆ ในกลุ่มนี้ได้มาก เพราะแต่ละคำสั่งจะเท่ากับมีคำสั่งย่อยๆ ได้ถึง 8 คำสั่ง คือการกระทำในแต่ละบิทต่างๆ ของรีจิสเตอร์ต่างนั่นเอง
ในการทดสอบบิทต่างๆ ว่าเป็น 0 หรือ 1 นั้นเราใช้แฟลก 0 เป็นตัวเก็บข้อมูล เช่น ถ้าบิทที่ทดสอบเป็น 0 ก็จะเซทแฟลก 0 ให้เป็น 1
ดังตัวอย่างเช่น BIT b,r หมายถึงการทดสอบบิทที่ b ของรีจิสเตอร์ r ว่าเป็น "0" หรือ เป็น "1" วิธีการก็เป็นเพียงการโหลดข้อมูลของบิทที่ b ของรีจิสเตอร์ r มาไว้ยัง Z แฟลก จากนßนก็ทำการทดสอบได้ว่า Z แฟลกจะเป็น "0" หรือ "1"
ในทำนองเดียวกัน เราสามารถทำการเซทและรีเซทบิทใดบิทหนึ่งในรีจิสเตอร์และหน่วยความจำต่างๆ ได้ด้วยคำสั่ง SET b,r หรือ RES b,r
การกระทำในกรณีนี้เรากระทำได้ในทุกรีจิสเตอร์ ในหน่วยความจำ การอ้างแอดเดรสไปยังหน่วยความจำก็ทำได้ ทั้งใช้แบบทางอ้อมผ่านรีจิสเตอร์ HL หรือใช้อินเดครีจิสเตอร์ IX, IY ร่วมด้วย

 

 

 

 

 

 

 

 

 

6. กลุ่มคำสั่งที่อ้างกับโปรแกรมย่อย

เพื่อให้การเรียกโปรแกรมย่อยมีประสิทธิภาพสูง Z-80 ใช้วิธีการเรียกโดยคำสั่ง CALL และ RET คำสั่ง CALL จะกระทำให้ค่า PC เดิมที่มีอยู่ไปเก็บไว้ที่สแตคแล้วโหลดค่าแอดเดรสของโปรแกรมย่อยกลับคืนมาให้ PC และในการ RET ก็จะกระทำกลับกันนั่นคือจะเป็นการ POP เอาข้อมูลในสแตคมาให้ PC
นอกจากนี้ตัว Z-80 จะมีคำสั่งพิเศษคือ
CALL cc, nn
ซึ่งเขียนเป็นรูปคำสั่งในหน่วยความจำจะเป็น

11
cc
100

n

n

คำสั่งนี้จะเป็นการทดสอบเงือนไขใน cc ถ้าเงื่อนไขเป็นจริงการกระทำ CALL ก็จะเกิดขึ้นคือเครื่องจะ PUSH ข้อมูลใน PC ไปไว้ในสแตค แล้วนำค่า nn ไปเก็บไว้ใน PC ถ้าเงื่อนไขใน cc ไม่เป็นจริง CPU ก็จะกระทำคำสั่ง

ถัดไป การใช้รหัสแทนเงื่อนไข 3 บิท ทำให้สามารถแทนเงื่อนไขได้กับ 8 บิท ดังนี้

cc
เงื่อนไข
ดูจากแฟลก
000
ไม่เป็นศูนย์
X
001
เป็นศูนย์
X
010
ไม่มีตัวทด
C
011
มีตัวทด
C
100
พาริตี้ เป็นคี่
P
101
พาริตี้ เป็นคู่
P
110
มีเครื่องหมายบวก
S
111
มีเครื่องหมายลบ
S

 
ในทำนองเดียวกัน Z-80 ก็มีคำสั่งที่ใช้ RET ทั้งแบบไม่มีเงื่อนไข และแบบมีเงื่อนไขเช่น
คือเมื่อ cc เป็นจริงจะกระทำการกระโดดกลับโปรแกรมหลัก ถ้า cc ไม่เป็นจริงก็จะกระทำคำสั่งถัดไป
นอกจากการเรียกโปรแกรมย่อยแล้ว Z-80 ยังมีคำสั่งในลักษณะ 8080 แบบต่างๆ อีกซึ่งอาจเป็นแบบมีเงื่อนไขหรือ ไม่มีเงื่อนไข
จากลักษณะของการ RETURN มีสองคำสั่งที่ไมมีใน 8080 คือ RETI และ RETN ในกรณีนี้จะเป็น การดำรงสถานะ บางอย่างเกี่ยวกับ IFF
การ CALL และ RETURN ก็เหมือนคำสั่ง JP แต่ต่างกันตรงที่มีการเก็บข้อมูล PC เดิมไว้ที่สแตค ในกรณีนี้เรายังมีการ CALL ที่ใช้คำสั่งไบท์เดียวได้ คือ RST P ซึ่งเป็นคำสั่งที่มีรหัสเพียง 1 ไบท์ คือ

11
t t t
111

 
เป็นการเก็บรักษาค่า PC เดิมไว้ในสแตค และโหลดค่าแอดเดรสใหม่ให้กับ PC

 

 

 

 

7. กลุ่มคำสั่งเกี่ยวกับการติดต่อ อินพุท-เอาท์พุทกับซีพียู

ใน 8080 กลุ่มคำสั่งนี้มีเพียง 2 คำสั่งเท่านั้นคือ IN และ OUT แต่ในของ Z-80 ได้เพิ่มขยายการติดต่อกับอินพุท เอาท์พุท มากยิ่งขึ้นทำให้ประสิทธิภาพการติดต่อเป็นไปได้ดียิ่งขึ้น
คำสั่งที่ซ้ำกับ 8080 คือ
IN A, PORT
ลักษณะการจัดรูปโครงสร้างคำสั่งในหน่วยความจำเป็น

การกระทำคำสั่งนี้ จะเป็นการนำข้อมูลจากพอร์ทที่เป็นอินพุทโหลดข้อมูลมาที่รีจิสเตอร์ A สิ่งที่เพิ่มมาของ Z-80 คือ มันสามารถเลือกการโหลดให้กับข้อมูลไว้ที่รีจิสเตอร์ใดก็ได้ เช่น
IN r, (C)
การจัดรูปคำสั่งในหน่วยความจำเป็น

 

ในกรณีนี้ ซีพียู จะใช้รีจิสเตอร์ C เป็นตัวกำหนดชื่อพอร์ทแล้วโหลดข้อมูลจากอินพุทมาเก็บไว้ที่รีจิสเตอร์ ในซีพียูที่
กำหนดด้วย 3 บิทออปโค้ด
การโหลดข้อมูลจาก I/O สามารถทำเป็นบล็อกได้เช่นกันโดยใช้คำสั่ง INI, INIR
ในกรณีที่จะใช้รีจิสเตอร์ C เป็นตัวกำหนดชื่อพอร์ทและใช้รีจิสเตอร์ B เป็นตัวนับข้อมูลโดยค่าของรีจิสเตอร์ B จะลดลงมา 1 ส่วนรีจิสเตอร์ HL จะเป็นตัวชี้ตำแหน่งในหน่วยความจำที่จะนำข้อมูลจากอินพุทมาเก็บไว้ จะเห็นว่าถ้าเราให้ทำคำสั่งนี้ซ้ำ ๆ ค่ารีจิสเตอร์ B จะลดค่าลงมาเรื่อยๆ ทำให้การเก็บข้อมูลเรียงกันไปได้
สำหรับ Z-80 เรามีคำสั่ง INIR ซึ่งสามารถกระทำคำสั่ง INI ซ้ำจนกระทั่งค่ารีจิสเตอร์ B มีค่าเป็น 0 จึงหยุด ทำให้เรา สามารถโหลด ข้อมูลจากอินพุทเป็นบล็อก ได้ถึง 256 ไบท์ ส่วนทางด้านเอาท์พุทก็เช่นเดียวกัน

8. กลุ่มคำสั่งเกี่ยวกับการควบคุมการทำงานของ CPU

การควบคุมการทำงานมีหลายคำสั่งเช่น NOP ซึ่งเป็นคำสั่งที่ CPU ไม่ต้องทำอะไรเลย HALT เป็นคำสั่งให้หยุด CPU นอกจากนี้มีคำสั่งเกี่ยวกับการอินเตอร์รัพท์ เช่น ( DI , EI , IM0 , IM1 , IM2 )

 

 

 

 

 

 

 

9. กลุ่มคำสั่งกระโดดข้ามการทำงาน

คำสั่งกระโดด

การทำงานคำสั่งที่เกี่ยวกับการกระโดด ซึ่ง เป็นกลุ่มคำสั่งที่ มีความสำคัญมาก เนื่องจาก เรามักเขียนโปรแกรม โดยอาศัยหลักของเงื่อนไข ถ้าโปรแกรมของไม่ มีการกำหนดเงื่อนไข โปรแกรมนั้นก็จะทำงานโดยไม่ได้สนใจสิ่งรอบข้างเลย .. เช่น ต้องการเขียนโปรแกรมควบคุมหุ่นยนต์ แต่เรากำหนดว่า ให้เดินหน้า โดยการหมุนมอเตอร์ไป 10 รอบ แล้วเลี้ยวซ้าย พรอ้มทั้งเดินหน้าไปอีก 5 รอบ แล้วเลี้ยวขวา หลังจากนั้นเดินหน้าอีก 10 รอบ แต่เวลาที่หุ่นยนต์ทำงานจริงๆ การหมุน 10 รอบนั้น อาจจะไม่ได้ระยะทางที่เรากำหนดเอาไว้ และถ้าระหว่างทางที่หมุนมอเตอร์ไปได้ 3 รอบ แล้วหุ่นไปชนกับอะไรก็ไม่รู้ แล้วอย่างนี้ พอมันทำงานต่อไป หุ่นยนต์ ก็ไม่สามารถเดินทางไปยังจุดที่กำหนดได้ ถ้ามีการกำหนดเงื่อนไข ในการตรวจสอบปัญหา ให้มากขึ้น การทำงานของโปรแกรม (หุ่นยนต์) ก็จะทำงานได้ถูกต้องและสมบูรณ์มากขึ้นด้วย

Instruction

Source/Target

Flag

Operation

JP

(HL)

ไม่มีผลกับ flag

PC <- HL

JP

(IX)

ไม่มีผลกับ flag

PC <- IX

JP

(IY)

ไม่มีผลกับ flag

PC <- IY

JP

nn

ไม่มีผลกับ flag

PC <- nn

JP

cc, nn

ไม่มีผลกับ flag

if cc then PC <- nn

JR

d

ไม่มีผลกับ flag

PC <- PC+d

JR

cc, d

ไม่มีผลกับ flag

if cc = 0 then PC <- PC+d

DJNZ

d

ไม่มีผลกับ flag

B <- B-1
if B != 0 then PC <- PC+d

ตาราง ชุดคำสั่งสำหรับการกระโดดแบบต่างๆ

หมายเหตุ

nn คือ ตัวเลขขนาด 16 บิต
cc คือ สถานะของ Flag อันได้แก่ NZ (Z=0), Z (Z=1), NC (C=0), C (C=1), PO (P=0), PE (P=1), P (S=0) และ M (S=1)
d คือ ตัวเลขขนาด 8 บิต มีค่าตั้งแต่ -126 ถึง 129

ตัวอย่างแรก เป็นตัวอย่างการคูณ กำหนดให้ตัวตั้ง เก็บใน Register C ตัวคูณ เก็บใน Register C แล้วกำหนดให้ผลลัพธ์เก็บใน Register L คำสั่งที่ใช้คือ

JP Z, mul1e
	;
	; Filename : Mul1.asz
	; Author     : Supachai Budsaratij   (raek@se-ed.net)
	; Date        : 04/01/2001
	; Hardware : ET-Board V6 (Z80 Mode)
	;            ET-Board V5
	;            ET-Board V4
	;            ET-Board V3.5 NewPower
	;            CP-jr180 Plus
	; Note     : L = C x B , C=3, B=5, and return the result to L.
	;
	;
	         INCL    "etv6.inz"         ; Include header for ET-V6
	;        INCL    "etv4.inz"         ; Include header for ET-V4
	;        INCL    "etv35.inz"        ; Include header for ET-V3.5
	;        INCL    "jr180.inz"        ; Include header for CP-jr180 Plus

	         ORG     UMEM_ORG        ; Start at UMEM_ORG

	main
	        LD      C,3             ; C = 3
	        LD      B,5             ; B = 5
	        LD      A,0             ; A = 0
	mul1:
	        ADD     A,C           ; A = A+C
	        LD      L,A             ; L = A
	        LD      A,B             ; A = B
	        SUB     1               ; A = A - 1
	; If Zero-flag = 1 then jump to mul1e
	        JP      Z, mul1e
	; else
	        LD      B,A             ; B = A
	        LD      A,L             ; A = L
	        JP      mul1            ; Do agian.
	mul1e:

	        HALT

	        END

ตัวอย่างที่ 2 ก็จะเป็นตัวอย่างโปรแกรมการหาร

	;
	; Filename   : Div1.asz
	; Author       : Supachai Budsaratij   (raek@se-ed.net)
	; Date          : 04/01/2001
	; Hardware  : ET-Board V6 (Z80 Mode)
	;            ET-Board V5
	;            ET-Board V4
	;            ET-Board V3.5 NewPower
	;            CP-jr180 Plus
	; Note     : L = C / H , C=20, H=3, and return the result to L.
	;
	;
	        INCL    "etv6.inz"           ; Include header for ET-V6
	;        INCL    "etv4.inz"          ; Include header for ET-V4
	;        INCL    "etv35.inz"        ; Include header for ET-V3.5
	;        INCL    "jr180.inz"             ; Include header for CP-jr180 Plus

	        ORG     UMEM_ORG        ; Start at UMEM_ORG

	main
	        LD      C,20            ; C = 20
	        LD      H,3              ; H = 3
	        LD      L,0               ; L = 0
	div1:
	        LD      A,C             ; A = C
	        SUB    H                ; A = A-H
	; If Sign-flag = 1 then jump to div1e
	        JP      M, div1e
	; else
	        LD      C,A             ; C = A
	        LD       A,L             ; A = L
	        ADD    A,1             ; A = A+1
	        LD       L,A             ; L = A
	        JP       div1            ; Do agian.
	div1e:

	        HALT

	        END

 

 

 

10. คำสั่งติดต่อกับ I/O

การติดต่อกับ I/O ซึ่ง Z80 นั้น ถูกออกแบบให้สามารถติดต่อกับ I/O ได้ถึง 256 พอร์ต นั่นก็คือ พอร์ตหมายเลข 0 จนถึง 255 (โดยแยกออกจากหน่วยความจำ ของ Z80) แต่ละพอร์ตนั้น จะ เป็นส่วนที่ติดต่อกับอุปกรณ์อะไรนั้น ขึ้นอยู่กับ ผู้ออกแบบบอร์ด เราจะอ้างอิง ET-BOARD V6 เป็นหลัก คำสั่งที่เกี่ยวกับ I/O มีดังนี้
ตาราง 13-1 ชุดคำสั่งสำหรับอ่านข้อมูลจาก I/O

Instruction

Source/Target

Flag

Operation

IN

A,(C)

Z, P, S, N=0, H

A = ข้อมูล ณ พอร์ตที่กำหนดโดย C

IN

A,(n)

ไม่มีผลกับ flag

A = ข้อมูล ณ พอร์ตที่ n

IN

B,(C)

Z, P, S, N=0, H

B = ข้อมูล ณ พอร์ตที่กำหนดโดย C

IN

C, (C)

Z, P, S, N=0, H

C = ข้อมูล ณ พอร์ตที่กำหนดโดย C

IN

D, (C)

Z, P, S, N=0, H

D = ข้อมูล ณ พอร์ตที่กำหนดโดย C

IN

E,(C)

Z, P, S, N=0, H

E = ข้อมูล ณ พอร์ตที่กำหนดโดย C

IN

H, (C)

Z, P, S, N=0, H

H = ข้อมูล ณ พอร์ตที่กำหนดโดย C

IN

L, (C)

Z, P, S, N=0, H

L = ข้อมูล ณ พอร์ตที่กำหนดโดย C

INI

ไม่มี

ถ้า B-1 เป็น 0 จะได้ Z=1 ไม่เช่นนั้น Z=0,
N=1

(HL) = ข้อมูลจากพอร์ตที่กำหนดโดย C
B <- B-1
HL <- HL + 1

INIR

ไม่มี

Z=1 และ N=1 เสมอ

(HL) = ข้อมูลจากพอร์ตที่กำหนดโดย C
B <- B-1
HL <- HL + 1
และทำจนกว่า B จะเป็น 0

IND

ไม่มี

ถ้า B-1 เป็น 0 จะได้ Z=1 ไม่เช่นนั้น Z=0,
N=1

(HL) = ข้อมูลจากพอร์ตที่กำหนดโดย C
B <- B-1
HL <- HL - 1

INDR

ไม่มี

Z=1 และ N=1 เสมอ

(HL) = ข้อมูลจากพอร์ตที่กำหนดโดย C
B <- B-1
HL <- HL - 1
และทำจนกว่า B จะเป็น 0

 
ตาราง 13-2 ชุดคำสั่งสำหรับเขียนข้อมูลจาก I/O

Instruction

Source/Target

Flag

Operation

OUT

(C),A

ไม่มีผลกับ flag

ส่งข้อมูลที่เก็บใน A ไปที่พอร์ตหมายเลข C

OUT

(n) ,A

ไม่มีผลกับ flag

ส่งข้อมูลที่เก็บใน A ไปที่พอร์ตหมายเลข n

OUT

(C) , B

ไม่มีผลกับ flag

ส่งข้อมูลที่เก็บใน B ไปที่พอร์ตหมายเลข C

OUT

(C), C

ไม่มีผลกับ flag

ส่งข้อมูลที่เก็บใน C ไปที่พอร์ตหมายเลข C

OUT

(C), D

ไม่มีผลกับ flag

ส่งข้อมูลที่เก็บใน D ไปที่พอร์ตหมายเลข C

OUT

(C), E

ไม่มีผลกับ flag

ส่งข้อมูลที่เก็บใน E ไปที่พอร์ตหมายเลข C

OUT

(C), H

ไม่มีผลกับ flag

ส่งข้อมูลที่เก็บใน H ไปที่พอร์ตหมายเลข C

OUT

(C), L

ไม่มีผลกับ flag

ส่งข้อมูลที่เก็บใน L ไปที่พอร์ตหมายเลข C

OUTI

ไม่มี

ถ้า B-1 เป็น 0 จะได้ Z=1 ไม่เช่นนั้น Z=0,
N=1

ส่งข้อมูลที่เก็บใน (HL) ไปที่พอร์ตหมายเลข C
B <- B-1
HL <- HL + 1

OTIR

ไม่มี

Z=1 และ N=1 เสมอ

ส่งข้อมูลที่เก็บใน (HL) ไปที่พอร์ตหมายเลข C
B <- B-1
HL <- HL + 1
และทำจนกว่า B จะเป็น 0

OUTD

ไม่มี

ถ้า B-1 เป็น 0 จะได้ Z=1 ไม่เช่นนั้น Z=0,
N=1

ส่งข้อมูลที่เก็บใน (HL) ไปที่พอร์ตหมายเลข C
B <- B-1
HL <- HL - 1

OTDR

ไม่มี

Z=1 และ N=1 เสมอ

ส่งข้อมูลที่เก็บใน (HL) ไปที่พอร์ตหมายเลข C
B <- B-1
HL <- HL - 1
และทำจนกว่า B จะเป็น 0

 
ชุดคำสั่งที่เกี่ยวข้องกับการติดต่อกับ I/O ทั้งในกลุ่มของ INPUT และ OUTPUT จะมีการสั่งการได้ 2 ลักษณะ คือ แบบอาศัย Register แล้วส่งไปยังพอร์ต หรืออ่านจากพอร์ตมา เก็บใน Register กับแบบที่มีการส่งข้อมูลจากหน่วยความจำไปที่พอร์ต และอ่านจากพอร์ตมาเก็บในหน่วยความจำ โดย แบบหลังนี้จะทำงานเป็นกลุ่มข้อมูล
ตัวอย่าง ต้องการเขียนโปรแกรม สำหรับ สั่งให้หลอด LED บนบอร์ดนั้น ติด/ดับ สลับกันไปเรื่อยๆ ตัวอย่างโปรแกรม 2 โปรแกรม เป็นของ ET-V6 กับ ET-V4 ดูโปรแกรม และผลลัพธ์ของ ET-V6
	;
	; Filename   : IO1.asz
	; Author       : Supachai Budsaratij   (raek@se-ed.net)
	; Date          : 04/08/2001
	; Hardware  : ET-Board V6 (Z80 Mode)
	;
	            INCL    "etv6.inz"         ; Include header for ET-V6


	P_DIGIT           EQU     S8255_PA
	P_SEGM           EQU     S8255_PB
	P_LEDFLAG     EQU     6

	            ORG     UMEM_ORG        ; Start at UMEM_ORG

	main      LD      D,0
	              LD      BC,1

	; --- Move light
	loop       LD        A,P_LEDFLAG      ; Select LED FLAG device
	             OUT      (P_DIGIT),A          ;
	             LD        A,D                        ; Send the data to LED
	             OUT     (P_SEGM),A          ;
	;--- Delay
	            LD      HL,8000h
	delay       SBC     HL,BC
	            JP      NZ,delay

	;--- Swap the pattern of the LED.
	            LD         A,0FFh
	            SUB      D
	            LD        D,A
	;--- Do again
	            JR        loop

	            END
โปรแกรมสำหรับ ET-V4
	;
	; Filename   : IO1a.asz
	; Author       : Supachai Budsaratij   (raek@se-ed.net)
	; Date          : 04/08/2001
	; Hardware  : ET-Board V4
	;
	            INCL    "etv4.inz"               ; Include header for ET-V4

	            ORG     UMEM_ORG        ; Start at UMEM_ORG

	main        LD      D,0
	                LD      BC,1

	; --- Move light
	loop        LD        A,D                   ; Send the data to LED
	               OUT     (LED_FLAG),A   ;
	;--- Delay
	               LD       HL,8000h
	delay      SBC     HL,BC
	              JP         NZ,delay

	;--- Swap the pattern of the LED.
	            LD         A,0FFh
	            SUB      D
	            LD        D,A
	;--- Do again
	            JR      loop

	            END

Stack

stack เป็นการจัดการกับหน่วยความจำรูปแบบหนึ่ง ซึ่งอาศัยหลักการทำงานที่เรียก LIFO (Last In First Out) หรือ เรียกอีกอย่างหนึ่งได้ว่า ข้อมูลที่ใส่เข้าไปทีหลัง จะถูกนำออกมาก่อนข้อมูลที่เราใส่ไปก่อนหน้าข้อมูลชุดนั้นๆ

การกระทำที่เราใช้กับหน่วยความจำ stack นั้นมี 2 อย่าง คือ การ Push และ Pop

Push เป็นความหมายแทนการนำข้อมูลไปเก็บเอาไว้ในหน่วยความจำ stack
Pop เป็นความหมายแทนการนำข้อมูลออกมาจากหน่วยความจำ stack

หมายความว่า แต่ละครั้งที่สั่ง push ก็จะมีการนำข้อมูลไปซ้อนเอาไว้ด้านบนของข้อมูลที่เราได้ push ไปก่อนหน้านี้ เช่น ได้สั่งเรียงลำดับดังต่อไปนี้

		push   5
		push   10
		push   2
		push   14

ในหน่วยความจำของ stack ก็จะเป็นดังนี้

ลำดับ

ข้อมูล

4

14

3

2

2

10

1

5

ดังนั้น ในการสั่ง pop ก็จะได้ข้อมูลเรียงออกมาเป็นดังนี้คือ 14,2,10 และ 5 ตรงนี้จะเห็นว่า ข้อมูลตัวแรกที่เราใส่ใน stack ซึ่งก็คือ 5 จะออกมาเป็นตัวสุดท้าย แต่ข้อมูลที่เรา push เป็นลำดับสุดท้าย จะออกมาเป็นตัวแรก เรียกว่า LIFO หรือ Last In First Out (เข้าทีหลังออกก่อน)

ใน Z80 นั้น มีการทำงานแบบ stack ซึ่งการทำงานของ stack นั้น จะทำงานแบบ 16 บิต หมายความว่า การ push และ pop จะเป็นการทำงานกับข้อมูลขนาด 16 บิต นอกจากนี้ Z80 ก็จะมี รีจิสเตอร์ ที่ชื่อ SP เป็นตัวเก็บค่าตำแหน่งของหน่วยความจำ ที่เอาไว้ใส่ (push) ข้อมูลชุดถัดไป ... ลักษณะการทำงานของ stack ของ z80 นั้นเป็นแบบการลดค่า ซึ่งหมายความว่า เริ่มต้นนั้น SP จะเก็บค่าของตำแหน่งเริ่มต้นของ stack สมมติว่าเป็น 7FFFh หลังจากนั้น พอใช้คำสั่ง push ค่าของ SP ก็จะถูกลดลง จาก 7FFFh มาเป็น 7FFDh และถ้า push ข้อมุลลงไปอีก ค่าของ SP ก็จะเหลือเป็น 7FFBh ลักษณะอย่างนี้เป็น stack แบบ ลดค่า ... ดังนั้น เวลาที่ pop ค่าของ SP ก็จะเพิ่มขึ้นมา เช่น สั่ง POP 1 ครั้ง โดย ก่อนหน้านี้ SP มีค่าเป็น 7FFBh หลังจาก คำสั่ง POP ทำงานเสร็จแล้ว ค่าของ SP ก็จะเปลี่ยนมาเป็น 7FFDh ... แล้วถ้า POP อีกครั้ง ค่าของ SP ก็จะเป็น 7FFFh ตามลำดับ หมายเหตุ ที่ต้องระวังก็คือว่า ถ้า POP ไปเรื่อยๆ ค่าของ SP ก็จะเพิ่มไปเรื่อยๆ และ ในทางกลับกัน ถ้าเราสั่ง PUSH ไปเรื่อยๆ ค่าของ SP ก็จะลดลงเรื่อยๆ

ทั้งหมดที่กล่าวมานั้น เป็นหลักการทำงานของ stack คำสั่งที่เกี่ยวข้องกับ stack ใน z80 มีคำสั่งที่เกี่ยวกับ stack ดังนี้ครับ

Instruction

Source/Target

Flag

Operation

PUSH

qq

-

(SP-2) <--LO(qq), (SP-1)<--HI(qq) ; SP=SP-2

PUSH

IX

-

(SP-2) <--LO(IX), (SP-1) <--HI(IX) ; SP=SP-2

PUSH

IY

-

(SP-2) <--LO(IY) , (SP-1) <-- HI(IY) ; SP = SP-2

POP

qq

-

HI(qq) <-- (SP+1) , LO(qq) <-- (SP) ; SP = SP+2

POP

IX

-

HI(IX) <-- (SP+1), LO(IX) <-- (SP) ; SP = SP+2

POP

IY

-

HI(IY) <-- (SP+1) , LO(IY) <-- (SP) ; SP = SP+2

ตาราง 6-1 ชุดคำสั่งสำหรับ Stack

หมายเหตุ qq เป็นรีจิสเตอร์คู่ 16 บิต อันได้แก่ AF, BC, DE และ HL

ตัวอย่างโปรแกรม

        ;
        ; Filename   : TStack.asz
        ; Author      : Supachai Budsaratij   (raek@se-ed.net)
        ; Date          : Dec 23, 2000
        ; Hardware  : ET-Board V6 (Z80 Mode)
        ;
                INCL    "etv6.inz"               ; Inlude header for ET-V6
                ORG     UMEM_ORG        ; Start at UMEM_ORG

        main
        ; --- My code here
                LD         HL,1C2Ah
                PUSH    HL
                LD         DE,2A00h
                PUSH    DE
                LD         HL,0000h
                POP       HL
                POP      DE
        ; ---End of program
                HALT

                END

เมื่อคีย์โปรแกรมเสร็จแล้วให้ save ชื่อไฟล์เป็น tstack.asz หลังจากนั้น ก็สั่งคอมไพล์ดังนี้

	az80    tstack.asz    -l tstack.lst   -o tstack.hex

ไฟล์ .LST ที่ได้จากการคอมไพล์

                        ;
                        ; Filename   : TStack.asz
                        ; Author      : Supachai Budsaratij   (raek@se-ed.net)
                        ; Date          : Dec 23, 2000
                        ; Hardware  : ET-Board V6 (Z80 Mode)
                        ;
                        ;
                                INCL    "etv6.inz"         ; Inlude header for ET-V6
                        ;
                        ; filename    : etv6.inz
                        ; assembler  : az80
                        ; author        : Supachai Budsaratij (raek@se-ed.net)
                        ; hardware   : et-board 6 (Z-80 mode)
                        ; date           : October 12,2000
                        ;
                        ; --- MEMORY
                        ;
   8000                UMEM_ORG         EQU      08000h     ; User RAM start
   bdff                 UMEM_END         EQU      0BDFFh    ; User RAM end
   c000                XMEM_ORG         EQU      0C000h    ; Expand RAM end
   dfff                 XMEM_END          EQU      0DFFFh    ; Expand RAM end
                        ; --- I/O
                        ;
   0000                 S8255_PA        EQU     00h     ; System 8255 port A
   0001                 S8255_PB        EQU     01h     ; System 8255 port B
   0002                 S8255_PC        EQU     02h     ; System 8255 port C
   0003                 S8255_CT        EQU     03h     ; System 8255 control port
                        ;
   0020                 U8255_PA        EQU     20h     ; User 8255 port A
   0021                 U8255_PB        EQU     21h     ; User 8255 port B
   0022                 U8255_PC        EQU     22h     ; User 8255 port C
   0023                 U8255_CT        EQU     23h     ; User 8255 control port
                        ;
   004d                 SCN_INP         EQU     4Dh     ; SCN2681- Input port (Switch)
   004e                 SCN_SEO         EQU     4Eh     ; SCN2681- Set output port (LED)
   004f                 SCN_REO         EQU     4Fh     ; SCN2681- Reset output port(LED)
                        ;
   0060                 CLCD_WC         EQU     60h     ; Character LCD write command
   0061                 CLCD_RC          EQU     61h     ; Character LCD read command
   0062                 CLCD_WD         EQU     62h     ; Character LCD write data
   0063                 CLCD_RD          EQU     63h     ; Character LCD read data
                        ;
   0064                 GLCD_WC1        EQU     64h     ; Graphics LCD write command (P1)
   0065                 GLCD_RC1         EQU     65h     ; Graphics LCD read command  (P1)
   0066                 GLCD_WD1        EQU     66h     ; Graphics LCD write data    (P1)
   0067                 GLCD_RD1         EQU     67h     ; Graphics LCD read data     (P1)
                        ;
   0068                 GLCD_WC2        EQU     68h     ; Graphics LCD write command (P2)
   0069                 GLCD_RC2         EQU     69h     ; Graphics LCD read command  (P2)
   006a                 GLCD_WD2        EQU     6Ah     ; Graphics LCD write data    (P2)
   006b                 GLCD_RD2         EQU     6Bh     ; Graphics LCD read data     (P2)
                        ;
   000a                 DD      EQU      0AH
   0020                 EE      EQU      20H
   a000                 NN     EQU      0A000H
   000a                 N        EQU       0AH
                        
   8000                           ORG     UMEM_ORG        ; Start at UMEM_ORG
   8000                 main
                        ; --- My code here
   8000   21 2a 1c              LD      HL,1C2Ah
   8003   e5                        PUSH    HL
   8004   11 00 2a              LD      DE,2A00h
   8007   d5                        PUSH    DE
   8008   21 00 00              LD      HL,0000h
   800b   e1                        POP     HL
   800c   d1                        POP     DE
                        ; ---End of program
   800d   76                      HALT
                        
   800e                 	END


0061  CLCD_RC         0063  CLCD_RD        0060  CLCD_WC        0062  CLCD_WD   
000a  DD                      0020  EE                     0065  GLCD_RC1       0069  GLCD_RC2  
0067  GLCD_RD1       006b  GLCD_RD2      0064  GLCD_WC1     0068  GLCD_WC2  
0066  GLCD_WD1      006a  GLCD_WD2     000a  N                        a000  NN        
0003  S8255_CT          0000  S8255_PA         0001  S8255_PB          0002  S8255_PC  
004d  SCN_INP           004f  SCN_REO         004e  SCN_SEO          0023  U8255_CT  
0020  U8255_PA         0021  U8255_PB        0022  U8255_PC         bdff  UMEM_END  
8000  UMEM_ORG     dfff  XMEM_END     c000  XMEM_ORG    8000  main      

ส่วนไฟล์ HEX ก็จะมีลักษณะของข้อมูลในไฟล์ดังนี้

	:0E800000212A1CE511002AD5210000E1D176CD
	:00800E0171

ทดสอบโปรแกรม

หลังจากได้ไฟล์ฐานสิบหกมาแล้ว ขั้นตอนต่อไปของเราก็คือ ส่งไฟล์ ฐานสิบหกนี้ไปเก็บไว้ที่ตัวบอร์ด เรามาดูกันตามลำดับ

รูปที่ 6-1 โหลดโปรแกรมไปที่บอร์ด

หลังจากที่โหลดเสร็จแล้ว ก็เริ่มทำการ trace ทีละ step โดยสั่งว่า t 8000 ผลลัพธ์จากออกมาดังรูป 6-2 คำสั่งแรกที่สั่งให้ z80 ทำก็คือ LD HL, 1C2Ah ซึ่งเป็นการนำค่า 1C2Ah ไปเก็บในรีจิสเตอร์ HL โดยในการเก็บนั้นจะแบ่ง

ข้อมูลเป็น 2 ไบต์ ส่วนหนึ่งเก็บเอาไว้ที่ รีจิสเตอร์ H (จากรูปจะเห็นว่า H เก็บ 1C) อีกตัวหนึ่งเก็บเอาไว้ใน รีจิสเตอร์ L( เก็บ 2A)

 
รูปที่ 6-2 ผลจากการสั่ง trace ครั้งที่ 1

คำสั่งต่อมาเป็นคำสั่ง PUSH HL ซึ่งผลลัพธ์ของการทำงานก็คือ ที่ (SP) เก็บค่า 1C2A (เพราะ HL เก็บค่า 1C2A) และค่าของ SP ถูกลดจากเดิม (ดูรูป 6-2 เทียบกับ 6-3) คือ จาก BF20 มาเป็น BF1E

รูปที่ 6-3 ผลจากการสั่ง trace ครั้งที่ 2

ในการ trace ครั้งที่ 3 จะได้ว่า คำสั่งที่เห็ฯคือ LD DE,2A00h จึงทำให้รีจิสเตอร์ DE เก็บค่า 2A00h เอาไว้ ดังรูป 6-4

รูปที่ 6-4 ผลจากการสั่ง trace ครั้งที่ 3

หลังจากเอาค่าใน 2A00h เก็บใน DE แล้ว คราวนี้คำสั่งที่สั่งเป็นลำดับต่อมาก็คือ PUSH DE ทำให้ค่าของ SP ลดลงไปอีก 2 ไบต์ (เปรียบเทียบได้จากรูป 6-4 กับ 6-5) แต่ข้อมูลที่ถูกชี้โดย SP หรือที่เห็นในรูป 6-5 เป็น (SP) นั้นก็จะเป็น 2A00 ซึ่งก็คือค่าที่เราเพิ่งจะ PUSH เข้าไปนั่นเอง

 
รูปที่ 6-5 ผลจากการสั่ง trace ครั้งที่ 4

การ trace ครั้งต่อมา เป็นการทำให้ค่าของ HL เป็น 0 ดังรูป 6-6

 
รูปที่ 6-6 ผลจากการสั่ง trace ครั้งที่ 5

เมื่อกำหนดให้ HL เป็น 0 ไปแล้ว จากคำสั่งก่อนหน้านี้ ตอนนี้ก็ลอง POP HL ซึ่งหมายความว่า เอาค่าจากส่วนบนสุดของ stack มาเก็บในรีจิสเตอร์ HL ในรูป 6-7 จะเห็นว่า SP ถูกเพิ่มค่าจากเดิม ในรูป 6-6 เป็น BF1C มาเป็น BF1E เหมือนในรูป 6-3 และค่าของ HL ก็เป็น 2A00 เหมือน DE ทั้งนี้เพราะ เราเอาค่าของ DE ใส่ลงไปใน stack จากคำสั่งก่อนหน้านี้ (เพราะอย่างนี้ stack จึงถูกเรียกว่า LIFO ไงครับ)

รูปที่ 6-7 ผลจากการสั่ง trace ครั้งที่ 6

คราวนี้มาลอง POP DE ดูบ้าง ซึ่งผลลัพธ์ (ดูรูป 6-8) ก็คือ ค่าที่เก็บอยู่ใน stack ซึ่งก็คือ 1C2A ก็จะถูกนำมาเก็บใน DE นอกจากนี้ SP ก็จะถูกเพิ่มค่าอีก 2 ไบต์ จาก BF1E มาเป็น BF20 เหมือนตอนแรกที่โปรแกรมทำงาน (ดูได้จากรูป 6-2) สรุปได้ว่า จากโปรแกรมที่เขียนไปทั้งหมด ก็มีความหมายว่า เราทำการสลับค่าที่เก็บใน HL กับ DE นี่เป็นประโยชน์อย่างหนึ่งของ stack ที่ทำให้สามารถสลับค่าระหว่าง รีจิสเตอร์ได้ง่ายๆ

รูปที่ 6-8 ผลจากการสั่ง trace ครั้งที่ 7

ส่วนคำสั่งสุดท้าย ก็คือ HALT หรือให้ z80 หยุดทำงาน

 
รูปที่ 6-9 ผลจากการสั่ง trace ครั้งที่ 8
 
 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

การเชื่อมต่อ Input/Output

หลักการแนวคิดและทฤษฎี
กระบวนการ Input Output (I/O) ใช้ในการถ่ายโอนข้อมูล ระหว่าง Micro computer กับโลกภายนอกตรรกะทาง I/O ส่วนใหญ่จะบรรจุอยู่ใน Rom หรือ Ram โดยนอกจากRom Ram จะมีความสามารถในทางMemory function แล้วมันยังมีความสามารถในการทำคำสั่งทาง I/O ด้วย
โดยปกติจะมีวิธีที่ใช้ในการถ่ายโอนข้อมูลระหว่าง Micro processer กับอุปกรณ์ภายนอกอยู่ 3 วิธี คือ

1. Interrupt I/O

ไมโครโปรเซสเซอร์ สามารถถ่ายโอนข้อมูล ผ่านจากอุปกรณ์ภายนอก กับตัวมัน โดยใช้ Interrupt I/O มีหลักการคือ ไมโครโปรเซสเซอร์จะมี pin อยู่อัน หนึ่งที่เรียกว่า Interrupt pin (INT) อุปกรณ์ภายนอกจะเชื่อมต่ออยู่กับ pin นี้เมื่อ I/O อุปกรณ์ภายนอกต้องการจะสื่อสารกับ ไมโครโปรเซสเซอร์ มันจะส่งสัญญาณผ่านทาง Interrupt pin เป็น High หรือ Low ขึ้นกับไมโครโปรเซสเซอร์ แต่ละตัวว่าจะ active แบบใด ไมโครโปรเซสเซอร์จะตอบสนอง โดยมันจะกระทำ คำสั่งที่กำลังทำอยู่ให้เสร็จ แล้วจะเก็บค่า pc และ register อื่นๆที่จำเป็นลงใน Stack จากนั้นจึง load ค่า address หนึ่งมาใส่ใน pc เพื่อจะกระโดดไปทำ Sub routine ซึ่งผู้ใช้เขียนขึ้น เราเรียกโปรแกรมนี้ว่า Interrupt service routine เป็นโปรแกรม ที่อุปกรณ์ภายนอกต้องการให้ไมโครโปรเซสเซอร์กระทำ เพื่อการถ่ายโอนข้อมูล คำสั่งสุดท้ายของ Service routine จะมีคำสั่ง return อยู่ เหมือน Sub routine
ทั่วไป ซึ่งคำสั่งนี้จะดึงค่า address กลับออกมาจาก Stack มาใส่ใน pc จากนั้น ไมโครโปรเซสเซอร์ จะดำเนินการใน program หลักที่ทำค้างไว้ต่อไป ตัวอย่างการเชื่อมต่อ A/D Convertor กับ ไมโครโปรเซสเซอร์ ผ่านทาง
Interrupt I/O

จากรูป เราสมมติว่า ไมโครโปรเซสเซอร์ ต้องการอ่านข้อมูล จาก (Output) ของ A/D Convertor (อุปกรณ์ภายนอก) ผ่านทาง Interrupt pin โดยใช้ Interrupt I/O สมมติว่าตอนนี้ ไมโครโปรเซสเซอร์กำลังกระทำ main program อยู่ ดังนี้

 

2005

3E

MVI A,03

2006

03

 

2007

D3

OUT 00

2008

00

 

2009

3E

MVI A,02

200A

02

 

200B

D3

OUT 00

200C

00

 

200D

3A

LDA 2035

200E

35

 

200F

20

 

2010

E6

ANI 02

2011

02

 

และก่อนหน้า address 2005 นั้น port 00,01 ได้ถูกกำหนดไว้แล้ว คำสั่ง 2005-200C จะให้สัญญาณ START PULSE และส่ง high ไปที่ OUTPUT ENABLE ของ A/D Convertor สังเกตุว่า OUTPUT ENABLE ในตอนนี้จะต้องเป็น High เพื่อป้องกันไม่ให้ Output ใดๆ ออกมาในตอนนี้ ต่อมา ไมโครโปรเซสเซอร์จะกระทำคำสั่ง LDA 2035 ที่ address 200D ถ้าในขณะนี้ ไมโครโปรเซสเซอร์กำลังทำคำสั่งนี้อยู่ แล้ว DATAVALID ของ A/D Convertor ขึ้น High แสดงว่าการแปลงเสร็จสมบูรณ์แล้ว ซึ่งจะส่งผล
ให้ขา Interrupt ของไมโครโปรเซสเซอร์ขึ้น High ด้วย นั่นคือขา Interrupt ของไมโครโปรเซสเซอร์ถูกกระตุ้น (หรือไมโครโปรเซสเซอร์ ถูก Interrupt นั่นเอง) ไมโครโปรเซสเซอร์ จะกระทำคำสั่งปัจจุบัน ที่กำลังทำอยู่ให้เสร็จ
(ในขณะนี้คือคำสั่ง LDA 2035) และเก็บค่า pc ลง Stack (ค่า pc ในขณะ นี้คือ 2010) แล้วจึงกระโดดไปทำ Service routine โดยปกติผู้ผลิตไมโคร โปรเซสเซอร์จะเป็นผู้กำหนดว่า address ไหนจะเป็น start address สำหรับให้ผู้ใช้ เขียน Sub routine สมมติว่าเป็น 3015 ไมโครโปรเซสเซอร์จะกระโดดใปที่ 3015 ซึ่งที่นั่นจะมี Service routine ที่ผู้ใช้เขียนรออยู่แล้ว ซึ่งเป็นService routine สำหรับการอ่านข้อมูลจาก Output ของ A/D Convertor เข้าสู่ Accumulator ดังนี้

Address Opcode Mnemonic Detail

3015

3E

MVI A,00

Enable A/D Convertor

3016

00

   

3017

D3

OUT 00

 

3018

00

   

3019

DB

IN 01

Input A/D Convertor output

301A

01

   

301B

FB

EI

Enable Interrupt

301C

C9

RET

 


คำสั่ง EI ที่ 301B จะสั่งให้ ไมโครโปรเซสเซอร์รับ Interrupt อื่นๆได้ เพราะว่าไมโครโปรเซสเซอร์บางตัว เช่น 8085/8080 มันจะทำการ disable Interrupt โดยอัตโนมัตทันที หลังจากที่มีการเรียก Interrupt เข้ามาครั้งแรก และคำสั่ง RET ที่ 301C จะทำการดึงค่า 2010 ออกจาก Stack มาใส่ใน pc ดังนั้นไมโครโปรเซสเซอร์ ก็จะ
กลับไปทำงานที่ main program ได้ต่อไปตามปกติที่กล่าวมาเป็นหลัก การพื้นฐานของ Interrupt I/O ตอนนี้เราจะมา พูดถึงคุณสมบัติที่สำคัญของมันดังนี้

1.1 Interrupt type
โดยปกติจะมี Interrupt 2 ชนิดคือ Interrupt ภายนอกและ Interrupt ภายใน Interrupt ภายนอกมักเป็นการที่อุปกรณ์ภายนอกทำการ Interrupt ผ่าน Interrupt pin ของไมโครโปรเซสเซอร์ ซึ่ง Interrupt ภายนอก นั้นสามารถแบ่งออกได้เป็น 2 แบบคือ

1.2 Maskable Interrupt
ซึ่งสามารถสั่งให้ทำงานหรือไม่ทำงานได้ โดยใช้คำสั่ง EI,DI ถ้าเป็นคำสั่ง DI ไมโครโปรเซสเซอร์จะไม่สนใจ maskable Interrupt สำหรับไมโครโปรเซสเซอร์บางตัวเช่น 8086 จะมี Interrupt flag bit ภายใน status register โดยเมื่อ Interrupt ถูก Disable Interrupt flag จะเป็น 1 และไม่มี maskable Interrupt มาแทรกการทำงานของไมโคร โปรเซสเซอร์ได้อีก และเมื่อเป็น Enable Interrupt flag จะเป็น 0 การ Interrupt ก็ใช้งานได้ตามปกติ

1.3 Non Maskable Interrupt
เป็น Interrupt ที่มีลำดับความสำคัญ (Piority) สูงสุด เป็น Interrupt ที่ไม่สามารถ Enable หรือ Disable โดยคำสั่งใดๆ นั่นหมายความว่า ถ้า
Non maskable interrupt และ Maskable interrupt ถูกเรียกพร้อมๆ กัน ไมโครโปรเซสเซอร์จะไปทำ Non maskable interrupt ก่อนเสมอ โดยปกติ Maskable interrupt จะใช้เป็น Interrupt ที่เกี่ยวกับ Power
failure กล่าวคือ ปกติไมโครโปรเซสเซอร์ จะใช้ไฟ +5V DC ซึ่งแปลง มาจากไป 110V AC สมมติว่าไฟตกจาก 110V AC ลงมาถึง 90 V AC ไฟ DC ที่แปลงก็ไม่สามารถรักษาระดับไว้ได้ที่ 5 V ได้ ภายในไม่กี่ ไมโครวินาที ก่อนที่ไฟจะตกต่ำกว่า 90 V วงจรตรวจจับความล้มเหลว ของไฟฟ้าจะทำการ Interrupt ไมโครโปรเซสเซอร์ ให้ไปทำ Service routine ซึ่งจะทำให้ ไมโครโปรเซสเซอร์ทำการเก็บค่าขอ้มูลสำคัญลงใน Memory
ที่มี battery คอยจ่ายไฟ และเมื่อไฟฟ้ากลับสู่สภาวะเดิม Program ก็จะดำเนินต่อไปได้ โดยไม่มีการสูญเสียข้อมูล ไมโครโปรเซสเซอร์บาง ตัวมี Maskable handshaking Interrupt ซึ่ง Interrupt ชนิดนี้จะใช้ 2 pin คือ INTR และ INTA เมื่อ INTR pin ถูกกระตุ้น ไมโครโปรเซสเซอร์จะทำคำ สั่งที่ทำค้างอยู่ให้เสร็จ จากนั้นจะเก็บค่า pc ลง Stack แล้วส่ง INTA ไปให้อุปกรณ์ภายนอก อุปกรณ์ภายนอกจะมีคำสั่งเช่น Call ส่งไปทาง
Data bus ไมโครโปรเซสเซอร์จะอ่านคำสั่งนี้และกระทำเพื่อจะกระโดด ไปทำ Service routine ที่ต้องการ แต่ถ้าเป็น EI Interrupt ภายใน โดย ปกติ Interrupt ภายในจะถูกเรียกโดยเงื่อนไขพิเศษ อย่างเช่น การเกิด
Overflow ,การหารด้วย 0 ,การทำงานใน Opcode ที่ผิดปกติ ลักษณะการทำงานของ Interrupt ภายในจะเหมือนกับ Interrupt ภายนอก ผู้ใช้จะเขียน Service routine เพื่อตรวจสอบความถูกต้อง และจะตรวจ
จับเงื่อนไขที่ผิดพลาดที่อาจเกิดขึ้นได้ Interrupt ภายใน อาจเกิดจากการกระทำชุดคำสั่ง Interrupt software
หรือ TRAPS เมื่อหนึ่งในคำสั่ง เหล่านี้ถูกกระทำไมโครโปรเซสเซอร์ ก็จะถูก Interrupt และให้บริการเช่นเดียวกับที่ทำกับ Interrupt ภายนอก ชุดคำสั่ง Software Interrupt มักถูกใช้ เพื่อเรียก OS คำสั่งเหล่านี้สั้นกว่าคำสั่ง call เรียก sub routine แถมยังไม่จำเป็นต้องรู้ address ของ OS ใน Memory อีกด้วย คำสั่ง softare Interrupt เหล่านี้ อณุญาตให้ผู้ใช้เปลี่ยนจาก user mode ไปเป็น แบบ superviser mode ได้ สำหรับบาง ไมโครโปรเซสเซอร์ Software Interrupt เป็นทางเดียวที่จะเรียก OS ได้ เนื่องจากไม่อณุญาติให้ Sub routine ไปเรียก address ใน OS

1.4 Interrupt address Vector
ในการกระทำทาง Interrupt จะใช้วิธีนี้เป็นเทคนิคที่ใช้ในการหาจุด เริ่มต้นของ Sub routine (ที่ตัอง jump) ไป แตกต่างกันไปขึ้นอยู่กับ แต่ละไมโครโปรเซสเซอร์ สำหรับ ไมโครโปรเซสเซอร์ ชนิดเดียวกัน
ผู้ผลิตจะกำหนด address นั้นตายตัว สำหรับแต่ละ Interrupt แต่บางตัวผู้ผลิตใช้วิธีการทางอ้อม เขาจะกำหนด location แบบตายตัวให้กับ Interrupt address vector แทน การประหยัด register เมื่อไมโครโปรเซสเซอร์ ถูกInterrupt มันจะเก็บอย่างน้อยที่สุดคือ pc ลงใน stack เพื่อจะได้กลับมา ทำงานโปรแกรมเดิม หลังจากไปทำ Sub routine ของแต่ละ Interrupt ได้อย่างถูกต้อง ไมโครโปรเซสเซอร์บางตัวจะ save ค่า pc และ status register เพียง 2 ตัว ลงใน stack ก่อนที่จะทำ Interrupt routine บางไมโครโปรเซสเซอร์ ก็ save register ทุกตัวลงใน stack ทั้งหมด ผู้ใช้ควรทราบว่า register ตัวใดบ้างที่ถูก save ก่อนไปทำ Interrupt routine เรียกค่าเดิมกลับมาได้อย่างถูกต้อง

1.5 การลำดับขั้นความสำคัญของ Interrupt ( Interupt priority)
ปกติแล้ว ไมโครโปรเซสเซอร์ จะมี Interrupt pin ตั้งแต่ 1 pin ขึ้นไปบน chip เดียว ดังนั้นจึงต้องมีกลไกพิเศษในการดูแล จัดการกับ อุปกรณ์ภายนอก หลายๆ ดัวที่ใช้สายการ Interrupt เดียวกัน มี 2 วิธีหลัก ที่จะจัดการในเรี่อง Multiple Interrupt นั่นคือ polled กับ daisy chain

1.6 Polled Interrupt
เป็นวิธีที่ใช้กระบวนการทาง sw เป็นส่วนใหญ่ จึงช้ากว่า ถ้าเทียบกับ daisy chain ไมโครโปรเซสเซอร์จะตอบสนองด้วยการทำโปรแกรม Sub routine มาตรฐานโปรแกรมหนึ่งสำหรับทุกๆ อุปกรณ์ ลำดับความสำคัญ ของอุปกรณ์ ตัดสินจากลำดับซึ่ง routine เลิอกแต่ละอุปกรณ์ เพื่อที่จะกระทำการ Interrupt ไมโครโปรเซสเซอร์จะตรวจสถานภาพของแต่ ละอุปกรณ์ ภายใน Sub routine มาตรฐาน โดยเริ่มต้นจากอุปกรณ์ที่มี
ลำดับความสำคัญ (Priority) สูงสุด ทันทีที่ไมโครโปรเซสเซอร์รู้ตัวผู้เรียก Interrupt มันจะกระโดดไปทำ Sub routine สำหรับอุปกรณ์นั้นดังรูป

จากรูป อุปกรณ์ภายนอก dev1 -dev N ต่อกับ Interrupt line ของไมโครโปรเซสเซอร์ เมื่ออุปกรณ์ตัวใดตัวหนึ่ง (อาจมากกว่า 1 ตัว ก็ได้ ) กระตุ้น Interrupt line ให้เป็น high ไมโครโปรเซสเซอร์จะเก็บ
ค่า pc และ register บางตัวลงใน stack แล้วกระโดดไป ตาม address ที่ผู้ผลิตไมโครโปรเซสเซอร์กำหนดไว้สำหรับไมโครโปรเซสเซอร์นั้นๆ ผู้ใช้ก็สามารถเขียนโปรแกรมรอไว้ที่ address นี้เพื่อที่จะกำหนดว่าให้ตัว
ใดมีลำดับความสำคัญ (priority) สูงสุดเพี่อเริ่มต้นในการค้นหาอุปกรณ์ที่เรียก Interrupt สมมติอุปกรณ์ที่ต่ออยู่ทั้งหมดเป็น A/D Convertor แต่ละตัวก็จะมี logic ที่เกี่ยวกับการ poll ดังรูป

ให้สังเกตุว่าอุปกรณ์ที่ต่อกับ Interrupt line ทุกตัวนั้น ต้องเชื่อมด้วย logic "or" ทั้งหมดเพื่อจะได้กระตุ้น Interrupt ได้ทุกตัวตลอดเวลาตอนนี้เราจะสมมติว่า อุปกรณ์ภายนอก 1 และ 2 เป็น A/D Convertor
ที่ถูกให้สัญญาณ start pulse เข้าไปในเวลาใกล้เคียงกัน และผู้ใช้กำหนดกลไกของลำดับความสำคัญ (priority ) ได้ที่ Sub routine มาตรฐานตัวอย่างเช่น เมื่อ สัญญาณ BUSY จากอุปกรณ์ทั้งสองตัวเกิดขึ้น high (เป็นการบ่งชี้ว่า การแปลงได้เสร็จสมบูรณ์แล้ว) ไมโครโปรเซสเซอร์จะถูก Interrupt จากนั้นไมโครโปรเซสเซอร์จะตอบสนอง โดยการเก็บค่าอย่างน้อยที่สุดคือ pc ลง stack แล้ว load Interrupt address vector ลงใน pc ( Interrupt address vector นี้จะถูกกำหนดโดยผู้ผลิต ) เพื่อกระโดดไปทำงาน ซึ่ง ณ ที่นี้ Interrupt routine มาตรฐานจะถูกผู้ใช้เขียนไว้รออยู่แล้ว มันจะทำการตรวจสอบว่า อุปกรณ์ใดเป็นผู้เรียก Interrupt โดยมันจะส่งค่าๆหนึ่งไปทาง PA ให้แก่ อุปกรณ์ที่ 2 เพราะอุปกรณ์นี้มีลำดับความสำคัญสูงสุด (highest priority)
ซึ่งถ้าอุปกรณ์ตัวนี้เป็นผู้เรียกInterrupt แล้ว Output ที่ PB ที่ออกจาก AND gate จะเป็น high เพื่อตอบรับว่าตัวมันเป็นผู้เรียก Interrupt แต่ถ้า output ที่ออกจาก AND gate เป็น Low ไมโครโปรเซสเซอร์จะส่ง 1 ไปให้ PA0 และตรวจสอบว่า เป็น high หรือไม่ ทำเช่นนี้ไปเรื่อยๆ และทันทีที่ ไมโครโปรเซสเซอร์ รู้ว่าอุปกรณ์ใดเป็นผู้เรียกInterrupt มันจะกระโดดไปที่ Sub routine ของอุปกรณ์นั้นๆ ซึ่ง Sub routine นี้จะมีการสั่ง enable A/D Convertor และให้ ไมโครโปรเซสเซอร์ รับ input จาก output ของA/D Convertor Polled Interrupt เป็นวิธีที่ง่ายมาก แต่ถ้ามีอุปกรณ์จำนวนมากๆ เวลาที่ใช้ในการตรวจสอบแต่ละอุปกรณ์ก็ยิ่งมาก ซึ่งในกรณีนี้ เราจะใช้ daisy chain ซึ่งเป็นกลไกที่เร็วกว่าเข้ามาจัดการ

 

 

 

 

1.7 Daisy Chain Interrupt
ในเทคนิคนี้จะนำเอาอุปกรณ์ทุกตัวมาต่อร่วมในลักษณะของ daisy chain ดังรูป

สมมติว่ามีอุปกรณ์ 1 ตัวหรือมากกว่านั้น เรียก Interrupt ไมโครโปรเซสเซอร์ ไมโครโปรเซสเซอร์ก็จะตอบสนองโดยการเก็บค่าอย่างน้อยคือ pc ลงใน stack แล้วตอบรับโดยส่ง Interrupt Acknowledge (INA) ออกไป ให้กับอุปกรณ์ที่มี ลำดับความสำคัญสูงสุดก่อน สมมติว่าในที่นี้คือ device 1 ถ้า device 1 เป็นผู้เรียก
Interrupt จริงมันจะรับ INTA ไว้ แต่ถ้าไม่ใช่มันก็จะส่งผ่านสัญญาณ INRA ไปให้ device ที่มีลำดับความ

สำคัญ (priority) รองลงไป เช่นนี้เรื่อยๆ จนกระทั่งมี device ตัวใดรับ INTA ไป ทันทีที่รับไปนั้น device จะส่งเครื่องมืออย่างหนึ่งไปให้ไมโครโปรเซสเซอร์ เพื่อค้นหา Interrupt vector ซึ่งในขั้นตอนนี้จะทำโดย hardware ภายนอก เราจะสมมติ ให้อุปกรณ์ในรูป เป็น A/D Convertor ซึ่งมีกลไกและการต่อเชื่อมในดังรูป

สังเกตว่า อุปกรณ์ทุกตัวจะต่อเข้ากับ Interrupt line ในลักษณะการ or เพื่อจะให้ทุกๆตัวสามารถทำการเรียก Interrupt signal ได้ ตัวอย่างเช่น ในการต่ออุปกรณ์ดังรูป 2-50 เมื่อ ไมโครโปรเซสเซอร์
ส่งสัญญาณ pulse ไปเพื่อสั่งเริ่มการทำงานของ A/D Convertor และเมื่อสัญญาณ BUSY ของ A/D

Convertor ขึ้นเป็น High นั่นคือบ่งบอกว่าการ แปลงเสร็จสิ้น ในเวลาใกล้เคียงกัน สัญญาณนี้จะผ่านไป Interrupt ไมโครโปรเซสเซอร์ ทาง Interrupt line ไมโครโปรเซสเซอร์ จะเก็บค่าต่างๆลงใน
Stack แล้ว Active สัญญาณ INTA ให้เป็น low ไปให้ อุปกรณ์ ที่มีลำดับความสำคัญ (Priority) สูงสุด คือ Device 1 ดังรูป เนื่องจาก Device 1 เป็นตัวแรกใน daisy chain ที่จะได้รับสัญญาณ INTA ถ้า A/D Convertor เป็นผู้ส่งสัญญาณ Busy (เป็นผู้เรียก Interrupt ) แล้ว Output จาก And gate จะขึ้น High ซึ่งจะไปทำให้ Hardware ของอุปกรณ์ ภายนอกทำงานเพื่อจัดหา Interrupt address vector ลงใน Data line ของ ไมโครโปรเซสเซอร์ (D0-D7) ไมโครโปรเซสเซอร์ จะกระโดดไปทำ Service routine อันประกอบไปด้วย
การ Enable A/D Convertor และอ่าน input จาก output ของ A/D Convertor เข้าสูไมโครโปรเซสเซอร์ผ่านทาง Port B แต่ถ้า A/D Convertor 1 ไม่ได้เป็นผู้เรียก Interrupt นั่นคือสัญญาณ Busy เป็น Low แสดงว่า Interrupt ถูกเรียกมาจาก อุปกรณ์ตัวอื่น ฉะนั้นเมื่อดูจากรูปแล้ว Output ที่ออกจาก And gate จะเป็น Low จ่ายต่อไปยัง A/D Convertor2 ซึ่งก็เปรียบเสมือนการส่งต่อสัญญาณ INTA ต่อไปให้ A/D Convertor 2
ทำเช่นนี้ต่อไปเรื่อยๆ สิ่งที่น่าสังเกตุคือ อุปกรณ์ตัวสุดท้าย จะไม่ได้มี logic เช่นเดียวกับรูปที่2-51 เพราะตัวสุดท้ายจะต้องตอบรับ INTA เท่านั้น

2. Program I/O

ด้วยวิธีการถ่ายโอนแบบนี้ ไมโครโปรเซสเซอร์จะสื่อสารกับอุปกรณ์ภายนอกผ่านทาง. I/port buffer ซึ่งเรียกสั้นๆว่า I/O port I/O port เหล่านี้โรงงานที่ผลิตจะสร้างลงใน chip แบบเดียวกับ chip memory เพื่อจะได้ลดจำนวนและชนิดของ chip ที่ใช้ในระบบ อีกนัยหนึ่งก็คือ ใน chip เดี่ยวมักจะมีทั้ง ROM กับ I/O หรือ RAM กับ I/O อย่างเช่น Intel 8155 จะมีทั้ง RAM 256 byte และมี I/O port 8355/8755 มี ROM/EPROM 2 k และมี I/O port 2 อัน

โดยทั่วไป I/O port แต่ละตัวจะมี register 2 ตัวที่เกี่ยวข้อง ด้วย คือ data register กับ
data direction register

Data register จะเก็บค่า data จริงๆที่จะ input หรือ output จาก ไมโครโปรเซสเซอร์

Data direction register เป็น output register ใช้ประโยชน์ในการบ่งบอกแต่ละ bit
ใน Data register ว่า เป็น input หรือ output โดย เขียน 1,0 ลงใน data direction register
ตัวอย่างเช่น

ถ้า 1 ปรากฎใน Data direction register bit ใด แสดงว่า Data register bit นั้น จะเป็น Output ถ้าเป็น 0 ก็จะหมายถึงว่า เป็น Input ดังนั้นดูตามตัวอย่างในรูป หมายความว่า CPU ส่ง 10000101 ไปใส่ใน Data direction register เพื่อบ่งบอก ให้ bit ที่ 0,2,7 เป็น Output นอกจากนั้นเป็น input CPU จะสามารถส่งสัญญาณ Output ออกไปแสดงได้ เช่นในกรณีที่ต่อ LED เชื่อมกับ bit เหล่านี้ก็จะมีเพียง LED
ตัวที่ 0,2,7 เท่านั้นที่ แสดงออกได้ อุปกรณ์ภายนอกนั้นจะไม่มีผลเนื่องจากถูก set ให้เป็น Input เช่นเดียวกัน
ถ้า CPU อ่านข้อมูลจาก port I/O ซึ่งจะอ่านเข้ามาทุก bit แต่ CPU จะไม่สนใจ bit 0,2,7 โดยการใส่ค่า 0 ลงไปแทน และตัวโปรแกรมจะต้องรับทราบได้ว่า มันเป็น bit "don't care" นั่นเอง

ใน chip I/O บางตัว จะมี Data direction register เพียงตัวเดียว โดยจะเรียก ว่า Command,Control register เพื่อจะบ่งชี้ port I/O ทั้งหมดว่า เป็น input หรือ output และบาง bit ใน control register จะเป็นตัวบ่งชี้ port I/O ทั้งหมด 8 bit ว่าเป็น input หรือ output ตัวอย่างเช่น เรามี control register หนึ่งตัว กับมี port I/O อยู่ 2 port ใน chip ตัวหนึ่ง ดังรูป

โดยปกติแล้ว ถ้ากำหนด bit เป็น 0 จะหมายถึงให้ port I/O นั้นๆเป็น input port และถ้าเป็น 1 ก็คือเป็น output port จากรูป bit 0 ที่ Control register ตำแหน่ง 0 จะ set ให้ทั้ง 8 bit ของ port I/O A เป็น input และ 1 ที่ ตำแหน่ง 1 จะ set ให้ทั้ง 8 bit ของ port I/O B เป็น output

มี port I/O อีกแบบหนึ่งที่เรียกว่า Handshake port ซึ่งมี function ทั้งคู่ โดย port เหล่านี้ ไมโครโปรเซสเซอร์ จะสามารถใช้เป็นทางปกติสำหรับ input data หรือ output data ระหว่าง ไมโครโปรเซสเซอร์ กับ อุปกรณ์ภายนอก แต่ก็สามารถใช้เป็น Control register สำหรับควบคุม ถ่ายโอนข้อมูลผ่าน port อื่นๆ โดยใช้ handshaking ได้เช่นกัน

 

 

 

 

3. การเข้าถึง Memory โดยตรง ( Direct memory access )

Programmed I/O และ Interrupt I/O เป็นวิธีการถ่ายโอนข้อมูลระหว่าง ไมโครโปรเซสเซอร์ กับ อุปกรณ์ภายนอก ต่อไปนี้เราจะกล่าวถึงการ ถ่ายโอน ข้อมูลอีกแบบหนึ่ง ซึ่งใช้ในลักษณะการ ถ่ายโอนข้อมูลที่มีขนาดใหญ่ หรือ Large block transfer เช่น การ ถ่ายโอนข้อมูลระหว่าง อุปกรณ์เก็บข้อมูลกับ Memory หากใช้วิธีที่เคยกล่าวมา ไม่ว่าจะเป็น Programmed I/O หรือ Interrupt I/O จะเห็นได้ชัดว่า ไมโครโปรเซสเซอร์ จะต้องเข้าไปจัดการเกี่ยวข้องกับกระบวน ถ่ายโอนข้อมูลทั้งหมด ซึ่งโดยปกติ ไมโครโปรเซสเซอร์จะสามารถ ถ่ายโอนข้อมูล 1 byte ได้ในเวลา 5-10 ไมโครวินาที แต่ถ้าใช้วิธีการแบบ DMA ซึ่งสามารถ ถ่ายโอนข้อมูลได้โดยไม่ไปยุ่งเกี่ยวกับ ไมโครโปรเซสเซอร์ เลย โดยปกติ การถ่ายโอนข้อมูลในลักษณะนี้จะถ่ายโอนข้อมูลได้เร็วมาก ประมาณ 1 byte ต่อ 1 ไมโครวินาทีเท่านั้น และเพราะว่าการ ถ่ายโอนข้อมูลใน DMA จะไม่ยุ่งเกี่ยวกับ
ไมโครโปรเซสเซอร์ เพราะฉะนั้น การเชื่อมต่อ DMA กับ DMA Chip controller จึงต้องอณุญาติให้ Chip controller ทำการอ่านเขียน memory ได้เช่นเดียวกับที่ ไมโครโปรเซสเซอร์ทำได้ DMA Controller Chip จะต้องมีคุณสมบัติโดยทั่วไปดังนี้ DMA Controller Chip ต้องให้ ไมโครโปรเซสเซอร์อยู่ในสภาวะ Hold state โดยวิธีการส่งสัญญาน Hold control ไมโครโปรเซสเซอร์จะหยุดการกระทำ Program แล้วปลดการเชื่อมต่อระหว่างตัวมันกับ Address Bus , Data bus และ Memory Control line ทำให้ตัวมันอยู่ในสถานะ High-impidant DMA Controller Chip จะเข้าครอบครองดูแล Bus ทันทีที่ได้รับสัญญาณ DMA acknowledge จากไมโครโปรเซสเซอร์ มันจะใส่ Ram location ที่เหมาะสมลงใน address bus และใส่ Control signal ที่เหมาะสมลงใน Control bus เพื่อจะทำการถ่ายโอนข้อมูล DMA Controller Chip ควบคุมการถ่ายโอนข้อมูลทั้งหมด หลังจาก ที่ทำเสร็จแล้วมันจะโอนการควบคุมระบบ bus กลับไปให้กับ ไมโครโปรเซสเซอร์
โดยดึงไมโครโปรเซสเซอร์ I/Oกจาก Hold state จากข้อความข้างต้น เห็นได้ชัดว่า function โดยมากที่ DMA ใช้จะเหมือนกับของ ไมโครโปรเซสเซอร์ ดังนั้นผู้ผลิตทั้งหลายจึงI/Oกแบบ DMA Controller Chip I/O มาควบคู่กับ ไมโครโปรเซสเซอร์ ของตนด้วย DMA ที่ใช้กับไมโครโปรเซสเซอร์ มีอยู่ 2 ชนิด คือ Microprocessor Hult DMA และ Interleaved DMA Microprocessor Halt DMA ในการถ่ายโอนข้อมูลแบบนี้จะทำได้ทั้งแบบหยุดการทำงานของ ไมโครโปรเซสเซอร์ จนการ ถ่ายโอนข้อมูลเสร็จสิ้น หรือแบบการใช้เทคนิคที่เรียกว่า Cycle Stealing ในการถ่ายโอนข้อมูลระหว่าง Memory กับ อุปกรณ์ภายนอก ในกระบวนการทั้งคู่นี้ ไมโครโปรเซสเซอร์ จะต้องหยุดการกระทำของมันเพื่อการทำ DMA ในวิธีแรกจะเป็นการถ่ายโอนข้อมูลแบบทั้งกลุ่มหรือที่เรียกว่า Block Transfer DMA แต่ในแบบ Cycle Stealing DMA จะถ่ายโอนข้อมูลในลักษณะเป็น byte transfer และจะกระทำจนจบข้อมูล การตัดสินใจว่านะใช้วิธีการใดในการถ่ายโอนข้อมูล จะขึ้นกับความยาวของ block ข้อมูล ถ้า block ข้อมูบมีขนาดใหญ่หรือในกรณีที่ไมโครโปรเซสเซอร์ ไม่สามารถหยุดการทำงานได้ ก็จะใช้ Block Transfer แต่ถ้ามีขนาดเล็ก ก็จะใช้ Cycle Stealing การทำงานไม่ว่าจะเป็นแบบ Cycle Stealing หรือแบบ Block Transfer จะให้ DMA chip ในการควบคุมการทำงานทั้งหมด ซึ่ง chip นี้จะมี address register ตัวหนึ่ง ซึ่งเก็บค่า address ของข้อมูลที่จะถ่ายโอน และ ตัวนับ (counter) ซึ่งจะเก็บค่าความยาวของข้อมูลที่จะถูกถ่ายโอนข้อมูล address register จะเพิ่มค่าขั้นทีละ 1 ทุกๆครั้งที่ขอ้มูลถูกถ่ายโอน
1 byte ดังนั้น ข้อมูลจะถูกถ่ายโอนในลักษณะลำดับต่อเนื่องในตัวนับ จะบรรจุไปด้วยความยาวของข้อมูลที่ลดลงที่ละ å ทุกๆครั้งที่ข้อมูลถูกส่งไป 1 byte เช่นกัน และเมื่อตัวนับลดลงเป็น 0 การถ่ายโอนข้อมูล แบบ DMA ก็จะสมบูรณ์ ไมโครโปรเซสเซอร์ก็จะกลับมาควบคุม bus อีกครั้ง ( DMA Controller กับ ไมโครโปรเซสเซอร์ ไม่ขึ้นต่อกัน) register ภายใน ไม่ว่าจะเป็น address register และ register ตัวนับ จะถูกให้ค่าโดยไมโครโปรเซสเซอร์ ตอนนี้เราจะมาพูดถึงในเรื่องของรายละเอียดในแต่ละแบบ Block Transfer DMA นี่เป็น DMA แบบปกติทั่วๆไป ที่ใช้ใน ไมโครโปรเซสเซอร์ ดังที่ได้กล่าวมาก่อนหน้านี้แล้ว DMA ชนิดนี้ อุปกรณ์ภายนอกจะเรียกขอใช้การถ่าย โอนข้อมูล DMA ผ่านทาง DMA request line ซึ่งต่อโดยตรงผ่าน DMA Controller Chip ไปสู่ ไมโครโปรเซสเซอร์ ไมโครโปรเซสเซอร์ จะกระทำคำสั่งที่กำลังกระทำอยู่ให้เสร็จแล้วส่ง Hold acknowledge ไปให้ DMA Controller Chip DMA Controller Chip ก็จะส่ง DMA ACK ไปให้อุปกรณ์ I/O ภายนอก เพื่อบอกให้ทราบว่า bus นั้นพร้อมที่จะใช้ถ่ายโอนข้อมูลแบบ DMA แล้ว DMA Controller Chip จะกระทำการถ่ายโอนข้อมูลจนเสร็จแล้วก็นคืนการควบคุม bus ไปให้กับไมโครโปรเซสเซอร์ การถ่ายโอนข้อมูลแบบ Block Transfer DMA ดูได้จากแผนผังดังนี้ รูป อุปกรณ์ภายนอก จะขอการถ่ายโอนข้อมูลแบบ DMA ผ่าน DMA request line ซึ่งต่อกับ DMA Controller Chip DMA Controller Chip ก็จะตอบสนองโดยการส่งสัญญาณ HOLD สู่ ไมโครโปรเซสเซอร์ DMA Controller Chip จะรอจนได้รับสัญญาณ Hold Acknowledge (HLDA) กลับมาจาก
ไมโครโปรเซสเซอร์ เมื่อ DMA Controller Chip ได้รับ HLDA แล้ว มันจะส่ง DMAACK ไปให้อุปกรณ์ภายนอก แล้วตัวมันก็จะเข้าควบคุม bus และคุมการถ่ายโอนข้อมูล ระหว่าง ram กับ อุปกรณ์ภายนอก เมื่อการถ่ายโอนข้อมูลเสร็จเรียบร้อย DMA Controller Chip ก็จะคืนการควบคุม bus ให้กับไมโครโปรเซสเซอร์โดยการ disable สัญญาณ Hold และ DMAACK DMA Controller Chip จะมี register อย่างน้อย 3 ตัว ซึ่งจะถูกเลือกใช้โดย
Controller’s register select line (RS) ซึ่ง register 3 ตัวนั้นคือ address register ,register ตัวนับ , และ register สถานะ โดย register address และ register ตัวนับจะได้รับการตั้งค่าเริ่มต้นโดย ไมโครโปรเซสเซอร์ โดย address register จะมีค่า address เริ่มต้นที่จะใช้ในการถ่ายโอนข้อมูล register ตัวนับจะมีค่าขนาดของ
ข้อมูลที่จะถูกถ่ายโอนข้อมูล register สถานะ จะมีข้อมูลเช่นเดียวกับการถ่ายโอน DMA Cycle Stealing DMA โดยวิธีการนี้ DMA Controller Chip จะถ่ายโอนข้อมูลระหว่างอุปกรณ์ภายนอก และ Memory แต่ละ byte โดยการขโมยจังหวะสัญญาณนาฬิกา ของไมโครโปรเซสเซอร์ DMA Controller จะทำการลัดวงจร (bypass) ผ่านไมโครโปรเซสเซอร์และสร้างสัญญาณที่เหมาะสมเพื่อให้ทำการถ่ายโอนข้อมูลได้ เนื่องจากไมโครโปรเซสเซอร์
ถูกควบคุมโดย สัญญาณนาฬิกาจากภายนอก จึงเป็นเรื่องง่ายที่จะหยุดไมโครโปรเซสเซอร์ชั่วคราวโดยการไม่ส่งสัญญาณนาฬิกาให้กับ ไมโครโปรเซสเซอร์ สัญญาณ INHIBIT จะใช้เพื่อการนี้ ซึ่งโดยปกติ INHIBIT จะเป็น HIGH และต่อแบบ And กับสัญญาณนาฬิกาแล้วจึงผ่านสัญญาณที่ได้ ไปให้ไมโครโปรเซสเซอร์ ในการกระทำการถ่ายโอนข้อมูลแบบ DMA DMA controller จะหยุดไมโครโปรเซสเซอร์ โดยการ Active สัญญาณ INHIBIT ให้ Low แล้วตัวมันก็จะเช้าควบคุมระบบ bus ทั้งหมด ในเวลาที่ไมโครโปรเซสเซอร์หยุดนั้น ด้วยกรรมวิธี
Cycle Stealing จะขนถ่ายข้อมูบได้ทีละ1 byte ทุกๆ ครั้ง DMA controller จะร้องขอ byte ที่จะส่งนี้จากไมโครโปรเซสเซอร์ Interleaved DMA เป็นวิธีที่ซับซ้อนกว่า DMA แบบอื่นๆ ด้วยเทคนิคนี้ DMA controller จะเข้า
ครอบครอง bus ทั้งหมดในช่วงที่ ไมโครโปรเซสเซอร์ไม่ได้ใช้ bus ตัวอย่างเช่น ไมโครโปรเซสเซอร์ ไม่ได้ใช้ bus ในช่วงที่กระทำคำสั่งภายในประเภท ตีความทำสั่ง หรือการกระทำทางคณิตศาสตร์ (ALU) DMAจะอาศัยช่วงเวลานั้น ทำการถ่ายโอนข้อมูล ซึ่งวิฑีการนี้ เรียกว่า Interleaved DMA คุณสมบัติเด่นของ Interleaved DMA นี้ก็คือการถ่ายโอนข้อมูลจะเกิดขึ้นโดยไม่ไปหยุดการทำงานของไมโครโปรเซสเซอร์ เลยเช่นเดียวกัน โดยใช้วิธี Interleaved DMA การถ่ายโอนข้อมูลก็อยู่ในขนาด 1 byte ต่อ 1 รอบสัญญาณ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

เทคโนโลยีการนำข้อมูลเข้าคอมพิวเตอร์

สำหรับงานบางประเภทที่ต้องมีการป้อนข้อมูลเป็นประจำอย่างต่อ เนื่อง เช่น สำนักงานทะเบียนราษฎร หรือสำนักงานประจำสายการบิน งานเกี่ยวกับการป้อนข้อมูลเข้าระบบ computer มีความจำเป็นมาก และ เป็น
งานที่เสียเวลาและแรงงาน งานป้อนข้อมูลจึงจำเป็นต้องอาศัยเทคโนโลยีสมัย ใหม่เข้าช่วย ทางด้านอุปกรณ์ป้อนข้อมูลเข้า Input แบ่งได้เป็น 5 กลุ่มใหญ่ๆ ซึ่งไม่รวมถึง input ด้วยระบบสื่อสารข้อมูล

กลุ่มที่ 1 ได้แก่ กลุ่มที่ป้อนด้วยตัวอักษร นั่นนั่นคือ แป้นพิมพ์ หรือ keyboard ซึ่งจะอ่านตัวอักษรและตัวเลขจากแป้นพิมพ์ตามที่ผู้พิมพ์กด เข้าไปเก็บไว้ใน Computer การป้อนข้อมูลเข้าแบบตัวอักษรอีกแบบหนึ่ง คือประเภทบัตรเจาะรู เครื่องอ่านบัตรเจาะรูจะอ่านเป็นรหัส อักขระตามที่ผู้ใช้เจาะไว้ แต่ปัจจุบัน บัตรเจาะรูไม่ได้ใช้กันแล้ว

บัตรเจาะรู

กลุ่มที่ 2 ได้แก่ กลุ่มที่ป้อนข้อมูลด้วยอุปกรณ์ชี้ตำแหน่ง การป้อนแบบนี้มีลักษณะเป็นการป้อนแบบ Graphic อุปกรณ์ที่เด่นชัดคือ Mouse ปากกาแสง Joystick Trackball

กลุ่มที่ 3 เป็นการอ่านข้อมูลเป็นรูปภาพเข้ามาเก็บใน computer ได้แก่พวก Scanner , OCR หรือเครื่องอ่านตัวอักษรจากภาษาที่แสดงได้ (ปัจจุบัน OCR ในภาษาอังกฤษได้ผลเป็นที่น่าพอใจ แต่ สำหรับภาษาไทย
ยังไม่ประสพผลสำเร็จ) เครื่องอ่านรหัสแถบ (Bar code)

กลุ่มที่ 4 เป็นการป้อนข้อมูลด้วยเสียงได้แก่ระบบการจดจำเสียงพูด(Speech recognition) เป็นระบบทบทวนและตรวจสอบเสียงปัจจุบันยังไม่ได้ผลพอที่จะนำมาใช้งานอย่างจริงจัง เนื่องจากเสียงของคนแต่ละคนต่างกัน
แม้แต่คนคนเดียวกันพูดสองครั้งยังไม่เหมือนกัน จึงยังนำมาใช้เป็นมาตรฐานไม่ได้

กลุ่มที่ 5 เป็นกลุ่มที่ป้อนข้อมูลด้วยตัวตรวจจับพิเศษ เช่น Switch,
Sensor วัดด้าน อุณหภูมิ ความดัน แล้วเปลี่ยนเป็นสัญญาณอนาลอกเป็น ดิจิตอล การป้อนข้อมูลแบบอัตโนมัตเป็นระบบ ที่ใช้ในการควบคุมเครื่องจักรอุปกรณ์ต่างๆ

1. แป้นพิมพ์ อุปกรณ์อินพุตขั้นพื้นฐาน

การพิมพ์เป็นเทคโนโลยีที่เก่าแก่เครื่องพิมพ์ดีดเครื่องแรกของโลกมีหลักฐานยืนยันว่ามีผู้ประดิษฐ์มาแล้วเกือบ 300 ปี แต่เครื่องพิมพ์ดีดที่ได้รับการจดทะเบียนและบันทึกหลักฐานไว้โดย เÎนรี่ มีล เมื่อวันที่ 7 มกราคม
พ.ศ. 2257 พัฒนาการของพิมพืดีดก็ก้าวหน้าขึ้นมาเป้นลำดับ ครั้นถึงยุคสมัยอิเล็กทรอนิกส์และคอมพิวเตอร์แป้นพิมพ์ดีดจึงได้รับการนำมาใช้เป้นอุปกรณ์ป้อนตัวอักษรให้กับคอมพิวเตอร์ตั้งแต่ยุคแรกๆโดยเริ่มจากการป้อนผ่านบัตรเจาะรูแล้วให้เครื่องอ่านบัตรเจาะรูอีกครั้งหนึ่ง การป้อนข้อมูลตัวอักขระในยุคแรกจึงเน้นการป้อนข้อมูลเข้าด้วยรหัส ทางบริษัทไอบีเอ็มได้กำหนดรหัสตามโซนของรูที่เจาะ ซึ่งเรียกว่ารหัสเอปซีดิกมาจนถึงปัจจุบัน

2. ความเป็นมาในการหาวิธีป้อนข้อมูลด้วยวิธีอื่น

การสั่งงานคอมพิวเตอร์ด้วยแป้นพิมพ์ตัวอักขระยังสร้างความยุ่งยากต่อผู้ใช้ในบางเรื่อง เช่น ต้องจดจำข้อความที่เป็นคำสั่ง การป้อนคำสั่งจะต้องใช้ตัวอักษรหลายตัวเรียงต่อเนื่องกัน ทำให้เสียเวลา ระยะหลังจึงมีคนคิดพยายามหาวิธีการป้อนข้อมูลในรูปแบบอื่น โดยเฉพาะสัญลักษณ์ทางกราฟิก เนื่องจากสามารถสื่อความหมายกับผู้ใช้ได้ดีกว่าตัวอักษรเสียอีก ดังนั้นระบบคอมพิวเตอร์ในสมัยปัจจุบันจึงหันมาใช้ระบบ GUI-Graphic User Interface กันมาก และมีแนวทางที่จะแพร่หลายต่อไปอีกในโอกาสข้างหน้าจุดเริ่มต้นของความพยายามหาอุปกรณ์อินพุตมาช่วยงาน โดยเฉพาะในระบบของการติดต่อกับคอมพิวเตอร์มีมากกว่า 30 ปีแล้ว และมีการพัฒนาให้ดีขึ้นเรื่อยๆเป็นลำดับจนถึงปัจจุบัน โดยเฉพาะอย่างยิ่งในช่วงหลังจากปีค.ศ. 1980
เป็นต้นมา มีการพัฒนาอุปกรณ์ช่วยอินพุตแบบต่างๆ ขึ้นมาใช้กันมาก

3. กระดาษสเก็ตช์เป็นจุดเริ่มต้น

กระดาษสเก็ตช์ถือได้ว่าเป็นอุปกรณ์อินพุตที่ใช้กับกราฟิกรุ่นแรก จุดเริ่มต้นของกระดาษสเก็ตช์เริ่มจากนายอิเวน อี. ซูเธอร์แลนด์(Ivan E. Sutherland) ได้ออกแบบสร้างขึ้นในขณะที่เขาเป็นนักศึกษาปริญญาเอกที่เอ็มไอทีเมื่อปีค.ศ. 1962 และเสนอวิทยานิพนธ์ด้วยการใช้กระดาษสเก็ตช์เป็นอุปกรณ์อินพุตสำหรับระบบกราฟิกเพื่อการเขียนรูป ระบบกราฟิกที่ใช้นี้ได้รับการพัฒนาบนเครื่องเมนเฟรมคอมพิวเตอร์ TX-2 ของเอ็มไอที ดังรูปที่ 2

ในระหว่างนั้นอุปกรณ์อินพุตที่ใช้กำหนดรูปภาพทางกราฟิกมีให้ใช้แล้วคือ ปากกาแสง แต่ปากกาแสงมีข้อจำกัดคือ ใช้กำหนดจุด การลากเส้น แต่กระดาษสเก็ตช์ยังให้รายละเอียดเพิ่มเติมได้อีก เช่น กำหนดขนาดของเส้นความสัมพันธ์ของรูปกราฟิก ซูเธอร์แลนด์ได้พัฒนาระบบกราฟิกที่ใช้หลักการของวินโดว์มีการขยายหรือย่อภาพได้

4. เรื่องราวเกี่ยวกับเม้าส์

ช่วงปี ค.ศ. 1950-1960 การใช้อุปกรณ์ชี้ตำแหน่งที่รู้จักกันดีคือปากกาแสง การใช้ปากกาแสงจะต้องชี้ตำแหน่งลงไปบนจอภาพ และต้องยกออกจากจอภพไปมา ทำให้ยุ่งยากต่อการใช้และที่สำคัญคือเทคโนโลยีของปากกาแสงต้องรอให้จอภาพสแกนจุดสว่างวิ่งไปทั้งจอเพื่อซิงก์กับตัวรับที่ปากกา จึงต้งอาศัยเทคนิคที่ยุ่งยากซับซ้อนและทำให้มีราคาแพงในปี ค.ศ. 1964 Engelbart ได้ทำการทดสอบอุปกรณ์ชี้ตำแหน่งที่มีในขณะนั้น
ซึ่งได้แก่ ปากกาแสง จอยสติ๊ก ตลอดจนอุปกรณ์ลากเส้นกราฟที่ต่อกับโพเทนซิโอมิเตอร์ เขาพบว่าอุปกรณ์ชี้ตำแหน่งเหล่านั้นยังใช้งานได้ไม่ดีนักโดยเฉพาะการที่จะใช้ชี้ตำแหน่งและลากเส้นบางอย่างไปด้วยกัน พลันเขาก็นึกไปถึงอุปกรณ์ที่เขาใช้ร่วมกับเพื่อนร่วมชั้นในปี ค.ศ. 1940 ที่ใช้ในการวัดพื้นที่ที่เรียกว่า พลานิมิเตอร์(planimeter) ซึ่งประกอบด้วยแขนสองแขน พร้อมลูกล้อที่ติดกับแขน ลูกล้อนั้นจะเลื่อนหมุนไปตามแกนคือ แกน X และ แกน Y ในขณะที่เลื่อนปลายแขนไป และหากเขาติดโพเทนซิโอมิเตอรไว้ที่ลูกกลิ้งที่หมุนบอกตำแหน่งแกน X และ แกน Y เขาก็น่าจะทำอุปกรณ์ชี้ตำแหน่งให้กับคอมพิวเตอร์ได้และจุดนี้เองเป็นต้นเหตุให้เกิดความคิดในการออกแบบเมาส์ที่มีใช้ในยุคต่อมา เมาส์ตัวแรกยังมีขนาดใหญ่ เพราะต้องใช้แกนหมุนของโพเทนซิโอมิเตอร์ การหมุนนี้จะเป็นสัดส่วนของการเลื่อนเคอร์เซอร์ไปตามแกน X และแกน Y การเลื่อนเคอร์เซอร์ไปมาในระบบคอมพิวเตอร์จึงทำได้ โปรแกรมคอมพิวเตอร์ก็สามารถควบคุมการทำงาน การตรวจสอบและใช้ในการชี้ตำแหน่งได้ง่าย

5. หันมาใช้ลูกบอลเล็ก

กลุ่มของ Engelbart ได้พัฒนาเมาส์ต่อไปอีก จนกระทั่งสามารถหาสัดส่วนของการหมุนโพเทนซิโอมิเตอร์กับการเคลื่อนที่จริงบนจอภาพ เพื่อให้ง่ายต่อการควบคุม และในที่สุดก็ได้พัฒนามาเป็นลูกบอลเล็กๆที่กลิ้งไปมาได้ทุกทิศทาง เพื่อเลื่อนแกนหมุนสองแกนของโพเทนซิโอมิเตอร์อย่างไรก็ตาม ในระยะหลังได้มีการพัฒนากลไกให้สามารถใช้งานง่ายขึ้น เช่น ใช้การเปลี่ยนสัญญาณจากอะนาลอกเป็นดิจิตอล การใช้แสงส่องพื้นโดยมีกริดเล็กๆ บอกตำแหน่งการเคลื่อนที่ไปมา เมาส์จึงมีรูปร่างอยางที่เห็น เมาส์ถูกนำมาประยุกต์จนเป็นที่แพร่หลายอย่างรวดเร็ว เพราะบริษัทซีล็อกซ์ ได้พัฒนาระบบ GUI ใช้วินโดว์เมนูในรูปแบบที่ใช้ตัวชี้ตำแหน่งช่วยจึงเป็นจุดขยายตัวของการใช้เมาส์ หลังจานั้นต่อมาแอปเปิ้ล ลิซ่าและแมคอินทอชก็หันมาใช้เมาส์เป็นอุปกรณ์ประจำสำหรับการใช้ชี้ตำแหน่ง เมาส์จึงได้รับการกล่าวถึงและแพร่หลายคุ้นเคยกับผู้ใช้เป็นอย่างยิ่งในปัจจุบันเมาส์ได้เข้ามามีบทบาทสำคัญในระบบวินโดว์ ตลอดจนการชี้ตำแหน่งในเวอร์กสเตชัน ในระบบโอเอสทู ระบบไมโครซอฟต์วินโดว์ รูปที่ 3

 

เป็นเส้นทางการพัฒนาระบบยูสเซอร์อินเตอร์เฟสที่ใช้เมาส์เป็นตัวชี้ตำแหน่ง

6. สงครามปุ่มกด

ในยุคแรกของ SRI ที่ทำการพัฒนาเมาส์ได้กำหนดให้มีปุ่มกด 3 ปุ่มเรียงกับบริษัทซีล็อกซ์ก็ใช้ปุ่มกด 3 ปุ่มเช่นกัน ในขณะที่เมาส์ของบริษัทแอปเปิ้ลที่เอามาใช้กับ เครื่องแมคอินทอชใช้ปุ่มกดเพียงปุ่มเดียว และจัดเป็นอุปกรณ์อินพุตหลักสำคัญในระบบ ดังรูปที่ 4

แต่ที่เมาส์ของบริษัทอื่นทั้งหมดที่ใช้กันในขณะนี้ใช้ปุ่มกด 2 หรือ 3 ปุ่ม ลักษณะการกดปุ่มและจะใช้กี่ปุ่มดี จะมีมาตรฐานที่ใช้อย่างไรคงต้องติดตามกันต่อไป ส่วนขนาดและรูปร่างของเมาส์มีขนาด 6 x 10 เซนติเมตร ซึ่งพอเหมาะกับมือของผู้ใช้นอกจากสงครามปุ่มกดแล้ว สงครามขั้นต่อมาคือลักษณะของวินโดว์และ แหน่งต่างๆที่ผู้ใช้จะสามารถเชื่อมติดต่อด้วย ลักษณะของเมนู การทำ Pop หรือ Pull ลักษณะของไดอะลอกที่ใช้ตอบสนองกับผู้ใช้ ตลอดจนรูปร่างของสัญลักษณ์บนจอภาพ
รูปที่ 5

 

แสดงตัวอย่างของสัญลักษณ์ที่ออกแบบให้แตกต่างกัน

7. ดิจิไตเซอร์

ดิจิไตเซอร์เป็นชื่อย่อๆของการเรียก ดิจิไตซิ่งแท็บเล็ต ซึ่งเป็นอุปกรณ์อินพุตของไมโครคอมพิวเตอร์ โดยทั่วไปจะประกอบด้วยกระดานหนึ่งแผ่นกับอุปกรณ์ชี้ตำแหน่ง บางทีเราเรียกว่า ทรานซดิวเซอร์ กระดานแท็บเล็ตเป็นกระดานเรียบเพื่อใช้เป้นพื้นที่สำหรับ
การเขียนรูป รูปที่ 6 เป็นตัวอย่างการใช้ดิจิไตซิ่งแท็บเล็ตในงาน CAD

บนกระดานแท็บเล็ตจะประกอบด้วยเส้นลวดแนวแกนดิ่งและแนวแกนนอนที่ใช้ในการแทนโคออร์ดิเนตทางแกน X และ Y เส้นลวดภายในตรวจสอบสนามแม่เหล้กที่ ส่งออกมา เพื่อเหนี่ยวนำลวดทางแกน X และ Y ชี้บอกตำแหน่ง X,Y สเปกของดิจิไตซิ่งแท็บเล็ตที่สำคัญ คือความละเอียดของการกำหนดตำแหน่ง หรือเรียกว่ารีโซลูชัน ค่าของรีโซลูชันจะเป้นตัวบอกว่าจุดที่อยู่บนกระดานแท็บเล็ตนี้มี ระยะห่างน้อยที่สุดเท่าไดที่จะแยกออกจากกันได้ หากผู้ผลิตใช้ค่ารีโซลูชันเป็น 200 เส้น ต่อนิ้ว(lpi) ก็หมายความว่ากระดานขนาด 12 x 12 นิ้ว ค่าความละเอียดของจุดในแนว แกนทั้งสองจะแสดงจุดได้จากโคออร์ดิเนต 0-2400 หรือค่าความละเอียดบนกระดาน แท็บเล็ตนี้เท่ากับ 1/200 นิ้ว
ส่วนค่าความถูกต้อง(accuracy) เป็นค่าที่ใช้บอกความถูกต้องของการตรวจสอบ เทียบกับมาตรฐานที่รู้ เช่น การวัดความถูกต้องของผู้ผลิตกำหนดไว้จาก 0.001-0.035 นิ้ว ซึ่งค่าความถูกต้องนี้จะสัมพันธ์กับจำนวนเส้นต่อนิ้ว การต่อเชื่อมกับคอมพิวเตอร์จะมีส่วนที่สำคัญอีกส่วนหนึ่งคือ การส่งข้อมูล ซึ่งส่วนใหญ่ต่อเชื่อมแบบอนุกรมและอัตราการส่งคือการสื่อสารที่จะส่งข้อมูลได้กี่จุด ต่อวินาที

8. การอินพุตด้วยรูปภาพ

รูปที่ใช้ในงานทางด้านคอมพิวเตอร์เป้นจุดเล็กๆเรียงต่อกันแต่ละจุดจะเป็นเพียง จุดขาวดำ หรือมีสัดส่วนความเข้มหรือสี ในปัจจุบันอุปกรณ์ที่เรียกว่าอิมเมจสแกนเนอร์ เป็นอุปกรณ์ที่มีราคาไม่แพงนัก สแกนเนอร์ที่ใช้มือถือ(ดูภาพประกอบในรูปที่ 7)อันหนึ่ง ราคาไม่ถึงหนึ่งหมื่นบาท สแกนเนอร์ชนิดสแกนทีละแผ่นก็เป็นอุปกรณ์อินพุตอย่างหนึ่ง ที่จะอ่านค่าภาพเข้าไปเก็บได้ ภาพที่อ่านได้จะผ่านการกำหนดเป็นจุดของข้อมูล ดังนั้นหากภาพหนึ่งมีรายละเอียด และสแกนเนอร์ให้ความละเอียดได้ 300 จุดต่อนิ้ว ดังนั้นข้อมูลขนาด 12 x 12 นิ้ว จะมีข้อมูล
ที่ต้องเก็บมากมายมหาศาลเท่ากับ 12 x 12 x 300 x 300 สแกนเนอร์โดยทั่วไปจะเชื่อมต่อกับระบบไมโครคอมพิวเตอร์โดยมีระบบÎาร์ดแวร์ พิเศษควบคุม ทั้งนี้เพราะต้องนำข้อมูลมหาศาลเก็บเข้าไว้ในหน่วยความจำหรือดิสค์ ดังนั้น จึงต้องมีขบวนการดีเอ็มเอพิเศษช่วยประกอบด้วย จากสแกนเนอร์เมื่อเก็บภาพได้ ภาพที่ได้จะเป็นตัวอักษรและมีซอฟแวร์ที่พัฒนา ขึ้นมาแปรค่าให้เป้นตัวอักษรที่รู้จักกันดี เราเรียกระบบนี้ว่า OCR-Optical Character Reader คือระบบการรู้นำตัวอักษร ระบบนี้กำลังได้รับการพัฒนาให้ดีขึ้นเป็นลำดับ อย่างไรก็ตาม ระบบนี้ยังมีข้อยุ่งยากทางด้านทฤษฎีและการแปรค่าความถูกต้องของการแปรความหมาย อันเป็นเรื่องสำคัญยิ่ง

9. บาร์โค้ดหรือรหัสแถบ

บาร์โค้ดหรือรหัสแถบได้รับการพัฒนาานานกว่า 20 ปีแล้ว รหัสแถบนี้ได้รับการ ประยุกต์ใช้งานในห้างสรรพสินค้า โรงงานอุตสาหกรรม การทหาร อุตสาหกรรมการผลิต การประกันภัย ฮลฮ รหัสแถบนี้เป็นเสมือนสัญลักษณ์ที่ใช้แถบรหัส ซึ่งต้องอาศัยเครื่อง อ่านจึงจะแปรค่าตัวเลขหรือตัวอักษรนั้นๆออกมา รหัสแถบที่ใช้ในยุคต้นๆใช้รหัสที่ชื่อ UPC-Universal Product Code ซึ่งได้รับ การศึกษาและออกแบบมากว่า 20 ปีแล้ว และหลังจากนั้นก็มีการเสนอแนวความคิดที่ ใช้แถบรหัสเพื่อจุดประสงค์อื่น และเน้นให้มีการถอดรหัสได้ง่ายและไม่ผิดพลาด
ในปัจจุบันความต้องการใช้รหัสแถบมีมากขึ้นจึงต้องมีการสร้างเครื่องถอดรหัส มาใช้ ในซูเปอร์มาเก็ตใช้รหัสแถบที่มีตัวเลข 11 ตัวเพื่อใช้ในการแยกแยะชนิดของสินค้า และเมื่อเครื่องถอดรหัสได้ก็จะมองหาราคาในแฟ้มราคาแล้วพิมพ์รายการหรือรวมยอดให้ เครื่องถอดรหัสแถบจึงต้องมีจุดมุ่งหมายให้อ่านแถบรหัสและแปรค่าโดยมีความ ต้องการพิเศษของการใช้รหัสแถบดังนี้ ความเชื่อถือในการอ่านและถอดรหัสให้ถูกต้อง ต้องลดต้นทุนการพิมพ์รหัสแถบ สามารถถอดรหัสให้ได้ถึงแม้รหัสจะมีความหนาแน่นของแถบสูง
ต้องทำให้เครื่องอ่านมีราคาถูกลง รหัสแถบที่ใช้กันนั้นใช้หลักการของเดลต้าคอมมูนิเคชั่นในการกำหนดรหัส ลอง พิจารณาจากรูปที่ 8

รหัสแบบเดลต้าเป็นวิธีที่ง่ายมากโดยการแบ่งเป็นโมดูลย่อยๆ ที่จะกำหนดค่า 0 หรือ 1 โมดูล 1 จะแทน ด้วยช่องว่างสีขาวหรือแถบดำหนึ่งแถบจึงแทนตัวเลข 0 หรือ 1 หลายโมดูล ส่วนอีกแบบหนึ่งเราเรียกว่า รหัสความกว้างโดยใช้ความกว้างสองขนาดแทน ตัวเลข 0 หรือ 1 ลองพิจารณาจากรูปที่ 8 จะเห็นว่าเราเริ่มที่ 1 ใช้แถบกว้าง แต่ถ้ารหัส ตัวต่อมาเป็น 0 ก็จะได้แถบขาวที่แคบกว่า และถ้ามีการเปลี่ยนค่าก็จะเปลี่ยนขนาดด้วย
สิ่งที่สำคัญของการถอดรหัสคือเครื่องสแกนอ่านรหัสแถบจะมีความเร็วในการสแกนไม่เท่ากัน เช่น เครื่องแสกนที่ใช้มือถือ ดังนั้นจึงต้องคำนึงถึงเรื่องนี้เป็นสำคัญ อย่างไรก็ตามอาจ ต้องหาวิธีการซิงโครไนซ์ เพื่อเป็นตัวกำหนความกว้างในตัวเองเสมือนเป็นสัญญาณนาฬิกา

10. รู้จักกับรหัส UPC

UPC-Universal Product Code เป็นรหัสที่ใช้ในการแทนรหัสสินค้าที่ใช้ ในการแทนรหัสสินค้าที่ใช้ในห้างสรรพสินค้าของอเมริกันมากว่า 15 ปี แต่ละรหัส ประกอบด้วยตัวเลข 12 หลัก ตัวเลขแต่ละตัวใช้รหัสแบบ 7 โมดูล โดยมีแถบบาร์ สีดำและขาวอย่างละ 2 แถบ เราจะเรียกการแทนรหส UPC แต่ละตัวว่ารหัส delta

(7,2) คือใช้ หลักการเดลต้า 7 โมดูล 2 คู่แถบดำขาว ดังรูปที่ 9

ตัวเลขแต่ละตัวแบ่งแถบออกมาเป็นบาร์ได้ดังรูปที่ 10 ซึ่งจะเห็นได้ว่าเราแบ่ง รหัสตามโมดูลให้มีแถบดำสองแถบและขาวสองแถบอย่างไรก็ตามการกำหนดรหัสนี้จะต้องคำนึงถึงการอ่านด้วยเพราะจากสภาพการอ่านจริงเราสามารถอ่านแถบจากซ้ายไปขวาหรือขวาไปซ้ายก็ได้ ดังนั้นรหัสที่แทนตัวเลขทุกตัวจะต้องอ่านได้จากซ้ายไปขวาหรือขวาไปซ้ายโดยไม่ซ้ำกับรหัสอื่น
การแทนรหัส UPC ของตัวเลข 0-9 แสดงได้ดังตาราง

ซ้าย (คู่)

ขวา(คู่)

ความกว้าง(รูปแบบ)

0

0001101

1110010

3,2,1,1

1

0011001

1100110

2,2,2,1

2

0010011

1101100

2,1,2,2

3

0111101

1000010

1,4,1,1

4

0100011

1011100

1,1,3,2

5

0110001

1001110

1,2,3,1

6

0101111

1010000

1,1,1,4

7

0111011

1000100

1,3,1,2

8

0110111

1001000

1,2,1,3

9

0001011

1110100

3,1,1,2

ซึ่งจากตารางจะเห็นว่าเลขที่ 1แถบรหัสจะเป็น 2,2,2,1 หมายถึงแถบกว้าง 2 หน่วย
กลับกัน ถ้าจากซ้ายเป็น 00110001 จะเป็นแถบขาวกว้างสองโมดูล แถบดำสองโมดูล ขางสองโมดูลและดำ

หนึ่งโมดูล สังเกตว่า 2,2,2,1 เมื่อกลับข้างจากขวาจะเป็นรหัส 1,2,2,2 ซึ่งก็ไม่ไปซ้ำกับรหัสใด ดังนั้นเมื่อเครื่องอ่านย้อนกลับก็ได้รหัส 1,2,2,2 จึงไม่ซ้ำกับรหัสใดที่จะทำให้ผิดพลาดได้รหัส UPC ที่อยู่ในแถบสินค้าแสดงดังรูปที่ 10 รหัสที่อยู่บน UPC แบ่งโซนตัวเลขเป็นดังนี้ แถบกำหนดของซ้ายใช้ตัวรหัส 101 ตัวเลข 6 ตัวแบบคี่ (คอลัมน์ซ้ายในตารางที่ 1) เลขหลักแรกแทนประเภทอุตสาหกรรม เช่น 0 เป็นประเภทของชำ 3 เป็นประเภทยา เลขห้าหลักต่อมาคือรหัสผู้ผลิต แถบกำหนดกึ่งกลาง (01010) ตัวเลข 6 ตัวแบบคู่ (คอลัมน์ขวานตารางที่ 1) เลขห้าหลักแทนรหัสชนิด หนึ่งหลักเป็นตัวเลข check digit

ชื่อรหัส

โมดูล

จำนวนสัญลักษณ์ที่แทนได้

จำนวนโมดูล

UPC

delta (7,2)

10

7

Codel128

delta (11,3)

106

11

Codel93

delta (9,3)

48

9

Codel39

Width (8,3)

44

13.5 (ค่าเฉลี่ย)

Codebar

Width (7,2)

16

10

11. แถบกำหนดของขวา
นอกจากนี้จังมีการกำหนดรหัสแถบเป็นแบบอื่นอีก เช่น รหัส 128 เป็นรหัส แบบเดลต้า 11 โมดูล 3 คู่แถบแทนรหัสแต่ละตัวได้ 106 ตัว ซึ่งนำมาใช้ในการแทน ตัวอักษรเหมือนรหัสแอสกีได้ตารางข้างต้น เป็นตารางที่สรุปถึงรหัสแถบแบบต่างๆ ซึ่งมีวิธีการกำหนดเป็นมาตรฐานตลอดจนการใช้งาน กันในโอกาสต่างๆ เพราะรหัส UPC แทนได้เฉพาะตัวเลข 0-9 ย่อมไม่เพียงพอจึงต้องมีรูปแบบอย่างอื่นเข้ามา ช่วยเสริมรหัสแถบทีใช้ในปัจจุบันกำลังพัฒนาไปในด้านการประยุกต์ และจะมีบทบาท ที่สำคัญในงานต่างๆ อีกมากแม้แต่บัตรเอทีเอ็มก็มีการบันทึกในแถบแม่เหล็กแบบ รหัสแถบอนาคตยังต้องพัฒนาต่อไปด้วยเทคโนโลยีที่มีการพัฒนาให้ก้าวหน้าเช่นนี้
จะมีอุปกรณ์อินพุตอีกหลายรูปแบบที่นำมาใช้ในงานด้านต่างๆ เช่น OMR-Optical Mark Reader ที่ใช้ในการตรวจสอบ ระบบรับรู้เสียงพูด เป็นต้น อย่างไรก็ตาม เทคโนโลยีหลายอย่างยังคงต้องพัฒนา และมีแนวโน้มที่จะเป็นไปได้ เช่น การอ่านข้อความให้คอมพิวเตอร์เสมือนการพิมพ์การอ่านภาพ และแปล ความหมายในลักษณะที่เรียกว่า image processing ฮลฮ ก็เห็นจะต้องคอยติดตาม ดูระบบอินพุตที่จะพัฒนาต่อไปว่าจะพัฒนาก้าวหน้าได้สักเพียงไร