#ifndef __CPU_H__ #define __CPU_H__ #include "definitions.h" #include "firmware.h" #include "thread.h" #include "timer.h" #include #include #include #include #include extern "C" void* ProcessPipe(void* arg); extern "C" void* Execute(void* arg); class CPU { public: CPU(); ~CPU(); void start(char *filename); //memory void ld(DWORD offset,DWORD Rsrc,DWORD Rdest); void st(DWORD offset,DWORD Rsrc1,DWORD Rsrc2); void ldf(DWORD offset,DWORD Rsrc,DWORD Rfdest); void stf(DWORD offset,DWORD Rsrc1,DWORD Rfsrc2); void ldt(DWORD offset,DWORD Rsrc1,DWORD Rdest); void stt(DWORD offset,DWORD Rsrc1,DWORD Rsrc2); void movfrc(DWORD Rcpu,DWORD Rdest,DWORD Rsrc1); void movtoc(DWORD Rcpu,DWORD Rsrc2,DWORD Rsrc1); void aluc(DWORD Rcpu,DWORD Rsrc1); void ls(DWORD Rsrc,DWORD Rdest,DWORD address); void lsu(DWORD Rsrc,DWORD Rdest,DWORD address); void lb(DWORD Rsrc,DWORD Rdest,DWORD address); void lbu(DWORD Rsrc,DWORD Rdest,DWORD address); void ss(DWORD offset,DWORD Rsrc1,DWORD Rsrc2); void sb(DWORD offset,DWORD Rsrc1,DWORD Rsrc2); //branch void beq(DWORD Rsrc1, DWORD Rsrc2, DWORD addresse); void beqsq(DWORD Rsrc1, DWORD Rsrc2, DWORD addresse); void bge(DWORD Rsrc1, DWORD Rsrc2, DWORD addresse); void bgesq(DWORD Rsrc1, DWORD Rsrc2, DWORD addresse); void bhs(DWORD Rsrc1, DWORD Rsrc2, DWORD addresse); void bhssq(DWORD Rsrc1, DWORD Rsrc2, DWORD addresse); void blo(DWORD Rsrc1, DWORD Rsrc2, DWORD addresse); void blosq(DWORD Rsrc1, DWORD Rsrc2, DWORD addresse); void blt(DWORD Rsrc1, DWORD Rsrc2, DWORD addresse); void bltsq(DWORD Rsrc1, DWORD Rsrc2, DWORD addresse); void bne(DWORD Rsrc1, DWORD Rsrc2, DWORD addresse); void bnesq(DWORD Rsrc1, DWORD Rsrc2, DWORD addresse); //compute void add(DWORD Rsrc1, DWORD Rsrc2, DWORD Rdest); void mstart(DWORD Rsrc2,DWORD Rdest); void mstep(DWORD Rsrc1, DWORD Rsrc2, DWORD Rdest); void dstep(DWORD Rsrc1, DWORD Rsrc2, DWORD Rdest); void sub(DWORD Rsrc1, DWORD Rsrc2, DWORD Rdest); void subnc(DWORD Rsrc1, DWORD Rsrc2, DWORD Rdest); void andX(DWORD Rsrc1, DWORD Rsrc2, DWORD Rdest); void bic(DWORD Rsrc1, DWORD Rsrc2, DWORD Rdest); void notX(DWORD Rsrc1, DWORD Rdest); void orX(DWORD Rsrc1, DWORD Rsrc2, DWORD Rdest); void xorX(DWORD Rsrc1, DWORD Rsrc2, DWORD Rdest); void mov(DWORD Rsrc1, DWORD Rdest); void asr(DWORD Rsrc1, DWORD Rdest, DWORD ammount); void rtlb(DWORD Rsrc1, DWORD Rsrc2, DWORD Rdest); void rtlcb(DWORD Rsrc1, DWORD Rsrc2, DWORD Rdest); void sh(DWORD Rsrc1, DWORD Rsrc2, DWORD Rdest,DWORD ammount); void nop(void); //compute immediate void addi(DWORD Rsrc1, DWORD Rdest, DWORD immed); void jpc(void); void jpcrs(void); void jspci(DWORD Rsrc1, DWORD Rdest, DWORD immed); void movfrs(DWORD Rspecial, DWORD Rdest); //void movtos(DWORD Rsrc1, DWORD Rspecial); void movtos(DWORD Rsrc,DWORD Rdest); void movi(DWORD Rdest, DWORD immed); void trap(BYTE vector); void hsc(void); void returnX(void); void andi(DWORD,DWORD,DWORD); //macros void macro1(DWORD,DWORD,DWORD); void macro2(DWORD,DWORD); void macro3(DWORD); void macro4(DWORD); void macro5(DWORD); void macro6(DWORD); void macro7(DWORD); void macro8(DWORD); void macro9(DWORD); void macroA(DWORD); void macroB(DWORD); void macroC(DWORD); void macroD(void); DWORD getDWORDAT(DWORD); void setDWORDAT(DWORD value, DWORD address); unsigned long ZeroExtend8to32(unsigned char val8); unsigned long SignExtend8to32(unsigned char val8); unsigned long ZeroExtend16to32(unsigned short val16); unsigned long SignExtend16to32(unsigned short val16); signed long CalculateValue16(DWORD); signed long CalculateValue17(DWORD); BYTE DecodeShiftAmount(WORD wShiftAmount); type_of_instruction DecodeOpcode(DWORD); void PrintFromToDWORD(DWORD from,DWORD to); pipeline pipe; pthread_t threadpipe,threadexecute; pthread_mutex_t mutexIF,mutexRF,mutexMEM,mutexWB; timer t; DWORD actual,actual2,actual3; queue func; map memory; hash_map reg; type_of_instruction type; struct rom_header Hrom; private: //Private member properties Firmware firm; BYTE rom[SIZE_OF_ROM]; DWORD pointer2header; //Private member functions void ReadPos(DWORD*,unsigned char*,DWORD); void ReadHeader(void); void Run(void); void CopyRom2Mem(void); }; #endif