Annotation of coherent/d/PS2_KERNEL/io.286/ssas.s, revision 1.1

1.1     ! root        1: ////////
        !             2: /
        !             3: / I/O for Seagate ST01/ST02 SCSI Host Adapters.
        !             4: /
        !             5: / $Log:        ssas.s,v $
        !             6: / Revision 1.1  92/07/17  15:24:48  bin
        !             7: / Initial revision
        !             8: /
        !             9: / Revision 1.7  91/06/01  10:51:00  hal
        !            10: / Add ffcopy().
        !            11: / 
        !            12: / Revision 1.6  91/06/01  10:32:51  hal
        !            13: / Do handshaking both ways.  Now names are ss_getb()/ss_putb().
        !            14: / 
        !            15: / Revision 1.5 91/05/20  17:22:03      root
        !            16: / Not using ss_put() any more.
        !            17: / 
        !            18: / Revision 1.4 91/05/20  16:21:35      root
        !            19: / Call to ss_putc() now works.
        !            20: / 
        !            21: / Revision 1.3 91/05/20  10:23:13      root
        !            22: / Drop 3rd arg.  Same code for Seagate & Future Domain.
        !            23: / 
        !            24: / Revision 1.2 91/05/17  00:24:17      root
        !            25: / Code ss_put - use REQ handshake.
        !            26: / 
        !            27: / Revision 1.1 91/05/16  14:16:21      root
        !            28: / Initial version - no code yet for ss_put().
        !            29: / 
        !            30: /
        !            31: /      Since these functions are called from the midst of C code in
        !            32: /      the "ss" driver, they need to preserve the following registers:
        !            33: /              SI  DI  SP  BP    SS  DS  ES
        !            34: /      Additionally, surrounding C code is expected to leave the "D"
        !            35: /      CPU flag clear (string op's increment index registers).
        !            36: /
        !            37: ////////
        !            38: 
        !            39: ////////
        !            40: /
        !            41: /      Export functions.
        !            42: /
        !            43: ////////
        !            44:        .globl  ss_getb_
        !            45:        .globl  ss_putb_
        !            46:        .globl  ffcopy_
        !            47: 
        !            48: ////////
        !            49: /
        !            50: / Constants
        !            51: /
        !            52: /      Relative to the RAM base address of the host adapter, offsets
        !            53: /      for Control/Status Register (CSR) and Data Port (DAT) differ
        !            54: /      between Seagate and Future Domain as follows:
        !            55: /                      Seagate         Future Domain
        !            56: /              SS_CSR  0x1A00          0x1C00
        !            57: /              SS_DAT  0x1C00          0x1E00
        !            58: /      The difference between these (CSR_OFF) is 0x200 in either case.
        !            59: /
        !            60: ////////
        !            61: 
        !            62:        BSIZE   = 0x200         / Disk block size in bytes
        !            63:        CSR_OFF = 0x200
        !            64: 
        !            65:        REQ_LIM = 500
        !            66:        RS_REQUEST = 0x10
        !            67: 
        !            68: ////////
        !            69: /
        !            70: / ss_getb(ss_dat_fp, buf_fp)
        !            71: / faddr_t ss_dat_fp, buf_fp;
        !            72: /
        !            73: / Fetch input bytes from host adapter and store at buffer address.
        !            74: /
        !            75: / Do REQ handshaking and return the number of bytes remaining to transfer.
        !            76: / (So return value of 0 means no error.)
        !            77: /
        !            78: / Here is the stack after initial "push bp":
        !            79: /
        !            80: /      10(bp)  FP_SEL(buf_fp)
        !            81: /      8(bp)   FP_OFF(buf_fp)
        !            82: /      6(bp)   FP_SEL(ss_dat_fp)
        !            83: /      4(bp)   FP_OFF(ss_dat_fp)
        !            84: /      2(bp)   return IP
        !            85: /      0(bp)   old bp
        !            86: /
        !            87: ////////
        !            88: 
        !            89: ss_getb_:
        !            90:        push    bp
        !            91:        mov     bp, sp
        !            92:        push    es
        !            93:        push    di
        !            94:        push    ds
        !            95:        push    si
        !            96: 
        !            97:        lds     si, 4(bp)       / ss_dat_fp to DS:SI
        !            98:        mov     bx, si          / .. and to DS:BX
        !            99:        sub     bx, $CSR_OFF    / ss_csr to DS:BX
        !           100:        les     di, 8(bp)       / buf_fp to ES:DI
        !           101:        mov     cx, $BSIZE      / rep count to CX
        !           102: 
        !           103: G01:                           / start outer loop - reading bytes from SCSI
        !           104:        mov     ax, $REQ_LIM    / max # of times to look for REQ
        !           105: G02:                           / start inner loop - polling for REQ
        !           106:        movb    dl, (bx)
        !           107:        testb   dl, $RS_REQUEST
        !           108:        jne     G03             / got REQ
        !           109:        dec     ax
        !           110:        jnz     G02             / no REQ - look again
        !           111:        jmp     G04             / no REQ - give up
        !           112: 
        !           113: G03:                           / got REQ - ok to read a byte
        !           114:        movsb
        !           115:        loop    G01
        !           116: G04:                           / all done
        !           117:        mov     ax, cx          / normal exit returns 0
        !           118: 
        !           119:        pop     si
        !           120:        pop     ds
        !           121:        pop     di
        !           122:        pop     es
        !           123:        pop     bp
        !           124:        ret
        !           125: 
        !           126: ////////
        !           127: /
        !           128: / int ss_putb(ss_dat_fp, buf_fp)
        !           129: / faddr_t ss_dat_fp, buf_fp;
        !           130: /
        !           131: / Write output bytes to host adapter from buffer address.
        !           132: /
        !           133: / Return the number of bytes remaining to be sent (should be 0).
        !           134: /
        !           135: / Here is the stack after initial "push bp":
        !           136: /
        !           137: /      10(bp)  FP_SEL(buf_fp)
        !           138: /      8(bp)   FP_OFF(buf_fp)
        !           139: /      6(bp)   FP_SEL(ss_dat_fp)
        !           140: /      4(bp)   FP_OFF(ss_dat_fp)
        !           141: /      2(bp)   return IP
        !           142: /      0(bp)   old bp
        !           143: /
        !           144: ////////
        !           145: 
        !           146: ss_putb_:
        !           147:        push    bp
        !           148:        mov     bp, sp
        !           149:        push    es
        !           150:        push    di
        !           151:        push    ds
        !           152:        push    si 
        !           153:        lds     si, 8(bp)       / buf_fp to DS:SI
        !           154:        les     di, 4(bp)       / ss_dat_fp  to ES:DI
        !           155:        mov     bx, di          / .. and to ES:BX
        !           156:        sub     bx, $CSR_OFF    / ss_csr to ES:BX
        !           157:        mov     cx, $BSIZE      / count to CX
        !           158: 
        !           159: P01:                           / start outer loop - writing bytes to SCSI
        !           160:        mov     ax, $REQ_LIM    / max # of times to look for REQ
        !           161: P02:                           / start inner loop - polling for REQ
        !           162:        movb    dl, es:(bx)
        !           163:        testb   dl, $RS_REQUEST
        !           164:        jne     P03             / got REQ
        !           165:        dec     ax
        !           166:        jnz     P02             / no REQ - look again
        !           167:        jmp     P04             / no REQ - give up
        !           168: 
        !           169: P03:                           / got REQ - ok to write a byte
        !           170:        movsb
        !           171:        loop    P01
        !           172: P04:                           / all done - now restore registers
        !           173:        mov     ax, cx
        !           174:        pop     si
        !           175:        pop     ds
        !           176:        pop     di
        !           177:        pop     es
        !           178:        pop     bp
        !           179:        ret
        !           180: 
        !           181: ////////
        !           182: /
        !           183: / void ffcopy(from_fp, to_fp, count)
        !           184: / faddr_t from_fp, to_fp;
        !           185: / int count;
        !           186: /
        !           187: / Copy count bytes from from_fp to to_fp.
        !           188: /
        !           189: / Here is the stack after initial "push bp":
        !           190: /
        !           191: /      12(bp)  count
        !           192: /      10(bp)  FP_SEL(to_fp)
        !           193: /      8(bp)   FP_OFF(to_fp)
        !           194: /      6(bp)   FP_SEL(from_fp)
        !           195: /      4(bp)   FP_OFF(from_fp)
        !           196: /      2(bp)   return IP
        !           197: /      0(bp)   old bp
        !           198: /
        !           199: ////////
        !           200: 
        !           201: ffcopy_:
        !           202:        push    bp
        !           203:        mov     bp, sp
        !           204:        push    es
        !           205:        push    di
        !           206:        push    ds
        !           207:        push    si
        !           208: 
        !           209:        lds     si, 4(bp)       / from_fp  to DS:SI
        !           210:        les     di, 8(bp)       / to_fp to ES:DI
        !           211:        mov     cx, 12(bp)      / rep count to CX
        !           212:        rep
        !           213:        movsb
        !           214: 
        !           215:        pop     si
        !           216:        pop     ds
        !           217:        pop     di
        !           218:        pop     es
        !           219:        pop     bp
        !           220:        ret

unix.superglobalmegacorp.com

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