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

📄 sdmisc.asm

📁 <BIOS研发技术剖析>书的源代码,包括完整的BIOS汇编语言源程序.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;		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 + -