VKernel / vpsdk / Apps / Libs 共 30 个源文件:内核与 SDK 侧的新语法适配及编译修正(含 bootinfo.vp / main.vp 位宽改 uint64、gfx.vp 前向引用改指针、devfs.vp 指针解引用赋值、elf.vp 跨模块函数取值等)。删除 vpsdk/wiki/*.md(14 文件,约 -8100 行):与仓库根 wiki 重复的拷贝,统一以根 wiki 为唯一来源。
135 lines
3.2 KiB
Plaintext
135 lines
3.2 KiB
Plaintext
import asm
|
|
import intr.idt as idt
|
|
import platform.pch.pic as pic
|
|
import drivers.serial.uart.serial as serial
|
|
import t, c
|
|
|
|
|
|
define MOUSE_DATA = 0x60
|
|
define MOUSE_STATUS = 0x64
|
|
define MOUSE_COMMAND = 0x64
|
|
|
|
define MOUSE_BUF_SIZE = 1024
|
|
|
|
define MOUSE_LEFT = 0x01
|
|
define MOUSE_RIGHT = 0x02
|
|
define MOUSE_MIDDLE = 0x04
|
|
|
|
class mouse_packet:
|
|
flags: uint8
|
|
dx: int8
|
|
dy: int8
|
|
buttons: uint8
|
|
|
|
packets: [MOUSE_BUF_SIZE]mouse_packet
|
|
pack_head: static uint32 = 0
|
|
pack_tail: static uint32 = 0
|
|
pack_count: static uint32 = 0
|
|
mse_irq_cnt: static uint64 = 0
|
|
|
|
cycle: static uint8 = 0
|
|
byte1: static uint8 = 0
|
|
byte2: static int8 = 0
|
|
byte3: static int8 = 0
|
|
|
|
mouse_x: static int32 = 0
|
|
mouse_y: static int32 = 0
|
|
mouse_buttons: static uint8 = 0
|
|
|
|
def _wait_read():
|
|
timeout: uint32 = 100000
|
|
for _ in range(timeout, 0, -1):
|
|
if (asm.inb(MOUSE_STATUS) & 0x01) != 0: return
|
|
|
|
def _wait_write():
|
|
timeout: uint32 = 100000
|
|
for _ in range(timeout, 0, -1):
|
|
if (asm.inb(MOUSE_STATUS) & 0x02) == 0: return
|
|
|
|
def _write_cmd(cmd: uint8):
|
|
_wait_write()
|
|
asm.outb(MOUSE_COMMAND, 0xD4)
|
|
_wait_write()
|
|
asm.outb(MOUSE_DATA, cmd)
|
|
_wait_read()
|
|
asm.inb(MOUSE_DATA)
|
|
|
|
def irq_handler() -> int:
|
|
global cycle, byte1, byte2, byte3, pack_tail, pack_count, mse_irq_cnt
|
|
mse_irq_cnt += 1
|
|
status: uint8 = asm.inb(MOUSE_STATUS)
|
|
if (status & 0x20) == 0: return 0
|
|
data: uint8 = asm.inb(MOUSE_DATA)
|
|
if cycle == 0:
|
|
if (data & 0x08) != 0:
|
|
byte1 = data
|
|
cycle = 1
|
|
return 0
|
|
if cycle == 1:
|
|
byte2 = data
|
|
cycle = 2
|
|
return 0
|
|
byte3 = data
|
|
cycle = 0
|
|
if pack_count < MOUSE_BUF_SIZE:
|
|
packets[pack_tail].flags = byte1
|
|
packets[pack_tail].dx = byte2
|
|
packets[pack_tail].dy = byte3
|
|
packets[pack_tail].buttons = byte1 & uint8(0x07)
|
|
pack_tail = pack_tail + 1
|
|
if pack_tail >= MOUSE_BUF_SIZE:
|
|
pack_tail = 0
|
|
pack_count += 1
|
|
return 0
|
|
|
|
def read_packet(out: mouse_packet*) -> int:
|
|
global pack_head, pack_count
|
|
asm.cli()
|
|
if pack_count == 0:
|
|
asm.sti()
|
|
out.flags = 0
|
|
out.dx = 0
|
|
out.dy = 0
|
|
out.buttons = 0
|
|
return -1
|
|
out.flags = packets[pack_head].flags
|
|
out.dx = packets[pack_head].dx
|
|
out.dy = packets[pack_head].dy
|
|
out.buttons = packets[pack_head].buttons
|
|
pack_head = pack_head + 1
|
|
if pack_head >= MOUSE_BUF_SIZE:
|
|
pack_head = 0
|
|
pack_count -= 1
|
|
asm.sti()
|
|
return 0
|
|
|
|
def has_data() -> int:
|
|
return pack_count
|
|
|
|
def get_x() -> int32:
|
|
return mouse_x
|
|
|
|
def get_y() -> int32:
|
|
return mouse_y
|
|
|
|
def get_buttons() -> uint8:
|
|
return mouse_buttons
|
|
|
|
def init():
|
|
_wait_write()
|
|
asm.outb(MOUSE_COMMAND, 0xA8)
|
|
_wait_write()
|
|
asm.outb(MOUSE_COMMAND, 0x20)
|
|
_wait_read()
|
|
status: uint8 = asm.inb(MOUSE_DATA)
|
|
status = status | 0x02
|
|
status = status & 0xDF
|
|
_wait_write()
|
|
asm.outb(MOUSE_COMMAND, 0x60)
|
|
_wait_write()
|
|
asm.outb(MOUSE_DATA, status)
|
|
_write_cmd(0xF6)
|
|
_write_cmd(0xF4)
|
|
pic.clearMask(12)
|
|
idt.irqInstallHandler(12, irq_handler, "mouse")
|