LIB386.TXT
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:106k
源码类别:

操作系统开发

开发平台:

C/C++

  1. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2. src/lib/i386/em/byte_order.h    
  3. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4. 00000 #define CHAR_UNSIGNED   0
  5. 00001 #define MSB_AT_LOW_ADDRESS      0
  6. 00002 #define MSW_AT_LOW_ADDRESS      0
  7. 00003 #define FL_MSB_AT_LOW_ADDRESS   0
  8. 00004 #define FL_MSW_AT_LOW_ADDRESS   0
  9. 00005 #define FL_MSL_AT_LOW_ADDRESS   0
  10. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  11. src/lib/i386/em/em_adf4.s    
  12. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  13. 00100 .sect .text; .sect .rom; .sect .data; .sect .bss
  14. 00101 .define .adf4
  15. 00102
  16. 00103         .sect .text
  17. 00104 .adf4:
  18. 00105         mov     bx,sp
  19. 00106         flds    4(bx)
  20. 00107         fadds   8(bx)
  21. 00108         fstps   8(bx)
  22. 00109         wait
  23. 00110         ret
  24. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  25. src/lib/i386/em/em_adf8.s    
  26. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  27. 00200 .sect .text; .sect .rom; .sect .data; .sect .bss
  28. 00201 .define .adf8
  29. 00202
  30. 00203         .sect .text
  31. 00204 .adf8:
  32. 00205         mov     bx,sp
  33. 00206         fldd    4(bx)
  34. 00207         faddd   12(bx)
  35. 00208         fstpd   12(bx)
  36. 00209         wait
  37. 00210         ret
  38. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  39. src/lib/i386/em/em_adi.s    
  40. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  41. 00300 .sect .text; .sect .rom; .sect .data; .sect .bss
  42. 00301 .define .adi
  43. 00302
  44. 00303         ! #bytes in ecx , top of stack in eax
  45. 00304         .sect .text
  46. 00305 .adi:
  47. 00306         pop     ebx              ! return address
  48. 00307         cmp     ecx,4
  49. 00308         jne     9f
  50. 00309         pop     ecx
  51. 00310         add     eax,ecx
  52. 00311         jmp     ebx
  53. 00312 9:
  54. 00313 .extern EODDZ
  55. 00314 .extern .trp
  56. 00315         mov     eax,EODDZ
  57. 00316         push    ebx
  58. 00317         jmp     .trp
  59. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  60. src/lib/i386/em/em_and.s    
  61. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  62. 00400 .sect .text; .sect .rom; .sect .data; .sect .bss
  63. 00401 .define .and
  64. 00402
  65. 00403         ! #bytes in ecx
  66. 00404         ! save edi; it might be a register variable
  67. 00405
  68. 00406         .sect .text
  69. 00407 .and:
  70. 00408         pop     ebx             ! return address
  71. 00409         mov     edx,edi
  72. 00410         mov     edi,esp
  73. 00411         add     edi,ecx
  74. 00412         sar     ecx,2
  75. 00413 1:
  76. 00414         pop     eax
  77. 00415         and     eax,(edi)
  78. 00416         stos
  79. 00417         loop    1b
  80. 00418         mov     edi,edx
  81. 00419         jmp     ebx
  82. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  83. src/lib/i386/em/em_blm.s    
  84. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  85. 00500 .sect .text; .sect .rom; .sect .data; .sect .bss
  86. 00501 .sect .text
  87. 00502 .define .blm
  88. 00503
  89. 00504         ! ecx: count in words
  90. 00505 .blm:
  91. 00506         mov     ebx,esp
  92. 00507         mov     eax,esi
  93. 00508         mov     edx,edi
  94. 00509         mov     edi,4(ebx)
  95. 00510         mov     esi,8(ebx)
  96. 00511         rep     movs
  97. 00512         mov     esi,eax
  98. 00513         mov     edi,edx
  99. 00514         ret     8
  100. 00515
  101. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  102. src/lib/i386/em/em_cff4.s    
  103. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  104. 00600 .sect .text; .sect .rom; .sect .data; .sect .bss
  105. 00601 .define .cff4
  106. 00602
  107. 00603         .sect .text
  108. 00604 .cff4:
  109. 00605         mov     bx,sp
  110. 00606         fldd    4(bx)
  111. 00607         fstcw   4(bx)
  112. 00608         wait
  113. 00609         mov     dx,4(bx)
  114. 00610         and     4(bx),0xf3ff    ! set to rounding mode
  115. 00611         wait
  116. 00612         fldcw   4(bx)
  117. 00613         fstps   8(bx)
  118. 00614         mov     4(bx),dx
  119. 00615         wait
  120. 00616         fldcw   4(bx)
  121. 00617         wait
  122. 00618         ret
  123. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  124. src/lib/i386/em/em_cff8.s    
  125. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  126. 00700 .sect .text; .sect .rom; .sect .data; .sect .bss
  127. 00701 .define .cff8
  128. 00702
  129. 00703         .sect .text
  130. 00704 .cff8:
  131. 00705         mov     bx,sp
  132. 00706         flds    4(bx)
  133. 00707         fstpd   4(bx)
  134. 00708         wait
  135. 00709         ret
  136. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  137. src/lib/i386/em/em_cfi.s    
  138. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  139. 00800 .sect .text; .sect .rom; .sect .data; .sect .bss
  140. 00801 .define .cfi
  141. 00802
  142. 00803         .sect .text
  143. 00804 .cfi:
  144. 00805         mov     bx,sp
  145. 00806         fstcw   4(bx)
  146. 00807         wait
  147. 00808         mov     dx,4(bx)
  148. 00809         or      4(bx),0xc00     ! truncating mode
  149. 00810         wait
  150. 00811         fldcw   4(bx)
  151. 00812         cmp     8(bx),4
  152. 00813         jne     2f
  153. 00814                                 ! loc 4 loc ? cfi
  154. 00815         flds    12(bx)
  155. 00816         fistpl  12(bx)
  156. 00817 1:
  157. 00818         mov     4(bx),dx
  158. 00819         wait
  159. 00820         fldcw   4(bx)
  160. 00821         ret
  161. 00822 2:
  162. 00823                                 ! loc 8 loc ? cfi
  163. 00824         fldd    12(bx)
  164. 00825         fistpl  16(bx)
  165. 00826         jmp     1b
  166. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  167. src/lib/i386/em/em_cfu.s    
  168. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  169. 00900 .sect .text; .sect .rom; .sect .data; .sect .bss
  170. 00901 .define .cfu
  171. 00902
  172. 00903         .sect .text
  173. 00904 .cfu:
  174. 00905         mov     bx,sp
  175. 00906         fstcw   4(bx)
  176. 00907         wait
  177. 00908         mov     dx,4(bx)
  178. 00909         or      4(bx),0xc00     ! truncating mode
  179. 00910         wait
  180. 00911         fldcw   4(bx)
  181. 00912         cmp     8(bx),4
  182. 00913         jne     2f
  183. 00914                                 ! loc 4 loc ? cfu
  184. 00915         flds    12(bx)
  185. 00916         fabs                    ! ???
  186. 00917         fiaddl  (bigmin)
  187. 00918         fistpl  12(bx)
  188. 00919         wait
  189. 00920         mov     ax,12(bx)
  190. 00921         sub     ax,(bigmin)
  191. 00922         mov     12(bx),ax
  192. 00923 1:
  193. 00924         mov     4(bx),dx
  194. 00925         wait
  195. 00926         fldcw   4(bx)
  196. 00927         ret
  197. 00928 2:
  198. 00929                                 ! loc 8 loc ? cfu
  199. 00930         fldd    12(bx)
  200. 00931         fabs                    ! ???
  201. 00932         fiaddl  (bigmin)
  202. 00933         fistpl  16(bx)
  203. 00934         mov     ax,16(bx)
  204. 00935         sub     ax,(bigmin)
  205. 00936         mov     16(bx),ax
  206. 00937         jmp     1b
  207. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  208. src/lib/i386/em/em_cif4.s    
  209. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  210. 01000 .sect .text; .sect .rom; .sect .data; .sect .bss
  211. 01001 .define .cif4
  212. 01002
  213. 01003         .sect .text
  214. 01004 .cif4:
  215. 01005         mov     bx,sp
  216. 01006         fildl   8(bx)
  217. 01007         fstps   8(bx)
  218. 01008         wait
  219. 01009         ret
  220. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  221. src/lib/i386/em/em_cif8.s    
  222. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  223. 01100 .sect .text; .sect .rom; .sect .data; .sect .bss
  224. 01101 .define .cif8
  225. 01102
  226. 01103         .sect .text
  227. 01104 .cif8:
  228. 01105         mov     bx,sp
  229. 01106         fildl   8(bx)
  230. 01107         fstpd   4(bx)
  231. 01108         wait
  232. 01109         ret
  233. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  234. src/lib/i386/em/em_cii.s    
  235. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  236. 01200 .sect .text; .sect .rom; .sect .data; .sect .bss
  237. 01201 .define .cii
  238. 01202
  239. 01203 .sect .text
  240. 01204 .cii:
  241. 01205         pop     ebx              ! return address
  242. 01206                                 ! pop     ecx, dest. size
  243. 01207                                 ! pop     edx, src. size
  244. 01208                                 ! eax is source
  245. 01209         cmp     edx,1
  246. 01210         jne     2f
  247. 01211         movsxb  eax,al
  248. 01212         mov     edx,4
  249. 01213         jmp     1f
  250. 01214 2:
  251. 01215         cmp     edx,2
  252. 01216         jne     1f
  253. 01217         cwde                    ! convert from 2 to 4 bytes
  254. 01218         mov     edx,4
  255. 01219 1:
  256. 01220         cmp     edx,ecx
  257. 01221         jne     9f
  258. 01222         cmp     edx,4
  259. 01223         jne     9f
  260. 01224         jmp     ebx
  261. 01225 9:
  262. 01226 .extern EILLINS
  263. 01227 .extern .fat
  264. 01228         mov     eax,EILLINS
  265. 01229         push    eax
  266. 01230         jmp     .fat
  267. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  268. src/lib/i386/em/em_cmf4.s    
  269. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  270. 01300 .sect .text; .sect .rom; .sect .data; .sect .bss
  271. 01301 .define .cmf4
  272. 01302
  273. 01303         .sect .text
  274. 01304 .cmf4:
  275. 01305         mov     bx,sp
  276. 01306         xor     cx,cx
  277. 01307         flds    8(bx)
  278. 01308         flds    4(bx)
  279. 01309         fcompp                  ! compare and pop operands
  280. 01310         fstsw   ax
  281. 01311         wait
  282. 01312         sahf
  283. 01313         je      1f
  284. 01314         jb      2f
  285. 01315         dec     cx
  286. 01316         jmp     1f
  287. 01317 2:
  288. 01318         inc     cx
  289. 01319 1:
  290. 01320         mov     ax,cx
  291. 01321         ret
  292. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  293. src/lib/i386/em/em_cmf8.s    
  294. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  295. 01400 .sect .text; .sect .rom; .sect .data; .sect .bss
  296. 01401 .define .cmf8
  297. 01402
  298. 01403         .sect .text
  299. 01404 .cmf8:
  300. 01405         mov     bx,sp
  301. 01406         xor     cx,cx
  302. 01407         fldd    12(bx)
  303. 01408         fldd    4(bx)
  304. 01409         fcompp                  ! compare and pop operands
  305. 01410         fstsw   ax
  306. 01411         wait
  307. 01412         sahf
  308. 01413         je      1f
  309. 01414         jb      2f
  310. 01415         dec     cx
  311. 01416         jmp     1f
  312. 01417 2:
  313. 01418         inc     cx
  314. 01419 1:
  315. 01420         mov     ax,cx
  316. 01421         ret
  317. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  318. src/lib/i386/em/em_cms.s    
  319. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  320. 01500 .sect .text; .sect .rom; .sect .data; .sect .bss
  321. 01501 .define .cms
  322. 01502
  323. 01503         ! #bytes in ecx
  324. 01504         .sect .text
  325. 01505 .cms:
  326. 01506         pop     ebx              ! return address
  327. 01507         mov     edx,esp
  328. 01508         push    esi
  329. 01509         push    edi
  330. 01510         mov     esi,edx
  331. 01511         add     edx,ecx
  332. 01512         mov     edi,edx
  333. 01513         add     edx,ecx
  334. 01514         sar     ecx,2
  335. 01515         repe cmps
  336. 01516         je      1f
  337. 01517         inc     ecx
  338. 01518 1:
  339. 01519         pop     edi
  340. 01520         pop     esi
  341. 01521         mov     esp,edx
  342. 01522         jmp     ebx
  343. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  344. src/lib/i386/em/em_com.s    
  345. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  346. 01600 .sect .text; .sect .rom; .sect .data; .sect .bss
  347. 01601 .define .com
  348. 01602
  349. 01603         ! #bytes in ecx
  350. 01604         .sect .text
  351. 01605 .com:
  352. 01606         mov     ebx,esp
  353. 01607         add     ebx,4
  354. 01608         sar     ecx,2
  355. 01609 1:
  356. 01610         not     (ebx)
  357. 01611         add     ebx,4
  358. 01612         loop    1b
  359. 01613         ret
  360. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  361. src/lib/i386/em/em_csa4.s    
  362. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  363. 01700 .sect .text; .sect .rom; .sect .data; .sect .bss
  364. 01701 .define .csa4
  365. 01702
  366. 01703 .sect .text
  367. 01704 .csa4:
  368. 01705                                 ! ebx, descriptor address
  369. 01706                                 ! eax, index
  370. 01707         mov     edx,(ebx)         ! default
  371. 01708         sub     eax,4(ebx)
  372. 01709         cmp     eax,8(ebx)
  373. 01710         ja      1f
  374. 01711         sal     eax,2
  375. 01712         add     ebx,eax
  376. 01713         mov     ebx,12(ebx)
  377. 01714         test    ebx,ebx
  378. 01715         jnz     2f
  379. 01716 1:
  380. 01717         mov     ebx,edx
  381. 01718         test    ebx,ebx
  382. 01719         jnz     2f
  383. 01720 .extern ECASE
  384. 01721 .extern .fat
  385. 01722         mov     eax,ECASE
  386. 01723         push    eax
  387. 01724         jmp     .fat
  388. 01725 2:
  389. 01726         jmp     ebx
  390. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  391. src/lib/i386/em/em_csb4.s    
  392. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  393. 01800 .sect .text; .sect .rom; .sect .data; .sect .bss
  394. 01801 .define .csb4
  395. 01802
  396. 01803 .sect .text
  397. 01804 .csb4:
  398. 01805                                 !ebx, descriptor address
  399. 01806                                 !eax,  index
  400. 01807         mov     edx,(ebx)
  401. 01808         mov     ecx,4(ebx)
  402. 01809 1:
  403. 01810         add     ebx,8
  404. 01811         dec     ecx
  405. 01812         jl      4f
  406. 01813         cmp     eax,(ebx)
  407. 01814         jne     1b
  408. 01815         mov     ebx,4(ebx)
  409. 01816 2:
  410. 01817         test    ebx,ebx
  411. 01818         jnz     3f
  412. 01819 .extern ECASE
  413. 01820 .extern .fat
  414. 01821         mov     eax,ECASE
  415. 01822         push    eax
  416. 01823         jmp     .fat
  417. 01824 3:
  418. 01825         jmp     ebx
  419. 01826 4:
  420. 01827         mov     ebx,edx
  421. 01828         jmp     2b
  422. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  423. src/lib/i386/em/em_cuf4.s    
  424. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  425. 01900 .sect .text; .sect .rom; .sect .data; .sect .bss
  426. 01901 .define .cuf4
  427. 01902
  428. 01903         .sect .text
  429. 01904 .cuf4:
  430. 01905         mov     bx,sp
  431. 01906         fildl   8(bx)
  432. 01907         cmp     8(bx),0
  433. 01908         jge     1f
  434. 01909         fisubl  (bigmin)
  435. 01910         fisubl  (bigmin)
  436. 01911 1:
  437. 01912         fstps   8(bx)
  438. 01913         wait
  439. 01914         ret
  440. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  441. src/lib/i386/em/em_cuf8.s    
  442. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  443. 02000 .sect .text; .sect .rom; .sect .data; .sect .bss
  444. 02001 .define .cuf8
  445. 02002
  446. 02003         .sect .text
  447. 02004 .cuf8:
  448. 02005         mov     bx,sp
  449. 02006         fildl   8(bx)
  450. 02007         cmp     8(bx),0
  451. 02008         jge     1f
  452. 02009         fisubl  (bigmin)
  453. 02010         fisubl  (bigmin)
  454. 02011 1:
  455. 02012         fstpd   4(bx)
  456. 02013         wait
  457. 02014         ret
  458. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  459. src/lib/i386/em/em_cuu.s    
  460. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  461. 02100 .sect .text; .sect .rom; .sect .data; .sect .bss
  462. 02101 .define .ciu
  463. 02102 .define .cui
  464. 02103 .define .cuu
  465. 02104
  466. 02105 .sect .text
  467. 02106 .ciu:
  468. 02107 .cui:
  469. 02108 .cuu:
  470. 02109         pop     ebx              ! return address
  471. 02110                                 ! pop     ecx, dest. size
  472. 02111                                 ! pop     edx, source size
  473. 02112                                 ! eax is source
  474. 02113         cmp     edx,ecx
  475. 02114         jne     8f
  476. 02115         jmp     ebx
  477. 02116 8:
  478. 02117 .extern EILLINS
  479. 02118 .extern .fat
  480. 02119         mov     eax,EILLINS
  481. 02120         push    eax
  482. 02121         jmp     .fat
  483. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  484. src/lib/i386/em/em_dup.s    
  485. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  486. 02200 .sect .text; .sect .rom; .sect .data; .sect .bss
  487. 02201 .define .dup
  488. 02202
  489. 02203         ! #bytes in ecx
  490. 02204         .sect .text
  491. 02205 .dup:
  492. 02206         pop     ebx             ! return address
  493. 02207         mov     eax,esi
  494. 02208         mov     edx,edi
  495. 02209         mov     esi,esp
  496. 02210         sub     esp,ecx
  497. 02211         mov     edi,esp
  498. 02212         sar     ecx,2
  499. 02213         rep movs
  500. 02214         mov     esi,eax
  501. 02215         mov     edi,edx
  502. 02216         jmp     ebx
  503. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  504. src/lib/i386/em/em_dvf4.s    
  505. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  506. 02300 .sect .text; .sect .rom; .sect .data; .sect .bss
  507. 02301 .define .dvf4
  508. 02302
  509. 02303         .sect .text
  510. 02304 .dvf4:
  511. 02305         mov     bx,sp
  512. 02306         flds    8(bx)
  513. 02307         fdivs   4(bx)
  514. 02308         fstps   8(bx)
  515. 02309         wait
  516. 02310         ret
  517. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  518. src/lib/i386/em/em_dvf8.s    
  519. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  520. 02400 .sect .text; .sect .rom; .sect .data; .sect .bss
  521. 02401 .define .dvf8
  522. 02402
  523. 02403         .sect .text
  524. 02404 .dvf8:
  525. 02405         mov     bx,sp
  526. 02406         fldd    12(bx)
  527. 02407         fdivd   4(bx)
  528. 02408         fstpd   12(bx)
  529. 02409         wait
  530. 02410         ret
  531. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  532. src/lib/i386/em/em_dvi.s    
  533. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  534. 02500 .sect .text; .sect .rom; .sect .data; .sect .bss
  535. 02501 .define .dvi
  536. 02502
  537. 02503         ! #bytes in eax
  538. 02504         .sect .text
  539. 02505 .dvi:
  540. 02506         pop     ebx              ! return address
  541. 02507         cmp     eax,4
  542. 02508         jne     1f
  543. 02509         pop     eax
  544. 02510         cwd
  545. 02511         pop     ecx
  546. 02512         idiv    ecx
  547. 02513         push    eax
  548. 02514         jmp     ebx
  549. 02515 1:
  550. 02516 .extern EODDZ
  551. 02517 .extern .trp
  552. 02518         mov     eax,EODDZ
  553. 02519         push    ebx
  554. 02520         jmp     .trp
  555. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  556. src/lib/i386/em/em_dvu.s    
  557. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  558. 02600 .sect .text; .sect .rom; .sect .data; .sect .bss
  559. 02601 .define .dvu
  560. 02602
  561. 02603         ! #bytes in eax
  562. 02604         .sect .text
  563. 02605 .dvu:
  564. 02606         pop     ebx              ! return address
  565. 02607         cmp     eax,4
  566. 02608         jne     1f
  567. 02609         pop     eax
  568. 02610         xor     edx,edx
  569. 02611         pop     ecx
  570. 02612         div     ecx
  571. 02613         push    eax
  572. 02614         jmp     ebx
  573. 02615 1:
  574. 02616 .extern EODDZ
  575. 02617 .extern .trp
  576. 02618         mov     eax,EODDZ
  577. 02619         push    ebx
  578. 02620         jmp     .trp
  579. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  580. src/lib/i386/em/em_error.s    
  581. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  582. 02700 .sect .text; .sect .rom; .sect .data; .sect .bss
  583. 02701 .define .error
  584. 02702 .define .Xtrp
  585. 02703
  586. 02704         ! eax is trap number
  587. 02705         ! all registers must be saved
  588. 02706         ! because return is possible
  589. 02707         ! May only be called with error no's <16
  590. 02708 .sect .text
  591. 02709 .error:
  592. 02710         mov  ecx,eax
  593. 02711         mov  ebx,1
  594. 02712         sal  ebx,cl
  595. 02713 .extern .ignmask
  596. 02714 .extern .trp
  597. 02715         test ebx,(.ignmask)
  598. 02716         jne  2f
  599. 02717         call    .trp
  600. 02718 2:
  601. 02719         ret
  602. 02720
  603. 02721 .Xtrp:
  604. 02722         pusha
  605. 02723         cmp     eax,16
  606. 02724         jge     1f
  607. 02725         call    .error
  608. 02726         popa
  609. 02727         ret
  610. 02728 1:
  611. 02729         call    .trp
  612. 02730         popa
  613. 02731         ret
  614. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  615. src/lib/i386/em/em_exg.s    
  616. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  617. 02800 .sect .text; .sect .rom; .sect .data; .sect .bss
  618. 02801 .define .exg
  619. 02802
  620. 02803         ! #bytes in ecx
  621. 02804 .sect .text
  622. 02805 .exg:
  623. 02806         push    edi
  624. 02807         mov     edi,esp
  625. 02808         add     edi,8
  626. 02809         mov     ebx,edi
  627. 02810         add     ebx,ecx
  628. 02811         sar     ecx,2
  629. 02812 1:
  630. 02813         mov     eax,(ebx)
  631. 02814         xchg    eax,(edi)
  632. 02815         mov     (ebx),eax
  633. 02816         add     edi,4
  634. 02817         add     ebx,4
  635. 02818         loop    1b
  636. 02819 2:
  637. 02820         pop     edi
  638. 02821         ret
  639. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  640. src/lib/i386/em/em_fat.s    
  641. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  642. 02900 .sect .text; .sect .rom; .sect .data; .sect .bss
  643. 02901 .sect .text
  644. 02902 .define .fat
  645. 02903
  646. 02904 .fat:
  647. 02905 .extern .trp
  648. 02906 .extern .stop
  649. 02907         call    .trp
  650. 02908         call    .stop
  651. 02909         ! no return
  652. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  653. src/lib/i386/em/em_fef4.s    
  654. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  655. 03000 .sect .text; .sect .rom; .sect .data; .sect .bss
  656. 03001 .define .fef4
  657. 03002
  658. 03003         .sect .text
  659. 03004 .fef4:
  660. 03005                                 ! this could be simpler, if only the
  661. 03006                                 ! fxtract instruction was emulated properly
  662. 03007         mov     bx,sp
  663. 03008         mov     ax,8(bx)
  664. 03009         and     ax,0x7f800000
  665. 03010         je      1f              ! zero exponent
  666. 03011         shr     ax,23
  667. 03012         sub     ax,126
  668. 03013         mov     cx,ax           ! exponent in cx
  669. 03014         mov     ax,8(bx)
  670. 03015         and     ax,0x807fffff
  671. 03016         or      ax,0x3f000000   ! load -1 exponent
  672. 03017         mov     bx,4(bx)
  673. 03018         mov     4(bx),ax
  674. 03019         mov     (bx),cx
  675. 03020         ret
  676. 03021 1:                              ! we get here on zero exp
  677. 03022         mov     ax,8(bx)
  678. 03023         and     ax,0x007fffff
  679. 03024         jne     1f              ! zero result
  680. 03025         mov     bx,4(bx)
  681. 03026         mov     (bx),ax
  682. 03027         mov     4(bx),ax
  683. 03028         ret
  684. 03029 1:                              ! otherwise unnormalized number
  685. 03030         mov     cx,8(bx)
  686. 03031         and     cx,0x807fffff
  687. 03032         mov     dx,cx
  688. 03033         and     cx,0x80000000
  689. 03034         mov     ax,-125
  690. 03035 2:
  691. 03036         test    dx,0x800000
  692. 03037         jne     1f
  693. 03038         dec     ax
  694. 03039         shl     dx,1
  695. 03040         or      dx,cx
  696. 03041         jmp     2b
  697. 03042 1:
  698. 03043         mov     bx,4(bx)
  699. 03044         mov     (bx),ax
  700. 03045         and     dx,0x807fffff
  701. 03046         or      dx,0x3f000000   ! load -1 exponent
  702. 03047         mov     4(bx),dx
  703. 03048         ret
  704. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  705. src/lib/i386/em/em_fef8.s    
  706. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  707. 03100 .sect .text; .sect .rom; .sect .data; .sect .bss
  708. 03101 .define .fef8
  709. 03102
  710. 03103         .sect .text
  711. 03104 .fef8:
  712. 03105                                 ! this could be simpler, if only the
  713. 03106                                 ! fxtract instruction was emulated properly
  714. 03107         mov     bx,sp
  715. 03108         mov     ax,12(bx)
  716. 03109         and     ax,0x7ff00000
  717. 03110         je      1f              ! zero exponent
  718. 03111         shr     ax,20
  719. 03112         sub     ax,1022
  720. 03113         mov     cx,ax           ! exponent in cx
  721. 03114         mov     ax,12(bx)
  722. 03115         and     ax,0x800fffff
  723. 03116         or      ax,0x3fe00000   ! load -1 exponent
  724. 03117         mov     dx,8(bx)
  725. 03118         mov     bx,4(bx)
  726. 03119         mov     4(bx),dx
  727. 03120         mov     8(bx),ax
  728. 03121         mov     (bx),cx
  729. 03122         ret
  730. 03123 1:                              ! we get here on zero exp
  731. 03124         mov     ax,12(bx)
  732. 03125         and     ax,0xfffff
  733. 03126         or      ax,8(bx)
  734. 03127         jne     1f              ! zero result
  735. 03128         mov     bx,4(bx)
  736. 03129         mov     (bx),ax
  737. 03130         mov     4(bx),ax
  738. 03131         mov     8(bx),ax
  739. 03132         ret
  740. 03133 1:                              ! otherwise unnormalized number
  741. 03134         mov     cx,12(bx)
  742. 03135         and     cx,0x800fffff
  743. 03136         mov     dx,cx
  744. 03137         and     cx,0x80000000
  745. 03138         mov     ax,-1021
  746. 03139 2:
  747. 03140         test    dx,0x100000
  748. 03141         jne     1f
  749. 03142         dec     ax
  750. 03143         shl     8(bx),1
  751. 03144         rcl     dx,1
  752. 03145         or      dx,cx
  753. 03146         jmp     2b
  754. 03147 1:
  755. 03148         and     dx,0x800fffff
  756. 03149         or      dx,0x3fe00000   ! load -1 exponent
  757. 03150         mov     cx,8(bx)
  758. 03151         mov     bx,4(bx)
  759. 03152         mov     (bx),ax
  760. 03153         mov     8(bx),dx
  761. 03154         mov     4(bx),cx
  762. 03155         ret
  763. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  764. src/lib/i386/em/em_fif4.s    
  765. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  766. 03200 .sect .text; .sect .rom; .sect .data; .sect .bss
  767. 03201 .define .fif4
  768. 03202
  769. 03203         .sect .text
  770. 03204 .fif4:
  771. 03205         mov     bx,sp
  772. 03206         flds    8(bx)
  773. 03207         fmuls   12(bx)          ! multiply
  774. 03208         fld     st              ! copy result
  775. 03209         ftst                    ! test sign; handle negative separately
  776. 03210         fstsw   ax
  777. 03211         wait
  778. 03212         sahf                    ! result of test in condition codes
  779. 03213         jb      1f
  780. 03214         frndint                 ! this one rounds (?)
  781. 03215         fcom    st(1)           ! compare with original; if <=, then OK
  782. 03216         fstsw   ax
  783. 03217         wait
  784. 03218         sahf
  785. 03219         jbe     2f
  786. 03220         fisubs  (one)           ! else subtract 1
  787. 03221         jmp     2f
  788. 03222 1:                              ! here, negative case
  789. 03223         frndint                 ! this one rounds (?)
  790. 03224         fcom    st(1)           ! compare with original; if >=, then OK
  791. 03225         fstsw   ax
  792. 03226         wait
  793. 03227         sahf
  794. 03228         jae     2f
  795. 03229         fiadds  (one)           ! else add 1
  796. 03230 2:
  797. 03231         fsub    st(1),st        ! subtract integer part
  798. 03232         mov     bx,4(bx)
  799. 03233         fstps   (bx)
  800. 03234         fstps   4(bx)
  801. 03235         wait
  802. 03236         ret
  803. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  804. src/lib/i386/em/em_fif8.s    
  805. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  806. 03300 .sect .text; .sect .rom; .sect .data; .sect .bss
  807. 03301 .define .fif8
  808. 03302
  809. 03303         .sect .text
  810. 03304 .fif8:
  811. 03305         mov     bx,sp
  812. 03306         fldd    8(bx)
  813. 03307         fmuld   16(bx)          ! multiply
  814. 03308         fld     st              ! and copy result
  815. 03309         ftst                    ! test sign; handle negative separately
  816. 03310         fstsw   ax
  817. 03311         wait
  818. 03312         sahf                    ! result of test in condition codes
  819. 03313         jb      1f
  820. 03314         frndint                 ! this one rounds (?)
  821. 03315         fcom    st(1)           ! compare with original; if <=, then OK
  822. 03316         fstsw   ax
  823. 03317         wait
  824. 03318         sahf
  825. 03319         jbe     2f
  826. 03320         fisubs  (one)           ! else subtract 1
  827. 03321         jmp     2f
  828. 03322 1:                              ! here, negative case
  829. 03323         frndint                 ! this one rounds (?)
  830. 03324         fcom    st(1)           ! compare with original; if >=, then OK
  831. 03325         fstsw   ax
  832. 03326         wait
  833. 03327         sahf
  834. 03328         jae     2f
  835. 03329         fiadds  (one)           ! else add 1
  836. 03330 2:
  837. 03331         fsub    st(1),st        ! subtract integer part
  838. 03332         mov     bx,4(bx)
  839. 03333         fstpd   (bx)
  840. 03334         fstpd   8(bx)
  841. 03335         wait
  842. 03336         ret
  843. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  844. src/lib/i386/em/em_fp8087.s    
  845. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  846. 03400 .sect .text; .sect .rom; .sect .data; .sect .bss
  847. 03401 .define one, bigmin
  848. 03402
  849. 03403         .sect .rom
  850. 03404 one:
  851. 03405         .data2  1
  852. 03406 two:
  853. 03407         .data2  2
  854. 03408 bigmin:
  855. 03409         .data4  -2147483648
  856. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  857. src/lib/i386/em/em_gto.s    
  858. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  859. 03500 .sect .text; .sect .rom; .sect .data; .sect .bss
  860. 03501 .sect .text
  861. 03502 .define .gto
  862. 03503
  863. 03504 .gto:
  864. 03505         mov     ebp,8(ebx)
  865. 03506         mov     esp,4(ebx)
  866. 03507         jmp     (ebx)
  867. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  868. src/lib/i386/em/em_iaar.s    
  869. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  870. 03600 .sect .text; .sect .rom; .sect .data; .sect .bss
  871. 03601 .sect .text
  872. 03602 .define .iaar
  873. 03603
  874. 03604 .iaar:
  875. 03605         pop     ecx
  876. 03606         pop     edx
  877. 03607         cmp     edx,4
  878. 03608 .extern .unknown
  879. 03609         jne     .unknown
  880. 03610         pop     ebx     ! descriptor address
  881. 03611         pop     eax     ! index
  882. 03612         sub     eax,(ebx)
  883. 03613         mul     8(ebx)
  884. 03614         pop     ebx     ! array base
  885. 03615         add     ebx,eax
  886. 03616         push    ecx
  887. 03617         ret
  888. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  889. src/lib/i386/em/em_ilar.s    
  890. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  891. 03700 .sect .text; .sect .rom; .sect .data; .sect .bss
  892. 03701 .sect .text
  893. 03702 .define .ilar
  894. 03703
  895. 03704 .ilar:
  896. 03705         pop     ecx
  897. 03706         pop     edx
  898. 03707 .extern .unknown
  899. 03708         cmp     edx,4
  900. 03709         jne     .unknown
  901. 03710         pop     ebx      ! descriptor address
  902. 03711         pop     eax      ! index
  903. 03712         push    ecx
  904. 03713 .extern .lar4
  905. 03714         jmp    .lar4
  906. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  907. src/lib/i386/em/em_inn.s    
  908. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  909. 03800 .sect .text; .sect .rom; .sect .data; .sect .bss
  910. 03801 .sect .text
  911. 03802 .define .inn
  912. 03803
  913. 03804         ! #bytes in ecx
  914. 03805         ! bit # in eax
  915. 03806 .inn:
  916. 03807         xor     edx,edx
  917. 03808         mov     ebx,8
  918. 03809         div     ebx
  919. 03810         mov     ebx,esp
  920. 03811         add     ebx,4
  921. 03812         add     ebx,eax
  922. 03813         cmp     eax,ecx
  923. 03814         jae     1f
  924. 03815         movb    al,(ebx)
  925. 03816         mov     ebx,edx
  926. 03817         testb   al,bits(ebx)
  927. 03818         jz      1f
  928. 03819         mov     eax,1
  929. 03820         jmp     2f
  930. 03821 1:
  931. 03822         xor     eax,eax
  932. 03823 2:
  933. 03824         pop     ebx
  934. 03825         add     esp,ecx
  935. 03826         ! eax is result
  936. 03827         jmp     ebx
  937. 03828
  938. 03829         .sect .rom
  939. 03830 bits:
  940. 03831         .data1 1,2,4,8,16,32,64,128
  941. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  942. src/lib/i386/em/em_ior.s    
  943. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  944. 03900 .sect .text; .sect .rom; .sect .data; .sect .bss
  945. 03901 .sect .text
  946. 03902 .define .ior
  947. 03903
  948. 03904         ! #bytes in ecx
  949. 03905 .ior:
  950. 03906         pop     ebx             ! return address
  951. 03907         mov     edx,edi
  952. 03908         mov     edi,esp
  953. 03909         add     edi,ecx
  954. 03910         sar     ecx,2
  955. 03911 1:
  956. 03912         pop     eax
  957. 03913         or      eax,(edi)
  958. 03914         stos
  959. 03915         loop    1b
  960. 03916         mov     edi,edx
  961. 03917         jmp     ebx
  962. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  963. src/lib/i386/em/em_isar.s    
  964. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  965. 04000 .sect .text; .sect .rom; .sect .data; .sect .bss
  966. 04001 .sect .text
  967. 04002 .define .isar
  968. 04003
  969. 04004 .isar:
  970. 04005         pop     ecx
  971. 04006         pop     eax
  972. 04007         cmp     eax,4
  973. 04008 .extern .unknown
  974. 04009         jne     .unknown
  975. 04010         pop     ebx      ! descriptor address
  976. 04011         pop     eax      ! index
  977. 04012         push    ecx
  978. 04013 .extern .sar4
  979. 04014         jmp    .sar4
  980. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  981. src/lib/i386/em/em_lar4.s    
  982. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  983. 04100 .sect .text; .sect .rom; .sect .data; .sect .bss
  984. 04101 .sect .text
  985. 04102 .define .lar4
  986. 04103
  987. 04104 .lar4:
  988. 04105                                 ! ebx, descriptor address
  989. 04106                                 ! eax, index
  990. 04107         sub     eax,(ebx)
  991. 04108         mov     ecx,8(ebx)
  992. 04109         imul    ecx
  993. 04110         pop     ebx
  994. 04111         pop     edx             ! base address
  995. 04112         add     edx,eax
  996. 04113         sar     ecx,1
  997. 04114         jnb     1f
  998. 04115         xor     eax,eax
  999. 04116         movb    al,(edx)
  1000. 04117         push    eax
  1001. 04118         jmp     ebx
  1002. 04119 1:
  1003. 04120         sar     ecx,1
  1004. 04121         jnb     1f
  1005. 04122         xor     eax,eax
  1006. 04123         o16 mov ax,(edx)
  1007. 04124         push    eax
  1008. 04125         jmp     ebx
  1009. 04126 1:
  1010. 04127         xchg    edx,esi         ! saved esi
  1011. 04128         mov     eax,ecx
  1012. 04129         sal     eax,2
  1013. 04130         sub     esp,eax
  1014. 04131         mov     eax,edi         ! save edi
  1015. 04132         mov     edi,esp
  1016. 04133         rep movs
  1017. 04134         mov     edi,eax
  1018. 04135         mov     esi,edx
  1019. 04136         jmp     ebx
  1020. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1021. src/lib/i386/em/em_loi.s    
  1022. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1023. 04200 .sect .text; .sect .rom; .sect .data; .sect .bss
  1024. 04201 .sect .text
  1025. 04202 .define .loi
  1026. 04203 .define .los
  1027. 04204
  1028. 04205         ! #bytes in ecx
  1029. 04206         ! address in ebx
  1030. 04207         ! save esi/edi. they might be register variables
  1031. 04208 .los:
  1032. 04209         pop     edx
  1033. 04210         mov     eax,ecx
  1034. 04211         sar     ecx,1
  1035. 04212         jnb     1f
  1036. 04213         movsxb  eax,(ebx)
  1037. 04214         push    eax
  1038. 04215         jmp     edx
  1039. 04216 1:
  1040. 04217         sar     ecx,1
  1041. 04218         jnb     1f
  1042. 04219         movsx   eax,(ebx)
  1043. 04220         push    eax
  1044. 04221         jmp     edx
  1045. 04222 1:
  1046. 04223         push    edx
  1047. 04224         mov     edx,esi
  1048. 04225         mov     esi,ebx
  1049. 04226         pop     ebx
  1050. 04227         sub     esp,eax
  1051. 04228         jmp     1f
  1052. 04229
  1053. 04230 .loi:
  1054. 04231         ! only called with size >= 4
  1055. 04232         mov     edx,esi
  1056. 04233         mov     esi,ebx
  1057. 04234         pop     ebx
  1058. 04235         sub     esp,ecx
  1059. 04236         sar     ecx,2
  1060. 04237 1:
  1061. 04238         mov     eax,edi
  1062. 04239         mov     edi,esp
  1063. 04240         rep movs
  1064. 04241         mov     esi,edx
  1065. 04242         mov     edi,eax
  1066. 04243         jmp     ebx
  1067. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1068. src/lib/i386/em/em_mlf4.s    
  1069. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1070. 04300 .sect .text; .sect .rom; .sect .data; .sect .bss
  1071. 04301 .define .mlf4
  1072. 04302
  1073. 04303         .sect .text
  1074. 04304 .mlf4:
  1075. 04305         mov     bx,sp
  1076. 04306         flds    4(bx)
  1077. 04307         fmuls   8(bx)
  1078. 04308         fstps   8(bx)
  1079. 04309         wait
  1080. 04310         ret
  1081. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1082. src/lib/i386/em/em_mlf8.s    
  1083. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1084. 04400 .sect .text; .sect .rom; .sect .data; .sect .bss
  1085. 04401 .define .mlf8
  1086. 04402
  1087. 04403         .sect .text
  1088. 04404 .mlf8:
  1089. 04405         mov     bx,sp
  1090. 04406         fldd    4(bx)
  1091. 04407         fmuld   12(bx)
  1092. 04408         fstpd   12(bx)
  1093. 04409         wait
  1094. 04410         ret
  1095. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1096. src/lib/i386/em/em_mli.s    
  1097. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1098. 04500 .sect .text; .sect .rom; .sect .data; .sect .bss
  1099. 04501 .sect .text
  1100. 04502 .define .mli
  1101. 04503
  1102. 04504         ! #bytes in eax
  1103. 04505 .mli:
  1104. 04506         pop     ebx              ! return address
  1105. 04507         cmp     eax,4
  1106. 04508         jne     1f
  1107. 04509         pop     eax
  1108. 04510         pop     ecx
  1109. 04511         mul     ecx
  1110. 04512         push    eax
  1111. 04513         jmp     ebx
  1112. 04514 1:
  1113. 04515 .extern EODDZ
  1114. 04516 .extern .trp
  1115. 04517         mov     eax,EODDZ
  1116. 04518         push    ebx
  1117. 04519         jmp     .trp
  1118. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1119. src/lib/i386/em/em_mon.s    
  1120. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1121. 04600 .sect .text; .sect .rom; .sect .data; .sect .bss
  1122. 04601 .sect .text
  1123. 04602 .define .mon
  1124. 04603
  1125. 04604 .mon:
  1126. 04605 .extern .stop
  1127. 04606         call    .stop
  1128. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1129. src/lib/i386/em/em_ngf4.s    
  1130. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1131. 04700 .sect .text; .sect .rom; .sect .data; .sect .bss
  1132. 04701 .define .ngf4
  1133. 04702
  1134. 04703         .sect .text
  1135. 04704 .ngf4:
  1136. 04705         mov     bx,sp
  1137. 04706         flds    4(bx)
  1138. 04707         fchs
  1139. 04708         fstps   4(bx)
  1140. 04709         wait
  1141. 04710         ret
  1142. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1143. src/lib/i386/em/em_ngf8.s    
  1144. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1145. 04800 .sect .text; .sect .rom; .sect .data; .sect .bss
  1146. 04801 .define .ngf8
  1147. 04802
  1148. 04803         .sect .text
  1149. 04804 .ngf8:
  1150. 04805         mov     bx,sp
  1151. 04806         fldd    4(bx)
  1152. 04807         fchs
  1153. 04808         fstpd   4(bx)
  1154. 04809         wait
  1155. 04810         ret
  1156. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1157. src/lib/i386/em/em_ngi.s    
  1158. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1159. 04900 .sect .text; .sect .rom; .sect .data; .sect .bss
  1160. 04901 .sect .text
  1161. 04902 .define .ngi
  1162. 04903
  1163. 04904         ! #bytes in eax
  1164. 04905 .ngi:
  1165. 04906         pop     ebx              ! return address
  1166. 04907         cmp     eax,4
  1167. 04908         jne     1f
  1168. 04909         pop     ecx
  1169. 04910         neg     ecx
  1170. 04911         push    ecx
  1171. 04912         jmp     ebx
  1172. 04913 1:
  1173. 04914 .extern EODDZ
  1174. 04915 .extern .trp
  1175. 04916         mov     eax,EODDZ
  1176. 04917         push    ebx
  1177. 04918         jmp     .trp
  1178. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1179. src/lib/i386/em/em_nop.s    
  1180. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1181. 05000 .sect .text; .sect .rom; .sect .data; .sect .bss
  1182. 05001 .sect .text
  1183. 05002 .define .nop
  1184. 05003 .extern printd, printc, hol0
  1185. 05004
  1186. 05005 .nop:
  1187. 05006         mov     eax,(hol0)
  1188. 05007         call    printd
  1189. 05008         movb    al,'n'
  1190. 05009         jmp     printc
  1191. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1192. src/lib/i386/em/em_print.s    
  1193. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1194. 05100 .sect .text; .sect .rom; .sect .data; .sect .bss
  1195. 05101 .sect .text
  1196. 05102 .define printc,printd,prints
  1197. 05103
  1198. 05104         ! argument in eax
  1199. 05105         ! uses ebx
  1200. 05106 prints:
  1201. 05107         xchg    eax,ebx
  1202. 05108 1:
  1203. 05109         movb    al,(ebx)
  1204. 05110         inc     ebx
  1205. 05111         testb   al,al
  1206. 05112         jz      2f
  1207. 05113         call    printc
  1208. 05114         jmp     1b
  1209. 05115 2:
  1210. 05116         ret
  1211. 05117
  1212. 05118         ! argument in eax
  1213. 05119         ! uses ecx and edx
  1214. 05120 printd:
  1215. 05121         xor     edx,edx
  1216. 05122         mov     ecx,10
  1217. 05123         div     ecx
  1218. 05124         test    eax,eax
  1219. 05125         jz      1f
  1220. 05126         push    edx
  1221. 05127         call    printd
  1222. 05128         pop     edx
  1223. 05129 1:
  1224. 05130         xchg    eax,edx
  1225. 05131         addb    al,'0'
  1226. 05132
  1227. 05133         ! argument in eax
  1228. 05134 printc:
  1229. 05135         push    eax
  1230. 05136         mov     ebx,esp
  1231. 05137         mov     eax,1
  1232. 05138         push    eax
  1233. 05139         push    ebx
  1234. 05140         push    eax
  1235. 05141         call    __write
  1236. 05142         pop     ebx
  1237. 05143         pop     ebx
  1238. 05144         pop     ebx
  1239. 05145         pop     ebx
  1240. 05146         ret
  1241. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1242. src/lib/i386/em/em_rck.s    
  1243. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1244. 05200 .sect .text; .sect .rom; .sect .data; .sect .bss
  1245. 05201 .sect .text
  1246. 05202 .define .rck
  1247. 05203
  1248. 05204         ! descriptor address in ebx
  1249. 05205         ! value in eax, must be left there
  1250. 05206 .rck:
  1251. 05207         cmp     eax,(ebx)
  1252. 05208         jl      2f
  1253. 05209         cmp     eax,4(ebx)
  1254. 05210         jg      2f
  1255. 05211         ret
  1256. 05212 2:
  1257. 05213         push    eax
  1258. 05214 .extern ERANGE
  1259. 05215 .extern .error
  1260. 05216         mov     eax,ERANGE
  1261. 05217         call    .error
  1262. 05218         pop     eax
  1263. 05219         ret
  1264. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1265. src/lib/i386/em/em_rmi.s    
  1266. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1267. 05300 .sect .text; .sect .rom; .sect .data; .sect .bss
  1268. 05301 .sect .text
  1269. 05302 .define .rmi
  1270. 05303
  1271. 05304         ! #bytes in eax
  1272. 05305 .rmi:
  1273. 05306         pop     ebx              ! return address
  1274. 05307         cmp     eax,4
  1275. 05308         jne     1f
  1276. 05309         pop     eax
  1277. 05310         cwd
  1278. 05311         pop     ecx
  1279. 05312         idiv    ecx
  1280. 05313         push    edx
  1281. 05314         jmp     ebx
  1282. 05315 1:
  1283. 05316 .extern EODDZ
  1284. 05317 .extern .trp
  1285. 05318         mov     eax,EODDZ
  1286. 05319         push    ebx
  1287. 05320         jmp     .trp
  1288. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1289. src/lib/i386/em/em_rmu.s    
  1290. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1291. 05400 .sect .text; .sect .rom; .sect .data; .sect .bss
  1292. 05401 .sect .text
  1293. 05402 .define .rmu
  1294. 05403
  1295. 05404         ! #bytes in eax
  1296. 05405 .rmu:
  1297. 05406         pop     ebx              ! return address
  1298. 05407         cmp     eax,4
  1299. 05408         jne     1f
  1300. 05409         pop     eax
  1301. 05410         xor     edx,edx
  1302. 05411         pop     ecx
  1303. 05412         idiv    ecx
  1304. 05413         push    edx
  1305. 05414         jmp     ebx
  1306. 05415 1:
  1307. 05416 .extern EODDZ
  1308. 05417 .extern .trp
  1309. 05418         mov     eax,EODDZ
  1310. 05419         push    ebx
  1311. 05420         jmp     .trp
  1312. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1313. src/lib/i386/em/em_rol.s    
  1314. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1315. 05500 .sect .text; .sect .rom; .sect .data; .sect .bss
  1316. 05501 .sect .text
  1317. 05502 .define .rol
  1318. 05503
  1319. 05504         ! #bytes in eax
  1320. 05505 .rol:
  1321. 05506         pop     edx              ! return address
  1322. 05507         cmp     eax,4
  1323. 05508         jne     1f
  1324. 05509         pop     eax
  1325. 05510         pop     ecx
  1326. 05511         rol     eax,cl
  1327. 05512         push    eax
  1328. 05513         jmp     edx
  1329. 05514 1:
  1330. 05515 .extern EODDZ
  1331. 05516 .extern .trp
  1332. 05517         mov     eax,EODDZ
  1333. 05518         push    edx
  1334. 05519         jmp     .trp
  1335. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1336. src/lib/i386/em/em_ror.s    
  1337. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1338. 05600 .sect .text; .sect .rom; .sect .data; .sect .bss
  1339. 05601 .sect .text
  1340. 05602 .define .ror
  1341. 05603
  1342. 05604         ! #bytes in eax
  1343. 05605 .ror:
  1344. 05606         pop     edx              ! return address
  1345. 05607         cmp     eax,4
  1346. 05608         jne     1f
  1347. 05609         pop     eax
  1348. 05610         pop     ecx
  1349. 05611         ror     eax,cl
  1350. 05612         push    eax
  1351. 05613         jmp     edx
  1352. 05614 1:
  1353. 05615 .extern EODDZ
  1354. 05616 .extern .trp
  1355. 05617         mov     eax,EODDZ
  1356. 05618         push    edx
  1357. 05619         jmp     .trp
  1358. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1359. src/lib/i386/em/em_sar4.s    
  1360. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1361. 05700 .sect .text; .sect .rom; .sect .data; .sect .bss
  1362. 05701 .sect .text
  1363. 05702 .define .sar4
  1364. 05703
  1365. 05704 .sar4:
  1366. 05705                                 ! ebx, descriptor address
  1367. 05706                                 ! eax, index
  1368. 05707         sub     eax,(ebx)
  1369. 05708         mov     ecx,8(ebx)
  1370. 05709         imul    ecx
  1371. 05710         pop     ebx
  1372. 05711         pop     edx             ! base address
  1373. 05712         add     edx,eax
  1374. 05713         sar     ecx,1
  1375. 05714         jnb     1f
  1376. 05715         pop     eax
  1377. 05716         movb    (edx),al
  1378. 05717         jmp     ebx
  1379. 05718 1:
  1380. 05719         sar     ecx,1
  1381. 05720         jnb     1f
  1382. 05721         pop     eax
  1383. 05722         o16 mov (edx),ax
  1384. 05723         jmp     ebx
  1385. 05724 1:
  1386. 05725         xchg    edi,edx         ! edi = base address, edx is saved edi
  1387. 05726         mov     eax,esi
  1388. 05727         mov     esi,esp
  1389. 05728         rep movs
  1390. 05729         mov     esp,esi
  1391. 05730         mov     esi,eax
  1392. 05731         mov     edi,edx
  1393. 05732         jmp     ebx
  1394. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1395. src/lib/i386/em/em_sbf4.s    
  1396. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1397. 05800 .sect .text; .sect .rom; .sect .data; .sect .bss
  1398. 05801 .define .sbf4
  1399. 05802
  1400. 05803         .sect .text
  1401. 05804 .sbf4:
  1402. 05805         mov     bx,sp
  1403. 05806         flds    8(bx)
  1404. 05807         fsubs   4(bx)
  1405. 05808         fstps   8(bx)
  1406. 05809         wait
  1407. 05810         ret
  1408. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1409. src/lib/i386/em/em_sbf8.s    
  1410. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1411. 05900 .sect .text; .sect .rom; .sect .data; .sect .bss
  1412. 05901 .define .sbf8
  1413. 05902
  1414. 05903         .sect .text
  1415. 05904 .sbf8:
  1416. 05905         mov     bx,sp
  1417. 05906         fldd    12(bx)
  1418. 05907         fsubd   4(bx)
  1419. 05908         fstpd   12(bx)
  1420. 05909         wait
  1421. 05910         ret
  1422. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1423. src/lib/i386/em/em_sbi.s    
  1424. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1425. 06000 .sect .text; .sect .rom; .sect .data; .sect .bss
  1426. 06001 .sect .text
  1427. 06002 .define .sbi
  1428. 06003
  1429. 06004         ! #bytes in ecx , top of stack in eax
  1430. 06005 .sbi:
  1431. 06006         pop     ebx              ! return subress
  1432. 06007         cmp     ecx,4
  1433. 06008         jne     1f
  1434. 06009         pop     ecx
  1435. 06010         sub     eax,ecx
  1436. 06011         neg     eax
  1437. 06012         jmp     ebx
  1438. 06013 1:
  1439. 06014 .extern EODDZ
  1440. 06015 .extern .trp
  1441. 06016         mov     eax,EODDZ
  1442. 06017         push    ebx
  1443. 06018         jmp     .trp
  1444. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1445. src/lib/i386/em/em_set.s    
  1446. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1447. 06100 .sect .text; .sect .rom; .sect .data; .sect .bss
  1448. 06101 .sect .text
  1449. 06102 .define .set
  1450. 06103
  1451. 06104         ! #bytes in ecx
  1452. 06105         ! bit # in eax
  1453. 06106 .set:
  1454. 06107         pop     ebx              ! return address
  1455. 06108         xor     edx,edx
  1456. 06109 !ifdef create set
  1457. 06110         sub     esp,ecx
  1458. 06111         push    ebx
  1459. 06112         push    edi
  1460. 06113         mov     ebx,esp
  1461. 06114         xor     edi,edi
  1462. 06115         sar     ecx,2
  1463. 06116 1:
  1464. 06117         mov     8(ebx)(edi),edx
  1465. 06118         add     edi,4
  1466. 06119         loop    1b
  1467. 06120 !endif
  1468. 06121         mov     ebx,8
  1469. 06122         div     ebx
  1470. 06123         cmp     eax,edi
  1471. 06124         jae     2f
  1472. 06125         mov     edi,edx
  1473. 06126         movb    dl,bits(edi)
  1474. 06127         mov     edi,esp
  1475. 06128         add     edi,eax
  1476. 06129         orb     8(edi),dl
  1477. 06130         pop     edi
  1478. 06131         ret
  1479. 06132 2:
  1480. 06133 .extern ESET
  1481. 06134 .extern .trp
  1482. 06135         pop     edi
  1483. 06136         mov     eax,ESET
  1484. 06137         jmp     .trp
  1485. 06138
  1486. 06139         .sect .rom
  1487. 06140 bits:
  1488. 06141         .data1   1,2,4,8,16,32,64,128
  1489. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1490. src/lib/i386/em/em_sli.s    
  1491. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1492. 06200 .sect .text; .sect .rom; .sect .data; .sect .bss
  1493. 06201 .sect .text
  1494. 06202 .define .sli
  1495. 06203
  1496. 06204         ! #bytes in eax
  1497. 06205 .sli:
  1498. 06206         pop     edx              ! return address
  1499. 06207         cmp     eax,4
  1500. 06208         jne     1f
  1501. 06209         pop     eax
  1502. 06210         pop     ecx
  1503. 06211         sal     eax,cl
  1504. 06212         push    eax
  1505. 06213         jmp     edx
  1506. 06214 1:
  1507. 06215 .extern EODDZ
  1508. 06216 .extern .trp
  1509. 06217         mov     eax,EODDZ
  1510. 06218         push    edx
  1511. 06219         jmp     .trp
  1512. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1513. src/lib/i386/em/em_sri.s    
  1514. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1515. 06300 .sect .text; .sect .rom; .sect .data; .sect .bss
  1516. 06301 .sect .text
  1517. 06302 .define .sri
  1518. 06303
  1519. 06304         ! #bytes in eax
  1520. 06305 .sri:
  1521. 06306         pop     edx              ! return address
  1522. 06307         cmp     eax,4
  1523. 06308         jne     1f
  1524. 06309         pop     eax
  1525. 06310         pop     ecx
  1526. 06311         sar     eax,cl
  1527. 06312         push    eax
  1528. 06313         jmp     edx
  1529. 06314 1:
  1530. 06315 .extern EODDZ
  1531. 06316 .extern .trp
  1532. 06317         mov     eax,EODDZ
  1533. 06318         push    edx
  1534. 06319         jmp     .trp
  1535. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1536. src/lib/i386/em/em_sti.s    
  1537. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1538. 06400 .sect .text; .sect .rom; .sect .data; .sect .bss
  1539. 06401 .sect .text
  1540. 06402 .define .sti
  1541. 06403 .define .sts
  1542. 06404
  1543. 06405         ! #bytes in ecx
  1544. 06406         ! address in ebx
  1545. 06407         ! save edi/esi. they might be register variables
  1546. 06408 .sts:
  1547. 06409         pop     edx
  1548. 06410         sar     ecx,1
  1549. 06411         jnb     1f
  1550. 06412         pop     eax
  1551. 06413         movb    (ebx),al
  1552. 06414         jmp     edx
  1553. 06415 1:
  1554. 06416         sar     ecx,1
  1555. 06417         jnb     1f
  1556. 06418         pop     eax
  1557. 06419         o16 mov (ebx),ax
  1558. 06420         jmp     edx
  1559. 06421 1:
  1560. 06422         push    edx
  1561. 06423         mov     edx,edi
  1562. 06424         mov     edi,ebx
  1563. 06425         pop     ebx
  1564. 06426         jmp     1f
  1565. 06427 .sti:
  1566. 06428         ! only called with count >> 4
  1567. 06429         mov     edx,edi
  1568. 06430         mov     edi,ebx
  1569. 06431         pop     ebx
  1570. 06432         sar     ecx,2
  1571. 06433 1:
  1572. 06434         mov     eax,esi
  1573. 06435         mov     esi,esp
  1574. 06436         rep movs
  1575. 06437         mov     esp,esi
  1576. 06438         mov     edi,edx
  1577. 06439         mov     esi,eax
  1578. 06440         jmp     ebx
  1579. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1580. src/lib/i386/em/em_stop.s    
  1581. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1582. 06500 .sect .text; .sect .rom; .sect .data; .sect .bss
  1583. 06501 .sect .text
  1584. 06502 .define .stop
  1585. 06503 .stop:
  1586. 06504         jmp     ___exit
  1587. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1588. src/lib/i386/em/em_strhp.s    
  1589. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1590. 06600 .sect .text; .sect .rom; .sect .data; .sect .bss
  1591. 06601 .sect .text
  1592. 06602 .define .strhp
  1593. 06603 .extern .reghp, .limhp, EHEAP, .trp
  1594. 06604
  1595. 06605 .strhp:
  1596. 06606         pop     ebx
  1597. 06607         pop     eax
  1598. 06608         mov     (.reghp),eax
  1599. 06609         cmp     eax,(.limhp)
  1600. 06610         jb      1f
  1601. 06611         add     eax,02000
  1602. 06612         and     eax,~0777
  1603. 06613         push    ebx
  1604. 06614         push    eax
  1605. 06615         call    __brk
  1606. 06616         pop     ecx
  1607. 06617         pop     ebx
  1608. 06618         cmp     eax,-1
  1609. 06619         je      2f
  1610. 06620 1:
  1611. 06621         mov     (.limhp),ecx
  1612. 06622         jmp     ebx
  1613. 06623 2:
  1614. 06624         mov     eax,EHEAP
  1615. 06625         push    ebx
  1616. 06626         jmp     .trp
  1617. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1618. src/lib/i386/em/em_trp.s    
  1619. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1620. 06700 .sect .text; .sect .rom; .sect .data; .sect .bss
  1621. 06701 .sect .text
  1622. 06702 .define .trp
  1623. 06703 .extern .trppc, .stop
  1624. 06704
  1625. 06705                 ! eax is trap number
  1626. 06706 .trp:
  1627. 06707         xor     ebx,ebx
  1628. 06708         xchg    ebx,(.trppc)
  1629. 06709         test    ebx,ebx
  1630. 06710         jz      2f
  1631. 06711         push    eax
  1632. 06712         call    ebx
  1633. 06713         pop     eax
  1634. 06714         ret
  1635. 06715 2:
  1636. 06716         push    eax
  1637. 06717         call    .stop
  1638. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1639. src/lib/i386/em/em_unknown.s    
  1640. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1641. 06800 .sect .text; .sect .rom; .sect .data; .sect .bss
  1642. 06801 .sect .text
  1643. 06802 .define .unknown
  1644. 06803 .extern EILLINS, .fat
  1645. 06804
  1646. 06805 .unknown:
  1647. 06806         mov  eax,EILLINS
  1648. 06807         push eax
  1649. 06808         jmp  .fat
  1650. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1651. src/lib/i386/em/em_xor.s    
  1652. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1653. 06900 .sect .text; .sect .rom; .sect .data; .sect .bss
  1654. 06901 .sect .text
  1655. 06902 .define .xor
  1656. 06903
  1657. 06904         ! #bytes in ecx
  1658. 06905 .xor:
  1659. 06906         pop     ebx             ! return address
  1660. 06907         mov     edx,edi
  1661. 06908         mov     edi,esp
  1662. 06909         add     edi,ecx
  1663. 06910         sar     ecx,2
  1664. 06911 1:
  1665. 06912         pop     eax
  1666. 06913         xor     eax,(edi)
  1667. 06914         stos
  1668. 06915         loop    1b
  1669. 06916         mov     edi,edx
  1670. 06917         jmp     ebx
  1671. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1672. src/lib/i386/head/em_abs.h    
  1673. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1674. 07000 /* $Header: em_abs.h,v 1.3 87/03/10 08:58:45 ceriel Exp $ */
  1675. 07001 /*
  1676. 07002  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  1677. 07003  * See the copyright notice in the ACK home directory, in the file "Copyright".
  1678. 07004  */
  1679. 07005 #define LINO_AD         0
  1680. 07006 #define FILN_AD         4
  1681. 07007
  1682. 07008 #define LINO            (*(int    *)(_hol0()+LINO_AD))
  1683. 07009 #define FILN            (*(char  **)(_hol0()+FILN_AD))
  1684. 07010
  1685. 07011 #define EARRAY          0
  1686. 07012 #define ERANGE          1
  1687. 07013 #define ESET            2
  1688. 07014 #define EIOVFL          3
  1689. 07015 #define EFOVFL          4
  1690. 07016 #define EFUNFL          5
  1691. 07017 #define EIDIVZ          6
  1692. 07018 #define EFDIVZ          7
  1693. 07019 #define EIUND           8
  1694. 07020 #define EFUND           9
  1695. 07021 #define ECONV           10
  1696. 07022
  1697. 07023 #define ESTACK          16
  1698. 07024 #define EHEAP           17
  1699. 07025 #define EILLINS         18
  1700. 07026 #define EODDZ           19
  1701. 07027 #define ECASE           20
  1702. 07028 #define EMEMFLT         21
  1703. 07029 #define EBADPTR         22
  1704. 07030 #define EBADPC          23
  1705. 07031 #define EBADLAE         24
  1706. 07032 #define EBADMON         25
  1707. 07033 #define EBADLIN         26
  1708. 07034 #define EBADGTO         27
  1709. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1710. src/lib/i386/head/em_head.s    
  1711. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1712. 07100 #
  1713. 07101 .sect .text; .sect .rom; .sect .data; .sect .bss
  1714. 07102 .define ERANGE,ESET,EHEAP,ECASE,EILLINS,EIDIVZ,EODDZ
  1715. 07103 .define .trppc, .ignmask
  1716. 07104
  1717. 07105 ERANGE          = 1
  1718. 07106 ESET            = 2
  1719. 07107 EIDIVZ          = 6
  1720. 07108 EHEAP           = 17
  1721. 07109 EILLINS         = 18
  1722. 07110 EODDZ           = 19
  1723. 07111 ECASE           = 20
  1724. 07112
  1725. 07113 #include <em_abs.h>
  1726. 07114
  1727. 07115 .sect .data
  1728. 07116 .trppc:
  1729. 07117         .data4  0
  1730. 07118 .ignmask:
  1731. 07119         .data4  EIOVFL | EIUND | ECONV | EFOVFL | EFUNFL
  1732. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1733. src/lib/i386/misc/alloca.s    
  1734. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1735. 07200 #
  1736. 07201 !       alloca() - allocate space on the stack          Author: Kees J. Bot
  1737. 07202 !                                                               2 Dec 1993
  1738. 07203 .sect .text; .sect .rom; .sect .data; .sect .bss
  1739. 07204
  1740. 07205 .sect .text
  1741. 07206         .align  16
  1742. 07207 .define _alloca
  1743. 07208 _alloca:
  1744. 07209 #if __ACK__
  1745. 07210         pop     ecx             ! Return address
  1746. 07211         pop     eax             ! Bytes to allocate
  1747. 07212         add     eax, 2*4+3      ! Add space for two saved register variables
  1748. 07213         andb    al, 0xFC        ! Align
  1749. 07214         mov     ebx, esp        ! Keep current esp
  1750. 07215         sub     esp, eax        ! Lower stack
  1751. 07216         mov     eax, esp        ! Return value
  1752. 07217         push    4(ebx)          ! Push what is probably the saved esi
  1753. 07218         push    (ebx)           ! Saved edi
  1754. 07219                                 ! Now ACK can still do:
  1755. 07220                                 !       pop edi; pop esi; leave; ret
  1756. 07221         push    eax             ! Dummy argument
  1757. 07222         jmp     ecx
  1758. 07223 #else
  1759. 07224         pop     ecx             ! Return address
  1760. 07225         pop     eax             ! Bytes to allocate
  1761. 07226         add     eax, 3
  1762. 07227         andb    al, 0xFC        ! Align
  1763. 07228         sub     esp, eax        ! Lower stack
  1764. 07229         mov     eax, esp        ! Return value
  1765. 07230         push    eax             ! Dummy argument
  1766. 07231         jmp     ecx
  1767. 07232 #endif
  1768. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1769. src/lib/i386/misc/getprocessor.s    
  1770. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1771. 07300 !       getprocessor() - determine processor type       Author: Kees J. Bot
  1772. 07301 !                                                               26 Jan 1994
  1773. 07302
  1774. 07303 .sect .text; .sect .rom; .sect .data; .sect .bss
  1775. 07304 .sect .text
  1776. 07305
  1777. 07306 ! int getprocessor(void);
  1778. 07307 !       Return 386, 486, 586, ...
  1779. 07308
  1780. 07309 .define _getprocessor
  1781. 07310
  1782. 07311 _getprocessor:
  1783. 07312         push    ebp
  1784. 07313         mov     ebp, esp
  1785. 07314         and     esp, 0xFFFFFFFC ! Align stack to avoid AC fault
  1786. 07315         mov     ecx, 0x00040000 ! Try to flip the AC bit introduced on the 486
  1787. 07316         call    flip
  1788. 07317         mov     eax, 386        ! 386 if it didn't react to "flipping"
  1789. 07318         jz      gotprocessor
  1790. 07319         mov     ecx, 0x00200000 ! Try to flip the ID bit introduced on the 586
  1791. 07320         call    flip
  1792. 07321         mov     eax, 486        ! 486 if it didn't react
  1793. 07322         jz      gotprocessor
  1794. 07323         pushf
  1795. 07324         pusha                   ! Save the world
  1796. 07325         mov     eax, 1
  1797. 07326         .data1  0x0F, 0xA2      ! CPUID instruction tells the processor type
  1798. 07327         andb    ah, 0x0F        ! Extract the family (5, 6, ...)
  1799. 07328         movzxb  eax, ah
  1800. 07329         imul    eax, 100        ! 500, 600, ...
  1801. 07330         add     eax, 86         ! 586, 686, ...
  1802. 07331         mov     7*4(esp), eax   ! Pass eax through
  1803. 07332         popa
  1804. 07333         popf
  1805. 07334 gotprocessor:
  1806. 07335         leave
  1807. 07336         ret
  1808. 07337
  1809. 07338 flip:
  1810. 07339         pushf                   ! Push eflags
  1811. 07340         pop     eax             ! eax = eflags
  1812. 07341         mov     edx, eax        ! Save original eflags
  1813. 07342         xor     eax, ecx        ! Flip the bit to test
  1814. 07343         push    eax             ! Push modified eflags value
  1815. 07344         popf                    ! Load modified eflags register
  1816. 07345         pushf
  1817. 07346         pop     eax             ! Get it again
  1818. 07347         push    edx
  1819. 07348         popf                    ! Restore original eflags register
  1820. 07349         xor     eax, edx        ! See if the bit changed
  1821. 07350         test    eax, ecx
  1822. 07351         ret
  1823. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1824. src/lib/i386/misc/iolib.s    
  1825. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1826. 07400 ! Some I/O related routines like:
  1827. 07401 !       unsigned char inb(int port);
  1828. 07402 !       unsigned short inw(int port);
  1829. 07403 !       void outb(int port, int value);
  1830. 07404 !       void outw(int port, int value);
  1831. 07405 !       void rep_inb(int port, unsigned char *buf, size_t count);
  1832. 07406 !       void rep_inw(int port, unsigned short *buf, size_t count);
  1833. 07407 !       void rep_outb(int port, unsigned char *buf, size_t count);
  1834. 07408 !       void rep_outw(int port, unsigned short *buf, size_t count);
  1835. 07409 !       void intr_enable(void);
  1836. 07410 !       void intr_disable(void);
  1837. 07411
  1838. 07412 .sect .text; .sect .rom; .sect .data; .sect .bss
  1839. 07413
  1840. 07414 .sect .text
  1841. 07415 .define _inb
  1842. 07416 _inb:
  1843. 07417         push    ebp
  1844. 07418         mov     ebp, esp
  1845. 07419         mov     edx, 8(ebp)             ! port
  1846. 07420         xor     eax, eax
  1847. 07421         inb     dx                      ! read 1 byte
  1848. 07422         pop     ebp
  1849. 07423         ret
  1850. 07424
  1851. 07425 .define _inw
  1852. 07426 _inw:
  1853. 07427         push    ebp
  1854. 07428         mov     ebp, esp
  1855. 07429         mov     edx, 8(ebp)             ! port
  1856. 07430         xor     eax, eax
  1857. 07431     o16 in      dx                      ! read 1 word
  1858. 07432         pop     ebp
  1859. 07433         ret
  1860. 07434
  1861. 07435 .define _outb
  1862. 07436 _outb:
  1863. 07437         push    ebp
  1864. 07438         mov     ebp, esp
  1865. 07439         mov     edx, 8(ebp)             ! port
  1866. 07440         mov     eax, 8+4(ebp)           ! value
  1867. 07441         outb    dx                      ! output 1 byte
  1868. 07442         pop     ebp
  1869. 07443         ret
  1870. 07444
  1871. 07445 .define _outw
  1872. 07446 _outw:
  1873. 07447         push    ebp
  1874. 07448         mov     ebp, esp
  1875. 07449         mov     edx, 8(ebp)             ! port
  1876. 07450         mov     eax, 8+4(ebp)           ! value
  1877. 07451     o16 out     dx                      ! output 1 word
  1878. 07452         pop     ebp
  1879. 07453         ret
  1880. 07454
  1881. 07455 .define _rep_inb
  1882. 07456 _rep_inb:
  1883. 07457         push    ebp
  1884. 07458         mov     ebp, esp
  1885. 07459         push    edi
  1886. 07460         mov     edx, 8(ebp)             ! port
  1887. 07461         mov     edi, 12(ebp)            ! buf
  1888. 07462         mov     ecx, 16(ebp)            ! byte count
  1889. 07463         rep
  1890. 07464         inb     dx                      ! input many bytes
  1891. 07465         pop     edi
  1892. 07466         pop     ebp
  1893. 07467         ret
  1894. 07468
  1895. 07469 .define _rep_inw
  1896. 07470 _rep_inw:
  1897. 07471         push    ebp
  1898. 07472         mov     ebp, esp
  1899. 07473         push    edi
  1900. 07474         mov     edx, 8(ebp)             ! port
  1901. 07475         mov     edi, 12(ebp)            ! buf
  1902. 07476         mov     ecx, 16(ebp)            ! byte count
  1903. 07477         shr     ecx, 1                  ! word count
  1904. 07478         rep
  1905. 07479     o16 in      dx                      ! input many words
  1906. 07480         pop     edi
  1907. 07481         pop     ebp
  1908. 07482         ret
  1909. 07483
  1910. 07484 .define _rep_outb
  1911. 07485 _rep_outb:
  1912. 07486         push    ebp
  1913. 07487         mov     ebp, esp
  1914. 07488         push    esi
  1915. 07489         mov     edx, 8(ebp)             ! port
  1916. 07490         mov     esi, 12(ebp)            ! buf
  1917. 07491         mov     ecx, 16(ebp)            ! byte count
  1918. 07492         rep
  1919. 07493         outb    dx                      ! output many bytes
  1920. 07494         pop     esi
  1921. 07495         pop     ebp
  1922. 07496         ret
  1923. 07497
  1924. 07498 .define _rep_outw
  1925. 07499 _rep_outw:
  1926. 07500         push    ebp
  1927. 07501         mov     ebp, esp
  1928. 07502         push    esi
  1929. 07503         mov     edx, 8(ebp)             ! port
  1930. 07504         mov     esi, 12(ebp)            ! buf
  1931. 07505         mov     ecx, 16(ebp)            ! byte count
  1932. 07506         shr     ecx, 1                  ! word count
  1933. 07507         rep
  1934. 07508     o16 out     dx                      ! output many words
  1935. 07509         pop     esi
  1936. 07510         pop     ebp
  1937. 07511         ret
  1938. 07512
  1939. 07513 .define _intr_disable
  1940. 07514 _intr_disable:
  1941. 07515         push    ebp
  1942. 07516         mov     ebp, esp
  1943. 07517         cli
  1944. 07518         pop     ebp
  1945. 07519         ret
  1946. 07520
  1947. 07521 .define _intr_enable
  1948. 07522 _intr_enable:
  1949. 07523         push    ebp
  1950. 07524         mov     ebp, esp
  1951. 07525         sti
  1952. 07526         pop     ebp
  1953. 07527         ret
  1954. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1955. src/lib/i386/rts/__sigreturn.s    
  1956. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1957. 07600 ! This routine is the low-level code for returning from signals.  
  1958. 07601 ! It calls __sigreturn, which is the normal "system call" routine.
  1959. 07602 ! Both ___sigreturn and __sigreturn are needed.
  1960. 07603 .sect .text; .sect .rom; .sect .data; .sect .bss
  1961. 07604 .sect .text
  1962. 07605 .define ___sigreturn
  1963. 07606 .extern __sigreturn
  1964. 07607 ___sigreturn:
  1965. 07608         add esp, 16
  1966. 07609         jmp __sigreturn
  1967. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1968. src/lib/i386/rts/_sendrec.s    
  1969. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1970. 07700 .sect .text; .sect .rom; .sect .data; .sect .bss
  1971. 07701 .define __send, __receive, __sendrec
  1972. 07702
  1973. 07703 ! See ../h/com.h for C definitions
  1974. 07704 SEND = 1
  1975. 07705 RECEIVE = 2
  1976. 07706 BOTH = 3
  1977. 07707 SYSVEC = 33
  1978. 07708
  1979. 07709 SRCDEST = 8
  1980. 07710 MESSAGE = 12
  1981. 07711
  1982. 07712 !*========================================================================*
  1983. 07713 !                           _send and _receive                            *
  1984. 07714 !*========================================================================*
  1985. 07715 ! _send(), _receive(), _sendrec() all save ebp, but destroy eax and ecx.
  1986. 07716 .define __send, __receive, __sendrec
  1987. 07717 .sect .text
  1988. 07718 __send:
  1989. 07719         push    ebp
  1990. 07720         mov     ebp, esp
  1991. 07721         push    ebx
  1992. 07722         mov     eax, SRCDEST(ebp)       ! eax = dest-src
  1993. 07723         mov     ebx, MESSAGE(ebp)       ! ebx = message pointer
  1994. 07724         mov     ecx, SEND               ! _send(dest, ptr)
  1995. 07725         int     SYSVEC                  ! trap to the kernel
  1996. 07726         pop     ebx
  1997. 07727         pop     ebp
  1998. 07728         ret
  1999. 07729
  2000. 07730 __receive:
  2001. 07731         push    ebp
  2002. 07732         mov     ebp, esp
  2003. 07733         push    ebx
  2004. 07734         mov     eax, SRCDEST(ebp)       ! eax = dest-src
  2005. 07735         mov     ebx, MESSAGE(ebp)       ! ebx = message pointer
  2006. 07736         mov     ecx, RECEIVE            ! _receive(src, ptr)
  2007. 07737         int     SYSVEC                  ! trap to the kernel
  2008. 07738         pop     ebx
  2009. 07739         pop     ebp
  2010. 07740         ret
  2011. 07741
  2012. 07742 __sendrec:
  2013. 07743         push    ebp
  2014. 07744         mov     ebp, esp
  2015. 07745         push    ebx
  2016. 07746         mov     eax, SRCDEST(ebp)       ! eax = dest-src
  2017. 07747         mov     ebx, MESSAGE(ebp)       ! ebx = message pointer
  2018. 07748         mov     ecx, BOTH               ! _sendrec(srcdest, ptr)
  2019. 07749         int     SYSVEC                  ! trap to the kernel
  2020. 07750         pop     ebx
  2021. 07751         pop     ebp
  2022. 07752         ret
  2023. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2024. src/lib/i386/rts/brksize.s    
  2025. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2026. 07800 .sect .text; .sect .rom; .sect .data; .sect .bss
  2027. 07801 .define __brksize
  2028. 07802 .sect .data
  2029. 07803 .extern endbss, __brksize
  2030. 07804 __brksize: .data4 endbss
  2031. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2032. src/lib/i386/rts/crtso.s    
  2033. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2034. 07900 ! This is the C run-time start-off routine.  It's job is to take the
  2035. 07901 ! arguments as put on the stack by EXEC, and to parse them and set them up the
  2036. 07902 ! way _main expects them.
  2037. 07903 ! It also initializes _environ when this variable isn't defined by the
  2038. 07904 ! programmer.  The detection of whether _environ belong to us is rather
  2039. 07905 ! simplistic.  We simply check for some magic value, but there is no other
  2040. 07906 ! way.
  2041. 07907
  2042. 07908 .sect .text; .sect .rom; .sect .data; .sect .bss
  2043. 07909
  2044. 07910 .define begtext, begdata, begbss
  2045. 07911 .sect .text
  2046. 07912 begtext:
  2047. 07913 .sect .rom
  2048. 07914 begrom:
  2049. 07915 .sect .data
  2050. 07916 begdata:
  2051. 07917 .sect .bss
  2052. 07918 begbss:
  2053. 07919
  2054. 07920 .define crtso, ___main, __penvp, __fpu_present
  2055. 07921 .extern _main, _exit
  2056. 07922 .sect .text
  2057. 07923 crtso:
  2058. 07924         xor     ebp, ebp                ! clear for backtrace of core files
  2059. 07925         mov     eax, (esp)              ! argc
  2060. 07926         lea     edx, 4(esp)             ! argv
  2061. 07927         lea     ecx, 8(esp)(eax*4)      ! envp
  2062. 07928
  2063. 07929         mov     (__penvp), ecx          ! save envp in __envp
  2064. 07930
  2065. 07931         ! Test whether address of environ < address of end.
  2066. 07932         ! This is done for separate I&D systems.
  2067. 07933         mov     ebx, _environ
  2068. 07934         cmp     ebx, __end
  2069. 07935         jae     0f
  2070. 07936         cmp     (_environ), 0x53535353  ! is it our _environ?
  2071. 07937         jne     0f
  2072. 07938         mov     (_environ), ecx
  2073. 07939 0:
  2074. 07940         push    ecx                     ! push environ
  2075. 07941         push    edx                     ! push argv
  2076. 07942         push    eax                     ! push argc
  2077. 07943
  2078. 07944         ! Test the EM bit of the MSW to determine if an FPU is present and
  2079. 07945         ! set __fpu_present if one is found.
  2080. 07946         smsw    ax
  2081. 07947         testb   al, 0x4                 ! EM bit in MSW
  2082. 07948         setz    al                      ! True if not set
  2083. 07949         movb    (__fpu_present), al
  2084. 07950
  2085. 07951         call    _main                   ! main(argc, argv, envp)
  2086. 07952
  2087. 07953         push    eax                     ! push exit status
  2088. 07954         call    _exit
  2089. 07955
  2090. 07956         hlt                             ! force a trap if exit fails
  2091. 07957
  2092. 07958 ___main:                                ! for GCC
  2093. 07959         ret
  2094. 07960
  2095. 07961 .sect .rom
  2096. 07962         .data4  0                       ! Common I&D: *NULL == 0
  2097. 07963 .sect .bss
  2098. 07964         .comm   __penvp, 4              ! Environment vector
  2099. 07965         .comm   __fpu_present, 4        ! FPU present flag
  2100. 07966
  2101. 07967 .extern endtext                         ! Force loading of end labels.
  2102. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2103. src/lib/i386/rts/setjmp.e    
  2104. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2105. 08000 #
  2106. 08001  mes 2,_EM_WSIZE,_EM_PSIZE
  2107. 08002 ;
  2108. 08003 ; layout of a setjmp buffer:
  2109. 08004 ;
  2110. 08005 ;  -----------------
  2111. 08006 ; |      flag       |           (!0 when blocked signals saved (POSIX))
  2112. 08007 ;  -----------------
  2113. 08008 ; | signal mask/set |           (for Berkeley 4.[2-] / POSIX)
  2114. 08009 ;  -----------------
  2115. 08010 ; |                 |
  2116. 08011 ; |  GTO descriptor |
  2117. 08012 ; |   (SP, LB, PC)  |
  2118. 08013 ; |                 |
  2119. 08014 ;  -----------------
  2120. 08015 ;
  2121. 08016 ; setjmp saves the signalmask, PC, SP, and LB of caller, and creates a
  2122. 08017 ; GTO descriptor from this.
  2123. 08018 ; The big problem here is how to get the return address, i.e. the PC of
  2124. 08019 ; the caller; This problem is solved by the front-end, which must pass
  2125. 08020 ; it as an extra parameter to setjmp.
  2126. 08021
  2127. 08022 ; a GTO descriptor must be in the global data area
  2128. 08023 gtobuf
  2129. 08024  bss 3*_EM_PSIZE,0,0
  2130. 08025
  2131. 08026  inp $fill_ret_area
  2132. 08027  exp $__setjmp
  2133. 08028  pro $__setjmp,0
  2134. 08029 #if     defined(_POSIX_SOURCE)
  2135. 08030 ; save mask of currently blocked signals. 
  2136. 08031 ; longjmp must restore this mask
  2137. 08032  lol _EM_PSIZE                  ; the flag integer at offset _EM_PSIZE
  2138. 08033  lal 0
  2139. 08034  loi _EM_PSIZE
  2140. 08035  stf 3*_EM_PSIZE+_EM_LSIZE
  2141. 08036  lol _EM_PSIZE                  ; the flag integer at offset _EM_PSIZE
  2142. 08037  zeq *1
  2143. 08038  lal 0
  2144. 08039  loi _EM_PSIZE
  2145. 08040  adp 3*_EM_PSIZE
  2146. 08041  cal $__newsigset
  2147. 08042  asp _EM_PSIZE
  2148. 08043 1
  2149. 08044 #elif   defined(__BSD4_2)
  2150. 08045  loc 0
  2151. 08046  cal $sigblock
  2152. 08047  asp _EM_WSIZE
  2153. 08048  lfr _EM_WSIZE
  2154. 08049  lal 0
  2155. 08050  loi _EM_PSIZE
  2156. 08051  stf 3*_EM_PSIZE
  2157. 08052 #endif
  2158. 08053 ; create GTO descriptor for longjmp
  2159. 08054  lxl 0
  2160. 08055  dch            ; Local Base of caller
  2161. 08056  lxa 0          ; Stackpointer of caller
  2162. 08057  lal _EM_PSIZE+_EM_WSIZE
  2163. 08058  loi _EM_PSIZE  ; Return address of caller
  2164. 08059  lal 0
  2165. 08060  loi _EM_PSIZE  ; address of jmpbuf
  2166. 08061  sti 3*_EM_PSIZE        ; LB, SP, and PC stored in jmpbuf
  2167. 08062  loc 0
  2168. 08063  ret _EM_WSIZE  ; setjmp must return 0
  2169. 08064  end 0
  2170. 08065
  2171. 08066  pro $fill_ret_area,0
  2172. 08067 ; put argument in function result area
  2173. 08068  lol 0
  2174. 08069  ret _EM_WSIZE
  2175. 08070  end 0
  2176. 08071
  2177. 08072  exp $longjmp
  2178. 08073  pro $longjmp,?
  2179. 08074 #if     defined(_POSIX_SOURCE)
  2180. 08075 ; restore blocked mask
  2181. 08076  lal 0
  2182. 08077  loi _EM_PSIZE
  2183. 08078  lof 3*_EM_PSIZE+_EM_LSIZE
  2184. 08079  zeq *2
  2185. 08080  lal 0
  2186. 08081  loi _EM_PSIZE
  2187. 08082  adp 3*_EM_PSIZE
  2188. 08083  cal $__oldsigset
  2189. 08084  asp _EM_PSIZE
  2190. 08085 2
  2191. 08086 #elif   defined(__BSD4_2)
  2192. 08087 ; restore signal mask
  2193. 08088  lal 0
  2194. 08089  loi _EM_PSIZE
  2195. 08090  lof 3*_EM_PSIZE
  2196. 08091  cal $_sigsetmask
  2197. 08092  asp _EM_WSIZE
  2198. 08093  lfr _EM_WSIZE
  2199. 08094  asp _EM_WSIZE
  2200. 08095 #endif
  2201. 08096  lal 0
  2202. 08097  loi _EM_PSIZE  ; address of jmpbuf
  2203. 08098  lae gtobuf
  2204. 08099  blm 3*_EM_PSIZE        ; fill GTO descriptor from jmpbuf
  2205. 08100  lol _EM_PSIZE  ; second parameter of longjmp: the return value
  2206. 08101  dup _EM_WSIZE
  2207. 08102  zne *3
  2208. 08103 ; of course, longjmp may not return 0!
  2209. 08104  inc
  2210. 08105 3
  2211. 08106 ; put return value in function result area
  2212. 08107  cal $fill_ret_area
  2213. 08108  asp _EM_WSIZE
  2214. 08109  gto gtobuf     ; there we go ...
  2215. 08110 ; ASP and GTO do not damage function result area
  2216. 08111  end 0
  2217. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2218. src/lib/i386/string/_memmove.s    
  2219. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2220. 08200 !       _memmove()                                      Author: Kees J. Bot
  2221. 08201 !                                                               2 Jan 1994
  2222. 08202 .sect .text; .sect .rom; .sect .data; .sect .bss
  2223. 08203
  2224. 08204 ! void *_memmove(void *s1, const void *s2, size_t n)
  2225. 08205 !       Copy a chunk of memory.  Handle overlap.
  2226. 08206 !
  2227. 08207 .sect .text
  2228. 08208 .define __memmove, __memcpy
  2229. 08209         .align  16
  2230. 08210 __memmove:
  2231. 08211         push    ebp
  2232. 08212         mov     ebp, esp
  2233. 08213         push    esi
  2234. 08214         push    edi
  2235. 08215         mov     edi, 8(ebp)     ! String s1
  2236. 08216         mov     esi, 12(ebp)    ! String s2
  2237. 08217         mov     ecx, 16(ebp)    ! Length
  2238. 08218         mov     eax, edi
  2239. 08219         sub     eax, esi
  2240. 08220         cmp     eax, ecx
  2241. 08221         jb      downwards       ! if (s2 - s1) < n then copy downwards
  2242. 08222 __memcpy:
  2243. 08223         cld                     ! Clear direction bit: upwards
  2244. 08224         cmp     ecx, 16
  2245. 08225         jb      upbyte          ! Don't bother being smart with short arrays
  2246. 08226         mov     eax, esi
  2247. 08227         or      eax, edi
  2248. 08228         testb   al, 1
  2249. 08229         jnz     upbyte          ! Bit 0 set, use byte copy
  2250. 08230         testb   al, 2
  2251. 08231         jnz     upword          ! Bit 1 set, use word copy
  2252. 08232 uplword:shrd    eax, ecx, 2     ! Save low 2 bits of ecx in eax
  2253. 08233         shr     ecx, 2
  2254. 08234         rep
  2255. 08235         movs                    ! Copy longwords.
  2256. 08236         shld    ecx, eax, 2     ! Restore excess count
  2257. 08237 upword: shr     ecx, 1
  2258. 08238         rep
  2259. 08239     o16 movs                    ! Copy words
  2260. 08240         adc     ecx, ecx        ! One more byte?
  2261. 08241 upbyte: rep
  2262. 08242         movsb                   ! Copy bytes
  2263. 08243 done:   mov     eax, 8(ebp)     ! Absolutely noone cares about this value
  2264. 08244         pop     edi
  2265. 08245         pop     esi
  2266. 08246         pop     ebp
  2267. 08247         ret
  2268. 08248
  2269. 08249 ! Handle bad overlap by copying downwards, don't bother to do word copies.
  2270. 08250 downwards:
  2271. 08251         std                     ! Set direction bit: downwards
  2272. 08252         lea     esi, -1(esi)(ecx*1)
  2273. 08253         lea     edi, -1(edi)(ecx*1)
  2274. 08254         rep
  2275. 08255         movsb                   ! Copy bytes
  2276. 08256         cld
  2277. 08257         jmp     done
  2278. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2279. src/lib/i386/string/_strncat.s    
  2280. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2281. 08300 !       _strncat()                                      Author: Kees J. Bot
  2282. 08301 !                                                               1 Jan 1994
  2283. 08302 .sect .text; .sect .rom; .sect .data; .sect .bss
  2284. 08303
  2285. 08304 ! char *_strncat(char *s1, const char *s2, size_t edx)
  2286. 08305 !       Append string s2 to s1.
  2287. 08306 !
  2288. 08307 .sect .text
  2289. 08308 .define __strncat
  2290. 08309         .align  16
  2291. 08310 __strncat:
  2292. 08311         push    ebp
  2293. 08312         mov     ebp, esp
  2294. 08313         push    esi
  2295. 08314         push    edi
  2296. 08315         mov     edi, 8(ebp)     ! String s1
  2297. 08316         mov     ecx, -1
  2298. 08317         xorb    al, al          ! Null byte
  2299. 08318         cld
  2300. 08319         repne
  2301. 08320         scasb                   ! Look for the zero byte in s1
  2302. 08321         dec     edi             ! Back one up (and clear 'Z' flag)
  2303. 08322         push    edi             ! Save end of s1
  2304. 08323         mov     edi, 12(ebp)    ! edi = string s2
  2305. 08324         mov     ecx, edx        ! Maximum count
  2306. 08325         repne
  2307. 08326         scasb                   ! Look for the end of s2
  2308. 08327         jne     no0
  2309. 08328         inc     ecx             ! Exclude null byte
  2310. 08329 no0:    sub     edx, ecx        ! Number of bytes in s2
  2311. 08330         mov     ecx, edx
  2312. 08331         mov     esi, 12(ebp)    ! esi = string s2
  2313. 08332         pop     edi             ! edi = end of string s1
  2314. 08333         rep
  2315. 08334         movsb                   ! Copy bytes
  2316. 08335         stosb                   ! Add a terminating null
  2317. 08336         mov     eax, 8(ebp)     ! Return s1
  2318. 08337         pop     edi
  2319. 08338         pop     esi
  2320. 08339         pop     ebp
  2321. 08340         ret
  2322. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2323. src/lib/i386/string/_strncmp.s    
  2324. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2325. 08400 !       strncmp()                                       Author: Kees J. Bot
  2326. 08401 !                                                               1 Jan 1994
  2327. 08402 .sect .text; .sect .rom; .sect .data; .sect .bss
  2328. 08403
  2329. 08404 ! int strncmp(const char *s1, const char *s2, size_t ecx)
  2330. 08405 !       Compare two strings.
  2331. 08406 !
  2332. 08407 .sect .text
  2333. 08408 .define __strncmp
  2334. 08409         .align  16
  2335. 08410 __strncmp:
  2336. 08411         push    ebp
  2337. 08412         mov     ebp, esp
  2338. 08413         push    esi
  2339. 08414         push    edi
  2340. 08415         test    ecx, ecx        ! Max length is zero?
  2341. 08416         je      done
  2342. 08417         mov     esi, 8(ebp)     ! esi = string s1
  2343. 08418         mov     edi, 12(ebp)    ! edi = string s2
  2344. 08419         cld
  2345. 08420 compare:
  2346. 08421         cmpsb                   ! Compare two bytes
  2347. 08422         jne     done
  2348. 08423         cmpb    -1(esi), 0      ! End of string?
  2349. 08424         je      done
  2350. 08425         dec     ecx             ! Length limit reached?
  2351. 08426         jne     compare
  2352. 08427 done:   seta    al              ! al = (s1 > s2)
  2353. 08428         setb    ah              ! ah = (s1 < s2)
  2354. 08429         subb    al, ah
  2355. 08430         movsxb  eax, al         ! eax = (s1 > s2) - (s1 < s2), i.e. -1, 0, 1
  2356. 08431         pop     edi
  2357. 08432         pop     esi
  2358. 08433         pop     ebp
  2359. 08434         ret
  2360. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2361. src/lib/i386/string/_strncpy.s    
  2362. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2363. 08500 !       _strncpy()                                      Author: Kees J. Bot
  2364. 08501 !                                                               1 Jan 1994
  2365. 08502 .sect .text; .sect .rom; .sect .data; .sect .bss
  2366. 08503
  2367. 08504 ! char *_strncpy(char *s1, const char *s2, size_t ecx)
  2368. 08505 !       Copy string s2 to s1.
  2369. 08506 !
  2370. 08507 .sect .text
  2371. 08508 .define __strncpy
  2372. 08509         .align  16
  2373. 08510 __strncpy:
  2374. 08511         mov     edi, 12(ebp)    ! edi = string s2
  2375. 08512         xorb    al, al          ! Look for a zero byte
  2376. 08513         mov     edx, ecx        ! Save maximum count
  2377. 08514         cld
  2378. 08515         repne
  2379. 08516         scasb                   ! Look for end of s2
  2380. 08517         sub     edx, ecx        ! Number of bytes in s2 including null
  2381. 08518         xchg    ecx, edx
  2382. 08519         mov     esi, 12(ebp)    ! esi = string s2
  2383. 08520         mov     edi, 8(ebp)     ! edi = string s1
  2384. 08521         rep
  2385. 08522         movsb                   ! Copy bytes
  2386. 08523         ret
  2387. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2388. src/lib/i386/string/_strnlen.s    
  2389. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2390. 08600 !       _strnlen()                                      Author: Kees J. Bot
  2391. 08601 !                                                               1 Jan 1994
  2392. 08602 .sect .text; .sect .rom; .sect .data; .sect .bss
  2393. 08603
  2394. 08604 ! size_t _strnlen(const char *s, size_t ecx)
  2395. 08605 !       Return the length of a string.
  2396. 08606 !
  2397. 08607 .sect .text
  2398. 08608 .define __strnlen
  2399. 08609         .align  16
  2400. 08610 __strnlen:
  2401. 08611         push    ebp
  2402. 08612         mov     ebp, esp
  2403. 08613         push    edi
  2404. 08614         mov     edi, 8(ebp)     ! edi = string
  2405. 08615         xorb    al, al          ! Look for a zero byte
  2406. 08616         mov     edx, ecx        ! Save maximum count
  2407. 08617         cmpb    cl, 1           ! 'Z' bit must be clear if ecx = 0
  2408. 08618         cld
  2409. 08619         repne
  2410. 08620         scasb                   ! Look for zero
  2411. 08621         jne     no0
  2412. 08622         inc     ecx             ! Don't count zero byte
  2413. 08623 no0:    mov     eax, edx
  2414. 08624         sub     eax, ecx        ! Compute bytes scanned
  2415. 08625         pop     edi
  2416. 08626         pop     ebp
  2417. 08627         ret
  2418. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2419. src/lib/i386/string/bcmp.s    
  2420. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2421. 08700 !       bcmp()                                          Author: Kees J. Bot
  2422. 08701 !                                                               2 Jan 1994
  2423. 08702 .sect .text; .sect .rom; .sect .data; .sect .bss
  2424. 08703
  2425. 08704 ! int bcmp(const void *s1, const void *s2, size_t n)
  2426. 08705 !       Compare two chunks of memory.
  2427. 08706 !       This is a BSD routine that escaped from the kernel.  Don't use.
  2428. 08707 !       (Alas it is not without some use, it reports the number of bytes
  2429. 08708 !       after the bytes that are equal.  So it can't be simply replaced.)
  2430. 08709 !
  2431. 08710 .sect .text
  2432. 08711 .define _bcmp
  2433. 08712         .align  16
  2434. 08713 _bcmp:
  2435. 08714         push    ebp
  2436. 08715         mov     ebp, esp
  2437. 08716         push    16(ebp)
  2438. 08717         push    12(ebp)
  2439. 08718         push    8(ebp)
  2440. 08719         call    _memcmp         ! Let memcmp do the work
  2441. 08720         test    eax, eax
  2442. 08721         jz      equal
  2443. 08722         sub     edx, 8(ebp)     ! Memcmp was nice enough to leave "esi" in edx
  2444. 08723         dec     edx             ! Number of bytes that are equal
  2445. 08724         mov     eax, 16(ebp)
  2446. 08725         sub     eax, edx        ! Number of bytes that are unequal
  2447. 08726 equal:  leave
  2448. 08727         ret
  2449. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2450. src/lib/i386/string/bcopy.s    
  2451. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2452. 08800 !       bcopy()                                         Author: Kees J. Bot
  2453. 08801 !                                                               2 Jan 1994
  2454. 08802 .sect .text; .sect .rom; .sect .data; .sect .bss
  2455. 08803
  2456. 08804 ! void bcopy(const void *s1, void *s2, size_t n)
  2457. 08805 !       Copy a chunk of memory.  Handle overlap.
  2458. 08806 !       This is a BSD routine that escaped from the kernel.  Don't use.
  2459. 08807 !
  2460. 08808 .sect .text
  2461. 08809 .define _bcopy
  2462. 08810         .align  16
  2463. 08811 _bcopy:
  2464. 08812         mov     eax, 4(esp)     ! Exchange string arguments
  2465. 08813         xchg    eax, 8(esp)
  2466. 08814         mov     4(esp), eax
  2467. 08815         jmp     __memmove       ! Call the proper routine
  2468. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2469. src/lib/i386/string/bzero.s    
  2470. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2471. 08900 !       bzero()                                         Author: Kees J. Bot
  2472. 08901 !                                                               2 Jan 1994
  2473. 08902 .sect .text; .sect .rom; .sect .data; .sect .bss
  2474. 08903
  2475. 08904 ! void bzero(void *s, size_t n)
  2476. 08905 !       Set a chunk of memory to zero.
  2477. 08906 !       This is a BSD routine that escaped from the kernel.  Don't use.
  2478. 08907 !
  2479. 08908 .sect .text
  2480. 08909 .define _bzero
  2481. 08910         .align  16
  2482. 08911 _bzero:
  2483. 08912         push    ebp
  2484. 08913         mov     ebp, esp
  2485. 08914         push    12(ebp)         ! Size
  2486. 08915         push    0               ! Zero
  2487. 08916         push    8(ebp)          ! String
  2488. 08917         call    _memset         ! Call the proper routine
  2489. 08918         leave
  2490. 08919         ret
  2491. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2492. src/lib/i386/string/index.s    
  2493. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2494. 09000 !       index()                                         Author: Kees J. Bot
  2495. 09001 !                                                               2 Jan 1994
  2496. 09002 .sect .text; .sect .rom; .sect .data; .sect .bss
  2497. 09003
  2498. 09004 ! char *index(const char *s, int c)
  2499. 09005 !       Look for a character in a string.  Has suffered from a hostile
  2500. 09006 !       takeover by strchr().
  2501. 09007 !
  2502. 09008 .sect .text
  2503. 09009 .define _index
  2504. 09010         .align  16
  2505. 09011 _index:
  2506. 09012         jmp     _strchr
  2507. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2508. src/lib/i386/string/memchr.s    
  2509. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2510. 09100 !       memchr()                                        Author: Kees J. Bot
  2511. 09101 !                                                               2 Jan 1994
  2512. 09102 .sect .text; .sect .rom; .sect .data; .sect .bss
  2513. 09103
  2514. 09104 ! void *memchr(const void *s, int c, size_t n)
  2515. 09105 !       Look for a character in a chunk of memory.
  2516. 09106 !
  2517. 09107 .sect .text
  2518. 09108 .define _memchr
  2519. 09109         .align  16
  2520. 09110 _memchr:
  2521. 09111         push    ebp
  2522. 09112         mov     ebp, esp
  2523. 09113         push    edi
  2524. 09114         mov     edi, 8(ebp)     ! edi = string
  2525. 09115         movb    al, 12(ebp)     ! The character to look for
  2526. 09116         mov     ecx, 16(ebp)    ! Length
  2527. 09117         cmpb    cl, 1           ! 'Z' bit must be clear if ecx = 0
  2528. 09118         cld
  2529. 09119         repne
  2530. 09120         scasb
  2531. 09121         jne     failure
  2532. 09122         lea     eax, -1(edi)    ! Found
  2533. 09123         pop     edi
  2534. 09124         pop     ebp
  2535. 09125         ret
  2536. 09126 failure:xor     eax, eax
  2537. 09127         pop     edi
  2538. 09128         pop     ebp
  2539. 09129         ret
  2540. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2541. src/lib/i386/string/memcmp.s    
  2542. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2543. 09200 !       memcmp()                                        Author: Kees J. Bot
  2544. 09201 !                                                               2 Jan 1994
  2545. 09202 .sect .text; .sect .rom; .sect .data; .sect .bss
  2546. 09203
  2547. 09204 ! int memcmp(const void *s1, const void *s2, size_t n)
  2548. 09205 !       Compare two chunks of memory.
  2549. 09206 !
  2550. 09207 .sect .text
  2551. 09208 .define _memcmp
  2552. 09209         .align  16
  2553. 09210 _memcmp:
  2554. 09211         cld
  2555. 09212         push    ebp
  2556. 09213         mov     ebp, esp
  2557. 09214         push    esi
  2558. 09215         push    edi
  2559. 09216         mov     esi, 8(ebp)     ! String s1
  2560. 09217         mov     edi, 12(ebp)    ! String s2
  2561. 09218         mov     ecx, 16(ebp)    ! Length
  2562. 09219         cmp     ecx, 16
  2563. 09220         jb      cbyte           ! Don't bother being smart with short arrays
  2564. 09221         mov     eax, esi
  2565. 09222         or      eax, edi
  2566. 09223         testb   al, 1
  2567. 09224         jnz     cbyte           ! Bit 0 set, use byte compare
  2568. 09225         testb   al, 2
  2569. 09226         jnz     cword           ! Bit 1 set, use word compare
  2570. 09227 clword: shrd    eax, ecx, 2     ! Save low two bits of ecx in eax
  2571. 09228         shr     ecx, 2
  2572. 09229         repe
  2573. 09230         cmps                    ! Compare longwords
  2574. 09231         sub     esi, 4
  2575. 09232         sub     edi, 4
  2576. 09233         inc     ecx             ! Recompare the last longword
  2577. 09234         shld    ecx, eax, 2     ! And any excess bytes
  2578. 09235         jmp     last
  2579. 09236 cword:  shrd    eax, ecx, 1     ! Save low bit of ecx in eax
  2580. 09237         shr     ecx, 1
  2581. 09238         repe
  2582. 09239     o16 cmps                    ! Compare words
  2583. 09240         sub     esi, 2
  2584. 09241         sub     edi, 2
  2585. 09242         inc     ecx             ! Recompare the last word
  2586. 09243         shld    ecx, eax, 1     ! And one more byte?
  2587. 09244 cbyte:  test    ecx, ecx        ! Set 'Z' flag if ecx = 0
  2588. 09245 last:   repe
  2589. 09246         cmpsb                   ! Look for the first differing byte
  2590. 09247         seta    al              ! al = (s1 > s2)
  2591. 09248         setb    ah              ! ah = (s1 < s2)
  2592. 09249         subb    al, ah
  2593. 09250         movsxb  eax, al         ! eax = (s1 > s2) - (s1 < s2), i.e. -1, 0, 1
  2594. 09251         mov     edx, esi        ! For bcmp() to play with
  2595. 09252         pop     edi
  2596. 09253         pop     esi
  2597. 09254         pop     ebp
  2598. 09255         ret
  2599. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2600. src/lib/i386/string/memcpy.s    
  2601. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2602. 09300 !       memcpy()                                        Author: Kees J. Bot
  2603. 09301 !                                                               2 Jan 1994
  2604. 09302 .sect .text; .sect .rom; .sect .data; .sect .bss
  2605. 09303
  2606. 09304 ! void *memcpy(void *s1, const void *s2, size_t n)
  2607. 09305 !       Copy a chunk of memory.
  2608. 09306 !       This routine need not handle overlap, so it does not handle overlap.
  2609. 09307 !       One could simply call __memmove, the cost of the overlap check is
  2610. 09308 !       negligible, but you are dealing with a programmer who believes that
  2611. 09309 !       if anything can go wrong, it should go wrong.
  2612. 09310 !
  2613. 09311 .sect .text
  2614. 09312 .define _memcpy
  2615. 09313         .align  16
  2616. 09314 _memcpy:
  2617. 09315         push    ebp
  2618. 09316         mov     ebp, esp
  2619. 09317         push    esi
  2620. 09318         push    edi
  2621. 09319         mov     edi, 8(ebp)     ! String s1
  2622. 09320         mov     esi, 12(ebp)    ! String s2
  2623. 09321         mov     ecx, 16(ebp)    ! Length
  2624. 09322         ! No overlap check here
  2625. 09323         jmp     __memcpy        ! Call the part of __memmove that copies up
  2626. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2627. src/lib/i386/string/memmove.s    
  2628. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2629. 09400 !       memmove()                                       Author: Kees J. Bot
  2630. 09401 !                                                               2 Jan 1994
  2631. 09402 .sect .text; .sect .rom; .sect .data; .sect .bss
  2632. 09403
  2633. 09404 ! void *memmove(void *s1, const void *s2, size_t n)
  2634. 09405 !       Copy a chunk of memory.  Handle overlap.
  2635. 09406 !
  2636. 09407 .sect .text
  2637. 09408 .define _memmove
  2638. 09409         .align  16
  2639. 09410 _memmove:
  2640. 09411         jmp     __memmove       ! Call common code
  2641. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2642. src/lib/i386/string/memset.s    
  2643. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2644. 09500 !       memset()                                        Author: Kees J. Bot
  2645. 09501 !                                                               2 Jan 1994
  2646. 09502 .sect .text; .sect .rom; .sect .data; .sect .bss
  2647. 09503
  2648. 09504 ! void *memset(void *s, int c, size_t n)
  2649. 09505 !       Set a chunk of memory to the same byte value.
  2650. 09506 !
  2651. 09507 .sect .text
  2652. 09508 .define _memset
  2653. 09509         .align  16
  2654. 09510 _memset:
  2655. 09511         push    ebp
  2656. 09512         mov     ebp, esp
  2657. 09513         push    edi
  2658. 09514         mov     edi, 8(ebp)     ! The string
  2659. 09515         movzxb  eax, 12(ebp)    ! The fill byte
  2660. 09516         mov     ecx, 16(ebp)    ! Length
  2661. 09517         cld
  2662. 09518         cmp     ecx, 16
  2663. 09519         jb      sbyte           ! Don't bother being smart with short arrays
  2664. 09520         test    edi, 1
  2665. 09521         jnz     sbyte           ! Bit 0 set, use byte store
  2666. 09522         test    edi, 2
  2667. 09523         jnz     sword           ! Bit 1 set, use word store
  2668. 09524 slword: movb    ah, al
  2669. 09525         mov     edx, eax
  2670. 09526         sal     edx, 16
  2671. 09527         or      eax, edx        ! One byte to four bytes
  2672. 09528         shrd    edx, ecx, 2     ! Save low two bits of ecx in edx
  2673. 09529         shr     ecx, 2
  2674. 09530         rep
  2675. 09531         stos                    ! Store longwords.
  2676. 09532         shld    ecx, edx, 2     ! Restore low two bits
  2677. 09533 sword:  movb    ah, al          ! One byte to two bytes
  2678. 09534         shr     ecx, 1
  2679. 09535         rep
  2680. 09536     o16 stos                    ! Store words
  2681. 09537         adc     ecx, ecx        ! One more byte?
  2682. 09538 sbyte:  rep
  2683. 09539         stosb                   ! Store bytes
  2684. 09540 done:   mov     eax, 8(ebp)     ! Return some value you have no need for
  2685. 09541         pop     edi
  2686. 09542         pop     ebp
  2687. 09543         ret
  2688. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2689. src/lib/i386/string/rindex.s    
  2690. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2691. 09600 !       rindex()                                        Author: Kees J. Bot
  2692. 09601 !                                                               2 Jan 1994
  2693. 09602 .sect .text; .sect .rom; .sect .data; .sect .bss
  2694. 09603
  2695. 09604 ! char *rindex(const char *s, int c)
  2696. 09605 !       Look for the last occurrence a character in a string.  Has suffered
  2697. 09606 !       from a hostile takeover by strrchr().
  2698. 09607 !
  2699. 09608 .sect .text
  2700. 09609 .define _rindex
  2701. 09610         .align  16
  2702. 09611 _rindex:
  2703. 09612         jmp     _strrchr
  2704. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2705. src/lib/i386/string/strcat.s    
  2706. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2707. 09700 !       strcat()                                        Author: Kees J. Bot
  2708. 09701 !                                                               1 Jan 1994
  2709. 09702 .sect .text; .sect .rom; .sect .data; .sect .bss
  2710. 09703
  2711. 09704 ! char *strcat(char *s1, const char *s2)
  2712. 09705 !       Append string s2 to s1.
  2713. 09706 !
  2714. 09707 .sect .text
  2715. 09708 .define _strcat
  2716. 09709         .align  16
  2717. 09710 _strcat:
  2718. 09711         mov     edx, -1         ! Unlimited length
  2719. 09712         jmp     __strncat       ! Common code
  2720. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2721. src/lib/i386/string/strchr.s    
  2722. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2723. 09800 !       strchr()                                        Author: Kees J. Bot
  2724. 09801 !                                                               1 Jan 1994
  2725. 09802 .sect .text; .sect .rom; .sect .data; .sect .bss
  2726. 09803
  2727. 09804 ! char *strchr(const char *s, int c)
  2728. 09805 !       Look for a character in a string.
  2729. 09806 !
  2730. 09807 .sect .text
  2731. 09808 .define _strchr
  2732. 09809         .align  16
  2733. 09810 _strchr:
  2734. 09811         push    ebp
  2735. 09812         mov     ebp, esp
  2736. 09813         push    edi
  2737. 09814         cld
  2738. 09815         mov     edi, 8(ebp)     ! edi = string
  2739. 09816         mov     edx, 16         ! Look at small chunks of the string
  2740. 09817 next:   shl     edx, 1          ! Chunks become bigger each time
  2741. 09818         mov     ecx, edx
  2742. 09819         xorb    al, al          ! Look for the zero at the end
  2743. 09820         repne
  2744. 09821         scasb
  2745. 09822         pushf                   ! Remember the flags
  2746. 09823         sub     ecx, edx
  2747. 09824         neg     ecx             ! Some or all of the chunk
  2748. 09825         sub     edi, ecx        ! Step back
  2749. 09826         movb    al, 12(ebp)     ! The character to look for
  2750. 09827         repne
  2751. 09828         scasb
  2752. 09829         je      found
  2753. 09830         popf                    ! Did we find the end of string earlier?
  2754. 09831         jne     next            ! No, try again
  2755. 09832         xor     eax, eax        ! Return NULL
  2756. 09833         pop     edi
  2757. 09834         pop     ebp
  2758. 09835         ret
  2759. 09836 found:  pop     eax             ! Get rid of those flags
  2760. 09837         lea     eax, -1(edi)    ! Address of byte found
  2761. 09838         pop     edi
  2762. 09839         pop     ebp
  2763. 09840         ret
  2764. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2765. src/lib/i386/string/strcmp.s    
  2766. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2767. 09900 !       strcmp()                                        Author: Kees J. Bot
  2768. 09901 !                                                               1 Jan 1994
  2769. 09902 .sect .text; .sect .rom; .sect .data; .sect .bss
  2770. 09903
  2771. 09904 ! int strcmp(const char *s1, const char *s2)
  2772. 09905 !       Compare two strings.
  2773. 09906 !
  2774. 09907 .sect .text
  2775. 09908 .define _strcmp
  2776. 09909         .align  16
  2777. 09910 _strcmp:
  2778. 09911         mov     ecx, -1         ! Unlimited length
  2779. 09912         jmp     __strncmp       ! Common code
  2780. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2781. src/lib/i386/string/strcpy.s    
  2782. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2783. 10000 !       strcpy()                                        Author: Kees J. Bot
  2784. 10001 !                                                               1 Jan 1994
  2785. 10002 .sect .text; .sect .rom; .sect .data; .sect .bss
  2786. 10003
  2787. 10004 ! char *strcpy(char *s1, const char *s2)
  2788. 10005 !       Copy string s2 to s1.
  2789. 10006 !
  2790. 10007 .sect .text
  2791. 10008 .define _strcpy
  2792. 10009         .align  16
  2793. 10010 _strcpy:
  2794. 10011         push    ebp
  2795. 10012         mov     ebp, esp
  2796. 10013         push    esi
  2797. 10014         push    edi
  2798. 10015         mov     ecx, -1         ! Unlimited length
  2799. 10016         call    __strncpy       ! Common code
  2800. 10017         mov     eax, 8(ebp)     ! Return s1
  2801. 10018         pop     edi
  2802. 10019         pop     esi
  2803. 10020         pop     ebp
  2804. 10021         ret
  2805. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2806. src/lib/i386/string/strlen.s    
  2807. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2808. 10100 !       strlen()                                        Author: Kees J. Bot
  2809. 10101 !                                                               1 Jan 1994
  2810. 10102 .sect .text; .sect .rom; .sect .data; .sect .bss
  2811. 10103
  2812. 10104 ! size_t strlen(const char *s)
  2813. 10105 !       Return the length of a string.
  2814. 10106 !
  2815. 10107 .sect .text
  2816. 10108 .define _strlen
  2817. 10109         .align  16
  2818. 10110 _strlen:
  2819. 10111         mov     ecx, -1         ! Unlimited length
  2820. 10112         jmp     __strnlen       ! Common code
  2821. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2822. src/lib/i386/string/strncat.s    
  2823. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2824. 10200 !       strncat()                                       Author: Kees J. Bot
  2825. 10201 !                                                               1 Jan 1994
  2826. 10202 .sect .text; .sect .rom; .sect .data; .sect .bss
  2827. 10203
  2828. 10204 ! size_t strncat(char *s1, const char *s2, size_t n)
  2829. 10205 !       Append string s2 to s1.
  2830. 10206 !
  2831. 10207 .sect .text
  2832. 10208 .define _strncat
  2833. 10209         .align  16
  2834. 10210 _strncat:
  2835. 10211         mov     edx, 12(esp)    ! Maximum length
  2836. 10212         jmp     __strncat       ! Common code
  2837. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2838. src/lib/i386/string/strncmp.s    
  2839. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2840. 10300 !       strncmp()                                       Author: Kees J. Bot
  2841. 10301 !                                                               1 Jan 1994
  2842. 10302 .sect .text; .sect .rom; .sect .data; .sect .bss
  2843. 10303
  2844. 10304 ! int strncmp(const char *s1, const char *s2, size_t n)
  2845. 10305 !       Compare two strings.
  2846. 10306 !
  2847. 10307 .sect .text
  2848. 10308 .define _strncmp
  2849. 10309         .align  16
  2850. 10310 _strncmp:
  2851. 10311         mov     ecx, 12(esp)    ! Maximum length
  2852. 10312         jmp     __strncmp       ! Common code
  2853. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2854. src/lib/i386/string/strncpy.s    
  2855. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2856. 10400 !       strncpy()                                       Author: Kees J. Bot
  2857. 10401 !                                                               1 Jan 1994
  2858. 10402 .sect .text; .sect .rom; .sect .data; .sect .bss
  2859. 10403
  2860. 10404 ! char *strncpy(char *s1, const char *s2, size_t n)
  2861. 10405 !       Copy string s2 to s1.
  2862. 10406 !
  2863. 10407 .sect .text
  2864. 10408 .define _strncpy
  2865. 10409         .align  16
  2866. 10410 _strncpy:
  2867. 10411         push    ebp
  2868. 10412         mov     ebp, esp
  2869. 10413         push    esi
  2870. 10414         push    edi
  2871. 10415         mov     ecx, 16(ebp)    ! Maximum length
  2872. 10416         call    __strncpy       ! Common code
  2873. 10417         mov     ecx, edx        ! Number of bytes not copied
  2874. 10418         rep
  2875. 10419         stosb                   ! strncpy always copies n bytes by null padding
  2876. 10420         mov     eax, 8(ebp)     ! Return s1
  2877. 10421         pop     edi
  2878. 10422         pop     esi
  2879. 10423         pop     ebp
  2880. 10424         ret
  2881. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2882. src/lib/i386/string/strnlen.s    
  2883. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2884. 10500 !       strnlen()                                       Author: Kees J. Bot
  2885. 10501 !                                                               1 Jan 1994
  2886. 10502 .sect .text; .sect .rom; .sect .data; .sect .bss
  2887. 10503
  2888. 10504 ! size_t strnlen(const char *s, size_t n)
  2889. 10505 !       Return the length of a string.
  2890. 10506 !
  2891. 10507 .sect .text
  2892. 10508 .define _strnlen
  2893. 10509         .align  16
  2894. 10510 _strnlen:
  2895. 10511         mov     ecx, 8(esp)     ! Maximum length
  2896. 10512         jmp     __strnlen       ! Common code
  2897. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2898. src/lib/i386/string/strrchr.s    
  2899. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2900. 10600 !       strrchr()                                       Author: Kees J. Bot
  2901. 10601 !                                                               2 Jan 1994
  2902. 10602 .sect .text; .sect .rom; .sect .data; .sect .bss
  2903. 10603
  2904. 10604 ! char *strrchr(const char *s, int c)
  2905. 10605 !       Look for the last occurrence a character in a string.
  2906. 10606 !
  2907. 10607 .sect .text
  2908. 10608 .define _strrchr
  2909. 10609         .align  16
  2910. 10610 _strrchr:
  2911. 10611         push    ebp
  2912. 10612         mov     ebp, esp
  2913. 10613         push    edi
  2914. 10614         mov     edi, 8(ebp)     ! edi = string
  2915. 10615         mov     ecx, -1
  2916. 10616         xorb    al, al
  2917. 10617         cld
  2918. 10618         repne
  2919. 10619         scasb                   ! Look for the end of the string
  2920. 10620         not     ecx             ! -1 - ecx = Length of the string + null
  2921. 10621         dec     edi             ! Put edi back on the zero byte
  2922. 10622         movb    al, 12(ebp)     ! The character to look for
  2923. 10623         std                     ! Downwards search
  2924. 10624         repne
  2925. 10625         scasb
  2926. 10626         cld                     ! Direction bit back to default
  2927. 10627         jne     failure
  2928. 10628         lea     eax, 1(edi)     ! Found it
  2929. 10629         pop     edi
  2930. 10630         pop     ebp
  2931. 10631         ret
  2932. 10632 failure:xor     eax, eax        ! Not there
  2933. 10633         pop     edi
  2934. 10634         pop     ebp
  2935. 10635         ret