MCPcopy Create free account
hub / github.com/PCSX2/pcsx2 / Gif_HandlerAD

Function Gif_HandlerAD

pcsx2/Gif_Unit.cpp:13–87  ·  view source on GitHub ↗

Returns true on stalling SIGNAL

Source from the content-addressed store, hash-verified

11
12// Returns true on stalling SIGNAL
13bool Gif_HandlerAD(u8* pMem)
14{
15 u32 reg = pMem[8];
16 u32* data = (u32*)pMem;
17 if (reg >= GIF_A_D_REG_BITBLTBUF && reg <= GIF_A_D_REG_TRXREG)
18 {
19 vif1.transfer_registers[reg - GIF_A_D_REG_BITBLTBUF] = *(u64*)pMem;
20 }
21 else if (reg == GIF_A_D_REG_TRXDIR)
22 { // TRXDIR
23 if ((pMem[0] & 3) == 1)
24 { // local -> host
25 u8 bpp = 32; // Onimusha does TRXDIR without BLTDIVIDE first, assume 32bit
26 switch (vif1.BITBLTBUF.SPSM & 7)
27 {
28 case 0:
29 bpp = 32;
30 break;
31 case 1:
32 bpp = 24;
33 break;
34 case 2:
35 bpp = 16;
36 break;
37 case 3:
38 bpp = 8;
39 break;
40 default: // 4 is 4 bit but this is forbidden
41 Console.Error("Illegal format for GS upload: SPSM=0%02o", vif1.BITBLTBUF.SPSM);
42 break;
43 }
44 // qwords, rounded down; any extra bits are lost
45 // games must take care to ensure transfer rectangles are exact multiples of a qword
46 vif1.GSLastDownloadSize = vif1.TRXREG.RRW * vif1.TRXREG.RRH * bpp >> 7;
47 }
48 }
49 else if (reg == GIF_A_D_REG_SIGNAL)
50 { // SIGNAL
51 if (CSRreg.SIGNAL)
52 { // Time to ignore all subsequent drawing operations.
53 GUNIT_WARN(Color_Orange, "GIF Handler - Stalling SIGNAL");
54 if (!gifUnit.gsSIGNAL.queued)
55 {
56 gifUnit.gsSIGNAL.queued = true;
57 gifUnit.gsSIGNAL.data[0] = data[0];
58 gifUnit.gsSIGNAL.data[1] = data[1];
59 return true; // Stalling SIGNAL
60 }
61 }
62 else
63 {
64 GUNIT_WARN("GIF Handler - SIGNAL");
65 GSSIGLBLID.SIGID = (GSSIGLBLID.SIGID & ~data[1]) | (data[0] & data[1]);
66 if (!GSIMR.SIGMSK)
67 gsIrq();
68 CSRreg.SIGNAL = true;
69 }
70 }

Callers 1

ExecuteGSPacketMethod · 0.85

Calls 2

gsIrqFunction · 0.85
ErrorMethod · 0.45

Tested by

no test coverage detected