คุณไม่สามารถทำสิ่งนี้โดยทั่วไปได้ แต่ในบางแง่มุมคุณสามารถทำได้มากและมีบางกรณีที่คุณต้องทำ
อาตาริ 2600 (หรืออาตาวิดีโอระบบคอมพิวเตอร์) เป็นหนึ่งในเร็วระบบโฮมวิดีโอเกมและได้รับการเปิดตัวครั้งแรกในปี 1978 ซึ่งแตกต่างจากระบบต่อมาในยุคของอาตาไม่สามารถที่จะให้อุปกรณ์เฟรมบัฟเฟอร์หมายความว่าซีพียูมี เพื่อเรียกใช้โค้ดที่ scanline ทุกครั้งเพื่อพิจารณาว่าจะผลิตอะไร - หากรหัสนี้ใช้เวลามากกว่า 17.08 microseconds เพื่อเรียกใช้ (ช่วง HBlank) กราฟิกจะไม่ถูกตั้งค่าอย่างเหมาะสมก่อนที่ scanline จะเริ่มวาดพวกเขา ถ้าโปรแกรมเมอร์ต้องการวาดเนื้อหาที่ซับซ้อนกว่าที่อาตาริอนุญาตตามปกติพวกเขาจะต้องวัดเวลาที่แน่นอนสำหรับคำแนะนำและเปลี่ยนการลงทะเบียนกราฟิกเมื่อลำแสงถูกวาดด้วยช่วง 57.29 ไมโครวินาทีสำหรับการสแกนทั้งหมด
อย่างไรก็ตาม Atari 2600 ก็เหมือนกับระบบอื่น ๆ อีกมากมายที่ใช้ 6502 นั้นมีคุณสมบัติที่สำคัญมากที่ช่วยให้สามารถจัดการเวลาได้อย่างระมัดระวังสำหรับสถานการณ์นี้: CPU, RAM, และสัญญาณทีวีทั้งหมดวิ่งออกจากนาฬิกาตามต้นแบบเดียวกัน นาฬิกา. สัญญาณทีวีวิ่งออกนาฬิกา 3.98 MHz แบ่งเวลาเป็นจำนวนเต็มของ "นาฬิกาสี" ที่จัดการสัญญาณทีวีและวงจรของนาฬิกา CPU และ RAM เป็นนาฬิกาสามสีทำให้นาฬิกาของ CPU เป็น การวัดเวลาที่แม่นยำเมื่อเทียบกับสัญญาณทีวีความคืบหน้าปัจจุบัน (สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ให้ดูที่คู่มือของ Stella Programmer ที่เขียนขึ้นสำหรับตัวจำลอง Stella Atari 2600 )
สภาพแวดล้อมการทำงานนี้นอกจากนี้หมายความว่าคำสั่ง CPU ทุกตัวมีจำนวนรอบที่กำหนดซึ่งจะใช้ในทุกกรณีและผู้พัฒนา 6502 รายจำนวนมากเผยแพร่ข้อมูลนี้ในตารางอ้างอิง ตัวอย่างเช่นพิจารณารายการนี้สำหรับคำสั่งCMP
(เปรียบเทียบหน่วยความจำกับแอคคูมูเลเตอร์) ที่นำมาจากตารางนี้ :
CMP Compare Memory with Accumulator
A - M N Z C I D V
+ + + - - -
addressing assembler opc bytes cycles
--------------------------------------------
immediate CMP #oper C9 2 2
zeropage CMP oper C5 2 3
zeropage,X CMP oper,X D5 2 4
absolute CMP oper CD 3 4
absolute,X CMP oper,X DD 3 4*
absolute,Y CMP oper,Y D9 3 4*
(indirect,X) CMP (oper,X) C1 2 6
(indirect),Y CMP (oper),Y D1 2 5*
* add 1 to cycles if page boundary is crossed
ด้วยการใช้ข้อมูลทั้งหมดนี้อาตาริ 2600 (และนักพัฒนา 6502 คนอื่น ๆ ) สามารถระบุได้ว่ารหัสของพวกเขาใช้เวลานานแค่ไหนในการดำเนินการและสร้างกิจวัตรที่ทำในสิ่งที่พวกเขาต้องการและยังคงปฏิบัติตามข้อกำหนดจังหวะเวลาสัญญาณโทรทัศน์ของอาตาริ และเนื่องจากช่วงเวลานี้แน่นอนมาก (โดยเฉพาะอย่างยิ่งสำหรับคำแนะนำการเสียเวลาเช่น NOP) พวกเขายังสามารถใช้เพื่อปรับเปลี่ยนกราฟิกในขณะที่พวกเขากำลังวาด
แน่นอนว่าอาตาริ 6502 นั้นเป็นกรณีที่เฉพาะเจาะจงมากและทั้งหมดนี้เป็นไปได้เพียงเพราะระบบมีดังต่อไปนี้ทั้งหมด:
- นาฬิกาหลักที่ทำงานทุกอย่างรวมถึง RAM ระบบที่ทันสมัยมีนาฬิกาอิสระสำหรับ CPU และ RAM โดยที่นาฬิกา RAM มักจะช้ากว่าและทั้งสองไม่จำเป็นต้องซิงค์กัน
- ไม่มีแคชใด ๆ - 6502 เข้าถึง DRAM โดยตรงเสมอ ระบบที่ทันสมัยมี SRAM แคชที่ทำให้ยากต่อการทำนายสถานะ - ในขณะที่มันอาจเป็นไปได้ที่จะทำนายพฤติกรรมของระบบที่มีแคชมันยากกว่าแน่นอน
- ไม่มีโปรแกรมอื่นทำงานพร้อมกัน - โปรแกรมบนตลับหมึกมีการควบคุมระบบอย่างสมบูรณ์ ระบบที่ทันสมัยใช้หลายโปรแกรมพร้อมกันโดยใช้อัลกอริทึมการจัดตารางเวลาที่ไม่ได้กำหนดไว้ล่วงหน้า
- ความเร็วสัญญาณนาฬิกาช้าพอที่สัญญาณจะสามารถเดินทางข้ามระบบได้ทันเวลา ในระบบที่ทันสมัยด้วยความเร็วสัญญาณนาฬิกา 4 GHz (ตัวอย่าง) ใช้แสงโฟตอน6.67 รอบนาฬิกาในการเดินทางความยาวของมาเธอร์บอร์ดครึ่งเมตร - คุณไม่เคยคาดหวังว่าหน่วยประมวลผลที่ทันสมัยจะโต้ตอบกับสิ่งอื่นบนกระดาน ในรอบเดียวเนื่องจากใช้สัญญาณมากกว่าหนึ่งรอบเพื่อให้สัญญาณบนบอร์ดเข้าถึงอุปกรณ์ได้
- ความเร็วสัญญาณนาฬิกาที่กำหนดไว้อย่างดีซึ่งไม่ค่อยเปลี่ยนแปลง (1.19 MHz ในกรณีของ Atari) - ความเร็วของ CPU ของระบบที่ทันสมัยเปลี่ยนแปลงตลอดเวลาในขณะที่ Atari ไม่สามารถทำได้โดยไม่ส่งผลกระทบต่อสัญญาณทีวี
- รอบเวลาที่เผยแพร่ - x86 ไม่ได้กำหนดว่าจะต้องใช้เวลานานเท่าใด
สิ่งเหล่านี้ทั้งหมดมารวมกันเพื่อสร้างระบบที่เป็นไปได้ที่จะสร้างชุดคำสั่งที่ใช้เวลาในการจัดทำและสำหรับแอปพลิเคชันนี้นั่นเป็นสิ่งที่เรียกร้อง ระบบส่วนใหญ่ไม่มีความแม่นยำระดับนี้เพียงเพราะไม่จำเป็นต้องใช้ - การคำนวณทำได้เมื่อทำเสร็จหรือหากต้องการเวลาในจำนวนที่แน่นอนนาฬิกาอิสระสามารถสอบถามได้ แต่หากความต้องการนั้นถูกต้อง (เช่นในระบบฝังตัวบางระบบ) ก็ยังสามารถปรากฏขึ้นได้และคุณจะสามารถระบุได้อย่างแม่นยำว่ารหัสของคุณใช้เวลานานแค่ไหนในการทำงานในสภาพแวดล้อมเหล่านี้
และฉันควรเพิ่มข้อจำกัดความรับผิดชอบที่ยิ่งใหญ่ซึ่งทั้งหมดนี้ใช้กับการสร้างชุดคำสั่งการประกอบที่จะใช้เวลาในจำนวนที่แน่นอน หากสิ่งที่คุณต้องการทำคือการประกอบชิ้นส่วนโดยพลการแม้ในสภาพแวดล้อมเหล่านี้และถามว่า "ใช้เวลาดำเนินการนานแค่ไหน?" คุณไม่สามารถทำเช่นนั้นได้ - นั่นคือปัญหา Haltingซึ่งพิสูจน์แล้วว่าไม่สามารถแก้ไขได้
แก้ไข 1:ในรุ่นก่อนหน้าของคำตอบนี้ฉันระบุว่า Atari 2600 ไม่มีทางแจ้งหน่วยประมวลผลว่ามันอยู่ที่ไหนในสัญญาณทีวีซึ่งบังคับให้โปรแกรมทั้งหมดนับและซิงโครไนซ์ตั้งแต่เริ่มต้น ความเห็นของฉันในความเห็นนี้เป็นจริงของระบบบางอย่างเช่น ZX Spectrum แต่ไม่เป็นความจริงของ Atari 2600 เนื่องจากมีการลงทะเบียนฮาร์ดแวร์ที่หยุด CPU จนกว่าจะเกิดช่วง blanking แนวนอนถัดไปเช่นเดียวกับ ฟังก์ชั่นเพื่อเริ่มช่วง blanking แนวตั้งที่จะ ดังนั้นปัญหาของการนับรอบจะถูก จำกัด ไว้ที่แต่ละ scanline และจะกลายเป็นที่แน่นอนถ้านักพัฒนาต้องการเปลี่ยนเนื้อหาเมื่อมีการวาดเส้นการสแกน