home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / lisp / interpre / xlispplu / sources / gccasm.s < prev    next >
Text File  |  1992-02-03  |  5KB  |  251 lines

  1. /* Assembly language suport GCC and XLISP */
  2.     .data
  3.     .align 4
  4. NaN:    .word   0,0,1,0x7ff0
  5. FPCW:
  6.     .word   0,0 /* floating point control word */
  7.     .globl _bytesperline
  8. _bytesperline:
  9.     .word   -1,0    /* maximum x value -- graphics */
  10. savemode:
  11.     .byte   0
  12.     .text
  13. .align 4
  14. .globl _floor   /* missing from mathlib */
  15. _floor:
  16.     pushl %ebp
  17.     movl %esp,%ebp
  18.     subl $8,%esp    /* room for two temps */
  19.     fnstcw -4(%ebp)
  20.     movl -4(%ebp),%eax
  21.     andl $-3073,%eax
  22.     orl $1024,%eax
  23.     movl %eax,-8(%ebp)
  24.     fldcw -8(%ebp)
  25.     fldl 8(%ebp)
  26.     frndint
  27.     fldcw -4(%ebp)
  28.     leave
  29.     ret
  30. .align 4
  31. .globl _ceil
  32. _ceil:
  33.     pushl %ebp
  34.     movl %esp,%ebp
  35.     subl $8,%esp
  36.     fnstcw -4(%ebp)
  37.     movl -4(%ebp),%eax
  38.     andl $-3073,%eax
  39.     orl $2048,%eax
  40.     movl %eax,-8(%ebp)
  41.     fldcw -8(%ebp)
  42.     fldl 8(%ebp)
  43.     frndint
  44.     fldcw -4(%ebp)
  45.     leave
  46.     ret
  47. .align 4
  48. .globl _fabs
  49. _fabs:
  50.     fldl 4(%esp)
  51.     fabs
  52.     ret
  53. .align 4
  54. .globl _sin
  55. _sin:   fldl 4(%esp)
  56.     fsin
  57.     fstsw
  58.     sahf
  59.     jnp sin_success
  60.     fldl    NaN
  61. sin_success:
  62.     ret
  63. .align 4
  64. .globl _cos
  65. _cos:   fldl 4(%esp)
  66.     fcos
  67.     fstsw
  68.     sahf
  69.     jnp cos_success
  70.     fldl    NaN
  71. cos_success: ret
  72.  
  73. .align 4
  74. .globl _tan
  75. _tan:   fldl 4(%esp)
  76.     fptan
  77.     fstsw
  78.     sahf
  79.     fstp    %st(0)
  80.     jnp tan_success
  81.     fldl    NaN
  82. tan_success: ret
  83.  
  84.     .align 4
  85.     .globl _setfpcw
  86. _setfpcw:
  87. /* sets the floating point control word, masking off all fp interupts */
  88.     fstcww  FPCW
  89.     fwait
  90.     orl $0x3b, FPCW
  91.     fldcww  FPCW
  92.     ret
  93.  
  94. /* Set pixel (EGA/VGA modes) Derived from Richard Wilton's book */
  95.     .align 4
  96.     .globl _setdrawmode
  97. _setdrawmode:
  98.     movl    $0x3ce, %edx
  99.     movl    $0x205, %eax   /* write mode 2, read mode 0 */
  100.     outw    %ax, %dx
  101.     movl    4(%esp), %eax
  102.     movb    %al,savemode
  103.     movb    $0, %ah
  104.     testb   $0x80, %al
  105.     jz  overmode
  106.     movb    $0x18, %ah
  107. overmode:
  108.     movb    $3, %al
  109.     outw    %ax, %dx
  110.     ret
  111.  
  112.     .align 4
  113.     .globl _unsetdrawmode
  114. _unsetdrawmode:
  115.     movl    $0x3ce, %edx
  116.     movl    $0xff08, %eax   /* restore defaults */
  117.     outw    %ax, %dx
  118.     movl    $5, %eax
  119.     outw    %ax, %dx
  120.     movl    $3, %eax
  121.     outw    %ax, %dx
  122.     ret
  123.  
  124.     .align 4
  125.     .globl _setpixel
  126. _setpixel:
  127.     push    %ebp
  128.     movl    %esp, %ebp      /* set up new stack base */
  129.     push    %ebx
  130.  
  131.     movl    12(%ebp), %eax      /* Arg Y */
  132.     movl    8(%ebp), %ebx       /* Arg X */
  133.     movb    %bl, %cl        /* low order byte of X */
  134.     imull   _bytesperline, %eax /* bytes per line * y address */
  135.     shrl    $3, %ebx        /* x/8 */
  136.     addl    %eax, %ebx      /* byte offset */
  137.     addl    $0xe00a0000, %ebx   /* address of display */
  138.  
  139.     andb    $7, %cl         /* x & 7 */
  140.     xorb    $7, %cl         /* number of bits to shift left */
  141.     movb    $1, %ah         /* shift mask */
  142.  
  143.     shlb    %cl, %ah        /* bit mask is generated */
  144.     movw    $0x3ce, %dx
  145.     movb    $8, %al         /* set bit mask */
  146.     outw    %ax, %dx
  147.  
  148.     movb    0(%ebx), %al
  149.     movb    savemode, %al
  150.     movb    %al, 0(%ebx)
  151.  
  152.     pop %ebx
  153.     pop %ebp
  154.     ret
  155.  
  156.     .align 4
  157.     .globl _doscallpath
  158. _doscallpath:
  159. /* usage:   int doscallpath(int drive, char *path)
  160.     returns 0 on success. */
  161.     pushl   %ebx
  162.     pushl   %esi
  163.     pushl   %edi
  164.     movl    16(%esp), %edx
  165.     movl    20(%esp), %esi
  166.     mov $0x47, %ah
  167.     int $0x21
  168.     popl    %edi
  169.     popl    %esi
  170.     popl    %ebx
  171.     mov $0, %eax
  172.     jnc noerror
  173.     inc %eax
  174. noerror:
  175.     ret
  176.  
  177.     .align 4
  178.     .globl _doscall
  179. _doscall:
  180. /* usage:   int doscall(int EAX, int EBX, int ECX, int EDX)
  181.     returns EAX contents */
  182.     pushl   %ebx
  183.     pushl   %esi
  184.     pushl   %edi
  185.     movl    16(%esp), %eax
  186.     movl    20(%esp), %ebx
  187.     movl    24(%esp), %ecx
  188.     movl    28(%esp), %edx
  189.     int $0x21
  190.     popl    %edi
  191.     popl    %esi
  192.     popl    %ebx
  193.     ret
  194.     .align 4
  195.     .globl _calldisp
  196. _calldisp:
  197. /* usage:   int calldisp(int EAX, int EBX, int ECX, int EDX)
  198.     returns EAX contents */
  199.     pushl   %ebx
  200.     pushl   %esi
  201.     pushl   %edi
  202.     movl    16(%esp), %eax
  203.     movl    20(%esp), %ebx
  204.     movl    24(%esp), %ecx
  205.     movl    28(%esp), %edx
  206.     pushl   %ebp    /* this is a kludge, hopefully will be fixed! */
  207.     int $0x10   /* display */
  208.     popl    %ebp    /* finish of kludge */
  209.     popl    %edi
  210.     popl    %esi
  211.     popl    %ebx
  212.     ret
  213.     .align 4
  214.     .globl _calldispdx
  215. _calldispdx:
  216. /* usage:   int calldisp(int EAX, int EBX, int ECX, int EDX)
  217.     returns EDX contents */
  218.     pushl   %ebx
  219.     pushl   %esi
  220.     pushl   %edi
  221.     movl    16(%esp), %eax
  222.     movl    20(%esp), %ebx
  223.     movl    24(%esp), %ecx
  224.     movl    28(%esp), %edx
  225.     pushl   %ebp    /* this is a kludge, hopefully will be fixed! */
  226.     int $0x10   /* display */
  227.     popl    %ebp    /* finish of kludge */
  228.     mov %edx, %eax
  229.     popl    %edi
  230.     popl    %esi
  231.     popl    %ebx
  232.     ret
  233.     .align 4
  234.     .globl  _doscalledx
  235. _doscalledx:
  236. /* usage:   int doscall(int EAX, int EBX, int ECX, int EDX)
  237.     returns EDX contents */
  238.     pushl   %ebx
  239.     pushl   %esi
  240.     pushl   %edi
  241.     movl    16(%esp), %eax
  242.     movl    20(%esp), %ebx
  243.     movl    24(%esp), %ecx
  244.     movl    28(%esp), %edx
  245.     int $0x21
  246.     movl    %edx, %eax
  247.     popl    %edi
  248.     popl    %esi
  249.     popl    %ebx
  250.     ret
  251.