Annotation of coherent/d/bin/as/i8086/addr.c,v, revision 1.1

1.1     ! root        1: head     1.2;
        !             2: access   ;
        !             3: symbols  ;
        !             4: locks    bin:1.2;
        !             5: comment  @ * @;
        !             6: 
        !             7: 
        !             8: 1.2
        !             9: date     91.02.06.20.42.57;  author bin;  state Exp;
        !            10: branches ;
        !            11: next   1.1;
        !            12: 
        !            13: 1.1
        !            14: date     91.02.06.20.42.47;  author bin;  state Exp;
        !            15: branches ;
        !            16: next   ;
        !            17: 
        !            18: 
        !            19: desc
        !            20: @steve 2/6/91
        !            21: Initial MWC RCS revision.
        !            22: @
        !            23: 
        !            24: 
        !            25: 1.2
        !            26: log
        !            27: @steve 2/6/91
        !            28: Descriptive error messages.
        !            29: @
        !            30: text
        !            31: @#include "asm.h"
        !            32: 
        !            33: /*
        !            34:  * Address mode table.
        !            35:  * This table is indexed by the number
        !            36:  * that gets put in the r/m field,
        !            37:  * and holds a word containing a bit for
        !            38:  * each index register.
        !            39:  */
        !            40: 
        !            41: int    amodes[] = {
        !            42:        (1<<reg(BX)) + (1<<reg(SI)),
        !            43:        (1<<reg(BX)) + (1<<reg(DI)),
        !            44:        (1<<reg(BP)) + (1<<reg(SI)),
        !            45:        (1<<reg(BP)) + (1<<reg(DI)),
        !            46:        (1<<reg(SI)),
        !            47:        (1<<reg(DI)),
        !            48:        (1<<reg(BP)),
        !            49:        (1<<reg(BX))
        !            50: };
        !            51: 
        !            52: char   segovr[] = {
        !            53:        0x26,
        !            54:        0x2E,
        !            55:        0x36,
        !            56:        0x3E
        !            57: };
        !            58: 
        !            59: /*
        !            60:  * Read an address.
        !            61:  * Return the addressing mode.
        !            62:  */
        !            63: addr(esp)
        !            64: register struct expr *esp;
        !            65: {
        !            66:        register c;
        !            67: 
        !            68:        if ((c = getnb()) == '$') {
        !            69:                expr(esp, 0);
        !            70:                esp->e_mode = IM;
        !            71:                return (IM);
        !            72:        }
        !            73:        if (c == '(') {
        !            74:                addrx(esp);
        !            75:                esp->e_type = E_ACON;
        !            76:                esp->e_addr = 0;
        !            77:                return (esp->e_mode & MMASK);
        !            78:        }
        !            79:        unget(c);
        !            80:        expr(esp, 0);
        !            81:        if (esp->e_type == E_AREG) {
        !            82:                esp->e_mode = esp->e_addr;
        !            83:                if ((esp->e_mode & MMASK) == SEGR)
        !            84:                        if ((c = getnb()) == ':') {     /* segment override */
        !            85:                                outab(segovr[reg(esp->e_addr)]);
        !            86:                                addr(esp);
        !            87:                        } else
        !            88:                                unget(c);
        !            89:                return (esp->e_mode & MMASK);
        !            90:        }
        !            91:        if ((c = getnb()) == '(') {
        !            92:                addrx(esp);
        !            93:                if (esp->e_mode==IDX || esp->e_mode==ICL)
        !            94:                        aerr("invalid index register");
        !            95:                return (esp->e_mode & MMASK);
        !            96:        }
        !            97:        unget(c);
        !            98:        esp->e_mode = DIR;
        !            99:        return (DIR);
        !           100: }
        !           101: 
        !           102: /*
        !           103:  * Read in index register field
        !           104:  * of an address. The leading `(' has already
        !           105:  * been read. Set the mode into the `e_mode'
        !           106:  * field of the expression structure.
        !           107:  */
        !           108: addrx(esp)
        !           109: struct expr *esp;
        !           110: {
        !           111:        register struct sym *sp;
        !           112:        register c, i;
        !           113:        int mask, mode;
        !           114:        char id[NCPLN];
        !           115: 
        !           116:        mode = 0;
        !           117:        do {
        !           118:                getid(id, -1);
        !           119:                if ((sp=lookup(id, 0))==NULL || sp->s_type!=E_AREG)
        !           120:                        aerr("index by non-register");
        !           121:                else {
        !           122:                        mask = 01 << reg(sp->s_addr);
        !           123:                        if ((mode&mask) != 0)
        !           124:                                aerr("invalid index register");
        !           125:                        mode |= mask;
        !           126:                }
        !           127:        } while ((c = getnb()) == ',');
        !           128:        if (c != ')')
        !           129:                qerr("missing ')'");
        !           130:        if (mode == (01<<reg(CL))) {
        !           131:                esp->e_mode = ICL;
        !           132:                return;
        !           133:        }
        !           134:        if (mode == (01<<reg(DX))) {
        !           135:                esp->e_mode = IDX;
        !           136:                return;
        !           137:        }
        !           138:        for (i=0; i<8; ++i) {
        !           139:                if (mode == amodes[i]) {
        !           140:                        esp->e_mode = X | i;
        !           141:                        return;
        !           142:                }
        !           143:        }
        !           144:        aerr("invalid index");
        !           145:        esp->e_mode = D;
        !           146: }
        !           147: @
        !           148: 
        !           149: 
        !           150: 1.1
        !           151: log
        !           152: @Initial revision
        !           153: @
        !           154: text
        !           155: @d64 1
        !           156: a64 1
        !           157:                        aerr();
        !           158: d90 1
        !           159: a90 1
        !           160:                        aerr();
        !           161: d94 1
        !           162: a94 1
        !           163:                                aerr();
        !           164: d99 1
        !           165: a99 1
        !           166:                qerr();
        !           167: d114 1
        !           168: a114 1
        !           169:        aerr();
        !           170: @

unix.superglobalmegacorp.com

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