MODCORE.A 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * MODCORE.A - Modula core patches *
  5. * *
  6. * COPYRIGHT (C) 1989..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. include "corelib.inc"
  11. module ModCore
  12. segment _TEXT(CODE,28H)
  13. public __rreal_out :
  14. public __rreal_in :
  15. ret 0
  16. section
  17. segment _DATA(DATA,28H)
  18. (*%T _DLL *)
  19. public __dummy_ptr : dd __init_dummy
  20. (*%E *)
  21. segment _TEXT(CODE,28H)
  22. public __init_dummy :
  23. public __initwin:
  24. public __setvideomode :
  25. public __exit1 :
  26. public __initmt :
  27. (*%F NearCall *)
  28. ret far 0
  29. (*%E *)
  30. (*%T NearCall *)
  31. ret 0
  32. (*%E *)
  33. public __initgraph :
  34. ret far 0
  35. section
  36. (*%F _OS2 *)
  37. (****************************************************************************)
  38. segment _DATA(DATA,28H)
  39. segment _TEXT(CODE,28H)
  40. extrn __seterrno
  41. extrn __psp
  42. extrn __FloatExecSave
  43. extrn __FloatExecRestore
  44. public __exec :
  45. (* int cdecl _exec(char *pathname, struct paramblock *pblock)
  46. executes child process for system(). *)
  47. FCB5 = 6
  48. FCB6 = 10
  49. (*%F RegParam *)
  50. pathname = frame
  51. (*%F NearPtr *)
  52. pblock = 4+frame
  53. (*%E *)
  54. (*%T NearPtr *)
  55. pblock = 2+frame
  56. (*%E *)
  57. (*%E *)
  58. (*%F RegParam *)
  59. push bp
  60. mov bp, sp
  61. (*%E *)
  62. (*%T RegParam *)
  63. (*%T _DLLOVL *)
  64. push bp
  65. mov bp, sp
  66. (*%E *)
  67. (*%E *)
  68. call far __FloatExecSave
  69. push di
  70. push ds
  71. (*%F SameDS *)
  72. mov di, seg __psp
  73. mov ds, di
  74. (*%E *)
  75. mov di, [__psp]
  76. (*%F RegParam *)
  77. (*%F NearPtr *)
  78. lds dx, [bp][pathname]
  79. les bx, [bp][pblock]
  80. (*%E *)
  81. (*%T NearPtr *)
  82. mov dx, [bp][pathname]
  83. mov bx, [bp][pblock]
  84. push ds
  85. pop es
  86. (*%E *)
  87. (*%E *)
  88. (*%T RegParam *)
  89. (*%F NearPtr *)
  90. mov ds, bx
  91. mov es, dx
  92. mov dx, ax
  93. mov bx, cx
  94. (*%E *)
  95. (*%T NearPtr *)
  96. mov dx, ax
  97. push ds
  98. pop es
  99. (*%E *)
  100. (*%E *)
  101. mov es:[bx][FCB6][2], di
  102. mov word es:[bx][FCB6], 6CH
  103. mov es:[bx][FCB5][2], ax
  104. mov word es:[bx][FCB5], 5CH
  105. mov ax, 4B00H
  106. extrn @DosInterrupt
  107. (*%F NearCall *)
  108. call far @DosInterrupt
  109. (*%E *)
  110. (*%T NearCall *)
  111. call @DosInterrupt
  112. (*%E *)
  113. jnc execOK
  114. (*%F NearCall *)
  115. call far __seterrno
  116. (*%E *)
  117. (*%T NearCall *)
  118. call __seterrno
  119. (*%E *)
  120. mov ax, -1
  121. jmp execDone
  122. execOK:
  123. sub ax, ax (* success - return 0 *)
  124. execDone:
  125. pop ds
  126. pop di
  127. call far __FloatExecRestore
  128. (*%F RegParam *)
  129. pop bp
  130. (*%E *)
  131. (*%T RegParam *)
  132. (*%T _DLLOVL *)
  133. pop bp
  134. (*%E *)
  135. (*%E *)
  136. (*%F NearCall *)
  137. ret far 0
  138. (*%E *)
  139. (*%T NearCall *)
  140. ret 0
  141. (*%E *)
  142. (****************************************************************************)
  143. section
  144. segment _TEXT(CODE,28H)
  145. segment _DATA(DATA, 28H)
  146. select _TEXT
  147. public __get_retcode :
  148. (*
  149. int __get_retcode(void)
  150. get return code of child process.
  151. *)
  152. (*%T _DLLOVL *)
  153. push bp
  154. mov bp, sp
  155. (*%E *)
  156. mov ah, 4DH
  157. extrn @DosInterrupt
  158. (*%F NearCall *)
  159. call far @DosInterrupt
  160. (*%E *)
  161. (*%T NearCall *)
  162. call @DosInterrupt
  163. (*%E *)
  164. (*%T _DLLOVL *)
  165. pop bp
  166. (*%E *)
  167. (*%F NearCall *)
  168. ret far 0
  169. (*%E *)
  170. (*%T NearCall *)
  171. ret 0
  172. (*%E *)
  173. (*****************************************************************************)
  174. section
  175. segment _TEXT(CODE,28H)
  176. segment _DATA(DATA, 28H)
  177. select _DATA
  178. extrn __psp
  179. PrevTop : dw 0
  180. select _TEXT
  181. public _AdjustMem :
  182. (*%F RegParam *)
  183. Seg = frame
  184. push bp
  185. mov bp, sp
  186. mov ax, [bp][Seg]
  187. (*%E *)
  188. (*%T RegParam *)
  189. (*%T _DLLOVL *)
  190. push bp
  191. mov bp, sp
  192. (*%E *)
  193. (*%E *)
  194. push bx
  195. (*%F SameDS *)
  196. push ds
  197. mov bx, seg __psp
  198. mov ds, bx
  199. (*%E *)
  200. or ax, ax
  201. jnz notRestore
  202. mov ax, [PrevTop]
  203. notRestore:
  204. mov es, [__psp]
  205. mov bx, es:[2]
  206. mov es:[2], ax
  207. mov [PrevTop], bx
  208. mov bx, ax
  209. mov ax, es
  210. sub bx, ax
  211. mov ah, 4AH
  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. pop bx
  223. (*%F RegParam *)
  224. pop bp
  225. (*%E *)
  226. (*%T RegParam *)
  227. (*%T _DLLOVL *)
  228. pop bp
  229. (*%E *)
  230. (*%E *)
  231. (*%F NearCall *)
  232. ret far 0
  233. (*%E *)
  234. (*%T NearCall *)
  235. ret 0
  236. (*%E *)
  237. (*****************************************************************************)
  238. section
  239. segment _TEXT(CODE,28H)
  240. segment _DATA(DATA, 28H)
  241. select _DATA
  242. extrn __psp
  243. extrn __fmemsetup
  244. select _TEXT
  245. public __getheapmem :
  246. (*%T _DLLOVL *)
  247. push bp
  248. mov bp, sp
  249. (*%E *)
  250. push bx
  251. push cx
  252. (*%F SameDS *)
  253. push ds
  254. mov bx, seg __psp
  255. mov ds, bx
  256. (*%E *)
  257. mov byte [__fmemsetup], 1
  258. mov es, [__psp]
  259. mov ah, 4AH
  260. mov bx, 0C000H
  261. extrn @DosInterrupt
  262. (*%F NearCall *)
  263. call far @DosInterrupt
  264. (*%E *)
  265. (*%T NearCall *)
  266. call @DosInterrupt
  267. (*%E *)
  268. mov ah, 4AH
  269. (*%F NearCall *)
  270. call far @DosInterrupt
  271. (*%E *)
  272. (*%T NearCall *)
  273. call @DosInterrupt
  274. (*%E *)
  275. mov ax, es:[2] (* old top of mem *)
  276. mov cx, es
  277. add cx, bx
  278. mov es:[2], cx
  279. (*%F SameDS *)
  280. pop ds
  281. (*%E *)
  282. pop cx
  283. pop bx
  284. (*%T _DLLOVL *)
  285. pop bp
  286. (*%E *)
  287. (*%F NearCall *)
  288. ret far 0
  289. (*%E *)
  290. (*%T NearCall *)
  291. ret 0
  292. (*%E *)
  293. (*%E *)
  294. (*%E *) (* T OS2 *)
  295. (****************************************************************************)
  296. (*%T _OS2 *)
  297. segment _TEXT(CODE,28H)
  298. (* fixups for low level I/O *)
  299. public _time :
  300. public __flsbuf :
  301. public __filbuf :
  302. public __flusher :
  303. ret far 0
  304. (****************************************************************************)
  305. section
  306. segment _TEXT(CODE,28H)
  307. segment _DATA(DATA, 28H)
  308. extrn __ioerr
  309. extrn DOSWRITE
  310. select _TEXT
  311. public __write :
  312. (*%F RegParam *)
  313. handle = frame
  314. buffer = 2+frame
  315. (*%F NearPtr *)
  316. count = 6+frame
  317. (*%E *)
  318. (*%T NearPtr *)
  319. count = 4+frame
  320. (*%E *)
  321. numwrit= -2
  322. locals = 2
  323. push bp
  324. mov bp, sp
  325. sub sp, locals
  326. push [bp][handle]
  327. (*%F NearPtr *)
  328. push [bp][buffer][2]
  329. (*%E *)
  330. (*%T NearPtr *)
  331. push ds
  332. (*%E *)
  333. push [bp][buffer]
  334. push [bp][count]
  335. lea ax, [bp][numwrit]
  336. push ss
  337. push ax
  338. call far DOSWRITE
  339. or ax, ax
  340. jnz writeError
  341. mov ax, [bp][numwrit]
  342. writeDone:
  343. mov sp, bp
  344. pop bp
  345. (*%F NearCall *)
  346. ret far 0
  347. (*%E *)
  348. (*%T NearCall *)
  349. ret 0
  350. (*%E *)
  351. (*%E *)
  352. (*%T RegParam *)
  353. numwrit= -2
  354. locals = 2
  355. push bp
  356. mov bp, sp
  357. sub sp, locals
  358. push ax
  359. (*%F NearPtr *)
  360. push cx
  361. push bx
  362. push dx
  363. (*%E *)
  364. (*%T NearPtr *)
  365. push ds
  366. push bx
  367. push cx
  368. (*%E *)
  369. lea ax, [bp][numwrit]
  370. push ss
  371. push ax
  372. call far DOSWRITE
  373. or ax, ax
  374. jnz writeError
  375. mov ax, [bp][numwrit]
  376. writeDone:
  377. mov sp, bp
  378. pop bp
  379. (*%F NearCall *)
  380. ret far 0
  381. (*%E *)
  382. (*%T NearCall *)
  383. ret 0
  384. (*%E *)
  385. (*%E *)
  386. writeError:
  387. (*%F NearCall *)
  388. call far __ioerr
  389. (*%E *)
  390. (*%T NearCall *)
  391. call __ioerr
  392. (*%E *)
  393. mov ax, -1
  394. jmp writeDone
  395. (****************************************************************************)
  396. section
  397. segment _TEXT(CODE,28H)
  398. segment _DATA(DATA, 28H)
  399. select _TEXT
  400. extrn __ioerr
  401. extrn DOSREAD
  402. select _TEXT
  403. public __read :
  404. (*%F RegParam *)
  405. handle = frame
  406. buffer = 2+frame
  407. (*%F NearPtr *)
  408. count = 6+frame
  409. (*%E *)
  410. (*%T NearPtr *)
  411. count = 4+frame
  412. (*%E *)
  413. numread= -2
  414. locals = 2
  415. push bp
  416. mov bp, sp
  417. sub sp, locals
  418. push [bp][handle]
  419. (*%F NearPtr *)
  420. push [bp][buffer][2]
  421. (*%E *)
  422. (*%T NearPtr *)
  423. push ds
  424. (*%E *)
  425. push [bp][buffer]
  426. push [bp][count]
  427. lea ax, [bp][numread]
  428. push ss
  429. push ax
  430. call far DOSREAD
  431. or ax, ax
  432. jnz readError
  433. mov ax, [bp][numread]
  434. readDone:
  435. mov sp, bp
  436. pop bp
  437. (*%F NearCall *)
  438. ret far 0
  439. (*%E *)
  440. (*%T NearCall *)
  441. ret 0
  442. (*%E *)
  443. (*%E *)
  444. (*%T RegParam *)
  445. numread = -2
  446. locals = 2
  447. push bp
  448. mov bp, sp
  449. sub sp, locals
  450. push ax
  451. (*%F NearPtr *)
  452. push cx
  453. push bx
  454. push dx
  455. (*%E *)
  456. (*%T NearPtr *)
  457. push ds
  458. push bx
  459. push cx
  460. (*%E *)
  461. lea ax, [bp][numread]
  462. push ss
  463. push ax
  464. call far DOSREAD
  465. or ax, ax
  466. jnz readError
  467. mov ax, [bp][numread]
  468. readDone:
  469. mov sp, bp
  470. pop bp
  471. (*%F NearCall *)
  472. ret far 0
  473. (*%E *)
  474. (*%T NearCall *)
  475. ret 0
  476. (*%E *)
  477. (*%E *)
  478. readError:
  479. (*%F NearCall *)
  480. call far __ioerr
  481. (*%E *)
  482. (*%T NearCall *)
  483. call __ioerr
  484. (*%E *)
  485. mov ax, -1
  486. jmp readDone
  487. (****************************************************************************)
  488. section
  489. segment _TEXT(CODE,28H)
  490. segment _DATA(DATA, 28H)
  491. select _TEXT
  492. extrn __ioerr
  493. extrn DOSOPEN
  494. select _TEXT
  495. public __os2_open :
  496. (*%F RegParam *)
  497. path = frame
  498. (*%F NearPtr *)
  499. access = 4+frame
  500. mode = 6+frame
  501. flag = 8+frame
  502. (*%E *)
  503. (*%T NearPtr *)
  504. access = 2+frame
  505. mode = 4+frame
  506. flag = 6+frame
  507. (*%E *)
  508. handle = -2
  509. action = -4
  510. locals = 4
  511. push bp
  512. mov bp, sp
  513. sub sp, locals
  514. (*%F NearPtr *)
  515. push [bp][path][2]
  516. (*%E *)
  517. (*%T NearPtr *)
  518. push ds
  519. (*%E *)
  520. push [bp][path]
  521. lea ax, [bp][handle]
  522. push ss
  523. push ax
  524. lea ax, [bp][action]
  525. push ss
  526. push ax
  527. sub ax, ax
  528. push ax
  529. push ax
  530. push [bp][mode]
  531. push [bp][flag]
  532. mov bx, [bp][access]
  533. test bx, 0F0H
  534. jnz gotShare
  535. or bx, 40H
  536. gotShare:
  537. push bx
  538. push ax
  539. push ax
  540. call far DOSOPEN
  541. or ax, ax
  542. jnz openError
  543. mov ax, [bp][handle]
  544. openDone:
  545. mov sp, bp
  546. pop bp
  547. (*%F NearCall *)
  548. ret far 0
  549. (*%E *)
  550. (*%T NearCall *)
  551. ret 0
  552. (*%E *)
  553. (*%E *)
  554. (*%T RegParam *)
  555. (*%F NearPtr *)
  556. flag = frame
  557. RetSize = 2
  558. (*%E *)
  559. (*%T NearPtr *)
  560. RetSize = 0
  561. (*%E *)
  562. handle = -2
  563. action = -4
  564. locals = 4
  565. push bp
  566. mov bp, sp
  567. sub sp, locals
  568. (*%F NearPtr *)
  569. push bx
  570. push ax
  571. (*%E *)
  572. (*%T NearPtr *)
  573. push ds
  574. push ax
  575. (*%E *)
  576. lea ax, [bp][handle]
  577. push ss
  578. push ax
  579. lea ax, [bp][action]
  580. push ss
  581. push ax
  582. sub ax, ax
  583. push ax
  584. push ax
  585. (*%F NearPtr *)
  586. push dx
  587. push [bp][flag]
  588. mov bx, cx
  589. (*%E *)
  590. (*%T NearPtr *)
  591. push cx
  592. push dx
  593. (*%E *)
  594. test bx, 0F0H
  595. jnz gotShare
  596. or bx, 40H
  597. gotShare:
  598. push bx
  599. push ax
  600. push ax
  601. call far DOSOPEN
  602. or ax, ax
  603. jnz openError
  604. mov ax, [bp][handle]
  605. openDone:
  606. mov sp, bp
  607. pop bp
  608. (*%F NearCall *)
  609. ret far RetSize
  610. (*%E *)
  611. (*%T NearCall *)
  612. ret RetSize
  613. (*%E *)
  614. (*%E *)
  615. openError:
  616. (*%F NearCall *)
  617. call far __ioerr
  618. (*%E *)
  619. (*%T NearCall *)
  620. call __ioerr
  621. (*%E *)
  622. mov ax, -1
  623. jmp openDone
  624. (****************************************************************************)
  625. section
  626. segment _TEXT(CODE,28H)
  627. segment _DATA(DATA, 28H)
  628. select _TEXT
  629. extrn __ioerr
  630. extrn DOSCLOSE
  631. select _TEXT
  632. public __close :
  633. handle = frame
  634. push bp
  635. mov bp, sp
  636. (*%F RegParam *)
  637. push [bp][handle]
  638. (*%E *)
  639. (*%T RegParam *)
  640. push ax
  641. (*%E *)
  642. call far DOSCLOSE
  643. or ax, ax
  644. jnz closeError
  645. closeDone:
  646. pop bp
  647. (*%F NearCall *)
  648. ret far 0
  649. (*%E *)
  650. (*%T NearCall *)
  651. ret 0
  652. (*%E *)
  653. closeError:
  654. (*%F NearCall *)
  655. call far __ioerr
  656. (*%E *)
  657. (*%T NearCall *)
  658. call __ioerr
  659. (*%E *)
  660. mov ax, -1
  661. jmp closeDone
  662. (****************************************************************************)
  663. section
  664. segment _TEXT(CODE,28H)
  665. segment _DATA(DATA, 28H)
  666. select _TEXT
  667. extrn __ioerr
  668. extrn DOSCHDIR
  669. select _TEXT
  670. public _chdir :
  671. (*%F RegParam *)
  672. path = frame
  673. push bp
  674. mov bp, sp
  675. (*%F NearPtr *)
  676. push [bp][path][2]
  677. (*%E *)
  678. (*%T NearPtr *)
  679. push ds
  680. (*%E *)
  681. push [bp][path]
  682. sub ax, ax
  683. push ax
  684. push ax
  685. call far DOSCHDIR
  686. or ax, ax
  687. jnz dirError
  688. dirDone:
  689. pop bp
  690. (*%F NearCall *)
  691. ret far 0
  692. (*%E *)
  693. (*%T NearCall *)
  694. ret 0
  695. (*%E *)
  696. (*%E *)
  697. (*%T RegParam *)
  698. path = frame
  699. push bp
  700. mov bp, sp
  701. (*%F NearPtr *)
  702. push bx
  703. (*%E *)
  704. (*%T NearPtr *)
  705. push ds
  706. (*%E *)
  707. push ax
  708. sub ax, ax
  709. push ax
  710. push ax
  711. call far DOSCHDIR
  712. or ax, ax
  713. jnz dirError
  714. dirDone:
  715. pop bp
  716. (*%F NearCall *)
  717. ret far 0
  718. (*%E *)
  719. (*%T NearCall *)
  720. ret 0
  721. (*%E *)
  722. (*%E *)
  723. dirError:
  724. (*%F NearCall *)
  725. call far __ioerr
  726. (*%E *)
  727. (*%T NearCall *)
  728. call __ioerr
  729. (*%E *)
  730. mov ax, -1
  731. jmp dirDone
  732. (****************************************************************************)
  733. section
  734. segment _TEXT(CODE,28H)
  735. segment _DATA(DATA, 28H)
  736. select _TEXT
  737. extrn __ioerr
  738. extrn DOSMKDIR
  739. select _TEXT
  740. public _mkdir :
  741. (*%F RegParam *)
  742. path = frame
  743. push bp
  744. mov bp, sp
  745. (*%F NearPtr *)
  746. push [bp][path][2]
  747. (*%E *)
  748. (*%T NearPtr *)
  749. push ds
  750. (*%E *)
  751. push [bp][path]
  752. sub ax, ax
  753. push ax
  754. push ax
  755. call far DOSMKDIR
  756. or ax, ax
  757. jnz dirError
  758. dirDone:
  759. pop bp
  760. (*%F NearCall *)
  761. ret far 0
  762. (*%E *)
  763. (*%T NearCall *)
  764. ret 0
  765. (*%E *)
  766. (*%E *)
  767. (*%T RegParam *)
  768. path = frame
  769. push bp
  770. mov bp, sp
  771. (*%F NearPtr *)
  772. push bx
  773. (*%E *)
  774. (*%T NearPtr *)
  775. push ds
  776. (*%E *)
  777. push ax
  778. sub ax, ax
  779. push ax
  780. push ax
  781. call far DOSMKDIR
  782. or ax, ax
  783. jnz dirError
  784. dirDone:
  785. pop bp
  786. (*%F NearCall *)
  787. ret far 0
  788. (*%E *)
  789. (*%T NearCall *)
  790. ret 0
  791. (*%E *)
  792. (*%E *)
  793. dirError:
  794. (*%F NearCall *)
  795. call far __ioerr
  796. (*%E *)
  797. (*%T NearCall *)
  798. call __ioerr
  799. (*%E *)
  800. mov ax, -1
  801. jmp dirDone
  802. (****************************************************************************)
  803. section
  804. segment _TEXT(CODE,28H)
  805. segment _DATA(DATA, 28H)
  806. select _TEXT
  807. extrn __ioerr
  808. extrn DOSRMDIR
  809. select _TEXT
  810. public _rmdir :
  811. (*%F RegParam *)
  812. path = frame
  813. push bp
  814. mov bp, sp
  815. (*%F NearPtr *)
  816. push [bp][path][2]
  817. (*%E *)
  818. (*%T NearPtr *)
  819. push ds
  820. (*%E *)
  821. push [bp][path]
  822. sub ax, ax
  823. push ax
  824. push ax
  825. call far DOSRMDIR
  826. or ax, ax
  827. jnz dirError
  828. dirDone:
  829. pop bp
  830. (*%F NearCall *)
  831. ret far 0
  832. (*%E *)
  833. (*%T NearCall *)
  834. ret 0
  835. (*%E *)
  836. (*%E *)
  837. (*%T RegParam *)
  838. path = frame
  839. push bp
  840. mov bp, sp
  841. (*%F NearPtr *)
  842. push bx
  843. (*%E *)
  844. (*%T NearPtr *)
  845. push ds
  846. (*%E *)
  847. push ax
  848. sub ax, ax
  849. push ax
  850. push ax
  851. call far DOSRMDIR
  852. or ax, ax
  853. jnz dirError
  854. dirDone:
  855. pop bp
  856. (*%F NearCall *)
  857. ret far 0
  858. (*%E *)
  859. (*%T NearCall *)
  860. ret 0
  861. (*%E *)
  862. (*%E *)
  863. dirError:
  864. (*%F NearCall *)
  865. call far __ioerr
  866. (*%E *)
  867. (*%T NearCall *)
  868. call __ioerr
  869. (*%E *)
  870. mov ax, -1
  871. jmp dirDone
  872. (****************************************************************************)
  873. section
  874. segment _TEXT(CODE,28H)
  875. segment _DATA(DATA, 28H)
  876. select _TEXT
  877. extrn __ioerr
  878. extrn DOSQCURDIR
  879. select _TEXT
  880. public _getcurdir :
  881. (*%F RegParam *)
  882. drive = frame
  883. path = 2+frame
  884. length = -2
  885. locals = 2
  886. push bp
  887. mov bp, sp
  888. sub sp, locals
  889. mov word [bp][length], 64
  890. push [bp][drive]
  891. (*%F NearPtr *)
  892. push [bp][path][2]
  893. (*%E *)
  894. (*%T NearPtr *)
  895. push ds
  896. (*%E *)
  897. push [bp][path]
  898. push ss
  899. lea ax, [bp][length]
  900. push ax
  901. call far DOSQCURDIR
  902. or ax, ax
  903. jnz dirError
  904. dirDone:
  905. mov sp, bp
  906. pop bp
  907. (*%F NearCall *)
  908. ret far 0
  909. (*%E *)
  910. (*%T NearCall *)
  911. ret 0
  912. (*%E *)
  913. (*%E *)
  914. (*%T RegParam *)
  915. drive = frame
  916. path = 2+frame
  917. length = -2
  918. locals = 2
  919. push bp
  920. mov bp, sp
  921. sub sp, locals
  922. mov word [bp][length], 64
  923. push ax
  924. (*%F NearPtr *)
  925. push cx
  926. (*%E *)
  927. (*%T NearPtr *)
  928. push ds
  929. (*%E *)
  930. push bx
  931. push ss
  932. lea ax, [bp][length]
  933. push ax
  934. call far DOSQCURDIR
  935. or ax, ax
  936. jnz dirError
  937. dirDone:
  938. mov sp, bp
  939. pop bp
  940. (*%F NearCall *)
  941. ret far 0
  942. (*%E *)
  943. (*%T NearCall *)
  944. ret 0
  945. (*%E *)
  946. (*%E *)
  947. dirError:
  948. (*%F NearCall *)
  949. call far __ioerr
  950. (*%E *)
  951. (*%T NearCall *)
  952. call __ioerr
  953. (*%E *)
  954. mov ax, -1
  955. jmp dirDone
  956. (****************************************************************************)
  957. section
  958. segment _TEXT(CODE,28H)
  959. segment _DATA(DATA, 28H)
  960. select _TEXT
  961. extrn __ioerr
  962. extrn DOSMOVE
  963. select _TEXT
  964. public _rename :
  965. (*%F RegParam *)
  966. (*%F NearPtr *)
  967. newpath = 4+frame
  968. (*%E *)
  969. (*%T NearPtr *)
  970. newpath = 2+frame
  971. (*%E *)
  972. oldpath = frame
  973. push bp
  974. mov bp, sp
  975. (*%F NearPtr *)
  976. push [bp][oldpath][2]
  977. (*%E *)
  978. (*%T NearPtr *)
  979. push ds
  980. (*%E *)
  981. push [bp][oldpath]
  982. (*%F NearPtr *)
  983. push [bp][newpath][2]
  984. (*%E *)
  985. (*%T NearPtr *)
  986. push ds
  987. (*%E *)
  988. push [bp][newpath]
  989. sub ax, ax
  990. push ax
  991. push ax
  992. call far DOSMOVE
  993. or ax, ax
  994. jnz renameError
  995. renameDone:
  996. pop bp
  997. (*%F NearCall *)
  998. ret far 0
  999. (*%E *)
  1000. (*%T NearCall *)
  1001. ret 0
  1002. (*%E *)
  1003. (*%E *)
  1004. (*%T RegParam *)
  1005. (*%F NearPtr *)
  1006. push bx
  1007. push ax
  1008. push dx
  1009. push cx
  1010. (*%E *)
  1011. (*%T NearPtr *)
  1012. push ds
  1013. push ax
  1014. push ds
  1015. push bx
  1016. (*%E *)
  1017. sub ax, ax
  1018. push ax
  1019. push ax
  1020. call far DOSMOVE
  1021. or ax, ax
  1022. jnz renameError
  1023. renameDone:
  1024. (*%F NearCall *)
  1025. ret far 0
  1026. (*%E *)
  1027. (*%T NearCall *)
  1028. ret 0
  1029. (*%E *)
  1030. (*%E *)
  1031. renameError:
  1032. (*%F NearCall *)
  1033. call far __ioerr
  1034. (*%E *)
  1035. (*%T NearCall *)
  1036. call __ioerr
  1037. (*%E *)
  1038. mov ax, -1
  1039. jmp renameDone
  1040. (****************************************************************************)
  1041. section
  1042. segment _TEXT(CODE,28H)
  1043. segment _DATA(DATA, 28H)
  1044. select _TEXT
  1045. extrn __ioerr
  1046. extrn DOSDELETE
  1047. select _TEXT
  1048. public _unlink :
  1049. (*%F RegParam *)
  1050. path = frame
  1051. push bp
  1052. mov bp, sp
  1053. (*%F NearPtr *)
  1054. push [bp][path][2]
  1055. (*%E *)
  1056. (*%T NearPtr *)
  1057. push ds
  1058. (*%E *)
  1059. push [bp][path]
  1060. sub ax, ax
  1061. push ax
  1062. push ax
  1063. call far DOSDELETE
  1064. or ax, ax
  1065. jnz unlinkError
  1066. unlinkDone:
  1067. pop bp
  1068. (*%F NearCall *)
  1069. ret far 0
  1070. (*%E *)
  1071. (*%T NearCall *)
  1072. ret 0
  1073. (*%E *)
  1074. (*%E *)
  1075. (*%T RegParam *)
  1076. path = frame
  1077. push bp
  1078. mov bp, sp
  1079. (*%F NearPtr *)
  1080. push bx
  1081. (*%E *)
  1082. (*%T NearPtr *)
  1083. push ds
  1084. (*%E *)
  1085. push ax
  1086. sub ax, ax
  1087. push ax
  1088. push ax
  1089. call far DOSDELETE
  1090. or ax, ax
  1091. jnz unlinkError
  1092. unlinkDone:
  1093. pop bp
  1094. (*%F NearCall *)
  1095. ret far 0
  1096. (*%E *)
  1097. (*%T NearCall *)
  1098. ret 0
  1099. (*%E *)
  1100. (*%E *)
  1101. unlinkError:
  1102. (*%F NearCall *)
  1103. call far __ioerr
  1104. (*%E *)
  1105. (*%T NearCall *)
  1106. call __ioerr
  1107. (*%E *)
  1108. mov ax, -1
  1109. jmp unlinkDone
  1110. (**************************************************************************)
  1111. (*%F RegParam *)
  1112. section
  1113. segment _DATA(DATA, 28H)
  1114. (*%T SameDS *)
  1115. segment _TEXT(CODE,28H)
  1116. (*%E *)
  1117. (*%F SameDS *)
  1118. segment STR_TEXT(CODE,28H)
  1119. (*%E *)
  1120. public _strlen :
  1121. (*
  1122. size_t strlen(const char *s)
  1123. Returns length of s excluding terminating zero.
  1124. *)
  1125. s1 = frame
  1126. push bp
  1127. mov bp, sp
  1128. push cx
  1129. push di
  1130. (*%F NearPtr *)
  1131. les di, [bp][s1]
  1132. (*%E *)
  1133. (*%T NearPtr *)
  1134. mov di, [bp][s1]
  1135. push ds
  1136. pop es
  1137. (*%E *)
  1138. mov cx, 0FFFFH
  1139. sub al, al
  1140. repne ; scasb (* get length of string *)
  1141. not cx
  1142. mov ax, cx
  1143. dec ax (* return value is length of string *)
  1144. pop di
  1145. pop cx
  1146. pop bp
  1147. (*%F NearCall *)
  1148. ret far 0
  1149. (*%E *)
  1150. (*%T NearCall *)
  1151. ret 0
  1152. (*%E *)
  1153. public _strrchr :
  1154. (*
  1155. char *strrchr(const char *s, int c)
  1156. searches string for last occurrence c.
  1157. returns address of target byte if Found.
  1158. *)
  1159. addr = frame
  1160. (*%T NearPtr *)
  1161. chk = 2+frame
  1162. (*%E *)
  1163. (*%F NearPtr *)
  1164. chk = 4+frame
  1165. (*%E *)
  1166. push bp
  1167. mov bp, sp
  1168. push cx
  1169. push di
  1170. (*%F NearPtr *)
  1171. les di, [bp][addr]
  1172. (*%E *)
  1173. (*%T NearPtr *)
  1174. mov di, [bp][addr]
  1175. push ds
  1176. pop es
  1177. (*%E *)
  1178. mov cx, 0FFFFH
  1179. mov al, 0
  1180. repne ; scasb (* find end of string *)
  1181. sub di, 2
  1182. cmp di, [bp][addr] (* if it was a null string exit *)
  1183. jb rchrnotFound
  1184. std
  1185. mov al, [bp][chk]
  1186. not cx
  1187. dec cx
  1188. repne ; scasb (* search *)
  1189. je rchrFound
  1190. rchrnotFound:
  1191. sub ax, ax (* return NULL *)
  1192. cwd
  1193. jmp rchrDone
  1194. rchrFound:
  1195. inc di (* return address of Matching character *)
  1196. mov ax, di
  1197. (*%F NearPtr *)
  1198. mov dx, es
  1199. (*%E *)
  1200. rchrDone:
  1201. cld
  1202. pop di
  1203. pop cx
  1204. pop bp
  1205. (*%F NearCall *)
  1206. ret far 0
  1207. (*%E *)
  1208. (*%T NearCall *)
  1209. ret 0
  1210. (*%E *)
  1211. public _strnicmp :
  1212. (*
  1213. int strnicmp(const char *s1, const char *s2, int num)
  1214. Compares up to num characters.
  1215. Returns < 0 if s1<s2, 0 if s1=s2 and > 0 if s1 > s2.
  1216. *)
  1217. s1 = frame
  1218. (*%T NearPtr *)
  1219. s2 = 2+frame
  1220. num = 4+frame
  1221. (*%E *)
  1222. (*%F NearPtr *)
  1223. s2 = 4+frame
  1224. num = 8+frame
  1225. (*%E *)
  1226. push bp
  1227. mov bp, sp
  1228. push bx
  1229. push cx
  1230. push dx
  1231. push di
  1232. push si
  1233. (*%F NearPtr *)
  1234. push ds
  1235. lds si, [bp][s1]
  1236. les di, [bp][s2]
  1237. (*%E *)
  1238. (*%T NearPtr *)
  1239. mov si, [bp][s1]
  1240. mov di, [bp][s2]
  1241. push ds
  1242. pop es
  1243. (*%E *)
  1244. mov cx, [bp][num]
  1245. sub ax, ax
  1246. jcxz nicmpDone
  1247. mov dx, 7A61H
  1248. nicmpLoop:
  1249. lodsb
  1250. or al, al
  1251. je nicmpSame
  1252. cmp al, dh (* convert to upper if lower *)
  1253. ja notlowa
  1254. cmp al, dl
  1255. jb notlowa
  1256. sub al, 20H
  1257. notlowa:
  1258. mov bl, es:[di]
  1259. inc di (* convert to upper if lower *)
  1260. cmp bl, dh
  1261. ja notlowb
  1262. cmp bl, dl
  1263. jb notlowb
  1264. sub bl, 20H
  1265. notlowb:
  1266. cmp al, bl
  1267. jl nicmpLessThan
  1268. jg nicmpGreaterThan
  1269. loop nicmpLoop
  1270. nicmpSame:
  1271. sub ax, ax (* return 0 *)
  1272. jmp nicmpDone
  1273. nicmpLessThan:
  1274. mov ax, -1 (* return -1 *)
  1275. jmp nicmpDone
  1276. nicmpGreaterThan:
  1277. mov ax, 1 (* return 1 *)
  1278. nicmpDone:
  1279. (*%F NearPtr *)
  1280. pop ds
  1281. (*%E *)
  1282. pop si
  1283. pop di
  1284. pop dx
  1285. pop cx
  1286. pop bx
  1287. pop bp
  1288. (*%F NearCall *)
  1289. ret far 0
  1290. (*%E *)
  1291. (*%T NearCall *)
  1292. ret 0
  1293. (*%E *)
  1294. (*%E *)
  1295. (*%T RegParam *)
  1296. segment _DATA(DATA, 28H)
  1297. (*%T SameDS *)
  1298. segment _TEXT(CODE,28H)
  1299. (*%E *)
  1300. (*%F SameDS *)
  1301. segment STR_TEXT(CODE,28H)
  1302. (*%E *)
  1303. public _strlen :
  1304. (*
  1305. size_t strlen(const char *s)
  1306. Returns length of s excluding terminating zero.
  1307. *)
  1308. push cx
  1309. push di
  1310. (*%F NearPtr *)
  1311. mov es, bx
  1312. mov di, ax
  1313. (*%E *)
  1314. (*%T NearPtr *)
  1315. mov di, ax
  1316. push ds
  1317. pop es
  1318. (*%E *)
  1319. mov cx, 0FFFFH
  1320. sub al, al
  1321. repne ; scasb (* get length of string *)
  1322. not cx
  1323. mov ax, cx
  1324. dec ax (* return value is length of string *)
  1325. pop di
  1326. pop cx
  1327. (*%F NearCall *)
  1328. ret far 0
  1329. (*%E *)
  1330. (*%T NearCall *)
  1331. ret 0
  1332. (*%E *)
  1333. public _strrchr :
  1334. (*
  1335. char *strrchr(const char *s, int c)
  1336. searches string for last occurrence c.
  1337. returns address of target byte if Found.
  1338. *)
  1339. (*%T NearPtr *)
  1340. push cx
  1341. push dx
  1342. (*%E *)
  1343. push di
  1344. (*%F NearPtr *)
  1345. mov es, bx
  1346. mov di, ax
  1347. mov dx, ax
  1348. mov bx, cx
  1349. (*%E *)
  1350. (*%T NearPtr *)
  1351. mov di, ax
  1352. mov dx, ax
  1353. push ds
  1354. pop es
  1355. (*%E *)
  1356. mov cx, 0FFFFH
  1357. sub al, al
  1358. repne ; scasb (* find end of string *)
  1359. sub di, 2
  1360. cmp di, dx (* if it was a null string exit *)
  1361. jb rchrnotFound
  1362. std
  1363. mov al, bl
  1364. not cx
  1365. dec cx
  1366. repne ; scasb (* search *)
  1367. je rchrFound
  1368. rchrnotFound:
  1369. sub ax, ax (* return NULL *)
  1370. cwd
  1371. jmp rchrDone
  1372. rchrFound:
  1373. inc di (* return address of Matching character *)
  1374. mov ax, di
  1375. (*%F NearPtr *)
  1376. mov dx, es
  1377. (*%E *)
  1378. rchrDone:
  1379. cld
  1380. pop di
  1381. (*%T NearPtr *)
  1382. pop dx
  1383. pop cx
  1384. (*%E *)
  1385. (*%F NearCall *)
  1386. ret far 0
  1387. (*%E *)
  1388. (*%T NearCall *)
  1389. ret 0
  1390. (*%E *)
  1391. public _strnicmp :
  1392. (*
  1393. int strnicmp(const char *s1, const char *s2, int num)
  1394. Compares up to num characters.
  1395. Returns < 0 if s1<s2, 0 if s1=s2 and > 0 if s1 > s2.
  1396. *)
  1397. (*%T NearPtr *)
  1398. RetSize = 0
  1399. (*%E *)
  1400. (*%F NearPtr *)
  1401. RetSize = 2
  1402. (*%E *)
  1403. (*%F NearPtr *)
  1404. num = bxframe
  1405. (*%E *)
  1406. (*%F NearPtr *)
  1407. xchg bx, dx
  1408. mov es, bx
  1409. mov bx, sp
  1410. mov bx, ss:[bx][num]
  1411. (*%E *)
  1412. (*%T NearPtr *)
  1413. push dx
  1414. (*%E *)
  1415. push di
  1416. push si
  1417. (*%F NearPtr *)
  1418. push ds
  1419. mov ds, dx
  1420. mov si, ax
  1421. mov di, cx
  1422. mov cx, bx
  1423. (*%E *)
  1424. (*%T NearPtr *)
  1425. mov si, ax
  1426. mov di, bx
  1427. push ds
  1428. pop es
  1429. (*%E *)
  1430. sub ax, ax
  1431. jcxz nicmpDone
  1432. nicmpLoop:
  1433. lodsb
  1434. or al, al
  1435. je nicmpSame
  1436. cmp al, 'z' (* convert to upper if lower *)
  1437. ja notlowa
  1438. cmp al, 'a'
  1439. jb notlowa
  1440. sub al, 20H
  1441. notlowa:
  1442. mov bl, es:[di]
  1443. inc di (* convert to upper if lower *)
  1444. cmp bl, 'z'
  1445. ja notlowb
  1446. cmp bl, 'a'
  1447. jb notlowb
  1448. sub bl, 20H
  1449. notlowb:
  1450. cmp al, bl
  1451. jl nicmpLessThan
  1452. jg nicmpGreaterThan
  1453. loop nicmpLoop
  1454. nicmpSame:
  1455. sub ax, ax (* return 0 *)
  1456. jmp nicmpDone
  1457. nicmpLessThan:
  1458. mov ax, -1 (* return -1 *)
  1459. jmp nicmpDone
  1460. nicmpGreaterThan:
  1461. mov ax, 1 (* return 1 *)
  1462. nicmpDone:
  1463. (*%F NearPtr *)
  1464. pop ds
  1465. (*%E *)
  1466. pop si
  1467. pop di
  1468. (*%T NearPtr *)
  1469. pop dx
  1470. (*%E *)
  1471. (*%F NearCall *)
  1472. ret far RetSize
  1473. (*%E *)
  1474. (*%T NearCall *)
  1475. ret RetSize
  1476. (*%E *)
  1477. (*%E *)
  1478. (******************************************************************************)
  1479. section
  1480. segment _TEXT(CODE,28H)
  1481. segment _DATA(DATA, 28H)
  1482. extrn DOSQFILEMODE
  1483. select _DATA
  1484. select _TEXT
  1485. public __getfmode :
  1486. (*
  1487. int __getfmode(char *path)
  1488. *)
  1489. path = frame
  1490. mode = -2
  1491. locals = 2
  1492. push bp
  1493. mov bp, sp
  1494. sub sp, locals
  1495. (*%F RegParam *)
  1496. (*%F NearPtr *)
  1497. push [bp][path][2]
  1498. (*%E *)
  1499. (*%T NearPtr *)
  1500. push ds
  1501. (*%E *)
  1502. push [bp][path]
  1503. (*%E *)
  1504. (*%T RegParam *)
  1505. (*%F NearPtr *)
  1506. push bx
  1507. (*%E *)
  1508. (*%T NearPtr *)
  1509. push ds
  1510. (*%E *)
  1511. push ax
  1512. (*%E *)
  1513. push ss
  1514. lea ax, [bp][mode]
  1515. push ax
  1516. sub ax, ax
  1517. push ax
  1518. push ax
  1519. call far DOSQFILEMODE
  1520. or ax, ax
  1521. jz gfmOK
  1522. mov ax, -1
  1523. jmp gfmDone
  1524. gfmOK:
  1525. mov ax, [bp][mode]
  1526. gfmDone:
  1527. mov sp, bp
  1528. pop bp
  1529. (*%F NearCall *)
  1530. ret far 0
  1531. (*%E *)
  1532. (*%T NearCall *)
  1533. ret 0
  1534. (*%E *)
  1535. (*****************************************************************************)
  1536. section
  1537. segment _DATA(DATA, 28H)
  1538. (*%T SameDS *)
  1539. segment _TEXT(CODE,28H)
  1540. (*%E *)
  1541. (*%F SameDS *)
  1542. segment STR_TEXT(CODE,28H)
  1543. (*%E *)
  1544. (*%F RegParam *)
  1545. public _strcpy :
  1546. (* strcpy *)
  1547. dest = frame
  1548. (*%T NearPtr *)
  1549. source = 2+frame
  1550. (*%E *)
  1551. (*%F NearPtr *)
  1552. source = 4+frame
  1553. (*%E *)
  1554. push bp
  1555. mov bp, sp
  1556. push cx
  1557. push di
  1558. push si
  1559. (*%F NearPtr *)
  1560. push ds
  1561. les di, [bp][source]
  1562. (*%E *)
  1563. (*%T NearPtr *)
  1564. mov di, [bp][source]
  1565. push ds
  1566. pop es
  1567. (*%E *)
  1568. mov cx, -1
  1569. sub al, al
  1570. repne ; scasb
  1571. not cx
  1572. (*%F NearPtr *)
  1573. lds si, [bp][source]
  1574. les di, [bp][dest]
  1575. (*%E *)
  1576. (*%T NearPtr *)
  1577. mov si, [bp][source]
  1578. mov di, [bp][dest]
  1579. (*%E *)
  1580. shr cx, 1
  1581. rep; movsw
  1582. adc cx, cx
  1583. rep; movsb
  1584. mov ax, [bp][dest] (* return destination address *)
  1585. (*%F NearPtr *)
  1586. mov dx, es
  1587. pop ds
  1588. (*%E *)
  1589. pop si
  1590. pop di
  1591. pop cx
  1592. pop bp
  1593. (*%F NearCall *)
  1594. ret far 0
  1595. (*%E *)
  1596. (*%T NearCall *)
  1597. ret 0
  1598. (*%E *)
  1599. (*%E *)
  1600. (*%T RegParam *)
  1601. public _strcpy :
  1602. (* strcpy *)
  1603. (*%T NearPtr *)
  1604. push cx
  1605. push dx
  1606. (*%E *)
  1607. push di
  1608. push si
  1609. (*%F NearPtr *)
  1610. push ds
  1611. mov es, dx
  1612. mov di, cx (* source *)
  1613. mov ds, dx
  1614. mov si, cx
  1615. mov dx, ax (* save dest offset *)
  1616. (*%E *)
  1617. (*%T NearPtr *)
  1618. mov di, bx
  1619. mov si, bx
  1620. mov dx, ax
  1621. push ds
  1622. pop es
  1623. (*%E *)
  1624. mov cx, -1
  1625. sub al, al
  1626. repne ; scasb
  1627. not cx
  1628. (*%F NearPtr *)
  1629. mov es, bx
  1630. (*%E *)
  1631. mov di, dx
  1632. shr cx, 1
  1633. rep; movsw
  1634. adc cx, cx
  1635. rep; movsb
  1636. mov ax, dx (* return destination address *)
  1637. (*%F NearPtr *)
  1638. mov dx, es
  1639. pop ds
  1640. (*%E *)
  1641. pop si
  1642. pop di
  1643. (*%T NearPtr *)
  1644. pop dx
  1645. pop cx
  1646. (*%E *)
  1647. (*%F NearCall *)
  1648. ret far 0
  1649. (*%E *)
  1650. (*%T NearCall *)
  1651. ret 0
  1652. (*%E *)
  1653. (*%E *)
  1654. (*%E *)
  1655. end