|
|
1.1 root 1: #include "../machine/psl.h"
2:
3: /************************************************/
4: /* Basic 6/32 machine definitions */
5: /************************************************/
6:
7: #define FALSE 0
8: #define TRUE (~FALSE)
9: #define READ 0
10: #define WRITE 1
11:
12: /*
13: * Some floatng point stuff.
14: */
15:
16: #define exp(x) ( (x) & 0x7f800000 )
17: #define reserved(x) ( (x) < 0 && (exp(x) == 0) )
18:
19: /************************************************/
20: /* */
21: /* Opcodes description table stuff */
22: /* */
23: /************************************************/
24:
25: struct operand_des { /* Operand descriptor in great table */
26: int add_modes; /* Allowed addressing modes */
27: int length; /* Length of this data (bytes) */
28: };
29:
30: #define Add 1 /* Any address except PC relative & ablsolute */
31: #define Dir 2 /* Direct register */
32: #define Imm 4 /* Immediate datum */
33: #define Lit 8 /* Short literal */
34: #define Brd 0x10 /* Branch displacement */
35: #define Pcrel 0x20 /* PC relative allowed */
36: #define Abs 0x40 /* Absolute address allowed */
37: #define SPmode 0x80 /* The stack pointer was involved , -(sp) or (sp)+ */
38: #define ADDFIELD 0xff /* Allowed addressing modes */
39:
40: #define W 0x100 /* Access is write */
41: #define R 0x200 /* Access is 'read' */
42: #define Indx 0x400 /* Indexable base address */
43: #define NOVF 0x800 /* Inhibit overflow check when writing byte/word */
44: #define FLP 0x1000 /* Floating point operand */
45:
46: #define M (R|W) /* Access is 'modify' */
47: #define PR (Pcrel|Abs)
48: #define ADDR (PR|Add)
49: #define ADI (ADDR|Dir|Imm|Lit)
50: #define AD (ADDR|Dir)
51: #define MAD (M|ADDR|Dir)
52: #define WAD (W|ADDR|Dir)
53: #define WD (W|Dir)
54: #define NWAD (NOVF|WAD)
55: #define NMAD (NOVF|MAD)
56: #define RADI (R|ADI) /* Readable datum */
57: #define RAD (R|AD) /* Modify type access for destinations */
58: #define RADF (RAD|FLP)
59: #define WADF (WAD|FLP)
60:
61:
62:
63:
64: struct opcode_des { /* One line in the big table */
65: int (*routine) (); /* Handler for this opcode */
66: struct operand_des operand[4]; /* Up to 4 operands */
67: };
68:
69: /************************************************/
70: /* */
71: /* Operand descriptor as returned */
72: /* by the address mode decoder */
73: /* */
74: /************************************************/
75:
76: struct oprnd {
77: long mode; /* Add, Imm, Dir or Brd */
78: long reg_number; /* returned for Dir mode */
79: long address; /* Relevant for Add or Brd */
80: long data;
81: long data2; /* Up to 8 bytes returned */
82: long length; /* Length of data manipulated */
83: };
84:
85: /************************************************/
86: /* */
87: /* Some PSL macros (usefull) */
88: /* */
89: /************************************************/
90: #define carry (psl & PSL_C)
91: #define negative (psl & PSL_N)
92: #define overflow (psl & PSL_V)
93: #define zero (psl & PSL_Z)
94:
95: #define carry_1 psl |= PSL_C
96: #define negative_1 psl |= PSL_N
97: #define overflow_1 psl |= PSL_V
98: #define zero_1 psl |= PSL_Z
99:
100: #define carry_0 psl &= ~PSL_C
101: #define negative_0 psl &= ~PSL_N
102: #define overflow_0 psl &= ~PSL_V
103: #define zero_0 psl &= ~PSL_Z
104:
105:
106: struct oprnd *operand ();
107: struct opcode_des Table[];
108:
109: struct double_length
110: {
111: int low;
112: int high;
113: };
114:
115: typedef struct double_length quadword;
116:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.