class D64::BlockMap
Public Instance Methods
allocate(opts = {})
click to toggle source
# File lib/d64/block_map.rb, line 24 def allocate(opts = {}) if opts[:block] tn = opts[:block].track sn = opts[:block].sector free_on_track(tn)[sn] or fail "Can't allocate used sector [%s %02d:%02d]." % [@image.name, tn, sn] else tracks = (1..35).to_a if tn = opts[:trackpref] tracks.delete opts[:trackpref] tracks.unshift opts[:trackpref] end sn = nil tracks.each do |tn| sn = free_on_track(tn).index(true) break if sn end return nil unless sn end mark_as_used tn, sn free_on_track(tn)[sn] and fail "Failed to mark as used!" puts 'Allocated sector [%s %02d:%02d]' % [@image.name, tn, sn] if ENV['DEBUG'] Block.new(tn, sn) end
commit()
click to toggle source
# File lib/d64/block_map.rb, line 62 def commit image.commit_bam end
dump_map()
click to toggle source
# File lib/d64/block_map.rb, line 7 def dump_map puts (1..35).map { |tn| ("%2s " % tn) << free_on_track(tn).map { |v| v ? '[ ]' : '[x]' }.join }.join "\n"; end
free_blocks()
click to toggle source
# File lib/d64/block_map.rb, line 20 def free_blocks 35.times.map { |i| bytes[4 * i + 4] }.reduce :+ end
free_on_track(tn)
click to toggle source
# File lib/d64/block_map.rb, line 13 def free_on_track(tn) tv = track_value(tn) Image.sectors_per_track(tn).times.map do |sn| tv & (2 ** sn) != 0 end end
mark_as_unused(tn, sn)
click to toggle source
# File lib/d64/block_map.rb, line 56 def mark_as_unused(tn, sn) byte, bit = sn.divmod(8) @bytes[4 * tn + 1 + byte] |= (2 ** bit) @bytes[4 * tn] += 1 end
mark_as_used(tn, sn)
click to toggle source
# File lib/d64/block_map.rb, line 50 def mark_as_used(tn, sn) byte, bit = sn.divmod(8) @bytes[4 * tn + 1 + byte] &= (255 - 2 ** bit) @bytes[4 * tn] -= 1 end
Private Instance Methods
track_value(tn)
click to toggle source
# File lib/d64/block_map.rb, line 68 def track_value(tn) a, b, c = bytes[4 * tn + 1, 3] (c << 16) + (b << 8) + a end