58 lines
1.1 KiB
Ruby
58 lines
1.1 KiB
Ruby
# 33 : not used
|
|
# 34 : NG
|
|
# 35..55 : read
|
|
# 56..76 : write
|
|
# 77..85 : binary op
|
|
# 86..91 : not used
|
|
# 92 : NG
|
|
# 93..98 : control (0..5)
|
|
# 99..104 : other insns (6..12)
|
|
# 105..126 : num (13..32)
|
|
|
|
MNEMONIC = {
|
|
:Nop => "",
|
|
|
|
:+ => 77.chr,
|
|
:- => 78.chr,
|
|
:* => 79.chr,
|
|
:"&&" => 79.chr,
|
|
:^ => 80.chr,
|
|
:> => 81.chr,
|
|
:/ => 82.chr,
|
|
:% => 83.chr,
|
|
:">>" => 84.chr, # 6
|
|
:"==" => 85.chr,
|
|
|
|
:BranchS => 93.chr, # 0 -> BranchM
|
|
:LoopM => 94.chr, # 1 -> LoopE
|
|
:BranchM => 95.chr, # 2 -> BranchE
|
|
:LoopE => 96.chr, # 3 -> LoopS (back)
|
|
:BranchE => 97.chr, # 4
|
|
:LoopS => 98.chr, # 5
|
|
|
|
:ARef => 99.chr, # 6
|
|
:ASet => 100.chr, # 7
|
|
:Out => 101.chr, # 8
|
|
:Exit => 102.chr, # 9
|
|
:Inc => 103.chr, # 10
|
|
:Dec => 104.chr, # 11
|
|
|
|
:Test => 105.chr,
|
|
}
|
|
|
|
REGISTER_READ = 35
|
|
REGISTER_WRITE = 56
|
|
IMM = 106
|
|
|
|
def encode_number(n)
|
|
if n >= 0
|
|
tt = n.to_s(126 - IMM + 1).tr("0-9a-z", [*IMM.chr..126.chr].join)
|
|
raise if tt[0] == 126.chr
|
|
tt[0, 1] = tt[0].tr([*IMM.chr..125.chr].join, [*(IMM + 1).chr..126.chr].join)
|
|
else
|
|
raise if n != -1
|
|
tt = IMM.chr
|
|
end
|
|
tt
|
|
end
|