File:  [RetroPC.NET] / np2 / macos9 / mackbd.cpp
Revision 1.12: download - view: text, annotated - select for diffs
Wed Feb 18 15:19:01 2004 JST (21 years, 8 months ago) by yui
Branches: MAIN
CVS tags: VER_0_82_x64, VER_0_82, VER_0_81A, VER_0_81, VER_0_80, VER_0_79, VER_0_78, VER_0_77, VER_0_76, VER_0_75, HEAD
add keystat (T.Yui)

#include	"compiler.h"
#include	"np2.h"
#include	"dosio.h"
#include	"mackbd.h"
#include	"keystat.h"


#define		NC		0xff

typedef struct {
	UINT8	f11[5];
	UINT8	f12[5];
} BINDTBL;

static const BINDTBL bindtbl = {
						//   ƒJƒi  Stop  []  NFER  USER
							{0x72, 0x60, 0x4d, 0x51, 0x76},
						//         Copy  [C]  XFER
							{NC,   0x61, 0x4f, 0x35, 0x77}};

void mackbd_resetf11(void) {

	UINT	i;

	for (i=1; i<(sizeof(bindtbl.f11)/sizeof(UINT8)); i++) {
		keystat_forcerelease(bindtbl.f11[i]);
	}
}

void mackbd_resetf12(void) {

	UINT	i;

	for (i=1; i<(sizeof(bindtbl.f12)/sizeof(UINT8)); i++) {
		keystat_forcerelease(bindtbl.f12[i]);
	}
}


#if TARGET_API_MAC_CARBON

typedef struct {
	UINT32	tick;
	BYTE	keymap[16];
	BOOL	active;
	UINT32	repbase;
	UINT32	reptick;
	BYTE	repkey;
} MACKBD;

static	MACKBD		mackbd;

static const BYTE keymac[128] = {
			//	  ‚`,  ‚r,  ‚c,  ‚e,  ‚g,  ‚f,  ‚y,  ‚w		; 0x00
				0x1d,0x1e,0x1f,0x20,0x22,0x21,0x29,0x2a,
			//	  ‚b,  ‚u,    ,  ‚a,  ‚p,  ‚v,  ‚d,  ‚q		; 0x08
				0x2b,0x2c,  NC,0x2d,0x10,0x11,0x12,0x13,
			//	  ‚x,  ‚s,  ‚P,  ‚Q,  ‚R,  ‚S,  ‚U,  ‚T		; 0x10
				0x15,0x14,0x01,0x02,0x03,0x04,0x06,0x05,
			//	  O,  ‚X,  ‚V,  |,  ‚W,  ‚O,  m,  ‚n 	; 0x18
				0x0c,0x09,0x07,0x0b,0x08,0x0a,0x1b,0x18,
			//	  ‚t,  —,  ‚h,  ‚o, ret,  ‚k,  ‚i,  F		; 0x20
				0x16,0x1a,0x17,0x19,0x1c,0x25,0x23,0x27,
			//	  ‚j,  G,  n,  C,  ^,  ‚m,  ‚l,  D		; 0x28
				0x24,0x26,0x28,0x30,0x32,0x2e,0x2f,0x31,
			//	 TAB, SPC,    ,  BS,    , ESC,    , apl		; 0x30
				0x0f,0x34,  NC,0x0e,  NC,0x00,  NC,  NC,
			//	 sft, cps, alt, ctl,    ,    ,    ,    		; 0x38
				0x70,0x79,0x73,0x74,  NC,  NC,  NC,  NC,
			//	    , [.],    , [*],    , [+],    ,    		; 0x40
				  NC,0x50,  NC,0x45,  NC,0x49,  NC,  NC,
			//	    ,    ,    , [/], ret,    , [-], clr		; 0x48
				  NC,  NC,  NC,0x41,0x1c,  NC,0x40,0x3e,
			//	    , [=], [0], [1], [2], [3], [4], [5]		; 0x50
				  NC,0x4d,0x4e,0x4a,0x4b,0x4c,0x46,0x47,
			//	 [6], [7],    , [8], [9],  ,  Q, [,]		; 0x58
				0x48,0x42,  NC,0x43,0x44,0x0d,0x33,0x4f,
			//	  F5,  F6,  F7,  F3,  F8,  F9,    , F11		; 0x60
				0x66,0x67,0x68,0x64,0x69,0x6a,  NC,  NC,
			//	    , F13,    , F14,    , F10,    , F12		; 0x68
				  NC,  NC,  NC,  NC,  NC,0x6b,  NC,  NC,
			//	    , F15, hlp, hom,  ru, del,  F4, end		; 0x70
				  NC,  NC,0x3f,0x3e,0x37,0x39,0x65,0x3f,
			//	  F2,  rd,  F1,  ©,  ¨,  «,  ͺ,    		; 0x78
				0x63,0x36,0x62,0x3b,0x3c,0x3d,0x3a,  NC};

static const BYTE repkey[16] = {
		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
		0xff, 0xff, 0xc1, 0xff, 0xc0, 0x0f, 0x07, 0x07};


void mackbd_initialize(void) {

	mackbd.tick = GETTICK();
	ZeroMemory(&mackbd.keymap, sizeof(mackbd.keymap));
	mackbd.active = TRUE;
	mackbd.repkey = NC;
}

void mackbd_callback(void) {

	UINT32	tick;
	BYTE	key[16];
	UINT	i;
	BYTE	update;
	UINT	j;
	BYTE	keycode;

	if (!mackbd.active) {
		return;
	}

	tick = GETTICK();
	if (mackbd.tick == tick) {
		return;
	}
	mackbd.tick = tick;
#if TARGET_API_MAC_CARBON
	GetKeys((long *)key);
#else
	GetKeys((unsigned long *)key);
#endif
	for (i=0; i<16; i++) {
		update = mackbd.keymap[i] ^ key[i];
		if (update) {
			mackbd.keymap[i] = key[i];
			for (j=0; j<8; j++) {
				if (update & (1 << j)) {
					keycode = keymac[i * 8 + j];
					if (keycode != NC) {
						if (key[i] & (1 << j)) {
							keystat_senddata(keycode);
							if ((repkey[keycode >> 3] << (keycode & 7))
																	& 0x80) {
								mackbd.repkey = keycode;
								mackbd.repbase = tick;
								mackbd.reptick = 500;
							}
						}
						else {
							if (mackbd.repkey == keycode) {
								mackbd.repkey = NC;
							}
							keystat_senddata(keycode + 0x80);
						}
					}
				}
			}
		}
	}

	// ƒL[ƒŠƒs[ƒgˆ—
	if (mackbd.repkey != NC) {
		if ((tick - mackbd.repbase) >= mackbd.reptick) {
			keystat_senddata(mackbd.repkey);		// keystat‘€‚Εbreak‚·‚ι
			mackbd.repbase = tick;
			mackbd.reptick = 40;
		}
	}
}

BOOL mackbd_keydown(int keycode, BOOL cmd) {

	BYTE	data;

	data = NC;
	if (keycode == 0x67) {
		if (np2oscfg.F11KEY < (sizeof(bindtbl.f11)/sizeof(UINT8))) {
			data = bindtbl.f11[np2oscfg.F11KEY];
		}
	}
	else if (keycode == 0x6f) {
		if (np2oscfg.F12KEY < (sizeof(bindtbl.f12)/sizeof(UINT8))) {
			data = bindtbl.f12[np2oscfg.F12KEY];
		}
	}
	if (data != NC) {
		keystat_senddata(data);
		return(TRUE);
	}
	(void)cmd;
	return(FALSE);
}

BOOL mackbd_keyup(int keycode) {

	BYTE	data;

	data = NC;
	if (keycode == 0x67) {
		if (np2oscfg.F11KEY < (sizeof(bindtbl.f11)/sizeof(UINT8))) {
			data = bindtbl.f11[np2oscfg.F11KEY];
		}
	}
	else if (keycode == 0x6f) {
		if (np2oscfg.F12KEY < (sizeof(bindtbl.f12)/sizeof(UINT8))) {
			data = bindtbl.f12[np2oscfg.F12KEY];
		}
	}
	if (data != NC) {
		keystat_senddata(data | 0x80);
		return(TRUE);
	}
	return(FALSE);
}

void mackbd_activate(BOOL active) {

	if (mackbd.active != active) {
		mackbd.active = active;
		if (!active) {
			ZeroMemory(&mackbd.keymap, sizeof(mackbd.keymap));
			keystat_allrelease();
		}
	}
}

#else

enum {
	kMac_kana		= 0x37,
	kMac_shift		= 0x38,
	kMac_caps		= 0x39,
	kMac_alt		= 0x3a,
	kMac_ctrl		= 0x3b
};

#define	kMac_Basebit(a)		(1 << ((a) & 15))

typedef struct {
	UINT16	bit;
	BYTE	code;
} KEYSEA;

static const KEYSEA keysea[] = {
					{kMac_Basebit(kMac_shift),	0x70},
					{kMac_Basebit(kMac_caps),	0x79},
//					{kMac_Basebit(kMac_kana),	0x72},
					{kMac_Basebit(kMac_alt),	0x73},
					{kMac_Basebit(kMac_ctrl),	0x74}};

static const BYTE keymac[128] = {
			//	  ‚`,  ‚r,  ‚c,  ‚e,  ‚g,  ‚f,  ‚y,  ‚w		; 0x00
				0x1d,0x1e,0x1f,0x20,0x22,0x21,0x29,0x2a,
			//	  ‚b,  ‚u,    ,  ‚a,  ‚p,  ‚v,  ‚d,  ‚q		; 0x08
				0x2b,0x2c,  NC,0x2d,0x10,0x11,0x12,0x13,
			//	  ‚x,  ‚s,  ‚P,  ‚Q,  ‚R,  ‚S,  ‚U,  ‚T		; 0x10
				0x15,0x14,0x01,0x02,0x03,0x04,0x06,0x05,
			//	  O,  ‚X,  ‚V,  |,  ‚W,  ‚O,  m,  ‚n 	; 0x18
				0x0c,0x09,0x07,0x0b,0x08,0x0a,0x1b,0x18,
			//	  ‚t,  —,  ‚h,  ‚o, ret,  ‚k,  ‚i,  F		; 0x20
				0x16,0x1a,0x17,0x19,0x1c,0x25,0x23,0x27,
			//	  ‚j,  G,  n,  C,  ^,  ‚m,  ‚l,  D		; 0x28
				0x24,0x26,0x28,0x30,0x32,0x2e,0x2f,0x31,
			//	 TAB, SPC,    ,  BS,    , ESC,    , apl		; 0x30
				0x0f,0x34,  NC,0x0e,  NC,0x00,  NC,  NC,
			//	 sft, cps, alt, ctl,    ,    ,    ,    		; 0x38
				  NC,  NC,  NC,  NC,  NC,  NC,  NC,  NC,
			//	    , [.],    , [*],    , [+],    ,    		; 0x40
				  NC,0x50,  NC,0x45,  NC,0x49,  NC,  NC,
			//	    ,    ,    , [/], ret,    , [-], clr		; 0x48
				  NC,  NC,  NC,0x41,0x1c,  NC,0x40,0x3e,
			//	    , [=], [0], [1], [2], [3], [4], [5]		; 0x50
				  NC,0x4d,0x4e,0x4a,0x4b,0x4c,0x46,0x47,
			//	 [6], [7],    , [8], [9],  ,  Q, [,]		; 0x58
				0x48,0x42,  NC,0x43,0x44,0x0d,0x33,0x4f,
			//	  F5,  F6,  F7,  F3,  F8,  F9,    , F11		; 0x60
				0x66,0x67,0x68,0x64,0x69,0x6a,  NC,  NC,
			//	    , F13,    , F14,    , F10,    , F12		; 0x68
				  NC,  NC,  NC,  NC,  NC,0x6b,  NC,  NC,
			//	    , F15, hlp, hom,  ru, del,  F4, end		; 0x70
				  NC,  NC,0x3f,0x3e,0x37,0x39,0x65,0x3f,
			//	  F2,  rd,  F1,  ©,  ¨,  «,  ͺ,    		; 0x78
				0x63,0x36,0x62,0x3b,0x3c,0x3d,0x3a,  NC};

// —ΡŒηƒL[‰Ÿ‰Ί
static const BYTE keymac2[128] = {
			//	  ‚`,  ‚r,  ‚c,  ‚e,  ‚g,  ‚f,  ‚y,  ‚w		; 0x00
				  NC,  NC,  NC,  NC,0x3f,  NC,  NC,  NC,
			//	  ‚b,  ‚u,    ,  ‚a,  ‚p,  ‚v,  ‚d,  ‚q		; 0x08
				  NC,  NC,  NC,  NC,  NC,  NC,  NC,  NC,
			//	  ‚x,  ‚s,  ‚P,  ‚Q,  ‚R,  ‚S,  ‚U,  ‚T		; 0x10
				  NC,  NC,0x62,0x63, 0x64,0x65,0x67,0x66,
			//	  O,  ‚X,  ‚V,  |,  ‚W,  ‚O,  m,  ‚n 	; 0x18
				  NC,0x6a,0x68,  NC,0x69,0x6b,  NC,  NC,
			//	  ‚t,  —,  ‚h,  ‚o, ret,  ‚k,  ‚i,  F		; 0x20
				  NC,  NC,  NC,  NC,  NC,0x3e,  NC,  NC,
			//	  ‚j,  G,  n,  C,  ^,  ‚m,  ‚l,  D		; 0x28
				  NC,  NC,  NC,  NC,  NC,  NC,  NC,  NC,
			//	 TAB, SPC,    ,  BS,    , ESC,    , apl		; 0x30
				  NC,  NC,  NC,  NC,  NC,  NC,  NC,  NC,
			//	 sft, cps, alt, ctl,    ,    ,    ,    		; 0x38
				  NC,  NC,  NC,  NC,  NC,  NC,  NC,  NC,
			//	    , [.],    , [*],    , [+],    ,    		; 0x40
				  NC,  NC,  NC,  NC,  NC,  NC,  NC,  NC,
			//	    ,    ,    ,    , ret,    , [-], clr		; 0x48
				  NC,  NC,  NC,  NC,  NC,  NC,  NC,  NC,
			//	    , [=], [0], [1], [2], [3], [4], [5]		; 0x50
				  NC,  NC,  NC,  NC,  NC,  NC,  NC,  NC,
			//	 [6], [7],    , [8], [9],  ,  Q, [,]		; 0x58
				  NC,  NC,  NC,  NC,  NC,  NC,  NC,  NC,
			//	  F5,  F6,  F7,  F3,  F8,  F9,    , F11		; 0x60
				  NC,  NC,  NC,  NC,  NC,  NC,  NC,  NC,
			//	    , F13,    , F14,    , F10,    , F12		; 0x68
				  NC,  NC,  NC,  NC,  NC,  NC,  NC,  NC,
			//	    , F15, hlp, hom,  ru, del,  F4, end		; 0x70
				  NC,  NC,  NC,  NC,  NC,0x38,  NC,  NC,
			//	  F2,  rd,  F1,  ©,  ¨,  «,  ͺ,    		; 0x78
				  NC,  NC,  NC,  NC,  NC,  NC,  NC,  NC};

typedef struct {
	UINT32	tick;
	UINT16	shift;
	BOOL	active;
} MACKBD;

static	MACKBD		mackbd;

void mackbd_initialize(void) {

	ZeroMemory(&mackbd, sizeof(mackbd));
	mackbd.active = TRUE;
}

void mackbd_callback(void) {

	UINT32	tick;
	BYTE	key[16];
	UINT16	shift;
	UINT16	shiftchg;
	UINT	i;

	if (!mackbd.active) {
		return;
	}

	tick = GETTICK();
	if (mackbd.tick != tick) {
		mackbd.tick = tick;
		GetKeys((unsigned long *)key);
		shift = ((UINT16)key[7] << 8) + key[6];
		shiftchg = mackbd.shift ^ shift;
		mackbd.shift = shift;
		for (i=0; i<(sizeof(keysea) / sizeof(KEYSEA)); i++) {
			if (shiftchg & keysea[i].bit) {
				if (shift & keysea[i].bit) {
					keystat_senddata(keysea[i].code);
				}
				else {
					keystat_senddata(keysea[i].code | 0x80);
				}
			}
		}
	}
}

BOOL mackbd_keydown(int keycode, BOOL cmd) {

	BYTE	data;

	data = NC;
	if (keycode == 0x67) {
		if (np2oscfg.F11KEY < (sizeof(bindtbl.f11)/sizeof(UINT8))) {
			data = bindtbl.f11[np2oscfg.F11KEY];
		}
	}
	else if (keycode == 0x6f) {
		if (np2oscfg.F12KEY < (sizeof(bindtbl.f12)/sizeof(UINT8))) {
			data = bindtbl.f12[np2oscfg.F12KEY];
		}
	}
	else if (keycode < 0x80) {
		if (!cmd) {
			data = keymac[keycode];
		}
		else {
			data = keymac2[keycode];
		}
	}
	if (data != NC) {
		keystat_senddata(data);
		return(TRUE);
	}
	else {
		return(FALSE);
	}
}

BOOL mackbd_keyup(int keycode) {

	BYTE	data;
	BOOL	ret;

	data = NC;
	ret = FALSE;
	if (keycode == 0x67) {
		if (np2oscfg.F11KEY < (sizeof(bindtbl.f11)/sizeof(UINT8))) {
			data = bindtbl.f11[np2oscfg.F11KEY];
		}
	}
	else if (keycode == 0x6f) {
		if (np2oscfg.F12KEY < (sizeof(bindtbl.f12)/sizeof(UINT8))) {
			data = bindtbl.f12[np2oscfg.F12KEY];
		}
	}
	else if (keycode < 0x80) {
		data = keymac[keycode];
		if (data != NC) {
			keystat_senddata(data | 0x80);
			ret = TRUE;
		}
		data = keymac2[keycode];
	}
	if (data != NC) {
		keystat_senddata(data | 0x80);
		ret = TRUE;
	}
	return(ret);
}

void mackbd_activate(BOOL active) {

	if (mackbd.active != active) {
		mackbd.active = active;
		if (!active) {
			keystat_allrelease();
		}
	}
}

#endif


RetroPC.NET-CVS <cvs@retropc.net>