47 lines
1.5 KiB
JavaScript
47 lines
1.5 KiB
JavaScript
export function BitMap(volume) {
|
|
var vdh = volume.vdh();
|
|
var blocks = volume.blocks();
|
|
|
|
var BLOCK_ENTRIES = 4096;
|
|
|
|
function _init() {
|
|
}
|
|
|
|
_init();
|
|
|
|
return {
|
|
allocBlock: function () {
|
|
for (var idx = 0; idx < vdh.totalBlocks; idx++) {
|
|
var blockOffset = vdh.bitMapPointer + Math.floor(idx / BLOCK_ENTRIES);
|
|
var bitMapBlock = blocks[blockOffset];
|
|
var byteOffset = (idx - blockOffset * BLOCK_ENTRIES) >> 8;
|
|
var bits = bitMapBlock[byteOffset];
|
|
if (bits !== 0xff) {
|
|
var mask = 0x01;
|
|
for (var bitOffset = 0; bitOffset < 8; bitOffset++) {
|
|
if (!(bits & mask)) {
|
|
bitMapBlock[byteOffset] |= mask;
|
|
return idx;
|
|
}
|
|
mask <<= 1;
|
|
}
|
|
}
|
|
}
|
|
throw new Error('Disk full');
|
|
},
|
|
|
|
freeBlock: function (block) {
|
|
if (block >= vdh.totalBlocks) {
|
|
throw new Error('Block out of range');
|
|
}
|
|
var blockOffset = vdh.bitMapPointer + Math.floor(block / BLOCK_ENTRIES);
|
|
var byteOffset = (block - blockOffset * BLOCK_ENTRIES) >> 8;
|
|
var bitOffset = block & 0x7;
|
|
|
|
var bitMapBlock = blocks[blockOffset];
|
|
|
|
bitMapBlock[byteOffset] &= 0xff ^ (0x01 << bitOffset);
|
|
}
|
|
};
|
|
}
|