⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 conio.asm

📁 独立 WIN98下磁盘分区程序(C语言+汇编) 界面功能类似FDISK 但独立编译
💻 ASM
字号:
.MODEL LARGE
.DATA

PUBLIC	_ScreenWidth
PUBLIC	_ScreenHeight
PUBLIC	_MouseInstalled

_ScreenArea	EQU DWord Ptr _ScreenOffset
_ScreenOffset	DW   ?	; 0000h
_ScreenSegment	DW   ?	; B800h
_ScreenWidth	DB   ?	;  80
_ScreenHeight	DB   ?	;  25
_ScreenLength	DW   ?	; 80*25
_MouseInstalled	DW   ?	; 0 or 1
_LastKeyShifts	DW   ?	;
_LastMousePosX	DW   ?  ;
_LastMousePosY	DW   ?  ;
_LastMouseBtns	DW   ?	;
OriginalTimer1	DW   ?	;
OriginalTimer2	DW   ?	;

.CODE
LOCALS

PUBLIC	_conio_init
PUBLIC	_conio_exit
PUBLIC	_show_mouse
PUBLIC	_hide_mouse
PUBLIC	_move_mouse
PUBLIC	_cursor_size
PUBLIC	_move_cursor
PUBLIC	_get_event
PUBLIC	_write_char
PUBLIC	_write_string
PUBLIC	_load_window
PUBLIC	_save_window
PUBLIC	_clear_window
PUBLIC	_scroll_window
PUBLIC	_border_window


Show_Mouse	MACRO
		cmp	_MouseInstalled, 1
		jne	@@nomouse1
		mov	ax, 0001h
		int	33h
    @@nomouse1:
		ENDM


Hide_Mouse	MACRO
		cmp	_MouseInstalled, 1
		jne	@@nomouse2
		mov	ax, 0002h
		int	33h
    @@nomouse2:
		ENDM


;----------------------------------------------------------------


_conio_init	PROC
		push	bp
		mov	bp, sp
		push	es
		push	si
		push	di

		mov	ah,0Fh		; Check current video mode
		int	10h

		cmp	al,07h
		je	@@Mono
		cmp	al,03h
		je	@@Color
    @@Reset:
		mov	ax,03		; If unknown set Color 80x25
		int	10h
    @@Color:  
		mov	_ScreenSegment, 0B800h
		jmp	@@skip1
    @@Mono:
		mov	_ScreenSegment, 0B000h
    @@skip1:
		push	ds
		mov	ax, 0
		mov	ds, ax
		mov	bx, 484h
		mov	al, [bx]
		pop	ds
		inc	al
		mov	_ScreenHeight, al
		mov	ah,0Fh
		int	10h
		mov	_ScreenWidth, ah
		mov	al, _ScreenHeight
		mov	ah, _ScreenWidth
		mul	ah
		mov	_ScreenLength, ax
		mov	_ScreenOffset, 0h
		
		mov	ax,0000h	; Check for a mouse
		int	33h
		cmp	ax, 0h
		je	@@No_Mouse
		cmp	ax, 3h
		je	@@_Mouse
		cmp	ax, 2h
		je	@@_Mouse
		cmp	ax, 0FFFFh
		mov	ax, 2h
		je	@@_Mouse
		mov	ax, 1h
    @@_Mouse:
		mov	_MouseInstalled, 1
		mov	ax, 0003h	; Reset mouse
		int	33h
		mov	_LastMousePosX, cx
		mov	_LastMousePosY, dx
		mov	_LastMouseBtns, bx
		jmp	@@skip2
    @@No_Mouse:
		mov	_MouseInstalled, 0
    @@skip2:	
		mov	ah, 12h		; Get keyboard status
		int	16h
		mov	_LastKeyShifts, ax
		
		pop	di
		pop	si
		pop	es
		pop	bp
		retf
_conio_init	ENDP


_conio_exit	PROC
		retf
_conio_exit	ENDP


;----------------------------------------------------------------


_show_mouse	PROC
		Show_Mouse
		retf
_show_mouse	ENDP



_hide_mouse	PROC
		Hide_Mouse
		retf
_hide_mouse	ENDP



_move_mouse	PROC

	Y	EQU	[bp+08h]
	X	EQU	[bp+06h]

		push	bp
		mov	bp, sp
		mov	ax, 0004h
		mov	cx, X
		mov	dx, Y 

		dec	cx
		shl	cx, 1
		shl	cx, 1
		shl	cx, 1

		dec	dx
		shl	dx, 1
		shl	dx, 1
		shl	dx, 1

		int	33h
		pop	bp
		retf
_move_mouse  ENDP


;----------------------------------------------------------------


_move_cursor	PROC

	Y	EQU	[bp+08h]
	X	EQU	[bp+06h]

		push	bp
		mov	bp, sp
		mov	ah, 02
		mov	bh, 00
		mov	dl, X
		mov	dh, Y
		sub	dx, 0101h
		int	10h
		pop	bp
		retf
_move_cursor	ENDP


_cursor_size	PROC

      Bottom	EQU	[bp+08h]
	Top	EQU	[bp+06h]

		push	bp
		mov	bp, sp
		mov	ah, 01
		mov	cl, Top
		mov	ch, Bottom
		and	cx, 1F1Fh
		int	10h
		pop	bp
		retf

_cursor_size	ENDP


;----------------------------------------------------------------


_write_char	PROC

	C	EQU	[bp+0Ch]
	Y	EQU	[bp+0Ah]
	X	EQU	[bp+08h]
    Attribute	EQU	[bp+06h]

		Hide_Mouse

		push	bp
		mov	bp, sp
		push	ds
		push	di
		push	si
		sub	ax, ax
		mov	bx, ax
		mov	cx, bx
		mov	dx, cx
	
		mov	dl, _ScreenWidth
		mov	al, Y
		mov	bl, X	 
		dec	al
		dec	bl	 
		mul	dl
		add	ax, bx
		shl	ax, 1
		les	di, _ScreenArea
		add	di, ax

		mov	al, C
		mov	ah, Attribute
		stosw

		pop	si
		pop	di
		pop	ds
		pop	bp

		Show_Mouse
		retf
_write_char	ENDP



_write_string	PROC

	S	EQU	[bp+0Ch]
	Y	EQU	[bp+0Ah]
	X	EQU	[bp+08h]
    Attribute	EQU	[bp+06h]

		Hide_Mouse

		push	bp
		mov	bp, sp
		push	ds
		push	di
		push	si
		sub	ax, ax
		mov	bx, ax
		mov	cx, bx
		mov	dx, cx
	
		mov	dl, _ScreenWidth
		mov	al, Y
		mov	bl, X	 
		dec	al
		dec	bl	 
		mul	dl
		add	ax, bx
		shl	ax, 1
		les	di, _ScreenArea
		lds	si, S
		add	di, ax

		mov	ah, Attribute
		jmp	@@first
    @@next:
		stosw
    @@first:
		lodsb
		cmp	al, 0
		jne	@@next
		
		pop	si
		pop	di
		pop	ds
		pop	bp

		Show_Mouse
		retf
_write_string	ENDP


;----------------------------------------------------------------


_save_window	PROC

   Destination	EQU	[bp+0Eh]
	H	EQU	[bp+0Ch]
	W	EQU	[bp+0Ah]
	Y	EQU	[bp+08h]
	X	EQU	[bp+06h]

		Hide_Mouse

		push	bp
		mov	bp, sp
		push	ds
		push	di
		push	si
		sub	ax, ax
		mov	bx, ax
		mov	cx, bx
		mov	dx, cx
	
		mov	dl, _ScreenWidth
		mov	al, Y
		mov	bl, X	 
		dec	al
		dec	bl	 
		mul	dl
		add	ax, bx
		shl	ax, 1
		les	di, Destination
		lds	si, _ScreenArea
		add	si, ax
		mov	bl, W
		mov	bh, H
		sub	dl, bl
		shl	dx, 1
    @@next_row:
		mov	cl, bl
		rep
		 movsw
		add	si, dx
		dec	bh
		jne	@@next_row

		pop	si
		pop	di
		pop	ds
		pop	bp

		Show_Mouse
		retf
_save_window	ENDP



_load_window	PROC

     Source	EQU	[bp+0Eh]
	H	EQU	[bp+0Ch]
	W	EQU	[bp+0Ah]
	Y	EQU	[bp+08h]
	X	EQU	[bp+06h]

		Hide_Mouse

		push	bp
		mov	bp, sp
		push	ds
		push	di
		push	si
		sub	ax, ax
		mov	bx, ax
		mov	cx, bx
		mov	dx, cx
	
		mov	dl, _ScreenWidth
		mov	al, Y
		mov	bl, X	 
		dec	al
		dec	bl	 
		mul	dl
		add	ax, bx
		shl	ax, 1
		les	di, _ScreenArea
		lds	si, Source
		add	di, ax

		mov	bl, W
		mov	bh, H
		sub	dl, bl
		shl	dx, 1
		
    @@next_row:
		mov	cl, bl
		rep
		 movsw
		add	di, dx
		dec	bh
		jne	@@next_row
				
		pop	si
		pop	di
		pop	ds
		pop	bp

		Show_Mouse
		retf
_load_window ENDP


;----------------------------------------------------------------


_clear_window	PROC

	H	EQU	[bp+0Eh]
	W	EQU	[bp+0Ch]
	Y	EQU	[bp+0Ah]
	X	EQU	[bp+08h]
    Attribute	EQU	[bp+06h]

		Hide_Mouse

		push	bp
		mov	bp, sp
		push	ds
		push	di
		push	si
		sub	ax, ax
		mov	bx, ax
		mov	cx, bx
		mov	dx, cx
	
		mov	dl, _ScreenWidth
		mov	al, Y
		mov	bl, X	 
		dec	al
		dec	bl	 
		mul	dl
		add	ax, bx
		shl	ax, 1
		les	di, _ScreenArea
		add	di, ax

		mov	bl, W
		mov	bh, H
		sub	dl, bl
		shl	dx, 1
		
		mov	ah, Attribute
		mov	al, ' '

    @@next_row:
		mov	cl, bl
		rep
		stosw
		add	di, dx
		dec	bh
		jne	@@next_row
				
		pop	si
		pop	di
		pop	ds
		pop	bp

		Show_Mouse
		retf
_clear_window	ENDP



_scroll_window	PROC

       Len	EQU	[bp+10h]
	H	EQU	[bp+0Eh]
	W	EQU	[bp+0Ch]
	Y	EQU	[bp+0Ah]
	X	EQU	[bp+08h]
    Attribute	EQU	[bp+06h]

		Hide_Mouse

		push	bp
		mov	bp, sp
		push	ds
		push	di
		push	si
		sub	ax, ax
		mov	bx, ax
		mov	cx, bx
		mov	dx, cx
	
		mov	dl, _ScreenWidth
		les	di, _ScreenArea
		lds	si, _ScreenArea
		mov	cl, dl
		sub	dl, W
		shl	dx, 1
	
		mov	al, Len
		imul	cl
		shl	ax, 1
		add	si, ax
		or	ax, ax
	
		mov	al, Y
		mov	ah, X
		mov	bl, H
		mov	bh, W
		jns	@@n12

		std
		neg	Byte Ptr Len
		neg	dx
		add	ax, bx
		sub	ax, 0101h
    @@n12:
		sub	ax, 0101h
		xchg	ah, cl
		mul	ah
		add	ax, cx
		shl	ax, 1
		add	si, ax
		add	di, ax
		sub	bl, Len
	
    @@next_row:
		mov	cl, bh
		rep
		  movsw
		add	di, dx
		add	si, dx
		dec	bl
		jne	@@next_row

		mov	bl, Len
		mov	ah, Attribute
		mov	al, ' '

    @@clr_row:
		mov	cl, bh
		rep
		  stosw
		add	di, dx
		dec	bl
		jne		@@clr_row

		cld

		pop	si
		pop	di
		pop	ds
		pop	bp

		Show_Mouse
		retf
_scroll_window	ENDP



_border_window	PROC

      Border	EQU	[bp+10h]
	 H	EQU	[bp+0Eh]
	 W	EQU	[bp+0Ch]
	 Y	EQU	[bp+0Ah]
	 X	EQU	[bp+08h]
     Attribute	EQU	[bp+06h]

		Hide_Mouse

		push	bp
		mov	bp, sp
		push	ds
		push	di
		push	si
		sub	ax, ax
		mov	bx, ax
		mov	cx, bx
		mov	dx, cx
	
		mov	dl, _ScreenWidth
		mov	al, Y
		mov	bl, X	 
		dec	al
		dec	bl	 
		mul	dl
		add	ax, bx
		shl	ax, 1
		les	di, _ScreenArea
		lds	si, Border
		add	di, ax

		mov	bl, W
		mov	bh, H
		sub	dl, bl
		shl	dx, 1
		sub	bx, 0202h
		
		mov	ah, Attribute

		lodsb			; Upper row
		stosw
		mov	cl, bl
		lodsb
		rep
		  stosw
		lodsb
		stosw
		add	di, dx
		cmp	bh, 00
		je	@@NoMiddleRows
	
    @@next_row:
		lodsb			; All rows in the middle
		stosw
		mov	cl, bl
		lodsb
		cmp	al, 00
		je	@@NoFill
		rep
		  stosw
		jmp	@@FillDone
    @@NoFill:
		add	di, cx
		add	di, cx
    @@FillDone:
		lodsb
		stosw
		add	di, dx
		sub	si, 03
		dec	bh
		jne	@@next_row

 @@NoMiddleRows:
		add	si, 03		; Bottom row
		lodsb
		stosw
		mov	cl, bl
		lodsb
		rep
		  stosw
		lodsb
		stosw

		pop	si
		pop	di
		pop	ds
		pop	bp

		Show_Mouse
		retf
_border_window	ENDP


;----------------------------------------------------------------


_get_event	PROC

  flags		EQU	Word Ptr [bp+0Ah]
  event		EQU	[bp+06h]

 ev_type	EQU	Word Ptr es:[si]

 key		EQU	Word Ptr es:[si+2]
 scan		EQU	Word Ptr es:[si+4]
 shift		EQU	Word Ptr es:[si+6]
 shiftX		EQU	Word Ptr es:[si+8]

 x		EQU	Word Ptr es:[si+10]
 y		EQU	Word Ptr es:[si+12]
 left		EQU	Word Ptr es:[si+14]
 right		EQU	Word Ptr es:[si+16]
 middle		EQU	Word Ptr es:[si+18]

 timer1		EQU	Word Ptr es:[si+20]
 timer2		EQU	Word Ptr es:[si+22]

 EV_KEY		EQU	 1
 EV_SHIFT	EQU	 2
 EV_MOUSE	EQU	 4
 EV_TIMER	EQU	 8
 EV_NONBLOCK	EQU	16

		push	bp
		mov	bp, sp
		push	ds
		push	es
		push	si
		push	di
		les	si, event
		sub	ax, ax
		mov	ev_type, ax
		mov	key, ax
		mov	scan, ax

		test	flags, EV_TIMER
		jz	@@main_loop
		mov	ah, 0h
		int	1Ah
		mov	OriginalTimer1, dx
		mov	OriginalTimer2, cx

    @@main_loop:
		test	flags, EV_KEY
		jz	@@test_shifts

		mov	ah, 11h			; Check for a key
		int	16h
		jz	@@test_shifts

		or	ev_type, EV_KEY		; Key was pressed
		mov	ah, 10h
		int	16h
		mov	scan, ax
		cmp	al, 0E0h		; Is it an extended key
		jne	@@normal_key
		cmp	ah, 0
		je	@@normal_key
		mov	al, 0
    @@normal_key:
		mov	ah, 0
		mov	key, ax
		jmp	@@break_out

    @@test_shifts:
		test	flags, EV_SHIFT
		jz	@@test_mouse

		mov	ah, 12h			; Check if shifts changed
		int	16h
		cmp	ax, _LastKeyShifts
		jz	@@test_mouse

		or	ev_type, EV_SHIFT
		mov	bx, _LastKeyShifts
		xor	bx, ax
		mov	shift, ax
		mov	shiftX, bx
		mov	_LastKeyShifts, ax
		jmp	@@break_out2

    @@test_mouse:
		test	flags, EV_MOUSE
		jz	@@test_time
		cmp	_MouseInstalled, 1
		jne	@@test_time

		mov	ax, 0003h		; Check mouse status
		int	33h
		cmp	bx, _LastMouseBtns
		jne	@@mouse
		cmp	cx, _LastMousePosX
		jne	@@mouse
		cmp	dx, _LastMousePosY
		je	@@test_time
    @@mouse:
		or	ev_type, EV_MOUSE

		mov	_LastMouseBtns, bx
		mov	_LastMousePosX, cx
		mov	_LastMousePosY, dx
		jmp	@@break_out
    @@test_time:
		test	flags, EV_TIMER
		jz	@@loop_tail

		mov	ah, 0h			; Check timer
		int	1Ah
		sub	dx, OriginalTimer1
		sbb	cx, OriginalTimer2
		cmp	cx, timer2
		jb	@@loop_tail
		cmp	dx, timer1
		jb	@@loop_tail
		or	ev_type, EV_TIMER
		jmp	@@break_out
    @@loop_tail:
		test	flags, EV_NONBLOCK
		jnz	@@break_out
		jmp	@@main_loop

    @@break_out:
		mov	ah, 12h		; Updayte shift status
		int	16h
		mov	shift, ax
		mov	bx, _LastKeyShifts
		xor	bx, ax
		mov	shiftX, bx

    @@break_out2:
    		cmp	_MouseInstalled, 1
    		jne	@@end

		mov	ax, 0003h	; Update mouse status
		int	33h

		shr	cx, 1
		shr	cx, 1
		shr	cx, 1
		inc	cx
		mov	x, cx
		shr	dx, 1
		shr	dx, 1
		shr	dx, 1
		inc	dx
		mov	y, dx

		test	bx, 0001h
		jne	@@left
		mov	word ptr left, 0h
		jmp	@@leftE
	@@left:
		mov	word ptr left, 1h
	@@leftE:
		test	bx, 0002h
		jne	@@right
		mov	word ptr right, 0h
		jmp	@@rightE
	@@right:
		mov	word ptr right, 1h
	@@rightE:
		test	bx, 0004h
		jne	@@middle
		mov	word ptr middle, 0h
		jmp	@@middleE
	@@middle:
		mov	word ptr middle, 1h
	@@middleE:

	@@end:
		pop	di
		pop	si
		pop	es
		pop	ds
		pop	bp
		retf
_get_event	ENDP

END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -