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

操作系统开发

开发平台:

WINDOWS

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