Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
36797ad4cThis file is pinned to the selected release. Download the original to open it in your design tool.
#include "GateBoyLib/GateBoy.h"
#include "GateBoyLib/Gates.h"
// This code is not for running, it's for trying to figure out what might trigger glitches in GateBoy's latches.
void GateBoy::tock_latches(const GateBoyState& reg_old) {
{
auto& reg_new = gb_state;
/*#p29.XUPY*/ wire XUPY_ABxxEFxx = not1(reg_new.sys_clk.WUVU_ABxxEFxx.qn_new());
/*#p28.AWOH*/ wire AWOH_xxCDxxGH = not1(XUPY_ABxxEFxx);
/*#p21.XYVO*/ wire XYVO_y144p_old = and2(reg_old.reg_ly.LOVU_LY4p_odd.qp_old(), reg_old.reg_ly.LAFO_LY7p_odd.qp_old()); // 128 + 16 = 144
/*#p21.PURE*/ wire PURE_LINE_ENDn_old = not1(reg_old.lcd.RUTU_LINE_ENDp_odd.qp_old());
/*#p29.ALES*/ wire ALES_FRAME_ENDn_old = not1(XYVO_y144p_old);
/*#p21.SELA*/ wire SELA_LINE_ENDp_old = not1(PURE_LINE_ENDn_old);
/*#p29.ABOV*/ wire ABOV_LINE_ENDp_old = and2(SELA_LINE_ENDp_old, ALES_FRAME_ENDn_old);
/*#p29.CATU*/ reg_new.lcd.CATU_LINE_ENDp_odd.dff17(XUPY_ABxxEFxx, reg_new.ABEZ_VID_RSTn_new(), ABOV_LINE_ENDp_old);
/*#p28.ANEL*/ reg_new.lcd.ANEL_LINE_ENDp_odd.dff17(AWOH_xxCDxxGH, reg_new.ABEZ_VID_RSTn_new(), reg_old.lcd.CATU_LINE_ENDp_odd.qp_old());
/*_p28.ABAF*/ wire ABAF_LINE_ENDn_odd_new = not1(reg_new.lcd.CATU_LINE_ENDp_odd.qp_new());
/*_p28.BYHA*/ wire BYHA_LINE_RST_TRIGn_odd_new = or_and3(reg_new.lcd.ANEL_LINE_ENDp_odd.qp_new(), ABAF_LINE_ENDn_odd_new, reg_new.ABEZ_VID_RSTn_new()); // so if this is or_and, BYHA should go low on 910 and 911
/*_p28.ATEJ*/ reg_new.ATEJ_LINE_RST_TRIGp_odd <<= not1(BYHA_LINE_RST_TRIGn_odd_new);
/*_p27.ROMO*/ wire ROMO_PRELOAD_DONEn_evn_new = not1(reg_new.tfetch_control.POKY_PRELOAD_LATCHp_evn.qp_new());
/*_p27.SUVU*/ wire SUVU_PRELOAD_DONE_TRIGn_xxx_new = nand4(reg_new.XYMU_RENDERING_LATCHn.qn_new(), ROMO_PRELOAD_DONEn_evn_new, reg_new.tfetch_control.NYKA_FETCH_DONEp_evn.qp_new(), reg_new.tfetch_control.PORY_FETCH_DONEp_odd.qp_new());
/*_p27.TAVE*/ wire TAVE_PRELOAD_DONE_TRIGp_xxx_new = not1(SUVU_PRELOAD_DONE_TRIGn_xxx_new);
/*_p27.RYCE*/ wire RYCE_SFETCH_TRIGp_evn_new = and2(reg_new.sfetch_control.SOBU_SFETCH_REQp_evn.qp_new(), reg_new.sfetch_control.SUDA_SFETCH_REQp_odd.qn_new());
/*#p27.SECA*/ wire SECA_SFETCH_STARTn_evn = nor3(RYCE_SFETCH_TRIGp_evn_new, reg_new.ROSY_VID_RSTp_new(), reg_new.ATEJ_LINE_RST_TRIGp_odd.out_new());
/*_p27.VEKU*/ wire VEKU_SFETCH_ENDn_xxx_new = nor2(reg_new.sfetch_control.WUTY_SFETCH_DONE_TRIGp_odd.out_new(), TAVE_PRELOAD_DONE_TRIGp_xxx_new);
/*_p27.TAKA*/ reg_new.sfetch_control.TAKA_SFETCH_RUNNINGp_evn.nand_latch(SECA_SFETCH_STARTn_evn, VEKU_SFETCH_ENDn_xxx_new);
}
}
#if 0
// ALOR external address latch. We know this one is glitchy.
/*_p08.ALOR*/ gb_state.ext_addr_latch.ALOR_EXT_ADDR_LATCH_00p.tp_latchn(MATE_HOLDn, gb_state.cpu_abus.BUS_CPU_A00p.out_new());
void latch1() {
ALOR_EXT_ADDR_LATCH_00p.tp_latchn(
// if this glitches high, latch fires
SIG_IN_CPU_EXT_BUSp && or3(BUS_CPU_A13p, BUS_CPU_A14p, !BUS_CPU_A15p),
BUS_CPU_A00p);
}
/*_p27.LONY*/ NandLatch LONY_TFETCHINGp; // Usually changes on even. Changes on odd phase at end of line if we're in a window?
/*_p24.POKY*/ NorLatch POKY_PRELOAD_LATCHp_evn; // xBxDxFxG
/*#p04.LYXE*/ NorLatch LYXE_DMA_LATCHp; // xxxxExxx
/*_p21.RUPO*/ NorLatch RUPO_LYC_MATCHn;
/*#p21.WUSA*/ NorLatch WUSA_LCD_CLOCK_GATE; // xBxDxFGH High on G at beginning of line, low on H at end of line. Not sure what's up with the others. Scroll/sprite count?
/*_p28.WUJE*/ NorLatch WUJE_CPU_OAM_WRn; // AxxxExxx
/*_p27.PYNU*/ NorLatch PYNU_WIN_MODE_Ap_odd; // AxxxxxGx
/*_p27.REJO*/ NorLatch REJO_WY_MATCH_LATCHp_odd; // xxCxxxxx
/*#p27.ROXY*/ NorLatch ROXY_FINE_SCROLL_DONEn_evn; // xBxDxFxH
/*_p01.TUBO*/ NorLatch TUBO_WAITINGp; // Must be 0 in run mode, otherwise we'd ping SIG_CPU_INT_RESETp when UPOF_DIV_15 changed
/*_p01.ASOL*/ NorLatch ASOL_POR_DONEn; // Schematic wrong, this is a latch.
/*#p28.BESU*/ NorLatch BESU_SCAN_DONEn_odd;
/*#p21.XYMU*/ NorLatch XYMU_RENDERINGn;
/*#p08.SOMA*/ TpLatch SOMA_EXT_DATA_LATCH_D0n; // AxCxExxx
/*_p08.RONY*/ TpLatch RONY_EXT_DATA_LATCH_D1n; // AxCxExxx
/*_p08.RAXY*/ TpLatch RAXY_EXT_DATA_LATCH_D2n; // AxCxExxx
/*_p08.SELO*/ TpLatch SELO_EXT_DATA_LATCH_D3n; // AxCxExxx
/*_p08.SODY*/ TpLatch SODY_EXT_DATA_LATCH_D4n; // AxCxExxx
/*_p08.SAGO*/ TpLatch SAGO_EXT_DATA_LATCH_D5n; // AxCxExxx
/*_p08.RUPA*/ TpLatch RUPA_EXT_DATA_LATCH_D6n; // AxCxExxx
/*_p08.SAZY*/ TpLatch SAZY_EXT_DATA_LATCH_D7n; // AxCxExxx
/*_p08.ALOR*/ TpLatch ALOR_EXT_ADDR_LATCH_00p; // xBxxxxxx
/*_p08.APUR*/ TpLatch APUR_EXT_ADDR_LATCH_01p; // xBxxxxxx
/*_p08.ALYR*/ TpLatch ALYR_EXT_ADDR_LATCH_02p; // xBxxxxxx
/*_p08.ARET*/ TpLatch ARET_EXT_ADDR_LATCH_03p; // xBxxxxxx
/*_p08.AVYS*/ TpLatch AVYS_EXT_ADDR_LATCH_04p; // xBxxxxxx
/*_p08.ATEV*/ TpLatch ATEV_EXT_ADDR_LATCH_05p; // xBxxxxxx
/*_p08.AROS*/ TpLatch AROS_EXT_ADDR_LATCH_06p; // xBxxxxxx
/*_p08.ARYM*/ TpLatch ARYM_EXT_ADDR_LATCH_07p; // xBxxxxxx
/*_p08.LUNO*/ TpLatch LUNO_EXT_ADDR_LATCH_08p; // ABxxxxxx
/*_p08.LYSA*/ TpLatch LYSA_EXT_ADDR_LATCH_09p; // ABxxxxxx
/*_p08.PATE*/ TpLatch PATE_EXT_ADDR_LATCH_10p; // ABxxxxxx
/*_p08.LUMY*/ TpLatch LUMY_EXT_ADDR_LATCH_11p; // ABxxxxxx
/*_p08.LOBU*/ TpLatch LOBU_EXT_ADDR_LATCH_12p; // ABxxxxxx
/*_p08.LONU*/ TpLatch LONU_EXT_ADDR_LATCH_13p; // ABxxxxxx
/*_p08.NYRE*/ TpLatch NYRE_EXT_ADDR_LATCH_14p; // ABxxxxxx
/*_p02.MATY*/ TpLatch MATY_FF0F_L0p;
/*_p02.MOPO*/ TpLatch MOPO_FF0F_L1p;
/*_p02.PAVY*/ TpLatch PAVY_FF0F_L2p;
/*_p02.NEJY*/ TpLatch NEJY_FF0F_L3p;
/*_p02.NUTY*/ TpLatch NUTY_FF0F_L4p;
/*_p02.AWOB*/ TpLatch AWOB_WAKE_CPU;
/*#p05.KEVU*/ TpLatch KEVU_JOYP_L0n;
/*#p05.KAPA*/ TpLatch KAPA_JOYP_L1n;
/*#p05.KEJA*/ TpLatch KEJA_JOYP_L2n;
/*#p05.KOLO*/ TpLatch KOLO_JOYP_L3n;
/*#p29.YDYV*/ TpLatch YDYV_OAM_LATCH_DA0n; // xBxDxFxx // Proooobably all odd clocks?
/*_p29.YCEB*/ TpLatch YCEB_OAM_LATCH_DA1n; // xBxDxFxx
/*_p29.ZUCA*/ TpLatch ZUCA_OAM_LATCH_DA2n; // xBxDxFxx
/*_p29.WONE*/ TpLatch WONE_OAM_LATCH_DA3n; // xBxDxFxx
/*_p29.ZAXE*/ TpLatch ZAXE_OAM_LATCH_DA4n; // xBxDxFxx
/*_p29.XAFU*/ TpLatch XAFU_OAM_LATCH_DA5n; // xBxDxFxx
/*_p29.YSES*/ TpLatch YSES_OAM_LATCH_DA6n; // xBxDxFxx
/*_p29.ZECA*/ TpLatch ZECA_OAM_LATCH_DA7n; // xBxDxFxx
/*#p31.XYKY*/ TpLatch XYKY_OAM_LATCH_DB0n; // xBxxxFxx // Proooobably all odd clocks?
/*_p31.YRUM*/ TpLatch YRUM_OAM_LATCH_DB1n; // xBxxxFxx
/*_p31.YSEX*/ TpLatch YSEX_OAM_LATCH_DB2n; // xBxxxFxx
/*_p31.YVEL*/ TpLatch YVEL_OAM_LATCH_DB3n; // xBxxxFxx
/*_p31.WYNO*/ TpLatch WYNO_OAM_LATCH_DB4n; // xBxxxFxx
/*_p31.CYRA*/ TpLatch CYRA_OAM_LATCH_DB5n; // xBxxxFxx
/*_p31.ZUVE*/ TpLatch ZUVE_OAM_LATCH_DB6n; // xBxxxFxx
/*_p31.ECED*/ TpLatch ECED_OAM_LATCH_DB7n; // xBxxxFxx
#endif