Changeset 4f508e6 in buchla-68k for lib700


Ignore:
Timestamp:
07/01/2017 02:34:46 PM (7 years ago)
Author:
Thomas Lopatic <thomas@…>
Branches:
master
Children:
08e1da1
Parents:
f40a309
Message:

Converted assembly language files.

Location:
lib700
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • lib700/aldiv.s

    rf40a309 r4f508e6  
    1 *
    2 * aldiv.s -- indirect long divide
    3 * Version 1 -- 1989-01-24 -- D.N. Lynx Crowe
    4 *
     1
     2| aldiv.s -- indirect long divide
     3| Version 1 -- 1989-01-24 -- D.N. Lynx Crowe
     4
    55        .text
    6 *
     6
    77        .xdef   aldiv
    88        .xdef   _aldiv
    9 *
     9
    1010        .xref   _ldiv
    11 *
     11
    1212aldiv:
    1313_aldiv:
    14 *
     14
    1515        link    a6,#-2
    1616        move.l  12(a6),-(a7)
     
    2323        unlk    a6
    2424        rts
    25 *
     25
    2626        .end
  • lib700/almul.s

    rf40a309 r4f508e6  
    1 *
    2 * almul.s -- indirect long multiply
    3 * Version 1 -- 1989-01-24 -- D.N. Lynx Crowe
    4 *
     1
     2| almul.s -- indirect long multiply
     3| Version 1 -- 1989-01-24 -- D.N. Lynx Crowe
     4
    55                .text
    6 *
     6
    77                .xdef   almul
    8 *
     8
    99                .xref   lmul
    10 *
     10
    1111almul:          move.l  a5,-(a7)
    1212                movea.l 8(a7),a5
     
    1818                movea.l (a7)+,a5
    1919                rts
    20 *
     20
    2121                .end
  • lib700/alrem.s

    rf40a309 r4f508e6  
    1 *
    2 * alrem.s -- indirect long modulus
    3 * Version 1 -- 1989-01-24 -- D.N. Lynx Crowe
    4 *
     1
     2| alrem.s -- indirect long modulus
     3| Version 1 -- 1989-01-24 -- D.N. Lynx Crowe
     4
    55                .text
    6 *
     6
    77                .xdef   alrem
    88                .xdef   _alrem
    9 *
     9
    1010                .xref   _ldiv
    1111                .xref   _ldivr
    12 *
     12
    1313alrem:
    1414_alrem:
    15 *
     15
    1616                link    a6,#-2
    1717                move.l  12(a6),-(a7)
     
    2525                unlk    a6
    2626                rts
    27 *
     27
    2828                .end
  • lib700/blkfill.s

    rf40a309 r4f508e6  
    1 * ------------------------------------------------------------------------------
    2 * blkfill.s -- block fill function
    3 * Version 1 -- 1987-08-28 -- D.N. Lynx Crowe
    4 *
    5 *       void
    6 *       blkfill(where, what, count)
    7 *       char *where;
    8 *       char what;
    9 *       short count;
    10 *
    11 *               Fills 'count' bytes at 'where' with 'what'.
    12 * ------------------------------------------------------------------------------
     1| ------------------------------------------------------------------------------
     2| blkfill.s -- block fill function
     3| Version 1 -- 1987-08-28 -- D.N. Lynx Crowe
     4
     5|       void
     6|       blkfill(where, what, count)
     7|       char |where;
     8|       char what;
     9|       short count;
     10
     11|               Fills 'count' bytes at 'where' with 'what'.
     12| ------------------------------------------------------------------------------
    1313                .text
    14 *
     14
    1515                .xdef   _blkfill
    16 *
     16
    1717_blkfill:       link    a6,#0
    1818                movem.l d5-d7/a5-a5,-(a7)
     
    2121                move.w  14(a6),d6
    2222                bra     blkf2
    23 *
     23
    2424blkf1:          move.b  d7,(a5)+
    25 *
     25
    2626blkf2:          move.w  d6,d0
    2727                subq.w  #1,d6
    2828                tst.w   d0
    2929                bgt     blkf1
    30 *
     30
    3131                tst     (a7)+
    3232                movem.l (a7)+,d6-d7/a5-a5
    3333                unlk    a6
    3434                rts
    35 *
     35
    3636                .end
  • lib700/blkmove.s

    rf40a309 r4f508e6  
    1 * ------------------------------------------------------------------------------
    2 * blkmove.s -- block move function
    3 * Version 1 -- 1987-08-28 -- D.N. Lynx Crowe
    4 *
    5 *       void
    6 *       blkmove(to, from, n)
    7 *       char *to, *from;
    8 *       short n;
    9 *
    10 *               Copies 'n' bytes from address 'from' to address 'to'.
    11 *               Treats overlaps of from and to areas intelligently.
    12 * ------------------------------------------------------------------------------
     1| ------------------------------------------------------------------------------
     2| blkmove.s -- block move function
     3| Version 1 -- 1987-08-28 -- D.N. Lynx Crowe
     4
     5|       void
     6|       blkmove(to, from, n)
     7|       char |to, |from;
     8|       short n;
     9
     10|               Copies 'n' bytes from address 'from' to address 'to'.
     11|               Treats overlaps of from and to areas intelligently.
     12| ------------------------------------------------------------------------------
    1313                .text
    14 *
     14
    1515                .xdef   _blkmove
    16 *
    17 _blkmove:       link    a6,#$FFFC
     16
     17_blkmove:       link    a6,#-4
    1818                move.l  8(a6),d0
    1919                cmp.l   12(a6),d0
    2020                bcc     blkm3
    21 *
     21
    2222                bra     blkm2
    23 *
     23
    2424blkm1:          movea.l 8(a6),a0
    2525                movea.l 12(a6),a1
     
    2727                addq.l  #1,8(a6)
    2828                addq.l  #1,12(a6)
    29 *
     29
    3030blkm2:          move.w  16(a6),d0
    3131                subq.w  #1,16(a6)
    3232                tst.w   d0
    3333                bne     blkm1
    34 *
     34
    3535                bra     blkm6
    36 *
     36
    3737blkm3:          move.w  16(a6),d0
    3838                ext.l   d0
     
    4040                add.l   d0,12(a6)
    4141                bra     blkm5
    42 *
     42
    4343blkm4:          subq.l  #1,8(a6)
    4444                subq.l  #1,12(a6)
     
    4646                movea.l 12(a6),a1
    4747                move.b  (a1),(a0)
    48 *
     48
    4949blkm5:          move.w  16(a6),d0
    5050                subq.w  #1,16(a6)
    5151                tst.w   d0
    5252                bne     blkm4
    53 *
     53
    5454blkm6:          unlk    a6
    5555                rts
    56 *
     56
    5757                .end
  • lib700/finalone.s

    rf40a309 r4f508e6  
    1 * ------------------------------------------------------------------------------
    2 * finalone.s -- the last stuff to get loaded
    3 * Version 4 -- 1987-06-30 -- D.N. Lynx Crowe
    4 *
    5 * This is so we can figure out where things got loaded.
    6 * ------------------------------------------------------------------------------
    7 *
     1| ------------------------------------------------------------------------------
     2| finalone.s -- the last stuff to get loaded
     3| Version 4 -- 1987-06-30 -- D.N. Lynx Crowe
     4
     5| This is so we can figure out where things got loaded.
     6| ------------------------------------------------------------------------------
     7
    88                .text
    9 *
     9
    1010                .xdef   FinalOne
    1111                .xdef   The_Fini
    1212                .xdef   Text_End
    13 *
    14 *
    15 * This is the last piece of code in the 'text' segment.
    16 *
    17 FinalOne:       rts                     * we just need the address here
    18 *
    19 Text_End:       rts                     * we just need the address here
    20 *
    21 * ------------------------------------------------------------------------------
    22 *
     13
     14
     15| This is the last piece of code in the 'text' segment.
     16
     17FinalOne:       rts                     | we just need the address here
     18
     19Text_End:       rts                     | we just need the address here
     20
     21| ------------------------------------------------------------------------------
     22
    2323                .data
    2424                .even
    25 *
    26 The_Fini:       dc.w    $FFFF           * last thing in the 'data' segment
    27 *
    28 * ------------------------------------------------------------------------------
    29 *
     25
     26The_Fini:       dc.w    0xFFFF          | last thing in the 'data' segment
     27
     28| ------------------------------------------------------------------------------
     29
    3030                .end
  • lib700/jumpto.s

    rf40a309 r4f508e6  
    1 * ------------------------------------------------------------------------------
    2 * jumpto.s -- miscellaneous ROMP support functions
    3 * Version 4 -- 1987-10-14 -- D.N. Lynx Crowe
    4 *
    5 *       WARNING:
    6 *       --------
    7 *               These functions, in general, assume supervisor mode and
    8 *               'sane' arguments, so no error checking is done.
    9 *
    10 *       halt()
    11 *
    12 *               Brings the processor to a grinding halt.  Requires external
    13 *               reset to restart things.  Use only for catastrophic hard halts.
    14 *
    15 *       jumpto(addr)
    16 *       long addr;
    17 *
    18 *               Jumps to 'addr'.  No error check is done on 'addr'.
    19 *
    20 *       rjumpto(addr)
    21 *       long addr;
    22 *
    23 *               Performs the 68000 'RESET' command, then jumps to 'addr'.
    24 *               No error check is made on 'addr'.
    25 *
    26 *       sjumpto(addr, stack)
    27 *       long addr, stack;
    28 *
    29 *               Sets a7 to 'stack', then jumps to 'addr'.
    30 *               No error check is done on 'addr'.
    31 *
    32 *       xreset()
    33 *
    34 *               Performs the 68000 'RESET' command.  This is very dangerous,
    35 *               and should be used with extreme care regarding such
    36 *               things as interrupts, device initialization, vectors,
    37 *               and sundry other reset-related things.
    38 *
    39 * ------------------------------------------------------------------------------
     1| ------------------------------------------------------------------------------
     2| jumpto.s -- miscellaneous ROMP support functions
     3| Version 4 -- 1987-10-14 -- D.N. Lynx Crowe
     4
     5|       WARNING:
     6|       --------
     7|               These functions, in general, assume supervisor mode and
     8|               'sane' arguments, so no error checking is done.
     9
     10|       halt()
     11
     12|               Brings the processor to a grinding halt.  Requires external
     13|               reset to restart things.  Use only for catastrophic hard halts.
     14
     15|       jumpto(addr)
     16|       long addr;
     17
     18|               Jumps to 'addr'.  No error check is done on 'addr'.
     19
     20|       rjumpto(addr)
     21|       long addr;
     22
     23|               Performs the 68000 'RESET' command, then jumps to 'addr'.
     24|               No error check is made on 'addr'.
     25
     26|       sjumpto(addr, stack)
     27|       long addr, stack;
     28
     29|               Sets a7 to 'stack', then jumps to 'addr'.
     30|               No error check is done on 'addr'.
     31
     32|       xreset()
     33
     34|               Performs the 68000 'RESET' command.  This is very dangerous,
     35|               and should be used with extreme care regarding such
     36|               things as interrupts, device initialization, vectors,
     37|               and sundry other reset-related things.
     38
     39| ------------------------------------------------------------------------------
    4040                .text
    41 *
     41
    4242                .xdef   _halt,_jumpto,_rjumpto,_sjumpto,_xreset
    43 *
     43
    4444                .page
    45 *
    46 _halt:          stop    #$2700                  * stop dead, interrupts disabled
    47                 jmp     _halt                   * stay stopped if stepped thru
    48 *
    49 _jumpto:        movea.l 4(a7),a0                * get jump address
    50                 jmp     (a0)                    * go to the jump address
    51 *
    52 _rjumpto:       reset                           * reset external devices
    53                 movea.l 4(a7),a0                * get jump address
    54                 jmp     (a0)                    * go to the jump address
    55 *
    56 _sjumpto:       movea.l 4(a7),a0                * get jump address
    57                 movea.l 8(a7),a7                * set stack pointer
    58                 jmp     (a0)                    * go to the jump address
    59 *
    60 _xreset:        reset                           * reset external devices
    61                 rts                             * return to caller
    62 *
     45
     46_halt:          stop    #0x2700                 | stop dead, interrupts disabled
     47                jmp     _halt                   | stay stopped if stepped thru
     48
     49_jumpto:        movea.l 4(a7),a0                | get jump address
     50                jmp     (a0)                    | go to the jump address
     51
     52_rjumpto:       reset                           | reset external devices
     53                movea.l 4(a7),a0                | get jump address
     54                jmp     (a0)                    | go to the jump address
     55
     56_sjumpto:       movea.l 4(a7),a0                | get jump address
     57                movea.l 8(a7),a7                | set stack pointer
     58                jmp     (a0)                    | go to the jump address
     59
     60_xreset:        reset                           | reset external devices
     61                rts                             | return to caller
     62
    6363                .end
  • lib700/ldiv.s

    rf40a309 r4f508e6  
    1 * ------------------------------------------------------------------------------
    2 * ldiv.s -- long division
    3 * Version 1 -- 1988-01-22
    4 * ------------------------------------------------------------------------------
     1| ------------------------------------------------------------------------------
     2| ldiv.s -- long division
     3| Version 1 -- 1988-01-22
     4| ------------------------------------------------------------------------------
    55                .text
    6 *
     6
    77                .xdef   _ldiv
    88                .xdef   ldiv
    9 *
     9
    1010                .xdef   _ldivr
    11 *
    12 ARG1            .equ    8
    13 ARG2            .equ    12
    14 *
     11
     12ARG1            =       8
     13ARG2            =       12
     14
    1515_ldiv:
    1616ldiv:           link    a6,#-2
     
    2121                move.l  ARG2(a6),d6
    2222                bne     ldiv1
    23 *
    24                 move.l  #$80000000,_ldivr
    25                 move.l  #$80000000,d0
     23
     24                move.l  #0x80000000,_ldivr
     25                move.l  #0x80000000,d0
    2626                divs    #0,d0
    2727                bra     ldiv11
    28 *
     28
    2929ldiv1:          bge     ldiv2
    30 *
     30
    3131                neg.l   d6
    3232                addq.w  #1,d3
    33 *
     33
    3434ldiv2:          tst.l   d7
    3535                bge     ldiv3
    36 *
     36
    3737                neg.l   d7
    3838                addq.w  #1,d3
    39 *
     39
    4040ldiv3:          cmp.l   d7,d6
    4141                bgt     ldiv9
    42 *
     42
    4343                bne     ldiv4
    44 *
     44
    4545                moveq.l #1,d5
    4646                clr.l   d7
    4747                bra     ldiv9
    48 *
    49 ldiv4:          cmp.l   #$10000,d7
     48
     49ldiv4:          cmp.l   #0x10000,d7
    5050                bge     ldiv5
    51 *
     51
    5252                divu    d6,d7
    5353                move.w  d7,d5
     
    5555                ext.l   d7
    5656                bra     ldiv9
    57 *
     57
    5858ldiv5:          moveq.l #1,d4
    59 *
     59
    6060ldiv6:          cmp.l   d6,d7
    6161                bcs     ldiv7
    62 *
     62
    6363                asl.l   #1,d6
    6464                asl.l   #1,d7
    6565                bra     ldiv6
    66 *
     66
    6767ldiv7:          tst.l   d4
    6868                beq     ldiv9
    69 *
     69
    7070                cmp.l   d6,d7
    7171                bcs     ldiv8
    72 *
     72
    7373                or.l    d4,d5
    7474                sub.l   d6,d7
    75 *
     75
    7676ldiv8:          lsr.l   #1,d4
    7777                lsr.l   #1,d6
    7878                bra     ldiv7
    79 *
     79
    8080ldiv9:          cmp.w   #1,d3
    8181                bne     ldiv10
    82 *
     82
    8383                neg.l   d7
    8484                move.l  d7,_ldivr
     
    8686                neg.l   d0
    8787                bra     ldiv11
    88 *
     88
    8989ldiv10:         move.l  d7,_ldivr
    9090                move.l  d5,d0
    91 *
     91
    9292ldiv11:         tst.l   (a7)+
    9393                movem.l (a7)+,d3-d7
    9494                unlk    a6
    9595                rts
    96 *
     96
    9797                .bss
    98 *
     98
    9999_ldivr:         .ds.l   1
    100 *
     100
    101101                .end
  • lib700/lmul.s

    rf40a309 r4f508e6  
    1 * ------------------------------------------------------------------------------
    2 * lmul.s -- long multiply
    3 * Version 2 -- 1989-07-18
    4 * ------------------------------------------------------------------------------
     1| ------------------------------------------------------------------------------
     2| lmul.s -- long multiply
     3| Version 2 -- 1989-07-18
     4| ------------------------------------------------------------------------------
    55                .text
    6 *
     6
    77                .xdef   lmul
    8 *
    9 ARG1            .equ    8
    10 ARG2            .equ    12
    11 *
    12 TEMP            .equ    -4
    13 *
     8
     9ARG1            =       8
     10ARG2            =       12
     11
     12TEMP            =       -4
     13
    1414lmul:           link    a6,#-4
    1515                clr.w   d2
    1616                tst.l   ARG1(a6)
    1717                bge     lmul1
    18 *
     18
    1919                neg.l   ARG1(a6)
    2020                addq.w  #1,d2
    21 *
     21
    2222lmul1:          tst.l   ARG2(a6)
    2323                bge     lmul2
    24 *
     24
    2525                neg.l   ARG2(a6)
    2626                addq.w  #1,d2
    27 *
     27
    2828lmul2:          move.w  ARG1+2(a6),d0
    2929                mulu    ARG2+2(a6),d0
     
    3939                btst    #0,d2
    4040                beq     lmul3
    41 *
     41
    4242                neg.l   d0
    43 *
     43
    4444lmul3:          unlk    a6
    4545                rts
    46 *
     46
    4747                .end
  • lib700/lrem.s

    rf40a309 r4f508e6  
    1 * ------------------------------------------------------------------------------
    2 * lrem.s -- long modulo
    3 * Version 1 -- 1988-01-22
    4 * ------------------------------------------------------------------------------
     1| ------------------------------------------------------------------------------
     2| lrem.s -- long modulo
     3| Version 1 -- 1988-01-22
     4| ------------------------------------------------------------------------------
    55                .text
    6 *
     6
    77                .xdef   _lrem
    88                .xdef   lrem
    9 *
     9
    1010                .xref   ldiv
    1111                .xref   _ldivr
    12 *
    13 ARG1            .equ    8
    14 ARG2            .equ    12
    15 *
     12
     13ARG1            =       8
     14ARG2            =       12
     15
    1616_lrem:
    1717lrem:           link    a6,#-2
     
    2323                unlk    a6
    2424                rts
    25 *
     25
    2626                .end
  • lib700/rand24.s

    rf40a309 r4f508e6  
    1 * ------------------------------------------------------------------------------
    2 * rand24.s -- generate a 24 bit random number
    3 * Version 3 -- 1988-04-29 -- D.N. Lynx Crowe
    4 * ------------------------------------------------------------------------------
    5 * Synopsis:
    6 *               long
    7 *               rand24()
    8 *
    9 * Based on:
    10 *               Knuth, Donald E.
    11 *               The Art of Computer Programming,
    12 *               Volume 2: Semi-Numerical Algorithms
    13 *
    14 * Computes:
    15 *               S = [S * C] + K
    16 *
    17 * Where:
    18 *               K = 1
    19 *               C = 3141592621
    20 *               S = the seed  (if zero, it gets set from the 200 Hz clock)
    21 *
    22 * Returns:
    23 *               S >> 8  (a 24 bit pseudo-random number)
    24 *
    25 * Note:  this function has an LSB with an exactly 50% distribution,  so using
    26 * individual bits is probably not a good idea.  Using more bits makes things
    27 * appear more random.
    28 * ------------------------------------------------------------------------------
     1| ------------------------------------------------------------------------------
     2| rand24.s -- generate a 24 bit random number
     3| Version 3 -- 1988-04-29 -- D.N. Lynx Crowe
     4| ------------------------------------------------------------------------------
     5| Synopsis:
     6|               long
     7|               rand24()
     8
     9| Based on:
     10|               Knuth, Donald E.
     11|               The Art of Computer Programming,
     12|               Volume 2: Semi-Numerical Algorithms
     13
     14| Computes:
     15|               S = [S | C] + K
     16
     17| Where:
     18|               K = 1
     19|               C = 3141592621
     20|               S = the seed  (if zero, it gets set from the 200 Hz clock)
     21
     22| Returns:
     23|               S >> 8  (a 24 bit pseudo-random number)
     24
     25| Note:  this function has an LSB with an exactly 50% distribution,  so using
     26| individual bits is probably not a good idea.  Using more bits makes things
     27| appear more random.
     28| ------------------------------------------------------------------------------
    2929                .text
    30 *
     30
    3131                .xdef   _rand24
    32 *
     32
    3333                .xdef   _rseed
    34 *
    35 * equates for things in the BIOS
    36 *
    37 RCLOCK          .equ    $49E                    * LONG - 200 Hz clock
    38 *
    39 * equates for stack offsets
    40 *
    41 ARG1            .equ    8                       * LONG / WORD - arg1 / MS bits
    42 ARG1L           .equ    10                      * WORD - arg1 LS bits
    43 ARG2            .equ    12                      * LONG / WORD - arg2 / MS bits
    44 ARG2L           .equ    14                      * WORD - arg2 LS bits
    45 *
    46 PART            .equ    -4                      * LONG - partial product
    47 *
    48 PI              .equ    $BB40E62D               * LONG - PI as a hex value
    49 *
     34
     35| equates for things in the BIOS
     36
     37RCLOCK          =       0x49E                   | LONG - 200 Hz clock
     38
     39| equates for stack offsets
     40
     41ARG1            =       8                       | LONG / WORD - arg1 / MS bits
     42ARG1L           =       10                      | WORD - arg1 LS bits
     43ARG2            =       12                      | LONG / WORD - arg2 / MS bits
     44ARG2L           =       14                      | WORD - arg2 LS bits
     45
     46PART            =       -4                      | LONG - partial product
     47
     48PI              =       0xBB40E62D              | LONG - PI as a hex value
     49
    5050                .page
    51 *
    52 * mult32 -- 32 bit signed multiply
    53 * ------    ----------------------
    54 mult32:         link    a6,#-4                  * link stack frames
    55                 clr.w   d2                      * clear sign flags
    56                 tst.l   ARG1(a6)                * check sign of 1st argument
    57                 bge     mult32a                 * ...
    58 *
    59                 neg.l   ARG1(a6)                * make 1st argument positive
    60                 addq.w  #1,d2                   * log its sign as negative
    61 *
    62 mult32a:        tst.l   ARG2(a6)                * check sign of 2nd argument
    63                 bge     mult32b                 * ...
    64 *
    65                 neg.l   ARG2(a6)                * make 2nd argument positive
    66                 addq.w  #1,d2                   * log its sign as negative
    67 *
    68 mult32b:        move.w  ARG1L(a6),d0            * generate 1st partial product
    69                 mulu    ARG2L(a6),d0            * ...
    70                 move.l  d0,PART(a6)             * ...
    71                 move.w  ARG1(a6),d0             * generate 2nd partial product
    72                 mulu    ARG2L(a6),d0            * ...
    73                 move.w  ARG2(a6),d1             * generate 3rd partial product
    74                 mulu    ARG1L(a6),d1            * ...
    75                 add.w   d1,d0                   * add partial products
    76                 add.w   PART(a6),d0             * ...
    77                 move.w  d0,PART(a6)             * ...
    78                 move.l  PART(a6),d0             * ...
    79                 btst    #0,d2                   * adjust sign of result
    80                 beq     mult32c                 * ...
    81 *
    82                 neg.l   d0                      * ...
    83 *
    84 mult32c:        unlk    a6                      * unlink stack frames
    85                 rts                             * return
    86 *
     51
     52| mult32 -- 32 bit signed multiply
     53| ------    ----------------------
     54mult32:         link    a6,#-4                  | link stack frames
     55                clr.w   d2                      | clear sign flags
     56                tst.l   ARG1(a6)                | check sign of 1st argument
     57                bge     mult32a                 | ...
     58
     59                neg.l   ARG1(a6)                | make 1st argument positive
     60                addq.w  #1,d2                   | log its sign as negative
     61
     62mult32a:        tst.l   ARG2(a6)                | check sign of 2nd argument
     63                bge     mult32b                 | ...
     64
     65                neg.l   ARG2(a6)                | make 2nd argument positive
     66                addq.w  #1,d2                   | log its sign as negative
     67
     68mult32b:        move.w  ARG1L(a6),d0            | generate 1st partial product
     69                mulu    ARG2L(a6),d0            | ...
     70                move.l  d0,PART(a6)             | ...
     71                move.w  ARG1(a6),d0             | generate 2nd partial product
     72                mulu    ARG2L(a6),d0            | ...
     73                move.w  ARG2(a6),d1             | generate 3rd partial product
     74                mulu    ARG1L(a6),d1            | ...
     75                add.w   d1,d0                   | add partial products
     76                add.w   PART(a6),d0             | ...
     77                move.w  d0,PART(a6)             | ...
     78                move.l  PART(a6),d0             | ...
     79                btst    #0,d2                   | adjust sign of result
     80                beq     mult32c                 | ...
     81
     82                neg.l   d0                      | ...
     83
     84mult32c:        unlk    a6                      | unlink stack frames
     85                rts                             | return
     86
    8787                .page
    88 *
    89 * _rand24 -- Generate a random number
    90 * -------    ------------------------
    91 _rand24:        link    a6,#0                   * Link stack frames
    92                 tst.l   _rseed                  * See if the seed is zero
    93                 bne     rand01                  * Jump if not
    94 *
    95                 move.l  RCLOCK,d0               * Pick up the 200 Hz clock
    96                 moveq.l #16,d1                  * Shift it left
    97                 asl.l   d1,d0                   * ...
    98                 or.l    RCLOCK,d0               * OR in current 200 Hz clock
    99                 move.l  d0,_rseed               * Use that as the seed
    100 *
    101 rand01:         move.l  #PI,-(a7)               * Put PI on the stack
    102                 move.l  _rseed,-(a7)            * ... and _rseed, too
    103                 bsr     mult32                  * Multiply them
    104                 addq.l  #8,a7                   * Cleanup stack
    105                 addq.l  #1,d0                   * Add 1 to the result
    106                 move.l  d0,_rseed               * Save as new seed
    107                 asr.l   #8,d0                   * Make it a 24 bit number
    108                 and.l   #$00FFFFFF,d0           * ...
    109                 unlk    a6                      * Unlink stack frames
    110                 rts                             * Return to caller
    111 *
    112 * ------------------------------------------------------------------------------
     88
     89| _rand24 -- Generate a random number
     90| -------    ------------------------
     91_rand24:        link    a6,#0                   | Link stack frames
     92                tst.l   _rseed                  | See if the seed is zero
     93                bne     rand01                  | Jump if not
     94
     95                move.l  RCLOCK,d0               | Pick up the 200 Hz clock
     96                moveq.l #16,d1                  | Shift it left
     97                asl.l   d1,d0                   | ...
     98                or.l    RCLOCK,d0               | OR in current 200 Hz clock
     99                move.l  d0,_rseed               | Use that as the seed
     100
     101rand01:         move.l  #PI,-(a7)               | Put PI on the stack
     102                move.l  _rseed,-(a7)            | ... and _rseed, too
     103                bsr     mult32                  | Multiply them
     104                addq.l  #8,a7                   | Cleanup stack
     105                addq.l  #1,d0                   | Add 1 to the result
     106                move.l  d0,_rseed               | Save as new seed
     107                asr.l   #8,d0                   | Make it a 24 bit number
     108                and.l   #0x00FFFFFF,d0          | ...
     109                unlk    a6                      | Unlink stack frames
     110                rts                             | Return to caller
     111
     112| ------------------------------------------------------------------------------
    113113                .bss
    114 * ------------------------------------------------------------------------------
    115 *
    116 _rseed:         .ds.l   1                       * random number seed
    117 *
     114| ------------------------------------------------------------------------------
     115
     116_rseed:         .ds.l   1                       | random number seed
     117
    118118                .end
  • lib700/setjmp.s

    rf40a309 r4f508e6  
    1 * ------------------------------------------------------------------------------
    2 * setjmp.s -- Unix(tm) compatible setjmp(env) and longjmp(env,ret)
    3 * Version 3 -- 1987-06-16 -- D.N. Lynx Crowe
    4 * ------------------------------------------------------------------------------
    5 *
     1| ------------------------------------------------------------------------------
     2| setjmp.s -- Unix(tm) compatible setjmp(env) and longjmp(env,ret)
     3| Version 3 -- 1987-06-16 -- D.N. Lynx Crowe
     4| ------------------------------------------------------------------------------
     5
    66                .text
    7 *
     7
    88                .xdef   _setjmp,_longjmp
    9 *
    10 _setjmp:        movea.l 4(a7),a0                * Get env pointer
    11                 move.l  (a7),(a0)               * Put return address in env
    12                 movem.l d1-d7/a1-a7,4(a0)       * Save registers in env
    13                 moveq.l #0,d0                   * Set return value to 0
    14                 rts                             * Return to caller
    15 *
    16 _longjmp:       move.w  8(a7),d0                * Get ret value
    17                 bne     lj1                     * Jump if non-zero
    18 *
    19                 moveq.l #1,d0                   * Force return value to 1
    20 *
    21 lj1:            movea.l 4(a7),a0                * Get env pointer
    22                 movem.l 4(a0),d1-d7/a1-a7       * Restore registers from env
    23                 move.l  (a0),(a7)               * Get return address from env
    24                 rts                             * Return to caller
    25 *
     9
     10_setjmp:        movea.l 4(a7),a0                | Get env pointer
     11                move.l  (a7),(a0)               | Put return address in env
     12                movem.l d1-d7/a1-a7,4(a0)       | Save registers in env
     13                moveq.l #0,d0                   | Set return value to 0
     14                rts                             | Return to caller
     15
     16_longjmp:       move.w  8(a7),d0                | Get ret value
     17                bne     lj1                     | Jump if non-zero
     18
     19                moveq.l #1,d0                   | Force return value to 1
     20
     21lj1:            movea.l 4(a7),a0                | Get env pointer
     22                movem.l 4(a0),d1-d7/a1-a7       | Restore registers from env
     23                move.l  (a0),(a7)               | Get return address from env
     24                rts                             | Return to caller
     25
    2626                .end
  • lib700/uldiv.s

    rf40a309 r4f508e6  
    1 * ------------------------------------------------------------------------------
    2 * uldiv.s -- unsigned long division, with remainder
    3 * Version 2 -- 1987-06-08 -- D.N. Lynx Crowe
    4 * Lifted from the Alcyon C library by disassembly so I could fix a bug -
    5 *       _uldivr must be in the bss segment so the code will work in PROM.
    6 *
    7 *       long
    8 *       uldiv(dividnd, divisor)
    9 *       long dividnd, divisor;
    10 *
    11 *       extern long uldivr;
    12 *
    13 *               Divides 'dividnd' by 'divisor', treating both as unsigned
    14 *               long integers.  Returns the quotient and leaves the
    15 *               remainder in 'uldivr'.  Produces a divide check on division
    16 *               by zero, with $80000000 returned for both quotient and
    17 *               remainder.
    18 * ------------------------------------------------------------------------------
     1| ------------------------------------------------------------------------------
     2| uldiv.s -- unsigned long division, with remainder
     3| Version 2 -- 1987-06-08 -- D.N. Lynx Crowe
     4| Lifted from the Alcyon C library by disassembly so I could fix a bug -
     5|       _uldivr must be in the bss segment so the code will work in PROM.
     6
     7|       long
     8|       uldiv(dividnd, divisor)
     9|       long dividnd, divisor;
     10
     11|       extern long uldivr;
     12
     13|               Divides 'dividnd' by 'divisor', treating both as unsigned
     14|               long integers.  Returns the quotient and leaves the
     15|               remainder in 'uldivr'.  Produces a divide check on division
     16|               by zero, with 0x80000000 returned for both quotient and
     17|               remainder.
     18| ------------------------------------------------------------------------------
    1919                .text
    20 *
     20
    2121                .xdef   _uldiv,_uldivr
    22 *
    23 DIVIDEND        .equ    8
    24 DIVISOR         .equ    12
    25 *
    26 _uldiv:         link    a6,#0                   * Link stack frames
    27                 movem.l d3-d7,-(a7)             * Save registers
    28                 move.l  DIVIDEND(a6),d7         * d7 = DIVIDEND
    29                 move.l  DIVISOR(a6),d6          * d6 = DIVISOR
    30                 tst.l   d6                      * Divide by zero ?
    31                 bne     notdzero                * Jump if not
    32 *
    33                 move.l  #$80000000,_uldivr      * Force error result
    34                 move.l  #$80000000,d0           * ... by dividing
    35                 divu    #0,d0                   * ... by zero
    36                 bra     ulexit                  * ... then exit
    37 *
    38 notdzero:       cmp.l   d7,d6                   * Divide underflow ?
    39                 bls     notunflo                * Jump if not
    40 *
    41                 move.l  d7,_uldivr              * Remainder = dividend
    42                 clr.l   d0                      * Quotient = 0
    43                 bra     ulexit                  * Exit
    44 *
    45 notunflo:       cmp.l   d6,d7                   * Is dividend = divisor ?
    46                 bne     startdiv                * Go start dividing if not
    47 *
    48                 moveq.l #1,d5                   * Quotient = 1
    49                 clr.l   d7                      * Remainder = 0
    50                 bra     setreslt                * Go set result
    51 *
     22
     23DIVIDEND        =       8
     24DIVISOR         =       12
     25
     26_uldiv:         link    a6,#0                   | Link stack frames
     27                movem.l d3-d7,-(a7)             | Save registers
     28                move.l  DIVIDEND(a6),d7         | d7 = DIVIDEND
     29                move.l  DIVISOR(a6),d6          | d6 = DIVISOR
     30                tst.l   d6                      | Divide by zero ?
     31                bne     notdzero                | Jump if not
     32
     33                move.l  #0x80000000,_uldivr     | Force error result
     34                move.l  #0x80000000,d0          | ... by dividing
     35                divu    #0,d0                   | ... by zero
     36                bra     ulexit                  | ... then exit
     37
     38notdzero:       cmp.l   d7,d6                   | Divide underflow ?
     39                bls     notunflo                | Jump if not
     40
     41                move.l  d7,_uldivr              | Remainder = dividend
     42                clr.l   d0                      | Quotient = 0
     43                bra     ulexit                  | Exit
     44
     45notunflo:       cmp.l   d6,d7                   | Is dividend = divisor ?
     46                bne     startdiv                | Go start dividing if not
     47
     48                moveq.l #1,d5                   | Quotient = 1
     49                clr.l   d7                      | Remainder = 0
     50                bra     setreslt                | Go set result
     51
    5252                .page
    53 *
    54 startdiv:       moveq.l #1,d4                   * Set result bit in d4
    55 *
    56 divloop1:       cmp.l   d6,d7                   * Divisor aligned OK ?
    57                 bcs     divloop2                * Jump if so
    58 *
    59                 move.l  d6,d0                   * Can we align things better ?
    60                 asl.l   #1,d0                   * ...
    61                 cmp.l   d0,d6                   * ...
    62                 bhi     divloop2                * Jump if not
    63 *
    64                 asl.l   #1,d6                   * Shift the divisor
    65                 asl.l   #1,d4                   * Shift the result bit
    66                 bra     divloop1                * Loop for next bit
    67 *
    68 divloop2:       clr.l   d5                      * Clear quotient
    69 *
    70 divloop3:       tst.l   d4                      * More bits to do ?
    71                 beq     setreslt                * Go set result if not
    72 *
    73                 cmp.l   d6,d7                   * Can we subtract ?
    74                 bcs     divloop4                * Jump if not
    75 *
    76                 or.l    d4,d5                   * Set a bit in the quotient
    77                 sub.l   d6,d7                   * Subtract divisor from dividend
    78 *
    79 divloop4:       lsr.l   #1,d4                   * Shift the result bit
    80                 lsr.l   #1,d6                   * Shift the divisor
    81                 bra     divloop3                * Loop for next bit
    82 *
    83 setreslt:       move.l  d7,_uldivr              * Store remainder
    84                 move.l  d5,d0                   * Put quotient in d0
    85 *
    86 ulexit:         tst.l   (a7)+                   * Discard top of stack
    87                 movem.l (a7)+,d4-d7             * Restore registers
    88                 unlk    a6                      * Unlink stack frames
    89                 rts                             * Return to caller
    90 *
     53
     54startdiv:       moveq.l #1,d4                   | Set result bit in d4
     55
     56divloop1:       cmp.l   d6,d7                   | Divisor aligned OK ?
     57                bcs     divloop2                | Jump if so
     58
     59                move.l  d6,d0                   | Can we align things better ?
     60                asl.l   #1,d0                   | ...
     61                cmp.l   d0,d6                   | ...
     62                bhi     divloop2                | Jump if not
     63
     64                asl.l   #1,d6                   | Shift the divisor
     65                asl.l   #1,d4                   | Shift the result bit
     66                bra     divloop1                | Loop for next bit
     67
     68divloop2:       clr.l   d5                      | Clear quotient
     69
     70divloop3:       tst.l   d4                      | More bits to do ?
     71                beq     setreslt                | Go set result if not
     72
     73                cmp.l   d6,d7                   | Can we subtract ?
     74                bcs     divloop4                | Jump if not
     75
     76                or.l    d4,d5                   | Set a bit in the quotient
     77                sub.l   d6,d7                   | Subtract divisor from dividend
     78
     79divloop4:       lsr.l   #1,d4                   | Shift the result bit
     80                lsr.l   #1,d6                   | Shift the divisor
     81                bra     divloop3                | Loop for next bit
     82
     83setreslt:       move.l  d7,_uldivr              | Store remainder
     84                move.l  d5,d0                   | Put quotient in d0
     85
     86ulexit:         tst.l   (a7)+                   | Discard top of stack
     87                movem.l (a7)+,d4-d7             | Restore registers
     88                unlk    a6                      | Unlink stack frames
     89                rts                             | Return to caller
     90
    9191                .bss
    9292                .even
    93 *
     93
    9494_uldivr:        ds.l    1
    95 *
     95
    9696                .end
Note: See TracChangeset for help on using the changeset viewer.