home *** CD-ROM | disk | FTP | other *** search
- {************************************************}
- {* PRINTER.PAS *}
- {* Druckertreiber des Grafiksystem für den *}
- {* Schneider/Amstrad PCW Systemdrucker *}
- {* (C) 1989 S.Szkaradnik & TOOLBOX *}
- {************************************************}
- (* Overlay *) (* Bei Speichermangel in Turbo 3.0*)
- (* als Overlay deklarieren ! *)
-
- PROCEDURE PrinterDriver ( VAR Par : Parameters ) ;
-
- TYPE
- Blocks = ARRAY [ 0..1023 ] OF BYTE ;
- Buffer = RECORD
- Upd : BOOLEAN ;
- Ind : BYTE ;
- Blk : Blocks ;
- END ;
-
- VAR
- Buffers : ARRAY [ 0..1 ] OF Buffer ;
- Prev : BYTE ;
-
- FUNCTION Block ( N : BYTE ) : BYTE ;
- BEGIN
- IF ( Buffers [0].Ind <> N )
- AND ( Buffers [1].Ind <> N ) THEN BEGIN
- WITH Buffers [ Prev ] DO BEGIN
- IF Upd THEN BEGIN
- Seek ( BitMap, Ind SHL 3 ) ;
- BlockWrite ( BitMap, Blk, 8 ) ;
- END ;
- Upd := FALSE ;
- Ind := N ;
- Seek ( BitMap, Ind SHL 3 ) ;
- BlockRead ( BitMap, Blk, 8 ) ;
- END ;
- Block := Prev ;
- IF Prev = 0 THEN
- Prev := 1
- ELSE
- Prev := 0 ;
- END
- ELSE
- IF Buffers [0].Ind = N THEN
- Block := 0
- ELSE
- Block := 1 ;
- END ;
-
- FUNCTION Open : BOOLEAN ;
- VAR I : INTEGER ;
- BEGIN
- Assign ( BitMap, 'BITMAP.PIC' ) ;
- ReSet ( BitMap ) ;
- IF IOResult = 0 THEN BEGIN
- Device := Printer ;
- Xmin := 0 ;
- Xmax := 959 ;
- Ymin := 0 ;
- Ymax := 719 ;
- FOR I := 0 TO 1 DO
- WITH Buffers [I] DO BEGIN
- Upd := FALSE ;
- Ind := 255
- END ;
- Prev := 0 ;
- Open := TRUE ;
- END
- ELSE
- Open := FALSE
- END ;
-
- PROCEDURE Calculate ( X, Y : INTEGER ;
- VAR Bit : BYTE ;
- VAR Adr, Blk : INTEGER ) ;
- BEGIN
- Y := 719 - Y ;
- Bit := Y AND 14 SHR 1 ;
- Adr := X ;
- Blk := Y SHR 3 AND $FFFE + Y AND 1 ;
- END ;
-
- FUNCTION Point ( X, Y : INTEGER ) : BOOLEAN ;
- VAR
- Bit : BYTE ;
- Adr, Bl : INTEGER ;
- BEGIN
- IF ( X >= Xmin ) AND ( X <= Xmax )
- AND ( Y >= Ymin ) AND (Y <= Ymax ) THEN BEGIN
- Calculate ( X, Y, Bit, Adr, Bl ) ;
- IF Buffers [ Block ( Bl ) ].Blk [ Adr ]
- AND Pat [ Bit ] <> 0 THEN
- Point := TRUE
- ELSE
- Point := FALSE ;
- END
- ELSE
- Fence ;
- END ;
-
- PROCEDURE Dot ( X, Y : INTEGER ) ;
- VAR
- Bit : BYTE ;
- Adr, Bl : INTEGER ;
- BEGIN
- Control ( X, Y ) ;
- Calculate ( X, Y, Bit, Adr, Bl ) ;
- WITH Buffers [ Block ( Bl ) ] DO
- IF Tool = Pen THEN BEGIN
- Blk [ Adr ] := Blk [ Adr ] OR Pat [ Bit ];
- Upd := TRUE ;
- END ;
- END ;
-
- PROCEDURE Plot ( X, Y : INTEGER ) ;
- BEGIN
- Control ( X, Y ) ;
- Position.X := X ;
- Position.Y := Y ;
- END ;
-
- PROCEDURE Clear ;
- VAR
- I : INTEGER ;
- Bl : Blocks ;
- BEGIN
- FOR I := 0 TO 1023 DO Bl [I] := 0 ;
- ReSet ( BitMap ) ;
- FOR I := 0 TO 89 DO BEGIN
- Seek ( BitMap, I SHL 3 ) ;
- BlockWrite ( BitMap, Bl, 8 ) ;
- END ;
- END ;
-
- PROCEDURE Print ;
- VAR
- I : BYTE ;
-
- PROCEDURE PrintRow ( N : BYTE ) ;
- VAR I : INTEGER ;
- BEGIN
- Write ( Lst, #27, 'L', #192, #3 ) ;
- FOR I := 0 TO 959 DO
- Write ( Lst, Chr ( Buffers [N].Blk [I] )) ;
- END ;
-
- BEGIN
- FOR I := 0 TO 44 DO BEGIN
- PrintRow ( Block ( I SHL 1 ) ) ;
- Write ( Lst, #27, 'J', #1, #13 ) ;
- PrintRow ( Block ( I SHL 1 + 1 ) ) ;
- Write ( Lst, #27, 'J', #23, #13 ) ;
- END ;
- END ;
-
- BEGIN
- WITH Par DO
- CASE Command OF
- OpenF : Result := Open ;
- PointF : Result := Point ( X, Y ) ;
- DotF : Dot ( X, Y ) ;
- PlotF : Plot ( X, Y ) ;
- ClearF : Clear ;
- CloseF : BEGIN
- Print ; Close ( BitMap )
- END ;
- END ;
- END ;