?? tsk.mac
字號:
;
; --- Version 2.2 93-06-08 10:16 ---
;
; CTask - Definitions for assembler routines
;
; Public Domain Software written by
; Thomas Wagner
; Ferrari electronic Gmbh
; Beusselstrasse 27
; D-1000 Berlin 21
; Germany
;
; The configuration definitions were moved to the combined
; C/Assembler include file "tskconf.h" in version 2.1.
;
IFDEF BC_HUGE
TC_HUGE = 1
ENDIF
;
include tskconf.h
;
;-------------------------------------------------------------------
;
TIMEOUT = -1
WAKE = -2
WATCH = -3
;
; Task states
;
ST_KILLED = 0
ST_STOPPED = 1
ST_DELAYED = 2
ST_WAITING = 3
ST_ELIGIBLE = 4
ST_RUNNING = 5
;
; Task flags
;
F_TEMP = 80h ; Task is temporary
F_STTEMP = 40h ; Task stack is temporary, free on kill
F_PERM = 20h ; Task is a permanent system task
F_USES_NDP = 02h ; Task uses NDP
F_CRIT = 01h ; Task is critical, may not be preempted
;
FL_SYSM = 0f0h ; Mask for system flags
FL_USRM = 00fh ; Mask for user flags
;
; Timer queue element action kinds (upper nibble of elkind)
;
TELEM_TIMER = 10h ; Timeout element
TELEM_MEM = 20h ; Memory watch element
TELEM_PORT = 30h ; Port watch element
TELEM_HOTKEY = 40h ; Hotkey element
;
; Timer watch element comparison kinds (lower nibble of elkind)
;
TCMP_EQ = 1 ; Equal
TCMP_NE = 2 ; Not Equal
TCMP_GE = 3 ; Greater or Equal (unsigned)
TCMP_LE = 4 ; Less or Equal (unsigned)
TCMP_GES = 5 ; Greater or Equal (signed)
TCMP_LES = 6 ; Less or Equal (signed)
TCMP_CHG = 7 ; Change in value
;
; Timer queue element control structure pointer kinds
;
TKIND_TASK = 1 ; tcbptr, Wakeup associated task
TKIND_WAKE = 2 ; tcbptr, but not same task
TKIND_PROC = 3 ; call function
TKIND_FLAG = 4 ; flagptr, set flag
TKIND_COUNTER = 5 ; counterptr, increment counter
TKIND_COUNTDEC = 6 ; counterptr, decrement counter
;
; Timer queue element flags
;
TFLAG_BUSY = 01h ; Timer task is busy processing element
TFLAG_ENQUEUE = 02h ; Enqueue after processing
TFLAG_UNQUEUE = 04h ; Don't enqueue after processing
TFLAG_REMOVE = 08h ; Free element after processing
TFLAG_REPEAT = 40h ; Bit set signals repeat processing
TFLAG_TEMP = 80h ; Bit set means temporary element
;
; Name link and queue head structure types
;
Q_HEAD = 80h ; Queue head flag
;
TYP_GROUP = 0
TYP_TCB = 1
TYP_FLAG = 2
TYP_RESOURCE = 3
TYP_COUNTER = 4
TYP_MAILBOX = 5
TYP_PIPE = 6
TYP_WPIPE = 7
TYP_BUFFER = 8
TYP_TIMER = 9
TYP_WATCH = 10
TYP_HOTKEY = 11
;
NAMELENGTH = 9
;
; Installation flags
;
IFL_VIDEO = 0001h ; Install INT 10 access resource
IFL_DISK = 0002h ; Install INT 13 access resource
IFL_INT8_DIR = 0004h ; Call original INT 8 directly
IFL_PRINTER = 0008h ; Install INT 17 handler
IFL_INT15 = 0010h ; Install IBM-AT INT 15 handler
IFL_NODOSVARS = 0020h ; Don't swap DOS variables
IFL_NOEXITCHECK = 0040h ; Don't check for premature exit
;
IFL_STD = (IFL_DISK OR IFL_PRINTER OR IFL_INT15)
;
; Size of the DOS variable swap area plus 8 bytes.
;
DOSSWAPSIZE = 30h
;
ndp_rec struc
control87 dw ?
status87 dw ?
tag87 dw ?
iplo87 dw ?
iphi87_opcode87 dw ?
opaddrlo87 dw ?
opaddrhi87_null dw ?
ndp_st0 dt ?
ndp_st1 dt ?
ndp_st2 dt ?
ndp_st3 dt ?
ndp_st4 dt ?
ndp_st5 dt ?
ndp_st6 dt ?
ndp_st7 dt ?
ndp_rec ends
;
callchain struc
cc_next dd ?
cc_func dd ?
cc_user_ptr dd ?
cc_flags db ?
callchain ends
;
qelem_pri struc
q_prior dw ?
q_ini_prior dw ?
qelem_pri ends
;
qelem_ticks struc
q_ticks dd ?
qelem_ticks ends
;
queue_rec struc
q_next dd ?
q_prev dd ?
q_kind db ?
q_el db TYPE qelem_pri dup(?)
queue_rec ends
;
queue_head struc
q_first dd ?
q_last dd ?
db ?
queue_head ends
;
;
namerec struc
;
nlist db TYPE queue_head dup(?)
nstrucp dd ?
nname db NAMELENGTH dup(?)
;
namerec ends
;
;
tlink_rec struc
;
tlink db TYPE queue_rec dup(?)
tlnext dd ? ; timer task temp chain
strucp dd ? ; structure pointer
tuserp dd ? ; user parameter
IF GROUPS
tchain db TYPE queue_head dup(?) ; timer element chain
ENDIF
telem db 8 dup(?) ; timeout element (union)
elkind db ? ; element kind
struckind db ? ; structure kind
tflags db ? ; timer flags
;
tlink_rec ends
;
;
tcb struc
;
cqueue db TYPE queue_rec dup(?)
qhead dd ?
stkbot dd ? ; stack bottom
state db ? ; task state
flags db ? ; task flags
;
t_sp dw ?
t_ss dw ?
t_ax dw ?
t_cx dw ?
t_dx dw ?
t_si dw ?
t_di dw ?
t_bp dw ?
t_es dw ?
t_ds dw ?
;
timerq db TYPE tlink_rec dup(?)
retptr dd ? ; return value pointer
retsize dw ? ; return value size
;
save_func dd ?
rest_func dd ?
user_ptr dd ?
;
IF GROUPS
tgroup dd ? ; group control block pointer
homegroup dd ? ; group control block pointer
ENDIF
IF DOS
sched_ent_func dd ?
t_indos db ? ; in-dos flags
t_new db ? ; new task flag
;
; caution: don't change the order of the following 3 items!
base_psp dw ? ; base PSP segment address
psp_sssp dd ? ; PSP ss:sp save area
t_swap_area db DOSSWAPSIZE dup(?) ; save area for DOS-vars & Int23/24
ENDIF
;
IF TSK_NAMED
tname db TYPE namerec dup(?)
ENDIF
IF EMS
t_ems_map db EMS_SAVE_SIZE dup(?)
ENDIF
IF NDP
ndpsave db TYPE ndp_rec dup(?)
ENDIF
;
tcb ends
;
;
gcb struc
;
ghome dd ?
glevel dd ?
gbranch dd ?
gcreator dd ?
grp_exit_addr dd ?
gcreate_psp dw ?
gsave_psp dw ?
gsave_sssp dd ?
gnamelist db TYPE namerec dup(?)
gmain_ptr dd ?
gremove dd ?
IF GROUPS
gtelem_list db TYPE queue_head dup(?)
gticker_list db TYPE queue_head dup(?)
ENDIF
;
IF TSK_DYNAMIC
gpalloc dd ?
gpfree dd ?
ENDIF
gcb ends
;
;
flag struc
;
fwait_set db TYPE queue_head dup(?)
fwait_clear db TYPE queue_head dup(?)
fstate dw ?
IF TSK_DYNAMIC
flflags db ?
ENDIF
IF TSK_NAMED
fname db TYPE namerec dup(?)
ENDIF
;
flag ends
;
;
counter struc
;
cwait_set db TYPE queue_head dup(?)
cwait_clear db TYPE queue_head dup(?)
cstate dd ?
;
IF TSK_DYNAMIC
ctflags db ?
ENDIF
IF TSK_NAMED
ctname db TYPE namerec dup(?)
ENDIF
counter ends
;
;
resource struc
;
rwaiting db TYPE queue_head dup(?)
rowner dd ?
rcount dw ?
;
IF TSK_DYNAMIC
rsflags db ?
ENDIF
IF TSK_NAMED
rsname db TYPE namerec dup(?)
ENDIF
resource ends
;
;
mailbox struc
;
mwaiting db TYPE queue_head dup(?)
mail_first dd ?
mail_last dd ?
;
IF TSK_DYNAMIC
mbflags db ?
ENDIF
IF TSK_NAMED
mbname db TYPE namerec dup(?)
ENDIF
mailbox ends
;
;
pipe struc
;
pwait_read db TYPE queue_head dup(?)
pwait_write db TYPE queue_head dup(?)
pwait_clear db TYPE queue_head dup(?)
pbufsize dw ?
pfilled dw ?
pinptr dw ?
poutptr dw ?
pcontents dd ?
;
IF TSK_DYNAMIC
ppflags db ?
ENDIF
IF TSK_NAMED
ppname db TYPE namerec dup(?)
ENDIF
pipe ends
;
;
wpipe struc
;
wwait_read db TYPE queue_head dup(?)
wwait_write db TYPE queue_head dup(?)
wwait_clear db TYPE queue_head dup(?)
wbufsize dw ?
wfilled dw ?
winptr dw ?
woutptr dw ?
wcontents dd ?
;
IF TSK_DYNAMIC
wpflags db ?
ENDIF
IF TSK_NAMED
wpname db TYPE namerec dup(?)
ENDIF
wpipe ends
;
;
glob_rec struc
;
glb_id db 8 dup(?)
current_task dd ?
eligible_queue db TYPE queue_head dup(?)
timer_queue db TYPE queue_head dup(?)
watch_queue db TYPE queue_head dup(?)
preempt db ?
pretick db ?
var_prior db ?
in_sched db ?
tick_factor dw ?
ticks_per_sec dw ?
ticker_chain dd ?
;
stub_table dd ?
;
IF TSK_DYNAMIC
pkill_queue db TYPE queue_head dup(?)
pkill_task dd ?
ENDIF
IF IBM
hotkey_scan db TYPE queue_head dup(?)
hotkey_noscan db TYPE queue_head dup(?)
ENDIF
IF EMS
ems_save dd ?
ems_rest dd ?
ems_savetsk dd ?
ENDIF
IF DOS
emergency_exit dd ?
l_swap dw ?
dos_vars dd ?
dos_in_use dd ? ; Adress of DOS in-use-flag
ENDIF
IF GROUPS
ggroup db TYPE gcb dup(?)
ELSE
main_ptr dd ?
glb_remove dd ?
IF TSK_NAMED
name_list db TYPE namerec dup(?)
ENDIF
ENDIF
IF NDP
ndp_present db ?
ENDIF
;
glob_rec ends
;
;
tick_rec struc
;
ticknext dd ?
ticklo dw ?
tickhi dw ?
IF GROUPS
tickchain db TYPE queue_head dup(?)
ENDIF
IF TSK_DYNAMIC
tickflags db ?
ENDIF
;
tick_rec ends
;
;
hotflags_rec struc
hf_mask db ?
hf_value db ?
hotflags_rec ends
;
hotkey_rec struc
kbflags1 db TYPE hotflags_rec dup(?)
kbflags2 db TYPE hotflags_rec dup(?)
kbflags3 db TYPE hotflags_rec dup(?)
scancode db ?
hotkey_rec ends
;
;
; Stack setup relative to BP after switch_stack has been called
;
saved_regs struc
;
dd ? ; special return addr
entry_flags dw ? ; flags on entry to switch_stack
caller_ip dw ? ; IP from INT stack
caller_cs dw ? ; CS from INT stack
caller_flags dw ? ; flags from INT stack
save_es dw ?
save_ds dw ?
save_bp dw ?
save_di dw ?
save_si dw ?
save_dx dw ?
save_ax dw ?
slot_sp dw ? ; stack slot sp
slot_idx dw ? ; stack slot index
save_cx dw ?
save_bx dw ?
;
saved_regs ends
;
;
stc_saved macro
or byte ptr caller_flags[bp],1
endm
;
clc_saved macro
and byte ptr caller_flags[bp],0feh
endm
;
; Flags for the T_INDOS field in the TCB
;
OWN_LOWER = 1
OWN_UPPER = 2
DOS_ENTERED = 4
;
;---------------------------------------------------------------------
;
IFDEF BC_HUGE
TC_HUGE = 1
ENDIF
;
global_ext macro
IF SINGLE_DATA
extrn tsk_glob_rec: byte
ELSE
extrn tsk_global: dword
ENDIF
endm
;
IFDEF TC_HUGE
;
.tsk_data macro
IFDEF BC_HUGE
CTASK_DATA segment byte public 'FAR_DATA'
ELSE
CTASK_DATA segment byte public 'DATA'
ENDIF
assume ds:CTASK_DATA,es:CTASK_DATA
@CTASK_DATA equ <CTASK_DATA>
@data equ <CTASK_DATA>
endm
;
ELSE
;
.tsk_data macro
.data
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -