📄 sdmisc.asm
字号:
; 3 - Write Precomp ;
; 4 - Sector ;
; bx Drive ID ;
; dx New value ;
;---------------------------------------;
SetUserHdd proc near
mov si,offset FieldTbl+1 ; Field width table
mov bl,cs:_Type47Loc[bx] ; type 47 area offset
sub bx,2
BuildBL:
add bl,cs:[si-1] ; Forward pointer
mov ah,cs:[si] ; Keep current field width
inc si ; Next table pointer
dec al
jnz BuildBL
;;;; mov byte ptr _cmos[bx],cl ; BUG should be DL..01/23/96
mov byte ptr _cmos[bx],dl
inc bx
cmp ah,1 ; Byte or word ?
jz RetMT47 ; Yes, done
;;;; mov byte ptr _cmos[bx],ch ; else move upper byte..BUG should be DH..01/23/96
mov byte ptr _cmos[bx],dh ; else move upper byte
RetMT47:
ret
SetUserHdd endp
;---------------------------------------;
; DetectIDE ;
; Input : ;
; ax Drive ID ;
; bx Scratch Buffer ;
;---------------------------------------;
DetectIDE proc near
mov di,cgroup:ide_prim_base_addr
cmp al,02h
jb hd_prim_sec
mov di,cgroup:ide_sec_base_addr
hd_prim_sec:
and al,01h
add al,80h
mov dl,al ; DL = drive# 80h/81h
; DI = base address..DL = drive# 80h/81h
mov si,40*4 ; maxm wait time 40secs
push ds
pop es ; ES:BX ptr to buffer
mov cl,0ffh ; CX <> 0000, invoked from setup
call auto_hd_type ; ES:BX has scrach buffer address
;;;; mov al,0
;;;; jc hd_ret
;;;; inc al
;;;;hd_ret:
ret
DetectIDE endp
;---------------------------------------;
_AdvIdeLocn label byte
db adv_ide_c ; for prim master
db adv_ide_d ; for prim slave
db adv_ide_e ; for sec master
db adv_ide_f ; for sec slave
;---------------------------------------;
; UpdateIDEParams ;
; This routine updates the enhenaced ;
; parameters in cmos buffer. ;
; Input : ;
; al 0/1/2/3 for C:/D:/E:/F: ;
; es:bx ptr to buffer having ;
; info from identify drive;
; command ;
; output: ;
; none ;
; register destroyed..NONE ;
;---------------------------------------;
UpdateIDEParams proc near
pusha
push bx
mov bx,offset cgroup:_AdvIdeLocn
xlat cgroup:_AdvIdeLocn ; AL = cmos register used
pop bx
movzx di,al
add di,offset _cmos ; DI = ptr to cmos buffer offset
xor cl,cl ; form info in CL
test es:byte ptr [bx+2*49+1],02h; bit-1 = 0/1..LBA not/yes supported
jz lba_mode ; LBA mot supported
or cl,lba_bit ; indicate LBA supported
lba_mode:
cmp es:byte ptr [bx+2*47],00h; #of sectors per interrupt = 00 ?
jz block_mode ; yes..so block mode not supported
or cl,block_bit ; indicate block mode supported
block_mode:
push cx
call get_pio_mode_value ; BL = mode value
pop cx
inc bl
cmp bl,06h
jbe bm_00
mov bl,06h
bm_00:
shl bl,pio_shift ; proper bit posn
or cl,bl
and byte ptr [di],bit32_bit ; keep 32bit info
or byte ptr [di],cl ; update other info
popa
ret
UpdateIDEParams endp
;---------------------------------------;
; Verify_Password ;
; Input : ;
; al 0..supervisor password ;
; 1..user password ;
; ds:bx ptr to buffer ;
; Output: ;
; al = 00 match ;
; <>00 not match ;
; register destroyed : AX ;
;---------------------------------------;
verify_password proc near
pusha
push bx
mov si,bx ; DS:SI = ptr to given buffer
call buffer_password_length ; CX = entered password length
push cx ; save entered password length
mov si,offset _common_cmos_buffer+38h; supervisor password
or al,al
jz vp_00
mov si,offset _common_cmos_buffer+4ch; user password
vp_00:
push si
call buffer_password_length ; CX = installed password length
pop di ; DS:DI = ptr to installed encoded password
pop dx ; DX = entered password length
pop si ; DS:SI = ptr to entered ASCIIZ password
cmp cx,dx
jnz vp_01 ; length mismatch..so error
jcxz vp_01 ; length match and length = 0..so ok
; installed and entered password length same..verify the password..
; DS:DI = ptr to buffer of installed encoded password..
; DS:SI = prt to buffer of entered ASCIIZ password..
; CX = length of password..
mov bl,80h ; start seed
vp_03:
lodsb ; get next byte of entered password ASCII char
call ascii_to_scan ; AL = scan code
call get_bl_al ; BL = encoded value
inc di
cmp bl,[di-1]
loopz vp_03
vp_01:
popa
mov al,00h
jz vp_02 ; ok
not al
vp_02:
ret
verify_password endp
;---------------------------------------;
; Set_Password ;
; Input : ;
; al 0..supervisor password ;
; 1..user password ;
; ds:bx ptr to asciiz password ;
; string ;
;---------------------------------------;
set_password proc near
push es
pusha
mov si,bx ; DS:SI = ptr to source buffer
push ds
pop es
mov di,offset _common_cmos_buffer+38h; ES:DI = ptr to destn buffer
; of supervisor password
or al,al
jz sp_00
mov di,offset _common_cmos_buffer+4ch; ES:DI = ptr to destn buffer
; of user password
sp_00:
mov cx,06h ; maxm length of password
mov bl,80h ; start seed
sp_03:
lodsb ; get next ascii char
or al,al
jz sp_01 ; end of password
call ascii_to_scan
call get_bl_al ; BL = encoded value
mov al,bl
sp_01:
stosb
or al,al
loopnz sp_03
sp_02:
popa
pop es
ret
set_password endp
;---------------------------------------;
; ASCII_TO_SCAN ;
; this routine returns the scan code of;
; the given ascii code. ;
; input : ;
; al ascii code ;
; output: ;
; al scan code ;
; register destroyed..AX ;
;---------------------------------------;
public ascii_to_scan
ascii_to_scan:
; AL = ASCII code..convert it to lower case ascii if alphabet..
cmp al,'A'
jb epp_03 ; not alpha
cmp al,'Z'
ja epp_03 ; not alpha
add al,20h ; lower case ascii code
epp_03:
; get scan code from ASCII..
push cx
push si
mov cx,80h
mov ah,al ; AH = ascii
mov si,offset cgroup:base_tbl; table in INT-9.ASM
epp_02:
db 2eh
lodsb ; get next ascii from table
cmp al,ah ; match ?
loopnz epp_02 ; continue till end
sub cx,80h
neg cx
mov al,cl
pop si
pop cx
ret
;---------------------------------------;
; STANDARD_SETUP_INIT ;
; this routine is called from ;
; _FILL_CMOS_BUFFER routine ;
;---------------------------------------;
public standard_setup_init
standard_setup_init proc near
cli
mov ax,268ah ; initialize status A register
call cmos_data_out
mov ax,8b8bh ; status register B
call cmos_data_in
and al,00000001b ; day light saving bit
or al,00000010b
xchg al,ah ; initialize status B register
call cmos_data_out
mov al,8dh ; initialize status D register
call cmos_data_in
mov al,8ch ; initialize status C register
call cmos_data_in
sti
;---------------------------------------;
; READ/WRITE CURRENT DATE ;
;---------------------------------------;
call read_date
mov ah,05h ; set current date
int 1ah
;---------------------------------------;
; READ/WRITE CURRENT TIME ;
;---------------------------------------;
call read_time
mov ah,03h ; set current time
int 1ah
;---------------------------------------;
; SET IPL BIT, RESERVED BITS ;
;---------------------------------------;
mov bx,offset _common_cmos_buffer
or byte ptr [bx+equipment],00000001b
;---------------------------------------;
; BASE MEMORY ADJUST ;
;---------------------------------------;
push ds
xor ax,ax
mov ds,ax
mov ax,ds:[413h]
cmp ds:byte ptr [0472h],'H' ; hot key setup ?
pop ds
jz skip_adjust
mov [bx+base_mem_low],ax ; store base memory size
;---------------------------------------;
; EXTD MEMORY ADJUST ;
;---------------------------------------;
cli
mov ax,3031h ; low_ext_mem_addr*256+high_ext_mem_addr
call read_cmos_word ; read extd memory
mov [bx+expn_mem_low],ax ; store extd. memory size
mov ax,3536h ; low_ext_mem_64_addr*256+high_ext_mem_64_addr
call read_cmos_word ; read extd memory
mov [bx+expn_mem_low_64],ax ; store extd. memory size (unit 64k)
sti
skip_adjust:
;---------------------------------------;
; DISPLAY TYPE SETTING ;
;---------------------------------------;
test byte ptr [bx+equipment],00111000b; display installed ?
jz vdo_3
push ds
xor ax,ax
mov ds,ax
int 11h ; display info from equipment byte
cmp ds:word ptr [42h],0c800h; INT-10 segment
jb vdo_1 ; EGA/VGA at C000 - C800
cmp ds:word ptr [42h],0e000h; INT-10 segment
jb vdo_2 ; not EGA/VGA
cmp ds:word ptr [42h],0f000h; INT-10 segment
jae vdo_2 ; video ROM absent
vdo_1:
mov al,00000000b
vdo_2:
pop ds
and al,00110000b ; display type
or al,00001000b ; make display installed
and byte ptr [bx+equipment],11001111b
or [bx+equipment],al
vdo_3:
ret
standard_setup_init endp
;---------------------------------------;
; READ DATE ROUTINE ;
;---------------------------------------;
public read_date
read_date:
mov ah,04h
int 1ah ; read date
jnb cal_1_x ; (dh) = month
mov ah,04h ; (dl) = day
int 1ah ; (cx) = year
cal_1_x:
mov ax,cx
call check_bcd
jnb cal_1 ; error
cmp ax,1901h
jb cal_1 ; error
cmp ax,2099h
ja cal_1 ; error
mov ax,dx
call check_bcd
jnb cal_1 ; error
or al,al
jz cal_1 ; error
or ah,ah
jz cal_1 ; error
cmp ah,12h
ja cal_1 ; error
cmp al,31h
jbe cal_2
cal_1:
%out === Modify default year/date here ===
mov cx,1999h ; 1980h 08/06/96
mov dx,0301h
cal_2:
ret
;---------------------------------------;
; READ TIME ROUTINE ;
;---------------------------------------;
public read_time
read_time:
mov ah,02h
int 1ah
jnb time_0 ; (ch) = HH
mov ah,02h ; (cl) = MM
int 1ah ; (dh) = SS
time_0:
mov ax,cx
call check_bcd
jnb time_1 ; error
cmp ah,23h
ja time_1 ; error
cmp al,59h
ja time_1 ; error
mov al,dh
call check_bcd
jnb time_1 ; error
cmp al,59h
jbe time_2
time_1:
xor cx,cx ; time = 00:00:00
xor dx,dx
time_2:
ret
;---------------------------------------;
; CHECK BCD NUMBERS OF DATE/TIME ;
;---------------------------------------;
check_bcd:
push ax
and ax,0f0fh
cmp al,0ah
jae bcd_exit
cmp ah,0ah
jae bcd_exit
pop ax
push ax
and ax,0f0f0h
cmp al,0a0h
jae bcd_exit
cmp ah,0a0h
bcd_exit:
pop ax
ret
;---------------------------------------;
;*****************************************************************;
;*****************************************************************;
;** **;
;** (C)Copyright 1985-1999, American Megatrends Inc. **;
;** **;
;** All Rights Reserved. **;
;** **;
;** 6145-F, Northbelt Parkway, Norcross, **;
;** **;
;** Georgia - 30071, USA. Phone-(770)-246-8600. **;
;** **;
;*****************************************************************;
;*****************************************************************;
_text ends
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -