-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmappers.c
61 lines (49 loc) · 1.53 KB
/
mappers.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdint.h>
#include <stdlib.h>
#include "SDL2/SDL.h"
#include "nes_header.h"
#include "mapper.h"
#include "mappers.h"
#include "controllers.h"
#include "ic_rp2a03.h"
#include "ic_6502.h"
#include "ic_2c02.h"
#include "mapper0.h"
#include "mapper1.h"
int mapper_clock(struct mapper *mapper)
{
int render = ic_2C02_clock(mapper->ppu);
if (render && mapper->ppu->do_nmi) {
ic_6502_nmi(mapper->cpu);
}
if (mapper->clock == 0) {
mapper->clock = 2;
if (mapper->dma_write_time > 512) {
mapper->dma_write_time--;
} else if (mapper->dma_write_time > 0) {
mapper->dma_write_time--;
if ((mapper->dma_write_time & 1) == 0) {
uint16_t byte = 255 - (mapper->dma_write_time >> 1);
uint8_t val = mapper->cpu_bus_read(mapper, mapper->dma_page | byte);
mapper->cpu_bus_write(mapper, 0x2004, val);
}
} else {
ic_6502_clock(mapper->cpu);
}
float sample = ic_rp2a03_clock(mapper->apu);
mapper->clocks++;
while (mapper->clocks >= 0) {
mapper->clocks -= 1789773.0f / mapper->sampling;
while ((mapper->buffer_tail + 1) % 2048 == mapper->buffer_head);
mapper->buffer[mapper->buffer_tail] = sample;
mapper->buffer_tail = (mapper->buffer_tail + 1) % 2048;
}
} else {
mapper->clock--;
}
return render;
}
struct mapper *(*mappers[])(struct nes_rom *rom) = {
mapper_0_builder,
mapper_1_builder,
};