Annotation of researchv10dc/sys/boot/uvax/mscp.s, revision 1.1

1.1     ! root        1: #
        !             2: # fake boot ROM for MicroVAX, UQSSP/MSCP disk
        !             3: # read boot block into memory,
        !             4: # and call it with parameters pointing to and used by
        !             5: # a device driver
        !             6: #
        !             7: # the MicroVAX ROM actually has horrible VMB in it.
        !             8: # this code is stuck in block 0,
        !             9: # with a header VMB will recognize.
        !            10: # the boot block is put in block 1.
        !            11: # VMB reads block 0;
        !            12: # the header tells it to read block 0 (sic);
        !            13: # code packaged in uvhdr.s relocates us to the
        !            14: # standard ROM address, moves VMB's parameters into
        !            15: # our standard places, and calls us.
        !            16: #
        !            17: 
        !            18: #
        !            19: # KDA50 defs
        !            20: #
        !            21:        .set    IP,0x0          # ip register
        !            22:        .set    SA,0x2          # sa register
        !            23: 
        !            24:        .set    STEP0,10                # STEP1 == bit 11
        !            25: 
        !            26:        .set    BPOWN,31                # bit 31 == port owns descriptor
        !            27:        .set    RTOC,4
        !            28: 
        !            29: #
        !            30: # mscp defs
        !            31: # packet offsets have 4 added to account for UQSSP header (mostly length)
        !            32: #
        !            33: 
        !            34:        .set    m_crf,4                 # command ref number
        !            35:        .set    m_unit,8                # disk unit number
        !            36:        .set    m_opcd,12               # opcode
        !            37:        .set    m_sts,14                # status (word)
        !            38:        .set    RPKSIZE,16              # as much as we want on rcv
        !            39:        .set    m_bcnt,16               # byte count
        !            40:        .set    SOSIZE,20               # as much as we send for ONLINE
        !            41:        .set    m_buff,20               # buffer address
        !            42:        .set    m_lbn,32                # block number
        !            43:        .set    SRSIZE,36               # as much as we send to read
        !            44:        .set    SOSIZE,36               # as much as we send for ONLINE
        !            45: 
        !            46:        .set    OPONL,011               # unit online
        !            47:        .set    OPRD,041                # read block
        !            48: 
        !            49: #
        !            50: # MicroVAX Q-bus defs
        !            51: #
        !            52:        .set    LMEAE,040               # bit to allow DMA from Q-bus
        !            53:        .set    ICR,0x20001f40          # where to set it
        !            54: 
        !            55: #
        !            56: # boot ROM conventions
        !            57: #
        !            58:        .set    WMEM,0x200              # sp == some working memory + WMEM
        !            59:                                        # usually working memory == 0
        !            60:        .set    BSIZE,512               # size of a block
        !            61:        .set    BBLOCK,1                # boot LBN
        !            62: 
        !            63: ourstack:
        !            64: #
        !            65: # here to start off, at 0xfa02
        !            66: # registers:
        !            67: #      r2      device register address
        !            68: #      r3      unit number
        !            69: #      r5      boot flags; ignored but preserved
        !            70: #      sp      working memory + WMEM
        !            71: #
        !            72: # registers to save: r0 r1 r3 r5 r10 r11 ap sp
        !            73: #
        !            74: rombegin:
        !            75:        movl    sp,savesp
        !            76:        movab   ourstack,sp
        !            77: 
        !            78: #
        !            79: # init the KDA50
        !            80: #
        !            81: 
        !            82:        bisw2   $LMEAE,*$ICR    # enable dma
        !            83:        clrw    IP(r2)          # reset: kick into startup
        !            84: 0:     movw    SA(r2),r7
        !            85:        blss    oops
        !            86:        bbc     $STEP0+1,r7,0b  # wait for step1
        !            87:        movw    $0x8000,SA(r2)  # no vector, ring size (2^0,2^0)
        !            88: 0:     movw    SA(r2),r7
        !            89:        blss    oops
        !            90:        bbc     $STEP0+2,r7,0b  # wait for step2
        !            91:        movab   rsp,r6          # ring address
        !            92:        movw    r6,SA(r2)
        !            93: 0:     movw    SA(r2),r7
        !            94:        blss    oops
        !            95:        bbc     $STEP0+3,r7,0b  # wait for step3
        !            96:        ashl    $-16,r6,r6
        !            97:        movw    r6,SA(r2)
        !            98: 0:     movw    SA(r2),r7
        !            99:        blss    oops
        !           100:        bbc     $STEP0+4,r7,0b  # wait for step4
        !           101:        movw    $1,SA(r2)       # GO
        !           102: 
        !           103: #
        !           104: # read boot block into bottom of memory
        !           105: #
        !           106: 
        !           107:        pushl   r0              # rblk eats it
        !           108:        movab   rblk,r6         # set up device driver address
        !           109:        subl3   $WMEM,savesp,-(sp)      # physical addr
        !           110: # trick: we know driver doesn't use r5, so we needn't save boot flags
        !           111:        movl    $BBLOCK,r8
        !           112:        jsb     (r6)
        !           113:        blbc    r0,oops
        !           114:        tstl    (sp)+
        !           115:        movl    (sp)+,r0
        !           116: #
        !           117: # start boot block
        !           118: # registers now:
        !           119: #      r0      device type (unchanged)
        !           120: #      r1      BI node number (unchanged)
        !           121: #      r2      device register addr
        !           122: #      r3      device unit number (unchanged)
        !           123: #      r5      boot flags (unchanged)
        !           124: #      r6      address of our device driver
        !           125: #      sp      `working memory + 0x200' (unchanged)
        !           126: #
        !           127:        movl    savesp,sp
        !           128:        jmp     0xc-WMEM(sp)
        !           129: 
        !           130: #
        !           131: # here when something is broken
        !           132: #
        !           133: oops:  halt
        !           134: 
        !           135: #
        !           136: # device driver; called above and by boot block and friends
        !           137: #
        !           138: #      r2      device registers
        !           139: #      r3      device unit number
        !           140: #      r5      buffer address, relative to `working memory' (ignored)
        !           141: #      4(sp)   physical buffer address; we use that
        !           142: #      r8      block number
        !           143: #
        !           144: # do not destroy r1-r6 r10 r11 ap
        !           145: # on return, low bit of r0 set if we read it, clear if we failed
        !           146: #
        !           147: 
        !           148: rblk:
        !           149:        movq    r10,-(sp)
        !           150:        clrl    r0                      # assume failure
        !           151:        movab   cp,r10
        !           152:        movab   rp,r11
        !           153:        movab   rsp,r9
        !           154:        movzbl  $OPRD,m_opcd(r10)       # make READ packet
        !           155:        movl    4+8(sp),m_buff(r10)     # unmapped address
        !           156:        movzwl  $BSIZE,m_bcnt(r10)
        !           157:        movl    r8,m_lbn(r10)
        !           158:        movzbl  $SRSIZE,(r10)
        !           159:        bsbb    sendrcv
        !           160:        beql    rdone
        !           161:        movl    r3,m_unit(r10)          # didn't work; make ONLINE packet
        !           162:        movzbl  $OPONL,m_opcd(r10)
        !           163:        movzbl  $SOSIZE,(r10)
        !           164:        clrl    m_bcnt(r10)             # ugh
        !           165:        clrl    m_buff(r10)             # ugh
        !           166:        clrl    m_lbn(r10)              # ugh
        !           167:        bsbb    sendrcv
        !           168:        bneq    rfail
        !           169:        movzbl  $OPRD,m_opcd(r10)       # and try read again
        !           170:        movl    4+8(sp),m_buff(r10)
        !           171:        movzwl  $BSIZE,m_bcnt(r10)
        !           172:        movl    r8,m_lbn(r10)
        !           173:        movzbl  $SRSIZE,(r10)
        !           174:        bsbb    sendrcv
        !           175:        bneq    rfail
        !           176: rdone: incl    r0                      # success
        !           177: rfail: movq    (sp)+,r10
        !           178:        rsb
        !           179: 
        !           180: sendrcv:
        !           181:        movzbl  $RPKSIZE,(r11)
        !           182:        movab   m_crf(r10),RTOC(r9)
        !           183:        movab   m_crf(r11),(r9)
        !           184:        bbss    $BPOWN,(r9),0f          # make response buffer available
        !           185: 0:     bbss    $BPOWN,RTOC(r9),0f      # send the ONLINE packet
        !           186: 0:     movw    IP(r2),r7               # kick to make it go
        !           187: 0:     bbs     $BPOWN,(r9),0b          # wait for answer
        !           188:        tstb    m_sts(r11)              # tstb: ignore `already online' flag
        !           189:        rsb
        !           190: 
        !           191: #
        !           192: # KDB50 communication area
        !           193: #
        !           194:        .align  2
        !           195: savesp:        .space  4               # working mem + WMEM
        !           196:        .space  8               # crap at the top
        !           197: rsp:   .space  4               # response descriptor
        !           198:        .space  4               # command descriptor
        !           199: 
        !           200: #
        !           201: # a pair of packets
        !           202: # +4 for length
        !           203: #
        !           204: 
        !           205: cp:    .space  SRSIZE+4        # command packet
        !           206: rp:    .space  RPKSIZE+4       # response packet

unix.superglobalmegacorp.com

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