สำหรับ NES (และ SNES ส่วนใหญ่เกินไป) นี่เป็นภาพรวมพื้นฐาน ฉันไม่ได้เขียนเกม NES ใด ๆ เลย แต่ได้เขียนโปรแกรมจำลอง NES (Graybox) และทำการคำนวณทางวิศวกรรมของเกวียนเก่าอย่างยุติธรรม
สำหรับภาษาการเขียนโปรแกรม: ใช่มันคือการชุมนุมทั้งหมด การเขียนโปรแกรม NES หมายถึงการทำงานโดยตรงกับการขัดจังหวะฮาร์ดแวร์, พอร์ต DMA, การสลับธนาคาร ฯลฯ โชคดีที่การเขียนโปรแกรม 6502 (หรือค่อนข้างที่ 2A03) นั้นค่อนข้างง่าย [1]:
- มีการลงทะเบียนน้อย: A, X และ Y ส่วนใหญ่สองหลังสามารถใช้สำหรับการทำดัชนีและวนซ้ำเท่านั้น
- ชุดคำสั่งมีขนาดเล็กและตรงไปตรงมาเป็นส่วนใหญ่
- หน่วยความจำไม่มาก: RAM หลักคือ 2KB พร้อมแบตเตอรี่เสริมสำรอง 8KB ใน 2KB นั้น 256 ไบต์สงวนไว้สำหรับสแต็กและหน้า 0 (256 ไบต์แรก) ซึ่งเป็นตำแหน่งที่คุณต้องการเก็บพอยน์เตอร์และค่าที่ใช้มากที่สุดเนื่องจากโหมดการกำหนดแอดเดรสพิเศษบางอย่าง
สิ่งทั้งสามนี้ร่วมกันทำเพื่อสิ่งแวดล้อมที่ง่ายต่อการจดจำในขณะที่ทำงานกับมัน ใช่คุณจัดการหน่วยความจำทั้งหมดด้วยตัวคุณเอง แต่นั่นหมายถึงว่าคุณสร้างแผนที่เต็มรูปแบบที่ทุกอย่างขึ้นไปข้างบนและแผนที่นั้นไม่ใหญ่มากเพราะคุณต้องกังวลเกี่ยวกับ 2K เท่านั้นดังนั้นคุณจึงสามารถพล็อตเรื่องนั้นได้ กระดาษกราฟ. คุณต้องวางแผนสิ่งต่าง ๆ ให้มากขึ้นเล็กน้อยและกำหนดตัวแปรและค่าคงที่แบบคงที่ให้กับหน่วยความจำ RAM และ ROM (บนตลับหมึก)
มันจะมีเล่ห์เหลี่ยมเล็กน้อยเมื่อข้อมูลคาร์ทริดจ์ของคุณเกินขีด จำกัด แอดเดรสของ CPU นั่นคือ 64KB ซึ่งต่ำกว่า 32KB ตั้งอยู่ในหินและแมปกับพอร์ตฮาร์ดแวร์และ RAM ทุกชนิด นี่คือจุดที่การเปลี่ยนธนาคารเข้าสู่การเล่นซึ่งหมายถึงการจับคู่ส่วนของ ROM เข้ากับพื้นที่ที่อยู่ 32KB ที่สูงขึ้น
สิ่งนี้สามารถใช้งานได้ แต่โปรแกรมเมอร์ต้องการ แต่ตัวอย่างการใช้อาจมีเกมที่มี 3 ระดับโดยมีข้อมูลระดับข้อมูล meta และรหัสทั้งหมดสำหรับแต่ละระดับที่หนาตาลงในพื้นที่หน่วยความจำ 8KB แยกต่างหากบนตลับหมึก ระดับอาจมีการเรียกกลับสำหรับเช่นการเริ่มต้นต่อการอัปเดตเฟรมเป็นต้น "การโหลด" ระดับจะหมายถึงการทำแผนที่ที่หน่วยความจำ 8KB ที่หน่วยความจำเช่น 0xC000 จากนั้นคุณสามารถระบุได้ว่ารูทีน init นั้นอยู่ที่ 0xC000 เสมอรูทีนการอัพเดทเฟรมอยู่ที่ 0xC200 และข้อมูลระดับเริ่มต้นที่ 0xC800 รหัสหลักของเกมอยู่ในหน่วยความจำอันอื่นแล้วควบคุมการเปลี่ยนแปลงระดับโดยการสลับในกลุ่มข้อมูลด้านขวาและกระโดดไปที่ที่อยู่ 0xC000 และ 0xC200 ในเวลาที่เหมาะสม
ข้อมูลกราฟิก Wrt: ข้อมูลไทล์ของ NES คือแผนที่แม็พขนาด 8x8 พิกเซล 2 บิต สำหรับพื้นหลังจะถูกรวมเข้ากับเลเยอร์ความละเอียด 2 บิต 1/4 ค่า 4 บิตเหล่านี้ถูกจัดทำดัชนีเป็นจานสี 16 รายการโดยเราเชื่อว่ามี 53 สีที่มีประสิทธิภาพ Sprite ยังใช้ข้อมูลพิกเซลแบบ 2 บิตและแต่ละ Sprite ระบุดัชนีกลุ่มแบบ 2 บิตของตัวเองอีกครั้งโดยสร้างดัชนี pal แบบ 4 บิต ภาพ BG บนหน้าจอเป็นตัวเลขดัชนีเรียงต่อท้ายแบบ 32x30
โดยพื้นฐานแล้วการมีการทำซ้ำหลายครั้งและดัชนีเป็นดัชนีคุณสามารถทำให้ข้อมูลมีขนาดเล็กมาก ข้อมูลระดับมักถูกเก็บไว้เป็นแถบแนวตั้งของดัชนีกระเบื้องและเนื่องจากแถบแนวตั้งเหล่านั้นถูกนำมาใช้อีกครั้งเช่นกันดัชนีเหล่านั้นจึงถูกจัดทำดัชนีเช่นกันและเก็บไว้เพียงครั้งเดียวบนตลับหมึก เทคนิคการบีบอัดข้อมูลอย่างง่าย ๆ ก็ทำงานคล้ายกัน สิ่งนี้ทำให้ Mario 1 เป็นข้อมูล 32KB (พร้อมพื้นที่ว่าง) และ 8KB ของข้อมูลบิตแมป
สำหรับสภาพแวดล้อมการพัฒนาฉันได้เห็นรูปถ่ายที่ผู้คนทำงานในคอมพิวเตอร์โบราณบางรุ่นที่สามารถต่อกับเตา EEPROM เพื่อทำงานได้ การดีบักแบบใช้เครื่องมือช่วยไม่ได้จริง ๆ จนกระทั่งหลังจากยุค SNES [2] นี่คือเหตุผลหลักที่เกมเก่าหลายเกมมีข้อบกพร่อง "ชัดเจน" ในตัวเกมและทำไมสิ่งต่าง ๆ เช่น Gameshark สามารถทำสิ่งที่พวกเขาทำ สุขภาพผู้เล่นจะอยู่ที่ mem-location X เสมอดังนั้นคุณสามารถบังคับให้เป็น 100 ตลอดเวลา
หากคุณพบว่าสิ่งเหล่านี้น่าสนใจฉันขอแนะนำให้คุณดูตัวอย่างเช่นhttp://wiki.nesdev.com/w/index.php/Nesdev_Wiki
มีหลักสูตรการเขียนโปรแกรมบางส่วนสำหรับ NES ที่จะพบทางออนไลน์เช่นกัน
ฉันหวังว่าภาพรวมที่เรียบง่ายนี้จะให้ข้อมูลเชิงลึกเกี่ยวกับการพัฒนาเกมในยุค 80
[1] พูดค่อนข้าง นอกจากนี้ฉันลำเอียงเพราะฉันเขียน Graybox เองในการประกอบ PowerPC ประมาณ 85% [2] ดูการสร้างบทความ FF6: http://www.edge-online.com/features/the-making-of-final-fantasy-vi/