[syslinux] [PATCH] core: Allow pasting from a VMware host by typing Ctrl-P
Jeffrey Hutzelman
jhutz at cmu.edu
Fri Feb 18 05:34:55 PST 2011
When Syslinux is running in a VMWare virtual machine and Ctrl-P
is typed while editing the boot command line, insert the contents
of VMware's clipboard. This allows text to be copied from the
host (or wherever the console client is running) into Syslinux.
Signed-off-by: Jeffrey Hutzelman <jhutz at cmu.edu>
---
core/ui.inc | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 72 insertions(+), 0 deletions(-)
diff --git a/core/ui.inc b/core/ui.inc
index 2d44447..0e82779 100644
--- a/core/ui.inc
+++ b/core/ui.inc
@@ -125,6 +125,8 @@ not_ascii:
je print_version
cmp al,'X' & 1Fh ; <Ctrl-X>
je force_text_mode
+ cmp al,'P' & 1Fh ; <Ctrl-P>
+ je paste
cmp al,08h ; Backspace
jne get_char
backspace: cmp di,command_line ; Make sure there is anything
@@ -143,6 +145,10 @@ force_text_mode:
call vgaclearmode
jmp enter_command
+paste:
+ call vmware_paste
+ jmp get_char
+
set_func_flag:
mov byte [FuncFlag],1
jmp short get_char_2
@@ -568,6 +574,72 @@ getchar_timeout:
call vgahidecursor
ret
+; Copy data from VMware's clipboard to the command-line buffer
+VMwareMagic equ 564D5868h ; VMWare magic number
+VMwarePort equ 5658h ; VMWare magic port
+vmware_paste:
+ mov eax,VMwareMagic
+ mov ebx,0
+ mov cx,000ah ; Get VMware version
+ mov dx,VMwarePort
+ in eax,dx
+ cmp ebx,VMwareMagic
+ jne vmware_done
+
+ mov eax,VMwareMagic
+ mov cx,0006h ; Get clipboard length
+ mov dx,VMwarePort
+ in eax,dx
+ and eax,eax
+ jz vmware_done
+ cmp eax,0ffffffffh
+ jz vmware_done
+ mov ebx,eax
+
+vmware_get_data:
+ mov eax,VMwareMagic
+ mov cx,00007h ; Get clipboard data
+ mov dx,VMwarePort
+ in eax,dx
+ mov ecx,4
+
+vmware_paste_char:
+ and al,al
+ je vmware_clear_buffer
+ cmp al,7Fh ; <DEL> == <BS>
+ je vmware_no_enter
+ cmp al,' ' ; ASCII?
+ jb vmware_no_enter ; don't paste no non-ASCII
+ ja vmware_enter
+ cmp di,command_line ; Space must not be first
+ je short vmware_no_enter
+vmware_enter: cmp di,max_cmd_len+command_line ; Check there's space
+ jnb short vmware_no_enter
+ stosb ; Save it
+ call writechr ; Echo to screen
+vmware_no_enter:
+ shr eax,8
+ dec ebx
+ je vmware_done
+ dec cx
+ jne vmware_paste_char
+ jmp vmware_get_data
+
+vmware_clear_buffer:
+ sub ebx,ecx
+ jle vmware_done
+ shr ebx,2
+vmware_clear_loop:
+ mov eax,VMwareMagic
+ mov cx,00007h ; Get clipboard data
+ mov dx,VMwarePort
+ in eax,dx
+ dec ebx
+ jne vmware_clear_loop
+
+vmware_done:
+ ret
+
;
; This is it! We have a name (and location on the disk)... let's load
; that sucker!! First we have to decide what kind of file this is; base
--
1.7.1
More information about the Syslinux
mailing list