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

操作系统开发

开发平台:

WINDOWS

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