package org.jpc.emulator.peripheral;
public class Ptr {
public byte[] p;
public int off;
protected int start;
public int size;
public Ptr() {
this.p = null;
this.off = 0;
this.start = 0;
this.size = 0;
}
public Ptr(int size) {
this.p = new byte[size];
this.off = 0;
this.start = 0;
this.size = size;
}
public Ptr(byte[] p, int off) {
this.p = p;
this.off = off;
this.start = off;
this.size = p.length;
}
public Ptr(Ptr p, int off, int size) {
this.p = p.p;
this.off = off+p.off;
this.start = off+p.off;
this.size = size;
}
public Ptr(Ptr p, int off) {
this.p = p.p;
this.off = p.off+off;
this.start = this.off;
this.size = p.size;
}
public Ptr(Ptr p) {
this.p = p.p;
this.off = p.off;
this.start = p.off;
this.size = p.size;
}
public int dataWidth() {
return 1;
}
public int get() {
return get(0);
}
public void set(int value) {
set(0, value);
}
public void inc() {
inc(1);
}
public int off() {
return off;
}
public void inc(int size) {
off+=size*dataWidth();
}
public int size() {
return p.length - start;
}
public int used() {
return off - start;
}
static public void memcpy(Ptr dest, Ptr source, int len) {
System.arraycopy(source.p, source.off, dest.p, dest.off, len);
}
static public void memcpy(Ptr dest, byte[] source, int len) {
System.arraycopy(source, 0, dest.p, dest.off, len);
}
static public void memcpy(byte[] dest, byte[] source, int len) {
System.arraycopy(source, 0, dest, 0, len);
}
static public int memcmp(Ptr b1, byte[] b2, int len) {
for (int i=0;i<len;i++) {
if (b1.p[i+b1.off]>b2[i])
return 1;
if (b1.p[i+b1.off]<b2[i])
return -1;
}
return 0;
}
public void clear(int len) {
java.util.Arrays.fill(p, off, off+len*dataWidth(), (byte)0);
}
public void clear() {
java.util.Arrays.fill(p, off, p.length, (byte)0);
}
public void or(int off, int mask) {
p[this.off+off*dataWidth()]|=mask;
}
public int get(int off) {
return readb(off);
}
public void set(int off, int val) {
p[this.off+off] = (byte)(val & 0xFF);
}
public void setPlus(int value) {
set(get()+value);
}
public void setPlus(int offset, int value) {
set(offset, get(offset)+value);
}
public void setInc(int val) {
set(0, val);
off+=dataWidth();
}
public long getInc() {
int result = get();
this.off+=dataWidth();
return result;
}
public void writeb(/*HostPt*/int off,/*Bit8u*/ short val) {
p[off*dataWidth()+this.off]=(byte)(val);
}
public void writew(/*HostPt*/int off,/*Bit16u*/int val) {
off=off*dataWidth()+this.off;
p[off]=(byte)(val);
p[off+1]=(byte)((val >> 8));
}
public void writed(/*HostPt*/int off,/*Bit32u*/long val) {
off=off*dataWidth()+this.off;
p[off]=(byte)(val);
p[off+1]=(byte)((val >> 8));
p[off+2]=(byte)((val >> 16));
p[off+3]=(byte)((val >> 24));
}
public /*Bit8u*/short readb(/*HostPt*/int off) {
return (short)(p[off*dataWidth()+this.off] & 0xFF);
}
public /*Bit16u*/int readw(/*HostPt*/int off) {
off=off*dataWidth()+this.off;
return (p[off] & 0xFF) | ((p[off+1] & 0xFF) << 8);
}
public /*Bit32u*/int readd(/*HostPt*/int off) {
off=off*dataWidth()+this.off;
return (p[off] & 0xFF) | ((p[off+1] & 0xFF) << 8) | ((p[off+2] & 0xFF) << 16) | ((p[off+3] & 0xFF) << 24);
}
public void read(byte[] b) {
System.arraycopy(p, off, b, 0, b.length);
}
public void read(byte[] b, int len) {
System.arraycopy(p, off, b, 0, len);
}
public /*Bitu*/int read(int size, /*HostPt*/int o ) {
int off = (int)o;
if ( size == 1)
return readb(off);
else if ( size == 2)
return readw(off);
else if ( size == 4)
return (int)readd(off);
return 0;
}
public void write(int size, /*HostPt*/int o, /*Bitu*/int val) {
int off = (int)o;
if ( size == 1)
writeb(off, (short)val );
else if ( size == 2)
writew(off, val );
else if ( size == 4)
writed(off, val );
}
}