Bochs/bochs/iodev/keyboard.h
Bryce Denney cec9135e9f - Apply patch.replace-Boolean rev 1.3. Every "Boolean" is now changed to a
"bx_bool" which is always defined as Bit32u on all platforms.  In Carbon
  specific code, Boolean is still used because the Carbon header files
  define it to unsigned char.
- this fixes bug [ 623152 ] MacOSX: Triple Exception Booting win95.
  The bug was that some code in Bochs depends on Boolean to be a
  32 bit value.  (This should be fixed, but I don't know all the places
  where it needs to be fixed yet.)  Because Carbon defined Boolean as
  an unsigned char, Bochs just followed along and used the unsigned char
  definition to avoid compile problems.  This exposed the dependency
  on 32 bit Boolean on MacOS X only and led to major simulation problems,
  that could only be reproduced and debugged on that platform.
- On the mailing list we debated whether to make all Booleans into "bool" or
  our own type.  I chose bx_bool for several reasons.
  1. Unlike C++'s bool, we can guarantee that bx_bool is the same size on all
     platforms, which makes it much less likely to have more platform-specific
     simulation differences in the future.  (I spent hours on a borrowed
     MacOSX machine chasing bug 618388 before discovering that different sized
     Booleans were the problem, and I don't want to repeat that.)
  2. We still have at least one dependency on 32 bit Booleans which must be
     fixed some time, but I don't want to risk introducing new bugs into the
     simulation just before the 2.0 release.

Modified Files:
    bochs.h config.h.in gdbstub.cc logio.cc main.cc pc_system.cc
    pc_system.h plugin.cc plugin.h bios/rombios.c cpu/apic.cc
    cpu/arith16.cc cpu/arith32.cc cpu/arith64.cc cpu/arith8.cc
    cpu/cpu.cc cpu/cpu.h cpu/ctrl_xfer16.cc cpu/ctrl_xfer32.cc
    cpu/ctrl_xfer64.cc cpu/data_xfer16.cc cpu/data_xfer32.cc
    cpu/data_xfer64.cc cpu/debugstuff.cc cpu/exception.cc
    cpu/fetchdecode.cc cpu/flag_ctrl_pro.cc cpu/init.cc
    cpu/io_pro.cc cpu/lazy_flags.cc cpu/lazy_flags.h cpu/mult16.cc
    cpu/mult32.cc cpu/mult64.cc cpu/mult8.cc cpu/paging.cc
    cpu/proc_ctrl.cc cpu/segment_ctrl_pro.cc cpu/stack_pro.cc
    cpu/tasking.cc debug/dbg_main.cc debug/debug.h debug/sim2.cc
    disasm/dis_decode.cc disasm/disasm.h doc/docbook/Makefile
    docs-html/cosimulation.html fpu/wmFPUemu_glue.cc
    gui/amigaos.cc gui/beos.cc gui/carbon.cc gui/gui.cc gui/gui.h
    gui/keymap.cc gui/keymap.h gui/macintosh.cc gui/nogui.cc
    gui/rfb.cc gui/sdl.cc gui/siminterface.cc gui/siminterface.h
    gui/term.cc gui/win32.cc gui/wx.cc gui/wxmain.cc gui/wxmain.h
    gui/x.cc instrument/example0/instrument.cc
    instrument/example0/instrument.h
    instrument/example1/instrument.cc
    instrument/example1/instrument.h
    instrument/stubs/instrument.cc instrument/stubs/instrument.h
    iodev/cdrom.cc iodev/cdrom.h iodev/cdrom_osx.cc iodev/cmos.cc
    iodev/devices.cc iodev/dma.cc iodev/dma.h iodev/eth_arpback.cc
    iodev/eth_packetmaker.cc iodev/eth_packetmaker.h
    iodev/floppy.cc iodev/floppy.h iodev/guest2host.h
    iodev/harddrv.cc iodev/harddrv.h iodev/ioapic.cc
    iodev/ioapic.h iodev/iodebug.cc iodev/iodev.h
    iodev/keyboard.cc iodev/keyboard.h iodev/ne2k.h
    iodev/parallel.h iodev/pci.cc iodev/pci.h iodev/pic.h
    iodev/pit.cc iodev/pit.h iodev/pit_wrap.cc iodev/pit_wrap.h
    iodev/sb16.cc iodev/sb16.h iodev/serial.cc iodev/serial.h
    iodev/vga.cc iodev/vga.h memory/memory.h memory/misc_mem.cc
2002-10-25 11:44:41 +00:00

235 lines
8.0 KiB
C++

/////////////////////////////////////////////////////////////////////////
// $Id: keyboard.h,v 1.19 2002-10-25 11:44:40 bdenney Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001 MandrakeSoft S.A.
//
// MandrakeSoft S.A.
// 43, rue d'Aboukir
// 75002 Paris - France
// http://www.linux-mandrake.com/
// http://www.mandrakesoft.com/
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// 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
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#ifndef _PCKEY_H
#define _PCKEY_H
#define BX_KBD_ELEMENTS 16
#define BX_MOUSE_BUFF_SIZE 48
// these keywords should only be used in keyboard.cc
#if BX_USE_KEY_SMF
# define BX_KEY_SMF static
# define BX_KEY_THIS theKeyboard->
#else
# define BX_KEY_SMF
# define BX_KEY_THIS
#endif
#define MOUSE_MODE_RESET 10
#define MOUSE_MODE_STREAM 11
#define MOUSE_MODE_REMOTE 12
#define MOUSE_MODE_WRAP 13
class bx_keyb_c : public bx_keyb_stub_c {
public:
bx_keyb_c(void);
~bx_keyb_c(void);
// implement bx_devmodel_c interface
virtual void init(void);
virtual void reset(unsigned type);
// override stubs from bx_keyb_stub_c
virtual void gen_scancode(Bit32u scancode);
virtual void paste_bytes(Bit8u *data, Bit32s length);
virtual void mouse_motion(int delta_x, int delta_y, unsigned button_state);
virtual void put_scancode( unsigned char *code, int count );
// update the paste delay based on bx_options.Okeyboard_paste_delay
virtual void paste_delay_changed ();
virtual void mouse_enabled_changed(bool enabled);
private:
BX_KEY_SMF Bit8u get_kbd_enable(void);
BX_KEY_SMF void service_paste_buf ();
BX_KEY_SMF void create_mouse_packet(bool force_enq);
BX_KEY_SMF void mouse_button(unsigned mouse_state);
BX_KEY_SMF int SaveState( class state_file *fd );
BX_KEY_SMF int LoadState( class state_file *fd );
BX_KEY_SMF unsigned periodic( Bit32u usec_delta );
static Bit32u read_handler(void *this_ptr, Bit32u address, unsigned io_len);
static void write_handler(void *this_ptr, Bit32u address, Bit32u value, unsigned io_len);
#if !BX_USE_KEY_SMF
void write(Bit32u address, Bit32u value, unsigned io_len);
Bit32u read(Bit32u address, unsigned io_len);
#endif
struct {
struct {
/* status bits matching the status port*/
bx_bool pare; // Bit7, 1= parity error from keyboard/mouse - ignored.
bx_bool tim; // Bit6, 1= timeout from keyboard - ignored.
bx_bool auxb; // Bit5, 1= mouse data waiting for CPU to read.
bx_bool keyl; // Bit4, 1= keyswitch in lock position - ignored.
bx_bool c_d; /* Bit3, 1=command to port 64h, 0=data to port 60h */
bx_bool sysf; // Bit2,
bx_bool inpb; // Bit1,
bx_bool outb; // Bit0, 1= keyboard data or mouse data ready for CPU
// check aux to see which. Or just keyboard
// data before AT style machines
/* internal to our version of the keyboard controller */
bx_bool kbd_clock_enabled;
bx_bool aux_clock_enabled;
bx_bool allow_irq1;
bx_bool allow_irq12;
Bit8u kbd_output_buffer;
Bit8u aux_output_buffer;
Bit8u last_comm;
Bit8u expecting_port60h;
Bit8u expecting_mouse_parameter;
Bit8u last_mouse_command;
Bit32u timer_pending;
bx_bool irq1_requested;
bx_bool irq12_requested;
bx_bool scancodes_translate;
bx_bool expecting_scancodes_set;
Bit8u current_scancodes_set;
} kbd_controller;
struct mouseStruct {
Bit8u sample_rate;
Bit8u resolution_cpmm; // resolution in counts per mm
Bit8u scaling;
Bit8u mode;
Bit8u saved_mode; // the mode prior to entering wrap mode
bx_bool enable;
Bit8u get_status_byte ()
{
// top bit is 0 , bit 6 is 1 if remote mode.
Bit8u ret = (Bit8u) ((mode == MOUSE_MODE_REMOTE) ? 0x40 : 0);
ret |= (enable << 5);
ret |= (scaling == 1) ? 0 : (1 << 4);
ret |= ((button_status & 0x1) << 2);
ret |= ((button_status & 0x2) << 0);
return ret;
}
Bit8u get_resolution_byte ()
{
Bit8u ret = 0;
switch (resolution_cpmm) {
case 1:
ret = 0;
break;
case 2:
ret = 1;
break;
case 4:
ret = 2;
break;
case 8:
ret = 3;
break;
default:
genlog->panic("mouse: invalid resolution_cpmm");
};
return ret;
}
Bit8u button_status;
Bit16s delayed_dx;
Bit16s delayed_dy;
} mouse;
struct {
int num_elements;
Bit8u buffer[BX_KBD_ELEMENTS];
int head;
bx_bool expecting_typematic;
bx_bool expecting_led_write;
Bit8u delay;
Bit8u repeat_rate;
Bit8u led_status;
bx_bool scanning_enabled;
} kbd_internal_buffer;
struct {
int num_elements;
Bit8u buffer[BX_MOUSE_BUFF_SIZE];
int head;
} mouse_internal_buffer;
#define BX_KBD_CONTROLLER_QSIZE 5
Bit8u controller_Q[BX_KBD_CONTROLLER_QSIZE];
unsigned controller_Qsize;
unsigned controller_Qsource; // 0=keyboard, 1=mouse
} s; // State information for saving/loading
// The paste buffer does NOT exist in the hardware. It is a bochs
// construction that allows the user to "paste" arbitrary length sequences of
// keystrokes into the emulated machine. Since the hardware buffer is only
// 16 bytes, a very small amount of data can be added to the hardware buffer
// at a time. The paste buffer keeps track of the bytes that have not yet
// been pasted.
//
// Lifetime of a paste buffer: The paste data comes from the system
// clipboard, which must be accessed using platform independent code in the
// gui. Because every gui has its own way of managing the clipboard memory
// (in X windows, you're supposed to call Xfree for example), in the platform
// specific code we make a copy of the clipboard buffer with
// "new Bit8u[length]". Then the pointer is passed into
// bx_keyb_c::paste_bytes, along with the length. The gui code never touches
// the pastebuf again, and does not free it. The keyboard code is
// responsible for deallocating the paste buffer using delete [] buf. The
// paste buffer is binary data, and it is probably NOT null terminated.
//
// Summary: A paste buffer is allocated (new) in the platform-specific gui
// code, passed to the keyboard model, and is freed (delete[]) when it is no
// longer needed.
Bit8u *pastebuf; // ptr to bytes to be pasted, or NULL if none in progress
Bit32u pastebuf_len; // length of pastebuf
Bit32u pastebuf_ptr; // ptr to next byte to be added to hw buffer
Bit32u pastedelay; // count before paste
BX_KEY_SMF void resetinternals(bx_bool powerup);
BX_KEY_SMF void set_kbd_clock_enable(Bit8u value);
BX_KEY_SMF void set_aux_clock_enable(Bit8u value);
BX_KEY_SMF void kbd_ctrl_to_kbd(Bit8u value);
BX_KEY_SMF void kbd_ctrl_to_mouse(Bit8u value);
BX_KEY_SMF void kbd_enQ(Bit8u scancode);
BX_KEY_SMF void kbd_enQ_imm(Bit8u val);
BX_KEY_SMF void activate_timer(void);
BX_KEY_SMF void controller_enQ(Bit8u data, unsigned source);
BX_KEY_SMF bx_bool mouse_enQ_packet(Bit8u b1, Bit8u b2, Bit8u b3);
BX_KEY_SMF void mouse_enQ(Bit8u mouse_data);
static void timer_handler(void *);
void timer(void);
int timer_handle;
};
#endif // #ifndef _PCKEY_H