| 127 | } |
| 128 | |
| 129 | void DisassemblyManager::analyze(u32 address, u32 size = 1024) |
| 130 | { |
| 131 | if (!cpu->isAlive() || !cpu->isValidAddress(address)) |
| 132 | return; |
| 133 | |
| 134 | u32 end = address+size; |
| 135 | |
| 136 | address &= ~3; |
| 137 | u32 start = address; |
| 138 | |
| 139 | while (address < end && start <= address) |
| 140 | { |
| 141 | auto it = findDisassemblyEntry(entries,address,false); |
| 142 | if (it != entries.end()) |
| 143 | { |
| 144 | DisassemblyEntry* entry = it->second; |
| 145 | entry->recheck(); |
| 146 | address = entry->getLineAddress(0)+entry->getTotalSize(); |
| 147 | continue; |
| 148 | } |
| 149 | |
| 150 | SymbolInfo info = cpu->GetSymbolGuardian().SymbolOverlappingAddress( |
| 151 | address, ccc::FUNCTION | ccc::GLOBAL_VARIABLE | ccc::LOCAL_VARIABLE); |
| 152 | |
| 153 | if (info.descriptor.has_value()) |
| 154 | { |
| 155 | switch (*info.descriptor) |
| 156 | { |
| 157 | case ccc::SymbolDescriptor::FUNCTION: |
| 158 | { |
| 159 | DisassemblyFunction* function = new DisassemblyFunction(cpu,info.address.value,info.size); |
| 160 | entries[info.address.value] = function; |
| 161 | address = info.address.value + info.size; |
| 162 | break; |
| 163 | } |
| 164 | case ccc::SymbolDescriptor::GLOBAL_VARIABLE: |
| 165 | { |
| 166 | DisassemblyData* data = new DisassemblyData(cpu,info.address.value,info.size,DATATYPE_WORD); |
| 167 | entries[info.address.value] = data; |
| 168 | address = info.address.value+info.size; |
| 169 | break; |
| 170 | } |
| 171 | case ccc::SymbolDescriptor::LOCAL_VARIABLE: |
| 172 | { |
| 173 | DisassemblyData* data = new DisassemblyData(cpu,info.address.value,info.size,DATATYPE_WORD); |
| 174 | entries[info.address.value] = data; |
| 175 | address = info.address.value+info.size; |
| 176 | break; |
| 177 | } |
| 178 | default: |
| 179 | break; |
| 180 | } |
| 181 | } else { |
| 182 | if (address % 4) |
| 183 | { |
| 184 | u32 next = std::min<u32>((address+3) & ~3,cpu->GetSymbolGuardian().SymbolAfterAddress( |
| 185 | address, ccc::FUNCTION | ccc::GLOBAL_VARIABLE | ccc::LOCAL_VARIABLE).address.value); |
| 186 | DisassemblyData* data = new DisassemblyData(cpu,address,next-address,DATATYPE_BYTE); |
no test coverage detected