Skip to content

Commit

Permalink
Mouse support
Browse files Browse the repository at this point in the history
  • Loading branch information
tomm committed Nov 1, 2023
1 parent e159954 commit 8a14c04
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 20 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "fab-agon-emulator"
version = "0.9.0"
version = "0.9.1"
edition = "2021"
authors = ["Tom Morton <[email protected]>"]
license = "GPL-3.0"
Expand Down
53 changes: 52 additions & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,9 +146,9 @@ pub fn main() -> Result<(), pico_args::Error> {
unsafe { vgabuf.set_len(1024*768*3); }
let mut mode_w: u32 = 640;
let mut mode_h: u32 = 480;
let mut mouse_btn_state: u8 = 0;

'running: loop {

let (wx, wy): (u32, u32) = {
if is_fullscreen {
(native_resolution.w as u32, native_resolution.h as u32)
Expand All @@ -171,6 +171,8 @@ pub fn main() -> Result<(), pico_args::Error> {
}
};

sdl_context.mouse().set_relative_mouse_mode(is_fullscreen);

let mut window = video_subsystem.window(&format!("Fab Agon Emulator {}", env!("CARGO_PKG_VERSION")), wx, wy)
.resizable()
.position_centered()
Expand Down Expand Up @@ -270,6 +272,55 @@ pub fn main() -> Result<(), pico_args::Error> {
}
}
}
Event::MouseButtonUp { mouse_btn, .. } => {
mouse_btn_state &= match mouse_btn {
sdl2::mouse::MouseButton::Left => !1,
sdl2::mouse::MouseButton::Right => !2,
sdl2::mouse::MouseButton::Middle => !4,
_ => !0
};
let packet: [u8; 4] = [8 | mouse_btn_state, 0, 0, 0];
unsafe {
(*vdp_interface.sendHostMouseEventToFabgl)(&packet[0] as *const u8);
}
}
Event::MouseButtonDown { mouse_btn, .. } => {
mouse_btn_state |= match mouse_btn {
sdl2::mouse::MouseButton::Left => 1,
sdl2::mouse::MouseButton::Right => 2,
sdl2::mouse::MouseButton::Middle => 4,
_ => 0
};
let packet: [u8; 4] = [8 | mouse_btn_state, 0, 0, 0];
unsafe {
(*vdp_interface.sendHostMouseEventToFabgl)(&packet[0] as *const u8);
}
}
Event::MouseWheel { y, .. } => {
let mut packet: [u8; 4] = [8 | mouse_btn_state, 0, 0, 0];
packet[3] = y as u8;
unsafe {
(*vdp_interface.sendHostMouseEventToFabgl)(&packet[0] as *const u8);
}
}
Event::MouseMotion { xrel, yrel, .. } => {
let mut packet: [u8; 4] = [8 | mouse_btn_state, 0, 0, 0];
if xrel >= 0 {
packet[1] = xrel as u8;
} else {
packet[1] = xrel as u8;
packet[0] |= 0x10;
}
if yrel <= 0 {
packet[2] = -yrel as u8;
} else {
packet[2] = -yrel as u8;
packet[0] |= 0x20;
}
unsafe {
(*vdp_interface.sendHostMouseEventToFabgl)(&packet[0] as *const u8);
}
}
_ => {}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/vdp/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
CXX ?= g++
CFLAGS = -Wall -O2 -fmax-errors=1 -std=c++11 $(EXTRA_FLAGS) -g -I. -I./dispdrivers -I./userspace-vdp-gl/src -I./userspace-vdp-gl/src/userspace-platform -I./userspace-vdp-gl/src/dispdrivers
CFLAGS = -Wall -O2 -fmax-errors=1 -std=c++11 $(EXTRA_FLAGS) -DUSERSPACE -g -I. -I./dispdrivers -I./userspace-vdp-gl/src -I./userspace-vdp-gl/src/userspace-platform -I./userspace-vdp-gl/src/dispdrivers
OPTIONS =

SRCS = rust_glue.cpp
Expand Down
28 changes: 12 additions & 16 deletions src/vdp/Makefile.dep
Original file line number Diff line number Diff line change
Expand Up @@ -51,22 +51,21 @@ rust_glue.o: rust_glue.cpp userspace-vdp-gl/src/fabutils.h \
userspace-vdp-gl/src/canvas.h userspace-vdp-gl/src/displaycontroller.h \
userspace-vdp-gl/src/userspace-platform/freertos/queue.h \
userspace-vdp-gl/src/devdrivers/keyboard.h \
userspace-vdp-gl/src/comdrivers/ps2controller.h \
userspace-vdp-gl/src/comdrivers/ps2device.h \
userspace-vdp-gl/src/devdrivers/kbdlayouts.h \
userspace-vdp-gl/src/codepages.h userspace-vdp-gl/src/terminfo.h \
userspace-vdp-gl/src/devdrivers/soundgen.h \
userspace-vdp-gl/src/dispdrivers/vgacontroller.h \
userspace-vdp-gl/src/userspace-platform/driver/gpio.h \
userspace-vdp-gl/src/devdrivers/swgenerator.h \
userspace-vdp-gl/src/dispdrivers/vgabasecontroller.h \
userspace-vdp-gl/src/dispdrivers/vgatextcontroller.h \
userspace-vdp-gl/src/dispdrivers/vga2controller.h \
userspace-vdp-gl/src/dispdrivers/vgapalettedcontroller.h \
userspace-vdp-gl/src/dispdrivers/vga4controller.h \
userspace-vdp-gl/src/dispdrivers/vga8controller.h \
userspace-vdp-gl/src/dispdrivers/vga16controller.h \
userspace-vdp-gl/src/comdrivers/ps2controller.h \
userspace-vdp-gl/src/devdrivers/mouse.h \
userspace-vdp-gl/src/comdrivers/ps2device.h userspace-vdp-gl/src/scene.h \
userspace-vdp-gl/src/devdrivers/mouse.h userspace-vdp-gl/src/scene.h \
userspace-vdp-gl/src/collisiondetector.h vdp.h
vdp-1.03.o: vdp-1.03.cpp \
userspace-vdp-gl/src/userspace-platform/Arduino.h vdp-1.03.h \
Expand Down Expand Up @@ -126,19 +125,18 @@ vdp-1.03.o: vdp-1.03.cpp \
userspace-vdp-gl/src/userspace-platform/freertos/timers.h \
userspace-vdp-gl/src/userspace-platform/freertos/semphr.h \
userspace-vdp-gl/src/canvas.h userspace-vdp-gl/src/devdrivers/keyboard.h \
userspace-vdp-gl/src/comdrivers/ps2controller.h \
userspace-vdp-gl/src/comdrivers/ps2device.h \
userspace-vdp-gl/src/devdrivers/kbdlayouts.h \
userspace-vdp-gl/src/codepages.h userspace-vdp-gl/src/terminfo.h \
userspace-vdp-gl/src/devdrivers/soundgen.h \
userspace-vdp-gl/src/dispdrivers/vgacontroller.h \
userspace-vdp-gl/src/dispdrivers/vgatextcontroller.h \
userspace-vdp-gl/src/dispdrivers/vga2controller.h \
userspace-vdp-gl/src/dispdrivers/vgapalettedcontroller.h \
userspace-vdp-gl/src/dispdrivers/vga4controller.h \
userspace-vdp-gl/src/dispdrivers/vga8controller.h \
userspace-vdp-gl/src/dispdrivers/vga16controller.h \
userspace-vdp-gl/src/comdrivers/ps2controller.h \
userspace-vdp-gl/src/devdrivers/mouse.h \
userspace-vdp-gl/src/comdrivers/ps2device.h userspace-vdp-gl/src/scene.h \
userspace-vdp-gl/src/devdrivers/mouse.h userspace-vdp-gl/src/scene.h \
userspace-vdp-gl/src/collisiondetector.h vdp.h vdp-quark103/video.ino \
userspace-vdp-gl/src/userspace-platform/ESP32Time.h vdp-quark103/agon.h \
vdp-quark103/agon_fonts.h vdp-quark103/agon_audio.h \
Expand Down Expand Up @@ -197,22 +195,21 @@ vdp-console8.o: vdp-console8.cpp \
userspace-vdp-gl/src/canvas.h userspace-vdp-gl/src/displaycontroller.h \
userspace-vdp-gl/src/userspace-platform/freertos/queue.h \
userspace-vdp-gl/src/devdrivers/keyboard.h \
userspace-vdp-gl/src/comdrivers/ps2controller.h \
userspace-vdp-gl/src/comdrivers/ps2device.h \
userspace-vdp-gl/src/devdrivers/kbdlayouts.h \
userspace-vdp-gl/src/codepages.h userspace-vdp-gl/src/terminfo.h \
userspace-vdp-gl/src/devdrivers/soundgen.h \
userspace-vdp-gl/src/dispdrivers/vgacontroller.h \
userspace-vdp-gl/src/userspace-platform/driver/gpio.h \
userspace-vdp-gl/src/devdrivers/swgenerator.h \
userspace-vdp-gl/src/dispdrivers/vgabasecontroller.h \
userspace-vdp-gl/src/dispdrivers/vgatextcontroller.h \
userspace-vdp-gl/src/dispdrivers/vga2controller.h \
userspace-vdp-gl/src/dispdrivers/vgapalettedcontroller.h \
userspace-vdp-gl/src/dispdrivers/vga4controller.h \
userspace-vdp-gl/src/dispdrivers/vga8controller.h \
userspace-vdp-gl/src/dispdrivers/vga16controller.h \
userspace-vdp-gl/src/comdrivers/ps2controller.h \
userspace-vdp-gl/src/devdrivers/mouse.h \
userspace-vdp-gl/src/comdrivers/ps2device.h userspace-vdp-gl/src/scene.h \
userspace-vdp-gl/src/devdrivers/mouse.h userspace-vdp-gl/src/scene.h \
userspace-vdp-gl/src/collisiondetector.h vdp.h \
vdp-console8/video/video.ino \
userspace-vdp-gl/src/userspace-platform/WiFi.h vdp-console8/video/agon.h \
Expand Down Expand Up @@ -290,22 +287,21 @@ vdp_quark104.o: vdp_quark104.cpp \
userspace-vdp-gl/src/canvas.h userspace-vdp-gl/src/displaycontroller.h \
userspace-vdp-gl/src/userspace-platform/freertos/queue.h \
userspace-vdp-gl/src/devdrivers/keyboard.h \
userspace-vdp-gl/src/comdrivers/ps2controller.h \
userspace-vdp-gl/src/comdrivers/ps2device.h \
userspace-vdp-gl/src/devdrivers/kbdlayouts.h \
userspace-vdp-gl/src/codepages.h userspace-vdp-gl/src/terminfo.h \
userspace-vdp-gl/src/devdrivers/soundgen.h \
userspace-vdp-gl/src/dispdrivers/vgacontroller.h \
userspace-vdp-gl/src/userspace-platform/driver/gpio.h \
userspace-vdp-gl/src/devdrivers/swgenerator.h \
userspace-vdp-gl/src/dispdrivers/vgabasecontroller.h \
userspace-vdp-gl/src/dispdrivers/vgatextcontroller.h \
userspace-vdp-gl/src/dispdrivers/vga2controller.h \
userspace-vdp-gl/src/dispdrivers/vgapalettedcontroller.h \
userspace-vdp-gl/src/dispdrivers/vga4controller.h \
userspace-vdp-gl/src/dispdrivers/vga8controller.h \
userspace-vdp-gl/src/dispdrivers/vga16controller.h \
userspace-vdp-gl/src/comdrivers/ps2controller.h \
userspace-vdp-gl/src/devdrivers/mouse.h \
userspace-vdp-gl/src/comdrivers/ps2device.h userspace-vdp-gl/src/scene.h \
userspace-vdp-gl/src/devdrivers/mouse.h userspace-vdp-gl/src/scene.h \
userspace-vdp-gl/src/collisiondetector.h vdp.h vdp-quark104/video.ino \
vdp-quark104/agon.h vdp-quark104/agon_keyboard.h \
vdp-quark104/agon_audio.h vdp-quark104/audio_channel.h \
Expand Down
16 changes: 16 additions & 0 deletions src/vdp/rust_glue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,22 @@ extern "C" void sendHostKbEventToFabgl(uint16_t ps2scancode, uint8_t isDown)
}
}

extern "C" void sendHostMouseEventToFabgl(uint8_t mousePacket[4])
{
fabgl::MousePacket packet;
packet.data[0] = mousePacket[0];
packet.data[1] = mousePacket[1];
packet.data[2] = mousePacket[2];
packet.data[3] = mousePacket[3];

auto lock = fabgl::VGABaseController::acquireLock();
// if the VGA controller is initialized we know the mouse is ready
if (fabgl::VGABaseController::activeController != nullptr
&& fabgl::PS2Controller::mouse() != nullptr) {
fabgl::PS2Controller::mouse()->injectPacket(&packet);
}
}

/* Buffer must be big enough for any screen resolution - up to 1024x768x3 bytes :) */
extern "C" void copyVgaFramebuffer(int *outWidth, int *outHeight, void *buffer)
{
Expand Down
2 changes: 2 additions & 0 deletions src/vdp_interface.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ pub struct VdpInterface {
pub z80_send_to_vdp: libloading::Symbol<'static, unsafe extern fn(b: u8)>,
pub z80_recv_from_vdp: libloading::Symbol<'static, unsafe extern fn(out: *mut u8) -> bool>,
pub sendHostKbEventToFabgl: libloading::Symbol<'static, unsafe extern fn(ps2scancode: u16, isDown: u8)>,
pub sendHostMouseEventToFabgl: libloading::Symbol<'static, unsafe extern fn(mouse_packet: *const u8)>,
pub getAudioSamples: libloading::Symbol<'static, unsafe extern fn(out: *mut u8, length: u32)>,
pub dump_vdp_mem_stats: libloading::Symbol<'static, unsafe extern fn()>,
pub vdp_shutdown: libloading::Symbol<'static, unsafe extern fn()>,
Expand All @@ -23,6 +24,7 @@ impl VdpInterface {
z80_send_to_vdp: lib.get(b"z80_send_to_vdp").unwrap(),
z80_recv_from_vdp: lib.get(b"z80_recv_from_vdp").unwrap(),
sendHostKbEventToFabgl: lib.get(b"sendHostKbEventToFabgl").unwrap(),
sendHostMouseEventToFabgl: lib.get(b"sendHostMouseEventToFabgl").unwrap(),
getAudioSamples: lib.get(b"getAudioSamples").unwrap(),
dump_vdp_mem_stats: lib.get(b"dump_vdp_mem_stats").unwrap(),
vdp_shutdown: lib.get(b"vdp_shutdown").unwrap(),
Expand Down

0 comments on commit 8a14c04

Please sign in to comment.