Working on JIT (wip)
This commit is contained in:
parent
03bc577783
commit
a3d29ee801
|
@ -2,11 +2,14 @@ AC_INIT([65oo2], [1.0])
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE([foreign subdir-objects])
|
AM_INIT_AUTOMAKE([foreign subdir-objects])
|
||||||
|
|
||||||
|
AC_CANONICAL_HOST
|
||||||
|
|
||||||
AC_LANG(C)
|
AC_LANG(C)
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AC_PROG_CPP
|
AC_PROG_CPP
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_PROG_RANLIB
|
AC_PROG_RANLIB
|
||||||
|
AM_PROG_AS
|
||||||
AM_PROG_AR
|
AM_PROG_AR
|
||||||
AM_PROG_CC_C_O
|
AM_PROG_CC_C_O
|
||||||
|
|
||||||
|
|
12
disas/main.c
12
disas/main.c
|
@ -104,16 +104,21 @@ decode_imm(uint8_t opcode)
|
||||||
|
|
||||||
fprintf(output, "%s.", opcode_str[opcode]);
|
fprintf(output, "%s.", opcode_str[opcode]);
|
||||||
|
|
||||||
|
if (attr & 0x4)
|
||||||
|
{
|
||||||
|
fprintf(output, "U");
|
||||||
|
}
|
||||||
|
|
||||||
switch (attr & 0x3)
|
switch (attr & 0x3)
|
||||||
{
|
{
|
||||||
case 0x0:
|
case 0x0:
|
||||||
fprintf(output, "B #%X\n", readu8());
|
fprintf(output, "B #$%X\n", readu8());
|
||||||
break;
|
break;
|
||||||
case 0x1:
|
case 0x1:
|
||||||
fprintf(output, "W #%hX\n", readu16());
|
fprintf(output, "W #$%hX\n", readu16());
|
||||||
break;
|
break;
|
||||||
case 0x2:
|
case 0x2:
|
||||||
fprintf(output, "D #%X\n", readu32());
|
fprintf(output, "D #$%X\n", readu32());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -146,6 +151,7 @@ decode(void)
|
||||||
|
|
||||||
do {
|
do {
|
||||||
opcode = readu8();
|
opcode = readu8();
|
||||||
|
if (feof(input)) return;
|
||||||
switch (opcode_addr[opcode] & OP_ADDR_MODE)
|
switch (opcode_addr[opcode] & OP_ADDR_MODE)
|
||||||
{
|
{
|
||||||
case OP_ADDR_IMPL:
|
case OP_ADDR_IMPL:
|
||||||
|
|
26
lib/op.h
26
lib/op.h
|
@ -13,6 +13,32 @@
|
||||||
# define OP_ADDR_X 1 << 4
|
# define OP_ADDR_X 1 << 4
|
||||||
# define OP_ADDR_Y 1 << 5
|
# define OP_ADDR_Y 1 << 5
|
||||||
|
|
||||||
|
# define OP_BRK_impl 0x00
|
||||||
|
# define OP_ORA_x_ind 0x01
|
||||||
|
# define OP_PHP_impl 0x08
|
||||||
|
# define OP_ORA_imm 0x09
|
||||||
|
# define OP_ORA_abs 0x0D
|
||||||
|
# define OP_ASL_abs 0x0E
|
||||||
|
|
||||||
|
# define OP_BPL_rel 0x10
|
||||||
|
# define OP_ORA_ind_y 0x11
|
||||||
|
# define OP_CLC_impl 0x18
|
||||||
|
# define OP_ORA_abs_y 0x19
|
||||||
|
# define OP_ORA_abs_x 0x1D
|
||||||
|
# define OP_ASL_abs_x 0x1E
|
||||||
|
|
||||||
|
# define OP_JSR_abs 0x20
|
||||||
|
# define OP_AND_x_ind 0x21
|
||||||
|
# define OP_PLP_impl 0x28
|
||||||
|
# define OP_AND_imm 0x29
|
||||||
|
# define OP_ROL_a 0x2A
|
||||||
|
# define OP_BIT_abs 0x2C
|
||||||
|
# define OP_AND_abs 0x2D
|
||||||
|
# define OP_ROL_abs 0x2E
|
||||||
|
|
||||||
|
# define OP_BMI_rel 0x30
|
||||||
|
# define OP_AND_ind_y 0x31
|
||||||
|
|
||||||
extern const uint8_t opcode_addr[];
|
extern const uint8_t opcode_addr[];
|
||||||
extern const char *opcode_str[];
|
extern const char *opcode_str[];
|
||||||
|
|
||||||
|
|
15
lib/register.h
Normal file
15
lib/register.h
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#ifndef REGISTER_H
|
||||||
|
# define REGISTER_H
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
REG_PC,
|
||||||
|
REG_AC,
|
||||||
|
REG_X,
|
||||||
|
REG_Y,
|
||||||
|
REG_SR,
|
||||||
|
REG_SP,
|
||||||
|
REG_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* !REGISTER_H */
|
|
@ -0,0 +1,5 @@
|
||||||
|
bin_PROGRAMS = vm
|
||||||
|
|
||||||
|
vm_SOURCES = main.c jit.c x64/x64.S
|
||||||
|
vm_CFLAGS =-I$(top_srcdir)
|
||||||
|
vm_LDADD = ../lib/lib65oo2.a
|
82
vm/jit.c
Normal file
82
vm/jit.c
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#ifdef _WIN32
|
||||||
|
# include <memoryapi.h>
|
||||||
|
# include <sysinfoapi.h>
|
||||||
|
#else
|
||||||
|
# include <sys/mman.h>
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "jit.h"
|
||||||
|
|
||||||
|
static size_t page_size = 0;
|
||||||
|
|
||||||
|
|
||||||
|
JitBuffer *
|
||||||
|
jit_buffer_new(void)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
DWORD type;
|
||||||
|
DWORD prot;
|
||||||
|
SYSTEM_INFO sysinfo;
|
||||||
|
|
||||||
|
if (page_size == 0)
|
||||||
|
{
|
||||||
|
GetSystemInfo(&sysinfo);
|
||||||
|
page_size = sysinfo.dwPageSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
type = MEM_RESERVE | MEM_COMMIT;
|
||||||
|
prot = PAGE_READWRITE;
|
||||||
|
|
||||||
|
return (VirtualAlloc(NULL, page_size, type, prot));
|
||||||
|
#else
|
||||||
|
int prot;
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
if (page_size == 0)
|
||||||
|
{
|
||||||
|
page_size = sysconf(_SC_PAGESIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
prot = PROT_READ | PROT_WRITE;
|
||||||
|
flags = MAP_ANONYMOUS | MAP_PRIVATE;
|
||||||
|
|
||||||
|
return (mmap(NULL, page_size, prot, flags, -1, 0));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
jit_buffer_finalize(JitBuffer *buff)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
DWORD old;
|
||||||
|
|
||||||
|
VirtualProtect(buff, page_size, PAGE_EXECUTE_READ, &old);
|
||||||
|
#else
|
||||||
|
mprotect(buff, page_size, PROT_READ | PROT_EXEC);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
jit_buffer_add(JitBuffer *buff, int size, void *value)
|
||||||
|
{
|
||||||
|
memcpy(buff->code + buff->count, value, size);
|
||||||
|
buff->count += size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
jit_buffer_execute(JitBuffer *buff)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
jit_buffer_destroy(JitBuffer *buff)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
VirtualFree(buff, page_size, MEM_RELEASE);
|
||||||
|
#else
|
||||||
|
munmap(buff, page_size);
|
||||||
|
#endif
|
||||||
|
}
|
19
vm/jit.h
Normal file
19
vm/jit.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#ifndef JIT_H
|
||||||
|
# define JIT_H
|
||||||
|
|
||||||
|
# include "lib/register.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t registers[REG_MAX];
|
||||||
|
size_t count;
|
||||||
|
uint8_t code[];
|
||||||
|
} JitBuffer;
|
||||||
|
|
||||||
|
JitBuffer *jit_buffer_new(void);
|
||||||
|
void jit_buffer_ins(JitBuffer *buff, int size, uint64_t ins);
|
||||||
|
void jit_buffer_imm(JitBuffer *buff, int size, void *value);
|
||||||
|
void jit_buffer_finalize(JitBuffer *buff);
|
||||||
|
void jit_buffer_destroy(JitBuffer *buff);
|
||||||
|
|
||||||
|
#endif /* !JIT_H */
|
8
vm/main.c
Normal file
8
vm/main.c
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
return (EXIT_SUCCESS);
|
||||||
|
}
|
8
vm/x64/register.h
Normal file
8
vm/x64/register.h
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#ifndef X64_REGISTER_H
|
||||||
|
# define X64_REGISTER_H
|
||||||
|
|
||||||
|
# define REG_ACC %eax
|
||||||
|
# define REG_X %ebx
|
||||||
|
# define REG_Y %ecx
|
||||||
|
|
||||||
|
#endif /* X64_REGISTER_H */
|
14
vm/x64/x64.S
Normal file
14
vm/x64/x64.S
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#include "register.h"
|
||||||
|
|
||||||
|
.globl asm_NOP
|
||||||
|
.globl asm_NOP_end
|
||||||
|
asm_NOP:
|
||||||
|
nop
|
||||||
|
asm_NOP_end:
|
||||||
|
|
||||||
|
.globl asm_DEY
|
||||||
|
.globl asm_DEY_end
|
||||||
|
asm_DEY:
|
||||||
|
dec REG_Y
|
||||||
|
asm_DEY_end:
|
||||||
|
|
Loading…
Reference in a new issue