Что делает каждая строчка? Инструкции древнего процессора. $C2F5:20 67 C9 JSR $C967 A:00 X:FF Y:00 S:FF P:NvUbdIzc // Вход в новую процедуру $C967:A5 86 LDA $0086 = #$00 A:00 X:FF Y:00 S:FD P:NvUbdIzc $C9690 06 BNE $C971 A:00 X:FF Y:00 S:FD P:nvUbdIZc $C96B:A5 60 LDA $0060 = #$00 A:00 X:FF Y:00 S:FD P:nvUbdIZc $C96D:C9 01 CMP #$01 A:00 X:FF Y:00 S:FD P:nvUbdIZc $C96F0 03 BNE $C974 A:00 X:FF Y:00 S:FD P:NvUbdIzc $C974:A5 51 LDA $0051 = #$00 A:00 X:FF Y:00 S:FD P:NvUbdIzc $C9760 31 BNE $C9A9 A:00 X:FF Y:00 S:FD P:nvUbdIZc $C978:A5 1F LDA $001F = #$00 A:00 X:FF Y:00 S:FD P:nvUbdIZc $C97A:C9 03 CMP #$03 A:00 X:FF Y:00 S:FD P:nvUbdIZc $C97C:B0 2B BCS $C9A9 A:00 X:FF Y:00 S:FD P:NvUbdIzc $C97E:A5 1B LDA $001B = #$00 A:00 X:FF Y:00 S:FD P:NvUbdIzc $C9800 5B BNE $C9DD A:00 X:FF Y:00 S:FD P:nvUbdIZc $C982:20 01 C6 JSR $C601 A:00 X:FF Y:00 S:FD P:nvUbdIZc $C601:A5 6A LDA $006A = #$00 A:00 X:FF Y:00 S:FB P:nvUbdIZc $C6030 EC BNE $C5F1 A:00 X:FF Y:00 S:FB P:nvUbdIZc $C605:A5 6D LDA $006D = #$00 A:00 X:FF Y:00 S:FB P:nvUbdIZc $C607:F0 03 BEQ $C60C A:00 X:FF Y:00 S:FB P:nvUbdIZc $C60C:A5 12 LDA $0012 = #$00 A:00 X:FF Y:00 S:FB P:nvUbdIZc $C60E:60 RTS A:00 X:FF Y:00 S:FB P:nvUbdIZc $C985:29 C0 AND #$C0 A:00 X:FF Y:00 S:FD P:nvUbdIZc $C987:F0 20 BEQ $C9A9 A:00 X:FF Y:00 S:FD P:nvUbdIZc $C9A9:60 RTS A:00 X:FF Y:00 S:FD P:nvUbdIZc
Это же вроде 8080/8085? Я не знаком с ним и некоторые команды - могу только предполагать что они делают. Похоже на какой-то анализ ячеек памяти ~0000...0080 (что там? Вектора прерываний? etc?). Ну и так далее. Прыжки на следующую инструкцию без видимой причины (возможно!) индицируют процедуру типа обработчега прерывания (задержка). Если вы дадите опейсания всех инструкций - можно попробовать далее. PS Немного гулга - дает типа такого: http://www.ffd2.com/fridge/io/diskio.s Оттуда я вижу что BNE (например) подразумевает валидную метку перехода. У вас же очень много левых меток. Вы уверены что правильно определили процессор?
PSR1257II Код (Text): $C969:D0 06 BNE $C971 ; Branch? if not zero? to LC971??? (middle of instruction?) ... $C96F:D0 03 BNE $C974 ; Branch if not zero to next instruction?? Это не середина и не следующая инструкция. Обратите внимание на размеры самих инструкций. Вам просто не всё показывают. Например: Код (Text): $C96F:D0 03 $C974:A5 51 Ну явно же видно, что кто-то зажилил три байта по адресу $C971.
Это Commodore64. jsr - jump saving return address (=call) lda - load accumulator with memory (=mov A, [mem]) bne - branch on result not zero (=jnz short) cmp - compare memory and accumulator (= cmp A, [mem]) bcs - branch on carry set (= jc short) beq - branch on result is zero (=jz short) rts - return from subroutine (=ret) Дизассемблировано неверно. Правильно ... C967: A5 86 lda [+86] ;относительная адресация: то есть читаем из C9EF ... А вот опкод C9 - это непосредственное сравнение, cmp A, число. Выпущена часть команд (это результат трассировки, похоже, а не дизассемблирование - того, где не прошли, не видим). и никаких предположений о том, что это, сделать нельзя. В целом сводится к тому, что если где-то там нули, то просто ret. А если не нули, то что-то вернуть в аккумуляторе. Но без выпущенных команд даже предполагать не о чем. PS: а не, сори. Все правильно, из нулевой страницы. Извиняюсь, все правильно дизассемблировано. PPS: а в нулевую страницу (0000-00FF) в коммодорах мапятся порты ввода-вывода, для большей эффективности. Так что это не просто "где-то там нули", а "прочитали нули из каких-то портов" PPPS: и команды lda устанавливают флаг ZF, если был загружен 0, или сбрасывают его иначе. То есть никаких задержек тут не предусматривалось, все так, как есть. lda [address] эквивалентно mov A, [address] & cmp A, 0
Дизассемблировали Терминатора? Говорят (если не врут), что первый Терминатор работал как раз на проце MOS 6502.
Боюсь что терминатора тогда не было в проекте! =) Новый влив. FatMoon довольно четко все поясняет. Можете на примере показать как вы разбираете участок кода? Вот это судя по всему независимая процедура. Насколько я понимаю берет из массива данные, расшифровывает их и помещает в память на нулевой странице. Вот тут инфа есть по командам http://www.obelisk.demon.co.uk/6502/instructions.html 00CC5:A5 20 LDA $0020 = #$01 00CC7:F0 03 BEQ $DCCC 00CC9:4C 5B DD JMP $DD5B 00CCC:A5 29 LDA $0029 = #$1B 00CCE:29 0F AND #$0F 00CD00 E2 BNE $DCB4 00CD2:C6 27 DEC $0027 = #$0C 00CD40 DE BNE $DCB4 00CD6:A4 28 LDY $0028 = #$06 00CD8:C8 INY 00CD9:B1 5B LDA ($5B),Y @ $DE2E = #$03 00CDB:85 5A STA $005A = #$0A 00CDD:88 DEY 00CDE:E6 28 INC $0028 = #$06 00CE0:E6 28 INC $0028 = #$06 00CE2:B1 5B LDA ($5B),Y @ $DE2E = #$03 00CE4:AA TAX 00CE5:29 03 AND #$03 00CE7:18 CLC 00CE8:69 01 ADC #$01 00CEA:85 20 STA $0020 = #$01 00CEC:C9 02 CMP #$02 00CEE:90 0D BCC $DCFD 00CF0:A5 40 LDA $0040 = #$00 00CF2:F0 06 BEQ $DCFA 00CF4:A5 53 LDA $0053 = #$20 00CF6:C9 07 CMP #$07 00CF8:90 03 BCC $DCFD 00CFA:20 60 C9 JSR $C960 00CFD:8A TXA 00CFE:4A LSR 00CFF:4A LSR 00D00:48 PHA 00D01:29 03 AND #$03 00D03:A8 TAY 00D04:68 PLA 00D05:4A LSR 00D06:4A LSR 00D07:29 07 AND #$07 00D09:85 38 STA $0038 = #$05 00D0B:A5 3F LDA $003F = #$00 00D0D:4A LSR 00D0E:4A LSR 00D0F:4A LSR 00D10:18 CLC 00D11:65 38 ADC $0038 = #$05 00D13:C9 08 CMP #$08 00D15:90 02 BCC $DD19 00D17:A9 07 LDA #$07 00D19:AA TAX 00D1A:29 03 AND #$03 00D1C:85 26 STA $0026 = #$00 00D1E:BD FA DD LDA $DDFA,X @ $DDFF = #$03 00D21:85 27 STA $0027 = #$0C 00D23:BD 0A DE LDA $DE0A,X @ $DE0F = #$03 00D26:18 CLC 00D27:65 40 ADC $0040 = #$00 00D29:85 2C STA $002C = #$01 00D2B:BD 02 DE LDA $DE02,X @ $DE07 = #$02 00D2E:85 2A STA $002A = #$03 00D30:BD 12 DE LDA $DE12,X @ $DE17 = #$02 00D33:85 58 STA $0058 = #$00 00D35:B9 22 DE LDA $DE22,Y @ $DE22 = #$01 00D38:85 21 STA $0021 = #$30 00D3A:85 22 STA $0022 = #$13 00D3C:B9 1A DE LDA $DE1A,Y @ $DE1A = #$20 00D3F:85 23 STA $0023 = #$38 00D41:B9 1E DE LDA $DE1E,Y @ $DE1E = #$20 00D44:85 24 STA $0024 = #$00 00D46:B9 26 DE LDA $DE26,Y @ $DE26 = #$00 00D49:85 56 STA $0056 = #$48 00D4B:B9 2A DE LDA $DE2A,Y @ $DE2A = #$00 00D4E:85 57 STA $0057 = #$00 00D50:A5 28 LDA $0028 = #$06 00D52:C9 10 CMP #$10 00D540 04 BNE $DD5A 00D56:A9 00 LDA #$00 00D58:85 28 STA $0028 = #$06 00D5A:60 RTS
Olia Может все-таки начнете с начала? Так вопросы не задают - вы запутали всех. Немного помедитировав стало понятно, что в 1-v посте не дизассемблер, а ТРАССА эмулятора или отладчика. Значит сомнения в правильности команд уже отпадают. Именно поэтому тут дырки в адресах и даже ПРЫЖКИ (это объяснение для меня и l_inc ) Код (Text): $C982:20 01 C6 JSR $C601 A:00 X:FF Y:00 S:FD P:nvUbdIZc $C601:A5 6A LDA $006A = #$00 A:00 X:FF Y:00 S:FB P:nvUbdIZc Чтобы не мудрить с выделением процедур используйте IDA - она вам автоматом процедуры выделит. А вообще - JSR это вызов процедуры и конец это команда RTS. Правда этих RTS может быть несколько, тут надо команды перехода смотреть чтобы найти последнюю.
Нужно человеку которые изучает ассемблер(тема в разделе для новичков) пояснить участок кода из #6. Нужны комментарии к каждой строчке и в целом "абстрактный вывод" по работе этого участка. Я для себя картину примерно представляю, но может она не верна ? Как то так.
Участок кода из #1 - скорее всего определение нажатой клавиши, исходя из обилия чтений из - предположительно, портов ввода-вывода - и отсутствии записи в них. Участок кода из #6 - чего-то посложнее, или звук, или чтение с флоппи (если флоппи есть на коммодорах), так сразу и не понять. Не думаю, что изучение процедур такого рода "для новичков". По сути, это "драйвера" 8-битного компьютера. Если есть разметка 0й страницы, какие адреса каким портам и устройствам соответствуют - можно что-то точнее сказать.
Холодно. Там действительно есть порт ввода. Но это 1 байт всего. 10-ый байт чтоли( не суть) . Остальные байты(первые 256) могут быть использованы просто как рабочая ячейка памяти. FatMoon, а вы можете дать свой скайп?
нет, не обзавелся как-то скайпом. Где код с DD5B? Где код с DCB4? Где процедура C960? Ну вот этот фрагмент Код (Text): 00:DD09:85 38 STA $0038 = #$05 00:DD0B:A5 3F LDA $003F = #$00 00:DD0D:4A LSR 00:DD0E:4A LSR 00:DD0F:4A LSR 00:DD10:18 CLC 00:DD11:65 38 ADC $0038 = #$05 00:DD13:C9 08 CMP #$08 00:DD15:90 02 BCC $DD19 00:DD17:A9 07 LDA #$07 00:DD19:AA TAX Чего-то с восьмеричной системой счисления. Типа (получить следующий разряд восьмиричного числа), (сложить восьмиричные цифры), (если получилось больше 8, значит будет 7 и 1 в переносе). Больше ничего не сказать наверняка надо хотя бы знать что в других ветках и что делается в процедуре.
00CB4:60 RTS // непонятно почему там RTS а скажем не в 00D5A:60 RTS // или нам не принципиально где вызвать RTS ? имеется ввиду два BNE вот тут 00CD00 E2 BNE $DCB4 00CD2:C6 27 DEC $0027 = #$0C 00CD40 DE BNE $DCB4 00D5B:C6 22 DEC $0022 = #$25 00D5D0 FB BNE $DD5A 00D5F:A5 21 LDA $0021 = #$50 00D61:85 22 STA $0022 = #$25 00D63:A0 00 LDY #$00 00D65:A2 05 LDX #$05 00D67:BD 24 02 LDA $0224,X @ $0229 = #$0D 00D6A:F0 01 BEQ $DD6D 00D6C:C8 INY 00D6D:CA DEX 00D6E:10 F7 BPL $DD67 00D70:98 TYA 00D71:38 SEC 00D72:E5 53 SBC $0053 = #$20 00D74:85 76 STA $0076 = #$E6 00D76:B0 0A BCS $DD82 00D78:A2 05 LDX #$05 00D7A:BD 24 02 LDA $0224,X @ $0229 = #$0D 00D7D:F0 08 BEQ $DD87 00D7F:CA DEX 00D80:10 F8 BPL $DD7A 00D82:A9 01 LDA #$01 00D84:85 22 STA $0022 = #$25 00D86:60 RTS Уже многое прояснилось, просто как Вы успели заметить я в АСМе разбираюсь фактически 3 дня. Опыта ноль. Теперь понятно что мы прыгаем дальше по коду вначале и это логическое продолжение процедуры. Самое главое что я уже могу манипулировать работой программы "извне". В 1 байте шифруется фактически 3 параметра. А этот байт является частью "вшитой таблицы данных". Следующий байт кодирует другой параметр целиком...Самое главное что уже понятно за что отвечают эти параметры 00:C960:A5 2F LDA $002F = #$02 00:C9620 02 BNE $C966 00:C964:E6 2F INC $002F = #$02 00:C966:60 RTS
Берете листок бумаги, благо на бумаге можно писать как угодно и где угодно, и стрелочки рисовать, и вставлять сноски и врезки, и потом переписать все это дело, и рисуете блок-схему, или алгоритм, или как вам хочется. Для ячеек пытаетесь придумать некие имена - предположительно это какие-то счетчики, или флаги (=0 или !=0), но не исключаем, что и порты. Доводите до полной расшифровки и пытаетесь понять что же это такое. В виде некоторого псевдокода, должно быть как-то так (на промежуточном шаге): if [20] = 0 then ..if ([29] AND #0F)=0 then ....[27]=[27]-1 ....if [27]=0 then Код (Text): 00:DCD6:A4 28 LDY $0028 = #$06 00:DCD8:C8 INY 00:DCD9:B1 5B LDA ($5B),Y @ $DE2E = #$03 00:DCDB:85 5A STA $005A = #$0A 00:DCDD:88 DEY 00:DCDE:E6 28 INC $0028 = #$06 00:DCE0:E6 28 INC $0028 = #$06 00:DCE2:B1 5B LDA ($5B),Y @ $DE2E = #$03 00:DCE4:AA TAX 00:DCE5:29 03 AND #$03 00:DCE7:18 CLC 00:DCE8:69 01 ADC #$01 00:DCEA:85 20 STA $0020 = #$01 00:DCEC:C9 02 CMP #$02 00:DCEE:90 0D BCC $DCFD 00:DCF0:A5 40 LDA $0040 = #$00 00:DCF2:F0 06 BEQ $DCFA 00:DCF4:A5 53 LDA $0053 = #$20 00:DCF6:C9 07 CMP #$07 00:DCF8:90 03 BCC $DCFD 00:DCFA:20 60 C9 JSR $C960 00:DCFD:8A TXA 00:DCFE:4A LSR 00:DCFF:4A LSR 00:DD00:48 PHA 00:DD01:29 03 AND #$03 00:DD03:A8 TAY 00:DD04:68 PLA 00:DD05:4A LSR 00:DD06:4A LSR 00:DD07:29 07 AND #$07 00:DD09:85 38 STA $0038 = #$05 00:DD0B:A5 3F LDA $003F = #$00 00:DD0D:4A LSR 00:DD0E:4A LSR 00:DD0F:4A LSR 00:DD10:18 CLC 00:DD11:65 38 ADC $0038 = #$05 00:DD13:C9 08 CMP #$08 00:DD15:90 02 BCC $DD19 00:DD17:A9 07 LDA #$07 00:DD19:AA TAX 00:DD1A:29 03 AND #$03 00:DD1C:85 26 STA $0026 = #$00 00:DD1E:BD FA DD LDA $DDFA,X @ $DDFF = #$03 00:DD21:85 27 STA $0027 = #$0C 00:DD23:BD 0A DE LDA $DE0A,X @ $DE0F = #$03 00:DD26:18 CLC 00:DD27:65 40 ADC $0040 = #$00 00:DD29:85 2C STA $002C = #$01 00:DD2B:BD 02 DE LDA $DE02,X @ $DE07 = #$02 00:DD2E:85 2A STA $002A = #$03 00:DD30:BD 12 DE LDA $DE12,X @ $DE17 = #$02 00:DD33:85 58 STA $0058 = #$00 00:DD35:B9 22 DE LDA $DE22,Y @ $DE22 = #$01 00:DD38:85 21 STA $0021 = #$30 00:DD3A:85 22 STA $0022 = #$13 00:DD3C:B9 1A DE LDA $DE1A,Y @ $DE1A = #$20 00:DD3F:85 23 STA $0023 = #$38 00:DD41:B9 1E DE LDA $DE1E,Y @ $DE1E = #$20 00:DD44:85 24 STA $0024 = #$00 00:DD46:B9 26 DE LDA $DE26,Y @ $DE26 = #$00 00:DD49:85 56 STA $0056 = #$48 00:DD4B:B9 2A DE LDA $DE2A,Y @ $DE2A = #$00 00:DD4E:85 57 STA $0057 = #$00 ......if [28]=10 then [28]=0 ....end if ..end if else (ветка DD5B) ..[22]=[22]-1 ..if [22]=0 then ....[22]=[21] ....Y=количество ненулевых байт в массиве 224..229 ....[76]=Y-[53]-1 ....if (массив 224..229 не содержит нулей) then [22]=1, и конец процедуры. ....if (Y-1)>=[53] then ......X=индекс первого нулевого байта в массиве 224..229 и пошли на DD87 (что там не знаю, код отсутствует) ....end if ..end if end if конец процедуры извиняюсь за стиль и недоделанность )) но в идеале выразить надо словами как-то так. Если нужно понимание как работает.
потому что BNE использует не адрес, а однобайтовое смещение. То есть переход возможен на +127 или -128 байт от следующей за BNE команды. DD5A-DCD2 = 136. Прыгнуть сюда по относительному байтовому смещению нельзя, не достаем. А на DCB4 запросто (-30 байт). Где именно выполнится RTS, совершенно непринципиально.
Спасибо, это понятно. Вот еще загадочный участок. 00BF1:AD 33 02 LDA $0233 00BF4:4D 34 02 EOR $0234 00BF7:4D 35 02 EOR $0235 00BFA:45 1E EOR $001E 00BFC:45 29 EOR $0029 00BFE:29 03 AND #$03 00C000 02 BNE $DC04 Предположим, что существую некоторые объекты с координатами (Xn,Yn) . А по всем адресам $0233 $0234 $0235 $001E $0029 Yn - координата этих объектов( от 0 до 255) . Вопрос. В регистре А в результате что будет?? Какая логическая ассоциация ? Мозг не осиливает столько EOR-офф. Пфф.... далее идет такой код 00C02:A9 01 LDA #$01 00C04:85 38 STA $0038 00C06:0A ASL 00C07:0A ASL 00C08:65 38 ADC $0038 00C0A:0A ASL 00C0B:0A ASL 00C0C:0A ASL 00C0D:18 CLC 00C0E:69 1B ADC #$1B 00C10:9D A5 02 STA $02A5,X
Элементарно: после AND #$03 там будет XOR/EOR 2-х младших разрядов из всех этих ячеек. Никто за вас не будет две элементарные операции изучать Следующий кусок сдвигает эти 2 бита на 2 бита влево( содержимое 3, 2 или 1), предварительно сохранив в ячейку, потом восстанавливает/добавляет их(ADC) потом еще сдвиг на 3 и и плюсует $1B Что-то типа 8*(5*bits+3)+3 Такие вещи надо смотреть на эмуляторе с отладчиком, но естественно на реальных данных. Или на отладочной плате с реальным процом и реальными данными. А в уме - да муторно, но когда-то без проблем народ все это делал без эмуляторов. По времени долго по началу.
Элементарно! Но, вопрос звучал иначе. Что это за прием такой взять стопятсот XOR от группы переменных? Для наглядности представим что это все переменные 1-о байтовые Y-координаты объектов. Есть идеи на этот счет? Нужно представить логическую связь в уме. Чего хотел добиться программист когда делал такую связку XOR над группой переменных?
мож такая разновидность контрольной суммы, типа контроля четности. Откуда вообще данные? Что за машина? откуда знаете, что в младших адресах именно RAM, а не отображение внешних девайсов? Почему трасса, а не просто дамп/дизасм исполняемого кода?
Не надо выдумывать. Это явно не Y-координаты. Больше похоже на флаги, но тогда непонятна дальнейшая арифметика. Для ответа на этот вопрос надо отреверсить хотя бы 20-30% всего кода. Либо "плясать" от понятных вещей - например какие-то показания выводятся на индикатор, значит перед этим он вычисляется или хотя будем знать ячейку, где значения и поискать проги, которы с этой ячейкой работают. Где-то ТАК