ลองสร้าง 16-Bits Virtual Machine อย่างง่ายด้วยภาษา JavaScript / TypeScript — Chapter 00: เกริ่นนำ

Poom Yimyuean
2 min readSep 21, 2024

--

เกริ่น

ช่วงนี้มีโอกาสระหว่างที่กำลังหางานด้วย ก็กำลังสนใจเรื่องเกี่ยวกับ Game Console / Emulator Development อยู่พอดี เนื่องมาจากเราเป็นเด็กที่โตมากับการเล่นเกมใน Console ผ่าน Emulator + ROM ในขวบวัยที่ยังไม่ประสีประสาเรื่องลิขสิทธิ์ แค่อยากเล่นเกม แต่ไม่มีตังค์ซื้อเครื่อง พอโตมาเลยสนใจว่าเราสามารถจำลองเครื่องเกมเพื่อเปิดเล่นใน PC ได้ยังไง ซึ่งก็นับว่าเป็นโอกาสที่ดีที่จะได้ทบทวนความรู้เรื่อง Computer Architecture กับ Assembly

แล้วก็ดันเป็นจังหวะที่ดีมากๆที่ได้ไปเจอกับโปรเจคนี้

francisrstokes/tega: 🕹 TypeScript Embedded GameBoy Macro Assembler (github.com)

ตัวนี้เป็นโปรเจค tega ของคุณ Francis Stokes (francisrstokes) ซึ่งเป็น Library สำหรับการ Assembler ตัว ROM Image เพื่อเอาไปรันบนเครื่องเกม GameBoy (GB) หรือ รันบน Emulator ของ GameBoy (GB)

ส่วนตัวที่น่าสนใจคือเป็น TypeScript ด้วยนี่แหละ คิดว่าน่าสนใจที่จะลองเอาภาษาที่ตัวเองถนัด แล้วใช้ขึ้นงานได้คล่องดี มาลอง Implement ก่อนเพื่อศึกษาคอนเซปต์ยากๆบางอย่างที่เราสนใจ ก่อนที่จะเอาความเข้าใจในคอนเซปต์นั้นๆไปพัฒนาต่อในภาษาอื่นที่น่าสนใจเหมือนกัน หรือ อาจจะดูเหมาะสมกว่า หรือ รีดเค้นความสามารถ หรือ ประสิทธิภาพที่ดีกว่า เช่น Go, Rust, C++, Zig (ตัวนี้ผมยังไม่เคยลองเขียนเลย), Haskell, Clojure ลองแม่งให้หมดอะ เอาดิ (จริงๆเราว่าการลองทำโปรเจคใหญ่ๆโปรเจคนึงในหลายๆภาษาเป็นเรื่องดีนะ จะได้รู้จุดแข็ง รู้ข้อจำกัดของภาษา เรียนรู้ Mental Model ของภาษาต่างๆ และหาวิธีการเค้นความสามารถของแต่ละภาษาเพื่อมาพัฒนาโปรเจคนึงของเราให้ออกมาในรูปแบบต่างๆที่ต้องการ แต่ก็ยังไม่มีความขยันพอจะทำขนาดนั้นเหมือนกัน แหะๆ = =” )

ซึ่งก็โชคดีมากๆที่คุณ Francis เขามีช่อง Youtube ของตัวเองที่ใช้ชื่อว่า “Low Level Productions” ซึ่งมักจะสอนคอนเซปต์ Low Level ต่างๆโดยหลายๆโปรเจคที่เขาหยิบมาทำ มาสอนจะ implement โดยใช้ภาษา JavaScript / TypeScript

ซึ่งหนึ่งในโปรเจคในช่องของเขาที่เราว่าน่าสนใจจะเอามาลองฝึกหัดทำ และ เอามาเล่าในนี้ก็คือโปรเจค 16-Bit Virtual Machine

lowbyteproductions/16-Bit-Virtual-Machine: Code for the “16-Bit Virtual Machine” Series (github.com)

16-Bit Virtual Machine — YouTube

อธิบายโปรเจค

โจทย์ของโปรเจคนี้มีอยู่ว่าเราต้องการ 16-Bits Virtual Machine

แล้วอะไรคือ 16-Bits Virtual Machine ?

16-Bits Virtual Machine

  • Virtual Machine: ตรงนี้ให้เราเข้าใจกันคร่าวๆว่าหมายถึง การจำลองระบบคอมพิวเตอร์ โดยอ้างอิงจากสถาปัตยกรรมของคอมพิวเตอร์ที่เราใช้งานกัน เพราะเอาเข้าจริง Virtual Machine ก็มีหลายแบบ หากเราบอกว่าเป็นการอ้างอิงจากสถาปัตยกรรมของคอมพิวเตอร์ สถาปัตยกรรมของคอมพิวเตอร์ก็มีหลายแบบอีก ไม่ได้มีแค่แบบเดียว

แต่คำถามที่สำคัญกว่าคือ อะไรคือ 16-Bits ในบริบทของ Virtual Machine ที่เราจะสร้างกัน

ซึ่งจริงๆก็ไม่ได้ซับซ้อนอะไรเลย ความหมายของ 16 Bits ในที่นี้หมายความว่า การเก็บค่า Instruction Set, ค่าของ Register, ค่าของ Memory และ ค่าต่างๆภายใน Virtual Machine ตัวที่เราจะสร้างกันเนี่ย จะใช้พื้นที่ในการเก็บข้อมูลพวกนี้สำหรับแต่ละตัวอยู่ที่ขนาดสูงสุด 16 Bits หรือก็คือ 16 / 4 = 4 Bytes นั่นเอง

เป้าหมายของโปรเจค (Goal)

เป้าหมายของโปรเจคนี้ คือ เราต้องการพัฒนาตัว 16-Bits Virtual Machine ของเราให้มี Functional Requirement ประมาณนี้

ขอบคุณรูปภาพจากวิดีโอ 16-Bit Virtual Machine in JavaScript 001 จากช่อง Low Byte Productions
  • A Flexible, Extensible, Register-Based Virtual Machine: Virtual Machine ที่มีความยืดหยุ่น และ ขยายขนาดได้ และเป็น Virtual Machine ประเภทที่เก็บข้อมูลที่ใช้สำหรับการดำเนินการต่างๆลงใน Register เป็นหลัก
  • Signed, Unsigned, and Floating-Point Operations: สามารถดำเนินการทางคณิตศาสตร์กับตัวเลขที่เป็นจำนวนเต็มแบบ Signed (นับรวมจำนวนเต็มลบ), Unsigned (นับเฉพาะจำนวนเต็มบวก), Floating-Point (จำนวนทศนิยม)
  • Call Stack / Stack Frame Structure: มีส่วนของ Stack ใน Memory เพื่อเก็บค่าไว้สำหรับการดำเนินการใน Subroutine (Function) ต่างๆ
  • Interrupt Capabilities: มีความสามารถในการหยุด หรือ ขัดจังหวะการทำงานภายในตัว Virtual Machine ได้
  • Memory Mapping: มี Memory Mapper ที่มีความสามารถในการทำ Memory Mapping ค่าข้อมูลของตัวส่วนต่างๆเข้ากับ Memory เช่น I/O Device (Memory-Mapped I/O: MMIO)
  • Powerful Assembly Language: มีการทำภาษา Assembly ภายในตัว Virtual Machine เพื่อเอาไว้ใช้เขียนคำสั่งจัดการกับค่าๆต่างๆในตัว Virtual Machine
  • C-Like Language: สร้างภาษาที่คล้ายกับภาษา C เพื่อเอามาจำลองการเขียนซอฟต์แวร์เพื่อเอาไว้รันในตัว Virtual Machine
  • Fantasy Game Console: จำลองการทำงานของเครื่องเกม (Game Console) ภายในตัว Virtual Machine ได้

ซึ่งรายละเอียดต่างๆ หรือพวกศัพท์ที่อาจจะดูไม่คุ้นเคยในลิสต์นี้ เดี๋ยวเราจะค่อยๆอธิบายในแต่ละตอนนะว่ามันหมายถึงอะไร มันทำงานอะไร ยังไง

ปิดท้าย

ก็จบกันไปแล้วสำหรับ Chapter แรกของซีรีส์บทความการสร้าง 16-Bits Virtual Machine ด้วยภาษา JavaScript / TypeScript สำหรับ Chapter ก็ไม่มีอะไรมาก แค่มาเกริ่น กับ อธิบายเบื้องต้นว่าในซีรีส์บทความนี้เราจะทำอะไรกัน ส่วนรายละเอียดต่างๆ เราจะเริ่มค่อยๆอธิบายในตอนถัดๆไป ยังไงก็ขอบคุณผู้อ่านที่อ่านมาจนถึงตอนนี้ มีข้อชี้แนะ หรือ สงสัยอย่างไร หรือ อยากจะพูดคุยอะไร สามารถคอมเมนต์มาได้เลยนะครับ สำหรับบทความนี้ก็ขอตัวก่อนนะครับ ขอบคุณครับ

แหล่งอ้างอิง (Reference)

--

--

Poom Yimyuean

I’m Poom, He / Him, From Thailand. Interested in Math, Web & Game Dev, Computer Graphics, Functional Programming, Web Automation, Data Science, AI, ACG Culture.