mirror of
https://github.com/BluestormDNA/ProjectPSX.git
synced 2025-04-02 10:52:34 -04:00
Removed Interrupt from Device (handled in bus)
This commit is contained in:
parent
ffb39b0a61
commit
b679fb48bd
4 changed files with 42 additions and 44 deletions
|
@ -4,8 +4,6 @@ using System.Collections.Generic;
|
|||
namespace ProjectPSX.Devices {
|
||||
public class CDROM : Device {
|
||||
|
||||
private InterruptController InterruptController;
|
||||
|
||||
private Queue<uint> parameterBuffer = new Queue<uint>(16);
|
||||
private Queue<uint> responseBuffer = new Queue<uint>(16);
|
||||
private Queue<byte> dataBuffer = new Queue<byte>();
|
||||
|
@ -64,15 +62,14 @@ namespace ProjectPSX.Devices {
|
|||
|
||||
private CD cd;
|
||||
|
||||
public CDROM(InterruptController InterruptController) {
|
||||
this.InterruptController = InterruptController;
|
||||
public CDROM() {
|
||||
cd = new CD();
|
||||
}
|
||||
|
||||
public void tick(uint cycles) {
|
||||
public bool tick(uint cycles) {
|
||||
counter += cycles;
|
||||
if (counter < 10000) {
|
||||
return;
|
||||
return false; ;
|
||||
}
|
||||
|
||||
if (interruptQueue.Count != 0 && IF == 0) {
|
||||
|
@ -80,29 +77,30 @@ namespace ProjectPSX.Devices {
|
|||
IF |= interruptQueue.Dequeue();
|
||||
}
|
||||
|
||||
if ((IF & IE) != 0 && ((InterruptController.loadISTAT() & 0x4) != 0x4)) {
|
||||
Console.WriteLine("[CD INT] Triggering " + IF.ToString("x8"));
|
||||
InterruptController.set(Interrupt.CDROM);
|
||||
if ((IF & IE) != 0 /*&& ((InterruptController.loadISTAT() & 0x4) != 0x4)*/) {
|
||||
//Console.WriteLine("[CD INT] Triggering " + IF.ToString("x8"));
|
||||
//InterruptController.set(Interrupt.CDROM);
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (mode) {
|
||||
case Mode.Idle:
|
||||
if (counter < 4000 || interruptQueue.Count != 0) { //Await some cycles so interrupts are not triggered instant
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
counter = 0;
|
||||
break;
|
||||
|
||||
case Mode.Seek:
|
||||
if (counter < 20000 || interruptQueue.Count != 0) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
mode = Mode.Read; //???
|
||||
break;
|
||||
|
||||
case Mode.Read:
|
||||
if (counter < 100000 || interruptQueue.Count != 0) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
//i should trigger here and add loc...
|
||||
responseBuffer.Enqueue(STAT);
|
||||
|
@ -112,7 +110,7 @@ namespace ProjectPSX.Devices {
|
|||
|
||||
case Mode.Transfer:
|
||||
if (counter < 10000 || interruptQueue.Count != 0) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
//if(dataBuffer.Count == 0)
|
||||
|
@ -121,6 +119,7 @@ namespace ProjectPSX.Devices {
|
|||
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -108,22 +108,20 @@ namespace ProjectPSX.Devices {
|
|||
|
||||
private uint timer;
|
||||
|
||||
public GPU(InterruptController interruptController) {
|
||||
this.InterruptController = interruptController;
|
||||
public GPU() {
|
||||
mode = Mode.COMMAND;
|
||||
GP1_Reset();
|
||||
}
|
||||
|
||||
private InterruptController InterruptController;
|
||||
|
||||
public void tick(uint cycles) {
|
||||
public bool tick(uint cycles) {
|
||||
timer += cycles;
|
||||
if (timer >= 564480) {
|
||||
//Console.WriteLine("[GPU] Request Interrupt 0x1 VBLANK");
|
||||
InterruptController.set(Interrupt.VBLANK);
|
||||
timer -= 564480;
|
||||
window.update();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public uint loadGPUSTAT() {
|
||||
|
@ -235,7 +233,8 @@ namespace ProjectPSX.Devices {
|
|||
case 0x00: return (1, GP0_NOP);
|
||||
case 0x01: return (1, GP0_MemClearCache);
|
||||
case 0x02: return (3, GP0_FillRectVRAM);
|
||||
case 0x2C: return (9, GP0_RenderTexturedQuadBlend);
|
||||
case 0x2C: //return (9, GP0_RenderTexturedQuadBlend);
|
||||
case 0x2D: return (9, GP0_RenderTexturedQuadBlend);
|
||||
case 0xA0: return (3, GP0_MemCopyRectCPUtoVRAM);
|
||||
case 0xC0: return (3, GP0_MemCopyRectVRAMtoCPU);
|
||||
case 0xE1: return (1, GP0_SetDrawMode);
|
||||
|
@ -248,6 +247,8 @@ namespace ProjectPSX.Devices {
|
|||
case 0x30: return (6, GP0_RenderShadedTriOpaque);
|
||||
case 0x38: return (8, GP0_RenderShadedQuadOpaque);
|
||||
|
||||
//case 0x48: return ();
|
||||
|
||||
case 0x60:
|
||||
case 0x62: return (3, GP0_RenderMonoRectangle);
|
||||
case 0x68:
|
||||
|
@ -255,9 +256,10 @@ namespace ProjectPSX.Devices {
|
|||
case 0x70:
|
||||
case 0x72:
|
||||
case 0x78:
|
||||
case 0x7A: return (2, GP0_RenderMonoRectangle); // todo hardcode return values and rewrite this
|
||||
case 0x7A: return (2, GP0_RenderMonoRectangle); // todo hardcode return values and rewrite this also semi transp not impl
|
||||
|
||||
default: Console.WriteLine("[GPU] Unsupported Command" + opcode.ToString("x8")); Console.ReadLine(); throw new NotImplementedException();
|
||||
|
||||
default: Console.WriteLine("[GPU] Unsupported Command " + opcode.ToString("x8")); /*Console.ReadLine();*/ return (1, GP0_NOP);// throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -397,7 +399,6 @@ namespace ProjectPSX.Devices {
|
|||
w1_row += B20;
|
||||
w2_row += B01;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void GP0_RenderShadedTriOpaque() { // 0x30
|
||||
|
|
|
@ -8,14 +8,11 @@ namespace ProjectPSX.Devices {
|
|||
public class TIMERS : Device {
|
||||
|
||||
TIMER[] timer = new TIMER[3];
|
||||
InterruptController interruptController = new InterruptController();
|
||||
|
||||
public TIMERS(InterruptController interruptController) {
|
||||
this.interruptController = interruptController;
|
||||
|
||||
timer[0] = new TIMER(0, interruptController);
|
||||
timer[1] = new TIMER(1, interruptController);
|
||||
timer[2] = new TIMER(2, interruptController);
|
||||
public TIMERS() {
|
||||
timer[0] = new TIMER();
|
||||
timer[1] = new TIMER();
|
||||
timer[2] = new TIMER();
|
||||
}
|
||||
|
||||
public new void write(Width w, uint addr, uint value) {
|
||||
|
@ -30,14 +27,13 @@ namespace ProjectPSX.Devices {
|
|||
return timer[timerNumber].load(w, addr);
|
||||
}
|
||||
|
||||
public void tick(uint cycles) {
|
||||
timer[0].tick(cycles);
|
||||
timer[1].tick(cycles);
|
||||
timer[2].tick(cycles);
|
||||
public bool tick(int timerNumber, uint cycles) {
|
||||
return timer[timerNumber].tick(cycles);
|
||||
}
|
||||
|
||||
public class TIMER {
|
||||
private int timerNumber;
|
||||
private static int timerCounter;
|
||||
|
||||
private ushort counterValue;
|
||||
private uint counterTargetValue;
|
||||
|
@ -56,11 +52,8 @@ namespace ProjectPSX.Devices {
|
|||
private byte reachedTarget;
|
||||
private byte reachedFFFF;
|
||||
|
||||
private InterruptController interruptController;
|
||||
|
||||
public TIMER(int timerNumber, InterruptController interruptController) {
|
||||
this.timerNumber = timerNumber;
|
||||
this.interruptController = interruptController;
|
||||
public TIMER() {
|
||||
this.timerNumber = timerCounter++;
|
||||
}
|
||||
|
||||
public void write(Width w, uint addr, uint value) {
|
||||
|
@ -80,16 +73,19 @@ namespace ProjectPSX.Devices {
|
|||
}
|
||||
}
|
||||
|
||||
public void tick(uint cycles) { //todo this needs rework
|
||||
public bool tick(uint cycles) { //todo this needs rework
|
||||
switch (timerNumber) {
|
||||
case 0:
|
||||
break;
|
||||
return false;
|
||||
case 1:
|
||||
break;
|
||||
return false;
|
||||
case 2:
|
||||
break;
|
||||
return false;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
counter2div8 += (ushort)cycles;
|
||||
if(counter2div8 == 8) {
|
||||
counterValue++;
|
||||
|
@ -102,7 +98,7 @@ namespace ProjectPSX.Devices {
|
|||
}
|
||||
} else if(counterValue == 0xFFFF & irqWhenCounterFFFF == 1) {
|
||||
interruptController.set(Interrupt.TIMER2);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
private void setCounterMode(uint value) {
|
||||
|
|
|
@ -64,6 +64,8 @@
|
|||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Devices\Controller.cs" />
|
||||
<Compile Include="Devices\DigitalController.cs" />
|
||||
<Compile Include="Util\BIOS_Disassembler.cs" />
|
||||
<Compile Include="Core\GTE.cs" />
|
||||
<Compile Include="Devices\JOYPAD.cs" />
|
||||
|
|
Loading…
Add table
Reference in a new issue