LIB86.T
上传用户:jnzhq888
上传日期:2007-01-18
资源大小:51694k
文件大小:107k
源码类别:

操作系统开发

开发平台:

WINDOWS

  1. .fp 5 CW LucidaT   ." To use a font other than Lucida, change 'LucidaT'
  2. .po .9i
  3. .lg 0
  4. .nf
  5. .ec `
  6. .ps 7
  7. .vs 9
  8. .lt 5.25i
  9. `f5
  10. .nr Tb `w'0'
  11. .nr Fp 0
  12. .ta 9u*`n(Tbu 17u*`n(Tbu 25u*`n(Tbu 33u*`n(Tbu 41u*`n(Tbu 49u*`n(Tbu 57u*`n(Tbu 65u*`n(Tbu 73u*`n(Tbu 81u*`n(Tbu
  13. .de Op 
  14. .if ``n(Fp>0 .bp
  15. .nr Fp 1
  16. .sp 0.75i
  17. .tl '``fR``s10MINIX SOURCE CODE``s0'``s11File: ``$2``s0``fP'``fB``s12``n%``s0``fP'
  18. .sp 0.25i
  19. ..
  20. .de Ep 
  21. .if ``n(Fp>0 .bp
  22. .sp 0.75i
  23. .tl '``fB``s12``n%``s0``fP``fR'``s11File: ``$2'``s0``s10MINIX SOURCE CODE``s0``fP'
  24. .nr Fp 1
  25. .sp 0.25i
  26. ..
  27. .Op 1 src/lib/i86/em/adi.s
  28. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  29. src/lib/i86/em/adi.s    
  30. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  31. 00000 .define .adi
  32. 00001
  33. 00002         .text
  34. 00003 .adi:
  35. 00004         pop     bx 
  36. 00005         cmp     cx,#2
  37. 00006         jne     1f
  38. 00007         pop     cx
  39. 00008         add     ax,cx
  40. 00009         jmp     (bx)
  41. 00010 1:
  42. 00011         cmp     cx,#4
  43. 00012         jne     9f
  44. 00013         pop     dx
  45. 00014         pop     cx
  46. 00015         add     ax,cx
  47. 00016         pop     cx
  48. 00017         adc     dx,cx
  49. 00018         push    dx
  50. 00019         jmp     (bx)
  51. 00020 9:
  52. 00021 .extern .trpilin
  53. 00022         push    bx
  54. 00023         jmp     .trpilin
  55. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  56. src/lib/i86/em/and.s    
  57. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  58. 00100 .define .and
  59. 00101
  60. 00102         ! #bytes in cx
  61. 00103         ! save di; it might be a register variable
  62. 00104
  63. 00105         .text
  64. 00106 .and:
  65. 00107         pop     bx              ! return address
  66. 00108         mov     dx,di
  67. 00109         mov     di,sp
  68. 00110         add     di,cx
  69. 00111         sar     cx,#1
  70. 00112 1:
  71. 00113         pop     ax
  72. 00114         and     ax,(di)
  73. 00115         stos
  74. 00116         loop    1b
  75. 00117         mov     di,dx
  76. 00118         jmp     (bx)
  77. .Ep 2 src/lib/i86/em/blm.s
  78. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  79. src/lib/i86/em/blm.s    
  80. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  81. 00200 .define .blm
  82. 00201 .text
  83. 00202
  84. 00203         ! cx: count in words
  85. 00204 .blm:
  86. 00205         mov     bx,sp
  87. 00206         mov     ax,si
  88. 00207         mov     dx,di
  89. 00208         mov     di,2(bx)
  90. 00209         mov     si,4(bx)
  91. 00210         rep
  92. 00211         mov
  93. 00212         mov     si,ax
  94. 00213         mov     di,dx
  95. 00214         ret     4
  96. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  97. src/lib/i86/em/cii.s    
  98. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  99. 00300 .define .cii
  100. 00301
  101. 00302 .text
  102. 00303 .cii:
  103. 00304         pop     bx              ! return address
  104. 00305                                 ! pop     cx, dest. size
  105. 00306                                 ! pop     dx, src. size
  106. 00307                                 ! ax is first word of source
  107. 00308         cmp     dx,#1
  108. 00309         jne     2f
  109. 00310         cbw
  110. 00311         mov     dx,#2
  111. 00312 2:
  112. 00313         cmp     dx,cx
  113. 00314         je      8f
  114. 00315         cmp     dx,#2
  115. 00316         je      1f
  116. 00317         cmp     dx,#4
  117. 00318         jne     9f
  118. 00319         cmp     cx,#2
  119. 00320         jne     9f
  120. 00321         pop     dx
  121. 00322 8:
  122. 00323         jmp     (bx)
  123. 00324 1:
  124. 00325         cmp     cx,#4
  125. 00326         jne     9f
  126. 00327         cwd
  127. 00328         push    dx
  128. 00329         jmp     (bx)
  129. .Op 3 src/lib/i86/em/cii.s
  130. 00330 9:
  131. 00331         push    ax              ! push low source
  132. 00332 EILLINS = 18
  133. 00333 .extern .fat
  134. 00334         mov     ax,#EILLINS
  135. 00335         push    ax
  136. 00336         jmp     .fat
  137. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  138. src/lib/i86/em/cmi4.s    
  139. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  140. 00400 .define .cmi4
  141. 00401
  142. 00402 .text
  143. 00403 .cmi4:
  144. 00404         pop     bx              ! return address
  145. 00405         pop     cx
  146. 00406         pop     dx
  147. 00407         pop     ax
  148. 00408         push    si
  149. 00409         mov     si,sp
  150. 00410         xchg    bx,2(si)
  151. 00411         pop     si
  152. 00412         cmp     bx,dx
  153. 00413         jg      1f
  154. 00414         jl      2f
  155. 00415         cmp     ax,cx
  156. 00416         ja      1f
  157. 00417         je      3f
  158. 00418 2:
  159. 00419         mov     ax,#-1
  160. 00420         ret
  161. 00421 3:
  162. 00422         xor     ax,ax
  163. 00423         ret
  164. 00424 1:
  165. 00425         mov     ax,#1
  166. 00426         ret
  167. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  168. src/lib/i86/em/cms.s    
  169. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  170. 00500 .define .cms
  171. 00501
  172. 00502         ! #bytes in cx
  173. 00503         .text
  174. 00504 .cms:
  175. 00505         pop     bx              ! return address
  176. 00506         mov     dx,sp
  177. 00507         push    si
  178. 00508         push    di
  179. 00509         mov     si,dx
  180. .Ep 4 src/lib/i86/em/cms.s
  181. 00510         add     dx,cx
  182. 00511         mov     di,dx
  183. 00512         add     dx,cx
  184. 00513         sar     cx,#1
  185. 00514         repe
  186. 00515         cmp
  187. 00516         je      1f
  188. 00517         inc     cx
  189. 00518 1:
  190. 00519         pop     di
  191. 00520         pop     si
  192. 00521         mov     sp,dx
  193. 00522         jmp     (bx)
  194. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  195. src/lib/i86/em/cmu4.s    
  196. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  197. 00600 .define .cmu4
  198. 00601
  199. 00602 .text
  200. 00603 .cmu4:
  201. 00604         pop     bx              ! return address
  202. 00605         pop     cx
  203. 00606         pop     dx
  204. 00607         pop     ax
  205. 00608         push    si
  206. 00609         mov     si,sp
  207. 00610         xchg    bx,2(si)
  208. 00611         pop     si
  209. 00612         cmp     bx,dx
  210. 00613         ja      1f
  211. 00614         jb      2f
  212. 00615         cmp     ax,cx
  213. 00616         ja      1f
  214. 00617         je      3f
  215. 00618 2:
  216. 00619         mov     ax,#-1
  217. 00620         ret
  218. 00621 3:
  219. 00622         xor     ax,ax
  220. 00623         ret
  221. 00624 1:
  222. 00625         mov     ax,#1
  223. 00626         ret
  224. .Op 5 src/lib/i86/em/com.s
  225. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  226. src/lib/i86/em/com.s    
  227. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  228. 00700 .define .com
  229. 00701
  230. 00702         ! #bytes in cx
  231. 00703         .text
  232. 00704 .com:
  233. 00705         mov     bx,sp
  234. 00706         inc     bx
  235. 00707         inc     bx
  236. 00708         sar     cx,#1
  237. 00709 1:
  238. 00710         not     (bx)
  239. 00711         inc     bx
  240. 00712         inc     bx
  241. 00713         loop    1b
  242. 00714         ret
  243. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  244. src/lib/i86/em/csa2.s    
  245. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  246. 00800 .define .csa2
  247. 00801
  248. 00802 .text
  249. 00803 .csa2:
  250. 00804                                 ! bx, descriptor address
  251. 00805                                 ! ax, index
  252. 00806         mov     dx,(bx)         ! default
  253. 00807         sub     ax,2(bx)
  254. 00808         cmp     ax,4(bx)
  255. 00809         ja      1f
  256. 00810         sal     ax,#1
  257. 00811         add     bx,ax
  258. 00812         mov     bx,6(bx)
  259. 00813         test    bx,bx
  260. 00814         jnz     2f
  261. 00815 1:
  262. 00816         mov     bx,dx
  263. 00817         test    bx,bx
  264. 00818         jnz     2f
  265. 00819 ECASE = 20
  266. 00820 .extern .fat
  267. 00821         mov     ax,#ECASE
  268. 00822         push    ax
  269. 00823         jmp     .fat
  270. 00824 2:
  271. 00825         jmp     (bx)
  272. .Ep 6 src/lib/i86/em/csa4.s
  273. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  274. src/lib/i86/em/csa4.s    
  275. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  276. 00900 .sect .text; .sect .rom; .sect .data; .sect .bss
  277. 00901 .define .csa4
  278. 00902
  279. 00903 .sect .text
  280. 00904 .csa4:
  281. 00905                                 ! bx, descriptor address
  282. 00906                                 ! ax, dx: index
  283. 00907         mov     cx,(bx)         ! default
  284. 00908         sub     ax,2(bx)
  285. 00909                                 ! ignore high order word; if non-zero, the
  286. 00910                                 ! case descriptor would not fit anyway
  287. 00911         cmp     ax,6(bx)
  288. 00912         ja      1f
  289. 00913 2:
  290. 00914         sal     ax,#1
  291. 00915         add     bx,ax
  292. 00916         mov     bx,10(bx)
  293. 00917         test    bx,bx
  294. 00918         jnz     2f
  295. 00919 1:
  296. 00920         mov     bx,cx
  297. 00921         test    bx,bx
  298. 00922         jnz     2f
  299. 00923 ECASE = 20
  300. 00924 .extern .fat
  301. 00925         mov     ax,#ECASE
  302. 00926         push    ax
  303. 00927         jmp     .fat
  304. 00928 2:
  305. 00929         jmp     (bx)
  306. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  307. src/lib/i86/em/csb2.s    
  308. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  309. 01000 .define .csb2
  310. 01001
  311. 01002 .text
  312. 01003 .csb2:
  313. 01004                                 !bx, descriptor address
  314. 01005                                 !ax,  index
  315. 01006         mov     dx,(bx)
  316. 01007         mov     cx,2(bx)
  317. 01008 1:
  318. 01009         add     bx,#4
  319. 01010         dec     cx
  320. 01011         jl      4f
  321. 01012         cmp     ax,(bx)
  322. 01013         jne     1b
  323. 01014         mov     bx,2(bx)
  324. .Op 7 src/lib/i86/em/csb2.s
  325. 01015 2:
  326. 01016         test    bx,bx
  327. 01017         jnz     3f
  328. 01018 ECASE = 20
  329. 01019 .extern .fat
  330. 01020         mov     ax,#ECASE
  331. 01021         push    ax
  332. 01022         jmp     .fat
  333. 01023 3:
  334. 01024         jmp     (bx)
  335. 01025 4:
  336. 01026         mov     bx,dx
  337. 01027         jmp     2b
  338. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  339. src/lib/i86/em/csb4.s    
  340. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  341. 01100 .sect .text; .sect .rom; .sect .data; .sect .bss
  342. 01101 .define .csb4
  343. 01102
  344. 01103 .sect .text
  345. 01104 .csb4:
  346. 01105                                 !bx: descriptor address
  347. 01106                                 !ax, dx:  index
  348. 01107         push    (bx)            ! default
  349. 01108         mov     cx,2(bx)        ! count (ignore high order word, the descriptor
  350. 01109                                 ! would not fit anyway)
  351. 01110 1:
  352. 01111         add     bx,#6
  353. 01112         dec     cx
  354. 01113         jl      4f
  355. 01114         cmp     ax,(bx)
  356. 01115         jne     1b
  357. 01116         cmp     dx,2(bx)
  358. 01117         jne     1b
  359. 01118         pop     bx
  360. 01119         mov     bx,4(bx)
  361. 01120 2:
  362. 01121         test    bx,bx
  363. 01122         jnz     3f
  364. 01123 ECASE = 20
  365. 01124 .extern .fat
  366. 01125         mov     ax,#ECASE
  367. 01126         push    ax
  368. 01127         jmp     .fat
  369. 01128 3:
  370. 01129         jmp     (bx)
  371. 01130 4:
  372. 01131         pop     bx
  373. 01132         jmp     2b
  374. .Ep 8 src/lib/i86/em/cuu.s
  375. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  376. src/lib/i86/em/cuu.s    
  377. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  378. 01200 .define .ciu
  379. 01201 .define .cui
  380. 01202 .define .cuu
  381. 01203
  382. 01204 .text
  383. 01205 .ciu:
  384. 01206 .cui:
  385. 01207 .cuu:
  386. 01208         pop     bx              ! return address
  387. 01209                                 ! pop     cx, dest. size
  388. 01210                                 ! pop     dx, source size
  389. 01211                                 ! ax is low word of source
  390. 01212         cmp     dx,cx
  391. 01213         je      8f
  392. 01214         cmp     dx,#2
  393. 01215         je      1f
  394. 01216         cmp     dx,#4
  395. 01217         jne     9f
  396. 01218         cmp     cx,#2
  397. 01219         jne     9f
  398. 01220         pop     dx
  399. 01221 8:
  400. 01222         jmp     (bx)
  401. 01223 1:
  402. 01224         cmp     cx,#4
  403. 01225         jne     9f
  404. 01226         xor     dx,dx
  405. 01227         push    dx
  406. 01228         jmp     (bx)
  407. 01229 9:
  408. 01230         push    ax              ! to help debugging ?
  409. 01231 EILLINS = 18
  410. 01232 .extern .fat
  411. 01233         mov     ax,#EILLINS
  412. 01234         push    ax
  413. 01235         jmp     .fat
  414. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  415. src/lib/i86/em/dup.s    
  416. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  417. 01300 .define .dup
  418. 01301
  419. 01302         ! #bytes in cx
  420. 01303         .text
  421. 01304 .dup:
  422. 01305         pop     bx              ! return address
  423. 01306         mov     ax,si
  424. 01307         mov     dx,di
  425. 01308         mov     si,sp
  426. 01309         sub     sp,cx
  427. .Op 9 src/lib/i86/em/dup.s
  428. 01310         mov     di,sp
  429. 01311         sar     cx,#1
  430. 01312         rep
  431. 01313         mov
  432. 01314         mov     si,ax
  433. 01315         mov     di,dx
  434. 01316         jmp     (bx)
  435. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  436. src/lib/i86/em/dvi4.s    
  437. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  438. 01400 .define .dvi4
  439. 01401
  440. 01402 yl=6
  441. 01403 yh=8
  442. 01404 xl=10
  443. 01405 xh=12
  444. 01406
  445. 01407 .text
  446. 01408 .dvi4:
  447. 01409         push    si
  448. 01410         push    di
  449. 01411         mov     si,sp           ! copy of sp
  450. 01412         mov     bx,yl(si)
  451. 01413         mov     ax,yh(si)
  452. 01414         cwd
  453. 01415         mov     di,dx
  454. 01416         cmp     dx,ax
  455. 01417         jne     7f
  456. 01418         and     dx,dx
  457. 01419         jge     1f
  458. 01420         neg     bx
  459. 01421         je      7f
  460. 01422 1:
  461. 01423         xor     dx,dx
  462. 01424         mov     cx,xl(si)
  463. 01425         mov     ax,xh(si)
  464. 01426         and     ax,ax
  465. 01427         jge     2f
  466. 01428         neg     ax
  467. 01429         neg     cx
  468. 01430         sbb     ax,dx
  469. 01431         not     di
  470. 01432 2:
  471. 01433         div     bx
  472. 01434         xchg    ax,cx
  473. 01435         div     bx              ! cx = high abs(result), ax=low abs(result)
  474. 01436 9:
  475. 01437         and     di,di
  476. 01438         jge     1f
  477. 01439         neg     cx
  478. 01440         neg     ax
  479. 01441         sbb     cx,#0
  480. 01442 1:
  481. 01443                         ! cx is high order result
  482. 01444                         ! ax is low order result
  483. .Ep 10 src/lib/i86/em/dvi4.s
  484. 01445         mov     dx,cx
  485. 01446         pop     di
  486. 01447         pop     si
  487. 01448         ret     8       ! result in ax/dx
  488. 01449
  489. 01450 7:
  490. 01451         push    dx              ! sign of y
  491. 01452         mov     di,ax
  492. 01453         xor     bx,bx
  493. 01454         and     di,di
  494. 01455         jge     1f
  495. 01456         neg     di
  496. 01457         neg     yl(si)
  497. 01458         sbb     di,bx
  498. 01459 1:
  499. 01460         mov     ax,xl(si)
  500. 01461         mov     dx,xh(si)
  501. 01462         and     dx,dx
  502. 01463         jge     1f
  503. 01464         neg     dx
  504. 01465         neg     ax
  505. 01466         sbb     dx,bx
  506. 01467         not     -2(si)
  507. 01468 1:
  508. 01469         mov     cx,#16
  509. 01470 1:
  510. 01471         shl     ax,#1
  511. 01472         rcl     dx,#1
  512. 01473         rcl     bx,#1
  513. 01474         cmp     di,bx
  514. 01475         ja      3f
  515. 01476         jb      2f
  516. 01477         cmp     yl(si),dx
  517. 01478         jbe     2f
  518. 01479 3:
  519. 01480         loop    1b
  520. 01481         jmp     1f
  521. 01482 2:
  522. 01483         sub     dx,yl(si)
  523. 01484         sbb     bx,di
  524. 01485         inc     ax
  525. 01486         loop    1b
  526. 01487 1:
  527. 01488         pop     di              ! di=sign of result,ax= result
  528. 01489         jmp     9b
  529. .Op 11 src/lib/i86/em/dvu4.s
  530. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  531. src/lib/i86/em/dvu4.s    
  532. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  533. 01500 .define .dvu4
  534. 01501
  535. 01502 yl=6
  536. 01503 yh=8
  537. 01504 xl=10
  538. 01505 xh=12
  539. 01506
  540. 01507 .text
  541. 01508 .dvu4:
  542. 01509         push    si
  543. 01510         push    di
  544. 01511         mov     si,sp           ! copy of sp
  545. 01512         mov     bx,yl(si)
  546. 01513         mov     ax,yh(si)
  547. 01514         or      ax,ax
  548. 01515         jne     7f
  549. 01516         xor     dx,dx
  550. 01517         mov     cx,xl(si)
  551. 01518         mov     ax,xh(si)
  552. 01519         div     bx
  553. 01520         xchg    ax,cx
  554. 01521         div     bx
  555. 01522 9:
  556. 01523                         ! cx is high order result
  557. 01524                         ! ax is low order result
  558. 01525         mov     dx,cx
  559. 01526         pop     di
  560. 01527         pop     si
  561. 01528         ret     8       ! result in ax/dx
  562. 01529
  563. 01530 7:
  564. 01531         mov     di,ax
  565. 01532         xor     bx,bx
  566. 01533         mov     ax,xl(si)
  567. 01534         mov     dx,xh(si)
  568. 01535         mov     cx,#16
  569. 01536 1:
  570. 01537         shl     ax,#1
  571. 01538         rcl     dx,#1
  572. 01539         rcl     bx,#1
  573. 01540         cmp     di,bx
  574. 01541         ja      3f
  575. 01542         jb      2f
  576. 01543         cmp     yl(si),dx
  577. 01544         jbe     2f
  578. 01545 3:
  579. 01546         loop    1b
  580. 01547         jmp     9b
  581. 01548 2:
  582. 01549         sub     dx,yl(si)
  583. 01550         sbb     bx,di
  584. 01551         inc     ax
  585. 01552         loop    1b
  586. 01553         jmp     9b
  587. .Ep 12 src/lib/i86/em/error.s
  588. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  589. src/lib/i86/em/error.s    
  590. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  591. 01600 .define .error
  592. 01601 .define .Xtrp
  593. 01602
  594. 01603         ! ax is trap number
  595. 01604         ! all registers must be saved
  596. 01605         ! because return is possible
  597. 01606         ! May only be called with error no's <16
  598. 01607 .text
  599. 01608 .error:
  600. 01609         push bp
  601. 01610         push si
  602. 01611         push di
  603. 01612         push dx
  604. 01613         push cx
  605. 01614         push bx
  606. 01615         push ax
  607. 01616         mov  cx,ax
  608. 01617         mov  bx,#1
  609. 01618         sal  bx,cl
  610. 01619 .extern .ignmask
  611. 01620 .extern .trp
  612. 01621         test bx,.ignmask
  613. 01622         jne  2f
  614. 01623         call    .trp
  615. 01624 2:
  616. 01625         pop  ax
  617. 01626         pop  bx
  618. 01627         pop  cx
  619. 01628         pop  dx
  620. 01629         pop  di
  621. 01630         pop  si
  622. 01631         pop  bp
  623. 01632         ret
  624. 01633
  625. 01634 .Xtrp:
  626. 01635         cmp     ax,#16
  627. 01636         jge     1f
  628. 01637         call    .error
  629. 01638         ret
  630. 01639 1:
  631. 01640         jmp     .trp
  632. .Op 13 src/lib/i86/em/exg.s
  633. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  634. src/lib/i86/em/exg.s    
  635. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  636. 01700 .define .exg
  637. 01701
  638. 01702         ! #bytes in cx
  639. 01703 .text
  640. 01704 .exg:
  641. 01705         push    di
  642. 01706         mov     sp,di
  643. 01707         add     di,#4
  644. 01708         mov     bx,di
  645. 01709         add     bx,cx
  646. 01710         sar     cx,#1
  647. 01711 1:
  648. 01712         mov     ax,(bx)
  649. 01713         xchg    ax,(di)
  650. 01714         mov     (bx),ax
  651. 01715         add     di,#2
  652. 01716         add     bx,#2
  653. 01717         loop    1b
  654. 01718 2:
  655. 01719         pop     di
  656. 01720         ret
  657. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  658. src/lib/i86/em/fat.s    
  659. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  660. 01800 .define .fat
  661. 01801 .text
  662. 01802
  663. 01803 .fat:
  664. 01804 .extern .trp
  665. 01805 .extern .stop
  666. 01806         call    .trp
  667. 01807         call    .stop
  668. 01808         ! no return
  669. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  670. src/lib/i86/em/fp8087.s    
  671. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  672. 01900 .define .adf4, .adf8, .sbf4, .sbf8, .mlf4, .mlf8, .dvf4, .dvf8
  673. 01901 .define .ngf4, .ngf8, .fif4, .fif8, .fef4, .fef8
  674. 01902 .define .cif4, .cif8, .cuf4, .cuf8, .cfi, .cfu, .cff4, .cff8
  675. 01903 .define .cmf4, .cmf8
  676. 01904 .sect .text; .sect .rom; .sect .data; .sect .bss
  677. 01905
  678. 01906 !       $Header: fp8087.s,v 1.2 89/11/28 12:51:35 ceriel Exp $
  679. 01907
  680. 01908 !       Implement interface to floating point package for Intel 8087
  681. 01909
  682. .Ep 14 src/lib/i86/em/fp8087.s
  683. 01910         .sect .rom
  684. 01911 one:
  685. 01912         .data2  1
  686. 01913 two:
  687. 01914         .data2  2
  688. 01915 bigmin:
  689. 01916         .data2  0, -32768
  690. 01917
  691. 01918         .sect .text
  692. 01919 .adf4:
  693. 01920         mov     bx,sp
  694. 01921         wait
  695. 01922         flds    2(bx)
  696. 01923         wait
  697. 01924         fadds   6(bx)
  698. 01925         wait
  699. 01926         fstps   6(bx)
  700. 01927         wait
  701. 01928         ret
  702. 01929 .adf8:
  703. 01930         mov     bx,sp
  704. 01931         wait
  705. 01932         fldd    2(bx)
  706. 01933         wait
  707. 01934         faddd   10(bx)
  708. 01935         wait
  709. 01936         fstpd   10(bx)
  710. 01937         wait
  711. 01938         ret
  712. 01939
  713. 01940 .sbf4:
  714. 01941         mov     bx,sp
  715. 01942         wait
  716. 01943         flds    6(bx)
  717. 01944         wait
  718. 01945         fsubs   2(bx)
  719. 01946         wait
  720. 01947         fstps   6(bx)
  721. 01948         wait
  722. 01949         ret
  723. 01950
  724. 01951 .sbf8:
  725. 01952         mov     bx,sp
  726. 01953         wait
  727. 01954         fldd    10(bx)
  728. 01955         wait
  729. 01956         fsubd   2(bx)
  730. 01957         wait
  731. 01958         fstpd   10(bx)
  732. 01959         wait
  733. 01960         ret
  734. 01961
  735. 01962 .mlf4:
  736. 01963         mov     bx,sp
  737. 01964         wait
  738. 01965         flds    2(bx)
  739. 01966         wait
  740. 01967         fmuls   6(bx)
  741. 01968         wait
  742. 01969         fstps   6(bx)
  743. .Op 15 src/lib/i86/em/fp8087.s
  744. 01970         wait
  745. 01971         ret
  746. 01972 .mlf8:
  747. 01973         mov     bx,sp
  748. 01974         wait
  749. 01975         fldd    2(bx)
  750. 01976         wait
  751. 01977         fmuld   10(bx)
  752. 01978         wait
  753. 01979         fstpd   10(bx)
  754. 01980         wait
  755. 01981         ret
  756. 01982
  757. 01983 .dvf4:
  758. 01984         mov     bx,sp
  759. 01985         wait
  760. 01986         flds    6(bx)
  761. 01987         wait
  762. 01988         fdivs   2(bx)
  763. 01989         wait
  764. 01990         fstps   6(bx)
  765. 01991         wait
  766. 01992         ret
  767. 01993
  768. 01994 .dvf8:
  769. 01995         mov     bx,sp
  770. 01996         wait
  771. 01997         fldd    10(bx)
  772. 01998         wait
  773. 01999         fdivd   2(bx)
  774. 02000         wait
  775. 02001         fstpd   10(bx)
  776. 02002         wait
  777. 02003         ret
  778. 02004
  779. 02005 .ngf4:
  780. 02006         mov     bx,sp
  781. 02007         wait
  782. 02008         flds    2(bx)
  783. 02009         wait
  784. 02010         fchs
  785. 02011         wait
  786. 02012         fstps   2(bx)
  787. 02013         wait
  788. 02014         ret
  789. 02015
  790. 02016 .ngf8:
  791. 02017         mov     bx,sp
  792. 02018         wait
  793. 02019         fldd    2(bx)
  794. 02020         wait
  795. 02021         fchs
  796. 02022         wait
  797. 02023         fstpd   2(bx)
  798. 02024         wait
  799. 02025         ret
  800. 02026
  801. 02027 .fif4:
  802. 02028         mov     bx,sp
  803. 02029         push    bx              ! make room for FP status word
  804. .Ep 16 src/lib/i86/em/fp8087.s
  805. 02030         wait
  806. 02031         flds    4(bx)
  807. 02032         wait
  808. 02033         fmuls   8(bx)           ! multiply
  809. 02034         wait
  810. 02035         fld     st              ! copy result
  811. 02036         wait
  812. 02037         ftst                    ! test sign; handle negative separately
  813. 02038         wait
  814. 02039         fstsw   -2(bx)
  815. 02040         wait
  816. 02041         mov     ax,-2(bx)
  817. 02042         sahf                    ! result of test in condition codes
  818. 02043         jb      1f
  819. 02044         frndint                 ! this one rounds (?)
  820. 02045         wait
  821. 02046         fcom    st(1)           ! compare with original; if <=, then OK
  822. 02047         wait
  823. 02048         fstsw   -2(bx)
  824. 02049         wait
  825. 02050         mov     ax,-2(bx)
  826. 02051         sahf
  827. 02052         jbe     2f
  828. 02053         fisubs  one             ! else subtract 1
  829. 02054         wait
  830. 02055         jmp     2f
  831. 02056 1:                              ! here, negative case
  832. 02057         frndint                 ! this one rounds (?)
  833. 02058         wait
  834. 02059         fcom    st(1)           ! compare with original; if >=, then OK
  835. 02060         wait
  836. 02061         fstsw   -2(bx)
  837. 02062         wait
  838. 02063         mov     ax,-2(bx)
  839. 02064         sahf
  840. 02065         jae     2f
  841. 02066         fiadds  one             ! else add 1
  842. 02067         wait
  843. 02068 2:
  844. 02069         fsub    st(1),st        ! subtract integer part
  845. 02070         wait
  846. 02071         mov     bx,2(bx)
  847. 02072         fstps   (bx)
  848. 02073         wait
  849. 02074         fstps   4(bx)
  850. 02075         wait
  851. 02076         pop     bx
  852. 02077         ret
  853. 02078
  854. 02079 .fif8:
  855. 02080         mov     bx,sp
  856. 02081         push    bx              ! make room for FP status word
  857. 02082         wait
  858. 02083         fldd    4(bx)
  859. 02084         wait
  860. 02085         fmuld   12(bx)          ! multiply
  861. 02086         wait
  862. 02087         fld     st              ! and copy result
  863. 02088         wait
  864. 02089         ftst                    ! test sign; handle negative separately
  865. .Op 17 src/lib/i86/em/fp8087.s
  866. 02090         wait
  867. 02091         fstsw   -2(bx)
  868. 02092         wait
  869. 02093         mov     ax,-2(bx)
  870. 02094         sahf                    ! result of test in condition codes
  871. 02095         jb      1f
  872. 02096         frndint                 ! this one rounds (?)
  873. 02097         wait
  874. 02098         fcom    st(1)           ! compare with original; if <=, then OK
  875. 02099         wait
  876. 02100         fstsw   -2(bx)
  877. 02101         wait
  878. 02102         mov     ax,-2(bx)
  879. 02103         sahf
  880. 02104         jbe     2f
  881. 02105         fisubs  one             ! else subtract 1
  882. 02106         wait
  883. 02107         jmp     2f
  884. 02108 1:                              ! here, negative case
  885. 02109         frndint                 ! this one rounds (?)
  886. 02110         wait
  887. 02111         fcom    st(1)           ! compare with original; if >=, then OK
  888. 02112         wait
  889. 02113         fstsw   -2(bx)
  890. 02114         wait
  891. 02115         mov     ax,-2(bx)
  892. 02116         sahf
  893. 02117         jae     2f
  894. 02118         fiadds  one             ! else add 1
  895. 02119         wait
  896. 02120 2:
  897. 02121         fsub    st(1),st        ! subtract integer part
  898. 02122         mov     bx,2(bx)
  899. 02123         fstpd   (bx)
  900. 02124         wait
  901. 02125         fstpd   8(bx)
  902. 02126         wait
  903. 02127         pop     bx
  904. 02128         ret
  905. 02129
  906. 02130 .fef4:
  907. 02131                                 ! this could be simpler, if only the
  908. 02132                                 ! fxtract instruction was emulated properly
  909. 02133         mov     bx,sp
  910. 02134         mov     ax,6(bx)
  911. 02135         and     ax,#077600
  912. 02136         je      1f              ! zero exponent
  913. 02137         mov     cx,#7
  914. 02138         shr     ax,cl
  915. 02139         sub     ax,#126
  916. 02140         mov     cx,ax           ! exponent in cx
  917. 02141         mov     ax,6(bx)
  918. 02142         and     ax,#0100177
  919. 02143         or      ax,#0037400     ! load -1 exponent
  920. 02144         mov     dx,4(bx)
  921. 02145         mov     bx,2(bx)
  922. 02146         mov     4(bx),ax
  923. 02147         mov     2(bx),dx
  924. 02148         mov     (bx),cx
  925. 02149         ret
  926. .Ep 18 src/lib/i86/em/fp8087.s
  927. 02150 1:                              ! we get here on zero exp
  928. 02151         mov     ax,6(bx)
  929. 02152         and     ax,#0177
  930. 02153         or      ax,4(bx)
  931. 02154         jne     1f              ! zero result
  932. 02155         xor     ax,ax
  933. 02156         mov     bx,2(bx)
  934. 02157         mov     (bx),ax
  935. 02158         mov     2(bx),ax
  936. 02159         mov     4(bx),ax
  937. 02160         ret
  938. 02161 1:                              ! otherwise unnormalized number
  939. 02162         mov     cx,6(bx)
  940. 02163         and     cx,#0100177
  941. 02164         mov     dx,cx
  942. 02165         and     cx,#0x8000
  943. 02166         mov     ax,#-125
  944. 02167 2:
  945. 02168         test    dx,#0x80
  946. 02169         jne     1f
  947. 02170         dec     ax
  948. 02171         shl     4(bx),#1
  949. 02172         rcl     dx,#1
  950. 02173         or      dx,cx
  951. 02174         jmp     2b
  952. 02175 1:
  953. 02176         mov     cx,4(bx)
  954. 02177         mov     bx,2(bx)
  955. 02178         mov     (bx),ax
  956. 02179         mov     2(bx),cx
  957. 02180         and     dx,#0100177
  958. 02181         or      dx,#0037400     ! load -1 exponent
  959. 02182         mov     4(bx),dx
  960. 02183         ret
  961. 02184
  962. 02185 .fef8:
  963. 02186                                 ! this could be simpler, if only the
  964. 02187                                 ! fxtract instruction was emulated properly
  965. 02188         mov     bx,sp
  966. 02189         mov     ax,10(bx)
  967. 02190         and     ax,#077760
  968. 02191         je      1f              ! zero exponent
  969. 02192         mov     cx,#4
  970. 02193         shr     ax,cl
  971. 02194         sub     ax,#1022
  972. 02195         mov     cx,ax           ! exponent in cx
  973. 02196         mov     ax,10(bx)
  974. 02197         and     ax,#0100017
  975. 02198         or      ax,#0037740     ! load -1 exponent
  976. 02199         push    8(bx)
  977. 02200         push    6(bx)
  978. 02201         push    4(bx)
  979. 02202         mov     bx,2(bx)
  980. 02203         pop     2(bx)
  981. 02204         pop     4(bx)
  982. 02205         pop     6(bx)
  983. 02206         mov     8(bx),ax
  984. 02207         mov     (bx),cx
  985. 02208         ret
  986. 02209 1:                              ! we get here on zero exp
  987. .Op 19 src/lib/i86/em/fp8087.s
  988. 02210         mov     ax,10(bx)
  989. 02211         and     ax,#017
  990. 02212         or      ax,8(bx)
  991. 02213         or      ax,6(bx)
  992. 02214         or      ax,4(bx)
  993. 02215         jne     1f              ! zero result
  994. 02216         xor     ax,ax
  995. 02217         mov     bx,2(bx)
  996. 02218         mov     (bx),ax
  997. 02219         mov     2(bx),ax
  998. 02220         mov     4(bx),ax
  999. 02221         mov     6(bx),ax
  1000. 02222         mov     8(bx),ax
  1001. 02223         ret
  1002. 02224 1:                              ! otherwise unnormalized number
  1003. 02225         mov     cx,10(bx)
  1004. 02226         and     cx,#0100017
  1005. 02227         mov     dx,cx
  1006. 02228         and     cx,#0x8000
  1007. 02229         mov     ax,#-1021
  1008. 02230 2:
  1009. 02231         test    dx,#0x10
  1010. 02232         jne     1f
  1011. 02233         dec     ax
  1012. 02234         shl     4(bx),#1
  1013. 02235         rcl     6(bx),#1
  1014. 02236         rcl     8(bx),#1
  1015. 02237         rcl     dx,#1
  1016. 02238         or      dx,cx
  1017. 02239         jmp     2b
  1018. 02240 1:
  1019. 02241         and     dx,#0100017
  1020. 02242         or      dx,#0037740     ! load -1 exponent
  1021. 02243         mov     cx,8(bx)
  1022. 02244         push    6(bx)
  1023. 02245         push    4(bx)
  1024. 02246         mov     bx,2(bx)
  1025. 02247         mov     (bx),ax
  1026. 02248         mov     8(bx),dx
  1027. 02249         mov     6(bx),cx
  1028. 02250         pop     2(bx)
  1029. 02251         pop     4(bx)
  1030. 02252         ret
  1031. 02253
  1032. 02254 .cif4:
  1033. 02255         mov     bx,sp
  1034. 02256         cmp     2(bx),#2
  1035. 02257         jne     1f
  1036. 02258         wait
  1037. 02259         filds   4(bx)
  1038. 02260         wait
  1039. 02261         fstps   2(bx)
  1040. 02262         wait
  1041. 02263         ret
  1042. 02264 1:
  1043. 02265         wait
  1044. 02266         fildl   4(bx)
  1045. 02267         wait
  1046. 02268         fstps   4(bx)
  1047. 02269         wait
  1048. .Ep 20 src/lib/i86/em/fp8087.s
  1049. 02270         ret
  1050. 02271
  1051. 02272 .cif8:
  1052. 02273         mov     bx,sp
  1053. 02274         cmp     2(bx),#2
  1054. 02275         jne     1f
  1055. 02276         wait
  1056. 02277         filds   4(bx)
  1057. 02278         wait
  1058. 02279         fstpd   2(bx)
  1059. 02280         wait
  1060. 02281         ret
  1061. 02282 1:
  1062. 02283         wait
  1063. 02284         fildl   4(bx)
  1064. 02285         wait
  1065. 02286         fstpd   2(bx)
  1066. 02287         wait
  1067. 02288         ret
  1068. 02289
  1069. 02290 .cuf4:
  1070. 02291         mov     bx,sp
  1071. 02292         cmp     2(bx),#2
  1072. 02293         jne     1f
  1073. 02294         mov     ax,4(bx)
  1074. 02295         mov     2(bx),ax
  1075. 02296         mov     4(bx),#0
  1076. 02297         wait
  1077. 02298         fildl   2(bx)
  1078. 02299         wait
  1079. 02300         fstps   2(bx)
  1080. 02301         wait
  1081. 02302         ret
  1082. 02303 1:
  1083. 02304         wait
  1084. 02305         fildl   4(bx)
  1085. 02306         wait
  1086. 02307         cmp     6(bx),#0
  1087. 02308         jge     1f
  1088. 02309 2:
  1089. 02310         wait
  1090. 02311         fisubl  bigmin
  1091. 02312         wait
  1092. 02313         fisubl  bigmin
  1093. 02314 1:
  1094. 02315         wait
  1095. 02316         fstps   4(bx)
  1096. 02317         wait
  1097. 02318         ret
  1098. 02319
  1099. 02320 .cuf8:
  1100. 02321         mov     bx,sp
  1101. 02322         cmp     2(bx),#2
  1102. 02323         jne     1f
  1103. 02324         mov     6(bx),#0
  1104. 02325 1:
  1105. 02326         wait
  1106. 02327         fildl   4(bx)
  1107. 02328         wait
  1108. 02329         cmp     6(bx),#0
  1109. .Op 21 src/lib/i86/em/fp8087.s
  1110. 02330         jge     1f
  1111. 02331 2:
  1112. 02332         wait
  1113. 02333         fisubl  bigmin
  1114. 02334         wait
  1115. 02335         fisubl  bigmin
  1116. 02336 1:
  1117. 02337         wait
  1118. 02338         fstpd   2(bx)
  1119. 02339         wait
  1120. 02340         ret
  1121. 02341
  1122. 02342 .cfi:
  1123. 02343         mov     bx,sp
  1124. 02344         push    bx
  1125. 02345         wait
  1126. 02346         fstcw   -2(bx)
  1127. 02347         wait
  1128. 02348         mov     dx,-2(bx)
  1129. 02349         or      -2(bx),#0xc00   ! truncating mode
  1130. 02350         wait
  1131. 02351         fldcw   -2(bx)
  1132. 02352         pop     ax
  1133. 02353         cmp     4(bx),#4
  1134. 02354         jne     2f
  1135. 02355                                 ! loc 4 loc ? cfi
  1136. 02356         wait
  1137. 02357         flds    6(bx)
  1138. 02358         wait
  1139. 02359         fistpl  6(bx)
  1140. 02360         wait
  1141. 02361         cmp     2(bx),#2
  1142. 02362         jne     1f
  1143. 02363         mov     ax,6(bx)
  1144. 02364 1:
  1145. 02365         mov     4(bx),dx
  1146. 02366         wait
  1147. 02367         fldcw   4(bx)
  1148. 02368         wait
  1149. 02369         ret
  1150. 02370 2:
  1151. 02371                                 ! loc 8 loc ? cfi
  1152. 02372         wait
  1153. 02373         fldd    6(bx)
  1154. 02374         wait
  1155. 02375         fistpl  10(bx)
  1156. 02376         wait
  1157. 02377         cmp     2(bx),#2
  1158. 02378         jne     1b
  1159. 02379         mov     ax,10(bx)
  1160. 02380         jmp     1b
  1161. 02381
  1162. 02382 .cfu:
  1163. 02383         mov     bx,sp
  1164. 02384         push    bx
  1165. 02385         wait
  1166. 02386         fstcw   -2(bx)
  1167. 02387         wait
  1168. 02388         mov     dx,-2(bx)
  1169. 02389         and     -2(bx),#0xf3ff
  1170. .Ep 22 src/lib/i86/em/fp8087.s
  1171. 02390         or      -2(bx),#0x400   ! to -infinity
  1172. 02391         wait
  1173. 02392         fldcw   -2(bx)
  1174. 02393         wait
  1175. 02394         pop     ax
  1176. 02395         cmp     4(bx),#4
  1177. 02396         jne     2f
  1178. 02397                                 ! loc 4 loc ? cfu
  1179. 02398         flds    6(bx)
  1180. 02399         wait
  1181. 02400         fabs                    ! ???
  1182. 02401         wait
  1183. 02402         fiaddl  bigmin
  1184. 02403         fistpl  6(bx)
  1185. 02404         wait
  1186. 02405         mov     ax,8(bx)
  1187. 02406         sub     ax,bigmin+2
  1188. 02407         mov     8(bx),ax
  1189. 02408         cmp     2(bx),#2
  1190. 02409         jne     1f
  1191. 02410         mov     ax,6(bx)
  1192. 02411 1:
  1193. 02412         mov     4(bx),dx
  1194. 02413         wait
  1195. 02414         fldcw   4(bx)
  1196. 02415         wait
  1197. 02416         ret
  1198. 02417 2:
  1199. 02418         wait
  1200. 02419                                 ! loc 8 loc ? cfu
  1201. 02420         fldd    6(bx)
  1202. 02421         wait
  1203. 02422         fabs                    ! ???
  1204. 02423         wait
  1205. 02424         fiaddl  bigmin
  1206. 02425         fistpl  10(bx)
  1207. 02426         wait
  1208. 02427         mov     ax,12(bx)
  1209. 02428         sub     ax,bigmin+2
  1210. 02429         mov     12(bx),ax
  1211. 02430         cmp     2(bx),#2
  1212. 02431         jne     1b
  1213. 02432         mov     ax,10(bx)
  1214. 02433         jmp     1b
  1215. 02434
  1216. 02435 .cff4:
  1217. 02436         mov     bx,sp
  1218. 02437         wait
  1219. 02438         fldd    2(bx)
  1220. 02439         wait
  1221. 02440         fstcw   2(bx)
  1222. 02441         wait
  1223. 02442         mov     dx,2(bx)
  1224. 02443         and     2(bx),#0xf3ff   ! set to rounding mode
  1225. 02444         wait
  1226. 02445         fldcw   2(bx)
  1227. 02446         wait
  1228. 02447         fstps   6(bx)
  1229. 02448         mov     2(bx),dx
  1230. 02449         wait
  1231. .Op 23 src/lib/i86/em/fp8087.s
  1232. 02450         fldcw   2(bx)
  1233. 02451         wait
  1234. 02452         ret
  1235. 02453
  1236. 02454 .cff8:
  1237. 02455         mov     bx,sp
  1238. 02456         wait
  1239. 02457         flds    2(bx)
  1240. 02458         wait
  1241. 02459         fstpd   2(bx)
  1242. 02460         wait
  1243. 02461         ret
  1244. 02462
  1245. 02463 .cmf4:
  1246. 02464         mov     bx,sp
  1247. 02465         push    bx              ! room for 8087 status word
  1248. 02466         xor     cx,cx
  1249. 02467         wait
  1250. 02468         flds    6(bx)
  1251. 02469         wait
  1252. 02470         flds    2(bx)
  1253. 02471         wait
  1254. 02472         fcompp                  ! compare and pop operands
  1255. 02473         wait
  1256. 02474         fstsw   -2(bx)
  1257. 02475         wait
  1258. 02476         mov     ax,-2(bx)
  1259. 02477         sahf
  1260. 02478         je      1f
  1261. 02479         jb      2f
  1262. 02480         dec     cx
  1263. 02481         jmp     1f
  1264. 02482 2:
  1265. 02483         inc     cx
  1266. 02484 1:
  1267. 02485         mov     ax,cx
  1268. 02486         pop     bx
  1269. 02487         ret
  1270. 02488
  1271. 02489
  1272. 02490 .cmf8:
  1273. 02491         mov     bx,sp
  1274. 02492         push    bx              ! room for 8087 status word
  1275. 02493         xor     cx,cx
  1276. 02494         wait
  1277. 02495         fldd    10(bx)
  1278. 02496         wait
  1279. 02497         fldd    2(bx)
  1280. 02498         wait
  1281. 02499         fcompp                  ! compare and pop operands
  1282. 02500         wait
  1283. 02501         fstsw   -2(bx)
  1284. 02502         wait
  1285. 02503         mov     ax,-2(bx)
  1286. 02504         sahf
  1287. 02505         je      1f
  1288. 02506         jb      2f
  1289. 02507         dec     cx
  1290. 02508         jmp     1f
  1291. 02509 2:
  1292. .Ep 24 src/lib/i86/em/fp8087.s
  1293. 02510         inc     cx
  1294. 02511 1:
  1295. 02512         mov     ax,cx
  1296. 02513         pop     bx
  1297. 02514         ret
  1298. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1299. src/lib/i86/em/gto.s    
  1300. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1301. 02600 .define .gto
  1302. 02601 .text
  1303. 02602
  1304. 02603 .gto:
  1305. 02604         mov     bp,4(bx)
  1306. 02605         mov     sp,2(bx)
  1307. 02606         jmp     @(bx)
  1308. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1309. src/lib/i86/em/iaar.s    
  1310. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1311. 02700 .define .iaar
  1312. 02701 .text
  1313. 02702
  1314. 02703 .iaar:
  1315. 02704         pop     cx
  1316. 02705         pop     dx
  1317. 02706         cmp     dx,#2
  1318. 02707 .extern .unknown
  1319. 02708         jne     .unknown
  1320. 02709         pop     bx      ! descriptor address
  1321. 02710         pop     ax      ! index
  1322. 02711         sub     ax,(bx)
  1323. 02712         mul     4(bx)
  1324. 02713         pop     bx      ! array base
  1325. 02714         add     bx,ax
  1326. 02715         push    cx
  1327. 02716         ret
  1328. .Op 25 src/lib/i86/em/ilar.s
  1329. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1330. src/lib/i86/em/ilar.s    
  1331. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1332. 02800 .define .ilar
  1333. 02801 .text
  1334. 02802
  1335. 02803 .ilar:
  1336. 02804         pop     cx
  1337. 02805         pop     dx
  1338. 02806 .extern .unknown
  1339. 02807         cmp     dx,#2
  1340. 02808         jne     .unknown
  1341. 02809         pop     bx      ! descriptor address
  1342. 02810         pop     ax      ! index
  1343. 02811         push    cx
  1344. 02812 .extern .lar2
  1345. 02813         jmp    .lar2
  1346. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1347. src/lib/i86/em/inn.s    
  1348. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1349. 02900 .define .inn
  1350. 02901 .text
  1351. 02902
  1352. 02903         ! #bytes in cx
  1353. 02904         ! bit # in ax
  1354. 02905 .inn:
  1355. 02906         xor     dx,dx
  1356. 02907         mov     bx,#8
  1357. 02908         div     bx
  1358. 02909         mov     bx,sp
  1359. 02910         add     bx,#2
  1360. 02911         add     bx,ax
  1361. 02912         cmp     ax,cx
  1362. 02913         jae     1f
  1363. 02914         movb    al,(bx)
  1364. 02915         mov     bx,dx
  1365. 02916         testb   al,bits(bx)
  1366. 02917         jz      1f
  1367. 02918         mov     ax,#1
  1368. 02919         jmp     2f
  1369. 02920 1:
  1370. 02921         xor     ax,ax
  1371. 02922 2:
  1372. 02923         pop     bx
  1373. 02924         add     sp,cx
  1374. 02925         ! ax is result
  1375. 02926         jmp     (bx)
  1376. 02927
  1377. 02928         .data
  1378. 02929 bits:
  1379. 02930         .data1 1,2,4,8,16,32,64,128
  1380. .Ep 26 src/lib/i86/em/ior.s
  1381. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1382. src/lib/i86/em/ior.s    
  1383. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1384. 03000 .define .ior
  1385. 03001 .text
  1386. 03002
  1387. 03003         ! #bytes in cx
  1388. 03004 .ior:
  1389. 03005         pop     bx              ! return address
  1390. 03006         mov     dx,di
  1391. 03007         mov     di,sp
  1392. 03008         add     di,cx
  1393. 03009         sar     cx,#1
  1394. 03010 1:
  1395. 03011         pop     ax
  1396. 03012         or      ax,(di)
  1397. 03013         stos
  1398. 03014         loop    1b
  1399. 03015         mov     di,dx
  1400. 03016         jmp     (bx)
  1401. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1402. src/lib/i86/em/isar.s    
  1403. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1404. 03100 .define .isar
  1405. 03101 .text
  1406. 03102
  1407. 03103 .isar:
  1408. 03104         pop     cx
  1409. 03105         pop     ax
  1410. 03106         cmp     ax,#2
  1411. 03107 .extern .unknown
  1412. 03108         jne     .unknown
  1413. 03109         pop     bx      ! descriptor address
  1414. 03110         pop     ax      ! index
  1415. 03111         push    cx
  1416. 03112 .extern .sar2
  1417. 03113         jmp    .sar2
  1418. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1419. src/lib/i86/em/lar2.s    
  1420. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1421. 03200 .define .lar2
  1422. 03201 .text
  1423. 03202
  1424. 03203 .lar2:
  1425. 03204                                 ! bx, descriptor address
  1426. 03205                                 ! ax, index
  1427. 03206         pop     cx
  1428. 03207         pop     dx              ! base address
  1429. 03208         push    cx
  1430. 03209         push    si
  1431. .Op 27 src/lib/i86/em/lar2.s
  1432. 03210         mov     si,dx
  1433. 03211         sub     ax,(bx)
  1434. 03212         mov     cx,4(bx)
  1435. 03213         imul    cx
  1436. 03214         add     si,ax
  1437. 03215         sar     cx,#1
  1438. 03216         jnb     1f
  1439. 03217         xorb    ah,ah
  1440. 03218         lodsb
  1441. 03219         pop     si
  1442. 03220         pop     bx
  1443. 03221         push    ax
  1444. 03222         jmp     (bx)
  1445. 03223 1:
  1446. 03224         pop     dx              ! saved si
  1447. 03225         mov     ax,4(bx)
  1448. 03226         pop     bx              ! return address
  1449. 03227         sub     sp,ax
  1450. 03228         mov     ax,di           ! save di
  1451. 03229         mov     di,sp
  1452. 03230         rep
  1453. 03231         mov
  1454. 03232         mov     di,ax
  1455. 03233         mov     si,dx
  1456. 03234         jmp     (bx)
  1457. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1458. src/lib/i86/em/lfr6.s    
  1459. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1460. 03300 .define .lfr6
  1461. 03301 .text
  1462. 03302 .extern .retarea
  1463. 03303
  1464. 03304 .lfr6:
  1465. 03305         pop     bx
  1466. 03306         push    .retarea+4
  1467. 03307         push    .retarea+2
  1468. 03308         push    .retarea
  1469. 03309         jmp     (bx)
  1470. .Ep 28 src/lib/i86/em/lfr8.s
  1471. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1472. src/lib/i86/em/lfr8.s    
  1473. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1474. 03400 .define .lfr8
  1475. 03401 .text
  1476. 03402 .extern .retarea
  1477. 03403
  1478. 03404 .lfr8:
  1479. 03405         pop     bx
  1480. 03406         push    .retarea+6
  1481. 03407         push    .retarea+4
  1482. 03408         push    .retarea+2
  1483. 03409         push    .retarea
  1484. 03410         jmp     (bx)
  1485. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1486. src/lib/i86/em/loi.s    
  1487. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1488. 03500 .define .loi
  1489. 03501 .define .los
  1490. 03502 .text
  1491. 03503
  1492. 03504         ! #bytes in cx
  1493. 03505         ! address in bx
  1494. 03506         ! save si/di. they might be register variables
  1495. 03507 .los:
  1496. 03508         mov     dx,si
  1497. 03509         mov     si,bx
  1498. 03510         pop     bx
  1499. 03511         mov     ax,cx
  1500. 03512         sar     cx,#1
  1501. 03513         jnb     1f
  1502. 03514         xorb    ah,ah
  1503. 03515         lodsb
  1504. 03516         mov     si,dx
  1505. 03517         push    ax
  1506. 03518         jmp     (bx)
  1507. 03519 1:
  1508. 03520         sub     sp,ax
  1509. 03521         jmp     1f
  1510. 03522
  1511. 03523 .loi:
  1512. 03524         ! only called with size > 4
  1513. 03525         mov     dx,si
  1514. 03526         mov     si,bx
  1515. 03527         pop     bx
  1516. 03528         sub     sp,cx
  1517. 03529         sar     cx,#1
  1518. 03530 1:
  1519. 03531         mov     ax,di
  1520. 03532         mov     di,sp
  1521. 03533         rep
  1522. 03534         mov
  1523. .Op 29 src/lib/i86/em/loi.s
  1524. 03535         mov     si,dx
  1525. 03536         mov     di,ax
  1526. 03537         jmp     (bx)
  1527. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1528. src/lib/i86/em/mli4.s    
  1529. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1530. 03600 .define .mli4
  1531. 03601 .text
  1532. 03602
  1533. 03603 yl=2
  1534. 03604 yh=4
  1535. 03605         ! x * y
  1536. 03606         ! xl in ax
  1537. 03607         ! xh in dx
  1538. 03608
  1539. 03609 .mli4:
  1540. 03610         mov     bx,sp
  1541. 03611         push    dx
  1542. 03612         mov     cx,ax
  1543. 03613         mul     yh(bx)           ! xl*yh
  1544. 03614         pop     dx
  1545. 03615         push    ax
  1546. 03616         mov     ax,dx
  1547. 03617         mul     yl(bx)          ! xh * yl
  1548. 03618         pop     dx
  1549. 03619         add     dx,ax           ! xh*yl+xl*yh
  1550. 03620         mov     ax,cx
  1551. 03621         mov     cx,dx
  1552. 03622         mul     yl(bx)           ! xl*yl
  1553. 03623         add     dx,cx
  1554. 03624         ret     4
  1555. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1556. src/lib/i86/em/mon.s    
  1557. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1558. 03700 .define .mon
  1559. 03701 .text
  1560. 03702
  1561. 03703 .mon:
  1562. 03704 .extern .stop
  1563. 03705         call    .stop
  1564. .Ep 30 src/lib/i86/em/nop.s
  1565. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1566. src/lib/i86/em/nop.s    
  1567. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1568. 03800 .define .nop
  1569. 03801 .text
  1570. 03802 .nop:
  1571. 03803         ret
  1572. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1573. src/lib/i86/em/rck.s    
  1574. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1575. 03900 .define .rck
  1576. 03901 .text
  1577. 03902
  1578. 03903         ! descriptor address in bx
  1579. 03904         ! value in ax, must be left there
  1580. 03905 .rck:
  1581. 03906         cmp     ax,(bx)
  1582. 03907         jl      2f
  1583. 03908         cmp     ax,2(bx)
  1584. 03909         jg      2f
  1585. 03910         ret
  1586. 03911 2:
  1587. 03912         push    ax
  1588. 03913 ERANGE = 1
  1589. 03914 .extern .error
  1590. 03915         mov     ax,#ERANGE
  1591. 03916         call    .error
  1592. 03917         pop     ax
  1593. 03918         ret
  1594. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1595. src/lib/i86/em/ret6.s    
  1596. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1597. 04000 .define .ret6
  1598. 04001 .text
  1599. 04002 .extern .retarea
  1600. 04003
  1601. 04004 .ret6:
  1602. 04005         pop     bx
  1603. 04006         pop     .retarea
  1604. 04007         pop     .retarea+2
  1605. 04008         pop     .retarea+4
  1606. 04009         jmp     (bx)
  1607. .Op 31 src/lib/i86/em/ret8.s
  1608. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1609. src/lib/i86/em/ret8.s    
  1610. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1611. 04100 .define .ret8
  1612. 04101 .text
  1613. 04102 .extern .retarea
  1614. 04103
  1615. 04104 .ret8:
  1616. 04105         pop     bx
  1617. 04106         pop     .retarea
  1618. 04107         pop     .retarea+2
  1619. 04108         pop     .retarea+4
  1620. 04109         pop     .retarea+6
  1621. 04110         jmp     (bx)
  1622. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1623. src/lib/i86/em/retarea.s    
  1624. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1625. 04200 .define .retarea
  1626. 04201
  1627. 04202 .bss
  1628. 04203 .retarea:
  1629. 04204         .zerow 8/2
  1630. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1631. src/lib/i86/em/return.s    
  1632. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1633. 04300 .define .sdret, .dsret, .sret, .dret, .cret 
  1634. 04301 .text
  1635. 04302
  1636. 04303 .dsret:
  1637. 04304         pop     di
  1638. 04305 .sret:
  1639. 04306         pop     si
  1640. 04307 .cret:
  1641. 04308         mov     sp,bp
  1642. 04309         pop     bp
  1643. 04310         ret
  1644. 04311
  1645. 04312 .sdret:
  1646. 04313         pop     si
  1647. 04314 .dret:
  1648. 04315         pop     di
  1649. 04316         jmp     .cret
  1650. .Ep 32 src/lib/i86/em/rmi4.s
  1651. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1652. src/lib/i86/em/rmi4.s    
  1653. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1654. 04400 .define .rmi4
  1655. 04401 .text
  1656. 04402
  1657. 04403 yl=6
  1658. 04404 yh=8
  1659. 04405 xl=10
  1660. 04406 xh=12
  1661. 04407
  1662. 04408 .rmi4:
  1663. 04409         push    si
  1664. 04410         push    di
  1665. 04411         mov     si,sp           ! copy of sp
  1666. 04412         mov     bx,yl(si)
  1667. 04413         mov     ax,yh(si)
  1668. 04414         cwd
  1669. 04415         cmp     dx,ax
  1670. 04416         jne     7f
  1671. 04417         and     dx,dx
  1672. 04418         jge     1f
  1673. 04419         neg     bx
  1674. 04420         je      7f
  1675. 04421 1:
  1676. 04422         xor     dx,dx
  1677. 04423         mov     cx,xl(si)
  1678. 04424         mov     ax,xh(si)
  1679. 04425         and     ax,ax
  1680. 04426         jge     2f
  1681. 04427         neg     ax
  1682. 04428         neg     cx
  1683. 04429         sbb     ax,dx
  1684. 04430 2:
  1685. 04431         div     bx
  1686. 04432         xchg    ax,cx
  1687. 04433         div     bx              ! dx= result(low), 0=result(high)
  1688. 04434         xor     bx,bx
  1689. 04435 9:
  1690. 04436         cmp     xh(si),#0
  1691. 04437         jge     1f
  1692. 04438         neg     bx
  1693. 04439         neg     dx
  1694. 04440         sbb     bx,#0
  1695. 04441 1:
  1696. 04442                         ! bx is high order result
  1697. 04443                         ! dx is low order result
  1698. 04444         mov     ax,dx
  1699. 04445         mov     dx,bx   ! result in ax/dx
  1700. 04446         pop     di
  1701. 04447         pop     si
  1702. 04448         ret     8
  1703. 04449
  1704. 04450 7:
  1705. 04451         mov     di,ax
  1706. 04452         xor     bx,bx
  1707. 04453         and     di,di
  1708. 04454         jge     1f
  1709. .Op 33 src/lib/i86/em/rmi4.s
  1710. 04455         neg     di
  1711. 04456         neg     yl(si)
  1712. 04457         sbb     di,bx
  1713. 04458 1:
  1714. 04459         mov     ax,xl(si)
  1715. 04460         mov     dx,xh(si)
  1716. 04461         and     dx,dx
  1717. 04462         jge     1f
  1718. 04463         neg     dx
  1719. 04464         neg     ax
  1720. 04465         sbb     dx,bx
  1721. 04466 1:
  1722. 04467         mov     cx,#16
  1723. 04468 1:
  1724. 04469         shl     ax,#1
  1725. 04470         rcl     dx,#1
  1726. 04471         rcl     bx,#1
  1727. 04472         cmp     di,bx
  1728. 04473         ja      3f
  1729. 04474         jb      2f
  1730. 04475         cmp     yl(si),dx
  1731. 04476         jbe     2f
  1732. 04477 3:
  1733. 04478         loop    1b
  1734. 04479                 ! dx=result(low), bx=result(high)
  1735. 04480         jmp     9b
  1736. 04481 2:
  1737. 04482         sub     dx,yl(si)
  1738. 04483         sbb     bx,di
  1739. 04484         inc     ax
  1740. 04485         loop    1b
  1741. 04486 1:
  1742. 04487                 ! dx=result(low), bx=result(high)
  1743. 04488         jmp     9b
  1744. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1745. src/lib/i86/em/rmu4.s    
  1746. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1747. 04500 .define .rmu4
  1748. 04501 .text
  1749. 04502
  1750. 04503 yl=6
  1751. 04504 yh=8
  1752. 04505 xl=10
  1753. 04506 xh=12
  1754. 04507
  1755. 04508 .rmu4:
  1756. 04509         push    si
  1757. 04510         push    di
  1758. 04511         mov     si,sp           ! copy of sp
  1759. 04512         mov     bx,yl(si)
  1760. 04513         mov     ax,yh(si)
  1761. 04514         or      ax,ax
  1762. 04515         jne     7f
  1763. 04516 1:
  1764. 04517         xor     dx,dx
  1765. 04518         mov     cx,xl(si)
  1766. 04519         mov     ax,xh(si)
  1767. .Ep 34 src/lib/i86/em/rmu4.s
  1768. 04520 2:
  1769. 04521         div     bx
  1770. 04522         xchg    ax,cx
  1771. 04523         div     bx
  1772. 04524         xor     bx,bx
  1773. 04525 9:
  1774. 04526                         ! bx is high order result
  1775. 04527                         ! dx is low order result
  1776. 04528         mov     ax,dx
  1777. 04529         mov     dx,bx
  1778. 04530         pop     di
  1779. 04531         pop     si
  1780. 04532         ret     8       ! result in ax/dx
  1781. 04533
  1782. 04534 7:
  1783. 04535         mov     di,ax
  1784. 04536         xor     bx,bx
  1785. 04537         mov     ax,xl(si)
  1786. 04538         mov     dx,xh(si)
  1787. 04539         mov     cx,#16
  1788. 04540 1:
  1789. 04541         shl     ax,#1
  1790. 04542         rcl     dx,#1
  1791. 04543         rcl     bx,#1
  1792. 04544         cmp     di,bx
  1793. 04545         ja      3f
  1794. 04546         jb      2f
  1795. 04547         cmp     yl(si),dx
  1796. 04548         jbe     2f
  1797. 04549 3:
  1798. 04550         loop    1b
  1799. 04551                 ! dx=result(low), bx=result(high)
  1800. 04552         jmp     9b
  1801. 04553 2:
  1802. 04554         sub     dx,yl(si)
  1803. 04555         sbb     bx,di
  1804. 04556         inc     ax
  1805. 04557         loop    1b
  1806. 04558 1:
  1807. 04559                 ! dx=result(low), bx=result(high)
  1808. 04560         jmp     9b
  1809. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1810. src/lib/i86/em/sar2.s    
  1811. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1812. 04600 .define .sar2
  1813. 04601 .text
  1814. 04602
  1815. 04603 .sar2:
  1816. 04604                                 ! bx, descriptor address
  1817. 04605                                 ! ax, index
  1818. 04606         pop     cx
  1819. 04607         pop     dx              ! base address
  1820. 04608         push    cx
  1821. 04609         xchg    di,dx           ! di = base address, dx is saved di
  1822. .Op 35 src/lib/i86/em/sar2.s
  1823. 04610         sub     ax,(bx)
  1824. 04611         mov     cx,4(bx)
  1825. 04612         push    dx
  1826. 04613         imul    cx
  1827. 04614         pop     dx
  1828. 04615         add     di,ax
  1829. 04616         sar     cx,#1
  1830. 04617         jnb     1f
  1831. 04618         pop     bx
  1832. 04619         pop     ax
  1833. 04620         stosb
  1834. 04621         mov     di,dx
  1835. 04622         jmp     (bx)
  1836. 04623 1:
  1837. 04624         pop     bx
  1838. 04625         mov     ax,si
  1839. 04626         mov     si,sp
  1840. 04627         rep
  1841. 04628         mov
  1842. 04629         mov     sp,si
  1843. 04630         mov     si,ax
  1844. 04631         mov     di,dx
  1845. 04632         jmp     (bx)
  1846. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1847. src/lib/i86/em/sbi.s    
  1848. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1849. 04700 .define .sbi
  1850. 04701 .text
  1851. 04702
  1852. 04703         ! #bytes in cx , top of stack in ax
  1853. 04704 .sbi:
  1854. 04705         pop     bx              ! return subress
  1855. 04706         cmp     cx,#2
  1856. 04707         jne     1f
  1857. 04708         pop     cx
  1858. 04709         sub     ax,cx
  1859. 04710         neg     ax
  1860. 04711         jmp     (bx)
  1861. 04712 1:
  1862. 04713         cmp     cx,#4
  1863. 04714         jne     9f
  1864. 04715         pop     dx
  1865. 04716         pop     cx
  1866. 04717         sub     cx,ax
  1867. 04718         mov     ax,cx
  1868. 04719         pop     cx
  1869. 04720         sbb     cx,dx
  1870. 04721         push    cx
  1871. 04722         jmp     (bx)
  1872. 04723 9:
  1873. 04724 .extern .trpilin
  1874. 04725         push    bx
  1875. 04726         jmp     .trpilin
  1876. .Ep 36 src/lib/i86/em/set.s
  1877. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1878. src/lib/i86/em/set.s    
  1879. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1880. 04800 .define .set
  1881. 04801 .text
  1882. 04802
  1883. 04803         ! #bytes in cx
  1884. 04804         ! bit # in ax
  1885. 04805 .set:
  1886. 04806         pop     bx              ! return address
  1887. 04807         xor     dx,dx
  1888. 04808 !ifdef create set
  1889. 04809         sub     sp,cx
  1890. 04810         push    bx
  1891. 04811         push    di
  1892. 04812         mov     bx,sp
  1893. 04813         xor     di,di
  1894. 04814         sar     cx,#1
  1895. 04815 1:
  1896. 04816         mov     4(bx)(di),dx
  1897. 04817         inc     di
  1898. 04818         inc     di
  1899. 04819         loop    1b
  1900. 04820 !endif
  1901. 04821         mov     bx,#8
  1902. 04822         div     bx
  1903. 04823         cmp     ax,di
  1904. 04824         jae     2f
  1905. 04825         mov     di,dx
  1906. 04826         movb    dl,bits(di)
  1907. 04827         mov     di,sp
  1908. 04828         add     di,ax
  1909. 04829         orb     4(di),dl
  1910. 04830         pop     di
  1911. 04831         ret
  1912. 04832 2:
  1913. 04833 ESET = 2
  1914. 04834 .extern .error
  1915. 04835         pop     di
  1916. 04836         mov     ax,#ESET
  1917. 04837         call    .error
  1918. 04838         ret
  1919. 04839
  1920. 04840         .data
  1921. 04841 bits:
  1922. 04842         .data1   1,2,4,8,16,32,64,128
  1923. .Op 37 src/lib/i86/em/stb.c
  1924. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1925. src/lib/i86/em/stb.c    
  1926. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1927. 04900 /*
  1928. 04901  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  1929. 04902  * See the copyright notice in the ACK home directory, in the file "Copyright".
  1930. 04903  */
  1931. 04904 /* $Header: stb.c,v 1.1 89/02/07 11:01:46 ceriel Exp $ */
  1932. 04905 /* library routine for copying structs */
  1933. 04906
  1934. 04907 #include <ansi.h>
  1935. 04908
  1936. 04909 _PROTOTYPE(int __stb, (int n, char *f, char *t ));
  1937. 04910 __stb(n, f, t)
  1938. 04911 register int n;
  1939. 04912 register char *f, *t;
  1940. 04913 {
  1941. 04914         if (n > 0)
  1942. 04915                 do
  1943. 04916                         *t++ = *f++;
  1944. 04917                 while (--n);
  1945. 04918 }
  1946. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1947. src/lib/i86/em/sti.s    
  1948. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1949. 05000 .define .sti
  1950. 05001 .define .sts
  1951. 05002 .text
  1952. 05003
  1953. 05004         ! #bytes in cx
  1954. 05005         ! address in bx
  1955. 05006         ! save di/si. they might be register variables
  1956. 05007 .sts:
  1957. 05008         mov     dx,di           ! save di
  1958. 05009         mov     di,bx
  1959. 05010         pop     bx              ! return address
  1960. 05011         sar     cx,#1
  1961. 05012         jnb     1f
  1962. 05013         pop     ax
  1963. 05014         stosb
  1964. 05015         mov     di,dx
  1965. 05016         jmp     (bx)
  1966. 05017 .sti:
  1967. 05018         ! only called with count > 4
  1968. 05019         mov     dx,di
  1969. 05020         mov     di,bx
  1970. 05021         pop     bx
  1971. 05022         sar     cx,#1
  1972. 05023 1:
  1973. 05024         mov     ax,si
  1974. 05025         mov     si,sp
  1975. 05026         rep
  1976. 05027         mov
  1977. 05028         mov     sp,si
  1978. 05029         mov     di,dx
  1979. .Ep 38 src/lib/i86/em/sti.s
  1980. 05030         mov     si,ax
  1981. 05031         jmp     (bx)
  1982. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1983. src/lib/i86/em/stop.s    
  1984. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1985. 05100 .define .stop
  1986. 05101 .text
  1987. 05102 .stop:
  1988. 05103         call    __exit
  1989. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1990. src/lib/i86/em/strhp.s    
  1991. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1992. 05200 .define .strhp
  1993. 05201 .text
  1994. 05202 .extern .reghp, .limhp, .fat
  1995. 05203 EHEAP = 17
  1996. 05204
  1997. 05205 .strhp:
  1998. 05206         pop     bx
  1999. 05207         pop     ax
  2000. 05208         mov     .reghp,ax
  2001. 05209         cmp     ax,.limhp
  2002. 05210         jb      1f
  2003. 05211         add     ax,#01000
  2004. 05212         and     ax,#0177000
  2005. 05213         mov     .limhp,ax
  2006. 05214         cmp     ax,sp
  2007. 05215         jae     2f
  2008. 05216 1:
  2009. 05217         jmp     (bx)
  2010. 05218 2:
  2011. 05219         mov     ax,#EHEAP
  2012. 05220         jmp     .fat
  2013. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2014. src/lib/i86/em/trp.s    
  2015. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2016. 05300 .define .trpdivz
  2017. 05301 .define .trpilin
  2018. 05302 .define .trpcase
  2019. 05303 .define .trprang
  2020. 05304 .define .trpset
  2021. 05305 .define .trpnofp
  2022. 05306 .define .trpheap
  2023. 05307 .define .trp
  2024. 05308
  2025. 05309 .bss
  2026. .Op 39 src/lib/i86/em/trp.s
  2027. 05310 .M: .zerow 24/2
  2028. 05311
  2029. 05312 .text
  2030. 05313 .extern .trpdivz
  2031. 05314 .extern .trpilin
  2032. 05315 .extern .trpcase
  2033. 05316 .extern .trprang
  2034. 05317 .extern .trpset
  2035. 05318 .extern .trpnofp
  2036. 05319 .extern .trpheap
  2037. 05320 .extern .trp
  2038. 05321
  2039. 05322 .trpdivz:
  2040. 05323 mov ax,#6
  2041. 05324 mov dx,#.Mdivz
  2042. 05325 jmp .Trp
  2043. 05326 .trpilin:
  2044. 05327 mov ax,#18
  2045. 05328 mov dx,#.Milin
  2046. 05329 jmp .Trp
  2047. 05330 .trpcase:
  2048. 05331 mov ax,#20
  2049. 05332 mov dx,#.Mcase
  2050. 05333 jmp .Trp
  2051. 05334 .trprang:
  2052. 05335 mov ax,#1
  2053. 05336 mov dx,#.Mrang
  2054. 05337 jmp .Trp
  2055. 05338 .trpset:
  2056. 05339 mov ax,#2
  2057. 05340 mov dx,#.Mset
  2058. 05341 jmp .Trp
  2059. 05342 .trpnofp:
  2060. 05343 mov ax,#18
  2061. 05344 mov dx,#.Mnofp
  2062. 05345 jmp .Trp
  2063. 05346 .trpheap:
  2064. 05347 mov ax,#17
  2065. 05348 mov dx,#.Mheap
  2066. 05349 jmp .Trp
  2067. 05350
  2068. 05351 .Trp:
  2069. 05352 xor     bx,bx
  2070. 05353 .extern .trppc
  2071. 05354 xchg    bx,.trppc
  2072. 05355 test    bx,bx
  2073. 05356 jz      2f
  2074. 05357 push    ax
  2075. 05358 call    (bx)
  2076. 05359 pop     ax
  2077. 05360 ret
  2078. 05361 2:
  2079. 05362 mov bx,#22
  2080. 05363 push bx
  2081. 05364 push dx
  2082. 05365 mov ax,#2
  2083. 05366 push ax
  2084. 05367 call .Write
  2085. 05368 call __exit
  2086. 05369
  2087. .Ep 40 src/lib/i86/em/trp.s
  2088. 05370 .trp:
  2089. 05371 mov dx,ax
  2090. 05372 cmp dx,#21
  2091. 05373 jae 1f
  2092. 05374 sal dx,#1
  2093. 05375 mov bx,#.Mtable
  2094. 05376 add bx,dx
  2095. 05377 mov bx,(bx)
  2096. 05378 test bx,bx
  2097. 05379 jz 1f
  2098. 05380 mov dx,bx
  2099. 05381 jmp 2f
  2100. 05382 1:
  2101. 05383 mov bx,#.Mtrp+14
  2102. 05384 mov cx,#6
  2103. 05385 mov dx,ax
  2104. 05386 1:
  2105. 05387 and dx,#7
  2106. 05388 add dx,'0'
  2107. 05389 movb (bx),dl
  2108. 05390 dec bx
  2109. 05391 sar dx,#1
  2110. 05392 sar dx,#1
  2111. 05393 sar dx,#1
  2112. 05394 loop 1b
  2113. 05395 mov dx,#.Mtrp
  2114. 05396 2:
  2115. 05397 jmp .Trp
  2116. 05398
  2117. 05399 .Write:
  2118. 05400 push bp
  2119. 05401 mov bp,sp
  2120. 05402 mov .M+2,#4
  2121. 05403 mov bx,4(bp)
  2122. 05404 mov .M+4,bx
  2123. 05405 mov bx,8(bp)
  2124. 05406 mov .M+6,bx
  2125. 05407 mov bx,6(bp)
  2126. 05408 mov .M+10,bx
  2127. 05409 mov ax,#.M
  2128. 05410 push ax
  2129. 05411 mov ax,#1
  2130. 05412 push ax
  2131. 05413
  2132. 05414 mov ax,#1
  2133. 05415 mov bx,#.M
  2134. 05416 mov cx,#3
  2135. 05417 int 32
  2136. 05418 mov sp,bp
  2137. 05419 pop bp
  2138. 05420 ret
  2139. 05421
  2140. 05422
  2141. 05423 .data
  2142. 05424 .Mtable:
  2143. 05425         .data2 0,       .Mrang, .Mset,  0,      0,      0,      .Mdivz, 0
  2144. 05426         .data2 0,       0,      0,      0,      0,      0,      0,      0
  2145. 05427         .data2 0,       .Mheap, .Milin, .Milin, .Mcase
  2146. 05428
  2147. 05429 .Mdivz: .asciz "Error: Division by 0 n"
  2148. .Op 41 src/lib/i86/em/trp.s
  2149. 05430 .Milin: .asciz "Illegal EM instruct'nn"
  2150. 05431 .Mcase: .asciz "Err in EM case instr n"
  2151. 05432 .Mrang: .asciz "Variable out of rangen"
  2152. 05433 .Mset:  .asciz "Err in EM set instr  n"
  2153. 05434 .Mnofp: .asciz "Floating pt not impl.n"
  2154. 05435 .Mheap: .asciz "Heap overflow        n"
  2155. 05436
  2156. 05437 .Mtrp:  .asciz "EM trap 0000000 octaln"
  2157. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2158. src/lib/i86/em/unknown.s    
  2159. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2160. 05500 .define .unknown
  2161. 05501 .text
  2162. 05502 .extern .fat
  2163. 05503 EILLINS = 18
  2164. 05504
  2165. 05505 .unknown:
  2166. 05506         mov  ax,#EILLINS
  2167. 05507         push ax
  2168. 05508         jmp  .fat
  2169. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2170. src/lib/i86/em/vars.s    
  2171. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2172. 05600 .define .reghp, .limhp, .ignmask, .trppc
  2173. 05601 .extern .reghp, .limhp, .ignmask, .trppc
  2174. 05602
  2175. 05603 .data
  2176. 05604 .reghp:
  2177. 05605         .data2   endbss
  2178. 05606 .limhp:
  2179. 05607         .data2   endbss
  2180. 05608 .ignmask:
  2181. 05609         .data2   1336
  2182. 05610 .trppc:
  2183. 05611         .data2   0
  2184. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2185. src/lib/i86/em/xor.s    
  2186. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2187. 05700 .define .xor
  2188. 05701 .text
  2189. 05702
  2190. 05703         ! #bytes in cx
  2191. 05704 .xor:
  2192. 05705         pop     bx              ! return address
  2193. 05706         mov     dx,di
  2194. 05707         mov     di,sp
  2195. 05708         add     di,cx
  2196. 05709         sar     cx,#1
  2197. .Ep 42 src/lib/i86/em/xor.s
  2198. 05710 1:
  2199. 05711         pop     ax
  2200. 05712         xor     ax,(di)
  2201. 05713         stos
  2202. 05714         loop    1b
  2203. 05715         mov     di,dx
  2204. 05716         jmp     (bx)
  2205. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2206. src/lib/i86/misc/alloca.s    
  2207. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2208. 05800 #
  2209. 05801 !       alloca() - allocate space on the stack          Author: Kees J. Bot
  2210. 05802 !                                                               26 Jan 1994
  2211. 05803
  2212. 05804 #if __ACK__     /* BCC can't do alloca(), register saving is wrong. */
  2213. 05805
  2214. 05806 .text
  2215. 05807 .define _alloca
  2216. 05808 _alloca:
  2217. 05809         pop     cx              ! Return address
  2218. 05810         pop     ax              ! Bytes to allocate
  2219. 05811         add     ax, #2*2+1      ! Add space for two saved register variables
  2220. 05812         andb    al, #0xFE       ! Align
  2221. 05813         mov     bx, sp          ! Keep current sp
  2222. 05814         sub     sp, ax          ! Lower stack
  2223. 05815         mov     ax, sp          ! Return value
  2224. 05816         push    2(bx)           ! Push what is probably the saved si
  2225. 05817         push    (bx)            ! Saved di
  2226. 05818                                 ! Now ACK can still do:
  2227. 05819                                 !       pop di; pop si; mov sp, bp; pop bp; ret
  2228. 05820         push    ax              ! Dummy argument
  2229. 05821         jmp     (cx)
  2230. 05822 #endif
  2231. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2232. src/lib/i86/misc/getprocessor.s    
  2233. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2234. 05900 !       getprocessor() - determine processor type       Author: Kees J. Bot
  2235. 05901 !                                                               26 Jan 1994
  2236. 05902
  2237. 05903 .text
  2238. 05904
  2239. 05905         o32 = 0x66              ! 32 bit operand size prefix
  2240. 05906
  2241. 05907 ! int getprocessor(void);
  2242. 05908 !       Return 86, 186, 286, 386, 486, 586, ...
  2243. 05909
  2244. 05910 .define _getprocessor
  2245. 05911
  2246. 05912 _getprocessor:
  2247. 05913         push    bp
  2248. 05914         mov     bp, sp
  2249. .Op 43 src/lib/i86/misc/getprocessor.s
  2250. 05915         push    sp              ! see if pushed sp == sp
  2251. 05916         pop     ax
  2252. 05917         cmp     ax, sp
  2253. 05918         jz      new_processor
  2254. 05919         mov     cx, #0x0120     ! see if shifts are mod 32
  2255. 05920         shlb    ch, cl          ! zero tells if 86
  2256. 05921         mov     ax, #86
  2257. 05922         jz      got_processor
  2258. 05923         mov     ax, #186
  2259. 05924         jmp     got_processor
  2260. 05925
  2261. 05926 new_processor:                  ! see if high bits are set in saved GDT
  2262. 05927         sub     sp, #6          ! space for GDT ptr
  2263. 05928         .data1  0x0F            ! Prefix for 286 instruction: sgdt -6(bp)
  2264. 05929         add     -6(bp), ax      ! save 3 word GDT ptr (This is NOT an add!)
  2265. 05930         cmpb    -1(bp), #0      ! top byte of GDT ptr is zero only for 386
  2266. 05931         mov     ax, #286
  2267. 05932         jnz     got_processor
  2268. 05933
  2269. 05934 ! 386, 486, 586
  2270. 05935         and     sp, #0xFFFC     ! Align stack to avoid AC fault (needed?)
  2271. 05936         mov     cx, #0x0004     ! Try to flip the AC bit introduced on the 486
  2272. 05937         call    flip
  2273. 05938         mov     ax, #386        ! 386 if it didn't react to "flipping"
  2274. 05939         jz      got_processor
  2275. 05940         mov     cx, #0x0020     ! Try to flip the ID bit introduced on the 586
  2276. 05941         call    flip
  2277. 05942         mov     ax, #486        ! 486 if it didn't react
  2278. 05943         jz      got_processor
  2279. 05944         .data1  o32
  2280. 05945         pushf
  2281. 05946         .data1  o32
  2282. 05947         pusha                   ! Save the world
  2283. 05948         .data1  o32
  2284. 05949         xor     ax, ax
  2285. 05950         inc     ax              ! eax = 1
  2286. 05951         .data1  0x0F, 0xA2      ! CPUID instruction tells the processor type
  2287. 05952         andb    ah, #0x0F       ! Extract the family (5, 6, ...)
  2288. 05953         movb    al, ah
  2289. 05954         movb    ah, #100
  2290. 05955         mulb    ah              ! 500, 600, ...
  2291. 05956         add     ax, #86         ! 586, 686, ...
  2292. 05957         mov     bx, sp
  2293. 05958         mov     7*4(bx), ax     ! Pass ax through
  2294. 05959         .data1  o32
  2295. 05960         popa
  2296. 05961         .data1  o32
  2297. 05962         popf
  2298. 05963
  2299. 05964 got_processor:
  2300. 05965         mov     sp, bp
  2301. 05966         pop     bp
  2302. 05967         ret
  2303. 05968
  2304. 05969 flip:
  2305. 05970         push    bx              ! Save bx and realign stack to multiple of 4
  2306. 05971         .data1  o32             ! About to operate on a 32 bit object
  2307. 05972         pushf                   ! Push eflags
  2308. 05973         pop     ax
  2309. 05974         pop     dx              ! dx:ax = eflags
  2310. .Ep 44 src/lib/i86/misc/getprocessor.s
  2311. 05975         mov     bx, dx          ! Save original eflags (high word only)
  2312. 05976         xor     dx, cx          ! Flip the bit to test
  2313. 05977         push    dx
  2314. 05978         push    ax              ! Push modified eflags value
  2315. 05979         .data1  o32
  2316. 05980         popf                    ! Load modified eflags register
  2317. 05981         .data1  o32
  2318. 05982         pushf
  2319. 05983         pop     ax
  2320. 05984         pop     dx              ! Get it again
  2321. 05985         push    bx
  2322. 05986         push    ax
  2323. 05987         .data1  o32
  2324. 05988         popf                    ! Restore original eflags register
  2325. 05989         xor     dx, bx          ! See if the bit changed
  2326. 05990         test    dx, cx
  2327. 05991         pop     bx              ! Restore bx
  2328. 05992         ret
  2329. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2330. src/lib/i86/misc/iolib.s    
  2331. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2332. 06000 ! Some I/O related routines like:
  2333. 06001 !       unsigned char inb(int port);
  2334. 06002 !       unsigned short inw(int port);
  2335. 06003 !       void outb(int port, int value);
  2336. 06004 !       void outw(int port, int value);
  2337. 06005 !       void rep_inb(int port, unsigned char *buf, size_t count);
  2338. 06006 !       void rep_inw(int port, unsigned short *buf, size_t count);
  2339. 06007 !       void rep_outb(int port, unsigned char *buf, size_t count);
  2340. 06008 !       void rep_outw(int port, unsigned short *buf, size_t count);
  2341. 06009 !       void intr_enable(void);
  2342. 06010 !       void intr_disable(void);
  2343. 06011
  2344. 06012 .text
  2345. 06013 .define _inb
  2346. 06014 _inb:
  2347. 06015         push    bp
  2348. 06016         mov     bp, sp
  2349. 06017         mov     dx, 4(bp)               ! port
  2350. 06018         inb     dx                      ! read 1 byte
  2351. 06019         xorb    ah, ah
  2352. 06020         pop     bp
  2353. 06021         ret
  2354. 06022
  2355. 06023 .define _inw
  2356. 06024 _inw:
  2357. 06025         push    bp
  2358. 06026         mov     bp, sp
  2359. 06027         mov     dx, 4(bp)               ! port
  2360. 06028         in      dx                      ! read 1 word
  2361. 06029         pop     bp
  2362. 06030         ret
  2363. 06031
  2364. 06032 .define _outb
  2365. 06033 _outb:
  2366. 06034         push    bp
  2367. .Op 45 src/lib/i86/misc/iolib.s
  2368. 06035         mov     bp, sp
  2369. 06036         mov     dx, 4(bp)               ! port
  2370. 06037         mov     ax, 4+2(bp)             ! value
  2371. 06038         outb    dx                      ! output 1 byte
  2372. 06039         pop     bp
  2373. 06040         ret
  2374. 06041
  2375. 06042 .define _outw
  2376. 06043 _outw:
  2377. 06044         push    bp
  2378. 06045         mov     bp, sp
  2379. 06046         mov     dx, 4(bp)               ! port
  2380. 06047         mov     ax, 4+2(bp)             ! value
  2381. 06048         out     dx                      ! output 1 word
  2382. 06049         pop     bp
  2383. 06050         ret
  2384. 06051
  2385. 06052 .define _rep_inb
  2386. 06053 _rep_inb:
  2387. 06054         push    bp
  2388. 06055         mov     bp, sp
  2389. 06056         push    di
  2390. 06057         mov     dx, 4(bp)               ! port
  2391. 06058         mov     di, 6(bp)               ! buf
  2392. 06059         mov     cx, 8(bp)               ! byte count
  2393. 06060     rep inb     dx                      ! input many bytes
  2394. 06061         pop     di
  2395. 06062         pop     bp
  2396. 06063         ret
  2397. 06064
  2398. 06065 .define _rep_inw
  2399. 06066 _rep_inw:
  2400. 06067         push    bp
  2401. 06068         mov     bp, sp
  2402. 06069         push    di
  2403. 06070         mov     dx, 4(bp)               ! port
  2404. 06071         mov     di, 6(bp)               ! buf
  2405. 06072         mov     cx, 8(bp)               ! byte count
  2406. 06073         shr     cx, #1                  ! word count
  2407. 06074     rep in      dx                      ! input many words
  2408. 06075         pop     di
  2409. 06076         pop     bp
  2410. 06077         ret
  2411. 06078
  2412. 06079 .define _rep_outb
  2413. 06080 _rep_outb:
  2414. 06081         push    bp
  2415. 06082         mov     bp, sp
  2416. 06083         push    si
  2417. 06084         mov     dx, 4(bp)               ! port
  2418. 06085         mov     si, 6(bp)               ! buf
  2419. 06086         mov     cx, 8(bp)               ! byte count
  2420. 06087     rep outb    dx                      ! output many bytes
  2421. 06088         pop     si
  2422. 06089         pop     bp
  2423. 06090         ret
  2424. 06091
  2425. 06092 .define _rep_outw
  2426. 06093 _rep_outw:
  2427. 06094         push    bp
  2428. .Ep 46 src/lib/i86/misc/iolib.s
  2429. 06095         mov     bp, sp
  2430. 06096         push    si
  2431. 06097         mov     dx, 4(bp)               ! port
  2432. 06098         mov     si, 6(bp)               ! buf
  2433. 06099         mov     cx, 8(bp)               ! byte count
  2434. 06100         shr     cx, #1                  ! word count
  2435. 06101     rep out     dx                      ! output many words
  2436. 06102         pop     si
  2437. 06103         pop     bp
  2438. 06104         ret
  2439. 06105
  2440. 06106 .define _intr_disable
  2441. 06107 _intr_disable:
  2442. 06108         push    bp
  2443. 06109         mov     bp, sp
  2444. 06110         cli
  2445. 06111         pop     bp
  2446. 06112         ret
  2447. 06113
  2448. 06114 .define _intr_enable
  2449. 06115 _intr_enable:
  2450. 06116         push    bp
  2451. 06117         mov     bp, sp
  2452. 06118         sti
  2453. 06119         pop     bp
  2454. 06120         ret
  2455. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2456. src/lib/i86/rts/__sigreturn.s    
  2457. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2458. 06200 ! This routine is the low-level code for returning from signals.  
  2459. 06201 ! It calls __sigreturn, which is the normal "system call" routine.
  2460. 06202 ! Both ___sigreturn and __sigreturn are needed.
  2461. 06203 .sect .text; .sect .rom; .sect .data; .sect .bss
  2462. 06204 .sect .text
  2463. 06205 .define ___sigreturn
  2464. 06206 .extern __sigreturn
  2465. 06207 ___sigreturn:
  2466. 06208         add sp, #8
  2467. 06209         jmp __sigreturn
  2468. .Op 47 src/lib/i86/rts/_sendrec.s
  2469. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2470. src/lib/i86/rts/_sendrec.s    
  2471. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2472. 06300 .define __send, __receive, __sendrec
  2473. 06301
  2474. 06302 ! See ../h/com.h for C definitions
  2475. 06303 SEND = 1
  2476. 06304 RECEIVE = 2
  2477. 06305 BOTH = 3
  2478. 06306 SYSVEC = 32
  2479. 06307
  2480. 06308 !*========================================================================*
  2481. 06309 !                           _send and _receive                            *
  2482. 06310 !*========================================================================*
  2483. 06311 ! _send(), _receive(), _sendrec() all save bp, but destroy ax, bx, and cx.
  2484. 06312 .extern __send, __receive, __sendrec
  2485. 06313 __send: mov cx,*SEND            ! _send(dest, ptr)
  2486. 06314         jmp L0
  2487. 06315
  2488. 06316 __receive:
  2489. 06317         mov cx,*RECEIVE         ! _receive(src, ptr)
  2490. 06318         jmp L0
  2491. 06319
  2492. 06320 __sendrec:
  2493. 06321         mov cx,*BOTH            ! _sendrec(srcdest, ptr)
  2494. 06322         jmp L0
  2495. 06323
  2496. 06324   L0:   push bp                 ! save bp
  2497. 06325         mov bp,sp               ! can't index off sp
  2498. 06326         mov ax,4(bp)            ! ax = dest-src
  2499. 06327         mov bx,6(bp)            ! bx = message pointer
  2500. 06328         int SYSVEC              ! trap to the kernel
  2501. 06329         pop bp                  ! restore bp
  2502. 06330         ret                     ! return
  2503. 06331
  2504. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2505. src/lib/i86/rts/brksize.s    
  2506. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2507. 06400 .define __brksize
  2508. 06401 .data
  2509. 06402 .extern endbss, __brksize
  2510. 06403 __brksize: .data2 endbss
  2511. .Ep 48 src/lib/i86/rts/ncrtso.s
  2512. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2513. src/lib/i86/rts/ncrtso.s    
  2514. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2515. 06500 ! This is the C run-time start-off routine.  It's job is to take the
  2516. 06501 ! arguments as put on the stack by EXEC, and to parse them and set them up the
  2517. 06502 ! way _main expects them.
  2518. 06503 ! It also initializes _environ when this variable isn't defined by the
  2519. 06504 ! programmer.  The detection of whether _environ belong to us is rather
  2520. 06505 ! simplistic.  We simply check for some magic value, but there is no other
  2521. 06506 ! way.
  2522. 06507
  2523. 06508 .extern _main, _exit, crtso, __penvp
  2524. 06509 .extern begtext, begdata, begbss, endtext, enddata, endbss
  2525. 06510 .text
  2526. 06511 begtext:
  2527. 06512 crtso:          mov     bx,sp
  2528. 06513                 mov     cx,(bx)
  2529. 06514                 add     bx,*2
  2530. 06515                 mov     ax,cx
  2531. 06516                 inc     ax
  2532. 06517                 shl     ax,#1
  2533. 06518                 add     ax,bx
  2534. 06519                 mov     __penvp,ax      ! save envp in __envp
  2535. 06520
  2536. 06521                 ! Test whether address of environ < address of end.
  2537. 06522                 ! This is done for separate I&D systems.
  2538. 06523                 mov     dx,#_environ
  2539. 06524                 cmp     dx,#__end
  2540. 06525                 jae     1f
  2541. 06526                 cmp     _environ,#21331         ! is it our _environ?
  2542. 06527                 jne     1f
  2543. 06528                 mov     _environ,ax
  2544. 06529 1:
  2545. 06530                 push    ax      ! push environ
  2546. 06531                 push    bx      ! push argv
  2547. 06532                 push    cx      ! push argc
  2548. 06533                 xor     bp,bp   ! clear bp for traceback of core files
  2549. 06534                 call    _main
  2550. 06535                 add     sp,*6
  2551. 06536                 push    ax      ! push exit status
  2552. 06537                 call    _exit
  2553. 06538
  2554. 06539 .data
  2555. 06540 begdata:
  2556. 06541 __penvp:        .data2 0
  2557. 06542 .bss
  2558. 06543 begbss:
  2559. .Op 49 src/lib/i86/rts/setjmp.s
  2560. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2561. src/lib/i86/rts/setjmp.s    
  2562. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2563. 06600 .sect .text; .sect .data; .sect .bss
  2564. 06601 .sect .bss
  2565. 06602 .comm _gtobuf, 12
  2566. 06603 .extern ___setjmp
  2567. 06604 .extern _sigprocmask
  2568. 06605 .extern __longjerr
  2569. 06606 .extern __sigjmp
  2570. 06607 .extern _printf, _exit
  2571. 06608 .extern .blm, .sti, .cret
  2572. 06609 .sect .text
  2573. 06610 !
  2574. 06611 ! Warning:  this code depends on the C language declaration of
  2575. 06612 ! jmp_buf in <setjmp.h>, and on the definitions of the flags
  2576. 06613 ! SC_ONSTACK, SC_SIGCONTEXT, and SC_NOREGLOCALS in <sys/sigcontext.h>.
  2577. 06614 SC_SIGCONTEXT=2
  2578. 06615 SC_NOREGLOCALS=4
  2579. 06616 !
  2580. 06617 ! ___setjmp is called with two arguments.  The third argument is pushed
  2581. 06618 ! by compiler generated code transparently to the caller.
  2582. 06619 !
  2583. 06620 ! ___setjmp(jmp_buf, savemask, retaddr)
  2584. 06621 !
  2585. 06622 ___setjmp:
  2586. 06623         push    bp
  2587. 06624         mov     bp,sp
  2588. 06625
  2589. 06626         push    0(bp)           ! frame pointer
  2590. 06627         lea     ax, 4(bp)
  2591. 06628         push    ax              ! stack pointer
  2592. 06629         push    8(bp)           ! program counter
  2593. 06630         
  2594. 06631         xor     ax, ax
  2595. 06632         push    ax              ! signal mask high
  2596. 06633         push    ax              ! signal mask low
  2597. 06634         mov     ax,#SC_NOREGLOCALS      ! flags (4 is SC_NOREGLOCALS)
  2598. 06635         push    ax
  2599. 06636
  2600. 06637         mov     ax, 6(bp)       ! get the savemask arg
  2601. 06638         cmp     ax, #0
  2602. 06639         je      nosigstate      ! don't save signal state
  2603. 06640
  2604. 06641         or      -12(bp), #SC_SIGCONTEXT         ! flags |= SC_SIGCONTEXT
  2605. 06642
  2606. 06643         lea     ax, -10(bp)
  2607. 06644         push    ax
  2608. 06645         push    #0
  2609. 06646         push    #0
  2610. 06647         call    _sigprocmask    ! fill in signal mask
  2611. 06648         add     sp, #6
  2612. 06649
  2613. 06650 nosigstate:
  2614. 06651         mov     bx, 4(bp)       ! jmp_buf
  2615. 06652         mov     cx, #12         ! sizeof(jmp_buf)
  2616. 06653         call    .sti            ! sp = src addr, bx = dest addr, cx = count
  2617. 06654         xor     ax, ax
  2618. .Ep 50 src/lib/i86/rts/setjmp.s
  2619. 06655         jmp     .cret
  2620. 06656
  2621. 06657 .extern __longjmp
  2622. 06658 __longjmp:
  2623. 06659         push    bp
  2624. 06660         mov     bp, sp
  2625. 06661
  2626. 06662 ! Copy the jmp_buf to the gtobuf.
  2627. 06663         push    4(bp)                   ! src address
  2628. 06664         mov     ax, #_gtobuf
  2629. 06665         push    ax                      ! dst address
  2630. 06666         mov     cx, #6                  ! word count
  2631. 06667         call    .blm                    ! block move                    
  2632. 06668
  2633. 06669 ! Check that this jmp_buf has no saved registers.
  2634. 06670         mov     ax, _gtobuf             ! get flags
  2635. 06671         test    ax, #4
  2636. 06672         je      __longjerr
  2637. 06673
  2638. 06674 ! Set up the value to return in ax.
  2639. 06675         mov     ax, 6(bp)               ! value to return
  2640. 06676         or      ax, ax
  2641. 06677         jne     nonzero
  2642. 06678         mov     ax, #1
  2643. 06679 nonzero:
  2644. 06680         mov     bx, #_gtobuf
  2645. 06681         mov     bp, 10(bx)
  2646. 06682         mov     sp, 8(bx)
  2647. 06683         jmp     @6(bx)
  2648. 06684
  2649. 06685 .extern _longjmp
  2650. 06686 _longjmp:
  2651. 06687         push    bp
  2652. 06688         mov     bp, sp
  2653. 06689
  2654. 06690 ! Check that this is a jmp_buf with no saved regs and with signal context info.
  2655. 06691         mov     bx, 4(bp)               ! pointer to jmp_buf
  2656. 06692         mov     ax, 0(bx)               ! get the flags
  2657. 06693         test    ax, #4                  ! check for no saved registers
  2658. 06694         je      __longjerr
  2659. 06695         test    ax, #2                  ! check for signal context
  2660. 06696         je      __longjerr
  2661. 06697         
  2662. 06698 ! Compute the value to return
  2663. 06699         mov     ax, 6(bp)               ! proposed value to return
  2664. 06700         or      ax, ax
  2665. 06701         jne     nonzero1
  2666. 06702         mov     ax, #1
  2667. 06703 nonzero1:
  2668. 06704
  2669. 06705 ! Call _sigjmp to restore the old signal context.
  2670. 06706         push    ax
  2671. 06707         push    4(bp)
  2672. 06708         call    __sigjmp
  2673. 06709         add     sp, #4
  2674. .Op 51 src/lib/i86/string/_memmove.s
  2675. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2676. src/lib/i86/string/_memmove.s    
  2677. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2678. 06800 !       _memmove()                                      Author: Kees J. Bot
  2679. 06801 !                                                               27 Jan 1994
  2680. 06802 .sect .text; .sect .rom; .sect .data; .sect .bss
  2681. 06803
  2682. 06804 ! void *_memmove(void *s1, const void *s2, size_t n)
  2683. 06805 !       Copy a chunk of memory.  Handle overlap.
  2684. 06806 !
  2685. 06807 .sect .text
  2686. 06808 .define __memmove, __memcpy
  2687. 06809 __memmove:
  2688. 06810         push    bp
  2689. 06811         mov     bp, sp
  2690. 06812         push    si
  2691. 06813         push    di
  2692. 06814         mov     di, 4(bp)       ! String s1
  2693. 06815         mov     si, 6(bp)       ! String s2
  2694. 06816         mov     cx, 8(bp)       ! Length
  2695. 06817         mov     ax, di
  2696. 06818         sub     ax, si
  2697. 06819         cmp     ax, cx
  2698. 06820         jb      downwards       ! if (s2 - s1) < n then copy downwards
  2699. 06821 __memcpy:
  2700. 06822         cld                     ! Clear direction bit: upwards
  2701. 06823         cmp     cx, #16
  2702. 06824         jb      upbyte          ! Don't bother being smart with short arrays
  2703. 06825         mov     ax, si
  2704. 06826         or      ax, di
  2705. 06827         testb   al, #1
  2706. 06828         jnz     upbyte          ! Bit 0 set, use byte copy
  2707. 06829 upword: shr     cx, #1
  2708. 06830     rep movs                    ! Copy words
  2709. 06831         adc     cx, cx          ! One more byte?
  2710. 06832 upbyte:
  2711. 06833     rep movsb                   ! Copy bytes
  2712. 06834 done:   mov     ax, 4(bp)       ! Absolutely noone cares about this value
  2713. 06835         pop     di
  2714. 06836         pop     si
  2715. 06837         pop     bp
  2716. 06838         ret
  2717. 06839
  2718. 06840 ! Handle bad overlap by copying downwards, don't bother to do word copies.
  2719. 06841 downwards:
  2720. 06842         std                     ! Set direction bit: downwards
  2721. 06843         add     si, cx
  2722. 06844         dec     si
  2723. 06845         add     di, cx
  2724. 06846         dec     di
  2725. 06847     rep movsb                   ! Copy bytes
  2726. 06848         cld
  2727. 06849         jmp     done
  2728. .Ep 52 src/lib/i86/string/_strncat.s
  2729. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2730. src/lib/i86/string/_strncat.s    
  2731. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2732. 06900 !       _strncat()                                      Author: Kees J. Bot
  2733. 06901 !                                                               27 Jan 1994
  2734. 06902 .sect .text; .sect .rom; .sect .data; .sect .bss
  2735. 06903
  2736. 06904 ! char *_strncat(char *s1, const char *s2, size_t dx)
  2737. 06905 !       Append string s2 to s1.
  2738. 06906 !
  2739. 06907 .sect .text
  2740. 06908 .define __strncat
  2741. 06909 __strncat:
  2742. 06910         push    bp
  2743. 06911         mov     bp, sp
  2744. 06912         push    si
  2745. 06913         push    di
  2746. 06914         mov     di, 4(bp)       ! String s1
  2747. 06915         mov     cx, #-1
  2748. 06916         xorb    al, al          ! Null byte
  2749. 06917         cld
  2750. 06918   repne scasb                   ! Look for the zero byte in s1
  2751. 06919         dec     di              ! Back one up (and clear 'Z' flag)
  2752. 06920         push    di              ! Save end of s1
  2753. 06921         mov     di, 6(bp)       ! di = string s2
  2754. 06922         mov     cx, dx          ! Maximum count
  2755. 06923   repne scasb                   ! Look for the end of s2
  2756. 06924         jne     no0
  2757. 06925         inc     cx              ! Exclude null byte
  2758. 06926 no0:    sub     dx, cx          ! Number of bytes in s2
  2759. 06927         mov     cx, dx
  2760. 06928         mov     si, 6(bp)       ! si = string s2
  2761. 06929         pop     di              ! di = end of string s1
  2762. 06930     rep movsb                   ! Copy bytes
  2763. 06931         stosb                   ! Add a terminating null
  2764. 06932         mov     ax, 4(bp)       ! Return s1
  2765. 06933         pop     di
  2766. 06934         pop     si
  2767. 06935         pop     bp
  2768. 06936         ret
  2769. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2770. src/lib/i86/string/_strncmp.s    
  2771. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2772. 07000 !       strncmp()                                       Author: Kees J. Bot
  2773. 07001 !                                                               27 Jan 1994
  2774. 07002 .sect .text; .sect .rom; .sect .data; .sect .bss
  2775. 07003
  2776. 07004 ! int strncmp(const char *s1, const char *s2, size_t cx)
  2777. 07005 !       Compare two strings.
  2778. 07006 !
  2779. 07007 .sect .text
  2780. 07008 .define __strncmp
  2781. 07009 __strncmp:
  2782. .Op 53 src/lib/i86/string/_strncmp.s
  2783. 07010         push    bp
  2784. 07011         mov     bp, sp
  2785. 07012         push    si
  2786. 07013         push    di
  2787. 07014         xor     ax, ax          ! Prepare return value
  2788. 07015         test    cx, cx          ! Max length is zero?
  2789. 07016         je      equal
  2790. 07017         mov     si, 4(bp)       ! si = string s1
  2791. 07018         mov     di, 6(bp)       ! di = string s2
  2792. 07019         cld
  2793. 07020 compare:
  2794. 07021         cmpsb                   ! Compare two bytes
  2795. 07022         jne     unequal
  2796. 07023         cmpb    -1(si), #0      ! End of string?
  2797. 07024         je      equal
  2798. 07025         dec     cx              ! Length limit reached?
  2799. 07026         jne     compare
  2800. 07027         jmp     equal
  2801. 07028 unequal:
  2802. 07029         ja      after
  2803. 07030         sub     ax, #2          ! if (s1 < s2) ax -= 2;
  2804. 07031 after:  inc     ax              ! ax++, now it's -1 or 1
  2805. 07032 equal:  pop     di
  2806. 07033         pop     si
  2807. 07034         pop     bp
  2808. 07035         ret
  2809. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2810. src/lib/i86/string/_strncpy.s    
  2811. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2812. 07100 !       _strncpy()                                      Author: Kees J. Bot
  2813. 07101 !                                                               27 Jan 1994
  2814. 07102 .sect .text; .sect .rom; .sect .data; .sect .bss
  2815. 07103
  2816. 07104 ! char *_strncpy(char *s1, const char *s2, size_t cx)
  2817. 07105 !       Copy string s2 to s1.
  2818. 07106 !
  2819. 07107 .sect .text
  2820. 07108 .define __strncpy
  2821. 07109 __strncpy:
  2822. 07110         mov     di, 6(bp)       ! di = string s2
  2823. 07111         xorb    al, al          ! Look for a zero byte
  2824. 07112         mov     dx, cx          ! Save maximum count
  2825. 07113         cld
  2826. 07114   repne scasb                   ! Look for end of s2
  2827. 07115         sub     dx, cx          ! Number of bytes in s2 including null
  2828. 07116         xchg    cx, dx
  2829. 07117         mov     si, 6(bp)       ! si = string s2
  2830. 07118         mov     di, 4(bp)       ! di = string s1
  2831. 07119     rep movsb                   ! Copy bytes
  2832. 07120         ret
  2833. .Ep 54 src/lib/i86/string/_strnlen.s
  2834. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2835. src/lib/i86/string/_strnlen.s    
  2836. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2837. 07200 !       _strnlen()                                      Author: Kees J. Bot
  2838. 07201 !                                                               27 Jan 1994
  2839. 07202 .sect .text; .sect .rom; .sect .data; .sect .bss
  2840. 07203
  2841. 07204 ! size_t _strnlen(const char *s, size_t cx)
  2842. 07205 !       Return the length of a string.
  2843. 07206 !
  2844. 07207 .sect .text
  2845. 07208 .define __strnlen
  2846. 07209 __strnlen:
  2847. 07210         push    bp
  2848. 07211         mov     bp, sp
  2849. 07212         push    di
  2850. 07213         mov     di, 4(bp)       ! di = string
  2851. 07214         xorb    al, al          ! Look for a zero byte
  2852. 07215         mov     dx, cx          ! Save maximum count
  2853. 07216         cmpb    cl, #1          ! 'Z' bit must be clear if cx = 0
  2854. 07217         cld
  2855. 07218   repne scasb                   ! Look for zero
  2856. 07219         jne     no0
  2857. 07220         inc     cx              ! Don't count zero byte
  2858. 07221 no0:    mov     ax, dx
  2859. 07222         sub     ax, cx          ! Compute bytes scanned
  2860. 07223         pop     di
  2861. 07224         pop     bp
  2862. 07225         ret
  2863. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2864. src/lib/i86/string/bcmp.s    
  2865. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2866. 07300 !       bcmp()                                          Author: Kees J. Bot
  2867. 07301 !                                                               27 Jan 1994
  2868. 07302 .sect .text; .sect .rom; .sect .data; .sect .bss
  2869. 07303
  2870. 07304 ! int bcmp(const void *s1, const void *s2, size_t n)
  2871. 07305 !       Compare two chunks of memory.
  2872. 07306 !       This is a BSD routine that escaped from the kernel.  Don't use.
  2873. 07307 !       (Alas it is not without some use, it reports the number of bytes
  2874. 07308 !       after the bytes that are equal.  So it can't be simply replaced.)
  2875. 07309 !
  2876. 07310 .sect .text
  2877. 07311 .define _bcmp
  2878. 07312 _bcmp:
  2879. 07313         push    bp
  2880. 07314         mov     bp, sp
  2881. 07315         push    8(bp)
  2882. 07316         push    6(bp)
  2883. 07317         push    4(bp)
  2884. 07318         call    _memcmp         ! Let memcmp do the work
  2885. 07319         mov     sp, bp
  2886. .Op 55 src/lib/i86/string/bcmp.s
  2887. 07320         test    ax, ax
  2888. 07321         jz      equal
  2889. 07322         sub     dx, 4(bp)       ! Memcmp was nice enough to leave "si" in dx
  2890. 07323         dec     dx              ! Number of bytes that are equal
  2891. 07324         mov     ax, 8(bp)
  2892. 07325         sub     ax, dx          ! Number of bytes that are unequal
  2893. 07326 equal:  pop     bp
  2894. 07327         ret
  2895. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2896. src/lib/i86/string/bcopy.s    
  2897. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2898. 07400 !       bcopy()                                         Author: Kees J. Bot
  2899. 07401 !                                                               27 Jan 1994
  2900. 07402 .sect .text; .sect .rom; .sect .data; .sect .bss
  2901. 07403
  2902. 07404 ! void bcopy(const void *s1, void *s2, size_t n)
  2903. 07405 !       Copy a chunk of memory.  Handle overlap.
  2904. 07406 !       This is a BSD routine that escaped from the kernel.  Don't use.
  2905. 07407 !
  2906. 07408 .sect .text
  2907. 07409 .define _bcopy
  2908. 07410 .extern __memmove
  2909. 07411 _bcopy:
  2910. 07412         pop     cx
  2911. 07413         pop     ax
  2912. 07414         pop     dx              ! Pop return address and arguments
  2913. 07415         push    ax
  2914. 07416         push    dx              ! Arguments reversed
  2915. 07417         push    cx
  2916. 07418         jmp     __memmove       ! Call the proper routine
  2917. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2918. src/lib/i86/string/bzero.s    
  2919. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2920. 07500 !       bzero()                                         Author: Kees J. Bot
  2921. 07501 !                                                               27 Jan 1994
  2922. 07502 .sect .text; .sect .rom; .sect .data; .sect .bss
  2923. 07503
  2924. 07504 ! void bzero(void *s, size_t n)
  2925. 07505 !       Set a chunk of memory to zero.
  2926. 07506 !       This is a BSD routine that escaped from the kernel.  Don't use.
  2927. 07507 !
  2928. 07508 .sect .text
  2929. 07509 .define _bzero
  2930. 07510 _bzero:
  2931. 07511         push    bp
  2932. 07512         mov     bp, sp
  2933. 07513         push    6(bp)           ! Size
  2934. 07514         xor     ax, ax
  2935. 07515         push    ax              ! Zero
  2936. 07516         push    4(bp)           ! String
  2937. 07517         call    _memset         ! Call the proper routine
  2938. 07518         mov     sp, bp
  2939. 07519         pop     bp
  2940. .Ep 56 src/lib/i86/string/bzero.s
  2941. 07520         ret
  2942. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2943. src/lib/i86/string/index.s    
  2944. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2945. 07600 !       index()                                         Author: Kees J. Bot
  2946. 07601 !                                                               27 Jan 1994
  2947. 07602 .sect .text; .sect .rom; .sect .data; .sect .bss
  2948. 07603
  2949. 07604 ! char *index(const char *s, int c)
  2950. 07605 !       Look for a character in a string.  Has suffered from a hostile
  2951. 07606 !       takeover by strchr().
  2952. 07607 !
  2953. 07608 .sect .text
  2954. 07609 .define _index
  2955. 07610 _index:
  2956. 07611         jmp     _strchr
  2957. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2958. src/lib/i86/string/memchr.s    
  2959. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2960. 07700 !       memchr()                                        Author: Kees J. Bot
  2961. 07701 !                                                               27 Jan 1994
  2962. 07702 .sect .text; .sect .rom; .sect .data; .sect .bss
  2963. 07703
  2964. 07704 ! void *memchr(const void *s, int c, size_t n)
  2965. 07705 !       Look for a character in a chunk of memory.
  2966. 07706 !
  2967. 07707 .sect .text
  2968. 07708 .define _memchr
  2969. 07709 _memchr:
  2970. 07710         push    bp
  2971. 07711         mov     bp, sp
  2972. 07712         push    di
  2973. 07713         mov     di, 4(bp)       ! di = string
  2974. 07714         movb    al, 6(bp)       ! The character to look for
  2975. 07715         mov     cx, 8(bp)       ! Length
  2976. 07716         cmpb    cl, #1          ! 'Z' bit must be clear if cx = 0
  2977. 07717         cld
  2978. 07718   repne scasb
  2979. 07719         jne     failure
  2980. 07720         lea     ax, -1(di)      ! Found
  2981. 07721         pop     di
  2982. 07722         pop     bp
  2983. 07723         ret
  2984. 07724 failure:xor     ax, ax
  2985. 07725         pop     di
  2986. 07726         pop     bp
  2987. 07727         ret
  2988. .Op 57 src/lib/i86/string/memcmp.s
  2989. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2990. src/lib/i86/string/memcmp.s    
  2991. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2992. 07800 !       memcmp()                                        Author: Kees J. Bot
  2993. 07801 !                                                               27 Jan 1994
  2994. 07802 .sect .text; .sect .rom; .sect .data; .sect .bss
  2995. 07803
  2996. 07804 ! int memcmp(const void *s1, const void *s2, size_t n)
  2997. 07805 !       Compare two chunks of memory.
  2998. 07806 !
  2999. 07807 .sect .text
  3000. 07808 .define _memcmp
  3001. 07809 _memcmp:
  3002. 07810         cld
  3003. 07811         push    bp
  3004. 07812         mov     bp, sp
  3005. 07813         push    si
  3006. 07814         push    di
  3007. 07815         xor     ax, ax          ! Prepare return value
  3008. 07816         mov     si, 4(bp)       ! String s1
  3009. 07817         mov     di, 6(bp)       ! String s2
  3010. 07818         mov     cx, 8(bp)       ! Length
  3011. 07819         cmp     cx, #16
  3012. 07820         jb      cbyte           ! Don't bother being smart with short arrays
  3013. 07821         mov     dx, si
  3014. 07822         or      dx, di
  3015. 07823         andb    dl, #1
  3016. 07824         jnz     cbyte           ! Bit 0 set, use byte compare
  3017. 07825 cword:  sar     cx, #1
  3018. 07826         adcb    dl, dl          ! Save carry
  3019. 07827    repe cmps                    ! Compare words
  3020. 07828         mov     cx, #2          ! Recompare the last word
  3021. 07829         sub     si, cx
  3022. 07830         sub     di, cx
  3023. 07831         addb    cl, dl          ! One more byte?
  3024. 07832 cbyte:  test    cx, cx          ! Set 'Z' flag if cx = 0
  3025. 07833 last:
  3026. 07834    repe cmpsb                   ! Look for the first differing byte
  3027. 07835         je      equal
  3028. 07836         ja      after
  3029. 07837         sub     ax, #2          ! if (s1 < s2) ax -= 2;
  3030. 07838 after:  inc     ax              ! ax++, now it's -1 or 1
  3031. 07839 equal:  mov     dx, si          ! For bcmp() to play with
  3032. 07840         pop     di
  3033. 07841         pop     si
  3034. 07842         pop     bp
  3035. 07843         ret
  3036. .Ep 58 src/lib/i86/string/memcpy.s
  3037. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3038. src/lib/i86/string/memcpy.s    
  3039. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3040. 07900 !       memcpy()                                        Author: Kees J. Bot
  3041. 07901 !                                                               27 Jan 1994
  3042. 07902 .sect .text; .sect .rom; .sect .data; .sect .bss
  3043. 07903
  3044. 07904 ! void *memcpy(void *s1, const void *s2, size_t n)
  3045. 07905 !       Copy a chunk of memory.
  3046. 07906 !       This routine need not handle overlap, so it does not handle overlap.
  3047. 07907 !       One could simply call __memmove, the cost of the overlap check is
  3048. 07908 !       negligible, but you are dealing with a programmer who believes that
  3049. 07909 !       if anything can go wrong, it should go wrong.
  3050. 07910 !
  3051. 07911 .sect .text
  3052. 07912 .define _memcpy
  3053. 07913 _memcpy:
  3054. 07914         push    bp
  3055. 07915         mov     bp, sp
  3056. 07916         push    si
  3057. 07917         push    di
  3058. 07918         mov     di, 4(bp)       ! String s1
  3059. 07919         mov     si, 6(bp)       ! String s2
  3060. 07920         mov     cx, 8(bp)       ! Length
  3061. 07921         ! No overlap check here
  3062. 07922         jmp     __memcpy        ! Call the part of __memmove that copies up
  3063. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3064. src/lib/i86/string/memmove.s    
  3065. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3066. 08000 !       memmove()                                       Author: Kees J. Bot
  3067. 08001 !                                                               27 Jan 1994
  3068. 08002 .sect .text; .sect .rom; .sect .data; .sect .bss
  3069. 08003
  3070. 08004 ! void *memmove(void *s1, const void *s2, size_t n)
  3071. 08005 !       Copy a chunk of memory.  Handle overlap.
  3072. 08006 !
  3073. 08007 .sect .text
  3074. 08008 .define _memmove
  3075. 08009 _memmove:
  3076. 08010         jmp     __memmove       ! Call common code
  3077. .Op 59 src/lib/i86/string/memset.s
  3078. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3079. src/lib/i86/string/memset.s    
  3080. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3081. 08100 !       memset()                                        Author: Kees J. Bot
  3082. 08101 !                                                               27 Jan 1994
  3083. 08102 .sect .text; .sect .rom; .sect .data; .sect .bss
  3084. 08103
  3085. 08104 ! void *memset(void *s, int c, size_t n)
  3086. 08105 !       Set a chunk of memory to the same byte value.
  3087. 08106 !
  3088. 08107 .sect .text
  3089. 08108 .define _memset
  3090. 08109 _memset:
  3091. 08110         push    bp
  3092. 08111         mov     bp, sp
  3093. 08112         push    di
  3094. 08113         mov     di, 4(bp)       ! The string
  3095. 08114         movb    al, 6(bp)       ! The fill byte
  3096. 08115         mov     cx, 8(bp)       ! Length
  3097. 08116         cld
  3098. 08117         cmp     cx, #16
  3099. 08118         jb      sbyte           ! Don't bother being smart with short arrays
  3100. 08119         test    di, #1
  3101. 08120         jnz     sbyte           ! Bit 0 set, use byte store
  3102. 08121 sword:  movb    ah, al          ! One byte to two bytes
  3103. 08122         sar     cx, #1
  3104. 08123     rep stos                    ! Store words
  3105. 08124         adc     cx, cx          ! One more byte?
  3106. 08125 sbyte:
  3107. 08126     rep stosb                   ! Store bytes
  3108. 08127 done:   mov     ax, 4(bp)       ! Return some value you have no need for
  3109. 08128         pop     di
  3110. 08129         pop     bp
  3111. 08130         ret
  3112. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3113. src/lib/i86/string/rindex.s    
  3114. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3115. 08200 !       rindex()                                        Author: Kees J. Bot
  3116. 08201 !                                                               27 Jan 1994
  3117. 08202 .sect .text; .sect .rom; .sect .data; .sect .bss
  3118. 08203
  3119. 08204 ! char *rindex(const char *s, int c)
  3120. 08205 !       Look for the last occurrence a character in a string.  Has suffered
  3121. 08206 !       from a hostile takeover by strrchr().
  3122. 08207 !
  3123. 08208 .sect .text
  3124. 08209 .define _rindex
  3125. 08210 _rindex:
  3126. 08211         jmp     _strrchr
  3127. .Ep 60 src/lib/i86/string/strcat.s
  3128. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3129. src/lib/i86/string/strcat.s    
  3130. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3131. 08300 !       strcat()                                        Author: Kees J. Bot
  3132. 08301 !                                                               27 Jan 1994
  3133. 08302 .sect .text; .sect .rom; .sect .data; .sect .bss
  3134. 08303
  3135. 08304 ! char *strcat(char *s1, const char *s2)
  3136. 08305 !       Append string s2 to s1.
  3137. 08306 !
  3138. 08307 .sect .text
  3139. 08308 .define _strcat
  3140. 08309 _strcat:
  3141. 08310         mov     dx, #-1         ! Unlimited length
  3142. 08311         jmp     __strncat       ! Common code
  3143. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3144. src/lib/i86/string/strchr.s    
  3145. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3146. 08400 !       strchr()                                        Author: Kees J. Bot
  3147. 08401 !                                                               27 Jan 1994
  3148. 08402 .sect .text; .sect .rom; .sect .data; .sect .bss
  3149. 08403
  3150. 08404 ! char *strchr(const char *s, int c)
  3151. 08405 !       Look for a character in a string.
  3152. 08406 !
  3153. 08407 .sect .text
  3154. 08408 .define _strchr
  3155. 08409 _strchr:
  3156. 08410         push    bp
  3157. 08411         mov     bp, sp
  3158. 08412         push    di
  3159. 08413         cld
  3160. 08414         mov     di, 4(bp)       ! di = string
  3161. 08415         mov     dx, #16         ! Look at small chunks of the string
  3162. 08416 next:   shl     dx, #1          ! Chunks become bigger each time
  3163. 08417         mov     cx, dx
  3164. 08418         xorb    al, al          ! Look for the zero at the end
  3165. 08419   repne scasb
  3166. 08420         pushf                   ! Remember the flags
  3167. 08421         sub     cx, dx
  3168. 08422         neg     cx              ! Some or all of the chunk
  3169. 08423         sub     di, cx          ! Step back
  3170. 08424         movb    al, 6(bp)       ! The character to look for
  3171. 08425   repne scasb
  3172. 08426         je      found
  3173. 08427         popf                    ! Did we find the end of string earlier?
  3174. 08428         jne     next            ! No, try again
  3175. 08429         xor     ax, ax          ! Return NULL
  3176. 08430         pop     di
  3177. 08431         pop     bp
  3178. 08432         ret
  3179. 08433 found:  pop     ax              ! Get rid of those flags
  3180. 08434         lea     ax, -1(di)      ! Address of byte found
  3181. .Op 61 src/lib/i86/string/strchr.s
  3182. 08435         pop     di
  3183. 08436         pop     bp
  3184. 08437         ret
  3185. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3186. src/lib/i86/string/strcmp.s    
  3187. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3188. 08500 !       strcmp()                                        Author: Kees J. Bot
  3189. 08501 !                                                               27 Jan 1994
  3190. 08502 .sect .text; .sect .rom; .sect .data; .sect .bss
  3191. 08503
  3192. 08504 ! int strcmp(const char *s1, const char *s2)
  3193. 08505 !       Compare two strings.
  3194. 08506 !
  3195. 08507 .sect .text
  3196. 08508 .define _strcmp
  3197. 08509 _strcmp:
  3198. 08510         mov     cx, #-1         ! Unlimited length
  3199. 08511         jmp     __strncmp       ! Common code
  3200. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3201. src/lib/i86/string/strcpy.s    
  3202. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3203. 08600 !       strcpy()                                        Author: Kees J. Bot
  3204. 08601 !                                                               27 Jan 1994
  3205. 08602 .sect .text; .sect .rom; .sect .data; .sect .bss
  3206. 08603
  3207. 08604 ! char *strcpy(char *s1, const char *s2)
  3208. 08605 !       Copy string s2 to s1.
  3209. 08606 !
  3210. 08607 .sect .text
  3211. 08608 .define _strcpy
  3212. 08609 _strcpy:
  3213. 08610         push    bp
  3214. 08611         mov     bp, sp
  3215. 08612         push    si
  3216. 08613         push    di
  3217. 08614         mov     cx, #-1         ! Unlimited length
  3218. 08615         call    __strncpy       ! Common code
  3219. 08616         mov     ax, 4(bp)       ! Return s1
  3220. 08617         pop     di
  3221. 08618         pop     si
  3222. 08619         pop     bp
  3223. 08620         ret
  3224. .Ep 62 src/lib/i86/string/strlen.s
  3225. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3226. src/lib/i86/string/strlen.s    
  3227. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3228. 08700 !       strlen()                                        Author: Kees J. Bot
  3229. 08701 !                                                               27 Jan 1994
  3230. 08702 .sect .text; .sect .rom; .sect .data; .sect .bss
  3231. 08703
  3232. 08704 ! size_t strlen(const char *s)
  3233. 08705 !       Return the length of a string.
  3234. 08706 !
  3235. 08707 .sect .text
  3236. 08708 .define _strlen
  3237. 08709 _strlen:
  3238. 08710         mov     cx, #-1         ! Unlimited length
  3239. 08711         jmp     __strnlen       ! Common code
  3240. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3241. src/lib/i86/string/strncat.s    
  3242. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3243. 08800 !       strncat()                                       Author: Kees J. Bot
  3244. 08801 !                                                               27 Jan 1994
  3245. 08802 .sect .text; .sect .rom; .sect .data; .sect .bss
  3246. 08803
  3247. 08804 ! size_t strncat(char *s1, const char *s2, size_t n)
  3248. 08805 !       Append string s2 to s1.
  3249. 08806 !
  3250. 08807 .sect .text
  3251. 08808 .define _strncat
  3252. 08809 _strncat:
  3253. 08810         mov     bx, sp
  3254. 08811         mov     dx, 6(bx)       ! Maximum length
  3255. 08812         jmp     __strncat       ! Common code
  3256. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3257. src/lib/i86/string/strncmp.s    
  3258. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3259. 08900 !       strncmp()                                       Author: Kees J. Bot
  3260. 08901 !                                                               27 Jan 1994
  3261. 08902 .sect .text; .sect .rom; .sect .data; .sect .bss
  3262. 08903
  3263. 08904 ! int strncmp(const char *s1, const char *s2, size_t n)
  3264. 08905 !       Compare two strings.
  3265. 08906 !
  3266. 08907 .sect .text
  3267. 08908 .define _strncmp
  3268. 08909 _strncmp:
  3269. 08910         mov     bx, sp
  3270. 08911         mov     cx, 6(bx)       ! Maximum length
  3271. 08912         jmp     __strncmp       ! Common code
  3272. .Op 63 src/lib/i86/string/strncpy.s
  3273. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3274. src/lib/i86/string/strncpy.s    
  3275. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3276. 09000 !       strncpy()                                       Author: Kees J. Bot
  3277. 09001 !                                                               27 Jan 1994
  3278. 09002 .sect .text; .sect .rom; .sect .data; .sect .bss
  3279. 09003
  3280. 09004 ! char *strncpy(char *s1, const char *s2, size_t n)
  3281. 09005 !       Copy string s2 to s1.
  3282. 09006 !
  3283. 09007 .sect .text
  3284. 09008 .define _strncpy
  3285. 09009 _strncpy:
  3286. 09010         push    bp
  3287. 09011         mov     bp, sp
  3288. 09012         push    si
  3289. 09013         push    di
  3290. 09014         mov     cx, 8(bp)       ! Maximum length
  3291. 09015         call    __strncpy       ! Common code
  3292. 09016         mov     cx, dx          ! Number of bytes not copied
  3293. 09017     rep stosb                   ! strncpy always copies n bytes by null padding
  3294. 09018         mov     ax, 4(bp)       ! Return s1
  3295. 09019         pop     di
  3296. 09020         pop     si
  3297. 09021         pop     bp
  3298. 09022         ret
  3299. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3300. src/lib/i86/string/strnlen.s    
  3301. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3302. 09100 !       strnlen()                                       Author: Kees J. Bot
  3303. 09101 !                                                               27 Jan 1994
  3304. 09102 .sect .text; .sect .rom; .sect .data; .sect .bss
  3305. 09103
  3306. 09104 ! size_t strnlen(const char *s, size_t n)
  3307. 09105 !       Return the length of a string.
  3308. 09106 !
  3309. 09107 .sect .text
  3310. 09108 .define _strnlen
  3311. 09109 _strnlen:
  3312. 09110         mov     bx, sp
  3313. 09111         mov     cx, 4(bx)       ! Maximum length
  3314. 09112         jmp     __strnlen       ! Common code
  3315. .Ep 64 src/lib/i86/string/strrchr.s
  3316. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3317. src/lib/i86/string/strrchr.s    
  3318. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3319. 09200 !       strrchr()                                       Author: Kees J. Bot
  3320. 09201 !                                                               27 Jan 1994
  3321. 09202 .sect .text; .sect .rom; .sect .data; .sect .bss
  3322. 09203
  3323. 09204 ! char *strrchr(const char *s, int c)
  3324. 09205 !       Look for the last occurrence a character in a string.
  3325. 09206 !
  3326. 09207 .sect .text
  3327. 09208 .define _strrchr
  3328. 09209 _strrchr:
  3329. 09210         push    bp
  3330. 09211         mov     bp, sp
  3331. 09212         push    di
  3332. 09213         mov     di, 4(bp)       ! di = string
  3333. 09214         mov     cx, #-1
  3334. 09215         xorb    al, al
  3335. 09216         cld
  3336. 09217   repne scasb                   ! Look for the end of the string
  3337. 09218         not     cx              ! -1 - cx = Length of the string + null
  3338. 09219         dec     di              ! Put di back on the zero byte
  3339. 09220         movb    al, 6(bp)       ! The character to look for
  3340. 09221         std                     ! Downwards search
  3341. 09222   repne scasb
  3342. 09223         cld                     ! Direction bit back to default
  3343. 09224         jne     failure
  3344. 09225         lea     ax, 1(di)       ! Found it
  3345. 09226         pop     di
  3346. 09227         pop     bp
  3347. 09228         ret
  3348. 09229 failure:xor     ax, ax          ! Not there
  3349. 09230         pop     di
  3350. 09231         pop     bp
  3351. 09232         ret