NES: puNES macro expansion
preparations for acquireDirect()
This commit is contained in:
parent
c2228cd74b
commit
645e97ef93
|
@ -177,11 +177,109 @@ void apu_tick(struct NESAPU* a, BYTE *hwtick) {
|
||||||
* eseguo un ticket per ogni canale
|
* eseguo un ticket per ogni canale
|
||||||
* valorizzandone l'output.
|
* valorizzandone l'output.
|
||||||
*/
|
*/
|
||||||
square_tick(a->S1, 0, a->apu.clocked)
|
// SQUARE 1 TICK
|
||||||
square_tick(a->S2, 0, a->apu.clocked)
|
if (!(--a->S1.frequency)) {
|
||||||
triangle_tick()
|
square_output(a->S1, 0)
|
||||||
noise_tick()
|
a->S1.frequency = (a->S1.timer + 1) << 1;
|
||||||
dmc_tick()
|
a->S1.sequencer = (a->S1.sequencer + 1) & 0x07;
|
||||||
|
a->apu.clocked = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SQUARE 2 TICK
|
||||||
|
if (!(--a->S2.frequency)) {
|
||||||
|
square_output(a->S2, 0)
|
||||||
|
a->S2.frequency = (a->S2.timer + 1) << 1;
|
||||||
|
a->S2.sequencer = (a->S2.sequencer + 1) & 0x07;
|
||||||
|
a->apu.clocked = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TRIANGLE TICK
|
||||||
|
if (!(--a->TR.frequency)) {
|
||||||
|
a->TR.frequency = a->TR.timer + 1;
|
||||||
|
if (a->TR.length.value && a->TR.linear.value) {
|
||||||
|
a->TR.sequencer = (a->TR.sequencer + 1) & 0x1F;
|
||||||
|
triangle_output()
|
||||||
|
a->apu.clocked = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOISE TICK
|
||||||
|
if (!(--a->NS.frequency)) {
|
||||||
|
if (a->NS.mode) {
|
||||||
|
a->NS.shift = (a->NS.shift >> 1) | (((a->NS.shift ^ (a->NS.shift >> 6)) & 0x0001) << 14);
|
||||||
|
} else {
|
||||||
|
a->NS.shift = (a->NS.shift >> 1) | (((a->NS.shift ^ (a->NS.shift >> 1)) & 0x0001) << 14);
|
||||||
|
}
|
||||||
|
a->NS.shift &= 0x7FFF;
|
||||||
|
noise_output()
|
||||||
|
a->NS.frequency = noise_timer[a->apu.type][a->NS.timer];
|
||||||
|
a->apu.clocked = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// DMC TICK
|
||||||
|
if (!(--a->DMC.frequency)) {
|
||||||
|
if (!a->DMC.silence) {
|
||||||
|
if (!(a->DMC.shift & 0x01)) {
|
||||||
|
if (a->DMC.counter > 1) {
|
||||||
|
a->DMC.counter -= 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (a->DMC.counter < 126) {
|
||||||
|
a->DMC.counter += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
a->DMC.shift >>= 1;
|
||||||
|
dmc_output();
|
||||||
|
if (!(--a->DMC.counter_out)) {
|
||||||
|
a->DMC.counter_out = 8;
|
||||||
|
if (!a->DMC.empty) {
|
||||||
|
a->DMC.shift = a->DMC.buffer;
|
||||||
|
a->DMC.empty = TRUE;
|
||||||
|
a->DMC.silence = FALSE;
|
||||||
|
} else {
|
||||||
|
a->DMC.silence = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
a->DMC.frequency = dmc_rate[a->apu.type][a->DMC.rate_index];
|
||||||
|
a->apu.clocked = TRUE;
|
||||||
|
}
|
||||||
|
if (a->DMC.empty && a->DMC.remain) {
|
||||||
|
BYTE tick = 4;
|
||||||
|
switch (a->DMC.tick_type) {
|
||||||
|
case DMC_CPU_WRITE:
|
||||||
|
tick = 3;
|
||||||
|
break;
|
||||||
|
case DMC_R4014:
|
||||||
|
tick = 2;
|
||||||
|
break;
|
||||||
|
case DMC_NNL_DMA:
|
||||||
|
tick = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
a->DMC.buffer = a->readDMC(a->readDMCUser,a->DMC.address);
|
||||||
|
}
|
||||||
|
/* incremento gli hwtick da compiere */
|
||||||
|
if (hwtick) { hwtick[0] += tick; }
|
||||||
|
/* e naturalmente incremento anche quelli eseguiti dall'opcode */
|
||||||
|
a->apu.cpu_cycles += tick;
|
||||||
|
/* salvo a che ciclo dell'istruzione avviene il dma */
|
||||||
|
a->DMC.dma_cycle = a->apu.cpu_opcode_cycle;
|
||||||
|
/* il DMC non e' vuoto */
|
||||||
|
a->DMC.empty = FALSE;
|
||||||
|
if (++a->DMC.address > 0xFFFF) {
|
||||||
|
a->DMC.address = 0x8000;
|
||||||
|
}
|
||||||
|
if (!(--a->DMC.remain)) {
|
||||||
|
if (a->DMC.loop) {
|
||||||
|
a->DMC.remain = a->DMC.length;
|
||||||
|
a->DMC.address = a->DMC.address_start;
|
||||||
|
} else if (a->DMC.irq_enabled) {
|
||||||
|
a->r4015.value |= 0x80;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
/*if (snd_apu_tick) {
|
/*if (snd_apu_tick) {
|
||||||
|
|
|
@ -137,98 +137,6 @@ enum apu_mode { APU_60HZ, APU_48HZ };
|
||||||
#define dmc_output()\
|
#define dmc_output()\
|
||||||
a->DMC.output = a->DMC.counter & 0x7F
|
a->DMC.output = a->DMC.counter & 0x7F
|
||||||
/* tick */
|
/* tick */
|
||||||
#define square_tick(square, swap, type_clocked)\
|
|
||||||
if (!(--square.frequency)) {\
|
|
||||||
square_output(square, swap)\
|
|
||||||
square.frequency = (square.timer + 1) << 1;\
|
|
||||||
square.sequencer = (square.sequencer + 1) & 0x07;\
|
|
||||||
type_clocked = TRUE;\
|
|
||||||
}
|
|
||||||
#define triangle_tick()\
|
|
||||||
if (!(--a->TR.frequency)) {\
|
|
||||||
a->TR.frequency = a->TR.timer + 1;\
|
|
||||||
if (a->TR.length.value && a->TR.linear.value) {\
|
|
||||||
a->TR.sequencer = (a->TR.sequencer + 1) & 0x1F;\
|
|
||||||
triangle_output()\
|
|
||||||
a->apu.clocked = TRUE;\
|
|
||||||
}\
|
|
||||||
}
|
|
||||||
#define noise_tick()\
|
|
||||||
if (!(--a->NS.frequency)) {\
|
|
||||||
if (a->NS.mode) {\
|
|
||||||
a->NS.shift = (a->NS.shift >> 1) | (((a->NS.shift ^ (a->NS.shift >> 6)) & 0x0001) << 14);\
|
|
||||||
} else {\
|
|
||||||
a->NS.shift = (a->NS.shift >> 1) | (((a->NS.shift ^ (a->NS.shift >> 1)) & 0x0001) << 14);\
|
|
||||||
}\
|
|
||||||
a->NS.shift &= 0x7FFF;\
|
|
||||||
noise_output()\
|
|
||||||
a->NS.frequency = noise_timer[a->apu.type][a->NS.timer];\
|
|
||||||
a->apu.clocked = TRUE;\
|
|
||||||
}
|
|
||||||
#define dmc_tick()\
|
|
||||||
if (!(--a->DMC.frequency)) {\
|
|
||||||
if (!a->DMC.silence) {\
|
|
||||||
if (!(a->DMC.shift & 0x01)) {\
|
|
||||||
if (a->DMC.counter > 1) {\
|
|
||||||
a->DMC.counter -= 2;\
|
|
||||||
}\
|
|
||||||
} else {\
|
|
||||||
if (a->DMC.counter < 126) {\
|
|
||||||
a->DMC.counter += 2;\
|
|
||||||
}\
|
|
||||||
}\
|
|
||||||
}\
|
|
||||||
a->DMC.shift >>= 1;\
|
|
||||||
dmc_output();\
|
|
||||||
if (!(--a->DMC.counter_out)) {\
|
|
||||||
a->DMC.counter_out = 8;\
|
|
||||||
if (!a->DMC.empty) {\
|
|
||||||
a->DMC.shift = a->DMC.buffer;\
|
|
||||||
a->DMC.empty = TRUE;\
|
|
||||||
a->DMC.silence = FALSE;\
|
|
||||||
} else {\
|
|
||||||
a->DMC.silence = TRUE;\
|
|
||||||
}\
|
|
||||||
}\
|
|
||||||
a->DMC.frequency = dmc_rate[a->apu.type][a->DMC.rate_index];\
|
|
||||||
a->apu.clocked = TRUE;\
|
|
||||||
}\
|
|
||||||
if (a->DMC.empty && a->DMC.remain) {\
|
|
||||||
BYTE tick = 4;\
|
|
||||||
switch (a->DMC.tick_type) {\
|
|
||||||
case DMC_CPU_WRITE:\
|
|
||||||
tick = 3;\
|
|
||||||
break;\
|
|
||||||
case DMC_R4014:\
|
|
||||||
tick = 2;\
|
|
||||||
break;\
|
|
||||||
case DMC_NNL_DMA:\
|
|
||||||
tick = 1;\
|
|
||||||
break;\
|
|
||||||
}\
|
|
||||||
{\
|
|
||||||
a->DMC.buffer = a->readDMC(a->readDMCUser,a->DMC.address);\
|
|
||||||
}\
|
|
||||||
/* incremento gli hwtick da compiere */\
|
|
||||||
if (hwtick) { hwtick[0] += tick; }\
|
|
||||||
/* e naturalmente incremento anche quelli eseguiti dall'opcode */\
|
|
||||||
a->apu.cpu_cycles += tick;\
|
|
||||||
/* salvo a che ciclo dell'istruzione avviene il dma */\
|
|
||||||
a->DMC.dma_cycle = a->apu.cpu_opcode_cycle;\
|
|
||||||
/* il DMC non e' vuoto */\
|
|
||||||
a->DMC.empty = FALSE;\
|
|
||||||
if (++a->DMC.address > 0xFFFF) {\
|
|
||||||
a->DMC.address = 0x8000;\
|
|
||||||
}\
|
|
||||||
if (!(--a->DMC.remain)) {\
|
|
||||||
if (a->DMC.loop) {\
|
|
||||||
a->DMC.remain = a->DMC.length;\
|
|
||||||
a->DMC.address = a->DMC.address_start;\
|
|
||||||
} else if (a->DMC.irq_enabled) {\
|
|
||||||
a->r4015.value |= 0x80;\
|
|
||||||
}\
|
|
||||||
}\
|
|
||||||
}
|
|
||||||
|
|
||||||
#define apu_change_step(index)\
|
#define apu_change_step(index)\
|
||||||
a->apu.cycles += apuPeriod[a->apu.mode][a->apu.type][index]
|
a->apu.cycles += apuPeriod[a->apu.mode][a->apu.type][index]
|
||||||
|
|
|
@ -102,6 +102,19 @@ void extcl_envelope_clock_MMC5(struct _mmc5* mmc5) {
|
||||||
envelope_run(mmc5->S4)
|
envelope_run(mmc5->S4)
|
||||||
}
|
}
|
||||||
void extcl_apu_tick_MMC5(struct _mmc5* mmc5) {
|
void extcl_apu_tick_MMC5(struct _mmc5* mmc5) {
|
||||||
square_tick(mmc5->S3, 0, mmc5->clocked)
|
// SQUARE 3 TICK
|
||||||
square_tick(mmc5->S4, 0, mmc5->clocked)
|
if (!(--mmc5->S3.frequency)) {
|
||||||
}
|
square_output(mmc5->S3, 0)
|
||||||
|
mmc5->S3.frequency = (mmc5->S3.timer + 1) << 1;
|
||||||
|
mmc5->S3.sequencer = (mmc5->S3.sequencer + 1) & 0x07;
|
||||||
|
mmc5->clocked = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SQUARE 4 TICK
|
||||||
|
if (!(--mmc5->S4.frequency)) {
|
||||||
|
square_output(mmc5->S4, 0)
|
||||||
|
mmc5->S4.frequency = (mmc5->S4.timer + 1) << 1;
|
||||||
|
mmc5->S4.sequencer = (mmc5->S4.sequencer + 1) & 0x07;
|
||||||
|
mmc5->clocked = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue