mirror of
https://github.com/mlaux/gb6.git
synced 2026-10-24 16:02:16 +00:00
38 lines
1.4 KiB
C
38 lines
1.4 KiB
C
#include "compiler.h"
|
|
#include "emitters.h"
|
|
|
|
// how to do the flags properly:
|
|
// 8-bit and, or, xor -> set Z for result, set C=0
|
|
// 8-bit add, adc, sub, sbc, cp -> set both Z and C for result
|
|
// 16 bit add -> set C for result, leave Z alone
|
|
// 8-bit incs/decs -> set Z for result, leave C alone
|
|
// 16-bit incs/decs -> leave both alone
|
|
// non-cb rotates -> set C for result, set Z=0
|
|
// cb rotates/shifts -> set both Z and C for result
|
|
// swap -> set Z for result, set C=0
|
|
// bit -> set Z for result, leave C alone
|
|
|
|
void compile_set_zc_flags(struct code_block *block)
|
|
{
|
|
emit_move_sr_dn(block, REG_68K_D_FLAGS);
|
|
}
|
|
|
|
void compile_set_z_flag(struct code_block *block)
|
|
{
|
|
// inc/dec/bit sets Z from result but preserve C from previous flags.
|
|
// Save new CCR to D3, extract Z, merge with old C from D7.
|
|
emit_move_sr_dn(block, REG_68K_D_NEXT_PC);
|
|
emit_andi_b_dn(block, REG_68K_D_NEXT_PC, 0x04);
|
|
emit_andi_b_dn(block, REG_68K_D_FLAGS, 0x01);
|
|
emit_or_b_dn_dn(block, REG_68K_D_NEXT_PC, REG_68K_D_FLAGS);
|
|
}
|
|
|
|
void compile_set_c_flag(struct code_block *block)
|
|
{
|
|
// add hl,rr sets C from result but preserves Z from previous flags.
|
|
// Save new CCR to D3, extract C, merge with old Z from D7.
|
|
emit_move_sr_dn(block, REG_68K_D_NEXT_PC);
|
|
emit_andi_b_dn(block, REG_68K_D_NEXT_PC, 0x01);
|
|
emit_andi_b_dn(block, REG_68K_D_FLAGS, 0x04);
|
|
emit_or_b_dn_dn(block, REG_68K_D_NEXT_PC, REG_68K_D_FLAGS);
|
|
} |