{************************************************} { } { MonitorDriver } { MONITOR.INC } { } {************************************************} Overlay 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 MonInit = #27#102#27#48; { Disable text cursor and status line } MonExit = #27#101#27#49; { Enable text cursor and status line } 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;