Register และ ALU
โครงสร้างภายในของ Z-80 CPU ประกอบด้วย รีจิสเตอร์ภายในที่สามารถ เขียน และอ่านได้ถึง 208 บิท โดยแยกเป็นกลุ่มของรีจิสเตอร์ขนาด 8 บิท 18 รีจิสเตอร์ และรีจิสเตอร์ขนาด 16 บิท อีก 4 รีจิสเตอร์รูปภาพแสดงรีจิสเตอร์ภายในทั้งหมดของ CPU Z-80
1. รีจิสเตอร์หลักที่ใช้งานทั่วไป
รูปภาพแสดงกลุ่มรีจิสเตอร์หลักใช้งานทั่วไป
รูปภาพแสดกลุ่มรีจิสเตอร์สำรอง
3. กลุ่มรีจิสเตอร์ที่ใช้งานเฉพาะอย่าง
3.1 โปรแกรมเคาน์เตอร์ (PC - Program counter)
โปรแกรมเคาน์เตอร์เป็นรีจิสเตอร์ขนาด 16บิท ที่เป็นตัวกำหนดตำแหน่งของ โปรแกรมในขณะสภาวะการกระทำการเฟทช์โดยขณะทำ การเฟทช์ค่าที่อยู่ใน โปรแกรมเคาน์เตอร์จะไปปรากฎอยู่ที่แอดเดรสบัสเพื่อชี้ไปยังตำแหน่งในหน่วย ความจำ ให้ CPU อ่านคำสั่งมาตีความหมายค่าที่อยู่ในโปรแกรมเคาน์เตอร์จะเพิ่มค่าขึ้นได้อย่างอัตโนมัติ หลังการกระทำการเฟทช์ แต่ถ้าหาก CPU กระทำ คำสั่งให้ข้ามไป ยังตำแหน่งอื่น (Jump) ค่าแอดเดรส ที่จะกระโดดข้ามนั้นจะโหลด เข้ามายังโปรแกรม เคาน์เตอร์ได้อย่างอัตโนมัติ
3.2 สแตคพอยท์เตอร์ (SP - Stack pointer)
3.3 อินเดครีจิสเตอร์ (IX,IY - index register)
3.4 อินเตอรร์รัพท์เพจแอดเดรสรีจิสเตอร์ (I-Interrupt page address register
)3.5 รีจิสเตอร์รีเฟรชหน่วยความจำ (R-memory reflesh register)
3.6 แอคคิวมูเลเตอร์ (accumulator) และแฟลก (flag)
รูปภาพแสดงกลุ่มรีจิสเตอร์ใช้งานเฉพาะอย่าง
4. หน่วยคำนวณทางคณิตศาสตร์และลอจิก (ALU - arithmetic and logic unit)
รูปภาพแสดงการทำงานของ 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
|
|
|
|
|
|
|
|
วางไว้ เช่น
แฟลกบางตัว เช่น แฟลกการทด แฟลกเครื่องหมายและแฟลกศูนย์เป็นต้น
6. กลุ่มคำสั่งที่อ้างกับโปรแกรมย่อย
|
|
|
|
|
ถัดไป การใช้รหัสแทนเงื่อนไข 3 บิท ทำให้สามารถแทนเงื่อนไขได้กับ 8 บิท ดังนี้
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7. กลุ่มคำสั่งเกี่ยวกับการติดต่อ อินพุท-เอาท์พุทกับซีพียู
8. กลุ่มคำสั่งเกี่ยวกับการควบคุมการทำงานของ CPU
การทำงานคำสั่งที่เกี่ยวกับการกระโดด ซึ่ง เป็นกลุ่มคำสั่งที่ มีความสำคัญมาก เนื่องจาก เรามักเขียนโปรแกรม โดยอาศัยหลักของเงื่อนไข ถ้าโปรแกรมของไม่ มีการกำหนดเงื่อนไข โปรแกรมนั้นก็จะทำงานโดยไม่ได้สนใจสิ่งรอบข้างเลย .. เช่น ต้องการเขียนโปรแกรมควบคุมหุ่นยนต์ แต่เรากำหนดว่า ให้เดินหน้า โดยการหมุนมอเตอร์ไป 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 |
ตาราง ชุดคำสั่งสำหรับการกระโดดแบบต่างๆ
หมายเหตุ
nnคือ ตัวเลขขนาด 16 บิต
ตัวอย่างแรก เป็นตัวอย่างการคูณ กำหนดให้ตัวตั้ง เก็บใน 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 |
การติดต่อกับ 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, |
(HL) = ข้อมูลจากพอร์ตที่กำหนดโดย C |
INIR |
ไม่มี |
Z=1 และ N=1 เสมอ |
(HL) = ข้อมูลจากพอร์ตที่กำหนดโดย C |
IND |
ไม่มี |
ถ้า B-1 เป็น 0 จะได้ Z=1 ไม่เช่นนั้น Z=0, |
(HL) = ข้อมูลจากพอร์ตที่กำหนดโดย C |
INDR |
ไม่มี |
Z=1 และ N=1 เสมอ |
(HL) = ข้อมูลจากพอร์ตที่กำหนดโดย C |
ตาราง 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, |
ส่งข้อมูลที่เก็บใน (HL) ไปที่พอร์ตหมายเลข C |
OTIR |
ไม่มี |
Z=1 และ N=1 เสมอ |
ส่งข้อมูลที่เก็บใน (HL) ไปที่พอร์ตหมายเลข C |
OUTD |
ไม่มี |
ถ้า B-1 เป็น 0 จะได้ Z=1 ไม่เช่นนั้น Z=0, |
ส่งข้อมูลที่เก็บใน (HL) ไปที่พอร์ตหมายเลข C |
OTDR |
ไม่มี |
Z=1 และ N=1 เสมอ |
ส่งข้อมูลที่เก็บใน (HL) ไปที่พอร์ตหมายเลข C |
ชุดคำสั่งที่เกี่ยวข้องกับการติดต่อกับ 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
หมายความว่า แต่ละครั้งที่สั่ง 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 |
|
- |
(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 |
|
- |
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
หลักการแนวคิดและทฤษฎี
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จากรูป เราสมมติว่า ไมโครโปรเซสเซอร์ ต้องการอ่านข้อมูล จาก (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 |
1.1 Interrupt type
1.2 Maskable Interrupt
1.3 Non Maskable Interrupt
1.4 Interrupt address Vector
1.5 การลำดับขั้นความสำคัญของ Interrupt
( Interupt priority) จากรูป อุปกรณ์ภายนอก 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
สมมติว่ามีอุปกรณ์ 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 ตัว ซึ่งจะถูกเลือกใช้โดย
Controllers 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 รอบสัญญาณ
บัตรเจาะรู
กลุ่มที่ 2 ได้แก่ กลุ่มที่ป้อนข้อมูลด้วยอุปกรณ์ชี้ตำแหน่ง การป้อนแบบนี้มีลักษณะเป็นการป้อนแบบ Graphic อุปกรณ์ที่เด่นชัดคือ Mouse ปากกาแสง Joystick Trackball
กลุ่มที่ 3 เป็นการอ่านข้อมูลเป็นรูปภาพเข้ามาเก็บใน computer ได้แก่พวก Scanner , OCR หรือเครื่องอ่านตัวอักษรจากภาษาที่แสดงได้ (ปัจจุบัน OCR ในภาษาอังกฤษได้ผลเป็นที่น่าพอใจ แต่ สำหรับภาษาไทย
ยังไม่ประสพผลสำเร็จ) เครื่องอ่านรหัสแถบ (Bar code)
กลุ่มที่ 4 เป็นการป้อนข้อมูลด้วยเสียงได้แก่ระบบการจดจำเสียงพูด(Speech recognition) เป็นระบบทบทวนและตรวจสอบเสียงปัจจุบันยังไม่ได้ผลพอที่จะนำมาใช้งานอย่างจริงจัง เนื่องจากเสียงของคนแต่ละคนต่างกัน
แม้แต่คนคนเดียวกันพูดสองครั้งยังไม่เหมือนกัน จึงยังนำมาใช้เป็นมาตรฐานไม่ได้
กลุ่มที่ 5 เป็นกลุ่มที่ป้อนข้อมูลด้วยตัวตรวจจับพิเศษ เช่น Switch,
Sensor วัดด้าน อุณหภูมิ ความดัน แล้วเปลี่ยนเป็นสัญญาณอนาลอกเป็น ดิจิตอล การป้อนข้อมูลแบบอัตโนมัตเป็นระบบ ที่ใช้ในการควบคุมเครื่องจักรอุปกรณ์ต่างๆ
การพิมพ์เป็นเทคโนโลยีที่เก่าแก่เครื่องพิมพ์ดีดเครื่องแรกของโลกมีหลักฐานยืนยันว่ามีผู้ประดิษฐ์มาแล้วเกือบ 300 ปี แต่เครื่องพิมพ์ดีดที่ได้รับการจดทะเบียนและบันทึกหลักฐานไว้โดย เÎนรี่ มีล เมื่อวันที่ 7 มกราคม
พ.ศ. 2257 พัฒนาการของพิมพืดีดก็ก้าวหน้าขึ้นมาเป้นลำดับ ครั้นถึงยุคสมัยอิเล็กทรอนิกส์และคอมพิวเตอร์แป้นพิมพ์ดีดจึงได้รับการนำมาใช้เป้นอุปกรณ์ป้อนตัวอักษรให้กับคอมพิวเตอร์ตั้งแต่ยุคแรกๆโดยเริ่มจากการป้อนผ่านบัตรเจาะรูแล้วให้เครื่องอ่านบัตรเจาะรูอีกครั้งหนึ่ง การป้อนข้อมูลตัวอักขระในยุคแรกจึงเน้นการป้อนข้อมูลเข้าด้วยรหัส ทางบริษัทไอบีเอ็มได้กำหนดรหัสตามโซนของรูที่เจาะ ซึ่งเรียกว่ารหัสเอปซีดิกมาจนถึงปัจจุบัน
2. ความเป็นมาในการหาวิธีป้อนข้อมูลด้วยวิธีอื่น
การสั่งงานคอมพิวเตอร์ด้วยแป้นพิมพ์ตัวอักขระยังสร้างความยุ่งยากต่อผู้ใช้ในบางเรื่อง เช่น ต้องจดจำข้อความที่เป็นคำสั่ง การป้อนคำสั่งจะต้องใช้ตัวอักษรหลายตัวเรียงต่อเนื่องกัน ทำให้เสียเวลา ระยะหลังจึงมีคนคิดพยายามหาวิธีการป้อนข้อมูลในรูปแบบอื่น โดยเฉพาะสัญลักษณ์ทางกราฟิก เนื่องจากสามารถสื่อความหมายกับผู้ใช้ได้ดีกว่าตัวอักษรเสียอีก ดังนั้นระบบคอมพิวเตอร์ในสมัยปัจจุบันจึงหันมาใช้ระบบ GUI-Graphic User Interface กันมาก และมีแนวทางที่จะแพร่หลายต่อไปอีกในโอกาสข้างหน้าจุดเริ่มต้นของความพยายามหาอุปกรณ์อินพุตมาช่วยงาน โดยเฉพาะในระบบของการติดต่อกับคอมพิวเตอร์มีมากกว่า 30 ปีแล้ว และมีการพัฒนาให้ดีขึ้นเรื่อยๆเป็นลำดับจนถึงปัจจุบัน โดยเฉพาะอย่างยิ่งในช่วงหลังจากปีค.ศ. 1980
เป็นต้นมา มีการพัฒนาอุปกรณ์ช่วยอินพุตแบบต่างๆ ขึ้นมาใช้กันมาก
3. กระดาษสเก็ตช์เป็นจุดเริ่มต้น
กระดาษสเก็ตช์ถือได้ว่าเป็นอุปกรณ์อินพุตที่ใช้กับกราฟิกรุ่นแรก จุดเริ่มต้นของกระดาษสเก็ตช์เริ่มจากนายอิเวน อี. ซูเธอร์แลนด์(Ivan E. Sutherland) ได้ออกแบบสร้างขึ้นในขณะที่เขาเป็นนักศึกษาปริญญาเอกที่เอ็มไอทีเมื่อปีค.ศ. 1962 และเสนอวิทยานิพนธ์ด้วยการใช้กระดาษสเก็ตช์เป็นอุปกรณ์อินพุตสำหรับระบบกราฟิกเพื่อการเขียนรูป ระบบกราฟิกที่ใช้นี้ได้รับการพัฒนาบนเครื่องเมนเฟรมคอมพิวเตอร์ TX-2 ของเอ็มไอที ดังรูปที่ 2 ในระหว่างนั้นอุปกรณ์อินพุตที่ใช้กำหนดรูปภาพทางกราฟิกมีให้ใช้แล้วคือ ปากกาแสง แต่ปากกาแสงมีข้อจำกัดคือ ใช้กำหนดจุด การลากเส้น แต่กระดาษสเก็ตช์ยังให้รายละเอียดเพิ่มเติมได้อีก เช่น กำหนดขนาดของเส้นความสัมพันธ์ของรูปกราฟิก ซูเธอร์แลนด์ได้พัฒนาระบบกราฟิกที่ใช้หลักการของวินโดว์มีการขยายหรือย่อภาพได้ช่วงปี ค.ศ. 1950-1960 การใช้อุปกรณ์ชี้ตำแหน่งที่รู้จักกันดีคือปากกาแสง การใช้ปากกาแสงจะต้องชี้ตำแหน่งลงไปบนจอภาพ และต้องยกออกจากจอภพไปมา ทำให้ยุ่งยากต่อการใช้และที่สำคัญคือเทคโนโลยีของปากกาแสงต้องรอให้จอภาพสแกนจุดสว่างวิ่งไปทั้งจอเพื่อซิงก์กับตัวรับที่ปากกา จึงต้งอาศัยเทคนิคที่ยุ่งยากซับซ้อนและทำให้มีราคาแพงในปี ค.ศ. 1964 Engelbart ได้ทำการทดสอบอุปกรณ์ชี้ตำแหน่งที่มีในขณะนั้น
ซึ่งได้แก่ ปากกาแสง จอยสติ๊ก ตลอดจนอุปกรณ์ลากเส้นกราฟที่ต่อกับโพเทนซิโอมิเตอร์ เขาพบว่าอุปกรณ์ชี้ตำแหน่งเหล่านั้นยังใช้งานได้ไม่ดีนักโดยเฉพาะการที่จะใช้ชี้ตำแหน่งและลากเส้นบางอย่างไปด้วยกัน พลันเขาก็นึกไปถึงอุปกรณ์ที่เขาใช้ร่วมกับเพื่อนร่วมชั้นในปี ค.ศ. 1940 ที่ใช้ในการวัดพื้นที่ที่เรียกว่า พลานิมิเตอร์(planimeter) ซึ่งประกอบด้วยแขนสองแขน พร้อมลูกล้อที่ติดกับแขน ลูกล้อนั้นจะเลื่อนหมุนไปตามแกนคือ แกน X และ แกน Y ในขณะที่เลื่อนปลายแขนไป และหากเขาติดโพเทนซิโอมิเตอรไว้ที่ลูกกลิ้งที่หมุนบอกตำแหน่งแกน X และ แกน Y เขาก็น่าจะทำอุปกรณ์ชี้ตำแหน่งให้กับคอมพิวเตอร์ได้และจุดนี้เองเป็นต้นเหตุให้เกิดความคิดในการออกแบบเมาส์ที่มีใช้ในยุคต่อมา เมาส์ตัวแรกยังมีขนาดใหญ่ เพราะต้องใช้แกนหมุนของโพเทนซิโอมิเตอร์ การหมุนนี้จะเป็นสัดส่วนของการเลื่อนเคอร์เซอร์ไปตามแกน X และแกน Y การเลื่อนเคอร์เซอร์ไปมาในระบบคอมพิวเตอร์จึงทำได้ โปรแกรมคอมพิวเตอร์ก็สามารถควบคุมการทำงาน การตรวจสอบและใช้ในการชี้ตำแหน่งได้ง่าย
กลุ่มของ Engelbart ได้พัฒนาเมาส์ต่อไปอีก จนกระทั่งสามารถหาสัดส่วนของการหมุนโพเทนซิโอมิเตอร์กับการเคลื่อนที่จริงบนจอภาพ เพื่อให้ง่ายต่อการควบคุม และในที่สุดก็ได้พัฒนามาเป็นลูกบอลเล็กๆที่กลิ้งไปมาได้ทุกทิศทาง เพื่อเลื่อนแกนหมุนสองแกนของโพเทนซิโอมิเตอร์อย่างไรก็ตาม ในระยะหลังได้มีการพัฒนากลไกให้สามารถใช้งานง่ายขึ้น เช่น ใช้การเปลี่ยนสัญญาณจากอะนาลอกเป็นดิจิตอล การใช้แสงส่องพื้นโดยมีกริดเล็กๆ บอกตำแหน่งการเคลื่อนที่ไปมา เมาส์จึงมีรูปร่างอยางที่เห็น เมาส์ถูกนำมาประยุกต์จนเป็นที่แพร่หลายอย่างรวดเร็ว เพราะบริษัทซีล็อกซ์ ได้พัฒนาระบบ GUI ใช้วินโดว์เมนูในรูปแบบที่ใช้ตัวชี้ตำแหน่งช่วยจึงเป็นจุดขยายตัวของการใช้เมาส์ หลังจานั้นต่อมาแอปเปิ้ล ลิซ่าและแมคอินทอชก็หันมาใช้เมาส์เป็นอุปกรณ์ประจำสำหรับการใช้ชี้ตำแหน่ง เมาส์จึงได้รับการกล่าวถึงและแพร่หลายคุ้นเคยกับผู้ใช้เป็นอย่างยิ่งในปัจจุบันเมาส์ได้เข้ามามีบทบาทสำคัญในระบบวินโดว์ ตลอดจนการชี้ตำแหน่งในเวอร์กสเตชัน ในระบบโอเอสทู ระบบไมโครซอฟต์วินโดว์ รูปที่ 3
เป็นเส้นทางการพัฒนาระบบยูสเซอร์อินเตอร์เฟสที่ใช้เมาส์เป็นตัวชี้ตำแหน่ง
ในยุคแรกของ SRI ที่ทำการพัฒนาเมาส์ได้กำหนดให้มีปุ่มกด 3 ปุ่มเรียงกับบริษัทซีล็อกซ์ก็ใช้ปุ่มกด 3 ปุ่มเช่นกัน ในขณะที่เมาส์ของบริษัทแอปเปิ้ลที่เอามาใช้กับ เครื่องแมคอินทอชใช้ปุ่มกดเพียงปุ่มเดียว และจัดเป็นอุปกรณ์อินพุตหลักสำคัญในระบบ ดังรูปที่ 4
แต่ที่เมาส์ของบริษัทอื่นทั้งหมดที่ใช้กันในขณะนี้ใช้ปุ่มกด 2 หรือ 3 ปุ่ม ลักษณะการกดปุ่มและจะใช้กี่ปุ่มดี จะมีมาตรฐานที่ใช้อย่างไรคงต้องติดตามกันต่อไป ส่วนขนาดและรูปร่างของเมาส์มีขนาด 6 x 10 เซนติเมตร ซึ่งพอเหมาะกับมือของผู้ใช้นอกจากสงครามปุ่มกดแล้ว สงครามขั้นต่อมาคือลักษณะของวินโดว์และ แหน่งต่างๆที่ผู้ใช้จะสามารถเชื่อมติดต่อด้วย ลักษณะของเมนู การทำ Pop หรือ Pull ลักษณะของไดอะลอกที่ใช้ตอบสนองกับผู้ใช้ ตลอดจนรูปร่างของสัญลักษณ์บนจอภาพ
รูปที่ 5
แสดงตัวอย่างของสัญลักษณ์ที่ออกแบบให้แตกต่างกัน
บนกระดานแท็บเล็ตจะประกอบด้วยเส้นลวดแนวแกนดิ่งและแนวแกนนอนที่ใช้ในการแทนโคออร์ดิเนตทางแกน X และ Y เส้นลวดภายในตรวจสอบสนามแม่เหล้กที่ ส่งออกมา เพื่อเหนี่ยวนำลวดทางแกน X และ Y ชี้บอกตำแหน่ง X,Y สเปกของดิจิไตซิ่งแท็บเล็ตที่สำคัญ คือความละเอียดของการกำหนดตำแหน่ง หรือเรียกว่ารีโซลูชัน ค่าของรีโซลูชันจะเป้นตัวบอกว่าจุดที่อยู่บนกระดานแท็บเล็ตนี้มี ระยะห่างน้อยที่สุดเท่าไดที่จะแยกออกจากกันได้ หากผู้ผลิตใช้ค่ารีโซลูชันเป็น 200 เส้น ต่อนิ้ว(lpi) ก็หมายความว่ากระดานขนาด 12 x 12 นิ้ว ค่าความละเอียดของจุดในแนว แกนทั้งสองจะแสดงจุดได้จากโคออร์ดิเนต 0-2400 หรือค่าความละเอียดบนกระดาน แท็บเล็ตนี้เท่ากับ 1/200 นิ้ว
ส่วนค่าความถูกต้อง(accuracy) เป็นค่าที่ใช้บอกความถูกต้องของการตรวจสอบ เทียบกับมาตรฐานที่รู้ เช่น การวัดความถูกต้องของผู้ผลิตกำหนดไว้จาก 0.001-0.035 นิ้ว ซึ่งค่าความถูกต้องนี้จะสัมพันธ์กับจำนวนเส้นต่อนิ้ว การต่อเชื่อมกับคอมพิวเตอร์จะมีส่วนที่สำคัญอีกส่วนหนึ่งคือ การส่งข้อมูล ซึ่งส่วนใหญ่ต่อเชื่อมแบบอนุกรมและอัตราการส่งคือการสื่อสารที่จะส่งข้อมูลได้กี่จุด ต่อวินาที
รูปที่ใช้ในงานทางด้านคอมพิวเตอร์เป้นจุดเล็กๆเรียงต่อกันแต่ละจุดจะเป็นเพียง จุดขาวดำ หรือมีสัดส่วนความเข้มหรือสี ในปัจจุบันอุปกรณ์ที่เรียกว่าอิมเมจสแกนเนอร์ เป็นอุปกรณ์ที่มีราคาไม่แพงนัก สแกนเนอร์ที่ใช้มือถือ(ดูภาพประกอบในรูปที่ 7)อันหนึ่ง ราคาไม่ถึงหนึ่งหมื่นบาท สแกนเนอร์ชนิดสแกนทีละแผ่นก็เป็นอุปกรณ์อินพุตอย่างหนึ่ง ที่จะอ่านค่าภาพเข้าไปเก็บได้ ภาพที่อ่านได้จะผ่านการกำหนดเป็นจุดของข้อมูล ดังนั้นหากภาพหนึ่งมีรายละเอียด และสแกนเนอร์ให้ความละเอียดได้ 300 จุดต่อนิ้ว ดังนั้นข้อมูลขนาด 12 x 12 นิ้ว จะมีข้อมูล
ที่ต้องเก็บมากมายมหาศาลเท่ากับ 12 x 12 x 300 x 300 สแกนเนอร์โดยทั่วไปจะเชื่อมต่อกับระบบไมโครคอมพิวเตอร์โดยมีระบบÎาร์ดแวร์ พิเศษควบคุม ทั้งนี้เพราะต้องนำข้อมูลมหาศาลเก็บเข้าไว้ในหน่วยความจำหรือดิสค์ ดังนั้น จึงต้องมีขบวนการดีเอ็มเอพิเศษช่วยประกอบด้วย จากสแกนเนอร์เมื่อเก็บภาพได้ ภาพที่ได้จะเป็นตัวอักษรและมีซอฟแวร์ที่พัฒนา ขึ้นมาแปรค่าให้เป้นตัวอักษรที่รู้จักกันดี เราเรียกระบบนี้ว่า OCR-Optical Character Reader คือระบบการรู้นำตัวอักษร ระบบนี้กำลังได้รับการพัฒนาให้ดีขึ้นเป็นลำดับ อย่างไรก็ตาม ระบบนี้ยังมีข้อยุ่งยากทางด้านทฤษฎีและการแปรค่าความถูกต้องของการแปรความหมาย อันเป็นเรื่องสำคัญยิ่ง
บาร์โค้ดหรือรหัสแถบได้รับการพัฒนาานานกว่า 20 ปีแล้ว รหัสแถบนี้ได้รับการ ประยุกต์ใช้งานในห้างสรรพสินค้า โรงงานอุตสาหกรรม การทหาร อุตสาหกรรมการผลิต การประกันภัย ฮลฮ รหัสแถบนี้เป็นเสมือนสัญลักษณ์ที่ใช้แถบรหัส ซึ่งต้องอาศัยเครื่อง อ่านจึงจะแปรค่าตัวเลขหรือตัวอักษรนั้นๆออกมา รหัสแถบที่ใช้ในยุคต้นๆใช้รหัสที่ชื่อ UPC-Universal Product Code ซึ่งได้รับ การศึกษาและออกแบบมากว่า 20 ปีแล้ว และหลังจากนั้นก็มีการเสนอแนวความคิดที่ ใช้แถบรหัสเพื่อจุดประสงค์อื่น และเน้นให้มีการถอดรหัสได้ง่ายและไม่ผิดพลาด
ในปัจจุบันความต้องการใช้รหัสแถบมีมากขึ้นจึงต้องมีการสร้างเครื่องถอดรหัส มาใช้ ในซูเปอร์มาเก็ตใช้รหัสแถบที่มีตัวเลข 11 ตัวเพื่อใช้ในการแยกแยะชนิดของสินค้า และเมื่อเครื่องถอดรหัสได้ก็จะมองหาราคาในแฟ้มราคาแล้วพิมพ์รายการหรือรวมยอดให้ เครื่องถอดรหัสแถบจึงต้องมีจุดมุ่งหมายให้อ่านแถบรหัสและแปรค่าโดยมีความ ต้องการพิเศษของการใช้รหัสแถบดังนี้ ความเชื่อถือในการอ่านและถอดรหัสให้ถูกต้อง ต้องลดต้นทุนการพิมพ์รหัสแถบ สามารถถอดรหัสให้ได้ถึงแม้รหัสจะมีความหนาแน่นของแถบสูง
(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. แถบกำหนดของขวา