📄 manager.asm
字号:
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 + -