home *** CD-ROM | disk | FTP | other *** search
- PROGRAM sideways(INPUT,OUTPUT,infile);
-
- {COPYRIGHT @ 1983
- Jim Holtman
- 35 Dogwood Trail
- Randolph, NJ 07869
- (201) 361-3396}
-
- { Modified for Turbo Pascal by Jeff Firestone. August, 1984. }
-
- {This program will print the `infile' sideways on an EPSON MX-80 Printer.
- It makes use of the characters in the PC's ROM for the graphics mode of
- the CRT. The characters in the file are `looked up' and then the graphics
- mode of the printer is used for output.}
-
- { The DEBUG statements will output on the CRT the current line being printed.
- The line will appear vertically. }
-
- TYPE
- CHAR_PER_LINE = 0..1999; { Maximum input line size }
- vstr = ARRAY[0..1999] OF CHAR;
- ROM_ARRAY = ARRAY[0..32000] OF CHAR;
- Strng = STRING[20];
-
- CONST
- EOFL = #26; { TEXT EOF character }
- EOL = #13;
- TAB = #9; { expand TABs }
- MAX_LINES = 48; { Lines/Page }
- MAX_LINES1 = 49; { MAXLINES + 1 }
- SPACES_PER_LINE = 2; { 2/72th inch space between lines }
- SPACES_PER_LETTER = 8; { DOT size of characters }
-
- VAR
- lptr : ARRAY[1..MAX_LINES] OF ^vstr; { input lines }
- inbuf : ARRAY[CHAR_PER_LINE] OF CHAR;
- linesize : CHAR_PER_LINE;
- indx : 0..MAX_LINES;
- line : 0..MAX_LINES1;
- infile : FILE OF CHAR;
- printer : TEXT;
- col : CHAR_PER_LINE;
- pchar : INTEGER;
- ichar : 0..7;
- max : CHAR_PER_LINE;
- rom : ^ROM_ARRAY;
- inchar : CHAR;
- name : Strng;
- ignore : SET OF #0..#$FF;
-
-
-
- {--- 1 --------------------------------------------------------------}
-
- PROCEDURE Greetings;
- BEGIN
- GOTOXY(26,1);
- WRITELN('SIDEWAYS FOR TURBO PASCAL');
- WRITELN; WRITELN;
- WRITELN('SideWays prints the file you specify sidewise on you Epson printer.');
- WRITELN('This program is useful for printing spreadsheet PRINT files which are');
- WRITELN('too wide to be printed in the normal manner.');
- END;
-
-
- {--- 2 --------------------------------------------------------------}
-
- PROCEDURE PRINT_CHAR(pchar : INTEGER);
- BEGIN
- pchar := pchar * 8;
- FOR ichar := 7 DOWNTO 0 DO {Pickup character, a line at a time, }
- WRITE(printer,rom^[pchar+ichar]); {from ROM}
- FOR ichar := 1 TO SPACES_PER_LINE DO
- WRITE(printer, #0);
- END;
-
-
- {--- 1 --------------------------------------------------------------}
-
- PROCEDURE SEND_TO_PRINTER;
- BEGIN
- WRITELN(OUTPUT,'line=',line,' max=',max); {--DEBUG--}
- IF inchar <> EOFL THEN
- line := MAX_LINES
- ELSE line := line-1;
- FOR col := 1 TO max DO
- BEGIN { Output collected lines }
- WRITE(printer,#27 + 'A' + CHR(SPACES_PER_LETTER) + #27 + 'K',
- CHR((line*(8+SPACES_PER_LINE)) MOD 256),
- CHR((line*(8+SPACES_PER_LINE)) DIV 256));
- FOR indx := line DOWNTO 1 DO
- BEGIN { Scan next column }
- {if column pointer is larger than string, output BLANK}
- IF col > ORD(lptr[indx]^[0]) THEN
- pchar := ORD(' ')
- ELSE
- pchar := ORD(lptr[indx]^[col]);
- WRITE(OUTPUT,CHR(pchar)); {--DEBUG--}
- PRINT_CHAR(pchar);
- END; { FOR indx := line DOWNTO 1 DO }
- WRITELN(printer);
- WRITELN(OUTPUT);{--DEBUG--}
- END; { FOR col := 1 TO max DO }
- WRITELN(printer);
- WRITELN(OUTPUT);{--DEBUG--}
- FOR indx := 1 TO line DO DISPOSE(lptr[indx]); {Free up space on HEAP}
- WRITE(printer, #12);
- END;
-
-
- {--- 1 --------------------------------------------------------------}
-
- PROCEDURE READ_IN_THE_FILE;
- LABEL break;
- BEGIN
- IF inchar = EOL THEN
- BEGIN {check for End-of-Line}
- inbuf[0]:= CHR(LO(linesize));
- inbuf[1]:= CHR(HI(linesize));
- GetMem(lptr[line], linesize+1); { allocate string storage }
- MOVE(inbuf[0], lptr[line]^, (linesize+1)); { save }
- IF linesize > max THEN max := linesize;
- linesize := 1;
- line := line+1;
- READ(infile, inchar);
- WRITELN(OUTPUT,'<<'); {--DEBUG--}
- GOTO break;
- END;
- IF inchar = EOFL THEN GOTO break;
-
- IF NOT(inchar IN IGNORE) THEN
- BEGIN
- IF inchar = TAB THEN
- REPEAT {Expand TABs}
- linesize := linesize+1;
- inbuf[linesize] := ' ';
- UNTIL (linesize MOD 8) = 0
- ELSE BEGIN
- linesize := linesize+1;
- inbuf[linesize] := inchar;
- END; { ELSE }
- WRITE(OUTPUT,inchar);{--DEBUG--}
- END; { IF NOT(inchar IN IGNORE) }
-
- READ(infile, inchar);
- break:
- END;
-
-
- {--------------------------------------------------------------------}
-
- BEGIN
- IGNORE:= [#0..#8,#10..#$1f,#$80..#$FF];
- {NOTE!!!!
- The following declarations define the segment and offset values
- for the characters in the PC version of the ROM. For the XT, check
- the TECH MANUAL for the correct values.}
-
- MEMW[SEG(rom):OFS(rom)+2]:= $F000; {seg addr of the CRT char generation}
- MEMW[SEG(rom):OFS(rom)] := $FA6E; {OFS address of matrix in the ROM --
- for non-XT versions of PC}
-
- Greetings; Writeln; Writeln;
- WRITE('What file would you like to print SideWays : ');
- READLN(name);
- ASSIGN(printer,'lpt1:'); { Open the printer }
- ASSIGN(infile,name);
- REWRITE(printer);
- RESET(infile);
- READ(infile, inchar);
- REPEAT
- max := 0;
- linesize := 1;
- line := 1;
-
- WHILE (line <= MAX_LINES) AND (inchar <> EOFL) DO
- READ_IN_THE_FILE;
- SEND_TO_PRINTER;
-
- UNTIL inchar = EOFL;
- END.