CORESIG.A 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * CORESIG.A - common signal handling *
  5. * *
  6. * COPYRIGHT (C) 1989..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. include "corelib.inc"
  11. module CoreSig
  12. (***************************************************************************)
  13. segment _DATA(DATA, 28H)
  14. public __sigTrans : db 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 6
  15. db 0, 0, 7, 4
  16. public __raiseTrans : db 0, 2, 0, 60, 84, 64, 68, 80
  17. segment _BSS(BSS, 28H)
  18. public CoreSig@CnsHandler : org FarCodePtrSize
  19. public CoreSig@FatalErrorHandler : org FarCodePtrSize
  20. segment _BSS(BSS, 28H)
  21. public __sigTable : org 92
  22. public __vec0 : org 4
  23. public __vec2 : org 4
  24. public __vec4 : org 4
  25. public __vec16 : org 4
  26. public __vec23 : org 4
  27. public __vec24 : org 4
  28. segment _BSS(BSS, 28H)
  29. public @RecursiveExit : org 2
  30. segment _BSS(BSS, 28H)
  31. public _errno : org 2
  32. (*%T SameDS *)
  33. segment _TEXT(CODE, 28H)
  34. (*%E *)
  35. (*%F SameDS *)
  36. segment SIG_TEXT(CODE, 28H)
  37. (*%E *)
  38. public @InProgramFlag : db 1
  39. public @StopProgramFlag : db 0
  40. segment PROC_TEXT(CODE,28H)
  41. public @MachineId : db 0
  42. segment _BSS(BSS, 28H)
  43. public __pmd_stub : org FarCodePtrSize
  44. (***************************************************************************)
  45. section
  46. segment _TEXT(CODE,28H)
  47. segment _DATA(DATA, 28H)
  48. extrn __getTID
  49. select _DATA
  50. extrn __threadTable
  51. extrn _errno
  52. select _TEXT
  53. public __seterrno :
  54. (*%T MThread *)
  55. (*%T _DLLOVL *)
  56. push bp
  57. mov bp, sp
  58. (*%E *)
  59. push ax
  60. push bx
  61. push cx
  62. push dx
  63. push di
  64. mov di, ax
  65. push ds
  66. mov bx, _DATA
  67. mov ds, bx
  68. call far __getTID
  69. mov cx, di
  70. dec ax
  71. mov dx, THREADTABLESIZE
  72. mul dx
  73. mov bx, ax
  74. mov di, __threadTable
  75. mov [di][bx][_ERRNO], cx
  76. mov ax, cx
  77. pop ds
  78. pop di
  79. pop dx
  80. pop cx
  81. pop bx
  82. pop ax
  83. (*%T _DLLOVL *)
  84. pop bp
  85. (*%E *)
  86. ret far 0
  87. (*%E *)
  88. (*%F MThread *)
  89. (*%F SameDS *)
  90. push bx
  91. push ds
  92. (*%T _WINDOWS *)
  93. mov bx, ss
  94. (*%E *)
  95. (*%F _WINDOWS *)
  96. mov bx, _DATA
  97. (*%E *)
  98. mov ds, bx
  99. (*%E *)
  100. mov [_errno], ax
  101. (*%F SameDS *)
  102. pop ds
  103. pop bx
  104. (*%E *)
  105. (*%F NearCall *)
  106. ret far 0
  107. (*%E *)
  108. (*%T NearCall *)
  109. ret 0
  110. (*%E *)
  111. (*%E *)
  112. (****************************************************************************)
  113. section
  114. segment _TEXT(CODE,28H)
  115. segment _DATA(DATA, 28H)
  116. extrn __getTID
  117. select _DATA
  118. extrn __threadTable
  119. extrn _errno
  120. select _TEXT
  121. public __errno__ :
  122. (*%T MThread *)
  123. (*%T _DLLOVL *)
  124. push bp
  125. mov bp, sp
  126. (*%E *)
  127. push bx
  128. push ds
  129. mov ax, _DATA
  130. mov ds, ax
  131. call far __getTID
  132. dec ax
  133. mov dx, THREADTABLESIZE
  134. mul dx
  135. mov bx, ax
  136. lea ax, [__threadTable][bx][_ERRNO]
  137. mov dx, ds
  138. pop ds
  139. pop bx
  140. (*%T _DLLOVL *)
  141. pop bp
  142. (*%E *)
  143. ret far 0
  144. (*%E *)
  145. (*%F MThread *)
  146. (*%F SameDS *)
  147. push ds
  148. mov ax, _DATA
  149. mov ds, ax
  150. (*%E *)
  151. mov ax, _errno
  152. (*%F NearPtr *)
  153. mov dx, ds
  154. (*%E *)
  155. (*%F SameDS *)
  156. pop ds
  157. (*%E *)
  158. (*%F NearCall *)
  159. ret far 0
  160. (*%E *)
  161. (*%T NearCall *)
  162. ret 0
  163. (*%E *)
  164. (*%E *)
  165. (****************************************************************************)
  166. section
  167. segment _TEXT(CODE,28H)
  168. segment _DATA(DATA, 28H)
  169. extrn __getTID
  170. select _DATA
  171. extrn __threadTable
  172. extrn _errno
  173. extrn __doserrno
  174. select _TEXT
  175. public __ioerr :
  176. (*%T MThread *)
  177. (*%T _DLLOVL *)
  178. push bp
  179. mov bp, sp
  180. (*%E *)
  181. push ax
  182. push bx
  183. push cx
  184. push dx
  185. push di
  186. push ds
  187. mov bx, _DATA
  188. mov ds, bx
  189. push ax
  190. call far __getTID
  191. pop cx
  192. dec ax
  193. mov dx, THREADTABLESIZE
  194. mul dx
  195. mov bx, ax
  196. mov di, __threadTable
  197. mov [di][bx][_ERRNO], cx
  198. pop ds
  199. pop di
  200. pop dx
  201. pop cx
  202. pop bx
  203. pop ax
  204. (*%T _DLLOVL *)
  205. pop bp
  206. (*%E *)
  207. ret far 0
  208. (*%E *)
  209. (*%F MThread *)
  210. push bx
  211. push cx
  212. push dx
  213. (*%F NearPtr *)
  214. push ds
  215. (*%T _WINDOWS *)
  216. mov bx, ss
  217. (*%E *)
  218. (*%F _WINDOWS *)
  219. mov bx, _DATA
  220. (*%E *)
  221. mov ds, bx
  222. (*%E *)
  223. mov [_errno], ax
  224. mov [__doserrno], ax
  225. (*%F NearPtr *)
  226. pop ds
  227. (*%E *)
  228. pop dx
  229. pop cx
  230. pop bx
  231. (*%E *)
  232. (*%F NearCall *)
  233. ret far 0
  234. (*%E *)
  235. (*%T NearCall *)
  236. ret 0
  237. (*%E *)
  238. dw __doserrno
  239. section
  240. (****************************************************************************)
  241. segment _DATA(DATA,28H)
  242. segment _TEXT(CODE,28H)
  243. extrn __FloatJmpSave
  244. extrn __FloatJmpRestore
  245. (*%T _DLLOVL *)
  246. extrn Loader$RetGate
  247. (*%E *)
  248. (* int setjmp(jmp_buf task_state)
  249. Saves current task state and returns 0. *)
  250. task_state = frame
  251. public __setjmp :
  252. push bp
  253. mov bp, sp
  254. public __setjmp2 :
  255. (*%T _DLLOVL *)
  256. xchg ax, [bp][2]
  257. xchg bx, [bp][4]
  258. call far Loader$RetGate
  259. xchg ax, [bp][2]
  260. xchg bx, [bp][4]
  261. (*%E *)
  262. push bx
  263. push cx
  264. push dx
  265. push di
  266. push es
  267. mov cx, di
  268. mov dx, es
  269. (*%F RegParam *)
  270. (*%F NearPtr *)
  271. les di, [bp][task_state]
  272. (*%E *)
  273. (*%T NearPtr *)
  274. mov di, ds
  275. mov es, di
  276. mov di, [bp][task_state]
  277. (*%E *)
  278. (*%E *)
  279. (*%T RegParam *)
  280. (*%F NearPtr *)
  281. mov es, bx
  282. mov di, ax
  283. (*%E *)
  284. (*%T NearPtr *)
  285. mov di, ds
  286. mov es, di
  287. mov di, ax
  288. (*%E *)
  289. (*%E *)
  290. (*%T RegParam *)
  291. call far __FloatJmpSave
  292. (*%E *)
  293. lea ax, [bp][frame]
  294. stosw (* save registers *)
  295. mov ax, ss
  296. stosw
  297. pushf
  298. pop ax
  299. stosw
  300. (*%F NearCall *)
  301. mov ax, [bp][4]
  302. (*%E *)
  303. (*%T NearCall *)
  304. mov ax, cs
  305. (*%E *)
  306. stosw
  307. mov ax, [bp][2]
  308. stosw
  309. mov ax, [bp]
  310. stosw
  311. mov ax, cx
  312. stosw
  313. mov ax, dx
  314. stosw
  315. mov ax, si
  316. stosw
  317. mov ax, ds
  318. stosw
  319. sub ax, ax (* return 0 *)
  320. pop es
  321. pop di
  322. pop dx
  323. pop cx
  324. pop bx
  325. pop bp
  326. (*%F NearCall *)
  327. ret far 0
  328. (*%E *)
  329. (*%T NearCall *)
  330. ret 0
  331. (*%E *)
  332. (* _setjmp ENDP *)
  333. (****************************************************************************)
  334. (* void longjmp ( task_state, val);
  335. Restores task state and jumps to landing_zone.
  336. Returns val. (If val == 0, val++) *)
  337. (*%F RegParam *)
  338. task_state = frame
  339. (*%F NearPtr *)
  340. val = 4+frame
  341. (*%E *)
  342. (*%T NearPtr *)
  343. val = 2+frame
  344. (*%E *)
  345. (*%E *)
  346. public _longjmp :
  347. push bp
  348. mov bp, sp
  349. public _longjmp2 :
  350. (*%F RegParam *)
  351. mov bx, [bp][val]
  352. cmp bx, 1 (* generates carry if BX = 0 *)
  353. adc bx, 0 (* (val) BX = (BX) ? BX : 1; *)
  354. (*%F NearPtr *)
  355. lds si, [bp][task_state]
  356. (*%E *)
  357. (*%T NearPtr *)
  358. mov si, [bp][task_state]
  359. (*%E *)
  360. (*%E *)
  361. (*%T RegParam *)
  362. (*%F NearPtr *)
  363. mov ds, bx
  364. mov si, ax
  365. mov bx, cx
  366. (*%E *)
  367. (*%T NearPtr *)
  368. mov si, ax
  369. (*%E *)
  370. cmp bx, 1 (* generates carry if BX = 0 *)
  371. adc bx, 0 (* (val) BX = (BX) ? BX : 1; *)
  372. (*%E *)
  373. (*%T RegParam *)
  374. call far __FloatJmpRestore
  375. (*%E *)
  376. (* Change context begins with changing stack. *)
  377. lodsw
  378. mov ss, [si]
  379. xchg sp, ax
  380. add si, 2
  381. (* Build the return-link to the caller
  382. of setjmp on the restored stack. *)
  383. lodsw
  384. push ax
  385. lodsw
  386. push ax
  387. lodsw
  388. push ax
  389. (* Restore other working registers. *)
  390. lodsw
  391. xchg bp, ax
  392. lodsw
  393. xchg di, ax
  394. lodsw
  395. mov es, ax
  396. lodsw
  397. mov ds, [si]
  398. xchg si, ax
  399. xchg ax, bx (* return val in AX *)
  400. iret (* return to caller of setjmp *)
  401. (* _longjmp ENDP *)
  402. (*****************************************************************************)
  403. (*%F _WINDOWS *)
  404. section
  405. segment _TEXT(CODE,28H)
  406. segment _DATA(DATA, 28H)
  407. select _TEXT
  408. jmpAdr : dw 0, 0
  409. public __chain_intr :
  410. (*%F RegParam *)
  411. varCS = 2+frame
  412. varIP = frame
  413. push bp
  414. mov bp, sp
  415. mov bx, [bp][varCS]
  416. mov ax, [bp][varIP]
  417. pop bp
  418. (*%E *)
  419. mov sp, bp
  420. add sp, 2
  421. mov cs:[jmpAdr][2], bx
  422. mov cs:[jmpAdr], ax
  423. pop es
  424. pop ds
  425. pop di
  426. pop si
  427. pop bp
  428. pop bx
  429. pop bx
  430. pop dx
  431. pop cx
  432. pop ax
  433. jmp far cs:[jmpAdr]
  434. (*%E *)
  435. (*%F _OS2 *)
  436. (****************************************************************************)
  437. section
  438. segment SIG_TEXT(CODE, 28H)
  439. public @ReloadCache :
  440. ret far 0
  441. (****************************************************************************)
  442. section
  443. segment _TEXT(CODE,28H)
  444. segment _DATA(DATA, 28H)
  445. select _DATA
  446. select _TEXT
  447. public __sysmsg :
  448. push di
  449. push ds
  450. mov es, bx
  451. mov di, ax
  452. mov dx, ax
  453. mov cx, -1
  454. sub al ,al
  455. repne; scasb
  456. not cx
  457. dec cx
  458. mov ds, bx
  459. mov bx, 2
  460. mov ah, 40H
  461. extrn @DosInterrupt
  462. (*%F NearCall *)
  463. call far @DosInterrupt
  464. (*%E *)
  465. (*%T NearCall *)
  466. call @DosInterrupt
  467. (*%E *)
  468. pop ds
  469. pop di
  470. ret far 0
  471. section
  472. (****************************************************************************)
  473. (* *)
  474. (* Fatal Error Handling Routines *)
  475. (* Normal Use: *)
  476. (* call far __FatalErrorPos *)
  477. (* mov cx, "Error Code" *)
  478. (* push cx *)
  479. (* push dx *)
  480. (* push ax *)
  481. (* call far __FatalError *)
  482. (* *)
  483. (****************************************************************************)
  484. segment _TEXT(CODE,28H)
  485. segment _DATA(DATA, 28H)
  486. extrn __exit
  487. extrn _exit
  488. extrn __osmajor
  489. extrn __psp
  490. extrn @ExitCode
  491. extrn @RecursiveExit
  492. extrn __core_lock
  493. extrn @DosInterrupt
  494. select _DATA
  495. filename : db 'ERRORINF.$$$', 0
  496. err_msg : db 'Runtime Error - ERRORINF.$$$ Created', 0DH, 0AH, 0
  497. cr_str : db 0DH, 0AH, 0
  498. extrn __pmd_stub
  499. stderr = 2
  500. select _TEXT
  501. public __FatalErrorPos :
  502. CSVar = 2
  503. IPVar = 0
  504. mov bx, sp
  505. mov ax, ss:[bx][CSVar]
  506. mov dx, ss:[bx][IPVar]
  507. ret far 0
  508. public __FatalError :
  509. Seg = lframe+6
  510. Off = 2+lframe+6
  511. Code = 4+lframe+6
  512. file = -2
  513. cbuf = -92
  514. locals = 92
  515. push bp
  516. push di
  517. push si
  518. push ds
  519. mov bp, sp
  520. sub sp, locals
  521. (*%F SameDS *)
  522. mov ax, _DATA
  523. mov ds, ax
  524. (*%E *)
  525. extrn CoreSig@FatalErrorHandler
  526. cmp word [CoreSig@FatalErrorHandler][2], 0
  527. je noHandler
  528. call far [CoreSig@FatalErrorHandler]
  529. or al, al
  530. jz noHandler
  531. mov sp,bp
  532. pop ds
  533. pop si
  534. pop di
  535. pop bp
  536. (*%T NearCall *)
  537. ret 0
  538. (*%E *)
  539. (*%F NearCall *)
  540. ret far 0
  541. (*%E *)
  542. noHandler:
  543. (*%T MThread *)
  544. call far [__core_lock]
  545. (*%E *)
  546. cmp byte [@RecursiveExit], 0
  547. je firstCall
  548. mov ax, [bp][Code]
  549. (*%F RegParam *)
  550. push ax
  551. (*%E *)
  552. (*%F NearCall *)
  553. call far __exit
  554. (*%E *)
  555. (*%T NearCall *)
  556. call __exit
  557. (*%E *)
  558. firstCall:
  559. (*%F _WINDOWS *)
  560. cmp word [__pmd_stub][2], 0
  561. jz notInstalled2
  562. sub cx, cx
  563. sub dx, dx
  564. mov ax, [bp][Off]
  565. mov bx, [bp][Seg]
  566. mov di, [bp][Code]
  567. call far [__pmd_stub]
  568. notInstalled2:
  569. mov dx, ss
  570. mov es, dx
  571. mov ah, 3CH
  572. mov dx, filename
  573. sub cx, cx
  574. (*%T MThread *)
  575. cli
  576. (*%E *)
  577. (*%F NearCall *)
  578. call far @DosInterrupt
  579. (*%E *)
  580. (*%T NearCall *)
  581. call @DosInterrupt
  582. (*%E *)
  583. jc noOutput
  584. mov [bp][file], ax
  585. mov bx, [bp][Seg]
  586. lea di, [bp][cbuf]
  587. call hexConv
  588. mov al, '/'
  589. stosb
  590. (*%F _DLLOVL *)
  591. sub bx,[__psp]
  592. sub bx,10H
  593. (*%E *)
  594. (*%T _DLLOVL *)
  595. push es
  596. mov ax, bx
  597. extrn Loader$Getseg
  598. call far Loader$Getseg
  599. mov bx, ax
  600. pop es
  601. (*%E *)
  602. call hexConv
  603. mov al, ':'
  604. stosb
  605. mov bx, [bp][Off]
  606. call hexConv
  607. mov ax, 20H
  608. stosb
  609. mov bx, [bp][Code]
  610. call hexConv
  611. mov ax,0A0DH
  612. stosw
  613. push ds
  614. cmp word [__osmajor], 2 (* process command line *)
  615. je exeNameExit
  616. mov ds, [__psp]
  617. mov ds, ds:[2CH]
  618. xor cx, cx
  619. mov si, cx
  620. exeLoop: (* get address of exe name *)
  621. lodsw
  622. dec si
  623. or ax,ax
  624. loopne exeLoop
  625. add si,3
  626. exeNameLoop:
  627. lodsb
  628. or al,al
  629. jz exeNameExit
  630. stosb
  631. jmp exeNameLoop
  632. exeNameExit:
  633. pop ds
  634. mov ax,0A0DH
  635. stosw
  636. mov ax,1AH
  637. stosw
  638. lea di, [bp][cbuf]
  639. call wrString
  640. mov ah, 3EH
  641. mov bx, [bp][file]
  642. (*%F NearCall *)
  643. call far @DosInterrupt
  644. (*%E *)
  645. (*%T NearCall *)
  646. call @DosInterrupt
  647. (*%E *)
  648. noOutput:
  649. mov word [bp][file], stderr
  650. mov di, ds
  651. mov es, di
  652. mov di, err_msg
  653. call wrString
  654. (*%E _WINDOWS *)
  655. mov ax, [bp][Code]
  656. (*%F RegParam *)
  657. push ax
  658. (*%E *)
  659. (*%F NearCall *)
  660. call far _exit
  661. (*%E *)
  662. (*%T NearCall *)
  663. call _exit
  664. (*%E *)
  665. hexConv:
  666. mov ax, bx
  667. and ax, 0F000H
  668. mov cl, 12
  669. call toAscii
  670. mov ax, bx
  671. and ax, 0F00H
  672. mov cl, 8
  673. call toAscii
  674. mov ax, bx
  675. and ax, 0F0H
  676. mov cl, 4
  677. call toAscii
  678. mov ax, bx
  679. and ax, 0FH
  680. sub cl, cl
  681. toAscii:
  682. shr ax, cl
  683. cmp al, 0AH
  684. jge hexDig
  685. add al, 30H
  686. jmp store
  687. hexDig:
  688. add al, 55
  689. store:
  690. stosb
  691. ret 0
  692. wrString:
  693. mov dx, di
  694. mov cx, -1
  695. sub al, al
  696. repne; scasb
  697. not cx
  698. dec cx
  699. push ds
  700. mov bx, es
  701. mov ds, bx
  702. mov bx, [bp][file]
  703. mov ah, 40H
  704. (*%F NearCall *)
  705. call far @DosInterrupt
  706. (*%E *)
  707. (*%T NearCall *)
  708. call @DosInterrupt
  709. (*%E *)
  710. pop ds
  711. ret 0
  712. section
  713. (*************************************************************************)
  714. (*%T SameDS *)
  715. segment _TEXT(CODE,28H)
  716. (*%E *)
  717. (*%F SameDS *)
  718. segment SIG_TEXT(CODE,28H)
  719. (*%E *)
  720. segment _DATA(DATA,28H)
  721. extrn __sysmsg
  722. select _DATA
  723. ErrMsg : db 'Dos Re-entered', 0
  724. (*%T SameDS *)
  725. select _TEXT
  726. (*%E *)
  727. (*%F SameDS *)
  728. select SIG_TEXT
  729. (*%E *)
  730. extrn @InProgramFlag
  731. extrn __FatalErrorPos
  732. extrn __FatalError
  733. public @DosInterrupt :
  734. (*%T _DLLOVL *)
  735. push bp
  736. mov bp, sp
  737. (*%E *)
  738. (*%F _WINDOWS *)
  739. cmp byte cs:[@InProgramFlag], 1
  740. jne reEntering
  741. mov byte cs:[@InProgramFlag], 0
  742. (*%E *)
  743. int 21H
  744. (*%F _WINDOWS *)
  745. mov byte cs:[@InProgramFlag], 1
  746. (*%E *)
  747. (*%T _DLLOVL *)
  748. pop bp
  749. (*%E *)
  750. (*%F NearCall *)
  751. ret far 0
  752. (*%E *)
  753. (*%T NearCall *)
  754. ret 0
  755. (*%E *)
  756. reEntering:
  757. (*%F _WINDOWS *)
  758. mov ax, _DATA
  759. mov ds, ax
  760. mov si, ErrMsg
  761. eLoop:
  762. lodsb
  763. or al, al
  764. jz Exit
  765. mov ah, 0EH
  766. mov bx, 0FFH
  767. int 10H
  768. jmp eLoop
  769. Exit:
  770. mov ax, 4C17H
  771. int 21H
  772. (*%E *)
  773. (*****************************************************************************)
  774. section
  775. (*%T SameDS *)
  776. segment _TEXT(CODE, 28H)
  777. (*%E *)
  778. (*%F SameDS *)
  779. segment SIG_TEXT(CODE, 28H)
  780. (*%E *)
  781. extrn @InProgramFlag
  782. (*%F RegParam *)
  783. on = frame
  784. RetSize = 2
  785. (*%E *)
  786. (*%T RegParam *)
  787. RetSize = 0
  788. (*%E *)
  789. public _SetInProgramFlag :
  790. (*%F RegParam *)
  791. push bp
  792. mov bp,sp
  793. mov al, [bp][on]
  794. (*%E *)
  795. (*%T RegParam *)
  796. (*%T _DLLOVL *)
  797. push bp
  798. mov bp, sp
  799. (*%E *)
  800. (*%E *)
  801. mov cs:[@InProgramFlag], al
  802. (*%F RegParam *)
  803. pop bp
  804. (*%E *)
  805. (*%T RegParam *)
  806. (*%T _DLLOVL *)
  807. pop bp
  808. (*%E *)
  809. (*%E *)
  810. (*%F NearCall *)
  811. ret far RetSize
  812. (*%E *)
  813. (*%T NearCall *)
  814. ret RetSize
  815. (*%E *)
  816. public _GetInProgramFlag :
  817. (*%T _DLLOVL *)
  818. push bp
  819. mov bp, sp
  820. (*%E *)
  821. sub ah,ah
  822. mov al,cs:[@InProgramFlag]
  823. (*%T _DLLOVL *)
  824. pop bp
  825. (*%E *)
  826. (*%F NearCall *)
  827. ret far 0
  828. (*%E *)
  829. (*%T NearCall *)
  830. ret 0
  831. (*%E *)
  832. (****************************************************************************)
  833. (*%F _WINDOWS *)
  834. section
  835. segment _DATA(DATA,28H)
  836. (*%F SameDS *)
  837. segment SIG_TEXT(CODE,28H)
  838. (*%E *)
  839. (*%T SameDS *)
  840. segment _TEXT(CODE,28H)
  841. (*%E *)
  842. extrn __exitbreak
  843. extrn __FatalError
  844. extrn __SSisDS
  845. extrn __far_ss
  846. extrn @InProgramFlag
  847. extrn @StopProgramFlag
  848. IrptNo = 0
  849. IrptLoaded = 1
  850. IrptMsg = 2
  851. IrptHandlerIP = 4
  852. IrptChainIP = 6
  853. IrptChainCS = 8
  854. (*@@@ Removed 9/4/91
  855. ID8 : db 08H,0; dw 0, Trap8, 0,0
  856. ID1B: db 1BH,0; dw 0, Trap1B, 0,0
  857. @@@*)
  858. ID23: db 23H,0; dw 0, Trap23, 0,0
  859. SetIrpt :
  860. (* IN CS:SI = Irpt Def *)
  861. cmp byte cs:[si][IrptLoaded], 1
  862. je $AlreadySet
  863. push ax
  864. push bx
  865. push dx
  866. push ds
  867. push es
  868. mov ax, cs (* ds = cs *)
  869. mov ds, ax
  870. mov byte [si][IrptLoaded], 1
  871. mov ah,35H (* get vector *)
  872. mov al,[si][IrptNo]
  873. int 21H
  874. mov [si][IrptChainIP],bx
  875. mov [si][IrptChainCS],es
  876. mov ah,25H (* set vector *)
  877. mov dx,[si][IrptHandlerIP]
  878. int 21H
  879. pop es
  880. pop ds
  881. pop dx
  882. pop bx
  883. pop ax
  884. $AlreadySet:
  885. ret near 0
  886. ResetIrpt :
  887. (* IN CS:SI = Irpt Def *)
  888. cmp byte cs:[si][IrptLoaded], 1
  889. jne $AlreadyReset
  890. mov byte cs:[si][IrptLoaded], 1
  891. push ax
  892. push dx
  893. push ds
  894. mov ah, 25H (* set vector *)
  895. mov al, cs:[si][IrptNo]
  896. mov dx, cs:[si][IrptChainIP]
  897. mov ds, cs:[si][IrptChainCS]
  898. int 21H
  899. pop ds
  900. pop dx
  901. pop ax
  902. $AlreadyReset:
  903. ret near 0
  904. public @ResetBreakInterrupt :
  905. push si
  906. push es
  907. (*@@@ Removed 9/4/91
  908. mov si,ID8
  909. call ResetIrpt
  910. mov si,ID1B
  911. call ResetIrpt
  912. @@@*)
  913. mov si,ID23
  914. call ResetIrpt
  915. mov si, _DATA
  916. mov es, si
  917. mov word es:[__exitbreak], 0
  918. mov word es:[__exitbreak][2], 0
  919. pop es
  920. pop si
  921. ret far 0
  922. public @SetBreakInterrupt :
  923. push si
  924. push es
  925. (*@@@ Removed 9/4/91
  926. mov si,ID1B
  927. call SetIrpt
  928. @@@*)
  929. mov si,ID23
  930. call SetIrpt
  931. mov si, _DATA
  932. mov es, si
  933. mov word es:[__exitbreak], @ResetBreakInterrupt
  934. mov word es:[__exitbreak][2], cs
  935. pop es
  936. pop si
  937. ret far 0
  938. (*@@@ Removed 9/4/91
  939. Trap1B : (* DOS Ctrl-Break Handler *)
  940. cmp byte cs:[@StopProgramFlag], 1
  941. je $noInstall
  942. mov byte cs:[@StopProgramFlag], 1 (* Signal Break *)
  943. push ax
  944. push ds
  945. sub ax, ax
  946. mov ds, ax
  947. mov byte cs:[ID8][IrptLoaded], 1
  948. mov ax, Trap8
  949. xchg ax, ds:[8*4]
  950. mov cs:[ID8][IrptChainIP], ax
  951. mov ax, cs
  952. xchg ax, ds:[8*4+2]
  953. mov cs:[ID8][IrptChainCS], ax
  954. pop ds
  955. pop ax
  956. $noInstall:
  957. iret
  958. @@@*)
  959. Trap23 : (* DOS Ctrl-C Handler *)
  960. mov ax, _DATA
  961. mov ds, ax
  962. cmp byte [__SSisDS], 0
  963. je $FarStack
  964. mov ss, ax (* OS/2 DOS Box Can Corrupt SS *)
  965. jmp $StackSet
  966. $FarStack:
  967. mov ss, [__far_ss]
  968. $StackSet:
  969. push bp
  970. mov bp,sp
  971. mov byte cs:[@InProgramFlag], 1
  972. jmp $Trap23Continue
  973. (*@@@ Removed 9/4/91
  974. Trap8 : (* DOS Timer-Tick Handler *)
  975. cmp byte cs:[@InProgramFlag], 1
  976. je OkToBreak
  977. jmp far cs:[ID8][IrptChainIP] (* Chain *)
  978. OkToBreak:
  979. mov al,20H
  980. out 20H,al (* Send eoi *)
  981. @@@*)
  982. public @UserBreak:
  983. mov ax, _DATA
  984. mov ds, ax
  985. $Trap23Continue:
  986. call far @ResetBreakInterrupt
  987. mov byte cs:[@StopProgramFlag], 0 (* Allow DOS access *)
  988. mov bx, sp
  989. mov cx, 0FFH (* General Failure Return Code *)
  990. push cx
  991. push ss:[bx][30H]
  992. push ss:[bx][32H]
  993. call far __FatalError
  994. public _EnableBreakCheck :
  995. (*%T _DLLOVL *)
  996. push bp
  997. mov bp, sp
  998. (*%E *)
  999. call far @SetBreakInterrupt
  1000. (*%T _DLLOVL *)
  1001. pop bp
  1002. (*%E *)
  1003. (*%F NearCall *)
  1004. ret far 0
  1005. (*%E *)
  1006. (*%T NearCall *)
  1007. ret 0
  1008. (*%E *)
  1009. public _DisableBreakCheck :
  1010. (*%T _DLLOVL *)
  1011. push bp
  1012. mov bp, sp
  1013. (*%E *)
  1014. push ax
  1015. push ds
  1016. call far @ResetBreakInterrupt
  1017. sub ax,ax
  1018. mov ds,ax
  1019. pushf
  1020. cli
  1021. mov word ds:[23H*4], DummyBreak
  1022. mov word ds:[23H*4][2],cs
  1023. popf
  1024. pop ds
  1025. pop ax
  1026. (*%T _DLLOVL *)
  1027. pop bp
  1028. (*%E *)
  1029. (*%F NearCall *)
  1030. ret far 0
  1031. (*%E *)
  1032. (*%T NearCall *)
  1033. ret 0
  1034. (*%E *)
  1035. DummyBreak :
  1036. iret
  1037. (*%E _WINDOWS*)
  1038. (****************************************************************************)
  1039. section
  1040. (*%F SameDS *)
  1041. segment SIG_TEXT(CODE, 28H)
  1042. (*%E *)
  1043. (*%T SameDS *)
  1044. segment _TEXT(CODE, 28H)
  1045. (*%E *)
  1046. segment _DATA(DATA,28H)
  1047. extrn __exit
  1048. extrn __sigsetup
  1049. (*%F SameDS *)
  1050. select SIG_TEXT
  1051. (*%E *)
  1052. (*%T SameDS *)
  1053. select _TEXT
  1054. (*%E *)
  1055. _23handler :
  1056. sti
  1057. mov ax, _DATA (*ss*)
  1058. mov ds, ax
  1059. stc
  1060. mov al, 01FH
  1061. (*%F NearCall *)
  1062. call far __exit
  1063. (*%E *)
  1064. (*%T NearCall *)
  1065. call __exit
  1066. (*%E *)
  1067. public __SigInit :
  1068. cmp word [__sigsetup], 0
  1069. jnz noInt
  1070. push ds
  1071. push cs
  1072. pop ds
  1073. mov dx, _23handler
  1074. mov ax, 2523H (* set vector 23h to new handler *)
  1075. int 21H
  1076. mov ax, 3301H
  1077. mov dl, 1
  1078. int 21H
  1079. pop ds
  1080. noInt:
  1081. (*%F NearCall *)
  1082. ret far 0
  1083. (*%E *)
  1084. (*%T NearCall *)
  1085. ret 0
  1086. (*%E *)
  1087. (****************************************************************************)
  1088. section
  1089. segment _INIT(INIT_CODE,28H)
  1090. segment _TEXT(CODE,28H)
  1091. segment _DATA(DATA,28H)
  1092. extrn __initsig
  1093. select _TEXT
  1094. do_initsig : (* defined later on ! *)
  1095. select _INIT
  1096. (*%F NearCall *)
  1097. initsig : dw MAGIC_NUM
  1098. db PR3
  1099. dd do_initsig
  1100. (*%E *)
  1101. (*%T NearCall *)
  1102. initsig : dw MAGIC_NUM
  1103. db PR3
  1104. dw do_initsig
  1105. (*%E *)
  1106. select _DATA
  1107. public __NSIG : dw 22, initsig
  1108. select _TEXT
  1109. (*%T _WINDOWS *)
  1110. (*%F NearCall *)
  1111. inc bp
  1112. push bp
  1113. mov bp, sp
  1114. (*%E *)
  1115. (*%E *)
  1116. (*%T _DLLOVL *)
  1117. push bp
  1118. mov bp, sp
  1119. (*%E *)
  1120. call far __initsig
  1121. (*%F NearCall *)
  1122. (*%T _DLLOVL *)
  1123. pop bp
  1124. (*%E *)
  1125. (*%T _WINDOWS *)
  1126. pop bp
  1127. dec bp
  1128. (*%E *)
  1129. ret far 0
  1130. (*%E *)
  1131. (*%T NearCall *)
  1132. ret 0
  1133. (*%E *)
  1134. (****************************************************************************)
  1135. section
  1136. (*%T SameDS *)
  1137. segment _TEXT(CODE,28H)
  1138. (*%E *)
  1139. (*%F SameDS *)
  1140. segment SIG_TEXT(CODE,28H)
  1141. (*%E *)
  1142. segment _DATA(DATA, 28H)
  1143. segment _BSS(BSS, 28H)
  1144. extrn __FatalError
  1145. extrn __FatalErrorPos
  1146. extrn __seterrno
  1147. extrn __table_raise
  1148. select _BSS
  1149. extrn __sigTable
  1150. SIGINT = 8
  1151. SIGILL = 16
  1152. SIGFPE = 32
  1153. SIGSEGV = 44
  1154. SIGTERM = 60
  1155. SIGUSR1 = 64
  1156. SIGUSR2 = 68
  1157. SIGUSR3 = 80
  1158. SIGABRT = 88
  1159. select _DATA
  1160. DefMsg : db 'Process Terminated By Signal', 0DH, 0AH, 0
  1161. IntMsg : db 'Process Terminated By Ctl C', 0DH, 0AH, 0
  1162. FpeMsg : db 'Process Terminated By Floating Point Exception', 0DH, 0AH, 0
  1163. AbrtMsg : db 'Process Terminated By Abort', 0DH, 0AH, 0
  1164. extrn __sigsetup
  1165. extrn __vec0
  1166. extrn __vec2
  1167. extrn __vec4
  1168. extrn __vec16
  1169. extrn __vec23
  1170. extrn __vec24
  1171. extrn __exitsig
  1172. extrn __NSIG
  1173. (*%T SameDS *)
  1174. select _TEXT
  1175. (*%E *)
  1176. (*%F SameDS *)
  1177. select SIG_TEXT
  1178. (*%E *)
  1179. SIG_ERR = -1
  1180. SIG_DFL = 0
  1181. SIG_IGN = 1
  1182. __do_exitsig :
  1183. (*%F SameDS *)
  1184. push ds
  1185. mov ax, _BSS
  1186. mov ds, ax
  1187. (*%E *)
  1188. push ds
  1189. mov dx, [__vec0]
  1190. mov ds, [__vec0][2]
  1191. mov ax, 2500H (* restore vector 0H *)
  1192. int 21H
  1193. pop ds
  1194. push ds
  1195. mov dx, [__vec4]
  1196. mov ds, [__vec4][2]
  1197. mov ax, 2504H (* restore vector 04H *)
  1198. int 21H
  1199. pop ds
  1200. push ds
  1201. mov dx, [__vec2]
  1202. mov ds, [__vec2][2]
  1203. mov ax, 2502H (* restore vector 02H *)
  1204. int 21H
  1205. pop ds
  1206. push ds
  1207. mov dx, [__vec24]
  1208. mov cx, [__vec24][2]
  1209. jcxz no24
  1210. mov ds, cx
  1211. mov ax, 2524H (* restore vector 24H *)
  1212. int 21H
  1213. no24:
  1214. pop ds
  1215. (*%F SameDS *)
  1216. pop ds
  1217. (*%E *)
  1218. (*%F NearCall *)
  1219. ret far 0
  1220. (*%E *)
  1221. (*%T NearCall *)
  1222. ret 0
  1223. (*%E *)
  1224. setVec:
  1225. mov ah, 35H
  1226. int 21H
  1227. mov [si], bx
  1228. mov [si][2], es
  1229. push ds
  1230. push cs
  1231. pop ds
  1232. mov ah, 25H
  1233. int 21H
  1234. pop ds
  1235. ret 0
  1236. public __initsig :
  1237. (* set up handler table *)
  1238. (*%F SameDS *)
  1239. push ds
  1240. mov ax, _BSS
  1241. mov ds, ax
  1242. (*%E *)
  1243. cmp word [__sigsetup], 0
  1244. jnz near noInit
  1245. not word [__sigsetup]
  1246. mov bx, __sigTable
  1247. (*%F _WINDOWS *)
  1248. (*%F NearCall *)
  1249. mov word [__exitsig][2], cs
  1250. (*%E *)
  1251. mov word [__exitsig], __do_exitsig
  1252. (*%E *)
  1253. sub dx, dx
  1254. mov ax, SIG_DFL
  1255. mov [bx][SIGABRT], ax (* SIGABRT *)
  1256. mov [bx][SIGABRT][2], dx
  1257. mov [bx][SIGILL], ax (* SIGILL *)
  1258. mov [bx][SIGILL][2], dx
  1259. mov [bx][SIGSEGV], ax (* SIGSEGV *)
  1260. mov [bx][SIGSEGV][2], dx
  1261. mov [bx][SIGINT], ax (* SIGINT *)
  1262. mov [bx][SIGINT][2], dx
  1263. mov [bx][SIGFPE], ax (* SIGFPE *)
  1264. mov [bx][SIGFPE][2], dx
  1265. mov [bx][SIGTERM], ax (* SIGTERM *)
  1266. mov [bx][SIGTERM][2], dx
  1267. (*%F _WINDOWS *)
  1268. mov ax, 3301H (* BREAK ON *)
  1269. mov dl, 1
  1270. int 21H
  1271. mov al, 23H (* save vector 23H *)
  1272. mov si, __vec23
  1273. mov dx, __sig23
  1274. call setVec
  1275. mov dx, __sigFp
  1276. mov al, 0H (* save vector 0H *)
  1277. mov si, __vec0
  1278. call setVec
  1279. push ds
  1280. mov ax, 0F000H
  1281. mov ds, ax
  1282. cmp byte ds:[0FFFEH], 0FCH (* is it an AT ?*)
  1283. pop ds
  1284. mov dx, __sigFp
  1285. jne got_FP
  1286. in al, 0A5H
  1287. and al, ~20H
  1288. out 0A5H, al
  1289. mov dx, __sigFp_AT
  1290. got_FP:
  1291. mov al, 2H (* save vector 2H *)
  1292. mov si, __vec2
  1293. call setVec
  1294. mov al, 4H (* save vector 4H *)
  1295. mov si, __vec4
  1296. mov dx, __sigFp
  1297. call setVec
  1298. (*
  1299. mov al, 16 (* save vector 16 *)
  1300. mov si, __vec16
  1301. mov dx, __sigFp
  1302. call setVec
  1303. *)
  1304. (*%E *)
  1305. noInit:
  1306. (*%F SameDS *)
  1307. pop ds
  1308. (*%E *)
  1309. ret far 0
  1310. public __sigIgnore :
  1311. (* A signal is ignored by doing nothing. *)
  1312. (*%F NearCall *)
  1313. ret far 0
  1314. (*%E *)
  1315. (*%T NearCall *)
  1316. ret 0
  1317. (*%E *)
  1318. extrn __exc_addr
  1319. public __sigDefault :
  1320. (* Default action when a signal occurs is to exit the program. *)
  1321. push ax
  1322. cmp ax, 2
  1323. je typeINT
  1324. cmp ax, 8
  1325. je typeFPE
  1326. cmp ax, 15
  1327. je typeABRT
  1328. typeDEFAULT:
  1329. mov ax, DefMsg
  1330. jmp sendMessage
  1331. typeINT:
  1332. mov ax, IntMsg
  1333. jmp sendMessage
  1334. typeFPE:
  1335. mov ax, FpeMsg
  1336. jmp sendMessage
  1337. typeABRT:
  1338. mov ax, AbrtMsg
  1339. sendMessage:
  1340. (*%T _WINDOWS *)
  1341. mov bx, ss
  1342. (*%E *)
  1343. (*%F _WINDOWS *)
  1344. mov bx, _DATA
  1345. extrn __sysmsg
  1346. call far __sysmsg
  1347. (*%E *)
  1348. call far __FatalErrorPos
  1349. pop bx
  1350. mov cx, 3H
  1351. push cx
  1352. cmp bx, 8
  1353. jne notFP
  1354. mov dx, [__exc_addr]
  1355. mov ax, [__exc_addr][2]
  1356. notFP:
  1357. push dx
  1358. push ax
  1359. call far __FatalError
  1360. public __sig23 :
  1361. sti
  1362. push ax
  1363. push bx
  1364. push cx
  1365. push dx
  1366. push di
  1367. push si
  1368. push ds
  1369. push es
  1370. push bp
  1371. extrn @InProgramFlag
  1372. mov byte cs:[@InProgramFlag], 1
  1373. (*%T _WINDOWS *)
  1374. mov ax, ss
  1375. (*%E *)
  1376. (*%F _WINDOWS *)
  1377. mov ax, _BSS
  1378. (*%E *)
  1379. mov ds, ax
  1380. stc
  1381. mov bx, SIGINT
  1382. call __table_raise
  1383. pop bp
  1384. pop es
  1385. pop ds
  1386. pop si
  1387. pop di
  1388. pop dx
  1389. pop cx
  1390. pop bx
  1391. pop ax
  1392. ret far 0
  1393. public __sigFp_AT: (* AT floating point interrupt *)
  1394. (* adjust for mistakes in BIOS! *)
  1395. push bp
  1396. mov bp,sp
  1397. cmp word [bp][4], 0F000H
  1398. pop bp
  1399. jne __sigFp
  1400. push ax
  1401. mov al,20H
  1402. out 020H, al
  1403. pop ax
  1404. add sp, 6 (* remove iret to BIOS *)
  1405. public __sigFp :
  1406. sti
  1407. (*%T _WINDOWS *)
  1408. push ds
  1409. push ss
  1410. pop ds
  1411. (*%E *)
  1412. extrn __FloatMathExcepDos
  1413. call far __FloatMathExcepDos
  1414. push ax
  1415. push bx
  1416. push cx
  1417. push dx
  1418. push di
  1419. push si
  1420. push ds
  1421. push es
  1422. push bp
  1423. (*%T _WINDOWS *)
  1424. mov bx, ss
  1425. (*%E *)
  1426. (*%F _WINDOWS *)
  1427. mov bx, _BSS
  1428. (*%E *)
  1429. mov ds, bx
  1430. mov bx, SIGFPE
  1431. extrn __SH_sword
  1432. mov ax, [__SH_sword]
  1433. mov cx, 8
  1434. transLoop:
  1435. shr ax, 1
  1436. jc foundBit
  1437. loop transLoop
  1438. foundBit:
  1439. mov ax, 89H
  1440. sub ax, cx
  1441. call __table_raise
  1442. pop bp
  1443. pop es
  1444. pop ds
  1445. pop si
  1446. pop di
  1447. pop dx
  1448. pop cx
  1449. pop bx
  1450. pop ax
  1451. (*%T _WINDOWS *)
  1452. pop ds
  1453. (*%E *)
  1454. iret
  1455. (****************************************************************************)
  1456. section
  1457. (*%T _WINDOWS *)
  1458. (*%F SameDS *)
  1459. segment SIG_TEXT(CODE, 28H)
  1460. (*%E *)
  1461. (*%T SameDS *)
  1462. segment _TEXT(CODE, 28H)
  1463. (*%E *)
  1464. extrn __table_raise
  1465. extrn __FloatMathExcepDos
  1466. extrn __SH_sword
  1467. SIGFPE = 32
  1468. (*
  1469. Floating-point exception handler for use with the Windows emulator.
  1470. This must return via a ret far rather than an iret
  1471. *)
  1472. public __sigFpWin:
  1473. sti
  1474. push ds
  1475. push ss
  1476. pop ds
  1477. call far __FloatMathExcepDos
  1478. (* This doesn't return for 'expected' math library exceptions *)
  1479. push ax
  1480. push bx
  1481. push cx
  1482. push dx
  1483. push di
  1484. push si
  1485. push ds
  1486. push es
  1487. push bp
  1488. mov bx, ss
  1489. mov ds, bx
  1490. mov bx, SIGFPE
  1491. mov ax, [__SH_sword]
  1492. mov cx, 8
  1493. transLoop:
  1494. shr ax, 1
  1495. jc foundBit
  1496. loop transLoop
  1497. foundBit:
  1498. mov ax, 89H
  1499. sub ax, cx
  1500. call __table_raise
  1501. pop bp
  1502. pop es
  1503. pop ds
  1504. pop si
  1505. pop di
  1506. pop dx
  1507. pop cx
  1508. pop bx
  1509. pop ax
  1510. pop ds
  1511. ret far 0
  1512. (*%E _WINDOWS *)
  1513. (****************************************************************************)
  1514. section
  1515. (*%F SameDS *)
  1516. segment SIG_TEXT(CODE, 28H)
  1517. (*%E *)
  1518. (*%T SameDS *)
  1519. segment _TEXT(CODE, 28H)
  1520. (*%E *)
  1521. segment _DATA(DATA, 28H)
  1522. segment _BSS(BSS, 28H)
  1523. extrn __NSIG
  1524. extrn __sigTable
  1525. extrn __sigIgnore
  1526. extrn __sigDefault
  1527. extrn __seterrno
  1528. (*%T SameDS *)
  1529. select _TEXT
  1530. (*%E *)
  1531. (*%F SameDS *)
  1532. select SIG_TEXT
  1533. (*%E *)
  1534. public _signal :
  1535. (*
  1536. void ( *signal(int sig, void ( * func)()))();
  1537. sets signal handler to func.
  1538. Returns old function pointer.
  1539. *)
  1540. EINVAL = 19
  1541. sig = frame
  1542. func = 2+frame
  1543. (*%F RegParam *)
  1544. push bp
  1545. mov bp, sp
  1546. (*%E *)
  1547. (*%T RegParam *)
  1548. (*%T _DLLOVL *)
  1549. push bp
  1550. mov bp, sp
  1551. (*%E *)
  1552. (*%T NearCall *)
  1553. push cx
  1554. push dx
  1555. (*%E *)
  1556. (*%E *)
  1557. (*%F RegParam *)
  1558. mov bx, [bp][sig] (* check signal number is valid *)
  1559. (*%E *)
  1560. (*%T RegParam *)
  1561. mov dx, cx
  1562. mov cx, bx
  1563. mov bx, ax
  1564. (*%E *)
  1565. (*%F SameDS *)
  1566. push ds
  1567. mov ax, _DATA
  1568. mov ds, ax
  1569. (*%E *)
  1570. or bx, bx
  1571. je sigErr
  1572. cmp bx, [__NSIG]
  1573. ja sigErr
  1574. shl bx, 1 (* calculate table index *)
  1575. shl bx, 1
  1576. add bx, __sigTable
  1577. les ax, [bx]
  1578. (*%F RegParam *)
  1579. mov cx, [bp][func]
  1580. (*%F NearCall *)
  1581. mov dx, [bp][func][2]
  1582. (*%E *)
  1583. (*%E *)
  1584. (*%T NearCall *)
  1585. cmp cx, 1
  1586. jbe constantSig
  1587. mov dx, cs
  1588. jmp storeSig
  1589. constantSig:
  1590. mov dx, 0
  1591. (*%E *)
  1592. storeSig:
  1593. mov [bx], cx (* store new function pointer *)
  1594. mov [bx][2], dx
  1595. mov dx, es (* return old function pointer *)
  1596. jmp sigDone
  1597. sigErr:
  1598. mov ax, EINVAL
  1599. (*%F NearCall *)
  1600. call far __seterrno
  1601. (*%E *)
  1602. (*%T NearCall *)
  1603. call __seterrno
  1604. (*%E *)
  1605. mov ax, -1
  1606. sub dx, dx
  1607. sigDone:
  1608. (*%F SameDS *)
  1609. pop ds
  1610. (*%E *)
  1611. (*%T RegParam *)
  1612. (*%T NearCall *)
  1613. pop dx
  1614. pop cx
  1615. (*%E *)
  1616. (*%T _DLLOVL *)
  1617. pop bp
  1618. (*%E *)
  1619. (*%E *)
  1620. (*%F RegParam *)
  1621. pop bp
  1622. (*%E *)
  1623. (*%F NearCall *)
  1624. ret far 0
  1625. (*%E *)
  1626. (*%T NearCall *)
  1627. ret 0
  1628. (*%E *)
  1629. public _raise :
  1630. (*
  1631. int raise(sig);
  1632. raises signal.
  1633. *)
  1634. (*%F RegParam *)
  1635. sig = frame
  1636. arg = 2+frame
  1637. push bp
  1638. mov bp, sp
  1639. (*%E *)
  1640. push bx
  1641. push cx
  1642. push dx
  1643. (*%T RegParam *)
  1644. mov dx, bx
  1645. (*%E *)
  1646. (*%F SameDS *)
  1647. push ds
  1648. mov cx, _DATA
  1649. mov ds, cx
  1650. (*%E *)
  1651. (*%F RegParam *)
  1652. mov bx, [bp][sig] (* check signal number is valid *)
  1653. (*%E *)
  1654. (*%T RegParam *)
  1655. mov bx, ax
  1656. (*%E *)
  1657. or bx, bx
  1658. je raiseErr
  1659. cmp bx, [__NSIG]
  1660. ja raiseErr
  1661. shl bx, 1 (* calculate table index *)
  1662. shl bx, 1
  1663. (*%F RegParam *)
  1664. mov ax, [bp][arg]
  1665. (*%E *)
  1666. (*%T RegParam *)
  1667. mov ax, dx
  1668. (*%E *)
  1669. call __table_raise
  1670. sub ax, ax
  1671. jmp raiseDone
  1672. raiseErr: (* return -1 *)
  1673. mov ax, -1
  1674. raiseDone:
  1675. (*%F SameDS *)
  1676. pop ds
  1677. (*%E *)
  1678. pop dx
  1679. pop cx
  1680. pop bx
  1681. (*%F RegParam *)
  1682. pop bp
  1683. (*%E *)
  1684. (*%F NearCall *)
  1685. ret far 0
  1686. (*%E *)
  1687. (*%T NearCall *)
  1688. ret 0
  1689. (*%E *)
  1690. SIG_DFL = 0
  1691. SIG_IGN = 1
  1692. SIGINT = 8
  1693. SIGILL = 16
  1694. SIGFPE = 32
  1695. SIGSEGV = 44
  1696. SIGTERM = 60
  1697. SIGUSR1 = 64
  1698. SIGUSR2 = 68
  1699. SIGUSR3 = 80
  1700. SIGABRT = 88
  1701. public __table_raise : (* bx = sig num offset, ax = arg *)
  1702. (* It is important for pmd that this does not insert
  1703. a stack frame for default signals *)
  1704. push di
  1705. push si (* si = arg *)
  1706. push bx
  1707. mov si, ax
  1708. mov ax, bx
  1709. mov di, bx
  1710. shr ax, 1
  1711. shr ax, 1
  1712. mov cx, [di][__sigTable]
  1713. mov dx, [di][__sigTable][2]
  1714. (* If dx = 0 and cx = 1, then SIG_IGN has been specified *)
  1715. pop di
  1716. or dx,dx
  1717. jnz notignore
  1718. jcxz notignore
  1719. jmp trDone
  1720. notignore:
  1721. cmp di, SIGTERM
  1722. je doDFL
  1723. cmp di, SIGABRT
  1724. je doDFL
  1725. cmp di, SIGILL
  1726. je doDFL
  1727. cmp di, SIGSEGV
  1728. je doDFL
  1729. cmp di, SIGINT
  1730. je doDFL
  1731. cmp di, SIGFPE
  1732. je doDFL
  1733. jmp dontSet
  1734. doDFL:
  1735. push ax
  1736. mov ax, SIG_DFL
  1737. mov [di][__sigTable], ax
  1738. mov word [di][__sigTable][2], 0
  1739. pop ax
  1740. dontSet:
  1741. or dx, dx
  1742. jne userRaise
  1743. (*%F NearCall *)
  1744. call far __sigDefault
  1745. (*%E *)
  1746. (*%T NearCall *)
  1747. call __sigDefault
  1748. (*%E *)
  1749. jmp trDone
  1750. userRaise:
  1751. (*%F NearCall *)
  1752. push bp
  1753. mov bp,sp
  1754. push dx (* call address segment *)
  1755. push cx (* call address offset *)
  1756. (*%E *)
  1757. (*%F RegParam *)
  1758. push si (* arg *)
  1759. push ax
  1760. (*%E *)
  1761. (*%T RegParam *)
  1762. mov bx, si (* arg *)
  1763. (*%E *)
  1764. (*%F NearCall *)
  1765. call far [bp][-4]
  1766. mov sp,bp
  1767. pop bp
  1768. (*%E *)
  1769. (*%T NearCall *)
  1770. call cx
  1771. (*%F RegParam *)
  1772. add sp, 4
  1773. (*%E *)
  1774. (*%E *)
  1775. trDone:
  1776. (*%F SameDS *)
  1777. mov bx, _DATA
  1778. mov ds, bx
  1779. (*%E *)
  1780. pop si
  1781. pop di
  1782. ret 0
  1783. (*%E *) (* NOT OS2 *)
  1784. (*%T _OS2 *)
  1785. (****************************************************************************)
  1786. section
  1787. segment _TEXT(CODE,28H)
  1788. segment _DATA(DATA, 28H)
  1789. extrn DOSWRITE
  1790. select _TEXT
  1791. public __sysmsg :
  1792. num_writ = -2
  1793. locals = 2
  1794. push bp
  1795. mov bp, sp
  1796. sub sp, locals
  1797. push di
  1798. mov es, bx
  1799. mov di, ax
  1800. mov dx, ax
  1801. mov cx, -1
  1802. sub al ,al
  1803. repne; scasb
  1804. not cx
  1805. dec cx
  1806. mov ax, 2
  1807. push ax
  1808. push es
  1809. push dx
  1810. push cx
  1811. push ss
  1812. lea ax, [bp][num_writ]
  1813. push ax
  1814. call far DOSWRITE
  1815. pop di
  1816. mov sp, bp
  1817. pop bp
  1818. ret far 0
  1819. (****************************************************************************)
  1820. section
  1821. segment _TEXT(CODE,28H)
  1822. segment _DATA(DATA, 28H)
  1823. extrn __getTID
  1824. select _DATA
  1825. extrn __threadTable
  1826. extrn _errno
  1827. select _TEXT
  1828. public __errno :
  1829. (*%T MThread *)
  1830. mov bx, sp
  1831. (*%F SameDS *)
  1832. push ds
  1833. mov ax, _DATA
  1834. mov ds, ax
  1835. (*%E *)
  1836. (*%F NearCall *)
  1837. call far __getTID
  1838. (*%E *)
  1839. (*%T NearCall *)
  1840. call __getTID
  1841. (*%E *)
  1842. dec ax
  1843. mov dx, THREADTABLESIZE
  1844. mul dx
  1845. mov bx, ax
  1846. mov ax, [__threadTable][bx][_ERRNO]
  1847. (*%F SameDS *)
  1848. pop ds
  1849. (*%E *)
  1850. (*%F NearCall *)
  1851. ret far 0
  1852. (*%E *)
  1853. (*%T NearCall *)
  1854. ret 0
  1855. (*%E *)
  1856. (*%E *)
  1857. (*%F MThread *)
  1858. (*%F SameDS *)
  1859. push ds
  1860. mov ax, _DATA
  1861. mov ds, ax
  1862. (*%E *)
  1863. mov ax, [_errno]
  1864. (*%F SameDS *)
  1865. pop ds
  1866. (*%E *)
  1867. (*%F NearCall *)
  1868. ret far 0
  1869. (*%E *)
  1870. (*%T NearCall *)
  1871. ret 0
  1872. (*%E *)
  1873. (*%E *)
  1874. (****************************************************************************)
  1875. section
  1876. segment _TEXT(CODE,28H)
  1877. segment _DATA(DATA, 28H)
  1878. extrn DOSOPEN
  1879. extrn DOSWRITE
  1880. extrn DOSCLOSE
  1881. extrn DOSGETMODNAME
  1882. extrn __exit
  1883. extrn __osmode
  1884. extrn _exit
  1885. extrn __x_di
  1886. extrn __hugeshift
  1887. extrn @RecursiveExit
  1888. select _DATA
  1889. filename : db 'ERRORINF.$$$', 0
  1890. err_msg : db 'Runtime Error - ERRORINF.$$$ Created', 0DH, 0AH, 0
  1891. cr_str : db 0DH, 0AH, 0
  1892. extrn __pmd_stub
  1893. stderr = 2
  1894. O_RDWR = 0002H
  1895. select _TEXT
  1896. pushes = 6
  1897. lframe = 6+pushes
  1898. public __FatalErrorPos :
  1899. CSVar = 2
  1900. IPVar = 0
  1901. mov bx, sp
  1902. mov ax, ss:[bx][CSVar]
  1903. mov dx, ss:[bx][IPVar]
  1904. ret far 0
  1905. public __FatalError :
  1906. Seg = lframe
  1907. Off = 2+lframe
  1908. Code = 4+lframe
  1909. file = -2
  1910. action = -4
  1911. cbuf = -92
  1912. locals = 92
  1913. push bp
  1914. push di
  1915. push si
  1916. push ds
  1917. mov bp, sp
  1918. sub sp, locals
  1919. (*%F SameDS *)
  1920. mov si, _DATA
  1921. mov ds, si
  1922. (*%E *)
  1923. extrn CoreSig@FatalErrorHandler
  1924. cmp word [CoreSig@FatalErrorHandler][2], 0
  1925. je noHandler
  1926. call far [CoreSig@FatalErrorHandler]
  1927. or al, al
  1928. jz noHandler
  1929. mov sp,bp
  1930. pop ds
  1931. pop si
  1932. pop di
  1933. pop bp
  1934. (*%T NearCall *)
  1935. ret 0
  1936. (*%E *)
  1937. (*%F NearCall *)
  1938. ret far 0
  1939. (*%E *)
  1940. noHandler:
  1941. cmp byte [@RecursiveExit], 0
  1942. je firstCall
  1943. mov ax, [bp][Code]
  1944. (*%F RegParam *)
  1945. push ax
  1946. (*%E *)
  1947. (*%F NearCall *)
  1948. call far __exit
  1949. (*%E *)
  1950. (*%T NearCall *)
  1951. call __exit
  1952. (*%E *)
  1953. firstCall:
  1954. cmp word [__pmd_stub][2], 0
  1955. jz notInstalled2
  1956. sub cx, cx
  1957. sub dx, dx
  1958. mov ax, [bp][Off]
  1959. mov bx, [bp][Seg]
  1960. mov di, [bp][Code]
  1961. call far [__pmd_stub]
  1962. notInstalled2:
  1963. (*%T _WINDOWS *)
  1964. mov ax, ss
  1965. (*%E *)
  1966. (*%F _WINDOWS *)
  1967. mov ax, _DATA
  1968. (*%E *)
  1969. mov ds, ax
  1970. call openfile
  1971. or ax, ax
  1972. jnz noOutput
  1973. push ss
  1974. pop es
  1975. mov bx, [bp][Seg]
  1976. call calcSegs
  1977. mov bx, [bp][Off]
  1978. call hexConv
  1979. mov ax, 20H
  1980. stosb
  1981. mov bx, [bp][Code]
  1982. call hexConv
  1983. mov ax,0A0DH
  1984. stosw
  1985. cmp word [__osmode], 0
  1986. je exeNameExit
  1987. mov ax, [__x_di]
  1988. push ax
  1989. mov ax,64
  1990. push ax
  1991. push es
  1992. push di
  1993. call far DOSGETMODNAME
  1994. or ax,ax
  1995. jnz exeNameExit
  1996. lea di, [bp][cbuf]
  1997. call wrString
  1998. lea di, [bp][cbuf]
  1999. exeNameExit:
  2000. mov ax,0A0DH
  2001. stosw
  2002. mov ax,1AH
  2003. stosw
  2004. lea di, [bp][cbuf]
  2005. call wrString
  2006. push [bp][file]
  2007. call far DOSCLOSE
  2008. noOutput:
  2009. mov word [bp][file], stderr
  2010. mov di, err_msg
  2011. push ds
  2012. pop es
  2013. call wrString
  2014. mov ax, [bp][Code]
  2015. (*%F RegParam *)
  2016. push ax
  2017. (*%E *)
  2018. (*%F NearCall *)
  2019. call far _exit
  2020. (*%E *)
  2021. (*%T NearCall *)
  2022. call _exit
  2023. (*%E *)
  2024. (*%F SameDS *)
  2025. pop ds
  2026. (*%E *)
  2027. pop si
  2028. pop di
  2029. mov sp, bp
  2030. pop bp
  2031. (*%F NearCall *)
  2032. ret far 0
  2033. (*%E *)
  2034. (*%T NearCall *)
  2035. ret 0
  2036. (*%E *)
  2037. hexConv:
  2038. mov ax, bx
  2039. and ax, 0F000H
  2040. mov cl, 12
  2041. call toAscii
  2042. mov ax, bx
  2043. and ax, 0F00H
  2044. mov cl, 8
  2045. call toAscii
  2046. mov ax, bx
  2047. and ax, 0F0H
  2048. mov cl, 4
  2049. call toAscii
  2050. mov ax, bx
  2051. and ax, 0FH
  2052. sub cl, cl
  2053. toAscii:
  2054. shr ax, cl
  2055. cmp al, 0AH
  2056. jge hexDig
  2057. add al, 30H
  2058. jmp store
  2059. hexDig:
  2060. add al, 55
  2061. store:
  2062. stosb
  2063. ret 0
  2064. wrString:
  2065. mov bx, di
  2066. mov cx, -1
  2067. sub al, al
  2068. repne ; scasb
  2069. not cx
  2070. dec cx
  2071. push [bp][file]
  2072. push es
  2073. push bx
  2074. push cx
  2075. push ss
  2076. lea ax, [bp][action]
  2077. push ax
  2078. call far DOSWRITE
  2079. ret 0
  2080. openfile:
  2081. push ss
  2082. pop es
  2083. push ds
  2084. mov ax, filename
  2085. push ax (* file name *)
  2086. push ss
  2087. lea ax, [bp][file]
  2088. push ax (* handle *)
  2089. push ss
  2090. lea ax, [bp][action]
  2091. push ax (* action *)
  2092. sub bx, bx
  2093. push bx
  2094. push bx (* size *)
  2095. push bx (* attribute *)
  2096. mov ax, 12H
  2097. push ax (* flag *)
  2098. mov ax, O_RDWR+40H
  2099. push ax (* access *)
  2100. push bx (* 0L *)
  2101. push bx
  2102. call far DOSOPEN
  2103. ret 0
  2104. calcSegs:
  2105. lea di, [bp][cbuf]
  2106. call hexConv
  2107. mov al, '/'
  2108. stosb
  2109. mov ax, bx
  2110. sub bx, bx
  2111. mov dx, [__hugeshift]
  2112. cmp word [__osmode], 1
  2113. je lslLoop
  2114. sub bx, bx (* can't do this in real mode so output 0000 *)
  2115. jmp gotSeg
  2116. lslLoop:
  2117. inc bx
  2118. sub ax, dx
  2119. db 0FH, 3, 0C8H (*I lsl cx, ax *)
  2120. jz lslLoop
  2121. gotSeg:
  2122. call hexConv
  2123. mov al, ':'
  2124. stosb
  2125. ret 0
  2126. (****************************************************************************)
  2127. section
  2128. segment _INIT(INIT_CODE,28H)
  2129. segment _TEXT(CODE,28H)
  2130. segment _DATA(DATA,28H)
  2131. extrn __initsig
  2132. select _TEXT
  2133. do_initsig : (* defined later on ! *)
  2134. select _INIT
  2135. (*%F NearCall *)
  2136. initsig : dw MAGIC_NUM
  2137. db PR3
  2138. dd do_initsig
  2139. (*%E *)
  2140. (*%T NearCall *)
  2141. initsig : dw MAGIC_NUM
  2142. db PR3
  2143. dw do_initsig
  2144. (*%E *)
  2145. select _DATA
  2146. public __NSIG : dw 22, initsig
  2147. select _TEXT
  2148. call far __initsig
  2149. (*%F NearCall *)
  2150. ret far 0
  2151. (*%E *)
  2152. (*%T NearCall *)
  2153. ret 0
  2154. (*%E *)
  2155. (****************************************************************************)
  2156. section
  2157. segment _DATA(DATA, 28H)
  2158. segment _TEXT(CODE,28H)
  2159. extrn __FatalError
  2160. extrn __FatalErrorPos
  2161. extrn __seterrno
  2162. extrn DOSSETVEC
  2163. extrn __sigsetup
  2164. select _DATA
  2165. DefMsg : db 'Process Terminated By Signal', 0DH, 0AH, 0
  2166. IntMsg : db 'Process Terminated By Ctl C', 0DH, 0AH, 0
  2167. FpeMsg : db 'Process Terminated By Floating Point Exception', 0DH, 0AH, 0
  2168. AbrtMsg : db 'Process Terminated By Abort', 0DH, 0AH, 0
  2169. extrn __NSIG
  2170. extrn __sigTrans
  2171. extrn __sigTable
  2172. SIGINT = 8
  2173. SIGILL = 16
  2174. SIGFPE = 32
  2175. SIGSEGV = 44
  2176. SIGTERM = 60
  2177. SIGUSR1 = 64
  2178. SIGUSR2 = 68
  2179. SIGUSR3 = 80
  2180. SIGBREAK = 84
  2181. SIGABRT = 88
  2182. select _TEXT
  2183. SIG_ERR = -1
  2184. SIG_DFL = 0
  2185. SIG_IGN = 1
  2186. (*
  2187. initialise the signal table with a default entry for SIGINT (not
  2188. done directly so that segment fixups are avoided).
  2189. *)
  2190. (*%T _XTD *)
  2191. public sigHandlerFPE2:
  2192. push ax
  2193. sub al,al
  2194. out 0F0H, al (* reset PEREQ *)
  2195. mov al, 20H (* End-of-interrupt *)
  2196. out 0A0H, al
  2197. jmp near FPE3
  2198. FPE3:
  2199. jmp near FPE4
  2200. FPE4:
  2201. out 020H, al
  2202. pop ax
  2203. push ax (* make room for status word *)
  2204. push bp
  2205. mov bp,sp
  2206. fstsw [bp][2]
  2207. pop bp
  2208. sti
  2209. (* we now have state the same as in OS2 *)
  2210. (*%E *)
  2211. public sigHandlerFPE1:
  2212. (* NB 8087 status word is on stack (see latest OS2 doc for DOSSETVEC) *)
  2213. extrn __FloatMathExcepOs2
  2214. call far __FloatMathExcepOs2
  2215. public sigHandlerFPE:
  2216. push ax
  2217. push bx
  2218. push cx
  2219. push dx
  2220. push di
  2221. push si
  2222. push ds
  2223. push es
  2224. push bp
  2225. mov bx, _DATA
  2226. mov ds, bx
  2227. mov bx, SIGFPE
  2228. extrn __SH_sword
  2229. mov ax, [__SH_sword]
  2230. mov cx, 8
  2231. transLoop:
  2232. shr ax, 1
  2233. jc foundBit
  2234. loop transLoop
  2235. foundBit:
  2236. mov ax, 89H
  2237. sub ax, cx
  2238. call __table_raise
  2239. pop bp
  2240. pop es
  2241. pop ds
  2242. pop si
  2243. pop di
  2244. pop dx
  2245. pop cx
  2246. pop bx
  2247. pop ax
  2248. ignore:
  2249. iret
  2250. sigHandlerILL:
  2251. push ax
  2252. push bx
  2253. push cx
  2254. push dx
  2255. push di
  2256. push si
  2257. push ds
  2258. push es
  2259. push bp
  2260. mov ax, _DATA
  2261. mov ds, ax
  2262. stc
  2263. mov bx, SIGILL
  2264. call __table_raise
  2265. pop bp
  2266. pop es
  2267. pop ds
  2268. pop si
  2269. pop di
  2270. pop dx
  2271. pop cx
  2272. pop bx
  2273. pop ax
  2274. ret far 0
  2275. oldvec = -4
  2276. locals = 4
  2277. installInt:
  2278. push ax
  2279. mov ax, cs
  2280. push ax
  2281. push bx
  2282. push ss
  2283. lea ax, [bp][oldvec]
  2284. push ax
  2285. call far DOSSETVEC
  2286. ret 0
  2287. public __initsig :
  2288. push bp
  2289. mov bp, sp
  2290. sub sp, locals
  2291. (*%F SameDS *)
  2292. push ds
  2293. mov ax, _DATA
  2294. mov ds, ax
  2295. (*%E *)
  2296. cmp word [__sigsetup], 0
  2297. jnz noInit
  2298. not word [__sigsetup]
  2299. mov bx, __sigTable (* set up handler table *)
  2300. sub dx, dx
  2301. mov ax, SIG_DFL
  2302. mov [bx][SIGABRT], ax (* SIGABRT *)
  2303. mov [bx][SIGABRT][2], dx
  2304. mov [bx][SIGILL], ax (* SIGILL *)
  2305. mov [bx][SIGILL][2], dx
  2306. mov [bx][SIGSEGV], ax (* SIGSEGV *)
  2307. mov [bx][SIGSEGV][2], dx
  2308. mov [bx][SIGINT], ax (* SIGINT *)
  2309. mov [bx][SIGINT][2], dx
  2310. mov [bx][SIGFPE], ax (* SIGFPE *)
  2311. mov [bx][SIGFPE][2], dx
  2312. mov [bx][SIGTERM], ax (* SIGTERM *)
  2313. mov [bx][SIGTERM][2], dx
  2314. mov ax, dx (*= mov ax, 0 *)
  2315. mov bx, sigHandlerFPE
  2316. call installInt
  2317. mov ax, 4
  2318. mov bx, sigHandlerFPE
  2319. call installInt
  2320. (*%F _XTD *)
  2321. mov ax, 16
  2322. mov bx, sigHandlerFPE1
  2323. call installInt
  2324. (*%E *)
  2325. (*%T _XTD *)
  2326. mov ax, 75H
  2327. mov bx, sigHandlerFPE2
  2328. call installInt
  2329. (*%E *)
  2330. noInit:
  2331. (*%F SameDS *)
  2332. pop ds
  2333. (*%E *)
  2334. mov sp, bp
  2335. pop bp
  2336. ret far 0
  2337. public __sigIgnore : (* A signal is ignored by doing nothing. *)
  2338. (*%F NearCall *)
  2339. ret far 0
  2340. (*%E *)
  2341. (*%T NearCall *)
  2342. ret 0
  2343. (*%E *)
  2344. extrn __exc_addr
  2345. extrn __sysmsg
  2346. public __sigDefault : (* Default action on a signal is to exit the program. *)
  2347. push ax
  2348. cmp ax, 2
  2349. je typeINT
  2350. cmp ax, 8
  2351. je typeFPE
  2352. cmp ax, 15
  2353. je typeABRT
  2354. typeDEFAULT:
  2355. mov ax, DefMsg
  2356. jmp sendMessage
  2357. typeINT:
  2358. mov ax, IntMsg
  2359. jmp sendMessage
  2360. typeFPE:
  2361. mov ax, FpeMsg
  2362. jmp sendMessage
  2363. typeABRT:
  2364. mov ax, AbrtMsg
  2365. sendMessage:
  2366. mov bx, _DATA
  2367. call far __sysmsg
  2368. call far __FatalErrorPos
  2369. pop bx
  2370. mov cx, 3H
  2371. push cx
  2372. cmp bx, 8
  2373. jne notFP
  2374. mov dx, [__exc_addr]
  2375. mov ax, [__exc_addr][2]
  2376. notFP:
  2377. push dx
  2378. push ax
  2379. call far __FatalError
  2380. sig = frame
  2381. arg = 2+frame
  2382. public __sigHandler : (* calls user handler when a signal id received by OS *)
  2383. cld
  2384. inc bp
  2385. push bp
  2386. mov bp, sp
  2387. push ds
  2388. mov ax, _DATA
  2389. mov ds, ax
  2390. mov bx, [bp][sig]
  2391. mov cx, bx
  2392. shl bx, 1
  2393. shl bx, 1
  2394. call __table_raise
  2395. pop ds
  2396. mov sp, bp
  2397. pop bp
  2398. dec bp
  2399. ret far 4
  2400. public _signal :
  2401. (* void ( *signal(int sig, void ( * func)()))();
  2402. sets signal handler to func. Returns old function pointer. *)
  2403. SIGINT = 2
  2404. SIGILL = 4
  2405. SIGFPE = 8
  2406. SIGSEGV = 11
  2407. SIGTERM = 15
  2408. SIGUSR1 = 16
  2409. SIGUSR2 = 17
  2410. SIGUSR3 = 20
  2411. SIGBREAK = 21
  2412. SIGABRT = 22
  2413. EINVAL = 19
  2414. (*%F RegParam *)
  2415. sig = frame
  2416. func = 2+frame
  2417. prevfunc = -4
  2418. prevact = -6
  2419. locals = 6
  2420. (*%E *)
  2421. (*%T RegParam *)
  2422. sig = -2
  2423. func = -6
  2424. prevfunc = -10
  2425. prevact = -14
  2426. locals = 14
  2427. (*%E *)
  2428. push bp
  2429. mov bp, sp
  2430. sub sp, locals
  2431. (*%F RegParam *)
  2432. push bx
  2433. push cx
  2434. (*%T NearCall *)
  2435. push dx
  2436. (*%E *)
  2437. (*%E *)
  2438. (*%T RegParam *)
  2439. (*%T NearCall *)
  2440. push cx
  2441. push dx
  2442. (*%E *)
  2443. (*%F NearCall *)
  2444. mov [bp][func][2], cx
  2445. (*%E *)
  2446. mov [bp][func], bx
  2447. (*%E *)
  2448. (*%F SameDS *)
  2449. push ds
  2450. mov bx, _DATA
  2451. mov ds, bx
  2452. (*%E *)
  2453. (*%F RegParam *)
  2454. mov bx, [bp][sig] (* check signal number is valid *)
  2455. (*%E *)
  2456. (*%T RegParam *)
  2457. mov bx, ax
  2458. (*%E *)
  2459. or bx, bx
  2460. je sigErr
  2461. cmp bx, [__NSIG]
  2462. ja sigErr
  2463. (*%F NearCall *)
  2464. cmp word [bp][func][2], 0
  2465. jnz notException
  2466. (*%E *)
  2467. mov ax, [bp][func]
  2468. cmp ax, SIGA_ACCEPT
  2469. jne notException
  2470. call sys_exception
  2471. jmp sigDone
  2472. notException:
  2473. cmp bx, SIGUSR1
  2474. jb notOSonly1
  2475. cmp bx, SIGUSR3
  2476. ja notOSonly1 (* These signals are dealt with by the OS *)
  2477. jmp alsoOS
  2478. notOSonly1:
  2479. cmp bx, SIGINT
  2480. je alsoOS
  2481. cmp bx, SIGTERM
  2482. je alsoOS
  2483. cmp bx, SIGBREAK
  2484. je alsoOS
  2485. OSret:
  2486. shl bx, 1 (* calculate table index *)
  2487. shl bx, 1
  2488. add bx, __sigTable
  2489. les ax, [bx]
  2490. mov cx, [bp][func]
  2491. (*%F NearCall *)
  2492. mov dx, [bp][func][2]
  2493. (*%E *)
  2494. (*%T NearCall *)
  2495. cmp cx, 1
  2496. jbe constantSig
  2497. mov dx, cs
  2498. jmp storeSig
  2499. constantSig:
  2500. mov dx, 0
  2501. (*%E *)
  2502. storeSig:
  2503. sigFunc:
  2504. mov [bx], cx (* store new function pointer *)
  2505. mov [bx][2], dx
  2506. mov dx, es (* return old function pointer *)
  2507. jmp sigDone
  2508. sigErr: (* return -1L *)
  2509. mov ax, EINVAL
  2510. (*%F NearCall *)
  2511. call far __seterrno
  2512. (*%E *)
  2513. (*%T NearCall *)
  2514. call __seterrno
  2515. (*%E *)
  2516. mov ax, -1
  2517. sub dx, dx
  2518. sigDone:
  2519. (*%F SameDS *)
  2520. pop ds
  2521. (*%E *)
  2522. (*%F RegParam *)
  2523. (*%T NearCall *)
  2524. pop dx
  2525. (*%E *)
  2526. pop cx
  2527. pop bx
  2528. (*%E *)
  2529. (*%T RegParam *)
  2530. (*%T NearCall *)
  2531. pop dx
  2532. pop cx
  2533. (*%E *)
  2534. (*%E *)
  2535. mov sp, bp
  2536. pop bp
  2537. (*%F NearCall *)
  2538. ret far 0
  2539. (*%E *)
  2540. (*%T NearCall *)
  2541. ret 0
  2542. (*%E *)
  2543. alsoOS:
  2544. push bx
  2545. call sys_signal
  2546. pop bx
  2547. jmp OSret
  2548. extrn DOSSETSIGHANDLER
  2549. sys_exception :
  2550. jmp ssInstall
  2551. sys_signal :
  2552. mov ax, SIGA_ACCEPT (* install new handler *)
  2553. ssInstall:
  2554. push cs (* handler function *)
  2555. mov dx, __sigHandler
  2556. push dx
  2557. push ss (* previous handler storage *)
  2558. lea dx, [bp][prevfunc]
  2559. push dx
  2560. push ss
  2561. lea dx, [bp][prevact] (* previous action storage *)
  2562. push dx
  2563. push ax (* action *)
  2564. mov ax, bx
  2565. mov bx, __sigTrans
  2566. xlat
  2567. push ax (* signal number *)
  2568. call far DOSSETSIGHANDLER
  2569. or ax, ax
  2570. jz ssOK
  2571. ssError:
  2572. (*%F NearCall *)
  2573. call far __seterrno
  2574. (*%E *)
  2575. (*%T NearCall *)
  2576. call __seterrno
  2577. (*%E *)
  2578. mov ax, -1
  2579. cwd
  2580. jmp ssDone
  2581. ssOK:
  2582. mov ax, [bp][prevfunc]
  2583. mov dx, [bp][prevfunc][2]
  2584. ssDone:
  2585. ret 0
  2586. extrn DOSFLAGPROCESS
  2587. extrn _getpid
  2588. public _raise :
  2589. (*
  2590. int raise(sig);
  2591. raises signal.
  2592. *)
  2593. sig = frame
  2594. arg = 2+frame
  2595. SIGUSR1 = 16
  2596. SIGUSR2 = 17
  2597. SIGUSR3 = 20
  2598. push bp
  2599. mov bp, sp
  2600. push bx
  2601. push cx
  2602. push dx
  2603. push di
  2604. (*%F SameDS *)
  2605. push ds
  2606. mov dx, _DATA
  2607. mov ds, dx
  2608. (*%E *)
  2609. (*%F RegParam *)
  2610. mov bx, [bp][sig] (* check signal number is valid *)
  2611. (*%E *)
  2612. (*%T RegParam *)
  2613. mov bx, ax (* check signal number is valid *)
  2614. mov cx, ax
  2615. mov dx, bx
  2616. (*%E *)
  2617. or bx, bx
  2618. je raiseErr
  2619. cmp bx, [__NSIG]
  2620. ja raiseErr
  2621. cmp bx, SIGUSR1
  2622. jb notOSonly2
  2623. cmp bx, SIGUSR3
  2624. ja notOSonly2 (* These signals are dealt with by the OS *)
  2625. call __sys_raise
  2626. jmp raiseDone
  2627. notOSonly2:
  2628. shl bx, 1 (* calculate table index *)
  2629. shl bx, 1
  2630. (*%F RegParam *)
  2631. mov ax, [bp][arg]
  2632. (*%E *)
  2633. (*%T RegParam *)
  2634. mov ax, dx
  2635. (*%E *)
  2636. call __table_raise
  2637. sub ax, ax
  2638. jmp raiseDone
  2639. raiseErr: (* return -1 *)
  2640. mov ax, -1
  2641. raiseDone:
  2642. (*%F SameDS *)
  2643. pop ds
  2644. (*%E *)
  2645. pop di
  2646. pop dx
  2647. pop cx
  2648. pop bx
  2649. pop bp
  2650. (*%F NearCall *)
  2651. ret far 0
  2652. (*%E *)
  2653. (*%T NearCall *)
  2654. ret 0
  2655. (*%E *)
  2656. SIGINT = 8
  2657. SIGILL = 16
  2658. SIGFPE = 32
  2659. SIGSEGV = 44
  2660. SIGTERM = 60
  2661. SIGUSR1 = 64
  2662. SIGUSR2 = 68
  2663. SIGUSR3 = 80
  2664. SIGBREAK = 84
  2665. SIGABRT = 88
  2666. (*%F NearCall *)
  2667. sig = sframe
  2668. arg = 2+sframe
  2669. (*%E *)
  2670. (*%T NearCall *)
  2671. sig = frame
  2672. arg = 2+frame
  2673. (*%E *)
  2674. callAddress = -4
  2675. arg = -6
  2676. locals = 6
  2677. public __table_raise : (* bx = sig num offset, ax = arg *)
  2678. (* It is important for pmd that this does not insert
  2679. a stack frame for default signals *)
  2680. push di
  2681. push si
  2682. push bx
  2683. mov si, ax (* arg *)
  2684. mov ax, bx
  2685. mov di, bx
  2686. shr ax, 1
  2687. shr ax, 1
  2688. mov cx, [di][__sigTable]
  2689. mov dx, [di][__sigTable][2]
  2690. (* If dx = 0 and cx = 1, then SIG_IGN has been specified *)
  2691. pop di
  2692. or dx,dx
  2693. jnz notignore
  2694. jcxz notignore
  2695. jmp trDone
  2696. notignore:
  2697. cmp di, SIGTERM
  2698. je doDFL
  2699. cmp di, SIGABRT
  2700. je doDFL
  2701. cmp di, SIGILL
  2702. je doDFL
  2703. cmp di, SIGSEGV
  2704. je doDFL
  2705. cmp di, SIGINT
  2706. je doDFL
  2707. cmp di, SIGFPE
  2708. je doDFL
  2709. jmp dontSet
  2710. doDFL:
  2711. push ax
  2712. mov ax, SIG_DFL
  2713. mov [di][__sigTable], ax
  2714. mov word [di][__sigTable][2], 0
  2715. pop ax
  2716. dontSet:
  2717. or dx, dx
  2718. jne userRaise
  2719. (*%F NearCall *)
  2720. call far __sigDefault
  2721. (*%E *)
  2722. (*%T NearCall *)
  2723. call __sigDefault
  2724. (*%E *)
  2725. jmp trDone
  2726. userRaise:
  2727. (*%F NearCall *)
  2728. push bp
  2729. mov bp,sp
  2730. push dx (* call address segment *)
  2731. push cx (* call address offset *)
  2732. (*%E *)
  2733. (*%F RegParam *)
  2734. push si (* arg *)
  2735. push ax
  2736. (*%E *)
  2737. (*%T RegParam *)
  2738. mov bx, si (* arg *)
  2739. (*%E *)
  2740. (*%F NearCall *)
  2741. call far [bp][-4]
  2742. mov sp,bp
  2743. pop bp
  2744. (*%E *)
  2745. (*%T NearCall *)
  2746. call cx
  2747. (*%F RegParam *)
  2748. add sp, 4
  2749. (*%E *)
  2750. (*%E *)
  2751. trDone:
  2752. (*%F SameDS *)
  2753. mov bx, _DATA
  2754. mov ds, bx
  2755. (*%E *)
  2756. pop si
  2757. pop di
  2758. ret 0
  2759. public __sys_raise :
  2760. FLGP_PID = 1
  2761. push cx
  2762. push dx
  2763. (*%F NearCall *)
  2764. call far _getpid
  2765. (*%E *)
  2766. (*%T NearCall *)
  2767. call _getpid
  2768. (*%E *)
  2769. pop dx
  2770. pop cx
  2771. push ax
  2772. mov ax, FLGP_PID
  2773. push ax
  2774. (*%F RegParam *)
  2775. mov ax, [bp][sig]
  2776. (*%E *)
  2777. (*%T RegParam *)
  2778. mov ax, cx
  2779. (*%E *)
  2780. mov bx, __sigTrans
  2781. xlat
  2782. sub al, 5
  2783. push ax
  2784. (*%F RegParam *)
  2785. mov ax, [bp][arg]
  2786. (*%E *)
  2787. (*%T RegParam *)
  2788. mov ax, dx
  2789. (*%E *)
  2790. push ax
  2791. call far DOSFLAGPROCESS
  2792. or ax, ax
  2793. jz srDone
  2794. srErr: (* return -1 *)
  2795. (*%F NearCall *)
  2796. call far __seterrno
  2797. (*%E *)
  2798. (*%T NearCall *)
  2799. call __seterrno
  2800. (*%E *)
  2801. mov ax, -1
  2802. srDone:
  2803. ret 0
  2804. (****************************************************************************)
  2805. section
  2806. segment _TEXT(CODE,28H)
  2807. segment _DATA(DATA,28H)
  2808. extrn DOSSETSIGHANDLER
  2809. extrn __sigsetup
  2810. extrn __sysmsg
  2811. extrn _exit
  2812. prevfunc = -4
  2813. prevact = -6
  2814. locals = 6
  2815. select _DATA
  2816. Message : db '^C', 0
  2817. select _TEXT
  2818. Handler :
  2819. (* terminates process *)
  2820. cld
  2821. inc bp
  2822. push bp
  2823. mov bp, sp
  2824. mov bx, _DATA
  2825. mov ds, bx
  2826. mov ax, Message
  2827. call far __sysmsg
  2828. mov ax, 3
  2829. (*%F RegParam *)
  2830. push ax
  2831. (*%E *)
  2832. (*%F NearCall *)
  2833. call far _exit
  2834. (*%E *)
  2835. (*%T NearCall *)
  2836. call _exit
  2837. (*%E *)
  2838. public __siginit :
  2839. push bp
  2840. mov bp, sp
  2841. sub sp, locals
  2842. mov cx, 2
  2843. mov dx, SIG_CTRLC
  2844. inLoop:
  2845. push cs (* handler function *)
  2846. mov ax, Handler
  2847. push ax
  2848. push ss (* previous handler storage *)
  2849. lea ax, [bp][prevfunc]
  2850. push ax
  2851. push ss
  2852. lea ax, [bp][prevact] (* previous action storage *)
  2853. push ax
  2854. mov ax, 2
  2855. push ax (* action *)
  2856. push dx (* signal number *)
  2857. call far DOSSETSIGHANDLER
  2858. mov dx, SIG_CTRLBREAK
  2859. loop inLoop
  2860. ssDone:
  2861. mov sp, bp
  2862. pop bp
  2863. ret 0
  2864. (*%E *) (* OS2 *)
  2865. (*%T _XTD *)
  2866. section
  2867. (*************************************************************************)
  2868. (*%T SameDS *)
  2869. segment _TEXT(CODE,28H)
  2870. (*%E *)
  2871. (*%F SameDS *)
  2872. segment SIG_TEXT(CODE,28H)
  2873. (*%E *)
  2874. public @DosInterrupt:
  2875. int 21H
  2876. (*%F NearCall *)
  2877. ret far 0
  2878. (*%E *)
  2879. (*%T NearCall *)
  2880. ret 0
  2881. (*%E *)
  2882. (*%E _XTD *)
  2883. end
  2884.