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