8 বিট ভার্চুয়াল মেশিন


31

পটভূমি

আমি আমার পুরানো 8 বিট 6502 চিপ পছন্দ করি। 6502 মেশিন কোডে পিপিসিজি-তে কিছু চ্যালেঞ্জগুলি সমাধান করা এমনকি মজাদার। তবে কিছু জিনিস যা সহজ হওয়া উচিত (যেমন, ডেটাতে পড়া বা স্টাডআউট থেকে আউটপুট) মেশিন কোডে করা অযথা জটিল are সুতরাং আমার মনের মধ্যে একটি মোটামুটি ধারণা আছে: 6502 দ্বারা অনুপ্রাণিত আমার নিজস্ব 8-বিট ভার্চুয়াল মেশিন আবিষ্কার করুন, তবে চ্যালেঞ্জগুলির জন্য আরও ব্যবহারযোগ্য হতে পারে এমন নকশা সংশোধন করে। কোনও কিছুর বাস্তবায়ন শুরু করে, আমি বুঝতে পেরেছিলাম যে ভিএম এর ডিজাইনটি ন্যূনতম ন্যূনতম করে দেওয়া হলে এটি নিজের পক্ষে একটি দুর্দান্ত চ্যালেঞ্জ হতে পারে :)

কার্য

নিম্নলিখিত স্পেসিফিকেশন মেনে একটি 8-বিট ভার্চুয়াল মেশিন প্রয়োগ করুন। এটি , সুতরাং কয়েকটি বাইটের সাথে বাস্তবায়নটি জয়ী হয়।

ইনপুট

আপনার প্রয়োগের নিম্নলিখিত ইনপুট গ্রহণ করা উচিত:

  • একটি স্বাক্ষরবিহীন বাইট pc, এটি প্রাথমিক প্রোগ্রামের কাউন্টার (মেমরির ঠিকানা যেখানে ভিএম বাস্তবায়ন শুরু করে, 0ভিত্তিতে)

  • সর্বাধিক দৈর্ঘ্যের 256এন্ট্রি সহ বাইটগুলির একটি তালিকা, এটি ভার্চুয়াল মেশিনের র‌্যাম (এটির প্রাথমিক সামগ্রী সহ)

আপনি যে কোনও সংবেদনশীল বিন্যাসে এই ইনপুট নিতে পারেন।

আউটপুট

ভিএম সমাপ্ত হওয়ার পরে র্যামের চূড়ান্ত বিষয়বস্তু বাইটগুলির একটি তালিকা (নীচে দেখুন)। আপনি ধরে নিতে পারেন যে আপনি কেবল ইনপুট পেয়েছেন যা শেষ পর্যন্ত শেষের দিকে নিয়ে যায়। যে কোনও বুদ্ধিমান বিন্যাস অনুমোদিত।

ভার্চুয়াল সিপিইউ

ভার্চুয়াল সিপিইউ রয়েছে

  • একটি 8-বিট প্রোগ্রাম কাউন্টার,
  • একটি 8-বিট জড়িত রেজিস্টার বলা হয় Aএবং
  • একটি 8 বিট সূচক রেজিস্টার বলা হয় X

তিনটি স্থিতির পতাকা রয়েছে:

  • Z - কিছু অপারেশন ফলাফল পরে শূন্য পতাকা সেট করা হয় 0
  • N someণাত্মক পতাকাটি কিছু অপারেশন ফলাফলের পরে নেতিবাচক সংখ্যার পরে সেট করা হয় (ফলাফলের বিট 7 সেট করা হয়)
  • C - বহনের পতাকাটি ফলাফলের "অনুপস্থিত" বিটের জন্য সংযোজন এবং শিফট দ্বারা সেট করা হয়

শুরু করার পরে, ফ্ল্যাগ সব সরিয়ে ফেলা হয়, প্রোগ্রাম কাউন্টার একটি প্রদত্ত মান এবং বিষয়বস্তু সেট করা হয় AএবংX অনির্দিষ্ট হয়।

8-বিট মানগুলি হয় প্রতিনিধিত্ব করে

  • একটি স্বাক্ষরবিহীনপরিসরে পূর্ণসংখ্যা[0..255]
  • একটি স্বাক্ষরিত পূর্ণসংখ্যা, 2 এর পরিপূরক[-128..127]

প্রসঙ্গে উপর নির্ভর করে। যদি কোনও অপারেশন ওভার-বা আন্ডারফ্লো হয় তবে মানটি চারদিকে .েকে যায় (এবং সংযোজনের ক্ষেত্রে ক্যারি পতাকাটি প্রভাবিত হয়)।

পরিসমাপ্তি

ভার্চুয়াল মেশিন কখন শেষ হয়

  • একজন HLT নির্দেশ পৌঁছেছে
  • একটি অ-বিদ্যমান মেমরি ঠিকানা প্রবেশ করা হয়
  • প্রোগ্রামের কাউন্টারটি মেমোরিটির বাইরে চলে যায় (নোট করুন এটি ভিএমএমকে পূর্ণ 256 বাইট মেমরির দেওয়া হলেও এটি মোড়ানো হয় না)

ঠিকানা মোড

  • অন্তর্নিহিত - নির্দেশের কোনও যুক্তি নেই, অপরেন্ডটি নিহিত রয়েছে
  • আশু - নির্দেশনার পরে অপারেন্ডটি বাইট হয়
  • আপেক্ষিক - (কেবল শাখার জন্য) নির্দেশিকা সই হওয়ার পরে বাইট (2 এর পরিপূরক) এবং শাখা নেওয়া হলে প্রোগ্রামের কাউন্টারে যুক্ত করার জন্য অফসেটটি নির্ধারণ করে।0নিম্নলিখিত নির্দেশের অবস্থান
  • পরম - নির্দেশের পরে বাইট হ'ল অপারেন্ডের ঠিকানা
  • সূচিবদ্ধ - নির্দেশের পরে বাইট Xহ'ল অপারেন্ডের ঠিকানা (রেজিস্টার)

নির্দেশনা

প্রতিটি নির্দেশিকায় একটি অপকোড (একটি বাইট) থাকে এবং ঠিকানার মোডে তাত্ক্ষণিক , আপেক্ষিক , পরম এবং দ্বিতীয় যুক্তি বাইটকে সূচিত করা হয় । ভার্চুয়াল সিপিইউ কোনও নির্দেশনা কার্যকর করলে, এটি অনুসারে প্রোগ্রামের কাউন্টারকে বাড়িয়ে দেয় ( 1বা দ্বারা 2)।

এখানে প্রদর্শিত সমস্ত অপকড হেক্সে রয়েছে।

  • LDA - লোড অপারেন্ড ইন A

    • অপকডস: তাত্ক্ষণিক:, 00নিরঙ্কুশ :, সূচকযুক্ত 02:04
    • পতাকা: Z,N
  • STA- Aঅপারেন্ড মধ্যে স্টোর

    • অপকডস: তাত্ক্ষণিক:, 08নিরঙ্কুশ :, সূচকযুক্ত 0a:0c
  • LDX - লোড অপারেন্ড ইন X

    • অপকডস: তাত্ক্ষণিক:, 10পরম:12:14
    • পতাকা: Z,N
  • STX- Xঅপারেন্ড মধ্যে স্টোর

    • অপকডস: তাত্ক্ষণিক:, 18নিরঙ্কুশ :, সূচকযুক্ত 1a:1c
  • AND- বিটওয়াইস এবং এর Aএবং অপারেন্ড করাA

    • অপকডস: তাত্ক্ষণিক:, 30পরম:32:34
    • পতাকা: Z,N
  • ORA- বিটওয়াইস বা এর Aএবং অপারেন্ড করাA

    • অপকডস: তাত্ক্ষণিক:, 38পরম:3a:3c
    • পতাকা: Z,N
  • EOR- বিটওয়াইজ জোর (একচেটিয়া বা) এর মধ্যে Aএবং অপারেন্ডA

    • অপকডস: তাত্ক্ষণিক:, 40পরম:42:44
    • পতাকা: Z,N
  • LSR - লজিকাল শিফট ডান, অপরেন্দ্রের সমস্ত বিট এক জায়গায় ডানদিকে স্থানান্তর করুন, বিট 0 বহন করতে যায়

    • অপকডস: তাত্ক্ষণিক:, 48নিরঙ্কুশ :, সূচকযুক্ত 4a:4c
    • পতাকা: Z, N,C
  • ASL - গাণিতিক শিফট বাম, অপারেন্ডের সমস্ত বিট এক জায়গায় বামে স্থানান্তরিত করুন, বিট 7 বহন করতে যায়

    • অপকডস: তাত্ক্ষণিক:, 50নিরঙ্কুশ :, সূচকযুক্ত 52:54
    • পতাকা: Z, N,C
  • ROR - ডানদিকে ঘোরান, অপরেন্দ্রের সমস্ত বিট এক জায়গায় ডানদিকে সরান, ক্যারিটি বিট 7 তে যায়, বিট 0 বহন করতে যায়

    • অপকডস: তাত্ক্ষণিক:, 58নিরঙ্কুশ :, সূচকযুক্ত 5a:5c
    • পতাকা: Z, N,C
  • ROL - বামদিকে ঘোরান, অপারেন্ডের সমস্ত বিট এক জায়গায় বামে স্থানান্তরিত করুন, বিট 0 তে যান, বিট 7 বহন করতে যান

    • অপকডস: তাত্ক্ষণিক:, 60নিরঙ্কুশ :, সূচকযুক্ত 62:64
    • পতাকা: Z, N,C
  • ADC- ক্যারি যুক্ত করুন, অপরেন্দ্র প্লাস ক্যারি যুক্ত করা হবে A, বহন ওভারফ্লোতে সেট করা আছে

    • অপকডস: তাত্ক্ষণিক:, 68নিরঙ্কুশ :, সূচকযুক্ত 6a:6c
    • পতাকা: Z, N,C
  • INC - একের পর এক ইনক্রিমেন্ট অপারেন্ড

    • অপকডস: তাত্ক্ষণিক:, 78নিরঙ্কুশ :, সূচকযুক্ত 7a:7c
    • পতাকা: Z,N
  • DEC - হ্রাস অপারেন্ড এক এক

    • অপকডস: তাত্ক্ষণিক:, 80নিরঙ্কুশ :, সূচকযুক্ত 82:84
    • পতাকা: Z,N
  • CMP- Aঅপারেন্ডকে বিয়োগ করে অপারেন্ডের সাথে তুলনা করুন A, ফলাফলটি ভুলে যান। ক্যারিটি আন্ডারফ্লোতে সাফ হয়ে যায়, অন্যথায় সেট করুন

    • অপকডস: তাত্ক্ষণিক:, 88নিরঙ্কুশ :, সূচকযুক্ত 8a:8c
    • পতাকা: Z, N,C
  • CPX- তুলনা X- হিসাবে একই CMPজন্যX

    • অপকডস: তাত্ক্ষণিক:, 90নিরঙ্কুশ :, সূচকযুক্ত 92:94
    • পতাকা: Z, N,C
  • HLT - অবসান

    • অপকডস: অন্তর্নিহিত: c0
  • INX- Xএক এক করে বৃদ্ধি

    • অপকডস: অন্তর্নিহিত: c8
    • পতাকা: Z,N
  • DEX- Xএক এক করে হ্রাস

    • অপকডস: অন্তর্নিহিত: c9
    • পতাকা: Z,N
  • SEC - বহন পতাকা সেট

    • অপকডস: অন্তর্নিহিত: d0
    • পতাকা: C
  • CLC - পরিষ্কার বহন পতাকা

    • অপকডস: অন্তর্নিহিত: d1
    • পতাকা: C
  • BRA - সর্বদা শাখা

    • অপকডস: আপেক্ষিক: f2
  • BNE- Zপতাকা সাফ হলে শাখা

    • অপকডস: আপেক্ষিক: f4
  • BEQ- Zপতাকা সেট করা হলে শাখা

    • অপকডস: আপেক্ষিক: f6
  • BPL- Nপতাকা সাফ হলে শাখা

    • অপকডস: আপেক্ষিক: f8
  • BMI- Nপতাকা সেট করা হলে শাখা

    • অপকডস: আপেক্ষিক: fa
  • BCC- Cপতাকা সাফ হলে শাখা

    • অপকডস: আপেক্ষিক: fc
  • BCS- Cপতাকা সেট করা হলে শাখা

    • অপকডস: আপেক্ষিক: fe

Opcodes

উপরের তালিকা থেকে কোনও বৈধ নির্দেশনার মানচিত্র না পাওয়া কোনও অপকোড পাওয়া গেলে ভিএম এর আচরণ অপরিজ্ঞাত।

অনুযায়ী জনাথন অ্যালান অনুরোধ , আপনি পারে দেখানো opcodes পরিবর্তে opcodes আপনার নিজস্ব সেট চয়ন করুন নির্দেশাবলী অধ্যায়। যদি আপনি এটি করেন, আপনার অবশ্যই হবে তবে আপনার উত্তরে উপরে ব্যবহৃত অপকডগুলিতে একটি পূর্ণ ম্যাপিং যুক্ত ।

ম্যাপিংটি জোড়গুলির সাথে একটি হেক্স ফাইল হওয়া উচিত <official opcode> <your opcode>, উদাহরণস্বরূপ যদি আপনি দুটি অপকড প্রতিস্থাপন করেন:

f4 f5
10 11

নিউলাইনগুলি এখানে কিছু যায় আসে না।

পরীক্ষার কেস (অফিসিয়াল অপকডস)

// some increments and decrements
pc:     0
ram:    10 10 7a 01 c9 f4 fb
output: 10 20 7a 01 c9 f4 fb

// a 16bit addition
pc:     4
ram:    e0 08 2a 02 02 00 6a 02 0a 00 02 01 6a 03 0a 01
output: 0a 0b 2a 02 02 00 6a 02 0a 00 02 01 6a 03 0a 01

// a 16bit multiplication
pc:     4
ram:    5e 01 28 00 10 10 4a 01 5a 00 fc 0d 02 02 d1 6a 21 0a 21 02 03 6a 22 0a 22 52
        02 62 03 c9 f8 e6 c0 00 00
output: 00 00 00 00 10 10 4a 01 5a 00 fc 0d 02 02 d1 6a 21 0a 21 02 03 6a 22 0a 22 52
        02 62 03 c9 f8 e6 c0 b0 36

আমি পরে আরও টেস্টকেস যুক্ত করতে পারি।

রেফারেন্স এবং পরীক্ষা

নিজস্ব পরীক্ষা-নিরীক্ষার সাহায্যে, এখানে কিছু (সম্পূর্ণরূপে গল্ফ করা হয়নি) রেফারেন্স বাস্তবায়ন রয়েছে - এটি stderrচলমান চলাকালীন ট্রেসিং তথ্য (বিচ্ছিন্ন নির্দেশাবলী সহ) আউটপুট এবং অপকডগুলিকে রূপান্তর করতে পারে ।

উত্সটি পাওয়ার প্রস্তাবিত উপায়:

git clone https://github.com/zirias/gvm --branch challenge --single-branch --recurse-submodules

বা চেকআউট শাখা challengeএবং একটি কgit submodule update --init --recursive আমার কাস্টম বিল্ড সিস্টেমটি পেতে ক্লোনিংয়ের পরে ।

জিএনইউ মেক দিয়ে সরঞ্জামটি তৈরি করুন (কেবল টাইপ করুন make, বা gmakeআপনার সিস্টেমে থাকলে ডিফল্ট মেক GNU মেক হয় না)।

ব্যবহার :gvm [-s startpc] [-h] [-t] [-c convfile] [-d] [-x] <initial_ram

  • -s startpc - প্রাথমিক প্রোগ্রাম কাউন্টার, ডিফল্ট 0
  • -h - ইনপুট হেক্সে রয়েছে (অন্যথায় বাইনারি)
  • -t - মৃত্যুদন্ড কার্যকর করতে stderr
  • -c convfile - দেওয়া ম্যাপিং অনুসারে ওপকোডগুলি রূপান্তর করুন convfile
  • -d - বাইনারি তথ্য হিসাবে ফলস্বরূপ মেমরি ডাম্প
  • -x - হেমস হিসাবে ফলস্বরূপ মেমরি ডাম্প
  • initial_ram - প্রাথমিক র‌্যামের সামগ্রীগুলি হেক্স বা বাইনারি হয়

নোট করুন রূপান্তর বৈশিষ্ট্যটি চলমান সময় অপকডগুলিকে সংশোধনকারী প্রোগ্রামগুলিতে ব্যর্থ হবে।

দাবি অস্বীকার: উপরোক্ত নিয়ম এবং চশমা এই চ্যালেঞ্জটির পক্ষে রচয়িতা, এই সরঞ্জামটি নয়। এটি বিশেষত ওপকোড রূপান্তর বৈশিষ্ট্যের জন্য প্রযোজ্য। আপনি যদি মনে করেন যে এখানে উপস্থাপিত সরঞ্জামটির মধ্যে একটি বাগ চিকিত্সা রয়েছে তবে দয়া করে একটি মন্তব্যে রিপোর্ট করুন :)


1
আমি কল্পনা করেছিলাম যে নির্দেশাবলীর জন্য বিভিন্ন অপকডগুলি বেছে নিয়ে সম্ভবত বহু গল্ফ করার সুযোগ থাকবে তবে মনে হয় অপকডগুলি স্থির হয়ে গেছে (যদিও নির্দেশিকা সেট মেশিনকে সংজ্ঞায়িত করে)। সম্ভবত বাস্তবায়নগুলি তাদের নিজস্ব কোড-পৃষ্ঠা থাকতে দেয় তা বিবেচনা করার মতো?
জোনাথন অ্যালান

1
@ জোনাথন অ্যালান এ সম্পর্কে দু'বার ভেবেছিল, আমি এখনই এটির অনুমতি দিচ্ছি এবং অন্যান্য সেট অপপডগুলি সহজেই পরীক্ষারযোগ্য করে সমাধানগুলি সমাধান করার জন্য একটি "রূপান্তর" সরঞ্জাম যুক্ত করতে পারে।
ফেলিক্স পামেন

1
@ আর্নল্ড বিটিডব্লিউ বিটিডব্লিকে আমার বিশেষ যুক্তির পরিমাণ হ্রাস করার পক্ষে যুক্তি প্রকাশ করেছিলেন, সুতরাং এটি আরও ভাল "গল্ফেবল" হওয়া উচিত - প্রতিটি ওপোড হয় নিখরচায়, একটি আপেক্ষিক শাখা বা অন্য তিনটি ঠিকানা মোডের অনুমতি দেয় :)
ফেলিক্স প্যালম্যান

1
যদি BRA("শাখা সর্বদা") নিয়ন্ত্রণ প্রবাহে কোনও শাখা প্রবর্তন না করে, তাকে বলা উচিত নয় JMP?
ngn

1
@nn ভাল, BRAপরে চিপ ডিজাইনে ( 50৫০২ এর মতো নির্দেশ নেই) 65C02 এবং এমসির 68000 এর মতো JMPবিদ্যমান রয়েছে well পার্থক্যটি হ'ল BRAআপেক্ষিক ঠিকানা JMPব্যবহার করে এবং নিখুঁত ঠিকানা ব্যবহার করে। সুতরাং, আমি কেবল এই নকশাগুলি অনুসরণ করেছি - সত্যই, এটি সমস্ত যৌক্তিক মনে হয় না;)
ফেলিক্স পামেন

উত্তর:


16

সি (জিসিসি) , 1381 1338 1255 1073 বাইট

সিলিংক্যাট এবং রোজেমকে বিশাল উন্নতি ধন্যবাদ।

#include<stdio.h>
C*F="%02hhx ";m[256],p,a,x,z,n,c,e;g;*I(){R++p+m;}*A(){R*I()+m;}*X(){R*I()+m+x;}C*Q(){W(printf,m[g],1)exit(a);}C*(*L[])()={I,Q,A,Q,X,Q,Q,Q};l(C*i){R 254/p?*i=*L[m[p]&7]():*Q();}s(i){R 254/p?*L[m[p]&7]()=i:*Q();}q(){p>254?Q():++p;}C*y(){p+=e;}B(U,z)B(V,!z)B(_,n)B(BM,!n)B(BC,c)B(BS,!c)C*(*b[])()={Q,Q,y,Q,U,Q,V,Q,_,Q,BM,Q,BC,Q,BS,Q};j(){z=!l(&a);v}o(){s(a);}t(){z=!l(&x);n=x&H;}D(){s(x);}f(K(&=)h(K(|=)i(K(^=)J(E;c=e&1;z=!(e/=2);s(e);w}k(E;c=w;z=!e;s(e*=2);}T(E;g=e&1;z=!(e=e/2|H*!!c);c=g;s(e);w}M(E;g=w z=!(e=e*2|H*!!c);c=g;s(e);}N(E;z=!(a=g=a+e+!!c);c=g>>8%2;G}P(E;z=!~e;--p;s(g=e+1);G}u(E;g=e-1;z=!g;--p;s(g);G}r(E;g=a-e;z=!g;c=G}S(E;g=x-e;z=!g;c=G}Y(){z=!(x=g=1-m[p]%2*2);n=x&H;}Z(){c=~m[p]&1;}d(){p<255||Q();e=m[++p];b[m[p-1]&15]();}(*O[])()={j,o,t,D,Q,Q,f,h,i,J,k,T,M,N,Q,P,u,r,S,Q,Q,Q,Q,Q,Q,Y,Z,Q,Q,Q,d,d};main(){scanf(F,&p);W(scanf,&m[g],0)for(;;q())O[m[p]/8]();}

এটি অনলাইন চেষ্টা করুন!

সংজ্ঞায়িত পতাকাগুলিতে প্রচুর সংজ্ঞা দেওয়া হয়েছে।

ব্যাখ্যা (খুব অবারিত):

#include<stdio.h>

// useful defines
#define C unsigned char
#define H 128 // highest bit
#define R return

// code generator for I/O
#define W(o,p,q)for(g=-1;++g<256&&((q)||!feof(stdin));)(o)(F,(p));

// code generator for branching instruction handlers
#define BB(q)(){(q)||Y();}

// frequent pieces of code
#define NA n=a&H;
#define NE n=e&H;
#define NG n=g&H;
#define E l(&e)

// printf/scanf template
C * F = "%02hhx ";

// global state: m=memory, pax=registers, znc=flags
// e and g are for temporaries and type conversions
C m[256],p,a,x,z,n,c,e;g;

// get the pointer to a memory location:
C * I() {R &m[++p];} // immediate
C * A() {R &m[m[++p]];} // absolute
C * X() {R &m[m[++p]+x];} // indexed

// terminate the VM (and dump memory contents)
C * Q() { W(printf,m[g],1) exit(a);}

// an array of functions for accessing the memory
// They either return the pointer to memory location
// or terminate the program.
C * (*L[])()={I,Q,A,Q,X,Q,Q,Q};

// load a byte from the memory into the variable pointed by i
// terminate the program if we cannot access the address byte
l (C * i) {return 254 / p ? *i = *L[m[p]&7] () : *Q ();}

// save a byte i to the memory
// terminate the program if we cannot access the address byte
s (C i) {return 254 / p ? *L[m[p]&7]() = i : *Q ();}

// advance the instruction pointer (or fail if we fall outside the memory)
q () {p > 254 ? Q () : ++p;}

// branch
C * Y() {p += e;}

// generated functions for conditional branches
C * BN BB(z)
C * BZ BB(!z)
C * BP BB(n)
C * BM BB(!n)
C * BC BB(c)
C * BS BB(!c)

// a list of branch functions
C * (*B[])() = {Q,Q,Y,Q,BN,Q,BZ,Q,BP,Q,BM,Q,BC,Q,BS,Q};

// Instruction handling functions

OA () {z = !l (&a); NA} // lda
OB () {s (a);} // sta
OC () {z = !l (&x); n = x & H;} // ldx
OD () {s (x);} // stx
OG () {E; z = !(a &= e); NA} // and
OH () {E; z = !(a |= e); NA} // ora
OI () {E; z = !(a ^= e); NA} // eor
OJ () {E; c = e & 1; z = !(e /= 2); s (e); NE} // lsr
OK () {E; c = NE; z = !e; s (e *= 2);} // asl
OL () {E; g = e & 1; z = !(e = e / 2 | H * !!c); c = g; s (e); NE} // ror
OM () {E; g = e & H; z = !(e = e * 2 | H * !!c); c = g; s (e); NE} // rol
ON () {E; z = !(a = g = a + e + !!c); c = !!(g & 256); NG} // adc
OP () {E; z = !~e; --p; s (g = e + 1); NG} // inc
OQ () {E; g = e - 1; z = !g; --p; s (g); NG} // dec
OR () {E; g = a - e; z = !g; c = NG} // cmp
OS () {E; g = x - e; z = !g; c = NG} // cpx
OY () {z = !(x = g = ~m[p] & 1 * 2 - 1); n = x & H;} // inx/dex
OZ () {c = ~m[p] & 1;} // sec/clc
Od () {p < 255 || Q (); e = m[++p]; B[m[p-1]&15] ();} // branching

// list of opcode handlers
(*O[]) () = {OA,OB,OC,OD,Q,Q,OG,OH,OI,OJ,OK,OL,OM,ON,Q,OP,OQ,OR,OS,Q,Q,Q,Q,Q,Q,OY,OZ,Q,Q,Q,Od,Od};

// main function
main ()
{
    // read the instruction pointer
    scanf (F, &p);

    // read memory contents
    W(scanf, &m[g], 0)

    // repeatedly invoke instruction handlers until we eventually terminate
    for (;; q())
        O[m[p]/8] ();
}

দুর্দান্ত কাজ, তাত্ক্ষণিকভাবে +1, প্রথমে কোনও সি সমাধানের আশা করেনি :) আপনার 00বাইটগুলি যুক্ত করা নিয়মগুলি কিছুটা বাঁকানো হতে পারে ... আমি স্বীকার করি আমি এই কোডটি বিশ্লেষণ করার চেষ্টা করিনি ... আপনি কি করতে পারেন হেক্সের পরিবর্তে বাইনারি আই / ও করা বাইটস সংরক্ষণ করবেন? বিধি দ্বারা অনুমোদিত হবে :)
ফেলিক্স Palmen

আমি এই নিয়মটি প্রতিস্থাপন করতে চাই যে অবৈধভাবে অপকডগুলি অবৈধ অপকডের আচরণকে অপরিজ্ঞাত করে বলে সমাপ্ত করার দিকে নিয়ে যায় ... এটি কি আপনার উত্তরকে আঘাত করবে বা আপনি কি তা দিয়ে ঠিক আছেন?
ফেলিক্স প্যালম্যান

@ ফেলিক্সপ্যালম্যান ভাল, যতক্ষণ না অবসান যথেষ্ট বৈধ "অপরিজ্ঞাত" আচরণ, ততক্ষণ তা ক্ষতি করবে না (এটি পরিবর্তে এটি গল্ফ করার জন্য একটি নতুন সম্ভাবনা উন্মুক্ত করে!)
ম্যাক ইখলাভকভ ২ '

"আহত" দ্বারা ম্যাক্সইখলাভকে বোঝানো হয়েছে আপনার সমাধানের প্রতি অন্যায় হওয়া মানে আপনি অবৈধ অপকোডটি ভিএমকে শেষ করে দেওয়ার বিষয়টি নিশ্চিত করার জন্য আপনি সম্ভবত "বাইটস ব্যয় করেছেন"। আমি আনন্দিত আপনি একটি সুযোগ হিসাবে নিয়ম পরিবর্তনকে স্বাগত জানিয়েছেন :) এবং আবারও, অভিনন্দনগুলি, আমি কেবল সিতে একটি সমাধান দেখতে পছন্দ করি যা আমার সর্বকালের প্রিয় প্রোগ্রামিং ভাষা। এটি অত্যন্ত দুঃখের বিষয় যা আপনি খুব কমই সি-তে একটি কোড-গল্ফ চ্যালেঞ্জ জিতবেন - তবুও, "গল্ফড" সিটি দুর্দান্ত :)
ফেলিক্স প্যালম্যান

আপনি পোস্ট করতে পতাকা অংশ যোগ করতে পারেন?
l4m2

8

এপিএল (ডায়ালগ ক্লাসিক) , 397 332 330 বাইট

ধন্যবাদ -8 বাইটের জন্য অ্যাডম @

f←{q2a x c←≡B256⋄{0::m
⍺←(∇q∘←)0∘=,B≤+⍨
30u←⌊8÷⍨bpm:∇p+←129-B|127-1pm×⊃b2/(,~,⍪)1,q,c
p+←1
u=25:⍺x⊢←B|x1*b
u=26:∇c⊢←~2|b
p+←≢om⊃⍨i←⍎'p⊃m+x'↑⍨1+8|b
u⊃(,⍉'⍺ax⊢←o' '∇m[i]←ax'∘.~'xa'),5 4 2 3 2/'⍺⌽⊃'∘,¨'a⊢←2⊥(⍕⊃u⌽''∧∨≠'')/o a⊤⍨8⍴2' 'c(i⊃m)←u⌽d⊤(⌽d←u⌽2B)⊥u⌽o,c×u>10' 'c a⊢←2B⊤a+o+c' 'm[i]←B|o-¯1*u' 'c⊢←⊃2B⊤o-⍨⊃u⌽x a'}p m←⍵}

এটি অনলাইন চেষ্টা করুন!

p  program counter
m  memory
a  accumulator register
x  index register
q  flags z (zero) and n (negative) as a length-2 vector
c  flag for carry
  function to update z and n
b  current instruction
u  highest 5 bits of b
o  operand
i  target address in memory

আসুন আমরা এই আলোচনাটি আড্ডায় চলতে থাকি ।
ngn

এই সমাধানটির কি অনিচ্ছাকৃত অপকড রয়েছে এবং যদি তা না হয় তবে আপনি কি এগুলি এড়িয়ে এড়িয়ে বাইটগুলি ব্যয় করেছিলেন? আমি যে কারণে জিজ্ঞাসা করছি তার জন্য এই মন্তব্যটি দেখুন ...
ফেলিক্স প্যালম্যান

@ ফেলিক্সপ্যালম্যান এখন আপনি এটি উল্লেখ করেছেন, হ্যাঁ :( শুরুতে আমি এই নিয়মটি পর্যবেক্ষণ করেছি, তবে আমি গল্ফ করার সময় ঘটনাক্রমে আমি 4, 5 এবং সম্ভবত অন্যদের জন্য বৈধ অপকড তৈরি করেছি So সুতরাং তাদের আচরণকে অপরিবর্তিত করার সিদ্ধান্তটি সবচেয়ে স্বাগত হবে :)
ngn

2
এখনই করা হয়েছে, আমি বুঝতে পারি যে এটি প্রথম স্থানে সেরা সিদ্ধান্ত ছিল না এবং দুর্ভাগ্যক্রমে @ ম্যাক্সইখলাভকে নিয়ম পরিবর্তন সম্পর্কে কিছু বলতে হয়নি।
ফেলিক্স প্যালম্যান

আপনার কি দরকার f←?
এরিক আউটগল্ফার

8

সি (জিসিসি) , 487 , 480 , 463 , 452 , 447 , 438 বাইট

এই নির্দেশ ম্যাপিং ব্যবহার করে । নির্দেশাবলীর আপডেটটি 9 টি বাইটে শেভ করা হয়েছিল এবং ভবিষ্যতে আরও সম্ভাব্য। প্রথম যুক্তি ( M) দ্বারা নির্দেশিত মেমরিটি সংশোধন করে ফিরে আসে Return কিছু বাইট বন্ধ করে দেওয়ার জন্য @ সেলিংক্যাটকে ধন্যবাদ।

পতাকা দিয়ে সংকলন করতে হবে -DO=*o -DD=*d -DI(e,a,b)=if(e){a;}else{b;} -Du="unsigned char"(ইতিমধ্যে বাইট অন্তর্ভুক্ত)।

e(M,Z,C)u*M,C;{for(u r[2],S=0,D,O,c,t;o=C<Z?M+C++:0;){I(c=O,d=r+!(c&4),break)I(o=c&3?C<Z&&C?M+C++:0:d,o=c&2?O+c%2**r+M:o,break)t=(c/=8)&7;I(c<24&c>4&&t,t&=3;I(c&8,I(c&4,c&=S&1;S=O>>7*!(t/=2);O=t=O<<!t>>t|c<<7*t,t=O+=t%2*2-1),I(c&4,D=t=t?t&2?t&1?O^D:O|D:O&D:O,I(c&1,S=D>(t=D+=O+S%2),t=D-O;S=t>D)))S=S&1|t>>6&2|4*!t,I(c&8,C+=!(t&~-t?~t&S:t&~S)*O,I(t,S=S&6|c%2,O=D)))I(C,,Z=0)}}

এটি অনলাইন চেষ্টা করুন!

প্রাক প্রসেসর

-DO=*o -DD=*d

এই দু'টি পয়েন্টারকে অবজ্ঞার জন্য একটি ছোট্ট উপায় সরবরাহ করে।

-DI(e,a,b)=if(e){a;}else{b;} -Du="unsigned char"

If-elses এবং প্রকারের ঘোষণার জন্য প্রয়োজনীয় বাইটের সংখ্যা হ্রাস করুন।

কোড

নীচে কোডের একটি মানব-পঠনযোগ্য সংস্করণ রয়েছে, প্রিপ্রোসেসর নির্দেশিকা প্রসারিত এবং ভেরিয়েবলের নাম পরিবর্তন করে পঠনযোগ্যতার জন্য।

exec_8bit(unsigned char *ram, int ramSize, unsigned char PC)
{  
  for(unsigned char reg[2], SR=0, // The registers. 
                                  // reg[0] is X, reg[1] is A. 
                                  // SR contains the flags.
      *dst, *op, opCode, tmp;
      // Load the next instruction as long as we haven't gone out of ram.
      op = PC < ramSize ? ram + PC++ : 0;)
  { // Check for HLT.
    if(opCode=*op)
    { // Take a pointer to the register selected by complement of bit 3.
      dst = reg+!(opCode&4);
    } else break;
    // Load operand as indicated by bits 0 and 1. Also check that we don't
    // go out of bounds and that the PC doesn't overflow.
    if(op = opCode&3 ? PC<ramSize && PC ? ram + PC++ : 0 : dst)
    {
      op = opCode&2 ? *op + opCode%2 * *reg + ram: op
    } else break;

    // Store the bits 3-5 in tmp.
    tmp = (opCode/=8) & 7;
    if(opCode<24 & opCode>4 && tmp)
    { // If not HLT, CLC, SEC or ST, enter this block.
      tmp &= 3; // We only care about bits 3&4 here.
      if(opCode&8) // Determine whether the operation is binary or unary.
      { // Unary
        if(opCode&4)
        { // Bitshift
          opCode &= SR&1; // Extract carry flag and AND it with bit 3 in opCode.
          SR=*op >> 7*!(tmp/=2);// Update carry flag.
          // Shift to left if bit 4 unset, to right if set. Inclusive-OR 
          // the carry/bit 3 onto the correct end.
          *op = tmp = *op << !tmp >> tmp | opCode << 7*tmp;
        } else tmp=*o+=tmp%2*2-1;
      } else if(opCode&4) {
        // Bitwise operations and LD.
        // Ternary conditional to determine which operation.
        *dst = tmp = tmp? tmp&2? tmp&1? *op^*dst: *op|*dst: *op&*dst: *op
      } else if(opCode&1) {
        // ADC. Abuse precedence to do this in fewer bytes.
        // Updates carry flag.
        SR = *dst > (tmp = *dst += *op + SR%2);
      } else tmp=*dst-*op; SR = tmp > *dst; // Comparison.
      SR = SR&1 | tmp >> 6&2 | 4*!tmp; // Update Z and N flags, leaving C as it is.
    } else if(opCode&8) {
      // Branch.
      // tmp&~-tmp returns a truthy value when tmp has more than one bit set
      // We use this to detect the "unset" and "always" conditions.
      // Then, we bitwise-AND either ~tmp&SR or tmp&~SR to get a falsy value
      // when the condition is fulfilled. Finally, we take logical complement,
      // and multiply the resulting value (`1` or `0`) with the operand,
      // and add the result to program counter to perform the jump.
      PC += !(tmp & ~-tmp? ~tmp&SR : tmp&~SR) * *op;
    } else if (tmp) { // SEC, CLC
      SR = SR&6 | opCode % 2;
    } else {
      *op = *dst; // ST
    }
    if(!PC){ // If program counter looped around, null out ramSize to stop.
           // There's likely a bug here that will kill the program when it
           // branches back to address 0x00
      ramSize=0;
    }
  }
}

নির্দেশনা

নির্দেশাবলী নীচে কাঠামোগত করা হয়:

  • বিট 6-7 নির্দেশের 00শালীনতা নির্দেশ করে ( নুলারি, ইউনারি 01, 10বাইনারি, 11বাইনারি)

  • : বিটস 0-2 প্রতীক (গুলি) নির্ধারণ R=0নির্বাচন Aএবং R=1নির্বাচন XOP=00অপারেন্ড হিসাবে নিবন্ধটি ব্যবহার করে, OP=01তাত্ক্ষণিক অপারেন্ড OP=10নির্বাচন করে, পরম অপারেন্ড OP=11নির্বাচন করে এবং সূচকযুক্ত অপারেন্ড নির্বাচন করে।

    • আপনারা যেমন খেয়াল করেছেন, এটি কোনও রেজিস্ট্রারে (যদিও আপনি এখনও কেবলমাত্র সূচক করতে পারেন X) এমনকি কোনও স্পেসিফিকেশন অনুযায়ী সাধারণত ব্যবহার করা যায়নি তার জন্য কোনও ক্রিয়াকলাপ সম্পাদনের অনুমতি দেয় । যেমন INC A, ADC X, 10এবং ASL Xসমস্ত কাজ।
  • বিটস 3-5 বিস্তৃতকরণের শর্ত নির্ধারণ করে: বিটগুলির মধ্যে একটি থাকা ইঙ্গিত দেয় যে কোন পতাকাটি পরীক্ষা করতে হবে (বিট 3-> সি, বিট 4-> এন, বিট 5-> জেড)। যদি কেবল একটি বিট সেট করা থাকে তবে একটি সেট পতাকার জন্য নির্দেশ পরীক্ষা করে। আনসেট করা পতাকার পরীক্ষার জন্য, বিটের পরিপূরক নিন। উদাহরণস্বরূপ 110আনসেট বহন এবং সেট বহনের জন্য পরীক্ষাগুলি 001111এবং 000শাখা সর্বদা।

  • আপনি কোনও নিবন্ধরে সঞ্চিত কোনও ঠিকানায় শাখা করতে পারেন, আপনাকে ফাংশনগুলি লেখার অনুমতি দেয় বা আপনি স্ট্যান্ডার্ড ইনডেক্সিং মোডগুলি ব্যবহার করতে পারেন। OP=01স্পেসিফিকেশন শাখার মতো আচরণ করে।

+-----+----------+-------+-----------------------------------------------+
| OP  | BINARY   | FLAGS | INFO                                          |
+-----+----------+-------+-----------------------------------------------+
| ST  | 10000ROP |       | Register -> Operand                           |
| LD  | 10100ROP | Z N   | Operand -> Register                           |
| AND | 10101ROP | Z N   | Register &= Operand                           |
| XOR | 10111ROP | Z N   | Register ^= Operand                           |
| IOR | 10110ROP | Z N   | Register |= Operand                           |
| ADC | 10011ROP | Z N C | Register += Operand + Carry                   |
| INC | 01011ROP | Z N   | Operand += 1                                  |
| DEC | 01010ROP | Z N   | Operand -= 1                                  |
| ASL | 01100ROP | Z N C | Operand <<= 1                                 |
| LSR | 01110ROP | Z N C | Operand >>= 1                                 |
| ROL | 01101ROP | Z N C | Operand = Operand << 1 | Carry                |
| ROR | 01111ROP | Z N C | Operand = Operand >> 1 | Carry << 7           |
| CMP | 10010ROP | Z N C | Update ZNC based on Register - Operand        |
| BR  | 11CNDROP |       | PC += Condition ? Operand : 0      |
| SEC | 00011000 |     C | Set carry                                     |
| CLC | 00010000 |     C | Clear carry                                   |
| HLT | 00000000 |       | Halt execution.                               |
+-----+----------+-------+-----------------------------------------------+

7

জাভাস্ক্রিপ্ট (ES6), 361 বাইট

হিসাবে ইনপুট লাগে (memory)(program_counter), যেখানে memoryএকটি Uint8Array। এই অ্যারেটি সংশোধন করে আউটপুট

M=>p=>{for(_='M[\u0011\u0011A]\u0010\u0010=\u000fc=\u000e,\u0011p]\f(n=\u000b128)\t=\u0010\b&=255\u0007,z=!(n\u0007),n&=\t;\u0006\u0006\u000b\u0005-\u0010,\u000en>=0\u0005\u0004\u0011c\b>>7,A]*2\u0005\u0003\u0011c\b&1,A]/2\u0005\u000f\u0002&&(p+=(\u0010^\t-\t;\u0001for(a=n=z=\u000ex=0;a\u0007,x\u0007,A=[i=\u0011p++],p\f\f+x][i&3],i&3&&p++,i&&A<256;)eval(`\u000ba\b\u0006\u000fa;\u000bx\b\u0006\u000fx;\u000ba&\b\u0005a|\b\u0005a^\b\u0005\u000f\u0002\u0003\u000fc*128|\u0002c|\u0003a+\b+c,\u000ea>>8\u0005++\u0010\u0005--\u0010\u0005a\u0004x\u0004++x\u0005--x\u0006\u000e1;\u000e0;1\u0001!z\u0001z\u0001!n\u0001n\u0001!c\u0001c\u0001`.split`;`[i>>2])';G=/[\u0001-\u0011]/.exec(_);)with(_.split(G))_=join(shift());eval(_)}

এনবি: কোডটি রেগপ্যাক দিয়ে সংকুচিত হয়েছে এবং এতে প্রচুর অচিহ্নবদ্ধ অক্ষর রয়েছে, যা উত্সের উপরের উপস্থাপনায় সমস্ত পালিয়ে গেছে।

এটি অনলাইন চেষ্টা করুন!

ওপকোড ম্যাপিং এবং পরীক্ষার কেস

ভার্চুয়াল মেশিন এই অপকোড ম্যাপিং ব্যবহার করে

নীচে অনূদিত পরীক্ষার কেসগুলি সহ প্রত্যাশিত আউটপুটগুলি রয়েছে।

পরীক্ষার কেস # 1

00 - LDX #$10  09 10
02 - INC $01   32 01
04 - DEX       44
05 - BNE $fb   55 fb

প্রত্যাশিত আউটপুট:

09 20 32 01 44 55 fb

পরীক্ষার কেস # 2

00 - (DATA)    e0 08 2a 02
04 - LDA $00   02 00
06 - ADC $02   2e 02
08 - STA $00   06 00
0a - LDA $01   02 01
0c - ADC $03   2e 03
0e - STA $01   06 01

প্রত্যাশিত আউটপুট:

0 ক 0 বি 2 এ 02 02 00 2 এ 02 06 00 02 01 2 এ 03 06 01

পরীক্ষার কেস # 3

00 - (DATA)    5e 01 28 00
04 - LDX #$10  09 10
06 - LSR $01   1e 01
08 - ROR $00   26 00
0a - BCC $0d   65 0d
0c - LDA $02   02 02
0e - CLC       4c
0f - ADC $21   2e 21
11 - STA $21   06 21
13 - LDA $03   02 03
15 - ADC $22   2e 22
17 - STA $22   06 22
19 - ASL $02   22 02
1b - ROL $03   2a 03
1d - DEX       44
1e - BPL $e6   5d e6
20 - HLT       00
21 - (DATA)    00 00

প্রত্যাশিত আউটপুট:

00 00 00 00 09 10 1e 01 ... 44 5 ডি ই 6 00 বি0 36

প্যাকযুক্ত এবং বিন্যাসিত

কোডটি এমন একটি অ্যালগরিদম দিয়ে সংকুচিত হয়েছে যা ঘন ঘন পুনরাবৃত্ত স্ট্রিংগুলিকে একক চরিত্রের সাথে প্রতিস্থাপন করে, সাহায্যকারী ফাংশনগুলি সংজ্ঞায়িত ও অনুরোধ করা, বা M[A]অতিরিক্ত ভেরিয়েবলগুলিতে অন্তর্বর্তী ফলাফল (যেমন ) সংরক্ষণ করার চেয়ে বার বার একই কোড ব্লক ব্যবহার করা আরও দক্ষ ।

M => p => {
  for(
    a = n = z = c = x = 0;
    a &= 255, x &= 255,
    A = [i = M[p++], p, M[p], M[p] + x][i & 3],
    i & 3 && p++,
    i && A < 256;
  ) eval((
    '(n = a = M[A], z = !(n &= 255), n &= 128);'                                + // LDA
    'M[A] = a;'                                                                 + // STA
    '(n = x = M[A], z = !(n &= 255), n &= 128);'                                + // LDX
    'M[A] = x;'                                                                 + // STX
    '(n = a &= M[A], z = !(n &= 255), n &= 128);'                               + // AND
    '(n = a |= M[A], z = !(n &= 255), n &= 128);'                               + // ORA
    '(n = a ^= M[A], z = !(n &= 255), n &= 128);'                               + // EOR
    '(n = M[A] = M[c = M[A] & 1, A] / 2, z = !(n &= 255), n &= 128);'           + // LSR
    '(n = M[A] = M[c = M[A] >> 7, A] * 2, z = !(n &= 255), n &= 128);'          + // ASL
    '(n = M[A] = c * 128 | M[c = M[A] & 1, A] / 2, z = !(n &= 255), n &= 128);' + // ROR
    '(n = M[A] = c | M[c = M[A] >> 7, A] * 2, z = !(n &= 255), n &= 128);'      + // ROL
    '(n = a += M[A] + c, c = a >> 8, z = !(n &= 255), n &= 128);'               + // ADC
    '(n = ++M[A], z = !(n &= 255), n &= 128);'                                  + // INC
    '(n = --M[A], z = !(n &= 255), n &= 128);'                                  + // DEC
    '(n = a - M[A], c = n >= 0, z = !(n &= 255), n &= 128);'                    + // CMP
    '(n = x - M[A], c = n >= 0, z = !(n &= 255), n &= 128);'                    + // CPX
    '(n = ++x, z = !(n &= 255), n &= 128);'                                     + // INX
    '(n = --x, z = !(n &= 255), n &= 128);'                                     + // DEX
    'c = 1;'                                                                    + // SEC
    'c = 0;'                                                                    + // CLC
    ' 1 && (p += (M[A] ^ 128) - 128);'                                          + // BRA
    '!z && (p += (M[A] ^ 128) - 128);'                                          + // BNE
    ' z && (p += (M[A] ^ 128) - 128);'                                          + // BEQ
    '!n && (p += (M[A] ^ 128) - 128);'                                          + // BPL
    ' n && (p += (M[A] ^ 128) - 128);'                                          + // BMI
    '!c && (p += (M[A] ^ 128) - 128);'                                          + // BCC
    ' c && (p += (M[A] ^ 128) - 128);')                                           // BCS
    .split`;`[i >> 2]
  )
}

চিত্তাকর্ষক :) কোনও জেএস প্রো নয়, তাই - এটি কি অপকোডের মান দ্বারা কিছু "কোড অ্যারে" তে সূচক হয়? ভাল দেখাচ্ছে. তবে যদি o = ...প্রতিটি নির্দেশের জন্য এই লাইনটি কার্যকর করা হয় তবে এটিতে "অনিচ্ছাকৃত অপকডস" থাকতে পারে?
ফেলিক্স পেলমেন

2
আমার সম্ভবত একটি পরীক্ষার কেস যুক্ত করা উচিত: o এখন, আমি মনে করি
অনর্থিত ওপোকডগুলি

ঠিক আছে, আমি ঠিক এটির পরামর্শ দিতে চলেছিলাম, কারণ এটি চ্যালেঞ্জটিতে বেশি কিছু যোগ করে না এবং কাস্টম ম্যাপিংগুলি পরীক্ষা করা এখন কঠিন। তবে আপনার সম্ভবত প্রথমে @ ম্যাক্সেখলাভকে জিজ্ঞাসা করা / সতর্ক করা উচিত, কারণ তারা সম্ভবত এই নিয়মটি কার্যকর করেছেন implemented
আর্নল্ড

c = M[A] >> 7 & 1<- &1এখানে কি আসলেই দরকার?
ফেলিক্স প্যালম্যান

2
আমি নিশ্চিত যে এটি আপনার জমা হিসাবে যেভাবেই হোক একটি ফাংশন, আমার কথাটি হ'ল "বাইটের একটি তালিকা [...] কোনও বুদ্ধিমান বিন্যাস" এবং Uint8Arrayসত্যই কেবল এই জাতীয় বাইটগুলির একটি তালিকা আবদ্ধ করে। সুতরাং যদি কোনও হেক্স স্ট্রিংয়ে বাইটস স্থাপন করা ইনপুট উপস্থাপনের একটি গ্রহণযোগ্য উপায় হয় তবে কেন সেগুলি একটি ধারক বস্তুতে রাখা নিষিদ্ধ করা উচিত ...
ফেলিক্স প্যালম্যান

2

পিএইচপি, 581 585 555 532 বাইট (না-প্রতিযোগী নয়)

function t($v){global$f,$c;$f=8*$c|4&$v>>5|2*!$v;}$m=array_slice($argv,2);for($f=0;$p>-1&&$p<$argc-1&&$i=$m[$p=&$argv[1]];$p++)$i&3?eval(explode(_,'$a=$y_$a&=$y_$a|=$y_$a^=$y_$a+=$y+$c;$c=$a>>8_$x=$y_$c=$y&1;$y>>=1_$c=($y*=2)>>8_$y+=$y+$c;$c=$y>>8_$y+=$c<<8;$c=$y&1;$y>>=1_$y--_$y++_$z=$a-$y,$c=$a<$y_$z=$x-$y,$c=$x<$y_$y=$a_$y=$x_'.$y=&$m[[0,++$p,$g=$m[$p],$g+$x][$i&3]])[$i>>=2].'$i<14&&t(${[aaaaaxyyyyyyzz][$i]}&=255);'):($i&32?$p+=($f>>$i/8-4^$i)&1?($y=$m[++$p])-($y>>7<<8):1:($i&8?$f=$f&7|8*$c=$i/4:t($x+=$i/2-9)));print_r($m);

কমান্ড লাইন আর্গুমেন্ট থেকে পিসি এবং ওপি কোডগুলিকে বেস 10 সংখ্যার
হিসাবে গ্রহণ করে, তালিকা হিসাবে মেমোরিটি মুদ্রণ করে [base 10 address] => base 10 value

এটি এখনও পুরোপুরি পরীক্ষা করা হয় না ; তবে একটি ব্রেকডাউন আছে

There's কোড মানচিত্র এবং here's আমার ম্যাপিং জন্য একটি ওভারভিউ:

3-mode instructions:
00: LDA     04: AND     08: ORA     0C: EOR
10: ADC     14: LDX     18: LSR     1C: ASL
20: ROL     24: ROR     28: DEC     2C: INC
30: CMP     34: CPX     38: STA     3C: STX

+1: immediate
+2: absolute
+3: relative

implicit:
00: HLT
10: DEX 14: INX
18: CLC 1C: SEC

relative:
20: BRA         (0)
28: BNE 2C: BEQ (Z)
30: BPL 34: BMI (N)
38: BCC 3C: BCS (C)

পার্শ্ব নোট:
কোডের 24ফলাফল BNV(শাখা কখনই = 2 বাইট নয় NOP);
04, 08, 0Cজন্য alias লেখা হয় INX, CLCএবং SEC
এবং কিছু উপরে 3Fহয় একটি দুই বাইট NOPবা একক মোড নির্দেশাবলীর জন্য উপনাম।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.