| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447 |
- (* Release 3.10 *)
- (*-------------------------------------------------------------------------*
- * *
- * COREMAIN.A - process startup and exit, args, environment *
- * *
- * COPYRIGHT (C) 1989..1992 Clarion Software Corporation. *
- * All Rights Reserved *
- * *
- *--------------------------------------------------------------------------*)
- include "corelib.inc"
- module CoreMain
- (****************************************************************************)
- segment _BSS(BSS, 28H)
- public __argbuf : org 192 (* command line buffer *)
- public __hugeshift : org 2
- public __osmajor : org 2
- public __osminor : org 2 (* DOS version *)
- public __exit_stk : org 32*CodePtrSize(* at/onexit function stack *)
- segment _DATA(DATA, 28H)
- public @InitCalled : dw 0
- public @InitGrandTotal : dw 0
- public @InitCurrent : dw 0
- public @InitRecPointer : dw 0, 0
- public @InitPointer : dw 0, 0
- public @StackContextSP : dw 0
- public @StackContextBP : dw 0
- public @InitDone : db 0
- (*%T MThread *)
- public @StackContextSS : dw 0
- (*%E *)
- public @InitPriority : db 0
- segment _BSS(BSS, 28H)
- public @ExitCode : org 2
- segment _BSS(BSS, 28H)
- public __exit_list_done : org 1
- segment _DATA(DATA, 28H)
- (*%T NearPtr *)
- public __exit_ptr : dw __exit_stk + (32*CodePtrSize)
- public __exit_top : dw __exit_stk + (32*CodePtrSize)
- (*%E *)
- (*%F NearPtr *)
- public __exit_ptr : dd __exit_stk + (32*CodePtrSize)
- public __exit_top : dd __exit_stk + (32*CodePtrSize)
- (*%E *)
- segment _BSS(BSS, 28H)
- public __exit_io : org CodePtrSize
- public __exit_file : org CodePtrSize
- public __exit_tmp: org CodePtrSize
- public __exit_proc : org FarCodePtrSize
- segment _BSS(BSS, 28H)
- public __real_in : org NearCodePtrSize
- public __real_out : org NearCodePtrSize
- segment _DATA(DATA, 28H)
- extrn __Term2
- (*%F NearCall *)
- public standard@haltChain : dd __Term2
- (*%T _DLLOVL *)
- extrn __Term3
- public standard@@haltChain2 : dd __Term3
- (*%E *)
- (*%E *)
- (*%T NearCall *)
- public standard@haltChain : dw __Term2
- (*%E *)
- segment _DATA(DATA, 28H)
- public __CmdLine : dd 0
- public __iHandle : dw 0
- segment _DATA(DATA, 28H)
- public __farstack : dw 0
- public __sp_temp : dw 0
- public __ss_temp : dw 0
- (*%F _OS2 *)
- (*%F _WINDOWS *)
- segment _DATA(DATA, 28H)
- public DOSHUGESHIFT = 12
- (*%E *)
- (*%E *)
- segment _DATA(DATA, 28H)
- public _x_initx : dw 0,0
- public _x_bss_end : dw 0
- public _x_bss_start : dw 0
- segment _BSS(BSS, 28H)
- public __sigsetup : org 2
- public __exitbreak : org 4
- public __exitsig : org CodePtrSize
- public __exitgraph : org CodePtrSize
- segment _DATA(DATA, 28H)
- public __psp : dw 0
- public __env : dw 0
- public __heap_base : dw 0
- public __main_args : dw 0
- public __env_init : dw 0
- public __arg_init : dw 0
- public STKHQQ :
- public __stklen : dw 0
- public __SSisDS : dw 0
- public __far_ss : dw 0
- public __x_near_stack_start : dw 0
- public __heap_size : dw 0
- public __osmode : dw 0
- segment _DATA(DATA, 28H)
- public __x_ax : dw 0
- public __x_bx : dw 0
- public __x_di : dw 0
- segment _DATA(DATA, 28H)
- public _x_main : dw 0,0
- public __stk_base : dw 0
- segment _BSS(BSS, 28H)
- public __nmemsetup : org 1 (* BOOLEAN flag indicating near heap *)
- (* has been initialised *)
- segment _BSS(BSS, 28H)
- public __fmodmemsetup : org 1 (* BOOLEAN flag indicating M2 far heap *)
- (* has been initialised *)
- segment _BSS(BSS, 28H)
- public __fmemsetup : org 1 (* BOOLEAN flag indicating far heap *)
- (* has been initialised *)
- segment _DATA(DATA, 28H)
- (*%F _ENV *)
- (*%T _DLLOVL *)
- extrn Loader$GrowHeap
- extrn Loader$ShrinkHeap
- public __res_mem : dd Loader$GrowHeap
- public __fix_mem : dd 0
- public __shr_mem : dd Loader$ShrinkHeap
- (*%E *)
- (*%F _DLLOVL *)
- public __res_mem : org CodePtrSize
- public __fix_mem : org CodePtrSize
- public __shr_mem : org CodePtrSize
- (*%E *)
- (*%E *)
- (*%T _ENV*)
- public __res_mem : org CodePtrSize
- public __fix_mem : org CodePtrSize
- public __shr_mem : org CodePtrSize
- (*%E *)
- (* procedure variable - points to *)
- (* routine to shrink heap *)
- (****************************************************************************)
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- extrn @RecursiveExit
- extrn __exit
- extrn __exit_io
- extrn __exit_file
- extrn __exit_tmp
- extrn __exit_proc
- extrn __InitReset
- extrn @InitPointer
- extrn @InitRecPointer
- extrn @ExitCode
- extrn @StackContextSP
- extrn @StackContextBP
- extrn @StackContextSS
- extrn @InitCurrent
- extrn @InitGrandTotal
- extrn @InitCalled
- extrn @InitPriority
- extrn @InitDone
- extrn $Stage2
- retCode : dw 0
- select _TEXT
- (*%F _WINDLL *)
- public _exit :
- (*%F RegParam *)
- code = bxframe
- mov bx, sp
- mov ax, ss:[bx][code]
- (*%E *)
- (*%F SameDS *)
- mov bx, _DATA
- mov ds, bx
- (*%E *)
- mov [@ExitCode], ax
- cmp byte [@RecursiveExit], 0
- je notAgain
- (*%F RegParam *)
- push ax
- (*%E *)
- (*%F NearCall *)
- call far __exit
- (*%E *)
- (*%T NearCall *)
- call __exit
- (*%E *)
- notAgain:
- not byte [@RecursiveExit]
- (*%T MThread *)
- mov ss, [@StackContextSS]
- (*%E *)
- mov sp, [@StackContextSP]
- mov bp, [@StackContextBP]
- jmp near $TerminateProcess
- (*%E *)
- public __InitLoop :
- (*%T _WINDOWS *)
- (*%F NearCall *)
- inc bp
- push bp
- mov bp, sp
- (*%E *)
- (*%E *)
- (*%T _DLLOVL *)
- push bp
- mov bp, sp
- (*%E *)
- push di
- push si
- (*%F SameDS *)
- push ds
- mov ax, _DATA
- mov ds, ax
- (*%E *)
- chainLoop:
- traverseLoop:
- les bx, [@InitRecPointer]
- mov ax, [@InitCurrent]
- cmp ax, es:[bx][InitRecTotal]
- je endOfArray
- les di, [@InitPointer]
- add word [@InitPointer], InitRecSize
- inc word [@InitCurrent]
- mov al, [@InitPriority]
- cmp al, es:[di][Priority]
- jne traverseLoop
- inc word [@InitCalled]
- (*%F NearCall *)
- call far es:[di][ProcVar]
- cmp byte [@InitDone],0
- jz traverseLoop
- initLoopRet:
- (*%F SameDS *)
- pop ds
- (*%E *)
- pop si
- pop di
- (*%T _DLLOVL *)
- pop bp
- (*%E *)
- (*%T _WINDOWS *)
- pop bp
- dec bp
- (*%E *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- call es:[di][ProcVar]
- cmp byte [@InitDone],0
- jz traverseLoop
- initLoopRet:
- (*%F SameDS *)
- pop ds
- (*%E *)
- pop si
- pop di
- ret 0
- (*%E *)
- endOfArray:
- mov ax, [@InitCalled]
- cmp ax, [@InitGrandTotal]
- je stageComplete
- les bx, [@InitRecPointer]
- les bx, es:[bx][InitRecNext]
- mov ax, es
- or ax, bx
- jz endOfList
- mov [@InitRecPointer], bx
- mov [@InitRecPointer][2], es
- sub ax, ax
- mov [@InitCurrent], ax
- mov [@InitPointer], ax
- mov ax, es:[bx][InitRecSeg]
- mov [@InitPointer][2], ax
- jmp traverseLoop
- endOfList:
- dec byte [@InitPriority]
- js stageComplete
- call __InitReset
- jmp chainLoop
- stageComplete:
- mov byte [@InitDone],1
- (*%T MThread *)
- mov [@StackContextSS], ss
- (*%E *)
- mov [@StackContextBP], bp
- mov [@StackContextSP], sp
- (*%F NearCall *)
- call far $Stage2
- (*%E *)
- (*%T NearCall *)
- call $Stage2
- (*%E *)
- mov [@ExitCode], ax
- $TerminateProcess:
- (*%T _WINDLL *)
- jmp initLoopRet
- (*%E *)
- public __Term2 :
- (*%F SameDS *)
- mov bx, _DATA
- mov ds, bx
- (*%E *)
- extrn __exit_ptr
- extrn __exit_top
- extrn standard@haltChain
- (*%T _DLLOVL *)
- extrn standard@@haltChain2
- push [standard@@haltChain2][2]
- push [standard@@haltChain2][0]
- (*%E *)
- (*%F _DLLOVL *)
- (*%F NearCall *)
- push cs
- (*%E *)
- mov bx, __Term3
- push bx
- (*%E *)
- (*%F NearCall *)
- push [standard@haltChain][2]
- (*%E *)
- push [standard@haltChain][0]
- (* reset halt chain to allow it to be re-used in termination code *)
- (*%T _DLLOVL *)
- push [standard@@haltChain2][0]
- pop [standard@haltChain][0]
- push [standard@@haltChain2][2]
- pop [standard@haltChain][2]
- (*%E *)
- (*%F _DLLOVL *)
- mov word [standard@haltChain][0],__Term3
- (*%F NearCall *)
- mov [standard@haltChain][2],cs
- (*%E *)
- (*%E *)
- (*%F NearCall *)
- ret far 0 (* jump to termination procedures *)
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- public __Term3:
- (*%F _WINDOWS *)
- mov bx, _DATA
- mov ds, bx
- (*%E *)
- (*%T MThread *)
- mov ss, [@StackContextSS]
- (*%E *)
- mov bp, [@StackContextBP]
- mov sp, [@StackContextSP]
- mov si, [__exit_ptr]
- mov di, [__exit_top]
- exitLoop:
- cmp si, di
- je loopDone
- (*%T NearCall *)
- call [si]
- add si, 2
- (*%E *)
- (*%F NearCall *)
- call far [si]
- add si, 4
- (*%E *)
- (*%F SameDS *)
- mov bx, _DATA
- mov ds, bx
- (*%E *)
- jmp exitLoop
- loopDone:
- jmp initLoopRet
- public __cleanup :
- (*%F SameDS *)
- mov cx, _DATA
- mov ds, cx
- (*%E *)
- mov cx, [__exit_io]
- jcxz noCall1
- (*%F SameDS *)
- push ds
- (*%E *)
- (*%F NearCall *)
- call far [__exit_io]
- (*%E *)
- (*%T NearCall *)
- call cx
- (*%E *)
- (*%F SameDS *)
- pop ds
- (*%E *)
- noCall1:
- mov cx, [__exit_file]
- jcxz noCall2
- (*%F SameDS *)
- push ds
- (*%E *)
- (*%F NearCall *)
- call far [__exit_file]
- (*%E *)
- (*%T NearCall *)
- call cx
- (*%E *)
- (*%F SameDS *)
- pop ds
- (*%E *)
- noCall2:
- mov cx, [__exit_tmp]
- jcxz noCall3
- (*%F SameDS *)
- push ds
- (*%E *)
- (*%F NearCall *)
- call far [__exit_tmp]
- (*%E *)
- (*%T NearCall *)
- call cx
- (*%E *)
- (*%F SameDS *)
- pop ds
- (*%E *)
- noCall3:
- mov cx, [__exit_proc]
- jcxz noCall4
- (*%F SameDS *)
- push ds
- (*%E *)
- call far [__exit_proc]
- (*%F SameDS *)
- pop ds
- (*%E *)
- noCall4:
- ret 0
- (******************************************************************************)
- section
- segment _DATA(DATA, 28H)
- segment _TEXT(CODE,28H)
- select _TEXT
- extrn __env_init
- extrn _malloc
- extrn __env
- extrn __env_var
- extrn __env_copy
- extrn __FatalErrorPos
- extrn __FatalError
- public __setenv :
- n = -2
- p = -4
- c = -6
- eptr = -10
- current = -14
- dgroup = -16
- locals = 16
- push bp
- mov bp, sp
- sub sp, locals
- push di
- push si
- push ds
- mov [bp][dgroup], ds
- cmp byte [__env_init], 0
- jne near setDone
- not byte [__env_init]
- memSet:
- sub dx, dx
- mov [bp][n], dx
- mov ax, [__env]
- mov [bp][eptr][2], ax
- mov word [bp][eptr], 0
- Loop1:
- cmp dx, 63
- jge Loop1Done
- sub cx, cx
- lds si, [bp][eptr]
- Loop2:
- cmp cx, 1024
- jge Loop2Done
- lodsb
- or al, al
- jz Loop2Done
- inc cx
- jmp Loop2
- Loop2Done:
- jcxz Loop1Done
- inc cx
- mov ax, cx
- mov [bp][p], cx
- mov [bp][n], dx
- mov ds, [bp][dgroup]
- (*%F RegParam *)
- push ax
- (*%E *)
- (*%F NearCall *)
- call far _malloc
- (*%E *)
- (*%T NearCall *)
- call _malloc
- (*%E *)
- (*%F RegParam *)
- add sp, 2
- (*%E *)
- mov [bp][current], ax
- (*%F NearPtr *)
- mov [bp][current][2], dx
- or dx, dx
- (*%E *)
- (*%T NearPtr *)
- (*%F _WINDOWS *)
- mov word [bp][current][2], _DATA
- (*%E *)
- (*%T _WINDOWS *)
- mov word [bp][current][2], ss
- (*%E *)
- or ax, ax
- (*%E *)
- jz InternalError
- mov di, [bp][current]
- mov es, [bp][current][2]
- mov si, [bp][eptr]
- mov ax, [bp][eptr][2]
- mov cx, [bp][p]
- call __env_copy
- mov bx, [bp][n]
- (*%F NearPtr *)
- mov cl, 2
- (*%E *)
- (*%T NearPtr *)
- mov cl, 1
- (*%E *)
- shl bx, cl
- mov ax, [bp][current]
- mov [bx][__env_var], ax
- (*%F NearPtr *)
- mov ax, [bp][current][2]
- mov [bx][__env_var][2], ax
- (*%E *)
- inc word [bp][n]
- mov dx, [bp][n]
- mov cx, [bp][p]
- add [bp][eptr], cx
- jmp Loop1
- Loop1Done:
- mov ds, [bp][dgroup]
- mov bx, [bp][n]
- (*%F NearPtr *)
- mov cl, 2
- (*%E *)
- (*%T NearPtr *)
- mov cl, 1
- (*%E *)
- shl bx, cl
- sub ax, ax
- mov [bx][__env_var], ax
- mov [bx][__env_var][2], ax
- setDone:
- pop ds
- pop si
- pop di
- mov sp, bp
- pop bp
- (*%F NearCall *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- InternalError:
- call far __FatalErrorPos
- mov cx, 60H
- push cx
- push dx
- push ax
- call far __FatalError
- (******************************************************************************)
- section
- extrn __env_var
- extrn __core_lock
- extrn __core_unlock
- extrn $StdRet
- segment _TEXT(CODE,00028H)
- nicmp :
- (*%T NearPtr *)
- RetSize = 0
- (*%E *)
- (*%F NearPtr *)
- RetSize = 2
- (*%E *)
- (*%F NearPtr *)
- num = sframe
- (*%E *)
- (*%F NearPtr *)
- push bp
- mov bp, sp
- (*%E *)
- (*%T NearPtr *)
- push dx
- (*%E *)
- push di
- push si
- (*%F NearPtr *)
- push ds
- mov ds, bx
- mov si, ax
- mov di, cx
- mov es, dx
- mov cx, [bp][num]
- (*%E *)
- (*%T NearPtr *)
- mov si, ax
- mov di, bx
- push ds
- pop es
- (*%E *)
- sub ax, ax
- jcxz nicmpDone
- nicmpLoop:
- lodsb
- cmp al, 'z' (* convert to upper if lower *)
- ja notlowa
- cmp al, 'a'
- jb notlowa
- sub al, 20H
- notlowa:
- mov bl, es:[di]
- inc di (* convert to upper if lower *)
- cmp bl, 'z'
- ja notlowb
- cmp bl, 'a'
- jb notlowb
- sub bl, 20H
- notlowb:
- cmp al, bl
- jl nicmpLessThan
- jg nicmpGreaterThan
- or al, al
- loopne nicmpLoop
- nicmpSame:
- sub ax, ax (* return 0 *)
- jmp nicmpDone
- nicmpLessThan:
- mov ax, -1 (* return -1 *)
- jmp nicmpDone
- nicmpGreaterThan:
- mov ax, 1 (* return 1 *)
- nicmpDone:
- (*%F NearPtr *)
- pop ds
- (*%E *)
- pop si
- pop di
- (*%T NearPtr *)
- pop dx
- (*%E *)
- (*%F NearPtr *)
- pop bp
- (*%E *)
- ret RetSize
- public _getenv :
- (*%F RegParam *)
- str = frame
- (*%E *)
- (*%T RegParam *)
- (*%T NearPtr *)
- str = - 2
- (*%E *)
- (*%F NearPtr *)
- str = - 4
- (*%E *)
- (*%E *)
- (*%T NearPtr *)
- push bp
- mov bp,sp
- sub sp, 2
- push di
- push si
- (*%T RegParam *)
- push dx
- push cx
- push bx
- mov [bp][str],ax
- (*%E *)
- (*%F RegParam *)
- mov ax, [bp][str]
- (*%E *)
- push ds
- pop es
- mov di, ax
- mov cx, 0FFFFH
- sub al, al
- repne ; scasb (* get length of string *)
- not cx
- dec cx
- mov di,cx
- xor dx,dx
- $0:
- mov bx,dx
- add bx,dx
- mov si,[bx][__env_var]
- test si,si
- je $2
- mov cx,di
- mov bx,si
- mov ax,[bp][str]
- call nicmp
- test ax,ax
- je $3
- $1:
- inc dx
- cmp dx,3FH
- jl $0
- $2:
- xor ax,ax
- jmp $4
- $3:
- mov bx,di
- add bx,si
- cmp byte [bx],3DH
- jne $1
- inc bx
- mov ax,bx
- $4:
- (*%T RegParam *)
- pop bx
- pop cx
- pop dx
- (*%E *)
- pop si
- pop di
- mov sp, bp
- pop bp
- (*%F NearCall *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- (*%E *)
- (*%F NearPtr *)
- push bp
- mov bp,sp
- sub sp,0AH
- push ds
- push di
- push si
- (*%T MThread *)
- mov di, seg __core_lock
- mov es, di
- call far es:[__core_lock]
- (*%E *)
- (*%T RegParam *)
- push cx
- mov [bp][str],ax
- mov [bp][str][2],bx
- (*%E *)
- (*%F RegParam *)
- mov ax, [bp][str]
- mov bx, [bp][str][2]
- (*%E *)
- mov di,ax
- mov es,bx
- mov cx,-1
- sub al,al
- repne ;scasb
- not cx
- mov ax,cx
- dec ax
- mov di,ax
- xor si,si
- mov ax,seg __env_var
- mov [bp][-6],ax
- $0:
- mov bx,si
- shl bx,1
- shl bx,1
- mov ds,[bp][-6]
- lds cx,[bx][__env_var]
- mov [bp][-0AH],cx
- mov ax,ds
- or ax,cx
- je $2
- push di
- mov dx,ds
- mov ax,[bp][str]
- mov bx,[bp][str][2]
- call nicmp
- test ax,ax
- je $3
- $1:
- inc si
- cmp si,3FH
- jl $0
- $2:
- xor ax,ax
- xor dx,dx
- jmp $4
- $3:
- mov bx,[bp][-0AH]
- cmp byte [bx][di],3DH
- jne $1
- lea ax,[bx][di][1]
- mov dx,ds
- $4:
- (*%T RegParam *)
- pop cx
- (*%E *)
- (*%T MThread *)
- mov di, seg __core_unlock
- mov es, di
- call far es:[__core_unlock]
- (*%E *)
- pop si
- pop di
- pop ds
- mov sp,bp
- pop bp
- (*%F NearCall *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- (*%E *)
- (****************************************************************************)
- (*%T _OS2 *)
- section
- segment _DATA(DATA, 28H)
- segment _TEXT(CODE,28H)
- extrn __exit_ptr
- extrn __exit_top
- extrn __exit_io
- extrn __exit_file
- extrn __exit_tmp
- extrn __exit_proc
- extrn __exit_list_done
- extrn __x_near_stack_start
- extrn __farstack
- extrn standard@haltChain
- extrn DOSEXITLIST
- extrn __do_exit_lists
- exit_handler:
- mov bx, _DATA
- mov ds, bx
- cmp byte [__exit_list_done], 0
- jnz noCall4
- cmp word [__farstack], 0
- jnz notNear
- mov sp, [__x_near_stack_start]
- mov ss, bx
- notNear:
- (*%F NearCall *)
- push [standard@haltChain][2]
- (*%E *)
- push [standard@haltChain][0]
- (* reset halt chain to allow it to be re-used in termination code *)
- mov word [standard@haltChain][0],here
- (*%F NearCall *)
- mov [standard@haltChain][2],cs
- (*%E *)
- (*%F NearCall *)
- ret far 0 (* jump to termination procedures *)
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- here:
- mov bx, _DATA
- mov ds, bx
- mov si, [__exit_ptr]
- mov di, [__exit_top]
- exitLoop:
- cmp si, di
- je loopDone
- (*%T NearCall *)
- call [si]
- add si, 2
- (*%E *)
- (*%F NearCall *)
- call far [si]
- add si, 4
- (*%E *)
- (*%F SameDS *)
- mov bx, _DATA
- mov ds, bx
- (*%E *)
- jmp exitLoop
- loopDone:
- noCall4:
- mov ax, EXLST_EXIT
- push ax
- sub ax, ax
- push ax
- push ax
- call far DOSEXITLIST
- public __set_exit_handler :
- mov ax, EXLST_ADD
- push ax
- push cs
- mov ax, exit_handler
- push ax
- call far DOSEXITLIST
- ret far 0
- (*%E *)
- section
- (****************************************************************************)
- (*%T _WINDLL *)
- segment _DATA(DATA,28H)
- segment _TEXT(CODE,28H)
- extrn __exit_io
- extrn __exit_file
- extrn __exit_tmp
- extrn __exit_proc
- extrn __exit_ptr
- extrn __exit_top
- extrn standard@haltChain
- public _exit :
- (*%F NearCall *)
- push [standard@haltChain][2]
- (*%E *)
- push [standard@haltChain][0]
- (* reset halt chain to allow it to be re-used in termination code *)
- mov word [standard@haltChain][0],here
- (*%F NearCall *)
- mov [standard@haltChain][2],cs
- (*%E *)
- (*%F NearCall *)
- ret far 0 (* jump to termination procedures *)
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- here:
- mov bx, _DATA
- mov ds, bx
- mov si, [__exit_ptr]
- mov di, [__exit_top]
- exitLoop:
- cmp si, di
- je loopDone
- (*%T NearCall *)
- call [si]
- add si, 2
- (*%E *)
- (*%F NearCall *)
- call far [si]
- add si, 4
- (*%E *)
- (*%F SameDS *)
- mov ds, bx
- (*%E *)
- jmp exitLoop
- loopDone:
- mov cx, [__exit_io]
- jcxz noCall1
- (*%F NearCall *)
- call far [__exit_io]
- (*%E *)
- (*%T NearCall *)
- call cx
- (*%E *)
- noCall1:
- mov cx, [__exit_file]
- jcxz noCall2
- (*%F NearCall *)
- call far [__exit_file]
- (*%E *)
- (*%T NearCall *)
- call cx
- (*%E *)
- noCall2:
- mov cx, [__exit_tmp]
- jcxz noCall3
- (*%F NearCall *)
- call far [__exit_tmp]
- (*%E *)
- (*%T NearCall *)
- call cx
- (*%E *)
- noCall3:
- (*%F NearCall *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- (*%E _WINDLL*)
- (****************************************************************************)
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA,28H)
- public @InitChain : dw 0, 0
- select _TEXT
- public __InitLink :
- (* Initializes @InitChain from record passed in ax:bx *)
- (*%F SameDS *)
- push ds
- mov cx, _DATA
- mov ds, cx (* ds = _DATA *)
- (*%E *)
- mov es, ax (* es = seg of record *)
- mov ax, [@InitChain]
- mov es:[bx], ax (* @InitChain -> record passed in *)
- mov ax, [@InitChain][2]
- mov es:[bx][2], ax
- mov [@InitChain], bx
- mov [@InitChain][2], es
- (*%F SameDS *)
- pop ds
- (*%E *)
- ret far 0
- (****************************************************************************)
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA,28H)
- segment _INIT(INIT_CODE,28H)
- select _DATA
- extrn @InitCalled
- extrn @InitPriority
- extrn @InitCurrent
- extrn @InitPointer
- extrn @InitRecPointer
- extrn @InitGrandTotal
- extrn @InitChain
- extrn __osmode
- select _TEXT
- public __InitReset :
- les bx, [@InitChain]
- sub cx, cx
- mov word [@InitCurrent], cx
- mov word [@InitPointer], cx
- mov ax, es:[bx][InitRecSeg]
- mov [@InitPointer][2], ax
- mov [@InitRecPointer], bx
- mov [@InitRecPointer][2], es
- ret 0
- public __InitSetup :
- Current = -4
- locals = 4
- push bp
- mov bp, sp
- sub sp, locals
- call __InitReset
- chainLoop:
- mov ax, es
- or ax, bx
- jz chainDone
- mov [bp][Current], bx
- mov [bp][Current][2], es
- mov es, es:[bx][InitRecSeg]
- cmp byte [__osmode], 1
- jnz realMode
- mov ax, es
- (* lsl cx, ax *)
- db 0FH, 3, 0C8H
- jcxz gotCount
- mov ax, cx
- mov cl, InitRecSize
- div cl
- sub ah, ah
- mov cx, ax
- jmp gotCount
- realMode:
- mov cx, -1
- mov di, -InitRecSize
- sizeLoop:
- add di, InitRecSize
- cmp word es:[di][Magic], MAGIC_NUM
- loope sizeLoop
- neg cx
- sub cx, 2
- gotCount:
- add [@InitGrandTotal], cx
- les bx, [bp][Current]
- mov es:[bx][InitRecTotal], cx
- les bx, es:[bx][InitRecNext]
- jmp chainLoop
- chainDone:
- mov word [@InitCalled], 0
- mov byte [@InitPriority], PRMAX
- mov sp, bp
- pop bp
- ret 0
- (***************************************************************************)
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- extrn _x_main
- extrn _main
- select _DATA
- extrn __argv
- extrn __argc
- select _TEXT
- public __main_args2 :
- (*%F RegParam *)
- (*%F NearPtr *)
- push ds (* char *argv[] *)
- (*%E *)
- mov ax, __argv
- push ax
- push [__argc] (* int argc *)
- (*%E *)
- (*%T RegParam *)
- (*%F NearPtr *)
- mov ax, [__argc] (* int argc *)
- mov bx, __argv (* char *argv[] *)
- mov cx, ds
- (*%E *)
- (*%T NearPtr *)
- mov ax, [__argc]
- mov bx, __argv
- (*%E *)
- (*%E *)
- (*%F NearCall *)
- call far [_x_main] (* call main *)
- (*%E *)
- (*%T NearCall *)
- call _main
- (*%E *)
- (*%F RegParam *)
- (*%F NearPtr *)
- add sp, 6
- (*%E *)
- (*%T NearPtr *)
- add sp, 4
- (*%E *)
- (*%E *)
- (*%F NearCall *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- extrn _x_main
- extrn _main
- select _DATA
- extrn __env_var
- extrn __argv
- extrn __argc
- select _TEXT
- public __main_args3 :
- (*%F RegParam *)
- (*%F NearPtr *) (* pass arguments to main *)
- push ds
- (*%E *)
- mov ax, __env_var
- push ax (* char *envp[] *)
- (*%F NearPtr *)
- push ds (* char *argv[] *)
- (*%E *)
- mov ax, __argv
- push ax
- push [__argc] (* int argc *)
- (*%E *)
- (*%T RegParam *)
- (*%F NearPtr *)
- mov ax, [__argc] (* int argc *)
- mov bx, __argv (* char *argv[] *)
- mov cx, ds
- push ds
- mov dx, __env_var
- push dx (* char *envp[] *)
- (*%E *)
- (*%T NearPtr *)
- mov ax, [__argc]
- mov bx, __argv
- mov cx, __env_var
- (*%E *)
- (*%E *)
- (*%F NearCall *)
- call far [_x_main] (* call main *)
- (*%E *)
- (*%T NearCall *)
- call _main
- (*%E *)
- (*%F RegParam *)
- (*%F NearPtr *)
- add sp, 10
- (*%E *)
- (*%T NearPtr *)
- add sp, 6
- (*%E *)
- (*%E *)
- (*%F NearCall *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- section
- (****************************************************************************)
- (*%T _WINDLL *)
- segment _TEXT(CODE,28H)
- extrn LIBMAIN
- extrn __heap_size
- extrn __CmdLine
- extrn __iHandle
- extrn __call_main
- public __libmain_args :
- push [__iHandle]
- push ds
- push [__heap_size]
- push [__CmdLine][2]
- push [__CmdLine]
- jmp __call_main
- (*%E *)
- section
- (****************************************************************************)
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- segment _BSS(BSS, 28H)
- select _BSS
- InitLim = 32
- buffer : org (DataPtrSize * InitLim) + 2
- select _TEXT
- extrn $initm
- DummyProc:
- (*%F near_init_code *)
- ret far 0
- (*%E *)
- (*%T near_init_code *)
- ret 0
- (*%E *)
- public _InitModules :
- (*%F _DLLOVL *)
- call Init
- (*%F NearCall *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- call Init
- (*%F NearCall *)
- ret far 2
- (*%E *)
- (*%T NearCall *)
- ret 2
- (*%E *)
- call Init
- (*%F NearCall *)
- ret far 4
- (*%E *)
- (*%T NearCall *)
- ret 4
- (*%E *)
- call Init
- (*%F NearCall *)
- ret far 6
- (*%E *)
- (*%T NearCall *)
- ret 6
- (*%E *)
- call Init
- (*%F NearCall *)
- ret far 8
- (*%E *)
- (*%T NearCall *)
- ret 8
- (*%E *)
- call Init
- (*%F NearCall *)
- ret far 0AH
- (*%E *)
- (*%T NearCall *)
- ret 0AH
- (*%E *)
- arg1 = frame+2
- (*%E *)
- (*%T _DLLOVL *)
- arg1 = frame
- (*%E *)
- base = -2
- StackPos = -4
- locals = 4
- Init:
- push bp
- mov bp, sp
- sub sp, locals
- (*%T RegParam *)
- push ax
- push bx
- push cx
- push dx
- (*%E *)
- push di
- push si
- push ds
- (*%F SameDS *)
- mov ax, _DATA
- mov ds, ax
- (*%E *)
- mov di, buffer
- push ds
- mov ax, ds
- mov es, ax
- mov ax, DummyProc
- stosw
- (*%F near_init_code *)
- mov ax, cs
- stosw
- (*%E *)
- lea si, [bp][arg1]
- mov cx, ss
- mov ds, cx
- mov cx, InitLim
- storeLoop:
- lodsw
- (*%T near_init_data *)
- or ax, ax
- (*%E *)
- (*%F near_init_data *)
- mov bx, ax
- or bx, ds:[si]
- (*%E *)
- jz terminator
- stosw
- (*%F NearPtr *)
- (*%F near_init_data *)
- movsw
- (*%E *)
- (*%T near_init_data *)
- add si, 2
- (*%E *)
- (*%E *)
- loop storeLoop
- terminator:
- mov ax, -1
- stosw
- pop ds
- extrn _x_main
- mov word [_x_main], buffer
- (*%F near_init_data *)
- mov [_x_main][2], es
- (*%E *)
- push bp
- (*%T _DLLOVL *)
- mov bp,sp
- call far $initm
- (*%E *)
- (*%F _DLLOVL *)
- (*%F near_init_code *)
- push cs
- (*%E *)
- call $initm
- (*%E *)
- pop bp
- noArgs:
- pop ds
- pop si
- pop di
- (*%T RegParam *)
- pop dx
- pop cx
- pop bx
- pop ax
- (*%E *)
- mov sp, bp
- pop bp
- (*%F _DLLOVL *)
- ret 0
- (*%E *)
- (*%T _DLLOVL *)
- ret far 0
- (*%E *)
- (***************************************************************************)
- section;
- segment PROC_TEXT(CODE,28H)
- extrn @MachineId
- public __set_machine_id :
- mov ax, 0F000H
- mov es, ax
- mov al, es:[0FFFEH]
- mov cs:[@MachineId], al
- ret far 0
- (*****************************************************************************)
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- select _TEXT
- public __env_copy :
- push ds
- mov ds, ax
- rep ; movsb
- pop ds
- ret 0
- (****************************************************************************)
- section
- segment _TEXT(CODE,28H)
- extrn __call_main
- public __init0 :
- jmp __call_main
- section
- segment _TEXT(CODE,28H)
- extrn __main_args2
- extrn __setargv
- public __init2 :
- call __setargv
- jmp __main_args2
- section
- segment _TEXT(CODE,28H)
- extrn __main_args3
- extrn __setenv
- extrn __setargv
- public __init3 :
- (*%F NearCall *)
- call far __setenv
- (*%E *)
- (*%T NearCall *)
- call __setenv
- (*%E *)
- call __setargv
- jmp __main_args3
- (***************************************************************************)
- (*%T _WINDLL *)
- section
- segment _TEXT(CODE,28H)
- extrn __libmain_args
- public __initWDLL :
- jmp __libmain_args
- (*%E *)
- (*%F _OS2 *)
- (***************************************************************************)
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- extrn __stklen
- extrn __nheaptop
- extrn __SSisDS
- extrn __far_ss
- select _TEXT
- (* ------------------------------------------------------------------------
- PROCEDURE - _getheapbase.
- PRECONDITIONS - __SSisDS, far_ss and __stklen initialised.
- POSTCONDITIONS - None.
- IN PARAMETERS - None.
- OUT PARAMETERS - Returns far pointer to far heap base.
- CALLING CONVENTION - Standard.
- NOTES - Does not cause far heap to be initialsised.
- VERSION - _OS2 and MSDOS.
- ------------------------------------------------------------------------ *)
- public __getheapbase :
- (*%T _DLLOVL *)
- push bp
- mov bp, sp
- (*%E *)
- (*%F NearPtr *)
- (*%F SameDS *)
- push ds
- mov ax, _DATA
- mov ds, ax
- (*%E *)
- sub ax, ax
- cmp byte [__SSisDS], 0
- jne nearStack
- add ax, [__stklen]
- add ax, 0FH
- shr ax, 1
- shr ax, 1
- shr ax, 1
- shr ax, 1
- nearStack:
- mov dx, [__far_ss]
- add dx, ax
- sub ax, ax
- (*%F SameDS *)
- pop ds
- (*%E *)
- (*%E *)
- (*%T NearPtr *)
- mov dx, [__far_ss]
- sub ax, ax
- (*%E *)
- (*%T _DLLOVL *)
- pop bp
- (*%E *)
- (*%F NearCall *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- (****************************************************************************)
- (*%F _WINDLL *)
- section
- segment _INIT(INIT_CODE,28H)
- segment _TEXT(CODE,28H)
- segment _DATA(DATA,28H)
- segment _BSS(BSS, 28H)
- extrn __setargv
- select _TEXT
- do_initargc : (* defined later on ! *)
- select _INIT
- (*%F NearCall *)
- initargc : dw MAGIC_NUM
- db PR4
- dd do_initargc
- (*%E *)
- (*%T NearCall *)
- initargc : dw MAGIC_NUM
- db PR4
- dw do_initargc
- (*%E *)
- select _BSS
- public __argv : org 32*DataPtrSize
- select _DATA
- public __argc : dw initargc
- select _TEXT
- (*%T _DLLOVL *)
- push bp
- mov bp, sp
- (*%E *)
- call __setargv
- (*%F NearCall *)
- (*%T _DLLOVL *)
- pop bp
- (*%E *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- (****************************************************************************)
- section
- segment _INIT(INIT_CODE,28H)
- segment _TEXT(CODE,28H)
- segment _DATA(DATA,28H)
- segment _BSS(BSS, 28H)
- extrn __setargv
- extrn __setenv
- select _TEXT
- do_initargce : (* defined later on ! *)
- select _INIT
- (*%F NearCall *)
- initargce : dw MAGIC_NUM
- db PR4
- dd do_initargce
- (*%E *)
- (*%T NearCall *)
- initargce : dw MAGIC_NUM
- db PR4
- dw do_initargce
- (*%E *)
- select _DATA
- public __env_var : dw initargce
- org ENVNUM*DataPtrSize-2
- select _TEXT
- (*%T _DLLOVL *)
- push bp
- mov bp, sp
- (*%E *)
- (*%F NearCall *)
- call far __setenv
- (*%E *)
- (*%T NearCall *)
- call __setenv
- (*%E *)
- call __setargv
- (*%F NearCall *)
- (*%T _DLLOVL *)
- pop bp
- (*%E *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- (*%E *)
- (****************************************************************************)
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- extrn __exit
- extrn __osmajor
- extrn __osminor
- select _TEXT
- (* void __osversion(void) - checks DOS version and terminates if v1.x. *)
- public __osversion :
- push ds
- mov ah, 30H
- int 21H
- or al, al
- je versionOne
- mov [__osmajor], al
- mov [__osminor], ah
- jmp versionDone
- versionOne:
- mov ax, cs
- mov ds, ax
- mov dx, message
- mov ah, 9
- int 21H
- pop ds
- (*%F NearCall *)
- call far __exit
- (*%E *)
- (*%T NearCall *)
- call __exit
- (*%E *)
- versionDone:
- pop ds
- ret 0
- message : db 'Error MSDOS V1$'
- (**************************************************************************)
- (*%F _WINDLL *)
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- select _DATA
- extrn __osmajor
- extrn __argv
- extrn __argbuf
- extrn __argc
- extrn __psp
- extrn __arg_init
- select _TEXT
- public __setargv :
- push di
- push si
- push ds
- cmp byte [__arg_init], 0
- jne near initDone
- not byte [__arg_init]
- mov di, __argbuf
- cmp word [__osmajor], 2 (* process command line *)
- je noExecName
- mov es, [__psp]
- mov es, es:[2CH]
- sub di, di
- sub ax, ax
- mov cx, -1
- execLoop: (* get address of command *)
- scasw
- je execFound
- dec di
- loop execLoop
- (*%F NearPtr *)
- execFound:
- add di, 2
- mov [__argv], di
- mov [__argv][2], es
- jmp argv1
- noExecName: (* version 2 - argv[0]=NULL *)
- mov word [__argv], 0
- mov word [__argv][2], 0
- argv1:
- mov bx, 4 (* move arguments to buffer *)
- mov es, [__psp]
- mov di, 81H
- mov si, __argbuf
- mov cl, es:[di][-1]
- sub ch, ch
- argLoop:
- mov al, ' '
- repe ; scasb
- je endofLine
- dec di
- inc cx
- mov [__argv][bx], si
- mov [__argv][bx][2], ds
- xchg di, si
- push es
- push ds
- pop es
- pop ds
- add bx, 4
- mov dl, ' '
- mov dh, 0
- moveLoop:
- lodsb
- cmp al, dl
- jne notSpace
- cmp dh, 1
- jz endString
- endStringRet:
- sub al, al
- stosb
- xchg di, si
- push es
- push ds
- pop es
- pop ds
- loop argLoop
- jmp endofLine
- notSpace:
- cmp al, '"'
- je startString
- stosb
- startStringRet:
- loop moveLoop
- sub al, al
- stosb
- endofLine:
- shr bx, 1
- shr bx, 1
- (*%E *)
- (*%T NearPtr *)
- execFound:
- mov ax, es
- mov ds, ax (* ds:si = name *)
- (*%T _WINDOWS *)
- mov ax, ss
- (*%E *)
- (*%F _WINDOWS *)
- mov ax, _DATA
- (*%E *)
- mov es, ax
- add di, 2
- mov si, di
- mov di, __argbuf (* es:di = buffer *)
- mov es:[__argv], di
- nLoop:
- lodsb
- stosb
- or al, al
- jz argv1
- jmp nLoop
- noExecName: (* version 2 - argv[0]=NULL *)
- mov word [__argv], 0
- argv1:
- mov bx, 2 (* move arguments to buffer *)
- (*%T _WINDOWS *)
- mov ax, ss
- (*%E *)
- (*%F _WINDOWS *)
- mov ax, _DATA
- (*%E *)
- mov ds, ax
- mov es, [__psp]
- mov si, di
- mov di, 81H
- mov cl, es:[di][-1]
- sub ch, ch
- argLoop:
- mov al, ' '
- repe ; scasb
- je endofLine
- dec di
- inc cx
- mov [__argv][bx], si
- xchg di, si
- push es
- push ds
- pop es
- pop ds
- add bx, 2
- mov dl, ' '
- mov dh, 0
- moveLoop:
- lodsb
- cmp al, dl
- jne notSpace
- cmp dh, 1
- jz endString
- endStringRet:
- sub al, al
- stosb
- xchg di, si
- push es
- push ds
- pop es
- pop ds
- loop argLoop
- jmp endofLine
- notSpace:
- cmp al, '"'
- je startString
- stosb
- startStringRet:
- loop moveLoop
- sub al, al
- stosb
- endofLine:
- shr bx, 1
- (*%E *)
- (*%T _WINDOWS *)
- mov ax, ss
- (*%E *)
- (*%F _WINDOWS *)
- mov ax, _DATA
- (*%E *)
- mov ds, ax
- mov [__argc], bx
- initDone:
- pop ds
- pop si
- pop di
- ret 0
- startString:
- mov dh, 1
- mov dl, '"'
- jmp startStringRet
- endString:
- mov dh, 0
- mov dl, ' '
- jmp endStringRet
- (*%E *)
- (****************************************************************************)
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- select _DATA
- extrn __sigsetup
- extrn __exitbreak
- extrn __exitsig
- extrn __exitgraph
- select _TEXT
- public __exit :
- (*
- void __exit(int code)
- terminates process.
- *)
- code = frame
- push bp
- mov bp, sp
- (*%T RegParam *)
- mov di, ax
- (*%E *)
- (*%F SameDS *)
- mov ax, _DATA
- mov ds, ax
- (*%E *)
- (*%F _WINDOWS *)
- mov cx, [__exitbreak]
- jcxz noBreak
- call far [__exitbreak]
- noBreak:
- mov cx, [__exitsig]
- jcxz noSig
- (*%F NearCall *)
- call far [__exitsig]
- (*%E *)
- (*%T NearCall *)
- call cx
- (*%E *)
- noSig:
- mov cx, [__exitgraph]
- jcxz noGraph
- (*%F NearCall *)
- call far [__exitgraph]
- (*%E *)
- (*%T NearCall *)
- call cx
- (*%E *)
- noGraph:
- (*%E *)
- extrn __FloatFinish
- call far __FloatFinish
- (*%F RegParam *)
- mov al, [bp][code]
- (*%E *)
- (*%T RegParam *)
- mov ax, di
- (*%E *)
- (*%T _DLLOVL *)
- extrn Loader$Terminate
- call far Loader$Terminate
- (*%E *)
- mov ah, 4CH
- int 21H
- db 'TopSpeed RTL (C) Clarion Software Corporation 1989-1992'
- (****************************************************************************)
- section
- segment _DATA(DATA, 28H)
- segment _TEXT(CODE,28H)
- extrn __exit_proc
- extrn __exitbreak
- extrn __exitsig
- extrn __exitgraph
- extrn __FloatFinish
- public __term_process :
- (*%T _DLLOVL *)
- push bp
- mov bp, sp
- (*%E *)
- mov cx, [__exit_proc]
- jcxz noCall4
- (*%F SameDS *)
- push ds
- (*%E *)
- call far [__exit_proc]
- (*%F SameDS *)
- pop ds
- (*%E *)
- noCall4:
- mov cx, [__exitbreak]
- jcxz noBreak
- call far [__exitbreak]
- noBreak:
- mov cx, [__exitsig][2]
- jcxz noSig
- (*%F NearCall *)
- call far [__exitsig]
- (*%E *)
- (*%T NearCall *)
- call cx
- (*%E *)
- noSig:
- mov cx, [__exitgraph]
- jcxz noGraph
- (*%F NearCall *)
- call far [__exitgraph]
- (*%E *)
- (*%T NearCall *)
- call cx
- (*%E *)
- noGraph:
- call far __FloatFinish
- (*%T _DLLOVL *)
- pop bp
- (*%E *)
- (*%F NearCall *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- (****************************************************************************)
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- select _DATA
- message : db 'Floating Point Not Loaded$'
- select _TEXT
- public __real_pdef :
- public __real_sdef :
- (*%F SameDS *)
- push ds
- mov ax, _DATA
- mov ds, ax
- (*%E *)
- mov dx, message
- mov ah, 9
- extrn @DosInterrupt
- (*%F NearCall *)
- call far @DosInterrupt
- (*%E *)
- (*%T NearCall *)
- call @DosInterrupt
- (*%E *)
- (*%F SameDS *)
- pop ds
- (*%E *)
- ret 0
- (*%F _WINDOWS *)
- section
- segment _TEXT(CODE,28H)
- segment _INIT(INIT_CODE,28H)
- segment EMU_STATE(DATA,28H)
- segment _CONST(DATA,28H)
- segment _DATA(DATA,28H)
- segment BSS_START(BSS,28H)
- segment _BSS(BSS,28H)
- segment BSS_END(BSS,28H)
- segment NEAR_STACK(BSS, 28H)
- segment NEAR_HEAP(BSS, 28H)
- group DGROUP(EMU_STATE,_CONST,_DATA,BSS_START,_BSS,BSS_END,NEAR_STACK,NEAR_HEAP)
- extrn __psp
- extrn __env
- extrn __hugeshift
- extrn __env_var
- extrn __env_size
- extrn __osmajor
- extrn __argv
- extrn __argc
- extrn __argbuf
- extrn __farstack
- extrn __fmemsetup
- extrn __nheaptop
- extrn _main
- extrn __exit
- extrn __cleanup
- extrn __stklen
- extrn __osversion
- extrn _x_initx
- extrn _x_bss_end
- extrn _x_bss_start
- extrn __bss_end
- extrn __bss_start
- extrn _x_main
- extrn __main_args
- extrn __FloatInit
- extrn __SigInit
- extrn __SSisDS
- extrn __far_ss
- extrn __stk_base
- extrn __initx
- extrn __x_near_stack_start
- extrn __set_machine_id
- extrn __InitSetup
- extrn __InitLoop
- extrn @ExitCode
- select _TEXT (* Process initialisation starts here *)
- (* DON'T TOUCH *)
- public __startup :
- mov dx, ds (* save PSP *)
- cld (* cld is assumed everywhere *)
- mov ax, BSS_START
- mov es, ax
- mov ax, _DATA
- mov ds, ax
- mov [__stklen], si
- mov [__far_ss], ss
- (*%F MThread *)
- (*%F NearPtr *)
- mov [__SSisDS], cl
- (*%E *)
- (*%E *)
- (*%T NearPtr *)
- mov byte [__SSisDS], 1 (* SS always == DS in this model *)
- (*%E *)
- (*%T MThread *)
- mov byte [__SSisDS], 0 (* SS always != DS in this model *)
- (*%E *)
- (*%F _DLL *)
- mov di, [_x_bss_start] (* set near heap and _BSS bounds *)
- mov cx, [_x_bss_end]
- (*%E *)
- (*%T _DLL *)
- mov di, __bss_start (* set near heap and _BSS bounds *)
- mov cx, __bss_end
- (*%E *)
- mov si, cx (* clear _BSS segment *)
- sub cx, di
- sub ax, ax
- shr cx, 1
- rep; stosw
- adc cx, 0
- rep; stosb
- mov [__psp],dx (* save psp segment *)
- mov es, dx
- mov dx, es:[2CH]
- mov [__env], dx (* save enviromment segment *)
- (*%F NearPtr *)
- mov byte ss:[CurrentThread], 1
- (*%E *)
- mov word ss:[InMathLib], 0
- cmp byte [__SSisDS], 1
- je nearStack
- not word [__farstack] (* far stack required, not much to do *)
- jmp stackSet
- nearStack:
- mov bx, [__x_near_stack_start]
- mov [__stk_base], bx
- add bx, [__stklen]
- and bx, ~1
- sub bx, 2
- mov ax, _DATA (* Near stack required, move it to DGROUP *)
- mov ss, ax
- mov sp, bx
- stackSet:
- mov ax, STACK_GUARD
- push ax
- sub bp, bp
- push bp
- mov bp, sp
- call far __FloatInit (* initialise floating point if present *)
- call __osversion (* get MSDOS version first *)
- call far __set_machine_id
- mov word [__hugeshift], 1000H
- call __InitSetup
- (* Program actually starts after library initialization is performed durring *)
- (* the following call *)
- (*%F NearCall *)
- call far __InitLoop (* library module initialisation is called here *)
- (*%E *)
- (*%T NearCall *)
- call __InitLoop
- (*%E *)
- call __cleanup
- mov ax, [@ExitCode]
- (*%F RegParam *)
- push ax
- (*%E *)
- (*%F NearCall *)
- call far __exit
- (*%E *)
- (*%T NearCall *)
- call __exit
- (*%E *)
- (* This call will not return *)
- (*****************************)
- public $Stage2 :
- (*%F NearCall *)
- call far __SigInit
- (*%E *)
- (*%T NearCall *)
- call __SigInit (* initialise interrupt vectors *)
- (*%E *)
- add word [__stk_base], 100H
- (*%F _DLLOVL *)
- cmp byte [__fmemsetup], 0
- jnz dontFree (* Far heap present memory init complete *)
- sub dx, dx
- cmp byte [__SSisDS], 1
- je nearStackSet (* free surplus memory if near heap and stack *)
- mov dx, [__stklen]
- add dx, 0FH
- jnc sizeOK
- mov dx, 1000H
- jmp nearStackSet
- sizeOK:
- mov cl, 4
- shr dx, cl
- nearStackSet:
- mov ax, [__psp]
- mov es, ax
- mov bx, [__far_ss]
- add bx, dx
- mov es:[2], bx
- sub bx, ax
- mov ah, 4AH
- int 21H
- dontFree:
- (*%E *)
- (*%F _ENV *)
- (*%T _DLLOVL *)
- mov byte [__fmemsetup], 1 (* Far Heap Managed by Loader *)
- (*%E *)
- (*%E *)
- jmp far [_x_initx]
- section
- segment _TEXT(CODE, 28H)
- extrn _main
- extrn _x_main
- public __call_main :
- (*%F NearCall *)
- (*%T _DLLOVL *)
- push bp
- mov bp,sp
- (*%E *)
- call far [_x_main] (* call main *)
- (*%T _DLLOVL *)
- pop bp
- (*%E *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- call [_x_main]
- ret 0
- (*%E *)
- (*%E *) (* NOT Windows *)
- (*%T _WINDOWS *)
- section
- segment _TEXT(CODE,28H)
- segment _INIT(INIT_CODE,28H)
- segment BEGDATA(DATA,28H)
- public __bdata_dummy : org 10
- segment EMU_STATE(DATA,28H)
- segment _CONST(DATA,28H)
- segment _DATA(DATA,28H)
- segment BSS_START(BSS,28H)
- segment _BSS(BSS,28H)
- segment BSS_END(BSS,28H)
- group DGROUP(BEGDATA,EMU_STATE,_CONST,_DATA,BSS_START,_BSS,BSS_END)
- extrn __psp
- extrn __env
- extrn __hugeshift
- extrn __env_var
- extrn __env_size
- extrn __osmajor
- extrn __argv
- extrn __argc
- extrn __argbuf
- extrn __farstack
- extrn __fmemsetup
- extrn __nheaptop
- extrn _main
- extrn __exit
- extrn __cleanup
- extrn __stklen
- extrn __osversion
- extrn _x_bss_end
- extrn _x_bss_start
- extrn _x_main
- extrn __main_args
- extrn __FloatInit
- extrn __SigInit
- extrn __SSisDS
- extrn __stk_base
- extrn _x_initx
- extrn __set_machine_id
- extrn __InitLoop
- extrn __InitSetup
- extrn __ireg
- extrn @ExitCode
- select _DATA
- dm : dw 0
- select _TEXT (* Process initialisation starts here *)
- (* DON'T TOUCH *)
- public __startup :
- cld (* cld is assumed everywhere *)
- (*%F _WINDLL *)
- mov [__stk_base], cx (* cx set by call to INITTASK *)
- (*%E *)
- mov cx, ds
- mov es, cx
- mov cx, [_x_bss_end]
- (*%T _WINDLL *)
- mov [__stk_base], cx
- (*%E *)
- mov di, [_x_bss_start] (* set near heap and _BSS bounds *)
- mov si, cx (* clear _BSS segment *)
- sub cx, di
- sub ax, ax
- rep; stosb (* cx = 0 *)
- (*%F _WINDLL *)
- mov dx, [__ireg][PSPSeg]
- mov [__psp],dx (* save psp segment *)
- mov es, dx
- mov dx, es:[2CH]
- mov [__env], dx (* save enviromment segment *)
- (*%E *)
- mov ax, STACK_GUARD (* set up stack *)
- push ax
- push cx
- mov bp, sp
- call far __FloatInit (* initialise floating point if present *)
- mov word [__hugeshift], 1000H
- call __InitSetup
- (*%F NearCall *)
- call far __InitLoop (* lib module initialisation is called here *)
- (*%E *)
- (*%T NearCall *)
- call __InitLoop
- (*%E *)
- call __cleanup
- mov ax, [@ExitCode]
- (*%T _WINDLL *)
- add sp, 4
- ret far 0
- (*%E *)
- (*%F RegParam *)
- push ax
- (*%E *)
- (*%F _WINDLL *)
- (*%F NearCall *)
- call far __exit
- (*%E *)
- (*%T NearCall *)
- call __exit
- (*%E *)
- (*%E *)
- (*%T _WINDLL *)
- ret far 0
- (*%E *)
- (* This call will not return *)
- (*****************************)
- public $Stage2 :
- (*%F NearCall *)
- inc bp
- push bp
- mov bp, sp
- (*%E *)
- add word [__stk_base], 100H
- jmp far [_x_initx]
- public __call_main :
- (*%F NearCall *)
- call far [_x_main] (* call main *)
- pop bp
- dec bp
- ret far 0
- (*%E *)
- (*%T NearCall *)
- call [_x_main]
- ret 0
- (*%E *)
- section
- segment EMU_TEXT (EMU_CODE,28H)
- public __FloatInitStack :
- (*%T RegParam *)
- push cx (* initialise fp registers except for stack top *)
- mov cx,7
- push_zero:
- fldz st(0)
- loop push_zero
- pop cx
- (*%E *)
- ret far 0
- (*%E _WINDOWS *)
- section
- segment _TEXT(CODE,28H)
- segment PROC_TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- segment EMU_STATE(DATA,68H)
- extrn @Save8087
- extrn emuBuffer
- extrn __initsig
- extrn __real_in
- extrn __real_out
- extrn __rreal_in
- extrn __rreal_out
- extrn __farstack
- extrn __stk_base
- select _TEXT
- public __fp_1 :
- (*%F _WINDOWS *)
- mov ax, PROC_TEXT
- mov es, ax
- mov byte es:[@Save8087], 1
- mov ax, _DATA
- mov es, ax
- cmp word es:[__farstack], 0
- je nearStack
- add word es:[__stk_base], 490
- nearStack:
- (*%F _DLL *)
- mov word es:[__real_in], __rreal_in (* initialise 'C' fp output *)
- mov word es:[__real_out], __rreal_out
- (*%E *)
- call far __initsig
- ret far 0
- dw emuBuffer
- (*%E *)
- (*%T _WINDOWS *)
- mov word [__real_in], __rreal_in (* initialise 'C' fp output *)
- mov word [__real_out], __rreal_out
- call far __initsig
- ret far 0
- (*%E *)
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- extrn __real_in
- extrn __real_out
- extrn __real_pdef
- extrn __real_sdef
- select _TEXT
- public __fp_0 :
- (*%F _DLL *)
- (*%F _WINDOWS *)
- mov ax, _DATA
- mov ds, ax
- (*%E *)
- mov word [__real_in], __real_sdef
- mov word [__real_out], __real_pdef
- (*%E *)
- ret far 0
- (*%E *) (* NOT OS2 *)
- section
- (****************************************************************************)
- (*%T _OS2 *)
- segment _INIT(INIT_CODE,28H)
- segment _TEXT(CODE,28H)
- segment _DATA(DATA,28H)
- segment _BSS(BSS, 28H)
- extrn __setargv
- extrn __InitLoop
- select _DATA
- extrn __x_ax
- extrn __x_bx
- select _TEXT
- do_initargc : (* defined later on ! *)
- select _INIT
- (*%F NearCall *)
- initargc : dw MAGIC_NUM
- db PR4
- dd do_initargc
- (*%E *)
- (*%T NearCall *)
- initargc : dw MAGIC_NUM
- db PR4
- dw do_initargc
- (*%E *)
- select _BSS
- public __argv : org 32*DataPtrSize
- select _DATA
- public __argc : dw initargc
- select _TEXT
- call __setargv
- (*%F NearCall *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- (****************************************************************************)
- section
- segment _INIT(INIT_CODE,28H)
- segment _TEXT(CODE,28H)
- segment _DATA(DATA,28H)
- segment _BSS(BSS, 28H)
- extrn __setargv
- extrn __setenv
- extrn __InitLoop
- select _DATA
- select _TEXT
- do_initargce : (* defined later on ! *)
- select _INIT
- (*%F NearCall *)
- initargce : dw MAGIC_NUM
- db PR4
- dd do_initargce
- (*%E *)
- (*%T NearCall *)
- initargce : dw MAGIC_NUM
- db PR4
- dw do_initargce
- (*%E *)
- select _DATA
- public __env_var : dw initargce
- org ENVNUM*DataPtrSize-2
- select _TEXT
- (*%F NearCall *)
- call far __setenv
- (*%E *)
- (*%T NearCall *)
- call __setenv
- (*%E *)
- call __setargv
- (*%F NearCall *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- (****************************************************************************)
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- extrn DOSGETVERSION
- extrn DOSGETMACHINEMODE
- select _DATA
- extrn __osmajor
- extrn __osminor
- extrn __osmode
- select _TEXT
- public __osversion :
- (*
- void __osversion(void)
- sets OS version
- *)
- version = -2
- locals = 2
- push bp
- mov bp, sp
- sub sp, locals
- (*%F SameDS *)
- push ds
- mov ax, _DATA
- mov ds, ax
- (*%E *)
- push ss
- lea ax, [bp][version]
- push ax
- call far DOSGETVERSION
- sub ax, ax
- mov al, [bp][version]
- mov [__osminor], ax
- mov al, [bp][version][1]
- mov [__osmajor], ax
- push ds
- mov ax, __osmode
- push ax
- call far DOSGETMACHINEMODE
- (*%F SameDS *)
- pop ds
- (*%E *)
- mov sp, bp
- pop bp
- (*%F NearCall *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- (****************************************************************************)
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- select _DATA
- extrn __x_ax
- extrn __x_bx
- extrn __argv
- extrn __argbuf
- extrn __argc
- extrn __arg_init
- select _TEXT
- public __setargv :
- push bp
- push di
- push si
- push ds
- mov cx, _DATA
- mov ds, cx
- cmp byte [__arg_init], 0
- jne near initDone
- not byte [__arg_init]
- mov di, __argbuf
- (*%F NearPtr *)
- push ds
- mov si, [__x_bx]
- mov ds, [__x_ax]
- mov ax, _DATA
- mov es, ax
- mov di, __argbuf
- mov bx, __argv
- sub bp, bp
- mov cx, 1
- mov dl, ' '
- mov dh, 0
- mainLoop:
- mov es:[bx], di
- mov es:[bx][2], es
- inc bp
- copyLoop:
- startStringRet:
- lodsb
- or al, al
- je copyDone
- cmp al, dl
- je getNextCommand
- cmp al, '"'
- je startString
- stosb
- jmp copyLoop
- getNextCommand:
- cmp dh, 1
- jz endString
- endStringRet:
- sub al, al
- stosb
- add bx, 4
- skipLoop:
- mov al, [si]
- or al, al
- je copyDone
- cmp al, ' '
- jne mainLoop
- inc si
- loop skipLoop
- copyDone:
- dec cx
- jcxz getNextCommand
- stosb
- pop ds
- (*%E *)
- (*%T NearPtr *)
- push ds
- mov si, [__x_bx]
- mov ds, [__x_ax]
- mov ax, _DATA
- mov es, ax
- mov di, __argbuf
- mov bx, __argv
- sub bp, bp
- mov cx, 1
- mov dl, ' '
- mov dh, 0
- mainLoop:
- mov es:[bx], di
- inc bp
- copyLoop:
- startStringRet:
- lodsb
- or al, al
- je copyDone
- cmp al, dl
- je getNextCommand
- cmp al, '"'
- je startString
- stosb
- jmp copyLoop
- getNextCommand:
- cmp dh, 1
- jz endString
- endStringRet:
- sub al, al
- stosb
- add bx, 2
- skipLoop:
- mov al, [si]
- or al, al
- je copyDone
- cmp al, ' '
- jne mainLoop
- inc si
- loop skipLoop
- copyDone:
- dec cx
- jcxz getNextCommand
- stosb
- pop ds
- (*%E *)
- mov [__argc], bp
- initDone:
- pop ds
- pop si
- pop di
- pop bp
- ret 0
- startString:
- mov dl, '"'
- mov dh, 1
- jmp startStringRet
- endString:
- mov dl, ' '
- mov dh, 0
- inc si
- jmp endStringRet
- (***************************************************************************)
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- extrn VIOWRTCHARSTR
- select _DATA
- message : db 'Floating Point Not Loaded'
- MESLEN = 25
- select _TEXT
- public __real_pdef :
- public __real_sdef :
- (*%F SameDS *)
- push ds
- mov ax, _DATA
- mov ds, ax
- (*%E *)
- push ds
- mov ax, message
- push ax
- mov ax, MESLEN
- push ax
- sub ax, ax
- push ax
- push ax
- push ax
- call far VIOWRTCHARSTR
- (*%F SameDS *)
- pop ds
- (*%E *)
- ret 0
- section
- segment _TEXT(CODE,28H)
- segment _INIT(INIT_CODE,28H)
- segment _CONST(DATA,28H)
- segment _DATA(DATA,28H)
- segment BSS_START(BSS,28H)
- segment _BSS(BSS,28H)
- segment BSS_END(BSS,28H)
- segment NEAR_STACK(BSS,28H)
- segment NEAR_HEAP(BSS,28H)
- group DGROUP(_CONST,_DATA,BSS_START,_BSS,BSS_END,NEAR_STACK,NEAR_HEAP)
- extrn __hugeshift
- extrn __env_var
- extrn __env_size
- extrn __env
- extrn __psp
- extrn __osmajor
- extrn __osmode
- extrn __osversion
- extrn @ExitCode
- extrn __argv
- extrn __argc
- extrn __argbuf
- extrn __farstack
- extrn __nheaptop
- extrn __sp_temp
- extrn __ss_temp
- extrn _x_bss_end
- extrn _x_main
- extrn __x_ax
- extrn __x_bx
- extrn __x_di
- extrn __main_args
- extrn __exit
- extrn __cleanup
- extrn _main
- extrn __SSisDS
- extrn __stk_base
- extrn _x_initx
- extrn __stklen
- extrn __FloatInit
- (*%F _DLL *)
- extrn __siginit
- (*%E *)
- extrn __x_near_stack_start
- extrn DOSGETHUGESHIFT
- extrn DOSFREESEG
- extrn DOSREALLOCSEG
- extrn DOSGETMACHINEMODE
- extrn __set_exit_handler
- extrn __InitSetup
- extrn __InitLoop
- select _TEXT
- public __startup :
- mov dx, _DATA
- mov ds, dx
- mov [__stklen], si
- mov [__SSisDS], cx
- mov [__x_ax], ax
- mov [__x_bx], bx
- mov [__x_di], di
- mov [__env], ax
- mov [__sp_temp], sp
- mov [__ss_temp], ss
- (*%T _XTD *)
- push ax
- push bx
- mov ah, 51H
- int 21H
- mov [__psp],bx
- call far __osversion
- pop bx
- pop ax
- (*%E *)
- push ds
- mov ax, __osmode
- push ax
- call far DOSGETMACHINEMODE
- (*%T MThread *)
- mov byte ss:[CurrentThread], 1 (* Thread number *)
- (*%E *)
- mov word ss:[InMathLib], 0
- (*%T NearPtr *)
- cmp byte [__SSisDS], 0
- jnz sidSet
- mov byte [__SSisDS], 1
- sidSet:
- (*%E *)
- cmp byte [__SSisDS], 1
- je nearStack
- cmp byte [__SSisDS], 2
- je pmStack
- not word [__farstack] (* far stack required, not much to do *)
- jmp stackSet
- nearStack:
- mov bx, [__x_near_stack_start]
- mov [__stk_base], bx
- add bx, [__stklen]
- and bx, ~1
- sub bx, 2
- mov ax, _DATA (* Near stack required, move it to DGROUP *)
- mov ss, ax
- mov sp, bx
- jmp stackSet
- pmStack:
- mov ax, sp
- sub ax, [__stklen]
- mov [__stk_base], ax
- stackSet:
- mov ax, __hugeshift
- push ds
- push ax
- call far DOSGETHUGESHIFT
- mov cx, [__hugeshift]
- mov ax, 1
- shl ax, cx
- mov [__hugeshift], ax
- mov ax, STACK_GUARD
- push ax
- sub bp, bp
- push bp
- mov bp, sp
- call far __FloatInit
- cmp word [__osmode], 0
- je notPMode
- call far __set_exit_handler
- notPMode:
- call __InitSetup
- (*%F NearCall *)
- call far __InitLoop (* lib module initialisation is called here *)
- (*%E *)
- (*%T NearCall *)
- call __InitLoop
- (*%E *)
- call __cleanup
- mov ax, [@ExitCode]
- (*%F RegParam *)
- push ax
- (*%E *)
- (*%F NearCall *)
- call far __exit
- (*%E *)
- (*%T NearCall *)
- call __exit
- (*%E *)
- (* This call will not return *)
- (*****************************)
- public $Stage2 :
- (*%F _DLL *)
- call __siginit
- (*%E *)
- add word [__stk_base], 100H
- jmp far [_x_initx]
- public __call_main :
- (*%F NearCall *)
- call far [_x_main]
- ret far 0
- (*%E *)
- (*%T NearCall *)
- call [_x_main]
- ret 0
- (*%E *)
- (****************************************************************************)
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- extrn DOSEXIT
- select _DATA
- extrn __sp_temp
- extrn __ss_temp
- extrn __SSisDS
- extrn __exit_list_done
- select _TEXT
- public __exit :
- (*
- void __exit(int code)
- terminates process.
- *)
- (*%F RegParam *)
- code = frame
- push bp
- mov bp, sp
- mov ax, [bp][code]
- (*%E *)
- cmp byte [__SSisDS], 1
- jne farStack
- mov ss, [__ss_temp]
- mov sp, [__sp_temp]
- farStack:
- mov byte [__exit_list_done], 1
- mov bx, EXIT_PROCESS
- push bx
- push ax
- call far DOSEXIT (* call exit function *)
- db 'TopSpeed RTL (C) JPI 1989'
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- segment EMU_STATE(DATA,68H)
- extrn emuBuffer
- extrn __initsig
- extrn __real_in
- extrn __real_out
- extrn __rreal_in
- extrn __rreal_out
- extrn __stk_base
- extrn __farstack
- select _TEXT
- public __fp_1 :
- mov ax, _DATA
- mov es, ax
- cmp word [__farstack], 0
- je nearStack
- add word [__stk_base], 490
- nearStack:
- (*%F _DLL *)
- mov word es:[__real_in], __rreal_in (* initialise 'C' fp output *)
- mov word es:[__real_out], __rreal_out
- (*%E *)
- call far __initsig
- ret far 0
- dw emuBuffer
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- extrn __real_in
- extrn __real_out
- extrn __real_pdef
- extrn __real_sdef
- select _TEXT
- public __fp_0 :
- (*%F _DLL *)
- mov ax, _DATA
- mov ds, ax
- mov word [__real_in], __real_sdef
- mov word [__real_out], __real_pdef
- (*%E *)
- ret far 0
- (****************************************************************************)
- section
- segment _TEXT(CODE,28H)
- segment _DATA(DATA, 28H)
- extrn DOSGETPID
- select _TEXT
- public _getpid :
- (* struct _PIDINFO *)
- pid = 0
- tid = 2
- pidParent = 6
- PidInfoSize = 6
- pidbuf = -PidInfoSize
- locals = PidInfoSize
- push bp
- mov bp, sp
- sub sp, locals
- push ss
- lea ax, [bp][pidbuf]
- push ax
- call far DOSGETPID
- mov ax, [bp][pidbuf][pid]
- mov sp, bp
- pop bp
- (*%F NearCall *)
- ret far 0
- (*%E *)
- (*%T NearCall *)
- ret 0
- (*%E *)
- (*%E *) (* OS2 *)
- section
- (*%F _OS2 *)
- (*%F _WINDOWS *)
- (***********************************************************************)
- (* $SWInt - Generate a SoftWare Interrupt *)
- (* *)
- (* DOS Memory Models *)
- (* *)
- (* Internal Procedure - Near Call *)
- (* Parameters: *)
- (* All Registers set up *)
- (* Interrupt number on stack *)
- (* Return: *)
- (* All Registers set up *)
- (* *)
- (***********************************************************************)
- segment _TEXT(CODE,48H)
- IntNo = frame + 2
- Flags = 2
- public $SWInt :
- pushf
- push bp
- mov bp, sp
- push ax
- mov ax, [bp][IntNo]
- cli
- mov cs:[$$InterruptNo], al
- mov cs:[$$InterruptNo2], al
- db 0EAH (*I far jmp *)
- dw $$Next,_TEXT (* purge pre-fetch *)
- $$Next:
- cmp al, 25H
- je $$Int2526
- cmp al, 26H
- je $$Int2526
- pop ax
- pop bp
- db 0CDH (*I int *)
- $$InterruptNo:
- db 0
- $$IntDone:
- push bp
- mov bp, sp
- push ax
- lahf
- mov [bp][Flags], ah
- pop ax
- pop bp
- popf
- (*%T _fcall *)
- ret far 2
- (*%E *)
- (*%F _fcall *)
- ret 2
- (*%E *)
- $$Int2526:
- pop ax
- pop bp
- db 0CDH (*I int *)
- $$InterruptNo2:
- db 0
- inc sp
- inc sp
- jmp $$IntDone
- (*%E _WINDOWS *)
- (*%E _OS2 *)
- section
- (*%T _WINDOWS *)
- (***********************************************************************)
- (* $SWInt - Generate a SoftWare Interrupt *)
- (* *)
- (* Windows Memory Models *)
- (* *)
- (* Internal Procedure - Near Call *)
- (* Parameters: *)
- (* All Registers set up *)
- (* Interrupt number on stack *)
- (* Return: *)
- (* All Registers set up *)
- (* *)
- (***********************************************************************)
- segment _TEXT(CODE,48H)
- extrn ALLOCCSTODSALIAS
- extrn FREESELECTOR
- IntNo = frame + 2
- Flags = 2
- public $SWInt :
- pushf
- push bp
- mov bp, sp
- push ax
- push ds
- push cs
- call far ALLOCCSTODSALIAS
- mov ds, ax
- mov ax, [bp][IntNo]
- cli
- mov [$$InterruptNo], al
- mov [$$InterruptNo2], al
- (* call far $ClearPipe *)
- mov ax, ds
- pop ds
- push ax
- call far FREESELECTOR
- mov ax, [bp][IntNo]
- cmp al, 25H
- je $$Dos2526
- cmp al, 26H
- je $$Dos2526
- pop ax
- pop bp
- db 0CDH (*I int *)
- $$InterruptNo:
- db 0
- $$IntDone:
- push bp
- mov bp, sp
- push ax
- lahf
- mov [bp][Flags], ah
- pop ax
- pop bp
- popf
- (*%T _fcall *)
- ret far 2
- (*%E *)
- (*%F _fcall *)
- ret 2
- (*%E *)
- $$Dos2526:
- pop ax
- pop bp
- db 0CDH (*I int *)
- $$InterruptNo2:
- db 0
- inc sp
- inc sp
- jmp $$IntDone
- (*%E _WINDOWS *)
- end
|