Код:
!====================================!
! PANELS.LIB
! PL65 Screen Panels operations.
!------------------------------------!
! InitVid(),
! SaveBlk(INT X0,Y0,X1,Y1 POINTER BP),
! SaveBlk(INT X0,Y0,X1,Y1 POINTER BP),
! Inverse(BYTE byte),
! InvLin(INT X0,Y0,X1)
! InvBlk(INT X0,Y0,X1,Y1),
! PutShp(INT X0,Y0 BYTE Shp,Mod),
! PlotHor(INT X0,Y0,L BYTE Shp,Mod),
! PlotVer(INT X0,Y0,L BYTE Shp,Mod)
!------------------------------------!
! Copyright (C) 2014 EZsoft
!====================================!
CONST MINCOL=0,MAXCOL=39,MINROW=0,MAXROW=23
INT SAVMSC=$58,LinAdr[24]
POINTER ScrAdr BYTE ScrVal BASED ScrAdr
!------------------------------------!
! Initialize Line-based Access
! to screen
PROC InitVid()
INT Y
BEGIN
FOR Y=0 TO 23 DO
LinAdr[Y]=Y*40+SAVMSC
NEXT
END
!------------------------------------!
! Save rectangular screen block
! to buffer defined in MAIN()
!------------------------------------!
! INT PW,PH BYTE PBuf[PW*PH]
! POINTER BP
PROC SaveBlk(INT X0,Y0,X1,Y1 POINTER BP)
INT X,Y BYTE BV BASED BP
BEGIN
FOR Y=Y0 TO Y1 DO
FOR X=X0 TO X1 DO
ScrAdr=LinAdr[Y]+X
BV=ScrVal ScrVal=0
BP=BP+1
NEXT
NEXT
END
!------------------------------------!
! Restore rectangular screen block
! from buffer defined in MAIN()
PROC RestBlk(INT X0,Y0,X1,Y1 POINTER BP)
INT X,Y BYTE BV BASED BP
BEGIN
FOR Y=Y0 TO Y1 DO
FOR X=X0 TO X1 DO
ScrAdr=LinAdr[Y]+X
ScrVal=BV
BP=BP+1
NEXT
NEXT
END
! ----------------------------
! Inverse Screen Byte !
FUNC Inverse(BYTE byte)
CONST mask=%10000000
BEGIN
byte=byte XOR mask
END byte
! ----------------------------
! Inverse Line on Screen
PROC InvLin(INT X0,Y0,X1)
INT X,Y
BEGIN
Y=Y0
FOR X=X0 TO X1 DO
ScrAdr=LinAdr[Y]+X
ScrVal=Inverse(ScrVal)
NEXT
END
! ----------------------------
! Invert rectangular screen block
PROC InvBlk(INT X0,Y0,X1,Y1)
INT X,Y
BEGIN
FOR Y=Y0 TO Y1 DO
FOR X=X0 TO X1 DO
ScrAdr=LinAdr[Y]+X
ScrVal=Inverse(ScrVal)
NEXT
NEXT
END
! ----------------------------
! Put Char/Byte to Screen
! 0=Screen Byte, 1=ATASCII Char
PROC PutShp(INT X0,Y0 BYTE Shp,Mod)
INT X,Y
BEGIN
IF Mod=1 THEN Shp=Asc2Scr(Shp) ENDIF
X=X0 Y=Y0
ScrAdr=LinAdr[Y]+X
ScrVal=Shp
END
! ----------------------------
! Put Horizontal line of Chars/Bytes
! 0=Screen Byte, 1=ATASCII Char
PROC PlotHor(INT X0,Y0,L BYTE Shp,Mod)
INT X,X1,Y
BEGIN
IF Mod=1 THEN Shp=Asc2Scr(Shp) ENDIF
X1=X0+L Y=Y0
FOR X=X0 TO X1 DO
ScrAdr=LinAdr[Y]+X
ScrVal=Shp
NEXT
END
! ----------------------------
! Put Vertical line of Chars/Bytes
! 0=Screen Byte, 1=ATASCII Char
PROC PlotVer(INT X0,Y0,L BYTE Shp,Mod)
INT X,Y,Y1
BEGIN
IF Mod=1 THEN Shp=Asc2Scr(Shp) ENDIF
X=X0 Y1=Y0+L
FOR Y=Y0 TO Y1 DO
ScrAdr=LinAdr[Y]+X
ScrVal=Shp
NEXT
END
! ----------------------------
! Draw Frame around Panel
PROC DrawFrm(INT X0,Y0,X1,Y1,PW,PH)
CONST TLC=$51,HOR=$52,TRC=$45,VER=$7C,BLC=$5A,BRC=$43
BEGIN
PutShp(X0,Y0,TLC,0) PlotHor(X0+1,Y0,PW,HOR,0) PutShp(X1,Y0,TRC,0)
PlotVer(X0,Y0+1,PH,VER,0) PlotVer(X1,Y0+1,PH,VER,0)
PutShp(X0,Y1,BLC,0) PlotHor(X0+1,Y1,PW,HOR,0) PutShp(X1,Y1,BRC,0)
END
! ----------------------------
PROC DrawPnl(INT X0,Y0,PW,PH,PAdr)
POINTER ChrPtr
BYTE ChrShp BASED ChrPtr
INT X,Y
BEGIN
ChrPtr=PAdr
FOR Y=Y0+1 TO Y0+PH DO
FOR X=X0+1 TO X0+PW DO
ScrAdr=LinAdr[Y]+X
ChrShp=Asc2Scr(ChrShp) ScrVal=ChrShp
ChrPtr=ChrPtr+1
NEXT
NEXT
END
! ----------------------------
ENDFILE