home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / DOOG / CTASK.ZIP / TSK.MAC < prev    next >
Text File  |  1989-12-22  |  7KB  |  475 lines

  1. ;
  2. ;    --- Version 2.0 89-12-15 15:01 ---
  3. ;
  4. ;    CTask - Definitions for assembler routines
  5. ;
  6. ;    Public Domain Software written by
  7. ;        Thomas Wagner
  8. ;        Patschkauer Weg 31
  9. ;        D-1000 Berlin 33
  10. ;        West Germany
  11. ;
  12. ;
  13. ;    Define TC_HUGE for use with the Turbo C Huge model, and if
  14. ;    it is desired to separate CTask's data from the normal data segment.
  15. ;    This flag causes the CTASK_DATA segment to be defined,
  16. ;    (class is DATA) and DS to be loaded with this segment on function
  17. ;    entry. 
  18. ;    The C functions in the CTask kernel must be compiled to use the
  19. ;    same data segment.
  20. ;
  21. ;;;TC_HUGE    =    1
  22. ;
  23. ;    Define configuration pars according to tskconf.h here
  24. ;
  25. TSK_DYNAMIC    =    1
  26. ;
  27. IBM        =    1
  28. DOS        =    1
  29. ;
  30. TSK_NAMED    =    1
  31. TSK_NAMEPAR    =    1
  32. GROUPS        =    1
  33. ;
  34. CLOCK_MSEC    =    0
  35. ;
  36. PRI_TIMER    =    0f000h
  37. PRI_STD        =    100
  38. PRI_INT9    =    PRI_STD
  39. ;
  40. AT_BIOS        =    1
  41. ;
  42. SINGLE_DATA    =    0
  43. ;
  44. ;-------------------------------------------------------------------
  45. ;
  46. IFL_VIDEO    =    0001h
  47. IFL_DISK    =    0002h
  48. IFL_INT8_DIR    =    0004h
  49. IFL_PRINTER    =    0008h
  50. IFL_INT15    =    0010h
  51. IFL_NODOSVARS    =    0020h
  52. ;
  53. IFL_STD       =    IFL_DISK OR IFL_PRINTER OR IFL_INT15
  54. ;
  55. ST_KILLED    =    0
  56. ST_STOPPED    =    1
  57. ST_DELAYED    =    2
  58. ST_WAITING    =    3
  59. ST_ELIGIBLE    =    4
  60. ST_RUNNING    =    5
  61. ;
  62. ; Task flags
  63. ;
  64. F_TEMP         =    80h    ; Task is temporary
  65. F_CRIT        =    01h    ; Task is critical, may not be preempted
  66. ;
  67. NAMELENGTH    =    9
  68. DOSSWAPSIZE    =    30h
  69. ;
  70. ;
  71. qelem_pri    struc
  72. q_prior        dw    ?
  73. q_ini_prior    dw    ?
  74. qelem_pri    ends
  75. ;
  76. qelem_ticks    struc
  77. q_ticks        dd    ?
  78. qelem_ticks    ends
  79. ;
  80. queue_rec    struc
  81. q_next        dd    ?
  82. q_prev        dd    ?
  83. q_kind        db    ?
  84. q_el        db    TYPE qelem_pri dup(?)
  85. queue_rec    ends
  86. ;
  87. queue_head    struc
  88. q_first        dd    ?
  89. q_last        dd    ?
  90.         db    ?
  91. queue_head    ends
  92. ;
  93. ;
  94. namerec    struc
  95. ;
  96. nlist        db    TYPE queue_head dup(?)
  97. nstrucp        dd    ?
  98. nname        db    NAMELENGTH dup(?)
  99. ;
  100. namerec    ends
  101. ;
  102. ;
  103. tlink_rec    struc
  104. ;
  105. tlink    db    TYPE queue_rec dup(?)
  106. strucp    dd    ?    ; structure pointer
  107. tuserp    dd    ?    ; user parameter
  108. telem    db    8 dup(?) ; timeout element (union)
  109. elkind    db    ?    ; element kind
  110. tstate  db      ?       ; timer state
  111. tflags    db    ?    ; timer flags
  112. ;
  113. tlink_rec    ends
  114. ;
  115. ;
  116. tcb    struc
  117. ;
  118. cqueue        db    TYPE queue_rec dup(?)
  119. qhead        dd    ?
  120. stkbot        dd    ?    ; stack bottom
  121. state        db    ?    ; task state
  122. flags        db    ?    ; task flags
  123. ;
  124. t_sp    dw    ?
  125. t_ss    dw    ?
  126. t_ax    dw    ?
  127. t_cx    dw    ?
  128. t_dx    dw    ?
  129. t_si    dw    ?
  130. t_di    dw    ?
  131. t_bp    dw    ?
  132. t_es    dw    ?
  133. t_ds    dw    ?
  134. ;
  135. timerq    db    TYPE tlink_rec dup(?)
  136. retptr    dd    ?    ; return value pointer
  137. retsize    dw    ?    ; return value size
  138. ;
  139. save_func    dd    ?
  140. rest_func    dd    ?
  141. user_ptr    dd    ?
  142. ;
  143.     IF    GROUPS
  144. tgroup        dd    ?    ; group control block pointer
  145. homegroup    dd    ?    ; group control block pointer
  146.     ENDIF
  147.     IF    DOS
  148. t_indos        db    ?    ; in-dos flags
  149. t_new        db    ?    ; new task flag
  150. ;
  151. ;    caution: don't change the order of the following 3 items!
  152. base_psp    dw    ?    ; base PSP segment address
  153. psp_sssp    dd    ?    ; PSP ss:sp save area
  154. t_swap_area    db    DOSSWAPSIZE dup(?)    ; save area for DOS-vars & Int23/24
  155.     ENDIF
  156. ;
  157.     IF    TSK_NAMED
  158. tname    db    TYPE namerec dup(?)
  159.     ENDIF
  160. ;
  161. tcb    ends
  162. ;
  163. ;
  164. gcb    struc
  165. ;
  166. ghome        dd    ?
  167. glevel        dd    ?
  168. gbranch        dd    ?
  169. gcreator    dd    ?
  170. grp_exit_addr    dd    ?
  171. gcreate_psp    dw    ?
  172. gsave_psp    dw    ?
  173. gsave_sssp    dd    ?
  174. gnamelist    db    TYPE namerec dup(?)
  175. ;
  176. gcb    ends
  177. ;
  178. ;
  179. flag        struc
  180. ;
  181. fwait_set    db    TYPE queue_head dup(?)
  182. fwait_clear    db    TYPE queue_head dup(?)
  183. fstate        dw    ?
  184.  
  185.     IF    TSK_DYNAMIC
  186. flflags    db    ?
  187.     ENDIF
  188.     IF    TSK_NAMED
  189. fname    db    TYPE namerec dup(?)
  190.     ENDIF
  191. ;
  192. flag        ends
  193. ;
  194. ;
  195. counter        struc
  196. ;
  197. cwait_set    db    TYPE queue_head dup(?)
  198. cwait_clear    db    TYPE queue_head dup(?)
  199. cstate        dd    ?
  200. ;
  201.     IF    TSK_DYNAMIC
  202. ctflags    db    ?
  203.     ENDIF
  204.     IF    TSK_NAMED
  205. ctname    db    TYPE namerec dup(?)
  206.     ENDIF
  207. counter        ends
  208. ;
  209. ;
  210. resource    struc
  211. ;
  212. rwaiting    db    TYPE queue_head dup(?)
  213. rowner        dd    ?
  214. rcount        dw    ?
  215. ;
  216.     IF    TSK_DYNAMIC
  217. rsflags    db    ?
  218.     ENDIF
  219.     IF    TSK_NAMED
  220. rsname    db    TYPE namerec dup(?)
  221.     ENDIF
  222.  
  223. resource    ends
  224. ;
  225. ;
  226. mailbox        struc
  227. ;
  228. mwaiting    db    TYPE queue_head dup(?)
  229. mail_first    dd    ?
  230. mail_last    dd    ?
  231. ;
  232.     IF    TSK_DYNAMIC
  233. mbflags    db    ?
  234.     ENDIF
  235.     IF    TSK_NAMED
  236. mbname    db    TYPE namerec dup(?)
  237.     ENDIF
  238. mailbox        ends
  239. ;
  240. ;
  241. pipe        struc
  242. ;
  243. pwait_read    db    TYPE queue_head dup(?)
  244. pwait_write    db    TYPE queue_head dup(?)
  245. pwait_clear    db    TYPE queue_head dup(?)
  246. pbufsize    dw    ?
  247. pfilled        dw    ?
  248. pinptr        dw    ?
  249. poutptr        dw    ?
  250. pcontents    dd    ?
  251. ;
  252.     IF    TSK_DYNAMIC
  253. ppflags    db    ?
  254.     ENDIF
  255.     IF    TSK_NAMED
  256. ppname    db    TYPE namerec dup(?)
  257.     ENDIF
  258. pipe        ends
  259. ;
  260. ;
  261. wpipe        struc
  262. ;
  263. wwait_read    db    TYPE queue_head dup(?)
  264. wwait_write    db    TYPE queue_head dup(?)
  265. wwait_clear    db    TYPE queue_head dup(?)
  266. wbufsize    dw    ?
  267. wfilled        dw    ?
  268. winptr        dw    ?
  269. woutptr        dw    ?
  270. wcontents    dd    ?
  271. ;
  272.     IF    TSK_DYNAMIC
  273. wpflags    db    ?
  274.     ENDIF
  275.     IF    TSK_NAMED
  276. wpname    db    TYPE namerec dup(?)
  277.     ENDIF
  278. wpipe        ends
  279. ;
  280. ;
  281. glob_rec    struc
  282. ;
  283. glb_id        db    8 dup(?)
  284.  
  285. current_task    dd    ?
  286. eligible_queue    db    TYPE queue_head dup(?)
  287.  
  288. timer_queue    db    TYPE queue_head dup(?)
  289. watch_queue    db    TYPE queue_head dup(?)
  290.  
  291. preempt        db    ?
  292. pretick        db    ?
  293. var_prior    db    ?
  294.  
  295. in_sched    db    ?
  296.  
  297. tick_factor    db    8 dup(?)
  298. ticks_per_sec    dw    ?
  299. ticker_chain    dd    ?
  300.     IF    DOS
  301. l_swap        dw    ?
  302. dos_vars    dd    ?
  303.     ENDIF
  304.     IF    GROUPS
  305. curr_group    dd    ?
  306. ggroup        db    TYPE gcb dup(?)
  307.     ELSE
  308.     IF    TSK_NAMED
  309. name_list    db    TYPE namerec dup(?)
  310.     ENDIF
  311.     ENDIF
  312. ;
  313. glob_rec    ends
  314. ;
  315. ;
  316. tick_rec    struc
  317. ;
  318. ticknext    dd    ?
  319. ticklo        dw    ?
  320. tickhi        dw    ?
  321. ;
  322. tick_rec    ends
  323. ;
  324. ;
  325. ;    Stack setup relative to BP after switch_stack has been called
  326. ;
  327. saved_regs    struc
  328. ;
  329.         dd    ?    ; special return addr
  330. caller_flags    dw    ?    ; flags from INT stack
  331. caller_ip    dw    ?    ; IP from INT stack
  332. caller_cs    dw    ?    ; CS from INT stack
  333. entry_flags    dw    ?    ; flags on entry to switch_stack
  334. save_es        dw    ?
  335. save_ds        dw    ?
  336. save_bp        dw    ?
  337. save_di        dw    ?
  338. save_si        dw    ?
  339. save_dx        dw    ?
  340. save_ax        dw    ?
  341.         dw    ?    ; stack slot/sp
  342.         dw    ?    ; stack slot/sp
  343. save_cx        dw    ?
  344. save_bx        dw    ?
  345. ;
  346. saved_regs    ends
  347. ;
  348. ;
  349. stc_saved    macro
  350.         or    byte ptr caller_flags[bp],1
  351.         endm
  352. ;
  353. clc_saved    macro
  354.         and    byte ptr caller_flags[bp],0feh
  355.         endm
  356. ;
  357. ;    Flags for the T_INDOS field in the TCB
  358. ;
  359. OWN_LOWER       =       1
  360. OWN_UPPER       =       2
  361. SPAWNING    =    4
  362. ;
  363. global_ext    macro
  364.         IF    SINGLE_DATA
  365.         extrn    _tsk_glob_rec: byte
  366.         ELSE
  367.         extrn    _tsk_global: dword
  368.         ENDIF
  369.         endm
  370. ;
  371. ;
  372. tsk_dis_preempt    MACRO    save
  373.     IFNDEF    _tsk_global
  374.     IFNDEF    _tsk_glob_rec
  375.     .tsk_ecode
  376.     .tsk_data
  377.     global_ext
  378.     .tsk_edata
  379.     .tsk_code
  380.     ENDIF
  381.     ENDIF
  382.     IF    SINGLE_DATA
  383.     or    _tsk_glob_rec.preempt,2
  384.     ELSE
  385.     IFNB    <save>
  386.     push    es
  387.     push    bx
  388.     ENDIF
  389.     les    bx,_tsk_global
  390.     or    es:preempt[bx],2
  391.     ENDIF
  392.     IFNB    <save>
  393.     pop    bx
  394.     pop    es
  395.     ENDIF
  396.     ENDM
  397. ;
  398. ;
  399. tsk_ena_preempt    MACRO    save
  400.     local    ena1
  401.     IFNDEF    scheduler
  402.     extrn    scheduler: far
  403.     ENDIF
  404.     IFNDEF    _tsk_global
  405.     IFNDEF    _tsk_glob_rec
  406.     .tsk_ecode
  407.     .tsk_data
  408.     global_ext
  409.     .tsk_edata
  410.     .tsk_code
  411.     ENDIF
  412.     ENDIF
  413.     IF    SINGLE_DATA
  414.     cli
  415.     and    _tsk_glob_rec.preempt,NOT 2
  416.     jnz    ena1
  417.     cmp    _tsk_glob_rec.pretick,0
  418.     ELSE
  419.     IFNB    <save>
  420.     push    es
  421.     push    bx
  422.     ENDIF
  423.     les    bx,_tsk_global
  424.     cli
  425.     and    es:preempt[bx],NOT 2
  426.     jnz    ena1
  427.     cmp    es:pretick[bx],0
  428.     ENDIF
  429.     jz    ena1
  430.     pushf
  431.     call    scheduler
  432. ena1:
  433.     sti
  434.     IF    NOT SINGLE_DATA
  435.     IFNB    <save>
  436.     pop    bx
  437.     pop    es
  438.     ENDIF
  439.     ENDIF
  440.     ENDM
  441. ;
  442. ;
  443.         IFDEF    TC_HUGE
  444. ;
  445. .tsk_data    macro
  446. CTASK_DATA    segment byte public 'DATA'
  447.         assume    ds:CTASK_DATA
  448. @CTASK_DATA    equ    CTASK_DATA
  449.         endm
  450. ;
  451. .tsk_edata    macro
  452. CTASK_DATA    ENDS
  453.         endm
  454. ;
  455.         ELSE
  456. ;
  457. .tsk_data    macro
  458.         .data
  459. @CTASK_DATA    equ    DGROUP
  460.         endm
  461. ;
  462. .tsk_edata    macro
  463.         endm
  464. ;
  465.         ENDIF
  466. ;
  467. .tsk_code    macro
  468.         .code    CTASK_TEXT
  469.         endm
  470. ;
  471. .tsk_ecode    macro
  472.         endm
  473. ;
  474.  
  475.