mirror of https://github.com/LIJI32/SameBoy.git
65 lines
1.6 KiB
Mathematica
65 lines
1.6 KiB
Mathematica
![]() |
#import "GBMemoryByteArray.h"
|
||
|
#import "GBCompleteByteSlice.h"
|
||
|
|
||
|
|
||
|
@implementation GBMemoryByteArray
|
||
|
{
|
||
|
Document *_document;
|
||
|
}
|
||
|
|
||
|
- (instancetype) initWithDocument:(Document *)document
|
||
|
{
|
||
|
if ((self = [super init])) {
|
||
|
_document = document;
|
||
|
}
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
- (unsigned long long)length
|
||
|
{
|
||
|
return 0x10000;
|
||
|
}
|
||
|
|
||
|
- (void)copyBytes:(unsigned char *)dst range:(HFRange)range
|
||
|
{
|
||
|
uint16_t addr = (uint16_t) range.location;
|
||
|
unsigned long long length = range.length;
|
||
|
while (length) {
|
||
|
*(dst++) = [_document readMemory:addr++];
|
||
|
length--;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- (NSArray *)byteSlices
|
||
|
{
|
||
|
return @[[[GBCompleteByteSlice alloc] initWithByteArray:self]];
|
||
|
}
|
||
|
|
||
|
- (HFByteArray *)subarrayWithRange:(HFRange)range
|
||
|
{
|
||
|
unsigned char arr[range.length];
|
||
|
[self copyBytes:arr range:range];
|
||
|
HFByteArray *ret = [[HFBTreeByteArray alloc] init];
|
||
|
HFFullMemoryByteSlice *slice = [[HFFullMemoryByteSlice alloc] initWithData:[NSData dataWithBytes:arr length:range.length]];
|
||
|
[ret insertByteSlice:slice inRange:HFRangeMake(0, 0)];
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
- (void)insertByteSlice:(HFByteSlice *)slice inRange:(HFRange)lrange
|
||
|
{
|
||
|
if (slice.length != lrange.length) return; /* Insertion is not allowed, only overwriting. */
|
||
|
[_document performAtomicBlock:^{
|
||
|
uint8_t values[lrange.length];
|
||
|
[slice copyBytes:values range:HFRangeMake(0, lrange.length)];
|
||
|
uint16_t addr = (uint16_t) lrange.location;
|
||
|
uint8_t *src = values;
|
||
|
unsigned long long length = lrange.length;
|
||
|
while (length) {
|
||
|
[_document writeMemory:addr++ value:*(src++)];
|
||
|
length--;
|
||
|
}
|
||
|
}];
|
||
|
}
|
||
|
|
||
|
@end
|