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

📄 windows.inc

📁 DOS下的调试工具
💻 INC
📖 第 1 页 / 共 2 页
字号:

		mov	si,di
		call	strlen

		xor	bx,bx
		xor	dx,dx
		jmp	@@next_1
@@next:
		mov	byte [string_changed],0
@@next_1:
		call	update_string
@@read:
		call	read_key
		call	check_exit_read
		jc	@@1
		jmp	@@ignore
@@1:
		cmp	ax,kbRight
		je	@@right
		cmp	ax,kbLeft
		je	@@left
		cmp	ax,kbHome
		jne	@@5
		jmp	@@home
@@5:
		cmp	ax,kbEnd
		jne	@@4
		jmp	@@end
@@4:
		cmp	ax,kbDel
		je	@@delete
		cmp	ax,kbBackSpace
		je	@@backspace
		cmp	bl,[max_str_length]		;byte!
		jae	@@next
		call	[test_char]
		jc	@@read
		cmp	byte [string_changed],1
		je	@@clear
@@cleared:
		push	cx
		mov	cx,[max_str_length]
		mov	di,[str_buffer]
		add	di,cx
		dec	di
		lea	si,[di-1]
		sub	cx,bx
		jz	@@3
		dec	cx
		std
	rep	movsb
@@3:
		cld
		mov	si,[str_buffer]
;		add	si,bx
		mov	[si+bx],al
		pop	cx
		cmp	cx,[max_str_length]
		jae	@@right
		inc	cx
@@right:
		cmp	bl,cl
		jne	@@2
@@loc_read:
		jmp	@@read
@@2:
		inc	bx
		mov	ax,bx
		sub	ax,dx
		cmp	ax,[str_length]
		jbe	@@loc_next
		inc	dx
		jmp	@@next
@@clear:
		mov	si,[str_buffer]
		mov	byte [si],0
		xor	cx,cx
		xor	bx,bx
		jmp	@@cleared
@@left:
		or	bl,bl
		je	@@loc_next
		dec	bx
		cmp	bx,dx
		jae	@@loc_next
		mov	dx,bx
@@loc_next:
		jmp	@@next
@@backspace:
		or	bx,bx
		je	@@loc_read
		dec	bx
@@delete:
		or	cx,cx
		je	@@loc_read
		cmp	bx,cx
		jae	@@loc_read
		mov	di,[str_buffer]
		add	di,bx
		lea	si,[di+1]
		push	cx
		mov	cx,[max_str_length]
		sub	cx,bx
		cld
	rep	movsb
		mov	al,0
		stosb
		pop	cx
		dec	cx
		or	dx,dx
		jz	@@loc_next
		mov	ax,cx
		sub	ax,dx
		cmp	ax,[str_length]
		jae	@@loc_next
		dec	dx
		jmp	@@next
@@home:
		xor	bx,bx
		xor	dx,dx
		jmp	@@next
@@end:
		mov	bx,cx
		cmp	bx,[str_length]
		jbe	@@loc_next
		mov	dx,bx
		sub	dx,[str_length]
		jmp	@@next

@@ignore:
;		mov	@@Result,0
;		jmp	@@Quit
@@enter:
		mov	[read_line_result],ax
@@quit:
		mov	cx,[read_line_cur]
		call	set_cursor
		mov	dx,[read_line_cur_c]
		call	gotoxy
		call	popr
		mov	ax,[read_line_result]
		ret
;=============================================================================
; update_string
;-----------------------------------------------------------------------------
; Updates string.
; In:	BX -- position of cursor
;	DX -- ???
; Out:	---
; Modf:	---
; Call:	pushr, gotoxy, popr
; Use:	str_start, video_seg, str_buffer, read_string_attr, string_changed,
;	read_string_sel_attr, str_length
;
update_string:
		call	pushr
		mov	ax,dx
		mov	dx,[str_start]
		add	dl,bl
		sub	dl,al
		inc	dl
		call	gotoxy
		mov	dx,ax
		mov	di,bp
		mov	es,[video_seg]
		mov	si,[str_buffer]
		add	si,ax
		mov	ah,[read_string_attr]
		xor	dx,dx
		mov	al,' '
		stosw
		cmp	byte [string_changed],0
		je	@@not_sel_1
		mov	ah,[read_string_sel_attr]
@@not_sel_1:
		jcxz	@@skip
		cmp	cx,[str_length]
		jbe	@@next
		mov	cx,[str_length]
@@next:
		lodsb
		stosw
		inc	dx
		loop	@@next
@@skip:
		mov	ah,[read_string_attr]
		sub	dx,[str_length]
		ja	@@quit
		mov	cx,dx
		neg	cx
		inc	cx
		mov	al,' '
	rep	stosw
@@quit:
		call	popr
		ret
;=============================================================================
; default_test_char
;-----------------------------------------------------------------------------
; ???
; In:	---
; Out:	---
; Modf:	AX, BX, CX, DX, SI, DI, BP
; Call:	---
; Use:	---
;
default_test_char:
;		cmp	al,0
;		je	@@1
;		clc
;		ret
;@@1:
;		stc
;		ret

		cmp	al,' '
		jb	@@exit
		cmp	ax,kbAltAlone
		cmc
@@exit:
		ret
;=============================================================================
; check_exit_read
;-----------------------------------------------------------------------------
; ???
; In:	---
; Out:	---
; Modf:	AX, BX, CX, DX, SI, DI, BP
; Call:	---
; Use:	---
;
check_exit_read:
		push	ax
		push	bx
		push	si
		mov	bx,ax
		mov	si,[read_exit_keys]
@@next:
		lodsw
		cmp	ax,bx
		je	@@quit
		or	ax,ax
		jnz	@@next
@@end:
		stc
@@quit:
		pop	si
		pop	bx
		pop	ax
		ret
;=============================================================================
; vert_menu
;-----------------------------------------------------------------------------
; Creates vertical menu.
; In:	AH/AL -- row/column of top left corner
;	CX -- number of items
;	BL -- normal color
;	BH -- selected color
;	DL -- selected item
;	DH -- width
;	DS:SI -> list of items (empty string -- separator)
; Out:	AL -- number of selected item:
;		>= 0 -- number of item
;		-1 -- ESC pressed
;		-2 -- Left pressed
;		-3 -- Right pressed
;	AH -- ???
; Modf:	AX
; Call:	---
; Use:	---
;
vert_menu:
		call	pushr
		push	word [keys]
		push	word [test_key]
		call	get_addr
		mov	es,[video_seg]
;		mov	bp,ax
		call	write_items
		mov	word [keys],menu_keys
		mov	word [test_key],vm_test_key
		call	key_loop
		cmp	ax,kbEsc
		je	@@cancel
		cmp	ax,kbLeft
		je	@@left
		cmp	ax,kbRight
		je	@@right
		mov	al,dl
		jmp	@@quit
@@cancel:
		mov	al,-1
@@quit:
		mov	[vert_menu_result],al
		mov	[vert_menu_result+1],dl
		pop	word [test_key]
		pop	word [keys]
		call	popr
		mov	ax,[vert_menu_result]
		ret
@@left:
		mov	al,-2
		jmp	@@quit
@@right:
		mov	al,-3
		jmp	@@quit

vert_menu_down:
		inc	dl
		cmp	dl,cl
		jb	vert_menu_ret
vert_menu_home:
		mov	dl,0
vert_menu_ret:
		jmp	write_items

vert_menu_up:
		dec	dl
		cmp	dl,-1
		jne	vert_menu_ret
vert_menu_end:
		mov	dl,cl
		dec	dl
		jmp	vert_menu_ret
;=============================================================================
; vm_test_key
;-----------------------------------------------------------------------------
; ???
; In:	---
; Out:	---
; Modf:	AX, BX, CX, DX, SI, DI, BP
; Call:	---
; Use:	---
;
vm_test_key:
		mov	al,[cur_test_code]		;byte!
		call	find_menu_letter
		jc	@@quit
		mov	dl,al
		call	write_items
		mov	ax,kbEnter
@@quit:
		ret
;=============================================================================
; write_items
;-----------------------------------------------------------------------------
; Writes item of vertical menu.
; In:	ES:BP -> top left byte of menu in video memory
;	CX -- number of items
;	BL -- normal color
;	BH -- selected color
;	DL -- selected item
;	DH -- width
;	DS:SI -> list of items (empty string -- separator)
; Out:	---
; Modf:	BX, DX, DI
; Call:	write_point
; Use:	point_options, normal_letter, accent_letter
;
write_items:
		push	ax
		push	cx
		push	si
		push	bp
		mov	al,0
@@next:
		push	cx
@@next_str:
		mov	di,bp
		mov	ah,bl
		cmp	byte [si],0
		je	@@separator
		cmp	word [point_options],0
		je	@@no_opt
		push	bx
		mov	bl,al
		mov	bh,0
		add	bx,bx
		add	bx,bx
		add	bx,[point_options]
		test	byte [bx],DISABLED
		pop	bx
		jz	@@no_opt
		mov	ch,atMenuNormDis
		mov	ah,atMenuNormDis
		cmp	al,dl
		jne	@@write
		mov	ch,atMenuSelDis
		mov	ah,atMenuSelDis
		jmp	@@write
@@no_opt:
;;;;		mov	ch,[normal_letter]
		mov	ch,atMenuNormHot	;;;;
		cmp	al,dl
		jne	@@write
		mov	ah,bh
;;;;		mov	ch,[accent_letter]
		mov	ch,atMenuSelHot		;;;;
@@write:
		call	write_point
		add	bp,160
		inc	ax
		pop	cx
		loop	@@next

		pop	bp
		pop	si
		pop	cx
		pop	ax
		ret

@@separator:
;-----------------------------------------------------------------------------
; Write separator.
;  Borland-style:	Norton-style:
;  (old, as in TC 2.01)
;       . . . 		     . . .
;  

⌨️ 快捷键说明

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