📄 windows.inc
字号:
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 + -