home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frostbyte's 1980s DOS Shareware Collection
/
floppyshareware.zip
/
floppyshareware
/
DOOG
/
CTASK.ZIP
/
TSK.MAC
< prev
next >
Wrap
Text File
|
1989-12-22
|
7KB
|
475 lines
;
; --- Version 2.0 89-12-15 15:01 ---
;
; CTask - Definitions for assembler routines
;
; Public Domain Software written by
; Thomas Wagner
; Patschkauer Weg 31
; D-1000 Berlin 33
; West Germany
;
;
; Define TC_HUGE for use with the Turbo C Huge model, and if
; it is desired to separate CTask's data from the normal data segment.
; This flag causes the CTASK_DATA segment to be defined,
; (class is DATA) and DS to be loaded with this segment on function
; entry.
; The C functions in the CTask kernel must be compiled to use the
; same data segment.
;
;;;TC_HUGE = 1
;
; Define configuration pars according to tskconf.h here
;
TSK_DYNAMIC = 1
;
IBM = 1
DOS = 1
;
TSK_NAMED = 1
TSK_NAMEPAR = 1
GROUPS = 1
;
CLOCK_MSEC = 0
;
PRI_TIMER = 0f000h
PRI_STD = 100
PRI_INT9 = PRI_STD
;
AT_BIOS = 1
;
SINGLE_DATA = 0
;
;-------------------------------------------------------------------
;
IFL_VIDEO = 0001h
IFL_DISK = 0002h
IFL_INT8_DIR = 0004h
IFL_PRINTER = 0008h
IFL_INT15 = 0010h
IFL_NODOSVARS = 0020h
;
IFL_STD = IFL_DISK OR IFL_PRINTER OR IFL_INT15
;
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_CRIT = 01h ; Task is critical, may not be preempted
;
NAMELENGTH = 9
DOSSWAPSIZE = 30h
;
;
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(?)
strucp dd ? ; structure pointer
tuserp dd ? ; user parameter
telem db 8 dup(?) ; timeout element (union)
elkind db ? ; element kind
tstate db ? ; timer state
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
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
;
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(?)
;
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 db 8 dup(?)
ticks_per_sec dw ?
ticker_chain dd ?
IF DOS
l_swap dw ?
dos_vars dd ?
ENDIF
IF GROUPS
curr_group dd ?
ggroup db TYPE gcb dup(?)
ELSE
IF TSK_NAMED
name_list db TYPE namerec dup(?)
ENDIF
ENDIF
;
glob_rec ends
;
;
tick_rec struc
;
ticknext dd ?
ticklo dw ?
tickhi dw ?
;
tick_rec ends
;
;
; Stack setup relative to BP after switch_stack has been called
;
saved_regs struc
;
dd ? ; special return addr
caller_flags dw ? ; flags from INT stack
caller_ip dw ? ; IP from INT stack
caller_cs dw ? ; CS from INT stack
entry_flags dw ? ; flags on entry to switch_stack
save_es dw ?
save_ds dw ?
save_bp dw ?
save_di dw ?
save_si dw ?
save_dx dw ?
save_ax dw ?
dw ? ; stack slot/sp
dw ? ; stack slot/sp
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
SPAWNING = 4
;
global_ext macro
IF SINGLE_DATA
extrn _tsk_glob_rec: byte
ELSE
extrn _tsk_global: dword
ENDIF
endm
;
;
tsk_dis_preempt MACRO save
IFNDEF _tsk_global
IFNDEF _tsk_glob_rec
.tsk_ecode
.tsk_data
global_ext
.tsk_edata
.tsk_code
ENDIF
ENDIF
IF SINGLE_DATA
or _tsk_glob_rec.preempt,2
ELSE
IFNB <save>
push es
push bx
ENDIF
les bx,_tsk_global
or es:preempt[bx],2
ENDIF
IFNB <save>
pop bx
pop es
ENDIF
ENDM
;
;
tsk_ena_preempt MACRO save
local ena1
IFNDEF scheduler
extrn scheduler: far
ENDIF
IFNDEF _tsk_global
IFNDEF _tsk_glob_rec
.tsk_ecode
.tsk_data
global_ext
.tsk_edata
.tsk_code
ENDIF
ENDIF
IF SINGLE_DATA
cli
and _tsk_glob_rec.preempt,NOT 2
jnz ena1
cmp _tsk_glob_rec.pretick,0
ELSE
IFNB <save>
push es
push bx
ENDIF
les bx,_tsk_global
cli
and es:preempt[bx],NOT 2
jnz ena1
cmp es:pretick[bx],0
ENDIF
jz ena1
pushf
call scheduler
ena1:
sti
IF NOT SINGLE_DATA
IFNB <save>
pop bx
pop es
ENDIF
ENDIF
ENDM
;
;
IFDEF TC_HUGE
;
.tsk_data macro
CTASK_DATA segment byte public 'DATA'
assume ds:CTASK_DATA
@CTASK_DATA equ CTASK_DATA
endm
;
.tsk_edata macro
CTASK_DATA ENDS
endm
;
ELSE
;
.tsk_data macro
.data
@CTASK_DATA equ DGROUP
endm
;
.tsk_edata macro
endm
;
ENDIF
;
.tsk_code macro
.code CTASK_TEXT
endm
;
.tsk_ecode macro
endm
;