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