Ruby имитирует C Integer - PullRequest
       7

Ruby имитирует C Integer

0 голосов
/ 19 ноября 2018

Я пытаюсь сделать эмулятор Chip-8 в Ruby, как мой друг делал это раньше с C ++, но я столкнулся с некоторыми проблемами, учтите, что у меня есть только некоторые знания о Ruby, и я думал, что этот проект быть хорошим способом улучшить свои навыки в этом языке.

Я читал о классе маршала, но понятия не имею, как его вообще использовать. http://hackage.haskell.org/package/ruby-marshal-0.1.2/docs/Data-Ruby-Marshal-Int.html

Таким образом, в основном, коды операций для чипа-8 являются int16, но мне нужно получить младшие и верхние биты инструкции, чтобы я мог правильно ее интерпретировать. В C ++ он сделал это с объединением и основными типами данных int следующим образом

struct Instruction {
    union {
        uint16_t opcode;
        struct {
            uint8_t lower;
            uint8_t upper;
        } bytes;
    };

Как я могу имитировать определенные типы uint8_t и uint16_t ? Я не против того, чтобы профсоюз поменял профсоюз на что-то другое.

Также это был бы лучший способ использовать и управлять памятью? Я на самом деле не знаю, если код ниже правильно и скомпилируется, так как у меня есть доступ только к блокноту atm

class Memory
    @memory = Hash.new(Array.new)
    @memory[:system] = Array.new(0x200, 0)
    @memory[:rom] = Array.new(0xCA0, 0)
    @memory[:internal] = Array.new(0x5F, 0)
    @memory[:refresher] = Array.new(0xF0, 0)

    @stack = Array.new(0) #Gotta stick with push/pop
end

class Chip8
    def initialize
        @memory = Memory.new

1 Ответ

0 голосов
/ 19 ноября 2018

Вы можете получить старший и младший байт 16-разрядного слова с помощью побитовых операций:

high_byte = opcode >> 8
low_byte = opcode & 0xFF

Выше предполагается, что opcode уже ограничено диапазоном 16-разрядных целых чисел без знака.

И наоборот:

opcode = (high_byte << 8) | low_byte

Выше предполагается, что high_byte и low_byte ограничены диапазоном 8-битных целых чисел без знака.

Этот подходбыло бы, возможно, и лучше в C ++, так как объединение зависит от системного порядка (и, во-первых, технически является нестандартным расширением, хотя и широко поддерживается популярными компиляторами).

...