[BACK]Return to ncr53cxxx.c CVS log [TXT][DIR] Up to [local] / sys / dev / microcode / siop

Annotation of sys/dev/microcode/siop/ncr53cxxx.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: ncr53cxxx.c,v 1.7 2005/10/08 15:54:49 krw Exp $ */
                      2: /*     $NetBSD: ncr53cxxx.c,v 1.14 2005/02/11 06:21:22 simonb Exp $    */
                      3:
                      4: /*
                      5:  * Copyright (c) 1995,1999 Michael L. Hitch
                      6:  * All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  * 3. All advertising materials mentioning features or use of this software
                     17:  *    must display the following acknowledgement:
                     18:  *      This product includes software developed by Michael L. Hitch.
                     19:  * 4. The name of the author may not be used to endorse or promote products
                     20:  *    derived from this software without specific prior written permission
                     21:  *
                     22:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     23:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     24:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     25:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     26:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     27:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     28:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     29:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     30:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     31:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     32:  */
                     33:
                     34: /*     ncr53cxxx.c     - SCSI SCRIPTS Assembler                */
                     35:
                     36: #include <stdio.h>
                     37: #include <stdlib.h>
                     38: #include <string.h>
                     39: #include <time.h>
                     40:
                     41: #ifndef AMIGA
                     42: #define strcmpi        strcasecmp
                     43: #endif
                     44:
                     45: #define        MAXTOKENS       16
                     46: #define        MAXINST         1024
                     47: #define        MAXSYMBOLS      128
                     48:
                     49: struct {
                     50:        int     type;
                     51:        char    *name;
                     52: } tokens[MAXTOKENS];
                     53: int    ntokens;
                     54: int    tokenix;
                     55:
                     56: void   f_proc (void);
                     57: void   f_pass (void);
                     58: void   f_list (void);          /* ENTRY, EXTERNAL label list */
                     59: void   f_define (void);        /* ABSOLUTE, RELATIVE label list */
                     60: void   f_move (void);
                     61: void   f_jump (void);
                     62: void   f_call (void);
                     63: void   f_return (void);
                     64: void   f_int (void);
                     65: void   f_intfly (void);
                     66: void   f_select (void);
                     67: void   f_reselect (void);
                     68: void   f_wait (void);
                     69: void   f_disconnect (void);
                     70: void   f_set (void);
                     71: void   f_clear (void);
                     72: void   f_load (void);
                     73: void   f_store (void);
                     74: void   f_nop (void);
                     75: void   f_arch (void);
                     76:
                     77: struct {
                     78:        char    *name;
                     79:        void    (*func)(void);
                     80: } directives[] = {
                     81:        {"PROC",        f_proc},
                     82:        {"PASS",        f_pass},
                     83:        {"ENTRY",       f_list},
                     84:        {"ABSOLUTE",    f_define},
                     85:        {"EXTERN",      f_list},
                     86:        {"EXTERNAL",    f_list},
                     87:        {"RELATIVE",    f_define},
                     88:        {"MOVE",        f_move},
                     89:        {"JUMP",        f_jump},
                     90:        {"CALL",        f_call},
                     91:        {"RETURN",      f_return},
                     92:        {"INT",         f_int},
                     93:        {"INTFLY",      f_intfly},
                     94:        {"SELECT",      f_select},
                     95:        {"RESELECT",    f_reselect},
                     96:        {"WAIT",        f_wait},
                     97:        {"DISCONNECT",  f_disconnect},
                     98:        {"SET",         f_set},
                     99:        {"CLEAR",       f_clear},
                    100:        {"LOAD",        f_load},
                    101:        {"STORE",       f_store},
                    102:        {"NOP",         f_nop},
                    103:        {"ARCH",        f_arch},
                    104:        {NULL, NULL}};
                    105:
                    106: u_int32_t script[MAXINST];
                    107: int    dsps;
                    108: char   *script_name = "SCRIPT";
                    109: u_int32_t inst0, inst1, inst2;
                    110: unsigned int   ninsts;
                    111: unsigned int   npatches;
                    112:
                    113: struct patchlist {
                    114:        struct patchlist *next;
                    115:        unsigned        offset;
                    116: } *patches;
                    117:
                    118: #define        S_LABEL         0x0000
                    119: #define        S_ABSOLUTE      0x0001
                    120: #define        S_RELATIVE      0x0002
                    121: #define        S_EXTERNAL      0x0003
                    122: #define        F_DEFINED       0x0001
                    123: #define        F_ENTRY         0x0002
                    124: struct {
                    125:        short   type;
                    126:        short   flags;
                    127:        u_int32_t value;
                    128:        struct patchlist *patchlist;
                    129:        char    *name;
                    130: } symbols[MAXSYMBOLS];
                    131: int nsymbols;
                    132:
                    133: char   *stypes[] = {"Label", "Absolute", "Relative", "External"};
                    134:
                    135: char   *phases[] = {
                    136:        "data_out", "data_in", "cmd", "status",
                    137:        "res4", "res5", "msg_out", "msg_in"
                    138: };
                    139:
                    140: struct ncrregs {
                    141:        char *name;
                    142:        int addr[5];
                    143: };
                    144: #define ARCH700 1
                    145: #define ARCH710 2
                    146: #define ARCH720 3
                    147: #define ARCH810 4
                    148: #define ARCH825 5
                    149:
                    150: struct ncrregs         regs[] = {
                    151:        {"scntl0",      {0x00, 0x00, 0x00, 0x00, 0x00}},
                    152:        {"scntl1",      {0x01, 0x01, 0x01, 0x01, 0x01}},
                    153:        {"sdid",        {0x02, 0x02,   -1,   -1,   -1}},
                    154:        {"sien",        {0x03, 0x03,   -1,   -1,   -1}},
                    155:        {"scid",        {0x04, 0x04,   -1,   -1,   -1}},
                    156:        {"scntl2",      {  -1,   -1, 0x02, 0x02, 0x02}},
                    157:        {"scntl3",      {  -1,   -1, 0x03, 0x03, 0x03}},
                    158:        {"scid",        {  -1,   -1, 0x04, 0x04, 0x04}},
                    159:        {"sxfer",       {0x05, 0x05, 0x05, 0x05, 0x05}},
                    160:        {"sodl",        {0x06, 0x06,   -1,   -1,   -1}},
                    161:        {"socl",        {0x07, 0x07,   -1,   -1,   -1}},
                    162:        {"sdid",        {  -1,   -1, 0x06, 0x06, 0x06}},
                    163:        {"gpreg",       {  -1,   -1, 0x07, 0x07, 0x07}},
                    164:        {"sfbr",        {0x08, 0x08, 0x08, 0x08, 0x08}},
                    165:        {"sidl",        {0x09, 0x09,   -1,   -1,   -1}},
                    166:        {"sbdl",        {0x0a, 0x0a,   -1,   -1,   -1}},
                    167:        {"socl",        {  -1,   -1, 0x09, 0x09, 0x09}},
                    168:        {"ssid",        {  -1,   -1, 0x0a, 0x0a, 0x0a}},
                    169:        {"sbcl",        {0x0b, 0x0b, 0x0b, 0x0b, 0x0b}},
                    170:        {"dstat",       {0x0c, 0x0c, 0x0c, 0x0c, 0x0c}},
                    171:        {"sstat0",      {0x0d, 0x0d, 0x0d, 0x0d, 0x0d}},
                    172:        {"sstat1",      {0x0e, 0x0e, 0x0e, 0x0e, 0x0e}},
                    173:        {"sstat2",      {0x0f, 0x0f, 0x0f, 0x0f, 0x0f}},
                    174:        {"dsa0",        {  -1, 0x10, 0x10, 0x10, 0x10}},
                    175:        {"dsa1",        {  -1, 0x11, 0x11, 0x11, 0x11}},
                    176:        {"dsa2",        {  -1, 0x12, 0x12, 0x12, 0x12}},
                    177:        {"dsa3",        {  -1, 0x13, 0x13, 0x13, 0x13}},
                    178:        {"ctest0",      {0x14, 0x14, 0x18, 0x18, 0x18}},
                    179:        {"ctest1",      {0x15, 0x15, 0x19, 0x19, 0x19}},
                    180:        {"ctest2",      {0x16, 0x16, 0x1a, 0x1a, 0x1a}},
                    181:        {"ctest3",      {0x17, 0x17, 0x1b, 0x1b, 0x1b}},
                    182:        {"ctest4",      {0x18, 0x18, 0x21, 0x21, 0x21}},
                    183:        {"ctest5",      {0x19, 0x19, 0x22, 0x22, 0x22}},
                    184:        {"ctest6",      {0x1a, 0x1a, 0x23, 0x23, 0x23}},
                    185:        {"ctest7",      {0x1b, 0x1b,   -1,   -1,   -1}},
                    186:        {"temp0",       {0x1c, 0x1c, 0x1c, 0x1c, 0x1c}},
                    187:        {"temp1",       {0x1d, 0x1d, 0x1d, 0x1d, 0x1d}},
                    188:        {"temp2",       {0x1e, 0x1e, 0x1e, 0x1e, 0x1e}},
                    189:        {"temp3",       {0x1f, 0x1f, 0x1f, 0x1f, 0x1f}},
                    190:        {"dfifo",       {0x20, 0x20, 0x20, 0x20, 0x20}},
                    191:        {"istat",       {0x21, 0x21, 0x14, 0x14, 0x14}},
                    192:        {"ctest8",      {0x22, 0x22,   -1,   -1,   -1}},
                    193:        {"lcrc",        {  -1, 0x23,   -1,   -1,   -1}},
                    194:        {"ctest9",      {0x23,   -1,   -1,   -1,   -1}},
                    195:        {"dbc0",        {0x24, 0x24, 0x24, 0x24, 0x24}},
                    196:        {"dbc1",        {0x25, 0x25, 0x25, 0x25, 0x25}},
                    197:        {"dbc2",        {0x26, 0x26, 0x26, 0x26, 0x26}},
                    198:        {"dcmd",        {0x27, 0x27, 0x27, 0x27, 0x27}},
                    199:        {"dnad0",       {0x28, 0x28, 0x28, 0x28, 0x28}},
                    200:        {"dnad1",       {0x29, 0x29, 0x29, 0x29, 0x29}},
                    201:        {"dnad2",       {0x2a, 0x2a, 0x2a, 0x2a, 0x2a}},
                    202:        {"dnad3",       {0x2b, 0x2b, 0x2b, 0x2b, 0x2b}},
                    203:        {"dsp0",        {0x2c, 0x2c, 0x2c, 0x2c, 0x2c}},
                    204:        {"dsp1",        {0x2d, 0x2d, 0x2d, 0x2d, 0x2d}},
                    205:        {"dsp2",        {0x2e, 0x2e, 0x2e, 0x2e, 0x2e}},
                    206:        {"dsp3",        {0x2f, 0x2f, 0x2f, 0x2f, 0x2f}},
                    207:        {"dsps0",       {0x30, 0x30, 0x30, 0x30, 0x30}},
                    208:        {"dsps1",       {0x31, 0x31, 0x31, 0x31, 0x31}},
                    209:        {"dsps2",       {0x32, 0x32, 0x32, 0x32, 0x32}},
                    210:        {"dsps3",       {0x33, 0x33, 0x33, 0x33, 0x33}},
                    211:        {"scratch0",    {  -1, 0x34,   -1,   -1,   -1}},
                    212:        {"scratch1",    {  -1, 0x35,   -1,   -1,   -1}},
                    213:        {"scratch2",    {  -1, 0x36,   -1,   -1,   -1}},
                    214:        {"scratch3",    {  -1, 0x37,   -1,   -1,   -1}},
                    215:        {"scratcha0",   {0x10,   -1, 0x34, 0x34, 0x34}},
                    216:        {"scratcha1",   {0x11,   -1, 0x35, 0x35, 0x35}},
                    217:        {"scratcha2",   {0x12,   -1, 0x36, 0x36, 0x36}},
                    218:        {"scratcha3",   {0x13,   -1, 0x37, 0x37, 0x37}},
                    219:        {"dmode",       {0x34, 0x38, 0x38, 0x38, 0x38}},
                    220:        {"dien",        {0x39, 0x39, 0x39, 0x39, 0x39}},
                    221:        {"dwt",         {0x3a, 0x3a, 0x3a,   -1,   -1}},
                    222:        {"sbr",         {  -1,   -1,   -1, 0x3a, 0x3a}},
                    223:        {"dcntl",       {0x3b, 0x3b, 0x3b, 0x3b, 0x3b}},
                    224:        {"addr0",       {  -1, 0x3c, 0x3c, 0x3c, 0x3c}},
                    225:        {"addr1",       {  -1, 0x3d, 0x3d, 0x3d, 0x3d}},
                    226:        {"addr2",       {  -1, 0x3e, 0x3e, 0x3e, 0x3e}},
                    227:        {"addr3",       {  -1, 0x3f, 0x3f, 0x3f, 0x3f}},
                    228:        {"sien0",       {  -1,   -1, 0x40, 0x40, 0x40}},
                    229:        {"sien1",       {  -1,   -1, 0x41, 0x41, 0x41}},
                    230:        {"sist0",       {  -1,   -1, 0x42, 0x42, 0x42}},
                    231:        {"sist1",       {  -1,   -1, 0x43, 0x43, 0x43}},
                    232:        {"slpar",       {  -1,   -1, 0x44, 0x44, 0x44}},
                    233:        {"swide",       {  -1,   -1, 0x45,   -1, 0x45}},
                    234:        {"macntl",      {  -1,   -1, 0x46, 0x46, 0x46}},
                    235:        {"gpcntl",      {  -1,   -1, 0x47, 0x47, 0x47}},
                    236:        {"stime0",      {  -1,   -1, 0x48, 0x48, 0x48}},
                    237:        {"stime1",      {  -1,   -1, 0x49, 0x49, 0x49}},
                    238:        {"respid0",     {  -1,   -1, 0x4a, 0x4a, 0x4a}},
                    239:        {"respid1",     {  -1,   -1, 0x4b,   -1, 0x4b}},
                    240:        {"stest0",      {  -1,   -1, 0x4c, 0x4c, 0x4c}},
                    241:        {"stest1",      {  -1,   -1, 0x4d, 0x4d, 0x4d}},
                    242:        {"stest2",      {  -1,   -1, 0x4e, 0x4e, 0x4e}},
                    243:        {"stest3",      {  -1,   -1, 0x4f, 0x4f, 0x4f}},
                    244:        {"sidl0",       {  -1,   -1, 0x50, 0x50, 0x50}},
                    245:        {"sidl1",       {  -1,   -1, 0x51,   -1, 0x51}},
                    246:        {"sodl0",       {  -1,   -1, 0x54, 0x54, 0x54}},
                    247:        {"sodl1",       {  -1,   -1, 0x55,   -1, 0x55}},
                    248:        {"sbdl0",       {  -1,   -1, 0x58, 0x58, 0x58}},
                    249:        {"sbdl1",       {  -1,   -1, 0x59,   -1, 0x59}},
                    250:        {"scratchb0",   {0x3c,   -1, 0x5c, 0x5c, 0x5c}},
                    251:        {"scratchb1",   {0x3d,   -1, 0x5d, 0x5d, 0x5d}},
                    252:        {"scratchb2",   {0x3e,   -1, 0x5e, 0x5e, 0x5e}},
                    253:        {"scratchb3",   {0x3f,   -1, 0x5f, 0x5f, 0x5f}},
                    254:        {"scratchc0",   {  -1,   -1,   -1,   -1, 0x60}},
                    255:        {"scratchc1",   {  -1,   -1,   -1,   -1, 0x61}},
                    256:        {"scratchc2",   {  -1,   -1,   -1,   -1, 0x62}},
                    257:        {"scratchc3",   {  -1,   -1,   -1,   -1, 0x63}},
                    258:        {"scratchd0",   {  -1,   -1,   -1,   -1, 0x64}},
                    259:        {"scratchd1",   {  -1,   -1,   -1,   -1, 0x65}},
                    260:        {"scratchd2",   {  -1,   -1,   -1,   -1, 0x66}},
                    261:        {"scratchd3",   {  -1,   -1,   -1,   -1, 0x67}},
                    262:        {"scratche0",   {  -1,   -1,   -1,   -1, 0x68}},
                    263:        {"scratche1",   {  -1,   -1,   -1,   -1, 0x69}},
                    264:        {"scratche2",   {  -1,   -1,   -1,   -1, 0x6a}},
                    265:        {"scratche3",   {  -1,   -1,   -1,   -1, 0x6b}},
                    266:        {"scratchf0",   {  -1,   -1,   -1,   -1, 0x6c}},
                    267:        {"scratchf1",   {  -1,   -1,   -1,   -1, 0x6d}},
                    268:        {"scratchf2",   {  -1,   -1,   -1,   -1, 0x6e}},
                    269:        {"scratchf3",   {  -1,   -1,   -1,   -1, 0x6f}},
                    270:        {"scratchg0",   {  -1,   -1,   -1,   -1, 0x70}},
                    271:        {"scratchg1",   {  -1,   -1,   -1,   -1, 0x71}},
                    272:        {"scratchg2",   {  -1,   -1,   -1,   -1, 0x72}},
                    273:        {"scratchg3",   {  -1,   -1,   -1,   -1, 0x73}},
                    274:        {"scratchh0",   {  -1,   -1,   -1,   -1, 0x74}},
                    275:        {"scratchh1",   {  -1,   -1,   -1,   -1, 0x75}},
                    276:        {"scratchh2",   {  -1,   -1,   -1,   -1, 0x7e}},
                    277:        {"scratchh3",   {  -1,   -1,   -1,   -1, 0x77}},
                    278:        {"scratchi0",   {  -1,   -1,   -1,   -1, 0x78}},
                    279:        {"scratchi1",   {  -1,   -1,   -1,   -1, 0x79}},
                    280:        {"scratchi2",   {  -1,   -1,   -1,   -1, 0x7a}},
                    281:        {"scratchi3",   {  -1,   -1,   -1,   -1, 0x7b}},
                    282:        {"scratchj0",   {  -1,   -1,   -1,   -1, 0x7c}},
                    283:        {"scratchj1",   {  -1,   -1,   -1,   -1, 0x7d}},
                    284:        {"scratchj2",   {  -1,   -1,   -1,   -1, 0x7e}},
                    285:        {"scratchj3",   {  -1,   -1,   -1,   -1, 0x7f}},
                    286: };
                    287:
                    288: int    lineno;
                    289: int    err_listed;
                    290: int    arch;
                    291: int    partial_flag;
                    292:
                    293: char   inbuf[128];
                    294:
                    295: char   *sourcefile;
                    296: char   *outputfile;
                    297: char   *listfile;
                    298: char   *errorfile;
                    299:
                    300: FILE   *infp;
                    301: FILE   *outfp;
                    302: FILE   *listfp;
                    303: FILE   *errfp;
                    304:
                    305: void   setarch(char *);
                    306: void   parse (void);
                    307: void   process (void);
                    308: void   emit_symbols (void);
                    309: void   list_symbols (void);
                    310: void   errout (char *);
                    311: void   define_symbol (char *, u_int32_t, short, short);
                    312: void   patch_label (void);
                    313: void   close_script (void);
                    314: void   new_script (char *);
                    315: void   store_inst (void);
                    316: int    expression (int *);
                    317: int    evaluate (int);
                    318: int    number (char *);
                    319: int    lookup (char *);
                    320: int    reserved (char *, int);
                    321: int    CheckPhase (int);
                    322: int    CheckRegister (int);
                    323: void   transfer (int, int);
                    324: void   select_reselect (int);
                    325: void   set_clear (u_int32_t);
                    326: void   block_move (void);
                    327: void   register_write (void);
                    328: void   memory_to_memory (void);
                    329: void   loadstore (int);
                    330: void   error_line(void);
                    331: char   *makefn(char *, char *);
                    332: void   usage(void);
                    333:
                    334: int
                    335: main (int argc, char *argv[])
                    336: {
                    337:        int     i;
                    338:        struct patchlist *p;
                    339:
                    340:        if (argc < 2 || argv[1][0] == '-')
                    341:                usage();
                    342:        sourcefile = argv[1];
                    343:        infp = fopen (sourcefile, "r");
                    344:        if (infp == NULL) {
                    345:                perror ("open source");
                    346:                fprintf (stderr, "scc: error opening source file %s\n", argv[1]);
                    347:                exit (1);
                    348:        }
                    349:        /*
                    350:         * process options
                    351:         * -l [listfile]
                    352:         * -o [outputfile]
                    353:         * -p [outputfile]
                    354:         * -z [debugfile]
                    355:         * -e [errorfile]
                    356:         * -a arch
                    357:         * -v
                    358:         * -u
                    359:         */
                    360:        for (i = 2; i < argc; ++i) {
                    361:                if (argv[i][0] != '-')
                    362:                        usage();
                    363:                switch (argv[i][1]) {
                    364:                case 'o':
                    365:                case 'p':
                    366:                        partial_flag = argv[i][1] == 'p';
                    367:                        if (i + 1 >= argc || argv[i + 1][0] == '-')
                    368:                                outputfile = makefn (sourcefile, "out");
                    369:                        else {
                    370:                                outputfile = argv[i + 1];
                    371:                                ++i;
                    372:                        }
                    373:                        break;
                    374:                case 'l':
                    375:                        if (i + 1 >= argc || argv[i + 1][0] == '-')
                    376:                                listfile = makefn (sourcefile, "lis");
                    377:                        else {
                    378:                                listfile = argv[i + 1];
                    379:                                ++i;
                    380:                        }
                    381:                        break;
                    382:                case 'e':
                    383:                        if (i + 1 >= argc || argv[i + 1][0] == '-')
                    384:                                errorfile = makefn (sourcefile, "err");
                    385:                        else {
                    386:                                errorfile = argv[i + 1];
                    387:                                ++i;
                    388:                        }
                    389:                        break;
                    390:                case 'a':
                    391:                        if (i + 1 == argc)
                    392:                                usage();
                    393:                        setarch(argv[i +1]);
                    394:                        if (arch == 0) {
                    395:                                fprintf(stderr,"%s: bad arch '%s'\n",
                    396:                                        argv[0], argv[i +1]);
                    397:                                exit(1);
                    398:                        }
                    399:                        ++i;
                    400:                        break;
                    401:                default:
                    402:                        fprintf (stderr, "scc: unrecognized option '%c'\n",
                    403:                            argv[i][1]);
                    404:                        usage();
                    405:                }
                    406:        }
                    407:        if (outputfile)
                    408:                outfp = fopen (outputfile, "w");
                    409:        if (listfile)
                    410:                listfp = fopen (listfile, "w");
                    411:        if (errorfile)
                    412:                errfp = fopen (errorfile, "w");
                    413:        else
                    414:                errfp = stderr;
                    415:
                    416:        if (outfp) {
                    417:                time_t cur_time;
                    418:
                    419:                fprintf(outfp, "/*\t$OpenBSD: ncr53cxxx.c,v 1.7 2005/10/08 15:54:49 krw Exp $\t*/\n");
                    420:                fprintf(outfp, "/*\n");
                    421:                fprintf(outfp, " *\tDO NOT EDIT - this file is automatically generated.\n");
                    422:                time(&cur_time);
                    423:                fprintf(outfp, " *\tcreated from %s on %s", sourcefile, ctime(&cur_time));
                    424:                fprintf(outfp, " */\n");
                    425:        }
                    426:
                    427:        while (fgets (inbuf, sizeof (inbuf), infp)) {
                    428:                ++lineno;
                    429:                if (listfp)
                    430:                        fprintf (listfp, "%3d:  %s", lineno, inbuf);
                    431:                err_listed = 0;
                    432:                parse ();
                    433:                if (ntokens) {
                    434: #ifdef DUMP_TOKENS
                    435:                        int     i;
                    436:
                    437:                        fprintf (listfp, "      %d tokens\n", ntokens);
                    438:                        for (i = 0; i < ntokens; ++i) {
                    439:                                fprintf (listfp, "      %d: ", i);
                    440:                                if (tokens[i].type)
                    441:                                        fprintf (listfp,"'%c'\n", tokens[i].type);
                    442:                                else
                    443:                                        fprintf (listfp, "%s\n", tokens[i].name);
                    444:                        }
                    445: #endif
                    446:                        if (ntokens >= 2 && tokens[0].type == 0 &&
                    447:                            tokens[1].type == ':') {
                    448:                                define_symbol (tokens[0].name, dsps, S_LABEL, F_DEFINED);
                    449:                                tokenix += 2;
                    450:                        }
                    451:                        if (tokenix < ntokens)
                    452:                                process ();
                    453:                }
                    454:
                    455:        }
                    456:        close_script ();
                    457:        emit_symbols ();
                    458:        if (outfp && !partial_flag) {
                    459:                fprintf (outfp, "\nu_int32_t INSTRUCTIONS = 0x%08x;\n", ninsts);
                    460:                fprintf (outfp, "u_int32_t PATCHES = 0x%08x;\n", npatches);
                    461:                fprintf (outfp, "u_int32_t LABELPATCHES[] = {\n");
                    462:                p = patches;
                    463:                while (p) {
                    464:                        fprintf (outfp, "\t0x%08x,\n", p->offset / 4);
                    465:                        p = p->next;
                    466:                }
                    467:                fprintf (outfp, "};\n\n");
                    468:        }
                    469:        list_symbols ();
                    470:        exit(0);
                    471: }
                    472:
                    473: void setarch(char *val)
                    474: {
                    475:        switch (atoi(val)) {
                    476:        case 700:
                    477:                arch = ARCH700;
                    478:                break;
                    479:        case 710:
                    480:                arch = ARCH710;
                    481:                break;
                    482:        case 720:
                    483:                arch = ARCH720;
                    484:                break;
                    485:        case 810:
                    486:                arch = ARCH810;
                    487:                break;
                    488:        case 825:
                    489:                arch = ARCH825;
                    490:                break;
                    491:        default:
                    492:                arch = 0;
                    493:        }
                    494: }
                    495:
                    496: void emit_symbols ()
                    497: {
                    498:        int     i;
                    499:        struct  patchlist *p;
                    500:
                    501:        if (nsymbols == 0 || outfp == NULL)
                    502:                return;
                    503:
                    504:        for (i = 0; i < nsymbols; ++i) {
                    505:                char    *code;
                    506:                if ((symbols[i].flags & F_DEFINED) == 0 &&
                    507:                    symbols[i].type != S_EXTERNAL) {
                    508:                        fprintf(stderr, "warning: symbol %s undefined\n",
                    509:                            symbols[i].name);
                    510:                }
                    511:                if (symbols[i].type == S_ABSOLUTE)
                    512:                        code = "A_";
                    513:                else if (symbols[i].type == S_RELATIVE)
                    514:                        code = "R_";
                    515:                else if (symbols[i].type == S_EXTERNAL)
                    516:                        code = "E_";
                    517:                else if (symbols[i].flags & F_ENTRY)
                    518:                        code = "Ent_";
                    519:                else
                    520:                        continue;
                    521:                fprintf (outfp, "#define\t%s%s\t0x%08x\n", code, symbols[i].name,
                    522:                        symbols[i].value);
                    523:                if (symbols[i].flags & F_ENTRY || symbols[i].patchlist == NULL)
                    524:                        continue;
                    525:                fprintf (outfp, "u_int32_t %s%s_Used[] = {\n", code, symbols[i].name);
                    526: #if 1
                    527:                p = symbols[i].patchlist;
                    528:                while (p) {
                    529:                        fprintf (outfp, "\t0x%08x,\n", p->offset / 4);
                    530:                        p = p->next;
                    531:                }
                    532: #endif
                    533:                fprintf (outfp, "};\n\n");
                    534:        }
                    535:        /* patches ? */
                    536: }
                    537:
                    538: void list_symbols ()
                    539: {
                    540:        int     i;
                    541:
                    542:        if (nsymbols == 0 || listfp == NULL)
                    543:                return;
                    544:        fprintf (listfp, "\n\nValue     Type     Symbol\n");
                    545:        for (i = 0; i < nsymbols; ++i) {
                    546:                fprintf (listfp, "%08x: %-8s %s\n", symbols[i].value,
                    547:                        stypes[symbols[i].type], symbols[i].name);
                    548:        }
                    549: }
                    550:
                    551: void errout (char *text)
                    552: {
                    553:        error_line();
                    554:        fprintf (errfp, "*** %s ***\n", text);
                    555: }
                    556:
                    557: void parse ()
                    558: {
                    559:        char *p = inbuf;
                    560:        char c;
                    561:        char string[64];
                    562:        char *s;
                    563:        size_t len;
                    564:
                    565:        ntokens = tokenix = 0;
                    566:        while (1) {
                    567:                while ((c = *p++) && c != '\n' && (c <= ' ' || c == '\t'))
                    568:                        ;
                    569:                if (c == '\n' || c == 0 || c == ';')
                    570:                        break;
                    571:                if (ntokens >= MAXTOKENS) {
                    572:                        errout ("Token table full");
                    573:                        break;
                    574:                }
                    575:                if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') ||
                    576:                    (c >= 'A' && c <= 'Z') || c == '$' || c == '_') {
                    577:                        s = string;
                    578:                        *s++ = c;
                    579:                        while (((c = *p) >= '0' && c <= '9') ||
                    580:                            (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
                    581:                            c == '_' || c == '$') {
                    582:                                *s++ = *p++;
                    583:                        }
                    584:                        *s = 0;
                    585:                        len = strlen (string) + 1;
                    586:                        tokens[ntokens].name = malloc (len);
                    587:                        strlcpy (tokens[ntokens].name, string, len);
                    588:                        tokens[ntokens].type = 0;
                    589:                }
                    590:                else {
                    591:                        tokens[ntokens].type = c;
                    592:                }
                    593:                ++ntokens;
                    594:        }
                    595:        return;
                    596: }
                    597:
                    598: void   process ()
                    599: {
                    600:        int     i;
                    601:
                    602:        if (tokens[tokenix].type) {
                    603:                error_line();
                    604:                fprintf (errfp, "Error: expected directive, found '%c'\n",
                    605:                        tokens[tokenix].type);
                    606:                return;
                    607:        }
                    608:        for (i = 0; directives[i].name; ++i) {
                    609:                if (strcmpi (directives[i].name, tokens[tokenix].name) == 0)
                    610:                        break;
                    611:        }
                    612:        if (directives[i].name == NULL) {
                    613:                error_line();
                    614:                fprintf (errfp, "Error: expected directive, found \"%s\"\n",
                    615:                        tokens[tokenix].name);
                    616:                return;
                    617:        }
                    618:        if (directives[i].func == NULL) {
                    619:                error_line();
                    620:                fprintf (errfp, "No function for directive \"%s\"\n", tokens[tokenix].name);
                    621:        } else {
                    622: #if 0
                    623:                fprintf (listfp, "Processing directive \"%s\"\n", directives[i].name);
                    624: #endif
                    625:                ++tokenix;
                    626:                (*directives[i].func) ();
                    627:        }
                    628: }
                    629:
                    630: void define_symbol (char *name, u_int32_t value, short type, short flags)
                    631: {
                    632:        int     i;
                    633:        struct patchlist *p;
                    634:        size_t  len;
                    635:
                    636:        for (i = 0; i < nsymbols; ++i) {
                    637:                if (symbols[i].type == type && strcmp (symbols[i].name, name) == 0) {
                    638:                        if (symbols[i].flags & F_DEFINED) {
                    639:                                error_line();
                    640:                                fprintf (errfp, "*** Symbol \"%s\" multiply defined\n",
                    641:                                        name);
                    642:                        } else {
                    643:                                symbols[i].flags |= flags;
                    644:                                symbols[i].value = value;
                    645:                                p = symbols[i].patchlist;
                    646:                                while (p) {
                    647:                                        if (p->offset > dsps)
                    648:                                                errout ("Whoops\007");
                    649:                                        else
                    650:                                                script[p->offset / 4] += dsps;
                    651:                                        p = p->next;
                    652:                                }
                    653:                        }
                    654:                        return;
                    655:                }
                    656:        }
                    657:        if (nsymbols >= MAXSYMBOLS) {
                    658:                errout ("Symbol table full");
                    659:                return;
                    660:        }
                    661:        symbols[nsymbols].type = type;
                    662:        symbols[nsymbols].flags = flags;
                    663:        symbols[nsymbols].value = value;
                    664:        symbols[nsymbols].patchlist = NULL;
                    665:        len = strlen (name) + 1;
                    666:        symbols[nsymbols].name = malloc (len);
                    667:        strlcpy (symbols[nsymbols].name, name, len);
                    668:        ++nsymbols;
                    669: }
                    670:
                    671: void patch_label (void)
                    672: {
                    673:        struct patchlist *p, **h;
                    674:
                    675:        h = &patches;
                    676:        while(*h)
                    677:                h = &(*h)->next;
                    678:        p = (struct patchlist *) malloc (sizeof (struct patchlist));
                    679:        *h = p;
                    680:        p->next = NULL;
                    681:        p->offset = dsps + 4;
                    682:        npatches++;
                    683: }
                    684:
                    685: void close_script ()
                    686: {
                    687:        int     i;
                    688:
                    689:        if (dsps == 0)
                    690:                return;
                    691:        if (outfp) {
                    692:                fprintf (outfp, "const u_int32_t %s[] = {\n", script_name);
                    693:                for (i = 0; i < dsps / 4; i += 2) {
                    694:                        fprintf (outfp, "\t0x%08x, 0x%08x", script[i],
                    695:                                script[i + 1]);
                    696:                        /* check for memory move instruction */
                    697:                        if ((script[i] & 0xe0000000) == 0xc0000000)
                    698:                                fprintf (outfp, ", 0x%08x,", script[i + 2]);
                    699:                        else
                    700:                                if ((i + 2) <= dsps / 4) fprintf (outfp, ",\t\t");
                    701:                        fprintf (outfp, "\t/* %03x - %3d */\n", i * 4, i * 4);
                    702:                        if ((script[i] & 0xe0000000) == 0xc0000000)
                    703:                                ++i;
                    704:                }
                    705:                fprintf (outfp, "};\n\n");
                    706:        }
                    707:        dsps = 0;
                    708: }
                    709:
                    710: void new_script (char *name)
                    711: {
                    712:        size_t len = strlen (name) + 1;
                    713:
                    714:        close_script ();
                    715:        script_name = malloc (len);
                    716:        strlcpy (script_name, name, len);
                    717: }
                    718:
                    719: int    reserved (char *string, int t)
                    720: {
                    721:        if (tokens[t].type == 0 && strcmpi (tokens[t].name, string) == 0)
                    722:                return (1);
                    723:        return (0);
                    724: }
                    725:
                    726: int    CheckPhase (int t)
                    727: {
                    728:        int     i;
                    729:
                    730:        for (i = 0; i < 8; ++i) {
                    731:                if (reserved (phases[i], t)) {
                    732:                        inst0 |= i << 24;
                    733:                        return (1);
                    734:                }
                    735:        }
                    736:        return (0);
                    737: }
                    738:
                    739: int    CheckRegister (int t)
                    740: {
                    741:        int     i;
                    742:
                    743:        if (arch <= 0) {
                    744:                errout("'ARCH' statement missing");
                    745:                return -1;
                    746:        }
                    747:        for (i = 0; i < (sizeof(regs) / sizeof(regs[0])); i++) {
                    748:                if (regs[i].addr[arch - 1] >= 0 && reserved(regs[i].name, t))
                    749:                        return regs[i].addr[arch-1];
                    750:        }
                    751:        return (-1);
                    752: }
                    753:
                    754: int    expression (int *t)
                    755: {
                    756:        int     value;
                    757:        int     i = *t;
                    758:
                    759:        value = evaluate (i++);
                    760:        while (i < ntokens) {
                    761:                if (tokens[i].type == '+')
                    762:                        value += evaluate (i + 1);
                    763:                else if (tokens[i].type == '-')
                    764:                        value -= evaluate (i + 1);
                    765:                else
                    766:                        errout ("Unknown identifier");
                    767:                i += 2;
                    768:        }
                    769:        *t = i;
                    770:        return (value);
                    771: }
                    772:
                    773: int    evaluate (t)
                    774: {
                    775:        int     value;
                    776:        char    *name;
                    777:
                    778:        if (tokens[t].type) {
                    779:                errout ("Expected an identifier");
                    780:                return (0);
                    781:        }
                    782:        name = tokens[t].name;
                    783:        if (*name >= '0' && *name <= '9')
                    784:                value = number (name);
                    785:        else
                    786:                value = lookup (name);
                    787:        return (value);
                    788: }
                    789:
                    790: int    number (char *s)
                    791: {
                    792:        int     value;
                    793:        int     n;
                    794:        int     radix;
                    795:
                    796:        radix = 10;
                    797:        if (*s == '0') {
                    798:                ++s;
                    799:                radix = 8;
                    800:                switch (*s) {
                    801:                case 'x':
                    802:                case 'X':
                    803:                        radix = 16;
                    804:                        break;
                    805:                case 'b':
                    806:                case 'B':
                    807:                        radix = 2;
                    808:                }
                    809:                if (radix != 8)
                    810:                        ++s;
                    811:        }
                    812:        value = 0;
                    813:        while (*s) {
                    814:                n = *s++;
                    815:                if (n >= '0' && n <= '9')
                    816:                        n -= '0';
                    817:                else if (n >= 'a' && n <= 'f')
                    818:                        n -= 'a' - 10;
                    819:                else if (n >= 'A' && n <= 'F')
                    820:                        n -= 'A' - 10;
                    821:                else {
                    822:                        error_line();
                    823:                        fprintf (errfp, "*** Expected digit\n");
                    824:                        n = 0;
                    825:                }
                    826:                if (n >= radix)
                    827:                        errout ("Expected digit");
                    828:                else
                    829:                        value = value * radix + n;
                    830:        }
                    831:        return (value);
                    832: }
                    833:
                    834: int    lookup (char *name)
                    835: {
                    836:        int     i;
                    837:        struct patchlist *p;
                    838:        size_t  len;
                    839:
                    840:        for (i = 0; i < nsymbols; ++i) {
                    841:                if (strcmp (name, symbols[i].name) == 0) {
                    842:                        if ((symbols[i].flags & F_DEFINED) == 0) {
                    843:                                p = (struct patchlist *) &symbols[i].patchlist;
                    844:                                while (p->next)
                    845:                                        p = p->next;
                    846:                                p->next = (struct patchlist *) malloc (sizeof (struct patchlist));
                    847:                                p = p->next;
                    848:                                p->next = NULL;
                    849:                                p->offset = dsps + 4;
                    850:                        }
                    851:                        return ((int) symbols[i].value);
                    852:                }
                    853:        }
                    854:        if (nsymbols >= MAXSYMBOLS) {
                    855:                errout ("Symbol table full");
                    856:                return (0);
                    857:        }
                    858:        symbols[nsymbols].type = S_LABEL;       /* assume forward reference */
                    859:        symbols[nsymbols].flags = 0;
                    860:        symbols[nsymbols].value = 0;
                    861:        p = (struct patchlist *) malloc (sizeof (struct patchlist));
                    862:        symbols[nsymbols].patchlist = p;
                    863:        p->next = NULL;
                    864:        p->offset = dsps + 4;
                    865:        len = strlen (name) + 1;
                    866:        symbols[nsymbols].name = malloc (len);
                    867:        strlcpy (symbols[nsymbols].name, name, len);
                    868:        ++nsymbols;
                    869:        return (0);
                    870: }
                    871:
                    872: void   f_arch (void)
                    873: {
                    874:        int i, archsave;
                    875:
                    876:        i = tokenix;
                    877:
                    878:        archsave = arch;
                    879:        setarch(tokens[i].name);
                    880:        if( arch == 0) {
                    881:                errout("Unrecognized ARCH");
                    882:                arch = archsave;
                    883:        }
                    884: }
                    885:
                    886: void   f_proc (void)
                    887: {
                    888:        if (tokens[tokenix].type != 0 || tokens[tokenix + 1].type != ':')
                    889:                errout ("Invalid PROC statement");
                    890:        else
                    891:                new_script (tokens[tokenix].name);
                    892: }
                    893:
                    894: void   f_pass (void)
                    895: {
                    896:        errout ("PASS option not implemented");
                    897: }
                    898:
                    899: /*
                    900:  *     f_list:  process list of symbols for the ENTRY and EXTERNAL directive
                    901:  */
                    902:
                    903: void   f_list (void)
                    904: {
                    905:        int     i;
                    906:        short   type;
                    907:        short   flags;
                    908:
                    909:        type = strcmpi (tokens[tokenix-1].name, "ENTRY") ? S_EXTERNAL : S_LABEL;
                    910:        flags = type == S_LABEL ? F_ENTRY : 0;
                    911:        for (i = tokenix; i < ntokens; ++i) {
                    912:                if (tokens[i].type != 0) {
                    913:                        errout ("Expected an identifier");
                    914:                        return;
                    915:                }
                    916:                define_symbol (tokens[i].name, 0, type, flags);
                    917:                if (i + 1 < ntokens) {
                    918:                        if (tokens[++i].type == ',')
                    919:                                continue;
                    920:                        errout ("Expected a separator");
                    921:                        return;
                    922:                }
                    923:        }
                    924: }
                    925:
                    926: /*
                    927:  *     f_define:       process list of definitions for ABSOLUTE and RELATIVE directive
                    928:  */
                    929:
                    930: void   f_define (void)
                    931: {
                    932:        int     i;
                    933:        char    *name;
                    934:        u_int32_t value;
                    935:        int     type;
                    936:
                    937:        type = strcmpi (tokens[tokenix-1].name, "ABSOLUTE") ? S_RELATIVE : S_ABSOLUTE;
                    938:        i = tokenix;
                    939:        while (i < ntokens) {
                    940:                if (tokens[i].type) {
                    941:                        errout ("Expected an identifier");
                    942:                        return;
                    943:                }
                    944:                if (tokens[i + 1].type != '=') {
                    945:                        errout ("Expected a separator");
                    946:                        return;
                    947:                }
                    948:                name = tokens[i].name;
                    949:                i += 2;
                    950:                value = expression (&i);
                    951:                define_symbol (name, value, type, F_DEFINED);
                    952:        }
                    953: }
                    954:
                    955: void   store_inst ()
                    956: {
                    957:        int     i = dsps / 4;
                    958:        int     l = 8;
                    959:
                    960:        if ((inst0 & 0xe0000000) == 0xc0000000)
                    961:                l = 12;                 /* Memory to memory move is 12 bytes */
                    962:        if ((dsps + l) / 4 > MAXINST) {
                    963:                errout ("Instruction table overflow");
                    964:                return;
                    965:        }
                    966:        script[i++] = inst0;
                    967:        script[i++] = inst1;
                    968:        if (l == 12)
                    969:                script[i++] = inst2;
                    970:        if (listfp) {
                    971:                fprintf (listfp, "\t%04x: %08x %08x", dsps, inst0, inst1);
                    972:                if (l == 12)
                    973:                        fprintf (listfp, " %08x", inst2);
                    974:                fprintf (listfp, "\n");
                    975:        }
                    976:        dsps += l;
                    977:        inst0 = inst1 = inst2 = 0;
                    978:        ++ninsts;
                    979: }
                    980:
                    981: void   f_move (void)
                    982: {
                    983:        if (reserved ("memory", tokenix))
                    984:                memory_to_memory ();
                    985:        else if (reserved ("from", tokenix) || tokens[tokenix+1].type == ',')
                    986:                block_move ();
                    987:        else
                    988:                register_write ();
                    989:        store_inst ();
                    990: }
                    991:
                    992: void   f_jump (void)
                    993: {
                    994:        transfer (0x80000000, 0);
                    995: }
                    996:
                    997: void   f_call (void)
                    998: {
                    999:        transfer (0x88000000, 0);
                   1000: }
                   1001:
                   1002: void   f_return (void)
                   1003: {
                   1004:        transfer (0x90000000, 1);
                   1005: }
                   1006:
                   1007: void   f_int (void)
                   1008: {
                   1009:        transfer (0x98000000, 2);
                   1010: }
                   1011:
                   1012: void   f_intfly (void)
                   1013: {
                   1014:        transfer (0x98100000, 2);
                   1015: }
                   1016:
                   1017: void   f_select (void)
                   1018: {
                   1019:        int     t = tokenix;
                   1020:
                   1021:        if (reserved ("atn", t)) {
                   1022:                inst0 = 0x01000000;
                   1023:                ++t;
                   1024:        }
                   1025:        select_reselect (t);
                   1026: }
                   1027:
                   1028: void   f_reselect (void)
                   1029: {
                   1030:        select_reselect (tokenix);
                   1031: }
                   1032:
                   1033: void   f_wait (void)
                   1034: {
                   1035:        int     i = tokenix;
                   1036:
                   1037:        inst1 = 0;
                   1038:        if (reserved ("disconnect", i)) {
                   1039:                inst0 = 0x48000000;
                   1040:        }
                   1041:        else {
                   1042:                if (reserved ("reselect", i))
                   1043:                        inst0 = 0x50000000;
                   1044:                else if (reserved ("select", i))
                   1045:                        inst0 = 0x50000000;
                   1046:                else
                   1047:                        errout ("Expected SELECT or RESELECT");
                   1048:                ++i;
                   1049:                if (reserved ("rel", i)) {
                   1050: #if 0 /* driver will fix relative dsps to absolute */
                   1051:                        if (arch < ARCH710) {
                   1052:                                errout ("Wrong arch for relative dsps");
                   1053:                        }
                   1054: #endif
                   1055:                        i += 2;
                   1056:                        inst1 = evaluate (i) - dsps - 8;
                   1057:                        inst0 |= 0x04000000;
                   1058:                }
                   1059:                else {
                   1060:                        inst1 = evaluate (i);
                   1061:                        patch_label();
                   1062:                }
                   1063:        }
                   1064:        store_inst ();
                   1065: }
                   1066:
                   1067: void   f_disconnect (void)
                   1068: {
                   1069:        inst0 = 0x48000000;
                   1070:        store_inst ();
                   1071: }
                   1072:
                   1073: void   f_set (void)
                   1074: {
                   1075:        set_clear (0x58000000);
                   1076: }
                   1077:
                   1078: void   f_clear (void)
                   1079: {
                   1080:        set_clear (0x60000000);
                   1081: }
                   1082:
                   1083: void   f_load (void)
                   1084: {
                   1085:        inst0 = 0xe1000000;
                   1086:        if (arch < ARCH810) {
                   1087:                errout ("Wrong arch for load/store");
                   1088:                return;
                   1089:        }
                   1090:        loadstore(tokenix);
                   1091: }
                   1092:
                   1093: void   f_store (void)
                   1094: {
                   1095:        int i;
                   1096:        inst0 = 0xe0000000;
                   1097:        if (arch < ARCH810) {
                   1098:                errout ("Wrong arch for load/store");
                   1099:                return;
                   1100:        }
                   1101:        i = tokenix;
                   1102:        if (reserved("noflush", i)) {
                   1103:                inst0 |= 0x2000000;
                   1104:                i++;
                   1105:        }
                   1106:        loadstore(i);
                   1107: }
                   1108:
                   1109: void   f_nop (void)
                   1110: {
                   1111:        inst0 = 0x80000000;
                   1112:        inst1 = 0x00000000;
                   1113:        store_inst ();
                   1114: }
                   1115:
                   1116: void loadstore(int i)
                   1117: {
                   1118:        int reg, size;
                   1119:
                   1120:        reg = CheckRegister(i);
                   1121:        if (reg < 0)
                   1122:                errout ("Expected register");
                   1123:        else
                   1124:                inst0 |= reg <<  16;
                   1125:        if (reg == 8)
                   1126:                errout ("Register can't be SFBR");
                   1127:        i++;
                   1128:        if (tokens[i].type == ',')
                   1129:                i++;
                   1130:        else
                   1131:                errout ("expected ','");
                   1132:        size = evaluate(i);
                   1133:        if (i < 1 || i > 4)
                   1134:                errout("wrong size");
                   1135:        if ((reg & 0x3) + size > 4)
                   1136:                errout("size too big for register");
                   1137:        inst0 |= size;
                   1138:        i++;
                   1139:        if (tokens[i].type == ',')
                   1140:                i++;
                   1141:        else
                   1142:                errout ("expected ','");
                   1143:        if (reserved("from", i) || reserved("dsarel", i)) {
                   1144:                if (arch < ARCH710) {
                   1145:                        errout ("Wrong arch for table indirect");
                   1146:                        return;
                   1147:                }
                   1148:                i++;
                   1149:                inst0 |= 0x10000000;
                   1150:        }
                   1151:        inst1 = evaluate(i);
                   1152:        store_inst ();
                   1153: }
                   1154:
                   1155: void   transfer (int word0, int type)
                   1156: {
                   1157:        int     i;
                   1158:
                   1159:        i = tokenix;
                   1160:        inst0 = word0;
                   1161:        if (type == 0 && reserved ("rel", i)) {
                   1162: #if 0 /* driver will fix relative dsps to absolute */
                   1163:                if (arch < ARCH710) {
                   1164:                        errout ("Wrong arch for relative dsps");
                   1165:                }
                   1166: #endif
                   1167:                inst1 = evaluate (i + 2) - dsps - 8;
                   1168:                i += 4;
                   1169:                inst0 |= 0x00800000;
                   1170:        }
                   1171:        else if (type != 1) {
                   1172:                inst1 = evaluate (i);
                   1173:                ++i;
                   1174:                if (type == 0)
                   1175:                        patch_label();
                   1176:        }
                   1177:        if (i >= ntokens) {
                   1178:                inst0 |= 0x00080000;
                   1179:                store_inst ();
                   1180:                return;
                   1181:        }
                   1182:        if (tokens[i].type != ',')
                   1183:                errout ("Expected a separator, ',' assumed");
                   1184:        else
                   1185:                ++i;
                   1186:        if (reserved("when", i))
                   1187:                inst0 |= 0x00010000;
                   1188:        else if (reserved ("if", i) == 0) {
                   1189:                errout ("Expected a reserved word");
                   1190:                store_inst ();
                   1191:                return;
                   1192:        }
                   1193:        i++;
                   1194:        if (reserved("false", i)) {
                   1195:                store_inst ();
                   1196:                return;
                   1197:        }
                   1198:        if (reserved ("not", i))
                   1199:                ++i;
                   1200:        else
                   1201:                inst0 |= 0x00080000;
                   1202:        if (reserved ("atn", i)) {
                   1203:                inst0 |= 0x00020000;
                   1204:                ++i;
                   1205:        } else if (CheckPhase (i)) {
                   1206:                inst0 |= 0x00020000;
                   1207:                ++i;
                   1208:        }
                   1209:        if (i < ntokens && tokens[i].type != ',') {
                   1210:                if (inst0 & 0x00020000) {
                   1211:                        if (inst0 & 0x00080000 && reserved ("and", i)) {
                   1212:                                ++i;
                   1213:                        }
                   1214:                        else if ((inst0 & 0x00080000) == 0 && reserved ("or", i)) {
                   1215:                                ++i;
                   1216:                        }
                   1217:                        else
                   1218:                                errout ("Expected a reserved word");
                   1219:                }
                   1220:                inst0 |= 0x00040000 + (evaluate (i++) & 0xff);
                   1221:        }
                   1222:        if (i < ntokens) {
                   1223:                if (tokens[i].type == ',')
                   1224:                        ++i;
                   1225:                else
                   1226:                        errout ("Expected a separator, ',' assumed");
                   1227:                if (reserved ("and", i) && reserved ("mask", i + 1))
                   1228:                        inst0 |= ((evaluate (i + 2) & 0xff) << 8);
                   1229:                else
                   1230:                        errout ("Expected , AND MASK");
                   1231:        }
                   1232:        store_inst ();
                   1233: }
                   1234:
                   1235: void   select_reselect (int t)
                   1236: {
                   1237:        inst0 |= 0x40000000;            /* ATN may be set from SELECT */
                   1238:        if (reserved ("from", t)) {
                   1239:                if (arch < ARCH710) {
                   1240:                        errout ("Wrong arch for table indirect");
                   1241:                        return;
                   1242:                }
                   1243:                ++t;
                   1244:                inst0 |= 0x02000000 | evaluate (t++);
                   1245:        }
                   1246:        else
                   1247:                inst0 |= (evaluate (t++) & 0xff) << 16;
                   1248:        if (tokens[t++].type == ',') {
                   1249:                if (reserved ("rel", t)) {
                   1250: #if 0 /* driver will fix relative dsps to absolute */
                   1251:                        if (arch < ARCH710) {
                   1252:                                errout ("Wrong arch for relative dsps");
                   1253:                        }
                   1254: #endif
                   1255:                        inst0 |= 0x04000000;
                   1256:                        inst1 = evaluate (t + 2) - dsps - 8;
                   1257:                }
                   1258:                else {
                   1259:                        inst1 = evaluate (t);
                   1260:                        patch_label();
                   1261:                }
                   1262:        }
                   1263:        else
                   1264:                errout ("Expected separator");
                   1265:        store_inst ();
                   1266: }
                   1267:
                   1268: void   set_clear (u_int32_t code)
                   1269: {
                   1270:        int     i = tokenix;
                   1271:        short   need_and = 0;
                   1272:
                   1273:        inst0 = code;
                   1274:        while (i < ntokens) {
                   1275:                if (need_and) {
                   1276:                        if (reserved ("and", i))
                   1277:                                ++i;
                   1278:                        else
                   1279:                                errout ("Expected AND");
                   1280:                }
                   1281:                if (reserved ("atn", i)) {
                   1282:                        inst0 |= 0x0008;
                   1283:                        ++i;
                   1284:                }
                   1285:                else if (reserved ("ack", i)) {
                   1286:                        inst0 |= 0x0040;
                   1287:                        ++i;
                   1288:                }
                   1289:                else if (reserved ("target", i)) {
                   1290:                        inst0 |= 0x0200;
                   1291:                        ++i;
                   1292:                }
                   1293:                else if (reserved ("carry", i)) {
                   1294:                        inst0 |= 0x0400;
                   1295:                        ++i;
                   1296:                }
                   1297:                else
                   1298:                        errout ("Expected ATN, ACK, TARGET or CARRY");
                   1299:                need_and = 1;
                   1300:        }
                   1301:        store_inst ();
                   1302: }
                   1303:
                   1304: void   block_move ()
                   1305: {
                   1306:        if (reserved ("from", tokenix)) {
                   1307:                if (arch < ARCH710) {
                   1308:                        errout ("Wrong arch for table indirect");
                   1309:                        return;
                   1310:                }
                   1311:                inst1 = evaluate (tokenix+1);
                   1312:                inst0 |= 0x10000000 | inst1;    /*** ??? to match Zeus script */
                   1313:                tokenix += 2;
                   1314:        }
                   1315:        else {
                   1316:                inst0 |= evaluate (tokenix++);  /* count */
                   1317:                tokenix++;                      /* skip ',' */
                   1318:                if (reserved ("ptr", tokenix)) {
                   1319:                        ++tokenix;
                   1320:                        inst0 |= 0x20000000;
                   1321:                }
                   1322:                inst1 = evaluate (tokenix++);   /* address */
                   1323:        }
                   1324:        if (tokens[tokenix].type != ',')
                   1325:                errout ("Expected separator");
                   1326:        if (reserved ("when", tokenix + 1)) {
                   1327:                inst0 |= 0x08000000;
                   1328:                CheckPhase (tokenix + 2);
                   1329:        }
                   1330:        else if (reserved ("with", tokenix + 1)) {
                   1331:                CheckPhase (tokenix + 2);
                   1332:        }
                   1333:        else
                   1334:                errout ("Expected WITH or WHEN");
                   1335: }
                   1336:
                   1337: void   register_write ()
                   1338: {
                   1339:        /*
                   1340:         * MOVE reg/data8 TO reg                        register write
                   1341:         * MOVE reg <op> data8 TO reg                   register write
                   1342:         * MOVE reg + data8 TO reg WITH CARRY           register write
                   1343:         */
                   1344:        int     op;
                   1345:        int     reg;
                   1346:        int     data;
                   1347:
                   1348:        if (reserved ("to", tokenix+1))
                   1349:                op = 0;
                   1350:        else if (reserved ("shl", tokenix+1))
                   1351:                op = 1;
                   1352:        else if (reserved ("shr", tokenix+1))
                   1353:                op = 5;
                   1354:        else if (tokens[tokenix+1].type == '|')
                   1355:                op = 2;
                   1356:        else if (reserved ("xor", tokenix+1))
                   1357:                op = 3;
                   1358:        else if (tokens[tokenix+1].type == '&')
                   1359:                op = 4;
                   1360:        else if (tokens[tokenix+1].type == '+')
                   1361:                op = 6;
                   1362:        else if (tokens[tokenix+1].type == '-')
                   1363:                op = 8;
                   1364:        else
                   1365:                errout ("Unknown register operator");
                   1366:        switch (op) {
                   1367:        case 2:
                   1368:        case 3:
                   1369:        case 4:
                   1370:        case 6:
                   1371:        case 8:
                   1372:                if (reserved ("to", tokenix+3) == 0)
                   1373:                        errout ("Register command expected TO");
                   1374:        }
                   1375:        reg = CheckRegister (tokenix);
                   1376:        if (reg < 0) {                  /* Not register, must be data */
                   1377:                data = evaluate (tokenix);
                   1378:                if (op)
                   1379:                        errout ("Register operator not move");
                   1380:                reg = CheckRegister (tokenix+2);
                   1381:                if (reg < 0)
                   1382:                        errout ("Expected register");
                   1383:                inst0 = 0x78000000 | (data << 8) | reg << 16;
                   1384: #if 0
                   1385: fprintf (listfp, "Move data to register: %02x %d\n", data, reg);
                   1386: #endif
                   1387:        } else if (op) {
                   1388:                switch (op) {
                   1389:                case 2:
                   1390:                case 3:
                   1391:                case 4:
                   1392:                case 6:
                   1393:                case 8:
                   1394:                        inst0 = 0;
                   1395:                        /* A register read/write operator */
                   1396:                        if (reserved("sfbr", tokenix+2)) {
                   1397:                                if (arch < ARCH825)
                   1398:                                        errout("wrong arch for add with SFBR");
                   1399:                                if (op == 8)
                   1400:                                        errout("can't substract SFBR");
                   1401:                                inst0 |= 0x00800000;
                   1402:                                data = 0;
                   1403:                        } else
                   1404:                                data = evaluate (tokenix+2);
                   1405:                        if (tokenix+5 < ntokens) {
                   1406:                                if (!reserved("with", tokenix+5) ||
                   1407:                                    !reserved("carry", tokenix+6)) {
                   1408:                                        errout("Expected 'WITH CARRY'");
                   1409:                                } else if (op != 6) {
                   1410:                                        errout("'WITH CARRY' only valide "
                   1411:                                            "with '+'");
                   1412:                                }
                   1413:                                op = 7;
                   1414:                        }
                   1415:                        if (op == 8) {
                   1416:                                data = -data;
                   1417:                                op = 6;
                   1418:                        }
                   1419:                        inst0 |= (data & 0xff) << 8;
                   1420:                        data = CheckRegister (tokenix+4);
                   1421:                        break;
                   1422:                default:
                   1423:                        data = CheckRegister (tokenix+2);
                   1424:                        break;
                   1425:                }
                   1426:                if (data < 0)
                   1427:                        errout ("Expected register");
                   1428:                if (reg != data && reg != 8 && data != 8)
                   1429:                        errout ("One register MUST be SBFR");
                   1430:                if (reg == data) {      /* A register read/modify/write */
                   1431: #if 0
                   1432: fprintf (listfp, "Read/modify register: %02x %d %d\n", inst0 >> 8, op, reg);
                   1433: #endif
                   1434:                        inst0 |= 0x78000000 | (op << 24) | (reg << 16);
                   1435:                }
                   1436:                else {                  /* A move to/from SFBR */
                   1437:                        if (reg == 8) { /* MOVE SFBR <> TO reg */
                   1438: #if 0
                   1439: fprintf (listfp, "Move SFBR to register: %02x %d %d\n", inst0 >> 8, op, data);
                   1440: #endif
                   1441:                                inst0 |= 0x68000000 | (op << 24) | (data << 16);
                   1442:                        }
                   1443:                        else {
                   1444: #if 0
                   1445: fprintf (listfp, "Move register to SFBR: %02x %d %d\n", inst0 >> 8, op, reg);
                   1446: #endif
                   1447:                                inst0 |= 0x70000000 | (op << 24) | (reg << 16);
                   1448:                        }
                   1449:                }
                   1450:        } else {                                /* register to register */
                   1451:                data = CheckRegister (tokenix+2);
                   1452:                if (data < 0)
                   1453:                        errout ("Expected register");
                   1454:                if (reg == 8)           /* move SFBR to reg */
                   1455:                        inst0 = 0x6a000000 | (data << 16);
                   1456:                else if (data == 8)     /* move reg to SFBR */
                   1457:                        inst0 = 0x72000000 | (reg << 16);
                   1458:                else
                   1459:                        errout ("One register must be SFBR");
                   1460:        }
                   1461: }
                   1462:
                   1463: void   memory_to_memory ()
                   1464: {
                   1465:        inst0 = 0xc0000000 + evaluate (tokenix+1);
                   1466:        inst1 = evaluate (tokenix+3);
                   1467:        /*
                   1468:         * need to hack dsps, otherwise patch offset will be wrong for
                   1469:         * second pointer
                   1470:         */
                   1471:        dsps += 4;
                   1472:        inst2 = evaluate (tokenix+5);
                   1473:        dsps -= 4;
                   1474: }
                   1475:
                   1476: void   error_line()
                   1477: {
                   1478:        if (errfp != listfp && errfp && err_listed == 0) {
                   1479:                fprintf (errfp, "%3d:  %s", lineno, inbuf);
                   1480:                err_listed = 1;
                   1481:        }
                   1482: }
                   1483:
                   1484: char * makefn (base, sub)
                   1485:        char *base;
                   1486:        char *sub;
                   1487: {
                   1488:        char *fn;
                   1489:        size_t len = strlen (base) + strlen (sub) + 2;
                   1490:
                   1491:        fn = malloc (len);
                   1492:        strlcpy (fn, base, len);
                   1493:        base = strrchr(fn, '.');
                   1494:        if (base)
                   1495:                *base = 0;
                   1496:        strlcat (fn, ".", len);
                   1497:        strlcat (fn, sub, len);
                   1498:        return (fn);
                   1499: }
                   1500:
                   1501: void   usage()
                   1502: {
                   1503:        fprintf (stderr, "usage: scc sourcfile [options]\n");
                   1504:        exit(1);
                   1505: }

CVSweb