Annotation of cci/d/io/rtclk.s, revision 1.1.1.1

1.1       root        1: 
                      2: /*     privileged registers constants (addresses)                      */
                      3: 
                      4: 
                      5: 
                      6:        .set    SBR,0                   /*system base register          */
                      7:        .set    SLR,1                   /*system length reg             */
                      8:        .set    P0BR,2                  /*p0 base reg                   */
                      9:        .set    P0LR,3                  /*p0 length reg                 */
                     10:        .set    P1BR,4                  /*p1 base reg                   */
                     11:        .set    P1LR,5                  /*p1 length reg                 */
                     12:        .set    P2BR,6                  /*p2 base reg                   */
                     13:        .set    P2LR,7                  /*p2 length reg                 */
                     14:        .set    IPL,8                   /*int priority level reg        */
                     15:        .set    MME,9                   /*memory mgmt enable reg        */
                     16:        .set    TBIA,10                 /*trans buf invalidate all      */
                     17:                                        /*entries                       */
                     18:        .set    TBIS,11                 /*trans buf invalidate single   */
                     19:                                        /*entry                         */
                     20:        .set    DCK,12                  /*data cache key                */
                     21:        .set    CCK,13                  /*code cache key                */
                     22:        .set    PCBB,14                 /*process control block base    */
                     23:        .set    ISP,15                  /*interrupt stack pointer       */
                     24:        .set    PSL,22                  /* program status longword      */
                     25:        .set    SIRR,16                 /*software int request reg      */
                     26:        .set    SISR,17                 /*software int summary reg      */
                     27:        .set    SCBB,18                 /*system control block base reg */
                     28:        .set    KSP,19                  /*kernel stack pointer reg      */
                     29:        .set    USP,20                  /*user stack pointer            */
                     30:        .set    P1CC,21                 /*purge (invalidate) one page   */
                     31:                                        /*of code cache                 */
                     32:        .set    PACC,23                 /*purge (invalidate) all pages  */
                     33:                                        /*of process in code cache      */
                     34:        .set    P1DC,24                 /*purge one page of data cache  */
                     35:        .set    PADC,25                 /*purge all the pages of        */
                     36:                                        /*process in data cache         */
                     37:        .set    HISR,26                 /* Hardware interrupt summary reg  */
                     38: 
                     39:        
                     40: 
                     41:        .set    PSL_C,0x00000001        /* carry bit */
                     42:        .set    PSL_V,0x00000002        /* overflow bit */
                     43:        .set    PSL_Z,0x00000004        /* zero bit */
                     44:        .set    Z,0x00000004
                     45:        .set    PSL_N,0x00000008        /* negative bit */
                     46:        .set    PSL_T,0x00000010        /* trace enable bit */
                     47:        .set    PSL_I,0x00000020        /* integer overflow enable bit */
                     48:        .set    PSL_IPL,0x001f0000      /* interrupt priority level */
                     49:        .set    PSL_MOD,0x01000000      /* mode = 1 means user*/
                     50:        .set    PSL_IS,0x04000000       /* interrupt stack */
                     51:        .set    PSL_TP,0x40000000       /* trace pending */
                     52: 
                     53:        .set    PG_V,0x80000000
                     54:        .set    PG_PROT,0x78000000
                     55:        .set    PG_M,0x04000000
                     56:        .set    PG_USED,0x02000000
                     57:        .set    PG_NC,0x01000000
                     58:        .set    PG_PFNUM,0x003fffff
                     59: 
                     60:        .set    PG_NOACC,0
                     61:        .set    PG_KR,0x40000000
                     62:        .set    PG_KW,0x60000000
                     63:        .set    PG_URKR,0x50000000
                     64:        .set    PG_URKW,0x70000000
                     65:        .set    PG_UW,0x78000000
                     66: 
                     67: /*     PCB offsets & diagnostic extension to pcb                       */
                     68: 
                     69:        
                     70:        .set    PCB_KSP,        0
                     71:        .set    PCB_USP,        4
                     72:        .set    PCB_R0,         8
                     73:        .set    PCB_R1,         12
                     74:        .set    PCB_R2,         16
                     75:        .set    PCB_R3,         20
                     76:        .set    PCB_R4,         24
                     77:        .set    PCB_R5,         28
                     78:        .set    PCB_R6,         32
                     79:        .set    PCB_R7,         36
                     80:        .set    PCB_R8,         40
                     81:        .set    PCB_R9,         44
                     82:        .set    PCB_R10,        48
                     83:        .set    PCB_R11,        52
                     84:        .set    PCB_R12,        56
                     85:        .set    PCB_R13,        60
                     86:        .set    PCB_PC,         64
                     87:        .set    PCB_PSL,        68
                     88:        .set    PCB_P0BR,       72
                     89:        .set    PCB_P0LR,       76
                     90:        .set    PCB_P1BR,       80
                     91:        .set    PCB_P1LR,       84
                     92:        .set    PCB_P2BR,       88
                     93:        .set    PCB_P2LR,       92
                     94:        .set    PCB_STAT,       96      /*process status,statistics,id,etc*/
                     95: 
                     96: 
                     97: 
                     98: /*     fundamental constants                                           */
                     99: 
                    100: 
                    101:        .set    NBPG,1024
                    102:        .set    PGOFSET,(NBPG-1)        /* byte offset into page */
                    103:        .set    PGSHIFT,10              /* LOG2(NBPG) */
                    104:        .set    HIGH,0x1f
                    105:        .set    PAGE,1024
                    106: 
                    107: 
                    108: /*     SCB offsets                                                     */
                    109: 
                    110:        .set    PFVEC,4                 /*power fail                    */
                    111:        .set    CLOCKVEC,28             /*hard clock vector             */
                    112:        .set    CRVEC,40                /*console receive               */
                    113:        .set    CXVEC,44                /*console transmit              */
                    114:        .set    SIVEC1,120              /*software int vec #1           */
                    115:                                        /*for 2,3,..15, sub 4,8,.. 56   */
                    116:                                        /*from SIVEC1                   */      
                    117:        .set    BEVEC,128               /*bus error                     */      
                    118:        .set    SYSVEC,172              /*system call (kcall)           */
                    119:        .set    PINSTVEC,176            /*privileged instruction fault  */
                    120:        .set    ROVEC,180               /*reserved operand fault        */
                    121:        .set    RAVEC,184               /*reserved addressing fault     */
                    122:        .set    PROTVEC,188             /*access control violation      */
                    123:        .set    TRANSVEC,192            /*translation fault vector      */
                    124:        .set    KSPVEC,196              /*kernel stack not valid vector */
                    125:        .set    TRACEVEC,200            /*trace vector                  */
                    126:        .set    BPTVEC,204              /*break point fault             */
                    127:        .set    ARITHVEC,208            /*arithmetic trap               */
                    128:        .set    ALIGNVEC,212            /*alignment vector              */      
                    129:        .set    IO14VEC,256             /*io vector, ipl #14            */
                    130:        .set    IO15VEC,320             /*io vector, ipl #15            */
                    131:        .set    IO16VEC,384             /*io vector, ipl #16            */
                    132:        .set    IO17VEC,448             /*io vector, ipl #17            */
                    133: 
                    134: /*     SPT (system page table) offsets                                 */
                    135: 
                    136:        .set    SCBPTE,8                /*system control block pte offset*/
                    137:        .set    BUFPTE,12               /*buffer pte offset             */
                    138:        .set    ISPTE,16                /*interrupt stack page 0        */
                    139:        .set    IS1PTE,20               /*interrupt stack page 1        */
                    140:        .set    SPTPTE,20               /*system page table page 1      */
                    141:        .set    SPT1PTE,20              /*system page table page 2      */
                    142:        .set    IOMAPPTE,24             /*io map                        */
                    143:        .set    PCBPTE,28               /*process control blocks pte    */
                    144:        .set    U0P0PTE,32              /*U0 p0pt pte                   */
                    145:        .set    U0P1PTE,36              /*U0 p1pt pte                   */
                    146:        .set    U0P2PTE,40              /*U0 p2pt pte                   */
                    147:        .set    U1P0PTE,44
                    148:        .set    U1P1PTE,48
                    149:        .set    U1P2PTE,52
                    150:        .set    U2P0PTE,56
                    151:        .set    U2P1PTE,60
                    152:        .set    U2P2PTE,64
                    153:        .set    U3P0PTE,68
                    154:        .set    U3P1PTE,72
                    155:        .set    U3P2PTE,76
                    156:        .set    U4P0PTE,80
                    157:        .set    U4P1PTE,84
                    158:        .set    U4P2PTE,88
                    159:        .set    U5P0PTE,92
                    160:        .set    U5P1PTE,96
                    161:        .set    U5P2PTE,100
                    162:        .set    U6P0PTE,104
                    163:        .set    U6P1PTE,108
                    164:        .set    U6P2PTE,112
                    165:        .set    U7P0PTE,116             /*U7 p0pt pte                   */
                    166:        .set    U7P1PTE,120             /*U7 p1pt pte                   */
                    167:        .set    U7P2PTE,124             /*U7 p2pt pte                   */
                    168:        .set    IOB0PTE,128             /*io buffer 0 pte               */
                    169:        .set    IOB1PTE,132
                    170:        .set    IOB2PTE,136
                    171:        .set    IOB3PTE,140
                    172:        .set    IOB4PTE,144
                    173:        .set    IOB5PTE,148
                    174:        .set    IOB6PTE,152
                    175:        .set    IOB7PTE,156             /*io buffer 7 pte               */
                    176: 
                    177: 
                    178: /*     trap.h  4.6     81/03/03        */
                    179: 
                    180: 
                    181:        .set    RESADFLT,0              /* reserved addressing fault */
                    182:        .set    PRIVINFLT,1             /* privileged instruction fault */
                    183:        .set    RESOPFLT,2              /* reserved operand fault */
                    184:        .set    BPTFLT,3                /* bpt instruction fault */
                    185:        .set    ALIGNFLT,4              /* alignment fault */
                    186:        .set    SYSCALL,5               /* kcall instruction (syscall trap) */
                    187:        .set    ARITHTRAP,6             /* arithmetic trap */
                    188:        .set    PROTFLT,7               /* protection fault */
                    189:        .set    TRCTRAP,8               /* trace trap */
                    190:        .set    TRANSFLT,9              /* translation not valid fault */
                    191:        .set    DONE,255
                    192:        .set    CPMDCB,21
                    193:        .set    ISTK,0x10000
                    194:        .globl  _rtclk  
                    195:        .set    SYSP,0x20000
                    196:        .set    SSP,0x30000
                    197:        .set    CPCONS,0x01
                    198:        .set    CPWRITE,0x01
                    199:        .set    CPREAD,0x02
                    200:        .set    INTMR,0x04
                    201:        .set    BFSZ,0x02
                    202:        .set    CNT,0xfffffff
                    203:        .set    CLKCNT,0x05020
                    204: 
                    205: 
                    206: /* Console interval timer test */
                    207: 
                    208: 
                    209: _rtclk:        movl    $0x00,r1
                    210:        movab   bitbl,r0
                    211: lvec:  movl    r0,_scb[r1]
                    212:        movl    r1,bitbl[r1]
                    213:        addl2   $4,r0
                    214:        addl2   $1,r1
                    215:        cmpl    $0xff,r1
                    216:        jneq    lvec
                    217:        movl    $60,msgcnt      /* load message count of sixty */
                    218:        movl    $0,tikcnt       /* clear tick counter */
                    219:        mtpr    $0,$PSL         /* setup for user stack */
                    220:        mtpr    $_scb,$SCBB     /* initialize SCBB */
                    221:        mtpr    $ISTK,$ISP      /* initialize interrupt stack pointer */
                    222:        movl    $ISTK,sp        /* initialize s ystem stack pointer */
                    223:        movab   bdint,_scb + CLOCKVEC   /* trap for unexpected interrupt */
                    224:        mtpr    $0x18,$IPL      /* lower the ipl allow random interrupts */
                    225:        movb    $INTMR,CPDCB    /* set up cpdcb to program interval timer */
                    226:        movb    $CPWRITE,CPDCB + 1 
                    227:        movw    $CLKCNT,CPDCB + 2
                    228:        movl    $CNT,r2         /* load count value for timeout */
                    229:        movl    $CPDCB,r10      /* load address of device control block */
                    230:        andl2   $0xffffff,r10   /* mask off garbage */
                    231:        movab   gdint,_scb + CLOCKVEC   /* address of good interrupt handler */
                    232:        movab   txvec,_scb + CXVEC      /* handle transmit interrupts */
                    233:        mtpr    r10,$CPMDCB     /* send xmit interrupt to cp */
                    234:        mtpr    $0x17,$IPL      /* lower the ipl allow  clock interrupts */
                    235: loop:  cmpl    $30,tikcnt      /* check its time to transmit mesg */
                    236:        jgtr    loop2           /* not ready continue */
                    237:        mtpr    $0x18,$IPL      /* do not allow ticks during transmit */
                    238:        cmpl    $60,msgcnt
                    239:        jneq    nfirst          /* skip if not the first message */
                    240:        pushab  nl              /* start on a new line  */
                    241:        callf   $8,_writes      /* call print function */
                    242: nfirst:        andl3   $1,msgcnt,r0    /* check for tick or tock */
                    243:        jneq    ptock           /* generate tock */
                    244:        pushab  tick
                    245:        jmp     pmesg
                    246: ptock: pushab  tock
                    247: pmesg: callf   $8,_writes      /* call print function */
                    248:        movl    $0,tikcnt       /* clear tick counter */
                    249:        movl    $CNT,r2         /* reload rescue timer */
                    250:        decl    msgcnt          /* decrement message counter */
                    251:        jeql    gdhlt
                    252:        cmpl    $0x32,msgcnt    /* check half done */
                    253:        jgtr    lower           /* if yes drop IPL to 0x13 */
                    254:        mtpr    $0x17,$IPL      /* lower IPL allow another tick */
                    255:        jmp     loop2           /* continue */
                    256: lower: mtpr    $0x13,$IPL      /* lower IPL to 0x13 */
                    257: loop2: decl    r2              /* decrement count register */
                    258:        jneq    loop            /* not zero then loop */
                    259:        movl    $0x02,r0        /* error - expected interrupt did not occur */
                    260:        halt
                    261: 
                    262: bdint: movl    $0x01,r0        /* error - unexpected interrupt occurred */
                    263:        halt
                    264: txvec: rei
                    265: gdint: mtpr    $CPDCB,$PDCS    /* check done bit */
                    266:        movw    CPDCB,r1        /* check done bit */
                    267:        andl2   $0x08000,r1     /* mask off don't care bits */
                    268:        jneq    gd1             /* not zero jmp */
                    269:        movl    $0x03,r0        /* error code done bit not set */
                    270:        halt
                    271: gd1:   mfpr    $IPL,r1         /* read current ipl */
                    272:        movl    $0x18,r2        /* expected value */
                    273:        cmpl    r1,r2
                    274:        jeql    gd2
                    275:        movl    $0x04,r0        /* error code wrong ipl */
                    276:        halt
                    277: gd2:   movpsl  r1              /* get current psl */
                    278:        andl2   $0x0fffff00,r1  /* mask off don't cares */
                    279:        movl    $0x04180000,r2  /* expected value */
                    280:        cmpl    r1,r2
                    281:        jeql    gd3             /* if correct jump */
                    282:        movl    $0x05,r0        /* error code wrong psl */
                    283:        halt
                    284: gd3:   movab   (sp),r1         /* current stack pointer address */
                    285:        movl    $ISTK - 8,r2
                    286:        cmpl    r1,r2
                    287:        jeql    gd4
                    288:        movl    $0x06,r0        /* error code wrong stack address */
                    289:        halt
                    290: gd4:   incl    tikcnt          /* increment tick counter */
                    291:        rei                     /* return from interrupt */
                    292: gdhlt: pushab  boom
                    293:        callf   $8,_writes      /* call print function */
                    294:        movl    $0xcafebabe,r0  /* good halt - CAFEBABE ! */
                    295:        halt
                    296: 
                    297:        .data
                    298: 
                    299: _scb:  
                    300:        .space 1024
                    301: 
                    302: bitbl:
                    303:        .space 1024
                    304: 
                    305: 
                    306:        .align 2
                    307: 
                    308: CPDCB:
                    309: 
                    310:        .space 20
                    311:        
                    312:        .align 2
                    313: 
                    314: 
                    315: tikcnt:
                    316:        .space 4
                    317: 
                    318: msgcnt:
                    319:        .space 4
                    320: 
                    321: nl:    .ascii  "\n\0"
                    322: tick:  .ascii  "Tick \0"
                    323: tock:  .ascii  "Tock \0"
                    324: boom:  .ascii  "Boom!\n\0"

unix.superglobalmegacorp.com

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