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

📄 tskstub.asm

📁 一个多任务操作系统CTask的源代码 用C语言编写
💻 ASM
字号:
;
;	--- Version 2.2 90-11-22 12:12 ---
;
;	CTask - Code sharing function stubs
;
;	Public Domain Software written by
;		Thomas Wagner
;		Ferrari electronic Gmbh
;		Beusselstrasse 27
;		D-1000 Berlin 21
;		Germany
;
;	This file is new with version 2.1.
;	It is used to generate the function entry stubs to allow
;	applications to share the code of the first, resident,
;	CTask invocation.
;
;	Two object files are generated from this source:
;
;	If GEN_JTAB is defined on assembly, an entry address table is 
;	generated that is to be linked with the primary invocation.
;
;	If no Define is given on assembly, the function stubs for the 
;	application are generated.
;
;	There are two macros, 'stub' and 'dstub'. The 'stub' macro
;	creates an actual entry/external, whereas the 'dstub' macro
;	only creates a dummy table entry, and no public label.
;
;	You should define all entries you are using anyway in your
;	primary invocation with 'stub'.
;	Functions that are not used in either primary or secondary
;	may be defined with 'dstub'.
;	YOU SHOULD NOT delete entries or change the order of entries.
;
;	It is possible to have a mix of code sharing and locally loaded
;	routines in an application. The routines in tskmain.c and tsksub.c
;	should, however, always be enabled with 'stub', since they are always
;	included in the primary, and could cause problems when directly
;	linked.
;
;	CAUTION: The application may use small model, i.e. near entries
;		 into the stub table. The NEAR_CODE define may be
;		 set to 1 when compiling this module for the application.
;
;		 The primary kernel MUST use far routines for code
;		 sharing to work, and the entry points must load DS on
;		 entry.
;
	include	tsk.mac
;
	.tsk_model
;
;
	IFDEF	GEN_JTAB
	public	tsk_jmptab
	ENDIF
;
nstubs	=	0
;
stub	macro	extn,ccc
	IFNB	<ccc>
	IFDEF	GEN_JTAB
	CGlbext	extn
	ELSE
	CPubfnc	extn
	ENDIF
	ELSE
	IFDEF	GEN_JTAB
	Globext	extn
	ELSE
	Pubfunc	extn
	ENDIF
	ENDIF
	IF1
estr	catstr	<stb>,%nstubs
% estr	equ	<extn>
	ENDIF
nstubs	=	nstubs+1
	endm
;
dstub	macro	extn
nstubs	=	nstubs+1
	endm
;
;------------------------------------------------------------------
;
;	The routines from the module
;		tskres
;	must be linked directly, since they establish the
;	stub linkage.
;
;	The routines from the modules
;		tskmain
;		tskgrp
;	must not be defined as function stubs. Those routines
;	need local routine/variable info, and thus must be linked
;	with the secondary invocation. For secondary invocations
;	not creating groups, the routines defined there are not needed
;	anyway.
;
;	The local routines defined in
;		tsksub
;		tskque
;	are normally defined as 'near'. Including those routines
;	into the stub list would require them to be defined as
;	far _loadds (Huge for TC). This would slow down the most basic
;	operations, and is not recommended.
;
;------------------------------------------------------------------
;
;	The following entries should always be 'stub', not 'dstub',
;	since they are in the primary anyway.
;
;	module tskinst
;
	stub	tsk_install_main
	stub	tsk_remove_chain
	stub	tsk_remove_tasker
;
;	module tskutil
;
	stub	preempt_on
	stub	preempt_off
	stub	tsk_ena_preempt
	stub	tsk_dis_preempt
	stub	t_delay
;
;	module tsktask
;
	stub	create_task
	stub	kill_task
	stub	start_task
	stub	wake_task
;
;	module tskasm
;
	stub	schedule
	stub	tsk_scheduler
	stub	yield
	stub	tsk_dis_int
	stub	tsk_ena_int
	stub	tsk_nop
	stub	tsk_inpw
	stub	tsk_flags
	stub	tsk_dseg
	stub	tsk_callfunc
	stub	tsk_memcpy
;
;-------------------------------------------------------------------
;
;	The following functions may be either 'stub' or 'dstub',
;	but are normally used by kernel routines anyway, so you can
;	keep them as 'stub'.
;
;	module tskrsc
;	Resources are used in the DOS module
;
	stub	create_resource
	stub	delete_resource
	stub	release_resource
	stub	request_resource
	stub	request_cresource
	stub	c_request_resource
	stub	c_request_cresource
	stub	check_resource
;
;	module tskflg
;	Flags are in the DOS module, too
;
	stub	create_flag
	stub	delete_flag
	stub	set_flag
	stub	clear_flag
	stub	clear_flag_wait_set
	stub	wait_flag_set
	stub	wait_flag_clear
	stub	check_flag
;
;	module tskcnt
;	Counters are used for the timer tasks
;
	stub	create_counter
	stub	delete_counter
	stub	clear_counter
	stub	wait_counter_set
	stub	wait_counter_clear
	stub	inc_counter
	stub	dec_counter
	stub	set_counter
	stub	check_counter
;
;-------------------------------------------------------------------
;
;	The following functions may be either 'stub' or 'dstub'.
;	They are not referenced by kernel routines, but if you have
;	them in the primary, you can keep them as 'stub'.
;
;	module tskname
;
	dstub	find_group_name
	dstub	find_name
;
;	module tsksec
;
	dstub	tsk_free_mem
	dstub	tsk_getpsp
	dstub	t_read_key
	dstub	t_wait_key
	dstub	t_keyhit
;
;	module tsktutl
;
	dstub	get_priority
	dstub	set_priority
	dstub	set_funcs
	dstub	set_user_ptr
	dstub	get_user_ptr
	dstub	curr_task
	dstub	stop_task
;
;	module tsktops
;
	dstub	create_timer,c
	dstub	delete_timer
	dstub	change_timer,c
;
;	module tsktsub
;
	dstub	delete_watch
;
;	module tskmemw
;
	dstub	create_memory_watch,c
	dstub	wait_memory
;
;	module tskporw
;
	dstub	create_port_watch,c
	dstub	wait_port
;
;	module tskhot
;
	dstub	create_hotkey_entry,c
	dstub	wait_hotkey
;
;	module	tskmail
;
	stub	create_mailbox
	stub	delete_mailbox
	stub	send_mail
	stub	wait_mail
	stub	c_wait_mail
	stub	check_mailbox
;
;	module	tskpip
;
	dstub	create_pipe
	dstub	delete_pipe
	dstub	read_pipe
	dstub	c_read_pipe
	dstub	write_pipe
	dstub	c_write_pipe
	dstub	wait_pipe_empty
	dstub	check_pipe
	dstub	pipe_free
	dstub	flush_pipe
;
;	module	tskwpip
;
	dstub	create_wpipe
	dstub	delete_wpipe
	dstub	read_wpipe
	dstub	c_read_wpipe
	dstub	write_wpipe
	dstub	c_write_wpipe
	dstub	wait_wpipe_empty
	dstub	check_wpipe
	dstub	wpipe_free
	dstub	flush_wpipe
;
;	module	tskbuf
;
	dstub	create_buffer
	dstub	delete_buffer
	dstub	read_buffer
	dstub	c_read_buffer
	dstub	write_buffer
	dstub	c_write_buffer
	dstub	check_buffer
;
;	module	tsktick
;
	dstub	create_ticker
	dstub	delete_ticker
	dstub	set_ticker
	dstub	get_ticker
;
;-------------------------------------------------------------------
;
	IFNDEF	GEN_JTAB
	.tsk_data
	extrn	tsk_global: dword
;
	.tsk_edata
	ENDIF
	.tsk_code
;
nstb	=	0
;
	IFDEF	GEN_JTAB
;
;	The 'fault' entry just does an INT 3, which breaks to a debugger
;	if one is installed. If no debugger is running, you're out of luck.
;	But... you should never get here unless you have different 
;	stub/dstub combinations in primary and secondary.
;
@fault	proc	far
	int	3
	ret
@fault	endp
;
;
tsk_jmptab	label	dword
	ENDIF
;
	rept	nstubs
estr	catstr	<stb>,%nstb
	IFDEF	GEN_JTAB
%	IFDEF	estr
	dd	estr
	ELSE
	dd	@fault
	ENDIF
	ELSE
	IFDEF	estr
% estr:
	IF	NEAR_CODE
	pop	bx
	push	cs
	push	bx
	ENDIF
	IFDEF	LOAD_DS
	mov	bx,@CTASK_DATA
	mov	es,bx
	les	bx,es:tsk_global
	ELSE
	les	bx,tsk_global
	ENDIF
	les	bx,es:stub_table[bx]
	jmp	dword ptr es:[bx+(nstb*4)]
	ENDIF
	ENDIF
nstb	=	nstb+1
	endm
;
	.tsk_ecode
	end

⌨️ 快捷键说明

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