You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
4.4 KiB
NASM

; toclip.asm
;
; This code may be assembled and linked using Borland's TASM:
; tasm /la /m2 toclip
; tlink /Tdc toclip
;
; It also works with Microsoft's MASM:
; ml /Fl toclip.asm
;
STDIN equ 00h ; handle of standard input device
STDOUT equ 01h ; handle of standard output device
STDERR equ 02h ; handle of standard error device
DOS_READ_HANDLE equ 03fh ; read from handle
DOS_WRITE_HANDLE equ 040h ; write to handle
DOS_ALLOC_MEM equ 048h ; allocate memory block
DOS_RESIZE_MEM equ 04ah ; resize memory block
DOS_TERMINATE equ 04ch ; terminate with error code
WIN_VERSION equ 01700h ; identify WinOldAp version
WIN_OPEN_CLIP equ 01701h ; open clipboard
WIN_EMPTY_CLIP equ 01702h ; empty clipboard
WIN_SET_CLIP equ 01703h ; set clipboard data
WIN_CLOSE_CLIP equ 01708h ; close clipboard
; clipboard formats:
CLIP_FMT_TXT equ 01h ; text format
CLIP_FMT_BMP equ 02h ; bitmap format
CLIP_FMT_TIFF equ 06h ; TIFF
CLIP_FMT_OEMTXT equ 07h ; OEM text
WININT macro function
mov ax,(function)
int 2fh
endm
DOSINT macro function, subfunction
IFB <subfunction>
mov ah,(function AND 0ffh)
ELSE
mov ax,(function SHL 8) OR (subfunction AND 0ffh)
ENDIF
int 21h ; invoke DOS function
endm
ERRMSG macro tag, message
LOCAL nextmsg
tag db nextmsg-$
db message
nextmsg = $
endm
.model small
.386
.stack 100h
.data
ERRMSG cantresize, <"ERROR: can't resize memory",0dh,0ah>
ERRMSG noclipboard,<"ERROR: no clipboard",0dh,0ah>
ERRMSG emptyclip, <"ERROR: cannot empty clipboard",0dh,0ah>
ERRMSG openclip, <"ERROR: cannot open clipboard",0dh,0ah>
ERRMSG allocerror, <"ERROR: can't allocate 64K buffer",0dh,0ah>
ERRMSG readerr, <"ERROR: can't read data from stdin",0dh, 0ah>
ERRMSG pasteerr, <"ERROR: can't paste data to clipboard",0dh,0ah>
.code
start proc
mov bx,ss ; stack segment
mov ax,ds ; - data segment
sub bx,ax ; = size of all but stack
add bx,10h ; add in stack size (in paragraphs)
DOSINT DOS_RESIZE_MEM ;
mov di,offset cantresize
jc error
WININT WIN_VERSION
cmp ax,WIN_VERSION
mov di,offset noclipboard
jz error ;
WININT WIN_OPEN_CLIP ; open clipboard
or ax,ax ; nonzero status means error
mov di,offset openclip
jz error ;
WININT WIN_EMPTY_CLIP ; empty clipboard
or ax,ax ; nonzero status means error
mov di,offset emptyclip
jz error ;
; allocate a big buffer
mov bx,1000h ; 1000h paragraphs = 64K
DOSINT DOS_ALLOC_MEM ;
mov di,offset allocerror
jc error ;
mov ds,ax ;
mov es,ax ;
; read from the input file
mov bx,STDIN ; stdin
mov cx,0ffffh ; read a whole bunch of data
; ds:dx ==> data buffer
xor dx,dx ;
DOSINT DOS_READ_HANDLE ;
mov di,offset readerr
jc error ;
xor si,si ;
mov cx,ax ; size
; paste the file buffer into the clipboard
; mov es:bx ==> data
xor bx,bx
; mov si:cx, size of data
mov dx,CLIP_FMT_TXT ; text data
WININT WIN_SET_CLIP ;
or ax,ax
mov di,offset pasteerr ;
jz error ;
WININT WIN_CLOSE_CLIP ; close clipboard
DOSINT DOS_TERMINATE,0 ; exit with error code = 0
error:
mov bx,@data ;
mov ds,bx ;
xor cx,cx ;
mov cl,byte ptr[di] ; fetch length
mov dx,di ; point to data
inc dx ; advance beyond length
mov bx,STDERR ; write to stderr
DOSINT DOS_WRITE_HANDLE ; write to handle
DOSINT DOS_TERMINATE,1 ; error exit
start endp
END start