CS344-321 Assembly Language Programming Period 36
Keyboard เมื่อผู้ใช้กดปุ่มบน keyboard จะเกิด interrupt INTR บิต 1 ไปยัง 8259 ถ้า interrupt นี้มีผล interrupt handler (9) ของ keyboard จะอ่านค่า scan code จาก keyboard ที่ port 60h เช่น ESC จะมี scan code เป็น 1 เป็นต้น ดู scan code ใน sheet ข้อมูลจาก port 60h ไม่ใช่ ASCII code เป็นหน้าที่ของ interrupt handler ของ keyboard ใน ROM BIOS จะแปลงเป็น ASCII code ให้ และใส่ค่าที่แปลงแล้วไว้ใน queue (memory location 0000:041E ) เพื่อที่ DOS จะได้นำไปใช้ได้
scan code ที่เกิดจากการกดปุ่ม keyboard ครั้งแรกมีตั้งแต่ 1 – 83 เรียกว่า “make” codes เมื่อผู้ใช้ปล่อยปุ่ม keyboard จะส่ง scan code ครั้งที่สอง เรียกว่า “break” code ด้วยการบวก 128 ไปที่ “make” code ซึ่งจะมีค่าตั้งแต่ 129 – 211 (กำหนดให้ bit 7 มีค่า 1) ในกรณีที่ผู้ใช้กดปุ่มแช่ไว้เกิน ½ วินาที keyboard จะส่ง “make” code ให้ใหม่ จำนวน 10 ครั้งต่อวินาที จนกว่าจะปล่อยจึงจะส่ง “break” code เมื่อ ROM-BIOS แปลงค่าแล้ว จะมีขนาด 2 bytes เก็บไว้ใน queue โดยที่ไบต์เลขที่ต่ำเรียกว่า main byte และ byte เลขที่สูง เรียกว่า auxiliary byte main byte จะเป็นรหัส ASCII 1-255 ส่วน auxiliary byte จะเก็บ scan code ยกเว้นการใส่ ASCII โดยตรงตามที่กล่าวในหมายเหตุ ในกรณีนี้ auxiliary byte จะเป็น 0
ในกรณีที่ main byte เป็น 0 แสดงว่ามีการกดปุ่มพิเศษ เช่น Function key, Home, End, Ctrl-, Alt เป็นต้น ในกรณีนี้ auxiliary byte จะเก็บค่าดังแสดงใน sheet ดู ROM BIOS keyboard Service, int 16h function 00, 01, 02 DOS keyboard Services, int 21h function 1, 7, 8, a, b, c