ভেবেছিলাম আমি এগিয়ে গিয়ে নিজের বাস্তবায়ন পোস্ট করব। এটি সম্পূর্ণরূপে অসম্পূর্ণ, তবে এটি সম্পূর্ণ বাস্তবায়ন।
- সি এর 668 লাইন (ফাঁকা রেখা বা কেবলমাত্র মন্তব্য দিয়ে রেখা গণনা করা হচ্ছে না)
- সমর্থন করে (আমি মনে করি) সমস্ত অনাবৃত নির্দেশাবলী।
- বিসিডি সমর্থন করে।
- সিপিইউ ক্লক সাইকেলের সময়। (নির্দিষ্ট পৃষ্ঠার সীমানা মোড়কের সামঞ্জস্য সহ)
- একক-পদক্ষেপ দ্বারা বা টিক্সের সংখ্যা নির্দিষ্ট করে নির্দেশাবলী কার্যকর করতে পারে।
- প্রতিটি নির্দেশ সন্ধানের পরে বলা বাহ্যিক ফাংশন হুকিং সমর্থন করে। এটি কারণ এটি মূলত কোনও এনইএস এমুলেটরের জন্য ছিল এবং আমি এটি অডিও টাইমিংয়ের জন্য ব্যবহার করি।
/ * Fake6502 সিপিইউ এমুলেটর কোর v1.1 *******************
* (গ) ২০১১-২০১৩ মাইক চেম্বারস *
************************************************** *** /
# অন্তর্ভুক্ত <stdio.h>
# অন্তর্ভুক্ত <stdint.h>
// বাহ্যিকভাবে সরবরাহিত ফাংশন
বাহ্যিক uint8_t পড়া 6502 (uint16_t ঠিকানা);
বাহ্যিক শূন্য রাইটিং 6502 (uint16_t ঠিকানা, uint8_t মান);
// 6502 সংজ্ঞা দেয়
# নির্ধারিত অন্তর্ভুক্ত // যখন এটি সংজ্ঞায়িত করা হয়, নিবন্ধিত অপকডগুলি পরিচালনা করা হয়।
// অন্যথায়, এগুলিকে কেবল এনওপি হিসাবে বিবেচনা করা হয়।
// # NES_CPU সংজ্ঞায়িত করুন // যখন এটি সংজ্ঞায়িত করা হয়, বাইনারি-কোডিং দশমিক (বিসিডি)
// স্ট্যাটাস পতাকা এডিসি এবং এসবিসি দ্বারা সম্মানিত হয় না। 2A03
// নিন্টেন্ডো বিনোদন সিস্টেমের সিপিইউ করে না
// সমর্থন বিসিডি অপারেশন।
# নির্ধারিত FLAG_CARRY 0x01
# নির্ধারিত FLAG_ZERO 0x02
# নির্ধারিত FLAG_INTERRUPT 0x04
# নির্ধারিত FLAG_DECIMAL 0x08
# নির্ধারিত FLAG_BREAK 0x10
# নির্ধারিত FLAG_CONSTANT 0x20
# নির্ধারিত FLAG_OVERFLOW 0x40
# নির্ধারিত FLAG_SIGN 0x80
# নির্ধারিত BASE_STACK 0x100
# ডিফাইন সেভাক্কাম (এন) এ = (ইউএনটি 8_ টি) ((এন) এবং 0x00FF)
// ফ্ল্যাগ মডিফায়ার ম্যাক্রোগুলি
# নির্ধারিত সেটকারি () স্থিতি | = FLAG_CARRY
# নির্ধারিত ক্লিয়ারারি () স্থিতি & = (LA FLAG_CARRY)
# নির্ধারিত সেটজারো () স্থিতি | = FLAG_ZERO
# নির্ধারিত ক্লিয়ারজারো () স্থিতি & = (LA FLAG_ZERO)
# ডিফাইন সেটাইনটারপ্রেট () স্থিতি | = FLAG_INTERRUPT
# নির্ধারিত ক্লিয়ারিন্টার () স্থিতি & = (LA FLAG_INTERRUPT)
# নির্ধারিত সেটডিসিমাল () স্থিতি | = FLAG_DECIMAL
# নির্ধারিত ক্লিয়ারসিডিমাল () স্থিতি & = (~ FLAG_DECIMAL)
# নির্ধারিত সেটওভারফ্লো () স্থিতি | = FLAG_OVERFLOW
# নির্ধারিত ক্লিয়ারওভারফ্লো () স্থিতি & = (LA FLAG_OVERFLOW)
# নির্দিষ্ট সেটাইন () স্থিতি | = FLAG_SIGN N
# নির্ধারিত ছাড়পত্র () স্থিতি & = (LA FLAG_SIGN)
// পতাকা গণনা ম্যাক্রো
# নির্ধারিত জিরোকাল্ক (এন) {\
যদি ((এন) এবং 0x00FF) ক্লিয়ারজারো ();
অন্য সেটজারো ();
}
# নির্দিষ্ট সংকেত (এন) {\
যদি ((এন) এবং 0x0080) সেট সাইন (); \
অন্যথায় সাফ করুন ();
}
# ডিফাইন ক্যারিকল্ক (এন) {
যদি ((এন) এবং 0xFF00) সেটকারি ();
অন্যথায় ক্লিয়ারকারি ();
}
# নির্ধারিত ওভারফ্লোকাল্যাক (এন, এম, ও) {/ * এন = ফলাফল, এম = সঞ্চালক, ও = মেমরি * / \
যদি (((এন) ^ (uint16_t) (এম)) & ((এন) ^ (ও)) এবং 0x0080) সেটওভারফ্লো ();
অন্যথায় ক্লিয়ারওভারফ্লো ();
}
// 6502 সিপিইউ নিবন্ধন করে
uint16_t পিসি;
uint8_t এসপি, এ, এক্স, ওয়াই, স্থিতি = FLAG_CONSTANT;
// সহায়ক ভেরিয়েবল
uint64_t নির্দেশাবলী = 0; // কার্যকর করা মোট নির্দেশাবলী ট্র্যাক রাখুন
uint32_t ক্লকটিক্স 6502 = 0, ক্লকগোয়াল6502 = 0;
uint16_t oldpc, ea, reladdr, মান, ফলাফল;
uint8_t অপকোড, ওল্ডস্ট্যাটাস;
// অন্যান্য বিভিন্ন ফাংশন দ্বারা ব্যবহৃত কয়েকটি সাধারণ ফাংশন
অকার্যকর পুশ 16 (uint16_t পুশওয়াল) {
write6502 (BASE_STACK + এসপি, (পুশভাল >> 8) এবং 0xFF);
write6502 (BASE_STACK + ((এসপি - 1) এবং 0xFF), পুশভাল & 0xFF);
এসপি - = 2;
}
অকার্যকর পুশ 8 (uint8_t পুশওয়াল) {
write6502 (BASE_STACK + sp--, পুশওয়াল);
}
uint16_t পুল 16 () {
uint16_t টেমপ্লেট 16;
temp16 = পঠন 6502 (BASE_STACK + ((এসপি + 1) এবং 0xFF)) | ((uint16_t) Read6502 (BASE_STACK + ((এসপি + 2) এবং 0xFF)) << 8);
এসপি + = 2;
ফিরুন (temp16);
}
uint8_t pull8 () {
রিটার্ন (রিড 6502 (BASE_STACK +++ এসপি));
}
অকার্যকর রিসেট 6502 () {
pc = (uint16_t) read6502 (0xFFFC) | ((uint16_t) পড়া 6502 (0xFFFD) << 8);
a = 0;
x = 0;
y = 0;
এসপি = 0 এক্সএফডি;
স্থিতি | = FLAG_CONSTANT;
}
স্ট্যাটিক অকার্যকর (* সংযোজনযোগ্য [256]) ();
স্ট্যাটিক অকার্যকর (* অপ্টেবল [256]) ();
uint8_t পেনাল্টিপ, পেনাল্টিড্ডার;
// অ্যাড্রেসিং মোড ফাংশন, কার্যকর ঠিকানা গণনা করে
স্ট্যাটিক অকার্যকর imp () imp // নিহিত
}
স্ট্যাটিক অকার্যকর acc () accum // সঞ্চয়ী
}
স্থির অকার্যকর ইমি () immediate // তাত্ক্ষণিক
ea = pc ++;
}
স্ট্যাটিক অকার্যকর zp () zero // শূন্য পৃষ্ঠা
ea = (uint16_t) read6502 ((uint16_t) পিসি ++);
}
স্ট্যাটিক অকার্যকর zpx () zero // শূন্য পৃষ্ঠা, এক্স
ea = ((uint16_t) read6502 ((uint16_t) পিসি ++) + (uint16_t) x) & 0xFF; // শূন্য পৃষ্ঠার মোড়ক
}
স্ট্যাটিক শূন্য zpy () zero // শূন্য পৃষ্ঠা, ওয়াই
ea = ((uint16_t) read6502 ((uint16_t) পিসি ++) + (uint16_t) y) & 0xFF; // শূন্য পৃষ্ঠার মোড়ক
}
স্ট্যাটিক অকার্যকর rel () branch // শাখা অপের জন্য আপেক্ষিক (8-বিট অবিলম্বে মান, সাইন-এক্সটেন্ডেড)
reladdr = (uint16_t) read6502 (পিসি ++);
if (reladdr & 0x80) reladdr | = 0xFF00;
}
স্ট্যাটিক অকার্যকর abso () {// পরম
ea = (uint16_t) read6502 (পিসি) | ((uint16_t) পড়া 6502 (পিসি + 1) << 8);
পিসি + = 2;
}
স্ট্যাটিক অকার্যকর অ্যাবএক্স () absolute // পরম, এক্স
uint16_t প্রারম্ভকালীন;
ea = ((uint16_t) read6502 (pc) | ((uint16_t) read6502 (পিসি + 1) << 8));
সূচনা পৃষ্ঠা = ইএ এবং 0xFF00;
ea + = (uint16_t) x;
যদি (প্রারম্ভকালীন! = (ইএ এবং 0xFF00)) op // কিছু ওপকোডে পৃষ্ঠা-ক্রসিংয়ের জন্য একটি চক্রের পেনাল্টি
পেনাল্টিডেডিআর = 1;
}
পিসি + = 2;
}
স্থির অকার্যকর (ab) পরম, ওয়াই
uint16_t প্রারম্ভকালীন;
ea = ((uint16_t) read6502 (pc) | ((uint16_t) read6502 (পিসি + 1) << 8));
সূচনা পৃষ্ঠা = ইএ এবং 0xFF00;
ea + = (uint16_t) y;
যদি (প্রারম্ভকালীন! = (ইএ এবং 0xFF00)) op // কিছু ওপকোডে পৃষ্ঠা-ক্রসিংয়ের জন্য একটি চক্রের পেনাল্টি
পেনাল্টিডেডিআর = 1;
}
পিসি + = 2;
}
স্ট্যাটিক অকার্যকর ind () ind // পরোক্ষ
uint16_t eahelp, eahelp2;
eahelp = (uint16_t) read6502 (পিসি) | (uint16_t) ((uint16_t) read6502 (পিসি + 1) << 8);
eahelp2 = (eahelp & 0xFF00) | ((এহেল্প + 1) & 0x00FF); // 6502 পৃষ্ঠার সীমানা wraparound বাগ প্রতিলিপি
ea = (uint16_t) read6502 (eahelp) | ((uint16_t) পড়া 6502 (eahelp2) << 8);
পিসি + = 2;
}
স্ট্যাটিক অকার্যকর ইনডেক্স () {// (অপ্রত্যক্ষ, এক্স)
uint16_t eahelp;
eahelp = (uint16_t) (((uint16_t) read6502 (পিসি ++) + (uint16_t) x) & 0xFF); টেবিল পয়েন্টারের জন্য // শূন্য পৃষ্ঠার মোড়ক
ea = (uint16_t) read6502 (eahelp & 0x00FF) | ((uint16_t) read6502 ((eahelp + 1) & 0x00FF) << 8);
}
স্ট্যাটিক শূন্য indy () {// (পরোক্ষ), ওয়াই
uint16_t eahelp, eahelp2, সূচনা পৃষ্ঠা;
eahelp = (uint16_t) read6502 (পিসি ++);
eahelp2 = (eahelp & 0xFF00) | ((এহেল্প + 1) & 0x00FF); // শূন্য পৃষ্ঠার মোড়ক
ea = (uint16_t) read6502 (eahelp) | ((uint16_t) পড়া 6502 (eahelp2) << 8);
সূচনা পৃষ্ঠা = ইএ এবং 0xFF00;
ea + = (uint16_t) y;
যদি (প্রারম্ভকালীন! = (ইএ এবং 0xFF00)) op // কিছু ওপকোডে পৃষ্ঠা-ক্রসিংয়ের জন্য একটি চক্রের পেনাল্টি
পেনাল্টিডেডিআর = 1;
}
}
স্ট্যাটিক uint16_t getvalue () {
যদি (সংযোজক [অপকোড] == টিসি) রিটার্ন ((uint16_t) ক);
অন্যথায় ফিরে ((uint16_t) read6502 (ইএ));
}
স্ট্যাটিক অকার্যকর পুঁজি (uint16_t সেভাল) {
যদি (সংযোজক [অপকোড] == টিসি) a = (uint8_t) (সেভাল & 0x00FF);
অন্যটি লিখুন 6502 (ইএ, (সেভাল & 0x00FF));
}
// নির্দেশনা হ্যান্ডলার ফাংশন
স্ট্যাটিক অকার্যকর অ্যাডিসি () {
পেনাল্টিপ = 1;
মান = getvalue ();
ফলাফল = (uint16_t) একটি + মান + (uint16_t) (স্থিতি এবং FLAG_CARRY);
carrycalc (ফলাফলের);
zerocalc (ফলাফলের);
ওভারফ্লোক্যালক (ফলাফল, ক, মান);
signcalc (ফলাফলের);
#ifndef NES_CPU
যদি (স্থিতি এবং FLAG_DECIMAL) {
clearcarry ();
যদি ((একটি এবং 0x0F)> 0x09)
a + = 0x06;
}
যদি ((একটি এবং 0xF0)> 0x90)
a + = 0x60;
setcarry ();
}
clockticks6502 ++,;
}
#শেষ যদি
saveaccum (ফলাফলের);
}
স্থির শূন্য এবং () {
পেনাল্টিপ = 1;
মান = getvalue ();
ফলাফল = (uint16_t) একটি & মান;
zerocalc (ফলাফলের);
signcalc (ফলাফলের);
saveaccum (ফলাফলের);
}
স্ট্যাটিক অকার্যকর asl () {
মান = getvalue ();
ফলাফল = মান << 1;
carrycalc (ফলাফলের);
zerocalc (ফলাফলের);
signcalc (ফলাফলের);
putvalue (ফলাফলের);
}
স্ট্যাটিক শূন্য বিসিসি () {
যদি ((স্থিতি এবং FLAG_CARRY) == 0)
oldpc = pc;
পিসি + = রিলেডড্র;
যদি ((ওল্ডপিসি এবং 0xFF00)! = (পিসি এবং 0xFF00)) ক্লকটিক্স 6502 + = 2; // লাফ কোনও পৃষ্ঠার সীমানা অতিক্রম করেছে কিনা তা পরীক্ষা করুন
অন্য ক্লকটিক্স 6502 ++;
}
}
স্ট্যাটিক শূন্য বিসিএস () {
যদি ((স্থিতি এবং FLAG_CARRY) == FLAG_CARRY)
oldpc = pc;
পিসি + = রিলেডড্র;
যদি ((ওল্ডপিসি এবং 0xFF00)! = (পিসি এবং 0xFF00)) ক্লকটিক্স 6502 + = 2; // লাফ কোনও পৃষ্ঠার সীমানা অতিক্রম করেছে কিনা তা পরীক্ষা করুন
অন্য ক্লকটিক্স 6502 ++;
}
}
স্ট্যাটিক অকার্যকর বেক () {
যদি ((স্থিতি এবং FLAG_ZERO) == FLAG_ZERO)
oldpc = pc;
পিসি + = রিলেডড্র;
যদি ((ওল্ডপিসি এবং 0xFF00)! = (পিসি এবং 0xFF00)) ক্লকটিক্স 6502 + = 2; // লাফ কোনও পৃষ্ঠার সীমানা অতিক্রম করেছে কিনা তা পরীক্ষা করুন
অন্য ক্লকটিক্স 6502 ++;
}
}
স্থির শূন্য বিট () {
মান = getvalue ();
ফলাফল = (uint16_t) একটি & মান;
zerocalc (ফলাফলের);
স্থিতি = (স্থিতি & 0x3F) | (uint8_t) (মান & 0xC0);
}
স্থির শূন্য বিএমআই () {
যদি ((স্থিতি & FLAG_SIGN) == FLAG_SIGN)
oldpc = pc;
পিসি + = রিলেডড্র;
যদি ((ওল্ডপিসি এবং 0xFF00)! = (পিসি এবং 0xFF00)) ক্লকটিক্স 6502 + = 2; // লাফ কোনও পৃষ্ঠার সীমানা অতিক্রম করেছে কিনা তা পরীক্ষা করুন
অন্য ক্লকটিক্স 6502 ++;
}
}
স্ট্যাটিক অকার্যকর Bne () {
যদি ((স্থিতি এবং FLAG_ZERO) == 0)
oldpc = pc;
পিসি + = রিলেডড্র;
যদি ((ওল্ডপিসি এবং 0xFF00)! = (পিসি এবং 0xFF00)) ক্লকটিক্স 6502 + = 2; // লাফ কোনও পৃষ্ঠার সীমানা অতিক্রম করেছে কিনা তা পরীক্ষা করুন
অন্য ক্লকটিক্স 6502 ++;
}
}
স্ট্যাটিক শূন্য বিপিএল () {
যদি ((স্থিতি এবং FLAG_SIGN) == 0)
oldpc = pc;
পিসি + = রিলেডড্র;
যদি ((ওল্ডপিসি এবং 0xFF00)! = (পিসি এবং 0xFF00)) ক্লকটিক্স 6502 + = 2; // লাফ কোনও পৃষ্ঠার সীমানা অতিক্রম করেছে কিনা তা পরীক্ষা করুন
অন্য ক্লকটিক্স 6502 ++;
}
}
স্ট্যাটিক অকার্যকর ব্র্যাক () {
পিসি ++,;
push16 (পিসি); // পরবর্তী নির্দেশিকার ঠিকানাটি স্ট্যাকের উপরে চাপুন
পুশ 8 (স্ট্যাটাস | FLAG_BREAK); // স্ট্যাকের জন্য সিপিইউ স্থিতি চাপুন
setinterrupt (); // সেট বিঘ্নিত পতাকা
pc = (uint16_t) read6502 (0xFFFE) | ((uint16_t) পড়া 6502 (0xFFFF) << 8);
}
স্ট্যাটিক অকার্যকর বিভিসি () {
যদি ((স্থিতি এবং FLAG_OVERFLOW) == 0)
oldpc = pc;
পিসি + = রিলেডড্র;
যদি ((ওল্ডপিসি এবং 0xFF00)! = (পিসি এবং 0xFF00)) ক্লকটিক্স 6502 + = 2; // লাফ কোনও পৃষ্ঠার সীমানা অতিক্রম করেছে কিনা তা পরীক্ষা করুন
অন্য ক্লকটিক্স 6502 ++;
}
}
স্ট্যাটিক অকার্যকর bvs () {
যদি ((স্থিতি এবং FLAG_OVERFLOW) == FLAG_OVERFLOW) {
oldpc = pc;
পিসি + = রিলেডড্র;
যদি ((ওল্ডপিসি এবং 0xFF00)! = (পিসি এবং 0xFF00)) ক্লকটিক্স 6502 + = 2; // লাফ কোনও পৃষ্ঠার সীমানা অতিক্রম করেছে কিনা তা পরীক্ষা করুন
অন্য ক্লকটিক্স 6502 ++;
}
}
স্ট্যাটিক অকার্যকর clc () {
clearcarry ();
}
স্ট্যাটিক অকার্যকর সিএলডি () {
cleardecimal ();
}
স্ট্যাটিক অকার্যকর ক্লিপ () {
clearinterrupt ();
}
স্ট্যাটিক শূন্য clv () {
clearoverflow ();
}
স্ট্যাটিক অকার্যকর সিএমপি () {
পেনাল্টিপ = 1;
মান = getvalue ();
ফলাফল = (uint16_t) এ - মান;
যদি (a> = (uint8_t) (মান & 0x00FF)) সেটকারি ();
অন্যথায় ক্লিয়ারকারি ();
যদি (a == (uint8_t) (মান & 0x00FF)) সেটজারো ();
অন্য ক্লিয়ারজারো ();
signcalc (ফলাফলের);
}
স্ট্যাটিক অকার্যকর সিপিএক্স () {
মান = getvalue ();
ফলাফল = (uint16_t) এক্স - মান;
যদি (x> = (uint8_t) (মান & 0x00FF)) সেটকারি ();
অন্যথায় ক্লিয়ারকারি ();
যদি (x == (uint8_t) (মান & 0x00FF)) সেটজারো ();
অন্য ক্লিয়ারজারো ();
signcalc (ফলাফলের);
}
স্ট্যাটিক শূন্য সিপিপি () {
মান = getvalue ();
ফলাফল = (uint16_t) y - মান;
যদি (y> = (uint8_t) (মান & 0x00FF)) সেটকারি ();
অন্যথায় ক্লিয়ারকারি ();
যদি (y == (uint8_t) (মান & 0x00FF)) সেটজারো ();
অন্য ক্লিয়ারজারো ();
signcalc (ফলাফলের);
}
স্থির অকার্যকর সিদ্ধান্ত () {
মান = getvalue ();
ফলাফল = মান - 1;
zerocalc (ফলাফলের);
signcalc (ফলাফলের);
putvalue (ফলাফলের);
}
স্ট্যাটিক অকার্যকর ডেক্স () {
এক্স--;
zerocalc (x) এর;
signcalc (x) এর;
}
স্ট্যাটিক শূন্য দে () {
y--;
zerocalc (Y);
signcalc (Y);
}
স্ট্যাটিক অকার্যকর ইওর () {
পেনাল্টিপ = 1;
মান = getvalue ();
ফলাফল = (uint16_t) a ^ মান;
zerocalc (ফলাফলের);
signcalc (ফলাফলের);
saveaccum (ফলাফলের);
}
স্ট্যাটিক শূন্য Inc () {
মান = getvalue ();
ফলাফল = মান + 1;
zerocalc (ফলাফলের);
signcalc (ফলাফলের);
putvalue (ফলাফলের);
}
স্ট্যাটিক অকার্যকর ইনক্স () {
এক্স ++,;
zerocalc (x) এর;
signcalc (x) এর;
}
স্থির শূন্য iny () {
Y ++,;
zerocalc (Y);
signcalc (Y);
}
স্ট্যাটিক অকার্যকর জ্যাম্প () {
পিসি = ইএ;
}
স্ট্যাটিক অকার্যকর jsr () {
পুশ 16 (পিসি - 1);
পিসি = ইএ;
}
স্ট্যাটিক অকার্যকর lda () {
পেনাল্টিপ = 1;
মান = getvalue ();
a = (uint8_t) (মান & 0x00FF);
zerocalc (ক);
signcalc (ক);
}
স্ট্যাটিক অকার্যকর ldx () {
পেনাল্টিপ = 1;
মান = getvalue ();
x = (uint8_t) (মান & 0x00FF);
zerocalc (x) এর;
signcalc (x) এর;
}
স্ট্যাটিক অকার্যকর ldy () {
পেনাল্টিপ = 1;
মান = getvalue ();
y = (uint8_t) (মান & 0x00FF);
zerocalc (Y);
signcalc (Y);
}
স্ট্যাটিক অকার্যকর lsr () {
মান = getvalue ();
ফলাফল = মান >> 1;
যদি (মান & 1) সেটকারি ();
অন্যথায় ক্লিয়ারকারি ();
zerocalc (ফলাফলের);
signcalc (ফলাফলের);
putvalue (ফলাফলের);
}
স্ট্যাটিক অকার্যকর ন্যাপ () {
স্যুইচ (অপকোড) {
কেস 0x1 সি:
কেস 0x3 সি:
কেস 0x5 সি:
কেস 0x7 সি:
কেস 0 এক্সডিসি:
কেস 0 এক্সএফসি:
পেনাল্টিপ = 1;
বিরতি;
}
}
স্থির শূন্য ওরা () {
পেনাল্টিপ = 1;
মান = getvalue ();
ফলাফল = (uint16_t) ক | মান;
zerocalc (ফলাফলের);
signcalc (ফলাফলের);
saveaccum (ফলাফলের);
}
স্থির শূন্য ফা () {
push8 (ক);
}
স্ট্যাটিক অকার্যকর পিএইচপি () {
পুশ 8 (স্ট্যাটাস | FLAG_BREAK);
}
স্ট্যাটিক শূন্য প্লা () {
a = pull8 ();
zerocalc (ক);
signcalc (ক);
}
স্থির শূন্যতা plp () {
অবস্থা = টান 8 () | FLAG_CONSTANT;
}
স্ট্যাটিক শূন্য রোল () {
মান = getvalue ();
ফলাফল = (মান << 1) | (স্থিতি & FLAG_CARRY);
carrycalc (ফলাফলের);
zerocalc (ফলাফলের);
signcalc (ফলাফলের);
putvalue (ফলাফলের);
}
স্থির শূন্য রর () {
মান = getvalue ();
ফলাফল = (মান >> 1) | ((স্থিতি & FLAG_CARRY) << 7);
যদি (মান & 1) সেটকারি ();
অন্যথায় ক্লিয়ারকারি ();
zerocalc (ফলাফলের);
signcalc (ফলাফলের);
putvalue (ফলাফলের);
}
স্থির শূন্য rti () {
স্থিতি = pull8 ();
মান = টানা 16 ();
পিসি = মান;
}
স্থির শূন্য rts () {
মান = টানা 16 ();
পিসি = মান + 1;
}
স্ট্যাটিক অকার্যকর এসবিসি () {
পেনাল্টিপ = 1;
মান = getvalue () x 0x00FF;
ফলাফল = (uint16_t) একটি + মান + (uint16_t) (স্থিতি এবং FLAG_CARRY);
carrycalc (ফলাফলের);
zerocalc (ফলাফলের);
ওভারফ্লোক্যালক (ফলাফল, ক, মান);
signcalc (ফলাফলের);
#ifndef NES_CPU
যদি (স্থিতি এবং FLAG_DECIMAL) {
clearcarry ();
a - = 0x66;
যদি ((একটি এবং 0x0F)> 0x09)
a + = 0x06;
}
যদি ((একটি এবং 0xF0)> 0x90)
a + = 0x60;
setcarry ();
}
clockticks6502 ++,;
}
#শেষ যদি
saveaccum (ফলাফলের);
}
স্ট্যাটিক শূন্য সেকেন্ড () {
setcarry ();
}
স্ট্যাটিক শূন্য সেড () {
setdecimal ();
}
স্ট্যাটিক অকার্যকর সে () {
setinterrupt ();
}
স্ট্যাটিক অকার্যকর স্টা () {
putvalue (ক);
}
স্ট্যাটিক অকার্যকর স্টেক্স () {
putvalue (x) এর;
}
স্ট্যাটিক শূন্য শৈলী () {
putvalue (Y);
}
স্ট্যাটিক শূন্য কর () {
x = ক;
zerocalc (x) এর;
signcalc (x) এর;
}
স্থির শূন্য তা () {
y = a;
zerocalc (Y);
signcalc (Y);
}
স্ট্যাটিক শূন্য tsx () {
x = এসপি;
zerocalc (x) এর;
signcalc (x) এর;
}
স্ট্যাটিক শূন্য txa () {
a = x;
zerocalc (ক);
signcalc (ক);
}
স্ট্যাটিক শূন্য txs () {
sp = x;
}
স্থির শূন্য টিয়া () {
a = y;
zerocalc (ক);
signcalc (ক);
}
// অননুমোদিত নির্দেশাবলী
#ifdef অন্তর্ভুক্ত
স্থির অকার্যকর শিথিল () {
LDA ();
ldx ();
}
স্ট্যাটিক অকার্যকর স্যাক্স () {
Sta ();
stx ();
পুটভ্যালু (একটি & এক্স);
যদি (পেনাল্টিপ && পেনাল্টিএডিআর) ক্লকটিক্স 6502--;
}
স্ট্যাটিক অকার্যকর ডিসিপি () {
ডিসেম্বর ();
CMP ();
যদি (পেনাল্টিপ && পেনাল্টিএডিআর) ক্লকটিক্স 6502--;
}
স্ট্যাটিক অকার্যকর isb () {
Inc ();
SBC ();
যদি (পেনাল্টিপ && পেনাল্টিএডিআর) ক্লকটিক্স 6502--;
}
স্ট্যাটিক শূন্য শ্লোক () {
ASL ();
Ora ();
যদি (পেনাল্টিপ && পেনাল্টিএডিআর) ক্লকটিক্স 6502--;
}
স্থির শূন্য rla () {
Rol ();
এবং();
যদি (পেনাল্টিপ && পেনাল্টিএডিআর) ক্লকটিক্স 6502--;
}
স্ট্যাটিক অকার্যকর sre () {
lsr ();
eor ();
যদি (পেনাল্টিপ && পেনাল্টিএডিআর) ক্লকটিক্স 6502--;
}
স্ট্যাটিক শূন্য rra () {
Ror ();
এডিসি ();
যদি (পেনাল্টিপ && পেনাল্টিএডিআর) ক্লকটিক্স 6502--;
}
#else
# নির্ধারণ লক্ষ
# নির্ধারিত স্যাক্স ন্যাপ
# নির্ধারিত ডিসিপি নো
# নির্ধারিত
# নির্ধারিত স্লো না
# নির্ধারিত
# ডেফাইন sre nop
# নির্ধারিত
#শেষ যদি
স্ট্যাটিক অকার্যকর (* সংযোজনযোগ্য [256]) () = {
/ * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ক | খ | সি | ডি | E | এফ | * /
/ * 0 * / ইমপি, ইনডেক্স, ইমপি, ইনডেক্স, জেপি, জেপি, জেপি, জেপি, ইমপি, এমএম, এ্যাক, ইমি, আবসো, আবসো, আবসো, অ্যাবসো, / * 0 * /
/ * 1 * / রিল, ইন্ডি, ইমপি, ইনডি, জেডপেক্স, জেডপেক্স, জেডপেক্স, জেডপেক্স, ইমপি, অ্যাবসি, ইমপি, অ্যাবসি, অ্যাবএক্স, অ্যাবএক্স, অ্যাবএক্স, / * 1 * /
/ * 2 * / অ্যাবসো, ইনডেক্স, ইমপি, ইনডেক্স, জেপি, জেপি, জেপি, জেপি, ইমপি, এমএম, এ্যাক, ইমি, আবসো, আবসো, অ্যাবসো, অ্যাবসো, / * 2 * /
/ * 3 * / rel, ইন্ডি, ছাপ, ইনডি, জেডপিএক্স, জেডপেক্স, জেডপেক্স, জেডপেক্স, ইমপি, অ্যাবসি, ইমপি, অ্যাবসি, অ্যাবএক্স, অ্যাবএক্স, অ্যাবএক্স, / * 3 * /
/ * 4 * / ইমপি, ইনডেক্স, ইমপি, ইনডেক্স, জেপি, জেপি, জেপি, জেপি, ইমপি, এমএম, এ্যাক, ইমি, আবসো, আবসো, আবসো, আবসো, / * 4 * /
/ * 5 * / রিল, ইন্ডি, ছাপ, ইন্ডি, জেডপেক্স, জেডপেক্স, জেডপেক্স, জেডপেক্স, ইমপি, অ্যাবসি, আইএমপি, অ্যাবসি, অ্যাবএক্স, অ্যাবএক্স, অ্যাবএক্স, / * 5 * /
/ * 6 * / ইমপি, ইনডেক্স, আইএমপি, ইনডেক্স, জেপি, জেপি, জেপি, জেপি, ইমপি, এমএম, এ্যাক, ইমি, ইন্ড, আবসো, আবসো, আবসো, / * 6 * /
/ * 7 * / rel, ইন্ডি, ছাপ, ইনডি, জেডপিএক্স, জেডপেক্স, জেডপেক্স, জেডপেক্স, ইমপি, অ্যাবসি, ইমপি, অ্যাবসি, অ্যাবএক্স, অ্যাবএক্স, অ্যাবএক্স, / * 7 * /
/ * 8 * / ইমি, ইনডেক্স, ইমিড, ইনডেক্স, জেপি, জেপি, জেপি, জেপি, আইএমপি, ইম্প, ইমপি, ইমি, আবসো, আবসো, আবসো, আবসো, / * 8 * /
/ * 9 * / রিল, ইন্ডি, ইমপি, ইনডি, জেডপেক্স, জেডপেক্স, জেপি, জেপি, ইমপি, অ্যাজেসি, ইমপি, অ্যাবসি, অ্যাবএক্স, অ্যাবএক্স, অ্যাবেসি, অ্যাবসি, / * 9 * /
/ * এ * / ইমি, ইনডেক্স, ইমিড, ইনডেক্স, জেপি, জেপি, জেপি, জেপি, আইএমপি, ইম্প, ইমপি, ইমি, আবসো, আবসো, আবসো, অ্যাবসো, / * এ * /
/ * বি * / রিল, ইন্ডি, ইমপি, ইনডি, জেডপেক্স, জেডপেক্স, জেডপি, জেপি, ইমপি, অ্যাজেসি, ইমপি, অ্যাবসি, অ্যাবএক্স, অ্যাবএক্স, অ্যাবেসি, অ্যাজে, / * বি * /
/ * সি * / ইমি, ইনডেক্স, ইমিড, ইনডেক্স, জেপি, জেপি, জেপি, জেপি, আইএমপি, ইম্প, ইমপি, ইমি, আবসো, আবসো, আবসো, অ্যাবসো, / * সি * /
/ * ডি * / রিল, ইন্ডি, ইমপি, ইনডি, জেডপেক্স, জেডপেক্স, জেডপেক্স, জেডপেক্স, ইমপি, অ্যাবসি, ইমপি, অ্যাবসি, অ্যাবএক্স, অ্যাবএক্স, অ্যাবএক্স, / * ডি * /
/ * ই * / ইমি, ইনডেক্স, ইমিডেক্স, ইনডেক্স, জেপি, জেপি, জেপি, জেপি, আইএমপি, ইম্প, ইমপি, ইমি, আবসো, আবসো, আবসো, আবসো, / * ই * /
/ * এফ * / রিল, ইন্ডি, ছাপ, ইন্ডি, জেডপেক্স, জেডপেক্স, জেডপেক্স, জেডপেক্স, ইমপি, অ্যাবসি, ইমপি, অ্যাবসি, অ্যাবএক্স, অ্যাবএক্স, অ্যাবএক্স / * এফ * /
};
স্ট্যাটিক অকার্যকর (* অপ্টেবল [256]) () = {
/ * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ক | খ | সি | ডি | E | এফ | * /
/ * 0 * / ব্রেকে, ওরা, নোপ, স্লো, নোপ, ওরা, এসএল, স্লো, পিএইচপি, ওরা, এসএল, নোপ, ন্যাপ, ওরা, এসএল, স্লো, / * 0 * /
/ * 1 * / বিপিএল, ওরা, নোপ, স্লো, নপ, ওরা, এসএল, স্লো, সিএলসি, ওরা, নোপ, স্লো, নোপ, ওরা, এসএল, স্লো, / * 1 * /
/ * 2 * / জেএসআর, এবং, নোপ, আরলা, বিট, এবং রোল, আরএলএ, পিএলপি, এবং, রোল, নোপ, বিট, এবং, রোল, আরএল, / * 2 * /
/ * 3 * / বিএমআই, এবং, নোপ, আরএলএ, নোপ, এবং, রোল, আরএলএ, সেকেন্ড, এবং, নোং, আরএলএ, নোপ, এবং, রোল, আরএলএ, / * 3 * /
/ * 4 * / আরটিআই, ইওর, নোপ, সেরি, নোপ, ইওর, এলএসআর, সেরে, ফা, ইওর, এলএসআর, এনওপি, জেএমপি, ইওর, এলএসআর, সেরি, / * 4 * /
/ * 5 * / বিভিসি, ইওর, এনওপি, সেরি, নোপ, ইওর, এলএসআর, সেরি, ক্লিপ, ইওর, নোপ, সের, নোপ, ইওর, এলএসআর, সেরি, / * 5 * /
/ * 6 * / আরটিএস, অ্যাডিসি, নোপ, আরআর, এনওপি, অ্যাডিসি, রর, আরএ, পিএল, এডিসি, রর, নোপ, জেএমপি, অ্যাডিসি, রোর, আরএ, / * 6 * /
/ * 7 * / বিভিএস, অ্যাডিসি, নোপ, আরএ, এনওপি, অ্যাডিসি, রর, আরএ, এসই, এডিসি, নোপ, আরএ, নোপ, অ্যাডিসি, রর, আরএ, / * 7 * /
/ * 8 * / এনওপি, স্টা, নোপ, স্যাক্স, স্টাইল, স্টা, স্টেক্স, স্যাক্স, ডি, নপ, টেক্সা, নোপ, স্টাইল, স্টা, স্ট্যাক্স, স্যাক্স, / * 8 * /
/ * 9 * / বিসিসি, স্টা, নোপ, নোপ, স্টাইল, স্টা, স্টেক্স, স্যাক্স, ট্যায়া, স্টা, টিএক্সএস, নোপ, নোপ, স্টা, নোপ, / "9 * /
/ * এ * / এলডি, এলডিএ, এলডিএক্স, ল্যাক্স, এলডি, এলডিএ, এলডিএক্স, ল্যাক্স, তাই, এলডিএ, ট্যাক্স, এনওপি, এলডি, এলডিএ, এলডিএক্স, ল্যাক্স, / * এ * /
/ * বি * / বিসিএস, এলডিএ, নোপ, ল্যাক্স, এলডি, এলডিএ, এলডিএক্স, ল্যাক্স, সিভিভি, এলডিএ, টিএসএক্স, ল্যাক্স, এলডি, এলডিএ, এলডিএক্স, ল্যাক্স, / * বি * /
/ * সি * / সিপিপি, সিএমপি, এনওপি, ডিসিপি, সিপিপি, সিএমপি, ডিস, ডিসিপি, ইনি, সিএমপি, ডেক্স, এনওপি, সিপি, সিএমপি, ডিসি, ডিসিপি, / * সি * /
/ * ডি * / বেনি, সিএমপি, এনওপি, ডিসিপি, নোপ, সিএমপি, ডেস্ক, ডিসিপি, সিলিডি, সিএমপি, নোপ, ডিসিপি, নোপ, সিএমপি, ডিসি, ডিসিপি, / * ডি * /
/ * ই * / সিপিএক্স, এসবিসি, নোপ, আইএসবি, সিপিএক্স, এসবিসি, ইনক, আইএসবি, ইনেক্স, এসবিসি, নোপ, এসবিসি, সিপিএক্স, এসবিসি, ইনক, আইএসবি, / * ই * /
/ * এফ * / বীক, এসবিসি, নোপ, আইএসবি, নোপ, এসবিসি, ইনক, আইএসবি, সেড, এসবিসি, নোপ, ইসবি, নোপ, এসবিসি, ইনক, আইএসবি / * এফ * /
};
স্ট্যাটিক কনস্ট uint32_t টিকটেবল [256] = {
/ * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ক | খ | সি | ডি | E | এফ | * /
/ * 0 * / 7, 6, 2, 8, 3, 3, 5, 5, 3, 2, 2, 2, 4, 4, 6, 6, / * 0 * /
/ * 1 * / 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, / * 1 * /
/ * 2 * / 6, 6, 2, 8, 3, 3, 5, 5, 4, 2, 2, 2, 4, 4, 6, 6, / * 2 * /
/ * 3 * / 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, / * 3 * /
/ * 4 * / 6, 6, 2, 8, 3, 3, 5, 5, 3, 2, 2, 2, 3, 4, 6, 6, / * 4 * /
/ * 5 * / 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, / * 5 * /
/ * 6 * / 6, 6, 2, 8, 3, 3, 5, 5, 4, 2, 2, 2, 5, 4, 6, 6, / * 6 * /
/ * 7 * / 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, / * 7 * /
/ * 8 * / 2, 6, 2, 6, 3, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4, / * 8 * /
/ * 9 * / 2, 6, 2, 6, 4, 4, 4, 4, 2, 5, 2, 5, 5, 5, 5, 5, / * 9 * /
/ * এ * / 2, 6, 2, 6, 3, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4, / * এ * /
/ * বি * / 2, 5, 2, 5, 4, 4, 4, 4, 4, 2, 4, 2, 4, 4, 4, 4, 4, / * বি * /
/ * সি * / 2, 6, 2, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6, / * সি * /
/ * ডি * / 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, / * ডি * /
/ * ই * / 2, 6, 2, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6, / * ই * /
/ * এফ * / 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7 / * এফ * /
};
অকার্যকর nmi6502 () {
push16 (পিসি);
push8 (অবস্থা);
স্থিতি | = FLAG_INTERRUPT;
pc = (uint16_t) read6502 (0xFFFA) | ((uint16_t) পড়া 6502 (0xFFFB) << 8);
}
অকার্যকর irq6502 () {
push16 (পিসি);
push8 (অবস্থা);
স্থিতি | = FLAG_INTERRUPT;
pc = (uint16_t) read6502 (0xFFFE) | ((uint16_t) পড়া 6502 (0xFFFF) << 8);
}
uint8_t ক্যালেক্সার্নাল = 0;
অকার্যকর (* লুপেক্সটার্নাল) ();
অকার্যকর কার্যকর 6502 (uint32_t টিককাউন্ট) {
ক্লকগোয়াল6502 + = টিককাউন্ট;
যখন (ক্লকটিক্স 6502 <ক্লকগোয়াল6502) {
অপকোড = রিড6502 (পিসি ++);
পেনাল্টিপ = 0;
জরিমানা = 0;
(* Addrtable [opcode]) ();
(* Optable [opcode]) ();
ঘড়িঘড়ি 6502 + = টিকটবল [ওপকোড];
যদি (পেনাল্টিপ && পেনাল্টিএডিআর) ক্লকটিক্স 6502 ++;
নির্দেশাবলীর ++,;
যদি (কালেক্সেন্টাল) (* লুপেক্সটার্নাল) ();
}
}
অকার্যকর পদক্ষেপ 6502 () {
অপকোড = রিড6502 (পিসি ++);
পেনাল্টিপ = 0;
জরিমানা = 0;
(* Addrtable [opcode]) ();
(* Optable [opcode]) ();
ঘড়িঘড়ি 6502 + = টিকটবল [ওপকোড];
যদি (পেনাল্টিপ && পেনাল্টিএডিআর) ক্লকটিক্স 6502 ++;
ক্লকগোয়াল6502 = ক্লকটিক্স 6502;
নির্দেশাবলীর ++,;
যদি (কালেক্সেন্টাল) (* লুপেক্সটার্নাল) ();
}
অকার্যকর hookextern (শূন্য * মজাদার) {
যদি (ফানকપ્টার! = (শূন্য *) নাল) {
লুপেক্সটার্নাল = ফানকপিটার;
ক্যালেক্সার্নাল = 1;
cal অন্যদিকে কলম্বীয় = 0;
}