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

1.1       root        1: #include "asm.h"
                      2: 
                      3: /*
                      4:  * Address mode table.
                      5:  * This table is indexed by the number
                      6:  * that gets put in the r/m field,
                      7:  * and holds a word containing a bit for
                      8:  * each index register.
                      9:  */
                     10: 
                     11: int    amodes[] = {
                     12:        (1<<reg(BX)) + (1<<reg(SI)),
                     13:        (1<<reg(BX)) + (1<<reg(DI)),
                     14:        (1<<reg(BP)) + (1<<reg(SI)),
                     15:        (1<<reg(BP)) + (1<<reg(DI)),
                     16:        (1<<reg(SI)),
                     17:        (1<<reg(DI)),
                     18:        (1<<reg(BP)),
                     19:        (1<<reg(BX))
                     20: };
                     21: 
                     22: char   segovr[] = {
                     23:        0x26,
                     24:        0x2E,
                     25:        0x36,
                     26:        0x3E
                     27: };
                     28: 
                     29: /*
                     30:  * Read an address.
                     31:  * Return the addressing mode.
                     32:  */
                     33: addr(esp)
                     34: register struct expr *esp;
                     35: {
                     36:        register c;
                     37: 
                     38:        if ((c = getnb()) == '$') {
                     39:                expr(esp, 0);
                     40:                esp->e_mode = IM;
                     41:                return (IM);
                     42:        }
                     43:        if (c == '(') {
                     44:                addrx(esp);
                     45:                esp->e_type = E_ACON;
                     46:                esp->e_addr = 0;
                     47:                return (esp->e_mode & MMASK);
                     48:        }
                     49:        unget(c);
                     50:        expr(esp, 0);
                     51:        if (esp->e_type == E_AREG) {
                     52:                esp->e_mode = esp->e_addr;
                     53:                if ((esp->e_mode & MMASK) == SEGR)
                     54:                        if ((c = getnb()) == ':') {     /* segment override */
                     55:                                outab(segovr[reg(esp->e_addr)]);
                     56:                                addr(esp);
                     57:                        } else
                     58:                                unget(c);
                     59:                return (esp->e_mode & MMASK);
                     60:        }
                     61:        if ((c = getnb()) == '(') {
                     62:                addrx(esp);
                     63:                if (esp->e_mode==IDX || esp->e_mode==ICL)
                     64:                        aerr("invalid index register");
                     65:                return (esp->e_mode & MMASK);
                     66:        }
                     67:        unget(c);
                     68:        esp->e_mode = DIR;
                     69:        return (DIR);
                     70: }
                     71: 
                     72: /*
                     73:  * Read in index register field
                     74:  * of an address. The leading `(' has already
                     75:  * been read. Set the mode into the `e_mode'
                     76:  * field of the expression structure.
                     77:  */
                     78: addrx(esp)
                     79: struct expr *esp;
                     80: {
                     81:        register struct sym *sp;
                     82:        register c, i;
                     83:        int mask, mode;
                     84:        char id[NCPLN];
                     85: 
                     86:        mode = 0;
                     87:        do {
                     88:                getid(id, -1);
                     89:                if ((sp=lookup(id, 0))==NULL || sp->s_type!=E_AREG)
                     90:                        aerr("index by non-register");
                     91:                else {
                     92:                        mask = 01 << reg(sp->s_addr);
                     93:                        if ((mode&mask) != 0)
                     94:                                aerr("invalid index register");
                     95:                        mode |= mask;
                     96:                }
                     97:        } while ((c = getnb()) == ',');
                     98:        if (c != ')')
                     99:                qerr("missing ')'");
                    100:        if (mode == (01<<reg(CL))) {
                    101:                esp->e_mode = ICL;
                    102:                return;
                    103:        }
                    104:        if (mode == (01<<reg(DX))) {
                    105:                esp->e_mode = IDX;
                    106:                return;
                    107:        }
                    108:        for (i=0; i<8; ++i) {
                    109:                if (mode == amodes[i]) {
                    110:                        esp->e_mode = X | i;
                    111:                        return;
                    112:                }
                    113:        }
                    114:        aerr("invalid index");
                    115:        esp->e_mode = D;
                    116: }

unix.superglobalmegacorp.com

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