الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

هل ممكن إنجاز هذا المشروع CHIP-8 بالبايثون

بدأه الطالب39 في 24 مارس 2014 · 4 رد · 619 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

 

أعلم أن الأمر ليس بالهين ويتطلب خبره في إستخدام الواجهه الرسوميه

 

ولكن ما أريده من وراء هذا المشروع هو التعلم البايثون إستخدام الواجهة الرسومي وكذلك وبرمجه الرسوم المتحركه لا أدري ماذا تسمى هذه التقنيه وكذلك برمجه الـمحاكيات

 

الـ Chip-8 لا تحتوي إلا على 35 أمر فقط

 

معلومات على Chip-8

 

http://en.wikipedia.org/wiki/CHIP-8#Opcode_table

#2

اقرأ هذه الوثيقة، فيها معلومات أفضل.

 

 

يلزمك ذاكرة 4095 بايت، يمكنك استخدام bytearray لمحاكاتها.

16 مسجل.

عداد يمثل مكان التعليمة الحالية.

حلقة تكرار تمثل المعالج.

 

حلقة التكرار تمثل المعالج، تجلب التعليمة التالية، تحاول التعرف عليها (يلزمك أن تعرف كيف تقطع البايتات)، ثم ينفذ التعليمة.

 

هذا تطبيق سريع على 7 أوامر، آخر أمرين فقط ستنفذ (أستخدم بايثون 3):

#!python
# -*- coding: utf-8 -*-

# 4095 bytes memory
memory = bytearray(4095)

# 16 registers, v0 to vf
registers = [0, 0, 0, 0, 0, 0, 0, 0,
             0, 0, 0, 0, 0, 0, 0, 0]

# simple program:
#
# \x01\x23 | sys  0x123
# \x00\xe0 | cls
# \x00\xee | ret
# \x11\x23 | jp   0x123
# \x21\x23 | call 0x123
# \x38\x02 | se   v8, 0x02
# \x00\xfd | exit
#
program = bytearray(b'\x01\x23\x00\xe0\x00\xee\x11\x23\x21\x23\x38\x02\x00\xfd')
          # ...

# load it at address 0x200
memory[512:512+len(program)] = program

# memory dump
# open('mem.dump', 'wb').write(memory)

# program counter for next instruction
counter = 512

while True:
    byte1 = memory[counter]
    # decode, 0NNN - sys NNN
    #         00e0 - cls
    #         00ee - ret
    #         00fd - exit
    if byte1 >> 4 == 0:
        # cls or ret?
        byte2 = memory[counter + 1]
        if byte1 & 0xf == 0 and byte2 >> 4 == 0xe:
            if byte2 & 0xf == 0:
                print('cls')
            elif byte2 & 0xf == 0xe:
                print('ret')
        # exit?
        elif byte2 == 0xfd:
            print('exit')
            break
        else:
            # must be sys
            address = ((byte1 & 0xf) << 8) | byte2
            print('sys 0x{:03x}'.format(address))
        counter += 2
    # decode 1NNN - jp NNN
    elif byte1 >> 4 == 0x1:
        byte2 = memory[counter + 1]
        address = ((byte1 & 0xf) << 8) | byte2
        print('jp 0x{:03x}'.format(address))
        counter += 2
    # decode 2NNN - call NNN
    elif byte1 >> 4 == 0x2:
        byte2 = memory[counter + 1]
        address = ((byte1 & 0xf) << 8) | byte2
        print('call 0x{:03x}'.format(address))
        counter += 2
    # decode 3XNN - se vX, NN
    elif byte1 >> 4 == 0x3:
        reg = byte1 & 0xf
        byte2 = memory[counter + 1]
        if registers[reg] == byte2:
            counter += 2
        counter += 2
        print('se v{}, 0x{:02x}'.format(reg, byte2))
    else:
        print("bad instruction")
        break

الكود مجرد مثال يمكنك تحسينه.

1
#3

جزاك الله خير ولكن المشكل في كيفيه رسم البيكسل وتحريكه

ماذا نستخدم في عرض البيكسل ؟

 

أرجو أن يكون الكود عباره عن شرح وأن يكون على شكل درس إن أمكن جزاك الله خير

تم تعديل هذه المشاركة بواسطة الطالب39 في 24 مارس 2014 في 20:57

#4

chip8 لايوجد فيها إلا تعليمة رسم واحدة، يمكنك انشاء نافذة باستخدام أي مكتبة رسومية، ورسم مستطيع أسود يمثل الشاشة ولرسم البكسلات تنقط، هذا الجزء الرسومي الذي تحتاجه.

 

مثلاً باستخدام مكتبة tkinter في بايثون:

#!python
from tkinter import *

class Chip8Frame(Frame):
    def draw_pixel(self, x, y, scale):
        self.canvas.create_rectangle(x, y, x + scale, y + scale, fill='white')

    def initialize(self):
        size = 320
        self.pack()
        self.canvas = Canvas(root, bg='black', height=size, width=size)
        self.canvas.pack()

        x = 0
        for y in range(0, size, 10):
            self.draw_pixel(x, y, 10)
            self.draw_pixel(size - x, y, 10)
            x += 10

    def __init__(self, root):
        Frame.__init__(self, root)
        root.title('Example')
        root.resizable(width=FALSE, height=FALSE)
        self.initialize()


root = Tk()
Chip8Frame(root).mainloop()

post-231926-0-68270200-1395706323.png

تم تعديل هذه المشاركة بواسطة Mr.B في 25 مارس 2014 في 03:13

1
#5

بارك الله فيك أخي على المساعده سأحاول دراسه مكتبه tkinter

مواضيع مشابهة