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