Skip to content

Commit 8d80ec3

Browse files
committed
feat: implement timers
1 parent afa5e49 commit 8d80ec3

File tree

1 file changed

+44
-2
lines changed

1 file changed

+44
-2
lines changed

src/main.c

+44-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ uint16 index_register = 0x0;
1313
uint8 memory[4096];
1414
uint8 registers[0x10];
1515

16+
uint8 delay_timer = 0x0;
17+
uint8 sound_timer = 0x0;
18+
1619
void chip_execute() {
1720
uint16 op = memory[ip] << 8 | memory[ip+1];
1821
ip += 2;
@@ -107,7 +110,7 @@ void chip_execute() {
107110
registers[x] = registers[y] - registers[x];
108111
break;
109112
default:
110-
printf("[*] instruction not implemented 0x%04x\n", op);
113+
printf("[*] register instruction not implemented 0x%04x\n", op);
111114
}
112115
break;
113116
case 0xa:
@@ -117,13 +120,46 @@ void chip_execute() {
117120
case 0xd:
118121
// draw()
119122
{
120-
registers[0xF] = 0;
121123
uint8 sprite[n];
122124
memcpy(sprite, memory + index_register, sizeof(uint8) * n);
123125
uint8 unset = sdl_draw(registers[x], registers[y], sprite, n);
124126
registers[0xF] = unset;
125127
}
126128
break;
129+
case 0xf:
130+
switch (nn) {
131+
case 0x07:
132+
// store delay_timer into register X
133+
registers[x] = delay_timer;
134+
break;
135+
case 0x15:
136+
// set delay_timer to register X
137+
delay_timer = registers[x];
138+
break;
139+
case 0x18:
140+
// set sound_timer to register X
141+
sound_timer = registers[x];
142+
break;
143+
case 0x1e:
144+
// add register X to index register
145+
index_register += registers[x];
146+
break;
147+
case 0x55:
148+
// store values from register 0 -> X into memory at I
149+
for (int i = 0; i <= x; i++) {
150+
memory[index_register+i] = registers[i];
151+
}
152+
break;
153+
case 0x65:
154+
// load values into register 0 -> X from memory at I
155+
for (int i = 0; i <= x; i++) {
156+
registers[i] = memory[index_register+i];
157+
}
158+
break;
159+
default:
160+
printf("[+] special instruction not implemented 0x%04x\n", op);
161+
}
162+
break;
127163
default:
128164
printf("[*] instruction not implemented 0x%04x\n", op);
129165
}
@@ -136,6 +172,12 @@ void chip_execute_frame() {
136172
for (int i = 0; i < 700/60; i++) {
137173
chip_execute();
138174
}
175+
176+
if (delay_timer != 0x0)
177+
delay_timer--;
178+
179+
if (sound_timer != 0x0)
180+
sound_timer--;
139181
}
140182

141183
int main(int argc, char* argv[]) {

0 commit comments

Comments
 (0)