Nintendo DS Programming.

เคยมีโอกาสได้ทำงานกับบริษัทที่มี Official license ของ Nintendo DS (NDS) ซึ่งก็มีอุปกรณ์พร้อม แต่ไม่ทั้งหมด อย่างน้อยก็มีตัว Emulator ที่สามารถ load เอา Program เกมที่เขียนไปทดสอบได้อย่างง่ายดาย รวมไปถึง Software Emulator ที่แสนจะเชื่องช้า ไม่รู้ว่าเป็นความตั้งใจของทาง Intelligent System (IS) ซึ่งเป็นผู้ผลิตชุดพัฒนา (Devkit) รึเปล่า ที่ตัว software นี้จะทำงานช้าเหลือเกินจนนักพัฒนาทนไม่ไหวต้องไปหาตัว Hareware มาใช้เร็วๆ

การเขียนโปรแกรมบน NDS เป็นสิ่งที่แปลกใหม่สำหรับคนที่คุ้นเคยกับการเขียนโปรแกมบน Windows ความแตกต่างที่เห็นได้ชัดก็คือความสะดวกสบาย ถึงแม้ว่า IS จะได้จัดเตรียมชุดพัฒนาเอาไว้แล้ว แต่การศึกษาการทำงานของ NDS นั้นก็เป็นสิ่งจำเป็น เพราะบางทีชุดพัฒนานั้นก็ไม่ได้ทำอะไรได้ทุกอย่าง ที่สำคัญก็ยังทำ Optimization ได้ไม่ค่อยดีอีกด้วย ตัวอย่างเช่นการคำนวนบางอย่าง compiler จะไม่สามารถ Optimize หา ดังนั้นถ้าอยากจะให้เร็วก็จะต้องทำเอง ที่สำคัญ ARM9 (NDS มีสอง CPU คือ ARM7 และ ARM9) มีคำสั่งพิเศษหลายๆคำสั่งที่ช่วยในการทำงานบางอย่างให้เร็วขึ้น เช่น A = B + (C >> D); จะมีอยู่คำสั่งหนึ่งที่สามารถคำนวนการ Shift แล้ว Add ได้โดยการเรียกใช้คำสั่งเพียงคำสั่งเดียว ซึ่งเท่าที่ตรวจดู ASM code ที่ compiler (Codewarrior) มันสร้างขึ้นมานั้นมันไม่ได้ทำการแปลง code ลักษณะนี้ให้

แน่นอนว่า Embeded system ตัวนี้ภาษาที่ใช้คงหนีไม่พ้น C/C++ และ ASM ในบางกรณี การได้ติดต่อ Hardware โดยตรงถือเป็นเรื่องที่น่าสนใจ เช่นการเปิดไฟหน้าจอบน (NDS มีสองจอ) ก็จะสามารถทำได้โดยเซ็ตค่าใน register ที่ทำหน้าที่ในการควบคุมแสงสว่างนี้โดยตรง ซึ่งก็หนีไม่พ้นที่จะต้องใช้ pointer ในการชี้ไปที่ตำแหน่งหน่วยความที่ระบบทำการเชื่อม(Map) เข้ามาในขณะที่ program กำลังทำงานอยู่ ซึ่งตำแหน่งต่างๆของแต่ละ register ก็สามารถหาได้จากในคู่มือนั่นเอง ซึ่งการทำงานเกี่ยวกับระบบของ NDS ส่วนมากจะหนีไม่พ้นการเซ็ตค่า register พวกนี้โดยตรง

การอ่านสถานะของปุ่มก็เป็นลักษณะเดียวกัน แต่แทนที่จะทำการเซ็ตค่าก็เป็นการอ่านแทน แน่นอนว่าหนีไม่พ้น pointer อีกนั่นแหล่ะ โชคดีที่ SDK ของ NDS จัดเตรียม function (ซึ่งส่วนมากเป็นแค่มาโคร) เอาไว้แล้ว เลยไม่ต้องจำเป็นที่จะต้องจำ(หรือเปิดคู่มือหา)ตำแหน่งของ register ซึ่งมีมากมายเหลือเกิน

สำหรับคนที่คุ้นเคยกับการเขียนโปรแกรมบน J2ME, Win32 GDI, Direct Draw การแสดงภาพๆหนึ่งอาจไม่ใช่เรื่องที่ยุ่งยากนัก โดยเฉพาะ MIDP ของ J2ME นั้นช่างง่ายดายเหลือเกิน เพียงแค่ทำการโหลด ก็สามารถนำมาวาดได้แล้ว แต่สำหรับ NDS แล้วภาพที่จะแสดงจะต้องถูกโหลดลงไปในตำแหน่งหน่วยความจำ(Map ไป VRAM โดยระบบ) ที่ถูกกำหนดไว้เท่านั้น นอกจากนี้ยังจะต้องมาเขียนตัว descriptor สำหรับการแสดงภาพอีกต่างหากจึงจะนำภาพมาแสดงผลได้ นี่ยังไม่นับการควบคุม pallette สี และการกำหนดโหมดของรูปภาพ รวมไปถึงจองตำแหน่งหน่วยความจำสำหรับ background และ Object(sprite) ที่จะต้องจัดการเองทั้งหมด

ยังมีเรื่องอื่นที่น่าสนใจเช่น การแสดงผลภาพสามมิติ เสียงและการเล่นเพลง การจัดการระบบไฟล์ การใช้ไมค์โครโฟน การจัดการรูประหว่างจอบนและจอล่าง multithreading Wifi connection และอื่นๆอีกมากมาย ถ้าจะให้เขียนทั้งหมดก็คงจะเกินความรู้ที่มีอยู่ แถมต้องใ้ช้เวลาอีกหลายวันแน่ๆ ก็เลยจบแค่นี้ก่อนดีกว่า🙂

One Response to Nintendo DS Programming.

  1. worr says:

    อ่านแล้วเหมือนเข้าใจ แต่ไม่เข้าใจ

    ปล. มาเยี่ยม

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: