systemregisters.c
来自「ppc750 system design simulator using sys」· C语言 代码 · 共 979 行 · 第 1/3 页
C
979 行
/*************************************************************************** systemregisters.c - description ------------------- begin : Wed Sep 26 2001 copyright : (C) 2001 Universite Paris Sud and CEA author : Gilles Mouchard email : gilles.mouchard@lri.fr, gilles.mouchard@cea.fr ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/#include <systemregisters.h>#include <ppcemul.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <xmlize.h>void mcrfs_impl(ppc_inst_t inst) { abort(); }void mffsx_impl(ppc_inst_t inst){ dword_t _f; _f= (dword_t)FPSCR; FPR_DW(FD) = _f;}void mtfsb0x_impl(ppc_inst_t inst){ if(CRBD != 1 && CRBD != 2) {// FPSCR = FPSCR & (~(1 << (31 - CRBD))); }}void mtfsb1x_impl(ppc_inst_t inst) { abort(); }void mtfsfix_impl(ppc_inst_t inst){// FPSCR = MTFSFI_IMM;}void mtfsfx_impl(ppc_inst_t inst){ word_t _m,_f, _fm, _rb,_c; int _i; _rb = FPR_DW(FB); _f=FPSCR; _fm = FM; if(_fm & 0x80) { _m = 0x60000000; } else { _m=0x0; } _c=0x1; for(_i=0;_i<7;_i++) { if(_c & _fm) { _m= _m | (0xf<<(_i*4)); } _c=_c<<1; } _f = _rb & _m;// FPSCR = _f;}void mcrxr_impl(ppc_inst_t inst) { abort(); }void mfcr_impl(ppc_inst_t inst){ GPR(RD) = CR;}void mfmsr_impl(ppc_inst_t inst) { abort(); }void mfsr_impl(ppc_inst_t inst) { abort(); }void mfsrin_impl(ppc_inst_t inst) { abort(); }void mtmsr_impl(ppc_inst_t inst) { abort(); }void mtsr_impl(ppc_inst_t inst) { abort(); }void mtsrin_impl(ppc_inst_t inst) { abort(); }void mfspr_impl(ppc_inst_t inst){ word_t _s, _d; _s = SPR; _d = ((_s & 0x1F)<< 5) + (( _s >> 5)&0x1F); if (_d ==1) { GPR(RD) = XER; } else if (_d ==8) { GPR(RD) = LR; } else if (_d == 9) { GPR(RD) = CTR; }}void mftb_impl(ppc_inst_t inst){ word_t _d, _s; _s = TBR; _d = ((_s & 0x1F) << 5) + (( _s >> 5)&0x1F); switch(_d) { case 268: GPR(RD) = TBL; break; case 269: GPR(RD) = TBU; break; }}void mtcrf_impl(ppc_inst_t inst){ word_t _m,_crm, _c, _a; int _i, _b, _d; _crm = CRM; _d = GPR(RS); for(_i = 0; _i < 8; _i++) { _b = (_crm >> _i) & 0x1; if(_b == 1) { _c = CR; _a = (_d >> (_i*4) ) & 0xf; _m = (0xf << ( (_i)*4) ); CR = (_c & ~_m) | (_a << ((_i)*4)); } }}void mtspr_impl(ppc_inst_t inst){ word_t _s, _d; _s = SPR; _d = ((_s & 0x1f) << 5) + (( _s >> 5)&0x1F); if (_d ==1) { XER = GPR(RD); } else if (_d ==8) { LR = GPR(RD); } else if (_d == 9) { CTR = GPR(RD); }}void crand_impl(ppc_inst_t inst){ word_t _a, _b, _c, _d, _m; _c = CR; _a = (0x1) & (_c >> (31- CRBA)); _b = (0x1) & (_c >> (31- CRBB)); _d = (_a & _b)<<(31-CRBD); _m = ~(1<<(31-CRBD)); CR = ((_c & _m) | _d );}void crandc_impl(ppc_inst_t inst){ word_t _a, _b, _c, _d, _m; _c = CR; _a = (0x1) & (_c >> (31- CRBA)); _b = (0x1) & (_c >> (31- CRBB)); _d = (_a & (!_b))<<(31-CRBD); _m = ~(1<<(31-CRBD)); CR = ((_c & _m) | _d );}void creqv_impl(ppc_inst_t inst){ word_t _a, _b, _c, _d, _m; _c = CR; _a = (0x1) & (_c >> (31- CRBA)); _b = (0x1) & (_c >> (31- CRBB)); _d = (!(_a ^ _b))<<(31-CRBD); _m = ~(1<<(31-CRBD)); CR = ((_c & _m) | _d );}void crnand_impl(ppc_inst_t inst){ word_t _a, _b, _c, _d, _m; _c = CR; _a = (0x1) & (_c >> (31- CRBA)); _b = (0x1) & (_c >> (31- CRBB)); _d = (!(_a & _b))<<(31-CRBD); _m = ~(1<<(31-CRBD)); CR = ((_c & _m) | _d );}void crnor_impl(ppc_inst_t inst){ word_t _a, _b, _c, _d, _m; _c = CR; _a = (0x1) & (_c >> (31- CRBA)); _b = (0x1) & (_c >> (31- CRBB)); _d = (!(_a | _b))<<(31-CRBD); _m = ~(1<<(31-CRBD)); CR = ((_c & _m) | _d );}void cror_impl(ppc_inst_t inst){ word_t _a, _b, _c, _d, _m; _c = CR; _a = (0x1) & (_c >> (31- CRBA)); _b = (0x1) & (_c >> (31- CRBB)); _d = (_a | _b)<<(31-CRBD); _m = ~(1<<(31-CRBD)); CR = ((_c & _m) | _d );}void crorc_impl(ppc_inst_t inst){ word_t _a, _b, _c, _d, _m; _c = CR; _a = (0x1) & (_c >> (31- CRBA)); _b = (0x1) & (_c >> (31- CRBB)); _d = (_a | (!_b))<<(31-CRBD); _m = ~(1<<(31-CRBD)); CR = ((_c & _m) | _d );}void crxor_impl(ppc_inst_t inst){ word_t _a, _b, _c, _d, _m; _c = CR; _a = (0x1) & (_c >> (31- CRBA)); _b = (0x1) & (_c >> (31- CRBB)); _d = (_a ^ _b)<<(31-CRBD); _m = ~(1<<(31-CRBD)); CR = ((_c & _m) | _d );}void mcrf_impl(ppc_inst_t inst){ CR = (CR & (~(0xf << (4 * (7 - CRFD))))) | (((CR >> (4 * (7 - CRFS))) & 0xf) << (4 * (7 - CRFD)));}void rfi_impl(ppc_inst_t inst) { abort(); }void rfid_impl(ppc_inst_t inst) { abort(); } void sync_impl(ppc_inst_t inst) { abort(); }void isync_impl(ppc_inst_t inst) { abort(); }char *mcrfs_bin2c(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *mffsx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tdword_t _f;\n"); buf += sprintf(buf, "\t_f= (dword_t)FPSCR;\n"); buf += sprintf(buf, "\tFPR_DW(%u) = _f;\n", FD); return buf;}char *mtfsb0x_bin2c(ppc_inst_t inst, addr_t pc, char *buf){// if(CRBD != 1 && CRBD != 2)// {// FPSCR = FPSCR & (~(1 << (31 - CRBD)));// } strcpy(buf, ""); return buf;}char *mtfsb1x_bin2c(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *mtfsfix_bin2c(ppc_inst_t inst, addr_t pc, char *buf){// FPSCR = MTFSFI_IMM; strcpy(buf, ""); return buf;}char *mtfsfx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t _m,_f, _fm, _rb,_c;\n"); buf += sprintf(buf, "\tint _i;\n"); buf += sprintf(buf, "\t_rb = FPR_DW(%u);\n", FB); buf += sprintf(buf, "\t_f=FPSCR;\n"); buf += sprintf(buf, "\t_fm = %u;\n", FM); buf += sprintf(buf, "\tif(_fm & 0x80)\n"); buf += sprintf(buf, "\t{\n"); buf += sprintf(buf, "\t\t_m = 0x60000000;\n"); buf += sprintf(buf, "\t}\n"); buf += sprintf(buf, "\telse\n"); buf += sprintf(buf, "\t{\n"); buf += sprintf(buf, "\t\t_m=0x0;\n"); buf += sprintf(buf, "\t}\n"); buf += sprintf(buf, "\t_c=0x1;\n"); buf += sprintf(buf, "\tfor(_i=0;_i<7;_i++)\n"); buf += sprintf(buf, "\t{\n"); buf += sprintf(buf, "\t\tif(_c & _fm)\n"); buf += sprintf(buf, "\t\t{\n"); buf += sprintf(buf, "\t\t\t_m= _m | (0xf<<(_i*4));\n");
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?