home *** CD-ROM | disk | FTP | other *** search
- ;
- ; --- 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
- ;
-
-