aboutsummaryrefslogtreecommitdiff
path: root/engines/cge/keybd.cpp
blob: 95899bed55dfee118eed237955f17a3c0a8d8de3 (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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * This program 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 General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

/*
 * This code is based on original Soltys source code
 * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
 */

#include	"cge/keybd.h"
#include	"cge/mouse.h"
#include	<dos.h>

namespace CGE {

SPRITE * KEYBOARD::Client = NULL;
uint8  KEYBOARD::Key[0x60] = { 0 };
uint16  KEYBOARD::Current = 0;
uint16  KEYBOARD::Code[0x60] = { 0,Esc,'1','2','3','4','5','6','7','8','9','0',
			       '-','+',BSp,Tab,'Q','W','E','R','T','Y','U',
			       'I','O','P','[',']',Enter,0/*Ctrl*/,'A','S',
			       'D','F','G','H','J','K','L',';','\'','`',
			       0/*LShift*/,'\\','Z','X','C','V','B','N','M',
			       ',','.','/',0/*RShift*/,'*',0/*Alt*/,' ',
			       0/*Caps*/,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,
			       0/*NumLock*/,0/*ScrollLock*/,Home,Up,PgUp,
			       '-',Left,Ctr,Right,'+',End,Down,PgDn,Ins,Del,
			       0*0x54,0*0x55,0*0x56,F11,F12,0*0x59,0*0x5A,
			       0*0x5B,0*0x5C,0*0x5D,0*0x5E,0*0x5F
			     };
void (* KEYBOARD::OldKeyboard) (...);



KEYBOARD::KEYBOARD (void)
{
  // steal keyboard interrupt
  /* TODO replace totally by scummvm handling
  OldKeyboard = getvect(KEYBD_INT);
  setvect(KEYBD_INT, NewKeyboard);
  */
  warning("STUB: KEYBOARD::KEYBOARD");
}




KEYBOARD::~KEYBOARD (void)
{
  // bring back keyboard interrupt
  /* TODO replace totally by scummvm handling
	setvect(KEYBD_INT, OldKeyboard);
  */
  warning("STUB: KEYBOARD::~KEYBOARD");
}




SPRITE * KEYBOARD::SetClient (SPRITE * spr)
{
  Swap(Client, spr);
  return spr;
}





void KEYBOARD::NewKeyboard (...)
{
  // table address
	/*
  _SI = (uint16) Key;

  // take keyboard code
  asm	in	al,60h
  asm	mov	bl,al
  asm	and	bx,007Fh
  asm	cmp	bl,60h
  asm	jae	xit
  asm	cmp	al,bl
  asm	je	ok		// key pressed

  // key released...
  asm	cmp	[si+bx],bh	// BH == 0
  asm	jne	ok
  // ...but not pressed: call the original service
  OldKeyboard();
  return;

  ok:
  asm	shl	ax,1
  asm	and	ah,1
  asm	xor	ah,1
  asm	mov	[si+bx],ah
  asm	jz	xit		// released: exit

  // pressed: lock ASCII code
  _SI = (uint16) Code;
  asm	add	bx,bx		// uint16 size
  asm	mov	ax,[si+bx]
  asm	or	ax,ax
  asm	jz	xit		// zero means NO KEY
  Current = _AX;

  _SI = (uint16) Client;
  asm	or	si,si
  asm	jz	xit				// if (Client) ...
//--- fill current event entry with mask, key code and sprite
  asm	mov	bx,EvtHead			// take queue head pointer
  asm	inc	byte ptr EvtHead		// update queue head pointer
  asm	shl	bx,3				// * 8
  _AX = Current;
  asm	mov	Evt[bx].(struct EVENT)X,ax	// key code
  asm	mov	ax,KEYB				// event mask
  asm	mov	Evt[bx].(struct EVENT)Msk,ax	// event mask
  //asm	mov	Evt[bx].(struct EVENT)Y,dx	// row
  asm	mov	Evt[bx].(struct EVENT)Ptr,si	// SPRITE pointer

  xit:

  asm	in	al,61h		// kbd control lines
  asm	push	ax		// save it
  asm	or	al,80h		// set the "enable kbd" bit
  asm	out	61h,al		// and write it out
  asm	pop	ax		// original control port value
  asm	out	61h,al		// write it back
  asm	mov	al,20h		// send End-Of-Interrupt
  asm	out	20h,al		// to the 8259 IC
  */
  warning("STUB: KEYBOARD::NewKeyboard");
}

} // End of namespace CGE