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

📄 manager.asm

📁 独立 WIN98下磁盘分区程序(C语言+汇编) 界面功能类似FDISK 但独立编译
💻 ASM
📖 第 1 页 / 共 3 页
字号:
SHOW_ERROR	PROC	NEAR
		;
		;  DS:SI - String to print
		;
		PUSH_REGS
		
		push	ds
		mov	di, si
		pop	es
		mov	cx, 76
		mov	al, 0
		repne
		  scasb
		inc	cx
		mov	dx, 80
		sub	dx, cx
		mov	dh, 4
		mov	bx, cx
		shr	bx, 1
		mov	bh, 12
		
		push	si
		lea	si, SAV_BUFFER_ERR
		call	_save_window
		mov	ah, Yellow+BakRed
		lea	si, Border
		call	_border_window
		pop	si
		
		push	bx
		push	dx

		mov	ah, BrWhite+BakRed
		add	bx, 0102h
		xor	cx, cx
		mov	cl, dl
		sub	cl, 4

		call _write_string
		
		mov	ah, Black+BakWhite
		mov	bl, 38
		inc	bh
		lea	si, Mesg_OK
		call	_write_string
@@again:
		mov	ah, 0
		int	16h
		cmp	al, 0Dh	; Enter
		je	@@end
		cmp	al, 1Bh	; ESC
		jne	@@again
@@end:
		pop	dx
		pop	bx
		lea	si, SAV_BUFFER_ERR
		call	_load_window
		
		POP_REGS
		ret
SHOW_ERROR	ENDP
		;
		;
		;

GET_PASSWORD	PROC	NEAR
		;
		;  Input:  none
		;  Output: AX - encrypted password
		;
		mov	bl, 20
		mov	bh, DOT_Y
		mov	dl, 28
		mov	dh, 3
		lea	si, SAV_BUFFER_ERR
		call	_save_window
		mov	ah, Yellow+BakWhite
		lea	si, Border
		call	_border_window

		push	bx
		push	dx

		mov	ah, Black+BakWhite
		add	bl, 2
		add	bh, 1
		lea	si, MesgEnterPassword
		call	_write_string

		add	bl, 16
		mov	dl, 8
		mov	dh, 1
		lea	si, TMP
@@clear_it:
		mov	cx, 0
@@next_key:		
		mov	di, si
		add	di, cx
		mov	al, 0
		stosb
		sub	di, 1

		mov	ah, BrWhite+BakBlack
		call	_clear_window

		push	cx
		push	bx
		jcxz	@@empty
		mov	al, '*'
@@next_char:
		call	_write_char
		add	bx, 1
		loop	@@next_char
@@empty:
		call	_move_cursor
		pop	bx
		pop	cx

		mov	ah, 10h
		int	16h
		cmp	al, 0Dh	; Enter
		je	@@break_out
		cmp	al, 1Bh	; ESC
		je	@@clear_it
		cmp	al, 08h	; BkSp
		je	@@bk_sp

		cmp	cx, 8
		je	@@next_key
		stosb
		inc	cx
		jmp	@@next_key
@@bk_sp:
		cmp	cx, 0
		je	@@next_key
		dec	cx
		
		jmp	@@next_key
@@break_out:
		call	_hide_cursor

		pop	dx
		pop	bx

		lea	si, SAV_BUFFER_ERR
		call	_load_window

		push	ds
		lea	si, TMP
		push	si

		call	_encrypt_password
		add	sp, 4
		
		push	ax
		mov	al, 0
		mov	cx, 9
		lea	di, TMP
		rep
		  stosb
		pop	ax

		ret
GET_PASSWORD	ENDP

		;
		;
		;

SETUP_MENU	PROC	NEAR
		PUSH_REGS
		mov	bl, 29
		mov	bh, 12
		mov	dl, 34
		mov	dh, 3
		lea	si, SAV_BUFFER_ERR
		call	_save_window
		mov	ah, Yellow+BakWhite
		lea	si, Border
		call	_border_window
		mov	ah, Black+BakWhite
		add	bx, 0102h
		lea	si, MesgSetTimeout
		call	_write_string

		mov	dl, adv_timeout
	@@while:
		xor	ax, ax
		mov	al, dl
		mov	cx, 3
		lea	si, TMP
		call	SPRINTF_INT
		mov	ah, BrWhite+BakBlack
		mov	bl, 58
		mov	bh, 13
		call	_write_string
	@@keys:
		mov	ah, 10h
		int	16h
		cmp	ax, 011Bh    ; ESC
		je	@@break
		cmp	ax, 1C0Dh    ; Enter
		je	@@save
		cmp	al, 2Bh      ; '+'
		je	@@inc
		cmp	al, 2Dh      ; '-'
		jne	@@keys
		cmp	dl, 0
		jz	@@keys
		dec	dl
		jmp	@@while
	@@inc:
		cmp	dl, 100
		je	@@keys
		inc	dl
		jmp	@@while
	@@save:
		mov	adv_timeout, dl
	@@break:
		mov	bl, 29
		mov	bh, 12
		mov	dl, 34
		mov	dh, 3
		lea	si, SAV_BUFFER_ERR
		call	_load_window

		POP_REGS
		ret
SETUP_MENU	ENDP

		;
		;
		;

FILL_KEYB_BUFFER	PROC	NEAR
		cmp	ALT_ENTER, 1
		je	@@alt_enter
		cmp	FILL_KB_BUFFER, 0
		je	@@end
		mov	bx, ACT_MENU
		shl	bx, 1
		mov	bx, MENU_PTR[bx]
		mov	cx, [bx].m_num_keys
		cmp	cx, 0
		je	@@end

		push	es
		mov	ax, 0
		mov	es, ax
		lea	si, [bx].m_keys
		mov	di, 41Ah
		mov	ax, 01Eh
		stosw
		add	ax, cx
		add	ax, cx
		stosw
		rep
		  movsw
		pop	es
		jmp	@@end
	@@alt_enter:		; We have to wait until user releases ALT key
	@@not_yet:
		mov	ah, 02
		int	16h		; Read keyboard status
		test	al, 8
		jnz	@@not_yet
	@@end:
		ret
FILL_KEYB_BUFFER	ENDP

		;
		;
		;

DOT_BAR		PROC	NEAR
		;
		;  Print dots and check if key is pressed (key in al)
		;
		;  CF - set if key was pressed
		;
		PUSH_REGS

		mov	bl, KEYS_X
		mov	bh, KEYS_Y
		mov	dl, KEYS_W
		mov	dh, 1
		lea	si, SAV_BUFFER_ERR
		call	_save_window

		mov	bl, DOT_X-1
		mov	bh, DOT_Y
		mov	dl, DOT_NUM+2
		mov	dh, 1
		mov	ah, DOTBAR_COLOR
		call	_clear_window

		mov	ah, KEYS_TXT_COLOR
		mov	bl, KEYS_X
		mov	bh, KEYS_Y
		lea	si, BottomKeysText
		call	_write_string
		mov	ah, KEYS_KEY_COLOR
		lea	si, BottomKeysESC
		call	_write_string

		mov	cx, DOT_NUM
		mov	al, DOT1
		mov	ah, DOTBAR_COLOR
		mov	bl, DOT_X
		mov	bh, DOT_Y
	@@L1:
		call	_write_char
		inc	bl
		loop	@@L1

		mov	cx, DOT_NUM
		mov	bl, DOT_X
		mov	bh, DOT_Y
	@@L2:
		mov	ah, 11h		; Check if key is pressed
		int	16h
		jnz	@@key		; There is no key waiting

		mov	al, DOT2
		mov	ah, DOTBAR_COLOR
		call	_write_char
		inc	bl

		push	bx
		push	cx
		mov	cx, TICKS_PER_DOT
	@@L3:
		push	cx
		mov	ah, 0
		int	1Ah		; Read System Timer
		mov	bx, dx

	@@WT1:	int	1Ah		; Wait one timer tick
		cmp	bx, dx
		je 	@@WT1
		pop	cx
		loop	@@L3

		pop	cx
		pop	bx

		loop	@@L2
		clc
		jmp	@@end
	@@key:
		mov	al, DOT2
		mov	ah, DOTBAR_COLOR
		call	_write_char
		inc	bl
		loop	@@key
		stc
	@@end:
		pushf
		mov	bl, KEYS_X
		mov	bh, KEYS_Y
		mov	dl, KEYS_W
		mov	dh, 1
		lea	si, SAV_BUFFER_ERR
		call	_load_window
		popf

		POP_REGS
		ret
DOT_BAR		ENDP

;----------------------------------------------------------------
CHECK_LAST_CYL	PROC	NEAR
		mov	ax, SECT_PER_TRACK
		mov	dx, DISK_NUM_CYLS
		cmp	dx, 1024
		je	@@end
		mul	dx
		mov	cx, 1
		mov	bx, 7C00h
		call	READ_N_SECT
		jc	@@end
		inc	DISK_NUM_CYLS
	@@end:
		ret
CHECK_LAST_CYL	ENDP

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

WRITE_N_SECT	PROC	NEAR
		;
		;
		;	ES:BX - Destination address
		;	DX:AX - Relative sector on disk
		;	CX    - Number of sectors to read
		;
		;	Returns: Flag CF set if error
		;
		push	ax
		push	bx
		push	cx
		push	dx
@@next_sect:
		push	ax
		push	cx
		push	dx
		call	REL_SECT_TO_CHS
		call	WRITE_SECT
		pop	dx
		pop	cx
		pop	ax
		jc	@@end

		add	ax, 1
		adc	dx, 0

		add	bx, SECT_SIZE

		loop	@@next_sect
@@end:
		pop	dx
		pop	cx
		pop	bx
		pop	ax
		ret
WRITE_N_SECT	ENDP
		;
		;
		;
WRITE_SECT	PROC	NEAR
		;
		;   ES:BX - Address
		;   CX,DX - CHS
		;
		;   Returns: CF set if error
		;
		push	si
		mov	si, 3		; We will try at most three times
@@try_again:
		mov	ax, 0301h	; Write (AH=03) 1 Sector (AL=01)
		int	13h
		jnc	@@end
					; We get here if there was an error
		mov	ah, 0		; We will try to reset device
		int	13h
	
		dec	si
		jnz	@@try_again
		;
		; We have tried three times, so we will give up
		;
		stc
	@@end:
		pop	si
		ret
WRITE_SECT	ENDP
;----------------------------------------------- CONIO ROUTINES -------

_conio_init	PROC	NEAR
		push	ax
		push	bx

		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	Word Ptr _ScreenArea+2, 0B800h
		jmp	@@skip1
    @@Mono:
		mov	Word Ptr _ScreenArea+2, 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	Word Ptr _ScreenArea, 0h

		pop	bx
		pop	ax		
		ret
_conio_init	ENDP


_conio_exit	PROC	NEAR
		ret
_conio_exit	ENDP


;----------------------------------------------------------------
		
		;
		;  Cursor position:  BL=X  BH=Y
		;
		
_move_cursor	PROC	NEAR
		PUSH_REGS
		mov	dx, bx
		sub	dx, 0101h
		mov	ah, 02h
		mov	bh, 0
		int	10h
		POP_REGS
		ret
_move_cursor	ENDP


_hide_cursor	PROC	NEAR
		push	bx
		mov	bl, 1
		mov	bh, 26
		call	_move_cursor
		pop	bx
		ret
_hide_cursor	ENDP


_save_cursor	PROC	NEAR
		PUSH_REGS
		mov	ah, 3
		mov	bh, 0
		int	10h
		mov	CURSOR_SAVE_XY, dx
		POP_REGS
		ret
_save_cursor	ENDP


_restore_cursor	PROC	NEAR
		PUSH_REGS
		mov	ah, 2
		mov	bh, 0
		mov	dx, CURSOR_SAVE_XY
		int	10h
		POP_REGS
		ret
_restore_cursor	ENDP

;----------------------------------------------------------------
WINDOW_XY	MACRO
		push	ax
		mov	al, _ScreenWidth
		sub	bx, 0101h
		mul	bh
		xor	bh, bh
		add	ax, bx
		shl	ax, 1
		add	di, ax
		pop	ax
ENDM

WINDOW_WH	MACRO
		xor	cx, cx
		xor	bx, bx
		mov	cl, dl
		mov	bl, _ScreenWidth
		sub	bx, cx
		shl	bx, 1
		xor	cx, cx
ENDM
;----------------------------------------------------------------


_write_char	PROC	NEAR
		;
		; Input: AL=Char  BL=X
		;	 AH=Attr  BH=Y
		;
		PUSH_REGS

		les	di, _ScreenArea

		WINDOW_XY

		stosw

		POP_REGS
		ret
_write_char	ENDP



_write_string	PROC	NEAR
		;
		; Input: DS:SI=Str   BL=X
		;	    AH=Attr  BH=Y
		;
		PUSH_REGS

		les	di, _ScreenArea

		WINDOW_XY

		jmp	@@first
    @@next:
		stosw
    @@first:
		lodsb
		cmp	al, 0
		jne	@@next

		POP_REGS
		ret
_write_string	ENDP


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


_save_window	PROC	NEAR
		;
		; Input: DS:SI=Buf  BL=X  DL=W
		;	            BH=Y  DH=H
		;
		PUSH_REGS
		
		les	di, _ScreenArea
		
		WINDOW_XY
		WINDOW_WH
		
		push	es
		push	ds
		xchg	si, di
		pop	es
		pop	ds

    @@next_row:
		mov	cl, dl
		rep
		 movsw
		add	si, bx
		dec	dh
		jne	@@next_row

		POP_REGS
		ret
_save_window	ENDP



_load_window	PROC	NEAR
		;
		; Input: DS:SI=Buf  BL=X  DL=W
		;	            BH=Y  DH=H
		;
		PUSH_REGS

		les	di, _ScreenArea
		
		WINDOW_XY
		WINDOW_WH

    @@next_row:
		mov	cl, dl
		rep
		 movsw
		add	di, bx
		dec	dh
		jne	@@next_row

		POP_REGS
		ret
_load_window ENDP


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


_clear_window	PROC	NEAR
		;
		; Input: AH=Attr  BL=X  DL=W
		;	          BH=Y  DH=H
		;
		PUSH_REGS

		les	di, _ScreenArea
		
		WINDOW_XY
		WINDOW_WH

		mov	al,' '
    @@next_row:
		mov	cl, dl
		rep
		 stosw
		add	di, bx
		dec	dh
		jne	@@next_row

		POP_REGS
		ret
_clear_window	ENDP



_scroll_window	PROC	NEAR
		;
		; Input: AL=Len   BL=X  DL=W
		;	 AH=Attr  BH=Y  DH=H
		;
		PUSH_REGS

		les	di, _ScreenArea
		
		WINDOW_XY
		WINDOW_WH
		
		push	ax
		imul	Byte Ptr _ScreenWidth
		shl	ax, 1
		mov	si, di
		add	si, ax
		pop	ax
		cmp	si, di
		ja	@@scroll

		push	ax
		mov	al, dh
		dec	al
		mul	Byte Ptr _ScreenWidth
		add	di, ax
		add	si, ax
		mov	bl, dl
		shl	bx, 1
		neg	bx
		pop	ax
		neg	al

    @@scroll:
    		push	es
		pop	ds
    @@next_row:
		mov	cl, dl
		rep
		 movsw
		add	si, bx
		add	di, bx
		dec	dh
		jne	@@next_row

		mov	dh, al
		mov	al,' '
    @@clr_row:
		mov	cl, dl
		rep
		 stosw
		add	si, bx
		add	di, bx
		dec	dh
		jne	@@clr_row

		POP_REGS
		ret
_scroll_window	ENDP



_border_window	PROC	NEAR
		;
		; Input: DS:SI=Brdr  BL=X  DL=W
		;	    AH=Attr  BH=Y  DH=H
		;
		PUSH_REGS

		les	di, _ScreenArea
		
		WINDOW_XY
		WINDOW_WH

		sub	dx, 0202h

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

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

		POP_REGS
		ret
_border_window	ENDP

;----------------------------------------------------------------------
_encrypt_password	PROC	FAR
	push	bp
	mov	bp,sp
	push	ds
	push	si
	push	di

	lds	si, dword ptr [bp+6]
	mov	bx, 12345
	mov	di, 0

	jmp	@@check_cond
@@next_char:

	mov	ah, 0
	
	mov	cx, ax
	xor	cx, bx

	shl	ax, 2
	add	ax, 7
	
	shr	bx, 1
	add	bx, 3
	
	mul	bx
	add	ax, cx

	mov	bx, ax
	mov	di, ax

@@check_cond:
	lodsb
	or	al, al
	jne	@@next_char
	
	mov	ax, di

	pop	di
	pop	si
	pop	ds
	pop	bp
	retf
_encrypt_password	ENDP
;----------------------------------------------------------------------
GAP2		PROC
GAPLEN2		EQU	(ADV_CODE_SIZE-(GAP2-_ADV_MANAGER))
IF GAPLEN2
		DB	GAPLEN2 DUP(0)	
ENDIF
GAP2		ENDP
;----------------------------------------------------------------------

ADV_MAN_TEXT	ENDS

		END

⌨️ 快捷键说明

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