forked from CedricHermansBIT/pyGameBoy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinterrupts.py
More file actions
88 lines (83 loc) · 3.38 KB
/
interrupts.py
File metadata and controls
88 lines (83 loc) · 3.38 KB
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
from memory_control import *
def handle_interrupts(MEMORY: list, PC: int, IME: int, SP: int, HALT: int) -> tuple:
if IME:
#print(f"IER: {hex(MEMORY[0xffff])} IF: {hex(MEMORY[0xff0f])}")
#0xFFFF is the interrupt enable register and 0xFF0F is the interrupt flag register
if readMem(MEMORY, 0xFFFF) & readMem(MEMORY, 0xFF0F):
if readMem(MEMORY, 0xFFFF) & 0x01 and readMem(MEMORY, 0xFF0F) & 0x01:
#print("VBLANK")
IME = False
writeMem(MEMORY, 0xFF0F, readMem(MEMORY, 0xFF0F) & 0xFE)
# print(MEMORY[0xFF0F])
SP-=1
writeMem(MEMORY, SP, (PC>>8) & 0xFF)
SP-=1
writeMem(MEMORY, SP, PC & 0xFF)
#print(hex(MEMORY[SP]),hex(MEMORY[SP+1]))
HALT=False
return 0x0040, MEMORY, IME, SP, HALT
elif readMem(MEMORY, 0xFFFF) & 0x02 and readMem(MEMORY, 0xFF0F) & 0x02:
#print("LCD STAT")
IME = False
writeMem(MEMORY, 0xFF0F, readMem(MEMORY, 0xFF0F) & 0xFD)
SP-=1
writeMem(MEMORY, SP, (PC>>8) & 0xFF)
SP-=1
writeMem(MEMORY, SP, PC & 0xFF)
HALT=False
return 0x0048 , MEMORY, IME, SP, HALT
elif readMem(MEMORY, 0xFFFF) & 0x04 and readMem(MEMORY, 0xFF0F) & 0x04:
#print("TIMER")
IME = False
writeMem(MEMORY, 0xFF0F, readMem(MEMORY, 0xFF0F) & 0xFB)
SP-=1
writeMem(MEMORY, SP, (PC>>8) & 0xFF)
SP-=1
writeMem(MEMORY, SP, PC & 0xFF)
HALT=False
return 0x0050, MEMORY, IME, SP, HALT
elif readMem(MEMORY, 0xFFFF) & 0x08 and readMem(MEMORY, 0xFF0F) & 0x08:
#print("SERIAL")
IME = False
writeMem(MEMORY, 0xFF0F, readMem(MEMORY, 0xFF0F) & 0xF7)
SP-=1
writeMem(MEMORY, SP, (PC>>8) & 0xFF)
SP-=1
writeMem(MEMORY, SP, PC & 0xFF)
HALT=False
return 0x0058, MEMORY, IME, SP, HALT
elif readMem(MEMORY, 0xFFFF) & 0x10 and readMem(MEMORY, 0xFF0F) & 0x10:
print("JOYPAD")
IME = False
writeMem(MEMORY, 0xFF0F, readMem(MEMORY, 0xFF0F) & 0xEF)
SP-=1
writeMem(MEMORY, SP, (PC>>8) & 0xFF)
SP-=1
writeMem(MEMORY, SP, PC & 0xFF)
HALT=False
return 0x0060, MEMORY, IME, SP, HALT
return PC, MEMORY, IME, SP, HALT
CLOCKSUM = 0
TIMER_CLOCKSUM = 0
def handle_timer(cycle, MEMORY):
global CLOCKSUM
global TIMER_CLOCKSUM
CLOCKSUM+=cycle
if CLOCKSUM>=256:
CLOCKSUM-=256
MEMORY[0xff04] += 1 & 0xff
if MEMORY[0xff07] & 0x04:
TIMER_CLOCKSUM+=cycle*4
freq=4096
if MEMORY[0xff07] & 0x03 == 0x01:
freq=262144
elif MEMORY[0xff07] & 0x03 == 0x02:
freq=65536
elif MEMORY[0xff07] & 0x03 == 0x03:
freq=16384
while TIMER_CLOCKSUM>=(4194304/freq):
MEMORY[0xff05] = (MEMORY[0xff05]+1)
if MEMORY[0xff05] > 0xff:
MEMORY[0xff05] = MEMORY[0xff06]
MEMORY[0xff0f] |= 0x04
TIMER_CLOCKSUM-=(4194304/freq)