Home   -   Gallery   Geology   Music   Software   Hiking   Links   Sport   What?  
Projects   Sources   V4   Flightsim   Joystick   Workshop  
1   2   3   4   5   6   7   8   Anl  
A   B   C   D   E   F   G   H   I   J   K   L   M   N   O  
Page 359 of 401
 <   > 

Anlage K zum Joystick-Papier

(K)   Disassembler-Listing INT 15H Funktion 84H

(Ehemalige Datei _980718a.htm n.c.m. # 19980718.0100-0500)

N i c h t   f e r t i g

Vorüberlegung - wozu so ein Listing? Obwohl DOS-Code, ist das Listing für Windows insofern interessant, als in der Windows-API die Funktion joyGetPosEx() womöglich lediglich eine Software-Ebene höher liegt, nicht aber eine Intelligenz-Ebene. Es ist zu vermuten, daß der alten Real-Mode-BIOS-Interrupt funktional voll identisch, ins Protected-Mode-Win32-API übernommen wurde. Aber das ist Spekulation. CHECK - was steckt hinter joyGetPosEx()?

... Code ist mit dem Befehlszeilen-Debugger debug.exe schlecht zu verfolgen ... nicht bis zum Kern der Sache (Funktion 84H) vorgedrungen. ... Projekt vertagen, bis einmal günstig ein strapazierfähiges DOS-Environment greifbar ist ... d.h. Compiler für TSR-Programmierung mit Tracer ... dann in die ISR einhängen und tracen ...

(Vergleiche Kursunterlagen 1993)

 


(1)   Adresse des Interrupt-Vektors ausrechnen:

              15H * 4 = 54H

(2)   Die 4 Bytes ab Adresse 0000:0054 lesen.

(2.1)   Debug.exe vom DOS-Prompt aus starten.

(2.2)   Ausgabe nach dem Befehl "d0000:0054" bzw. "d0:54"


--------------------------------------------------------------------------------
-d0:54
0000:0050 40 02 74 06-2D 04 70 00 28 0A BD 06 @.t.-.p.(...
0000:0060 A4 E7 00 F0 2F 00 D1 09-6E FE 00 F0 04 06 BD 06 ..../...n.......
0000:0070 1D 00 00 C8 A4 F0 00 F0-22 05 00 00 40 42 00 C0 ........"...@B..
0000:0080 A8 0F C8 00 A0 04 BD 06-4F 03 00 0F 8A 03 00 0F ........O.......
0000:0090 17 03 00 0F BC 0F C8 00-C6 0F C8 00 D0 0F C8 00 ................
0000:00A0 6F 10 C8 00 66 04 70 00-B4 05 BD 06 6F 10 C8 00 o...f.p.....o...
0000:00B0 6F 10 C8 00 6F 10 C8 00-62 01 18 0D CC 01 19 0D o...o...b.......
0000:00C0 EA E4 0F C8 00 EF 00 F0-6F 10 C8 00 01 00 8E 0C ........o.......
0000:00D0 6F 10 C8 00 o... -
--------------------------------------------------------------------------------

(2.3)   Die vier Bytes sind:

            "40H, 02H, 74H, 06H".

(3)  Daraus Adresse der ISR (Interrupt-Service-Routine) ausrechnen bzw. zusammenstellen:

            "0674:0240"

(4)  Ab Beginn der ISR Disassembler-Zeilen ausgeben und dabei sofort analysieren. Was überhaupt ausgegeben werden muß, stellt sich nämlich immmer erst Zeile für Zeile heraus (Sprünge). Finde heraus wo der relevante Code steckt!

Bildschirm-Auszug nach dem debug-Befehl "u674:240":

-----------------------------------------------------------
-u674:240
0674:0240 80FC88        CMP     AH,88                  ;  1  ======<
0674:0243 740A          JZ      024F                   ;  2
0674:0245 80FC87        CMP     AH,87                  ;  3
0674:0248 740A          JZ      0254                   ;  4
0674:024A 2E            CS:                            ;  5
0674:024B FF2E1E00      JMP     FAR [001E]             ;  6  ======>
0674:024F 2E            CS:                            ;  7
0674:0250 A13900        MOV     AX,[0039]              ;  8
0674:0253 CF            IRET                           ;  9
0674:0254 FA            CLI                            ; 10
0674:0255 83EC04        SUB     SP,+04                 ; 11
0674:0258 60            DB      60                     ; 12
0674:0259 E88101        CALL    03DD                   ; 13
0674:025C 8BEC          MOV     BP,SP                  ; 14
0674:025E 894612        MOV     [BP+12],AX             ; 15
-----------------------------------------------------------

- 1:   Ist es Funktion 88? (Speichergröße über 1 MByte ermitteln)

- 2:   Wenn ja, hüpfe nach 024F (Zeile 7)

- 3:   Ist es Funktion 87? (Speicherbereiche verschieben)

- 4:   Wenn ja hüpfe nach 0254 (Zeile 10)

- 5:   ... modifiziert nächsten Befehl ...

- 6:   Springe Zur Far-Adresse, die Du an Adresse [001E] findest.

- 7:   Der hier folgende Code ist normalerweise uninteressant, denn fort geht es weiter ist nicht unser Programmfaden. Trotzdem ein Blick darauf. Der Code ist passend zur Situation - ein weiteres Indiz dafür, daß hier tatsächlich die richtigen Zeilen untersucht werden (dafür braucht man ständig wieder Anhaltspunkte!). Außerdem: Hier ist das Sprungziel aus Zeile 2, als von Funktion 88H (Speichergröße über 1 MByte ermitteln). Macht den die gar nichts? Das scheint hier jedenfalls ein BIOS zu sein, das die Funktion nicht unterstützt. Die Funktion 88H soll in AX die Größe des Speichers zurückgeben. ... aber der Code hier macht das nicht - komisch ...

- 8:   Register AX mit dem Wert von Adresse [0039] füllen. Die INT-15 Interrupts geben ihre Parameter meist in AL und AH zurück. Aha! Hier scheint so eine Art Rücksprungzentrale zu sein. Mal sehen, ob wir am Ende vielleicht wieder hier landen.

- 9:   Irgendeine ISR, womöglich unsere eigene, ist fertig und kehrt jetzt zurück zum Aufrufer, z.B. zum eben unterbrochenen Vordergrundprogramm.

- 10:   Hier ist das Sprungziel des Jumps aus Zeile 4 (Funktion Speicherbereiche verschieben). Mit einem für kritische Routinen typischen CLI geht es gleich zur Sache.

- 11:   ... die Funktion scheint dann schon etwas richtiges zu arbeiten, ist uninteressant, ist nicht unser Programmfaden ...

- 12:   ...

Zum Sprungadresse herausfinden Befehl "-d674:1e" als Zwischenschritt Detailerklärung weggelassen :

-------------------------------------------------------------------------------
-d674:1e
0674:0010                                            8E 02                 ..
0674:0020  74 06 89 06 0B 02 F6 03-70 00 01 01 01 01 00 01   t.......p.......
0674:0030  00 00 00 02 00 00 00 00-00 00 00 00 00 00 00 03   ................
0674:0040  00 00 00 00 01 5D C8 2E-89 1E 16 00 2E 8C 06 18   .....]..........
0674:0050  00 CB 53 1E 2E C5 1E 16-00 80 7F 02 10 C7 47 03   ..S...........G.
0674:0060  00 01 76 05 81 4F 03 03-80 1F 5B CB FB 80 FC 43   ..v..O....[....C
0674:0070  75 31 0A C0 75 03 B0 80-CF 3C 10 75 06 0E 07 BB   u1..u....<.u....
0674:0080  CF 00 CF 3C 08 75 0D 8A-C4 2E 8A 3E 32 00 2E 8A   ...<.u.....>2...
0674:0090  1E 44 00 CF 3C 09 75 0B-8A C4 2E 8E 06 81         .D..<.u.......
-
-------------------------------------------------------------------------------

Die Bytes mit der Sprungadresse:

            "8E 02 74 06"

Sprungadresse ist also: "0674:028E"

Jetzt weiter den Code verfolgen mit "u674:28E"

-------------------------------------------------------------------------------
-u674:28E
0674:028E 3D01E8        CMP     AX,E801        ;  7 - Funktion E8H?    <===
0674:0291 7405          JZ      0298           ;  8 -
0674:0293 2E            CS:                    ;  9 -
0674:0294 FF2E2600      JMP     FAR [0026]     ; 10 - Springe nach x ==>
0674:0298 9C            PUSHF                  ; 11 -
0674:0299 2E            CS:                    ; 12 -
0674:029A FF1E2600      CALL    FAR [0026]     ; 13 -
0674:029E 33DB          XOR     BX,BX          ; 14 -
0674:02A0 2E            CS:                    ; 15 -
0674:02A1 391E2000      CMP     [0020],BX      ; 16 -
0674:02A5 7404          JZ      02AB           ; 17 -
0674:02A7 2E            CS:                    ; 18 -
0674:02A8 A13900        MOV     AX,[0039]      ; 19 -
0674:02AB CF            IRET                   ; 20 -
0674:02AC 0000          ADD     [BX+SI],AL     ; 21 -
-
-------------------------------------------------------------------------------

Sprungziel von Zeile 10 herausfinden ... ähnliche Prozedur wie oben ...

-------------------------------------------------------------------------------
-d674:26
0674:0020                    F6 03-70 00 01 01 01 01 00 01         ..p.......
0674:0030  00 00 00 02 00 00 00 00-00 00 00 00 00 00 00 03   ................
0674:0040  00 00 00 00 01 5D C8 2E-89 1E 16 00 2E 8C 06 18   .....]..........
0674:0050  00 CB 53 1E 2E C5 1E 16-00 80 7F 02 10 C7 47 03   ..S...........G.
0674:0060  00 01 76 05 81 4F 03 03-80 1F 5B CB FB 80 FC 43   ..v..O....[....C
0674:0070  75 31 0A C0 75 03 B0 80-CF 3C 10 75 06 0E 07 BB   u1..u....<.u....
0674:0080  CF 00 CF 3C 08 75 0D 8A-C4 2E 8A 3E 32 00 2E 8A   ...<.u.....>2...
0674:0090  1E 44 00 CF 3C 09 75 0B-8A C4 2E 8E 06 81 01 BB   .D..<.u.........
0674:00A0  00 C0 CF FA 2E FF                                 ......
-
-------------------------------------------------------------------------------

Sprungziel: "0070:03F6"

Ins Visier nehmen:

-------------------------------------------------------------------------------
-u70:03f6
0070:03F6 80FC4F        CMP     AH,4F          ; 11 - Funktion 4F?
0070:03F9 752D          JNZ     0428           ; 12 - Wenn nicht, dann jump 0428
0070:03FB EB0C          JMP     0409
0070:03FD 3C01          CMP     AL,01
0070:03FF 7508          JNZ     0409
-------------------------------------------------------------------------------

Also 0428 anschauen ... (oder bei 0674:0428?)

-------------------------------------------------------------------------------
-u70:428
0070:0428 2E            CS:                   ; 13 -
0070:0429 FF2E0B01      JMP     FAR [010B]    ; 14 -
0070:042D FB            STI
0070:042E 9C            PUSHF
-------------------------------------------------------------------------------

Nachschauen ...

-------------------------------------------------------------------------------
-d0674:010b
0674:0100                                   00 75 05 52 E8              .u.R.
0674:0110  77 00 5A 0E FF 16 14 00-80 3E 30 00 00 74 09 58   w.Z......>0..t.X
-------------------------------------------------------------------------------

Aha ... Sprungziel "5205:7500" - ... das gibts doch nicht?! (bzw. bei 0674:0428 steht Sprungziel E864:E6D1) auch unwahrscheinlich. Leichtsinnsfehler bei der Hüpferei, oder was?

-------------------------------------------------------------------------------

(6)     Inhaltliche Analyse.

Das geht erst, wenn formal die Sprung-Struktur genau verstanden ist. Sonst weiß man ja gar nicht, wo der Code ist.

 

Vorläufig Ende der Tour.

.