Annotation of MiNT/src/cpu.spp, revision 1.1

1.1     ! root        1: ;
        !             2: 
        !             3: ; CPU tricks (we should probably have spl7(), spl() & reboot() in here)
        !             4: 
        !             5: ;
        !             6: 
        !             7:        TEXT
        !             8: 
        !             9: ;
        !            10: 
        !            11: ; Cache tricks
        !            12: 
        !            13: ;
        !            14: 
        !            15:        XDEF    _cpush
        !            16: 
        !            17:        XREF    _mcpu           ; in main.c
        !            18: 
        !            19: ;
        !            20: 
        !            21: ; cpush(void *base, long length):
        !            22: 
        !            23: ; flush both caches from base over a distance of length. If length is -1
        !            24: 
        !            25: ; then the entire cache is flushed
        !            26: 
        !            27: ;
        !            28: 
        !            29: _cpush:
        !            30: 
        !            31:        movem.l 4(a7),d0/a0     ; get parameters
        !            32: 
        !            33:        exg     a0,d0           ; and in the right order
        !            34: 
        !            35:        move.l  _mcpu,d1        ; start checking the CPU type
        !            36: 
        !            37:        cmp.l   #20,d1
        !            38: 
        !            39:        bcs.s   noc
        !            40: 
        !            41:        cmp.l   #40,d1
        !            42: 
        !            43:        bne.s   is030
        !            44: 
        !            45:        
        !            46: 
        !            47:        addq.l  #1,d0           ; if was -1
        !            48: 
        !            49:        beq.s   abc040          ; then flush everything
        !            50: 
        !            51:        add.l   #14,d0          ; round up to line boundary
        !            52: 
        !            53:        lsr.l   #4,d0           ; convert to number of lines
        !            54: 
        !            55:        cmp.l   #256,d0
        !            56: 
        !            57:        bcs.s   fls040          ; not too many lines, so dump only some
        !            58: 
        !            59: 
        !            60: 
        !            61: abc040:        dc.w    $F4F8           ; this is "cpusha bc" if your asm knows '040
        !            62: 
        !            63:        bra.s   noc
        !            64: 
        !            65:        
        !            66: 
        !            67: ; run through d0+1 times (since a0 may not be on a line boundary)
        !            68: 
        !            69: fls040:        moveq   #16,d1
        !            70: 
        !            71: do040: dc.w    $F4E8           ; this is "cpushl bc,(a0)" for the '040
        !            72: 
        !            73:        add.w   d1,a0
        !            74: 
        !            75:        dbf     d0,do040
        !            76: 
        !            77:        bra.s   noc
        !            78: 
        !            79: 
        !            80: 
        !            81: is030:
        !            82: 
        !            83:        movec   cacr,d1
        !            84: 
        !            85:        move.l  d1,-(a7)
        !            86: 
        !            87:        addq.l  #1,d0           ; if was -1
        !            88: 
        !            89:        beq.s   abc030          ; then flush everything
        !            90: 
        !            91:        addq.l  #2,d0           ; round up to long boundary
        !            92: 
        !            93:        lsr.l   #2,d0           ; convert to number of longs
        !            94: 
        !            95:        cmp.l   #64,d0
        !            96: 
        !            97:        bcs.s   fls030          ; dump selectively
        !            98: 
        !            99:        
        !           100: 
        !           101: abc030:        or.w    #$808,d1
        !           102: 
        !           103:        movec   d1,cacr
        !           104: 
        !           105:        bra.s   rescacr
        !           106: 
        !           107: 
        !           108: 
        !           109: fls030:        or.w    #$404,d1        ; clear DC/IC entries
        !           110: 
        !           111: ; run through d0+1 times (since a0 may not be on a long boundary)
        !           112: 
        !           113: do030: movec   a0,caar
        !           114: 
        !           115:        movec   d1,cacr
        !           116: 
        !           117:        addq.w  #4,a0
        !           118: 
        !           119:        dbf     d0,do030
        !           120: 
        !           121: rescacr:
        !           122: 
        !           123:        move.l  (a7)+,d0
        !           124: 
        !           125:        movec   d0,cacr
        !           126: 
        !           127: noc:   rts
        !           128: 
        !           129: 
        !           130: 
        !           131:        END
        !           132: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.