Annotation of researchv10no/sys/boot/star/uda.s, revision 1.1

1.1     ! root        1: #
        !             2: # fake boot ROM for star, UDA50
        !             3: #
        !             4: # read block 0 of some specified drive into memory,
        !             5: # and branch there, with registers set to point to
        !             6: # a device driver that can read other blocks.
        !             7: # register conventions a la the comet boot ROMs
        !             8: # we expect to be loaded at address 0xfa00,
        !             9: # and that we have 1024 bytes to squander there
        !            10: # (like the four comet ROMs)
        !            11: #
        !            12: # assume first UNIBUS adapter, default UDA address
        !            13: #
        !            14: 
        !            15: #
        !            16: # nautilus-specific defs
        !            17: #
        !            18:        .set    NMICSR,0x20080000       # nmi csrs -- device 0
        !            19:        .set    NMIto2,30               # 0x40000000; add to get device 1
        !            20:        .set    LOOP,0x10000            # csr0 loopback mode
        !            21: 
        !            22: #
        !            23: # DW780 defs
        !            24: #
        !            25: 
        !            26:        .set    MRV,0x80000000          # map register valid bit
        !            27: 
        !            28: #
        !            29: # UDA50 defs
        !            30: #
        !            31:        .set    IP,0                    # word -- ip reg
        !            32:        .set    SAR,2                   # word -- read version of sa reg
        !            33:        .set    SAW,2                   # word -- write version of sa
        !            34: 
        !            35:        .set    STEP0,10                # STEP1 == bit 11
        !            36: 
        !            37:        .set    BPOWN,31                # bit 31 == port owns descriptor
        !            38:        .set    RTOC,4
        !            39: 
        !            40: #
        !            41: # mscp defs
        !            42: # packet offsets have 4 added to account for UQSSP header (mostly length)
        !            43: #
        !            44: 
        !            45:        .set    m_crf,4                 # command ref number
        !            46:        .set    m_unit,8                # disk unit number
        !            47:        .set    m_opcd,12               # opcode
        !            48:        .set    m_sts,14                # status (word)
        !            49:        .set    RPKSIZE,16              # as much as we want on rcv
        !            50:        .set    m_bcnt,16               # byte count
        !            51:        .set    SOSIZE,20               # as much as we send for ONLINE
        !            52:        .set    m_buff,20               # buffer address
        !            53:        .set    m_lbn,32                # block number
        !            54:        .set    SRSIZE,36               # as much as we send to read
        !            55:        .set    SOSIZE,36               # as much as we send for ONLINE
        !            56: 
        !            57:        .set    OPONL,011               # unit online
        !            58:        .set    OPRD,041                # read block
        !            59: 
        !            60: #
        !            61: # boot ROM conventions
        !            62: #
        !            63:        .set    WMEM,0x200              # sp == some working memory + WMEM
        !            64:                                        # usually working memory == 0
        !            65:        .set    BSIZE,512               # size of a block
        !            66: 
        !            67: 
        !            68: ourstack:
        !            69:        .byte   'U,'D                   # ROM id (though we're not in a ROM)
        !            70: #
        !            71: # here to start off, at 0xfa02
        !            72: # registers:
        !            73: #      r1      adapter and controller number: 0xuc, u==unibus, c==uda50
        !            74: #      r2      uninteresting to us; we put register addr there
        !            75: #      r3      unit number: 0xacuu: unit uu, controller c, adapter a
        !            76: #      r5      boot flags; ignored but preserved
        !            77: #      sp      working memory + WMEM
        !            78: #
        !            79: # registers to save: r0 r1 r3 r5 r10 r11 ap sp
        !            80: #
        !            81: # assume the UNIBUS adapter is already OK
        !            82: # fill in the map for the first 64KB
        !            83: # (which means our ring phys addr == unibus addr)
        !            84: #
        !            85:        movl    sp,savesp
        !            86:        movab   ourstack,sp
        !            87:        extzv   $4,$4,r1,r2
        !            88:        movl    ubamap[r2],r7
        !            89:        clrl    r6
        !            90: 0:     bisl3   $MRV,r6,(r7)+
        !            91:        aobleq  $64*2,r6,0b
        !            92: 
        !            93: #
        !            94: # init the UDA50
        !            95: #
        !            96: 
        !            97:        extzv   $0,$4,r1,r7
        !            98:        movl    ubabase[r2],r2
        !            99:        addl2   udareg[r7],r2
        !           100:        clrw    IP(r2)          # kick into startup
        !           101: 0:     movw    SAR(r2),r7
        !           102:        blss    oops
        !           103:        bbc     $STEP0+1,r7,0b  # wait for step1
        !           104:        movw    $0x8000,SAW(r2) # no vector, ring size (2^0,2^0)
        !           105: 0:     movw    SAR(r2),r7
        !           106:        blss    oops
        !           107:        bbc     $STEP0+2,r7,0b  # wait for step2
        !           108:        movab   rsp,r6          # ring address
        !           109:        movw    r6,SAW(r2)
        !           110: 0:     movw    SAR(r2),r7
        !           111:        blss    oops
        !           112:        bbc     $STEP0+3,r7,0b  # wait for step3
        !           113:        ashl    $-16,r6,r6
        !           114:        movw    r6,SAW(r2)
        !           115: 0:     movw    SAR(r2),r7
        !           116:        blss    oops
        !           117:        bbc     $STEP0+4,r7,0b  # wait for step4
        !           118:        movw    $1,SAW(r2)      # GO
        !           119: 
        !           120: #
        !           121: # read block 0 into bottom of memory
        !           122: #
        !           123: 
        !           124:        pushl   r0              # rblk eats it
        !           125:        movab   rblk,r6         # set up device driver address
        !           126:        subl3   $WMEM,savesp,-(sp)      # physical addr
        !           127: # trick: we know driver doesn't use r5, so we needn't preserve boot flags
        !           128:        clrl    r8              # block 0
        !           129:        jsb     (r6)
        !           130:        blbc    r0,oops
        !           131:        tstl    (sp)+
        !           132:        movl    (sp)+,r0
        !           133: #
        !           134: # start boot block
        !           135: # registers now:
        !           136: #      r0      device type (unchanged)
        !           137: #      r1      adapter, controller (unchanged)
        !           138: #      r2      device register addr
        !           139: #      r3      device unit number (unchanged)
        !           140: #      r5      boot flags (unchanged)
        !           141: #      r6      address of our device driver
        !           142: #      sp      `working memory + 0x200' (unchanged)
        !           143: #
        !           144:        movl    savesp,sp
        !           145:        jmp     0xc-WMEM(sp)
        !           146: 
        !           147: #
        !           148: # here when something is broken
        !           149: #
        !           150: oops:  halt
        !           151: 
        !           152: #
        !           153: # device addresses
        !           154: #
        !           155: ubamap:        .long   0x20006800, 0x20008800  # map regs for UNIBUS adapters adapters
        !           156: ubabase:.long  0x20100000, 0x20140000  # UNIBUS space base addresses
        !           157: udareg:        .long   0772150, 0772160        # UDA50 addresses
        !           158: 
        !           159: #
        !           160: # device driver; called above and by boot block and friends
        !           161: #
        !           162: #      r2      device registers
        !           163: #      r3      device unit number
        !           164: #      r5      buffer address, relative to `working memory' (ignored)
        !           165: #      4(sp)   physical buffer address; we use that
        !           166: #      r8      block number
        !           167: #
        !           168: # do not destroy r1-r6 r10 r11 ap
        !           169: # on return, low bit of r0 set if we read it, clear if we failed
        !           170: #
        !           171: # always bring disk online, even if already is
        !           172: #
        !           173: 
        !           174: rblk:
        !           175:        movq    r10,-(sp)
        !           176:        clrl    r0                      # assume failure
        !           177:        movab   cp,r10
        !           178:        movab   rp,r11
        !           179:        movab   rsp,r9
        !           180:        movl    r3,m_unit(r10)          # make ONLINE packet
        !           181:        movzbl  $OPONL,m_opcd(r10)
        !           182:        movzbl  $SOSIZE,(r10)
        !           183:        clrl    m_bcnt(r10)             # ugh
        !           184:        clrl    m_buff(r10)             # ugh
        !           185:        clrl    m_lbn(r10)              # ugh
        !           186:        bsbb    sendrcv
        !           187:        bneq    rfail
        !           188:        movzbl  $OPRD,m_opcd(r10)       # now make READ packet
        !           189:        movl    4+8(sp),m_buff(r10)     # unmapped address
        !           190:        movzwl  $BSIZE,m_bcnt(r10)
        !           191:        movl    r8,m_lbn(r10)
        !           192:        movzbl  $SRSIZE,(r10)
        !           193:        bsbb    sendrcv
        !           194:        bneq    rfail
        !           195:        incl    r0                      # success
        !           196: rfail: movq    (sp)+,r10
        !           197:        rsb
        !           198: 
        !           199: sendrcv:
        !           200:        movzbl  $RPKSIZE,(r11)
        !           201:        movab   m_crf(r10),RTOC(r9)
        !           202:        movab   m_crf(r11),(r9)
        !           203:        bbss    $BPOWN,(r9),0f          # make response buffer available
        !           204: 0:     bbss    $BPOWN,RTOC(r9),0f      # send the ONLINE packet
        !           205: 0:     movw    IP(r2),r7               # kick to make it go
        !           206: 0:     bbs     $BPOWN,(r9),0b          # wait for answer
        !           207:        tstb    m_sts(r11)              # tstb: ignore `already online' flag
        !           208:        rsb
        !           209: 
        !           210: #
        !           211: # UDA50 communication area
        !           212: #
        !           213:        .align  2
        !           214: savesp:        .space  4               # working mem + WMEM
        !           215:        .space  8               # crap at the top
        !           216: rsp:   .space  4               # response descriptor
        !           217:        .space  4               # command descriptor
        !           218: 
        !           219: #
        !           220: # a pair of packets
        !           221: # +4 for length
        !           222: #
        !           223: 
        !           224: cp:    .space  SRSIZE+4        # command packet
        !           225: 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.