home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / grafik / tiftool / biosdump.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-12-10  |  21.2 KB  |  723 lines

  1.  
  2. PROGRAM BIOSDUMP;
  3. { DUMP DER BIOS- VARIABLEN }
  4.  
  5.  
  6. USES  DOS,SELECTD,TPCRT,{DISPLAY,}TPSTRING,TPWINDOW;
  7.  
  8.  
  9. TYPE  BUFFERTYP = ARRAY[0..255] OF BYTE;
  10.  
  11.  
  12. CONST BI     = $40;
  13.       TANORM = $07;
  14.       TATBUF = $0B;
  15.       TAUNGL = $0F;
  16.  
  17.       OMODE  : BYTE = 1;
  18.       DEFATT : BYTE = $07;
  19.  
  20.  
  21. VAR   I,J,K          : INTEGER;
  22.       TBM,DUMPEND    : WORD;
  23.       CH,CH1         : CHAR;
  24.       B,TA,XP,CURS,
  25.       CE,AVP,ADF     : BYTE;
  26.       FILEDA,DKOPF   : BOOLEAN;
  27.       HELPWIN        : WINDOWPTR;
  28.       BRAM           : BUFFERTYP ABSOLUTE BI:0;
  29.       BRAM5          : BUFFERTYP ABSOLUTE $50:0;
  30.       BRAM6          : BUFFERTYP ABSOLUTE $60:0;
  31.       BRAM7          : BUFFERTYP ABSOLUTE $70:0;
  32.       BUF,RBUF       : BUFFERTYP;
  33.       F              : FILE OF BUFFERTYP;
  34.  
  35.  
  36. PROCEDURE OCHAR(C:CHAR);
  37. VAR   B   : BYTE ABSOLUTE C;
  38.       I,J : BYTE;
  39.       R   : REGISTERS;
  40.  
  41. PROCEDURE BIOUT(C:CHAR); { AUSGABE ZEICHEN AUS 256- ER ZEICHENSATZ }
  42. BEGIN
  43.   R.AH := $0F;
  44.   INTR($10,R); { LESEN VIDEO- MODUS & SEITE }
  45.  
  46.   R.AH := $09;
  47.   R.AL := ORD(C);
  48.   CASE C OF
  49.       #0 : R.BL := TEXTATTR XOR $EE;
  50.     #255 : R.BL := TEXTATTR XOR $DD;
  51.   ELSE R.BL := TEXTATTR;
  52.   END; { CASE }
  53.   R.CX := 1;
  54.   INTR($10,R); { AUSGEBEN ZEICHEN }
  55.  
  56.   IF WHEREX > LO(WINDMAX) THEN BEGIN
  57.     IF WHEREY > HI(WINDMAX) THEN WRITELN ELSE GOTOXY(1,SUCC(WHEREY));
  58.   END ELSE GOTOXY(SUCC(WHEREX),WHEREY);
  59. END; { BIOUT }
  60.  
  61. BEGIN { OCHAR }
  62. {
  63.   OMODE = OUTPUT- MODUS FUER BILDSCHIRM
  64.   0 = ASCII 256, $00 = BRAUN, $FF = VIOLETT
  65.   1 = ALLE CONTROLZEICHEN ANZEIGEN :
  66.      $00..$1F  = BLAUER HINTERGRUND
  67.      $20..$7F  = SCHWARZER HINTERGRUND
  68.      HIGHBIT 0 = WEISSE SCHRIFT
  69.      HIGHBIT 1 = GELBE SCHRIFT
  70.   2 = CR,LF & TAB ALS STEUERZEICHEN, SONST WIE OMODE 1
  71.   3 = ANSI - TERMINAL
  72.   4 = TERMINALEMULATION
  73. }
  74.   CASE OMODE OF
  75.     0 : IF B IN [0..31,255] THEN BIOUT(C)     { 256- BYTE ZEICHENSATZ }
  76.                             ELSE WRITE(C);
  77.     1 : BEGIN { CONTROL & HIGHBIT UEBER ATTRIBUT }
  78.           IF B > 127 THEN BEGIN
  79.             TEXTCOLOR(14);
  80.             B := B AND $7F;
  81.             IF B < 32 THEN BEGIN
  82.               TEXTATTR := $1E; {GELB AUF BLAU} { TEXTATTR XOR $7F; }
  83.               B := B + 64;
  84.             END;
  85.           END ELSE BEGIN
  86.             IF B < 32 THEN BEGIN
  87.               TEXTATTR := $1F; {HELLWEISS AUF BLAU} { TEXTATTR XOR $7F; }
  88.               B := B + 64;
  89.             END;
  90.           END;
  91.           WRITE(C);
  92.           TEXTATTR := DEFATT;
  93.         END;
  94.     2 : BEGIN { CONTROL & HIGHBIT UEBER ATTRIBUT }
  95.           IF B = 9 THEN BEGIN
  96.             J := PRED(WHEREX AND $F8) + 10 - WHEREX; IF J = 9 THEN J := 1;
  97.             FOR I := 1 TO J DO WRITE(' ');
  98.           END ELSE BEGIN
  99.             IF NOT (B IN [10,13]) THEN BEGIN
  100.               IF B > 127 THEN BEGIN
  101.                 TEXTCOLOR(14);
  102.                 B := B AND $7F;
  103.                 IF B < 32 THEN BEGIN
  104.                   TEXTATTR := $1E; {GELB AUF BLAU} { TEXTATTR XOR $7F; }
  105.                   B := B + 64;
  106.                 END;
  107.               END ELSE BEGIN
  108.                 IF B < 32 THEN BEGIN
  109.                   TEXTATTR := $1F; {HELLWEISS AUF BLAU} { TEXTATTR XOR $7F; }
  110.                   B := B + 64;
  111.                 END;
  112.               END;
  113.             END;
  114.             WRITE(C);
  115.             TEXTATTR := DEFATT;
  116.           END;
  117.         END;
  118.     3 : BEGIN { ANSI TERMINAL (WENN ANSI.SYS GELADEN IST) }
  119.           R.AH := 2;
  120.           R.DL := B;
  121.           MSDOS(R);
  122.         END;
  123.     4 : BEGIN         { EMULIEREN }
  124.         END;
  125.   ELSE WRITE(C); { DIREKT AUSGEBEN }
  126.   END; { CASE }
  127. END; { OCHAR }
  128.  
  129.  
  130. PROCEDURE ENDE;
  131. BEGIN
  132.   IF LASTMODE <> 7 THEN SETVISIBLEPAGE(AVP)
  133.                    ELSE GOTOXY(1,25);
  134.   NORMALCURSOR;
  135.   TEXTATTR := TA;
  136.   HALT;
  137. END; { ENDE }
  138.  
  139.  
  140. PROCEDURE DUMP(I:WORD);
  141. VAR   J  : WORD;
  142.       B  : BYTE;
  143. BEGIN
  144.   FOR J := 0 TO 15 DO BEGIN
  145.     B := RBUF[16*I+J];
  146.     IF ADF = 0 THEN BEGIN
  147.       IF (16*I+J) IN [$1A..$3D] THEN BEGIN
  148. { TASTATURBUFFER }
  149.         TEXTATTR := TATBUF;
  150.       END ELSE BEGIN
  151. { UNGLEICH- MARKE }
  152.         IF FILEDA THEN IF BUF[16*I+J] <> B THEN TEXTATTR := TAUNGL;
  153.       END;
  154. { CURSOR }
  155.       IF ((16*I+J) >= CURS) AND ((16*I+J) <= CE) THEN BEGIN
  156.         TEXTBACKGROUND(4);
  157.         IF LASTMODE = 7 THEN TEXTCOLOR(8);
  158.       END;
  159.       WRITE(HEXB(B));
  160. { ZEIGER IM TASTATURBUFFER (HEXDUMP) }
  161.       K := RBUF[$1C] - 2;
  162.       IF K < MEM[BI:$80] THEN K := MEM[BI:$82] - 2;
  163.       TEXTATTR := TAUNGL;
  164.       IF (I*16+J) = K THEN WRITE(#29) ELSE WRITE(' ');
  165.       TEXTATTR := TANORM;
  166.     END ELSE WRITE(HEXB(B),' ');
  167.     IF (J AND 3) = 3 THEN WRITE(' ');
  168.   END; { NEXT J }
  169.   WRITE(' ');
  170.   FOR J := 0 TO 15 DO BEGIN
  171.     B := RBUF[16*I+J];
  172.     IF ADF = 0 THEN BEGIN
  173.       IF (16*I+J) IN [$1A..$3D] THEN BEGIN
  174. { TASTATURBUFFER }
  175.         TEXTATTR := TATBUF;
  176.       END ELSE BEGIN
  177. { UNGLEICH- MARKE }
  178.         IF FILEDA THEN IF BUF[16*I+J] <> B THEN TEXTATTR := TAUNGL;
  179.       END;
  180.     END;
  181.     IF (B IN [7,8,10,13]) THEN WRITE('.')
  182.                           ELSE WRITE(CHR(B));
  183.     TEXTATTR := TANORM;
  184.   END; { NEXT J }
  185.   TEXTATTR := TA;
  186. END; { DUMP }
  187.  
  188.  
  189. PROCEDURE WERTEANZEIGEN;
  190. VAR   I  : WORD;
  191. BEGIN
  192.   CASE ADF OF
  193.     0 : RBUF := BRAM;
  194.     1 : RBUF := BRAM5;
  195.     2 : RBUF := BRAM6;
  196.     3 : RBUF := BRAM7;
  197.   END; { CASE ADF }
  198.   GOTOXY(24,3);
  199.   WRITE(MEML[BI:$6C]);
  200.  
  201. { TASTATURFLAGS }
  202.   GOTOXY(12,4);
  203.   WRITE(HEXB(BRAM[$17]),' ',HEXB(BRAM[$18]),' ');
  204.   WRITE(HEXB(BRAM[$96]),' ',HEXB(BRAM[$97]),' ');
  205.   WRITE(HEXB(BRAM[$19]));
  206. { TASTATURBUFFER }
  207.   IF TBM <> RBUF[$1C] THEN BEGIN
  208.     GOTOXY(35,4);
  209.     FOR I := MEMW[BI:$80] TO MEMW[BI:$82] - 2 DO BEGIN
  210.       XP := WHEREX;
  211.       IF NOT ODD(I) THEN OCHAR(CHR(MEM[BI:I]));
  212.       IF I = RBUF[$1C] THEN BEGIN
  213.         GOTOXY(35,3); CLREOL;
  214.         GOTOXY(XP,3);
  215.         WRITE(#25);
  216.         GOTOXY(SUCC(XP),4);
  217.       END;
  218.     END;
  219.     TBM := RBUF[$1C];
  220.   END;
  221.  
  222. { HEX / ASCII - DUMP }
  223.   FOR I := 0 TO DUMPEND DO BEGIN
  224.     IF DKOPF THEN BEGIN
  225.       GOTOXY(1,10+I);
  226.       CASE ADF OF
  227.         0 : WRITE('40:');
  228.         1 : WRITE('50:');
  229.         2 : WRITE('60:');
  230.         3 : WRITE('70:');
  231.       END; { CASE ADF }
  232.       WRITE(HEXB(I*16),'  ');
  233.     END ELSE GOTOXY(8,10+I);
  234.     DUMP(I);
  235.   END; { NEXT I }
  236.   IF ADF = 0 THEN DUMPEND := 10 ELSE DUMPEND := 15;
  237.   DKOPF := FALSE;
  238. END; { WERTEANZEIGEN }
  239.  
  240.  
  241. PROCEDURE SETCURS;
  242. BEGIN
  243.   DUMPEND := 15;
  244.   CASE CURS OF
  245.     $00..$0F : BEGIN
  246.                  CURS := 0;
  247.                  CE   := $0F;
  248.                END;
  249.     $10..$16 : BEGIN
  250.                  CURS := $10;
  251.                  CE   := $16;
  252.                END;
  253.     $17..$19 : BEGIN
  254.                  CURS := $17;
  255.                  CE   := $19;
  256.                END;
  257.     $1A..$3D : BEGIN
  258.                  CURS := $1A;
  259.                  CE   := $3D;
  260.                END;
  261.     $3E..$48 : BEGIN
  262.                  CURS := $3E;
  263.                  CE   := $48;
  264.                END;
  265.     $49..$66 : BEGIN
  266.                  CURS := $49;
  267.                  CE   := $66;
  268.                END;
  269.     $67..$6B : BEGIN
  270.                  CURS := $67;
  271.                  CE   := $6B;
  272.                END;
  273.     $6C..$70 : BEGIN
  274.                  CURS := $6C;
  275.                  CE   := $70;
  276.                END;
  277.     $71..$73 : BEGIN
  278.                  CURS := $71;
  279.                  CE   := $73;
  280.                END;
  281.     $74..$77 : BEGIN
  282.                  CURS := $74;
  283.                  CE   := $77;
  284.                END;
  285.     $78..$7F : BEGIN
  286.                  CURS := $78;
  287.                  CE   := $7F;
  288.                END;
  289.     $80..$83 : BEGIN
  290.                  CURS := $80;
  291.                  CE   := $83;
  292.                END;
  293.     $84..$8A : BEGIN
  294.                  CURS := $84;
  295.                  CE   := $8A;
  296.                END;
  297.     $8B..$95 : BEGIN
  298.                  CURS := $8B;
  299.                  CE   := $95;
  300.                END;
  301.     $96..$97 : BEGIN
  302.                  CURS := $96;
  303.                  CE   := $97;
  304.                END;
  305.     $98..$A0 : BEGIN
  306.                  CURS := $98;
  307.                  CE   := $A0;
  308.                END;
  309.     $A1..$A7 : BEGIN
  310.                  CURS := $A1;
  311.                  CE   := $A7;
  312.                END;
  313.     $A8..$C3 : BEGIN
  314.                  CURS := $A8;
  315.                  CE   := $C3;
  316.                END;
  317.     $C4..$CD : BEGIN
  318.                  CURS := $C4;
  319.                  CE   := $CD;
  320.                END;
  321.     $CE..$CF : BEGIN
  322.                  CURS := $CE;
  323.                  CE   := $CF;
  324.                END;
  325.     $D0..$FF : BEGIN
  326.                  CURS := $D0;
  327.                  CE   := $FF;
  328.                END;
  329.   END; { CASE CURS }
  330. END; { SETCURS }
  331.  
  332.  
  333. PROCEDURE CURSZURUECK;
  334. BEGIN
  335.   CURS := PRED(CURS);
  336.   SETCURS;
  337. END; { CURSZURUECK }
  338.  
  339.  
  340. PROCEDURE CURSVOR;
  341. BEGIN
  342.   CURS := SUCC(CE);
  343.   SETCURS;
  344. END; { CURSVOR }
  345.  
  346.  
  347. PROCEDURE HILFETEXT;
  348. BEGIN
  349.   CLRSCR;
  350.   CASE CURS OF
  351.     $00..$0F : BEGIN
  352. {       '-----------------------------------------------------------' }
  353. WRITELN(' In $40:$00..$40:$0F befinden sich');
  354. WRITELN(' (soweit vom BIOS beim Booten festgestellt) die I/O- ');
  355. WRITELN(' Adressen der Schnittstellen COM1..COM4 und LPT1..LPT4.');
  356. WRITELN(' Siehe auch Bildschirmzeilen 1 und 2.');
  357. WRITELN(' Dort steht nach dem / die Timeoutzeit der Schnittstelle.');
  358. WRITELN(' Die Timeout- Werte stehen in den Adressen $78..$7F.');
  359. WRITE  (' Bei PS/2 enthält $40:$0E Extended BIOS RAM !');
  360.                END;
  361.     $10..$16 : BEGIN
  362. {       '-----------------------------------------------------------' }
  363. WRITELN(' $40:$10 (WORD) = Equipment Status');
  364. WRITELN(' $40:$12 (BYTE) = benutzt vom Selbsttest');
  365. WRITELN(' $40:$13 (WORD) = RAM- Größe in kByte (Bildschirmzeile 3)');
  366. WRITELN(' $40:$15 (BYTE) = benutzt vom Selbsttest');
  367. WRITELN(' $40:$16 (BYTE) = benutzt vom Selbsttest');
  368. WRITELN(' ');
  369.                END;
  370.     $17..$19 : BEGIN
  371. {       '-----------------------------------------------------------' }
  372. WRITELN(' In $40:$17..$40:$19 befinden sich die Tastaturflags,');
  373. WRITELN(' weitere Tastaturflags sind in $96 und $97 zu finden.');
  374. WRITELN(' ');
  375. WRITELN(' Informationen über Tastaturflags sind mit dem Programm');
  376. WRITELN(' SCANCODE besser ersichtlich.');
  377. WRITELN(' $19 = Puffer für ALT-Keypad-Eingabe.');
  378. WRITE  (' Siehe auch Bildschirmzeile 4.');
  379.                END;
  380.     $1A..$3D : BEGIN
  381. {       '-----------------------------------------------------------' }
  382. WRITELN(' In $40:$1A..$40:$3D befindet sich der Tastaturbuffer :');
  383. WRITELN(' ');
  384. WRITELN(' $1A (WORD) = Input- Pointer (Offset)');
  385. WRITELN(' $1C (WORD) = Output- Pointer (Offset)');
  386. WRITELN(' $1E..$3D enthält jeweils ASCII- und Scancode pro Taste');
  387. WRITELN(' ');
  388.                END;
  389.     $3E..$48 : BEGIN
  390. {       '-----------------------------------------------------------' }
  391. WRITELN(' In $40:$3E..$40:$48 befinden sich');
  392. WRITELN(' den Disketten- Controller betreffende Informationen.');
  393. WRITELN(' $40:$40 (BYTE) = Motor- Timer');
  394. WRITELN(' $40:$41 (BYTE) = Disk- Fehler');
  395. WRITELN(' $40:$42..$40:$48 = Status des NEC 765 Controller');
  396.                END;
  397.     $49..$66 : BEGIN
  398. {       '-----------------------------------------------------------' }
  399. WRITELN(' In $40:$49..$40:$66 befinden sich');
  400. WRITELN(' den Video- Controller betreffende Informationen.');
  401. WRITELN(' ');
  402. WRITELN(' Siehe Bildschirmzeilen 5 bis 8.');
  403.                END;
  404.     $67..$6B : BEGIN
  405. {       '-----------------------------------------------------------' }
  406. WRITELN(' In $40:$67..$40:$6B befinden sich');
  407. WRITELN(' bei alten PCs Daten für den Kassettenrecorder;');
  408. WRITELN(' ');
  409. WRITELN(' $40:$67 (FAR POINTER) = Shutdown- Pointer');
  410. WRITELN(' $40:$6B (BYTE) = falscher Interrupt vom BIOS erkannt');
  411.                END;
  412.     $6C..$70 : BEGIN
  413. {       '-----------------------------------------------------------' }
  414. WRITELN(' In $40:$6C..$40:$70 befindet sich der Systemtimer.');
  415. WRITELN(' Der Timer ist ein DWORD (LONGINT), der vom Hardwaretimer');
  416. WRITELN(' 18 mal pro Sekunde incrementiert wird.');
  417. WRITELN(' Bei NEAT- Boards kann dies schneller geschehen.');
  418. WRITELN(' $70 wird beim Sprung über die 24- Stunden- Grenze auf 1');
  419. WRITE  (' gesetzt.');
  420.                END;
  421.     $71..$73 : BEGIN
  422. {       '-----------------------------------------------------------' }
  423. WRITELN(' $40:$71 -> $80 = Ctrl-Break (Strg-Untbr) betätigt.');
  424. WRITELN(' $40:$72 (WORD) :');
  425. WRITELN('    enthält diese Adresse $1234, wird bei RESET ein Warm-');
  426. WRITELN('    Boot durchgeführt, ansonsten ein Kaltboot mit RAMTEST.');
  427. WRITELN(' ');
  428.                END;
  429.     $74..$77 : BEGIN
  430. {       '-----------------------------------------------------------' }
  431. WRITELN(' In $40:$74..$40:$77 befinden sich');
  432. WRITELN(' die Festplatte betreffende Informationen.');
  433. WRITELN(' $40:$74 (BYTE) = HD Fehlerbyte');
  434. WRITELN(' $40:$75 (BYTE) = Anzahl angeschlossene HDs');
  435.                END;
  436.     $78..$7F : BEGIN
  437. {       '-----------------------------------------------------------' }
  438. WRITELN(' In $40:$78..$40:$7F befinden sich');
  439. WRITELN(' die Timeoutzeiten (in Sekunden) für die Schnittstellen');
  440. WRITELN(' COM1..COM4 und LPT1..LPT4.');
  441. WRITELN(' ');
  442. WRITELN(' Siehe auch Bildschirmzeilen 1 und 2.');
  443. WRITELN(' Dort steht nach dem / die Timeoutzeit.');
  444.                END;
  445.     $80..$83 : BEGIN
  446. {       '-----------------------------------------------------------' }
  447. WRITELN(' In $40:$80..$40:$83 befinden sich');
  448. WRITELN(' die Offsets (WORD) für Anfang und Ende des Tastaturbuf-');
  449. WRITELN(' fers - hier sollte $1E,$00,$3E,$00 stehen.');
  450. WRITELN(' ');
  451.                END;
  452.     $84..$8A : BEGIN
  453. {       '-----------------------------------------------------------' }
  454. WRITELN(' $40:$84 (BYTE) -> Zeilen pro Bildschirmseite -1');
  455. WRITELN(' $40:$85 (WORD) -> Anzahl Bytes pro Zeichen im Zeichensatz');
  456. WRITELN(' $40:$87 (BYTE) -> Video- Info');
  457. WRITELN(' $40:$88 (BYTE) -> Video- Info1 D0..D3 = DIP- Schalter');
  458. WRITELN(' $40:$89 (BYTE) -> Video- Info2 (nur VGA)');
  459. WRITELN(' $40:$8A (BYTE) -> Video- Info3 Display Combination Code');
  460.                END;
  461.     $8B..$95 : BEGIN
  462. {       '-----------------------------------------------------------' }
  463. WRITELN(' In $40:$8B..$40:$95 befinden sich');
  464. WRITELN(' Informationen für Disketten / Festplattenzugriffe.');
  465. WRITELN(' ');
  466.                END;
  467.     $96..$97 : BEGIN
  468. {       '-----------------------------------------------------------' }
  469. WRITELN(' In $40:$96..$40:$97 befinden sich Tastaturflags,');
  470. WRITELN(' weitere Tastaturflags sind in $17 bis $19 zu finden.');
  471. WRITELN(' ');
  472. WRITELN(' Informationen über Tastaturflags sind mit dem Programm');
  473. WRITELN(' SCANCODE besser ersichtlich.');
  474. WRITELN(' ');
  475. WRITE  (' Siehe auch Bildschirmzeile 4.');
  476.                END;
  477.     $98..$A0 : BEGIN
  478. {       '-----------------------------------------------------------' }
  479. WRITELN(' In $40:$98..$40:$A0 befinden sich');
  480. WRITELN(' Daten, die in Zusammenhang mit INT 15H stehen.');
  481. WRITELN(' $40:$98 (DWORD) = Adresse User Wait Flag');
  482. WRITELN(' $40:$9C (DWORD) = INT 15H Timer');
  483. WRITELN(' $40:$98 (BYTE)  = Wait active Flag');
  484.                END;
  485.     $A1..$A7 : BEGIN
  486. {       '-----------------------------------------------------------' }
  487. WRITELN(' $40:$A1..$40:$A7 ');
  488. WRITELN(' Reserviert für lokales Netzwerk');
  489.                END;
  490.     $A8..$C3 : BEGIN
  491. {       '-----------------------------------------------------------' }
  492. WRITELN(' $40:$A8..$40:$C3 -> EGA SAVE_TBL');
  493. WRITELN(' Danach ist Platz für 6 weitere alternative SAVE_TBL -');
  494. WRITELN(' Pointer');
  495.                END;
  496.     $C4..$CD : BEGIN
  497. {       '-----------------------------------------------------------' }
  498. WRITELN(' $40:$C4..$40:$CD UNBEKANNT');
  499.                END;
  500.     $CE..$CF : BEGIN
  501. {       '-----------------------------------------------------------' }
  502. WRITELN(' $40:$CE (WORD) Tagezähler seit 1.1.80 (nur PS/2)');
  503.                END;
  504.     $D0..$FF : BEGIN
  505. {       '-----------------------------------------------------------' }
  506. WRITELN(' In $40:$D0..$40:$FF befindet sich freier Speicher.');
  507. WRITELN(' Sind hier andere Werte als $00 zu finden, wirkt da ein ');
  508. WRITELN(' besonders schlaues oder hinterhältiges Programm.');
  509. WRITELN(' ');
  510.                END;
  511.   END; { CASE CURS }
  512. END; { HILFETEXT }
  513.  
  514.  
  515. PROCEDURE HELP;
  516. VAR   P            : POINTER;
  517.       CH1,CH2,CH3  : CHAR;
  518.  
  519. PROCEDURE HINTERGRUND;
  520. BEGIN
  521.   P := ERASETOPWINDOW;
  522.   WERTEANZEIGEN;
  523.   IF NOT DISPLAYWINDOW(HELPWIN) THEN ENDE;
  524. END; { HINTERGRUND }
  525.  
  526. BEGIN { HELP }
  527.   IF NOT DISPLAYWINDOW(HELPWIN) THEN ENDE;
  528.   REPEAT
  529.     HILFETEXT;
  530.     CH1 := READKEY; IF CH1 = #0 THEN CH2 := READKEY ELSE CH2 := #0;
  531.     CASE CH2 OF
  532. { F1 }  #59 : BEGIN
  533.                 CLRSCR;
  534.                 WRITELN('   PROGRAMM   BIOSDUMP');
  535.                 WRITELN('');
  536.                 WRITELN(' F2 = save aktuelle Daten Segment $40:0');
  537.                 WRITELN(' F5 = Dump Segment $40 (Default)');
  538.                 WRITELN(' F6 = Dump Segment $50');
  539.                 WRITE  (' F7 = Dump Segment $60');
  540.                 CH3 := READKEY; IF CH3 = #0 THEN CH3 := READKEY;
  541.               END;
  542. { PUP } #73 : BEGIN
  543.                 CURSZURUECK;
  544.                 HINTERGRUND;
  545.               END;
  546. { PDN } #81 : BEGIN
  547.                 CURSVOR;
  548.                 HINTERGRUND;
  549.               END;
  550. { UP }  #72 : BEGIN
  551.                 IF NOT MOVEWINDOW(0,-1) THEN {};
  552.               END;
  553. { DN }  #80 : BEGIN
  554.                 IF NOT MOVEWINDOW(0,1) THEN {};
  555.               END;
  556. { LE }  #75 : BEGIN
  557.                 IF NOT MOVEWINDOW(-1,0) THEN {};
  558.               END;
  559. { RI }  #77 : BEGIN
  560.                 IF NOT MOVEWINDOW(1,0) THEN {};
  561.               END;
  562.     END; { CASE CH2 }
  563.   UNTIL CH1 = ^[;
  564.   P := ERASETOPWINDOW;
  565. END; { HELP }
  566.  
  567.  
  568. PROCEDURE BEREINIGEN;
  569. BEGIN
  570.   FOR I := 0 TO 255 DO MEM[$60:I] := $FF;
  571.   FOR I := $01 TO $03 DO MEM[$50:I] := $FF; { ? }
  572.   FOR I := $05 TO $0E DO MEM[$50:I] := $FF; { ? }
  573.   FOR I := $1E TO $21 DO MEM[$50:I] := $FF;
  574.   FOR I := $2E TO $2F DO MEM[$50:I] := $FF;
  575.   FOR I := $36 TO $FF DO MEM[$50:I] := $FF;
  576. END; { BEREINIGEN }
  577.  
  578.  
  579. BEGIN { MAIN }
  580.   OMODE := 0;
  581.   TBM   := 0;
  582.   ADF   := 0;
  583.   DKOPF := TRUE;
  584.  
  585.   IF PARAMSTR(1) = 'BEREINIGEN' THEN BEGIN
  586.     BEREINIGEN;
  587.     HALT;
  588.   END;
  589.  
  590.   AVP := BRAM[$62];
  591.   IF LASTMODE <> 7 THEN BEGIN
  592.     IF LASTMODE <> 3 THEN BEGIN
  593.       TEXTMODE(CO80);
  594.       TEXTATTR := $07;
  595.       DELAY(100);
  596.     END;
  597.     SETVISIBLEPAGE(1);
  598.   END;
  599.  
  600.   { CREATE HELP WINDOW }
  601.   if not MakeWindow(HELPWIN,10,1,70,9,True,True,TRUE,$70,$16,$1E,' Help ') THEN ENDE;
  602.  
  603. {$I-}
  604.   FILEDA := FALSE;
  605.   ASSIGN(F,'BIOSDUMP.SAV');
  606.   RESET(F);
  607.   IF IORESULT = 0 THEN BEGIN
  608.     READ(F,BUF);
  609.     CLOSE(F);
  610.     FILEDA := TRUE;
  611.   END;
  612. {$I+}
  613.  
  614.   TA := TEXTATTR;
  615.   TEXTATTR := TANORM;
  616.   CLRSCR;
  617.  
  618.   RBUF := BRAM;
  619.   GOTOXY(1,1);
  620.   WRITE(    'COM1 : ',HEXW(MEMW[BI:$00]),'/',BRAM[$7C]:3);
  621.   WRITE(',   COM2 : ',HEXW(MEMW[BI:$02]),'/',BRAM[$7D]:3);
  622.   WRITE(',   COM3 : ',HEXW(MEMW[BI:$04]),'/',BRAM[$7E]:3);
  623.   WRITE(',   COM4 : ',HEXW(MEMW[BI:$06]),'/',BRAM[$7F]:3);
  624.   WRITELN;
  625.   WRITE(    'LPT1 : ',HEXW(MEMW[BI:$08]),'/',BRAM[$78]:3);
  626.   WRITE(',   LPT2 : ',HEXW(MEMW[BI:$0A]),'/',BRAM[$79]:3);
  627.   WRITE(',   LPT3 : ',HEXW(MEMW[BI:$0C]),'/',BRAM[$7A]:3);
  628.   WRITE(',   LPT4 : ',HEXW(MEMW[BI:$0E]),'/',BRAM[$7B]:3);
  629.   WRITELN;
  630.   WRITE('Memory : ',MEMW[BI:$13]:4,'k');
  631.   WRITE(',  Timer ',MEML[BI:$6C]);
  632.   WRITELN;
  633.   WRITE('Tastatur : ');
  634.   GOTOXY(34,4); WRITE(#16);
  635.   GOTOXY(35+((MEMW[BI:$82] - MEMW[BI:$80]) SHR 1),4);
  636.   WRITELN(#17);
  637.  
  638.   WRITE('Video- Mode ',HEXB(BRAM[$49]));
  639.   WRITE(', ',MEMW[BI:$4A],'*',BRAM[$84]+1,' Zeichen,');
  640.   WRITE('  Page ',BRAM[$62],', ');
  641.   WRITE(MEMW[BI:$85],' Bytes/Zeichen');
  642.  
  643.   WRITELN;
  644.   WRITE('Memsize : ',MEMW[BI:$4C]:6);
  645.   WRITE(', MEM-ADR : ',HEXW(MEMW[BI:$4E]));
  646.   WRITE(', CONTROLLER-ADR : ',HEXW(MEMW[BI:$63]));
  647.   WRITE(', Flag ',HEXB(BRAM[$65]));
  648.  
  649.   WRITELN;
  650.   WRITE('Palette ',HEXB(BRAM[$66]));
  651.   WRITE(', EGA STATUS : ',HEXB(BRAM[$89]));
  652.   WRITE(', SAVE_TBL : ',HEXW(MEMW[BI:$AA]),':',HEXW(MEMW[BI:$A8]));
  653.  
  654.   WRITELN;
  655.   WRITE('Cursor : ',HEXW(MEMW[BI:$60]),', ');
  656.   FOR I := 0 TO 15 DO BEGIN
  657.     WRITE(RBUF[I+$50]:2);
  658.     IF (I AND 1) = 0 THEN WRITE(',') ELSE WRITE('  ');
  659.   END; { NEXT I }
  660.  
  661.     GOTOXY(1,10+I);
  662.     WRITE('40:',HEXB(I*16),'  ');
  663.  
  664.   HIDDENCURSOR;
  665.   CURS  := 0;
  666.   SETCURS;
  667.   CH := ' ';
  668.   REPEAT
  669.     WERTEANZEIGEN;
  670.  
  671.     IF KEYPRESSED THEN BEGIN
  672.       CH := READKEY;
  673.       IF CH = #0 THEN CH1 := READKEY ELSE CH1 := #0;
  674.       CASE CH1 OF
  675. { F1 }  #59 : HELP;
  676. { F2 }  #60 : BEGIN
  677. {$I-}
  678.                 FILEDA := FALSE;
  679.                 ASSIGN(F,'BIOSDUMP.SAV');
  680.                 REWRITE(F);
  681.                 IF IORESULT = 0 THEN BEGIN
  682.                   BUF := BRAM;
  683.                   WRITE(F,BUF);
  684.                   CLOSE(F);
  685.                   FILEDA := (IORESULT = 0);
  686.                 END;
  687. {$I+}
  688.               END;
  689. { F5 }  #63 : BEGIN
  690.                 ADF := 0;
  691.                 DUMPEND := 15;
  692.                 DKOPF := TRUE;
  693.               END;
  694. { F6 }  #64 : BEGIN
  695.                 ADF := 1;
  696.                 DUMPEND := 15;
  697.                 DKOPF := TRUE;
  698.               END;
  699. { F7 }  #65 : BEGIN
  700.                 ADF := 2;
  701.                 DUMPEND := 15;
  702.                 DKOPF := TRUE;
  703.               END;
  704. { F8 }  #66 : BEGIN
  705.                 ADF := 3;
  706.                 DUMPEND := 15;
  707.                 DKOPF := TRUE;
  708.               END;
  709. { PU }  #73,
  710. { UP }  #72,
  711. { LE }  #75 : CURSZURUECK;
  712. { PD }  #81,
  713. { DN }  #80,
  714. { RI }  #77 : CURSVOR;
  715.       END; { CASE CH1 }
  716.     END; { IF KEYPRESSED }
  717.   UNTIL CH = ^[;
  718.  
  719.   ENDE;
  720.  
  721. END.
  722.  
  723.