8
8
from pyboy .core .opcodes import CPU_COMMANDS
9
9
from pyboy .utils import STATE_VERSION
10
10
11
- from . import bootrom , cartridge , cpu , interaction , lcd , ram , sound , timer
11
+ from . import bootrom , cartridge , cpu , interaction , lcd , ram , serial , sound , timer
12
12
13
13
INTR_VBLANK , INTR_LCDC , INTR_TIMER , INTR_SERIAL , INTR_HIGHTOLOW = [1 << x for x in range (5 )]
14
14
@@ -26,6 +26,8 @@ def __init__(
26
26
cgb ,
27
27
randomize = False ,
28
28
profiling = False ,
29
+ serial_address = None ,
30
+ serial_bind = None ,
29
31
):
30
32
if bootrom_file is not None :
31
33
logger .info ("Boot-ROM file provided" )
@@ -43,6 +45,7 @@ def __init__(
43
45
self .bootrom = bootrom .BootROM (bootrom_file , cgb )
44
46
self .ram = ram .RAM (cgb , randomize = randomize )
45
47
self .cpu = cpu .CPU (self , profiling )
48
+ self .serial = serial .Serial (serial_address , serial_bind )
46
49
47
50
if cgb :
48
51
self .lcd = lcd .CGBLCD (
@@ -105,6 +108,7 @@ def buttonevent(self, key):
105
108
106
109
def stop (self , save ):
107
110
self .sound .stop ()
111
+ self .serial .stop ()
108
112
if save :
109
113
self .cartridge .stop ()
110
114
@@ -210,9 +214,10 @@ def tick(self):
210
214
cycles = min (
211
215
self .lcd .cycles_to_interrupt (),
212
216
self .timer .cycles_to_interrupt (),
213
- # self.serial.cycles_to_interrupt (),
214
- mode0_cycles
217
+ self .serial .cycles_to_transmit (),
218
+ mode0_cycles ,
215
219
)
220
+ cycles = 4
216
221
217
222
# Profiling
218
223
self .cpu .add_opcode_hit (0x76 , cycles // 4 )
@@ -228,6 +233,8 @@ def tick(self):
228
233
229
234
if self .timer .tick (cycles ):
230
235
self .cpu .set_interruptflag (INTR_TIMER )
236
+ if self .serial .tick (cycles ):
237
+ self .cpu .set_interruptflag (INTR_SERIAL )
231
238
232
239
lcd_interrupt = self .lcd .tick (cycles )
233
240
if lcd_interrupt :
@@ -280,7 +287,13 @@ def getitem(self, i):
280
287
elif 0xFEA0 <= i < 0xFF00 : # Empty but unusable for I/O
281
288
return self .ram .non_io_internal_ram0 [i - 0xFEA0 ]
282
289
elif 0xFF00 <= i < 0xFF4C : # I/O ports
283
- if i == 0xFF04 :
290
+ if i == 0xFF01 :
291
+ logger .info (f"get SB { self .serial .SB } " )
292
+ return self .serial .SB
293
+ elif i == 0xFF02 :
294
+ logger .info (f"get SC { self .serial .SC } " )
295
+ return self .serial .SC
296
+ elif i == 0xFF04 :
284
297
return self .timer .DIV
285
298
elif i == 0xFF05 :
286
299
return self .timer .TIMA
@@ -398,8 +411,14 @@ def setitem(self, i, value):
398
411
if i == 0xFF00 :
399
412
self .ram .io_ports [i - 0xFF00 ] = self .interaction .pull (value )
400
413
elif i == 0xFF01 :
414
+ self .serial .SB = value
415
+ logger .info (f"SB: { value :02x} " )
416
+
401
417
self .serialbuffer += chr (value )
402
418
self .ram .io_ports [i - 0xFF00 ] = value
419
+ elif i == 0xFF02 :
420
+ self .serial .SC = value
421
+ logger .info (f"SC: { value :02x} " )
403
422
elif i == 0xFF04 :
404
423
self .timer .reset ()
405
424
elif i == 0xFF05 :
0 commit comments