COREMAIN.A 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * COREMAIN.A - process startup and exit, args, environment *
  5. * *
  6. * COPYRIGHT (C) 1989..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. include "corelib.inc"
  11. module CoreMain
  12. (****************************************************************************)
  13. segment _BSS(BSS, 28H)
  14. public __argbuf : org 192 (* command line buffer *)
  15. public __hugeshift : org 2
  16. public __osmajor : org 2
  17. public __osminor : org 2 (* DOS version *)
  18. public __exit_stk : org 32*CodePtrSize(* at/onexit function stack *)
  19. segment _DATA(DATA, 28H)
  20. public @InitCalled : dw 0
  21. public @InitGrandTotal : dw 0
  22. public @InitCurrent : dw 0
  23. public @InitRecPointer : dw 0, 0
  24. public @InitPointer : dw 0, 0
  25. public @StackContextSP : dw 0
  26. public @StackContextBP : dw 0
  27. public @InitDone : db 0
  28. (*%T MThread *)
  29. public @StackContextSS : dw 0
  30. (*%E *)
  31. public @InitPriority : db 0
  32. segment _BSS(BSS, 28H)
  33. public @ExitCode : org 2
  34. segment _BSS(BSS, 28H)
  35. public __exit_list_done : org 1
  36. segment _DATA(DATA, 28H)
  37. (*%T NearPtr *)
  38. public __exit_ptr : dw __exit_stk + (32*CodePtrSize)
  39. public __exit_top : dw __exit_stk + (32*CodePtrSize)
  40. (*%E *)
  41. (*%F NearPtr *)
  42. public __exit_ptr : dd __exit_stk + (32*CodePtrSize)
  43. public __exit_top : dd __exit_stk + (32*CodePtrSize)
  44. (*%E *)
  45. segment _BSS(BSS, 28H)
  46. public __exit_io : org CodePtrSize
  47. public __exit_file : org CodePtrSize
  48. public __exit_tmp: org CodePtrSize
  49. public __exit_proc : org FarCodePtrSize
  50. segment _BSS(BSS, 28H)
  51. public __real_in : org NearCodePtrSize
  52. public __real_out : org NearCodePtrSize
  53. segment _DATA(DATA, 28H)
  54. extrn __Term2
  55. (*%F NearCall *)
  56. public standard@haltChain : dd __Term2
  57. (*%T _DLLOVL *)
  58. extrn __Term3
  59. public standard@@haltChain2 : dd __Term3
  60. (*%E *)
  61. (*%E *)
  62. (*%T NearCall *)
  63. public standard@haltChain : dw __Term2
  64. (*%E *)
  65. segment _DATA(DATA, 28H)
  66. public __CmdLine : dd 0
  67. public __iHandle : dw 0
  68. segment _DATA(DATA, 28H)
  69. public __farstack : dw 0
  70. public __sp_temp : dw 0
  71. public __ss_temp : dw 0
  72. (*%F _OS2 *)
  73. (*%F _WINDOWS *)
  74. segment _DATA(DATA, 28H)
  75. public DOSHUGESHIFT = 12
  76. (*%E *)
  77. (*%E *)
  78. segment _DATA(DATA, 28H)
  79. public _x_initx : dw 0,0
  80. public _x_bss_end : dw 0
  81. public _x_bss_start : dw 0
  82. segment _BSS(BSS, 28H)
  83. public __sigsetup : org 2
  84. public __exitbreak : org 4
  85. public __exitsig : org CodePtrSize
  86. public __exitgraph : org CodePtrSize
  87. segment _DATA(DATA, 28H)
  88. public __psp : dw 0
  89. public __env : dw 0
  90. public __heap_base : dw 0
  91. public __main_args : dw 0
  92. public __env_init : dw 0
  93. public __arg_init : dw 0
  94. public STKHQQ :
  95. public __stklen : dw 0
  96. public __SSisDS : dw 0
  97. public __far_ss : dw 0
  98. public __x_near_stack_start : dw 0
  99. public __heap_size : dw 0
  100. public __osmode : dw 0
  101. segment _DATA(DATA, 28H)
  102. public __x_ax : dw 0
  103. public __x_bx : dw 0
  104. public __x_di : dw 0
  105. segment _DATA(DATA, 28H)
  106. public _x_main : dw 0,0
  107. public __stk_base : dw 0
  108. segment _BSS(BSS, 28H)
  109. public __nmemsetup : org 1 (* BOOLEAN flag indicating near heap *)
  110. (* has been initialised *)
  111. segment _BSS(BSS, 28H)
  112. public __fmodmemsetup : org 1 (* BOOLEAN flag indicating M2 far heap *)
  113. (* has been initialised *)
  114. segment _BSS(BSS, 28H)
  115. public __fmemsetup : org 1 (* BOOLEAN flag indicating far heap *)
  116. (* has been initialised *)
  117. segment _DATA(DATA, 28H)
  118. (*%F _ENV *)
  119. (*%T _DLLOVL *)
  120. extrn Loader$GrowHeap
  121. extrn Loader$ShrinkHeap
  122. public __res_mem : dd Loader$GrowHeap
  123. public __fix_mem : dd 0
  124. public __shr_mem : dd Loader$ShrinkHeap
  125. (*%E *)
  126. (*%F _DLLOVL *)
  127. public __res_mem : org CodePtrSize
  128. public __fix_mem : org CodePtrSize
  129. public __shr_mem : org CodePtrSize
  130. (*%E *)
  131. (*%E *)
  132. (*%T _ENV*)
  133. public __res_mem : org CodePtrSize
  134. public __fix_mem : org CodePtrSize
  135. public __shr_mem : org CodePtrSize
  136. (*%E *)
  137. (* procedure variable - points to *)
  138. (* routine to shrink heap *)
  139. (****************************************************************************)
  140. section
  141. segment _TEXT(CODE,28H)
  142. segment _DATA(DATA, 28H)
  143. extrn @RecursiveExit
  144. extrn __exit
  145. extrn __exit_io
  146. extrn __exit_file
  147. extrn __exit_tmp
  148. extrn __exit_proc
  149. extrn __InitReset
  150. extrn @InitPointer
  151. extrn @InitRecPointer
  152. extrn @ExitCode
  153. extrn @StackContextSP
  154. extrn @StackContextBP
  155. extrn @StackContextSS
  156. extrn @InitCurrent
  157. extrn @InitGrandTotal
  158. extrn @InitCalled
  159. extrn @InitPriority
  160. extrn @InitDone
  161. extrn $Stage2
  162. retCode : dw 0
  163. select _TEXT
  164. (*%F _WINDLL *)
  165. public _exit :
  166. (*%F RegParam *)
  167. code = bxframe
  168. mov bx, sp
  169. mov ax, ss:[bx][code]
  170. (*%E *)
  171. (*%F SameDS *)
  172. mov bx, _DATA
  173. mov ds, bx
  174. (*%E *)
  175. mov [@ExitCode], ax
  176. cmp byte [@RecursiveExit], 0
  177. je notAgain
  178. (*%F RegParam *)
  179. push ax
  180. (*%E *)
  181. (*%F NearCall *)
  182. call far __exit
  183. (*%E *)
  184. (*%T NearCall *)
  185. call __exit
  186. (*%E *)
  187. notAgain:
  188. not byte [@RecursiveExit]
  189. (*%T MThread *)
  190. mov ss, [@StackContextSS]
  191. (*%E *)
  192. mov sp, [@StackContextSP]
  193. mov bp, [@StackContextBP]
  194. jmp near $TerminateProcess
  195. (*%E *)
  196. public __InitLoop :
  197. (*%T _WINDOWS *)
  198. (*%F NearCall *)
  199. inc bp
  200. push bp
  201. mov bp, sp
  202. (*%E *)
  203. (*%E *)
  204. (*%T _DLLOVL *)
  205. push bp
  206. mov bp, sp
  207. (*%E *)
  208. push di
  209. push si
  210. (*%F SameDS *)
  211. push ds
  212. mov ax, _DATA
  213. mov ds, ax
  214. (*%E *)
  215. chainLoop:
  216. traverseLoop:
  217. les bx, [@InitRecPointer]
  218. mov ax, [@InitCurrent]
  219. cmp ax, es:[bx][InitRecTotal]
  220. je endOfArray
  221. les di, [@InitPointer]
  222. add word [@InitPointer], InitRecSize
  223. inc word [@InitCurrent]
  224. mov al, [@InitPriority]
  225. cmp al, es:[di][Priority]
  226. jne traverseLoop
  227. inc word [@InitCalled]
  228. (*%F NearCall *)
  229. call far es:[di][ProcVar]
  230. cmp byte [@InitDone],0
  231. jz traverseLoop
  232. initLoopRet:
  233. (*%F SameDS *)
  234. pop ds
  235. (*%E *)
  236. pop si
  237. pop di
  238. (*%T _DLLOVL *)
  239. pop bp
  240. (*%E *)
  241. (*%T _WINDOWS *)
  242. pop bp
  243. dec bp
  244. (*%E *)
  245. ret far 0
  246. (*%E *)
  247. (*%T NearCall *)
  248. call es:[di][ProcVar]
  249. cmp byte [@InitDone],0
  250. jz traverseLoop
  251. initLoopRet:
  252. (*%F SameDS *)
  253. pop ds
  254. (*%E *)
  255. pop si
  256. pop di
  257. ret 0
  258. (*%E *)
  259. endOfArray:
  260. mov ax, [@InitCalled]
  261. cmp ax, [@InitGrandTotal]
  262. je stageComplete
  263. les bx, [@InitRecPointer]
  264. les bx, es:[bx][InitRecNext]
  265. mov ax, es
  266. or ax, bx
  267. jz endOfList
  268. mov [@InitRecPointer], bx
  269. mov [@InitRecPointer][2], es
  270. sub ax, ax
  271. mov [@InitCurrent], ax
  272. mov [@InitPointer], ax
  273. mov ax, es:[bx][InitRecSeg]
  274. mov [@InitPointer][2], ax
  275. jmp traverseLoop
  276. endOfList:
  277. dec byte [@InitPriority]
  278. js stageComplete
  279. call __InitReset
  280. jmp chainLoop
  281. stageComplete:
  282. mov byte [@InitDone],1
  283. (*%T MThread *)
  284. mov [@StackContextSS], ss
  285. (*%E *)
  286. mov [@StackContextBP], bp
  287. mov [@StackContextSP], sp
  288. (*%F NearCall *)
  289. call far $Stage2
  290. (*%E *)
  291. (*%T NearCall *)
  292. call $Stage2
  293. (*%E *)
  294. mov [@ExitCode], ax
  295. $TerminateProcess:
  296. (*%T _WINDLL *)
  297. jmp initLoopRet
  298. (*%E *)
  299. public __Term2 :
  300. (*%F SameDS *)
  301. mov bx, _DATA
  302. mov ds, bx
  303. (*%E *)
  304. extrn __exit_ptr
  305. extrn __exit_top
  306. extrn standard@haltChain
  307. (*%T _DLLOVL *)
  308. extrn standard@@haltChain2
  309. push [standard@@haltChain2][2]
  310. push [standard@@haltChain2][0]
  311. (*%E *)
  312. (*%F _DLLOVL *)
  313. (*%F NearCall *)
  314. push cs
  315. (*%E *)
  316. mov bx, __Term3
  317. push bx
  318. (*%E *)
  319. (*%F NearCall *)
  320. push [standard@haltChain][2]
  321. (*%E *)
  322. push [standard@haltChain][0]
  323. (* reset halt chain to allow it to be re-used in termination code *)
  324. (*%T _DLLOVL *)
  325. push [standard@@haltChain2][0]
  326. pop [standard@haltChain][0]
  327. push [standard@@haltChain2][2]
  328. pop [standard@haltChain][2]
  329. (*%E *)
  330. (*%F _DLLOVL *)
  331. mov word [standard@haltChain][0],__Term3
  332. (*%F NearCall *)
  333. mov [standard@haltChain][2],cs
  334. (*%E *)
  335. (*%E *)
  336. (*%F NearCall *)
  337. ret far 0 (* jump to termination procedures *)
  338. (*%E *)
  339. (*%T NearCall *)
  340. ret 0
  341. (*%E *)
  342. public __Term3:
  343. (*%F _WINDOWS *)
  344. mov bx, _DATA
  345. mov ds, bx
  346. (*%E *)
  347. (*%T MThread *)
  348. mov ss, [@StackContextSS]
  349. (*%E *)
  350. mov bp, [@StackContextBP]
  351. mov sp, [@StackContextSP]
  352. mov si, [__exit_ptr]
  353. mov di, [__exit_top]
  354. exitLoop:
  355. cmp si, di
  356. je loopDone
  357. (*%T NearCall *)
  358. call [si]
  359. add si, 2
  360. (*%E *)
  361. (*%F NearCall *)
  362. call far [si]
  363. add si, 4
  364. (*%E *)
  365. (*%F SameDS *)
  366. mov bx, _DATA
  367. mov ds, bx
  368. (*%E *)
  369. jmp exitLoop
  370. loopDone:
  371. jmp initLoopRet
  372. public __cleanup :
  373. (*%F SameDS *)
  374. mov cx, _DATA
  375. mov ds, cx
  376. (*%E *)
  377. mov cx, [__exit_io]
  378. jcxz noCall1
  379. (*%F SameDS *)
  380. push ds
  381. (*%E *)
  382. (*%F NearCall *)
  383. call far [__exit_io]
  384. (*%E *)
  385. (*%T NearCall *)
  386. call cx
  387. (*%E *)
  388. (*%F SameDS *)
  389. pop ds
  390. (*%E *)
  391. noCall1:
  392. mov cx, [__exit_file]
  393. jcxz noCall2
  394. (*%F SameDS *)
  395. push ds
  396. (*%E *)
  397. (*%F NearCall *)
  398. call far [__exit_file]
  399. (*%E *)
  400. (*%T NearCall *)
  401. call cx
  402. (*%E *)
  403. (*%F SameDS *)
  404. pop ds
  405. (*%E *)
  406. noCall2:
  407. mov cx, [__exit_tmp]
  408. jcxz noCall3
  409. (*%F SameDS *)
  410. push ds
  411. (*%E *)
  412. (*%F NearCall *)
  413. call far [__exit_tmp]
  414. (*%E *)
  415. (*%T NearCall *)
  416. call cx
  417. (*%E *)
  418. (*%F SameDS *)
  419. pop ds
  420. (*%E *)
  421. noCall3:
  422. mov cx, [__exit_proc]
  423. jcxz noCall4
  424. (*%F SameDS *)
  425. push ds
  426. (*%E *)
  427. call far [__exit_proc]
  428. (*%F SameDS *)
  429. pop ds
  430. (*%E *)
  431. noCall4:
  432. ret 0
  433. (******************************************************************************)
  434. section
  435. segment _DATA(DATA, 28H)
  436. segment _TEXT(CODE,28H)
  437. select _TEXT
  438. extrn __env_init
  439. extrn _malloc
  440. extrn __env
  441. extrn __env_var
  442. extrn __env_copy
  443. extrn __FatalErrorPos
  444. extrn __FatalError
  445. public __setenv :
  446. n = -2
  447. p = -4
  448. c = -6
  449. eptr = -10
  450. current = -14
  451. dgroup = -16
  452. locals = 16
  453. push bp
  454. mov bp, sp
  455. sub sp, locals
  456. push di
  457. push si
  458. push ds
  459. mov [bp][dgroup], ds
  460. cmp byte [__env_init], 0
  461. jne near setDone
  462. not byte [__env_init]
  463. memSet:
  464. sub dx, dx
  465. mov [bp][n], dx
  466. mov ax, [__env]
  467. mov [bp][eptr][2], ax
  468. mov word [bp][eptr], 0
  469. Loop1:
  470. cmp dx, 63
  471. jge Loop1Done
  472. sub cx, cx
  473. lds si, [bp][eptr]
  474. Loop2:
  475. cmp cx, 1024
  476. jge Loop2Done
  477. lodsb
  478. or al, al
  479. jz Loop2Done
  480. inc cx
  481. jmp Loop2
  482. Loop2Done:
  483. jcxz Loop1Done
  484. inc cx
  485. mov ax, cx
  486. mov [bp][p], cx
  487. mov [bp][n], dx
  488. mov ds, [bp][dgroup]
  489. (*%F RegParam *)
  490. push ax
  491. (*%E *)
  492. (*%F NearCall *)
  493. call far _malloc
  494. (*%E *)
  495. (*%T NearCall *)
  496. call _malloc
  497. (*%E *)
  498. (*%F RegParam *)
  499. add sp, 2
  500. (*%E *)
  501. mov [bp][current], ax
  502. (*%F NearPtr *)
  503. mov [bp][current][2], dx
  504. or dx, dx
  505. (*%E *)
  506. (*%T NearPtr *)
  507. (*%F _WINDOWS *)
  508. mov word [bp][current][2], _DATA
  509. (*%E *)
  510. (*%T _WINDOWS *)
  511. mov word [bp][current][2], ss
  512. (*%E *)
  513. or ax, ax
  514. (*%E *)
  515. jz InternalError
  516. mov di, [bp][current]
  517. mov es, [bp][current][2]
  518. mov si, [bp][eptr]
  519. mov ax, [bp][eptr][2]
  520. mov cx, [bp][p]
  521. call __env_copy
  522. mov bx, [bp][n]
  523. (*%F NearPtr *)
  524. mov cl, 2
  525. (*%E *)
  526. (*%T NearPtr *)
  527. mov cl, 1
  528. (*%E *)
  529. shl bx, cl
  530. mov ax, [bp][current]
  531. mov [bx][__env_var], ax
  532. (*%F NearPtr *)
  533. mov ax, [bp][current][2]
  534. mov [bx][__env_var][2], ax
  535. (*%E *)
  536. inc word [bp][n]
  537. mov dx, [bp][n]
  538. mov cx, [bp][p]
  539. add [bp][eptr], cx
  540. jmp Loop1
  541. Loop1Done:
  542. mov ds, [bp][dgroup]
  543. mov bx, [bp][n]
  544. (*%F NearPtr *)
  545. mov cl, 2
  546. (*%E *)
  547. (*%T NearPtr *)
  548. mov cl, 1
  549. (*%E *)
  550. shl bx, cl
  551. sub ax, ax
  552. mov [bx][__env_var], ax
  553. mov [bx][__env_var][2], ax
  554. setDone:
  555. pop ds
  556. pop si
  557. pop di
  558. mov sp, bp
  559. pop bp
  560. (*%F NearCall *)
  561. ret far 0
  562. (*%E *)
  563. (*%T NearCall *)
  564. ret 0
  565. (*%E *)
  566. InternalError:
  567. call far __FatalErrorPos
  568. mov cx, 60H
  569. push cx
  570. push dx
  571. push ax
  572. call far __FatalError
  573. (******************************************************************************)
  574. section
  575. extrn __env_var
  576. extrn __core_lock
  577. extrn __core_unlock
  578. extrn $StdRet
  579. segment _TEXT(CODE,00028H)
  580. nicmp :
  581. (*%T NearPtr *)
  582. RetSize = 0
  583. (*%E *)
  584. (*%F NearPtr *)
  585. RetSize = 2
  586. (*%E *)
  587. (*%F NearPtr *)
  588. num = sframe
  589. (*%E *)
  590. (*%F NearPtr *)
  591. push bp
  592. mov bp, sp
  593. (*%E *)
  594. (*%T NearPtr *)
  595. push dx
  596. (*%E *)
  597. push di
  598. push si
  599. (*%F NearPtr *)
  600. push ds
  601. mov ds, bx
  602. mov si, ax
  603. mov di, cx
  604. mov es, dx
  605. mov cx, [bp][num]
  606. (*%E *)
  607. (*%T NearPtr *)
  608. mov si, ax
  609. mov di, bx
  610. push ds
  611. pop es
  612. (*%E *)
  613. sub ax, ax
  614. jcxz nicmpDone
  615. nicmpLoop:
  616. lodsb
  617. cmp al, 'z' (* convert to upper if lower *)
  618. ja notlowa
  619. cmp al, 'a'
  620. jb notlowa
  621. sub al, 20H
  622. notlowa:
  623. mov bl, es:[di]
  624. inc di (* convert to upper if lower *)
  625. cmp bl, 'z'
  626. ja notlowb
  627. cmp bl, 'a'
  628. jb notlowb
  629. sub bl, 20H
  630. notlowb:
  631. cmp al, bl
  632. jl nicmpLessThan
  633. jg nicmpGreaterThan
  634. or al, al
  635. loopne nicmpLoop
  636. nicmpSame:
  637. sub ax, ax (* return 0 *)
  638. jmp nicmpDone
  639. nicmpLessThan:
  640. mov ax, -1 (* return -1 *)
  641. jmp nicmpDone
  642. nicmpGreaterThan:
  643. mov ax, 1 (* return 1 *)
  644. nicmpDone:
  645. (*%F NearPtr *)
  646. pop ds
  647. (*%E *)
  648. pop si
  649. pop di
  650. (*%T NearPtr *)
  651. pop dx
  652. (*%E *)
  653. (*%F NearPtr *)
  654. pop bp
  655. (*%E *)
  656. ret RetSize
  657. public _getenv :
  658. (*%F RegParam *)
  659. str = frame
  660. (*%E *)
  661. (*%T RegParam *)
  662. (*%T NearPtr *)
  663. str = - 2
  664. (*%E *)
  665. (*%F NearPtr *)
  666. str = - 4
  667. (*%E *)
  668. (*%E *)
  669. (*%T NearPtr *)
  670. push bp
  671. mov bp,sp
  672. sub sp, 2
  673. push di
  674. push si
  675. (*%T RegParam *)
  676. push dx
  677. push cx
  678. push bx
  679. mov [bp][str],ax
  680. (*%E *)
  681. (*%F RegParam *)
  682. mov ax, [bp][str]
  683. (*%E *)
  684. push ds
  685. pop es
  686. mov di, ax
  687. mov cx, 0FFFFH
  688. sub al, al
  689. repne ; scasb (* get length of string *)
  690. not cx
  691. dec cx
  692. mov di,cx
  693. xor dx,dx
  694. $0:
  695. mov bx,dx
  696. add bx,dx
  697. mov si,[bx][__env_var]
  698. test si,si
  699. je $2
  700. mov cx,di
  701. mov bx,si
  702. mov ax,[bp][str]
  703. call nicmp
  704. test ax,ax
  705. je $3
  706. $1:
  707. inc dx
  708. cmp dx,3FH
  709. jl $0
  710. $2:
  711. xor ax,ax
  712. jmp $4
  713. $3:
  714. mov bx,di
  715. add bx,si
  716. cmp byte [bx],3DH
  717. jne $1
  718. inc bx
  719. mov ax,bx
  720. $4:
  721. (*%T RegParam *)
  722. pop bx
  723. pop cx
  724. pop dx
  725. (*%E *)
  726. pop si
  727. pop di
  728. mov sp, bp
  729. pop bp
  730. (*%F NearCall *)
  731. ret far 0
  732. (*%E *)
  733. (*%T NearCall *)
  734. ret 0
  735. (*%E *)
  736. (*%E *)
  737. (*%F NearPtr *)
  738. push bp
  739. mov bp,sp
  740. sub sp,0AH
  741. push ds
  742. push di
  743. push si
  744. (*%T MThread *)
  745. mov di, seg __core_lock
  746. mov es, di
  747. call far es:[__core_lock]
  748. (*%E *)
  749. (*%T RegParam *)
  750. push cx
  751. mov [bp][str],ax
  752. mov [bp][str][2],bx
  753. (*%E *)
  754. (*%F RegParam *)
  755. mov ax, [bp][str]
  756. mov bx, [bp][str][2]
  757. (*%E *)
  758. mov di,ax
  759. mov es,bx
  760. mov cx,-1
  761. sub al,al
  762. repne ;scasb
  763. not cx
  764. mov ax,cx
  765. dec ax
  766. mov di,ax
  767. xor si,si
  768. mov ax,seg __env_var
  769. mov [bp][-6],ax
  770. $0:
  771. mov bx,si
  772. shl bx,1
  773. shl bx,1
  774. mov ds,[bp][-6]
  775. lds cx,[bx][__env_var]
  776. mov [bp][-0AH],cx
  777. mov ax,ds
  778. or ax,cx
  779. je $2
  780. push di
  781. mov dx,ds
  782. mov ax,[bp][str]
  783. mov bx,[bp][str][2]
  784. call nicmp
  785. test ax,ax
  786. je $3
  787. $1:
  788. inc si
  789. cmp si,3FH
  790. jl $0
  791. $2:
  792. xor ax,ax
  793. xor dx,dx
  794. jmp $4
  795. $3:
  796. mov bx,[bp][-0AH]
  797. cmp byte [bx][di],3DH
  798. jne $1
  799. lea ax,[bx][di][1]
  800. mov dx,ds
  801. $4:
  802. (*%T RegParam *)
  803. pop cx
  804. (*%E *)
  805. (*%T MThread *)
  806. mov di, seg __core_unlock
  807. mov es, di
  808. call far es:[__core_unlock]
  809. (*%E *)
  810. pop si
  811. pop di
  812. pop ds
  813. mov sp,bp
  814. pop bp
  815. (*%F NearCall *)
  816. ret far 0
  817. (*%E *)
  818. (*%T NearCall *)
  819. ret 0
  820. (*%E *)
  821. (*%E *)
  822. (****************************************************************************)
  823. (*%T _OS2 *)
  824. section
  825. segment _DATA(DATA, 28H)
  826. segment _TEXT(CODE,28H)
  827. extrn __exit_ptr
  828. extrn __exit_top
  829. extrn __exit_io
  830. extrn __exit_file
  831. extrn __exit_tmp
  832. extrn __exit_proc
  833. extrn __exit_list_done
  834. extrn __x_near_stack_start
  835. extrn __farstack
  836. extrn standard@haltChain
  837. extrn DOSEXITLIST
  838. extrn __do_exit_lists
  839. exit_handler:
  840. mov bx, _DATA
  841. mov ds, bx
  842. cmp byte [__exit_list_done], 0
  843. jnz noCall4
  844. cmp word [__farstack], 0
  845. jnz notNear
  846. mov sp, [__x_near_stack_start]
  847. mov ss, bx
  848. notNear:
  849. (*%F NearCall *)
  850. push [standard@haltChain][2]
  851. (*%E *)
  852. push [standard@haltChain][0]
  853. (* reset halt chain to allow it to be re-used in termination code *)
  854. mov word [standard@haltChain][0],here
  855. (*%F NearCall *)
  856. mov [standard@haltChain][2],cs
  857. (*%E *)
  858. (*%F NearCall *)
  859. ret far 0 (* jump to termination procedures *)
  860. (*%E *)
  861. (*%T NearCall *)
  862. ret 0
  863. (*%E *)
  864. here:
  865. mov bx, _DATA
  866. mov ds, bx
  867. mov si, [__exit_ptr]
  868. mov di, [__exit_top]
  869. exitLoop:
  870. cmp si, di
  871. je loopDone
  872. (*%T NearCall *)
  873. call [si]
  874. add si, 2
  875. (*%E *)
  876. (*%F NearCall *)
  877. call far [si]
  878. add si, 4
  879. (*%E *)
  880. (*%F SameDS *)
  881. mov bx, _DATA
  882. mov ds, bx
  883. (*%E *)
  884. jmp exitLoop
  885. loopDone:
  886. noCall4:
  887. mov ax, EXLST_EXIT
  888. push ax
  889. sub ax, ax
  890. push ax
  891. push ax
  892. call far DOSEXITLIST
  893. public __set_exit_handler :
  894. mov ax, EXLST_ADD
  895. push ax
  896. push cs
  897. mov ax, exit_handler
  898. push ax
  899. call far DOSEXITLIST
  900. ret far 0
  901. (*%E *)
  902. section
  903. (****************************************************************************)
  904. (*%T _WINDLL *)
  905. segment _DATA(DATA,28H)
  906. segment _TEXT(CODE,28H)
  907. extrn __exit_io
  908. extrn __exit_file
  909. extrn __exit_tmp
  910. extrn __exit_proc
  911. extrn __exit_ptr
  912. extrn __exit_top
  913. extrn standard@haltChain
  914. public _exit :
  915. (*%F NearCall *)
  916. push [standard@haltChain][2]
  917. (*%E *)
  918. push [standard@haltChain][0]
  919. (* reset halt chain to allow it to be re-used in termination code *)
  920. mov word [standard@haltChain][0],here
  921. (*%F NearCall *)
  922. mov [standard@haltChain][2],cs
  923. (*%E *)
  924. (*%F NearCall *)
  925. ret far 0 (* jump to termination procedures *)
  926. (*%E *)
  927. (*%T NearCall *)
  928. ret 0
  929. (*%E *)
  930. here:
  931. mov bx, _DATA
  932. mov ds, bx
  933. mov si, [__exit_ptr]
  934. mov di, [__exit_top]
  935. exitLoop:
  936. cmp si, di
  937. je loopDone
  938. (*%T NearCall *)
  939. call [si]
  940. add si, 2
  941. (*%E *)
  942. (*%F NearCall *)
  943. call far [si]
  944. add si, 4
  945. (*%E *)
  946. (*%F SameDS *)
  947. mov ds, bx
  948. (*%E *)
  949. jmp exitLoop
  950. loopDone:
  951. mov cx, [__exit_io]
  952. jcxz noCall1
  953. (*%F NearCall *)
  954. call far [__exit_io]
  955. (*%E *)
  956. (*%T NearCall *)
  957. call cx
  958. (*%E *)
  959. noCall1:
  960. mov cx, [__exit_file]
  961. jcxz noCall2
  962. (*%F NearCall *)
  963. call far [__exit_file]
  964. (*%E *)
  965. (*%T NearCall *)
  966. call cx
  967. (*%E *)
  968. noCall2:
  969. mov cx, [__exit_tmp]
  970. jcxz noCall3
  971. (*%F NearCall *)
  972. call far [__exit_tmp]
  973. (*%E *)
  974. (*%T NearCall *)
  975. call cx
  976. (*%E *)
  977. noCall3:
  978. (*%F NearCall *)
  979. ret far 0
  980. (*%E *)
  981. (*%T NearCall *)
  982. ret 0
  983. (*%E *)
  984. (*%E _WINDLL*)
  985. (****************************************************************************)
  986. section
  987. segment _TEXT(CODE,28H)
  988. segment _DATA(DATA,28H)
  989. public @InitChain : dw 0, 0
  990. select _TEXT
  991. public __InitLink :
  992. (* Initializes @InitChain from record passed in ax:bx *)
  993. (*%F SameDS *)
  994. push ds
  995. mov cx, _DATA
  996. mov ds, cx (* ds = _DATA *)
  997. (*%E *)
  998. mov es, ax (* es = seg of record *)
  999. mov ax, [@InitChain]
  1000. mov es:[bx], ax (* @InitChain -> record passed in *)
  1001. mov ax, [@InitChain][2]
  1002. mov es:[bx][2], ax
  1003. mov [@InitChain], bx
  1004. mov [@InitChain][2], es
  1005. (*%F SameDS *)
  1006. pop ds
  1007. (*%E *)
  1008. ret far 0
  1009. (****************************************************************************)
  1010. section
  1011. segment _TEXT(CODE,28H)
  1012. segment _DATA(DATA,28H)
  1013. segment _INIT(INIT_CODE,28H)
  1014. select _DATA
  1015. extrn @InitCalled
  1016. extrn @InitPriority
  1017. extrn @InitCurrent
  1018. extrn @InitPointer
  1019. extrn @InitRecPointer
  1020. extrn @InitGrandTotal
  1021. extrn @InitChain
  1022. extrn __osmode
  1023. select _TEXT
  1024. public __InitReset :
  1025. les bx, [@InitChain]
  1026. sub cx, cx
  1027. mov word [@InitCurrent], cx
  1028. mov word [@InitPointer], cx
  1029. mov ax, es:[bx][InitRecSeg]
  1030. mov [@InitPointer][2], ax
  1031. mov [@InitRecPointer], bx
  1032. mov [@InitRecPointer][2], es
  1033. ret 0
  1034. public __InitSetup :
  1035. Current = -4
  1036. locals = 4
  1037. push bp
  1038. mov bp, sp
  1039. sub sp, locals
  1040. call __InitReset
  1041. chainLoop:
  1042. mov ax, es
  1043. or ax, bx
  1044. jz chainDone
  1045. mov [bp][Current], bx
  1046. mov [bp][Current][2], es
  1047. mov es, es:[bx][InitRecSeg]
  1048. cmp byte [__osmode], 1
  1049. jnz realMode
  1050. mov ax, es
  1051. (* lsl cx, ax *)
  1052. db 0FH, 3, 0C8H
  1053. jcxz gotCount
  1054. mov ax, cx
  1055. mov cl, InitRecSize
  1056. div cl
  1057. sub ah, ah
  1058. mov cx, ax
  1059. jmp gotCount
  1060. realMode:
  1061. mov cx, -1
  1062. mov di, -InitRecSize
  1063. sizeLoop:
  1064. add di, InitRecSize
  1065. cmp word es:[di][Magic], MAGIC_NUM
  1066. loope sizeLoop
  1067. neg cx
  1068. sub cx, 2
  1069. gotCount:
  1070. add [@InitGrandTotal], cx
  1071. les bx, [bp][Current]
  1072. mov es:[bx][InitRecTotal], cx
  1073. les bx, es:[bx][InitRecNext]
  1074. jmp chainLoop
  1075. chainDone:
  1076. mov word [@InitCalled], 0
  1077. mov byte [@InitPriority], PRMAX
  1078. mov sp, bp
  1079. pop bp
  1080. ret 0
  1081. (***************************************************************************)
  1082. segment _TEXT(CODE,28H)
  1083. segment _DATA(DATA, 28H)
  1084. extrn _x_main
  1085. extrn _main
  1086. select _DATA
  1087. extrn __argv
  1088. extrn __argc
  1089. select _TEXT
  1090. public __main_args2 :
  1091. (*%F RegParam *)
  1092. (*%F NearPtr *)
  1093. push ds (* char *argv[] *)
  1094. (*%E *)
  1095. mov ax, __argv
  1096. push ax
  1097. push [__argc] (* int argc *)
  1098. (*%E *)
  1099. (*%T RegParam *)
  1100. (*%F NearPtr *)
  1101. mov ax, [__argc] (* int argc *)
  1102. mov bx, __argv (* char *argv[] *)
  1103. mov cx, ds
  1104. (*%E *)
  1105. (*%T NearPtr *)
  1106. mov ax, [__argc]
  1107. mov bx, __argv
  1108. (*%E *)
  1109. (*%E *)
  1110. (*%F NearCall *)
  1111. call far [_x_main] (* call main *)
  1112. (*%E *)
  1113. (*%T NearCall *)
  1114. call _main
  1115. (*%E *)
  1116. (*%F RegParam *)
  1117. (*%F NearPtr *)
  1118. add sp, 6
  1119. (*%E *)
  1120. (*%T NearPtr *)
  1121. add sp, 4
  1122. (*%E *)
  1123. (*%E *)
  1124. (*%F NearCall *)
  1125. ret far 0
  1126. (*%E *)
  1127. (*%T NearCall *)
  1128. ret 0
  1129. (*%E *)
  1130. section
  1131. segment _TEXT(CODE,28H)
  1132. segment _DATA(DATA, 28H)
  1133. extrn _x_main
  1134. extrn _main
  1135. select _DATA
  1136. extrn __env_var
  1137. extrn __argv
  1138. extrn __argc
  1139. select _TEXT
  1140. public __main_args3 :
  1141. (*%F RegParam *)
  1142. (*%F NearPtr *) (* pass arguments to main *)
  1143. push ds
  1144. (*%E *)
  1145. mov ax, __env_var
  1146. push ax (* char *envp[] *)
  1147. (*%F NearPtr *)
  1148. push ds (* char *argv[] *)
  1149. (*%E *)
  1150. mov ax, __argv
  1151. push ax
  1152. push [__argc] (* int argc *)
  1153. (*%E *)
  1154. (*%T RegParam *)
  1155. (*%F NearPtr *)
  1156. mov ax, [__argc] (* int argc *)
  1157. mov bx, __argv (* char *argv[] *)
  1158. mov cx, ds
  1159. push ds
  1160. mov dx, __env_var
  1161. push dx (* char *envp[] *)
  1162. (*%E *)
  1163. (*%T NearPtr *)
  1164. mov ax, [__argc]
  1165. mov bx, __argv
  1166. mov cx, __env_var
  1167. (*%E *)
  1168. (*%E *)
  1169. (*%F NearCall *)
  1170. call far [_x_main] (* call main *)
  1171. (*%E *)
  1172. (*%T NearCall *)
  1173. call _main
  1174. (*%E *)
  1175. (*%F RegParam *)
  1176. (*%F NearPtr *)
  1177. add sp, 10
  1178. (*%E *)
  1179. (*%T NearPtr *)
  1180. add sp, 6
  1181. (*%E *)
  1182. (*%E *)
  1183. (*%F NearCall *)
  1184. ret far 0
  1185. (*%E *)
  1186. (*%T NearCall *)
  1187. ret 0
  1188. (*%E *)
  1189. section
  1190. (****************************************************************************)
  1191. (*%T _WINDLL *)
  1192. segment _TEXT(CODE,28H)
  1193. extrn LIBMAIN
  1194. extrn __heap_size
  1195. extrn __CmdLine
  1196. extrn __iHandle
  1197. extrn __call_main
  1198. public __libmain_args :
  1199. push [__iHandle]
  1200. push ds
  1201. push [__heap_size]
  1202. push [__CmdLine][2]
  1203. push [__CmdLine]
  1204. jmp __call_main
  1205. (*%E *)
  1206. section
  1207. (****************************************************************************)
  1208. segment _TEXT(CODE,28H)
  1209. segment _DATA(DATA, 28H)
  1210. segment _BSS(BSS, 28H)
  1211. select _BSS
  1212. InitLim = 32
  1213. buffer : org (DataPtrSize * InitLim) + 2
  1214. select _TEXT
  1215. extrn $initm
  1216. DummyProc:
  1217. (*%F near_init_code *)
  1218. ret far 0
  1219. (*%E *)
  1220. (*%T near_init_code *)
  1221. ret 0
  1222. (*%E *)
  1223. public _InitModules :
  1224. (*%F _DLLOVL *)
  1225. call Init
  1226. (*%F NearCall *)
  1227. ret far 0
  1228. (*%E *)
  1229. (*%T NearCall *)
  1230. ret 0
  1231. (*%E *)
  1232. call Init
  1233. (*%F NearCall *)
  1234. ret far 2
  1235. (*%E *)
  1236. (*%T NearCall *)
  1237. ret 2
  1238. (*%E *)
  1239. call Init
  1240. (*%F NearCall *)
  1241. ret far 4
  1242. (*%E *)
  1243. (*%T NearCall *)
  1244. ret 4
  1245. (*%E *)
  1246. call Init
  1247. (*%F NearCall *)
  1248. ret far 6
  1249. (*%E *)
  1250. (*%T NearCall *)
  1251. ret 6
  1252. (*%E *)
  1253. call Init
  1254. (*%F NearCall *)
  1255. ret far 8
  1256. (*%E *)
  1257. (*%T NearCall *)
  1258. ret 8
  1259. (*%E *)
  1260. call Init
  1261. (*%F NearCall *)
  1262. ret far 0AH
  1263. (*%E *)
  1264. (*%T NearCall *)
  1265. ret 0AH
  1266. (*%E *)
  1267. arg1 = frame+2
  1268. (*%E *)
  1269. (*%T _DLLOVL *)
  1270. arg1 = frame
  1271. (*%E *)
  1272. base = -2
  1273. StackPos = -4
  1274. locals = 4
  1275. Init:
  1276. push bp
  1277. mov bp, sp
  1278. sub sp, locals
  1279. (*%T RegParam *)
  1280. push ax
  1281. push bx
  1282. push cx
  1283. push dx
  1284. (*%E *)
  1285. push di
  1286. push si
  1287. push ds
  1288. (*%F SameDS *)
  1289. mov ax, _DATA
  1290. mov ds, ax
  1291. (*%E *)
  1292. mov di, buffer
  1293. push ds
  1294. mov ax, ds
  1295. mov es, ax
  1296. mov ax, DummyProc
  1297. stosw
  1298. (*%F near_init_code *)
  1299. mov ax, cs
  1300. stosw
  1301. (*%E *)
  1302. lea si, [bp][arg1]
  1303. mov cx, ss
  1304. mov ds, cx
  1305. mov cx, InitLim
  1306. storeLoop:
  1307. lodsw
  1308. (*%T near_init_data *)
  1309. or ax, ax
  1310. (*%E *)
  1311. (*%F near_init_data *)
  1312. mov bx, ax
  1313. or bx, ds:[si]
  1314. (*%E *)
  1315. jz terminator
  1316. stosw
  1317. (*%F NearPtr *)
  1318. (*%F near_init_data *)
  1319. movsw
  1320. (*%E *)
  1321. (*%T near_init_data *)
  1322. add si, 2
  1323. (*%E *)
  1324. (*%E *)
  1325. loop storeLoop
  1326. terminator:
  1327. mov ax, -1
  1328. stosw
  1329. pop ds
  1330. extrn _x_main
  1331. mov word [_x_main], buffer
  1332. (*%F near_init_data *)
  1333. mov [_x_main][2], es
  1334. (*%E *)
  1335. push bp
  1336. (*%T _DLLOVL *)
  1337. mov bp,sp
  1338. call far $initm
  1339. (*%E *)
  1340. (*%F _DLLOVL *)
  1341. (*%F near_init_code *)
  1342. push cs
  1343. (*%E *)
  1344. call $initm
  1345. (*%E *)
  1346. pop bp
  1347. noArgs:
  1348. pop ds
  1349. pop si
  1350. pop di
  1351. (*%T RegParam *)
  1352. pop dx
  1353. pop cx
  1354. pop bx
  1355. pop ax
  1356. (*%E *)
  1357. mov sp, bp
  1358. pop bp
  1359. (*%F _DLLOVL *)
  1360. ret 0
  1361. (*%E *)
  1362. (*%T _DLLOVL *)
  1363. ret far 0
  1364. (*%E *)
  1365. (***************************************************************************)
  1366. section;
  1367. segment PROC_TEXT(CODE,28H)
  1368. extrn @MachineId
  1369. public __set_machine_id :
  1370. mov ax, 0F000H
  1371. mov es, ax
  1372. mov al, es:[0FFFEH]
  1373. mov cs:[@MachineId], al
  1374. ret far 0
  1375. (*****************************************************************************)
  1376. section
  1377. segment _TEXT(CODE,28H)
  1378. segment _DATA(DATA, 28H)
  1379. select _TEXT
  1380. public __env_copy :
  1381. push ds
  1382. mov ds, ax
  1383. rep ; movsb
  1384. pop ds
  1385. ret 0
  1386. (****************************************************************************)
  1387. section
  1388. segment _TEXT(CODE,28H)
  1389. extrn __call_main
  1390. public __init0 :
  1391. jmp __call_main
  1392. section
  1393. segment _TEXT(CODE,28H)
  1394. extrn __main_args2
  1395. extrn __setargv
  1396. public __init2 :
  1397. call __setargv
  1398. jmp __main_args2
  1399. section
  1400. segment _TEXT(CODE,28H)
  1401. extrn __main_args3
  1402. extrn __setenv
  1403. extrn __setargv
  1404. public __init3 :
  1405. (*%F NearCall *)
  1406. call far __setenv
  1407. (*%E *)
  1408. (*%T NearCall *)
  1409. call __setenv
  1410. (*%E *)
  1411. call __setargv
  1412. jmp __main_args3
  1413. (***************************************************************************)
  1414. (*%T _WINDLL *)
  1415. section
  1416. segment _TEXT(CODE,28H)
  1417. extrn __libmain_args
  1418. public __initWDLL :
  1419. jmp __libmain_args
  1420. (*%E *)
  1421. (*%F _OS2 *)
  1422. (***************************************************************************)
  1423. section
  1424. segment _TEXT(CODE,28H)
  1425. segment _DATA(DATA, 28H)
  1426. extrn __stklen
  1427. extrn __nheaptop
  1428. extrn __SSisDS
  1429. extrn __far_ss
  1430. select _TEXT
  1431. (* ------------------------------------------------------------------------
  1432. PROCEDURE - _getheapbase.
  1433. PRECONDITIONS - __SSisDS, far_ss and __stklen initialised.
  1434. POSTCONDITIONS - None.
  1435. IN PARAMETERS - None.
  1436. OUT PARAMETERS - Returns far pointer to far heap base.
  1437. CALLING CONVENTION - Standard.
  1438. NOTES - Does not cause far heap to be initialsised.
  1439. VERSION - _OS2 and MSDOS.
  1440. ------------------------------------------------------------------------ *)
  1441. public __getheapbase :
  1442. (*%T _DLLOVL *)
  1443. push bp
  1444. mov bp, sp
  1445. (*%E *)
  1446. (*%F NearPtr *)
  1447. (*%F SameDS *)
  1448. push ds
  1449. mov ax, _DATA
  1450. mov ds, ax
  1451. (*%E *)
  1452. sub ax, ax
  1453. cmp byte [__SSisDS], 0
  1454. jne nearStack
  1455. add ax, [__stklen]
  1456. add ax, 0FH
  1457. shr ax, 1
  1458. shr ax, 1
  1459. shr ax, 1
  1460. shr ax, 1
  1461. nearStack:
  1462. mov dx, [__far_ss]
  1463. add dx, ax
  1464. sub ax, ax
  1465. (*%F SameDS *)
  1466. pop ds
  1467. (*%E *)
  1468. (*%E *)
  1469. (*%T NearPtr *)
  1470. mov dx, [__far_ss]
  1471. sub ax, ax
  1472. (*%E *)
  1473. (*%T _DLLOVL *)
  1474. pop bp
  1475. (*%E *)
  1476. (*%F NearCall *)
  1477. ret far 0
  1478. (*%E *)
  1479. (*%T NearCall *)
  1480. ret 0
  1481. (*%E *)
  1482. (****************************************************************************)
  1483. (*%F _WINDLL *)
  1484. section
  1485. segment _INIT(INIT_CODE,28H)
  1486. segment _TEXT(CODE,28H)
  1487. segment _DATA(DATA,28H)
  1488. segment _BSS(BSS, 28H)
  1489. extrn __setargv
  1490. select _TEXT
  1491. do_initargc : (* defined later on ! *)
  1492. select _INIT
  1493. (*%F NearCall *)
  1494. initargc : dw MAGIC_NUM
  1495. db PR4
  1496. dd do_initargc
  1497. (*%E *)
  1498. (*%T NearCall *)
  1499. initargc : dw MAGIC_NUM
  1500. db PR4
  1501. dw do_initargc
  1502. (*%E *)
  1503. select _BSS
  1504. public __argv : org 32*DataPtrSize
  1505. select _DATA
  1506. public __argc : dw initargc
  1507. select _TEXT
  1508. (*%T _DLLOVL *)
  1509. push bp
  1510. mov bp, sp
  1511. (*%E *)
  1512. call __setargv
  1513. (*%F NearCall *)
  1514. (*%T _DLLOVL *)
  1515. pop bp
  1516. (*%E *)
  1517. ret far 0
  1518. (*%E *)
  1519. (*%T NearCall *)
  1520. ret 0
  1521. (*%E *)
  1522. (****************************************************************************)
  1523. section
  1524. segment _INIT(INIT_CODE,28H)
  1525. segment _TEXT(CODE,28H)
  1526. segment _DATA(DATA,28H)
  1527. segment _BSS(BSS, 28H)
  1528. extrn __setargv
  1529. extrn __setenv
  1530. select _TEXT
  1531. do_initargce : (* defined later on ! *)
  1532. select _INIT
  1533. (*%F NearCall *)
  1534. initargce : dw MAGIC_NUM
  1535. db PR4
  1536. dd do_initargce
  1537. (*%E *)
  1538. (*%T NearCall *)
  1539. initargce : dw MAGIC_NUM
  1540. db PR4
  1541. dw do_initargce
  1542. (*%E *)
  1543. select _DATA
  1544. public __env_var : dw initargce
  1545. org ENVNUM*DataPtrSize-2
  1546. select _TEXT
  1547. (*%T _DLLOVL *)
  1548. push bp
  1549. mov bp, sp
  1550. (*%E *)
  1551. (*%F NearCall *)
  1552. call far __setenv
  1553. (*%E *)
  1554. (*%T NearCall *)
  1555. call __setenv
  1556. (*%E *)
  1557. call __setargv
  1558. (*%F NearCall *)
  1559. (*%T _DLLOVL *)
  1560. pop bp
  1561. (*%E *)
  1562. ret far 0
  1563. (*%E *)
  1564. (*%T NearCall *)
  1565. ret 0
  1566. (*%E *)
  1567. (*%E *)
  1568. (****************************************************************************)
  1569. segment _TEXT(CODE,28H)
  1570. segment _DATA(DATA, 28H)
  1571. extrn __exit
  1572. extrn __osmajor
  1573. extrn __osminor
  1574. select _TEXT
  1575. (* void __osversion(void) - checks DOS version and terminates if v1.x. *)
  1576. public __osversion :
  1577. push ds
  1578. mov ah, 30H
  1579. int 21H
  1580. or al, al
  1581. je versionOne
  1582. mov [__osmajor], al
  1583. mov [__osminor], ah
  1584. jmp versionDone
  1585. versionOne:
  1586. mov ax, cs
  1587. mov ds, ax
  1588. mov dx, message
  1589. mov ah, 9
  1590. int 21H
  1591. pop ds
  1592. (*%F NearCall *)
  1593. call far __exit
  1594. (*%E *)
  1595. (*%T NearCall *)
  1596. call __exit
  1597. (*%E *)
  1598. versionDone:
  1599. pop ds
  1600. ret 0
  1601. message : db 'Error MSDOS V1$'
  1602. (**************************************************************************)
  1603. (*%F _WINDLL *)
  1604. section
  1605. segment _TEXT(CODE,28H)
  1606. segment _DATA(DATA, 28H)
  1607. select _DATA
  1608. extrn __osmajor
  1609. extrn __argv
  1610. extrn __argbuf
  1611. extrn __argc
  1612. extrn __psp
  1613. extrn __arg_init
  1614. select _TEXT
  1615. public __setargv :
  1616. push di
  1617. push si
  1618. push ds
  1619. cmp byte [__arg_init], 0
  1620. jne near initDone
  1621. not byte [__arg_init]
  1622. mov di, __argbuf
  1623. cmp word [__osmajor], 2 (* process command line *)
  1624. je noExecName
  1625. mov es, [__psp]
  1626. mov es, es:[2CH]
  1627. sub di, di
  1628. sub ax, ax
  1629. mov cx, -1
  1630. execLoop: (* get address of command *)
  1631. scasw
  1632. je execFound
  1633. dec di
  1634. loop execLoop
  1635. (*%F NearPtr *)
  1636. execFound:
  1637. add di, 2
  1638. mov [__argv], di
  1639. mov [__argv][2], es
  1640. jmp argv1
  1641. noExecName: (* version 2 - argv[0]=NULL *)
  1642. mov word [__argv], 0
  1643. mov word [__argv][2], 0
  1644. argv1:
  1645. mov bx, 4 (* move arguments to buffer *)
  1646. mov es, [__psp]
  1647. mov di, 81H
  1648. mov si, __argbuf
  1649. mov cl, es:[di][-1]
  1650. sub ch, ch
  1651. argLoop:
  1652. mov al, ' '
  1653. repe ; scasb
  1654. je endofLine
  1655. dec di
  1656. inc cx
  1657. mov [__argv][bx], si
  1658. mov [__argv][bx][2], ds
  1659. xchg di, si
  1660. push es
  1661. push ds
  1662. pop es
  1663. pop ds
  1664. add bx, 4
  1665. mov dl, ' '
  1666. mov dh, 0
  1667. moveLoop:
  1668. lodsb
  1669. cmp al, dl
  1670. jne notSpace
  1671. cmp dh, 1
  1672. jz endString
  1673. endStringRet:
  1674. sub al, al
  1675. stosb
  1676. xchg di, si
  1677. push es
  1678. push ds
  1679. pop es
  1680. pop ds
  1681. loop argLoop
  1682. jmp endofLine
  1683. notSpace:
  1684. cmp al, '"'
  1685. je startString
  1686. stosb
  1687. startStringRet:
  1688. loop moveLoop
  1689. sub al, al
  1690. stosb
  1691. endofLine:
  1692. shr bx, 1
  1693. shr bx, 1
  1694. (*%E *)
  1695. (*%T NearPtr *)
  1696. execFound:
  1697. mov ax, es
  1698. mov ds, ax (* ds:si = name *)
  1699. (*%T _WINDOWS *)
  1700. mov ax, ss
  1701. (*%E *)
  1702. (*%F _WINDOWS *)
  1703. mov ax, _DATA
  1704. (*%E *)
  1705. mov es, ax
  1706. add di, 2
  1707. mov si, di
  1708. mov di, __argbuf (* es:di = buffer *)
  1709. mov es:[__argv], di
  1710. nLoop:
  1711. lodsb
  1712. stosb
  1713. or al, al
  1714. jz argv1
  1715. jmp nLoop
  1716. noExecName: (* version 2 - argv[0]=NULL *)
  1717. mov word [__argv], 0
  1718. argv1:
  1719. mov bx, 2 (* move arguments to buffer *)
  1720. (*%T _WINDOWS *)
  1721. mov ax, ss
  1722. (*%E *)
  1723. (*%F _WINDOWS *)
  1724. mov ax, _DATA
  1725. (*%E *)
  1726. mov ds, ax
  1727. mov es, [__psp]
  1728. mov si, di
  1729. mov di, 81H
  1730. mov cl, es:[di][-1]
  1731. sub ch, ch
  1732. argLoop:
  1733. mov al, ' '
  1734. repe ; scasb
  1735. je endofLine
  1736. dec di
  1737. inc cx
  1738. mov [__argv][bx], si
  1739. xchg di, si
  1740. push es
  1741. push ds
  1742. pop es
  1743. pop ds
  1744. add bx, 2
  1745. mov dl, ' '
  1746. mov dh, 0
  1747. moveLoop:
  1748. lodsb
  1749. cmp al, dl
  1750. jne notSpace
  1751. cmp dh, 1
  1752. jz endString
  1753. endStringRet:
  1754. sub al, al
  1755. stosb
  1756. xchg di, si
  1757. push es
  1758. push ds
  1759. pop es
  1760. pop ds
  1761. loop argLoop
  1762. jmp endofLine
  1763. notSpace:
  1764. cmp al, '"'
  1765. je startString
  1766. stosb
  1767. startStringRet:
  1768. loop moveLoop
  1769. sub al, al
  1770. stosb
  1771. endofLine:
  1772. shr bx, 1
  1773. (*%E *)
  1774. (*%T _WINDOWS *)
  1775. mov ax, ss
  1776. (*%E *)
  1777. (*%F _WINDOWS *)
  1778. mov ax, _DATA
  1779. (*%E *)
  1780. mov ds, ax
  1781. mov [__argc], bx
  1782. initDone:
  1783. pop ds
  1784. pop si
  1785. pop di
  1786. ret 0
  1787. startString:
  1788. mov dh, 1
  1789. mov dl, '"'
  1790. jmp startStringRet
  1791. endString:
  1792. mov dh, 0
  1793. mov dl, ' '
  1794. jmp endStringRet
  1795. (*%E *)
  1796. (****************************************************************************)
  1797. section
  1798. segment _TEXT(CODE,28H)
  1799. segment _DATA(DATA, 28H)
  1800. select _DATA
  1801. extrn __sigsetup
  1802. extrn __exitbreak
  1803. extrn __exitsig
  1804. extrn __exitgraph
  1805. select _TEXT
  1806. public __exit :
  1807. (*
  1808. void __exit(int code)
  1809. terminates process.
  1810. *)
  1811. code = frame
  1812. push bp
  1813. mov bp, sp
  1814. (*%T RegParam *)
  1815. mov di, ax
  1816. (*%E *)
  1817. (*%F SameDS *)
  1818. mov ax, _DATA
  1819. mov ds, ax
  1820. (*%E *)
  1821. (*%F _WINDOWS *)
  1822. mov cx, [__exitbreak]
  1823. jcxz noBreak
  1824. call far [__exitbreak]
  1825. noBreak:
  1826. mov cx, [__exitsig]
  1827. jcxz noSig
  1828. (*%F NearCall *)
  1829. call far [__exitsig]
  1830. (*%E *)
  1831. (*%T NearCall *)
  1832. call cx
  1833. (*%E *)
  1834. noSig:
  1835. mov cx, [__exitgraph]
  1836. jcxz noGraph
  1837. (*%F NearCall *)
  1838. call far [__exitgraph]
  1839. (*%E *)
  1840. (*%T NearCall *)
  1841. call cx
  1842. (*%E *)
  1843. noGraph:
  1844. (*%E *)
  1845. extrn __FloatFinish
  1846. call far __FloatFinish
  1847. (*%F RegParam *)
  1848. mov al, [bp][code]
  1849. (*%E *)
  1850. (*%T RegParam *)
  1851. mov ax, di
  1852. (*%E *)
  1853. (*%T _DLLOVL *)
  1854. extrn Loader$Terminate
  1855. call far Loader$Terminate
  1856. (*%E *)
  1857. mov ah, 4CH
  1858. int 21H
  1859. db 'TopSpeed RTL (C) Clarion Software Corporation 1989-1992'
  1860. (****************************************************************************)
  1861. section
  1862. segment _DATA(DATA, 28H)
  1863. segment _TEXT(CODE,28H)
  1864. extrn __exit_proc
  1865. extrn __exitbreak
  1866. extrn __exitsig
  1867. extrn __exitgraph
  1868. extrn __FloatFinish
  1869. public __term_process :
  1870. (*%T _DLLOVL *)
  1871. push bp
  1872. mov bp, sp
  1873. (*%E *)
  1874. mov cx, [__exit_proc]
  1875. jcxz noCall4
  1876. (*%F SameDS *)
  1877. push ds
  1878. (*%E *)
  1879. call far [__exit_proc]
  1880. (*%F SameDS *)
  1881. pop ds
  1882. (*%E *)
  1883. noCall4:
  1884. mov cx, [__exitbreak]
  1885. jcxz noBreak
  1886. call far [__exitbreak]
  1887. noBreak:
  1888. mov cx, [__exitsig][2]
  1889. jcxz noSig
  1890. (*%F NearCall *)
  1891. call far [__exitsig]
  1892. (*%E *)
  1893. (*%T NearCall *)
  1894. call cx
  1895. (*%E *)
  1896. noSig:
  1897. mov cx, [__exitgraph]
  1898. jcxz noGraph
  1899. (*%F NearCall *)
  1900. call far [__exitgraph]
  1901. (*%E *)
  1902. (*%T NearCall *)
  1903. call cx
  1904. (*%E *)
  1905. noGraph:
  1906. call far __FloatFinish
  1907. (*%T _DLLOVL *)
  1908. pop bp
  1909. (*%E *)
  1910. (*%F NearCall *)
  1911. ret far 0
  1912. (*%E *)
  1913. (*%T NearCall *)
  1914. ret 0
  1915. (*%E *)
  1916. (****************************************************************************)
  1917. section
  1918. segment _TEXT(CODE,28H)
  1919. segment _DATA(DATA, 28H)
  1920. select _DATA
  1921. message : db 'Floating Point Not Loaded$'
  1922. select _TEXT
  1923. public __real_pdef :
  1924. public __real_sdef :
  1925. (*%F SameDS *)
  1926. push ds
  1927. mov ax, _DATA
  1928. mov ds, ax
  1929. (*%E *)
  1930. mov dx, message
  1931. mov ah, 9
  1932. extrn @DosInterrupt
  1933. (*%F NearCall *)
  1934. call far @DosInterrupt
  1935. (*%E *)
  1936. (*%T NearCall *)
  1937. call @DosInterrupt
  1938. (*%E *)
  1939. (*%F SameDS *)
  1940. pop ds
  1941. (*%E *)
  1942. ret 0
  1943. (*%F _WINDOWS *)
  1944. section
  1945. segment _TEXT(CODE,28H)
  1946. segment _INIT(INIT_CODE,28H)
  1947. segment EMU_STATE(DATA,28H)
  1948. segment _CONST(DATA,28H)
  1949. segment _DATA(DATA,28H)
  1950. segment BSS_START(BSS,28H)
  1951. segment _BSS(BSS,28H)
  1952. segment BSS_END(BSS,28H)
  1953. segment NEAR_STACK(BSS, 28H)
  1954. segment NEAR_HEAP(BSS, 28H)
  1955. group DGROUP(EMU_STATE,_CONST,_DATA,BSS_START,_BSS,BSS_END,NEAR_STACK,NEAR_HEAP)
  1956. extrn __psp
  1957. extrn __env
  1958. extrn __hugeshift
  1959. extrn __env_var
  1960. extrn __env_size
  1961. extrn __osmajor
  1962. extrn __argv
  1963. extrn __argc
  1964. extrn __argbuf
  1965. extrn __farstack
  1966. extrn __fmemsetup
  1967. extrn __nheaptop
  1968. extrn _main
  1969. extrn __exit
  1970. extrn __cleanup
  1971. extrn __stklen
  1972. extrn __osversion
  1973. extrn _x_initx
  1974. extrn _x_bss_end
  1975. extrn _x_bss_start
  1976. extrn __bss_end
  1977. extrn __bss_start
  1978. extrn _x_main
  1979. extrn __main_args
  1980. extrn __FloatInit
  1981. extrn __SigInit
  1982. extrn __SSisDS
  1983. extrn __far_ss
  1984. extrn __stk_base
  1985. extrn __initx
  1986. extrn __x_near_stack_start
  1987. extrn __set_machine_id
  1988. extrn __InitSetup
  1989. extrn __InitLoop
  1990. extrn @ExitCode
  1991. select _TEXT (* Process initialisation starts here *)
  1992. (* DON'T TOUCH *)
  1993. public __startup :
  1994. mov dx, ds (* save PSP *)
  1995. cld (* cld is assumed everywhere *)
  1996. mov ax, BSS_START
  1997. mov es, ax
  1998. mov ax, _DATA
  1999. mov ds, ax
  2000. mov [__stklen], si
  2001. mov [__far_ss], ss
  2002. (*%F MThread *)
  2003. (*%F NearPtr *)
  2004. mov [__SSisDS], cl
  2005. (*%E *)
  2006. (*%E *)
  2007. (*%T NearPtr *)
  2008. mov byte [__SSisDS], 1 (* SS always == DS in this model *)
  2009. (*%E *)
  2010. (*%T MThread *)
  2011. mov byte [__SSisDS], 0 (* SS always != DS in this model *)
  2012. (*%E *)
  2013. (*%F _DLL *)
  2014. mov di, [_x_bss_start] (* set near heap and _BSS bounds *)
  2015. mov cx, [_x_bss_end]
  2016. (*%E *)
  2017. (*%T _DLL *)
  2018. mov di, __bss_start (* set near heap and _BSS bounds *)
  2019. mov cx, __bss_end
  2020. (*%E *)
  2021. mov si, cx (* clear _BSS segment *)
  2022. sub cx, di
  2023. sub ax, ax
  2024. shr cx, 1
  2025. rep; stosw
  2026. adc cx, 0
  2027. rep; stosb
  2028. mov [__psp],dx (* save psp segment *)
  2029. mov es, dx
  2030. mov dx, es:[2CH]
  2031. mov [__env], dx (* save enviromment segment *)
  2032. (*%F NearPtr *)
  2033. mov byte ss:[CurrentThread], 1
  2034. (*%E *)
  2035. mov word ss:[InMathLib], 0
  2036. cmp byte [__SSisDS], 1
  2037. je nearStack
  2038. not word [__farstack] (* far stack required, not much to do *)
  2039. jmp stackSet
  2040. nearStack:
  2041. mov bx, [__x_near_stack_start]
  2042. mov [__stk_base], bx
  2043. add bx, [__stklen]
  2044. and bx, ~1
  2045. sub bx, 2
  2046. mov ax, _DATA (* Near stack required, move it to DGROUP *)
  2047. mov ss, ax
  2048. mov sp, bx
  2049. stackSet:
  2050. mov ax, STACK_GUARD
  2051. push ax
  2052. sub bp, bp
  2053. push bp
  2054. mov bp, sp
  2055. call far __FloatInit (* initialise floating point if present *)
  2056. call __osversion (* get MSDOS version first *)
  2057. call far __set_machine_id
  2058. mov word [__hugeshift], 1000H
  2059. call __InitSetup
  2060. (* Program actually starts after library initialization is performed durring *)
  2061. (* the following call *)
  2062. (*%F NearCall *)
  2063. call far __InitLoop (* library module initialisation is called here *)
  2064. (*%E *)
  2065. (*%T NearCall *)
  2066. call __InitLoop
  2067. (*%E *)
  2068. call __cleanup
  2069. mov ax, [@ExitCode]
  2070. (*%F RegParam *)
  2071. push ax
  2072. (*%E *)
  2073. (*%F NearCall *)
  2074. call far __exit
  2075. (*%E *)
  2076. (*%T NearCall *)
  2077. call __exit
  2078. (*%E *)
  2079. (* This call will not return *)
  2080. (*****************************)
  2081. public $Stage2 :
  2082. (*%F NearCall *)
  2083. call far __SigInit
  2084. (*%E *)
  2085. (*%T NearCall *)
  2086. call __SigInit (* initialise interrupt vectors *)
  2087. (*%E *)
  2088. add word [__stk_base], 100H
  2089. (*%F _DLLOVL *)
  2090. cmp byte [__fmemsetup], 0
  2091. jnz dontFree (* Far heap present memory init complete *)
  2092. sub dx, dx
  2093. cmp byte [__SSisDS], 1
  2094. je nearStackSet (* free surplus memory if near heap and stack *)
  2095. mov dx, [__stklen]
  2096. add dx, 0FH
  2097. jnc sizeOK
  2098. mov dx, 1000H
  2099. jmp nearStackSet
  2100. sizeOK:
  2101. mov cl, 4
  2102. shr dx, cl
  2103. nearStackSet:
  2104. mov ax, [__psp]
  2105. mov es, ax
  2106. mov bx, [__far_ss]
  2107. add bx, dx
  2108. mov es:[2], bx
  2109. sub bx, ax
  2110. mov ah, 4AH
  2111. int 21H
  2112. dontFree:
  2113. (*%E *)
  2114. (*%F _ENV *)
  2115. (*%T _DLLOVL *)
  2116. mov byte [__fmemsetup], 1 (* Far Heap Managed by Loader *)
  2117. (*%E *)
  2118. (*%E *)
  2119. jmp far [_x_initx]
  2120. section
  2121. segment _TEXT(CODE, 28H)
  2122. extrn _main
  2123. extrn _x_main
  2124. public __call_main :
  2125. (*%F NearCall *)
  2126. (*%T _DLLOVL *)
  2127. push bp
  2128. mov bp,sp
  2129. (*%E *)
  2130. call far [_x_main] (* call main *)
  2131. (*%T _DLLOVL *)
  2132. pop bp
  2133. (*%E *)
  2134. ret far 0
  2135. (*%E *)
  2136. (*%T NearCall *)
  2137. call [_x_main]
  2138. ret 0
  2139. (*%E *)
  2140. (*%E *) (* NOT Windows *)
  2141. (*%T _WINDOWS *)
  2142. section
  2143. segment _TEXT(CODE,28H)
  2144. segment _INIT(INIT_CODE,28H)
  2145. segment BEGDATA(DATA,28H)
  2146. public __bdata_dummy : org 10
  2147. segment EMU_STATE(DATA,28H)
  2148. segment _CONST(DATA,28H)
  2149. segment _DATA(DATA,28H)
  2150. segment BSS_START(BSS,28H)
  2151. segment _BSS(BSS,28H)
  2152. segment BSS_END(BSS,28H)
  2153. group DGROUP(BEGDATA,EMU_STATE,_CONST,_DATA,BSS_START,_BSS,BSS_END)
  2154. extrn __psp
  2155. extrn __env
  2156. extrn __hugeshift
  2157. extrn __env_var
  2158. extrn __env_size
  2159. extrn __osmajor
  2160. extrn __argv
  2161. extrn __argc
  2162. extrn __argbuf
  2163. extrn __farstack
  2164. extrn __fmemsetup
  2165. extrn __nheaptop
  2166. extrn _main
  2167. extrn __exit
  2168. extrn __cleanup
  2169. extrn __stklen
  2170. extrn __osversion
  2171. extrn _x_bss_end
  2172. extrn _x_bss_start
  2173. extrn _x_main
  2174. extrn __main_args
  2175. extrn __FloatInit
  2176. extrn __SigInit
  2177. extrn __SSisDS
  2178. extrn __stk_base
  2179. extrn _x_initx
  2180. extrn __set_machine_id
  2181. extrn __InitLoop
  2182. extrn __InitSetup
  2183. extrn __ireg
  2184. extrn @ExitCode
  2185. select _DATA
  2186. dm : dw 0
  2187. select _TEXT (* Process initialisation starts here *)
  2188. (* DON'T TOUCH *)
  2189. public __startup :
  2190. cld (* cld is assumed everywhere *)
  2191. (*%F _WINDLL *)
  2192. mov [__stk_base], cx (* cx set by call to INITTASK *)
  2193. (*%E *)
  2194. mov cx, ds
  2195. mov es, cx
  2196. mov cx, [_x_bss_end]
  2197. (*%T _WINDLL *)
  2198. mov [__stk_base], cx
  2199. (*%E *)
  2200. mov di, [_x_bss_start] (* set near heap and _BSS bounds *)
  2201. mov si, cx (* clear _BSS segment *)
  2202. sub cx, di
  2203. sub ax, ax
  2204. rep; stosb (* cx = 0 *)
  2205. (*%F _WINDLL *)
  2206. mov dx, [__ireg][PSPSeg]
  2207. mov [__psp],dx (* save psp segment *)
  2208. mov es, dx
  2209. mov dx, es:[2CH]
  2210. mov [__env], dx (* save enviromment segment *)
  2211. (*%E *)
  2212. mov ax, STACK_GUARD (* set up stack *)
  2213. push ax
  2214. push cx
  2215. mov bp, sp
  2216. call far __FloatInit (* initialise floating point if present *)
  2217. mov word [__hugeshift], 1000H
  2218. call __InitSetup
  2219. (*%F NearCall *)
  2220. call far __InitLoop (* lib module initialisation is called here *)
  2221. (*%E *)
  2222. (*%T NearCall *)
  2223. call __InitLoop
  2224. (*%E *)
  2225. call __cleanup
  2226. mov ax, [@ExitCode]
  2227. (*%T _WINDLL *)
  2228. add sp, 4
  2229. ret far 0
  2230. (*%E *)
  2231. (*%F RegParam *)
  2232. push ax
  2233. (*%E *)
  2234. (*%F _WINDLL *)
  2235. (*%F NearCall *)
  2236. call far __exit
  2237. (*%E *)
  2238. (*%T NearCall *)
  2239. call __exit
  2240. (*%E *)
  2241. (*%E *)
  2242. (*%T _WINDLL *)
  2243. ret far 0
  2244. (*%E *)
  2245. (* This call will not return *)
  2246. (*****************************)
  2247. public $Stage2 :
  2248. (*%F NearCall *)
  2249. inc bp
  2250. push bp
  2251. mov bp, sp
  2252. (*%E *)
  2253. add word [__stk_base], 100H
  2254. jmp far [_x_initx]
  2255. public __call_main :
  2256. (*%F NearCall *)
  2257. call far [_x_main] (* call main *)
  2258. pop bp
  2259. dec bp
  2260. ret far 0
  2261. (*%E *)
  2262. (*%T NearCall *)
  2263. call [_x_main]
  2264. ret 0
  2265. (*%E *)
  2266. section
  2267. segment EMU_TEXT (EMU_CODE,28H)
  2268. public __FloatInitStack :
  2269. (*%T RegParam *)
  2270. push cx (* initialise fp registers except for stack top *)
  2271. mov cx,7
  2272. push_zero:
  2273. fldz st(0)
  2274. loop push_zero
  2275. pop cx
  2276. (*%E *)
  2277. ret far 0
  2278. (*%E _WINDOWS *)
  2279. section
  2280. segment _TEXT(CODE,28H)
  2281. segment PROC_TEXT(CODE,28H)
  2282. segment _DATA(DATA, 28H)
  2283. segment EMU_STATE(DATA,68H)
  2284. extrn @Save8087
  2285. extrn emuBuffer
  2286. extrn __initsig
  2287. extrn __real_in
  2288. extrn __real_out
  2289. extrn __rreal_in
  2290. extrn __rreal_out
  2291. extrn __farstack
  2292. extrn __stk_base
  2293. select _TEXT
  2294. public __fp_1 :
  2295. (*%F _WINDOWS *)
  2296. mov ax, PROC_TEXT
  2297. mov es, ax
  2298. mov byte es:[@Save8087], 1
  2299. mov ax, _DATA
  2300. mov es, ax
  2301. cmp word es:[__farstack], 0
  2302. je nearStack
  2303. add word es:[__stk_base], 490
  2304. nearStack:
  2305. (*%F _DLL *)
  2306. mov word es:[__real_in], __rreal_in (* initialise 'C' fp output *)
  2307. mov word es:[__real_out], __rreal_out
  2308. (*%E *)
  2309. call far __initsig
  2310. ret far 0
  2311. dw emuBuffer
  2312. (*%E *)
  2313. (*%T _WINDOWS *)
  2314. mov word [__real_in], __rreal_in (* initialise 'C' fp output *)
  2315. mov word [__real_out], __rreal_out
  2316. call far __initsig
  2317. ret far 0
  2318. (*%E *)
  2319. section
  2320. segment _TEXT(CODE,28H)
  2321. segment _DATA(DATA, 28H)
  2322. extrn __real_in
  2323. extrn __real_out
  2324. extrn __real_pdef
  2325. extrn __real_sdef
  2326. select _TEXT
  2327. public __fp_0 :
  2328. (*%F _DLL *)
  2329. (*%F _WINDOWS *)
  2330. mov ax, _DATA
  2331. mov ds, ax
  2332. (*%E *)
  2333. mov word [__real_in], __real_sdef
  2334. mov word [__real_out], __real_pdef
  2335. (*%E *)
  2336. ret far 0
  2337. (*%E *) (* NOT OS2 *)
  2338. section
  2339. (****************************************************************************)
  2340. (*%T _OS2 *)
  2341. segment _INIT(INIT_CODE,28H)
  2342. segment _TEXT(CODE,28H)
  2343. segment _DATA(DATA,28H)
  2344. segment _BSS(BSS, 28H)
  2345. extrn __setargv
  2346. extrn __InitLoop
  2347. select _DATA
  2348. extrn __x_ax
  2349. extrn __x_bx
  2350. select _TEXT
  2351. do_initargc : (* defined later on ! *)
  2352. select _INIT
  2353. (*%F NearCall *)
  2354. initargc : dw MAGIC_NUM
  2355. db PR4
  2356. dd do_initargc
  2357. (*%E *)
  2358. (*%T NearCall *)
  2359. initargc : dw MAGIC_NUM
  2360. db PR4
  2361. dw do_initargc
  2362. (*%E *)
  2363. select _BSS
  2364. public __argv : org 32*DataPtrSize
  2365. select _DATA
  2366. public __argc : dw initargc
  2367. select _TEXT
  2368. call __setargv
  2369. (*%F NearCall *)
  2370. ret far 0
  2371. (*%E *)
  2372. (*%T NearCall *)
  2373. ret 0
  2374. (*%E *)
  2375. (****************************************************************************)
  2376. section
  2377. segment _INIT(INIT_CODE,28H)
  2378. segment _TEXT(CODE,28H)
  2379. segment _DATA(DATA,28H)
  2380. segment _BSS(BSS, 28H)
  2381. extrn __setargv
  2382. extrn __setenv
  2383. extrn __InitLoop
  2384. select _DATA
  2385. select _TEXT
  2386. do_initargce : (* defined later on ! *)
  2387. select _INIT
  2388. (*%F NearCall *)
  2389. initargce : dw MAGIC_NUM
  2390. db PR4
  2391. dd do_initargce
  2392. (*%E *)
  2393. (*%T NearCall *)
  2394. initargce : dw MAGIC_NUM
  2395. db PR4
  2396. dw do_initargce
  2397. (*%E *)
  2398. select _DATA
  2399. public __env_var : dw initargce
  2400. org ENVNUM*DataPtrSize-2
  2401. select _TEXT
  2402. (*%F NearCall *)
  2403. call far __setenv
  2404. (*%E *)
  2405. (*%T NearCall *)
  2406. call __setenv
  2407. (*%E *)
  2408. call __setargv
  2409. (*%F NearCall *)
  2410. ret far 0
  2411. (*%E *)
  2412. (*%T NearCall *)
  2413. ret 0
  2414. (*%E *)
  2415. (****************************************************************************)
  2416. segment _TEXT(CODE,28H)
  2417. segment _DATA(DATA, 28H)
  2418. extrn DOSGETVERSION
  2419. extrn DOSGETMACHINEMODE
  2420. select _DATA
  2421. extrn __osmajor
  2422. extrn __osminor
  2423. extrn __osmode
  2424. select _TEXT
  2425. public __osversion :
  2426. (*
  2427. void __osversion(void)
  2428. sets OS version
  2429. *)
  2430. version = -2
  2431. locals = 2
  2432. push bp
  2433. mov bp, sp
  2434. sub sp, locals
  2435. (*%F SameDS *)
  2436. push ds
  2437. mov ax, _DATA
  2438. mov ds, ax
  2439. (*%E *)
  2440. push ss
  2441. lea ax, [bp][version]
  2442. push ax
  2443. call far DOSGETVERSION
  2444. sub ax, ax
  2445. mov al, [bp][version]
  2446. mov [__osminor], ax
  2447. mov al, [bp][version][1]
  2448. mov [__osmajor], ax
  2449. push ds
  2450. mov ax, __osmode
  2451. push ax
  2452. call far DOSGETMACHINEMODE
  2453. (*%F SameDS *)
  2454. pop ds
  2455. (*%E *)
  2456. mov sp, bp
  2457. pop bp
  2458. (*%F NearCall *)
  2459. ret far 0
  2460. (*%E *)
  2461. (*%T NearCall *)
  2462. ret 0
  2463. (*%E *)
  2464. (****************************************************************************)
  2465. section
  2466. segment _TEXT(CODE,28H)
  2467. segment _DATA(DATA, 28H)
  2468. select _DATA
  2469. extrn __x_ax
  2470. extrn __x_bx
  2471. extrn __argv
  2472. extrn __argbuf
  2473. extrn __argc
  2474. extrn __arg_init
  2475. select _TEXT
  2476. public __setargv :
  2477. push bp
  2478. push di
  2479. push si
  2480. push ds
  2481. mov cx, _DATA
  2482. mov ds, cx
  2483. cmp byte [__arg_init], 0
  2484. jne near initDone
  2485. not byte [__arg_init]
  2486. mov di, __argbuf
  2487. (*%F NearPtr *)
  2488. push ds
  2489. mov si, [__x_bx]
  2490. mov ds, [__x_ax]
  2491. mov ax, _DATA
  2492. mov es, ax
  2493. mov di, __argbuf
  2494. mov bx, __argv
  2495. sub bp, bp
  2496. mov cx, 1
  2497. mov dl, ' '
  2498. mov dh, 0
  2499. mainLoop:
  2500. mov es:[bx], di
  2501. mov es:[bx][2], es
  2502. inc bp
  2503. copyLoop:
  2504. startStringRet:
  2505. lodsb
  2506. or al, al
  2507. je copyDone
  2508. cmp al, dl
  2509. je getNextCommand
  2510. cmp al, '"'
  2511. je startString
  2512. stosb
  2513. jmp copyLoop
  2514. getNextCommand:
  2515. cmp dh, 1
  2516. jz endString
  2517. endStringRet:
  2518. sub al, al
  2519. stosb
  2520. add bx, 4
  2521. skipLoop:
  2522. mov al, [si]
  2523. or al, al
  2524. je copyDone
  2525. cmp al, ' '
  2526. jne mainLoop
  2527. inc si
  2528. loop skipLoop
  2529. copyDone:
  2530. dec cx
  2531. jcxz getNextCommand
  2532. stosb
  2533. pop ds
  2534. (*%E *)
  2535. (*%T NearPtr *)
  2536. push ds
  2537. mov si, [__x_bx]
  2538. mov ds, [__x_ax]
  2539. mov ax, _DATA
  2540. mov es, ax
  2541. mov di, __argbuf
  2542. mov bx, __argv
  2543. sub bp, bp
  2544. mov cx, 1
  2545. mov dl, ' '
  2546. mov dh, 0
  2547. mainLoop:
  2548. mov es:[bx], di
  2549. inc bp
  2550. copyLoop:
  2551. startStringRet:
  2552. lodsb
  2553. or al, al
  2554. je copyDone
  2555. cmp al, dl
  2556. je getNextCommand
  2557. cmp al, '"'
  2558. je startString
  2559. stosb
  2560. jmp copyLoop
  2561. getNextCommand:
  2562. cmp dh, 1
  2563. jz endString
  2564. endStringRet:
  2565. sub al, al
  2566. stosb
  2567. add bx, 2
  2568. skipLoop:
  2569. mov al, [si]
  2570. or al, al
  2571. je copyDone
  2572. cmp al, ' '
  2573. jne mainLoop
  2574. inc si
  2575. loop skipLoop
  2576. copyDone:
  2577. dec cx
  2578. jcxz getNextCommand
  2579. stosb
  2580. pop ds
  2581. (*%E *)
  2582. mov [__argc], bp
  2583. initDone:
  2584. pop ds
  2585. pop si
  2586. pop di
  2587. pop bp
  2588. ret 0
  2589. startString:
  2590. mov dl, '"'
  2591. mov dh, 1
  2592. jmp startStringRet
  2593. endString:
  2594. mov dl, ' '
  2595. mov dh, 0
  2596. inc si
  2597. jmp endStringRet
  2598. (***************************************************************************)
  2599. section
  2600. segment _TEXT(CODE,28H)
  2601. segment _DATA(DATA, 28H)
  2602. extrn VIOWRTCHARSTR
  2603. select _DATA
  2604. message : db 'Floating Point Not Loaded'
  2605. MESLEN = 25
  2606. select _TEXT
  2607. public __real_pdef :
  2608. public __real_sdef :
  2609. (*%F SameDS *)
  2610. push ds
  2611. mov ax, _DATA
  2612. mov ds, ax
  2613. (*%E *)
  2614. push ds
  2615. mov ax, message
  2616. push ax
  2617. mov ax, MESLEN
  2618. push ax
  2619. sub ax, ax
  2620. push ax
  2621. push ax
  2622. push ax
  2623. call far VIOWRTCHARSTR
  2624. (*%F SameDS *)
  2625. pop ds
  2626. (*%E *)
  2627. ret 0
  2628. section
  2629. segment _TEXT(CODE,28H)
  2630. segment _INIT(INIT_CODE,28H)
  2631. segment _CONST(DATA,28H)
  2632. segment _DATA(DATA,28H)
  2633. segment BSS_START(BSS,28H)
  2634. segment _BSS(BSS,28H)
  2635. segment BSS_END(BSS,28H)
  2636. segment NEAR_STACK(BSS,28H)
  2637. segment NEAR_HEAP(BSS,28H)
  2638. group DGROUP(_CONST,_DATA,BSS_START,_BSS,BSS_END,NEAR_STACK,NEAR_HEAP)
  2639. extrn __hugeshift
  2640. extrn __env_var
  2641. extrn __env_size
  2642. extrn __env
  2643. extrn __psp
  2644. extrn __osmajor
  2645. extrn __osmode
  2646. extrn __osversion
  2647. extrn @ExitCode
  2648. extrn __argv
  2649. extrn __argc
  2650. extrn __argbuf
  2651. extrn __farstack
  2652. extrn __nheaptop
  2653. extrn __sp_temp
  2654. extrn __ss_temp
  2655. extrn _x_bss_end
  2656. extrn _x_main
  2657. extrn __x_ax
  2658. extrn __x_bx
  2659. extrn __x_di
  2660. extrn __main_args
  2661. extrn __exit
  2662. extrn __cleanup
  2663. extrn _main
  2664. extrn __SSisDS
  2665. extrn __stk_base
  2666. extrn _x_initx
  2667. extrn __stklen
  2668. extrn __FloatInit
  2669. (*%F _DLL *)
  2670. extrn __siginit
  2671. (*%E *)
  2672. extrn __x_near_stack_start
  2673. extrn DOSGETHUGESHIFT
  2674. extrn DOSFREESEG
  2675. extrn DOSREALLOCSEG
  2676. extrn DOSGETMACHINEMODE
  2677. extrn __set_exit_handler
  2678. extrn __InitSetup
  2679. extrn __InitLoop
  2680. select _TEXT
  2681. public __startup :
  2682. mov dx, _DATA
  2683. mov ds, dx
  2684. mov [__stklen], si
  2685. mov [__SSisDS], cx
  2686. mov [__x_ax], ax
  2687. mov [__x_bx], bx
  2688. mov [__x_di], di
  2689. mov [__env], ax
  2690. mov [__sp_temp], sp
  2691. mov [__ss_temp], ss
  2692. (*%T _XTD *)
  2693. push ax
  2694. push bx
  2695. mov ah, 51H
  2696. int 21H
  2697. mov [__psp],bx
  2698. call far __osversion
  2699. pop bx
  2700. pop ax
  2701. (*%E *)
  2702. push ds
  2703. mov ax, __osmode
  2704. push ax
  2705. call far DOSGETMACHINEMODE
  2706. (*%T MThread *)
  2707. mov byte ss:[CurrentThread], 1 (* Thread number *)
  2708. (*%E *)
  2709. mov word ss:[InMathLib], 0
  2710. (*%T NearPtr *)
  2711. cmp byte [__SSisDS], 0
  2712. jnz sidSet
  2713. mov byte [__SSisDS], 1
  2714. sidSet:
  2715. (*%E *)
  2716. cmp byte [__SSisDS], 1
  2717. je nearStack
  2718. cmp byte [__SSisDS], 2
  2719. je pmStack
  2720. not word [__farstack] (* far stack required, not much to do *)
  2721. jmp stackSet
  2722. nearStack:
  2723. mov bx, [__x_near_stack_start]
  2724. mov [__stk_base], bx
  2725. add bx, [__stklen]
  2726. and bx, ~1
  2727. sub bx, 2
  2728. mov ax, _DATA (* Near stack required, move it to DGROUP *)
  2729. mov ss, ax
  2730. mov sp, bx
  2731. jmp stackSet
  2732. pmStack:
  2733. mov ax, sp
  2734. sub ax, [__stklen]
  2735. mov [__stk_base], ax
  2736. stackSet:
  2737. mov ax, __hugeshift
  2738. push ds
  2739. push ax
  2740. call far DOSGETHUGESHIFT
  2741. mov cx, [__hugeshift]
  2742. mov ax, 1
  2743. shl ax, cx
  2744. mov [__hugeshift], ax
  2745. mov ax, STACK_GUARD
  2746. push ax
  2747. sub bp, bp
  2748. push bp
  2749. mov bp, sp
  2750. call far __FloatInit
  2751. cmp word [__osmode], 0
  2752. je notPMode
  2753. call far __set_exit_handler
  2754. notPMode:
  2755. call __InitSetup
  2756. (*%F NearCall *)
  2757. call far __InitLoop (* lib module initialisation is called here *)
  2758. (*%E *)
  2759. (*%T NearCall *)
  2760. call __InitLoop
  2761. (*%E *)
  2762. call __cleanup
  2763. mov ax, [@ExitCode]
  2764. (*%F RegParam *)
  2765. push ax
  2766. (*%E *)
  2767. (*%F NearCall *)
  2768. call far __exit
  2769. (*%E *)
  2770. (*%T NearCall *)
  2771. call __exit
  2772. (*%E *)
  2773. (* This call will not return *)
  2774. (*****************************)
  2775. public $Stage2 :
  2776. (*%F _DLL *)
  2777. call __siginit
  2778. (*%E *)
  2779. add word [__stk_base], 100H
  2780. jmp far [_x_initx]
  2781. public __call_main :
  2782. (*%F NearCall *)
  2783. call far [_x_main]
  2784. ret far 0
  2785. (*%E *)
  2786. (*%T NearCall *)
  2787. call [_x_main]
  2788. ret 0
  2789. (*%E *)
  2790. (****************************************************************************)
  2791. section
  2792. segment _TEXT(CODE,28H)
  2793. segment _DATA(DATA, 28H)
  2794. extrn DOSEXIT
  2795. select _DATA
  2796. extrn __sp_temp
  2797. extrn __ss_temp
  2798. extrn __SSisDS
  2799. extrn __exit_list_done
  2800. select _TEXT
  2801. public __exit :
  2802. (*
  2803. void __exit(int code)
  2804. terminates process.
  2805. *)
  2806. (*%F RegParam *)
  2807. code = frame
  2808. push bp
  2809. mov bp, sp
  2810. mov ax, [bp][code]
  2811. (*%E *)
  2812. cmp byte [__SSisDS], 1
  2813. jne farStack
  2814. mov ss, [__ss_temp]
  2815. mov sp, [__sp_temp]
  2816. farStack:
  2817. mov byte [__exit_list_done], 1
  2818. mov bx, EXIT_PROCESS
  2819. push bx
  2820. push ax
  2821. call far DOSEXIT (* call exit function *)
  2822. db 'TopSpeed RTL (C) JPI 1989'
  2823. section
  2824. segment _TEXT(CODE,28H)
  2825. segment _DATA(DATA, 28H)
  2826. segment EMU_STATE(DATA,68H)
  2827. extrn emuBuffer
  2828. extrn __initsig
  2829. extrn __real_in
  2830. extrn __real_out
  2831. extrn __rreal_in
  2832. extrn __rreal_out
  2833. extrn __stk_base
  2834. extrn __farstack
  2835. select _TEXT
  2836. public __fp_1 :
  2837. mov ax, _DATA
  2838. mov es, ax
  2839. cmp word [__farstack], 0
  2840. je nearStack
  2841. add word [__stk_base], 490
  2842. nearStack:
  2843. (*%F _DLL *)
  2844. mov word es:[__real_in], __rreal_in (* initialise 'C' fp output *)
  2845. mov word es:[__real_out], __rreal_out
  2846. (*%E *)
  2847. call far __initsig
  2848. ret far 0
  2849. dw emuBuffer
  2850. section
  2851. segment _TEXT(CODE,28H)
  2852. segment _DATA(DATA, 28H)
  2853. extrn __real_in
  2854. extrn __real_out
  2855. extrn __real_pdef
  2856. extrn __real_sdef
  2857. select _TEXT
  2858. public __fp_0 :
  2859. (*%F _DLL *)
  2860. mov ax, _DATA
  2861. mov ds, ax
  2862. mov word [__real_in], __real_sdef
  2863. mov word [__real_out], __real_pdef
  2864. (*%E *)
  2865. ret far 0
  2866. (****************************************************************************)
  2867. section
  2868. segment _TEXT(CODE,28H)
  2869. segment _DATA(DATA, 28H)
  2870. extrn DOSGETPID
  2871. select _TEXT
  2872. public _getpid :
  2873. (* struct _PIDINFO *)
  2874. pid = 0
  2875. tid = 2
  2876. pidParent = 6
  2877. PidInfoSize = 6
  2878. pidbuf = -PidInfoSize
  2879. locals = PidInfoSize
  2880. push bp
  2881. mov bp, sp
  2882. sub sp, locals
  2883. push ss
  2884. lea ax, [bp][pidbuf]
  2885. push ax
  2886. call far DOSGETPID
  2887. mov ax, [bp][pidbuf][pid]
  2888. mov sp, bp
  2889. pop bp
  2890. (*%F NearCall *)
  2891. ret far 0
  2892. (*%E *)
  2893. (*%T NearCall *)
  2894. ret 0
  2895. (*%E *)
  2896. (*%E *) (* OS2 *)
  2897. section
  2898. (*%F _OS2 *)
  2899. (*%F _WINDOWS *)
  2900. (***********************************************************************)
  2901. (* $SWInt - Generate a SoftWare Interrupt *)
  2902. (* *)
  2903. (* DOS Memory Models *)
  2904. (* *)
  2905. (* Internal Procedure - Near Call *)
  2906. (* Parameters: *)
  2907. (* All Registers set up *)
  2908. (* Interrupt number on stack *)
  2909. (* Return: *)
  2910. (* All Registers set up *)
  2911. (* *)
  2912. (***********************************************************************)
  2913. segment _TEXT(CODE,48H)
  2914. IntNo = frame + 2
  2915. Flags = 2
  2916. public $SWInt :
  2917. pushf
  2918. push bp
  2919. mov bp, sp
  2920. push ax
  2921. mov ax, [bp][IntNo]
  2922. cli
  2923. mov cs:[$$InterruptNo], al
  2924. mov cs:[$$InterruptNo2], al
  2925. db 0EAH (*I far jmp *)
  2926. dw $$Next,_TEXT (* purge pre-fetch *)
  2927. $$Next:
  2928. cmp al, 25H
  2929. je $$Int2526
  2930. cmp al, 26H
  2931. je $$Int2526
  2932. pop ax
  2933. pop bp
  2934. db 0CDH (*I int *)
  2935. $$InterruptNo:
  2936. db 0
  2937. $$IntDone:
  2938. push bp
  2939. mov bp, sp
  2940. push ax
  2941. lahf
  2942. mov [bp][Flags], ah
  2943. pop ax
  2944. pop bp
  2945. popf
  2946. (*%T _fcall *)
  2947. ret far 2
  2948. (*%E *)
  2949. (*%F _fcall *)
  2950. ret 2
  2951. (*%E *)
  2952. $$Int2526:
  2953. pop ax
  2954. pop bp
  2955. db 0CDH (*I int *)
  2956. $$InterruptNo2:
  2957. db 0
  2958. inc sp
  2959. inc sp
  2960. jmp $$IntDone
  2961. (*%E _WINDOWS *)
  2962. (*%E _OS2 *)
  2963. section
  2964. (*%T _WINDOWS *)
  2965. (***********************************************************************)
  2966. (* $SWInt - Generate a SoftWare Interrupt *)
  2967. (* *)
  2968. (* Windows Memory Models *)
  2969. (* *)
  2970. (* Internal Procedure - Near Call *)
  2971. (* Parameters: *)
  2972. (* All Registers set up *)
  2973. (* Interrupt number on stack *)
  2974. (* Return: *)
  2975. (* All Registers set up *)
  2976. (* *)
  2977. (***********************************************************************)
  2978. segment _TEXT(CODE,48H)
  2979. extrn ALLOCCSTODSALIAS
  2980. extrn FREESELECTOR
  2981. IntNo = frame + 2
  2982. Flags = 2
  2983. public $SWInt :
  2984. pushf
  2985. push bp
  2986. mov bp, sp
  2987. push ax
  2988. push ds
  2989. push cs
  2990. call far ALLOCCSTODSALIAS
  2991. mov ds, ax
  2992. mov ax, [bp][IntNo]
  2993. cli
  2994. mov [$$InterruptNo], al
  2995. mov [$$InterruptNo2], al
  2996. (* call far $ClearPipe *)
  2997. mov ax, ds
  2998. pop ds
  2999. push ax
  3000. call far FREESELECTOR
  3001. mov ax, [bp][IntNo]
  3002. cmp al, 25H
  3003. je $$Dos2526
  3004. cmp al, 26H
  3005. je $$Dos2526
  3006. pop ax
  3007. pop bp
  3008. db 0CDH (*I int *)
  3009. $$InterruptNo:
  3010. db 0
  3011. $$IntDone:
  3012. push bp
  3013. mov bp, sp
  3014. push ax
  3015. lahf
  3016. mov [bp][Flags], ah
  3017. pop ax
  3018. pop bp
  3019. popf
  3020. (*%T _fcall *)
  3021. ret far 2
  3022. (*%E *)
  3023. (*%F _fcall *)
  3024. ret 2
  3025. (*%E *)
  3026. $$Dos2526:
  3027. pop ax
  3028. pop bp
  3029. db 0CDH (*I int *)
  3030. $$InterruptNo2:
  3031. db 0
  3032. inc sp
  3033. inc sp
  3034. jmp $$IntDone
  3035. (*%E _WINDOWS *)
  3036. end
  3037.