Annotation of researchv10dc/sys/boot/star/uda.s, revision 1.1.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.