Mercurial > repos > blastem
view gen.h @ 1374:8f404b1fa572
Go back to resetting the refresh counter after a DMA. Probably not quite correct as it is probably reset on VDP triggered refresh, but this is close enough for now given the general limitations with my refresh code. VDP FIFO Testing seems to be passing 100% reliably again (was occassionally failing still with the last commit)
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 23 May 2017 23:47:40 -0700 |
parents | d5a47597b61f |
children |
line wrap: on
line source
#ifndef GEN_H_ #define GEN_H_ #include <stdint.h> #if defined(X86_64) || defined(X86_32) typedef uint8_t code_word; #define RESERVE_WORDS 5 //opcode + 4-byte displacement #else typedef uint32_t code_word; #define RESERVE_WORDS 4 //1 push + 1 ldr + 1bx + 1 constant #endif typedef code_word * code_ptr; #define CODE_ALLOC_SIZE (1024*1024) typedef struct { code_ptr cur; code_ptr last; uint32_t stack_off; } code_info; void check_alloc_code(code_info *code, uint32_t inst_size); void init_code_info(code_info *code); void call(code_info *code, code_ptr fun); void jmp(code_info *code, code_ptr dest); void jmp_r(code_info *code, uint8_t dst); //standard return from subroutine instruction void rts(code_info *code); //call a function and put the arguments in the appropriate place according to the host ABI void call_args(code_info *code, code_ptr fun, uint32_t num_args, ...); //like the above, but call a function pointer stored in a register void call_args_r(code_info *code, uint8_t fun_reg, uint32_t num_args, ...); //like the above, but follows other aspects of the ABI like stack alignment //void call_args_abi(code_info *code, code_ptr fun, uint32_t num_args, ...); #define call_args_abi call_args void save_callee_save_regs(code_info *code); void restore_callee_save_regs(code_info *code); #endif //GEN_H_