00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 #include <stdio.h>
00052
00053
00054
00055
00056
00057 #define OP 8
00058
00059
00060 #define DEST 6
00061
00062
00063 #define SOURCE1 6
00064
00065
00066 #define SOURCE2 6
00067
00068
00069 #define REGs 32
00070
00071
00072
00073 typedef unsigned int UINT;
00074 #define WORD long
00075 #define FLAG unsigned
00076 #define STATE short
00077
00078
00079
00080
00081
00082
00083 #undef PMEM
00084
00085
00086 #define PINT 0
00087
00088
00089 #define PFLT 1
00090
00091
00092 #define PMEM 2
00093
00094
00095 #define NA 3
00096
00097
00098 #define HIPRI 3
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 struct IR_FIELDS
00113 {
00114 unsigned op:OP,
00115 dest: DEST,
00116 src1: SOURCE1,
00117 src2: SOURCE2;
00118 int ltncy,
00119 extime,
00120
00121 wb_pri;
00122
00123 unsigned imm_flags:2,
00124
00125 rs1_used:1,
00126
00127 rs2_used:1,
00128
00129 rsd_used:1,
00130
00131 c_flag:1,
00132
00133 u_flag:1,
00134
00135 n_flag:1,
00136
00137 wb_flag:1,
00138
00139 dest_64:1,
00140
00141 s1_64:1,
00142
00143 s2_64:1,
00144 scale_flag:1,
00145
00146 brk_flg:1;
00147 };
00148
00149 struct mem_segs
00150 {
00151
00152 struct mem_wrd *seg;
00153
00154
00155 unsigned long baseaddr;
00156
00157
00158 unsigned long endaddr;
00159
00160
00161 int flags;
00162 };
00163
00164 #define MAXSEGS (10)
00165 #define MEMSEGSIZE (sizeof(struct mem_segs))
00166
00167 #if 0
00168 #define BRK_RD (0x01)
00169 #define BRK_WR (0x02)
00170 #define BRK_EXEC (0x04)
00171 #define BRK_CNT (0x08)
00172 #endif
00173
00174 struct mem_wrd
00175 {
00176
00177 struct IR_FIELDS opcode;
00178 union {
00179
00180 unsigned long l;
00181 unsigned short s[2];
00182 unsigned char c[4];
00183 } mem;
00184 };
00185
00186
00187 #define MEMWRDSIZE (sizeof (struct mem_wrd))
00188
00189 extern struct mem_segs memory[];
00190 extern struct PROCESSOR m78000;
00191
00192 struct PROCESSOR
00193 {
00194 unsigned WORD
00195
00196 ip,
00197
00198 vbr,
00199
00200 psr;
00201
00202
00203 WORD S1bus,
00204
00205 S2bus,
00206
00207 Dbus,
00208
00209 DAbus,
00210 ALU,
00211
00212 Regs[REGs],
00213
00214 time_left[REGs],
00215
00216 wb_pri[REGs],
00217
00218 SFU0_regs[REGs],
00219
00220 SFU1_regs[REGs],
00221 Scoreboard[REGs],
00222 Vbr;
00223 unsigned WORD scoreboard,
00224 Psw,
00225 Tpsw;
00226
00227 FLAG jump_pending:1;
00228 };
00229
00230
00231
00232 #define i26bit 1
00233 #define i16bit 2
00234 #define i10bit 3
00235
00236
00237
00238 #define mode 31
00239 #define rbo 30
00240 #define ser 29
00241 #define carry 28
00242 #define sf7m 11
00243 #define sf6m 10
00244 #define sf5m 9
00245 #define sf4m 8
00246 #define sf3m 7
00247 #define sf2m 6
00248 #define sf1m 5
00249 #define mam 4
00250 #define inm 3
00251 #define exm 2
00252 #define trm 1
00253 #define ovfm 0
00254
00255
00256
00257 #define ADDU 1
00258 #define ADDC 2
00259 #define ADDUC 3
00260 #define ADD 4
00261
00262 #define SUBU ADD+1
00263 #define SUBB ADD+2
00264 #define SUBUB ADD+3
00265 #define SUB ADD+4
00266
00267 #define AND_ ADD+5
00268 #define OR ADD+6
00269 #define XOR ADD+7
00270 #define CMP ADD+8
00271
00272
00273
00274 #define LDAB CMP+1
00275 #define LDAH CMP+2
00276 #define LDA CMP+3
00277 #define LDAD CMP+4
00278
00279 #define LDB LDAD+1
00280 #define LDH LDAD+2
00281 #define LD LDAD+3
00282 #define LDD LDAD+4
00283 #define LDBU LDAD+5
00284 #define LDHU LDAD+6
00285
00286
00287
00288 #define STB LDHU+1
00289 #define STH LDHU+2
00290 #define ST LDHU+3
00291 #define STD LDHU+4
00292
00293
00294
00295 #define XMEMBU LDHU+5
00296 #define XMEM LDHU+6
00297
00298
00299
00300 #define JSR STD+1
00301 #define BSR STD+2
00302 #define BR STD+3
00303 #define JMP STD+4
00304 #define BB1 STD+5
00305 #define BB0 STD+6
00306 #define RTN STD+7
00307 #define BCND STD+8
00308
00309
00310
00311 #define TB1 BCND+1
00312 #define TB0 BCND+2
00313 #define TCND BCND+3
00314 #define RTE BCND+4
00315 #define TBND BCND+5
00316
00317
00318
00319 #define MUL TBND + 1
00320 #define DIV MUL +2
00321 #define DIVU MUL +3
00322 #define MASK MUL +4
00323 #define FF0 MUL +5
00324 #define FF1 MUL +6
00325 #define CLR MUL +7
00326 #define SET MUL +8
00327 #define EXT MUL +9
00328 #define EXTU MUL +10
00329 #define MAK MUL +11
00330 #define ROT MUL +12
00331
00332
00333
00334 #define LDCR ROT +1
00335 #define STCR ROT +2
00336 #define XCR ROT +3
00337
00338 #define FLDCR ROT +4
00339 #define FSTCR ROT +5
00340 #define FXCR ROT +6
00341
00342 #define NOP XCR +1
00343
00344
00345
00346 #define FADD NOP +1
00347 #define FSUB NOP +2
00348 #define FMUL NOP +3
00349 #define FDIV NOP +4
00350 #define FSQRT NOP +5
00351 #define FCMP NOP +6
00352 #define FIP NOP +7
00353 #define FLT NOP +8
00354 #define INT NOP +9
00355 #define NINT NOP +10
00356 #define TRNC NOP +11
00357 #define FLDC NOP +12
00358 #define FSTC NOP +13
00359 #define FXC NOP +14
00360
00361 #define UEXT(src,off,wid) \
00362 ((((unsigned int)(src)) >> (off)) & ((1 << (wid)) - 1))
00363
00364 #define SEXT(src,off,wid) \
00365 (((((int)(src))<<(32 - ((off) + (wid)))) >>(32 - (wid))) )
00366
00367 #define MAKE(src,off,wid) \
00368 ((((unsigned int)(src)) & ((1 << (wid)) - 1)) << (off))
00369
00370 #define opword(n) (unsigned long) (memaddr->mem.l)
00371
00372
00373
00374 #define SFU0 0x80000000
00375 #define SFU1 0x84000000
00376 #define SFU7 0x9c000000
00377 #define RRI10 0xf0000000
00378 #define RRR 0xf4000000
00379 #define SFUMASK 0xfc00ffe0
00380 #define RRRMASK 0xfc00ffe0
00381 #define RRI10MASK 0xfc00fc00
00382 #define DEFMASK 0xfc000000
00383 #define CTRL 0x0000f000
00384 #define CTRLMASK 0xfc00f800
00385
00386
00387
00388 enum operand_type
00389 {
00390 HEX = 1,
00391 REG = 2,
00392 CONT = 3,
00393 IND = 3,
00394 BF = 4,
00395
00396 REGSC = 5,
00397
00398 CRREG = 6,
00399
00400 FCRREG = 7,
00401 PCREL = 8,
00402 CONDMASK = 9,
00403
00404 XREG = 10,
00405
00406 DEC = 11
00407 };
00408
00409
00410
00411 #define HASHVAL 79
00412
00413
00414
00415 typedef struct
00416 {
00417 unsigned int offset;
00418 unsigned int width;
00419 enum operand_type type;
00420 } OPSPEC;
00421
00422 struct SIM_FLAGS
00423 {
00424 int ltncy,
00425 extime,
00426 wb_pri;
00427 unsigned op:OP,
00428 imm_flags:2,
00429 rs1_used:1,
00430 rs2_used:1,
00431 rsd_used:1,
00432 c_flag:1,
00433 u_flag:1,
00434 n_flag:1,
00435 wb_flag:1,
00436 dest_64:1,
00437 s1_64:1,
00438 s2_64:1,
00439 scale_flag:1;
00440 };
00441
00442 typedef struct INSTRUCTAB {
00443 unsigned int opcode;
00444 char *mnemonic;
00445 OPSPEC op1,op2,op3;
00446 struct SIM_FLAGS flgs;
00447 } INSTAB;
00448
00449
00450 #define NO_OPERAND {0,0,0}
00451
00452 extern const INSTAB instructions[];
00453
00454
00455
00456
00457
00458