home *** CD-ROM | disk | FTP | other *** search
- {************************************************}
- {* MONITOR.JOY *}
- {* Monitortreiber für das Grafiksystem für *}
- {* Schneider Joyce/Armstrad PCW *}
- {* (C) 1989 S.Szkaradnik & TOOLBOX *}
- {************************************************}
-
-
- (* Overlay *) (* Bei Speichermangel in Turbo 3.0*)
- (* als Overlay deklarieren ! *)
- PROCEDURE MonitorDriver ( VAR Par : Parameters ) ;
-
- TYPE
- Code = ARRAY [ 0..1 ] OF BYTE ;
-
- CONST
- PeekCode : Code = (
- $7E, { ld a,(hl) }
- $C9 { ret });
- PokeCode : Code = (
- $77, { ld (hl),a }
- $C9 { ret });
-
- VAR
- AsmPeek, AsmPoke : Code ;
-
- CONST
- { Disable text cursor and status line }
- MonInit = #27#102#27#48 ;
- { Enable text cursor and status line }
- MonExit = #27#101#27#49 ;
-
- FUNCTION Open : BOOLEAN ;
- BEGIN
- IF ( Addr ( AsmPeek ) >= $C000 )
- AND ( Addr ( AsmPoke ) >= $C000 )
- THEN BEGIN
- Device := Monitor ;
- AsmPeek := PeekCode ;
- AsmPoke := PokeCode ;
- Xmin := 0 ; Xmax := 719 ;
- Ymin := 0 ; Ymax := 255 ;
- Write ( MonInit ) ;
- Open := TRUE ;
- END
- ELSE
- Open := FALSE ;
- END ;
-
- PROCEDURE ScrPoke ( Adr : Pointer ;
- ScrByte : BYTE );
- BEGIN
- INLINE (
- $21/ScrByte/ { ld hl,scrbyte }
- $7E/ { ld a,(hl) }
- $2A/Adr/ { ld hl,(adr) }
- $01/AsmPoke/ { ld bc,asmpoke }
- $CD/$5A/$FC/ { call xbios }
- $E9/$00 { dw 00E9H } )
- END ;
-
- FUNCTION ScrPeek ( Adr : Pointer ) : BYTE ;
- VAR Result : BYTE ;
- BEGIN
- INLINE (
- $2A/Adr/ { ld hl,(adr) }
- $01/AsmPeek/ { ld bc,asmpeek }
- $CD/$5A/$FC/ { call xbios }
- $E9/$00/ { dw 00E9H }
- $21/Result/ { ld hl,result }
- $77 { ld (hl),a } ) ;
- ScrPeek := Result
- END ;
-
- FUNCTION Roller ( Y : BYTE ) : Pointer ;
- CONST Roll = $B600 ;
- VAR Adr : Pointer ;
- BEGIN
- Adr := Ptr ( Roll + Y SHL 1 ) ;
- Roller := Ptr ( ScrPeek ( Adr )
- + ScrPeek(Ptr(Succ(Ord(Adr)))) SHL 8)
- END ;
-
- FUNCTION Adr ( X, Y : INTEGER ) : Pointer ;
- CONST Mask = $FFF8 ;
- VAR Rol : Pointer ;
- BEGIN
- Y := 255 - Y ;
- Rol := Roller ( Y ) ;
- Adr :=Ptr((Ord(Rol) AND Mask SHL 1 + X) AND Mask
- + Ord (Rol) AND 7);
- END ;
-
- FUNCTION Point ( X, Y : INTEGER ) : BOOLEAN ;
- BEGIN
- IF ( X >= Xmin ) AND ( X <= Xmax )
- AND ( Y >= Ymin ) AND ( Y <= Ymax )
- THEN BEGIN
- IF ScrPeek ( Adr ( X, Y ) )
- AND Pat [ X AND 7 ] = 0
- THEN Point := FALSE
- ELSE Point := TRUE ;
- END
- ELSE Fence ;
- END ;
-
- PROCEDURE Dot ( X, Y : INTEGER ) ;
- VAR Ad : Pointer ;
- BEGIN
- Control ( X, Y ) ;
- Ad := Adr ( X, Y ) ;
- IF Tool = Pen THEN
- ScrPoke ( Ad, ScrPeek ( Ad )
- OR Pat [ X AND 7 ] ) ;
- END ;
-
- PROCEDURE Plot ( X, Y : INTEGER ) ;
- BEGIN
- Control ( X, Y ) ;
- Position.X := X ; Position.Y := Y ;
- END ;
-
- BEGIN
- WITH Par DO
- CASE Command OF
- OpenF : Result := Open ;
- PointF : Result := Point ( X, Y ) ;
- PlotF : Plot ( X, Y ) ;
- DotF : Dot ( X, Y ) ;
- ClearF : ClrScr ;
- CloseF : Write ( MonExit )
- END ;
- END ;