mirror of https://github.com/LIJI32/SameBoy.git
Avoid non-main-thread calls
This commit is contained in:
parent
67d338164b
commit
cbaf5c4c4a
207
Cocoa/Document.m
207
Cocoa/Document.m
|
@ -1998,124 +1998,130 @@ enum GBWindowResizeAction
|
|||
|
||||
- (IBAction)hexGoTo:(id)sender
|
||||
{
|
||||
NSString *expression = [sender stringValue];
|
||||
__block uint16_t addr = 0;
|
||||
__block uint16_t bank = 0;
|
||||
__block bool fail = false;
|
||||
NSString *error = [self captureOutputForBlock:^{
|
||||
uint16_t addr;
|
||||
uint16_t bank;
|
||||
if (GB_debugger_evaluate(&_gb, [[sender stringValue] UTF8String], &addr, &bank)) {
|
||||
return;
|
||||
if (GB_debugger_evaluate(&_gb, [expression UTF8String], &addr, &bank)) {
|
||||
fail = true;
|
||||
}
|
||||
|
||||
if (bank != (typeof(bank))-1) {
|
||||
GB_memory_mode_t mode = [(GBMemoryByteArray *)(_hexController.byteArray) mode];
|
||||
if (addr < 0x4000) {
|
||||
if (bank == 0) {
|
||||
if (mode != GBMemoryROM && mode != GBMemoryEntireSpace) {
|
||||
mode = GBMemoryEntireSpace;
|
||||
}
|
||||
}
|
||||
else {
|
||||
addr |= 0x4000;
|
||||
mode = GBMemoryROM;
|
||||
}
|
||||
}
|
||||
else if (addr < 0x8000) {
|
||||
mode = GBMemoryROM;
|
||||
}
|
||||
else if (addr < 0xA000) {
|
||||
mode = GBMemoryVRAM;
|
||||
}
|
||||
else if (addr < 0xC000) {
|
||||
mode = GBMemoryExternalRAM;
|
||||
}
|
||||
else if (addr < 0xD000) {
|
||||
if (mode != GBMemoryRAM && mode != GBMemoryEntireSpace) {
|
||||
mode = GBMemoryEntireSpace;
|
||||
}
|
||||
}
|
||||
else if (addr < 0xE000) {
|
||||
mode = GBMemoryRAM;
|
||||
}
|
||||
else {
|
||||
mode = GBMemoryEntireSpace;
|
||||
}
|
||||
[_memorySpaceButton selectItemAtIndex:mode];
|
||||
[self hexUpdateSpace:_memorySpaceButton.cell];
|
||||
[_memoryBankInput setStringValue:[NSString stringWithFormat:@"$%02x", bank]];
|
||||
[self hexUpdateBank:_memoryBankInput];
|
||||
}
|
||||
addr -= _lineRep.valueOffset;
|
||||
if (addr >= _hexController.byteArray.length) {
|
||||
GB_log(&_gb, "Value $%04x is out of range.\n", addr);
|
||||
return;
|
||||
}
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[_hexController setSelectedContentsRanges:@[[HFRangeWrapper withRange:HFRangeMake(addr, 0)]]];
|
||||
[_hexController _ensureVisibilityOfLocation:addr];
|
||||
for (HFRepresenter *representer in _hexController.representers) {
|
||||
if ([representer isKindOfClass:[HFHexTextRepresenter class]]) {
|
||||
[self.memoryWindow makeFirstResponder:representer.view];
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}];
|
||||
|
||||
if (error) {
|
||||
NSBeep();
|
||||
[GBWarningPopover popoverWithContents:error onView:sender];
|
||||
}
|
||||
if (fail) return;
|
||||
|
||||
|
||||
if (bank != (typeof(bank))-1) {
|
||||
GB_memory_mode_t mode = [(GBMemoryByteArray *)(_hexController.byteArray) mode];
|
||||
if (addr < 0x4000) {
|
||||
if (bank == 0) {
|
||||
if (mode != GBMemoryROM && mode != GBMemoryEntireSpace) {
|
||||
mode = GBMemoryEntireSpace;
|
||||
}
|
||||
}
|
||||
else {
|
||||
addr |= 0x4000;
|
||||
mode = GBMemoryROM;
|
||||
}
|
||||
}
|
||||
else if (addr < 0x8000) {
|
||||
mode = GBMemoryROM;
|
||||
}
|
||||
else if (addr < 0xA000) {
|
||||
mode = GBMemoryVRAM;
|
||||
}
|
||||
else if (addr < 0xC000) {
|
||||
mode = GBMemoryExternalRAM;
|
||||
}
|
||||
else if (addr < 0xD000) {
|
||||
if (mode != GBMemoryRAM && mode != GBMemoryEntireSpace) {
|
||||
mode = GBMemoryEntireSpace;
|
||||
}
|
||||
}
|
||||
else if (addr < 0xE000) {
|
||||
mode = GBMemoryRAM;
|
||||
}
|
||||
else {
|
||||
mode = GBMemoryEntireSpace;
|
||||
}
|
||||
[_memorySpaceButton selectItemAtIndex:mode];
|
||||
[self hexUpdateSpace:_memorySpaceButton.cell];
|
||||
[_memoryBankInput setStringValue:[NSString stringWithFormat:@"$%02x", bank]];
|
||||
[self hexUpdateBank:_memoryBankInput];
|
||||
}
|
||||
addr -= _lineRep.valueOffset;
|
||||
if (addr >= _hexController.byteArray.length) {
|
||||
GB_log(&_gb, "Value $%04x is out of range.\n", addr);
|
||||
return;
|
||||
}
|
||||
|
||||
[_hexController setSelectedContentsRanges:@[[HFRangeWrapper withRange:HFRangeMake(addr, 0)]]];
|
||||
[_hexController _ensureVisibilityOfLocation:addr];
|
||||
for (HFRepresenter *representer in _hexController.representers) {
|
||||
if ([representer isKindOfClass:[HFHexTextRepresenter class]]) {
|
||||
[self.memoryWindow makeFirstResponder:representer.view];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)hexUpdateBank:(NSControl *)sender ignoreErrors: (bool)ignore_errors
|
||||
{
|
||||
NSString *expression = [sender stringValue];
|
||||
__block uint16_t addr, bank;
|
||||
__block bool fail = false;
|
||||
NSString *error = [self captureOutputForBlock:^{
|
||||
uint16_t addr, bank;
|
||||
if (GB_debugger_evaluate(&_gb, [[sender stringValue] UTF8String], &addr, &bank)) {
|
||||
if (GB_debugger_evaluate(&_gb, [expression UTF8String], &addr, &bank)) {
|
||||
fail = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (bank == (uint16_t) -1) {
|
||||
bank = addr;
|
||||
}
|
||||
|
||||
uint16_t n_banks = 1;
|
||||
switch ([(GBMemoryByteArray *)(_hexController.byteArray) mode]) {
|
||||
case GBMemoryROM: {
|
||||
size_t rom_size;
|
||||
GB_get_direct_access(&_gb, GB_DIRECT_ACCESS_ROM, &rom_size, NULL);
|
||||
n_banks = rom_size / 0x4000;
|
||||
break;
|
||||
}
|
||||
case GBMemoryVRAM:
|
||||
n_banks = GB_is_cgb(&_gb) ? 2 : 1;
|
||||
break;
|
||||
case GBMemoryExternalRAM: {
|
||||
size_t ram_size;
|
||||
GB_get_direct_access(&_gb, GB_DIRECT_ACCESS_CART_RAM, &ram_size, NULL);
|
||||
n_banks = (ram_size + 0x1FFF) / 0x2000;
|
||||
break;
|
||||
}
|
||||
case GBMemoryRAM:
|
||||
n_banks = GB_is_cgb(&_gb) ? 8 : 1;
|
||||
break;
|
||||
case GBMemoryEntireSpace:
|
||||
break;
|
||||
}
|
||||
|
||||
bank %= n_banks;
|
||||
|
||||
[sender setStringValue:[NSString stringWithFormat:@"$%x", bank]];
|
||||
[(GBMemoryByteArray *)(_hexController.byteArray) setSelectedBank:bank];
|
||||
_statusRep.bankForDescription = bank;
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[_hexController reloadData];
|
||||
});
|
||||
}];
|
||||
|
||||
if (error && !ignore_errors) {
|
||||
NSBeep();
|
||||
[GBWarningPopover popoverWithContents:error onView:sender];
|
||||
}
|
||||
|
||||
if (fail) return;
|
||||
|
||||
if (bank == (uint16_t) -1) {
|
||||
bank = addr;
|
||||
}
|
||||
|
||||
uint16_t n_banks = 1;
|
||||
switch ([(GBMemoryByteArray *)(_hexController.byteArray) mode]) {
|
||||
case GBMemoryROM: {
|
||||
size_t rom_size;
|
||||
GB_get_direct_access(&_gb, GB_DIRECT_ACCESS_ROM, &rom_size, NULL);
|
||||
n_banks = rom_size / 0x4000;
|
||||
break;
|
||||
}
|
||||
case GBMemoryVRAM:
|
||||
n_banks = GB_is_cgb(&_gb) ? 2 : 1;
|
||||
break;
|
||||
case GBMemoryExternalRAM: {
|
||||
size_t ram_size;
|
||||
GB_get_direct_access(&_gb, GB_DIRECT_ACCESS_CART_RAM, &ram_size, NULL);
|
||||
n_banks = (ram_size + 0x1FFF) / 0x2000;
|
||||
break;
|
||||
}
|
||||
case GBMemoryRAM:
|
||||
n_banks = GB_is_cgb(&_gb) ? 8 : 1;
|
||||
break;
|
||||
case GBMemoryEntireSpace:
|
||||
break;
|
||||
}
|
||||
|
||||
bank %= n_banks;
|
||||
|
||||
[(GBMemoryByteArray *)(_hexController.byteArray) setSelectedBank:bank];
|
||||
_statusRep.bankForDescription = bank;
|
||||
[sender setStringValue:[NSString stringWithFormat:@"$%x", bank]];
|
||||
[_hexController reloadData];
|
||||
}
|
||||
|
||||
- (IBAction)hexUpdateBank:(NSControl *)sender
|
||||
|
@ -2153,9 +2159,8 @@ enum GBWindowResizeAction
|
|||
}
|
||||
byteArray.selectedBank = bank;
|
||||
_statusRep.bankForDescription = bank;
|
||||
if (bank != (uint16_t)-1) {
|
||||
[self.memoryBankInput setStringValue:[NSString stringWithFormat:@"$%x", byteArray.selectedBank]];
|
||||
}
|
||||
[self.memoryBankInput setStringValue:(bank == (uint16_t)-1)? @"" :
|
||||
[NSString stringWithFormat:@"$%x", byteArray.selectedBank]];
|
||||
|
||||
[_hexController reloadData];
|
||||
for (NSView *view in self.memoryView.subviews) {
|
||||
|
|
Loading…
Reference in New Issue