2017-05-13 18:36:46 +01:00
|
|
|
#ifndef VM_H
|
|
|
|
#define VM_H
|
2017-05-14 13:06:17 +01:00
|
|
|
#include "vmas.h"
|
2017-05-14 21:10:58 +01:00
|
|
|
#include <stdint.h>
|
2017-05-13 18:36:46 +01:00
|
|
|
|
2017-05-19 11:23:18 +01:00
|
|
|
enum regs { R0, R1, R2, R3, S0, S1, S2, S3, IP, RP, SP, NUM_REGS };
|
2017-05-18 16:28:10 +01:00
|
|
|
typedef struct flags {
|
|
|
|
uint8_t ZF : 1;
|
|
|
|
uint8_t CF : 1;
|
|
|
|
} flags_t;
|
2017-05-13 18:36:46 +01:00
|
|
|
|
|
|
|
class VM {
|
2017-05-14 21:10:58 +01:00
|
|
|
private:
|
2017-05-17 10:21:40 +01:00
|
|
|
////////////////////////
|
|
|
|
// FUNCTIONS
|
|
|
|
///////////////////////
|
|
|
|
void initVariables(void);
|
2017-05-18 17:21:01 +01:00
|
|
|
void encryptOpcodes(uint8_t *key);
|
2017-05-15 11:49:11 +01:00
|
|
|
/*
|
|
|
|
DBG UTILS
|
|
|
|
*/
|
2017-05-17 17:58:00 +01:00
|
|
|
uint8_t *getRegName(uint8_t);
|
2017-05-14 21:10:58 +01:00
|
|
|
/*
|
|
|
|
IMPLEMENTATIONS
|
|
|
|
*/
|
2017-05-17 17:58:00 +01:00
|
|
|
bool execMOVI(void);
|
|
|
|
bool execMOVR(void);
|
2017-05-26 10:55:21 +01:00
|
|
|
bool execMOVM(void);
|
2017-05-24 14:29:20 +01:00
|
|
|
bool execLODI(void);
|
|
|
|
bool execLODR(void);
|
|
|
|
bool execSTRI(void);
|
|
|
|
bool execSTRR(void);
|
2017-05-17 17:58:00 +01:00
|
|
|
bool execADDI(void);
|
2017-05-17 18:31:27 +01:00
|
|
|
bool execADDR(void);
|
|
|
|
bool execSUBI(void);
|
|
|
|
bool execSUBR(void);
|
2017-05-18 16:28:10 +01:00
|
|
|
bool execANDB(void);
|
|
|
|
bool execANDW(void);
|
|
|
|
bool execANDR(void);
|
|
|
|
bool execYORB(void);
|
|
|
|
bool execYORW(void);
|
|
|
|
bool execYORR(void);
|
2017-05-17 18:58:00 +01:00
|
|
|
bool execXORB(void);
|
|
|
|
bool execXORW(void);
|
2017-05-17 18:31:27 +01:00
|
|
|
bool execXORR(void);
|
|
|
|
bool execNOTR(void);
|
|
|
|
bool execMULI(void);
|
|
|
|
bool execMULR(void);
|
|
|
|
bool execDIVI(void);
|
|
|
|
bool execDIVR(void);
|
2017-05-24 14:07:56 +01:00
|
|
|
bool execSHLI(void);
|
|
|
|
bool execSHLR(void);
|
|
|
|
bool execSHRI(void);
|
|
|
|
bool execSHRR(void);
|
2017-05-17 18:31:27 +01:00
|
|
|
bool execPUSH(void);
|
|
|
|
bool execPOOP(void);
|
2017-05-24 19:54:12 +01:00
|
|
|
bool execCMPB(void);
|
|
|
|
bool execCMPW(void);
|
2017-05-17 18:58:00 +01:00
|
|
|
bool execCMPR(void);
|
2017-05-18 14:41:05 +01:00
|
|
|
bool execJMPI(void);
|
|
|
|
bool execJMPR(void);
|
|
|
|
bool execJPAI(void);
|
|
|
|
bool execJPAR(void);
|
|
|
|
bool execJPBI(void);
|
|
|
|
bool execJPBR(void);
|
|
|
|
bool execJPEI(void);
|
|
|
|
bool execJPER(void);
|
2017-05-18 16:28:10 +01:00
|
|
|
bool execJPNI(void);
|
|
|
|
bool execJPNR(void);
|
2017-05-24 19:54:12 +01:00
|
|
|
bool execCALL(void);
|
2017-05-19 11:23:18 +01:00
|
|
|
bool execRETN(void);
|
2017-05-17 18:58:00 +01:00
|
|
|
bool execGRMN(void);
|
2017-05-13 18:36:46 +01:00
|
|
|
|
2017-05-14 13:06:17 +01:00
|
|
|
public:
|
2017-05-17 17:58:00 +01:00
|
|
|
VM(uint8_t *key);
|
|
|
|
VM(uint8_t *key, uint8_t *code, uint32_t codesize);
|
2017-06-14 13:47:45 +01:00
|
|
|
uint16_t regs[0xb];
|
|
|
|
flags_t flags;
|
2017-05-26 14:25:13 +01:00
|
|
|
VMAddrSpace as;
|
2017-05-14 13:06:17 +01:00
|
|
|
void status(void);
|
2017-05-14 21:10:58 +01:00
|
|
|
void run();
|
2017-05-13 18:36:46 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|