home *** CD-ROM | disk | FTP | other *** search
/ Shareware 1 2 the Maxx / sw_1.zip / sw_1 / PROGRAM / ZSIM12.ZIP / EMUMENU.MOD < prev    next >
Text File  |  1992-01-12  |  17KB  |  683 lines

  1.  
  2. (* Modula 2 Unterprogramme fuer den CP/M Emulator
  3.    Fitted Modula2 2.0
  4.  
  5.    (C) 1990 by Jürgen Weber
  6.  
  7. *)
  8.  
  9. (* $A-,$S-,$R-,$T- *)
  10.  
  11. IMPLEMENTATION MODULE EmuMenu;
  12.  
  13. FROM SYSTEM IMPORT ASSEMBLER,BYTE,WORD,ADR;
  14.  
  15.  
  16. (*
  17. TYPE PhysDiskPars = RECORD
  18.            cpm_drive       : BYTE;
  19.                      first_phys_sec  : BYTE;
  20.                      phys_tracks     : BYTE;
  21.            phys_sec_pt     : BYTE;
  22.            bytes_per_sec   : BYTE;
  23.            autologin_flag  : BYTE;
  24.        END;
  25.  
  26. dpb = RECORD
  27.              spt  : WORD;
  28.              bsh  : BYTE;
  29.              blm  : BYTE;
  30.              exm  : BYTE;
  31.              dsm  : WORD;
  32.              drm  : WORD;
  33.              al0  : BYTE;
  34.              al1  : BYTE;
  35.              cks  : WORD;
  36.              off  : WORD;
  37.            END;
  38.      DPBPtr = POINTER TO dpb;
  39.      PDPPtr = POINTER TO PhysDiskPars;
  40. *)
  41.  
  42. CONST
  43.       TOUPPER=ORD('a')-ORD('A');
  44.       SEPERATOR='|';
  45.       BACKSLASH='\';
  46.  
  47.       SCR_NORMAL=7H;
  48.       SCR_INVERS=70H;
  49.       SCR_HIGHLIT=7H+8H;
  50.  
  51.       CSR_RIGHT = 115C;
  52.       CSR_LEFT  = 113C;
  53.       PAGE_UP   = 111C;
  54.       PAGE_DOWN = 121C;
  55.       CSR_DOWN  = 120C;
  56.       CSR_UP    = 110C;
  57.       HOME      = 107C;
  58.       C_END     = 117C;
  59.       INSERT    = 122C;
  60.       ENTER        = 015C;
  61.       ESC       = 033C;
  62.  
  63.       BS        = 010C;
  64.       DEL       = 177C;
  65.       CR        = 015C;
  66.       LF        = 012C;
  67.  
  68.  
  69. PROCEDURE Read(VAR c,cx:CHAR);
  70. (* c:=char, cx:=extended *)
  71. BEGIN
  72.      ASM
  73.         MOV  AH,0
  74.         INT  16H
  75.         LES  DI,c
  76.         MOV  BYTE ES:[DI],AL
  77.         LES  DI,cx
  78.         MOV  BYTE ES:[DI],AH
  79.      END;
  80. END Read;
  81.  
  82. PROCEDURE ScrRead(VAR c,Attrib:CHAR);
  83. (* c:=Zeichen an Cursorpos *)
  84. BEGIN
  85.      ASM
  86.         MOV  AH,8
  87.         MOV  BL,0
  88.         INT  10H
  89.         LES  DI,c
  90.         MOV  BYTE ES:[DI],AL
  91.         LES  DI,Attrib
  92.         MOV  BYTE ES:[DI],AH
  93.      END;
  94. END ScrRead;
  95.  
  96. PROCEDURE Write(c:CHAR);
  97. BEGIN
  98.      IF c>037C THEN  (* bei druckbaren Zeichen auch Attribute *)
  99.       ASM
  100.         MOV  AX,c
  101.         MOV  BX,attribute
  102.         MOV  BH,0
  103.         MOV  AH,9
  104.         MOV  CX,1
  105.         INT  10H
  106.       END;
  107.      END;
  108.       ASM
  109.         MOV  AX,c
  110.         MOV  BX,attribute
  111.         MOV  AH,0EH
  112.         INT  10H
  113.      END;
  114. END Write;
  115.  
  116. PROCEDURE WriteString(s:ARRAY OF CHAR);
  117. VAR i:CARDINAL;
  118. BEGIN
  119.      i:=0;
  120.      (* ACHTUNG: Zuerst muss auf <=HIGH getestet werden *)
  121.      WHILE  (i<=HIGH(s)) AND (s[i]<>0C) DO
  122.         Write(s[i]);
  123.         INC(i);
  124.      END;
  125. END WriteString;
  126.  
  127.  
  128. PROCEDURE ReadString(VAR s:ARRAY OF CHAR);
  129. VAR c,cx:CHAR;
  130.     i,x,y:CARDINAL;
  131. BEGIN
  132.     attribute:=SCR_NORMAL;
  133.     i:=0;
  134.     LOOP
  135.        Read(c,cx);
  136.        c:=Upper(c);
  137.        IF ((c=DEL) OR (c=BS)) AND (i>0) THEN
  138.           DEC(i);
  139.           WhereXY(x,y);
  140.           DEC(x);
  141.           GotoXY(x,y);
  142.           Write(' ');
  143.           GotoXY(x,y);
  144.        ELSIF (((c>=' ') AND (c<='~')) AND (i<=HIGH(s))) THEN
  145.           Write(c);
  146.           s[i]:=c;
  147.           INC(i);
  148.        ELSIF (c=CR) THEN
  149.           s[i]:=0C;
  150.           done:=TRUE;
  151.           EXIT;
  152.        ELSIF (c=ESC) THEN
  153.           i:=0;
  154.           done:=FALSE;
  155.           EXIT;
  156.        END;
  157.     END;
  158. END ReadString;
  159.  
  160.  
  161. PROCEDURE WriteLn;
  162. BEGIN
  163.      Write(CR);
  164.      Write(LF);
  165. END WriteLn;
  166.  
  167.  
  168. PROCEDURE GotoXY(x,y:CARDINAL);
  169. BEGIN
  170.      ASM
  171.         MOV  DX,x
  172.         MOV  AX,y
  173.         MOV  DH,AL
  174.         MOV  BH,0
  175.         MOV  AH,2
  176.         INT  10H
  177.      END;
  178. END GotoXY;
  179.  
  180. PROCEDURE WhereXY(VAR x,y:CARDINAL);
  181. BEGIN
  182.      ASM
  183.         MOV  BH,0
  184.         MOV  AH,3
  185.         INT  10H
  186.         LES  DI,x
  187.         MOV  BYTE ES:[DI],DL
  188.         LES  DI,y
  189.         MOV  BYTE ES:[DI],DH
  190.      END;
  191. END WhereXY;
  192.  
  193.  
  194. PROCEDURE Upper(c:CHAR):CHAR;
  195. BEGIN
  196. IF (c>='a') AND (c<='z') THEN
  197.    RETURN CHR(ORD(c)-TOUPPER);
  198. ELSE
  199.    RETURN c;
  200. END;
  201. END Upper;
  202.  
  203. (*
  204. PROCEDURE ReadCard(VAR n:CARDINAL);
  205. CONST HIGHNUM=5;
  206. VAR s:ARRAY[0..HIGHNUM] OF CHAR;
  207.     c,cx:CHAR;
  208.     z,i,j,x,y:CARDINAL;
  209. BEGIN
  210.     attribute:=SCR_NORMAL;
  211.     i:=0;
  212.     LOOP
  213.        Read(c,cx);
  214.        IF ((c=DEL) OR (c=BS)) AND (i>0) THEN
  215.           DEC(i);
  216.           WhereXY(x,y);
  217.           DEC(x);
  218.           GotoXY(x,y);
  219.           Write(' ');
  220.           GotoXY(x,y);
  221.        ELSIF ((c>='0') AND (c<='9')) AND (i<HIGHNUM) THEN
  222.           Write(c);
  223.           s[i]:=c;
  224.           INC(i);
  225.        ELSIF (c=CR) THEN
  226.           s[i]:=0C;
  227.           EXIT;
  228.        ELSIF (c=ESC) THEN
  229.           i:=0;
  230.           EXIT;
  231.        END;
  232.     END;
  233.     IF (i>0) THEN (* es wurde was eingegeben *)
  234.        DEC(i);
  235.        z:=0;
  236.        FOR j:=0 TO i DO
  237.           z:=z*10;
  238.           INC(z,ORD(s[j])-ORD('0'));
  239.        END;
  240.        n:=z;
  241.     END;
  242. END ReadCard;
  243. *)
  244.  
  245. PROCEDURE ReadHex(VAR n:WORD;d:CARDINAL);
  246. VAR s:ARRAY[0..4] OF CHAR;
  247.     c,cx:CHAR;
  248.     z,i,j,x,y:CARDINAL;
  249. BEGIN
  250.     attribute:=SCR_NORMAL;
  251.     i:=0;
  252.     done:=TRUE;
  253.     LOOP
  254.        Read(c,cx);
  255.        c:=Upper(c);
  256.        IF ((c=DEL) OR (c=BS)) AND (i>0) THEN
  257.           DEC(i);
  258.           WhereXY(x,y);
  259.           DEC(x);
  260.           GotoXY(x,y);
  261.           Write(' ');
  262.           GotoXY(x,y);
  263.        ELSIF (((c>='0') AND (c<='9')) OR ((c>='A') AND (c<='F')))
  264.              AND (i<d) THEN
  265.           Write(c);
  266.           s[i]:=c;
  267.           INC(i);
  268.        ELSIF (c=CR) THEN
  269.           s[i]:=0C;
  270.           EXIT;
  271.        ELSIF (c=ESC) THEN
  272.           i:=0;
  273.           done:=FALSE;
  274.           EXIT;
  275.        END;
  276.     END;
  277.     IF (i>0) THEN (* es wurde was eingegeben *)
  278.        DEC(i);
  279.        z:=0;
  280.        FOR j:=0 TO i DO
  281.           z:=z*16;
  282.           IF s[j]<'A' THEN
  283.              INC(z,ORD(s[j])-ORD('0'));
  284.           ELSE
  285.              INC(z,ORD(s[j])-ORD('A')+10);
  286.           END;
  287.        END;
  288.        n:=WORD(z);
  289.     END;
  290. END ReadHex;
  291.  
  292. PROCEDURE ReadHexByte(VAR b:BYTE);
  293. VAR w:WORD;
  294. BEGIN
  295.      w:=WORD(ORD(b));
  296.      ReadHex(w,2);
  297.      b:=BYTE(CHR(CARDINAL(w)));
  298. END ReadHexByte;
  299.  
  300.  
  301. PROCEDURE WriteHexByte(b:BYTE);
  302. VAR  n:CARDINAL;
  303.   PROCEDURE WriteHexNib(w:WORD);
  304.   VAR  n:CARDINAL;
  305.   BEGIN (* WriteHexNib *)
  306.        n:=CARDINAL(w);
  307.        IF n>9 THEN
  308.           Write(CHR(n-10+ORD('A')));
  309.        ELSE
  310.           Write(CHR(n+ORD('0')));
  311.        END;
  312.   END WriteHexNib;
  313. BEGIN (* WriteHexByte *)
  314.      n:=ORD(b);
  315.      WriteHexNib(n DIV 16);
  316.      WriteHexNib(n MOD 16);
  317. END WriteHexByte;
  318.  
  319. PROCEDURE WriteHex(w:WORD);
  320. VAR  n:CARDINAL;
  321. BEGIN (* WriteHex *)
  322.      n:=CARDINAL(w);
  323.      WriteHexByte(CHR(n DIV 256));
  324.      WriteHexByte(CHR(n MOD 256));
  325. END WriteHex;
  326.  
  327. (* Alten Bildschirminhalt merken *)
  328. (* Width,Height=Breite,Hoehe *)
  329. (* KEINE Plausibilitaetstests*)
  330. PROCEDURE SaveWin(x,y,Width,Height:CARDINAL;VAR WinSave:ARRAY OF CHAR);
  331. VAR WinStorPtr,x0,y0:CARDINAL;
  332. BEGIN
  333.      WinStorPtr:=0;
  334.      FOR y0:=0 TO Height-1 DO
  335.          FOR x0:=0 TO Width-1 DO
  336.              GotoXY(x+x0,y+y0);
  337.              ScrRead(WinSave[WinStorPtr],WinSave[WinStorPtr+1]);
  338.              INC(WinStorPtr,2);
  339.          END;
  340.      END;
  341. END SaveWin;
  342.  
  343. (* Alten Bildschirminhalt wiederherstellen *)
  344. (* Width,Height=Breite,Hoehe *)
  345. (* KEINE Plausibilitaetstests*)
  346. PROCEDURE RestorWin(x,y,Width,Height:CARDINAL;VAR WinSave:ARRAY OF CHAR);
  347. VAR WinStorPtr,x0,y0:CARDINAL;
  348. BEGIN
  349.      WinStorPtr:=0;
  350.      FOR y0:=0 TO Height-1 DO
  351.          FOR x0:=0 TO Width-1 DO
  352.              GotoXY(x+x0,y+y0);
  353.                attribute:=ORD(WinSave[WinStorPtr+1]);
  354.                Write(WinSave[WinStorPtr]);
  355.              INC(WinStorPtr,2);
  356.          END;
  357.      END;
  358. END RestorWin;
  359.  
  360. (* Width,Height=Breite,Hoehe *)
  361. (* KEINE Plausibilitaetstests*)
  362. PROCEDURE DrawBox(x,y,Width,Height:CARDINAL);
  363. VAR x0,y0:CARDINAL;
  364. BEGIN
  365.      GotoXY(x,y);
  366.      Write('┌');
  367.      FOR x0:=1 TO Width-2 DO
  368.          Write('─');
  369.      END;
  370.      Write('┐');
  371.      FOR y0:=1 TO Height-2 DO
  372.          GotoXY(x,y+y0);Write('│');
  373.          FOR x0:=1 TO Width-2 DO
  374.              Write(' ');
  375.          END;
  376.          Write('│');
  377.      END;
  378.      GotoXY(x,y+Height-1);
  379.      Write('└');
  380.      FOR x0:=1 TO Width-2 DO
  381.          Write('─');
  382.      END;
  383.      Write('┘');
  384. END DrawBox;
  385.  
  386. PROCEDURE DoMenue(x,y:CARDINAL;messages:ARRAY OF CHAR;
  387.                   VAR WinSave:ARRAY OF CHAR;VAR res:CARDINAL);
  388. CONST MAXMSG=19;
  389. VAR p,i,LenCount,MsgCount,
  390.     oldX,oldY,
  391.     MaxItemLen,item:CARDINAL;
  392.     MsgStart:ARRAY [0..MAXMSG] OF CARDINAL;
  393.     frstLet:ARRAY [0..MAXMSG] OF CHAR;
  394.     c,cx:CHAR;
  395.     ExtendedChar:BOOLEAN;
  396.  
  397. PROCEDURE DisplayItem(p:CARDINAL); (* z.B. \edit|e\xit| *)
  398. VAR x0:CARDINAL;
  399. BEGIN
  400.      p:=MsgStart[p-1];
  401.      x0:=0;
  402.      WHILE (messages[p]<>SEPERATOR) DO
  403.         IF (attribute=SCR_NORMAL) THEN
  404.            IF (messages[p]=BACKSLASH) THEN
  405.               (* Schreibe das helle Zeichen *)
  406.               INC(p);
  407.               attribute:=SCR_HIGHLIT;
  408.               Write(messages[p]);
  409.               attribute:=SCR_NORMAL;
  410.             ELSE
  411.               Write(messages[p]);
  412.             END;
  413.          ELSE (* im gerade gewaehlten Bereich *)
  414.            IF (messages[p]=BACKSLASH) THEN
  415.               INC(p);
  416.            END;
  417.            Write(messages[p]);
  418.         END;
  419.         INC(p);INC(x0);
  420.      END;
  421.      WHILE (x0<MaxItemLen) DO
  422.         Write(' ');
  423.         INC(x0);
  424.      END;
  425. END DisplayItem;
  426.  
  427.  
  428. BEGIN
  429.      (* erstmal Anzahl und laengste Message finden *)
  430.      p:=0;MaxItemLen:=0;MsgCount:=0;
  431.      WHILE (messages[p]<>0C) DO
  432.         LenCount:=0;
  433.         MsgStart[MsgCount]:=p;
  434.         WHILE (messages[p]<>SEPERATOR) DO
  435.            IF (messages[p]=BACKSLASH) THEN
  436.               INC(p);
  437.               frstLet[MsgCount]:=messages[p];
  438.            END;
  439.            INC(p);INC(LenCount);
  440.         END;
  441.         INC(p);
  442.         IF LenCount>MaxItemLen THEN MaxItemLen:=LenCount;END;
  443.         INC(MsgCount);
  444.      END;
  445. (* Alten Cursorpos und Bildschirminhalt merken *)
  446.      WhereXY(oldX,oldY);
  447.      SaveWin(x,y,MaxItemLen+2,MsgCount+2,WinSave);
  448. (* Rahmen und Menuepunkte schreiben *)
  449.      attribute:=SCR_NORMAL;
  450.      DrawBox(x,y,MaxItemLen+2,MsgCount+2);
  451.      FOR item:=1 TO MsgCount DO
  452.          GotoXY(x+1,y+item);
  453.          DisplayItem(item);
  454.      END;
  455.  
  456. (* aktuelles Element invers darstellen, Zeichen lesen
  457.    und Element wieder normal darstellen *)
  458.      item:=1;
  459.      LOOP
  460.  
  461.          attribute:=SCR_INVERS;
  462.          GotoXY(x+1,y+item);
  463.          DisplayItem(item);
  464.          attribute:=SCR_NORMAL;
  465.  
  466.          Read(c,cx);
  467.          IF (c=0C) THEN c:=cx;ExtendedChar:=TRUE ELSE ExtendedChar:=FALSE END;
  468.          GotoXY(x+1,y+item);
  469.          DisplayItem(item);
  470.          IF c=ESC THEN
  471.             item:=0;
  472.             EXIT;
  473.          ELSIF c=ENTER THEN
  474.             EXIT;
  475.          END;
  476.          IF ExtendedChar THEN
  477.             CASE c OF
  478.                HOME      :  item:=1
  479.             |  C_END     :  item:=MsgCount
  480.             |  CSR_UP    :  IF item>1 THEN DEC(item) ELSE item:=MsgCount END
  481.             |  CSR_DOWN  :  IF item<MsgCount THEN INC(item) ELSE item:=1 END
  482.             END;
  483.          ELSE
  484. (* um zufaellige Uebereinstimmung von Extended
  485.    und highlight Char auszuschliessen *)
  486.             FOR i:=0 TO MsgCount DO
  487.                 IF (Upper(c)=Upper(frstLet[i]))  THEN
  488.                    item:=i+1; (* Da Anfang bei 0 *)
  489.                    EXIT;
  490.                 END;
  491.             END;
  492.          END;
  493.  
  494.      END;
  495.      res:=item;
  496.      (* Alten Bildschirminhalt und Cursorpos wiederherstellen *)
  497.      RestorWin(x,y,MaxItemLen+2,MsgCount+2,WinSave);
  498.      GotoXY(oldX,oldY);
  499. END DoMenue;
  500.  
  501. PROCEDURE Tab(t:CARDINAL);
  502. VAR x0,y0:CARDINAL;
  503. BEGIN
  504.      WhereXY(x0,y0);
  505.      GotoXY(t,y0);
  506. END Tab;
  507.  
  508.  
  509. PROCEDURE EditDPB(p:DPBPtr;q:PDPPtr;
  510.                   VAR WinSave:ARRAY OF CHAR;VAR OK:BOOLEAN);
  511. CONST XCORN=5;
  512.       YCORN=5;
  513.       RDX=12;
  514.       LENX=20;
  515.       LENY=19;
  516. VAR oldX,oldY:CARDINAL;
  517.  
  518. BEGIN
  519. (* Alten Cursorpos und Bildschirminhalt merken *)
  520.      WhereXY(oldX,oldY);
  521.      attribute:=SCR_NORMAL;
  522.      SaveWin(XCORN,YCORN,LENX,LENY,WinSave);
  523.      DrawBox(XCORN,YCORN,LENX,LENY);
  524.      GotoXY(XCORN+1,YCORN+1);WriteString('SPT: ');WriteHex    (p^.spt);
  525.      GotoXY(XCORN+1,YCORN+2);WriteString('BSH:   ');WriteHexByte(p^.bsh);
  526.      GotoXY(XCORN+1,YCORN+3);WriteString('BLM:   ');WriteHexByte(p^.blm);
  527.      GotoXY(XCORN+1,YCORN+4);WriteString('EXM:   ');WriteHexByte(p^.exm);
  528.      GotoXY(XCORN+1,YCORN+5);WriteString('DSM: ');WriteHex      (p^.dsm);
  529.      GotoXY(XCORN+1,YCORN+6);WriteString('DRM: ');WriteHex      (p^.drm);
  530.      GotoXY(XCORN+1,YCORN+7);WriteString('AL0:   ');WriteHexByte(p^.al0);
  531.      GotoXY(XCORN+1,YCORN+8);WriteString('AL1:   ');WriteHexByte(p^.al1);
  532.      GotoXY(XCORN+1,YCORN+9);WriteString('CKS: ');WriteHex      (p^.cks);
  533.      GotoXY(XCORN+1,YCORN+10);WriteString('OFF :');WriteHex      (p^.off);
  534.  
  535.      GotoXY(XCORN+1,YCORN+12);WriteString('DRV:   ');
  536.      WriteHexByte(q^.cpm_drive);
  537.      GotoXY(XCORN+1,YCORN+13);WriteString('PTR:   ');
  538.      WriteHexByte(q^.phys_tracks);
  539.      GotoXY(XCORN+1,YCORN+14);WriteString('PST:   ');
  540.      WriteHexByte(q^.phys_sec_pt);
  541.      GotoXY(XCORN+1,YCORN+15);WriteString('BPS:   ');
  542.      WriteHexByte(q^.bytes_per_sec);
  543.      GotoXY(XCORN+1,YCORN+16);WriteString('FSC:   ');
  544.      WriteHexByte(q^.first_phys_sec);
  545.      GotoXY(XCORN+1,YCORN+17);WriteString('LOG:   ');
  546.      WriteHexByte(q^.autologin_flag);
  547.  
  548.  
  549. LOOP
  550.      OK:=FALSE;
  551.      GotoXY(XCORN+RDX,YCORN+1); WriteString(': ');ReadHex    (p^.spt,4);
  552.      IF NOT done THEN
  553.         EXIT;
  554.      END;
  555.      GotoXY(XCORN+RDX,YCORN+2); WriteString(': ');ReadHexByte(p^.bsh);
  556.      IF NOT done THEN
  557.         EXIT;
  558.      END;
  559.      GotoXY(XCORN+RDX,YCORN+3); WriteString(': ');ReadHexByte(p^.blm);
  560.      IF NOT done THEN
  561.         EXIT;
  562.      END;
  563.      GotoXY(XCORN+RDX,YCORN+4); WriteString(': ');ReadHexByte(p^.exm);
  564.      IF NOT done THEN
  565.         EXIT;
  566.      END;
  567.      GotoXY(XCORN+RDX,YCORN+5); WriteString(': ');ReadHex    (p^.dsm,4);
  568.      IF NOT done THEN
  569.         EXIT;
  570.      END;
  571.      GotoXY(XCORN+RDX,YCORN+6); WriteString(': ');ReadHex    (p^.drm,4);
  572.      IF NOT done THEN
  573.         EXIT;
  574.      END;
  575.      GotoXY(XCORN+RDX,YCORN+7); WriteString(': ');ReadHexByte(p^.al0);
  576.      IF NOT done THEN
  577.         EXIT;
  578.      END;
  579.      GotoXY(XCORN+RDX,YCORN+8); WriteString(': ');ReadHexByte(p^.al1);
  580.      IF NOT done THEN
  581.         EXIT;
  582.      END;
  583.      GotoXY(XCORN+RDX,YCORN+9); WriteString(': ');ReadHex    (p^.cks,4);
  584.      IF NOT done THEN
  585.         EXIT;
  586.      END;
  587.      GotoXY(XCORN+RDX,YCORN+10);WriteString(': ');ReadHex    (p^.off,4);
  588.      IF NOT done THEN
  589.         EXIT;
  590.      END;
  591.  
  592.      GotoXY(XCORN+RDX,YCORN+12);WriteString(': ');ReadHexByte(q^.cpm_drive);
  593.      IF NOT done THEN
  594.         EXIT;
  595.      END;
  596.      IF ORD(q^.cpm_drive)>1 THEN
  597.         q^.cpm_drive:=BYTE(CHR(0)); (* nur Disklaufwerke zulaessig *)
  598.      END;
  599.      GotoXY(XCORN+RDX,YCORN+13);WriteString(': ');ReadHexByte(q^.phys_tracks);
  600.      IF NOT done THEN
  601.         EXIT;
  602.      END;
  603.      GotoXY(XCORN+RDX,YCORN+14);WriteString(': ');ReadHexByte(q^.phys_sec_pt);
  604.      IF NOT done THEN
  605.         EXIT;
  606.      END;
  607.      GotoXY(XCORN+RDX,YCORN+15);WriteString(': ');ReadHexByte(q^.bytes_per_sec);
  608.      IF NOT done THEN
  609.         EXIT;
  610.      END;
  611.      GotoXY(XCORN+RDX,YCORN+16);WriteString(': ');ReadHexByte(q^.first_phys_sec);
  612.      IF NOT done THEN
  613.         EXIT;
  614.      END;
  615.      GotoXY(XCORN+RDX,YCORN+17);WriteString(': ');ReadHexByte(q^.autologin_flag);
  616.      OK:=done; (* nur TRUE, wenn auch letztes Lesen o.k. war *)
  617.      EXIT;
  618. END;
  619.  
  620.      RestorWin(XCORN,YCORN,LENX,LENY,WinSave);
  621.      GotoXY(oldX,oldY);
  622. END EditDPB;
  623.  
  624.  
  625.  
  626. PROCEDURE About(VAR WinSave:ARRAY OF CHAR);
  627. CONST XCORN=30;
  628.       YCORN=8;
  629.       LENX=20;
  630.       LENY=10;
  631. VAR oldX,oldY:CARDINAL;
  632.     c,cx:CHAR;
  633.  
  634. BEGIN
  635. (* Alten Cursorpos und Bildschirminhalt merken *)
  636.      WhereXY(oldX,oldY);
  637.      attribute:=SCR_NORMAL;
  638.      SaveWin(XCORN,YCORN,LENX,LENY,WinSave);
  639.      DrawBox(XCORN,YCORN,LENX,LENY);
  640.      GotoXY(XCORN+7,YCORN+1);
  641.      attribute:=SCR_HIGHLIT;WriteString('ZSIM');attribute:=SCR_NORMAL;
  642.      GotoXY(XCORN+2,YCORN+3);WriteString('THE Z80 Emulator');
  643.      GotoXY(XCORN+2,YCORN+5);WriteString('(C) 1990,1991 by');
  644.      GotoXY(XCORN+2,YCORN+6);WriteString('Jürgen G. Weber');
  645.      GotoXY(XCORN+4,YCORN+8);
  646.      attribute:=SCR_HIGHLIT;WriteString('PRESS ESC');attribute:=SCR_NORMAL;
  647.      REPEAT
  648.         Read(c,cx);
  649.      UNTIL c=ESC;
  650.      RestorWin(XCORN,YCORN,LENX,LENY,WinSave);
  651.      GotoXY(oldX,oldY);
  652. END About;
  653.  
  654. PROCEDURE InputString(VAR WinSave,s,p:ARRAY OF CHAR);
  655. (* Es wird vorrausgesetzt, daß prompt p < 30 und string s < 30 *)
  656.  
  657. CONST XCORN=10;
  658.       YCORN=15;
  659.       LENX=40;
  660.       LENY=5;
  661. VAR oldX,oldY:CARDINAL;
  662.     c,cx:CHAR;
  663.  
  664. BEGIN
  665. (* Alten Cursorpos und Bildschirminhalt merken *)
  666.      WhereXY(oldX,oldY);
  667.      attribute:=SCR_NORMAL;
  668.      SaveWin(XCORN,YCORN,LENX,LENY,WinSave);
  669.      DrawBox(XCORN,YCORN,LENX,LENY);
  670.      GotoXY(XCORN+2,YCORN+2);WriteString(p);
  671.      GotoXY(XCORN+2,YCORN+3);
  672.      ReadString(s);
  673.      RestorWin(XCORN,YCORN,LENX,LENY,WinSave);
  674.      GotoXY(oldX,oldY);
  675. END InputString;
  676.  
  677. VAR attribute:CARDINAL;
  678.     done:BOOLEAN;
  679.  
  680. BEGIN
  681. END EmuMenu.
  682.  
  683.