gonzalm@jacobs.CS.ORST.EDU (Mario Gonzales) (02/12/91)
Ok. I am writing a screen saver and the video port addresses given to me in a book to turn the port on/off are not working. What I would like to know is what the address of these ports are. Part two of my question is: I am going to upgrade this program to switch the physical page to a virtual and vice versa so a message can be displayed whil the screen saver is active. Configuration: IBM Ps/2 Vga Monitor (everthing came with the PS/2 30) So.. all factory installed. below is the program an what I am attempting to do. You can see that I try to detect the video type and switch accordingly to the Porton/PortOff addresses but nothing happens. Help If you can: Mario L. Gonzales gonzalm@jacobs.cs.orst.edu {$M 2000,0,0} {$R-,s-,i-,d+,f+,v-,b-,n-,l+} Program ScreenSaver; uses dos,crt; const timerint=$08; Kbdint=$09; Timelimit: Word=5460; var Regs :registers; Cnt:word; PortNum:word; Portoff:word; Porton:word; OldkbdVec,OldTimerVec:pointer; i:real; Code:word; (*--------------------------------------------------------------------*) Procedure STI; Inline ($FB); (*--------------------------------------------------------------------*) Procedure CLI; Inline ($FA); (*--------------------------------------------------------------------*) Procedure CallOldInt (Sub:pointer); Begin Inline ($9C/ {PushHF } $FF/$5E/$06); {Call Dword Ptr [BP+6] } end; (*--------------------------------------------------------------------*) Procedure Keyboard(Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP:WORD); INTERRUPT; BEGIN CALLOLDINT(OLDKBDVEC); IF (CNT >= TimeLimit) then Port[portnum]:=PortOn; Cnt:=0; STI; End; (*---------------------------------------------------------------------*) Procedure Clock(Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP:WORD); INTERRUPT; Begin CallOldInt(OldTimerVec); if (Cnt>TimeLimit) then Port[Portnum]:=Portoff else Inc(Cnt,1); STI; end; (*---------------------------------------------------------------------*) Procedure Help; begin clrscr; writeln; writeln ('-------------------------------------------'); writeln ('| SCREEN WARDEN (c)1991 Mario L. Gonzales |'); writeln ('-------------------------------------------'); writeln; writeln ('Saver [Time in Minutes]'); writeln ('eg. Saver 5'); writeln ('Will Blank the Screen in 5 minutes of idle time.'); writeln; Writeln ('SCREEN WARDEN (c)1991 -- Not Installed'); Halt; end; (*---------------------------------------------------------------------*) Begin If ParamCount=0 then Help; If (ParamCount=1) and (ParamStr(1)='?') then Help; If ParamCount=1 then begin VAl(ParamStr(1),i,code); If (Code=0) and (i>0) and (i<11) then TimeLimit:=Trunc(i*18.2*60); end; Regs.AH :=$0F; Intr($10,Regs); If Regs.AL=7 then begin PortNum:=$3B8; PortOff:=$21; PortOn:=$29; end Else Begin PortNum:=$3D8; Portoff:=$25; PortOn:=$2D; end; GetIntVec(KbdInt,OldKbdVec); GetIntVec(TimerInt,OldTimerVec); SetIntVec(TimerInt,@Clock); SetIntVec(KbdInt,@Keyboard); Cnt:=0; clrscr; writeln; writeln ('-------------------------------------------'); writeln ('| SCREEN WARDEN (c)1991 Mario L. Gonzales |'); writeln ('-------------------------------------------'); writeln; WRiteln ('Installation Successful.'); keep(0); End. So If you read this far maybee you know what I need to? THANKS IN ADVANCE. E-Mail Directly or Post. (gonzalm@Jacobs.cs.orst.edu))