Ковыряние DELL (Phoenix 1993) BIOS

Тема в разделе "WASM.RESEARCH", создана пользователем aascut, 2 сен 2011.

  1. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    aascut

    Понятия не имею и никогда не видел - погуглил паттерны - ничего нет (82h - 86h-85h-..., out/in). Нужно смотреть в каком контексте идет с ними работа (что ожидается после и до).
     
  2. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    PSR1257II
    Мыли в слух: допустим идет перечисление ("запись" в "регистр 85h") значений: al= 06,07,08,09,0A,0B,0C,0D,0E,0F,10h.Для остальных "регистров" 86h,84h,82h "значения для записи" одинаковые и не меняются.-10h последнее значение al для 85h "регистра", больше этот код не используется. Для каждого вызова (CALL) свой -номер. По виду чем то напоминают номера прерываний IRQ??
     
  3. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    aascut

    Если вы имеете в виду что этот блок что-то типа инициализации контроллера прерываний или какая-то хитрая методика открытия линий прерывания ... мне нет, не напоминают. Я бы сначала попробовал (как уже сказал):

    0) Понять в каком контексте вызываются эти функции. Допустим:

    call Init_KeyBoard
    call Init_HDD
    call YourStrangeSub ; Here is your weird code
    call Init_Mouse

    - в этом случае можно делать выводы.

    1) Что еще делается непосредственно до и после вашего кода. Допустим:

    YourStrangeSub proc
    call DisableInterrupts
    call DoSomethingElse
    call ReadMSRRegisters
    ...
    call SomeStringsRefs
    ...
    call WriteIntoRegister85h ; Here we go!
    ...
    call EnableInterrupts
    ...

    В этом случае можно предположить что это инициализация какого-то устройства но НЕ (выше) hdd, mouse, keyboard. Это устройство использует прерывания. Параметры BIOS держит в MSR регистрах - интересуемся что обычно содержится именно в этих ячейках.

    Может быть также (debug) SomeStringsRefs - если повезет - некие сообщения в самом модуле. BIOS же рапортует в SETUP о разных состояниях, верно? Может быть XREFs на вашу Sub и в процедуре вывода информации о машине.
     
  4. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    PSR1257II
    Извиняюсь за задержку с ответом, но LPC протокол пока подождет
    разберусь чуть позже, когда наберется достаточно статистики
    обращений к этому модулю.
    Сейчас никак не могу понять куда ведет этот jump-JMP cs:word_F645A[bx]:
    cs-текущий сегмент кода
    word_F645A-смещение
    а вот дальше [bx]=допустим [08] как это интерпритировать?

    Код (Text):
    1. F000:6442 000 0F B6 DC    movzx   bx, ah          ; Move with Zero-Extend
    2. F000:6445 000 03 DB                 add     bx, bx          ; bx=2*ah():
    3.                             данные в ah  если
    4. F000:6445                                  ; 1)ah=04->bx=08;
    5. F000:6445                                  ; 2)ah=05->bx=0A;
    6. F000:6445                                  ; 3)ah=06->bx=0C;
    7. F000:6445                                  ; 4)ah=07->bx=0E;
    8. F000:6445                                  ; 5)ah=08->bx=10;
    9. F000:6445                                  ; 6)ah=09->bx=12;
    10. F000:6445                                  ; 7)ah=0A->bx=14;
    11. F000:6445                                  ; 8)ah=0B->bx=16;
    12. F000:6447 000 0F 20 C0                mov     eax, cr0        ; Move to/from Special Registers
    13. F000:644A 000 66 25 FF FF FF 9F   and     eax, 9FFFFFFFh  ; reset bits30,29=0-
    14. F000:644A                                                                  ; L1 Cash enable
    15. F000:6450 000 0F 22 C0               mov     cr0, eax        ; write cr0=00000010-L1 cash enable
    16. F000:6453 000 2E FF A7 5A 64      JMP     cs:word_F645A[bx]; Indirect Near Jump
    17. ....
    18. F000:645A 000 D7 64         word_F645A      dw 64D7h ; DATA XREF: sub_F63D8+7Br
    19. F000:645C 000 6C 64                                dw 646Ch
    20. F000:645E 000 74 64                                dw 6474h
    21. F000:6460 000 A4 9C                                dw 9CA4h
    22. F000:6462 000 96 64                                dw 6496h
    23. F000:6464 000 7E 64                                dw 647Eh
    24. F000:6466 000 74 64                                dw 6474h
    25. F000:6468 000 58 64                                dw 6458h
    26. F000:646A 000 78 64                                dw 6478h
    27. ....
    Добавление:
    Разобрался с этим. Операция с массивом.
     
  5. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    "Все пропало шеф!". Погрузился в SMM и тут засада да еще какая! Мозг взрывается.
    Кто знает о "режиме" и работе в нем ИДы. Как ее правильно настроить, что бы она верно интерпретировала код.
    Вопросы:
    1. Кто знает как правильно прочитать это:
    Код (Text):
    1. A000:0234 BA F8 0C                                 mov     dx, 0CF8h
    2. A000:0237 ED                                       in      ax, dx ; read config address port 0CF8h,
    3. A000:0237                                                            ; ax=xxxx(what is last device was config?)
    В литературе не нашел, но явно не то что я написал в комменте.
    2. Собственно SMM. Код сегмент FEDA0000 отображается на 000A0000.Но там же (000A0000) находится видео. Проц переключился в P-mode.
    Код (Text):
    1.  Входим:
    2. A000:0000                          ; ---------------------------------------------------------------------------
    3. A000:0000                          Second SMI HANDLER START: Attantion!!
    4. A000:0000                          all accesses to addresses FEDA0000-FEDABFFF
    5. A000:0000                          will be redirected to addresses 000A0000-000ABFFF
    6. A000:0000                          DS, ES, FS, GS, SS Selectors =0000H
    7. A000:0000                          DS, ES, FS, GS, SS Bases= 000000000H
    8. A000:0000                          DS, ES, FS, GS, SS Limits= 0FFFFFFFFH
    9. A000:0000                          ; ===========================================================================
    10. A000:0000
    11. A000:0000                          ; Segment type: Pure code
    12. A000:0000                          A000            segment byte public 'CODE' use16
    13. A000:0000                                          assume cs:A000
    14. A000:0000                          ; START OF FUNCTION CHUNK FOR sub_FAB8F
    15. A000:0000                                          assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing
    16. A000:0000
    17. A000:0000                          loc_A0000:                              ; CODE XREF: sub_FAB8F-E594EJ
    18. A000:0000 000 EB 11                           jmp     short loc_A0013 ; Jump
    19. A000:0000
    20. ...
    21. прыгаем->
    22. A000:0013                          loc_A0013:                              ; CODE XREF: sub_FAB8F:loc_A0000j
    23. A000:0013 000 FA                                   cli                     ; Clear Interrupt Flag
    24. A000:0014
    25. A000:0014                          loc_A0014:                              ; Load Interrupt Descriptor Table Register
    26. A000:0014                                          db      66h             ; from address cs=FED98000+offset=8098;
    27. A000:0014 000 66 2E 0F 01 1E 98 80                 lidt    fword ptr cs:byte_A8098 ; =FEDA0098=000A0098:value=000000000000:
    28. A000:0014 000                                                              ; IDT address base=0000:0000,limit=1 bytes
    29. A000:001B
    30. A000:001B                          loc_A001B:                              ; Load Global Descriptor Table Register
    31. A000:001B                                          db      66h             ; from address cs=FED98000+offset=8034;
    32. A000:001B 000 66 2E 0F 01 16 34 80                 lgdt    fword ptr cs:byte_A8034 ; =FEDA0034=000A0034:value=FEDA00400058:
    33. A000:001B 000                                                              ; GDT address base=A000:0040,limit=58 bytes
    34. A000:001B                                                                  ;
    35. A000:0022 000 0F 20 C0                             mov     eax, cr0        ; Move to/from Special Registers
    36. A000:0025 000 0C 01                             or      al, 1           ; Logical Inclusive OR
    37. A000:0027 000 0F 22 C0                         mov     cr0, eax        ; Protect Mode Enable!
    38. A000:002A 000 66 EA 00 02 DA FE 08+      jmp     large far ptr 8:0FEDA0200h ; selector=08-#1(0-10) from GDT
    39. A000:002A 000 00                                                        ; =00CF9F000000FFFF;
    40. A000:002A                                                                  ; address base=00000000
    41. A000:002A                                                                  ; limit FFFFFx1000
    42. A000:002A                                                                  ; flags:G=1(4kb lim),D=1-32bits
    43. A000:002A                                                                  ; AVL=00-segment dis.for system
    44. A000:002A                                                                  ; software used;
    45. A000:002A                                                                  ; P=1-seg/enable in mem
    46. A000:002A                                                                  ; DPL=00-privilege level=0(high)
    47. A000:002A                                                                  ; S=1-code/data segment
    48. A000:002A                                                                  ; Type=1111-code,CDA=111-Execute/
    49. A000:002A                                                                  ; Read-Only, conforming, accessed
    50. A000:002A                                                                  ; jump to A000:0200
    51. A000:002A
    52. A000:002A                          ; END OF FUNCTION CHUNK FOR sub_FAB8F
    53. ....
    54. прыгаем->
    55. A000:0200                          ; ---------------------------------------------------------------------------
    56. A000:0200                          SMI HANDLER #2
    57. A000:0200                          ; START OF FUNCTION CHUNK FOR sub_FAB8F
    58. A000:0200
    59. A000:0200                          loc_A0200:                              ; CODE XREF: sub_FAB8F-5AB65J
    60. A000:0200 000 EB 1A                                jmp     short near ptr unk_A021C ; Jump
    61. A000:0200
    62. A000:0200                          ; END OF FUNCTION CHUNK FOR sub_FAB8F
    63. A000:0200                          ; --------------------------------------------------------------------------
    64. ...прыгаем ->Куда? остаемся ли мы в коде SMM или прыгаем в Видео?:
    65. ...  (Здесь уже появляется засада с "66" если его игнорировать,
    66.  то все вроде правильно если включать в дизассеблирование,
    67.  то получается фигня какая-то)
    68. A000:021C 66                       unk_A021C       db  66h ; f             ; CODE XREF: sub_FAB8F:loc_A0200j
    69. A000:021D                          ; ---------------------------------------------------------------------------
    70. A000:021D B8 10 00                                 mov     ax, 10h
    71. A000:0220 8E D8                                    mov     ds, ax          ; ds=0010,selector=10-#2 in GDT
    72. A000:0220                                                                  ; =00CF92000000FFFF:
    73. A000:0220                                                                  ; address base=00000000
    74. A000:0220                                                                  ; limit=FFFFFx1000h
    75. A000:0220                                                                  ; flags:G=1(4kb lim),D=1-32bits
    76. A000:0220                                                                  ; AVL=00-segment dis.for system
    77. A000:0220                                                                  ; software used;
    78. A000:0220                                                                  ; P=1-seg/enable in mem
    79. A000:0220                                                                  ; DPL=00-privilege level=0(high)
    80. A000:0220                                                                  ; S=1-code/data segment
    81. A000:0220                                                                  ; Type=0010-Data,EWA=010-Read/Write
    82. A000:0220                                                                  ;
    83. A000:0222                                          assume ds:nothing
    84. A000:0222 8E C0                                    mov     es, ax          ; es=0010,selector=10-#2 in GDT
    85. A000:0222                                                                  ; =00CF92000000FFFF:
    86. A000:0222                                                                  ; address base=00000000
    87. A000:0222                                                                  ; limit=FFFFFx1000h
    88. A000:0222                                                                  ; flags:G=1(4kb lim),D=1-32bits
    89. A000:0222                                                                  ; AVL=00-segment dis.for system
    90. A000:0222                                                                  ; software used;
    91. A000:0222                                                                  ; P=1-seg/enable in mem
    92. A000:0222                                                                  ; DPL=00-privilege level=0(high)
    93. A000:0222                                                                  ; S=1-code/data segment
    94. A000:0222                                                                  ; Type=0010-Data,EWA=010-Read/Write
    95. A000:0222                                                                  ;
    96. A000:0224                                          assume es:nothing
    97. A000:0224 8E E8                                    mov     gs, ax          ; gs=0010,selector=10-#2 in GDT
    98. A000:0224                                                                  ; =00CF92000000FFFF:
    99. A000:0224                                                                  ; address base=00000000
    100. A000:0224                                                                  ; limit=FFFFFx1000h
    101. A000:0224                                                                  ; flags:G=1(4kb lim),D=1-32bits
    102. A000:0224                                                                  ; AVL=00-segment dis.for system
    103. A000:0224                                                                  ; software used;
    104. A000:0224                                                                  ; P=1-seg/enable in mem
    105. A000:0224                                                                  ; DPL=00-privilege level=0(high)
    106. A000:0224                                                                  ; S=1-code/data segment
    107. A000:0224                                                                  ; Type=0010-Data,EWA=010-Read/Write
    108. A000:0224                                                                  ;
    109. A000:0226 8E E0                                    mov     fs, ax          ; fs=0010,selector=10-#2 in GDT
    110. A000:0226                                                                  ; =00CF92000000FFFF:
    111. A000:0226                                                                  ; address base=00000000
    112. A000:0226                                                                  ; limit=FFFFFx1000h
    113. A000:0226                                                                  ; flags:G=1(4kb lim),D=1-32bits
    114. A000:0226                                                                  ; AVL=00-segment dis.for system
    115. A000:0226                                                                  ; software used;
    116. A000:0226                                                                  ; P=1-seg/enable in mem
    117. A000:0226                                                                  ; DPL=00-privilege level=0(high)
    118. A000:0226                                                                  ; S=1-code/data segment
    119. A000:0226                                                                  ; Type=0010-Data,EWA=010-Read/Write
    120. A000:0226                                                                  ;
    121. A000:0226
    122. A000:0226                          ; ---------------------------------------------------------------------------
    123. A000:0228 66                                       db  66h ; f
    124. A000:0229                          ; ---------------------------------------------------------------------------
    125. A000:0229 B8 18 00                                 mov     ax, 18h
    126. A000:022C 8E D0                                    mov     ss, ax          ; selector=0011=#3(0-10)in GDT
    127. A000:022C                                                                  ; =00CF92000000FFFF:
    128. A000:022C                                                                  ; address base=00000000
    129. A000:022C                                                                  ; limit=FFFFFx1000h
    130. A000:022C                                                                  ; flags:G=1(4kb lim),B=1-32bits
    131. A000:022C                                                                  ; AVL=00-segment dis.for system
    132. A000:022C                                                                  ; software used;
    133. A000:022C                                                                  ; P=1-seg/enable in mem
    134. A000:022C                                                                  ; DPL=00-privilege level=0(high)
    135. A000:022C                                                                  ; S=1-code/data segment
    136. A000:022C                                                                  ; Type=0010-Data,EWA=010-Read/Write
    137. A000:022E BC 60 1C                                 mov     sp, 1C60h       ; set stack poit ss:sp=0000:1C60
    138. A000:0231 0E                                       push    cs              ; save cs=FED98000;????
    139. A000:0231
    прилагаю файлик, открывать в ИДе.
    Зы:А как файл прикрепить че-то никак не могу?
     
  6. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    aascut

    Немного о порте 0xCF8:

    Код (Text):
    1. X_Get_Ct:
    2. CONFIG_ADDR     EQU     0cf8h
    3.             mov     ax,8000H        ;enable PCI config.
    4.             shl     eax,16
    5.             mov     ax,cx
    6.             and     al,NOT 03h      ;32 bit access for PCI
    7.             mov     dx,CONFIG_ADDR  ;index is 0cf8h
    8.             out     dx,eax
    9.             add     dl,4            ;start from 0cfch
    10.             mov     al,cl
    11.             and     al,03h
    12.             add     dl,al           ;byte index to read
    13.             in      al,dx
    14.             ret
    15.  
    16. X_Set_Ct:
    17.             xchg    ax,cx
    18.             shl     ecx,16          ;save value
    19.             xchg    ax,cx           ;restore cx
    20.             mov     ax,8000H        ;enable PCI config.
    21.             shl     eax,16
    22.             mov     ax,cx
    23.             and     al,NOT 03h      ;32 bit access for PCI
    24.             mov     dx,CONFIG_ADDR  ;index is 0cf8h
    25.             out     dx,eax
    26.             add     dl,4            ;start from 0cfch
    27.             mov     al,cl
    28.             and     al,03h
    29.             add     dl,al           ;byte index to read
    30.             mov     eax,ecx
    31.             shr     eax,16
    32.             out     dx,al
    33.             ret
    При переключении по #SMI проц переключаецца на обработчег SMM, но вот память совершенно другая, хотя адреса совпадают с видео. Надо отметить что (примерно) A0000 (или A8000) - это уже переопределенный обработчик (дефолт - 30000h). В IDA грузить как обычно - как BIOS.
     
  7. acckiitvar

    acckiitvar Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    71
    30000 это видимо начальная точка инициализации SMM, я рассматривал этот вопрос достаточно много раз и всегда SMM убирается оттуда. Убирается он в 3 места:
    A_seg - a0000h - bffffh
    H_seg - feda0000 - fedbffffh
    T_seg - тут сложнее, n-ое число мегабайт до Top of memory вроде. (Могу путать), информация о том куда отображается коднахосится в регистрах PCI.
    так же определить адрес можно посмотрев таблицу дескрипторов, у меня машина тупо загружала дескриптор с базой h_seg. Для IDA SMM код надо грузить изначально как 16битный код.
    Вопрос затенения smm видеопамяти можете не ставить во главу угла, он появляется только когда код остается в A_seg.
     
  8. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    PSR1257II!
    acckiitvar!

    Спасибо за инфу!
    Вот это и мне никак не понять. Вот как я думаю. Когда проц переключился в SMM у него появляется своя память SMRAM куда он сохраняет свой контент. Эта память не возникает ниоткуда, эта таже DRAM только она не видна никому кроме проца. Проц эту SMRAM память видит как 0-FFFF:FFFF или нет. Или только узкий диапазон адресов 000A:0000-000B:FFFF. + Н segment +T-segment(если они определены)? или он видит только 0003:0000-00037FFF (000A:0000-000A:7FFF; FEDA0000-FEDA7FFF)как SMRAM. D мануалах Интела написано что проц имеет доступ ко всему адресному пространству в режиме SMM. В Этом адресном пространстве проц видит тот же код BIOS в DRAM памяти или оно для него пустое? Или процу кажется что оно пустое а в нем видно только SMI обработкик ? Извиняюсь за сумбур.
    Насчет PCI я в курсе, однако в моем вопросе был код который противоречит спецификации PCI, поэтому я и спросил, мож кто сталкивался.
    К примеру регистр 0CF9h: все знают, что он перезагружает систему (поправка не систему а процессор), а 0СF8h тогда что за штука может быть?
     
  9. acckiitvar

    acckiitvar Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    71
    SMRAM находится в озу по указанным мной адресам. И не доступна для процессора в любом режиме кроме смм. При попытке чтения вы увидите FF (кроме случая открытия памяти SMRAM, это возможно только патчем биос записи в 1 из регистров PCI. Извините что без конкретики, документации нет под рукой). Обычно операционная система даже и не подразумевает о наличии у нее SMRAM, поэтому туда и не пытается писать. Если же вы находитесь в SMI, то вы увидите там код и данные. Также вы увидите физическую память системы и то что в нее отображено, именно физическую, в Смм трансляция адресов, paging отключены. И вы можете внести изменения в память. Там стоит другой вопрос, что зная виртуальный адрес вы не знаете физический и вычислить его сложно. CR4 при входе в смм обнуляется.
    CF9 перезагружает систему? не знал. 0feh в 64h порт и нет системы. Через регистр CF8 указывается адрес на шине PCI куда будет обращение. Более подробно погугли, также почитай Салихана BIOS разработка, модификация, дизассемблирование.
     
  10. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    acckiitvar
    Совершенно верно. Но допустим мы используем плоскую(линейную) модель. Находимся в SMM, загружаем дескрипторы таблиц IDT, GDT, определяем сегменты. Вот эти сегменты отображается на физ.память так как определено в таблицах? Собственно в этом весь вопрос.
    Еще спрошу про РОНы- их состояние изменяется при входе, ну то есть можем ли мы быть уверены, что значения РОНов остануться прежними, как до входа в SMM или они тоже обнуляются?

    Ну да, в интелах так,только надо туда нужное значение записать, в АМД не знаю.
    Скачал Салихана, оказывается я его уже читал :), но видимо надо перечитать. Спасибо еще раз.
     
  11. acckiitvar

    acckiitvar Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    71
    Именно, если вы определите сегмент, то именно его и получите в озу. Вообще SMM это даже не знаю как сказать, помесь BRM с Unreal mode. то есть из реального режима можно исполнять код где хочешь и адресовать 4 Гб озу.
    Честно говоря не проверял, изменяется ли их состояние. Скорее всего да, вроде слышал что в eax, передается какой то параметр, но не факт. Знаю только что SMM прозрачен для системы, роны сохраняются и восстанавливаются при входе и выходе из SMM.
     
  12. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    Вот накопал тут кое что:
    CSE - Configuration Space Enable register
    Address 0CF8h
    default 0h
    Attributes of R / W
    bits 7:4 =0000 normal mode
    =1000 config mode, access to PCI read / write cycles
    3:1-number function is, for multi-function PCI devices
    So plug-in cards, for example, the a VGA and an Ethernet
    have, therefore, multiple PCI devices onto an address
    0 - reserved
    Can appeal to the area at all about C000 and to program the PCI devices must therefore bits 7 En- be set.
    TRC-turbo-reset control register
    Address 0CF9h
    default 0h
    Attributes of R / W
    bits 7:4 reserved
    3 -enable BIST, CPU self-test release
    2 -CPU reset, this bit is reset the CPU
    1 -CPU reset enable, chooses hard or soft reset
    0 - Deturbo mode is set, this bit can be a CPU mode Deturbo be triggered in conjunction
    with DFC (Deturbo-mode frequency control register) that is, the CPU by software
    down-clocked.
    FORW - Forward Register
    Addresse 0CFAh

    default 0h
    Attribute R/W
    bits 7:0 -PCI-Bus number, PCI bus number, the number of the bus' for system
    with more than one PCI bus. Is well on PCs
    hardly occur
     
  13. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    aascut

    ++
    - В SMI вы можете менять память PM/RM (прерванный код) а также менять (возвращать) любые значения в любых регистрах. И
    менно так и работает связь: сервисная DLL (example ~acpi.sys) <-> SMM Handler;
    - Код SMI не виден по дефолту но (как было сказано) читать его можно, например:

    call X_Ct_Disable_SMI_I810
    call X_Ct_Enable_APMC_I810
    call End_Pmi_Handler_I810
    call Ct_Open_SM_RAM_I810 ;Enable SMRAM to access
    call Get_SMI_Code

    X_Ct_Disable_SMI_I810 proc near
    mov cl,30h
    call X_Get_PMIO
    and al,not 1
    call X_Set_PMIO
    ret
    X_Ct_Disable_SMI_I810 endp
    X_Ct_Enable_APMC_I810 proc near
    mov cl,30h
    call X_Get_PMIO
    or al, 20h
    call X_Set_PMIO
    ret
    X_Ct_Enable_APMC_I810 endp
    End_Pmi_Handler_I815 proc near
    ;PM1 status
    mov cl,00h
    call X_Get_PMIO
    call X_Set_PMIO ;clear status

    mov cl,01h
    call X_Get_PMIO
    call X_Set_PMIO ;clear status

    ;GPE0 status
    mov cl,28h
    call X_Get_PMIO
    call X_Set_PMIO ;clear status

    mov cl,29h
    call X_Get_PMIO
    call X_Set_PMIO ;clear status


    ;GPE1 (GPI) status
    mov cl,2ch
    call X_Get_PMIO
    call X_Set_PMIO ;clear status

    mov cl,2dh
    call X_Get_PMIO
    call X_Set_PMIO ;clear status


    ;SMI status
    mov cl,34h
    call X_Get_PMIO
    call X_Set_PMIO ;clear status

    mov cl,35h
    call X_Get_PMIO
    call X_Set_PMIO ;clear status

    ;IOTRAP status
    mov cl,41h
    call X_Get_PMIO
    call X_Set_PMIO ;clear status

    mov cx,64h
    call X_Get_PMIO
    call X_Set_PMIO

    mov cx,65h
    call X_Get_PMIO
    call X_Set_PMIO
    ret
    End_Pmi_Handler_I815 endp
    ...
    ...

    - Если обработчег SMI установил бит запрещения чтения SMM памяти то нельзя открыть ее на чтение любыми средствами из не-SMM кода НО дампить ее все равно можно через всякие трики типа: SMM активно пользуется своим же BIOS'ом, зовет из него код. Далее достаточно перезаписать BIOS (не программатором конечно :) и форсировать #SMI - такой, что будет вызван именно этот участок BIOS;

    ...
     
  14. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    Праздники закончились -пора продолжить.
    acckiitvar
    PSR1257II
    Огромное спасибо за помощь. Однако ИДА оказалась бессильна перед SMM кодом PHOENIX 1998-2006. Вернее сказать не бессильна а импотентна. Не берет этот код, выдает полную ахинею. Ручками очень сложно править, да я и особо не знаю как. Может настройки в ИДЕ какие-то надо подправить.
    По поводу РОНов нашел все-таки инфу, что состояние их считается неопределенным при переходе, следовательно SMM-код их должен заново переопределить.
    Вот самое начало, дальше я так и не продвинулся:
    Код (Text):
    1. A000:0000                          ; ---------------------------------------------------------------------------
    2. A000:0000                          Second SMI HANDLER START: Attantion!!
    3. A000:0000                          all accesses to addresses FEDA0000-FEDABFFF
    4. A000:0000                          will be redirected to addresses 000A0000-000ABFFF
    5. A000:0000                          DS, ES, FS, GS, SS Selectors =0000H
    6. A000:0000                          DS, ES, FS, GS, SS Bases= 000000000H
    7. A000:0000                          DS, ES, FS, GS, SS Limits= 0FFFFFFFFH
    8. A000:0000                          ; ===========================================================================
    9. A000:0000
    10. A000:0000                          ; Segment type: Pure code
    11. A000:0000                          A000            segment byte public 'CODE' use16
    12. A000:0000                                          assume cs:A000
    13. A000:0000                          ; START OF FUNCTION CHUNK FOR sub_FAB8F
    14. A000:0000         assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing
    15. A000:0000
    16. A000:0000                          loc_A0000:                              ; CODE XREF: sub_FAB8F-E594EJ
    17. A000:0000 004 EB 11                                jmp     short loc_A0013 ; Jump
    18. A000:0000
    19. A000:0000                          ; END OF FUNCTION CHUNK FOR sub_FAB8F
    20. *пока читаемо, смотрим дальше:
    21.  ---------------------------------------------------------------------------
    22. A000:0013                          SMI HANDLER #2
    23. A000:0013                          ; START OF FUNCTION CHUNK FOR sub_FAB8F
    24. A000:0013
    25. A000:0013                          loc_A0013:         ; CODE XREF:        sub_FAB8F:loc_A0000j
    26. A000:0013 004 FA                cli                     ; Clear Interrupt Flag
    27. A000:0014
    28. A000:0014                          loc_A0014:         ; Load Interrupt Descriptor Table Register
    29. A000:0014                          db      66h         ; from address cs=FED98000+offset=8098;
    30. A000:0014 004 66 2E 0F 01 1E 98 80    lidt    fword ptr cs:byte_A8098 ;           FEDA0098=000A0098:                                     value=000000000000:
    31. A000:0014 004                                             ; IDT address base=0000:0000,limit=1 bytes
    32. A000:001B
    33. A000:001B  loc_A001B:                                  ; Load Global Descriptor Table Register
    34. A000:001B  db      66h                                  ; from address cs=FED98000+offset=8034;
    35. A000:001B 004 66 2E 0F 01 16 34 80  lgdt    fword ptr cs:byte_A8034 ;
    36.                                                                    = 000A0034:value=FEDA00400058:
    37. A000:001B 004                                             ; GDT address base=A000:0040,limit=58 bytes
    38. A000:001B                                                   ;
    39. A000:0022 004 0F 20 C0    mov     eax, cr0        ; Move to/from Special Registers
    40. A000:0025 004 0C 01        or      al, 1               ; Logical Inclusive OR
    41. A000:0027 004 0F 22 C0    mov     cr0, eax        ; Protect Mode Enable!
    42. A000:002A 004 66 EA 00 02 DA FE 08+    jmp     large far ptr 8:0FEDA0200h ;
    43.                                                                  
    44.                                                                      ; selector=08-#1(0-10) from GDT
    45. A000:002A 004 00                                             ; =00CF9F000000FFFF;
    46. A000:002A                                                       ; address base=00000000
    47. A000:002A                                                       ; limit FFFFFx1000
    48. A000:002A                                                       ; flags:G=1(4kb lim),D=1-32bits
    49. A000:002A                                                        ; AVL=00-segment dis.for system
    50. A000:002A                                                       ; software used;
    51. A000:002A                                                       ; P=1-seg/enable in mem
    52. A000:002A                                                       ; DPL=00-privilege level=0(high)
    53. A000:002A                                                       ; S=1-code/data segment
    54. A000:002A                                                       ; Type=1111-code,CDA=111-Execute/
    55. A000:002A                                                       ; Read-Only, conforming, accessed
    56. A000:002A                                                       ; jump to A000:0200
    57. A000:002A
    58. A000:002A                          ; END OF FUNCTION CHUNK FOR sub_FAB8F
    59. * здесь уже я вмешался ручками но пока минимально
    А дальше полный ужас:
    Код (Text):
    1. ИДА:
    2. A000:021C                          ; ---------------------------------------------------------------------------
    3. A000:021C
    4. A000:021C                          loc_A021C:                              ; CODE XREF: sub_FAB8F:loc_A0200j
    5. A000:021C 66 B8 10 00 8E D8    mov     eax, 0D88E0010h
    6. A000:0222 8E C0                     mov     es, ax          ; es=0010,selector=10-#2 in GDT
    7. A000:0222                                                          ; =00CF92000000FFFF:
    8. A000:0222                                                          ; address base=00000000
    9. A000:0222                                                                  ; limit=FFFFFx1000h
    10. A000:0222                                                                  ; flags:G=1(4kb lim),D=1-32bits
    11. A000:0222                                                                  ; AVL=00-segment dis.for system
    12. A000:0222                                                                  ; software used;
    13. A000:0222                                                                  ; P=1-seg/enable in mem
    14. A000:0222                                                                  ; DPL=00-privilege level=0(high)
    15. A000:0222                                                                  ; S=1-code/data segment
    16. A000:0222                                                                  ; Type=0010-Data,EWA=010-Read/Write
    17. A000:0222                                                                  ;
    18. A000:0224                         assume es:nothing, ds:nothing
    19. A000:0224 8E E8                mov     gs, ax                      ; gs=0010,selector=10-#2 in GDT
    20. A000:0224                                                                  ; =00CF92000000FFFF:
    21. A000:0224                                                                  ; address base=00000000
    22. A000:0224                                                                  ; limit=FFFFFx1000h
    23. A000:0224                                                                  ; flags:G=1(4kb lim),D=1-32bits
    24. A000:0224                                                                  ; AVL=00-segment dis.for system
    25. A000:0224                                                                  ; software used;
    26. A000:0224                                                                  ; P=1-seg/enable in mem
    27. A000:0224                                                                  ; DPL=00-privilege level=0(high)
    28. A000:0224                                                                  ; S=1-code/data segment
    29. A000:0224                                                                  ; Type=0010-Data,EWA=010-Read/Write
    30. A000:0224                                                                  ;
    31. A000:0226                          assume gs:nothing
    32. A000:0226 8E E0                  mov     fs, ax                     ; fs=0010,selector=10-#2 in GDT
    33. A000:0226                                                                  ; =00CF92000000FFFF:
    34. A000:0226                                                                  ; address base=00000000
    35. A000:0226                                                                  ; limit=FFFFFx1000h
    36. A000:0226                                                                  ; flags:G=1(4kb lim),D=1-32bits
    37. A000:0226                                                                  ; AVL=00-segment dis.for system
    38. A000:0226                                                                  ; software used;
    39. A000:0226                                                                  ; P=1-seg/enable in mem
    40. A000:0226                                                                  ; DPL=00-privilege level=0(high)
    41. A000:0226                                                                  ; S=1-code/data segment
    42. A000:0226                                                                  ; Type=0010-Data,EWA=010-Read/Write
    43. A000:0226                                                                  ;
    44. A000:0228                    assume fs:nothing
    45. A000:0228 66 B8 18 00 8E D0        mov     eax, 0D08E0018h
    46. A000:022E BC 60 1C                    mov     sp, 1C60h       ; set stack poit ss:sp=E000:1C60
    47. A000:022E
    48. A000:022E                          ; ---------------------------------------------------------------------------
    49. A000:0231 0E 00                                    dw 0Eh
    Моя интерпритация:
    Код (Text):
    1. A000:021C 66                       unk_A021C       db  66h ; f             ; CODE XREF: sub_FAB8F:loc_A0200j
    2. A000:021D                          ; ---------------------------------------------------------------------------
    3. A000:021D B8 10 00                    mov     ax, 10h
    4. A000:0220 8E D8                        mov     ds, ax          ; ds=0010,selector=10-#2 in GDT
    5. A000:0220                                                                  ; =00CF92000000FFFF:
    6. A000:0220                                                                  ; address base=00000000
    7. A000:0220                                                                  ; limit=FFFFFx1000h
    8. A000:0220                                                                  ; flags:G=1(4kb lim),D=1-32bits
    9. A000:0220                                                                  ; AVL=00-segment dis.for system
    10. A000:0220                                                                  ; software used;
    11. A000:0220                                                                  ; P=1-seg/enable in mem
    12. A000:0220                                                                  ; DPL=00-privilege level=0(high)
    13. A000:0220                                                                  ; S=1-code/data segment
    14. A000:0220                                                                  ; Type=0010-Data,EWA=010-Read/Write
    15. A000:0220                                                                  ;
    16. A000:0222                            assume ds:nothing
    17. A000:0222 8E C0                    mov     es, ax          ; es=0010,selector=10-#2 in GDT
    18. A000:0222                                                                  ; =00CF92000000FFFF:
    19. A000:0222                                                                  ; address base=00000000
    20. A000:0222                                                                  ; limit=FFFFFx1000h
    21. A000:0222                                                                  ; flags:G=1(4kb lim),D=1-32bits
    22. A000:0222                                                                  ; AVL=00-segment dis.for system
    23. A000:0222                                                                  ; software used;
    24. A000:0222                                                                  ; P=1-seg/enable in mem
    25. A000:0222                                                                  ; DPL=00-privilege level=0(high)
    26. A000:0222                                                                  ; S=1-code/data segment
    27. A000:0222                                                                  ; Type=0010-Data,EWA=010-Read/Write
    28. A000:0222                                                                  ;
    29. A000:0224                    assume es:nothing
    30. A000:0224 8E E8                  mov     gs, ax          ; gs=0010,selector=10-#2 in GDT
    31. A000:0224                                                                  ; =00CF92000000FFFF:
    32. A000:0224                                                                  ; address base=00000000
    33. A000:0224                                                                  ; limit=FFFFFx1000h
    34. A000:0224                                                                  ; flags:G=1(4kb lim),D=1-32bits
    35. A000:0224                                                                  ; AVL=00-segment dis.for system
    36. A000:0224                                                                  ; software used;
    37. A000:0224                                                                  ; P=1-seg/enable in mem
    38. A000:0224                                                                  ; DPL=00-privilege level=0(high)
    39. A000:0224                                                                  ; S=1-code/data segment
    40. A000:0224                                                                  ; Type=0010-Data,EWA=010-Read/Write
    41. A000:0224                                                                  ;
    42. A000:0226                                          assume gs:nothing
    43. A000:0226 8E E0                                    mov     fs, ax          ; fs=0010,selector=10-#2 in GDT
    44. A000:0226                                                                  ; =00CF92000000FFFF:
    45. A000:0226                                                                  ; address base=00000000
    46. A000:0226                                                                  ; limit=FFFFFx1000h
    47. A000:0226                                                                  ; flags:G=1(4kb lim),D=1-32bits
    48. A000:0226                                                                  ; AVL=00-segment dis.for system
    49. A000:0226                                                                  ; software used;
    50. A000:0226                                                                  ; P=1-seg/enable in mem
    51. A000:0226                                                                  ; DPL=00-privilege level=0(high)
    52. A000:0226                                                                  ; S=1-code/data segment
    53. A000:0226                                                           ; Type=0010-Data,EWA=010-Read/Write
    54. ---------------------------------------------------------------------------
    55. A000:0228                                          assume fs:nothing
    56. A000:0228 66                                       db  66h ; f
    57. A000:0229                          ; ---------------------------------------------------------------------------
    58. A000:0229 B8 18 00               mov     ax, 18h
    59. A000:022C 8E D0                   mov     ss, ax          ; selector=0011=#3(0-10)in GDT
    60. A000:022C                                                                  ; =00CF92000000FFFF:
    61. A000:022C                                                                  ; address base=00000000
    62. A000:022C                                                                  ; limit=FFFFFx1000h
    63. A000:022C                                                                  ; flags:G=1(4kb lim),B=1-32bits
    64. A000:022C                                                                  ; AVL=00-segment dis.for system
    65. A000:022C                                                                  ; software used;
    66. A000:022C                                                                  ; P=1-seg/enable in mem
    67. A000:022C                                                                  ; DPL=00-privilege level=0(high)
    68. A000:022C                                                                  ; S=1-code/data segment
    69. A000:022C                                                                  ; Type=0010-Data,EWA=010-Read/Write
    70. A000:022E BC 60 1C                 mov     sp, 1C60h       ; set stack poit ss:sp=E000:1C60
    71. A000:022E
    72.       ---------------------------------------------------------------------------
    73. A000:0231 0E 00                                    dw 0Eh
    74. A000:0233 66                                       db  66h ; f             ; 32-bit registers
     
  15. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Т.к. переход в 32-битный код, тебе надо создать 32-битный сегмент начиная с A0200, с базой 0. Ида пытается дизассемблировать код как 16-битный и естественно получается бред.
     
  16. acckiitvar

    acckiitvar Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    71
    А вы уверены что точка входа SMI в а0000h? а не в а8000??
     
  17. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    reverser Огромное мерси, гениально,
    действительно помогло!!!
    acckiitvar Да именно так.
    Перед первым заходом в SMM Биос создает в памяти DRAM такой сегмент по адресу 3000:8000:
    Код (Text):
    1. Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
    2.  
    3. 00000000   66 2E C7 06 F8 FE 00 80  D9 FE BA 34 10 66 B8 20   f.Ç øþ ?Ùþº4 f¸
    4. 00000010   00 00 00 66 EF BA 30 10  ED 0D 02 00 EF 0F AA 66      fïº0 í   ï ªf
    Собственно- это обработчик первый (умолчальный) SMI#:
    Код (Text):
    1. _3000:8000                          ; ---------------------------------------------------------------------------
    2. _3000:8000                          ; ===========================================================================
    3. _3000:8000
    4. _3000:8000                          ; Segment type: Pure code
    5. _3000:8000                          _3000           segment byte public 'CODE' use16
    6. _3000:8000                                          assume cs:_3000
    7. _3000:8000                                          ;org 8000h
    8. _3000:8000                          ; START OF FUNCTION CHUNK FOR sub_FAB8F
    9. _3000:8000                                          assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing
    10. _3000:8000
    11. _3000:8000                          loc_38000:                              ; CODE XREF: sub_FAB8F-E59D6J
    12. _3000:8000 004 66 2E C7 06 F8 FE 00+                mov     cs:dword_3FEF8, 0FED98000h ; SMBASE =FED98000
    13. _3000:800A 004 BA 34 10                             mov     dx, 1034h
    14. _3000:800D 004 66 B8 20 00 00 00                    mov     eax, 20h ; ' '
    15. _3000:8013 004 66 EF                                out     dx, eax         ; write eax=00000020 to
    16. _3000:8013                                                                  ; reg.off.34-37(BASE:1000)
    17. _3000:8013                                                                  ; PM SMI# STS register bits:
    18. _3000:8013                                                                  ; bit5=1-Bios clear APM_STS bit;
    19. _3000:8013                                                                  ;      ->0
    20. _3000:8013                                                                  ;
    21. _3000:8015 004 BA 30 10                             mov     dx, 1030h
    22. _3000:8018 004 ED                                   in      ax, dx          ; read reg.off.30-31(BASE:1000)
    23. _3000:8018                                                                  ; PM SMI# control&enable reg.
    24. _3000:8018                                                                  ; ax=
    25. _3000:8018                                                                  ;
    26. _3000:8019 004 0D 02 00                             or      ax, 2           ; set bit1=1
    27. _3000:801C 004 EF                                   out     dx, ax          ; write ax=xxxxxxx1xb to
    28. _3000:801C                                                                  ; reg.off.30-31(BASE:1000)
    29. _3000:801C                                                                  ; bit1=1-EOS,SMI# will be
    30. _3000:801C                                                                  ; de-asserted for 4-PCI Clocks
    31. _3000:801C                                                                  ; and Proc.will
    32. _3000:801D 004 0F AA                                rsm                     ; jump far 1000:51BB
    33. _3000:801D
    34. _3000:801F                                          db      66h
    35. _3000:801F 004 66 00 00                             add     [bx+si], al     ; Add
    36. _3000:801F
    37. _3000:801F                          ; END OF FUNCTION CHUNK FOR sub_FAB8F
    Кажись не ошибся, этот обработчик меняет базу и только, а второй (обработчик)уже лезет в сегмент A000 на который стоит редирект в регистре MCH.
     
  18. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    Появился свет в конце туннеля! Близок к разгадке, но надо еще кое-что проверить!
    "Истина где-то рядом"(С).Еще раз убеждаюсь в том, что нет мелочей, всяк бит в коде архи-важен!

    Добавление:
    Пришлось вернуться в самое начало бут-блока F000, где я прошелся по верхам и, по незнанию, проигнорировал некоторые моменты, а там все это прописано было:
    Код (Text):
    1. F000:4ACD                          ; ---------------------------------------------------------------------------
    2. F000:4ACD                          Super IO chip programm turn
    3. F000:4ACD
    4. F000:4ACD                          SIOi:                                   ; CODE XREF: F000:429FJ
    5. F000:4ACD BA 2E 00                           mov   dx, 2Eh ; '.'
    6. F000:4AD0 B0 55                              mov   al, 55h ; 'U'
    7. F000:4AD2 EE                                 out   dx, al
    8. F000:4AD3 EE                                 out   dx, al      ; ENTER CONFIGURATION MODE:
    9. ......
    10.  
    11. и вот оно родимое:
    12. F000:4AF2 B4 09                              mov   ah, 9
    13. F000:4AF4 BA 2E 00                           mov   dx, 2Eh ; '.'
    14. F000:4AF7 B0 07                              mov   al, 7
    15. F000:4AF9 EE                                 out   dx, al
    16. F000:4AFA 42                                 inc   dx             ; Increment by 1
    17. F000:4AFB 8A C4                              mov   al, ah
    18. F000:4AFD EE                                 out   dx, al         ; write 09 to reg.#07:
    19. F000:4AFD                                                             ; select Logical Device #9
    20. F000:4AFD                                                             ;
    21. F000:4AFE BA 2E 00                           mov   dx, 2Eh ; '.'
    22. F000:4B01 B0 30                              mov   al, 30h ; '0'
    23. F000:4B03 EE                                 out   dx, al          ; Logical Device #9,reg#30:
    24. F000:4B04 42                                 inc   dx               ; Increment by 1
    25. F000:4B05 B0 01                              mov   al, 1
    26. F000:4B07 EE                                 out   dx, al          ; write 01 to reg.30-
    27. F000:4B07                                                              ; activate Logical Device #9
    28. F000:4B07                                                              ; -Mailbox Registers
    29. F000:4B08 B8 10 09                           mov   ax, 910h
    30. F000:4B0B BA 2E 00                           mov   dx, 2Eh ; '.'
    31. F000:4B0E B0 60                              mov   al, 60h ; '`'
    32. F000:4B10 EE                                 out   dx, al           ; Config mode:  Logical Device #9
    33. F000:4B10                                                               ; -Mailbox Registers
    34. F000:4B11 42                                 inc   dx                ; Increment by 1
    35. F000:4B12 8A C4                              mov   al, ah        ; al=09;
    36. F000:4B14 EE                                 out   dx, al            ; write I/O base address bits 15:8
    37. F000:4B14                                                                ; al=09
    38. F000:4B15 B8 10 09                           mov   ax, 910h
    39. F000:4B18 8A E0                              mov   ah, al         ; ah=10
    40. F000:4B1A BA 2E 00                           mov   dx, 2Eh ; '.'
    41. F000:4B1D B0 61                              mov   al, 61h ; 'a'
    42. F000:4B1F EE                                 out   dx, al            ; write I/O base address bits 7:0
    43. F000:4B20 42                                 inc   dx                 ; Increment by 1
    44. F000:4B21 8A C4                              mov   al, ah
    45. F000:4B23 EE                                 out   dx, al            ; write I/O base address bits 7:0
    46. F000:4B23                                                                ; al=10
    47. F000:4B23                                                                ; Base address for Mailbox
    48. F000:4B23                                                                ; (Logical device#9)=910h
    Т.е. южник по LPC общается с SIO через так называемые регистры "почтовые ящики" , которые находятся в SIO(чип LPC47N354 в моем случае):
    регистр 82h-входящая почта для 8051, регистр 83h-исходящая от 8051 для ICH. Порт 910h - index, 911h-data.
    Ура-ура!!! Теперь бы понять что они друг дружке шепчут.
     
  19. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    Поправьте если я заблуждаюсь. Согласно мануалу, при записи в майлбокс регистр, ЮМ выставляет прерывание 1 для 8051. Поковырявшись в прошивке нашел обработчик прерываний для 8051 (INT1). А так как я вообще не знаком с особенностями 8051, то расшифровать код дюже трудно. Единственное, что понятно- это регистры 7Fxx по мануалу можно расшифровать. И еще когда ЮМ записывает в 8051 команду (например 04h )- 8051 ее считывает и сбрасывает прерывание. Два порта один для записи команды в 8051 MBX82 , он же 7F08, чтение команды для ICH от 8051 происходит из MBX83, он же 7F09. Остальные майлбоксы MBX84-MBX91 (они же 7F0A-7F17 в 8051) и MBXA0-MBXAF (они же 7F70-7F7F в 8051) используются для передачи данных.
    Вопрос как интерпритировать команды ЮМ?
    Вот кусок кода обработчика:
    Код (Text):
    1. ; public IE1
    2. IE1:                    ; External Interrupt 1
    3. ljmp    code_164
    4. ...
    5. code_164:               ; Interrupt Enable Register
    6. clr     EA
    7. anl     RESERVED00D8, #0x20 ; RESERVED
    8. clr     TR1             ; Timer 0/1 Control Register
    9. clr     ET1             ; Interrupt Enable Register
    10. clr     ET1             ; Interrupt Enable Register
    11. ;читаем майлбокс #84:
    12. mov     DPTR, #0x7F0A   ; Move (Op1 <- Op2)
    13. movx    A, @DPTR        ; Move from/to external RAM
    14. Сравниваем с F1h:
    15. cjne    A, #0xF1, code_182 ; '¸' ;
    16. Если не равно прыгаем->
    17. code_182:               ; Interrupt Enable Register
    18. mov     IE, #0
    19. mov     IP, #0          ; Interrupt Priority Register
    20. mov     TCON, #0        ; Timer 0/1 Control Register
    21. mov     T2CON, #0       ; Timer 2 Control Register
    22. mov     RESERVED00D8, #0 ; RESERVED
    23. mov     RESERVED0091, #0 ; RESERVED
    24. mov     DPTR, #0x7F01   ; Move (Op1 <- Op2)
    25. mov     A, #0xFF        ; Move (Op1 <- Op2)
    26. movx    @DPTR, A        ; Move from/to external RAM
    27. ;8051 Interrupt 1 Mask Register:
    28. mov     DPTR, #0x7F03   ; Move (Op1 <- Op2),
    29. mov     A, #0xFF        ; Move (Op1 <- Op2)
    30. movx    @DPTR, A        ; Move from/to external RAM
    31. mov     DPTR, #0x7F2C   ; Move (Op1 <- Op2)
    32. mov     A, #0xFF        ; Move (Op1 <- Op2)
    33. movx    @DPTR, A        ; Move from/to external RAM
    34. mov     DPTR, #0x7F2D   ; Move (Op1 <- Op2)
    35. mov     A, #0xFF        ; Move (Op1 <- Op2)
    36. movx    @DPTR, A        ; Move from/to external RAM
    37. mov     DPTR, #0x7F5A   ; Move (Op1 <- Op2)
    38. mov     A, #0xFF        ; Move (Op1 <- Op2)
    39. movx    @DPTR, A        ; Move from/to external RAM
    40. mov     DPTR, #0x7F5F   ; Move (Op1 <- Op2)
    41. mov     A, #0xFF        ; Move (Op1 <- Op2)
    42. movx    @DPTR, A        ; Move from/to external RAM
    43. mov     DPTR, #0x7F66   ; Move (Op1 <- Op2)
    44. mov     A, #0xFF        ; Move (Op1 <- Op2)
    45. movx    @DPTR, A        ; Move from/to external RAM
    46. mov     DPTR, #0x7F65   ; Move (Op1 <- Op2)
    47. mov     A, #0xFF        ; Move (Op1 <- Op2)
    48. movx    @DPTR, A        ; Move from/to external RAM
    49. mov     DPTR, #0x7F56   ; Move (Op1 <- Op2)
    50. mov     A, #0xFF        ; Move (Op1 <- Op2)
    51. movx    @DPTR, A        ; Move from/to external RAM
    52. mov     DPTR, #0x7F2A   ; Move (Op1 <- Op2)
    53. mov     A, #0xFF        ; Move (Op1 <- Op2)
    54. movx    @DPTR, A        ; Move from/to external RAM
    55. mov     DPTR, #0x7F2B   ; Move (Op1 <- Op2)
    56. mov     A, #0xFF        ; Move (Op1 <- Op2)
    57. movx    @DPTR, A        ; Move from/to external RAM
    58. mov     DPTR, #0x7F59   ; Move (Op1 <- Op2)
    59. mov     A, #0xFF        ; Move (Op1 <- Op2)
    60. movx    @DPTR, A        ; Move from/to external RAM
    61. mov     DPTR, #0x7F5E   ; Move (Op1 <- Op2)
    62. mov     A, #0xFF        ; Move (Op1 <- Op2)
    63. movx    @DPTR, A        ; Move from/to external RAM
    64. mov     DPTR, #0x7F63   ; Move (Op1 <- Op2)
    65. mov     A, #0xFF        ; Move (Op1 <- Op2)
    66. movx    @DPTR, A        ; Move from/to external RAM
    67. mov     DPTR, #0x7F64   ; Move (Op1 <- Op2)
    68. mov     A, #0xFF        ; Move (Op1 <- Op2)
    69. movx    @DPTR, A        ; Move from/to external RAM
    70. mov     DPTR, #0x7F55   ; Move (Op1 <- Op2)
    71. mov     A, #0xFF        ; Move (Op1 <- Op2)
    72. movx    @DPTR, A        ; Move from/to external RAM
    73. mov     DPTR, #0x7F00   ; Move (Op1 <- Op2)
    74. mov     A, #0xFF        ; Move (Op1 <- Op2)
    75. movx    @DPTR, A        ; Move from/to external RAM
    76. mov     DPTR, #0x7F02   ; Move (Op1 <- Op2)
    77. mov     A, #0xFF        ; Move (Op1 <- Op2)
    78. movx    @DPTR, A        ; Move from/to external RAM
    79. mov     DPTR, #0x7F19   ; Move (Op1 <- Op2)
    80. clr     A               ; Clear Operand (0)
    81. movx    @DPTR, A        ; Move from/to external RAM
    82. mov     DPTR, #0x7F1C   ; Move (Op1 <- Op2)
    83. clr     A               ; Clear Operand (0)
    84. movx    @DPTR, A        ; Move from/to external RAM
    85. mov     DPTR, #0x7F1F   ; Move (Op1 <- Op2)
    86. clr     A               ; Clear Operand (0)
    87. movx    @DPTR, A        ; Move from/to external RAM
    88. mov     P0, #0          ; Port 0
    89. mov     P1, #0          ; Port 1
    90. mov     DPTR, #0x7FA2   ; Move (Op1 <- Op2)
    91. clr     A               ; Clear Operand (0)
    92. movx    @DPTR, A        ; Move from/to external RAM
    93. mov     DPTR, #0x7FA5   ; Move (Op1 <- Op2)
    94. clr     A               ; Clear Operand (0)
    95. movx    @DPTR, A        ; Move from/to external RAM
    96. mov     DPTR, #0x7FA8   ; Move (Op1 <- Op2)
    97. clr     A               ; Clear Operand (0)
    98. movx    @DPTR, A        ; Move from/to external RAM
    99. clr     P03             ; Port 0
    100. mov     DPTR, #0x7FA5   ; Move (Op1 <- Op2)
    101. movx    A, @DPTR        ; Move from/to external RAM
    102. clr     ACC4            ; Accumulator
    103. movx    @DPTR, A        ; Move from/to external RAM
    104. mov     DPTR, #0x7F3E   ; Move (Op1 <- Op2)
    105. movx    A, @DPTR        ; Move from/to external RAM
    106. setb    ACC1            ; Accumulator
    107. movx    @DPTR, A        ; Move from/to external RAM
    108. mov     DPTR, #0x7F22   ; Move (Op1 <- Op2)
    109. movx    A, @DPTR        ; Move from/to external RAM
    110. clr     ACC6            ; Accumulator
    111. movx    @DPTR, A        ; Move from/to external RAM
    112. setb    P05             ; Port 0
    113. mov     DPTR, #0x7FA8   ; Move (Op1 <- Op2)
    114. movx    A, @DPTR        ; Move from/to external RAM
    115. setb    ACC3            ; Accumulator
    116. movx    @DPTR, A        ; Move from/to external RAM
    117. mov     R7, #0x3E ; '>' ; Move (Op1 <- Op
    118. .....
    119. + еще куски большие , задержки какие-то и т.д. -результат:
    120.  
    121. code_37D:               ; Port 1
    122. setb    P1.7
    123. mov     R5, #4          ; Move (Op1 <- 4
    124. ..
    125. ÷
    126. code_381:               ; Decrement Operand and JNZ
    127. djnz    R5, code_381
    128. ..
    129. clr     P1.7            ; Port 1
    130. mov     R5, #4          ; Move (Op1 <- O
    131. ..
    132. djnz    R6, code_37D    ; Decrement Oper
    133. ...
    134. mov     DPTR, #0x393    ; Move (Op1 <- Op2)
    135. push    DPL             ; Data Pointer, Low Byte
    136. push    DPH             ; Data Pointer, High Byte
    137. reti                    ; Return from Interrupt
    138. ; End of function RESET
    Извиняюсь за сумбур,но че-то сомневаюсь, что я правильно настроил ИДУ, и интерпритировать код мне сложно, поможите если сможете.
    Да, еще прошу помощи так как ИДА выдала код в графах, что непривычно и неудобно читать, как избавиться от сего?
     
  20. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    aascut
    В контекстном меню "Text View".