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
(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.
.