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

📄 tskbios.asm

📁 一个可以立即使用的嵌入式操作系统
💻 ASM
字号:
;
;	--- Version 2.2 93-06-08 10:17 ---
;
;	CTask - BIOS INT 15 interrupt handler (IBM AT specific)
;
;	Public Domain Software written by
;		Thomas Wagner
;		Ferrari electronic Gmbh
;		Beusselstrasse 27
;		D-1000 Berlin 21
;		Germany
;
;	NOTE:   Support for printer output busy has been dropped in
;		version 1.2. Depending on the speed of the driving
;		program, the old algorithm (which used a timed delay)
;		could cause the printer to slow down to an unbearable
;		crawl, and there is little chance for a clean solution
;		here, since there is not enough info on the printer
;		passed to INT 15.
;		Instead, an INT 17 replacement that schedules while 
;		waiting on the printer has been added (module tskint17.asm).
;
;	CAUTION: This module can only be installed in the primary kernel.
;		 It is not ROMable.
;
	name	tskbios
;
	include	tsk.mac
;
	.tsk_model
;
	Pubfunc	tsk_install_bios
	Pubfunc	tsk_remove_bios
;
	Globext	clear_flag
	Globext	wait_flag_set
	Globext	set_flag
        Globext	create_flag
        Globext	delete_flag
        Globext	t_delay
	Locext	tsk_switch_stack
;
	extrn	tsk_glob_rec: word	; global_rec
;
;
intseg	segment at 0
;
		org	15h*4
pintofs		dw	?		; interrupt entry
pintseg		dw	?

intseg	ends
;
;
	.tsk_data
;
floppy  flag    <>
fdisk   flag    <>
kbd     flag    <>
;
flag_tab	label	word
	dw	offset fdisk
	dw	offset floppy
	dw	offset kbd
;
	IF	TSK_NAMEPAR
fflname	db	"WFLEXDSK",0
ffdname	db	"WHARDDSK",0
fkbname	db	"WKBDPOST",0
	ENDIF
;
	.tsk_edata
	.tsk_code
;
;
post_save	label	dword		; in CSEG to allow addressing
psofs		dw	?
psseg		dw	?
;
;----------------------------------------------------------------------
;
;	interrupt handler
;
@bios_int	proc	far
        pushf
	sti
        cmp     ah,90h			; WAIT
        jb      bios_pass
        cmp     ah,91h			; POST
        ja	bios_pass
	cmp	al,2			; fdisk/floppy/keyboard
        jbe	process_bios
	cmp	al,0fdh			; floppy motor
        je	process_bios
;
bios_pass:
	popf
	jmp	cs:post_save
;
;
process_bios:
	popf
	call	tsk_switch_stack
	stc_saved			; Carry set on return
;
	cmp	al,2
	jbe	flag_ops
;
;	Wait for diskette motor start (1 sec.)
;
wait_motor:
	IF	CLOCK_MSEC
	callp	t_delay,<<0,1000>>
	ELSE
	callp	t_delay,<<0,tsk_glob_rec.ticks_per_sec>>
	ENDIF
	iret
;
;	Floppy/Fdisk/Keyboard wait/post
;
flag_ops:
	xor	bh,bh
	mov	bl,al	
	add	bx,bx
	mov	bx,flag_tab[bx]		; load appropriate flag
	cmp	ah,90h
	je	fl_wait			; jump if wait op
	callp	set_flag,<<ds,bx>>	; set flag: complete
	clc_saved			; carry clear on return
	iret
;
; Note: Version 2.1 includes the following fix provided by S. Worthington:
;
; When using a very fast hard disk controller (especially one with
; onboard cache or the new AT bus type controllers), it is possible to
; get the hard disk ready interrupt "posted" BEFORE the call to "wait"
; reaches the "call clear_flag_wait_set"  instruction.  This results in
; a long disk timeout and an error return.  The fix is to use a
; "wait_flag_set" followed by a "clear_flag" to replace the
; "clear_flag_wait_set".  Even though there is still a gap between the
; wait and clear, it is not possible to get a "post" in this gap since
; "upper_dos" is still locked, preventing the start of a new disk I/O.
;	
fl_wait:
	xor	dx,dx
	cmp	al,2
	je	fl_dowait		; no timeout if AL=2 (Keyboard)
	IF	CLOCK_MSEC
	mov	dx,1000
	ELSE
	mov	dx,tsk_glob_rec.ticks_per_sec
	ENDIF
	add	dx,dx			; two seconds
	cmp	al,1
	je	fl_dowait		; 2 sec timeout if AL=1 (Diskette)
	mov	cx,dx
	add	dx,cx
	add	dx,cx			; 6 sec timeout for Harddisk
fl_dowait:
	push	bx
	callp	wait_flag_set,<<ds,bx>,<0,dx>> ; Wait for event
	or	ax,ax
	jnz	flw_ret			; keep carry set if timeout
	clc_saved			; else return with carry clear
flw_ret:
	pop	bx
	callp	clear_flag,<<ds,bx>>
	iret
;
@bios_int       endp
;
;------------------------------------------------------------------------
;
;	void far tsk_remove_bios (void)
;
;	This routine un-installs the int handler.
;
Localfunc tsk_remove_bios
;
	IFDEF	LOAD_DS
	push	ds
	mov	ax,@CTASK_DATA
	mov	ds,ax
	ENDIF
;
	push	es
	xor	ax,ax
	mov	es,ax
	assume	es:intseg
        cli
	mov	ax,cs:psofs		; restore vector
	mov	pintofs,ax
	mov	ax,cs:psseg
	mov	pintseg,ax
        sti
	assume	es:nothing
	pop	es
;
        callp   delete_flag,<<ds,#floppy>>
        callp   delete_flag,<<ds,#fdisk>>
        callp   delete_flag,<<ds,#kbd>>
;
	IFDEF	LOAD_DS
	pop	ds
	ENDIF
        ret
;
tsk_remove_bios	endp
;
;----------------------------------------------------------------------
;
;	void far tsk_install_bios (void)
;
;	This routine installs the int handler.
;
Localfunc tsk_install_bios
;
	IFDEF	LOAD_DS
	push	ds
	mov	ax,@CTASK_DATA
	mov	ds,ax
	ENDIF
;
	IF	TSK_NAMEPAR
        callp   create_flag,<<ds,#floppy>,<ds,#fflname>>
	ELSE
        callp   create_flag,<<ds,#floppy>>
	ENDIF
;
	IF	TSK_NAMEPAR
        callp   create_flag,<<ds,#fdisk>,<ds,#ffdname>>
	ELSE
        callp   create_flag,<<ds,#fdisk>>
	ENDIF
;
	IF	TSK_NAMEPAR
        callp   create_flag,<<ds,#kbd>,<ds,#fkbname>>
	ELSE
        callp   create_flag,<<ds,#kbd>>
	ENDIF
;
        push    es
	xor	ax,ax
	mov	es,ax			; establish addressing for intseg
	assume	es:intseg
;
	mov	ax,pintofs		; save old timer int addr
	mov	psofs,ax
	mov	ax,pintseg
	mov	psseg,ax
	cli
	mov	pintofs,offset @bios_int ; set new timer int addr
	mov	pintseg,cs
	sti
	assume	es:nothing
        pop     es
	IFDEF	LOAD_DS
	pop	ds
	ENDIF
	ret
;
tsk_install_bios	endp
;
	.tsk_ecode
	end

⌨️ 快捷键说明

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