home *** CD-ROM | disk | FTP | other *** search
- PROGRAM SNAP;
-
- { This Turbo Pascal program takes a "snapshot" of the current screen
- display and writes the image to FILENAME.
-
- Note: This program assumes that the screen image is a 2000-word
- block starting at Segment $B8000.
-
- Program by Harry M. Murphy, 28 December 1986. }
-
- CONST
- FILENAME = 'SNAP.IMG'; {The screen image file name. }
-
- TYPE
- DATESTRING = STRING[28];
- TIMESTRING = STRING[6];
- VIDEOBLOCK = ARRAY [1..25,1..80] OF INTEGER;
-
- VAR
- DTG : STRING[40]; { Date/Time string. }
- FIL : TEXT[2048]; { The screen image file. }
- I : 0..25; { Screen row index. }
- IMAX : 0..25; { Maximum row for image. }
- J : 0..80; { Screen column index. }
- LINE : STRING[80]; { Working line string. }
-
- SCREEN : VIDEOBLOCK ABSOLUTE $B800: $0000; {Video Memory}
-
- { ------------------------------- }
-
- FUNCTION DATE: DATESTRING;
-
- { This function returns today's date as a DateString of up
- to 28 bytes, such as: "Tuesday, 18 February 1986".
-
- Note: TYPE DATESTRING = STRING[28];
-
- Procedure adapted from the Turbo Pascal date example by
- Harry M. Murphy, 18 February 1986. }
-
- TYPE
- REGPAK = RECORD
- AX,BX,CX,DX,BP,SI,DI,DS,ES,FL: INTEGER
- END;
-
- VAR
- ID,IM,IW,IY,JC,JD,JM,JY: INTEGER;
- REG: REGPAK;
- DAY: STRING[2];
- DTE: DATESTRING;
- YEAR: STRING[4];
-
- BEGIN
- WITH REG DO
- BEGIN
- AX := $2A00;
- MSDOS(REG);
- IY := CX;
- IM := HI(DX);
- ID := LO(DX)
- END;
- JY := IY;
- JM := IM-2;
- IF JM < 1
- THEN
- BEGIN
- JM := JM+12;
- JY := JY-1
- END;
- JC := JY DIV 100;
- JD := JY-100*JC;
- IW := ((ID+42+(13*JM-1) DIV 5 +JD+JD DIV 4+JC DIV 4-2*JC) MOD 7);
- CASE IW OF
- 0: DTE := 'Sunday, ';
- 1: DTE := 'Monday, ';
- 2: DTE := 'Tuesday, ';
- 3: DTE := 'Wednesday, ';
- 4: DTE := 'Thursday, ';
- 5: DTE := 'Friday, ';
- 6: DTE := 'Saturday, '
- END { CASE };
- STR(ID:2,DAY);
- STR(IY:4,YEAR);
- CASE IM OF
- 1: DTE := DTE+DAY+' January '+YEAR;
- 2: DTE := DTE+DAY+' February '+YEAR;
- 3: DTE := DTE+DAY+' March '+YEAR;
- 4: DTE := DTE+DAY+' April '+YEAR;
- 5: DTE := DTE+DAY+' May '+YEAR;
- 6: DTE := DTE+DAY+' June '+YEAR;
- 7: DTE := DTE+DAY+' July '+YEAR;
- 8: DTE := DTE+DAY+' August '+YEAR;
- 9: DTE := DTE+DAY+' September '+YEAR;
- 10: DTE := DTE+DAY+' October '+YEAR;
- 11: DTE := DTE+DAY+' November '+YEAR;
- 12: DTE := DTE+DAY+' December '+YEAR
- END { CASE };
- DATE := DTE
- END {Function DATE};
-
- { ------------------------------- }
-
- FUNCTION TIME: TIMESTRING;
-
- { This function returns the current clock time as a TimeString
- of 6 bytes, such as: "19:05h".
-
- Note: TYPE TIMESTRING = STRING[6];
-
- Procedure adapted from the Turbo Pascal date example by
- Harry M. Murphy, 19 February 1986. }
-
- TYPE
- REGPAK = RECORD
- AX,BX,CX,DX,BP,SI,DI,DS,ES,FL: INTEGER
- END;
-
- VAR
- H,M,S,T: INTEGER;
- HR: STRING[2];
- MN: STRING[2];
- REG: REGPAK;
-
- BEGIN
- WITH REG DO
- BEGIN
- AX := $2C00;
- MSDOS(REG);
- H := HI(CX);
- M := LO(CX);
- S := HI(DX);
- T := LO(DX)
- END;
- IF T > 50 THEN S := S+1;
- IF S > 30 THEN M := M+1;
- IF M = 60
- THEN
- BEGIN
- H := H+1;
- M := 0;
- IF H = 24 THEN H := 0
- END;
- STR(H:2,HR);
- STR(M:2,MN);
- IF MN[1]=' ' THEN MN[1] := '0';
- TIME := HR+':'+MN+'h'
- END {Function TIME};
-
- { ------------------------------- }
-
- BEGIN {Program SNAP}
- DTG := TIME+', '+DATE+'.';
- ASSIGN(FIL,FILENAME);
- REWRITE(FIL);
- IMAX := WHEREY-2;
- GOTOXY(1,IMAX+1);
- IF IMAX < 14 THEN IMAX := 25;
- FOR I := 1 TO IMAX DO
- BEGIN
- FOR J := 1 TO 80 DO LINE[J] := CHR(LO(SCREEN[I,J]));
- LINE[0] := CHR(0);
- J := 80;
- WHILE LINE[J] = ' ' DO J := J-1;
- LINE[0] := CHR(J);
- IF J = 0
- THEN
- WRITELN(FIL)
- ELSE
- WRITELN(FIL,LINE)
- END;
- WRITELN(FIL,'>>>>>>>>>> Screen snapshot taken: ',DTG);
- CLOSE(FIL);
- LOWVIDEO;
- CLREOL;
- WRITELN('>>>>>>>>>> Screen snapshot written to ',FILENAME)
- END.