summaryrefslogtreecommitdiff
path: root/fpcsrc/packages/fv/src/go32smsg.inc
blob: 4e2f0f0ff088a739e0afec955ee6cf707cbdb121 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
{

   System independent system interface for go32v2

   Copyright (c) 2000 by Pierre Muller

   See the file COPYING.FPC, included in this distribution,
   for details about the copyright.


   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public
   License along with this library; if not, write to the Free
   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
}

Const
  SystemEventActive : Boolean = false;


procedure InitSystemMsg;
var
  res : word;
begin
  if SystemEventActive then
    exit;
  { enable close }
  asm
    movl $0x168f,%eax
    movl $1,%edx
    int $0x2f
    movw %ax,Res
  end;
  SystemEventActive:=(Res=0);
end;


procedure DoneSystemMsg;
begin
  if not SystemEventActive then
    exit;
  { disable close }
  asm
    movl $0x168f,%eax
    movl $0,%edx
    int $0x2f
  end;
  SystemEventActive:=false;
end;

procedure GetSystemEvent(var SystemEvent: TSystemEvent);
begin
  PollSystemEvent(SystemEvent);
end;

function PollSystemEvent(var SystemEvent: TSystemEvent):boolean;
var
  CloseState : word;
begin
  SystemEvent.typ:=SysNothing;
  if not SystemEventActive then
    exit(false);
  { Query close }
  asm
    movl $0x168f,%eax
    movl $100,%edx
    int $0x2f
    movw %ax,CloseState
  end;
  if (CloseState = 0) then
    begin
      { acknowledge Close }
      asm
        movl $0x168f,%eax
        movl $200,%edx
        int $0x2f
        movw %ax,CloseState
      end;
      { non zero means error ! }
      if CloseState=0 then
        begin
          PollSystemEvent:=true;
          SystemEvent.typ:=SysClose;
        end;
    end;
end;