home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / grafik / tiftool / mcblist.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-02-23  |  55.3 KB  |  1,992 lines

  1.  
  2. PROGRAM MCBLIST;
  3. {
  4.   LISTE DER MEMORY- CONTROL- BLOCKS UND EINIGES MEHR
  5.   PAUL SCHUBERT, ROTTWEILER STR. 8, 6000 FRANKFURT 1, 069 / 231145
  6.  
  7.   COMPILIEREN MIT TURBO PASCAL >= 5.0
  8.   TURBO PROFESSIONAL WIRD BENÖTIGT
  9. }
  10. {$F+}
  11.  
  12. USES  IVSWAP,           { MUß AM ANFANG DES PROGRAMMS STEHEN }
  13.       TPCRT,DOS,TPDOS,SELECTD,NEATUNIT,
  14.       TPSTRING,TPWINDOW,TPSTRDEV,
  15.       TPENHKBD,TPEMS,TPEXTMEM,TPMOUSE,
  16.       TPTIMER,DETECTRD,NOBREAK;
  17.  
  18.  
  19. CONST INTFNAME  = 'MCBLIST.SAV';
  20.       FILEID    : POINTER = PTR($1234,$5689);
  21.  
  22.       TANORM    : BYTE = $07; { TEXTATTRIBUT NORMALE ANZEIGE }
  23.       TAKOPF    : BYTE = $4E; { TEXTATTRIBUT KOPFZEILEN }
  24.       TAFREI    : BYTE = $08; { TEXTATTRIBUT FREIER MCB }
  25.       TAPROM    : BYTE = $0A; { TEXTATTRIBUT MCB FÜR EPROM }
  26.       TAFRAM    : BYTE = $09; { TEXTATTRIBUT MCB FÜR FREIES RAM }
  27.       TAVEKT    : BYTE = $0F; { TEXTATTRIBUT INTERRUPT- VEKTOR- ANZEIGE }
  28.       TAVALT    : BYTE = $02; { TEXTATTRIBUT ALTER VEKTOR }
  29.       TAVNEU    : BYTE = $1F; { TEXTATTRIBUT NEUER VEKTOR }
  30.       TASPEC    : BYTE = $0D; { SPEZIELLE AUSSAGEN }
  31.       TAMUTTER  : BYTE = $0C; { MUTTERPROZESS- ANZEIGE }
  32.       TAMROM    : BYTE = $1E; { ROM IN DER MEMORY- MAP A000..F000 }
  33.       TAMRAM    : BYTE = $1F; { RAM IN DER MEMORY- MAP A000..F000 }
  34.       TAINAKT   : BYTE = $08; { INAKTIV- ATTRIBUT FÜR FENSTERRAHMEN }
  35.  
  36.       MAXWIND   = 7;   { ANZAHL FENSTER OHNE ALERT(AWIN) UND MESSAGE(BWIN) }
  37.  
  38.       KOPFZATT  : FLEXATTRS = ($1E,$1B,$1E,$1C);
  39.  
  40. TYPE  MCBNAM = ARRAY[1..8] OF CHAR;
  41.  
  42. TYPE  MCBTYP = RECORD
  43.         ID    : CHAR;
  44.         PSP   : WORD;
  45.         LEN   : WORD;
  46.         FILL  : ARRAY[1..3] OF BYTE;
  47.         N     : MCBNAM;
  48.       END;
  49.       MCBPTR = ^MCBTYP;
  50.  
  51. TYPE  MCBREGTYP = RECORD
  52.         MCBR : MCBTYP;
  53.         ADDR : WORD;
  54.         ATTR : BYTE;
  55.       END;
  56.  
  57. TYPE  CHARRAY = ARRAY[1..20] OF CHAR;
  58.       BYTEARR = ARRAY[1..20] OF BYTE;
  59.  
  60. TYPE  PSPTYP = RECORD
  61. {00}    INTR20  : WORD;                  { INT 20H }
  62. {02}    ENDBL   : WORD;                  { END OF ALLOCATION BLOCK }
  63. {04}    F1      : ARRAY[1..6] OF BYTE;
  64. {0A}    I22PTR  : POINTER;               { POINTER AUF INT 22H }
  65. {0E}    I23PTR  : POINTER;               { POINTER AUF INT 23H }
  66. {12}    I24PTR  : POINTER;               { POINTER AUF INT 24H }
  67. {16}    CMDSEG  : WORD;                  { SEGMENT DES MUTTERPROZESSES }
  68. {18}    HNDTAB  : ARRAY[1..20] OF BYTE;  { HANDLE- TABELLE }
  69. {2C}    ENVSEG  : WORD;                  { ENVIRONMENT- SEGMENT }
  70. {2E}    F2      : POINTER;               { IRGENDWOHIN IM COMMAND.COM }
  71. {32}    HNDMAX  : WORD;                  { MAXIMALE ANZAHL HANDLES }
  72. {34}    HNDPTR  : POINTER;               { POINTER AUF HANDLE- TABELLE }
  73. {38}    F3      : ARRAY[1..24] OF BYTE;
  74. { 4 * $FF UND 12 * $00 }
  75. {50}    INTR21  : WORD;                  { INT 21H }
  76. {52}    F4      : ARRAY[1..10] OF BYTE;
  77. { $CB UND 9 * $00 }
  78. {5C}    FCB1    : ARRAY[1..16] OF BYTE;
  79. {6C}    FCB2    : ARRAY[1..16] OF BYTE;
  80. {7C}    F5      : ARRAY[1..4] OF BYTE;
  81. {80}    CMDLIN  : STRING[127];
  82.       END;
  83.  
  84. TYPE  SOF     = RECORD O,S : WORD; END;
  85.       PSPPTR  = ^PSPTYP;
  86.  
  87. TYPE  WPTYPE = RECORD
  88.         X,Y,L,W,W0  : INTEGER;
  89.         F           : BOOLEAN;
  90.       END;
  91.  
  92. TYPE  BUFFERTYP = RECORD
  93.         NXT   : POINTER;
  94.         F1    : ARRAY[1..6] OF BYTE;
  95.         DRV   : POINTER;
  96.         F2    : ARRAY[1..2] OF BYTE;
  97.         DATA  : ARRAY[0..$1FF] OF BYTE;
  98.       END;
  99.  
  100. TYPE  DITTYP = RECORD
  101.         NXT  : POINTER;
  102.         F1   : ARRAY[1..9] OF BYTE;
  103.         DRV  : POINTER;
  104.         F2   : ARRAY[1..21] OF BYTE;
  105.         NAME : ARRAY[1..11] OF CHAR;
  106.         F3   : ARRAY[1..4] OF BYTE;
  107.       END;
  108.  
  109.  
  110. VAR   I,J,K,
  111.       MCBC                      : INTEGER;
  112.       TA,TA0,SIZMOD             : BYTE;
  113.       CH1,CH2                   : CHAR;
  114.       P1,KT1,KA1,KT2,KA2,
  115.       DUMPADDR                  : STRING;
  116.       MCBLEN                    : LONGINT;
  117.       OLDMEM,OLDMEMF,
  118.       OLDMEMG,OLDMEMJ           : POINTER;
  119.       FILERR,KA,
  120.       AUS,CONFIG,URENV,QUIET,
  121.       HATPAR,HATFREI,DOS4,
  122.       DRDOS,LCD,NOWIN           : BOOLEAN;
  123.       VON,BIS,MCBEND,CMDPSP,
  124.       MS,MO,MSM,MOM,MSN,MON,
  125.       CHEF,MEMSIZE,LTREIBER     : WORD;
  126.  
  127.       MCB                       : MCBPTR;
  128.       MP,HP                     : POINTER;
  129.       MCBA                      : ARRAY[1..50] OF MCBREGTYP;
  130.       MCBAP,MCBDP               : BYTE;
  131.  
  132.       BUF                       : INTPTR;
  133.       F                         : FILE OF POINTER;
  134.  
  135.       MODVEC                    : POINTER ABSOLUTE $50:$30;
  136.  
  137.       SC                        : ARRAY[1..MAXWIND] OF VSCREEN;
  138.       WI                        : ARRAY[1..MAXWIND] OF WINDOWPTR;
  139.       WP                        : ARRAY[1..MAXWIND] OF WPTYPE;
  140.       ZEI                       : WORD;
  141.       SPA,WN,WNM,SPM,CX,CY      : BYTE;
  142.       AWIN,BWIN,WDP             : WINDOWPTR;
  143.  
  144.       XMSENTRY                  : POINTER;
  145.       HMBUF                     : ARRAY[0..127] OF BYTE;
  146.       RAX,RBX,RCX,RDX           : WORD;
  147.       WS                        : STRING[MAXWIND];
  148.  
  149.       MSP                       : MOUSESTATEPTR;
  150.       MSPSIZE                   : WORD;
  151.       MSX,MSY                   : BYTE;
  152.       BUT                       : BUTTONSTATUS;
  153.       MAUSAKT                   : BOOLEAN;
  154.  
  155.       I9VECT                    : POINTER ABSOLUTE 0:$24;
  156.       I9MERK                    : POINTER;
  157.  
  158.  
  159. PROCEDURE MOUSEORKEY;           FORWARD;
  160. PROCEDURE AUSDIEMAUS;           FORWARD;
  161. PROCEDURE ALERT(TEXT:STRING);   FORWARD;
  162. PROCEDURE MESSAGE(TEXT:STRING); FORWARD;
  163.  
  164.  
  165. FUNCTION NEUERMAUSTREIBER:BOOLEAN;
  166. VAR   R  : REGISTERS;
  167. BEGIN
  168.   NEUERMAUSTREIBER := FALSE;
  169.   IF NOT MOUSEINSTALLED THEN EXIT;
  170.   WITH R DO BEGIN
  171.     AX := 21;
  172.     BX := $FFFF;
  173.     INTR($33,R);
  174.     IF BX = $FFFF THEN EXIT;
  175.   END; { WITH R }
  176.   NEUERMAUSTREIBER := TRUE;
  177. END; { NEUERMAUSTREIBER }
  178.  
  179.  
  180. PROCEDURE INIMAUS;
  181. BEGIN
  182.   IF NEUERMAUSTREIBER THEN BEGIN
  183.     IF NOT MAUSAKT THEN BEGIN
  184.       MAUSAKT := TRUE;
  185.       MSPSIZE := MOUSESTATEBUFFERSIZE;
  186.       GETMEM(MSP,MSPSIZE);
  187.     END;
  188.     SAVEMOUSESTATE(MSP,FALSE);
  189.     INITIALIZEMOUSE;
  190.     ENABLEEVENTHANDLING;
  191.     FULLMOUSEWINDOW;
  192.     BLOCKMOUSECURSOR;
  193.     MOUSEGOTOXY(MSX,MSY);
  194.   END ELSE MAUSAKT := FALSE;
  195. END;
  196.  
  197.  
  198. PROCEDURE NEWDELAY(ZEIT:WORD);
  199. VAR   START,STOP  : LONGINT;
  200.       R           : REAL;
  201. BEGIN
  202.   START := READTIMER;
  203.   REPEAT
  204.     R := ELAPSEDTIME(START,STOP); { ZEITVERBRATER IST FÜR 20 MHz- NEAT NÖTIG }
  205.     STOP := READTIMER;
  206.   UNTIL ROUND(ELAPSEDTIME(START,STOP)) >= ZEIT;
  207. END;
  208.  
  209.  
  210. PROCEDURE DUMPBLOCK;
  211. VAR   I,J  : WORD;
  212.       MP   : ^BYTEARR;
  213.       MC   : ^CHARRAY ABSOLUTE MP;
  214. BEGIN
  215.   MP := PTR(MS,MO);
  216.   GOTOXY(1,1);
  217.   WRITE(HEXW(MS+(MO SHR 4)),':0000   Adresse -> ',DUMPADDR); CLREOL;
  218.  
  219.   FOR I := 0 TO 7 DO BEGIN
  220.     GOTOXY(1,I + 2);
  221.     WRITE(HEXW(MS),':',HEXW(MO+16*I),' ');
  222.     FOR J := 1 TO 16 DO BEGIN
  223.       WRITE(HEXB(MP^[16*I+J]),' ');
  224.       IF (J <> 16) AND ((J AND 3) = 0) THEN WRITE(' ');
  225.     END; { NEXT J }
  226.  
  227.     FOR J := 1 TO 16 DO BEGIN
  228.       IF MP^[16*I+J] IN [0..31,127]
  229.         THEN WRITE('·')
  230.         ELSE WRITE(MC^[16*I+J]);
  231.     END; { NEXT J }
  232.  
  233.   END; { NEXT I }
  234. END; { DUMPBLOCK }
  235.  
  236.  
  237. PROCEDURE TMESSAGE;
  238. VAR   P    : WINDOWPTR;
  239.       CH1  : CHAR;
  240.       S    : STRING;
  241. BEGIN
  242.   IF NOT ACTIVATEWINDOW(BWIN) THEN ALERT('FEHLER ACTIVATEWINDOW');
  243.   HIDDENCURSOR;
  244.   CLRSCR;
  245.   FASTWRITE('═══════════════',HI(WINDMIN),LO(WINDMIN)+23,$2B);
  246.   S := 'Drücken Sie jetzt nicht die DEL- Taste !';
  247.   GOTOXY( ((LO(WINDMAX)-LO(WINDMIN))-LENGTH(S)) SHR 1 ,2);
  248.   WRITE(S);
  249.   WHILE KEYPRESSED DO CH1 := READKEY;
  250.   REPEAT
  251.     IF CTRLALTDEL THEN BEGIN
  252.       CLRSCR;
  253.       S := 'Das sollten Sie doch NICHT tun !';
  254.       GOTOXY( ((LO(WINDMAX)-LO(WINDMIN))-LENGTH(S)) SHR 1 ,2);
  255.       WRITE(S);
  256.     END;
  257.   UNTIL KEYPRESSED OR ((KBDFLAGS AND $0C) <> $0C);
  258.   WHILE KEYPRESSED DO CH1 := READKEY;
  259.   P := ERASETOPWINDOW;
  260. END;
  261.  
  262.  
  263. PROCEDURE MOUSEORKEY;
  264. VAR   I        : WORD;
  265.       INPS,TS  : STRING;
  266.       STA,STO  : LONGINT;
  267. LABEL MAUSENDE,I9VERBOGEN;
  268. BEGIN
  269.   IF MAUSAKT THEN BEGIN
  270.     BLOCKMOUSECURSOR;
  271.     SHOWMOUSE;
  272.     STA := READTIMER;
  273.     REPEAT
  274.       IF (KBDFLAGS AND $0C) = $0C THEN BEGIN
  275.         MOUSEWHEREXY(MSX,MSY,BUT);
  276.         TMESSAGE;
  277.         MOUSEGOTOXY(MSX,MSY);
  278.       END;
  279.       IF BREAK THEN BEGIN
  280.         MOUSEWHEREXY(MSX,MSY,BUT);
  281.         MESSAGE('Programm beenden mit <Alt-Esc>');
  282.         MOUSEGOTOXY(MSX,MSY);
  283.       END;
  284.       IF WN = 99 THEN BEGIN
  285.         STO := READTIMER;
  286.         STO := READTIMER; { 2 MAL LESEN, WEGEN GEFAHREN BEI HOHEM TAKT }
  287.         IF ROUND(ELAPSEDTIME(STA,STO)) >= 250 THEN BEGIN
  288.           MOUSEWHEREXY(MSX,MSY,BUT);
  289.           STUFFKEY(0);
  290.           HIDEMOUSE;
  291.           EXIT;
  292.         END;
  293.       END;
  294.       IF I9VECT <> I9MERK THEN GOTO I9VERBOGEN;
  295.     UNTIL KEYPRESSED OR MOUSEPRESSED;
  296.     MOUSEWHEREXY(MSX,MSY,BUT);
  297.     IF MOUSEPRESSED THEN BEGIN
  298.       SOUND(4000);
  299.       NEWDELAY(5);
  300.       NOSOUND;
  301.       NEWDELAY(100);
  302.       MOUSEWHEREXY(MSX,MSY,BUT);
  303.       IF BUT = BOTHBUTTONS THEN BEGIN
  304.         STUFFKEY(27);
  305.         GOTO MAUSENDE;
  306.       END ELSE BEGIN
  307.         FASTREAD(80,MSY,1,INPS);
  308.         I := MSX;
  309.         CASE INPS[I] OF
  310.           '═' : BEGIN
  311.                   WHILE (I > 1) AND (NOT (INPS[I] IN ['╒','╘'])) DO DEC(I);
  312.                   IF INPS[I] = '╘' THEN BEGIN
  313.                     IF BUT = RIGHTBUTTON THEN STUFFKEY(77 SHL 8);
  314.                     IF BUT = LEFTBUTTON  THEN STUFFKEY(80 SHL 8);
  315.                   END;
  316.                   IF INPS[I] = '╒' THEN BEGIN
  317.                     IF BUT = RIGHTBUTTON THEN STUFFKEY(75 SHL 8);
  318.                     IF BUT = LEFTBUTTON  THEN STUFFKEY(72 SHL 8);
  319.                   END;
  320.                   IF (WN = 99) THEN BEGIN
  321.                     IF BUT = RIGHTBUTTON THEN NEWDELAY(100);
  322.                     IF BUT = LEFTBUTTON  THEN GOTO MAUSENDE;
  323.                   END;
  324.                   IF NOT KEYPRESSED THEN STUFFKEY(0);
  325.                   HIDEMOUSE;
  326.                   EXIT;
  327.                 END;
  328.           '╒' : BEGIN
  329.                   STUFFKEY(71 SHL 8);
  330.                   GOTO MAUSENDE;
  331.                 END;
  332.           '╛' : BEGIN
  333.                   STUFFKEY(79 SHL 8);
  334.                   GOTO MAUSENDE;
  335.                 END;
  336.         END; { CASE INPS[I] }
  337.         CASE MSY OF
  338.           1 : BEGIN
  339.                 CASE MSX OF
  340.                    1..10 : STUFFKEY(59 SHL 8);
  341.                   13..22 : STUFFKEY(60 SHL 8);
  342.                   27..39 : STUFFKEY(61 SHL 8);
  343.                   43..54 : STUFFKEY(62 SHL 8);
  344.                   56..67 : STUFFKEY(63 SHL 8);
  345.                   69..80 : STUFFKEY(64 SHL 8);
  346.                 END; { CASE MSX }
  347.                 GOTO MAUSENDE;
  348.               END;
  349.           2 : BEGIN
  350.                 CASE MSX OF
  351.                    1..11 : STUFFKEY(65 SHL 8);
  352.                   13..25 : STUFFKEY(66 SHL 8);
  353.                   27..36 : STUFFKEY(67 SHL 8);
  354.                   38..52 : STUFFKEY(88 SHL 8);
  355.                   54..65 : STUFFKEY(92 SHL 8);
  356.                   67..80 : STUFFKEY($100);
  357.                 END; { CASE MSX }
  358.                 GOTO MAUSENDE;
  359.               END;
  360.         ELSE { CASE MSY }
  361. { EINIGE AUSGEWÄHLTE BUCHSTABEN PER MAUSKLICK IN DEN TASTATURBUFFER BEFÖRDERN }
  362.           IF INPS[I] IN ['+','-'] THEN BEGIN
  363.             STUFFKEY(BYTE(INPS[I]));
  364.             GOTO MAUSENDE;
  365.           END;
  366. { WENN BIS HIER NOCH NICHTS BESONDERES UNTER DEM MAUSCURSOR GEFUNDEN WURDE,
  367.   WIRD EINE HEX- EINGABE VERSUCHT }
  368.           IF NOT (INPS[MSX] IN ['0'..'9','A'..'F']) THEN GOTO MAUSENDE;
  369.           WHILE (I > 1) AND (UPCASE(INPS[I]) IN ['0'..'9','A'..'F']) DO DEC(I);
  370.           DELETE(INPS,1,I);
  371.  
  372. { GGF. AUTOMATISCH DEBUG AKTIVIEREN }
  373.           IF WN <> 99 THEN STUFFKEY(67 SHL 8);
  374.           TS := '';
  375.  
  376.           IF (KBDFLAGS AND 4) = 4 THEN BEGIN
  377.             IF STR2WORD('$'+COPY(INPS,1,2),I) THEN ;
  378.             TS := HEXW(MEMW[0:I*4+2]) + ':' + HEXW(MEMW[0:I*4]) + ^M;
  379.             FOR I := 1 TO LENGTH(TS) DO STUFFKEY(BYTE(TS[I]));
  380.             GOTO MAUSENDE;
  381.           END;
  382.           IF (BUT = CENTERBUTTON) OR
  383.              ((BUT = LEFTBUTTON) AND ((KBDFLAGS AND 3) <> 0)) THEN BEGIN
  384.             IF INPS[3] = ' ' THEN BEGIN
  385.               DELETE(INPS,3,1);
  386.               IF INPS[3] = ' ' THEN DELETE(INPS,3,1);
  387.               TS := ':' + COPY(INPS,3,2) + COPY(INPS,1,2);
  388.             END ELSE BEGIN
  389.               FOR I := 1 TO 4 DO STUFFKEY(BYTE(INPS[I]));
  390.               STUFFKEY(BYTE(':'));
  391.             END;
  392.             DELETE(INPS,1,4);
  393.             FOR I := 1 TO 3 DO IF INPS[1] IN [':',' '] THEN DELETE(INPS,1,1);
  394.           END;
  395.  
  396.           IF INPS[3] = ' ' THEN BEGIN
  397.             DELETE(INPS,3,1);
  398.             IF INPS[3] = ' ' THEN DELETE(INPS,3,1);
  399.             STUFFKEY(BYTE(INPS[3]));
  400.             STUFFKEY(BYTE(INPS[4]));
  401.             STUFFKEY(BYTE(INPS[1]));
  402.             STUFFKEY(BYTE(INPS[2]));
  403.           END ELSE FOR I := 1 TO 4 DO STUFFKEY(BYTE(INPS[I]));
  404.           IF BUT = LEFTBUTTON THEN STUFFKEY(BYTE(':'));
  405.           FOR I := 1 TO LENGTH(TS) DO STUFFKEY(BYTE(TS[I]));
  406.  
  407.           STUFFKEY(13);
  408.           GOTO MAUSENDE;
  409.         END; { CASE MSY }
  410.       END; { IF BUT }
  411.     END;
  412.     IF NOT KEYPRESSED THEN STUFFKEY(0);
  413.     HIDEMOUSE;
  414.   END ELSE BEGIN
  415.     IF I9VECT <> I9MERK THEN GOTO I9VERBOGEN;
  416.     REPEAT
  417.       IF (KBDFLAGS AND $0C) = $0C THEN TMESSAGE;
  418.       IF BREAK THEN MESSAGE('Programm beenden mit <Alt-Esc>');
  419.       IF WN = 99 THEN DUMPBLOCK;
  420.     UNTIL KEYPRESSED;
  421.   END;
  422.   EXIT;
  423. MAUSENDE:
  424.   IF NOT KEYPRESSED THEN STUFFKEY(0);
  425.   REPEAT MOUSEWHEREXY(MSX,MSY,BUT); UNTIL BUT = NOBUTTON;
  426.   HIDEMOUSE;
  427.   EXIT;
  428. I9VERBOGEN:
  429.   WINDOW(1,1,80,25);
  430.   GOTOXY(1,2);
  431.   TEXTATTR := $CE;
  432.   WRITELN(#7,'           !!!  Der Tastaturinterrupt wurde verändert  !!!           ');
  433.   TEXTATTR := $4E;
  434.   WRITELN(   ' mit geladenem SIDEKICK ist MCBLIST nur eingeschränkt funktionsfähig ');
  435.   TEXTATTR := TA;
  436.   NORMALCURSOR;
  437.   GOTOXY(1,25);
  438.   HALT;
  439. END; { MOUSEORKEY }
  440.  
  441.  
  442. {$I MCBLIST1}
  443.  
  444. PROCEDURE FIRSTMCB;
  445. VAR   R  : REGISTERS;
  446. BEGIN
  447. { ERSTEN MCB HOLEN }
  448.   MCBC   := 1;
  449.   CMDPSP := $FFFF;
  450.   KA     := FALSE;
  451.   AUS    := FALSE;
  452.   CONFIG := FALSE;
  453.   URENV  := FALSE;
  454.   WITH R DO BEGIN
  455.     AH := $52;
  456.     MSDOS(R);
  457.     HP := POINTER(MEML[ES:BX-4]);
  458.   END; { WITH R }
  459.   MCB := HP;
  460. { DA HABEN WIR DEN 1. MCB }
  461.   LTREIBER := MEMW[R.ES:R.BX+14];
  462. END;
  463.  
  464.  
  465. PROCEDURE DISPPTR(ES,BX:WORD;OFF:INTEGER);
  466. BEGIN
  467.   WRITE(TPSTR,OFF:4,' = ',HEXW(ES),':',HEXW(BX+OFF),' -> ');
  468.   WRITE(TPSTR,HEXW(SOF(MEML[ES:BX+OFF]).S),':',
  469.               HEXW(SOF(MEML[ES:BX+OFF]).O));
  470.   VWRITELN;
  471. END; { DISPPTR }
  472.  
  473.  
  474. PROCEDURE MCBNAME(MCB:MCBPTR);
  475. CONST NULL : ARRAY[1..8] OF CHAR = #0#0#0#0#0#0#0#0;
  476. VAR   I  : BYTE;
  477. BEGIN
  478.   IF MCB^.N = NULL THEN EXIT;
  479.   FOR I := 1 TO 8 DO
  480.     IF MCB^.N[I] IN [#1..#$1F,#$2A,#$2E,#$3A..#$3F,#$7F,#$A8..#$FF] THEN EXIT;
  481.   WRITE(TPSTR,'[',MCB^.N,']');
  482.   VWRITE;
  483. END; { MCBNAME }
  484.  
  485.  
  486. PROCEDURE DRIVERDIS;
  487. VAR   I,NR     : INTEGER;
  488.       DRVCNT   : BYTE;
  489.       NBD      : BYTE;
  490.       MCB      : MCBPTR;
  491.       MCB2     : WORD;
  492.       L        : LONGINT;
  493.       BFPTR    : ^POINTER;
  494.       HP       : ^BYTEARR;
  495.       CHP      : ^CHARRAY;
  496.       R        : REGISTERS;
  497.       DRV      : STRING;
  498.       F        : SEARCHREC;
  499.       DIT      : ^DITTYP;
  500.  
  501. FUNCTION DOS4DRIVER:BOOLEAN;
  502. VAR   SCHLUSS  : WORD;
  503.       MCB      : MCBPTR;
  504.       R        : REGISTERS;
  505. BEGIN
  506.   DOS4DRIVER := FALSE;
  507.   IF NOT DOS4 THEN EXIT;
  508.  
  509.   TEXTATTR := TAKOPF;
  510.   WRITE(TPSTR,'  PSP   Länge    ( DOS >= 4.0 SUB-MCBs )                                      ');
  511.   VWRITELN;
  512.   TEXTATTR := TA;
  513.  
  514.   R.AH := $52;
  515.   MSDOS(R);
  516.   MCB := POINTER(MEML[R.ES:R.BX-4]);
  517.  
  518.   WHILE (MCB^.PSP <> 8) DO BEGIN
  519.     MCB := PTR(SOF(MCB).S+SUCC(MCB^.LEN),0);
  520.   END;
  521.  
  522.   SCHLUSS := SOF(MCB).S + SUCC(MCB^.LEN);
  523.   INC(SOF(MCB).S);
  524.   WHILE (MCB^.PSP = SUCC(SOF(MCB).S)) AND
  525.         (SOF(MCB).S <> SCHLUSS) DO BEGIN
  526.     WRITE(TPSTR,'  ');
  527.     WRITE(TPSTR,HEXW(MCB^.PSP),MCB^.LEN*16:7);
  528. (*
  529.     WRITE(TPSTR,' ',HEXB(MCB^.FILL[1]));
  530.     WRITE(TPSTR,' ',HEXB(MCB^.FILL[2]));
  531.     WRITE(TPSTR,' ',HEXB(MCB^.FILL[3]));
  532. *)
  533.     WRITE(TPSTR,' ');
  534.     CASE MCB^.ID OF
  535.       'D' : WRITE(TPSTR,'DEVICE=    ');
  536.       'F' : WRITE(TPSTR,'FILES=     ');
  537.       'X' : WRITE(TPSTR,'FCBS=      ');
  538.       'B' : WRITE(TPSTR,'BUFFERS=   ');
  539.       'L' : WRITE(TPSTR,'LASTDRIVE= ');
  540.       'S' : WRITE(TPSTR,'STACKS=    ');
  541.     ELSE
  542.       WRITE(TPSTR,'???????? ');
  543.     END; { CASE MCB^.ID }
  544.     MCBNAME(MCB);
  545.     VWRITELN;
  546.     MCB := PTR(SOF(MCB).S+SUCC(MCB^.LEN),0);
  547.   END;
  548.   VWRITELN;
  549.   DOS4DRIVER := TRUE;
  550. END; { DOS4DRIVER }
  551.  
  552. PROCEDURE GETNBD;
  553. { GET NUMBER OF BLOCKDEVICES }
  554. BEGIN
  555.   NBD := 0;
  556.   R.AH := $52;
  557.   MSDOS(R);
  558.   HP := POINTER(MEML[R.ES:R.BX+12]); { LETZTER TREIBER }
  559.   WHILE (SOF(HP).O <> $FFFF) DO BEGIN
  560.     IF ((HP^[6] AND $80) = 0) THEN INC(NBD,HP^[11]);
  561.     HP := POINTER(MEML[SOF(HP).S:SOF(HP).O]);
  562.   END; { WHILE }
  563. END;  { GETNBD }
  564.  
  565. PROCEDURE DISPLAYPATHS;
  566. VAR   I,J  : WORD;
  567.       CHP  : ^CHARRAY;
  568.       DC   : CHAR;
  569.       F    : SEARCHREC;
  570. BEGIN
  571.   TEXTATTR := TAKOPF;
  572.   VWRITELNS(' Liste der PATHs ( SUBST / JOIN ) : ');
  573.   TEXTATTR := TA;
  574.   R.AH := $52;
  575.   MSDOS(R);
  576.   CHP := PTR(MEMW[R.ES:R.BX+24],0);
  577.   FOR I := 1 TO NUMBEROFDRIVES DO BEGIN
  578.     IF (CHP^[2] <> ':') OR (CHP^[3] <> '\') THEN EXIT;
  579.     WRITE(TPSTR,CHR(I+$40),': = ');
  580.     VWRITE;
  581.     TEXTATTR := $0B;
  582.     J := 1;
  583.     DC := CHP^[1];
  584.     WHILE (J < 65) AND (CHP^[J] <> #0) DO BEGIN
  585.       WRITE(TPSTR,CHP^[J]);
  586.       INC(J);
  587.     END; { WHILE }
  588.     IF ((ORD(DC) - $40) <> I) THEN BEGIN
  589.       VWRITE;
  590.       TEXTATTR := $0E;
  591.       FINDFIRST(CHR(I+$40)+':\*.*',ANYFILE,F);
  592.       IF DOSERROR = 3 THEN WRITE(TPSTR,' (JOIN)')
  593.                       ELSE WRITE(TPSTR,' (SUBST)');
  594.     END;
  595.     VWRITELN;
  596.     TEXTATTR := TA;
  597.     IF DOS4 THEN INC(SOF(CHP).O,88) ELSE INC(SOF(CHP).O,81);
  598.   END;
  599. END; { DISPLAYPATHS }
  600.  
  601. PROCEDURE BUFFERANZEIGE;
  602. VAR   NR   : BYTE;
  603.       R    : REGISTERS;
  604.       BFP  : ^BUFFERTYP;
  605.  
  606. PROCEDURE BUFFERINHALT;
  607. VAR   I  : BYTE;
  608. BEGIN
  609.   WRITE(TPSTR,NR:3,'  ');
  610.   WRITE(TPSTR,HEXW(SOF(BFP).S),'->');
  611.   WRITE(TPSTR,HEXPTR(BFP^.NXT),' ');
  612.   FOR I := 1 TO 6 DO WRITE(TPSTR,HEXB(BFP^.F1[I]),' ');
  613.   WRITE(TPSTR,HEXPTR(BFP^.DRV),' ');
  614.   FOR I := 1 TO 2 DO WRITE(TPSTR,HEXB(BFP^.F2[I]),' ');
  615.   VWRITELN;
  616.   INC(NR);
  617. END; { BUFFERINHALT }
  618.  
  619. BEGIN { BUFFERANZEIGE }
  620.   IF DOS4 THEN EXIT; { ICH WEIß NOCH NICHT, WIE DAS GEHT }
  621.  
  622.   TEXTATTR := TAKOPF;
  623.   VWRITELNS(' BUFFERS = Liste : ');
  624.   VWRITELNS(' NR. ADDR   NEXT                        DRIVER          ');
  625.   TEXTATTR := TA;
  626.   R.AH := $52;
  627.   MSDOS(R);
  628.   NR := 1;
  629.   BFP := PTR(MEMW[R.ES:R.BX+20],0);
  630. (*
  631. SO SOLLTE MAN ES BEI DOS3.3 NICHT MACHEN, ABER BEI DOS4 SCHEINT DAS SCHON
  632. EHER ZU STIMMEN
  633.   BFP := PTR(MEMW[R.ES:R.BX-6],0);
  634. *)
  635.   REPEAT
  636.     BUFFERINHALT;
  637.     BFP := BFP^.NXT;
  638.   UNTIL (BFP^.NXT = PTR($FFFF,$FFFF));
  639.   BUFFERINHALT;
  640. END; { BUFFERANZEIGE }
  641.  
  642. PROCEDURE DITANZEIGE;
  643. VAR   I,NR  : BYTE;
  644.  
  645. FUNCTION DITNAME:BOOLEAN;
  646. VAR   I  : BYTE;
  647. BEGIN
  648.   DITNAME := FALSE;
  649.   FOR I := 1 TO 11 DO
  650.     IF DIT^.NAME[I] IN [#0..#$1F,#$2A,#$2E,#$3A..#$3F,#$7F,#$A8..#$FF] THEN EXIT;
  651.   DITNAME := TRUE;
  652. END; { DITNAME }
  653.  
  654. PROCEDURE DITINHALT;
  655. BEGIN
  656.   WRITE(TPSTR,NR:3,' ');
  657.   WRITE(TPSTR,HEXPTR(DIT^.NXT),' ');
  658.   WRITE(TPSTR,DIT^.NAME,' ');
  659.   WRITE(TPSTR,HEXPTR(DIT^.DRV),' ');
  660.   VWRITELN;
  661.   IF DOS4 THEN INC(SOF(DIT).O,59) ELSE INC(SOF(DIT).O,53);
  662.   INC(NR);
  663. END; { DITINHALT }
  664.  
  665. BEGIN { DITANZEIGE }
  666.   TEXTATTR := TAKOPF;
  667.   VWRITELNS(' DIT - LISTE                         ');
  668.   TEXTATTR := TA;
  669.   NR := 1;
  670.   REPEAT
  671.     DITINHALT;
  672.   UNTIL NOT DITNAME;
  673.   DIT := BFPTR^;
  674.   REPEAT
  675.     DITINHALT;
  676.   UNTIL NOT DITNAME;
  677. END; { DITANZEIGE }
  678.  
  679. BEGIN { DRIVERDIS }
  680.   IF SETWINDOW(4,$07,100,80,TRUE) THEN EXIT;
  681.  
  682.   GETNBD;
  683.   WITH R DO BEGIN
  684.     AH := $52;
  685.     MSDOS(R);
  686.     MCB   := POINTER(MEML[ES:BX-4]);
  687. {
  688.   ES:BX-8 IST EIN DYNAMISCHER BUFFER- ZEIGER
  689.     BFPTR := POINTER(MEML[ES:BX-8]);
  690. }
  691.     BFPTR := POINTER(MEML[ES:BX+4]);
  692.     DIT   := POINTER(MEML[ES:BX+4]);
  693.     MCB2  := SOF(MCB).S+SUCC(MCB^.LEN);
  694.     NR    := 1;
  695.     HP    := POINTER(MEML[ES:BX+12]); { LETZTER TREIBER }
  696.     VON   := SOF(BFPTR^).S;
  697.     BIS   := PRED(MCB2);
  698.     WHILE VON > BIS DO BEGIN
  699.       SOF(MCB).S := SOF(MCB).S + SUCC(MCB^.LEN);
  700.       BIS := PRED(SOF(MCB).S);
  701.     END;
  702.   END; { WITH R }
  703.  
  704.   IF NOT DOS4DRIVER THEN BEGIN
  705.     VWRITELNS('  --- FILES,BUFFERS,STACKS,FCBS ---');
  706.     L := SUCC(BIS - VON); L := L SHL 4;
  707.     WRITE(TPSTR,'    ',HEXW(VON),'-',HEXW(BIS),' len=',L:5,' ->');
  708.     VWRITE;
  709.     VECTANZ;
  710.     VWRITELN;
  711.   END;
  712.  
  713.   TEXTATTR := TAKOPF;
  714.   WRITE(TPSTR,'     ADRESSE   NAME    ATTR                                                   ');
  715.   VWRITELN;
  716.   TEXTATTR := TA;
  717.   DRVCNT   := 0;
  718.   BIS := PRED(VON);
  719.  
  720.   WHILE (SOF(HP).O <> $FFFF) DO BEGIN
  721.     VON := SOF(HP).S;
  722.     DRV := '';
  723.     WRITE(TPSTR,NR:2,': ',HEXPTR(HP),' ');
  724.     INC(NR);
  725.     IF ((HP^[6] AND $80) = 0) THEN BEGIN
  726. { ANZEIGE LAUFWERKSTREIBER - LAUFWERKSBEZEICHNER }
  727.       DRV := CHR(NBD-DRVCNT-HP^[11]+$41);
  728.       WRITE(TPSTR,DRV,':');
  729.       IF HP^[11] = 1 THEN BEGIN
  730.         WRITE(TPSTR,'      ');
  731.         IF POS(DRV,RAMDRIVES) > 0 THEN BEGIN
  732.           FINDFIRST(DRV+':\*.*',VOLUMEID,F);
  733.           IF DOSERROR = 0 THEN DRV := F.NAME
  734.                           ELSE DRV := '';
  735.         END ELSE DRV := '';
  736.         IF LENGTH(DRV) > 8 THEN DELETE(DRV,9,1);
  737.       END ELSE BEGIN
  738.         DRV := '';
  739.         WRITE(TPSTR,'..',CHR(NBD-DRVCNT+$40),':');
  740.         WRITE(TPSTR,'  ');
  741.       END;
  742.       INC(DRVCNT,HP^[11]);
  743.     END ELSE BEGIN
  744. { ANZEIGE TREIBER - ID }
  745.       FOR I := 11 TO 18 DO WRITE(TPSTR,CHR(HP^[I]));
  746.     END;
  747.     WRITE(TPSTR,' ',HEXB(HP^[6]),HEXB(HP^[5]));
  748. (*
  749.     WRITE(TPSTR,' ',HEXB(HP^[8]),HEXB(HP^[7]));
  750.     WRITE(TPSTR,' ',HEXB(HP^[10]),HEXB(HP^[9]));
  751. *)
  752.     IF SOF(HP).S <> $70 THEN BEGIN
  753.       WRITE(TPSTR,' - ');
  754.       I := 19;
  755.       WHILE HP^[I] IN [10,13,32..126] DO BEGIN
  756.         IF (HP^[I] >= 32) THEN BEGIN
  757.           WRITE(TPSTR,CHR(HP^[I]));
  758.         END;
  759.         INC(I);
  760.       END; { WHILE }
  761.     END; { IF SOF(HP).S <> $70 }
  762.     IF DRV <> '' THEN BEGIN
  763.       VWRITE;
  764.       TEXTATTR := $0E;
  765.       WRITE(TPSTR,DRV);
  766.     END;
  767.     HP := POINTER(MEML[SOF(HP).S:SOF(HP).O]);
  768.     VWRITELN;
  769.     TEXTATTR := TA;
  770.  
  771.     IF VON <> $70 THEN BEGIN
  772.       L := SUCC(BIS - VON); L := L SHL 4;
  773.  
  774.       IF L > 120000 THEN BEGIN
  775.         BIS := PRED(MCB2);
  776.         L := SUCC(BIS - VON); L := L SHL 4;
  777.       END;
  778.  
  779.       WRITE(TPSTR,'    ',HEXW(VON),'-',HEXW(BIS),' len=',L:5,' ->');
  780.       VWRITE;
  781.       VECTANZ;
  782.       VWRITELN;
  783.     END;
  784.     BIS := PRED(VON);
  785.   END; { WHILE }
  786.  
  787.   IF NOT DRDOS THEN BEGIN
  788.     DISPLAYPATHS;
  789.     BUFFERANZEIGE;
  790.     DITANZEIGE;
  791.   END;
  792.  
  793.   CLOSEVSCREEN(4);
  794. END; { DRIVERDIS }
  795.  
  796.  
  797. PROCEDURE WRITEMCBLEN;
  798. BEGIN
  799.   CASE SIZMOD OF
  800.     1 : WRITE(TPSTR,MCBLEN*16:7);             { GRÖßE IN BYTES }
  801.     2 : WRITE(TPSTR,MCBLEN*16/1024:6:2,'k');  { GRÖßE IN K-BYTES }
  802.     3 : WRITE(TPSTR,HEXW(MCBLEN):5,'H');      { GRÖßE IN PARAGRAPHS (HEX) }
  803.     4 : WRITE(TPSTR,MCBLEN:5);                { GRÖßE IN PARAGRAPHS (DEZIMAL) }
  804.   END; { CASE SIZMOD }
  805. END; { WRITEMCBLEN }
  806.  
  807.  
  808. PROCEDURE MCBLISTE;
  809. VAR   W      : WORD;
  810.       EMSPF  : POINTER;
  811. BEGIN
  812.   IF NOT QUIET THEN IF SETWINDOW(1,$07,50,120,TRUE) THEN EXIT;
  813.  
  814.   HATFREI := FALSE;
  815.   EMSPF := NIL;
  816.   IF EMSINSTALLED THEN EMSPF := EMSPAGEFRAMEPTR;
  817.  
  818.   OLDMEM  := NIL;
  819.   OLDMEMJ := NIL;
  820.   MCBAP   := 0;
  821.  
  822.   TEXTATTR := TAKOPF;
  823.   WRITE(TPSTR,'    MCB:  PSP:   Länge: ');
  824.   CASE SIZMOD OF
  825.     1 : WRITE(TPSTR,'Bytes           ');
  826.     2 : WRITE(TPSTR,'k Bytes         ');
  827.     3 : WRITE(TPSTR,'Paragraphs (HEX)');
  828.     4 : WRITE(TPSTR,'Paragraphs      ');
  829.   END;
  830.   WRITE(TPSTR,'                                      ');
  831.   VWRITELN;
  832.   TEXTATTR := TA;
  833.  
  834.   FIRSTMCB;
  835.   MCBLEN := SUCC(SOF(HP).S);
  836.   W := DOSVERSION;
  837.   WRITE(TPSTR,'DOS ',HI(W),'.',LO(W),'(');
  838.   WRITEMCBLEN;
  839.   WRITE(TPSTR,') :');
  840.   VWRITE;
  841.  
  842.   MCB := HP;
  843.   VON := 0;
  844.   BIS := SOF(HP).S;
  845.   VECTANZ;
  846.  
  847.   REPEAT
  848.     TEXTATTR := TA;
  849.     IF MCB^.PSP = 0 THEN BEGIN
  850.       TEXTATTR := TAFREI;
  851.       KA := TRUE;
  852.     END ELSE BEGIN
  853.       KA := FALSE;
  854.       IF (MCB^.PSP = $A000) OR
  855.          (MCB^.PSP = $B000) OR
  856.          (MCB^.PSP = $B800) THEN TEXTATTR := TAPROM;
  857.     END;
  858.     IF BIS > VON THEN VON := BIS;
  859.     VWRITELN;
  860.  
  861.     MCBEND := SOF(MCB).S+SUCC(MCB^.LEN);
  862.     IF (MCBEND = $9FFF) OR (MCBEND = $9FFE) THEN TEXTATTR := TAFRAM;
  863.  
  864.     IF (HP = OLDMEMF) THEN BEGIN
  865.       WRITE(TPSTR,'      <─────  save Interrupts  ─────>');
  866.       VWRITELN;
  867.     END;
  868.     IF (HP = OLDMEMG) THEN BEGIN
  869.       WRITE(TPSTR,'      <─────  save Interrupts (jenseits)  ─────>');
  870.       VWRITELN;
  871.     END;
  872.     IF MCB^.ID = 'Z' THEN BEGIN
  873.       TEXTATTR := TAFRAM;
  874.       IF SOF(HP).S > $A000 THEN OLDMEMJ := HP;
  875.       MCBLEN := SUCC(SOF(MCB).S + MCB^.LEN);
  876.       IF (MCBLEN SHR 6) <> MEMSIZE THEN BEGIN
  877.         MCBLEN := LONGINT(LONGINT(MEMSIZE) SHL 10) - MCBLEN SHL 4;
  878.         WRITE(TPSTR,'!!!!! im letzten MCB fehlen ',MCBLEN,' Bytes !!!!!');
  879.         VWRITELN;
  880.       END;
  881.     END;
  882.  
  883.     INC(MCBAP);
  884.     MCBA[MCBAP].MCBR := MCB^;
  885.     MCBA[MCBAP].ADDR := SOF(MCB).S;
  886.     MCBA[MCBAP].ATTR := 0;
  887.  
  888.     WRITE(TPSTR,MCBC:2,': ',HEXW(SOF(HP).S),'  ',HEXW(MCB^.PSP),' ');
  889.     MCBLEN := MCB^.LEN;
  890.     WRITEMCBLEN;
  891.     WRITE(TPSTR,'  ');
  892.     VWRITE;
  893.  
  894.     MCBNAME(MCB);
  895.     IF (MCB^.ID <> 'Z') THEN BEGIN
  896.       MP := MCB; INC(SOF(MP).S);
  897.       IF NOT BATDISP(SOF(MP).S,TRUE) THEN BEGIN
  898.  
  899.         VWRITE;
  900.         TA0 := TEXTATTR;
  901.         TEXTATTR := TASPEC;
  902.         IF URENV AND (MCB^.PSP = CMDPSP) THEN BEGIN
  903.           WRITE(TPSTR,' Ur- Environment');
  904.           MCBA[MCBAP].ATTR := 4;
  905.           URENV  := FALSE;
  906.         END;
  907.         IF CONFIG AND (SOF(MP).S>LTREIBER) THEN BEGIN
  908.           WRITE(TPSTR,' ',GETENV('COMSPEC'),'<1>');
  909.           MCBA[MCBAP].ATTR := 2;
  910.           CONFIG := FALSE;
  911.           URENV  := TRUE;
  912.           CMDPSP := MCB^.PSP;
  913.         END;
  914.         IF MCB^.PSP = 8 THEN BEGIN
  915.           WRITE(TPSTR,' CONFIG.SYS');
  916.           CONFIG := TRUE;
  917.           MCBA[MCBAP].ATTR := 6;
  918.         END;
  919.         IF (EMSPF <> NIL) AND (PTR(MCB^.PSP,0) = EMSPF) THEN BEGIN
  920.           WRITE(TPSTR,' EMS Pageframe');
  921.         END;
  922.         IF SUCC(SOF(MCB).S) = CHEF THEN BEGIN
  923.           VWRITE;
  924.           TEXTATTR := TAMUTTER;
  925.           WRITE(TPSTR,' Mutterprozess ');
  926.         END;
  927.         VWRITE;
  928.         TEXTATTR := TA0;
  929.       END;
  930.  
  931.       PSPDISP;
  932.       IF (MCBEND >= $9FFE) AND
  933.          (MCBEND <= $C000) AND
  934.          (MCB^.PSP = 0) THEN BEGIN
  935.         IF NOT HATFREI THEN BEGIN
  936.           WRITE(TPSTR,'--- freier Speicher ---');
  937.           MCBA[MCBAP].ATTR := 7;
  938.         END;
  939.         HATFREI := TRUE;
  940.       END;
  941.     END ELSE BEGIN
  942. { LETZTER MCB HAT ID 'Z' }
  943.       AUS := TRUE;
  944.       IF MCB^.PSP = 0 THEN BEGIN
  945.         WRITE(TPSTR,'--- freier Speicher ');
  946.         IF MCBEND > $A000 THEN WRITE(TPSTR,'(jenseits) ');
  947.         WRITE(TPSTR,'---');
  948.         VWRITE;
  949.         MCBA[MCBAP].ATTR := 7;
  950.       END ELSE PSPDISP;
  951. { FESTLEGEN, WO ENDE FREIER SPEICHER IST }
  952.       IF BIS > $A000 THEN BIS := $EFFF ELSE BIS := $9FFF;
  953. { SONDERFALL JENSEITSSPEICHER BIS <F800 }
  954.       IF VON > $F000 THEN BIS := $F7FF;
  955.       VECTANZ;
  956.     END;
  957.     VWRITE;
  958.  
  959.     IF MCB^.LEN = 0 THEN AUS := TRUE;
  960.     IF (MCB^.ID <> 'Z') AND (MCB^.ID <> 'M') THEN BEGIN
  961.       VWRITELN;
  962.       TEXTATTR := $CE;
  963.       WRITE(TPSTR,'!!! Die MCB- Kette ist beschädigt !!!');
  964.       VWRITELN;
  965.       TEXTATTR := $07;
  966.       WRITE(TPSTR,'Adresse : ',HEXW(SOF(MCB).S),'H, ID = ',HEXB(BYTE(MCB^.ID)));
  967.       VWRITE;
  968.       WRITE(TPSTR,'H, PSP = ',HEXW(MCB^.PSP),'H, LEN = ',HEXW(MCB^.LEN),'H ');
  969.       VWRITELN;
  970.       TEXTATTR := $07;
  971.       VWRITELN;
  972.  
  973.       AUS := TRUE;
  974.     END;
  975.  
  976.     IF NOT AUS THEN BEGIN
  977.       INC(MCBC);
  978.       SOF(HP).S := SOF(HP).S + SUCC(MCB^.LEN);
  979.       MCB := HP;
  980.       BIS := SOF(HP).S;
  981.       VECTANZ;
  982.     END;
  983.   UNTIL AUS;
  984.   VWRITELN;
  985.  
  986.  
  987.   IF FILERR THEN BEGIN
  988.     MCBEND := MEMW[$40:$13];
  989.     IF MCBEND <= 640 THEN BEGIN
  990.       IF (MCBEND AND $3F) <> 0 THEN BEGIN
  991.         WRITE(TPSTR,'!!!!! Speichergröße ist kein Vielfaches von 64k !!!!!');
  992.         VWRITELN;
  993.       END;
  994.     END;
  995.     IF (MCBEND AND $1F) <> 0 THEN BEGIN
  996.       WRITE(TPSTR,'!!!!! Speichergröße ist kein Vielfaches von 32k !!!!!');
  997.       VWRITELN;
  998.     END;
  999.     IF (MCBEND AND $0F) <> 0 THEN BEGIN
  1000.       WRITE(TPSTR,'!!!!! Speichergröße ist kein Vielfaches von 16k !!!!!');
  1001.       VWRITELN;
  1002.     END;
  1003.   END ELSE BEGIN
  1004.     IF MEMSIZE <> MEMW[$40:$13] THEN BEGIN
  1005.       WRITE(TPSTR,'!!!!! Virengefahr - Speichergröße ist ungleich SAVE- FILE !!!!!');
  1006.       VWRITELN;
  1007.     END;
  1008.   END;
  1009.  
  1010.   IF BIS < $C000 THEN BEGIN
  1011.     WRITE(TPSTR,'EGA- BIOS C000 :');
  1012.     VWRITE;
  1013.     VON := SUCC(BIS);
  1014.     BIS := $EFFF;
  1015.     VECTANZ;
  1016.     VWRITELN;
  1017.   END;
  1018.  
  1019.   WRITE(TPSTR,'     BIOS F000 :');
  1020.   VWRITE;
  1021.   VON := $F000;
  1022.   BIS := $FFFF;
  1023.   VECTANZ;
  1024.  
  1025.   TEXTATTR := TA;
  1026.   IF NOT QUIET THEN CLOSEVSCREEN(1);
  1027. END; { MCBLISTE }
  1028.  
  1029.  
  1030. PROCEDURE MCBLISTENEU;
  1031. BEGIN
  1032.   CLOSEWINDOW(1);
  1033.   CLOSEWINDOW(3);
  1034.   CLOSEWINDOW(4);
  1035.   MCBLISTE;
  1036. END; { MCBLISTENEU }
  1037.  
  1038.  
  1039. PROCEDURE KOPFZEILE;
  1040. BEGIN
  1041.   INIMAUS;
  1042.   FASTREAD(80,1,1,KT1);
  1043.   READATTRIBUTE(80,1,1,KA1);
  1044.   FASTREAD(80,2,1,KT2);
  1045.   READATTRIBUTE(80,2,1,KA2);
  1046.   FLEXWRITE('<F1>'^A'-Help,  '^B'<F2>'^A'-MCBs,    '+
  1047.           ^B'<F3>'^A'-INT-VEC,   '^B'<F4>'^A'-MEMORY, '+
  1048.           ^B'<F5>'^A'-DEVICE, '^B'<F6>'^A'-CONFIG ',
  1049.           1,1,KOPFZATT);
  1050.   FLEXWRITE('<F7>'^A'-Close, '^B'<F8>'^A'-MCB-Inf, '+
  1051.           ^B'<F9>'^A'-Dump, '^B'<ShF5>'^A'-Restore, '+
  1052.           ^B'<ShF9>'^A'-Save, '^C'<Alt-Esc>-Ende',
  1053.           2,1,KOPFZATT);
  1054.   QUIET := FALSE;
  1055.   BLOCKCURSOR;
  1056.   GOTOXY(71,2);
  1057. END; { KOPFZEILE }
  1058.  
  1059.  
  1060. PROCEDURE UPDWIN;
  1061. BEGIN
  1062.   MOVEVSCREENTOWINDOW(SC[WN],WP[WN].Y,WP[WN].X);
  1063.   HIDDENCURSOR;
  1064. END; { UPDWIN }
  1065.  
  1066.  
  1067. PROCEDURE DUMP;
  1068. VAR   W        : WORD;
  1069.       CH1,CH2  : CHAR;
  1070.       DW       : WINDOWPTR;
  1071.       S1,S2    : STRING;
  1072.       WNM      : BYTE;
  1073. BEGIN { DUMP }
  1074.   DUMPADDR := '';
  1075.   IF NOT MAKEWINDOW(DW,1,15,80,25,TRUE,TRUE,FALSE,$1E,$70,$70,' DUMP   <Esc> = Ende ')
  1076.     THEN ALERT('FEHLER MAKEWINDOW');
  1077.   IF NOT ACTIVATEWINDOW(DW) THEN ALERT('FEHLER ACTIVATEWINDOW');
  1078.  
  1079.   WNM := WN;
  1080.   WN  := 99;
  1081.   REPEAT
  1082.     HIDDENCURSOR;
  1083.     IF NOT KEYPRESSED THEN DUMPBLOCK;
  1084.     MOUSEORKEY;
  1085.     CH1 := UPCASE(READKEY); IF CH1 = #0 THEN CH2 := READKEY ELSE CH2 := #0;
  1086.  
  1087.     CASE CH1 OF
  1088.        ^M : BEGIN
  1089.               MSN := MS;
  1090.               MON := MO;
  1091.               W := POS(':',DUMPADDR);
  1092.               IF W > 0 THEN BEGIN
  1093.                 S1 := '$' + COPY(DUMPADDR,1,PRED(W));
  1094.                 S2 := '$' + COPY(DUMPADDR,SUCC(W),LENGTH(DUMPADDR)-W+1);
  1095.                 IF STR2WORD(S1,W) THEN MS := W ELSE MS := 0;
  1096.               END ELSE BEGIN
  1097.                 S2 := '$' + DUMPADDR;
  1098.               END;
  1099.               IF STR2WORD(S2,W) THEN MO := W ELSE MO := 0;
  1100.               GOTOXY(1,1); CLREOL;
  1101.               DUMPADDR := '';
  1102.               MSM := MS;
  1103.               MOM := MO;
  1104.             END;
  1105.        ^H : BEGIN
  1106.               IF LENGTH(DUMPADDR) > 0 THEN DELETE(DUMPADDR,LENGTH(DUMPADDR),1);
  1107.             END;
  1108.       ':' : BEGIN
  1109.               IF POS(':',DUMPADDR) = 0 THEN DUMPADDR := DUMPADDR + ':';
  1110.             END;
  1111.  '0'..'9',
  1112.  'A'..'F' : BEGIN
  1113.               DUMPADDR := DUMPADDR + CH1;
  1114.             END;
  1115.     END; {CASE CH1 }
  1116.  
  1117.     CASE CH2 OF
  1118.        #0 : BEGIN END;
  1119.        #1 : BEGIN
  1120.               CH1 := ^[;
  1121.               CH2 := #0;
  1122.               STUFFKEY($100);
  1123.             END;
  1124. {RI}  #77 : BEGIN
  1125.               INC(MO,16);
  1126.             END;
  1127. {LE}  #75 : BEGIN
  1128.               DEC(MO,16);
  1129.             END;
  1130. {UP}  #72 : BEGIN
  1131.               DEC(MO,128);
  1132.             END;
  1133. {DN}  #80 : BEGIN
  1134.               INC(MO,128);
  1135.             END;
  1136. {PU}  #73 : BEGIN
  1137.               DEC(MS);
  1138.             END;
  1139. {PD}  #81 : BEGIN
  1140.               INC(MS);
  1141.             END;
  1142. {HO}  #71 : BEGIN
  1143.               MS := MSM;
  1144.               MO := MOM;
  1145.             END;
  1146. {EN}  #79 : BEGIN
  1147.               W   := MS;
  1148.               MS  := MSN;
  1149.               MSN := W;
  1150.               W   := MO;
  1151.               MO  := MON;
  1152.               MON := W;
  1153.             END;
  1154.  
  1155. {CRI}#116 : BEGIN
  1156.               IF MOVEWINDOW(1,0) THEN HIDDENCURSOR;
  1157.             END;
  1158. {CLE}#115 : BEGIN
  1159.               IF MOVEWINDOW(-1,0) THEN HIDDENCURSOR;
  1160.             END;
  1161. {CUP}#141 : BEGIN
  1162.               IF MOVEWINDOW(0,-1) THEN HIDDENCURSOR;
  1163.             END;
  1164. {CDN}#145 : BEGIN
  1165.               IF MOVEWINDOW(0,1) THEN HIDDENCURSOR;
  1166.             END;
  1167.     ELSE { CASE CH2 }
  1168. {
  1169.   DIE FUNKTIONSTASTEN WERDEN AN DAS ÜBERGEORDNETE PROGRAMM
  1170.   IM TASTATURBUFFER ÜBERGEBEN, DUMP WIRD BEENDET
  1171. }
  1172.       STUFFKEY(BYTE(CH2) SHL 8);
  1173.       CH1 := ^[;
  1174.     END; { CASE CH2 }
  1175.   UNTIL CH1 = ^[;
  1176.   DW := ERASETOPWINDOW;
  1177.   DISPOSEWINDOW(DW);
  1178.   WN := WNM;
  1179. END; { DUMP }
  1180.  
  1181.  
  1182. PROCEDURE MAUSINFO;
  1183. VAR   R  : REGISTERS;
  1184.       I  : WORD;
  1185.       P  : ^CHARRAY;
  1186.       Q  : POINTER;
  1187. BEGIN
  1188.   VWRITELN;
  1189.   GETINTVEC($33,Q);
  1190.   IF (Q = NIL) OR (MEM[SOF(Q).S:SOF(Q).O] = $CF) THEN BEGIN
  1191.     VWRITELNS('  Es ist kein Maustreiber installiert');
  1192.     EXIT;
  1193.   END;
  1194.  
  1195.   IF MAUSAKT THEN BEGIN
  1196.     DISABLEEVENTHANDLING;
  1197.     RESTOREMOUSESTATE(MSP,FALSE);
  1198.   END;
  1199.  
  1200.   WITH R DO BEGIN
  1201. { GET VERSION }
  1202.     AX := 36;
  1203.     BX := $FFFF;
  1204.     INTR($33,R);
  1205.     IF BX = $FFFF THEN BEGIN
  1206.       VWRITELNS('    Maustreiber ist installiert');
  1207.       VWRITELNS('  Funktion 36 (GET VERSION) ist nicht verfügbar');
  1208.     END ELSE BEGIN
  1209.       WRITE(TPSTR,'  Maustreiber Version ',BH,'.',HEXB(BL));
  1210.       VWRITELN;
  1211.       WRITE(TPSTR,'  IRQ = ',CL,'     ');
  1212.       CASE CH OF
  1213.         1 : WRITE(TPSTR,'BUS- Maus');
  1214.         2 : WRITE(TPSTR,'serielle Maus');
  1215.         3 : WRITE(TPSTR,'InPort- Maus');
  1216.         4 : WRITE(TPSTR,'PS/2- Maus');
  1217.         5 : WRITE(TPSTR,'Hewlett-Packard- Maus');
  1218.       ELSE
  1219.         WRITE(TPSTR,'unbekannter Maustyp ',CH);
  1220.       END; { CASE CH }
  1221.       VWRITELN;
  1222.     END;
  1223. { SWAP INTERRUPT ROUTINES }
  1224.     AX := 20;
  1225.     CX := 0;
  1226.     DX := $FFFF;
  1227.     ES := $FFFF;
  1228.     INTR($33,R);
  1229.     IF (ES = $FFFF) AND (DX = $FFFF) THEN BEGIN
  1230.       VWRITELNS('  Funktion 20 (SWAP INTERRUPT SUBROUTINES) ist nicht verfügbar');
  1231.     END ELSE BEGIN
  1232.       AX := 20;
  1233.       WRITE(TPSTR,'  Mausevent auf Adresse ',HEXW(ES),':',HEXW(DX),'   Maske = ',HEXW(CX));
  1234.       VWRITELN;
  1235.       INTR($33,R); { DIE ALTEN WERTE WIEDERHERSTELLEN }
  1236.     END;
  1237. { GET DRIVER STATE STORAGE REQUIREMENT }
  1238.     AX := 21;
  1239.     BX := $FFFF;
  1240.     INTR($33,R);
  1241.     IF BX = $FFFF THEN BEGIN
  1242.       VWRITELNS('  Funktion 22 (SAVE MOUSEDRIVER STATUS) ist nicht verfügbar');
  1243.     END ELSE BEGIN
  1244.       WRITE(TPSTR,'  Größe des Mausstatus- Buffers = ',BX);
  1245.       VWRITELN;
  1246.     END;
  1247. { GET MOUSE SENSITIVITY }
  1248.     AX := 27;
  1249.     BX := $FFFF;
  1250.     INTR($33,R);
  1251.     IF BX = $FFFF THEN BEGIN
  1252.       VWRITELNS('  Funktion 27 (GET MOUSE SENSITIVITY) ist nicht verfügbar');
  1253.     END ELSE BEGIN
  1254.       WRITE(TPSTR,'  Empfindlichkeit hor. = ',BX);
  1255.       WRITE(TPSTR,',  vert. = ',CX);
  1256.       WRITE(TPSTR,',  Schwellwert = ',DX);
  1257.       VWRITELN;
  1258.     END;
  1259. { GET CRT PAGE }
  1260.     AX := 30;
  1261.     BX := $FFFF;
  1262.     INTR($33,R);
  1263.     IF BX = $FFFF THEN BEGIN
  1264.       VWRITELNS('  Funktion 30 (GET CRT PAGE) ist nicht verfügbar');
  1265.     END ELSE BEGIN
  1266.       WRITE(TPSTR,'  Maus- CRT- Page = ',BX);
  1267.       VWRITELN;
  1268.     END;
  1269. { 'GEHEIM'- FUNKTION 'M' }
  1270.     AX := $4D;
  1271.     DI := 0;
  1272.     ES := 0;
  1273.     INTR($33,R);
  1274.     IF PTR(ES,DI) = NIL THEN BEGIN
  1275.     END ELSE BEGIN
  1276.       VWRITELNS('  ''GEHEIMFUNKTION'' 4DH IST INSTALLIERT ');
  1277.       P := PTR(ES,DI);
  1278.       WRITE(TPSTR,'  ',HEXPTR(P),'->');
  1279.       I := 1;
  1280.       WHILE P^[I] IN [' '..#$A7] DO BEGIN
  1281.         WRITE(TPSTR,P^[I]);
  1282.         INC(I);
  1283.       END;
  1284.       VWRITELN;
  1285.     END;
  1286. { 'GEHEIM'- FUNKTION 'm' }
  1287.     AX := $6D;
  1288.     DI := 0;
  1289.     ES := 0;
  1290.     INTR($33,R);
  1291.     IF PTR(ES,DI) = NIL THEN BEGIN
  1292.     END ELSE BEGIN
  1293.       VWRITELNS('  ''GEHEIMFUNKTION'' 6DH IST INSTALLIERT ');
  1294.     END;
  1295.   END; { WITH R }
  1296.   INIMAUS;
  1297. END; { MAUSINFO }
  1298.  
  1299.  
  1300. FUNCTION HIMEMINST:BOOLEAN;
  1301. VAR   I2FPTR  : POINTER ABSOLUTE $0:$BC;
  1302.       R       : REGISTERS;
  1303. BEGIN
  1304.   HIMEMINST := FALSE;
  1305.   IF I2FPTR = NIL THEN EXIT;
  1306.   R.AX := $4300;
  1307.   INTR($2F,R);
  1308.   IF R.AL <> $80 THEN EXIT;
  1309.  
  1310.   R.AX := $4310;
  1311.   INTR($2F,R);
  1312.   SOF(XMSENTRY).S := R.ES;
  1313.   SOF(XMSENTRY).O := R.BX;
  1314.  
  1315.   HIMEMINST := TRUE;
  1316. END; { HIMEMINST }
  1317.  
  1318.  
  1319. PROCEDURE XMS; EXTERNAL;
  1320. {$L XMS}
  1321. {$F+}
  1322. FUNCTION CPU_TYPE:INTEGER; EXTERNAL;
  1323. {$L GETCPU}
  1324. FUNCTION VIDADAP:INTEGER; EXTERNAL;
  1325. {$L VIDEOID}
  1326. {$F-}
  1327.  
  1328.  
  1329. PROCEDURE VADAPTERTEXT(I:BYTE);
  1330. BEGIN
  1331.   CASE I OF
  1332.      0 : WRITE(TPSTR,'nicht vorhanden');
  1333.      1 : WRITE(TPSTR,'MDA Monochrom Display Adapter');
  1334.      2 : WRITE(TPSTR,'CGA Color Graphics Adapter');
  1335.    3,9 : WRITE(TPSTR,'reservierter DCC');
  1336.      4 : WRITE(TPSTR,'EGA Enhanced Graphics Adapter Color Mode');
  1337.      5 : WRITE(TPSTR,'EGA Enhanced Graphics Adapter Monochrom Mode');
  1338.      6 : WRITE(TPSTR,'PGA Professional Graphics Controller');
  1339.      7 : WRITE(TPSTR,'VGA Video Graphics Array mit Monochrom Display');
  1340.      8 : WRITE(TPSTR,'VGA Video Graphics Array mit Color Display');
  1341.     10 : WRITE(TPSTR,'MCGA mit digitalem Color Display');
  1342.     11 : WRITE(TPSTR,'MCGA mit analogem Monochrom Diaplay');
  1343.     12 : WRITE(TPSTR,'MCGA mit analogem Color Display');
  1344.     64 : WRITE(TPSTR,'HGC Hercules Graphics Card');
  1345.   ELSE
  1346.     WRITE(TPSTR,'nicht erkannt');
  1347.   END; { CASE I }
  1348. END; { VADAPTERTEXT }
  1349.  
  1350.  
  1351. PROCEDURE SHADOWDISP(PFBA:WORD);
  1352. VAR   I,J  : WORD;
  1353.  
  1354. PROCEDURE RAMTEST(SEGM:WORD);
  1355. VAR   B1,B2  : BYTE;
  1356.       TA     : BYTE;
  1357. BEGIN
  1358.   NMI(OFF);
  1359.   B1 := MEM[SEGM:0];
  1360.   MEM[SEGM:0] := B1 XOR $FF;
  1361.   B2 := MEM[SEGM:0];
  1362.   MEM[SEGM:0] := B1;
  1363.   TA := TEXTATTR;
  1364.  
  1365.   WRITE(TPSTR,HEXW(SEGM),': ');
  1366.   IF (B1 <> (B2 XOR $FF)) AND (B1 <> B2) THEN BEGIN
  1367.     WRITE(TPSTR,'undefin.');
  1368.   END ELSE BEGIN
  1369.     IF (MEMW[SEGM:0] = $55AA) OR (MEMW[SEGM:0] = $AA55) THEN BEGIN
  1370.       WRITE(TPSTR,'BIOS ');
  1371.     END ELSE BEGIN
  1372.       IF (SEGM >= PFBA) AND (SEGM < (PFBA+$1000)) THEN BEGIN
  1373.         WRITE(TPSTR,' EMS ');
  1374.       END ELSE BEGIN
  1375.         WRITE(TPSTR,'.... ');
  1376.       END;
  1377.     END;
  1378.     VWRITE;
  1379.     IF B1 <> (B2 XOR $FF) THEN WRITE(TPSTR,'...')
  1380.     ELSE BEGIN
  1381.       TEXTATTR := TAMRAM;
  1382.       TEXTCOLOR(15);
  1383.       WRITE(TPSTR,'RAM');
  1384.       VWRITE;
  1385.       TEXTATTR := TA;
  1386.     END;
  1387.   END;
  1388.   WRITE(TPSTR,'  ');
  1389.   VWRITE;
  1390.   NMI(ON);
  1391. END; { RAMTEST }
  1392.  
  1393. BEGIN { SHADOWDISP }
  1394.   FOR I := $0A TO $0F DO BEGIN
  1395.     WRITE(TPSTR,'    ');
  1396.     FOR J := 0 TO 3 DO RAMTEST((I SHL 12) + (J SHL 10));
  1397.     VWRITELN;
  1398.   END; { NEXT I }
  1399. END; { SHADOWDISP }
  1400.  
  1401.  
  1402. PROCEDURE MEMINFO;
  1403. VAR   VERS              : BYTE;
  1404.       PFBP              : POINTER;
  1405.       SRAM,BRAM,
  1406.       XRAM,XRG,XRA,EMG,
  1407.       PFBA,TPAG,PGAV    : WORD;
  1408.       AT                : BOOLEAN;
  1409. BEGIN
  1410.   IF SETWINDOW(5,$1B,50,80,TRUE) THEN EXIT;
  1411.  
  1412.   IF ABS(CPU_TYPE) >= 286 THEN AT := ISAT ELSE AT := FALSE;
  1413.   VWRITELN;
  1414. { --- SYSTEM- RAM }
  1415.   BRAM := MEMW[$40:$13];
  1416.   IF AT THEN BEGIN
  1417.     SRAM := GETPORT(RTC,$15) + (GETPORT(RTC,$16) SHL 8);
  1418.     WRITE(TPSTR,'   System RAM (SETUP) = ',SRAM:4,'k           ');
  1419.     WRITE(TPSTR,'    (BIOS) = ',BRAM:4,'k');
  1420.   END ELSE BEGIN
  1421.     WRITE(TPSTR,'   System RAM = ',BRAM:4,'k');
  1422.   END;
  1423.   VWRITELN;
  1424.   VWRITELN;
  1425.  
  1426. { --- HIMEM- TREIBER }
  1427.   IF HIMEMINST THEN BEGIN
  1428. { XMS VERSION ABFRAGEN }
  1429.     RAX := 0;
  1430.     XMS;
  1431.     WRITE(TPSTR,'   HIMEM- Treiber Version ');
  1432.     WRITE(TPSTR,HEXB(HI(RAX)),'.',HEXB(LO(RAX)));
  1433.     WRITE(TPSTR,' (',HEXB(HI(RBX)),'.',HEXB(LO(RBX)),'),');
  1434.     WRITE(TPSTR,'  HIMEM ist ');
  1435.     IF RDX <> 1 THEN WRITE(TPSTR,'nicht ');
  1436.     WRITE(TPSTR,'vorhanden');
  1437.     VWRITELN;
  1438.     IF RDX = 1 THEN BEGIN
  1439. { HMA ANFORDERN - GRÖßE SOVIEL WIE MÖGLICH }
  1440.       RAX := $0100;
  1441.       RDX := $FFFF;
  1442.       XMS;
  1443.       CASE LO(RBX) OF
  1444.         $00 : BEGIN
  1445.                 WRITE(TPSTR,'   HMA verfügbar = ',RDX,' Bytes');
  1446.                 RAX := $0200; { RELEASE HMA }
  1447.                 XMS;
  1448.               END;
  1449.         $81 : WRITE(TPSTR,'   HMA ist nicht verfügbar, weil VDISK installiert ist');
  1450.         $91 : WRITE(TPSTR,'   HMA ist von einem anderen Programm belegt');
  1451.       ELSE WRITE(TPSTR,'   Request HMA Error ',HEXB(LO(RBX)));
  1452.       END; { CASE LO(RBX) }
  1453.       VWRITELN;
  1454. { XMA ABFRAGEN }
  1455.       RAX := $0800;
  1456.       XMS;
  1457.       WRITE(TPSTR,'   XMA verfügbar = ',RDX,'k Bytes');
  1458.       IF RDX <> RAX THEN WRITE(TPSTR,',    größter Block = ',RAX,'k Bytes');
  1459.       VWRITELN;
  1460. { UMA ANFORDERN }
  1461.       RAX := $1000;
  1462.       RDX := $FFFF;
  1463.       XMS;
  1464.       IF LO(RBX) <> $80 THEN BEGIN
  1465.         CASE LO(RBX) OF
  1466.           $00 : BEGIN
  1467.                   WRITE(TPSTR,'   UMA verfügbar = ',RDX,' Bytes');
  1468.                   WRITE(TPSTR,'   UMA Segment = ',HEXW(RBX));
  1469.                 END;
  1470.           $B0 : WRITE(TPSTR,'   UMA ist zu klein');
  1471.           $B1 : WRITE(TPSTR,'   UMA ist nicht verfügbar');
  1472.         ELSE WRITE(TPSTR,'   Request HMA Error ',HEXB(LO(RBX)));
  1473.         END; { CASE LO(RBX) }
  1474.         VWRITELN;
  1475.       END; { IF LO(RBX) <> $80 }
  1476.     END; { IF RAX = 1 }
  1477.   END ELSE BEGIN
  1478.     WRITE(TPSTR,' Es ist kein HIMEM- Treiber installiert');
  1479.     VWRITELN;
  1480.   END; { IF HIMEMINST }
  1481.   VWRITELN;
  1482.  
  1483. { --- EMS MEMORY }
  1484.   EMG := 0;
  1485.   PFBA := 0;
  1486.   IF EMSINSTALLED THEN BEGIN  { EMM installiert? }
  1487.     VERS := EMSVERSION;
  1488.     PFBP := EMSPAGEFRAMEPTR;
  1489.     PFBA := SOF(PFBP).S;
  1490.     TPAG := EMSTOTALPAGES;
  1491.     EMG  := TPAG * 16;
  1492.     PGAV := EMSPAGESAVAIL;
  1493.     WRITE(TPSTR,'   EMM- Version : ',VERS SHR 4,'.',VERS AND $0F,'                   ');
  1494.     WRITE(TPSTR,'Page Frame = ',HEXW(PFBA),'H');
  1495.     VWRITELN;
  1496.     WRITE(TPSTR,'   EMS- Seiten gesamt = ',TPAG:3,' (',EMG,'k)     ');
  1497.     WRITE(TPSTR,' verfügbar = ',PGAV:3,' (',PGAV*16,'k)');
  1498.     VWRITELN;
  1499.   END ELSE BEGIN
  1500.     VWRITELNS(' Es ist kein EMS- Treiber installiert');
  1501.   END;
  1502.   VWRITELN;
  1503.  
  1504. { --- EXTENDED MEMORY OHNE XMM }
  1505.   IF AT THEN BEGIN
  1506.     XRG := EXTMEMTOTAL SHR 10;
  1507.     XRA := EXTMEMAVAIL;
  1508.     WRITE(TPSTR,'   Extended RAM total = ',XRG:4,'k           ');
  1509.     WRITE(TPSTR,' verfügbar = ',XRA:4,'k');
  1510.     VWRITELN;
  1511.     XRAM := GETPORT(RTC,$30) + (GETPORT(RTC,$31) SHL 8);
  1512.     WRITE(TPSTR,' Extended RAM (SETUP) = ',XRAM:4,'k     ');
  1513.     IF (EMG > 0) AND (XRG > 0) THEN WRITE(TPSTR,'  EMS + Extended = ',EMG+XRG:4,'k');
  1514.     VWRITELN;
  1515.   END;
  1516.  
  1517. { --- DOS VERSION, HANDLES }
  1518.   VWRITELN;
  1519.   WRITE(TPSTR,'   Prozessor = 80',ABS(CPU_TYPE));
  1520.   VWRITELN;
  1521.   I := VIDADAP;
  1522.   WRITE(TPSTR,'   Video Adapter 1 = ');
  1523.   VADAPTERTEXT(HI(I));
  1524.   VWRITELN;
  1525.   WRITE(TPSTR,'   Video Adapter 2 = ');
  1526.   VADAPTERTEXT(LO(I));
  1527.   VWRITELN;
  1528.   IF DRDOS THEN WRITE(TPSTR,'   DRDOS') ELSE WRITE(TPSTR,'   DOS');
  1529.   WRITE(TPSTR,' Version ',HI(DOSVERSION),'.',LO(DOSVERSION));
  1530.   WRITE(TPSTR,'                   ');
  1531.   WRITE(TPSTR,FILEHANDLESLEFT+FILEHANDLESOPEN(TRUE),' File- Handles sind verfügbar');
  1532.   VWRITELN;
  1533.  
  1534. { --- SPEICHERBELEGUNG AB 0A000:0 }
  1535.   VWRITELN;
  1536.   VWRITELNS('          Speicherbelegung A000:0000..F000:FFFF :');
  1537.   VWRITELN;
  1538.   SHADOWDISP(PFBA);
  1539.  
  1540. { --- EIGENEN FREIEN HEAP ANZEIGEN }
  1541.   VWRITELN;
  1542.   WRITE(TPSTR,'  MEMAVAIL = ',MEMAVAIL:8,'           MAXAVAIL = ',MAXAVAIL:8);
  1543.   VWRITELN;
  1544.   WRITE(TPSTR,'  MCBLIST wurde aufgerufen von ',QUELLDIR);
  1545.   VWRITELN;
  1546.   WRITE(TPSTR,'     MCBLIST befindet sich auf ',ZIELDIR);
  1547.   VWRITELN;
  1548. { ALS SCHMANKERL NOCH DEN MUTTERPROZESS ANZEIGEN }
  1549.   WRITE(TPSTR,'  Der Mutterprozess von MCBLIST ist ');
  1550.   IF PSPPTR(PTR(CHEF,0))^.CMDSEG = CHEF THEN BEGIN
  1551.     WRITE(TPSTR,GETENV('COMSPEC'));
  1552.   END ELSE BEGIN
  1553.     WRITE(TPSTR,HOLENAME(PTR(PSPPTR(PTR(CHEF,0))^.ENVSEG,0)));
  1554.   END;
  1555.   VWRITELN;
  1556.   WRITE(TPSTR,'  mit PSP auf Adresse ',HEXW(CHEF),':0000,  Environment ');
  1557.   WRITE(TPSTR,HEXW(PSPPTR(PTR(CHEF,0))^.ENVSEG),':0000');
  1558.   VWRITELN;
  1559. { MAUSTREIBER- INFO HOLEN }
  1560.   MAUSINFO;
  1561.  
  1562.   CLOSEVSCREEN(5);
  1563. END; { MEMINFO }
  1564.  
  1565.  
  1566. PROCEDURE PSPINHALT(PP:PSPPTR);
  1567. VAR   MP    : ^BYTEARR;
  1568. BEGIN
  1569.   IF PP^.INTR20 <> $20CD THEN EXIT;
  1570.   WRITE(TPSTR,'End of allocation block = ',HEXW(PP^.ENDBL));
  1571.   VWRITELN;
  1572.   WRITE(TPSTR,'       INT 22H- Pointer = ',HEXPTR(PP^.I22PTR));
  1573.   VWRITELN;
  1574.   WRITE(TPSTR,'       INT 23H- Pointer = ',HEXPTR(PP^.I23PTR));
  1575.   VWRITELN;
  1576.   WRITE(TPSTR,'       INT 24H- Pointer = ',HEXPTR(PP^.I24PTR));
  1577.   VWRITELN;
  1578.   WRITE(TPSTR,' Mutterprozess- Segment = ',HEXW(PP^.CMDSEG));
  1579.   VWRITELN;
  1580.   WRITE(TPSTR,'   Environment- Segment = ',HEXW(PP^.ENVSEG));
  1581.   VWRITELN;
  1582.   WRITE(TPSTR,'Comandline = ≥',PP^.CMDLIN,'≤');
  1583.   VWRITELN;
  1584.   WRITE(TPSTR,'Handle- Tabelle : ',HEXPTR(PP^.HNDPTR));
  1585.   WRITE(TPSTR,'  Anzahl Handles = ',PP^.HNDMAX);
  1586.   VWRITELN;
  1587.   MP := PP^.HNDPTR;
  1588.   FOR I := 1 TO PP^.HNDMAX DO BEGIN
  1589.     IF MP^[I] <> $FF THEN BEGIN
  1590.       IF I > 1 THEN WRITE(TPSTR,',');
  1591.       WRITE(TPSTR,MP^[I]);
  1592.     END;
  1593.   END;
  1594.   VWRITELN;
  1595. END; { PSPINHALT }
  1596.  
  1597.  
  1598. PROCEDURE MEHRINFO;
  1599. VAR   MP     : ^CHARRAY;
  1600.       PP     : PSPPTR;
  1601.       I,J,K  : INTEGER;
  1602.       TA     : BYTE;
  1603.       R      : REGISTERS;
  1604.       S      : STRING;
  1605. BEGIN
  1606.   IF MCBAP < 1 THEN EXIT;
  1607.   IF MCBDP < 1 THEN MCBDP := 1;
  1608.   IF SETWINDOW(7,$07,60,60,TRUE) THEN CLRVSCREEN(7,$07);
  1609.  
  1610.   TA := TEXTATTR;
  1611.   TEXTATTR := $5B;
  1612.   VWRITELNS('       ''+'',''-'' = MCB- Nummer ändern                  ');
  1613.   TEXTATTR := TA;
  1614.   WRITE(TPSTR,'  MCB ',MCBDP,': ');
  1615.   WRITE(TPSTR,'  ',HEXW(MCBA[MCBDP].ADDR),':0000  ');
  1616.   CASE MCBA[MCBDP].ATTR OF
  1617.     1 : WRITE(TPSTR,'Environment');
  1618.     2 : WRITE(TPSTR,'PSP');
  1619.     3 : WRITE(TPSTR,'Batch');
  1620.     4 : WRITE(TPSTR,'Ur- Environment');
  1621.     5 : WRITE(TPSTR,'Video- RAM und EPROM');
  1622.     6 : WRITE(TPSTR,'CONFIG.SYS');
  1623.     7 : WRITE(TPSTR,'freier Speicher');
  1624.   ELSE
  1625.     WRITE(TPSTR,'nicht identifiziert');
  1626.     VWRITELN;
  1627.     WRITE(TPSTR,'  wahrscheinlich ein Treiber');
  1628.   END; { CASE }
  1629.   IF MCBA[MCBDP].MCBR.PSP = 0 THEN WRITE(TPSTR,' -frei-');
  1630.   VWRITELN;
  1631.   IF MCBA[MCBDP].MCBR.ID = 'Z' THEN VWRITELNS('       letzter MCB');
  1632.   CASE MCBA[MCBDP].ATTR OF
  1633.   1,4 : BEGIN
  1634.           MP := PTR(SUCC(MCBA[MCBDP].ADDR),0);
  1635.           I := 1; J := 0; K := 0;
  1636.           REPEAT
  1637.             IF MP^[I] = #0 THEN BEGIN
  1638.               INC(J);
  1639.               K := 0;
  1640.               IF J = 1 THEN VWRITELN;
  1641.             END ELSE BEGIN
  1642.               WRITE(TPSTR,MP^[I]);
  1643.               INC(K);
  1644.               IF K > 58 THEN BEGIN
  1645.                 VWRITELN;
  1646.                 K := 0;
  1647.               END;
  1648.               J := 0;
  1649.             END;
  1650.             INC(I);
  1651.           UNTIL J = 2;
  1652.           IF MP^[I] = #1 THEN BEGIN
  1653.             VWRITELNS('  Programmname :');
  1654.             INC(I,2);
  1655.             WHILE MP^[I] <> #0 DO BEGIN
  1656.               WRITE(TPSTR,MP^[I]);
  1657.               INC(I);
  1658.             END;
  1659.             VWRITELN;
  1660.           END;
  1661.         END;
  1662.     2 : BEGIN
  1663.           PP := PTR(MCBA[MCBDP].MCBR.PSP,0);
  1664.           PSPINHALT(PP);
  1665.         END;
  1666.     3 : BEGIN
  1667.           IF BATDISP(SUCC(MCBA[MCBDP].ADDR),FALSE) THEN VWRITELN;
  1668.         END;
  1669.     5 : BEGIN
  1670.           FOR I := 1 TO 25 DO BEGIN
  1671.             DEACTIVATEVSCREEN;
  1672.             FASTREAD(60,I,1,S);
  1673.             ACTIVATEVSCREEN(SC[7]);
  1674.             VWRITELNS(S);
  1675.           END;
  1676.         END;
  1677.     6 : BEGIN
  1678.           R.AH := $52;
  1679.           MSDOS(R);
  1680.           WRITE(TPSTR,'    MSDOS(52)  ES:BX (',HEXPTR(PTR(R.ES,R.BX)),')');
  1681.           VWRITELN;
  1682. (*
  1683.           FOR I := -3 TO 10 DO DISPPTR(R.ES,R.BX,I*4);
  1684. *)
  1685.           FOR I := -3 TO 3  DO DISPPTR(R.ES,R.BX,I*4);
  1686.           WRITE(TPSTR,'  16 = '+HEXPTR(PTR(R.ES,R.BX+16))
  1687.                      +' -> '+HEXW(MEM[R.ES:R.BX+16]));
  1688.           VWRITELN;
  1689.           FOR I :=  4 TO 10 DO DISPPTR(R.ES,R.BX,I*4 + 2);
  1690.         END;
  1691.     7 : BEGIN
  1692.           PP := PTR(SUCC(MCBA[MCBDP].ADDR),0);
  1693.           PSPINHALT(PP);
  1694.         END;
  1695.   END; { CASE }
  1696.  
  1697.   CLOSEVSCREEN(7);
  1698. END; { MEHRINFO }
  1699.  
  1700.  
  1701.  
  1702. BEGIN { MAIN }
  1703.   CHECKBREAK := FALSE;
  1704.   CHECKSNOW  := FALSE;
  1705.  
  1706.   I9MERK := I9VECT;
  1707.  
  1708.   QUIET  := TRUE;
  1709.   NOWIN  := FALSE;
  1710.   WNM    := 0;
  1711.   SIZMOD := 1;
  1712.   MS     := 0;
  1713.   MSM    := 0;
  1714.   MSN    := 0;
  1715.   MO     := 0;
  1716.   MOM    := 0;
  1717.   MON    := 0;
  1718.   KT1    := '';
  1719.   MCBAP  := 0;
  1720.   MCBDP  := 1;
  1721.   HATPAR := FALSE;
  1722.   FILERR := TRUE;
  1723.  
  1724.   CX := WHEREX;
  1725.   CY := WHEREY;
  1726.   MSX := 1;
  1727.   MSY := 1;
  1728.   BUT := NOBUTTON;
  1729.   MAUSAKT := FALSE;
  1730.  
  1731.   TEXTATTR := TANORM;
  1732.   TA := TEXTATTR;
  1733.   IF NOT ENTFERNE(MEMW[PREFIXSEG:$2C]) THEN {};
  1734.   IF NOT ENTFERNE(PREFIXSEG) THEN {};
  1735.   CHEF := PSPPTR(PTR(PREFIXSEG,0))^.CMDSEG;
  1736.  
  1737.   EXPLODE := TRUE;
  1738.   SOUNDFLAGW := FALSE;
  1739.   EXPLODEDELAY := 3;
  1740.   DOS4 := (HI(DOSVERSION) >= 4);
  1741.   DRDOS := GETENV('OS') = 'DRDOS';
  1742.   IF DRDOS THEN DOS4 := FALSE;
  1743.  
  1744. { VIDEOATTRIBUTE FÜR LCD- DIPLAY }
  1745.   LCD := FALSE;
  1746.   IF (STUPCASE(GETENV('CRT'))='LCD') THEN BEGIN
  1747.     TAKOPF := $62;
  1748.     TAFREI := $30;
  1749.     TAFRAM := $37;
  1750.     TAVALT := $02;
  1751.     TAVNEU := $4F; { TEXTATTRIBUT NEUER VEKTOR }
  1752.     TAINAKT := $04;
  1753.     LCD := TRUE;
  1754.   END;
  1755. { VIDEO- ATTRIBUTE FÜR MONOCHROM- DIAPLAY }
  1756.   IF (LO(LASTMODE) = 7)  THEN BEGIN
  1757.     TAFREI := $01;
  1758.     TAVALT := $01;
  1759.     TAMROM := $10;
  1760.     TAMRAM := $10;
  1761.     TAINAKT := $02;
  1762.   END;
  1763.  
  1764.   READFILE(FALSE); { SAVEFILE EINLESEN - KEINE FEHLERMELDUNG }
  1765.  
  1766. {@@@}
  1767.   IF PARAMCOUNT > 0 THEN BEGIN
  1768.     P1 := STUPCASE(PARAMSTR(1));
  1769.     IF (LENGTH(P1) > 0) AND (P1[1] = '/') THEN DELETE(P1,1,1);
  1770.     IF (LENGTH(P1) > 0) AND (P1[1] = '-') THEN DELETE(P1,1,1);
  1771.     IF P1 = 'N' THEN BEGIN
  1772.       NOWIN := TRUE;
  1773.       ASSIGNCRT(TPSTR);
  1774.       REWRITE(TPSTR);
  1775.       MCBLISTE;
  1776.       HALT;
  1777.     END;
  1778.   END;
  1779. {@@@}
  1780.  
  1781.   IF NOT MAKEWINDOW(BWIN,10,12,70,16,TRUE,TRUE,FALSE,$1F,$2B,$AE,' Taste drücken ')
  1782.     THEN ALERT('FEHLER MAKEWINDOW');
  1783.   IF NOT MAKEWINDOW(WI[1],1,3,80,25,TRUE,TRUE,TRUE,$07,$5F,$5E,' Memory Control Blocks ')
  1784.     THEN ALERT('FEHLER MAKEWINDOW');
  1785.   IF NOT MAKEWINDOW(WI[2],2,8,79,24,TRUE,TRUE,TRUE,$70,$1C,$1E,' was das Alles bedeutet ')
  1786.     THEN ALERT('FEHLER MAKEWINDOW');
  1787.   IF NOT MAKEWINDOW(WI[3],4,16,77,25,TRUE,TRUE,TRUE,$07,$49,$4B,' Interrupt- Vektoren ')
  1788.     THEN ALERT('FEHLER MAKEWINDOW');
  1789.   IF NOT MAKEWINDOW(WI[4],22,6,79,22,TRUE,TRUE,TRUE,$07,$31,$31,' Device Treiber ')
  1790.     THEN ALERT('FEHLER MAKEWINDOW');
  1791.   IF NOT MAKEWINDOW(WI[5],4,3,76,15,TRUE,TRUE,TRUE,$1B,$2B,$2F,' Speicherkonfiguration ')
  1792.     THEN ALERT('FEHLER MAKEWINDOW');
  1793.   IF NOT MAKEWINDOW(WI[6],2,3,50,18,TRUE,TRUE,TRUE,$07,$60,$6E,' C:\CONFIG.SYS / C:\AUTOEXEC.BAT ')
  1794.     THEN ALERT('FEHLER MAKEWINDOW');
  1795.   IF NOT MAKEWINDOW(WI[7],30,12,80,25,TRUE,TRUE,TRUE,$07,$51,$5B,' MCB - INFO ')
  1796.     THEN ALERT('FEHLER MAKEWINDOW');
  1797.  
  1798. { WINDOW- PARAMETER INITIALISIEREN }
  1799.   FOR I := 1 TO MAXWIND DO BEGIN
  1800.     SETINACTIVEFRAME(WI[I],'┌└┐┘─│',TAINAKT,TAINAKT);
  1801.     RESETWINPAR(I);
  1802.   END;
  1803.   WN := 1;
  1804.   WS := '';
  1805.  
  1806.   IF PARAMCOUNT > 0 THEN BEGIN
  1807.     P1 := STUPCASE(PARAMSTR(1));
  1808.     IF (LENGTH(P1) > 0) AND (P1[1] = '/') THEN DELETE(P1,1,1);
  1809.     IF (LENGTH(P1) > 0) AND (P1[1] = '-') THEN DELETE(P1,1,1);
  1810.     IF P1 = '?'  THEN BEGIN
  1811.                         KOPFZEILE;
  1812.                         HATPAR := TRUE;
  1813.                         HELP;
  1814.                       END;
  1815.     IF P1 = 'R'  THEN BEGIN
  1816.                         RESTOREINTS(FALSE,FALSE);
  1817.                         HALT;
  1818.                       END;
  1819.     IF P1 = 'RM' THEN BEGIN
  1820.                         RESTOREINTS(TRUE,FALSE);
  1821.                         HALT;
  1822.                       END;
  1823.     IF P1 = 'S'  THEN BEGIN
  1824.                         MCBLISTE;
  1825.                         SAVEINTS;
  1826.                         HALT;
  1827.                       END;
  1828.     IF P1 = 'M'  THEN BEGIN
  1829.                         KOPFZEILE;
  1830.                         HATPAR := TRUE;
  1831.                         INTMAP;
  1832.                       END;
  1833.     IF P1 = 'X'  THEN BEGIN
  1834.                         KOPFZEILE;
  1835.                         HATPAR := TRUE;
  1836.                         DRIVERDIS;
  1837.                       END;
  1838.   END;
  1839.   IF NOT HATPAR THEN BEGIN
  1840.     KOPFZEILE;
  1841.     MCBLISTE;
  1842.   END;
  1843.  
  1844.  
  1845.   REPEAT;
  1846.     MOUSEORKEY;
  1847.     CH1 := READKEY;
  1848.     IF CH1 = #0 THEN CH2 := READKEY ELSE CH2 := #0;
  1849.  
  1850.     CASE CH1 OF
  1851. {TAB}  #9 : BEGIN
  1852.               INC(WP[WN].X,10);
  1853.               IF WP[WN].X > (WP[WN].W - (LO(WINDMAX) - LO(WINDMIN)))
  1854.                 THEN WP[WN].X := WP[WN].W - (LO(WINDMAX) - LO(WINDMIN)) -1;
  1855.               UPDWIN;
  1856.             END;
  1857. {ESC}  ^[ : IF LENGTH(WS) > 0 THEN BEGIN
  1858.               CLOSEWINDOW(WN);
  1859.             END ELSE BEGIN
  1860.               CH1 := #0;
  1861.               CH2 := #1;
  1862.             END;
  1863.       '+' : IF WN = 7 THEN BEGIN
  1864.               INC(MCBDP);
  1865.               IF MCBDP > MCBAP THEN MCBDP := 1;
  1866.               MEHRINFO;
  1867.             END;
  1868.       '-' : IF WN = 7 THEN BEGIN
  1869.               DEC(MCBDP);
  1870.               IF MCBDP < 1 THEN MCBDP := MCBAP;
  1871.               MEHRINFO;
  1872.             END;
  1873.     END; { CASE CH1 }
  1874.     CASE CH2 OF
  1875. {F1}  #59 : HELP;
  1876. {F2}  #60 : MCBLISTE;
  1877. {F3}  #61 : INTMAP;
  1878. {F4}  #62 : MEMINFO;
  1879. {F5}  #63 : DRIVERDIS;
  1880. {F6}  #64 : CONFIGDIS;
  1881. {F7}  #65 : CLOSEWINDOWS;
  1882. {F8}  #66 : MEHRINFO;
  1883. {F9}  #67 : DUMP;
  1884. {F10} #68 : IF WN = 1 THEN BEGIN
  1885.               CLOSEWINDOW(1);
  1886.               INC(SIZMOD);
  1887.               IF SIZMOD > 4 THEN SIZMOD := 1;
  1888.               MCBLISTE;
  1889.             END;
  1890.  
  1891. {S1}  #84 : IF LENGTH(WS) > 0 THEN CLOSEWINDOW(WN);
  1892. {S2}  #85 : BEGIN END;
  1893. {S3}  #86 : BEGIN END;
  1894. {S4}  #87 : BEGIN END;
  1895. {S5}  #88 : BEGIN
  1896.               RESTOREINTS(FALSE,FALSE);
  1897.               MCBLISTENEU;
  1898.             END;
  1899. {S6}  #89 : BEGIN
  1900.               RESTOREINTS(TRUE,FALSE);
  1901.               READFILE(FALSE); { SAVEFILE EINLESEN - KEINE FEHLERMELDUNG }
  1902.               MCBLISTENEU;
  1903.             END;
  1904. {S9}  #92 : BEGIN
  1905.               SAVEINTS;
  1906.               READFILE(FALSE); { SAVEFILE EINLESEN - KEINE FEHLERMELDUNG }
  1907.               MCBLISTENEU;
  1908.             END;
  1909.  
  1910. {A5} #108 : BEGIN
  1911.               RESTOREINTS(FALSE,TRUE);
  1912.               MCBLISTENEU;
  1913.             END;
  1914. {A6} #109 : BEGIN
  1915.               RESTOREINTS(TRUE,TRUE);
  1916.               MCBLISTENEU;
  1917.             END;
  1918.  
  1919. {HO}  #71 : BEGIN
  1920.               IF WP[WN].X = 1 THEN WP[WN].Y := 1 ELSE WP[WN].X := 1;
  1921.               UPDWIN;
  1922.             END;
  1923. {EN}  #79 : BEGIN
  1924.               WP[WN].Y := WP[WN].L - (HI(WINDMAX) - HI(WINDMIN));
  1925.               UPDWIN;
  1926.             END;
  1927. {PU}  #73 : BEGIN
  1928.               DEC(WP[WN].Y,HI(WINDMAX)-HI(WINDMIN)-1);
  1929.               IF WP[WN].Y < 1 THEN WP[WN].Y := 1;
  1930.               UPDWIN;
  1931.             END;
  1932. {PD}  #81 : IF WP[WN].Y < (WP[WN].L - (HI(WINDMAX) - HI(WINDMIN))) THEN BEGIN
  1933.               INC(WP[WN].Y,HI(WINDMAX)-HI(WINDMIN)-1);
  1934.               UPDWIN;
  1935.             END;
  1936. {RI}  #77 : BEGIN
  1937.               DEC(WP[WN].X,2);
  1938.               IF WP[WN].X < 1 THEN WP[WN].X := 1;
  1939.               UPDWIN;
  1940.             END;
  1941. {LE}  #75 : IF WP[WN].X < (WP[WN].W - (LO(WINDMAX) - LO(WINDMIN)) - 1) THEN BEGIN
  1942.               INC(WP[WN].X,2);
  1943.               UPDWIN;
  1944.             END;
  1945. {UP}  #72 : IF WP[WN].Y > 1 THEN BEGIN
  1946.               DEC(WP[WN].Y);
  1947.               UPDWIN;
  1948.             END;
  1949. {DN}  #80 : IF WP[WN].Y < (WP[WN].L - (HI(WINDMAX) - HI(WINDMIN))) THEN BEGIN
  1950.               INC(WP[WN].Y);
  1951.               UPDWIN;
  1952.             END;
  1953.  
  1954. {CRI}#116 : BEGIN
  1955.               IF MOVEWINDOW(1,0) THEN HIDDENCURSOR;
  1956.             END;
  1957. {CLE}#115 : BEGIN
  1958.               IF MOVEWINDOW(-1,0) THEN HIDDENCURSOR;
  1959.             END;
  1960. {CUP}#141 : BEGIN
  1961.               IF MOVEWINDOW(0,-1) THEN HIDDENCURSOR;
  1962.             END;
  1963. {CDN}#145 : BEGIN
  1964.               IF MOVEWINDOW(0,1) THEN HIDDENCURSOR;
  1965.             END;
  1966.  
  1967. {ARI}#157 : BEGIN
  1968.               IF RESIZEWINDOW(1,0,' ')
  1969.                 THEN UPDWIN
  1970.                 ELSE IF MOVEWINDOW(-1,0) THEN
  1971.                   IF RESIZEWINDOW(1,0,' ') THEN UPDWIN;
  1972.             END;
  1973. {ALE}#155 : BEGIN
  1974.               IF RESIZEWINDOW(-1,0,' ') THEN HIDDENCURSOR;
  1975.             END;
  1976. {AUP}#152 : BEGIN
  1977.               IF RESIZEWINDOW(0,-1,' ') THEN HIDDENCURSOR;
  1978.             END;
  1979. {ADN}#160 : BEGIN
  1980.               IF RESIZEWINDOW(0,1,' ')
  1981.                 THEN UPDWIN
  1982.                 ELSE IF MOVEWINDOW(0,-1) THEN
  1983.                   IF RESIZEWINDOW(0,1,' ') THEN UPDWIN;
  1984.             END;
  1985.     END; { CASE CH2 }
  1986.   UNTIL CH2 = #1;
  1987.  
  1988.   AUSDIEMAUS;
  1989. END.
  1990.  
  1991.  
  1992.