home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / MACVIEW.ZIP / MACVIEW.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1986-07-01  |  10.0 KB  |  242 lines

  1. (*
  2.        MACVIEW.PAS - Display MacPaint pictures on the IBM PC
  3.                      graphics adapter.
  4.  
  5.                      Mark Anacker    09/24/85
  6.                                                                      *)
  7. PROGRAM MACVIEW;
  8. (*$V-*)
  9.  
  10. TYPE
  11.   STRING255 = STRING[255];
  12.   SCANLINE = ARRAY [1..80] OF BYTE;      (* hi-res screen is 80 bytes wide *)
  13.  
  14. CONST
  15.   SCANFLAG : BOOLEAN = TRUE;
  16.   ODDLINE  : INTEGER = 0;
  17.   EVENLINE : INTEGER = 0;
  18.  
  19. VAR
  20.   FILNAM : STRING[64];
  21.   PNTFIL : FILE OF BYTE;
  22.   ELEN   : BYTE;
  23.   ELEM   : STRING255;
  24.   OUTPAT : STRING255;
  25.   LCNT   : INTEGER;
  26.   CNT    : INTEGER;
  27.   XPOS,YPOS : INTEGER;
  28.   STLINE,ENLINE : INTEGER;
  29.   EVSCREEN : ARRAY [0..99,1..80] OF BYTE ABSOLUTE $B800:$0000;
  30.   ODSCREEN : ARRAY [0..99,1..80] OF BYTE ABSOLUTE $B800:$2000;
  31.  
  32.   DOIT : BOOLEAN;
  33.  
  34.   SLPTR : ARRAY [0..719] OF ^SCANLINE;   (* pointers to scan line buffers *)
  35.  
  36. PROCEDURE HELPMSG;
  37.        BEGIN
  38.          WRITE('MACVIEW - View MacPaint images  ...  by Mark Anacker');
  39.          WRITELN('  09/24/85'); WRITELN;;
  40.          WRITELN('This program will let you view an entire MacPaint image.');
  41.          WRITELN('First, transfer the picture file from the Mac.  Then,');
  42.          WRITELN('run this program and give it the file name.  You may use');
  43.          WRITELN('the keypad keys 1-3 and 7-9 to scroll over the image.');
  44.          WRITELN('Press the space bar to exit back to DOS.');
  45.          WRITELN;
  46.          WRITELN('You may specify the file name on the command line.');
  47.          WRITELN;
  48.          WRITELN('Remember, the aspect ratio is different.  The picture will');
  49.          WRITELN('be distorted somewhat in the vertical direction.');
  50.          WRITELN;
  51.        END;
  52.  
  53. PROCEDURE GETFILE;
  54. VAR    CNT : INTEGER;
  55.        INCH : CHAR;
  56.        BEGIN
  57.          ASSIGN(PNTFIL,FILNAM);
  58.          (*$I-*) RESET(PNTFIL); (*$I+*)
  59.          IF IORESULT<>0 THEN
  60.            BEGIN
  61.              WRITELN('** Error opening file - halting **'); HALT(1);
  62.            END;
  63.          SEEK(PNTFIL,512);               (* skip brush patterns *)
  64.          YPOS:=0; LCNT:=0; OUTPAT:='';
  65.          SCANFLAG:=TRUE;
  66.          ODDLINE:=0; EVENLINE:=0;
  67.          STLINE:=0;
  68.        END;
  69.  
  70. PROCEDURE OUTSCREEN;                               (* display line *)
  71. VAR    CNT,CNT2 : INTEGER;
  72.        BEGIN
  73.          FOR CNT:=1 TO LENGTH(OUTPAT) DO           (* invert bits to black *)
  74.            OUTPAT[CNT]:=CHR(NOT ORD(OUTPAT[CNT])); (* on white like the Mac *)
  75.          NEW(SLPTR[LCNT]);                         (* allocate a new buffer line*)
  76.          FILLCHAR(SLPTR[LCNT]^,80,CHR(0));         (* fill it to black *)
  77.          MOVE(OUTPAT[1],SLPTR[LCNT]^,72);          (* and copy the decoded bits *)
  78.        END;
  79.  
  80. PROCEDURE PUTLINE;                       (* decide if we need to do line *)
  81.        BEGIN
  82.          OUTPAT:=OUTPAT+ELEM;            (* build scan line pattern *)
  83.          IF LENGTH(OUTPAT)>=72 THEN      (* if we have a full line, *)
  84.            BEGIN
  85.              IF LENGTH(OUTPAT)>72 THEN   (* if too long, truncate *)
  86.                OUTPAT:=COPY(OUTPAT,1,72);
  87.              OUTSCREEN;                  (* put it in the buffer *)
  88.              LCNT:=LCNT+1; OUTPAT:='';
  89.              FILLCHAR(OUTPAT,75,CHR(0)); (* reset the string *)
  90.            END;
  91.        END;
  92.  
  93. PROCEDURE REPBLOCK;                      (* block of repeating data *)
  94. VAR    TMPBYTE : BYTE;
  95.        CNT : INTEGER;
  96.        BEGIN
  97.          ELEN:=(256-ELEN);               (* get character count *)
  98.          READ(PNTFIL,TMPBYTE);           (* get character to repeat *)
  99.          ELEM:='';
  100.          FOR CNT:=0 TO ELEN DO
  101.            ELEM:=CONCAT(ELEM,CHR(TMPBYTE));  (* make string of chars. *)
  102.          PUTLINE;                        (* test for a complete scan line *)
  103.        END;
  104.  
  105. PROCEDURE MIXBLOCK;                      (* block of mixed, raw data *)
  106. VAR    TMPBYTE : BYTE;
  107.        CNT : INTEGER;
  108.        BEGIN
  109.          ELEM:='';
  110.          FOR CNT:=0 TO ELEN DO
  111.            BEGIN
  112.              READ(PNTFIL,TMPBYTE);             (* get characters *)
  113.              ELEM:=CONCAT(ELEM,CHR(TMPBYTE));  (* add to running pattern *)
  114.            END;
  115.          PUTLINE;                        (* test for complete scan line *)
  116.        END;
  117.  
  118. PROCEDURE LOADBUF;                       (* read data from file *)
  119.        BEGIN
  120.          GETFILE;                        (* open file *)
  121.          WRITELN('Loading picture into buffer ... Please wait a moment');
  122.          REPEAT
  123.            BEGIN
  124.              READ(PNTFIL,ELEN);          (* get a byte *)
  125.              IF ELEN>127 THEN            (* if 8th bit set, *)
  126.                REPBLOCK                  (* it's a repeater, else *)
  127.               ELSE
  128.                MIXBLOCK;                 (* it's mixed *)
  129.            END;
  130.          UNTIL LCNT>=720;                (* until all 720 lines are done *)
  131.          CLOSE(PNTFIL);
  132.        END;
  133.  
  134. PROCEDURE SHOWBUF;                       (* display the buffer on screen *)
  135. VAR    CNT : INTEGER;
  136.        BEGIN
  137.          EVENLINE:=0; ODDLINE:=0;
  138.          FOR CNT:=STLINE TO STLINE+199 DO  (* show the current 200 scan lines *)
  139.            BEGIN
  140.              IF (CNT AND 1)<>1 THEN       (* even line *)
  141.                BEGIN
  142.                  MOVE(SLPTR[CNT]^,EVSCREEN[EVENLINE,1],80);  (* even lines *)
  143.                  EVENLINE:=EVENLINE+1;
  144.                END
  145.               ELSE
  146.                BEGIN                     (* odd line *)
  147.                  MOVE(SLPTR[CNT]^,ODSCREEN[ODDLINE,1],80);   (* odd lines *)
  148.                  ODDLINE:=ODDLINE+1;
  149.                END;
  150.              END;
  151.        END;
  152.  
  153. PROCEDURE MOVEIT;                        (* scroll the picture up and down *)
  154. CONST
  155.   FKTABLE : STRING[6] = 'OPQGHI';        (* cursor/numeric key *)
  156.   FKEQUIV : STRING[6] = '123789';        (* conversion table *)
  157. VAR    INCH : CHAR;
  158.        CNT : INTEGER;
  159.        BEGIN
  160.          REPEAT
  161.            GOTOXY(75,1); WRITE(STLINE:3);  (* put top scan line in upper corner *)
  162.            READ(KBD,INCH);               (* get the key from the user *)
  163.            IF (INCH=CHR(27)) AND KEYPRESSED THEN   (* if a real cursor key, *)
  164.              BEGIN
  165.                READ(KBD,INCH);           (* get the key code *)
  166.                IF POS(INCH,FKTABLE)>0 THEN (* and convert to it's number *)
  167.                  BEGIN
  168.                    CNT:=POS(INCH,FKTABLE); INCH:=FKEQUIV[CNT];
  169.                  END;
  170.              END;
  171.            CASE INCH OF
  172.             '8' : BEGIN                  (* move image UP *)
  173.                     IF STLINE<520 THEN
  174.                       BEGIN
  175.                         FOR CNT:=0 TO 98 DO
  176.                           BEGIN
  177.                             MOVE(EVSCREEN[CNT+1,1],EVSCREEN[CNT,1],72);
  178.                             MOVE(ODSCREEN[CNT+1,1],ODSCREEN[CNT,1],72);
  179.                           END;
  180.                         FILLCHAR(EVSCREEN[99,1],72,CHR(0));
  181.                         FILLCHAR(ODSCREEN[99,1],72,CHR(0));
  182.                         STLINE:=STLINE+2;
  183.                         MOVE(SLPTR[STLINE+198]^,EVSCREEN[99,1],72);
  184.                         MOVE(SLPTR[STLINE+199]^,ODSCREEN[99,1],72);
  185.                       END;
  186.                   END;
  187.             '2' : BEGIN                  (* move image DOWN *)
  188.                     IF STLINE>1 THEN
  189.                       BEGIN
  190.                         FOR CNT:=99 DOWNTO 1 DO
  191.                           BEGIN
  192.                             MOVE(EVSCREEN[CNT-1,1],EVSCREEN[CNT,1],72);
  193.                             MOVE(ODSCREEN[CNT-1,1],ODSCREEN[CNT,1],72);
  194.                           END;
  195.                         FILLCHAR(EVSCREEN[0,1],72,CHR(0));
  196.                         FILLCHAR(ODSCREEN[0,1],72,CHR(0));
  197.                         STLINE:=STLINE-2;
  198.                         MOVE(SLPTR[STLINE]^,EVSCREEN[0,1],72);
  199.                         MOVE(SLPTR[STLINE+1]^,ODSCREEN[0,1],72);
  200.                       END;
  201.                   END;
  202.             '3' : BEGIN                  (* page image DOWN *)
  203.                     STLINE:=STLINE-100;
  204.                     IF STLINE<0 THEN STLINE:=0;
  205.                     SHOWBUF;
  206.                   END;
  207.             '9' : BEGIN                  (* page image UP *)
  208.                     STLINE:=STLINE+100;
  209.                     IF STLINE>520 THEN STLINE:=520;
  210.                     SHOWBUF;
  211.                   END;
  212.             '7' : BEGIN                  (* go to TOP of image *)
  213.                     STLINE:=0; SHOWBUF;
  214.                   END;
  215.             '1' : BEGIN                  (* go to BOTTOM of image *)
  216.                     STLINE:=514; SHOWBUF;
  217.                   END
  218.            END;
  219.          UNTIL INCH=' ';                 (* exit when SPACE bar is pressed *)
  220.        END;                              (* moveit *)
  221.  
  222.                (* main section *)
  223.  
  224. BEGIN
  225.   TEXTCOLOR(7);                          (* set color to gray *)
  226.   IF PARAMCOUNT=0 THEN                   (* if a blank command line, *)
  227.     BEGIN
  228.       HELPMSG;                           (* show message, prompt for file *)
  229.       WRITE('MacPaint file name : '); READLN(FILNAM);
  230.       IF FILNAM='' THEN HALT(2);         (* if none given, exit to DOS *)
  231.     END
  232.    ELSE
  233.     FILNAM:=PARAMSTR(1);                 (* else get file name from cmd line *)
  234.   IF POS('.',FILNAM)=0 THEN              (* if no extension was given, *)
  235.    FILNAM:=FILNAM+'.MCP';                (* assume .MCP *)
  236.   LOADBUF;                               (* load the file *)
  237.   HIRES;                                 (* switch to hi-res mode *)
  238.   SHOWBUF;                               (* display the buffer *)
  239.   MOVEIT;                                (* move it up and down *)
  240.   CLRSCR;                                (* clear the screen when done *)
  241. END.
  242.