mirror of
https://github.com/maddievision/Celestial.git
synced 2024-08-14 23:55:37 +00:00
124 lines
1.8 KiB
Ruby
124 lines
1.8 KiB
Ruby
|
16# 8 16 32 64
|
||
|
# C S L Q - unsigned
|
||
|
# c s l q - unsigned
|
||
|
# < LE
|
||
|
# > BE
|
||
|
# A - binary string
|
||
|
# z - null terminated
|
||
|
# H - hex string
|
||
|
|
||
|
|
||
|
class BinWriter
|
||
|
def initialize fn
|
||
|
@f = File.new fn, "wb"
|
||
|
end
|
||
|
|
||
|
def self.open fn, &block
|
||
|
f = BinWriter.new fn
|
||
|
block.call f
|
||
|
f.close
|
||
|
end
|
||
|
|
||
|
def seek pos
|
||
|
@f.seek pos
|
||
|
end
|
||
|
|
||
|
def tell
|
||
|
@f.tell
|
||
|
end
|
||
|
|
||
|
def write_str str
|
||
|
@f.write str
|
||
|
end
|
||
|
|
||
|
def write_str_varlen str
|
||
|
write_varlen_le str.size
|
||
|
@f.write str
|
||
|
end
|
||
|
|
||
|
def write_byte val
|
||
|
@f.write [val].pack("C")
|
||
|
end
|
||
|
|
||
|
def write_bool val
|
||
|
write_byte val ? 1 : 0
|
||
|
end
|
||
|
|
||
|
def write_u16_le val
|
||
|
@f.write [val].pack("S<")
|
||
|
end
|
||
|
|
||
|
def write_s16_le val
|
||
|
@f.write [val].pack("s<")
|
||
|
end
|
||
|
|
||
|
def write_u16_be val
|
||
|
@f.write [val].pack("S>")
|
||
|
end
|
||
|
|
||
|
def write_u32_le val
|
||
|
@f.write [val].pack("L<")
|
||
|
end
|
||
|
|
||
|
def write_s32_le val
|
||
|
@f.write [val].pack("l<")
|
||
|
end
|
||
|
|
||
|
def write_u32_be val
|
||
|
@f.write [val].pack("L>")
|
||
|
end
|
||
|
|
||
|
def write_f32_le val
|
||
|
@f.write [val].pack("e")
|
||
|
end
|
||
|
|
||
|
def write_u24_be val
|
||
|
write_byte val >> 16
|
||
|
write_u16_be val & 0xFFFF
|
||
|
end
|
||
|
|
||
|
def write_bin str
|
||
|
@f.write str
|
||
|
end
|
||
|
|
||
|
def write_varlen_be val
|
||
|
out = [val & 0x7F]
|
||
|
val = val >> 7
|
||
|
while val > 0
|
||
|
out << (val & 0x7f) + 0x80
|
||
|
val = val >> 7
|
||
|
end
|
||
|
out.reverse.each do |x|
|
||
|
write_byte x
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def write_varlen_le val
|
||
|
out = [val & 0x7F]
|
||
|
val = val >> 7
|
||
|
while val > 0
|
||
|
out << (val & 0x7f)
|
||
|
val = val >> 7
|
||
|
end
|
||
|
out.each_with_index do |x, i|
|
||
|
write_byte(x + ((i == out.size - 1) ? 0 : 0x80))
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def write_binswap str
|
||
|
togo = str.size
|
||
|
pos = 0
|
||
|
while togo > 0
|
||
|
r = @rom[pos..(pos+3)].unpack('L>')
|
||
|
d = r.pack('L<')
|
||
|
write_bin d
|
||
|
pos += 4
|
||
|
togo -= 4
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def close
|
||
|
@f.close
|
||
|
end
|
||
|
end
|