Comments 11
В порядке придирок -- весьма и весьма много ошибок в русском языке, начиная с экспЕрИмента.
По существу вопроса: как минимум, адреса команд стоило б выводить в шестнадцатеричном виде, при реальной работе это обычно намного удобней, чем в десятичном.
В упор не вижу где в десятичном виде адреса команд?
"Наш дизассемблер" -- справа столбец адресов в явно десятичном виде: 6099, за ним 6100 и т.д.
ADD. А, блин, это я ступил: это номера строк, а не адреса. Ну, тогда адреса надо б добавить.
Разобрать код 8 битного процессора не такая уж и сложная задача. Я, например, изучал в детстве ассемблер Z80. Сначала казалось странным такие расположение команд. Но потом до меня дошло, что просто код команды записан в определённых битах команды. Главное эту логику уловить, если у тебя просто есть набор команд. Но с Z80 посложнее было, потому что были и двухбайтовые команды.
написал такой года 3 назад, самое сложное было с недокументированными командами и частными случаями известными только спектрум-кодер-сообществу
https://github.com/dpr0/z80_disassembler/blob/master/lib/z80_disassembler.rb
Так ведь есть уже несколько, которыми ромхакеры и сценеры пользуются, и даже, НЯП, плагин к Иде есть, причем там функционал весьма приличный. Целью было просто собственное саморазвитие? И сравнивали ли вы вашу разработку с другими дизасмами?
Спасибо, очень интересно!
Немного покоробило include 'opcodes.php';
в конструкторе, я бы конечно загружал отдельно. Это, все-таки, жесткая зависимость, а их в объектах следует избегать. Ну и чисто на рефлексах добавил бы __DIR__
к include
.
И примерно из той же серии мелкое замечание про file_put_contents
прямо внутри метод disassembly()
. Всё-таки, лучше это делать снаружи :) Или добавил два метода в класс, load()
и write()
Ну и сам код я бы чуть-чуть оптимизировал,
if (isset($this->instructions[$capitalKey])) {
$skipKeys = $this->instructions[$capitalKey][1] - 1;
if ($skipKeys) {
$value = ($skipKeys == 2) ? "" : $arrayInstructions[$_key + 2];
$value .= $arrayInstructions[$_key + 1];
$resultString .= str_replace('$argument', '$' . $value, $this->instructions[$capitalKey][0]) . PHP_EOL;
} else {
$resultString .= $this->instructions[$capitalKey][0] . PHP_EOL;
}
} else {
trigger_error("Incorrect instruction $capitalKey", E_USER_ERROR);
}
Хотя не уверен, стоит ли
Дизассемблер 6502 (nes/famicom/dendy) на php