redpower/src/main/java/com/eloraam/redpower/control/TileCPU.java

2029 lines
52 KiB
Java

package com.eloraam.redpower.control;
import com.eloraam.redpower.RedPowerControl;
import com.eloraam.redpower.core.CoreLib;
import com.eloraam.redpower.core.IFrameSupport;
import com.eloraam.redpower.core.IRedbusConnectable;
import com.eloraam.redpower.core.RedbusLib;
import com.eloraam.redpower.core.TileExtended;
import com.eloraam.redpower.core.WorldCoord;
import java.io.IOException;
import java.io.InputStream;
import net.minecraft.block.Block;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.IBlockAccess;
public class TileCPU extends TileExtended implements IRedbusConnectable, IFrameSupport {
public int Rotation = 0;
public byte[] memory = new byte[8192];
private int addrPOR;
private int addrBRK;
private int regSP;
private int regPC;
private int regA;
private int regB;
private int regX;
private int regY;
private int regR;
private int regI;
private int regD;
private boolean flagC;
private boolean flagZ;
private boolean flagID;
private boolean flagD;
private boolean flagBRK;
private boolean flagO;
private boolean flagN;
private boolean flagE;
private boolean flagM;
private boolean flagX;
private int mmuRBB = 0;
private int mmuRBA = 0;
private int mmuRBW = 0;
private boolean mmuEnRB = false;
private boolean mmuEnRBW = false;
private boolean rbTimeout = false;
private boolean waiTimeout = false;
private IRedbusConnectable rbCache = null;
private TileBackplane[] backplane = new TileBackplane[7];
private int rtcTicks = 0;
int sliceCycles = -1;
int diskAddr = 2;
int displayAddr = 1;
int rbaddr = 0;
public TileCPU() {
this.coldBootCPU();
}
public void coldBootCPU() {
this.addrPOR = 8192;
this.addrBRK = 8192;
this.regSP = 512;
this.regPC = 1024;
this.regR = 768;
this.regA = 0;
this.regX = 0;
this.regY = 0;
this.regD = 0;
this.flagC = false;
this.flagZ = false;
this.flagID = false;
this.flagD = false;
this.flagBRK = false;
this.flagO = false;
this.flagN = false;
this.flagE = true;
this.flagM = true;
this.flagX = true;
this.memory[0] = (byte)this.diskAddr;
this.memory[1] = (byte)this.displayAddr;
try {
InputStream is = RedPowerControl.class.getResourceAsStream("/assets/rpcontrol/forth/rpcboot.bin");
Throwable var2 = null;
try {
is.read(this.memory, 1024, 256);
} catch (Throwable var12) {
var2 = var12;
throw var12;
} finally {
if (is != null) {
if (var2 != null) {
try {
is.close();
} catch (Throwable var11) {
var2.addSuppressed(var11);
}
} else {
is.close();
}
}
}
} catch (IOException var14) {
var14.printStackTrace();
}
this.sliceCycles = -1;
}
public void warmBootCPU() {
if (this.sliceCycles >= 0) {
this.regSP = 512;
this.regR = 768;
this.regPC = this.addrPOR;
}
this.sliceCycles = 0;
}
public void haltCPU() {
this.sliceCycles = -1;
}
public boolean isRunning() {
return this.sliceCycles >= 0;
}
@Override
public int rbGetAddr() {
return this.rbaddr;
}
@Override
public void rbSetAddr(int addr) {
}
@Override
public int rbRead(int reg) {
return !this.mmuEnRBW ? 0 : this.readOnlyMem(this.mmuRBW + reg);
}
@Override
public void rbWrite(int reg, int dat) {
if (this.mmuEnRBW) {
this.writeOnlyMem(this.mmuRBW + reg, dat);
}
}
@Override
public int getConnectableMask() {
return 16777215;
}
@Override
public int getConnectClass(int side) {
return 66;
}
@Override
public int getCornerPowerMode() {
return 0;
}
@Override
public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) {
this.Rotation = (int)Math.floor((double)(ent.rotationYaw * 4.0F / 360.0F) + 0.5) + 1 & 3;
if (ent instanceof EntityPlayer) {
super.Owner = ((EntityPlayer)ent).getGameProfile();
}
}
@Override
public boolean onBlockActivated(EntityPlayer player) {
if (player.isSneaking()) {
return false;
} else {
if (!super.worldObj.isRemote) {
player.openGui(RedPowerControl.instance, 2, super.worldObj, super.xCoord, super.yCoord, super.zCoord);
}
return true;
}
}
public Block getBlockType() {
return RedPowerControl.blockPeripheral;
}
@Override
public int getExtendedID() {
return 1;
}
public boolean isUseableByPlayer(EntityPlayer player) {
return !this.isInvalid()
&& super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this
&& player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0;
}
protected void refreshBackplane() {
boolean bpok = true;
WorldCoord wc = new WorldCoord(this);
for(int i = 0; i < 7; ++i) {
if (!bpok) {
this.backplane[i] = null;
} else {
wc.step(CoreLib.rotToSide(this.Rotation));
TileBackplane tbp = CoreLib.getTileEntity(super.worldObj, wc, TileBackplane.class);
this.backplane[i] = tbp;
if (tbp == null) {
bpok = false;
}
}
}
}
@Override
public void updateEntity() {
++this.rtcTicks;
if (this.sliceCycles >= 0) {
this.rbTimeout = false;
this.rbCache = null;
this.waiTimeout = false;
this.sliceCycles += 1000;
if (this.sliceCycles > 100000) {
this.sliceCycles = 100000;
}
this.refreshBackplane();
while(this.sliceCycles > 0 && !this.waiTimeout && !this.rbTimeout) {
--this.sliceCycles;
this.executeInsn();
}
}
}
protected int readOnlyMem(int addr) {
addr &= 65535;
if (addr < 8192) {
return this.memory[addr] & 0xFF;
} else {
int atop = (addr >> 13) - 1;
return this.backplane[atop] == null ? 255 : this.backplane[atop].readBackplane(addr & 8191);
}
}
public int readMem(int addr) {
if (this.mmuEnRB && addr >= this.mmuRBB && addr < this.mmuRBB + 256) {
if (this.rbCache == null) {
this.rbCache = RedbusLib.getAddr(super.worldObj, new WorldCoord(this), this.mmuRBA);
}
if (this.rbCache == null) {
this.rbTimeout = true;
return 0;
} else {
return this.rbCache.rbRead(addr - this.mmuRBB);
}
} else {
return this.readOnlyMem(addr);
}
}
protected void writeOnlyMem(int addr, int val) {
addr &= 65535;
if (addr < 8192) {
this.memory[addr] = (byte)val;
} else {
int atop = (addr >> 13) - 1;
if (this.backplane[atop] != null) {
this.backplane[atop].writeBackplane(addr & 8191, val);
}
}
}
public void writeMem(int addr, int val) {
if (this.mmuEnRB && addr >= this.mmuRBB && addr < this.mmuRBB + 256) {
if (this.rbCache == null) {
this.rbCache = RedbusLib.getAddr(super.worldObj, new WorldCoord(this), this.mmuRBA);
}
if (this.rbCache == null) {
this.rbTimeout = true;
} else {
this.rbCache.rbWrite(addr - this.mmuRBB, val & 0xFF);
}
} else {
this.writeOnlyMem(addr, val);
}
}
private void incPC() {
++this.regPC;
}
private int maskM() {
return this.flagM ? 255 : 65535;
}
private int maskX() {
return this.flagX ? 255 : 65535;
}
private int negM() {
return this.flagM ? 128 : 32768;
}
private int negX() {
return this.flagX ? 128 : 32768;
}
private int readB() {
int i = this.readMem(this.regPC);
this.incPC();
return i;
}
private int readM() {
int i = this.readMem(this.regPC);
this.incPC();
if (!this.flagM) {
i |= this.readMem(this.regPC) << 8;
this.incPC();
}
return i;
}
private int readX() {
int i = this.readMem(this.regPC);
this.incPC();
if (!this.flagX) {
i |= this.readMem(this.regPC) << 8;
this.incPC();
}
return i;
}
private int readM(int addr) {
int i = this.readMem(addr);
if (!this.flagM) {
i |= this.readMem(addr + 1) << 8;
}
return i;
}
private int readX(int addr) {
int i = this.readMem(addr);
if (!this.flagX) {
i |= this.readMem(addr + 1) << 8;
}
return i;
}
private void writeM(int addr, int reg) {
this.writeMem(addr, reg);
if (!this.flagM) {
this.writeMem(addr + 1, reg >> 8);
}
}
private void writeX(int addr, int reg) {
this.writeMem(addr, reg);
if (!this.flagX) {
this.writeMem(addr + 1, reg >> 8);
}
}
private int readBX() {
int i = this.readMem(this.regPC) + this.regX;
if (this.flagX) {
i &= 255;
}
this.incPC();
return i;
}
private int readBY() {
int i = this.readMem(this.regPC) + this.regY;
if (this.flagX) {
i &= 255;
}
this.incPC();
return i;
}
private int readBS() {
int i = this.readMem(this.regPC) + this.regSP;
this.incPC();
return i;
}
private int readBR() {
int i = this.readMem(this.regPC) + this.regR;
this.incPC();
return i;
}
private int readBSWY() {
int i = this.readMem(this.regPC) + this.regSP;
this.incPC();
return this.readW(i) + this.regY;
}
private int readBRWY() {
int i = this.readMem(this.regPC) + this.regR;
this.incPC();
return this.readW(i) + this.regY;
}
private int readW() {
int i = this.readMem(this.regPC);
this.incPC();
i |= this.readMem(this.regPC) << 8;
this.incPC();
return i;
}
private int readW(int addr) {
int i = this.readMem(addr);
return i | this.readMem(addr + 1) << 8;
}
private int readWX() {
int i = this.readMem(this.regPC);
this.incPC();
i |= this.readMem(this.regPC) << 8;
this.incPC();
return i + this.regX;
}
private int readWY() {
int i = this.readMem(this.regPC);
this.incPC();
i |= this.readMem(this.regPC) << 8;
this.incPC();
return i + this.regY;
}
private int readWXW() {
int i = this.readMem(this.regPC);
this.incPC();
i |= this.readMem(this.regPC) << 8;
this.incPC();
i += this.regX;
int j = this.readMem(i);
return j | this.readMem(i + 1) << 8;
}
private int readBW() {
int i = this.readMem(this.regPC);
this.incPC();
int j = this.readMem(i);
return j | this.readMem(i + 1) << 8;
}
private int readWW() {
int i = this.readMem(this.regPC);
this.incPC();
i |= this.readMem(this.regPC) << 8;
this.incPC();
int j = this.readMem(i);
return j | this.readMem(i + 1) << 8;
}
private int readBXW() {
int i = this.readMem(this.regPC) + this.regX & 0xFF;
this.incPC();
int j = this.readMem(i);
return j | this.readMem(i + 1) << 8;
}
private int readBWY() {
int i = this.readMem(this.regPC);
this.incPC();
int j = this.readMem(i);
j |= this.readMem(i + 1) << 8;
return j + this.regY;
}
private void upNZ() {
this.flagN = (this.regA & this.negM()) > 0;
this.flagZ = this.regA == 0;
}
private void upNZ(int i) {
this.flagN = (i & this.negM()) > 0;
this.flagZ = i == 0;
}
private void upNZX(int i) {
this.flagN = (i & this.negX()) > 0;
this.flagZ = i == 0;
}
private void push1(int b) {
if (this.flagE) {
this.regSP = this.regSP - 1 & 0xFF | this.regSP & 0xFF00;
} else {
--this.regSP;
}
this.writeMem(this.regSP, b);
}
private void push1r(int b) {
--this.regR;
this.writeMem(this.regR, b);
}
private void push2(int w) {
this.push1(w >> 8);
this.push1(w & 0xFF);
}
private void push2r(int w) {
this.push1r(w >> 8);
this.push1r(w & 0xFF);
}
private void pushM(int b) {
if (this.flagM) {
this.push1(b);
} else {
this.push2(b);
}
}
private void pushX(int b) {
if (this.flagX) {
this.push1(b);
} else {
this.push2(b);
}
}
private void pushMr(int b) {
if (this.flagM) {
this.push1r(b);
} else {
this.push2r(b);
}
}
private void pushXr(int b) {
if (this.flagX) {
this.push1r(b);
} else {
this.push2r(b);
}
}
private int pop1() {
int tr = this.readMem(this.regSP);
if (this.flagE) {
this.regSP = this.regSP + 1 & 0xFF | this.regSP & 0xFF00;
} else {
++this.regSP;
}
return tr;
}
private int pop1r() {
int tr = this.readMem(this.regR);
++this.regR;
return tr;
}
private int pop2() {
int tr = this.pop1();
return tr | this.pop1() << 8;
}
private int pop2r() {
int tr = this.pop1r();
return tr | this.pop1r() << 8;
}
private int popM() {
return this.flagM ? this.pop1() : this.pop2();
}
private int popMr() {
return this.flagM ? this.pop1r() : this.pop2r();
}
private int popX() {
return this.flagX ? this.pop1() : this.pop2();
}
private int popXr() {
return this.flagX ? this.pop1r() : this.pop2r();
}
private int getFlags() {
return (this.flagC ? 1 : 0)
| (this.flagZ ? 2 : 0)
| (this.flagID ? 4 : 0)
| (this.flagD ? 8 : 0)
| (this.flagX ? 16 : 0)
| (this.flagM ? 32 : 0)
| (this.flagO ? 64 : 0)
| (this.flagN ? 128 : 0);
}
private void setFlags(int flags) {
this.flagC = (flags & 1) > 0;
this.flagZ = (flags & 2) > 0;
this.flagID = (flags & 4) > 0;
this.flagD = (flags & 8) > 0;
boolean m2 = (flags & 32) > 0;
this.flagO = (flags & 64) > 0;
this.flagN = (flags & 128) > 0;
if (this.flagE) {
this.flagX = false;
this.flagM = false;
} else {
this.flagX = (flags & 16) > 0;
if (this.flagX) {
this.regX &= 255;
this.regY &= 255;
}
if (m2 != this.flagM) {
if (m2) {
this.regB = this.regA >> 8;
this.regA &= 255;
} else {
this.regA |= this.regB << 8;
}
this.flagM = m2;
}
}
}
private void i_adc(int val) {
if (this.flagM) {
if (this.flagD) {
int v = (this.regA & 15) + (val & 15) + (this.flagC ? 1 : 0);
if (v > 9) {
v = (v + 6 & 15) + 16;
}
int v2 = (this.regA & 240) + (val & 240) + v;
if (v2 > 160) {
v2 += 96;
}
this.flagC = v2 > 100;
this.regA = v2 & 0xFF;
this.flagO = false;
} else {
int v = this.regA + val + (this.flagC ? 1 : 0);
this.flagC = v > 255;
this.flagO = ((v ^ this.regA) & (v ^ val) & 128) > 0;
this.regA = v & 0xFF;
}
} else {
int v = this.regA + val + (this.flagC ? 1 : 0);
this.flagC = v > 65535;
this.flagO = ((v ^ this.regA) & (v ^ val) & 32768) > 0;
this.regA = v;
}
this.upNZ();
}
private void i_sbc(int val) {
if (this.flagM) {
if (this.flagD) {
int v = (this.regA & 15) - (val & 15) + (this.flagC ? 1 : 0) - 1;
if (v < 0) {
v = (v - 6 & 15) - 16;
}
int v2 = (this.regA & 240) - (val & 240) + v;
if (v2 < 0) {
v2 -= 96;
}
this.flagC = v2 < 100;
this.regA = v2 & 0xFF;
this.flagO = false;
} else {
int v = this.regA - val + (this.flagC ? 1 : 0) - 1;
this.flagC = (v & 256) == 0;
this.flagO = ((v ^ this.regA) & (v ^ -val) & 128) > 0;
this.regA = v & 0xFF;
}
} else {
int v = this.regA - val + (this.flagC ? 1 : 0) - 1;
this.flagC = (v & 65536) == 0;
this.flagO = ((v ^ this.regA) & (v ^ -val) & 32768) > 0;
this.regA = v;
}
this.upNZ();
}
private void i_mul(int val) {
if (this.flagM) {
int v;
if (this.flagC) {
v = (byte)val * (byte)this.regA;
} else {
v = val * this.regA;
}
this.regA = v & 0xFF;
this.regD = v >> 8 & 0xFF;
this.flagN = v < 0;
this.flagZ = v == 0;
this.flagO = this.regD != 0 && this.regD != 255;
} else {
long v1;
if (this.flagC) {
v1 = (long)((short)val * (short)this.regA);
} else {
v1 = (long)(val * this.regA);
}
this.regA = (int)(v1 & 65535L);
this.regD = (int)(v1 >> 16 & 65535L);
this.flagN = v1 < 0L;
this.flagZ = v1 == 0L;
this.flagO = this.regD != 0 && this.regD != 65535;
}
}
private void i_div(int val) {
if (val == 0) {
this.regA = 0;
this.regD = 0;
this.flagO = true;
this.flagZ = false;
this.flagN = false;
} else if (this.flagM) {
int q;
if (this.flagC) {
q = (byte)this.regD << 8 | this.regA;
val = (byte)val;
} else {
q = this.regD << 8 | this.regA;
}
this.regD = q % val & 0xFF;
q /= val;
this.regA = q & 0xFF;
if (!this.flagC) {
this.flagO = q > 255;
} else {
this.flagO = q > 127 || q < -128;
}
this.flagZ = this.regA == 0;
this.flagN = q < 0;
} else if (this.flagC) {
int q = (short)this.regD << 16 | this.regA;
short val1 = (short)val;
this.regD = q % val1;
q /= val1;
this.regA = q;
this.flagO = q > 32767 || q < -32768;
this.flagZ = this.regA == 0;
this.flagN = q < 0;
} else {
long q1 = (long)(this.regD << 16 | this.regA);
this.regD = (int)(q1 % (long)val & 65535L);
q1 /= (long)val;
this.regA = (int)(q1 & 65535L);
this.flagO = q1 > 65535L;
this.flagZ = this.regA == 0;
this.flagN = q1 < 0L;
}
}
private void i_and(int val) {
this.regA &= val;
this.upNZ();
}
private void i_asl(int addr) {
int i = this.readM(addr);
this.flagC = (i & this.negM()) > 0;
i = i << 1 & this.maskM();
this.upNZ(i);
this.writeM(addr, i);
}
private void i_lsr(int addr) {
int i = this.readM(addr);
this.flagC = (i & 1) > 0;
i >>>= 1;
this.upNZ(i);
this.writeM(addr, i);
}
private void i_rol(int addr) {
int i = this.readM(addr);
int n = (i << 1 | (this.flagC ? 1 : 0)) & this.maskM();
this.flagC = (i & this.negM()) > 0;
this.upNZ(n);
this.writeM(addr, n);
}
private void i_ror(int addr) {
int i = this.readM(addr);
int n = i >>> 1 | (this.flagC ? this.negM() : 0);
this.flagC = (i & 1) > 0;
this.upNZ(n);
this.writeM(addr, n);
}
private void i_brc(boolean cond) {
int n = this.readB();
if (cond) {
this.regPC += (byte)n;
}
}
private void i_bit(int val) {
if (this.flagM) {
this.flagO = (val & 64) > 0;
this.flagN = (val & 128) > 0;
} else {
this.flagO = (val & 16384) > 0;
this.flagN = (val & 32768) > 0;
}
this.flagZ = (val & this.regA) > 0;
}
private void i_trb(int val) {
this.flagZ = (val & this.regA) > 0;
this.regA &= ~val;
}
private void i_tsb(int val) {
this.flagZ = (val & this.regA) > 0;
this.regA |= val;
}
private void i_cmp(int reg, int val) {
reg -= val;
this.flagC = reg >= 0;
this.flagZ = reg == 0;
this.flagN = (reg & this.negM()) > 0;
}
private void i_cmpx(int reg, int val) {
reg -= val;
this.flagC = reg >= 0;
this.flagZ = reg == 0;
this.flagN = (reg & this.negX()) > 0;
}
private void i_dec(int addr) {
int i = this.readM(addr);
i = i - 1 & this.maskM();
this.writeM(addr, i);
this.upNZ(i);
}
private void i_inc(int addr) {
int i = this.readM(addr);
i = i + 1 & this.maskM();
this.writeM(addr, i);
this.upNZ(i);
}
private void i_eor(int val) {
this.regA ^= val;
this.upNZ();
}
private void i_or(int val) {
this.regA |= val;
this.upNZ();
}
private void i_mmu(int mmu) {
switch(mmu) {
case 0:
int t = this.regA & 0xFF;
if (this.mmuRBA != t) {
if (this.rbCache != null) {
this.rbTimeout = true;
}
this.mmuRBA = t;
}
break;
case 1:
this.mmuRBB = this.regA;
break;
case 2:
this.mmuEnRB = true;
break;
case 3:
this.mmuRBW = this.regA;
break;
case 4:
this.mmuEnRBW = true;
break;
case 5:
this.addrBRK = this.regA;
break;
case 6:
this.addrPOR = this.regA;
break;
case 128:
this.regA = this.mmuRBA;
break;
case 129:
this.regA = this.mmuRBB;
if (this.flagM) {
this.regB = this.regA >> 8;
this.regA &= 255;
}
break;
case 130:
this.mmuEnRB = false;
break;
case 131:
this.regA = this.mmuRBW;
if (this.flagM) {
this.regB = this.regA >> 8;
this.regA &= 255;
}
break;
case 132:
this.mmuEnRBW = false;
break;
case 133:
this.regA = this.addrBRK;
if (this.flagM) {
this.regB = this.regA >> 8;
this.regA &= 255;
}
break;
case 134:
this.regA = this.addrPOR;
if (this.flagM) {
this.regB = this.regA >> 8;
this.regA &= 255;
}
break;
case 135:
this.regA = this.rtcTicks;
this.regD = this.rtcTicks >> 16;
}
}
public void executeInsn() {
int insn = this.readMem(this.regPC);
this.incPC();
switch(insn) {
case 0:
this.push2(this.regPC);
this.push1(this.getFlags());
this.flagBRK = true;
this.regPC = this.addrBRK;
break;
case 1:
this.i_or(this.readM(this.readBXW()));
break;
case 2:
this.regPC = this.readW(this.regI);
this.regI += 2;
break;
case 3:
this.i_or(this.readM(this.readBS()));
break;
case 4:
this.i_tsb(this.readM(this.readB()));
break;
case 5:
this.i_or(this.readM(this.readB()));
break;
case 6:
this.i_asl(this.readB());
break;
case 7:
this.i_or(this.readM(this.readBR()));
break;
case 8:
this.push1(this.getFlags());
break;
case 9:
this.i_or(this.readM());
break;
case 10:
this.flagC = (this.regA & this.negM()) > 0;
this.regA = this.regA << 1 & this.maskM();
this.upNZ();
break;
case 11:
this.push2r(this.regI);
break;
case 12:
this.i_tsb(this.readM(this.readW()));
break;
case 13:
this.i_or(this.readM(this.readW()));
break;
case 14:
this.i_asl(this.readW());
break;
case 15:
this.i_mul(this.readM(this.readB()));
break;
case 16:
this.i_brc(!this.flagN);
break;
case 17:
this.i_or(this.readM(this.readBWY()));
break;
case 18:
this.i_or(this.readM(this.readBW()));
break;
case 19:
this.i_or(this.readM(this.readBSWY()));
break;
case 20:
this.i_trb(this.readM(this.readB()));
break;
case 21:
this.i_or(this.readM(this.readBX()));
break;
case 22:
this.i_asl(this.readBX());
break;
case 23:
this.i_or(this.readM(this.readBRWY()));
break;
case 24:
this.flagC = false;
break;
case 25:
this.i_or(this.readM(this.readWY()));
break;
case 26:
this.regA = this.regA + 1 & this.maskM();
this.upNZ(this.regA);
break;
case 27:
this.pushXr(this.regX);
break;
case 28:
this.i_trb(this.readM(this.readW()));
break;
case 29:
this.i_or(this.readM(this.readWX()));
break;
case 30:
this.i_asl(this.readWX());
break;
case 31:
this.i_mul(this.readM(this.readBX()));
break;
case 32:
this.push2(this.regPC + 1);
this.regPC = this.readW();
break;
case 33:
this.i_and(this.readM(this.readBXW()));
break;
case 34:
this.push2r(this.regI);
this.regI = this.regPC + 2;
this.regPC = this.readW(this.regPC);
break;
case 35:
this.i_and(this.readM(this.readBS()));
break;
case 36:
this.i_bit(this.readM(this.readB()));
break;
case 37:
this.i_and(this.readM(this.readB()));
break;
case 38:
this.i_rol(this.readB());
break;
case 39:
this.i_and(this.readM(this.readBR()));
break;
case 40:
this.setFlags(this.pop1());
break;
case 41:
this.i_and(this.readM());
break;
case 42: {
int n = (this.regA << 1 | (this.flagC ? 1 : 0)) & this.maskM();
this.flagC = (this.regA & this.negM()) > 0;
this.regA = n;
this.upNZ();
break;
}
case 43:
this.regI = this.pop2r();
this.upNZX(this.regI);
break;
case 44:
this.i_bit(this.readM(this.readW()));
break;
case 45:
this.i_and(this.readM(this.readW()));
break;
case 46:
this.i_rol(this.readW());
break;
case 47:
this.i_mul(this.readM(this.readW()));
break;
case 48:
this.i_brc(this.flagN);
break;
case 49:
this.i_and(this.readM(this.readBWY()));
break;
case 50:
this.i_and(this.readM(this.readBW()));
break;
case 51:
this.i_and(this.readM(this.readBSWY()));
break;
case 52:
this.i_bit(this.readM(this.readBX()));
break;
case 53:
this.i_and(this.readM(this.readBX()));
break;
case 54:
this.i_rol(this.readBX());
break;
case 55:
this.i_and(this.readM(this.readBRWY()));
break;
case 56:
this.flagC = true;
break;
case 57:
this.i_and(this.readM(this.readWY()));
break;
case 58:
this.regA = this.regA - 1 & this.maskM();
this.upNZ(this.regA);
break;
case 59:
this.regX = this.popXr();
this.upNZX(this.regX);
break;
case 60:
this.i_bit(this.readM(this.readWX()));
break;
case 61:
this.i_and(this.readM(this.readWX()));
break;
case 62:
this.i_rol(this.readWX());
break;
case 63:
this.i_mul(this.readM(this.readWX()));
break;
case 64:
this.setFlags(this.pop1());
this.regPC = this.pop2();
break;
case 65:
this.i_eor(this.readM(this.readBXW()));
break;
case 66:
if (this.flagM) {
this.regA = this.readMem(this.regI);
++this.regI;
} else {
this.regA = this.readW(this.regI);
this.regI += 2;
}
break;
case 67:
this.i_eor(this.readM(this.readBS()));
break;
case 68:
this.push2r(this.readW());
break;
case 69:
this.i_eor(this.readM(this.readB()));
break;
case 70:
this.i_lsr(this.readB());
break;
case 71:
this.i_eor(this.readM(this.readBR()));
break;
case 72:
this.pushM(this.regA);
break;
case 73:
this.i_eor(this.readM());
break;
case 74:
this.flagC = (this.regA & 1) > 0;
this.regA >>>= 1;
this.upNZ();
break;
case 75:
this.pushMr(this.regA);
break;
case 76:
this.regPC = this.readW();
break;
case 77:
this.i_eor(this.readM(this.readW()));
break;
case 78:
this.i_lsr(this.readW());
break;
case 79:
this.i_div(this.readM(this.readB()));
break;
case 80:
this.i_brc(!this.flagO);
break;
case 81:
this.i_eor(this.readM(this.readBWY()));
break;
case 82:
this.i_eor(this.readM(this.readBW()));
break;
case 83:
this.i_eor(this.readM(this.readBSWY()));
break;
case 84:
this.push2r(this.readBW());
break;
case 85:
this.i_eor(this.readM(this.readBX()));
break;
case 86:
this.i_lsr(this.readBX());
break;
case 87:
this.i_eor(this.readM(this.readBRWY()));
break;
case 88:
this.flagID = false;
break;
case 89:
this.i_eor(this.readM(this.readWY()));
break;
case 90:
this.pushX(this.regY);
break;
case 91:
this.pushXr(this.regY);
break;
case 92:
this.regI = this.regX;
this.upNZX(this.regX);
break;
case 93:
this.i_eor(this.readM(this.readWX()));
break;
case 94:
this.i_lsr(this.readWX());
break;
case 95:
this.i_div(this.readM(this.readBX()));
break;
case 96:
this.regPC = this.pop2() + 1;
break;
case 97:
this.i_adc(this.readM(this.readBXW()));
break;
case 98: {
int n = this.readB();
this.push2(this.regPC + n);
break;
}
case 99:
this.i_adc(this.readM(this.readBS()));
break;
case 100:
this.writeM(this.readB(), 0);
break;
case 101:
this.i_adc(this.readM(this.readB()));
break;
case 102:
this.i_ror(this.readB());
break;
case 103:
this.i_adc(this.readM(this.readBR()));
break;
case 104:
this.regA = this.popM();
this.upNZ();
break;
case 105:
this.i_adc(this.readM());
break;
case 106: {
int n = this.regA >>> 1 | (this.flagC ? this.negM() : 0);
this.flagC = (this.regA & 1) > 0;
this.regA = n;
this.upNZ();
break;
}
case 107:
this.regA = this.popMr();
this.upNZ(this.regA);
break;
case 108:
this.regPC = this.readWW();
break;
case 109:
this.i_adc(this.readM(this.readW()));
break;
case 110:
this.i_ror(this.readW());
break;
case 111:
this.i_div(this.readM(this.readW()));
break;
case 112:
this.i_brc(this.flagO);
break;
case 113:
this.i_adc(this.readM(this.readBWY()));
break;
case 114:
this.i_adc(this.readM(this.readBW()));
break;
case 115:
this.i_adc(this.readM(this.readBSWY()));
break;
case 116:
this.writeM(this.readBX(), 0);
break;
case 117:
this.i_adc(this.readM(this.readBX()));
break;
case 118:
this.i_ror(this.readBX());
break;
case 119:
this.i_adc(this.readM(this.readBRWY()));
break;
case 120:
this.flagID = true;
break;
case 121:
this.i_adc(this.readM(this.readWY()));
break;
case 122:
this.regY = this.popX();
this.upNZX(this.regY);
break;
case 123:
this.regY = this.popXr();
this.upNZX(this.regY);
break;
case 124:
this.regPC = this.readWXW();
break;
case 125:
this.i_adc(this.readM(this.readWX()));
break;
case 126:
this.i_ror(this.readWX());
break;
case 127:
this.i_div(this.readM(this.readWX()));
break;
case 128:
this.i_brc(true);
break;
case 129:
this.writeM(this.readBXW(), this.regA);
break;
case 130: {
int n = this.readB();
this.push2r(this.regPC + n);
break;
}
case 131:
this.writeM(this.readBS(), this.regA);
break;
case 132:
this.writeX(this.readB(), this.regY);
break;
case 133:
this.writeM(this.readB(), this.regA);
break;
case 134:
this.writeX(this.readB(), this.regX);
break;
case 135:
this.writeM(this.readBR(), this.regA);
break;
case 136:
this.regY = this.regY - 1 & this.maskX();
this.upNZ(this.regY);
break;
case 137:
this.flagZ = (this.readM() & this.regA) == 0;
break;
case 138:
this.regA = this.regX;
if (this.flagM) {
this.regA &= 255;
}
this.upNZ();
break;
case 139:
if (this.flagX) {
this.regSP = this.regR & 0xFF00 | this.regX & 0xFF;
} else {
this.regR = this.regX;
}
this.upNZX(this.regR);
break;
case 140:
this.writeX(this.readW(), this.regY);
break;
case 141:
this.writeM(this.readW(), this.regA);
break;
case 142:
this.writeX(this.readW(), this.regX);
break;
case 143:
this.regD = 0;
this.regB = 0;
break;
case 144:
this.i_brc(!this.flagC);
break;
case 145:
this.writeM(this.readBWY(), this.regA);
break;
case 146:
this.writeM(this.readBW(), this.regA);
break;
case 147:
this.writeM(this.readBSWY(), this.regA);
break;
case 148:
this.writeX(this.readBX(), this.regY);
break;
case 149:
this.writeM(this.readBX(), this.regA);
break;
case 150:
this.writeX(this.readBY(), this.regX);
break;
case 151:
this.writeM(this.readBRWY(), this.regA);
break;
case 152:
this.regA = this.regY;
if (this.flagM) {
this.regA &= 255;
}
this.upNZX(this.regY);
break;
case 153:
this.writeM(this.readWY(), this.regA);
break;
case 154:
if (this.flagX) {
this.regSP = this.regSP & 0xFF00 | this.regX & 0xFF;
} else {
this.regSP = this.regX;
}
this.upNZX(this.regX);
break;
case 155:
this.regY = this.regX;
this.upNZX(this.regY);
break;
case 156:
this.writeM(this.readW(), 0);
break;
case 157:
this.writeM(this.readWX(), this.regA);
break;
case 158:
this.writeM(this.readWX(), 0);
break;
case 159:
this.regD = (this.regA & this.negM()) > 0 ? '\uffff' : 0;
this.regB = this.regD & 0xFF;
break;
case 160:
this.regY = this.readX();
this.upNZ(this.regY);
break;
case 161:
this.regA = this.readM(this.readBXW());
this.upNZ();
break;
case 162:
this.regX = this.readX();
this.upNZ(this.regX);
break;
case 163:
this.regA = this.readM(this.readBS());
this.upNZ();
break;
case 164:
this.regY = this.readX(this.readB());
this.upNZ(this.regY);
break;
case 165:
this.regA = this.readM(this.readB());
this.upNZ();
break;
case 166:
this.regX = this.readX(this.readB());
this.upNZ(this.regX);
break;
case 167:
this.regA = this.readM(this.readBR());
this.upNZ();
break;
case 168:
this.regY = this.regA;
if (this.flagX) {
this.regY &= 255;
}
this.upNZX(this.regY);
break;
case 169:
this.regA = this.readM();
this.upNZ();
break;
case 170:
this.regX = this.regA;
if (this.flagX) {
this.regX &= 255;
}
this.upNZX(this.regX);
break;
case 171:
this.regX = this.regR;
if (this.flagX) {
this.regX &= 255;
}
this.upNZX(this.regX);
break;
case 172:
this.regY = this.readX(this.readW());
this.upNZ(this.regY);
break;
case 173:
this.regA = this.readM(this.readW());
this.upNZ();
break;
case 174:
this.regX = this.readX(this.readW());
this.upNZ(this.regX);
break;
case 175:
this.regA = this.regD;
if (this.flagM) {
this.regA &= 255;
}
this.upNZ(this.regA);
break;
case 176:
this.i_brc(this.flagC);
break;
case 177:
this.regA = this.readM(this.readBWY());
this.upNZ();
break;
case 178:
this.regA = this.readM(this.readBW());
this.upNZ();
break;
case 179:
this.regA = this.readM(this.readBSWY());
this.upNZ();
break;
case 180:
this.regY = this.readX(this.readBX());
this.upNZ(this.regY);
break;
case 181:
this.regA = this.readM(this.readBX());
this.upNZ();
break;
case 182:
this.regX = this.readX(this.readBY());
this.upNZ(this.regX);
break;
case 183:
this.regA = this.readM(this.readBRWY());
this.upNZ();
break;
case 184:
this.flagO = false;
break;
case 185:
this.regA = this.readM(this.readWY());
this.upNZ();
break;
case 186:
this.regX = this.regSP;
if (this.flagX) {
this.regX &= 255;
}
this.upNZX(this.regX);
break;
case 187:
this.regX = this.regY;
this.upNZX(this.regX);
break;
case 188:
this.regY = this.readX(this.readWX());
this.upNZ(this.regY);
break;
case 189:
this.regA = this.readM(this.readWX());
this.upNZ();
break;
case 190:
this.regX = this.readX(this.readWY());
this.upNZ(this.regX);
break;
case 191:
if (this.flagM) {
this.regD = this.regA | this.regB << 8;
} else {
this.regD = this.regA;
}
this.upNZ(this.regA);
break;
case 192:
this.i_cmpx(this.regY, this.readX());
break;
case 193:
this.i_cmp(this.regA, this.readM(this.readBXW()));
break;
case 194:
this.setFlags(this.getFlags() & ~this.readB());
break;
case 195:
this.i_cmp(this.regA, this.readM(this.readBS()));
break;
case 196:
this.i_cmpx(this.regY, this.readX(this.readB()));
break;
case 197:
this.i_cmp(this.regA, this.readM(this.readB()));
break;
case 198:
this.i_dec(this.readB());
break;
case 199:
this.i_cmp(this.regA, this.readM(this.readBR()));
break;
case 200:
this.regY = this.regY + 1 & this.maskX();
this.upNZ(this.regY);
break;
case 201:
this.i_cmp(this.regA, this.readM());
break;
case 202:
this.regX = this.regX - 1 & this.maskX();
this.upNZ(this.regX);
break;
case 203:
this.waiTimeout = true;
break;
case 204:
this.i_cmpx(this.regY, this.readX(this.readW()));
break;
case 205:
this.i_cmp(this.regA, this.readM(this.readW()));
break;
case 206:
this.i_dec(this.readW());
break;
case 207:
this.regD = this.popM();
break;
case 208:
this.i_brc(!this.flagZ);
break;
case 209:
this.i_cmp(this.regA, this.readM(this.readBWY()));
break;
case 210:
this.i_cmp(this.regA, this.readM(this.readBW()));
break;
case 211:
this.i_cmp(this.regA, this.readM(this.readBSWY()));
break;
case 212:
this.push2(this.readBW());
break;
case 213:
this.i_cmp(this.regA, this.readM(this.readBX()));
break;
case 214:
this.i_dec(this.readBX());
break;
case 215:
this.i_cmp(this.regA, this.readM(this.readBRWY()));
break;
case 216:
this.flagD = false;
break;
case 217:
this.i_cmp(this.regA, this.readM(this.readWY()));
break;
case 218:
this.pushX(this.regX);
break;
case 219:
this.sliceCycles = -1;
if (super.worldObj.isAirBlock(super.xCoord, super.yCoord + 1, super.zCoord)) {
super.worldObj
.playSoundEffect(
(double)super.xCoord + 0.5,
(double)super.yCoord + 0.5,
(double)super.zCoord + 0.5,
"fire.ignite",
1.0F,
super.worldObj.rand.nextFloat() * 0.4F + 0.8F
);
super.worldObj.setBlock(super.xCoord, super.yCoord + 1, super.zCoord, Blocks.fire, 0, 3);
}
break;
case 220:
this.regX = this.regI;
if (this.flagX) {
this.regX &= 255;
}
this.upNZX(this.regX);
break;
case 221:
this.i_cmp(this.regA, this.readM(this.readWX()));
break;
case 222:
this.i_dec(this.readWX());
break;
case 223:
this.pushM(this.regD);
break;
case 224:
this.i_cmpx(this.regX, this.readX());
break;
case 225:
this.i_sbc(this.readM(this.readBXW()));
break;
case 226:
this.setFlags(this.getFlags() | this.readB());
break;
case 227:
this.i_sbc(this.readM(this.readBS()));
break;
case 228:
this.i_cmpx(this.regX, this.readX(this.readB()));
break;
case 229:
this.i_sbc(this.readM(this.readB()));
break;
case 230:
this.i_inc(this.readB());
break;
case 231:
this.i_sbc(this.readM(this.readBR()));
break;
case 232:
this.regX = this.regX + 1 & this.maskX();
this.upNZ(this.regX);
break;
case 233:
this.i_sbc(this.readM());
case 234:
default:
break;
case 235:
if (this.flagM) {
int nx = this.regA;
this.regA = this.regB;
this.regB = nx;
} else {
this.regA = this.regA >> 8 & 0xFF | this.regA << 8 & 0xFF00;
}
break;
case 236:
this.i_cmpx(this.regX, this.readX(this.readW()));
break;
case 237:
this.i_sbc(this.readM(this.readW()));
break;
case 238:
this.i_inc(this.readW());
break;
case 239:
this.i_mmu(this.readB());
break;
case 240:
this.i_brc(this.flagZ);
break;
case 241:
this.i_sbc(this.readM(this.readBWY()));
break;
case 242:
this.i_sbc(this.readM(this.readBW()));
break;
case 243:
this.i_sbc(this.readM(this.readBSWY()));
break;
case 244:
this.push2(this.readW());
break;
case 245:
this.i_sbc(this.readM(this.readBX()));
break;
case 246:
this.i_inc(this.readBX());
break;
case 247:
this.i_sbc(this.readM(this.readBRWY()));
break;
case 248:
this.flagD = true;
break;
case 249:
this.i_sbc(this.readM(this.readWY()));
break;
case 250:
this.regX = this.popX();
this.upNZX(this.regX);
break;
case 251:
if (this.flagE != this.flagC) {
if (this.flagE) {
this.flagE = false;
this.flagC = true;
} else {
this.flagE = true;
this.flagC = false;
if (!this.flagM) {
this.regB = this.regA >> 8;
}
this.flagM = true;
this.flagX = true;
this.regA &= 255;
this.regX &= 255;
this.regY &= 255;
}
}
break;
case 252:
this.push2(this.regPC + 1);
this.regPC = this.readWXW();
break;
case 253:
this.i_sbc(this.readM(this.readWX()));
break;
case 254:
this.i_inc(this.readWX());
}
}
@Override
public void writeFramePacket(NBTTagCompound tag) {
this.writeToPacket(tag);
}
@Override
public void readFramePacket(NBTTagCompound tag) {
this.readFromPacket(tag);
}
@Override
public void onFrameRefresh(IBlockAccess iba) {
}
@Override
public void onFramePickup(IBlockAccess iba) {
}
@Override
public void onFrameDrop() {
}
@Override
public void readFromNBT(NBTTagCompound data) {
super.readFromNBT(data);
this.memory = data.getByteArray("ram");
if (this.memory.length != 8192) {
this.memory = new byte[8192];
}
this.Rotation = data.getByte("rot");
this.addrPOR = data.getShort("por");
this.addrBRK = data.getShort("brk");
byte efl = data.getByte("efl");
this.flagE = (efl & 1) > 0;
this.mmuEnRB = (efl & 2) > 0;
this.mmuEnRBW = (efl & 4) > 0;
this.setFlags(data.getByte("fl"));
this.regSP = data.getShort("rsp");
this.regPC = data.getShort("rpc");
this.regA = data.getShort("ra");
if (this.flagM) {
this.regB = this.regA >> 8;
this.regA &= 255;
}
this.regX = data.getShort("rx");
this.regY = data.getShort("ry");
this.regD = data.getShort("rd");
this.regR = data.getShort("rr");
this.regI = data.getShort("ri");
this.mmuRBB = data.getShort("mmrb");
this.mmuRBW = data.getShort("mmrbw");
this.mmuRBA = data.getByte("mmra") & 255;
this.sliceCycles = data.getInteger("cyc");
this.rtcTicks = data.getInteger("rtct");
this.diskAddr = data.getByte("diskaddr") & 255;
this.displayAddr = data.getByte("displayaddr") & 255;
this.rbaddr = data.getByte("rbaddr") & 255;
}
@Override
public void writeToNBT(NBTTagCompound data) {
super.writeToNBT(data);
data.setByte("rot", (byte)this.Rotation);
data.setByteArray("ram", this.memory);
data.setShort("por", (short)this.addrPOR);
data.setShort("brk", (short)this.addrBRK);
int efl = (this.flagE ? 1 : 0) | (this.mmuEnRB ? 2 : 0) | (this.mmuEnRBW ? 4 : 0);
data.setByte("efl", (byte)efl);
data.setByte("fl", (byte)this.getFlags());
data.setShort("rsp", (short)this.regSP);
data.setShort("rpc", (short)this.regPC);
if (this.flagM) {
this.regA = this.regA & 0xFF | this.regB << 8;
}
data.setShort("ra", (short)this.regA);
if (this.flagM) {
this.regA &= 255;
}
data.setShort("rx", (short)this.regX);
data.setShort("ry", (short)this.regY);
data.setShort("rd", (short)this.regD);
data.setShort("rr", (short)this.regR);
data.setShort("ri", (short)this.regI);
data.setShort("mmrb", (short)this.mmuRBB);
data.setShort("mmrbw", (short)this.mmuRBW);
data.setByte("mmra", (byte)this.mmuRBA);
data.setInteger("cyc", this.sliceCycles);
data.setInteger("rtct", this.rtcTicks);
data.setByte("diskaddr", (byte)this.diskAddr);
data.setByte("displayaddr", (byte)this.displayAddr);
data.setByte("rbaddr", (byte)this.rbaddr);
}
@Override
protected void readFromPacket(NBTTagCompound tag) {
this.Rotation = tag.getInteger("rot");
}
@Override
protected void writeToPacket(NBTTagCompound tag) {
tag.setInteger("rot", this.Rotation);
}
}