COREPROC.A 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * COREPROC.A - low-level process routines *
  5. * *
  6. * COPYRIGHT (C) 1989..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. include "corelib.inc"
  11. module CoreProc
  12. (*****************************************************************************)
  13. segment _BSS(BSS, 28H)
  14. public __threadTable : org THREADTABLESIZE*MAXPROCESS; (* thread data *)
  15. segment _DATA(DATA, 28H)
  16. public __threadTotal : dw 1;
  17. segment _BSS(BSS, 28H)
  18. public __cp : org FarDataPtrSize (* currently active task + ready queue *)
  19. public __dq : org FarDataPtrSize (* queue of delayed tasks *)
  20. public __wq : org FarDataPtrSize (* queue of tasks that have reached thier delay time
  21. but haven't been placed on the ready queue *)
  22. public __SchedProc : org FarCodePtrSize
  23. public __Started : org 1
  24. public __Continue : org FarCodePtrSize
  25. public _Stop : org 1
  26. public __LockNestMonster : org 2
  27. public __SchedTime : org 2
  28. public __NextThread : org 2
  29. public __proc_init : org 1
  30. (*%T _DLL *)
  31. public __initmt_vector : org FarCodePtrSize
  32. (*%E *)
  33. segment _DATA(DATA, 28H)
  34. public __ProcIds: dw 1
  35. org (MAXPROCESS)*2
  36. segment _BSS(BSS, 28H)
  37. public __LockSem : org 4
  38. public __LockCount : org 2
  39. public __LockedThread : org 2
  40. segment PROC_TEXT(CODE,28H)
  41. public @CurrentProcess : dw 0
  42. section
  43. segment PROC_TEXT(CODE,28H)
  44. dummy:
  45. ret far 0
  46. segment _DATA(DATA, 28H)
  47. public __core_lock : dd dummy
  48. public __core_unlock : dd dummy
  49. segment _DATA(DATA, 28H)
  50. extrn _delay
  51. (*%F NearCall *)
  52. public __core_delay : dd _delay
  53. (*%E *)
  54. (*%T NearCall *)
  55. public __core_delay : dw _delay
  56. (*%E *)
  57. (****************************************************************************)
  58. (*%T _DLL *)
  59. section
  60. segment _DATA(DATA,28H)
  61. segment _TEXT(CODE,28H)
  62. extrn __initmt_vector
  63. public __set_initmt_vector :
  64. push ds
  65. mov cx, _DATA
  66. mov ds, cx
  67. mov [__initmt_vector][2], bx
  68. mov [__initmt_vector], ax
  69. pop ds
  70. ret far 0
  71. (*%E *)
  72. section
  73. (*%F _OS2 *)
  74. (*%T MThread *)
  75. (****************************************************************************)
  76. segment _TEXT(CODE,28H)
  77. select _TEXT
  78. public __getTID :
  79. (* unsigned _getTID(void); *)
  80. (* Returns thread ID. *)
  81. (*%T _DLLOVL *)
  82. push bp
  83. mov bp, sp
  84. (*%E *)
  85. mov al, ss:[CurrentThread]
  86. sub ah, ah
  87. (*%T _DLLOVL *)
  88. pop bp
  89. (*%E *)
  90. (*%F NearCall *)
  91. ret far 0
  92. (*%E *)
  93. (*%T NearCall *)
  94. ret 0
  95. (*%E *)
  96. (*%E NOT MThread*)
  97. (*%E NOT OS2*)
  98. (*%T _XTDDOS*)
  99. (*%T MThread *)
  100. (*****************************************************************************)
  101. section
  102. segment MP_CODE(MP_CODE,68H)
  103. segment PROC_TEXT(CODE,28H)
  104. segment _DATA(DATA, 28H)
  105. extrn @CurrentProcess
  106. extrn @PrtAddrAbort
  107. extrn @Save8087
  108. extrn @MachineId
  109. select PROC_TEXT
  110. @GetPri: (* read interrupt controller mask *)
  111. xor ah,ah
  112. (*%F _XTD*)
  113. cmp byte cs:[@MachineId],0FCH (*an AT ? *)
  114. jne @GetPri2
  115. (*%E*)
  116. in al,0A1H
  117. mov ah,al
  118. @GetPri2:
  119. in al,21H
  120. ret 0
  121. @SetPri: (* write interrupt controller mask *)
  122. out 21H,al
  123. (*%F _XTD*)
  124. cmp byte cs:[@MachineId],0FCH (*an AT ? *)
  125. jne @SetPri2
  126. (*%E*)
  127. xchg al,ah
  128. out 0A1H,al
  129. @SetPri2:
  130. ret 0
  131. public _new_priority :
  132. push ax
  133. call @GetPri
  134. mov bx, ax
  135. pop ax
  136. call @SetPri
  137. mov ax, bx
  138. ret far 0
  139. public SYSTEM$Listen : Mask = 6
  140. push bp; mov bp,sp
  141. call @GetPri
  142. mov bx,ax
  143. mov cx,[bp][Mask]
  144. not cx
  145. and ax,cx
  146. call @SetPri
  147. mov ax,bx
  148. call @GetPri
  149. pop bp; ret far 2
  150. (*%E NOT MThread*)
  151. (*%E XTDDOS*)
  152. (*%F _OS2*)
  153. (*%T MThread *)
  154. extrn FIERQQ
  155. extrn FIDRQQ
  156. SwapStack :
  157. (* Procedure used to change stack *)
  158. (* Inputs: ds = segment of new process record *)
  159. (* Out: ax = New priority *)
  160. (* NB Interrupts must be off *)
  161. (* The following registers are corrupted AX,CX,SI,DI,ES *)
  162. (* Out: es = Old (swapped) process *)
  163. mov es,cs:[@CurrentProcess]
  164. cmp byte cs:[@Save8087],0
  165. jne $dosave
  166. call @Swap
  167. $exitswap:
  168. call far _new_priority
  169. ret 0
  170. $dosave: (* swap 8087 registers *)
  171. call @Swap8087
  172. jmp $exitswap
  173. extrn __FloatRestore
  174. extrn __FloatSave
  175. @Swap8087:
  176. call far __FloatSave
  177. call @Swap
  178. call far __FloatRestore
  179. ret 0
  180. @Swap:
  181. (* local procedure to do the stack swap *)
  182. (* NB The first time a process gets swapped to, this routine returns to StartProcess *)
  183. cmp word ds:[LongCall],9A90H (* check word *)
  184. jne $CorruptProcess
  185. mov cs:[@CurrentProcess],ds
  186. mov di,ProcessSP
  187. mov ax,sp
  188. stosw
  189. mov ax,ss
  190. stosw
  191. call @GetPri
  192. stosw
  193. mov si,ProcessSP
  194. lodsw
  195. mov sp,ax
  196. lodsw
  197. mov ss,ax
  198. lodsw
  199. mov cx,ax
  200. ret 0
  201. SwapStack2: (* Same as SwapStack but doesnt call $NewPrio *)
  202. mov es,cs:[@CurrentProcess]
  203. cmp byte cs:[@Save8087],0
  204. jne $dosave2
  205. call @Swap
  206. jmp $exitswap2
  207. $dosave2:
  208. call @Swap8087
  209. $exitswap2:
  210. xchg ax,cx
  211. call @SetPri
  212. xchg ax,cx
  213. ret 0
  214. extrn __FatalError
  215. extrn __FatalErrorPos
  216. $CorruptProcess:
  217. sti
  218. call far __FatalErrorPos
  219. mov cx, 049H
  220. push cx
  221. push dx
  222. push ax
  223. call far __FatalError
  224. public CoreProc$TRANSFER :
  225. public SYSTEM$TRANSFER : p1seg=12; p1off=10; p2seg=8; p2off=6
  226. push bp; mov bp,sp
  227. push ds; push es; push si; push di
  228. pushf
  229. cli
  230. (* Take copy of p2 *)
  231. lds bx, [bp][p2off]
  232. mov ds, [bx][2]
  233. mov ax,cs:[@CurrentProcess]
  234. (* Return result *)
  235. les bx, [bp][p1off]
  236. mov word es:[bx], 0
  237. mov word es:[bx][2],ax
  238. push bp
  239. call SwapStack
  240. pop bp
  241. popf
  242. pop di; pop si; pop es; pop ds
  243. pop bp; ret far 8
  244. public CoreProc$IOTRANSFER :
  245. public SYSTEM$IOTRANSFER : p1seg=14; p1off=12; p2seg=10; p2off=8; IntNo=6
  246. push bp; mov bp,sp
  247. push ds; push es; push si; push di
  248. pushf
  249. cli
  250. (* Take copy of p2 *)
  251. lds bx, [bp][p2off]
  252. mov di, [bx][2]
  253. (* Return first result *)
  254. mov ax, cs:[@CurrentProcess]
  255. lds bx, [bp][p1off]
  256. mov word [bx],0
  257. mov [bx][2],ax
  258. (* Save old interrupt vector and set up new one *)
  259. sub bx, bx
  260. mov ds, bx
  261. mov bx, [bp][IntNo] (* NB *)
  262. shl bx, 1
  263. shl bx, 1
  264. push [bx]
  265. push [bx][2]
  266. mov [bx][2], ax (* current process *)
  267. mov word [bx],LongCall
  268. push ds
  269. push bx
  270. mov ds,di
  271. push bp
  272. call SwapStack
  273. pop bp
  274. pop bx
  275. pop ds
  276. (* Restore old interrupt vector *)
  277. pop [bx][2]
  278. pop [bx]
  279. (* issue EOI to interrupt controller *)
  280. cmp bx,20H
  281. jb skipa0
  282. cmp bx,40H
  283. mov al,20H
  284. jae skip20
  285. out 20H,al
  286. jmp skipa0
  287. skip20:
  288. cmp bx,1C0H
  289. jb skipa0
  290. cmp bx,1E0H
  291. jae skipa0
  292. out 0A0H,al (* assuming it's an AT *)
  293. out 020H, al (* Added 11/14/91 *)
  294. skipa0:
  295. (* return second result *)
  296. lds bx, [bp][p2off]
  297. mov word [bx], 0
  298. mov [bx][2], es
  299. popf
  300. pop di; pop si; pop es; pop ds
  301. pop bp; ret far 10
  302. SYSTEM$IntHandler:
  303. (* On entry the stack has *)
  304. (* flags *)
  305. (* cs *)
  306. (* ip *)
  307. (* segment of task record of interrupting task ( used to save ax ) *)
  308. (* offset of ditto ( used to save bx ) *)
  309. (* Then registers saved in Registers record order *)
  310. (* flags = 16 *)
  311. (* CS = 14 *)
  312. (* IP = 12 *)
  313. (* 10 (flags copy) *)
  314. (* 8 (es) *)
  315. push ds (* 6 *)
  316. push di (* 4 *)
  317. push si (* 2 *)
  318. push bp (* 0 *)
  319. mov bp, sp
  320. push dx
  321. push cx
  322. push bx
  323. push ax
  324. pushf
  325. cld
  326. mov ds,ss:[bp][10] (* load ds with new process rec *)
  327. pop ss:[bp][10]
  328. mov [bp][8],es
  329. $preempt:
  330. call SwapStack2
  331. $exit:
  332. pop ax
  333. pop bx
  334. pop cx
  335. pop dx
  336. pop bp
  337. pop si
  338. pop di
  339. pop ds
  340. pop es
  341. add sp,2 (* flags are be restored by iret *)
  342. iret
  343. (*%F NearCall *)
  344. pseg = 18
  345. poff = 16
  346. aseg = 14
  347. aoff = 12
  348. wspsize = 10
  349. p1seg = 8
  350. p1off = 6
  351. RetSize = 14
  352. (*%E *)
  353. (*%T NearCall *)
  354. poff = 16
  355. aseg = 14
  356. aoff = 12
  357. wspsize = 10
  358. p1seg = 8
  359. p1off = 6
  360. pseg = 4
  361. RetSize = 12
  362. (*%E *)
  363. extrn __ProcIds
  364. extrn __FatalError
  365. extrn __FatalErrorPos
  366. public CoreProc$NEWPROCESS :
  367. public SYSTEM$NEWPROCESS :
  368. push bp
  369. mov bp, sp
  370. push ds
  371. push es
  372. push si
  373. push di
  374. les di, [bp][aoff] (* address of process workspace *)
  375. mov bx, [bp][wspsize]
  376. mov ax, di
  377. and di, 0FH (* amount lost due to normalizing *)
  378. jz $$NoLoss
  379. sub di, 16
  380. add bx, di
  381. $$NoLoss:
  382. lds si, [bp][p1off] (* result *)
  383. add ax, 15
  384. shr ax, 1
  385. shr ax, 1
  386. shr ax, 1
  387. shr ax, 1
  388. mov di, es
  389. add ax, di
  390. mov word ds:[si], 0
  391. mov ds:[si][2], ax
  392. mov ds, ax
  393. cmp byte cs:[@Save8087],0
  394. je $$NoSave8087
  395. add ax, 6 (* 94/16 *)
  396. sub bx, 96
  397. and bx, 0FFFEH (* put stack on even boundrary *)
  398. mov dx, es:[16]
  399. mov es:[16+96], dx
  400. $$NoSave8087:
  401. inc ax (* size of process record *)
  402. sub bx, 16+12 (* 1 para + return addresses etc *)
  403. (* initialize record *)
  404. mov word ds:[NextProcess], -1
  405. mov word ds:[LongCall], 09A90H
  406. mov word ds:[LongCallIP], SYSTEM$IntHandler
  407. mov ds:[LongCallCS], cs
  408. mov ds:[ProcessSS], ax
  409. mov ds:[ProcessSP], bx
  410. mov di, bx
  411. mov cx, MAXPROCESS
  412. mov bx, _DATA
  413. mov es, bx
  414. mov bx, __ProcIds
  415. $$TIDLoop:
  416. inc bx
  417. inc bx
  418. cmp word es:[bx], 0
  419. je $$TIDFound
  420. loop $$TIDLoop
  421. call far __FatalErrorPos
  422. mov cx, 040H
  423. push cx
  424. push dx
  425. push ax
  426. call far __FatalError
  427. $$TIDFound:
  428. neg cx
  429. add cx, MAXPROCESS+2
  430. mov es:[bx], cx
  431. mov es, ax
  432. mov es:[0], cl
  433. call @GetPri
  434. mov ds:[ProcessPriority], ax
  435. (* initialize return stack frame *)
  436. mov ax, $$StartProcess
  437. stosw
  438. mov ax, [bp][poff]
  439. stosw
  440. mov ax, [bp][pseg]
  441. stosw
  442. mov ax, $$StopProcess
  443. stosw
  444. mov ax, cs
  445. stosw
  446. pop di
  447. pop si
  448. pop es
  449. pop ds
  450. pop bp
  451. ret far RetSize
  452. $$StopProcess:
  453. extrn __FatalError
  454. extrn __FatalErrorPos
  455. call far __FatalErrorPos
  456. mov cx, 48H
  457. push cx
  458. push dx
  459. push ax
  460. call far __FatalError
  461. $$StartProcess:
  462. (* This is arrived at by first SwapStack *)
  463. (* IN ax = priority (from SwapStack) *)
  464. (*Initialise bp to zero, enable interrupts and set priority *)
  465. cld
  466. push bx
  467. push es
  468. mov bx, ss
  469. extrn __FloatInitInstance
  470. call far __FloatInitInstance
  471. push ss
  472. pop es
  473. push ss
  474. pop ds
  475. call far __FloatSave
  476. call far __FloatRestore
  477. pop es
  478. pop bx
  479. mov bp, _DATA
  480. mov ds, bp
  481. sub bp, bp
  482. call far _new_priority
  483. sti
  484. ret far 0
  485. (* Utility procedures *)
  486. public CoreProc$NewPriority :
  487. public SYSTEM$NewPriority :
  488. mov bx,sp
  489. mov ax,ss:[bx][4]
  490. call @SetPri
  491. ret far 2
  492. public CoreProc$CurrentPriority :
  493. public SYSTEM$CurrentPriority :
  494. call @GetPri
  495. ret far 0
  496. public SYSTEM$InterruptRegisters : pseg=8; pofs=6
  497. push bp; mov bp,sp
  498. push ds
  499. (* called to find the registers of an interrupted process *)
  500. (* after an IOtransfer *)
  501. mov ds,[bp][pseg]
  502. mov dx,ds:[ProcessSS]
  503. mov ax,ds:[ProcessSP]
  504. add ax,4
  505. pop ds
  506. pop bp; ret far 4
  507. extrn __SchedStack
  508. dw __SchedStack
  509. select MP_CODE
  510. mp_code: (* must be at 0 *)
  511. dw -1
  512. dw 9A90H
  513. dd SYSTEM$IntHandler
  514. org ProcessRecordSize-8
  515. select PROC_TEXT
  516. public CoreProc$initprocess :
  517. public SYSTEM$initprocess :
  518. mov ax, MP_CODE
  519. mov word cs:[@CurrentProcess], ax
  520. cmp byte cs:[@Save8087],0
  521. je $NoSave87
  522. push ds
  523. mov es, ax
  524. mov ds, ax
  525. extrn __FloatSave
  526. call far __FloatSave
  527. extrn __FloatRestore
  528. call far __FloatRestore
  529. pop ds
  530. $NoSave87:
  531. mov ax,0F000H + mp_code (* make sure extra smart linking does not cause problem! *)
  532. ret far 0
  533. section;
  534. segment PROC_TEXT(CODE,28H); select PROC_TEXT
  535. extrn @CurrentProcess
  536. public CoreProc$CurrentProcess :
  537. public SYSTEM$CurrentProcess :
  538. (* returns the current process in DX:AX *)
  539. mov dx, cs:[@CurrentProcess]
  540. sub ax,ax
  541. ret far 0
  542. (*%E *)
  543. (***************************************************************************)
  544. section
  545. segment _INIT(INIT_CODE,28H)
  546. segment _TEXT(CODE,28H)
  547. segment _DATA(DATA, 28H)
  548. extrn __initmt
  549. extrn __initmt_vector
  550. select _TEXT
  551. do_initproc : (* defined later on ! *)
  552. select _INIT
  553. initproc : dw MAGIC_NUM
  554. db PR3
  555. dd do_initproc
  556. select _DATA
  557. public __SchedStack : dw 0, 0, initproc
  558. select _TEXT
  559. (*%T MThread *)
  560. (*%F _DLL *)
  561. call far __initmt
  562. (*%E *)
  563. (*%T _DLL *)
  564. push ds
  565. mov ax, _DATA
  566. mov ds, ax
  567. cmp word [__initmt_vector][2], 0
  568. jz noCall
  569. call far [__initmt_vector]
  570. noCall:
  571. pop ds
  572. (*%E *)
  573. (*%E *)
  574. ret far 0
  575. (*%E *) (* NOT OS2 *)
  576. (*%T _OS2 *)
  577. (***************************************************************************)
  578. section
  579. segment _INIT(INIT_CODE,28H)
  580. segment _TEXT(CODE,28H)
  581. segment _DATA(DATA, 28H)
  582. extrn __initmt
  583. extrn __initmt_vector
  584. select _TEXT
  585. do_initproc : (* defined later on ! *)
  586. select _INIT
  587. initproc : dw MAGIC_NUM
  588. db PR3
  589. dd do_initproc
  590. select _DATA
  591. public __LastProc : dw 0, initproc
  592. select _TEXT
  593. (*%T MThread *)
  594. (*%F _DLL *)
  595. call far __initmt
  596. (*%E *)
  597. (*%T _DLL *)
  598. push ds
  599. mov ax, _DATA
  600. mov ds, ax
  601. cmp word [__initmt_vector][2], 0
  602. jz noCall
  603. call far [__initmt_vector]
  604. noCall:
  605. pop ds
  606. (*%E *)
  607. (*%E *)
  608. ret far 0
  609. (****************************************************************************)
  610. section
  611. segment _TEXT(CODE,28H)
  612. segment _DATA(DATA, 28H)
  613. extrn DOSCREATETHREAD
  614. extrn __dosgetstack
  615. extrn __dosfreestack
  616. extrn __seterrno
  617. extrn __FloatInitInstance
  618. extrn __core_unlock
  619. extrn __core_lock
  620. select _DATA
  621. launchbuff: org 8
  622. ERROR_INSUFFICIENT_BUFFER = 122
  623. ERROR_NO_PROC_SLOTS = 89
  624. extrn __threadTotal
  625. extrn __core_lock
  626. extrn __core_unlock
  627. extrn DOSALLOCSEG
  628. select _TEXT
  629. threadLauncher:
  630. mov bx, ss
  631. call far __FloatInitInstance
  632. push ds
  633. mov bx,_DATA
  634. mov ds,bx
  635. mov di, [launchbuff][0]
  636. mov si, [launchbuff][2]
  637. mov es, [launchbuff][6]
  638. mov cx, [launchbuff][4]
  639. pop ds
  640. mov bx, ss
  641. push si
  642. push di
  643. sub sp, 4
  644. push es
  645. push cx
  646. ret far 0
  647. public __beginthread :
  648. (*
  649. int far _beginthread (void (_CDECL far *func) (void far * ), void far *stack, unsigned size, void far *arg);
  650. *)
  651. (*%F RegParam *)
  652. func = frame
  653. stack = 4+frame
  654. size = 8+frame
  655. arg = 10+frame
  656. tid = -2
  657. locals = 2
  658. RetSize = 0
  659. (*%E *)
  660. (*%T RegParam *)
  661. size = 4+frame
  662. arg = frame
  663. func = -4
  664. tid = -6
  665. stack = -10
  666. locals = 6
  667. RetSize = 6
  668. (*%E *)
  669. push bp
  670. mov bp, sp
  671. sub sp, locals
  672. (*%T RegParam *)
  673. mov [bp][func], ax
  674. mov [bp][func][2], bx
  675. mov [bp][stack], cx
  676. mov [bp][stack][2],dx
  677. (*%E *)
  678. (*%F RegParam *)
  679. mov cx, [bp][stack]
  680. mov dx, [bp][stack][2]
  681. (*%E *)
  682. or dx, cx
  683. cmp dx, 0
  684. jne StackOK
  685. push ax
  686. push [bp][size]
  687. push ss
  688. lea cx, [bp][stack][2]
  689. push cx
  690. sub cx, cx
  691. push cx
  692. call far DOSALLOCSEG
  693. cmp ax, 0
  694. jne stackError
  695. pop ax
  696. StackOK:
  697. mov dx, [bp][stack][2]
  698. (*%F SameDS *)
  699. push ds
  700. mov ax, _DATA
  701. mov ds, ax
  702. (*%E *)
  703. call far [__core_lock]
  704. add cx, [bp][size]
  705. mov es, dx
  706. mov bx, cx
  707. mov byte es:[CurrentThread], -1
  708. mov ax, [bp][arg]
  709. mov [launchbuff][0],ax
  710. mov ax, [bp][arg][2]
  711. mov [launchbuff][2],ax
  712. mov ax, [bp][func][2]
  713. mov [launchbuff][6],ax
  714. mov ax, [bp][func]
  715. mov [launchbuff][4],ax
  716. mov word es:[0], -1
  717. mov bx, [__threadTotal]
  718. cmp bx, MAXPROCESS
  719. jb threadOK
  720. mov ax, ERROR_NO_PROC_SLOTS
  721. jmp threadError
  722. threadOK:
  723. inc bx
  724. mov [__threadTotal], bx
  725. push cs
  726. mov ax, threadLauncher
  727. push ax
  728. push ss
  729. lea bx, [bp][tid]
  730. push bx
  731. push es
  732. sub cx, 2
  733. push cx
  734. call far DOSCREATETHREAD
  735. or ax, ax
  736. jnz threadError2
  737. threadExecOK:
  738. mov ax, [bp][tid]
  739. btDone:
  740. call far [__core_unlock]
  741. (*%F SameDS *)
  742. pop ds
  743. (*%E *)
  744. mov sp, bp
  745. pop bp
  746. ret far RetSize
  747. stackError:
  748. mov ax, ERROR_INSUFFICIENT_BUFFER
  749. threadError:
  750. threadError2:
  751. (*%F NearCall *)
  752. call far __seterrno
  753. (*%E *)
  754. (*%T NearCall *)
  755. call __seterrno
  756. (*%E *)
  757. sub ax, ax
  758. jmp btDone
  759. (****************************************************************************)
  760. section
  761. segment _TEXT(CODE,28H)
  762. segment _DATA(DATA, 28H)
  763. extrn DOSCREATETHREAD
  764. extrn __dosgetstack
  765. extrn __dosfreestack
  766. extrn __seterrno
  767. extrn __FloatInitInstance
  768. select _DATA
  769. ERROR_INSUFFICIENT_BUFFER = 122
  770. ERROR_NO_PROC_SLOTS = 89
  771. extrn __core_lock
  772. extrn __core_unlock
  773. extrn __threadTotal
  774. extrn __core_unlock
  775. extrn __core_lock
  776. launchbuff2: org 4
  777. select _TEXT
  778. threadLauncher:
  779. push ds
  780. mov bx,_DATA
  781. mov ds,bx
  782. mov si, [launchbuff2][2]
  783. mov di, [launchbuff2][0]
  784. pop ds
  785. mov bx, ss
  786. call far __FloatInitInstance
  787. sub sp, 6
  788. push si
  789. push di
  790. ret far 0
  791. public __dosbeginthread :
  792. (* TID _dosbeginthread(void ( * func)(void), unsigned st_len, unsigned *st_token)
  793. *)
  794. (*%F RegParam *)
  795. RetSize = 0
  796. (*%E *)
  797. (*%T RegParam *)
  798. RetSize = 4
  799. (*%E *)
  800. (*%F RegParam *)
  801. func = frame
  802. st_len = 4+frame
  803. st_base = 6+frame
  804. tid = -2
  805. locals = 2
  806. (*%E *)
  807. (*%T RegParam *)
  808. (*%F NearCall *)
  809. st_base = frame
  810. func = -4
  811. st_len = -6
  812. tid = -8
  813. locals = 12
  814. (*%E *)
  815. (*%T NearCall *)
  816. st_base = -4
  817. func = -8
  818. st_len = -10
  819. tid = -12
  820. locals = 12
  821. (*%E *)
  822. (*%E *)
  823. push bp
  824. mov bp, sp
  825. sub sp, locals
  826. (*%F RegParam *)
  827. push bx
  828. push cx
  829. (*%E *)
  830. push dx
  831. push di
  832. push si
  833. (*%T RegParam *)
  834. (*%F NearCall *)
  835. mov [bp][func], ax
  836. mov [bp][func][2], bx
  837. mov [bp][st_len], cx
  838. (*%E *)
  839. (*%T NearCall *)
  840. mov [bp][func], ax
  841. mov [bp][st_len], dx
  842. mov [bp][st_base], cx
  843. mov [bp][st_base][2], dx
  844. (*%E *)
  845. (*%E *)
  846. (*%F SameDS *)
  847. push ds
  848. mov ax, _DATA
  849. mov ds, ax
  850. (*%E *)
  851. call far [__core_lock]
  852. mov cx, [bp][st_len]
  853. jcxz stackError
  854. (*%F RegParam *)
  855. push cx
  856. (*%E *)
  857. (*%T RegParam *)
  858. mov ax, cx
  859. push cx
  860. (*%E *)
  861. call __dosgetstack
  862. pop cx
  863. or dx, dx
  864. jz stackError
  865. mov es, dx
  866. neg dx
  867. memOK:
  868. mov byte es:[CurrentThread], -1
  869. mov bx, [__threadTotal]
  870. cmp bx, MAXPROCESS
  871. jb threadOK
  872. mov ax, ERROR_NO_PROC_SLOTS
  873. jmp threadError
  874. threadOK:
  875. inc bx
  876. mov [__threadTotal], bx
  877. mov bx, cx
  878. mov ax, [bp][func][2]
  879. mov [launchbuff2][2],ax
  880. mov ax, [bp][func]
  881. mov [launchbuff2][0],ax
  882. push cs
  883. mov ax, threadLauncher
  884. push ax
  885. push ss
  886. lea bx, [bp][tid]
  887. push bx
  888. push es
  889. sub cx, 2
  890. push cx
  891. call far DOSCREATETHREAD
  892. or ax, ax
  893. jz threadExecOK
  894. push ax
  895. (*%F RegParam *)
  896. push dx
  897. (*%E *)
  898. (*%T RegParam *)
  899. mov ax, dx
  900. (*%E *)
  901. (*%F NearCall *)
  902. call far __dosfreestack
  903. (*%E *)
  904. (*%T NearCall *)
  905. call __dosfreestack
  906. (*%E *)
  907. (*%F RegParam *)
  908. add sp, 2
  909. (*%E *)
  910. pop ax
  911. jmp threadError2
  912. threadExecOK:
  913. les bx, [bp][st_base]
  914. mov ax, es
  915. or ax, ax
  916. jz noToken
  917. mov es:[bx], dx
  918. noToken:
  919. mov ax, [bp][tid]
  920. btDone:
  921. call far [__core_unlock]
  922. (*%F SameDS *)
  923. pop ds
  924. (*%E *)
  925. pop si
  926. pop di
  927. pop dx
  928. (*%F RegParam *)
  929. pop cx
  930. pop bx
  931. (*%E *)
  932. mov sp, bp
  933. pop bp
  934. ret far RetSize
  935. stackError:
  936. mov ax, ERROR_INSUFFICIENT_BUFFER
  937. threadError:
  938. threadError2:
  939. (*%F NearCall *)
  940. call far __seterrno
  941. (*%E *)
  942. (*%T NearCall *)
  943. call __seterrno
  944. (*%E *)
  945. sub ax, ax
  946. jmp btDone
  947. (****************************************************************************)
  948. section
  949. segment _TEXT(CODE,28H)
  950. segment _DATA(DATA, 28H)
  951. extrn DOSEXIT
  952. select _DATA
  953. extrn __threadTotal
  954. select _TEXT
  955. public __dosendthread :
  956. public __endthread :
  957. (*%F SameDS *)
  958. push ds
  959. mov ax, _DATA
  960. mov ds, ax
  961. (*%E *)
  962. mov ax, [__threadTotal]
  963. dec ax
  964. or ax, ax
  965. jbe etError
  966. mov [__threadTotal], ax
  967. mov ax, EXIT_THREAD
  968. push ax
  969. sub ax, ax
  970. push ax
  971. call far DOSEXIT
  972. etError:
  973. (*%F SameDS *)
  974. pop ds
  975. (*%E *)
  976. ret far 0
  977. (****************************************************************************)
  978. section
  979. segment _TEXT(CODE,28H)
  980. segment _DATA(DATA, 28H)
  981. extrn DOSALLOCSEG
  982. select _DATA
  983. extrn __threadTotal
  984. select _TEXT
  985. public __dosgetstack :
  986. size = sframe
  987. sel = -2
  988. locals = 2
  989. push bp
  990. mov bp, sp
  991. sub sp, locals
  992. (*%F RegParam *)
  993. push [bp][size]
  994. (*%E *)
  995. (*%T RegParam *)
  996. push ax
  997. (*%E *)
  998. push ss
  999. lea ax, [bp][sel]
  1000. push ax
  1001. sub ax, ax
  1002. push ax
  1003. call far DOSALLOCSEG
  1004. or ax, ax
  1005. jnz dgError
  1006. mov dx, [bp][sel]
  1007. dgDone:
  1008. mov sp, bp
  1009. pop bp
  1010. ret 0
  1011. dgError:
  1012. sub ax, ax
  1013. cwd
  1014. jmp dgDone
  1015. (****************************************************************************)
  1016. section
  1017. segment _TEXT(CODE,28H)
  1018. segment _DATA(DATA, 28H)
  1019. extrn DOSFREESEG
  1020. select _DATA
  1021. extrn __threadTotal
  1022. select _TEXT
  1023. public __dosfreestack :
  1024. stack = frame
  1025. push bp
  1026. mov bp, sp
  1027. (*%F RegParam *)
  1028. mov ax, [bp][stack]
  1029. (*%E *)
  1030. neg ax
  1031. push ax
  1032. call far DOSFREESEG
  1033. pop bp
  1034. ret far 0
  1035. (****************************************************************************)
  1036. section
  1037. segment _TEXT(CODE,28H)
  1038. segment _DATA(DATA, 28H)
  1039. extrn DOSGETINFOSEG
  1040. select _TEXT
  1041. public __getTID :
  1042. globalSeg = -2
  1043. localSeg = -4
  1044. locals = 4
  1045. sub ah, ah
  1046. mov al, ss:[CurrentThread]
  1047. cmp al, -1
  1048. jne gotID
  1049. push bp
  1050. mov bp, sp
  1051. sub sp, locals
  1052. lea ax, [bp][globalSeg]
  1053. push ss
  1054. push ax
  1055. lea ax, [bp][localSeg]
  1056. push ss
  1057. push ax
  1058. call far DOSGETINFOSEG
  1059. mov es, [bp][localSeg]
  1060. mov ax, es:[ThreadID]
  1061. mov ss:[CurrentThread], al
  1062. mov sp, bp
  1063. pop bp
  1064. gotID:
  1065. (*%F NearCall *)
  1066. ret far 0
  1067. (*%E *)
  1068. (*%T NearCall *)
  1069. ret 0
  1070. (*%E *)
  1071. (****************************************************************************)
  1072. section
  1073. segment _TEXT(CODE,28H)
  1074. extrn DOSSETPRTY
  1075. public CoreProc$NewPriority :
  1076. pr = frame
  1077. push bp
  1078. mov bp, sp
  1079. mov ax, 2
  1080. push ax
  1081. sub ax, ax
  1082. push ax
  1083. push [bp][pr]
  1084. push ax
  1085. call far DOSSETPRTY
  1086. pop bp
  1087. ret far 2
  1088. (****************************************************************************)
  1089. section
  1090. segment _TEXT(CODE,28H)
  1091. extrn DOSGETPRTY
  1092. public CoreProc$CurrentPriority :
  1093. pr = -2
  1094. locals = 2
  1095. push bp
  1096. mov bp, sp
  1097. sub sp, locals
  1098. mov ax, 2
  1099. push ax
  1100. lea ax, [bp][pr]
  1101. push ss
  1102. push ax
  1103. sub ax, ax
  1104. push ax
  1105. call far DOSGETPRTY
  1106. mov al, [bp][pr]
  1107. sub ah, ah
  1108. mov sp, bp
  1109. pop bp
  1110. ret far 0
  1111. (****************************************************************************)
  1112. section
  1113. segment _TEXT(CODE,28H)
  1114. select _TEXT
  1115. public __nullproc :
  1116. ret 0
  1117. (*%E *) (* OS2 *)
  1118. end
  1119.