COREIO.A 106 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * COREIO.A - low level i/o *
  5. * *
  6. * COPYRIGHT (C) 1989..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. include "corelib.inc"
  11. module coreio
  12. (***************************************************************************)
  13. segment _DATA(DATA,28H)
  14. public __fmode : dw O_TEXT (* default transaltion mode *)
  15. segment _BSS(BSS, 28H)
  16. public __fmask : org 2 (* default file permission mask *)
  17. segment _BSS(BSS, 28H)
  18. public __ungotchar : org 2 (* temporary storage for console I/O *)
  19. (*%F SameDS *)
  20. segment SIG_TEXT(CODE,28H)
  21. (*%E *)
  22. (*%T SameDS *)
  23. segment _TEXT(CODE,28H)
  24. (*%E *)
  25. public __DelayFactor : org 2
  26. segment _DATA(DATA,28H)
  27. public __upperHex : db 'A' (* 'a' or 'A', chooses digit case *)
  28. (*%T _DLL *)
  29. public __exit1_vector : org FarCodePtrSize
  30. (*%E *)
  31. segment _BSS(BSS, 28H)
  32. public __zero_code : org 2
  33. public __scanwaiting : org 2
  34. public __kbdhandle : org 2
  35. segment _BSS(BSS, 28H)
  36. public __i_putch : org CodePtrSize
  37. public __i_cgets : org CodePtrSize
  38. segment _BSS(BSS,28H)
  39. public __p_init : org 2
  40. section
  41. (*%F _WINDOWS *)
  42. (****************************************************************************)
  43. segment _TEXT(CODE,28H)
  44. segment _DATA(DATA,28H)
  45. extrn __p_init
  46. extrn __i_putch
  47. extrn __i_cgets
  48. extrn __d_putch
  49. extrn __d_cgets
  50. (*%T _DLLOVL *)
  51. PutchAdr: dd __d_putch
  52. CgetsAdr: dd __d_cgets
  53. (*%E *)
  54. (*%T RegParam *)
  55. char = -2
  56. locals = 2
  57. (*%E *)
  58. (*%F RegParam *)
  59. char = frame
  60. (*%E *)
  61. select _TEXT
  62. public _putch :
  63. push bp
  64. mov bp, sp
  65. (*%T RegParam *)
  66. sub sp, locals
  67. mov [bp][char], ax
  68. (*%E *)
  69. (*%F SameDS *)
  70. push ds
  71. mov ax, _DATA
  72. mov ds, ax
  73. (*%E *)
  74. cmp byte [__p_init], 0
  75. jne putchInitDone
  76. (*%F _DLLOVL *)
  77. mov word [__i_putch], __d_putch
  78. mov word [__i_cgets], __d_cgets
  79. (*%F NearCall *)
  80. mov word [__i_putch][2], cs
  81. mov word [__i_cgets][2], cs
  82. (*%E *)
  83. (*%E *)
  84. (*%T _DLLOVL *)
  85. mov ax, [PutchAdr]
  86. mov word [__i_putch], ax
  87. mov ax, [CgetsAdr]
  88. mov word [__i_cgets], ax
  89. mov ax, [PutchAdr][2]
  90. mov word [__i_putch][2], ax
  91. mov ax, [CgetsAdr][2]
  92. mov word [__i_cgets][2], ax
  93. (*%E *)
  94. inc byte [__p_init]
  95. putchInitDone:
  96. (*%F RegParam *)
  97. push [bp][char]
  98. (*%E *)
  99. (*%T RegParam *)
  100. mov ax, [bp][char]
  101. (*%E *)
  102. (*%F NearCall *)
  103. call dword [__i_putch]
  104. (*%E *)
  105. (*%T NearCall *)
  106. call [__i_putch]
  107. (*%E *)
  108. (*%F RegParam *)
  109. add sp, 2
  110. (*%E *)
  111. (*%F SameDS *)
  112. pop ds
  113. (*%E *)
  114. (*%T RegParam *)
  115. mov sp, bp
  116. (*%E *)
  117. pop bp
  118. (*%F NearCall *)
  119. ret far 0
  120. (*%E *)
  121. (*%T NearCall *)
  122. ret 0
  123. (*%E *)
  124. (*%E _WINDOWS *)
  125. section
  126. (*%F _OS2 *)
  127. (*%F _WINDOWS *)
  128. (****************************************************************************)
  129. segment _TEXT(CODE,28H)
  130. segment _DATA(DATA,28H)
  131. scr_init :dw 0
  132. scr_cols :dw 0
  133. bellChar :dw 7
  134. (* int putch(int c) *)
  135. (*%F RegParam *)
  136. chk = frame
  137. (*%E *)
  138. (*%T RegParam *)
  139. chk = -2
  140. locals = 2
  141. (*%E *)
  142. select _TEXT
  143. public __d_putch :
  144. push bp
  145. mov bp, sp
  146. (*%T RegParam *)
  147. sub sp, locals
  148. mov [bp][chk], ax
  149. (*%E *)
  150. push bx
  151. push cx
  152. push dx
  153. (*%F SameDS *)
  154. push ds
  155. mov ax, _DATA
  156. mov ds, ax
  157. (*%E *)
  158. cmp word [scr_init], 0
  159. jnz initDone
  160. mov ah, 0FH
  161. int 10H
  162. mov [scr_cols], ah
  163. not word [scr_init]
  164. initDone:
  165. call getxy
  166. mov al, [bp][chk]
  167. cmp al, 8
  168. je backSpace
  169. cmp al, 0AH
  170. je newLine
  171. cmp al, 0DH
  172. je carriageReturn
  173. cmp al, 09H
  174. je tab
  175. cmp al, 07H
  176. je bell
  177. notEsc:
  178. mov ah, 0AH
  179. mov bh, 0
  180. mov cx, 1
  181. int 10H
  182. putDone:
  183. call incxy
  184. putExit:
  185. mov ax, [bp][chk]
  186. (*%F SameDS *)
  187. pop ds
  188. (*%E *)
  189. pop dx
  190. pop cx
  191. pop bx
  192. (*%T RegParam *)
  193. mov sp, bp
  194. (*%E *)
  195. pop bp
  196. (*%F NearCall *)
  197. ret far 0
  198. (*%E *)
  199. (*%T NearCall *)
  200. ret 0
  201. (*%E *)
  202. bell:
  203. mov ah, 40H
  204. mov bx, 1
  205. mov cx, bx
  206. (*%F SameDS *)
  207. push ds
  208. mov dx, _DATA
  209. mov ds, dx
  210. (*%E *)
  211. mov dx, bellChar
  212. extrn @DosInterrupt
  213. (*%F NearCall *)
  214. call far @DosInterrupt
  215. (*%E *)
  216. (*%T NearCall *)
  217. call @DosInterrupt
  218. (*%E *)
  219. (*%F SameDS *)
  220. pop ds
  221. (*%E *)
  222. jmp putExit
  223. backSpace:
  224. call decxy
  225. jmp putExit
  226. newLine:
  227. mov dl, [scr_cols]
  228. jmp putDone
  229. carriageReturn:
  230. mov dl, 0
  231. call setxy
  232. jmp putExit
  233. tab:
  234. mov cx, 4
  235. mov al, 20H
  236. tabLoop:
  237. push cx
  238. mov ah, 0AH
  239. mov bh, 0
  240. mov cx, 1
  241. int 10H
  242. call incxy
  243. pop cx
  244. loop tabLoop
  245. jmp putExit
  246. incxy :
  247. inc dl
  248. cmp dl, [scr_cols]
  249. jb xOK1
  250. cmp dh, 24
  251. jae scrollUp
  252. mov dl, 0
  253. inc dh
  254. xOK1:
  255. call setxy
  256. ret 0
  257. scrollUp:
  258. push dx
  259. mov ax, 601H
  260. mov ch, 0
  261. mov cl, 0
  262. mov dh, 24
  263. mov dl, [scr_cols]
  264. call scroll
  265. pop dx
  266. sub dl, dl
  267. jmp xOK1
  268. decxy :
  269. dec dl
  270. cmp dl, 0
  271. jae xOK
  272. cmp dh, 0
  273. jbe screenBegin
  274. mov dl, [scr_cols]
  275. dec dh
  276. xOK:
  277. call setxy
  278. ret 0
  279. screenBegin:
  280. mov dh, 0
  281. mov dl, 0
  282. jmp xOK
  283. scroll :
  284. mov bh, 7
  285. int 10H
  286. ret 0
  287. getxy :
  288. mov ah, 3H
  289. mov bh, 0
  290. int 10H
  291. ret 0
  292. setxy :
  293. mov ah, 2H
  294. mov bh, 0
  295. int 10H
  296. ret 0
  297. (*%E _WINDOWS *)
  298. (*%E _OS2 *)
  299. section
  300. (*%F _OS2 *)
  301. (*%F _WINDOWS *)
  302. (****************************************************************************)
  303. segment _DATA(DATA,28H)
  304. segment _TEXT(CODE,28H)
  305. extrn __zero_code
  306. extrn __ungotchar
  307. extrn @DosInterrupt
  308. (* int getch(void)
  309. Checks for any character returned by ungetch then calls DOS. *)
  310. public _getch :
  311. (*%T _DLLOVL *)
  312. push bp
  313. mov bp, sp
  314. (*%E *)
  315. (*%F SameDS *)
  316. push ds
  317. mov ax, _DATA
  318. mov ds, ax
  319. (*%E *)
  320. mov al, [__ungotchar]
  321. or al, al
  322. jne charWaiting
  323. mov ah, 8H
  324. (*%F NearCall *)
  325. call far @DosInterrupt
  326. (*%E *)
  327. (*%T NearCall *)
  328. call @DosInterrupt
  329. (*%E *)
  330. charWaiting:
  331. mov word [__ungotchar], 0
  332. mov word [__zero_code], 0
  333. sub ah, ah
  334. or ax, ax
  335. jnz charNotCode
  336. mov byte [__zero_code], 1
  337. charNotCode:
  338. (*%F SameDS *)
  339. pop ds
  340. (*%E *)
  341. (*%T _DLLOVL *)
  342. pop bp
  343. (*%E *)
  344. (*%F NearCall *)
  345. ret far 0
  346. (*%E *)
  347. (*%T NearCall *)
  348. ret 0
  349. (*%E *)
  350. (*%E _WINDOWS *)
  351. (*%E _OS2 *)
  352. section
  353. (*%F _OS2 *)
  354. (*%F _WINDOWS *)
  355. (****************************************************************************)
  356. segment _TEXT(CODE,28H)
  357. extrn _getch
  358. extrn _putch
  359. (* int getche(void)
  360. Checks for any charcater returned by ungetch then calls DOS. *)
  361. public _getche :
  362. (*%T _DLLOVL *)
  363. push bp
  364. mov bp, sp
  365. (*%E *)
  366. (*%F NearCall *)
  367. call far _getch
  368. (*%E *)
  369. (*%T NearCall *)
  370. call _getch
  371. (*%E *)
  372. push ax
  373. (*%F NearCall *)
  374. call far _putch
  375. (*%E *)
  376. (*%T NearCall *)
  377. call _putch
  378. (*%E *)
  379. pop ax
  380. (*%T _DLLOVL *)
  381. pop bp
  382. (*%E *)
  383. (*%F NearCall *)
  384. ret far 0
  385. (*%E *)
  386. (*%T NearCall *)
  387. ret 0
  388. (*%E *)
  389. (*%E _WINDOWS *)
  390. (*%E _OS2 *)
  391. section
  392. (*%F _OS2 *)
  393. (*%F _WINDOWS *)
  394. (****************************************************************************)
  395. segment _DATA(DATA,28H)
  396. segment _TEXT(CODE,28H)
  397. extrn __zero_code
  398. extrn __ungotchar
  399. (* int kbhit(void)
  400. Checks for any charcater waiting in keyboard buffer. *)
  401. public _kbhit :
  402. (*%T _DLLOVL *)
  403. push bp
  404. mov bp, sp
  405. (*%E *)
  406. (*%F SameDS *)
  407. push ds
  408. mov ax, _DATA
  409. mov ds, ax
  410. (*%E *)
  411. mov ax, [__zero_code]
  412. or ax, ax
  413. jnz keyWaiting
  414. mov ax, [__ungotchar]
  415. or ax, ax
  416. jnz keyWaiting
  417. mov ah, 1
  418. int 16H
  419. mov al, 1
  420. jnz keyWaiting
  421. sub ax, ax (* none ready, return 0 *)
  422. keyWaiting:
  423. (*%F SameDS *)
  424. pop ds
  425. (*%E *)
  426. (*%T _DLLOVL *)
  427. pop bp
  428. (*%E *)
  429. (*%F NearCall *)
  430. ret far 0
  431. (*%E *)
  432. (*%T NearCall *)
  433. ret 0
  434. (*%E *)
  435. (*%E _WINDOWS *)
  436. (*%E _OS2 *)
  437. section
  438. (*%F _OS2 *)
  439. (*%F _WINDOWS *)
  440. (****************************************************************************)
  441. segment _DATA(DATA,28H)
  442. segment _TEXT(CODE,28H)
  443. extrn __ungotchar
  444. (* char *cgets(char *str)
  445. String is read from console and stroed starting at str[2].
  446. s[0] is the max length of the string.
  447. The actual length is stored at str[1].
  448. Returns a pointer to the beginning of the actual string. *)
  449. CR = 0DH
  450. LF = 0AH
  451. (*%F RegParam *)
  452. str = frame
  453. (*%E *)
  454. (*%T RegParam *)
  455. str = -4
  456. locals =4
  457. (*%E *)
  458. public __d_cgets :
  459. push bp
  460. mov bp, sp
  461. (*%T RegParam *)
  462. sub sp, locals
  463. mov [bp][str], ax
  464. (*%F NearPtr *)
  465. mov [bp][str][2], bx
  466. (*%E *)
  467. (*%E *)
  468. (*%F RegParam *)
  469. push bx
  470. push cx
  471. (*%E *)
  472. (*%T RegParam *)
  473. (*%T NearPtr *)
  474. push bx
  475. (*%E *)
  476. push cx
  477. (*%E *)
  478. push di
  479. push si
  480. push ds
  481. sub cx, cx
  482. (*%F NearPtr *)
  483. lds si, [bp][str]
  484. (*%E *)
  485. (*%T NearPtr *)
  486. mov si, [bp][str]
  487. (*%E *)
  488. mov dx, si
  489. (*%F NearPtr *)
  490. mov ax, _DATA (* is there a character put back *)
  491. mov es, ax
  492. cmp word es:[__ungotchar], 0
  493. (*%E *)
  494. (*%T NearPtr *)
  495. cmp word [__ungotchar], 0
  496. (*%E *)
  497. je cgetsNoWaiting
  498. not cx
  499. dec byte ds:[si]
  500. cgetsNoWaiting:
  501. mov ah, 0AH
  502. extrn @DosInterrupt
  503. (*%F NearCall *)
  504. call far @DosInterrupt
  505. (*%E *)
  506. (*%T NearCall *)
  507. call @DosInterrupt
  508. (*%E *)
  509. jcxz cgetsNoUnget
  510. mov dx, es:[__ungotchar] (* insert put back character *)
  511. mov cl, [si][1]
  512. sub ch, ch
  513. std
  514. (*%F NearPtr *)
  515. les di, [bp][str]
  516. (*%E *)
  517. (*%T NearPtr *)
  518. mov di, [bp][str]
  519. (*%E *)
  520. add si, cx
  521. add di, cx
  522. add si, 1
  523. add di, 2
  524. rep ; movsb
  525. (*%F NearPtr *)
  526. lds si, [bp][str]
  527. (*%E *)
  528. (*%T NearPtr *)
  529. mov si, [bp][str]
  530. (*%E *)
  531. inc byte [si][1]
  532. mov [si][2], dl
  533. cld
  534. cgetsNoUnget:
  535. mov bl, [si][1] (* terminate string *)
  536. sub bh, bh
  537. add bx, 2
  538. mov byte [si][bx], 0
  539. mov dx, ds (* return address of string *)
  540. mov ax, si
  541. add ax, 2
  542. pop ds
  543. pop si
  544. pop di
  545. (*%F RegParam *)
  546. pop cx
  547. pop bx
  548. (*%E *)
  549. (*%T RegParam *)
  550. pop cx
  551. (*%T NearPtr *)
  552. pop bx
  553. (*%E *)
  554. mov sp, bp
  555. (*%E *)
  556. pop bp
  557. (*%F NearCall *)
  558. ret far 0
  559. (*%E *)
  560. (*%T NearCall *)
  561. ret 0
  562. (*%E *)
  563. (*%E _WINDOWS*)
  564. (*%E _OS2 *)
  565. section
  566. (*%F _OS2 *)
  567. (******************************************************************************)
  568. segment _INIT(INIT_CODE,28H)
  569. segment _TEXT(CODE,28H)
  570. segment _DATA(DATA,28H)
  571. segment _BSS(BSS,28H)
  572. (* void _initio()
  573. Initialises level 1 and level 2 I/O. *)
  574. extrn __exit1
  575. extrn __exit1_vector
  576. select _BSS
  577. Buf0 : org BUFSIZ
  578. Buf1 : org BUFSIZ
  579. Buf4 : org BUFSIZ
  580. select _DATA
  581. extrn __iob
  582. extrn __openfd
  583. extrn __exit_io
  584. extrn __open_max
  585. extrn __FatalError
  586. extrn __FatalErrorPos
  587. HandleData : dw 4000H, 4002H, 4002H, 4002H, 4002H
  588. StreamData : dw 0405H, 0C06H, 0402H, 0443H, 0446H
  589. StreamBuffers : dw Buf0, Buf1, 0, 0, Buf4
  590. public __iosetup : dw 0
  591. (*%F SameDS *)
  592. (*%F _DLL *)
  593. Exit1Adr: dd __exit1 (* In XLARGE and above, _exit1 is not in _TEXT *)
  594. (*%E *)
  595. (*%E *)
  596. select _TEXT
  597. do_initio : (* defined later on ! *)
  598. select _INIT
  599. (*%F NearCall *)
  600. initio : dw MAGIC_NUM
  601. db PR2
  602. dd do_initio
  603. (*%E *)
  604. (*%T NearCall *)
  605. initio : dw MAGIC_NUM
  606. db PR2
  607. dw do_initio
  608. (*%E *)
  609. select _DATA
  610. public __doserrno : dw 0, initio
  611. select _TEXT
  612. public __initio :
  613. (* check for character devices on default paths *)
  614. (*%T _WINDOWS *)
  615. (*%F NearCall *)
  616. inc bp
  617. push bp
  618. mov bp, sp
  619. (*%E *)
  620. (*%E *)
  621. (*%T _DLLOVL *)
  622. push bp
  623. mov bp, sp
  624. (*%E *)
  625. push di
  626. push si
  627. (*%F SameDS *)
  628. push ds
  629. mov ax, _DATA
  630. mov ds, ax
  631. (*%E *)
  632. (*%T SameDS *)
  633. mov word [__exit_io], __exit1
  634. (*%F NearCall *)
  635. mov word [__exit_io][2], cs
  636. (*%E *)
  637. (*%E *)
  638. (*%F SameDS *)
  639. (*%F _DLL *)
  640. mov ax, [Exit1Adr]
  641. mov word [__exit_io], ax
  642. mov ax, [Exit1Adr][2]
  643. mov word [__exit_io][2], ax
  644. (*%E *)
  645. (*%T _DLL *)
  646. mov ax, [__exit1_vector]
  647. mov word [__exit_io], ax
  648. mov ax, [__exit1_vector][2]
  649. mov word [__exit_io][2], ax
  650. (*%E *)
  651. (*%E *)
  652. cmp word [__iosetup], 0
  653. jne ioDone
  654. not word [__iosetup]
  655. memDone:
  656. sub cx, cx
  657. sub bx, bx
  658. mov si, 0
  659. mov di, __iob
  660. ioLoop:
  661. push bx
  662. mov bx, cx
  663. mov ax, 4400H (* IOCTL, get device information *)
  664. int 21H
  665. pop bx
  666. jc noSet
  667. cmp cx, 5
  668. jb standardPath
  669. or word [si][__openfd], O_RDWR
  670. jmp setDevice
  671. standardPath:
  672. mov ax, [si][StreamData]
  673. mov [di][bx][_flag], ax
  674. mov [di][bx][_file], cx
  675. mov ax, [si][StreamBuffers]
  676. or ax, ax
  677. jz noBuf
  678. mov word [di][bx][_size], BUFSIZ
  679. mov [di][bx][_base], ax
  680. mov [di][bx][_ptr], ax
  681. (*%F NearPtr *)
  682. mov [di][bx][_base][2], ds
  683. mov [di][bx][_ptr][2], ds
  684. (*%E *)
  685. noBuf:
  686. mov ax, [si][HandleData]
  687. mov [si][__openfd], ax
  688. setDevice:
  689. test dx, 80H (* test for file flags *)
  690. je noSet
  691. or word [si][__openfd], O_DEVICE
  692. cmp cx, 4
  693. ja noSet
  694. or word [di][bx][_flag], _F_DEV (* is device *)
  695. noSet:
  696. add bx, _iobSize
  697. add si, 2
  698. inc cx
  699. cmp cx, [__open_max]
  700. jne ioLoop
  701. ioDone:
  702. (*%F SameDS *)
  703. pop ds
  704. (*%E *)
  705. pop si
  706. pop di
  707. (*%F NearCall *)
  708. (*%T _DLLOVL *)
  709. pop bp
  710. (*%E *)
  711. (*%T _WINDOWS *)
  712. pop bp
  713. dec bp
  714. (*%E *)
  715. ret far 0
  716. (*%E *)
  717. (*%T NearCall *)
  718. ret 0
  719. (*%E *)
  720. (*%E _OS2 *)
  721. section
  722. (*%F _OS2 *)
  723. (*%F _WINDOWS *)
  724. (****************************************************************************)
  725. (*%F SameDS *)
  726. segment SIG_TEXT(CODE,28H)
  727. (*%E *)
  728. (*%T SameDS *)
  729. segment _TEXT(CODE,28H)
  730. (*%E *)
  731. segment _DATA(DATA,28H)
  732. segment _INIT(INIT_CODE,28H)
  733. select _DATA
  734. PPIport = 60H (* 8255A-5 Programmable Peripheral Interface *)
  735. (*%F SameDS *)
  736. select SIG_TEXT
  737. (*%E *)
  738. (*%T SameDS *)
  739. select _TEXT
  740. (*%E *)
  741. extrn __DelayFactor
  742. Semaphor: dw 0
  743. (* Little procedure to delay and amount dependant on value in AX
  744. Note : Must only be one for caching reasons
  745. To a.n.a.p we want run_time proportional to AX
  746. Preserves all registers
  747. *)
  748. public __DelayLoop:
  749. push cx
  750. push dx
  751. mov dx,8
  752. DL2: mov cx,ax
  753. DL1: loop DL1
  754. dec dx
  755. jnz DL2
  756. pop dx
  757. pop cx
  758. ret 0
  759. TimeTrap:
  760. inc word cs:[Semaphor] (* used when establishing delay factor *)
  761. iret
  762. do_initTimer : (* defined later on ! *)
  763. select _INIT
  764. (*%F NearCall *)
  765. initTimer : dw MAGIC_NUM
  766. db PR4
  767. dd do_initTimer
  768. (*%E *)
  769. (*%T NearCall *)
  770. initTimer : dw MAGIC_NUM
  771. db PR4
  772. dw do_initTimer
  773. (*%E *)
  774. select _DATA
  775. public __DelayTag : dw initTimer, 0
  776. (*%F SameDS *)
  777. select SIG_TEXT
  778. (*%E *)
  779. (*%T SameDS *)
  780. select _TEXT
  781. (*%E *)
  782. (*%T _DLLOVL *)
  783. push bp
  784. mov bp, sp
  785. (*%E *)
  786. xor ax,ax
  787. push dx
  788. push bx
  789. push ds
  790. mov ds,ax
  791. push ds:[70H]
  792. push ds:[72H]
  793. mov al,55 (* ax was zero *)
  794. xor dx,dx
  795. xor bx,bx
  796. mov word cs:[Semaphor],dx
  797. cli
  798. mov word ds:[70H],TimeTrap
  799. mov ds:[72H],cs
  800. sti
  801. Estab1:
  802. cmp word cs:[Semaphor],2
  803. jne Estab1
  804. Estab2: (* Label even aligned *)
  805. test bx,bx
  806. cmp word cs:[Semaphor],3
  807. jz Estab5
  808. call __DelayLoop
  809. inc bx
  810. jmp Estab2
  811. Estab5:
  812. cli
  813. pop ds:[72H]
  814. pop ds:[70H]
  815. sti
  816. mov cs:[__DelayFactor],bx
  817. pop ds
  818. pop bx
  819. pop dx
  820. in al,PPIport+1
  821. and al,0FCH
  822. out PPIport+1,al
  823. (*%F NearCall *)
  824. (*%T _DLLOVL *)
  825. pop bp
  826. (*%E *)
  827. ret far 0
  828. (*%E *)
  829. (*%T NearCall *)
  830. ret 0
  831. (*%E *)
  832. (*%E _WINDOWS *)
  833. (*%E _OS2 *)
  834. section
  835. (*%F _OS2 *)
  836. (*%F _WINDOWS *)
  837. (******************************************************************************)
  838. segment _DATA(DATA,28H)
  839. (*%F SameDS *)
  840. segment SIG_TEXT(CODE,28H)
  841. (*%E *)
  842. (*%T SameDS *)
  843. segment _TEXT(CODE,28H)
  844. (*%E *)
  845. extrn __DelayTag
  846. extrn __DelayFactor
  847. extrn __DelayLoop
  848. (*%F RegParam *)
  849. p_time = frame
  850. (*%E *)
  851. public _delay :
  852. (*%F RegParam *)
  853. push bp
  854. mov bp, sp
  855. mov ax, [bp][p_time]
  856. (*%E *)
  857. (*%T RegParam *)
  858. (*%T _DLLOVL *)
  859. push bp
  860. mov bp, sp
  861. (*%E *)
  862. (*%E *)
  863. push dx
  864. push bx
  865. mov bx, ax
  866. mov ax, cs:[__DelayFactor]
  867. MoreDealy: (* Label even aligned *)
  868. cmp word cs:[__DelayFactor],0
  869. test bx,bx
  870. jz DelayEnd
  871. call __DelayLoop
  872. dec bx
  873. jmp MoreDealy
  874. DelayEnd:
  875. pop bx
  876. pop dx
  877. (*%F RegParam *)
  878. pop bp
  879. (*%E *)
  880. (*%T RegParam *)
  881. (*%T _DLLOVL *)
  882. pop bp
  883. (*%E *)
  884. (*%E *)
  885. (*%F NearCall *)
  886. ret far 0
  887. (*%E *)
  888. (*%T NearCall *)
  889. ret 0
  890. (*%E *)
  891. dw __DelayTag
  892. (*%E _WINDOWS *)
  893. (*%E _OS2 *)
  894. section
  895. (*%F _OS2 *)
  896. (****************************************************************************)
  897. segment _TEXT(CODE,28H)
  898. extrn __ioerr
  899. public __pascreate :
  900. (*%T _DLLOVL *)
  901. push bp
  902. mov bp, sp
  903. (*%E *)
  904. push cx
  905. push dx
  906. (*%F NearPtr *)
  907. push ds
  908. (*%E *)
  909. (*%F NearPtr *)
  910. mov ds, bx
  911. (*%E *)
  912. mov dx, ax
  913. sub cx, cx
  914. mov ah, 3CH
  915. extrn @DosInterrupt
  916. (*%F NearCall *)
  917. call far @DosInterrupt
  918. (*%E *)
  919. (*%T NearCall *)
  920. call @DosInterrupt
  921. (*%E *)
  922. jnc creattOK
  923. (*%F NearCall *)
  924. call far __ioerr (* set errno *)
  925. (*%E *)
  926. (*%T NearCall *)
  927. call __ioerr (* set errno *)
  928. (*%E *)
  929. mov ax, -1 (* return -1 *)
  930. creattOK:
  931. (*%F NearPtr *)
  932. pop ds
  933. (*%E *)
  934. pop dx
  935. pop cx
  936. (*%T _DLLOVL *)
  937. pop bp
  938. (*%E *)
  939. (*%F NearCall *)
  940. ret far 0
  941. (*%E *)
  942. (*%T NearCall *)
  943. ret 0
  944. (*%E *)
  945. (*%E _OS2 *)
  946. section
  947. (*%F _OS2 *)
  948. (****************************************************************************)
  949. segment _TEXT(CODE,28H)
  950. extrn __ioerr
  951. public __pasopen :
  952. (*%T _DLLOVL *)
  953. push bp
  954. mov bp, sp
  955. (*%E *)
  956. (*%T NearPtr *)
  957. push cx
  958. (*%E *)
  959. push dx
  960. (*%F NearPtr *)
  961. push ds
  962. mov ds, bx
  963. (*%E *)
  964. mov dx, ax
  965. mov ah, 3DH
  966. (*%F NearPtr *)
  967. mov al, cl
  968. (*%E *)
  969. (*%T NearPtr *)
  970. mov al, bl
  971. (*%E *)
  972. extrn @DosInterrupt
  973. (*%F NearCall *)
  974. call far @DosInterrupt
  975. (*%E *)
  976. (*%T NearCall *)
  977. call @DosInterrupt
  978. (*%E *)
  979. jnc openOK
  980. (*%F NearCall *)
  981. call far __ioerr (* set errno *)
  982. (*%E *)
  983. (*%T NearCall *)
  984. call __ioerr (* set errno *)
  985. (*%E *)
  986. mov ax, -1 (* return -1 *)
  987. openOK:
  988. (*%F NearPtr *)
  989. pop ds
  990. (*%E *)
  991. pop dx
  992. (*%T NearPtr *)
  993. pop cx
  994. (*%E *)
  995. (*%T _DLLOVL *)
  996. pop bp
  997. (*%E *)
  998. (*%F NearCall *)
  999. ret far 0
  1000. (*%E *)
  1001. (*%T NearCall *)
  1002. ret 0
  1003. (*%E *)
  1004. (*%E _OS2 *)
  1005. section
  1006. (*%F _OS2 *)
  1007. (****************************************************************************)
  1008. segment _TEXT(CODE,28H)
  1009. segment _BSS(BSS,28H)
  1010. TempDTA: org DTA_SIZE
  1011. select _TEXT
  1012. public __exists :
  1013. (*%T _DLLOVL *)
  1014. push bp
  1015. mov bp, sp
  1016. (*%E *)
  1017. (*%F NearPtr *)
  1018. push ds
  1019. (*%E *)
  1020. push ax
  1021. push dx
  1022. (*%F NearPtr *)
  1023. mov ax, _BSS
  1024. mov ds, ax
  1025. (*%E *)
  1026. mov dx, TempDTA
  1027. mov ah, 1AH
  1028. extrn @DosInterrupt
  1029. (*%F NearCall *)
  1030. call far @DosInterrupt
  1031. (*%E *)
  1032. (*%T NearCall *)
  1033. call @DosInterrupt
  1034. (*%E *)
  1035. pop dx
  1036. pop ax
  1037. (*%F NearPtr *)
  1038. mov ds, ax
  1039. (*%E *)
  1040. mov ax, 4E00H
  1041. sub cx, cx
  1042. (*%F NearCall *)
  1043. call far @DosInterrupt
  1044. (*%E *)
  1045. (*%T NearCall *)
  1046. call @DosInterrupt
  1047. (*%E *)
  1048. mov al, 0
  1049. jc notThere
  1050. inc al
  1051. notThere:
  1052. (*%F NearPtr *)
  1053. pop ds
  1054. (*%E *)
  1055. (*%T _DLLOVL *)
  1056. pop bp
  1057. (*%E *)
  1058. (*%F NearCall *)
  1059. ret far 0
  1060. (*%E *)
  1061. (*%T NearCall *)
  1062. ret 0
  1063. (*%E *)
  1064. (*%E _OS2 *)
  1065. section
  1066. (*%F _OS2 *)
  1067. (*************************************************************************)
  1068. segment _DATA(DATA,28H)
  1069. segment _TEXT(CODE,28H)
  1070. (* External data *)
  1071. extrn __ioerr
  1072. public __read :
  1073. (* int _read(int handle, void *buffer, int num)
  1074. reads num bytes from file handle int buffer.
  1075. Returns number of bytes read or -1 for error. *)
  1076. (*%F RegParam *)
  1077. handle = frame
  1078. buffer = 2+frame
  1079. (*%F NearPtr *)
  1080. num = 6+frame
  1081. (*%E *)
  1082. (*%T NearPtr *)
  1083. num = 4+frame
  1084. (*%E *)
  1085. push bp
  1086. mov bp, sp
  1087. push bx
  1088. push cx
  1089. push dx
  1090. (*%F NearPtr *)
  1091. push ds
  1092. (*%E *)
  1093. mov ah, 3FH
  1094. mov bx, [bp][handle]
  1095. mov cx, [bp][num]
  1096. (*%F NearPtr *)
  1097. lds dx, [bp][buffer]
  1098. (*%E *)
  1099. (*%T NearPtr *)
  1100. mov dx, [bp][buffer]
  1101. (*%E *)
  1102. extrn @DosInterrupt
  1103. (*%F NearCall *)
  1104. call far @DosInterrupt
  1105. (*%E *)
  1106. (*%T NearCall *)
  1107. call @DosInterrupt
  1108. (*%E *)
  1109. jnc readOK
  1110. (*%F NearCall *)
  1111. call far __ioerr (* set errno *)
  1112. (*%E *)
  1113. (*%T NearCall *)
  1114. call __ioerr (* set errno *)
  1115. (*%E *)
  1116. mov ax, -1 (* return -1 *)
  1117. readOK:
  1118. (*%F NearPtr *)
  1119. pop ds
  1120. (*%E *)
  1121. pop dx
  1122. pop cx
  1123. pop bx
  1124. pop bp (* number already in ax *)
  1125. (*%F NearCall *)
  1126. ret far 0
  1127. (*%E *)
  1128. (*%T NearCall *)
  1129. ret 0
  1130. (*%E *)
  1131. (*%E RegParam *)
  1132. (*%T RegParam *)
  1133. (*%T NearPtr *)
  1134. push dx
  1135. (*%E *)
  1136. (*%F NearPtr *)
  1137. push ds
  1138. (*%E *)
  1139. (*%F NearPtr *)
  1140. mov ds, cx
  1141. push dx
  1142. mov dx, bx
  1143. mov bx, ax
  1144. pop cx
  1145. (*%E *)
  1146. (*%T NearPtr *)
  1147. mov dx, bx
  1148. mov bx, ax
  1149. (*%E *)
  1150. mov ah, 3FH
  1151. extrn @DosInterrupt
  1152. (*%F NearCall *)
  1153. call far @DosInterrupt
  1154. (*%E *)
  1155. (*%T NearCall *)
  1156. call @DosInterrupt
  1157. (*%E *)
  1158. jnc readOK
  1159. (*%F NearCall *)
  1160. call far __ioerr (* set errno *)
  1161. (*%E *)
  1162. (*%T NearCall *)
  1163. call __ioerr (* set errno *)
  1164. (*%E *)
  1165. mov ax, -1 (* return -1 *)
  1166. readOK:
  1167. (*%F NearPtr *)
  1168. pop ds
  1169. (*%E *)
  1170. (*%T NearPtr *)
  1171. pop dx
  1172. (*%E *)
  1173. (*%F NearCall *)
  1174. ret far 0
  1175. (*%E *)
  1176. (*%T NearCall *)
  1177. ret 0
  1178. (*%E *)
  1179. (*%E RegParam *)
  1180. (*%E _OS2 *)
  1181. section
  1182. (*%F _OS2 *)
  1183. (*************************************************************************)
  1184. segment _TEXT(CODE,28H)
  1185. segment _DATA(DATA,28H)
  1186. __appbuf : db 0
  1187. extrn _lseek
  1188. extrn __write
  1189. extrn __ioerr
  1190. extrn __openfd
  1191. extrn __open_max
  1192. select _TEXT
  1193. (*%F RegParam *)
  1194. handle = frame
  1195. buffer = 2+frame
  1196. (*%F NearPtr *)
  1197. num = 6+frame
  1198. (*%E *)
  1199. (*%T NearPtr *)
  1200. num = 4+frame
  1201. (*%E *)
  1202. temp = -4
  1203. writesize = -6
  1204. flag = -7
  1205. reset = -8
  1206. dgroup = -10
  1207. locals = 10
  1208. (*%E *)
  1209. (*%T RegParam *)
  1210. handle = -12
  1211. buffer = -16
  1212. num = -18
  1213. temp = -4
  1214. writesize = -6
  1215. flag = -7
  1216. reset = -8
  1217. dgroup = -10
  1218. locals = 18
  1219. (*%E *)
  1220. WRITE_BUF_SIZE = 401H
  1221. public _write :
  1222. push bp
  1223. mov bp, sp
  1224. sub sp, locals
  1225. (*%F RegParam *)
  1226. push bx
  1227. push cx
  1228. push dx
  1229. (*%E *)
  1230. (*%T RegParam *)
  1231. (*%T NearPtr *)
  1232. push dx
  1233. (*%E *)
  1234. (*%E *)
  1235. push di
  1236. push si
  1237. push ds
  1238. (*%T RegParam *)
  1239. mov [bp][handle], ax
  1240. (*%F NearPtr *)
  1241. mov [bp][buffer], bx
  1242. mov [bp][buffer][2], cx
  1243. mov [bp][num], dx
  1244. (*%E *)
  1245. (*%T NearPtr *)
  1246. mov [bp][buffer], bx
  1247. mov [bp][num], cx
  1248. (*%E *)
  1249. (*%E *)
  1250. (*%F SameDS *)
  1251. mov ax, _DATA
  1252. mov ds, ax
  1253. (*%E *)
  1254. mov [bp][dgroup], ds
  1255. mov byte [bp][reset], 0
  1256. mov bx, [bp][handle]
  1257. (*%T _WINDOWS *)
  1258. cmp bx, [__open_max]
  1259. jb hrOK
  1260. mov ax, EBADF
  1261. jmp near writeError
  1262. hrOK:
  1263. (*%E *)
  1264. add bx, bx
  1265. mov cx, [__openfd][bx]
  1266. (*%T _WINDOWS *)
  1267. or cx, cx
  1268. jnz descOK
  1269. mov cx, O_RDWR|O_BINARY
  1270. mov [__openfd][bx], cx
  1271. descOK:
  1272. (*%E *)
  1273. (*%F _WINDOWS *)
  1274. jcxz near writeInvalid
  1275. (*%E *)
  1276. test cx, O_RDWR+O_WRONLY (* test for correct access mode *)
  1277. je near writeAccess
  1278. cmp word [bp][num], 0
  1279. je near writeEOF (* don't write zero bytes *)
  1280. test cx, O_APPEND
  1281. je dontAppend
  1282. mov di, cx (* append to EOF if flag set *)
  1283. sub ax, ax
  1284. mov dx, SEEK_END
  1285. test cx, O_TEXT
  1286. jz appNotText
  1287. dec ax
  1288. (*%F RegParam *)
  1289. push dx
  1290. push ax
  1291. push ax
  1292. push [bp][handle]
  1293. (*%E *)
  1294. (*%T RegParam *)
  1295. mov cx, ax
  1296. mov bx, ax
  1297. mov ax, [bp][handle]
  1298. (*%E *)
  1299. (*%F NearCall *)
  1300. call far _lseek
  1301. (*%E *)
  1302. (*%T NearCall *)
  1303. call _lseek
  1304. (*%E *)
  1305. (*%F RegParam *)
  1306. add sp, 8
  1307. (*%E *)
  1308. cmp dx, -1
  1309. je nextSeek
  1310. cmp ax, -1
  1311. je nextSeek
  1312. mov ah, 03FH
  1313. mov bx, [bp][handle]
  1314. mov cx, 1
  1315. mov dx, __appbuf
  1316. extrn @DosInterrupt
  1317. (*%F NearCall *)
  1318. call far @DosInterrupt
  1319. (*%E *)
  1320. (*%T NearCall *)
  1321. call @DosInterrupt
  1322. (*%E *)
  1323. jc near writeError
  1324. mov ax, -1
  1325. mov dx, SEEK_END
  1326. cmp byte [__appbuf], CTLZ
  1327. je ctlzPresent
  1328. inc ax
  1329. ctlzPresent:
  1330. jmp appNotText
  1331. nextSeek:
  1332. (*%F RegParam *)
  1333. mov dx, SEEK_END
  1334. sub ax, ax
  1335. appNotText:
  1336. push dx
  1337. push ax
  1338. push ax
  1339. push [bp][handle]
  1340. (*%E *)
  1341. (*%T RegParam *)
  1342. mov dx, SEEK_END
  1343. sub ax, ax
  1344. appNotText:
  1345. mov cx, ax
  1346. mov bx, ax
  1347. mov ax, [bp][handle]
  1348. (*%E *)
  1349. (*%F NearCall *)
  1350. call far _lseek
  1351. (*%E *)
  1352. (*%T NearCall *)
  1353. call _lseek
  1354. (*%E *)
  1355. (*%F RegParam *)
  1356. add sp, 8
  1357. (*%E *)
  1358. appendDone:
  1359. mov cx, di
  1360. dontAppend:
  1361. test cx, O_TEXT
  1362. je near writeBinary
  1363. writeText: (* test mode *)
  1364. test cx, _O_EOF (* error if EOF flag set *)
  1365. jne near writeEOF
  1366. (*%T StackChecks *)
  1367. push bp
  1368. mov bp, WRITE_BUF_SIZE+6
  1369. (*%F NearCall *)
  1370. extrn F$StkChk
  1371. call far F$StkChk
  1372. (*%E *)
  1373. (*%T NearCall *)
  1374. extrn N$StkChk
  1375. call N$StkChk
  1376. (*%E *)
  1377. pop bp
  1378. (*%E *)
  1379. mov di, WRITE_BUF_SIZE
  1380. sub sp, di
  1381. mov [bp][temp][2], ss
  1382. mov [bp][temp], sp
  1383. inc word [bp][temp]
  1384. not byte [bp][reset]
  1385. gotbuf:
  1386. mov cx, [bp][num]
  1387. shr di, 1 (* write size is half that of buffer *)
  1388. mov [bp][writesize], di
  1389. (*%F NearPtr *)
  1390. lds si, [bp][buffer]
  1391. (*%E *)
  1392. (*%T NearPtr *)
  1393. mov si, [bp][buffer]
  1394. (*%E *)
  1395. writeMainLoop: (* main loop - translate and *)
  1396. mov cx, [bp][num] (* write a block *)
  1397. jcxz allWritten
  1398. cmp cx, [bp][writesize] (* exit when all written *)
  1399. jb cxRight
  1400. mov cx, [bp][writesize]
  1401. cxRight:
  1402. sub [bp][num], cx
  1403. les di, [bp][temp]
  1404. mov ah, 0AH
  1405. mov es:[di][-1], ah (* Dummy at buffer-1 *)
  1406. mov bh, CTLZ
  1407. mov bl, 0DH
  1408. (* this next loop is the time *)
  1409. writeTransLoop: (* one where transaltion takes place *)
  1410. lodsb
  1411. cmp al, ah
  1412. je doTrans (* no jump for no translate *)
  1413. doneTrans:
  1414. stosb
  1415. cmp al, bh
  1416. je writeCtlz (* ctl Z - terminate output *)
  1417. dec cx
  1418. jcxz writeBlock (* repeat loop body *)
  1419. lodsb
  1420. cmp al, ah
  1421. je doTrans
  1422. stosb
  1423. cmp al, bh
  1424. je writeCtlz
  1425. loop writeTransLoop
  1426. jmp writeBlock
  1427. doTrans:
  1428. cmp es:[di][-1], bl (* CR inserted here *)
  1429. je doneTrans
  1430. mov es:[di], bl
  1431. inc di
  1432. jmp doneTrans
  1433. writeCtlz:
  1434. mov byte [bp][flag], 1
  1435. jmp writeWrite
  1436. writeBlock:
  1437. mov byte [bp][flag], 0 (* write transalted block *)
  1438. writeWrite:
  1439. push cx
  1440. push ds
  1441. mov ah, 40H
  1442. mov bx, [bp][handle]
  1443. lds dx, [bp][temp]
  1444. sub di, dx
  1445. mov cx, di
  1446. extrn @DosInterrupt
  1447. (*%F NearCall *)
  1448. call far @DosInterrupt
  1449. (*%E *)
  1450. (*%T NearCall *)
  1451. call @DosInterrupt
  1452. (*%E *)
  1453. pop ds
  1454. pop cx
  1455. jc writeError (* write error *)
  1456. cmp ax, di
  1457. jne writeFull (* media full *)
  1458. writeOK:
  1459. cmp byte [bp][flag], 0
  1460. je writeMainLoop (* go back for another block *)
  1461. allWritten:
  1462. (*%F NearPtr *)
  1463. mov ds, [bp][dgroup] (* output done *)
  1464. (*%E *)
  1465. mov bx, [bp][handle]
  1466. shl bx, 1
  1467. cmp byte [bp][flag], 0
  1468. je dontSet
  1469. test word [__openfd][bx], O_DEVICE (* if !device and ctl Z set EOF flag *)
  1470. jne dontSet
  1471. or word [__openfd][bx], _O_EOF
  1472. dontSet:
  1473. sub si, [bp][buffer]
  1474. jmp writeDone
  1475. writeBinary: (* binary output done here *)
  1476. mov ah, 40H
  1477. mov bx, [bp][handle]
  1478. mov cx, [bp][num]
  1479. (*%F NearPtr *)
  1480. lds dx, [bp][buffer]
  1481. (*%E *)
  1482. (*%T NearPtr *)
  1483. mov dx, [bp][buffer]
  1484. (*%E *)
  1485. extrn @DosInterrupt
  1486. (*%F NearCall *)
  1487. call far @DosInterrupt
  1488. (*%E *)
  1489. (*%T NearCall *)
  1490. call @DosInterrupt
  1491. (*%E *)
  1492. jc writeError
  1493. mov si, ax
  1494. (*%F NearPtr *)
  1495. mov ds, [bp][dgroup]
  1496. (*%E *)
  1497. shl bx, 1
  1498. writeDone:
  1499. or word [__openfd][bx], O_CHANGED (* set file changed flag *)
  1500. writeEnd:
  1501. cmp byte [bp][reset], 0
  1502. je writeNoStack
  1503. add sp, WRITE_BUF_SIZE
  1504. writeNoStack:
  1505. mov ax, si (* return *)
  1506. pop ds
  1507. pop si
  1508. pop di
  1509. (*%F RegParam *)
  1510. pop dx
  1511. pop cx
  1512. pop bx
  1513. (*%E *)
  1514. (*%T RegParam *)
  1515. (*%T NearPtr *)
  1516. pop dx
  1517. (*%E *)
  1518. (*%E *)
  1519. mov sp, bp
  1520. pop bp
  1521. (*%F NearCall *)
  1522. ret far 0
  1523. (*%E *)
  1524. (*%T NearCall *)
  1525. ret 0
  1526. (*%E *)
  1527. writeError: (* error return *)
  1528. mov si, -1
  1529. mov bx, ax
  1530. jmp writeSetErr
  1531. writeEOF: (* EOF return *)
  1532. sub si, si
  1533. jmp writeEnd
  1534. writeFull: (* media full *)
  1535. mov bx, ENOSPC
  1536. mov si, ax
  1537. jmp writeSetErr
  1538. writeAccess: (* invalid access mode *)
  1539. mov si, -1
  1540. mov bx, EACCESS
  1541. jmp writeSetErr
  1542. writeInvalid: (* bad file *)
  1543. mov si, -1
  1544. mov bx, EBADF
  1545. jmp writeSetErr
  1546. writeNomem: (* no memory for buffer *)
  1547. mov bx, ENOMEM
  1548. writeSetErr: (* set errno *)
  1549. mov ax, bx
  1550. (*%F NearCall *)
  1551. call far __ioerr (* set errno *)
  1552. (*%E *)
  1553. (*%T NearCall *)
  1554. call __ioerr (* set errno *)
  1555. (*%E *)
  1556. jmp writeEnd
  1557. (*%E _OS2 *)
  1558. section
  1559. (*%F _OS2 *)
  1560. (*************************************************************************)
  1561. segment _DATA(DATA,28H)
  1562. segment _TEXT(CODE,28H)
  1563. extrn __openfd
  1564. extrn __open_max
  1565. extrn __ioerr
  1566. extrn @DosInterrupt
  1567. (* int read(int handle,void *buf,unsigned num); *)
  1568. (*%F RegParam *)
  1569. handle = frame
  1570. buffer = frame+2
  1571. (*%T NearPtr *)
  1572. num = frame+4
  1573. (*%E *)
  1574. (*%F NearPtr *)
  1575. num = frame+6
  1576. (*%E *)
  1577. dgroup = -2
  1578. locals = 2
  1579. (*%E *)
  1580. (*%T RegParam *)
  1581. handle = -2
  1582. buffer = -6
  1583. num = -8
  1584. dgroup = -10
  1585. locals = 10
  1586. (*%E *)
  1587. public _read :
  1588. push bp
  1589. mov bp, sp
  1590. sub sp, locals
  1591. (*%F RegParam *)
  1592. push bx
  1593. push cx
  1594. push dx
  1595. (*%E *)
  1596. (*%T RegParam *)
  1597. (*%T NearPtr *)
  1598. push dx
  1599. (*%E *)
  1600. (*%E *)
  1601. push di
  1602. push si
  1603. push ds
  1604. (*%F SameDS *)
  1605. mov di, _DATA
  1606. mov ds, di
  1607. (*%E *)
  1608. mov [bp][dgroup], ds
  1609. (*%T RegParam *)
  1610. (*%T NearPtr *)
  1611. jcxz near $ReadEOF
  1612. mov [bp][num], cx
  1613. (*%E *)
  1614. mov [bp][handle], ax
  1615. mov [bp][buffer], bx
  1616. (*%F NearPtr *)
  1617. mov [bp][buffer][2], cx
  1618. mov [bp][num], dx
  1619. (*%E *)
  1620. mov bx, ax
  1621. (*%E RegParam *)
  1622. (*%F RegParam *)
  1623. mov bx, [bp][handle]
  1624. (*%E *)
  1625. (*%T _WINDOWS *)
  1626. cmp bx, [__open_max]
  1627. jb $ReadHrOK
  1628. mov ax, EBADF
  1629. jmp near $ReadError
  1630. $ReadHrOK:
  1631. (*%E *)
  1632. shl bx, 1
  1633. mov cx, [__openfd][bx]
  1634. (*%T _WINDOWS *)
  1635. or cx, cx
  1636. jnz $ReadDescOK
  1637. mov cx, O_RDWR|O_BINARY
  1638. mov [__openfd][bx], cx
  1639. $ReadDescOK:
  1640. (*%E *)
  1641. (*%F _WINDOWS *)
  1642. jcxz near $ReadInvalid
  1643. (*%E *)
  1644. test cx, O_WRONLY
  1645. jne near $ReadAccess (* access mode invalid *)
  1646. (*%F RegParam *)
  1647. cmp word [bp][num], 0 (* read zero - do nothing *)
  1648. je near $ReadEOF
  1649. (*%E *)
  1650. (*%T RegParam *)
  1651. (*%F NearPtr *)
  1652. cmp word [bp][num], 0 (* read zero - do nothing *)
  1653. je near $ReadEOF
  1654. (*%E *)
  1655. (*%E *)
  1656. test cx, O_TEXT
  1657. je near $ReadBinary
  1658. $ReadText: (* test mode *)
  1659. test cx, _O_EOF
  1660. jne near $ReadEOF (* error - EOF flag set *)
  1661. mov ah, 3FH (* read into user buffer *)
  1662. mov bx, [bp][handle]
  1663. mov cx, [bp][num]
  1664. (*%F NearPtr *)
  1665. lds dx, [bp][buffer] (* set ds:dx to buffer for DOS call *)
  1666. (*%E *)
  1667. (*%T NearPtr *)
  1668. mov dx, [bp][buffer]
  1669. (*%E *)
  1670. mov si, dx (* set ds:si to buffer for later *)
  1671. (*%F NearCall *)
  1672. call far @DosInterrupt
  1673. (*%E *)
  1674. (*%T NearCall *)
  1675. call @DosInterrupt
  1676. (*%E *)
  1677. jc near $ReadError
  1678. $ReadOK:
  1679. mov cx, ax
  1680. jcxz $ReadCtlz
  1681. mov bh, CTLZ
  1682. cmp cx, 1
  1683. jne $ReadOneContinue
  1684. mov bl, [si]
  1685. inc si
  1686. cmp bl, bh
  1687. je $ReadCtlz
  1688. dec si
  1689. cmp word [bp][num], 1
  1690. je $ReadExit
  1691. $ReadOneContinue:
  1692. mov ah, 0DH
  1693. $ReadTransLoop: (* translation loop *)
  1694. lodsb
  1695. cmp al, ah
  1696. je $ReadMissCR (* skip LF *)
  1697. stosb
  1698. cmp al, bh
  1699. je $ReadCtlz (* hit ctl Z - terminate input *)
  1700. $ReadMissCR:
  1701. loop $ReadTransLoop
  1702. jmp $ReadDone
  1703. $ReadCtlz:
  1704. (*%F NearPtr *)
  1705. mov ds, [bp][dgroup]
  1706. (*%E *)
  1707. mov bx, [bp][handle]
  1708. shl bx, 1
  1709. test word [__openfd][bx], O_DEVICE (* if !device + ctl Z set EOF *)
  1710. jne $ReadDontSet
  1711. or word [__openfd][bx], _O_EOF
  1712. jcxz $ReadDontSet
  1713. dec si
  1714. $ReadDontSet:
  1715. jmp $ReadDone
  1716. $ReadBinary: (* binary read done here *)
  1717. mov ah, 3FH
  1718. mov bx, [bp][handle]
  1719. mov cx, [bp][num]
  1720. (*%F NearPtr *)
  1721. lds dx, [bp][buffer]
  1722. (*%E *)
  1723. (*%T NearPtr *)
  1724. mov dx, [bp][buffer]
  1725. (*%E *)
  1726. mov si, dx
  1727. (*%F NearCall *)
  1728. call far @DosInterrupt
  1729. (*%E *)
  1730. (*%T NearCall *)
  1731. call @DosInterrupt
  1732. (*%E *)
  1733. jnc $ReadExit
  1734. jmp $ReadError
  1735. $ReadDone:
  1736. sub si, [bp][buffer]
  1737. $ReadEnd:
  1738. mov ax, si
  1739. $ReadExit:
  1740. pop ds
  1741. pop si
  1742. pop di
  1743. (*%F RegParam *)
  1744. pop dx
  1745. pop cx
  1746. pop bx
  1747. (*%E *)
  1748. (*%T RegParam *)
  1749. (*%T NearPtr *)
  1750. pop dx
  1751. (*%E *)
  1752. (*%E *)
  1753. mov sp, bp
  1754. pop bp
  1755. (*%F NearCall *)
  1756. ret far 0
  1757. (*%E *)
  1758. (*%T NearCall *)
  1759. ret 0
  1760. (*%E *)
  1761. $ReadError: (* return error *)
  1762. mov si, -1
  1763. mov bx, ax
  1764. jmp $ReadSetErr
  1765. $ReadEOF: (* return EOF *)
  1766. sub si, si
  1767. jmp $ReadEnd
  1768. $ReadAccess: (* invbalid access mode *)
  1769. mov si, -1
  1770. mov bx, EACCESS
  1771. jmp $ReadSetErr
  1772. $ReadInvalid: (* file not open *)
  1773. mov si, -1
  1774. mov bx, EBADF
  1775. $ReadSetErr: (* set errno *)
  1776. mov ax, bx
  1777. (*%F NearCall *)
  1778. call far __ioerr (* set errno *)
  1779. (*%E *)
  1780. (*%T NearCall *)
  1781. call __ioerr (* set errno *)
  1782. (*%E *)
  1783. jmp $ReadEnd
  1784. (*%E _OS2 *)
  1785. section
  1786. (*%F _OS2 *)
  1787. (*************************************************************************)
  1788. segment _DATA(DATA,28H)
  1789. segment _TEXT(CODE,28H)
  1790. (* External data *)
  1791. extrn __ioerr
  1792. public __write :
  1793. (* int _write(int handle, void *buffer, int num)
  1794. writes num bytes to file handle from buffer.
  1795. Returns number of bytes written or -1 for error.
  1796. Low level DOS function. *)
  1797. (*%F RegParam *)
  1798. handle = frame
  1799. buffer = 2+frame
  1800. (*%F NearPtr *)
  1801. num = 6+frame
  1802. (*%E *)
  1803. (*%T NearPtr *)
  1804. num = 4+frame
  1805. (*%E *)
  1806. push bp
  1807. mov bp, sp
  1808. push bx
  1809. push cx
  1810. push dx
  1811. push ds
  1812. mov ah, 40H
  1813. mov bx, [bp][handle]
  1814. mov cx, [bp][num]
  1815. (*%F NearPtr *)
  1816. lds dx, [bp][buffer]
  1817. (*%E *)
  1818. (*%T NearPtr *)
  1819. mov dx, [bp][buffer]
  1820. (*%E *)
  1821. extrn @DosInterrupt
  1822. (*%F NearCall *)
  1823. call far @DosInterrupt
  1824. (*%E *)
  1825. (*%T NearCall *)
  1826. call @DosInterrupt
  1827. (*%E *)
  1828. jnc writeOK
  1829. (*%F NearCall *)
  1830. call far __ioerr (* set errno *)
  1831. (*%E *)
  1832. (*%T NearCall *)
  1833. call __ioerr (* set errno *)
  1834. (*%E *)
  1835. mov ax, -1 (* return -1 *)
  1836. writeOK:
  1837. pop ds
  1838. pop dx
  1839. pop cx
  1840. pop bx
  1841. pop bp (* number already in ax *)
  1842. (*%F NearCall *)
  1843. ret far 0
  1844. (*%E *)
  1845. (*%T NearCall *)
  1846. ret 0
  1847. (*%E *)
  1848. (*%E RegParam *)
  1849. (*%T RegParam *)
  1850. (*%T NearPtr *)
  1851. push dx
  1852. (*%E *)
  1853. push ds
  1854. (*%F NearPtr *)
  1855. push dx
  1856. mov dx, bx
  1857. mov ds, cx
  1858. mov bx, ax
  1859. pop cx
  1860. (*%E *)
  1861. (*%T NearPtr *)
  1862. mov dx, bx
  1863. mov bx, ax
  1864. (*%E *)
  1865. mov ah, 40H
  1866. extrn @DosInterrupt
  1867. (*%F NearCall *)
  1868. call far @DosInterrupt
  1869. (*%E *)
  1870. (*%T NearCall *)
  1871. call @DosInterrupt
  1872. (*%E *)
  1873. jnc writeOK
  1874. (*%F NearCall *)
  1875. call far __ioerr (* set errno *)
  1876. (*%E *)
  1877. (*%T NearCall *)
  1878. call __ioerr (* set errno *)
  1879. (*%E *)
  1880. mov ax, -1 (* return -1 *)
  1881. writeOK:
  1882. pop ds
  1883. (*%T NearPtr *)
  1884. pop dx
  1885. (*%E *)
  1886. (*%F NearCall *)
  1887. ret far 0
  1888. (*%E *)
  1889. (*%T NearCall *)
  1890. ret 0
  1891. (*%E *)
  1892. (*%E RegParam *)
  1893. (*%E _OS2 *)
  1894. section
  1895. (*%F _OS2 *)
  1896. (****************************************************************************)
  1897. segment _DATA(DATA,28H)
  1898. segment _TEXT(CODE,28H)
  1899. extrn __ioerr
  1900. public __eof :
  1901. (* int _eof(int handle)
  1902. returns file status - EOF 1, error -1, else 0. *)
  1903. (*%F RegParam *)
  1904. handle = frame
  1905. push bp
  1906. mov bp, sp
  1907. push bx
  1908. mov bx, [bp][handle]
  1909. mov ah, 44H
  1910. mov al, 6
  1911. extrn @DosInterrupt
  1912. (*%F NearCall *)
  1913. call far @DosInterrupt
  1914. (*%E *)
  1915. (*%T NearCall *)
  1916. call @DosInterrupt
  1917. (*%E *)
  1918. jnc eofOK
  1919. (*%F NearCall *)
  1920. call far __ioerr (* set errno *)
  1921. (*%E *)
  1922. (*%T NearCall *)
  1923. call __ioerr (* set errno *)
  1924. (*%E *)
  1925. mov ax, -1 (* return -1 *)
  1926. jmp eofDone
  1927. eofOK: (* return status, 1 if EOF *)
  1928. inc ax
  1929. cbw
  1930. eofDone:
  1931. pop bx
  1932. pop bp
  1933. (*%F NearCall *)
  1934. ret far 0
  1935. (*%E *)
  1936. (*%T NearCall *)
  1937. ret 0
  1938. (*%E *)
  1939. (*%E RegParam *)
  1940. (*%T RegParam *)
  1941. (*%T _DLLOVL *)
  1942. push bp
  1943. mov bp, sp
  1944. (*%E *)
  1945. push bx
  1946. mov bx, ax
  1947. mov ax, 4406H
  1948. extrn @DosInterrupt
  1949. (*%F NearCall *)
  1950. call far @DosInterrupt
  1951. (*%E *)
  1952. (*%T NearCall *)
  1953. call @DosInterrupt
  1954. (*%E *)
  1955. jnc eofOK
  1956. (*%F NearCall *)
  1957. call far __ioerr (* set errno *)
  1958. (*%E *)
  1959. (*%T NearCall *)
  1960. call __ioerr (* set errno *)
  1961. (*%E *)
  1962. mov ax, -1 (* return -1 *)
  1963. jmp eofDone
  1964. eofOK: (* return status, 1 if EOF *)
  1965. inc ax
  1966. cbw
  1967. eofDone:
  1968. pop bx
  1969. (*%T _DLLOVL *)
  1970. pop bp
  1971. (*%E *)
  1972. (*%F NearCall *)
  1973. ret far 0
  1974. (*%E *)
  1975. (*%T NearCall *)
  1976. ret 0
  1977. (*%E *)
  1978. (*%E RegParam *)
  1979. (*%E _OS2 *)
  1980. section
  1981. (*%F _OS2 *)
  1982. (******************************************************************************)
  1983. segment _DATA(DATA,28H)
  1984. segment _TEXT(CODE,28H)
  1985. public _isatty :
  1986. (* int isatty (int handle)
  1987. The return value is true (1) if handle is attached to a character device
  1988. such as the console or printer, or false (0) if handle is for an ordinary
  1989. file or is not valid. *)
  1990. (*%F RegParam *)
  1991. handle = frame
  1992. push bp
  1993. mov bp, sp
  1994. push bx
  1995. push dx
  1996. mov bx, [bp][frame]
  1997. mov ax, 4400H (* IOCTL, get device information *)
  1998. extrn @DosInterrupt
  1999. (*%F NearCall *)
  2000. call far @DosInterrupt
  2001. (*%E *)
  2002. (*%T NearCall *)
  2003. call @DosInterrupt
  2004. (*%E *)
  2005. sub ax, ax (* simple error return 0 *)
  2006. jc isattyDone
  2007. test dx, 80H (* test for file flags *)
  2008. je isattyDone
  2009. mov ax, dx
  2010. isattyDone:
  2011. pop dx
  2012. pop bx
  2013. pop bp
  2014. (*%F NearCall *)
  2015. ret far 0
  2016. (*%E *)
  2017. (*%T NearCall *)
  2018. ret 0
  2019. (*%E *)
  2020. (*%E RegParam *)
  2021. (*%T RegParam *)
  2022. (*%T _DLLOVL *)
  2023. push bp
  2024. mov bp, sp
  2025. (*%E *)
  2026. push bx
  2027. push dx
  2028. mov bx, ax
  2029. mov ax, 4400H (* IOCTL, get device information *)
  2030. extrn @DosInterrupt
  2031. (*%F NearCall *)
  2032. call far @DosInterrupt
  2033. (*%E *)
  2034. (*%T NearCall *)
  2035. call @DosInterrupt
  2036. (*%E *)
  2037. sub ax, ax (* simple error return 0 *)
  2038. jc isattyDone
  2039. test dx, 80H (* test for file flags *)
  2040. je isattyDone
  2041. mov ax, dx
  2042. isattyDone:
  2043. pop dx
  2044. pop bx
  2045. (*%T _DLLOVL *)
  2046. pop bp
  2047. (*%E *)
  2048. (*%F NearCall *)
  2049. ret far 0
  2050. (*%E *)
  2051. (*%T NearCall *)
  2052. ret 0
  2053. (*%E *)
  2054. (*%E RegParam *)
  2055. (*%E _OS2 *)
  2056. section
  2057. (*%F _OS2 *)
  2058. (*****************************************************************************)
  2059. segment _BSS(BSS,28H)
  2060. segment _TEXT(CODE,28H)
  2061. extrn __openfd
  2062. extrn __ioerr
  2063. extrn @DosInterrupt
  2064. (* long lseek(int handle, long offset, int where)
  2065. positions handles file pointer and returns new offset. *)
  2066. public _lseek:
  2067. (*%F RegParam *)
  2068. handle = frame
  2069. ofset = 2+frame
  2070. where = 6+frame
  2071. push bp
  2072. mov bp, sp
  2073. mov ah, 42H
  2074. mov al, [bp][where]
  2075. mov dx, [bp][ofset]
  2076. mov cx, [bp][ofset][2]
  2077. mov bx, [bp][handle]
  2078. extrn @DosInterrupt
  2079. (*%F NearCall *)
  2080. call far @DosInterrupt
  2081. (*%E *)
  2082. (*%T NearCall *)
  2083. call @DosInterrupt
  2084. (*%E *)
  2085. jc seekErr
  2086. (*%F SameDS *)
  2087. push ds
  2088. mov cx, seg __openfd
  2089. mov ds, cx
  2090. (*%E *)
  2091. add bx, bx
  2092. and word [__openfd][bx], ~_O_EOF
  2093. (*%F SameDS *)
  2094. pop ds
  2095. (*%E *)
  2096. seekOK:
  2097. pop bp
  2098. (*%F NearCall *)
  2099. ret far 0
  2100. (*%E *)
  2101. (*%T NearCall *)
  2102. ret 0
  2103. (*%E *)
  2104. seekErr:
  2105. (*%F NearCall *)
  2106. call far __ioerr (* set errno *)
  2107. (*%E *)
  2108. (*%T NearCall *)
  2109. call __ioerr (* set errno *)
  2110. (*%E *)
  2111. mov ax, -1 (* error - return -1L *)
  2112. cwd
  2113. jmp seekOK
  2114. (*%E *)
  2115. (*%T RegParam *)
  2116. (*%T _DLLOVL *)
  2117. push bp
  2118. mov bp, sp
  2119. (*%E *)
  2120. push dx
  2121. mov dx, bx
  2122. mov bx, ax
  2123. pop ax
  2124. mov ah, 42H
  2125. extrn @DosInterrupt
  2126. (*%F NearCall *)
  2127. call far @DosInterrupt
  2128. (*%E *)
  2129. (*%T NearCall *)
  2130. call @DosInterrupt
  2131. (*%E *)
  2132. jc seekErr
  2133. (*%F SameDS *)
  2134. push ds
  2135. mov cx, seg __openfd
  2136. mov ds, cx
  2137. (*%E *)
  2138. add bx, bx
  2139. and word [__openfd][bx], ~_O_EOF
  2140. (*%F SameDS *)
  2141. pop ds
  2142. (*%E *)
  2143. seekOK:
  2144. (*%T _DLLOVL *)
  2145. pop bp
  2146. (*%E *)
  2147. (*%F NearCall *)
  2148. ret far 0
  2149. (*%E *)
  2150. (*%T NearCall *)
  2151. ret 0
  2152. (*%E *)
  2153. seekErr:
  2154. (*%F NearCall *)
  2155. call far __ioerr (* set errno *)
  2156. (*%E *)
  2157. (*%T NearCall *)
  2158. call __ioerr (* set errno *)
  2159. (*%E *)
  2160. mov ax, -1 (* error - return -1L *)
  2161. cwd
  2162. jmp seekOK
  2163. (*%E *)
  2164. (*%E _OS2 *)
  2165. section
  2166. (*%F _OS2 *)
  2167. (*****************************************************************************)
  2168. segment _DATA(DATA,28H)
  2169. segment _TEXT(CODE,28H)
  2170. extrn __ioerr
  2171. public _tell :
  2172. (* long tell(int handle)
  2173. Returns offset of file pointer. *)
  2174. (*%F RegParam *)
  2175. handle = frame
  2176. push bp
  2177. mov bp, sp
  2178. push bx
  2179. push cx
  2180. mov ah, 42H
  2181. mov al, 1
  2182. mov bx, [bp][handle]
  2183. sub dx, dx
  2184. sub cx, cx
  2185. extrn @DosInterrupt
  2186. (*%F NearCall *)
  2187. call far @DosInterrupt
  2188. (*%E *)
  2189. (*%T NearCall *)
  2190. call @DosInterrupt
  2191. (*%E *)
  2192. jc tellErr
  2193. tellOK:
  2194. pop cx
  2195. pop bx
  2196. pop bp
  2197. (*%F NearCall *)
  2198. ret far 0
  2199. (*%E *)
  2200. (*%T NearCall *)
  2201. ret 0
  2202. (*%E *)
  2203. tellErr:
  2204. (*%F NearCall *)
  2205. call far __ioerr (* set errno *)
  2206. (*%E *)
  2207. (*%T NearCall *)
  2208. call __ioerr (* set errno *)
  2209. (*%E *)
  2210. mov ax, -1 (* error return -1L *)
  2211. cwd
  2212. jmp tellOK
  2213. (*%E RegParam *)
  2214. (*%T RegParam *)
  2215. (*%T _DLLOVL *)
  2216. push bp
  2217. mov bp, sp
  2218. (*%E *)
  2219. push bx
  2220. push cx
  2221. mov bx, ax
  2222. sub dx, dx
  2223. sub cx, cx
  2224. mov ax, 4201H
  2225. extrn @DosInterrupt
  2226. (*%F NearCall *)
  2227. call far @DosInterrupt
  2228. (*%E *)
  2229. (*%T NearCall *)
  2230. call @DosInterrupt
  2231. (*%E *)
  2232. jc tellErr
  2233. tellOK:
  2234. pop cx
  2235. pop bx
  2236. (*%T _DLLOVL *)
  2237. pop bp
  2238. (*%E *)
  2239. (*%F NearCall *)
  2240. ret far 0
  2241. (*%E *)
  2242. (*%T NearCall *)
  2243. ret 0
  2244. (*%E *)
  2245. tellErr:
  2246. (*%F NearCall *)
  2247. call far __ioerr (* set errno *)
  2248. (*%E *)
  2249. (*%T NearCall *)
  2250. call __ioerr (* set errno *)
  2251. (*%E *)
  2252. mov ax, -1 (* error return -1L *)
  2253. cwd
  2254. jmp tellOK
  2255. (*%E RegParam *)
  2256. (*%E _OS2 *)
  2257. section
  2258. (*%F _OS2 *)
  2259. (*****************************************************************************)
  2260. segment _DATA(DATA,28H)
  2261. segment _TEXT(CODE,28H)
  2262. extrn __ioerr
  2263. public _unlink :
  2264. (* int unlink(char *filename)
  2265. Deletes file. Returns 0 if successful or -1 and sets errno. *)
  2266. (*%F RegParam *)
  2267. file = frame
  2268. push bp
  2269. mov bp, sp
  2270. push dx
  2271. (*%F NearPtr *)
  2272. push ds
  2273. (*%E *)
  2274. mov ah, 41H
  2275. (*%F NearPtr *)
  2276. lds dx, [bp][file]
  2277. (*%E *)
  2278. (*%T NearPtr *)
  2279. mov dx, [bp][file]
  2280. (*%E *)
  2281. extrn @DosInterrupt
  2282. (*%F NearCall *)
  2283. call far @DosInterrupt
  2284. (*%E *)
  2285. (*%T NearCall *)
  2286. call @DosInterrupt
  2287. (*%E *)
  2288. jnc unlinkOK
  2289. (*%F NearCall *)
  2290. call far __ioerr (* set errno *)
  2291. (*%E *)
  2292. (*%T NearCall *)
  2293. call __ioerr (* set errno *)
  2294. (*%E *)
  2295. mov ax, -1
  2296. jmp unlinkDone (* return -1 *)
  2297. unlinkOK:
  2298. sub ax, ax
  2299. unlinkDone:
  2300. (*%F NearPtr *)
  2301. pop ds
  2302. (*%E *)
  2303. pop dx
  2304. pop bp
  2305. (*%F NearCall *)
  2306. ret far 0
  2307. (*%E *)
  2308. (*%T NearCall *)
  2309. ret 0
  2310. (*%E *)
  2311. (*%E RegParam *)
  2312. (*%T RegParam *)
  2313. (*%T _DLLOVL *)
  2314. push bp
  2315. mov bp, sp
  2316. (*%E *)
  2317. push dx
  2318. (*%F NearPtr *)
  2319. push ds
  2320. (*%E *)
  2321. (*%F NearPtr *)
  2322. mov ds, bx
  2323. (*%E *)
  2324. mov dx, ax
  2325. mov ah, 41H
  2326. extrn @DosInterrupt
  2327. (*%F NearCall *)
  2328. call far @DosInterrupt
  2329. (*%E *)
  2330. (*%T NearCall *)
  2331. call @DosInterrupt
  2332. (*%E *)
  2333. jnc unlinkOK
  2334. (*%F NearCall *)
  2335. call far __ioerr (* set errno *)
  2336. (*%E *)
  2337. (*%T NearCall *)
  2338. call __ioerr (* set errno *)
  2339. (*%E *)
  2340. mov ax, -1
  2341. jmp unlinkDone (* return -1 *)
  2342. unlinkOK:
  2343. sub ax, ax
  2344. unlinkDone:
  2345. (*%F NearPtr *)
  2346. pop ds
  2347. (*%E *)
  2348. pop dx
  2349. (*%T _DLLOVL *)
  2350. pop bp
  2351. (*%E *)
  2352. (*%F NearCall *)
  2353. ret far 0
  2354. (*%E *)
  2355. (*%T NearCall *)
  2356. ret 0
  2357. (*%E *)
  2358. (*%E RegParam *)
  2359. (*%E _OS2 *)
  2360. section
  2361. (*%F _OS2 *)
  2362. (*****************************************************************************)
  2363. segment _DATA(DATA,28H)
  2364. segment _TEXT(CODE,28H)
  2365. extrn __ioerr
  2366. public _rename :
  2367. (* int rename(char *oldfile, char *newfile)
  2368. Renames file. Returns 0 if successful or -1 and sets errno. *)
  2369. (*%F RegParam *)
  2370. oldfile = frame
  2371. (*%F NearPtr *)
  2372. newfile = 4+frame
  2373. (*%E *)
  2374. (*%T NearPtr *)
  2375. newfile = 2+frame
  2376. (*%E *)
  2377. push bp
  2378. mov bp, sp
  2379. push dx
  2380. push di
  2381. (*%F NearPtr *)
  2382. push ds
  2383. (*%E *)
  2384. mov ah, 56H
  2385. (*%F NearPtr *)
  2386. les di, [bp][newfile]
  2387. lds dx, [bp][oldfile]
  2388. (*%E *)
  2389. (*%T NearPtr *)
  2390. mov di, [bp][newfile]
  2391. mov dx, [bp][oldfile]
  2392. push ds
  2393. pop es
  2394. (*%E *)
  2395. extrn @DosInterrupt
  2396. (*%F NearCall *)
  2397. call far @DosInterrupt
  2398. (*%E *)
  2399. (*%T NearCall *)
  2400. call @DosInterrupt
  2401. (*%E *)
  2402. jnc renameOK
  2403. (*%F NearCall *)
  2404. call far __ioerr (* set errno *)
  2405. (*%E *)
  2406. (*%T NearCall *)
  2407. call __ioerr (* set errno *)
  2408. (*%E *)
  2409. mov ax, -1
  2410. jmp renameDone (* return -1 *)
  2411. renameOK:
  2412. sub ax, ax
  2413. renameDone:
  2414. (*%F NearPtr *)
  2415. pop ds
  2416. (*%E *)
  2417. pop di
  2418. pop dx
  2419. pop bp (* new offset already in dx:ax *)
  2420. (*%F NearCall *)
  2421. ret far 0
  2422. (*%E *)
  2423. (*%T NearCall *)
  2424. ret 0
  2425. (*%E *)
  2426. (*%E RegParam *)
  2427. (*%T RegParam *)
  2428. (*%T _DLLOVL *)
  2429. push bp
  2430. mov bp, sp
  2431. (*%E *)
  2432. (*%T NearPtr *)
  2433. push dx
  2434. (*%E *)
  2435. push di
  2436. (*%F NearPtr *)
  2437. push ds
  2438. (*%E *)
  2439. (*%F NearPtr *)
  2440. mov es, dx
  2441. mov di, cx
  2442. mov ds, bx
  2443. mov dx, ax
  2444. (*%E *)
  2445. (*%T NearPtr *)
  2446. mov di, bx
  2447. mov dx, ax
  2448. push ds
  2449. pop es
  2450. (*%E *)
  2451. mov ah, 56H
  2452. extrn @DosInterrupt
  2453. (*%F NearCall *)
  2454. call far @DosInterrupt
  2455. (*%E *)
  2456. (*%T NearCall *)
  2457. call @DosInterrupt
  2458. (*%E *)
  2459. jnc renameOK
  2460. (*%F NearCall *)
  2461. call far __ioerr (* set errno *)
  2462. (*%E *)
  2463. (*%T NearCall *)
  2464. call __ioerr (* set errno *)
  2465. (*%E *)
  2466. mov ax, -1
  2467. jmp renameDone (* return -1 *)
  2468. renameOK:
  2469. sub ax, ax
  2470. renameDone:
  2471. (*%F NearPtr *)
  2472. pop ds
  2473. (*%E *)
  2474. pop di
  2475. (*%T NearPtr *)
  2476. pop dx
  2477. (*%E *)
  2478. (*%T _DLLOVL *)
  2479. pop bp
  2480. (*%E *)
  2481. (*%F NearCall *)
  2482. ret far 0
  2483. (*%E *)
  2484. (*%T NearCall *)
  2485. ret 0
  2486. (*%E *)
  2487. (*%E RegParam *)
  2488. (*%E _OS2 *)
  2489. section
  2490. (*%F _OS2 *)
  2491. (****************************************************************************)
  2492. segment _DATA(DATA,28H)
  2493. segment _TEXT(CODE,28H)
  2494. extrn __ioerr
  2495. public _mkdir :
  2496. (* int mkdir(const char *path)
  2497. makes new sub-directory. Returns 0 if sucessful or -1 if not.
  2498. errno is set to ENOENT if the path was not found or EACCES if
  2499. access denied. *)
  2500. (*%F RegParam *)
  2501. path = frame
  2502. push bp
  2503. mov bp, sp
  2504. push dx
  2505. (*%F NearPtr *)
  2506. push ds
  2507. lds dx, [bp][path]
  2508. (*%E *)
  2509. (*%T NearPtr *)
  2510. mov dx, [bp][path]
  2511. (*%E *)
  2512. mov ah, 39H
  2513. extrn @DosInterrupt
  2514. (*%F NearCall *)
  2515. call far @DosInterrupt
  2516. (*%E *)
  2517. (*%T NearCall *)
  2518. call @DosInterrupt
  2519. (*%E *)
  2520. jc mkError
  2521. sub ax, ax (* success return 0 *)
  2522. jmp mkDone
  2523. mkError:
  2524. (*%F NearCall *)
  2525. call far __ioerr (* set errno *)
  2526. (*%E *)
  2527. (*%T NearCall *)
  2528. call __ioerr (* set errno *)
  2529. (*%E *)
  2530. mov ax, -1 (* return -1 *)
  2531. mkDone:
  2532. (*%F NearPtr *)
  2533. pop ds
  2534. (*%E *)
  2535. pop dx
  2536. pop bp
  2537. (*%F NearCall *)
  2538. ret far 0
  2539. (*%E *)
  2540. (*%T NearCall *)
  2541. ret 0
  2542. (*%E *)
  2543. (*%E RegParam *)
  2544. (*%T RegParam *)
  2545. (*%T _DLLOVL *)
  2546. push bp
  2547. mov bp, sp
  2548. (*%E *)
  2549. push dx
  2550. (*%F NearPtr *)
  2551. push ds
  2552. mov ds, bx
  2553. (*%E *)
  2554. mov dx, ax
  2555. mov ah, 39H
  2556. extrn @DosInterrupt
  2557. (*%F NearCall *)
  2558. call far @DosInterrupt
  2559. (*%E *)
  2560. (*%T NearCall *)
  2561. call @DosInterrupt
  2562. (*%E *)
  2563. jc mkError
  2564. sub ax, ax (* success return 0 *)
  2565. jmp mkDone
  2566. mkError:
  2567. (*%F NearCall *)
  2568. call far __ioerr (* set errno *)
  2569. (*%E *)
  2570. (*%T NearCall *)
  2571. call __ioerr (* set errno *)
  2572. (*%E *)
  2573. mov ax, -1 (* return -1 *)
  2574. mkDone:
  2575. (*%F NearPtr *)
  2576. pop ds
  2577. (*%E *)
  2578. pop dx
  2579. (*%T _DLLOVL *)
  2580. pop bp
  2581. (*%E *)
  2582. (*%F NearCall *)
  2583. ret far 0
  2584. (*%E *)
  2585. (*%T NearCall *)
  2586. ret 0
  2587. (*%E *)
  2588. (*%E RegParam *)
  2589. (*%E _OS2 *)
  2590. section
  2591. (*%F _OS2 *)
  2592. (****************************************************************************)
  2593. segment _DATA(DATA,28H)
  2594. segment _TEXT(CODE,28H)
  2595. extrn __ioerr
  2596. public _rmdir :
  2597. (* int rmdir(const char *path)
  2598. deletes directory. returns 0 if sucessful or -1 if not.
  2599. errno is set to ENOENT if the path was not found or EACCES
  2600. if access denied. *)
  2601. (*%F RegParam *)
  2602. path = frame
  2603. push bp
  2604. mov bp, sp
  2605. push dx
  2606. (*%F NearPtr *)
  2607. push ds
  2608. (*%E *)
  2609. (*%F NearPtr *)
  2610. lds dx, [bp][path]
  2611. (*%E *)
  2612. (*%T NearPtr *)
  2613. mov dx, [bp][path]
  2614. (*%E *)
  2615. mov ah, 3AH
  2616. extrn @DosInterrupt
  2617. (*%F NearCall *)
  2618. call far @DosInterrupt
  2619. (*%E *)
  2620. (*%T NearCall *)
  2621. call @DosInterrupt
  2622. (*%E *)
  2623. jc rmError
  2624. sub ax, ax (* success - return 0 *)
  2625. jmp rmDone
  2626. rmError:
  2627. (*%F NearCall *)
  2628. call far __ioerr
  2629. (*%E *)
  2630. (*%T NearCall *)
  2631. call __ioerr (* set errno *)
  2632. (*%E *)
  2633. mov ax, -1 (* error - return -1 *)
  2634. rmDone:
  2635. (*%F NearPtr *)
  2636. pop ds
  2637. (*%E *)
  2638. pop dx
  2639. pop bp
  2640. (*%F NearCall *)
  2641. ret far 0
  2642. (*%E *)
  2643. (*%T NearCall *)
  2644. ret 0
  2645. (*%E *)
  2646. (*%E RegParam *)
  2647. (*%T RegParam *)
  2648. (*%T _DLLOVL *)
  2649. push bp
  2650. mov bp, sp
  2651. (*%E *)
  2652. push dx
  2653. (*%F NearPtr *)
  2654. push ds
  2655. mov ds, bx
  2656. (*%E *)
  2657. mov dx, ax
  2658. mov ah, 3AH
  2659. extrn @DosInterrupt
  2660. (*%F NearCall *)
  2661. call far @DosInterrupt
  2662. (*%E *)
  2663. (*%T NearCall *)
  2664. call @DosInterrupt
  2665. (*%E *)
  2666. jc rmError
  2667. sub ax, ax (* success - return 0 *)
  2668. jmp rmDone
  2669. rmError:
  2670. (*%F NearCall *)
  2671. call far __ioerr (* set errno *)
  2672. (*%E *)
  2673. (*%T NearCall *)
  2674. call __ioerr (* set errno *)
  2675. (*%E *)
  2676. mov ax, -1 (* error - return -1 *)
  2677. rmDone:
  2678. (*%F NearPtr *)
  2679. pop ds
  2680. (*%E *)
  2681. pop dx
  2682. (*%T _DLLOVL *)
  2683. pop bp
  2684. (*%E *)
  2685. (*%F NearCall *)
  2686. ret far 0
  2687. (*%E *)
  2688. (*%T NearCall *)
  2689. ret 0
  2690. (*%E *)
  2691. (*%E RegParam *)
  2692. (*%E _OS2 *)
  2693. section
  2694. (*%F _OS2 *)
  2695. (******************************************************************************)
  2696. segment _DATA(DATA,28H)
  2697. segment _TEXT(CODE,28H)
  2698. extrn __ioerr
  2699. public _chdir :
  2700. (* int chdir(const char *path)
  2701. Changes current working directory.
  2702. returns 0 if sucessful or -1 if not (errno is set to ENOENT). *)
  2703. (*%F RegParam *)
  2704. path = frame
  2705. push bp
  2706. mov bp, sp
  2707. push dx
  2708. (*%F NearPtr *)
  2709. push ds
  2710. lds dx, [bp][path]
  2711. (*%E *)
  2712. (*%T NearPtr *)
  2713. mov dx, [bp][path]
  2714. (*%E *)
  2715. mov ah, 3BH
  2716. extrn @DosInterrupt
  2717. (*%F NearCall *)
  2718. call far @DosInterrupt
  2719. (*%E *)
  2720. (*%T NearCall *)
  2721. call @DosInterrupt
  2722. (*%E *)
  2723. jc chError
  2724. sub ax, ax (* return 0 *)
  2725. jmp chDone
  2726. chError:
  2727. (*%F NearCall *)
  2728. call far __ioerr (* set errno *)
  2729. (*%E *)
  2730. (*%T NearCall *)
  2731. call __ioerr (* set errno *)
  2732. (*%E *)
  2733. mov ax, -1 (* return -1 *)
  2734. chDone:
  2735. (*%F NearPtr *)
  2736. pop ds
  2737. (*%E *)
  2738. pop dx
  2739. pop bp
  2740. (*%F NearCall *)
  2741. ret far 0
  2742. (*%E *)
  2743. (*%T NearCall *)
  2744. ret 0
  2745. (*%E *)
  2746. (*%E RegParam*)
  2747. (*%T RegParam *)
  2748. (*%T _DLLOVL *)
  2749. push bp
  2750. mov bp, sp
  2751. (*%E *)
  2752. push dx
  2753. (*%F NearPtr *)
  2754. push ds
  2755. mov ds, bx
  2756. (*%E *)
  2757. mov dx, ax
  2758. mov ah, 3BH
  2759. extrn @DosInterrupt
  2760. (*%F NearCall *)
  2761. call far @DosInterrupt
  2762. (*%E *)
  2763. (*%T NearCall *)
  2764. call @DosInterrupt
  2765. (*%E *)
  2766. jc chError
  2767. sub ax, ax
  2768. jmp chDone
  2769. chError:
  2770. (*%F NearCall *)
  2771. call far __ioerr (* set errno *)
  2772. (*%E *)
  2773. (*%T NearCall *)
  2774. call __ioerr (* set errno *)
  2775. (*%E *)
  2776. mov ax, -1 (* return -1 *)
  2777. chDone:
  2778. (*%F NearPtr *)
  2779. pop ds
  2780. (*%E *)
  2781. pop dx
  2782. (*%T _DLLOVL *)
  2783. pop bp
  2784. (*%E *)
  2785. (*%F NearCall *)
  2786. ret far 0
  2787. (*%E *)
  2788. (*%T NearCall *)
  2789. ret 0
  2790. (*%E *)
  2791. (*%E RegParam *)
  2792. (*%E _OS2 *)
  2793. section
  2794. (*%F _OS2 *)
  2795. (*************************************************************************)
  2796. segment _DATA(DATA,28H)
  2797. segment _TEXT(CODE,28H)
  2798. extrn __ioerr
  2799. public _getcurdir :
  2800. (* int getcurdir(int drive, char *path)
  2801. gets current working directory. returns 0 if sucessful or -1 if not. *)
  2802. (*%F RegParam *)
  2803. drive = frame
  2804. path = 2+frame
  2805. push bp
  2806. mov bp, sp
  2807. push dx
  2808. push si
  2809. (*%F NearPtr *)
  2810. push ds
  2811. lds si, [bp][path]
  2812. (*%E *)
  2813. (*%T NearPtr *)
  2814. mov si, [bp][path]
  2815. (*%E *)
  2816. mov dl, [bp][drive]
  2817. mov ah, 47H
  2818. extrn @DosInterrupt
  2819. (*%F NearCall *)
  2820. call far @DosInterrupt
  2821. (*%E *)
  2822. (*%T NearCall *)
  2823. call @DosInterrupt
  2824. (*%E *)
  2825. jc gcdError
  2826. sub ax, ax (* success - return 0 *)
  2827. jmp gcdDone
  2828. gcdError:
  2829. mov ax, -1 (* invalid drive spec - return -1 *)
  2830. gcdDone:
  2831. (*%F NearPtr *)
  2832. pop ds
  2833. (*%E *)
  2834. pop si
  2835. pop dx
  2836. pop bp
  2837. (*%F NearCall *)
  2838. ret far 0
  2839. (*%E *)
  2840. (*%T NearCall *)
  2841. ret 0
  2842. (*%E *)
  2843. (*%E RegParam *)
  2844. (*%T RegParam *)
  2845. (*%T _DLLOVL *)
  2846. push bp
  2847. mov bp, sp
  2848. (*%E *)
  2849. push dx
  2850. push si
  2851. (*%F NearPtr *)
  2852. push ds
  2853. mov ds, cx
  2854. (*%E *)
  2855. mov si, bx
  2856. mov dl, al
  2857. mov ah, 47H
  2858. extrn @DosInterrupt
  2859. (*%F NearCall *)
  2860. call far @DosInterrupt
  2861. (*%E *)
  2862. (*%T NearCall *)
  2863. call @DosInterrupt
  2864. (*%E *)
  2865. jc gcdError
  2866. sub ax, ax (* success - return 0 *)
  2867. jmp gcdDone
  2868. gcdError:
  2869. mov ax, -1 (* invalid drive spec - return -1 *)
  2870. gcdDone:
  2871. (*%F NearPtr *)
  2872. pop ds
  2873. (*%E *)
  2874. pop si
  2875. pop dx
  2876. (*%T _DLLOVL *)
  2877. pop bp
  2878. (*%E *)
  2879. (*%F NearCall *)
  2880. ret far 0
  2881. (*%E *)
  2882. (*%T NearCall *)
  2883. ret 0
  2884. (*%E *)
  2885. (*%E RegParam *)
  2886. (*%E _OS2 *)
  2887. section
  2888. (*%T _OS2*)
  2889. (****************************************************************************)
  2890. segment _TEXT(CODE,28H)
  2891. segment _DATA(DATA,28H)
  2892. scr_init : dw 0
  2893. scr_rows : dw 0
  2894. scr_cols : dw 0
  2895. attr : dw 720H
  2896. extrn VIOWRTCHARSTR
  2897. extrn VIOGETCURPOS
  2898. extrn VIOSETCURPOS
  2899. extrn VIOSCROLLDN
  2900. extrn VIOSCROLLUP
  2901. extrn VIOGETMODE
  2902. extrn DOSBEEP
  2903. (* int putch(int c) *)
  2904. cb = 0
  2905. fbType = 2
  2906. color = 3
  2907. col = 4
  2908. row = 6
  2909. hres = 8
  2910. vres = 10
  2911. fmt_ID = 12
  2912. attrib = 13
  2913. VIOMODESIZE = 14
  2914. (*%F RegParam *)
  2915. chk = frame
  2916. viobuf = -VIOMODESIZE
  2917. locals = VIOMODESIZE
  2918. (*%E *)
  2919. (*%T RegParam *)
  2920. viobuf = -VIOMODESIZE
  2921. chk = viobuf-2
  2922. locals = VIOMODESIZE+2
  2923. (*%E *)
  2924. select _TEXT
  2925. public __d_putch :
  2926. push bp
  2927. mov bp, sp
  2928. sub sp, locals
  2929. push bx
  2930. push cx
  2931. push dx
  2932. (*%T RegParam *)
  2933. mov [bp][chk], ax
  2934. (*%E *)
  2935. cmp word [scr_init], 0
  2936. jnz initDone
  2937. mov word [bp][viobuf][cb], VIOMODESIZE
  2938. push ss
  2939. lea ax, [bp][viobuf]
  2940. push ax
  2941. sub ax, ax
  2942. push ax
  2943. call far VIOGETMODE
  2944. mov ax,[bp][viobuf][row]
  2945. mov [scr_rows], ax
  2946. mov ax,[bp][viobuf][col]
  2947. mov [scr_cols], ax
  2948. not word [scr_init]
  2949. initDone:
  2950. call getxy
  2951. mov al, [bp][chk]
  2952. cmp al, 8
  2953. je backSpace
  2954. cmp al, 0AH
  2955. je newLine
  2956. cmp al, 0DH
  2957. je carriageReturn
  2958. cmp al, 09H
  2959. je tab
  2960. cmp al, 07H
  2961. je bell
  2962. mov cx, 1
  2963. notEsc:
  2964. pLoop:
  2965. push cx
  2966. push dx
  2967. push ss
  2968. lea ax, [bp][chk]
  2969. push ax
  2970. mov ax, 1
  2971. push ax
  2972. mov al, dh
  2973. push ax
  2974. mov al, dl
  2975. push ax
  2976. sub ax, ax
  2977. push ax
  2978. call far VIOWRTCHARSTR
  2979. pop dx
  2980. pop cx
  2981. putDone:
  2982. push cx
  2983. call incxy
  2984. pop cx
  2985. loop pLoop
  2986. putExit:
  2987. mov ax, [bp][chk]
  2988. pop dx
  2989. pop cx
  2990. pop bx
  2991. mov sp, bp
  2992. pop bp
  2993. (*%F NearCall *)
  2994. ret far 0
  2995. (*%E *)
  2996. (*%T NearCall *)
  2997. ret 0
  2998. (*%E *)
  2999. backSpace:
  3000. call decxy
  3001. jmp putExit
  3002. newLine:
  3003. mov dl, [scr_cols]
  3004. call incxy
  3005. jmp putExit
  3006. carriageReturn:
  3007. mov dl, 0
  3008. call setxy
  3009. jmp putExit
  3010. tab:
  3011. mov cx, 4
  3012. mov word [bp][chk], 20H
  3013. jmp pLoop
  3014. bell:
  3015. mov ax, 1500
  3016. push ax
  3017. mov ax, 300
  3018. push ax
  3019. call far DOSBEEP
  3020. jmp putExit
  3021. row = 2
  3022. col = 0
  3023. locals = 4
  3024. getxy :
  3025. sub sp, locals
  3026. mov bx, sp
  3027. push ss
  3028. lea ax, [bx][row]
  3029. push ax
  3030. push ss
  3031. push bx
  3032. sub ax, ax
  3033. push ax
  3034. call far VIOGETCURPOS
  3035. mov dh, ss:[bx][row]
  3036. mov dl, ss:[bx][col]
  3037. add sp, locals
  3038. ret 0
  3039. setxy :
  3040. sub bh, bh
  3041. mov bl, dh
  3042. push bx
  3043. mov bl, dl
  3044. push bx
  3045. sub ax, ax
  3046. push ax
  3047. call far VIOSETCURPOS
  3048. ret 0
  3049. incxy :
  3050. inc dl
  3051. cmp dl, [scr_cols]
  3052. jb xOK1
  3053. mov dl, 0
  3054. inc dh
  3055. cmp dh, [scr_rows]
  3056. jae scrollUp1
  3057. xOK1:
  3058. call setxy
  3059. ret 0
  3060. scrollUp1:
  3061. dec dh
  3062. push dx
  3063. mov ax, 601H
  3064. mov ch, 0
  3065. mov cl, 0
  3066. mov dh, [scr_rows]
  3067. mov dl, [scr_cols]
  3068. call scroll
  3069. pop dx
  3070. sub dl, dl
  3071. jmp xOK1
  3072. decxy :
  3073. dec dl
  3074. cmp dl, 0
  3075. jae xOK
  3076. cmp dh, 0
  3077. jbe screenBegin
  3078. mov dl, [scr_cols]
  3079. dec dh
  3080. xOK:
  3081. call setxy
  3082. ret 0
  3083. screenBegin:
  3084. mov dh, 0
  3085. mov dl, 0
  3086. jmp xOK
  3087. scroll :
  3088. push si
  3089. mov si, ax
  3090. sub bh, bh
  3091. mov bl, ch
  3092. push bx
  3093. mov bl, cl
  3094. push bx
  3095. mov bl, dh
  3096. push bx
  3097. mov bl, dl
  3098. push bx
  3099. cbw
  3100. push ax
  3101. mov bx, _DATA
  3102. push bx
  3103. mov bx, attr
  3104. push bx
  3105. sub bx, bx
  3106. push bx
  3107. mov ax, si
  3108. test ah, 1
  3109. jz scrollUp
  3110. call far VIOSCROLLDN
  3111. jmp scrollDone
  3112. scrollUp:
  3113. call far VIOSCROLLUP
  3114. scrollDone:
  3115. pop si
  3116. ret 0
  3117. (*%E _OS2 *)
  3118. section
  3119. (*%T _OS2 *)
  3120. (****************************************************************************)
  3121. segment _DATA(DATA,28H)
  3122. segment _TEXT(CODE,28H)
  3123. extrn KBDCHARIN
  3124. extrn __scanwaiting
  3125. extrn __kbdhandle
  3126. extrn __ungotchar
  3127. (* int getch(void)
  3128. Checks for any character returned by ungetch then calls DOS. *)
  3129. keybuf = -KbdInfoSize
  3130. locals = KbdInfoSize
  3131. public _getch :
  3132. push bp
  3133. mov bp, sp
  3134. sub sp, locals
  3135. (*%F SameDS *)
  3136. push ds
  3137. mov ax, _DATA
  3138. mov ds, ax
  3139. (*%E *)
  3140. mov al, [__ungotchar]
  3141. or al, al
  3142. jne charWaiting
  3143. mov al, [__scanwaiting]
  3144. or al, al
  3145. jnz charWaiting
  3146. push ss
  3147. lea ax, [bp][keybuf]
  3148. push ax
  3149. mov ax, IO_WAIT
  3150. push ax
  3151. mov ax, [__kbdhandle]
  3152. push ax
  3153. call far KBDCHARIN
  3154. mov al, [bp][keybuf][chChar]
  3155. cmp al, 0E0H
  3156. je charE0
  3157. or al, al
  3158. jnz charWaiting
  3159. charE0:
  3160. sub al, al
  3161. mov ah, [bp][keybuf][chScan]
  3162. mov [__scanwaiting], ah
  3163. jmp charDone
  3164. charWaiting:
  3165. mov byte [__scanwaiting], 0
  3166. charDone:
  3167. mov word [__ungotchar], 0
  3168. sub ah, ah
  3169. (*%F SameDS *)
  3170. pop ds
  3171. (*%E *)
  3172. mov sp, bp
  3173. pop bp
  3174. (*%F NearCall *)
  3175. ret far 0
  3176. (*%E *)
  3177. (*%T NearCall *)
  3178. ret 0
  3179. (*%E *)
  3180. (*%E _OS2 *)
  3181. section
  3182. (*%T _OS2 *)
  3183. (****************************************************************************)
  3184. segment _DATA(DATA,28H)
  3185. segment _TEXT(CODE,28H)
  3186. extrn KBDPEEK
  3187. extrn __kbdhandle
  3188. extrn __ungotchar
  3189. extrn __scanwaiting
  3190. keybuf = -KbdInfoSize
  3191. locals = KbdInfoSize
  3192. public _kbhit :
  3193. push bp
  3194. mov bp, sp
  3195. sub sp, locals
  3196. (*%F SameDS *)
  3197. push ds
  3198. mov ax, _DATA
  3199. mov ds, ax
  3200. (*%E *)
  3201. mov ax, [__ungotchar]
  3202. or ax, ax
  3203. jnz keyWaiting
  3204. mov ax, [__scanwaiting]
  3205. or ax, ax
  3206. jnz keyWaiting
  3207. push ss
  3208. lea ax, [bp][keybuf]
  3209. push ax
  3210. sub ax, ax
  3211. push ax
  3212. call far KBDPEEK
  3213. mov ax, 40H
  3214. and al, [bp][keybuf][fbStatus]
  3215. keyWaiting:
  3216. (*%F SameDS *)
  3217. pop ds
  3218. (*%E *)
  3219. mov sp, bp
  3220. pop bp
  3221. (*%F NearCall *)
  3222. ret far 0
  3223. (*%E *)
  3224. (*%T NearCall *)
  3225. ret 0
  3226. (*%E *)
  3227. (*%E _OS2 *)
  3228. section
  3229. (*%T _OS2 *)
  3230. (****************************************************************************)
  3231. segment _DATA(DATA,28H)
  3232. segment _TEXT(CODE,28H)
  3233. extrn _putch
  3234. extrn KBDCHARIN
  3235. extrn __ungotchar
  3236. extrn __attrib
  3237. extrn __scanwaiting
  3238. extrn __kbdhandle
  3239. (* int getche(void)
  3240. Checks for any charcater returned by ungetch then calls DOS. *)
  3241. keybuf = -KbdInfoSize
  3242. locals = KbdInfoSize
  3243. public _getche :
  3244. push bp
  3245. mov bp, sp
  3246. sub sp, locals
  3247. (*%F SameDS *)
  3248. push ds
  3249. mov ax, _DATA
  3250. mov ds, ax
  3251. (*%E *)
  3252. mov al, [__ungotchar]
  3253. or al, al
  3254. jne charWaiting
  3255. mov al, [__scanwaiting]
  3256. or al, al
  3257. jnz charWaiting
  3258. push ss
  3259. lea ax, [bp][keybuf]
  3260. push ax
  3261. mov ax, IO_WAIT
  3262. push ax
  3263. mov ax, [__kbdhandle]
  3264. push ax
  3265. call far KBDCHARIN
  3266. mov al, [bp][keybuf][chChar]
  3267. cmp al, 0E0H
  3268. je charE0
  3269. or al, al
  3270. jnz charWaiting
  3271. charE0:
  3272. sub al, al
  3273. mov ah, [bp][keybuf][chScan]
  3274. mov [__scanwaiting], ah
  3275. jmp charDone
  3276. charWaiting:
  3277. mov byte [__scanwaiting], 0
  3278. charDone:
  3279. mov word [__ungotchar], 0
  3280. cbw
  3281. push ax
  3282. (*%F NearCall *)
  3283. call far _putch
  3284. (*%E *)
  3285. (*%T NearCall *)
  3286. extrn _putch
  3287. call _putch
  3288. (*%E *)
  3289. pop ax
  3290. (*%F SameDS *)
  3291. pop ds
  3292. (*%E *)
  3293. mov sp, bp
  3294. pop bp
  3295. (*%F NearCall *)
  3296. ret far 0
  3297. (*%E *)
  3298. (*%T NearCall *)
  3299. ret 0
  3300. (*%E *)
  3301. (*%E _OS2 *)
  3302. section
  3303. (*%T _OS2 *)
  3304. (****************************************************************************)
  3305. segment _DATA(DATA,28H)
  3306. segment _TEXT(CODE,28H)
  3307. IO_NOWAIT = 1
  3308. extrn KBDSTRINGIN
  3309. extrn __ungotchar
  3310. extrn __kbdhandle
  3311. (* char *cgets(char *str)
  3312. String is read from console and stroed starting at str[2].
  3313. s[0] is the max length of the string.
  3314. The actual length is stored at str[1].
  3315. Returns a pointer to the beginning of the actual string. *)
  3316. CR = 0DH
  3317. LF = 0AH
  3318. (*%F RegParam *)
  3319. str = frame
  3320. kbuf = -4
  3321. locals = 4
  3322. (*%E *)
  3323. (*%T RegParam *)
  3324. kbuf = -4
  3325. str = -8
  3326. locals = 8
  3327. (*%E *)
  3328. public __d_cgets :
  3329. push bp
  3330. mov bp, sp
  3331. sub sp, locals
  3332. (*%F RegParam *)
  3333. push bx
  3334. push cx
  3335. (*%T NearPtr *)
  3336. push dx
  3337. (*%E *)
  3338. (*%E *)
  3339. (*%T RegParam *)
  3340. (*%T NearPtr *)
  3341. push bx
  3342. (*%E *)
  3343. push cx
  3344. (*%T NearPtr *)
  3345. push dx
  3346. (*%E *)
  3347. mov [bp][str], ax
  3348. (*%F NearPtr *)
  3349. mov [bp][str][2], bx
  3350. (*%E *)
  3351. (*%E *)
  3352. push di
  3353. push si
  3354. push ds
  3355. sub cx, cx
  3356. (*%F NearPtr *)
  3357. lds si, [bp][str]
  3358. (*%E *)
  3359. (*%T NearPtr *)
  3360. mov si, [bp][str]
  3361. (*%E *)
  3362. mov ax, _DATA
  3363. mov es, ax
  3364. cmp word es:[__ungotchar], 0
  3365. je cgetsNoWaiting
  3366. not cx
  3367. dec byte [si]
  3368. cgetsNoWaiting:
  3369. mov al, [si]
  3370. sub ah, ah
  3371. mov [bp][kbuf], ax
  3372. add si, 2
  3373. push cx
  3374. push ds
  3375. push si
  3376. push ss
  3377. lea ax, [bp][kbuf]
  3378. push ax
  3379. mov ax, IO_NOWAIT (* get string from console *)
  3380. push ax
  3381. push es:[__kbdhandle]
  3382. call far KBDSTRINGIN
  3383. pop cx
  3384. jcxz cgetsNoUnget
  3385. mov dx, es:[__ungotchar] (* insert put back character *)
  3386. mov cx, [bp][kbuf][2]
  3387. push si
  3388. std
  3389. (*%F NearPtr *)
  3390. les di, [bp][str]
  3391. (*%E *)
  3392. (*%T NearPtr *)
  3393. mov di, [bp][str]
  3394. (*%E *)
  3395. add si, cx
  3396. add di, cx
  3397. add di, 2
  3398. dec si
  3399. rep ; movsb
  3400. pop si
  3401. mov [si], dl
  3402. cld
  3403. inc word [bp][kbuf][2]
  3404. cgetsNoUnget:
  3405. mov bx, [bp][kbuf][2]
  3406. mov [si][-1], bl
  3407. mov byte [si][bx], 0
  3408. mov dx, ds (* return address of string *)
  3409. mov ax, si
  3410. pop ds
  3411. pop si
  3412. pop di
  3413. (*%F RegParam *)
  3414. (*%T NearPtr *)
  3415. pop dx
  3416. (*%E *)
  3417. pop cx
  3418. pop bx
  3419. (*%E *)
  3420. (*%T RegParam *)
  3421. (*%T NearPtr *)
  3422. pop dx
  3423. (*%E *)
  3424. pop cx
  3425. (*%T NearPtr *)
  3426. pop bx
  3427. (*%E *)
  3428. (*%E *)
  3429. mov sp, bp
  3430. pop bp
  3431. (*%F NearCall *)
  3432. ret far 0
  3433. (*%E *)
  3434. (*%T NearCall *)
  3435. ret 0
  3436. (*%E *)
  3437. (*%E _OS2 *)
  3438. section
  3439. (*%T _OS2 *)
  3440. (****************************************************************************)
  3441. segment _TEXT(CODE,28H)
  3442. extrn DOSSLEEP
  3443. public _delay :
  3444. (*%F RegParam *)
  3445. msecs = frame
  3446. push bp
  3447. mov bp, sp
  3448. sub ax, ax
  3449. push ax
  3450. push [bp][msecs]
  3451. call far DOSSLEEP
  3452. pop bp
  3453. (*%E RegParam *)
  3454. (*%T RegParam *)
  3455. push bx
  3456. sub bx, bx
  3457. push bx
  3458. push ax
  3459. call far DOSSLEEP
  3460. pop bx
  3461. (*%E RegParam *)
  3462. (*%F NearCall *)
  3463. ret far 0
  3464. (*%E *)
  3465. (*%T NearCall *)
  3466. ret 0
  3467. (*%E *)
  3468. (*%E _OS2 *)
  3469. section
  3470. (*%T _OS2 *)
  3471. (******************************************************************************)
  3472. segment _INIT(INIT_CODE,28H)
  3473. segment _TEXT(CODE,28H)
  3474. segment _DATA(DATA,28H)
  3475. segment _BSS(BSS,28H)
  3476. (* void _initio()
  3477. Initialises level 1 and level 2 I/O. *)
  3478. Buf0 : org BUFSIZ
  3479. Buf1 : org BUFSIZ
  3480. extrn _isatty
  3481. extrn __exit1
  3482. extrn __exit1_vector
  3483. extrn __iob
  3484. extrn __openfd
  3485. extrn __exit_io
  3486. extrn __open_max
  3487. select _DATA
  3488. HandleData : dw 4000H, 4002H, 4002H
  3489. StreamData : dw 0405H, 0C06H, 0402H
  3490. StreamBuffers : dw Buf0, Buf1, 0
  3491. public __iosetup : dw 0
  3492. (*%F SameDS *)
  3493. (*%F _DLL *)
  3494. Exit1Adr: dd __exit1 (* In XLARGE and above, _exit1 is not in _TEXT *)
  3495. (*%E *)
  3496. (*%E *)
  3497. select _TEXT
  3498. do_initio : (* defined later on ! *)
  3499. select _INIT
  3500. (*%F NearCall *)
  3501. initio : dw MAGIC_NUM
  3502. db PR2
  3503. dd do_initio
  3504. (*%E *)
  3505. (*%T NearCall *)
  3506. initio : dw MAGIC_NUM
  3507. db PR2
  3508. dw do_initio
  3509. (*%E *)
  3510. select _DATA
  3511. public __doserrno : dw 0, initio
  3512. select _TEXT
  3513. public __initio : (* check for character devices on default paths *)
  3514. push di
  3515. push si
  3516. (*%F SameDS *)
  3517. push ds
  3518. mov ax, _DATA
  3519. mov ds, ax
  3520. (*%E *)
  3521. (*%T SameDS *)
  3522. mov word [__exit_io], __exit1
  3523. (*%F NearCall *)
  3524. mov word [__exit_io][2], cs
  3525. (*%E *)
  3526. (*%E *)
  3527. (*%F SameDS *)
  3528. (*%F _DLL *)
  3529. mov ax, [Exit1Adr]
  3530. mov word [__exit_io], ax
  3531. mov ax, [Exit1Adr][2]
  3532. mov word [__exit_io][2], ax
  3533. (*%E *)
  3534. (*%T _DLL *)
  3535. mov ax, [__exit1_vector]
  3536. mov word [__exit_io], ax
  3537. mov ax, [__exit1_vector][2]
  3538. mov word [__exit_io][2], ax
  3539. (*%E *)
  3540. (*%E *)
  3541. cmp word [__iosetup], 0
  3542. jne ioDone
  3543. not word [__iosetup]
  3544. sub cx, cx
  3545. sub bx, bx
  3546. mov si, 0
  3547. mov di, __iob
  3548. ioLoop:
  3549. push bx
  3550. push cx
  3551. mov ax, cx
  3552. (*%F NearCall *)
  3553. call far _isatty
  3554. (*%E *)
  3555. (*%T NearCall *)
  3556. call _isatty
  3557. (*%E *)
  3558. pop cx
  3559. pop bx
  3560. jc noSet
  3561. cmp cx, 3
  3562. jb standardPath
  3563. or word [si][__openfd], O_RDWR
  3564. jmp setDevice
  3565. standardPath:
  3566. mov dx, [si][StreamData]
  3567. mov [di][bx][_flag], dx
  3568. mov [di][bx][_file], cx
  3569. mov dx, [si][StreamBuffers]
  3570. or dx, dx
  3571. jz noBuf
  3572. mov word [di][bx][_size], BUFSIZ
  3573. mov [di][bx][_base], dx
  3574. mov [di][bx][_ptr], dx
  3575. (*%F NearPtr *)
  3576. mov word [di][bx][_base][2], _BSS
  3577. mov word [di][bx][_ptr][2], _BSS
  3578. (*%E *)
  3579. noBuf:
  3580. mov dx, [si][HandleData]
  3581. mov [si][__openfd], dx
  3582. setDevice:
  3583. or ax, ax
  3584. jz noSet
  3585. or word [si][__openfd], O_DEVICE
  3586. cmp cx, 2
  3587. ja noSet
  3588. or word [di][bx][_flag], _F_DEV (* is device *)
  3589. noSet:
  3590. add bx, _iobSize
  3591. add si, 2
  3592. inc cx
  3593. cmp cx, [__open_max]
  3594. jne ioLoop
  3595. ioDone:
  3596. (*%F SameDS *)
  3597. pop ds
  3598. (*%E *)
  3599. pop si
  3600. pop di
  3601. (*%F NearCall *)
  3602. ret far 0
  3603. (*%E *)
  3604. (*%T NearCall *)
  3605. ret 0
  3606. (*%E *)
  3607. (*%E _OS2 *)
  3608. section
  3609. (*%T _OS2 *)
  3610. (****************************************************************************)
  3611. segment _DATA(DATA,28H)
  3612. segment _TEXT(CODE,28H)
  3613. extrn DOSQHANDTYPE
  3614. (* int isatty (int handle)
  3615. The return value is true (1) if handle is attached to a character device
  3616. such as the console or printer, or false (0) if handle is for an ordinary
  3617. file or is not valid. *)
  3618. handle = frame
  3619. type = -2
  3620. attr = -4
  3621. locals = 4
  3622. public _isatty :
  3623. push bp
  3624. mov bp, sp
  3625. sub sp, locals
  3626. (*%F RegParam *)
  3627. push [bp][frame]
  3628. (*%E *)
  3629. (*%T RegParam *)
  3630. push ax
  3631. (*%E *)
  3632. push ss
  3633. lea ax, [bp][type]
  3634. push ax
  3635. push ss
  3636. lea ax, [bp][attr]
  3637. push ax
  3638. call far DOSQHANDTYPE
  3639. or ax, ax
  3640. jz isOK
  3641. sub ax, ax
  3642. stc
  3643. jmp isExit
  3644. isOK:
  3645. mov ax, [bp][type]
  3646. and ax, 1
  3647. clc
  3648. isExit:
  3649. mov sp, bp
  3650. pop bp
  3651. (*%F NearCall *)
  3652. ret far 0
  3653. (*%E *)
  3654. (*%T NearCall *)
  3655. ret 0
  3656. (*%E *)
  3657. (*%E _OS2 *)
  3658. section
  3659. (*%T _OS2 *)
  3660. (******************************************************************************)
  3661. segment _DATA(DATA,28H)
  3662. segment _TEXT(CODE,28H)
  3663. extrn DOSQFILEINFO
  3664. extrn __seterrno
  3665. public __getfileinfo :
  3666. (*%F RegParam *)
  3667. buf = frame
  3668. handle = 4+frame
  3669. push bp
  3670. mov bp, sp
  3671. push [bp][handle]
  3672. mov ax, 1
  3673. push ax
  3674. push [bp][buf][2]
  3675. push [bp][buf]
  3676. (*%E *)
  3677. (*%T RegParam *)
  3678. push ax
  3679. mov ax, 1
  3680. push ax
  3681. push cx
  3682. push bx
  3683. (*%E *)
  3684. mov ax, FileInfoSize
  3685. push ax
  3686. call far DOSQFILEINFO
  3687. or ax, ax
  3688. jz gfiOK
  3689. (*%F NearCall *)
  3690. call far __seterrno
  3691. (*%E *)
  3692. (*%T NearCall *)
  3693. call __seterrno
  3694. (*%E *)
  3695. mov ax, -1 (* return -1 *)
  3696. gfiOK:
  3697. (*%F RegParam *)
  3698. pop bp
  3699. (*%E *)
  3700. (*%F NearCall *)
  3701. ret far 0
  3702. (*%E *)
  3703. (*%T NearCall *)
  3704. ret 0
  3705. (*%E *)
  3706. (*%E _OS2 *)
  3707. section
  3708. (*%T _OS2 *)
  3709. (******************************************************************************)
  3710. segment _TEXT(CODE,28H)
  3711. handle = -2
  3712. action = -4
  3713. mode = -6
  3714. locals = 6
  3715. extrn DOSOPEN
  3716. extrn __ioerr
  3717. public __pascreate :
  3718. push bp
  3719. mov bp, sp
  3720. sub sp, locals
  3721. (*%T NearPtr *)
  3722. push cx
  3723. (*%E *)
  3724. push dx
  3725. mov dx, 12H
  3726. mov word [bp][mode], 2
  3727. jmp poShared
  3728. public __pasopen :
  3729. push bp
  3730. mov bp, sp
  3731. sub sp, locals
  3732. (*%T NearPtr *)
  3733. push cx
  3734. (*%E *)
  3735. push dx
  3736. mov dx, 1
  3737. (*%F NearPtr *)
  3738. mov word [bp][mode], cx
  3739. (*%E *)
  3740. (*%T NearPtr *)
  3741. mov word [bp][mode], bx
  3742. (*%E *)
  3743. poShared:
  3744. (*%F NearPtr *)
  3745. push bx
  3746. (*%E *)
  3747. (*%T NearPtr *)
  3748. push ds
  3749. (*%E *)
  3750. push ax
  3751. lea ax, [bp][handle]
  3752. push ss
  3753. push ax
  3754. lea ax, [bp][action]
  3755. push ss
  3756. push ax
  3757. sub ax, ax
  3758. push ax
  3759. push ax
  3760. push ax (* attribute = 0 *)
  3761. push dx (* create or open *)
  3762. mov bx, 40H
  3763. add bx, [bp][mode]
  3764. push bx (* access mode *)
  3765. push ax
  3766. push ax
  3767. call far DOSOPEN
  3768. or ax, ax
  3769. jnz openError
  3770. mov ax, [bp][handle]
  3771. openDone:
  3772. pop dx
  3773. (*%T NearPtr *)
  3774. pop cx
  3775. (*%E *)
  3776. mov sp, bp
  3777. pop bp
  3778. (*%F NearCall *)
  3779. ret far 0
  3780. (*%E *)
  3781. (*%T NearCall *)
  3782. ret 0
  3783. (*%E *)
  3784. openError:
  3785. (*%F NearCall *)
  3786. call far __ioerr
  3787. (*%E *)
  3788. (*%T NearCall *)
  3789. call __ioerr
  3790. (*%E *)
  3791. mov ax, -1
  3792. jmp openDone
  3793. (*%E _OS2 *)
  3794. section
  3795. (*%T _OS2 *)
  3796. (******************************************************************************)
  3797. segment _DATA(DATA,28H)
  3798. segment _TEXT(CODE,28H)
  3799. extrn DOSQFILEMODE
  3800. mode = -2
  3801. locals = 2
  3802. public __exists :
  3803. push bp
  3804. mov bp, sp
  3805. sub sp, locals
  3806. (*%F NearPtr *)
  3807. push ax
  3808. (*%E *)
  3809. (*%T NearPtr *)
  3810. push ds
  3811. (*%E *)
  3812. push dx
  3813. push ss
  3814. lea ax, [bp][mode]
  3815. push ax
  3816. sub ax, ax
  3817. push ax
  3818. push ax
  3819. call far DOSQFILEMODE
  3820. or ax, ax
  3821. jz exist
  3822. sub al, al
  3823. jmp exit
  3824. exist:
  3825. mov al, 1
  3826. exit:
  3827. mov sp, bp
  3828. pop bp
  3829. (*%F NearCall *)
  3830. ret far 0
  3831. (*%E *)
  3832. (*%T NearCall *)
  3833. ret 0
  3834. (*%E *)
  3835. (*%E _OS2 *)
  3836. section
  3837. (*%T _OS2 *)
  3838. (****************************************************************************)
  3839. segment _DATA(DATA,28H)
  3840. segment _TEXT(CODE,28H)
  3841. (* External data *)
  3842. extrn __getfileinfo
  3843. extrn _tell
  3844. extrn __ioerr
  3845. (* int _eof(int handle)
  3846. returns file status - EOF 1, error -1, else 0. *)
  3847. (*%F RegParam *)
  3848. handle = frame
  3849. infbuf = -FileInfoSize
  3850. locals = FileInfoSize
  3851. (*%E *)
  3852. (*%T RegParam *)
  3853. infbuf = -FileInfoSize
  3854. handle = infbuf-2
  3855. locals = FileInfoSize+2
  3856. (*%E *)
  3857. public __eof :
  3858. push bp
  3859. mov bp, sp
  3860. sub sp, locals
  3861. push bx
  3862. push cx
  3863. push dx
  3864. (*%T RegParam *)
  3865. mov [bp][handle], ax
  3866. mov cx, ss
  3867. lea bx, [bp][infbuf]
  3868. (*%E *)
  3869. (*%F RegParam *)
  3870. push [bp][handle]
  3871. push ss
  3872. lea ax, [bp][infbuf]
  3873. push ax
  3874. (*%E *)
  3875. (*%F NearCall *)
  3876. call far __getfileinfo
  3877. (*%E *)
  3878. (*%T NearCall *)
  3879. call __getfileinfo
  3880. (*%E *)
  3881. (*%F RegParam *)
  3882. add sp, 6
  3883. (*%E *)
  3884. or ax, ax
  3885. jz eofOK
  3886. jmp eofDone
  3887. eofOK:
  3888. (*%F RegParam *) (* return status, 1 if EOF *)
  3889. push [bp][handle]
  3890. (*%E *)
  3891. (*%T RegParam *) (* return status, 1 if EOF *)
  3892. mov ax, [bp][handle]
  3893. (*%E *)
  3894. (*%F NearCall *)
  3895. call far _tell
  3896. (*%E *)
  3897. (*%T NearCall *)
  3898. call _tell
  3899. (*%E *)
  3900. (*%F RegParam *) (* return status, 1 if EOF *)
  3901. add sp, 2
  3902. (*%E *)
  3903. cmp ax, [bp][infbuf][cbFile]
  3904. jne notEOF
  3905. cmp dx, [bp][infbuf][cbFile][2]
  3906. jne notEOF
  3907. mov ax, 1
  3908. jmp eofDone
  3909. notEOF:
  3910. sub ax, ax
  3911. eofDone:
  3912. pop dx
  3913. pop cx
  3914. pop bx
  3915. mov sp, bp
  3916. pop bp
  3917. (*%F NearCall *)
  3918. ret far 0
  3919. (*%E *)
  3920. (*%T NearCall *)
  3921. ret 0
  3922. (*%E *)
  3923. (*%E _OS2 *)
  3924. section
  3925. (*%T _OS2 *)
  3926. (*************************************************************************)
  3927. segment _TEXT(CODE,28H)
  3928. segment _DATA(DATA,28H)
  3929. extrn _lseek
  3930. extrn __write
  3931. extrn DOSWRITE
  3932. extrn DOSREAD
  3933. extrn __ioerr
  3934. extrn __openfd
  3935. __appbuf : db 0
  3936. select _TEXT
  3937. (*%F RegParam *)
  3938. handle = frame
  3939. buffer = 2+frame
  3940. (*%F NearPtr *)
  3941. num = 6+frame
  3942. (*%E *)
  3943. (*%T NearPtr *)
  3944. num = 4+frame
  3945. (*%E *)
  3946. temp = -4
  3947. writesize = -6
  3948. flag = -7
  3949. reset = -8
  3950. dgroup = -10
  3951. num_writ = -12
  3952. num_read = -14
  3953. locals = 14
  3954. (*%E *)
  3955. (*%T RegParam *)
  3956. temp = -4
  3957. writesize = -6
  3958. flag = -7
  3959. reset = -8
  3960. dgroup = -10
  3961. num_writ = -12
  3962. num_read = -14
  3963. handle = -16
  3964. buffer = -20
  3965. num = -22
  3966. locals = 22
  3967. (*%E *)
  3968. WRITE_BUF_SIZE = 401H
  3969. public _write :
  3970. push bp
  3971. mov bp, sp
  3972. sub sp, locals
  3973. (*%F RegParam *)
  3974. push bx
  3975. push cx
  3976. push dx
  3977. (*%E *)
  3978. (*%T RegParam *)
  3979. (*%T NearPtr *)
  3980. push dx
  3981. (*%E *)
  3982. (*%E *)
  3983. push di
  3984. push si
  3985. (*%T RegParam *)
  3986. mov [bp][handle], ax
  3987. mov [bp][buffer], bx
  3988. (*%F NearPtr *)
  3989. mov [bp][buffer][2], cx
  3990. mov [bp][num], dx
  3991. (*%E *)
  3992. (*%T NearPtr *)
  3993. mov [bp][num], cx
  3994. (*%E *)
  3995. (*%E *)
  3996. (*%F SameDS *)
  3997. push ds
  3998. mov ax, _DATA
  3999. mov ds, ax
  4000. (*%E *)
  4001. mov [bp][dgroup], ds
  4002. mov byte [bp][reset], 0
  4003. mov bx, [bp][handle]
  4004. shl bx, 1
  4005. mov cx, [__openfd][bx]
  4006. jcxz near writeInvalid
  4007. test cx, O_RDWR+O_WRONLY (* test for correct access mode *)
  4008. je near writeAccess
  4009. cmp word [bp][num], 0
  4010. je near writeEOF (* don't write zero bytes *)
  4011. test cx, O_APPEND
  4012. je dontAppend
  4013. mov di, cx (* append to EOF if flag set *)
  4014. mov dx, SEEK_END
  4015. (*%F RegParam *)
  4016. push dx
  4017. (*%E *)
  4018. sub ax, ax
  4019. test cx, O_TEXT
  4020. jz appNotText
  4021. dec ax
  4022. (*%F RegParam *)
  4023. push ax
  4024. push ax
  4025. push [bp][handle]
  4026. (*%E *)
  4027. (*%T RegParam *)
  4028. mov cx, ax
  4029. mov bx, ax
  4030. mov ax, [bp][handle]
  4031. (*%E *)
  4032. (*%F NearCall *)
  4033. call far _lseek
  4034. (*%E *)
  4035. (*%T NearCall *)
  4036. call _lseek
  4037. (*%E *)
  4038. (*%F RegParam *)
  4039. add sp, 8
  4040. (*%E *)
  4041. cmp dx, -1
  4042. jne notSeekError
  4043. cmp ax, -1
  4044. je nextSeek
  4045. notSeekError:
  4046. push [bp][handle]
  4047. push ds
  4048. mov ax, __appbuf
  4049. push ax
  4050. mov ax, 1
  4051. push ax
  4052. push ss
  4053. lea ax, [bp][num_read]
  4054. push ax
  4055. call far DOSREAD
  4056. or ax, ax
  4057. jnz near writeError
  4058. mov dx, SEEK_END
  4059. (*%F RegParam *)
  4060. push dx
  4061. (*%E *)
  4062. mov ax, -1
  4063. cmp byte [__appbuf], CTLZ
  4064. je ctlzPresent
  4065. inc ax
  4066. ctlzPresent:
  4067. jmp appNotText
  4068. nextSeek:
  4069. mov dx, SEEK_END
  4070. (*%F RegParam *)
  4071. push dx
  4072. (*%E *)
  4073. sub ax, ax
  4074. (*%F RegParam *)
  4075. appNotText:
  4076. push ax
  4077. push ax
  4078. push [bp][handle]
  4079. (*%E *)
  4080. (*%T RegParam *)
  4081. appNotText:
  4082. mov cx, ax
  4083. mov bx, ax
  4084. mov ax, [bp][handle]
  4085. (*%E *)
  4086. (*%F NearCall *)
  4087. call far _lseek
  4088. (*%E *)
  4089. (*%T NearCall *)
  4090. call _lseek
  4091. (*%E *)
  4092. (*%F RegParam *)
  4093. add sp, 8
  4094. (*%E *)
  4095. appendDone:
  4096. mov cx, di
  4097. dontAppend:
  4098. test cx, O_TEXT
  4099. je near writeBinary
  4100. writeText: (* test mode *)
  4101. test cx, _O_EOF (* error if EOF flag set *)
  4102. jne near writeEOF
  4103. (*%T StackChecks *)
  4104. push bp
  4105. mov bp, WRITE_BUF_SIZE+6
  4106. (*%F NearCall *)
  4107. extrn F$StkChk
  4108. call far F$StkChk
  4109. (*%E *)
  4110. (*%T NearCall *)
  4111. extrn N$StkChk
  4112. call N$StkChk
  4113. (*%E *)
  4114. pop bp
  4115. (*%E *)
  4116. mov di, WRITE_BUF_SIZE
  4117. sub sp, di
  4118. mov [bp][temp][2], ss
  4119. mov [bp][temp], sp
  4120. inc word [bp][temp]
  4121. not byte [bp][reset]
  4122. mov cx, [bp][num]
  4123. shr di, 1 (* write size is half that of buffer *)
  4124. mov [bp][writesize], di
  4125. (*%F NearPtr *)
  4126. lds si, [bp][buffer]
  4127. (*%E *)
  4128. (*%T NearPtr *)
  4129. mov si, [bp][buffer]
  4130. (*%E *)
  4131. writeMainLoop: (* main loop - translate and *)
  4132. mov cx, [bp][num] (* write a block *)
  4133. jcxz allWritten
  4134. cmp cx, [bp][writesize] (* exit when all written *)
  4135. jb cxRight
  4136. mov cx, [bp][writesize]
  4137. cxRight:
  4138. sub [bp][num], cx
  4139. les di, [bp][temp]
  4140. mov ah, 0AH
  4141. mov es:[di][-1], ah (* Dummy at buffer-1 *)
  4142. mov bh, CTLZ
  4143. mov bl, 0DH
  4144. (* this next loop is the time *)
  4145. writeTransLoop: (* one where transaltion takes place *)
  4146. lodsb
  4147. cmp al, ah
  4148. je doTrans (* no jump for no translate *)
  4149. doneTrans:
  4150. stosb
  4151. cmp al, bh
  4152. je writeCtlz (* ctl Z - terminate output *)
  4153. dec cx
  4154. jcxz writeBlock (* repeat loop body *)
  4155. lodsb
  4156. cmp al, ah
  4157. je doTrans
  4158. stosb
  4159. cmp al, bh
  4160. je writeCtlz
  4161. loop writeTransLoop
  4162. jmp writeBlock
  4163. doTrans: (* CR inserted here *)
  4164. cmp es:[di][-1], bl (* CR inserted here *)
  4165. je doneTrans
  4166. mov es:[di], bl
  4167. inc di
  4168. jmp doneTrans
  4169. writeCtlz:
  4170. mov byte [bp][flag], 1
  4171. jmp writeWrite
  4172. writeBlock:
  4173. mov byte [bp][flag], 0 (* write transalted block *)
  4174. writeWrite:
  4175. push [bp][handle]
  4176. push [bp][temp][2]
  4177. mov ax, [bp][temp]
  4178. push ax
  4179. sub di, ax
  4180. push di
  4181. push ss
  4182. lea ax, [bp][num_writ]
  4183. push ax
  4184. call far DOSWRITE
  4185. or ax, ax
  4186. jnz near writeError (* write error *)
  4187. mov ax, [bp][num_writ]
  4188. cmp ax, di
  4189. jne near writeFull (* media full *)
  4190. writeOK:
  4191. cmp byte [bp][flag], 0
  4192. je writeMainLoop (* go back for another block *)
  4193. allWritten:
  4194. (*%F NearPtr *)
  4195. mov ds, [bp][dgroup] (* output done *)
  4196. (*%E *)
  4197. mov bx, [bp][handle]
  4198. shl bx, 1
  4199. cmp byte [bp][flag], 0
  4200. je dontSet
  4201. test word [__openfd][bx], O_DEVICE (* if !device and ctl Z set EOF flag *)
  4202. jne dontSet
  4203. or word [__openfd][bx], _O_EOF
  4204. dontSet:
  4205. sub si, [bp][buffer]
  4206. jmp writeDone
  4207. writeBinary: (* binary output done here *)
  4208. mov ah, 40H
  4209. push [bp][handle]
  4210. (*%F NearPtr *)
  4211. push [bp][buffer][2]
  4212. (*%E *)
  4213. (*%T NearPtr *)
  4214. push ds
  4215. (*%E *)
  4216. push [bp][buffer]
  4217. push [bp][num]
  4218. push ss
  4219. lea ax, [bp][num_writ]
  4220. push ax
  4221. call far DOSWRITE
  4222. or ax, ax
  4223. jnz writeError
  4224. mov si, [bp][num_writ]
  4225. cmp si, [bp][num]
  4226. jne writeFull
  4227. (*%F NearPtr *)
  4228. mov ds, [bp][dgroup]
  4229. (*%E *)
  4230. mov bx, [bp][handle]
  4231. shl bx, 1
  4232. writeDone:
  4233. or word [__openfd][bx], O_CHANGED (* set file changed flag *)
  4234. writeEnd:
  4235. cmp byte [bp][reset], 0
  4236. je writeNoStack
  4237. add sp, WRITE_BUF_SIZE
  4238. writeNoStack:
  4239. mov ax, si (* return *)
  4240. (*%F SameDS *)
  4241. pop ds
  4242. (*%E *)
  4243. pop si
  4244. pop di
  4245. (*%F RegParam *)
  4246. pop dx
  4247. pop cx
  4248. pop bx
  4249. (*%E *)
  4250. (*%T RegParam *)
  4251. (*%T NearPtr *)
  4252. pop dx
  4253. (*%E *)
  4254. (*%E *)
  4255. mov sp, bp
  4256. pop bp
  4257. (*%F NearCall *)
  4258. ret far 0
  4259. (*%E *)
  4260. (*%T NearCall *)
  4261. ret 0
  4262. (*%E *)
  4263. writeError: (* error return *)
  4264. mov si, -1
  4265. mov bx, ax
  4266. jmp writeSetErr
  4267. writeEOF: (* EOF return *)
  4268. sub si, si
  4269. jmp writeEnd
  4270. writeFull: (* media full *)
  4271. mov bx, ENOSPC
  4272. mov si, ax
  4273. jmp writeSetErr
  4274. writeAccess: (* invalid access mode *)
  4275. mov si, -1
  4276. mov bx, EACCESS
  4277. jmp writeSetErr
  4278. writeInvalid: (* bad file *)
  4279. mov si, -1
  4280. mov bx, EBADF
  4281. jmp writeSetErr
  4282. writeNomem: (* no memory for buffer *)
  4283. mov bx, ENOMEM
  4284. writeSetErr: (* set errno *)
  4285. mov ax, bx
  4286. (*%F NearCall *)
  4287. call far __ioerr
  4288. (*%E *)
  4289. (*%T NearCall *)
  4290. call __ioerr
  4291. (*%E *)
  4292. jmp writeEnd
  4293. (*%E _OS2 *)
  4294. section
  4295. (*%T _OS2 *)
  4296. (*************************************************************************)
  4297. segment _DATA(DATA,28H)
  4298. segment _TEXT(CODE,28H)
  4299. extrn DOSREAD
  4300. extrn __ioerr
  4301. extrn __openfd
  4302. (*%F RegParam *)
  4303. handle = frame
  4304. buffer = 2+frame
  4305. (*%F NearPtr *)
  4306. num = 6+frame
  4307. (*%E *)
  4308. (*%T NearPtr *)
  4309. num = 4+frame
  4310. (*%E *)
  4311. dgroup = -2
  4312. num_read = -4
  4313. seekpos = -8
  4314. locals = 8
  4315. (*%E *)
  4316. (*%T RegParam *)
  4317. dgroup = -2
  4318. num_read = -4
  4319. handle = -6
  4320. buffer = -10
  4321. num = -12
  4322. seekpos = -16
  4323. locals = 16
  4324. (*%E *)
  4325. public _read :
  4326. push bp
  4327. mov bp, sp
  4328. sub sp, locals
  4329. (*%F RegParam *)
  4330. push bx
  4331. push cx
  4332. push dx
  4333. (*%E *)
  4334. (*%T RegParam *)
  4335. (*%T NearPtr *)
  4336. push dx
  4337. (*%E *)
  4338. (*%E *)
  4339. push di
  4340. push si
  4341. (*%F SameDS *)
  4342. push ds
  4343. mov di, _DATA
  4344. mov ds, di
  4345. (*%E *)
  4346. mov [bp][dgroup], ds
  4347. (*%T RegParam *)
  4348. mov [bp][handle], ax
  4349. mov [bp][buffer], bx
  4350. (*%F NearPtr *)
  4351. mov [bp][buffer][2], cx
  4352. mov [bp][num], dx
  4353. (*%E *)
  4354. (*%T NearPtr *)
  4355. mov [bp][num], cx
  4356. (*%E *)
  4357. mov bx, ax (* bx = file handle *)
  4358. (*%E *)
  4359. (*%F RegParam *)
  4360. mov bx, [bp][handle]
  4361. (*%E *)
  4362. shl bx, 1
  4363. mov cx, [__openfd][bx]
  4364. jcxz near $ReadInvalid (* file not open *)
  4365. test cx, O_WRONLY
  4366. jne near $ReadAccess (* access mode invalid *)
  4367. cmp word [bp][num], 0 (* read zero - do nothing *)
  4368. je near $ReadEOF
  4369. test cx, O_TEXT
  4370. je near $ReadBinary
  4371. $ReadText: (* test mode *)
  4372. test cx, _O_EOF
  4373. jne near $ReadEOF (* error - EOF flag set *)
  4374. $ReadMain:
  4375. push [bp][handle] (* read into user buffer *)
  4376. (*%F NearPtr *)
  4377. les di, [bp][buffer]
  4378. (*%E *)
  4379. (*%T NearPtr *)
  4380. mov di, [bp][buffer]
  4381. mov es, [bp][dgroup]
  4382. (*%E *)
  4383. push es
  4384. push di
  4385. push [bp][num]
  4386. push ss
  4387. lea ax, [bp][num_read]
  4388. push ax
  4389. call far DOSREAD
  4390. or ax, ax
  4391. jnz near $ReadError
  4392. mov cx, [bp][num_read]
  4393. mov ax, cx
  4394. jcxz $ReadCtlz
  4395. mov bh, CTLZ
  4396. cmp cx, 1
  4397. jne $ReadOneContinue
  4398. mov bl, es:[di]
  4399. inc di
  4400. cmp bl, bh
  4401. je $ReadCtlz
  4402. cmp word [bp][num], 1
  4403. je $ReadExit
  4404. $ReadOneContinue:
  4405. mov ah, 0DH
  4406. (*%F NearPtr *)
  4407. lds si, [bp][buffer]
  4408. (*%E *)
  4409. (*%T NearPtr *)
  4410. mov si, [bp][buffer]
  4411. (*%E *)
  4412. $ReadTransLoop: (* translation loop *)
  4413. lodsb
  4414. cmp al, ah
  4415. je $ReadMissCR (* skip LF *)
  4416. stosb
  4417. cmp al, bh
  4418. je $ReadCtlz (* hit ctl Z - terminate input *)
  4419. $ReadMissCR:
  4420. loop $ReadTransLoop
  4421. jmp $ReadDone
  4422. $ReadCtlz:
  4423. (*%F NearPtr *)
  4424. mov ds, [bp][dgroup]
  4425. (*%E *)
  4426. mov bx, [bp][handle]
  4427. shl bx, 1
  4428. test word [__openfd][bx], O_DEVICE (* if !device + ctl Z set EOF *)
  4429. jne $ReadDontSet
  4430. or word [__openfd][bx], _O_EOF
  4431. jcxz $ReadDontSet
  4432. dec di
  4433. $ReadDontSet:
  4434. jmp $ReadDone
  4435. $ReadBinary: (* binary read starts here *)
  4436. push [bp][handle]
  4437. (*%F NearPtr *)
  4438. push [bp][buffer][2]
  4439. (*%E *)
  4440. (*%T NearPtr *)
  4441. push ds
  4442. (*%E *)
  4443. push [bp][buffer]
  4444. push [bp][num]
  4445. push ss
  4446. lea ax, [bp][num_read]
  4447. push ax
  4448. call far DOSREAD
  4449. or ax, ax
  4450. jnz $ReadError
  4451. mov ax, [bp][num_read]
  4452. jmp $ReadExit
  4453. $ReadDone:
  4454. sub di, [bp][buffer]
  4455. $ReadEnd:
  4456. mov ax, di
  4457. $ReadExit:
  4458. (*%T SameDS *)
  4459. mov ds, [bp][dgroup]
  4460. (*%E *)
  4461. (*%F SameDS *) (* return *)
  4462. pop ds
  4463. (*%E *)
  4464. pop si
  4465. pop di
  4466. (*%F RegParam *)
  4467. pop dx
  4468. pop cx
  4469. pop bx
  4470. (*%E *)
  4471. (*%T RegParam *)
  4472. (*%T NearPtr *)
  4473. pop dx
  4474. (*%E *)
  4475. (*%E *)
  4476. mov sp, bp
  4477. pop bp
  4478. (*%F NearCall *)
  4479. ret far 0
  4480. (*%E *)
  4481. (*%T NearCall *)
  4482. ret 0
  4483. (*%E *)
  4484. $ReadError: (* return error *)
  4485. mov di, -1
  4486. mov bx, ax
  4487. jmp $ReadSetErr
  4488. $ReadEOF: (* return EOF *)
  4489. sub di, di
  4490. jmp $ReadEnd
  4491. $ReadAccess: (* invbalid access mode *)
  4492. mov di, -1
  4493. mov bx, EACCESS
  4494. jmp $ReadSetErr
  4495. $ReadInvalid: (* file not open *)
  4496. mov di, -1
  4497. mov bx, EBADF
  4498. $ReadSetErr: (* set errno *)
  4499. mov ax, bx
  4500. (*%F NearCall *)
  4501. call far __ioerr
  4502. (*%E *)
  4503. (*%T NearCall *)
  4504. call __ioerr
  4505. (*%E *)
  4506. jmp $ReadEnd
  4507. (*%E _OS2 *)
  4508. section
  4509. (*%T _OS2 *)
  4510. (****************************************************************************)
  4511. segment _DATA(DATA,28H)
  4512. segment _TEXT(CODE,28H)
  4513. extrn __ioerr
  4514. extrn DOSCHGFILEPTR
  4515. handle = frame
  4516. newpos = -4
  4517. locals = 4
  4518. public _tell :
  4519. push bp
  4520. mov bp, sp
  4521. sub sp, locals
  4522. (*%F RegParam *)
  4523. push [bp][handle]
  4524. (*%E *)
  4525. (*%T RegParam *)
  4526. push ax
  4527. (*%E *)
  4528. db 6AH, 00H (*I push 0 *)
  4529. db 6AH, 00H (*I push 0 *)
  4530. db 6AH, SEEK_CUR (*I push SEEK_CUR *)
  4531. push ss
  4532. lea ax, [bp][newpos]
  4533. push ax
  4534. call far DOSCHGFILEPTR
  4535. or ax, ax
  4536. jnz $TellError
  4537. mov ax, [bp][newpos]
  4538. mov dx, [bp][newpos][2]
  4539. $TellDone:
  4540. mov sp, bp
  4541. pop bp
  4542. (*%F NearCall *)
  4543. ret far 0
  4544. (*%E *)
  4545. (*%T NearCall *)
  4546. ret 0
  4547. (*%E *)
  4548. $TellError:
  4549. (*%F NearCall *)
  4550. call far __ioerr
  4551. (*%E *)
  4552. (*%T NearCall *)
  4553. call __ioerr
  4554. (*%E *)
  4555. mov ax, -1
  4556. cwd
  4557. jmp $TellDone
  4558. (*%E _OS2 *)
  4559. section
  4560. (*%T _OS2 *)
  4561. (****************************************************************************)
  4562. segment _BSS(BSS,28H)
  4563. segment _TEXT(CODE,28H)
  4564. extrn __openfd
  4565. extrn __ioerr
  4566. extrn DOSCHGFILEPTR
  4567. handle = frame
  4568. offset = 2+frame
  4569. whence = 6+frame
  4570. newpos = -4
  4571. locals = 4
  4572. public _lseek :
  4573. (*%F RegParam *)
  4574. push bp
  4575. mov bp, sp
  4576. sub sp, locals
  4577. mov bx, [bp][handle]
  4578. push bx
  4579. push [bp][offset][2]
  4580. push [bp][offset]
  4581. push [bp][whence]
  4582. lea ax, [bp][newpos]
  4583. push ss
  4584. push ax
  4585. call far DOSCHGFILEPTR
  4586. or ax, ax
  4587. jnz seekError
  4588. (*%F SameDS *)
  4589. push ds
  4590. mov ax, seg __openfd
  4591. mov ds, ax
  4592. (*%E *)
  4593. add bx, bx
  4594. and word [__openfd][bx], ~_O_EOF
  4595. (*%F SameDS *)
  4596. pop ds
  4597. (*%E *)
  4598. mov ax, [bp][newpos]
  4599. mov dx, [bp][newpos][2]
  4600. seekDone:
  4601. mov sp, bp
  4602. pop bp
  4603. (*%F NearCall *)
  4604. ret far 0
  4605. (*%E *)
  4606. (*%T NearCall *)
  4607. ret 0
  4608. (*%E *)
  4609. (*%E RegParam*)
  4610. (*%T RegParam *)
  4611. push bp
  4612. mov bp, sp
  4613. sub sp, locals
  4614. push bx
  4615. push cx
  4616. push ax
  4617. push cx
  4618. push bx
  4619. push dx
  4620. xchg bx,ax
  4621. lea ax, [bp][newpos]
  4622. push ss
  4623. push ax
  4624. call far DOSCHGFILEPTR
  4625. or ax, ax
  4626. jnz seekError
  4627. (*%F SameDS *)
  4628. push ds
  4629. mov ax, seg __openfd
  4630. mov ds, ax
  4631. (*%E *)
  4632. add bx, bx
  4633. and word [__openfd][bx], ~_O_EOF
  4634. (*%F SameDS *)
  4635. pop ds
  4636. (*%E *)
  4637. mov ax, [bp][newpos]
  4638. mov dx, [bp][newpos][2]
  4639. seekDone:
  4640. pop cx
  4641. pop bx
  4642. mov sp, bp
  4643. pop bp
  4644. (*%F NearCall *)
  4645. ret far 0
  4646. (*%E *)
  4647. (*%T NearCall *)
  4648. ret 0
  4649. (*%E *)
  4650. (*%E *)
  4651. seekError:
  4652. (*%F NearCall *)
  4653. call far __ioerr
  4654. (*%E *)
  4655. (*%T NearCall *)
  4656. call __ioerr
  4657. (*%E *)
  4658. mov ax, -1
  4659. cwd
  4660. jmp seekDone
  4661. (*%E _OS2 *)
  4662. section
  4663. (*%T _DLL *)
  4664. (****************************************************************************)
  4665. segment _DATA(DATA,28H)
  4666. segment _TEXT(CODE,28H)
  4667. extrn __exit1_vector
  4668. public __set_exit1_vector :
  4669. push ds
  4670. mov cx, _DATA
  4671. mov ds, cx
  4672. mov [__exit1_vector][2], bx
  4673. mov [__exit1_vector], ax
  4674. pop ds
  4675. ret far 0
  4676. (*%E _DLL *)
  4677. section
  4678. (*%F _OS2 *)
  4679. (****************************************************************************)
  4680. segment _DATA(DATA,28H)
  4681. segment _TEXT(CODE,28H)
  4682. extrn __seterrno
  4683. RetSize = 0
  4684. (*%F RegParam *)
  4685. buffer = frame
  4686. (*%E *)
  4687. (*%T RegParam *)
  4688. buffer = -4
  4689. locals = 4
  4690. (*%E *)
  4691. public __dos_findnext :
  4692. public _findnext :
  4693. push bp
  4694. mov bp, sp
  4695. (*%T RegParam *)
  4696. sub sp, locals
  4697. mov [bp][buffer], ax
  4698. (*%F NearPtr *)
  4699. mov [bp][buffer][2], bx
  4700. (*%E *)
  4701. (*%E *)
  4702. (*%F RegParam *)
  4703. push bx
  4704. push cx
  4705. push dx
  4706. (*%E *)
  4707. (*%T RegParam *)
  4708. (*%T NearPtr *)
  4709. push bx
  4710. (*%E *)
  4711. push cx
  4712. push dx
  4713. (*%E *)
  4714. push di
  4715. push si
  4716. push ds
  4717. (*%F NearPtr *)
  4718. lds dx, [bp][buffer]
  4719. (*%E *)
  4720. (*%T NearPtr *)
  4721. mov dx, [bp][buffer]
  4722. (*%E *)
  4723. mov ah, 1AH
  4724. extrn @DosInterrupt
  4725. (*%F NearCall *)
  4726. call far @DosInterrupt
  4727. (*%E *)
  4728. (*%T NearCall *)
  4729. call @DosInterrupt
  4730. (*%E *)
  4731. mov ah, 4FH
  4732. (*%F NearCall *)
  4733. call far @DosInterrupt
  4734. (*%E *)
  4735. (*%T NearCall *)
  4736. call @DosInterrupt
  4737. (*%E *)
  4738. jc Error
  4739. sub ax, ax
  4740. Exit:
  4741. pop ds
  4742. pop si
  4743. pop di
  4744. (*%F RegParam *)
  4745. pop dx
  4746. pop cx
  4747. pop bx
  4748. (*%E *)
  4749. (*%T RegParam *)
  4750. pop dx
  4751. pop cx
  4752. (*%T NearPtr *)
  4753. pop bx
  4754. (*%E *)
  4755. (*%E *)
  4756. (*%T RegParam *)
  4757. mov sp, bp
  4758. (*%E *)
  4759. pop bp
  4760. (*%F NearCall *)
  4761. ret far RetSize
  4762. (*%E *)
  4763. (*%T NearCall *)
  4764. ret RetSize
  4765. (*%E *)
  4766. Error:
  4767. (*%F NearCall *)
  4768. call far __seterrno
  4769. (*%E *)
  4770. (*%T NearCall *)
  4771. call __seterrno
  4772. (*%E *)
  4773. mov ax, -1
  4774. jmp Exit
  4775. section
  4776. (******************************************************************************)
  4777. segment _DATA(DATA,28H)
  4778. segment _TEXT(CODE,28H)
  4779. extrn __seterrno
  4780. (*%F RegParam *)
  4781. path = frame
  4782. (*%F NearPtr *)
  4783. attrib = 4+frame
  4784. buffer = 6+frame
  4785. (*%E *)
  4786. (*%T NearPtr *)
  4787. attrib = 2+frame
  4788. buffer = 4+frame
  4789. (*%E *)
  4790. RetSize = 0
  4791. (*%E *)
  4792. (*%T RegParam *)
  4793. (*%F NearPtr *)
  4794. path = -4
  4795. attrib = -6
  4796. buffer = frame
  4797. RetSize = 4
  4798. (*%E *)
  4799. (*%T NearPtr *)
  4800. path = -2
  4801. attrib = -4
  4802. buffer = -6
  4803. RetSize = 0
  4804. (*%E *)
  4805. locals = 6
  4806. (*%E *)
  4807. public __dos_findfirst :
  4808. push bp
  4809. mov bp, sp
  4810. (*%T RegParam *)
  4811. sub sp, locals
  4812. mov [bp][path], ax
  4813. (*%F NearPtr *)
  4814. mov [bp][path][2], bx
  4815. mov [bp][attrib], cx
  4816. (*%E *)
  4817. (*%T NearPtr *)
  4818. mov [bp][attrib], bx
  4819. mov [bp][buffer], cx
  4820. (*%E *)
  4821. (*%E *)
  4822. (*%F RegParam *)
  4823. push bx
  4824. push cx
  4825. push dx
  4826. (*%E *)
  4827. (*%T RegParam *)
  4828. (*%T NearPtr *)
  4829. push bx
  4830. (*%E *)
  4831. push cx
  4832. push dx
  4833. (*%E *)
  4834. push di
  4835. push si
  4836. push ds
  4837. (*%F NearPtr *)
  4838. lds dx, [bp][buffer]
  4839. (*%E *)
  4840. (*%T NearPtr *)
  4841. mov dx, [bp][buffer]
  4842. (*%E *)
  4843. mov ah, 1AH
  4844. extrn @DosInterrupt
  4845. (*%F NearCall *)
  4846. call far @DosInterrupt
  4847. (*%E *)
  4848. (*%T NearCall *)
  4849. call @DosInterrupt
  4850. (*%E *)
  4851. (*%F NearPtr *)
  4852. lds dx, [bp][path]
  4853. (*%E *)
  4854. (*%T NearPtr *)
  4855. mov dx, [bp][path]
  4856. (*%E *)
  4857. mov ah, 4EH
  4858. mov cx, [bp][attrib]
  4859. extrn @DosInterrupt
  4860. (*%F NearCall *)
  4861. call far @DosInterrupt
  4862. (*%E *)
  4863. (*%T NearCall *)
  4864. call @DosInterrupt
  4865. (*%E *)
  4866. jc Error
  4867. sub ax, ax
  4868. Exit:
  4869. pop ds
  4870. pop si
  4871. pop di
  4872. (*%F RegParam *)
  4873. pop dx
  4874. pop cx
  4875. pop bx
  4876. (*%E *)
  4877. (*%T RegParam *)
  4878. pop dx
  4879. pop cx
  4880. (*%T NearPtr *)
  4881. pop bx
  4882. (*%E *)
  4883. (*%E *)
  4884. (*%T RegParam *)
  4885. mov sp, bp
  4886. (*%E *)
  4887. pop bp
  4888. (*%F NearCall *)
  4889. ret far RetSize
  4890. (*%E *)
  4891. (*%T NearCall *)
  4892. ret RetSize
  4893. (*%E *)
  4894. Error:
  4895. (*%F NearCall *)
  4896. call far __seterrno
  4897. (*%E *)
  4898. (*%T NearCall *)
  4899. call __seterrno
  4900. (*%E *)
  4901. mov ax, -1
  4902. jmp Exit
  4903. (*%E _OS2 *)
  4904. (*%T _XTDDOS*)
  4905. section
  4906. (***************************************************************************)
  4907. segment _DATA(DATA,28H)
  4908. segment _TEXT(CODE,28H)
  4909. (* External data *)
  4910. extrn __ioerr
  4911. (* int _creat_trunc(char *path, int permission)
  4912. Creates file or truncates existing one. *)
  4913. public __creat :
  4914. public __creat_trunc :
  4915. (*%F RegParam *)
  4916. path = frame
  4917. (*%F NearPtr *)
  4918. permission = 4+frame
  4919. (*%E *)
  4920. (*%T NearPtr *)
  4921. permission = 2+frame
  4922. (*%E *)
  4923. push bp
  4924. mov bp, sp
  4925. push cx
  4926. push dx
  4927. (*%F NearPtr *)
  4928. push ds
  4929. (*%E *)
  4930. mov ah, 3CH
  4931. mov cx, [bp][permission]
  4932. (*%F NearPtr *)
  4933. lds dx, [bp][path]
  4934. (*%E *)
  4935. (*%T NearPtr *)
  4936. mov dx, [bp][path]
  4937. (*%E *)
  4938. extrn @DosInterrupt
  4939. (*%F NearCall *)
  4940. call far @DosInterrupt
  4941. (*%E *)
  4942. (*%T NearCall *)
  4943. call @DosInterrupt
  4944. (*%E *)
  4945. jnc creattOK
  4946. (*%F NearCall *)
  4947. call far __ioerr (* set errno *)
  4948. (*%E *)
  4949. (*%T NearCall *)
  4950. call __ioerr (* set errno *)
  4951. (*%E *)
  4952. mov ax, -1 (* return -1 *)
  4953. creattOK:
  4954. (*%F NearPtr *)
  4955. pop ds
  4956. (*%E *)
  4957. pop dx
  4958. pop cx
  4959. pop bp (* handle already in ax *)
  4960. (*%F NearCall *)
  4961. ret far 0
  4962. (*%E *)
  4963. (*%T NearCall *)
  4964. ret 0
  4965. (*%E *)
  4966. (*%E RegParam *)
  4967. (*%T RegParam *)
  4968. (*%T _DLLOVL *)
  4969. push bp
  4970. mov bp, sp
  4971. (*%E *)
  4972. (*%T NearPtr *)
  4973. push cx
  4974. (*%E *)
  4975. push dx
  4976. (*%F NearPtr *)
  4977. push ds
  4978. (*%E *)
  4979. (*%T NearPtr *)
  4980. mov cx, bx
  4981. (*%E *)
  4982. (*%F NearPtr *)
  4983. mov ds, bx
  4984. (*%E *)
  4985. mov dx, ax
  4986. mov ah, 3CH
  4987. extrn @DosInterrupt
  4988. (*%F NearCall *)
  4989. call far @DosInterrupt
  4990. (*%E *)
  4991. (*%T NearCall *)
  4992. call @DosInterrupt
  4993. (*%E *)
  4994. jnc creattOK
  4995. (*%F NearCall *)
  4996. call far __ioerr (* set errno *)
  4997. (*%E *)
  4998. (*%T NearCall *)
  4999. call __ioerr (* set errno *)
  5000. (*%E *)
  5001. mov ax, -1 (* return -1 *)
  5002. creattOK:
  5003. (*%F NearPtr *)
  5004. pop ds
  5005. (*%E *)
  5006. pop dx
  5007. (*%T NearPtr *)
  5008. pop cx
  5009. (*%E *)
  5010. (*%T _DLLOVL *)
  5011. pop bp
  5012. (*%E *)
  5013. (*%F NearCall *)
  5014. ret far 0
  5015. (*%E *)
  5016. (*%T NearCall *)
  5017. ret 0
  5018. (*%E *)
  5019. (*%E RegParam *)
  5020. section
  5021. (****************************************************************************)
  5022. segment _DATA(DATA,28H)
  5023. segment _TEXT(CODE,28H)
  5024. (* External data *)
  5025. extrn __ioerr
  5026. public __open :
  5027. (* int _open(char *path, int access)
  5028. opens file and returns handle. *)
  5029. (*%F RegParam *)
  5030. path = frame
  5031. (*%F NearPtr *)
  5032. access = 4+frame
  5033. (*%E *)
  5034. (*%T NearPtr *)
  5035. access = 2+frame
  5036. (*%E *)
  5037. push bp
  5038. mov bp, sp
  5039. push dx
  5040. (*%F NearPtr *)
  5041. push ds
  5042. (*%E *)
  5043. mov ah, 3DH
  5044. mov al, [bp][access]
  5045. (*%F NearPtr *)
  5046. lds dx, [bp][path]
  5047. (*%E *)
  5048. (*%T NearPtr *)
  5049. mov dx, [bp][path]
  5050. (*%E *)
  5051. extrn @DosInterrupt
  5052. (*%F NearCall *)
  5053. call far @DosInterrupt
  5054. (*%E *)
  5055. (*%T NearCall *)
  5056. call @DosInterrupt
  5057. (*%E *)
  5058. jnc openOK
  5059. (*%F NearCall *)
  5060. call far __ioerr (* set errno *)
  5061. (*%E *)
  5062. (*%T NearCall *)
  5063. call __ioerr (* set errno *)
  5064. (*%E *)
  5065. mov ax, -1 (* return -1 *)
  5066. openOK:
  5067. (*%F NearPtr *)
  5068. pop ds
  5069. (*%E *)
  5070. pop dx
  5071. pop bp (* handle already in ax *)
  5072. (*%F NearCall *)
  5073. ret far 0
  5074. (*%E *)
  5075. (*%T NearCall *)
  5076. ret 0
  5077. (*%E *)
  5078. (*%E RegParam *)
  5079. (*%T RegParam *)
  5080. (*%T _DLLOVL *)
  5081. push bp
  5082. mov bp, sp
  5083. (*%E *)
  5084. push dx
  5085. (*%F NearPtr *)
  5086. push ds
  5087. (*%E *)
  5088. (*%F NearPtr *)
  5089. mov ds, bx
  5090. (*%E *)
  5091. mov dx, ax
  5092. (*%F NearPtr *)
  5093. mov al, cl
  5094. (*%E *)
  5095. (*%T NearPtr *)
  5096. mov al, bl
  5097. (*%E *)
  5098. mov ah, 3DH
  5099. extrn @DosInterrupt
  5100. (*%F NearCall *)
  5101. call far @DosInterrupt
  5102. (*%E *)
  5103. (*%T NearCall *)
  5104. call @DosInterrupt
  5105. (*%E *)
  5106. jnc openOK
  5107. (*%F NearCall *)
  5108. call far __ioerr (* set errno *)
  5109. (*%E *)
  5110. (*%T NearCall *)
  5111. call __ioerr (* set errno *)
  5112. (*%E *)
  5113. mov ax, -1 (* return -1 *)
  5114. openOK:
  5115. (*%F NearPtr *)
  5116. pop ds
  5117. (*%E *)
  5118. pop dx
  5119. (*%T _DLLOVL *)
  5120. pop bp
  5121. (*%E *)
  5122. (*%F NearCall *)
  5123. ret far 0
  5124. (*%E *)
  5125. (*%T NearCall *)
  5126. ret 0
  5127. (*%E *)
  5128. (*%E RegParam *)
  5129. section
  5130. (*************************************************************************)
  5131. segment _DATA(DATA,28H)
  5132. segment _TEXT(CODE,28H)
  5133. (* External data *)
  5134. extrn __ioerr
  5135. public __dos_read :
  5136. (*%F RegParam *)
  5137. RetSize = 0
  5138. (*%E *)
  5139. (*%T RegParam *)
  5140. (*%T NearPtr *)
  5141. RetSize = 2
  5142. (*%E *)
  5143. (*%F NearPtr *)
  5144. RetSize = 4
  5145. (*%E *)
  5146. (*%E *)
  5147. (*%F RegParam *)
  5148. handle = frame
  5149. buffer = 2+frame
  5150. num = 6+frame
  5151. numread = 8+frame
  5152. (*%E *)
  5153. (*%T RegParam *)
  5154. numread = frame
  5155. (*%E *)
  5156. push bp
  5157. mov bp, sp
  5158. push ds
  5159. (*%T RegParam *)
  5160. mov ds, cx
  5161. mov cx, dx
  5162. mov dx, bx
  5163. mov bx, ax
  5164. (*%E *)
  5165. (*%F RegParam *)
  5166. mov bx, [bp][handle]
  5167. mov cx, [bp][num]
  5168. lds dx, [bp][buffer]
  5169. (*%E *)
  5170. mov ah, 3FH
  5171. extrn @DosInterrupt
  5172. (*%F NearCall *)
  5173. call far @DosInterrupt
  5174. (*%E *)
  5175. (*%T NearCall *)
  5176. call @DosInterrupt
  5177. (*%E *)
  5178. jnc readOK
  5179. (*%F NearCall *)
  5180. call far __ioerr (* set errno *)
  5181. (*%E *)
  5182. (*%T NearCall *)
  5183. call __ioerr (* set errno *)
  5184. (*%E *)
  5185. jmp Exit
  5186. readOK:
  5187. (*%F NearPtr *)
  5188. lds bx, [bp][numread]
  5189. (*%E *)
  5190. (*%T NearPtr *)
  5191. mov bx, [bp][numread]
  5192. mov cx, _DATA
  5193. mov ds, cx
  5194. (*%E *)
  5195. mov [bx], ax
  5196. sub ax, ax
  5197. Exit:
  5198. pop ds
  5199. pop bp (* number already in ax *)
  5200. (*%F NearCall *)
  5201. ret far RetSize
  5202. (*%E *)
  5203. (*%T NearCall *)
  5204. ret RetSize
  5205. (*%E *)
  5206. section
  5207. (*************************************************************************)
  5208. segment _DATA(DATA,28H)
  5209. segment _TEXT(CODE,28H)
  5210. (* External data *)
  5211. extrn __ioerr
  5212. public __dos_write :
  5213. (*%F RegParam *)
  5214. RetSize = 0
  5215. (*%E *)
  5216. (*%T RegParam *)
  5217. (*%T NearPtr *)
  5218. RetSize = 2
  5219. (*%E *)
  5220. (*%F NearPtr *)
  5221. RetSize = 4
  5222. (*%E *)
  5223. (*%E *)
  5224. (*%F RegParam *)
  5225. handle = frame
  5226. buffer = 2+frame
  5227. num = 6+frame
  5228. numwrit = 8+frame
  5229. (*%E *)
  5230. (*%T RegParam *)
  5231. numwrit = frame
  5232. (*%E *)
  5233. push bp
  5234. mov bp, sp
  5235. push ds
  5236. (*%T RegParam *)
  5237. mov ds, cx
  5238. mov cx, dx
  5239. mov dx, bx
  5240. mov bx, ax
  5241. (*%E *)
  5242. (*%F RegParam *)
  5243. mov bx, [bp][handle]
  5244. mov cx, [bp][num]
  5245. lds dx, [bp][buffer]
  5246. (*%E *)
  5247. mov ah, 40H
  5248. extrn @DosInterrupt
  5249. (*%F NearCall *)
  5250. call far @DosInterrupt
  5251. (*%E *)
  5252. (*%T NearCall *)
  5253. call @DosInterrupt
  5254. (*%E *)
  5255. jnc writOK
  5256. (*%F NearCall *)
  5257. call far __ioerr (* set errno *)
  5258. (*%E *)
  5259. (*%T NearCall *)
  5260. call __ioerr (* set errno *)
  5261. (*%E *)
  5262. jmp Exit
  5263. writOK:
  5264. (*%F NearPtr *)
  5265. lds bx, [bp][numwrit]
  5266. (*%E *)
  5267. (*%T NearPtr *)
  5268. mov bx, [bp][numwrit]
  5269. mov cx, _DATA
  5270. mov ds, cx
  5271. (*%E *)
  5272. mov [bx], ax
  5273. sub ax, ax
  5274. Exit:
  5275. pop ds
  5276. pop bp (* number already in ax *)
  5277. (*%F NearCall *)
  5278. ret far RetSize
  5279. (*%E *)
  5280. (*%T NearCall *)
  5281. ret RetSize
  5282. (*%E *)
  5283. section
  5284. (***************************************************************************)
  5285. segment _DATA(DATA,28H)
  5286. segment _TEXT(CODE,28H)
  5287. extrn __ioerr
  5288. (*%F _XTD *)
  5289. public __close :
  5290. (*%E *)
  5291. public __dos_close :
  5292. (* int _close(int handle)
  5293. closes file and returns 0 if succeessful. Low level DOS function. *)
  5294. (*%F RegParam *)
  5295. handle = frame
  5296. push bp
  5297. mov bp, sp
  5298. push bx
  5299. mov ah, 3EH
  5300. mov bx, [bp][handle]
  5301. extrn @DosInterrupt
  5302. (*%F NearCall *)
  5303. call far @DosInterrupt
  5304. (*%E *)
  5305. (*%T NearCall *)
  5306. call @DosInterrupt
  5307. (*%E *)
  5308. jnc closeOK
  5309. (*%F NearCall *)
  5310. call far __ioerr (* set errno *)
  5311. (*%E *)
  5312. (*%T NearCall *)
  5313. call __ioerr (* set errno *)
  5314. (*%E *)
  5315. mov ax, -1 (* return -1 *)
  5316. jmp closeDone
  5317. closeOK:
  5318. mov ax, 0 (* return 0 *)
  5319. closeDone:
  5320. pop bx
  5321. pop bp
  5322. (*%F NearCall *)
  5323. ret far 0
  5324. (*%E *)
  5325. (*%T NearCall *)
  5326. ret 0
  5327. (*%E *)
  5328. (*%E RegParam *)
  5329. (*%T RegParam *)
  5330. (*%T _DLLOVL *)
  5331. push bp
  5332. mov bp, sp
  5333. (*%E *)
  5334. push bx
  5335. mov bx, ax
  5336. mov ah, 3EH
  5337. extrn @DosInterrupt
  5338. (*%F NearCall *)
  5339. call far @DosInterrupt
  5340. (*%E *)
  5341. (*%T NearCall *)
  5342. call @DosInterrupt
  5343. (*%E *)
  5344. jnc closeOK
  5345. (*%F NearCall *)
  5346. call far __ioerr (* set errno *)
  5347. (*%E *)
  5348. (*%T NearCall *)
  5349. call __ioerr (* set errno *)
  5350. (*%E *)
  5351. mov ax, -1 (* return -1 *)
  5352. jmp closeDone
  5353. closeOK:
  5354. sub ax, ax (* return 0 *)
  5355. closeDone:
  5356. pop bx
  5357. (*%T _DLLOVL *)
  5358. pop bp
  5359. (*%E *)
  5360. (*%F NearCall *)
  5361. ret far 0
  5362. (*%E *)
  5363. (*%T NearCall *)
  5364. ret 0
  5365. (*%E *)
  5366. (*%E RegParam *)
  5367. (*%E _XTDDOS *)
  5368. end
  5369.