class Object

Public Instance Methods

abort_with_style(l,i,e) click to toggle source

content.select!{|i|!i.empty?}

# File bin/arasm, line 26
def abort_with_style(l,i,e)
        i.to_s.match(/^[0-9]+$/)&&i+=1
        abort("[#{i}]FATAL @ `#{l}`: #{e}")
end
assert_args(com,ln,*types) click to toggle source
# File bin/arasm, line 33
def assert_args(com,ln,*types)
        com.is_a?(Array)||com=com.split
        com.length-1==types.length||abort_with_style(com.join(" "),ln,"WRONG NUMBER OF ARGUMENTS, EXPECTED #{types.length}, GOT #{com.length-1}.")
        type_rxps = {
                /\.[^\s;]+/           => :block,
                /\$[A-Z0-9]+/i        => :num,
                /[0-9]+/i                     => :num,
                /.*/                                          => :some_weird_alphanumeric_foo
        }
        types.each{|i|type_rxps.values.include?(i)||raise("Unknown literal type #{i.inspect}")}
        com[1..-1].each_with_index do |i,ind|
                identifier = type_rxps[type_rxps.keys.select{|k|i.match(k)}[0]]
                identifier==types[ind]||abort_with_style(com.join(" "),ln,"ARGUMENT #{ind+1} HAS WRONG TYPE, EXPECTED #{types[ind]}, GOT #{identifier} INSTEAD.")
        end
end
parse_command(c,ln) click to toggle source
# File bin/arasm, line 49
def parse_command(c,ln)
        barr_t = ""
        command = c.split

        case command[0]

        when /^mv[dwb]$/
                assert_args(c,ln,:num,:num)
                barr_t << %w(d w b).index(command[0][2]).to_s
                addr = (command[1][0]==?$ ? sprintf("%07x",command[1][1..-1].to_i(16)) : sprintf("%07x",command[1].to_i))
                val= (command[2][0]==?$ ? sprintf("%08x",command[2][1..-1].to_i(16)) : sprintf("%08x",command[2].to_i))
                #puts "MV with addr=#{addr.inspect} val=#{val.inspect}"
                barr_t << addr << val

        when /^[dw]lt$/
                assert_args(c,ln,:num,:num,:block)
                barr_t << ( 3 + 4*%w(d w).index(command[0][0]) ).to_s(16)
                addr   = (command[1][0]==?$ ? sprintf("%07x",command[1][1..-1].to_i(16)) : sprintf("%07x",command[1].to_i))
                val    = (command[2][0]==?$ ? sprintf("%08x",command[2][1..-1].to_i(16)) : sprintf("%08x",command[2].to_i))
                block  = command[3][1..-1]
                $blocks[block] = "if"
                barr_t << addr << val

        when /^[dw]gt$/
                assert_args(c,ln,:num,:num,:block)
                barr_t << ( 4 + 4*%w(d w).index(command[0][0]) ).to_s(16)
                addr   = (command[1][0]==?$ ? sprintf("%07x",command[1][1..-1].to_i(16)) : sprintf("%07x",command[1].to_i))
                val    = (command[2][0]==?$ ? sprintf("%08x",command[2][1..-1].to_i(16)) : sprintf("%08x",command[2].to_i))
                block  = command[3][1..-1]
                $blocks[block] = "if"
                barr_t << addr << val

        when /^[dw]eq$/
                assert_args(c,ln,:num,:num,:block)
                barr_t << ( 5 + 4*%w(d w).index(command[0][0]) ).to_s(16)
                addr   = (command[1][0]==?$ ? sprintf("%07x",command[1][1..-1].to_i(16)) : sprintf("%07x",command[1].to_i))
                val    = (command[2][0]==?$ ? sprintf("%08x",command[2][1..-1].to_i(16)) : sprintf("%08x",command[2].to_i))
                block  = command[3][1..-1]
                $blocks[block] = "if"
                barr_t << addr << val

        when /^[dw]ne$/
                assert_args(c,ln,:num,:num,:block)
                barr_t << ( 6 + 4*%w(d w).index(command[0][0]) ).to_s(16)
                x_addr = (command[1][0]==?$ ? sprintf("%07x",command[1][1..-1].to_i(16)) : sprintf("%07x",command[1].to_i))
                val    = (command[2][0]==?$ ? sprintf("%08x",command[2][1..-1].to_i(16)) : sprintf("%08x",command[2].to_i))
                block  = command[3][1..-1]
                $blocks[block] = "if"
                #p {x_addr: x, val: val,}
                barr_t << addr << val

        when "lof"
                assert_args(c,ln,:num)
                addr = (command[1][0]==?$ ? sprintf("%07x",command[1][1..-1].to_i(16)) : sprintf("%07x",command[1].to_i))
                barr_t << "b" << addr << "00000000"

        when "rop"
                assert_args(c,ln,:num,:block)
                $rop&&abort_with_style(c,ln,"NESTING ROP BLOCKS IS PROHIBITED.")
                $rop  = ln
                t     = (command[1][0]==?$ ? sprintf("%08x",command[1][1..-1].to_i(16)) : sprintf("%08x",command[1].to_i))
                block = command[2][1..-1]
                $blocks[block] = "rop"
                barr_t << "c0000000" << t

        when /^~/
                bname = command[0][1..-1]
                bname==?#||$blocks[bname]||abort_with_style(c,ln,"TRYING TO CLOSE BLOCK `#{bname}` WHICH WASN'T OPENED BEFORE.")
                if bname == ?#
                        barr_t << "d2" << ("0"*14)
                elsif $blocks[bname] == "if"
                        barr_t << "d0" << ("0"*14)
                else
                        barr_t << "d1" << ("0"*14)
                        $rop = nil
                end
                $blocks.delete(bname)

        when "sof"
                assert_args(c,ln,:num)
                val = (command[1][0]==?$ ? sprintf("%08x",command[1][1..-1].to_i(16)) : sprintf("%08x",command[1].to_i))
                barr_t << "d3000000" << val

        when "ast"
                assert_args(c,ln,:num)
                val = (command[1][0]==?$ ? sprintf("%08x",command[1][1..-1].to_i(16)) : sprintf("%08x",command[1].to_i))
                barr_t << "d4000000" << val

        when "sst"
                assert_args(c,ln,:num)
                val = (command[1][0]==?$ ? sprintf("%08x",command[1][1..-1].to_i(16)) : sprintf("%08x",command[1].to_i))
                barr_t << "d5000000" << val

        when /si[dwb]/
                assert_args(c,ln,:num)
                barr_t << "d" << (6+%w(d w b).index).to_s(16) << ("0"*6)
                addr = (command[1][0]==?$ ? sprintf("%08x",command[1][1..-1].to_i(16)) : sprintf("%08x",command[1].to_i))
                barr_t << val

        when /ls[dwb]/
                assert_args(c,ln,:num)
                barr_t << "d" << (9+%w(d w b).index).to_s(16) << ("0"*6)
                addr = (command[1][0]==?$ ? sprintf("%08x",command[1][1..-1].to_i(16)) : sprintf("%08x",command[1].to_i))
                barr_t << val

        when "aof"
                assert_args(c,ln,:num)
                barr_t << "dc" << ("0"*6)
                val = (command[1][0]==?$ ? sprintf("%08x",command[1][1..-1].to_i(16)) : sprintf("%08x",command[1].to_i))
                barr_t << val

        when "fmv"
                abort_with_style(c,ln,"FMV IS NOT IMPLEMENTED YET.")
                assert_args(c,ln,:num,:num,:num)
                barr_t << "e"
                addr_s    = (command[1][0]==?$ ?  sprintf("%07x",command[1][1..-1].to_i(16)) :  sprintf("%07x",command[1].to_i))
                vals      = (command[2][0]==?$ ? sprintf("%016x",command[2][1..-1].to_i(16)) : sprintf("%016x",command[2].to_i))
                num_b     = (command[3][0]==?$ ?  sprintf("%08x",command[1][1..-1].to_i(16)) :  sprintf("%08x",command[1].to_i))
                barr_t << addr_s << num_b << vals

        when "fcp"
                assert_args(c,ln,:num,:num)
                addr_s = (command[1][0]==?$ ? sprintf("%07x",command[1][1..-1].to_i(16)) : sprintf("%07x",command[1].to_i))
                length = (command[1][0]==?$ ? sprintf("%08x",command[1][1..-1].to_i(16)) : sprintf("%08x",command[1].to_i))
                barr_t << addr_s << length

        end

        return barr_t

end