Annotation of researchv10no/sys/boot/star/hp.s, revision 1.1.1.1

1.1       root        1: #
                      2: # pseudo-boot-rom for MASSBUS SMD disks on the star
                      3: #
                      4: 
                      5: #
                      6: # massbus adapter stuff
                      7: #
                      8: 
                      9:        .set    MBASR, 8                # mba status
                     10:        .set    MBAVAD, 12              # mba virtual address
                     11:        .set    MBABCR, 16              # mba byte count
                     12:        .set    MBAREG, 0x400           # start of external registers
                     13:        .set    MBAMAP, 0x800           # start of mapping regs
                     14: 
                     15:        .set    REGSIZ, 32*4            # size of register space per unit
                     16: 
                     17:        .set    V_B, 31                 # bit number of `valid' in map reg
                     18: 
                     19:        .set    MBBUSY_B, 31            # `busy' bit in mbasr
                     20:        .set    MBERR, 0x1000           # error bits in mbasr
                     21: 
                     22: #
                     23: # rm controller stuff
                     24: #
                     25: 
                     26: #
                     27: # register offsets
                     28: #
                     29:        .set    HPCS1, 0                # control/status 1
                     30:        .set    HPDS, 4                 # driver status
                     31:        .set    HPDA, 20                # sector & track
                     32:        .set    HPDT, 24                # driver type
                     33:        .set    HPSN, 32                # serial number
                     34:        .set    HPOF, 36                # offset
                     35:        .set    HPDC, 40                # cylinder
                     36: 
                     37: #
                     38: # useful bits in various registers
                     39: #
                     40:        .set    PRESET, 021             # read in preset
                     41:        .set    PACKACK, 023            # pack acknowledge
                     42:        .set    READ, 071               # read
                     43: 
                     44:        .set    FMT22, 010000           # pdp11 format
                     45: 
                     46: #
                     47: # vax stuff
                     48: #
                     49: 
                     50:        .set    PGSIZ, 512              # size of a page/disk sector
                     51: 
                     52: #
                     53: # bootstrap stuff
                     54: #
                     55: 
                     56:        .set    BOOT, 0xc               # start address in boot block
                     57:        .set    TYPE, 0                 # device type; 0 == massbus
                     58:        .set    SSIZE, 0x20             # stack space needed
                     59: 
                     60: #
                     61: # initial bootstrap
                     62: # read boot block,
                     63: # set up regs for it
                     64: # and jump there
                     65: #
                     66: # start:
                     67: #      r1 = mba address
                     68: #      r2 = rubbish
                     69: #      r3 = device unit number, assumed == mba controller number
                     70: # assume sp == 0x200, ie first 64K of memory are good
                     71: #
                     72: # finish:
                     73: #      r3, r5, r10, r11, ap, sp as when started
                     74: #      r0 == type of boot device
                     75: #      r1 == mba address still
                     76: #      r2 == controller number
                     77: #      r3 == unit number
                     78: #      r5 == software flags
                     79: #      r6 == address of our driver
                     80: #      sp == 0x200 again
                     81: #
                     82: 
                     83:        .byte   'P, 'H                  # device type for rom
                     84: boot:
                     85:        addl2   $SSIZE,sp       # move stack away from boot block
                     86:        movab   driver,r6
                     87:        movl    r3,r2           # unit == controller (??)
                     88:        mull3   $REGSIZ,r2,r7
                     89:        addl2   $MBAREG,r7
                     90:        addl2   r1,r7           # r7 = address of device registers
                     91:        movzbl  $PRESET,HPCS1(r7)       # pack acknowledge
                     92:        movzwl  $FMT22,HPOF(r7)         # pdp-11 format
                     93: 
                     94:        clrl    r8              # read block 0
                     95:        clrl    -(sp)           # onto physadr 0
                     96:        jsb     (r6)            # call our driver
                     97: bbad:  blbc    r0,bbad         # hang if error
                     98:        movl    $TYPE,r0        # ok, get device type
                     99:        subl2   $SSIZE-4,sp     # fix up sp
                    100:        jmp     *$BOOT          # and run boot block
                    101: 
                    102: #
                    103: # table of device types:
                    104: # each a longword of
                    105: # (byte) type, (byte) sectors per track, (word) sectors per cylinder
                    106: # table is reversed for hackish reasons
                    107: #
                    108:        .long   0
                    109:        .byte   024, 32; .word 32*5     # RM03
                    110:        .byte   027, 32; .word 32*19    # RM05
                    111:        .byte   022, 22; .word 22*19    # RP06
                    112:        .byte   021, 22; .word 22*19    # RP05
                    113:        .byte   042, 50; .word 50*32    # RP07
                    114: typtab:
                    115: # fuji/emulex drives left out on purpose for now;
                    116: # not worth the extra code till someone has one
                    117: 
                    118: #
                    119: # driver subroutine
                    120: # read one block into a specified place
                    121: # args:
                    122: #      r1 == mba address
                    123: #      r2 == controller number within mba
                    124: #      r3 == unit number (usually == r2)
                    125: #      r5 == offset from beginning of memory; ignored
                    126: #      r6 == our address
                    127: #      r8 == desired block number
                    128: #      4(sp) == physical address to read to
                    129: #
                    130: # preserve r1-r6 r10 r11 ap sp
                    131: #
                    132: 
                    133: driver:
                    134:        mull3   $REGSIZ,r2,r7           # compute device addr
                    135:        addl2   $MBAREG,r7
                    136:        addl2   r1,r7
                    137:        movzbl  $PACKACK,HPCS1(r7)      # just in case
                    138:        moval   typtab,r9
                    139: 0:     tstl    -(r9)
                    140:        bneq    1f
                    141:         rsb
                    142: 1:     movl    HPDT(r7),r0
                    143:        cmpb    r0,(r9)                 # compare types
                    144:        bneq    0b
                    145:        extzv   $8,$8,(r9),-(sp)        # sec per track
                    146:        extzv   $16,$16,(r9),-(sp)      # sec per cyl
                    147:        clrl    r9                      # make r8+r9 == quadword block number
                    148:        ediv    (sp)+,r8,HPDC(r7),r8    # r8 == offset in cyl; da == cyl
                    149:        ediv    (sp)+,r8,r9,r8          # r8 == sect; r9 == track
                    150:        insv    r9,$8,$8,r8             # high part of r8 == track
                    151:        movl    r8,HPDA(r7)
                    152:        divl3   $PGSIZ,4(sp),r9         # get phys page number
                    153:        bbss    $V_B,r9,0f              # make map reg contents
                    154: 0:     movl    r9,MBAMAP(r1)           # set up map
                    155:        addl3   $1,r9,MBAMAP+4(r1)      # in case page unaligned
                    156:        bicl3   $~(PGSIZ-1),4(sp),MBAVAD(r1)    # offset within page
                    157:        movzwl  $-PGSIZ,MBABCR(r1)      # byte count
                    158:        mnegl   $1,MBASR(r1)            # clear error bits
                    159:        movzbl  $READ,HPCS1(r7)         # start xfer
                    160: 1:
                    161:        movl    MBASR(r1),r9
                    162:        bbs     $MBBUSY_B,r9,1b         # spin until not busy
                    163:        clrl    r0                      # assume bad
                    164:        bitl    $MBERR,r9               # any error bits?
                    165:        bneq    2f                      # yep
                    166:         incl   r0                      # no, remember ok
                    167: 2:     rsb

unix.superglobalmegacorp.com

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