public Sector south() { return row==0 ? null : new Sector(col, row-4); }
public Sector east() { return col+4>=getWidth() ? null : new Sector(col+4, row); }
public Sector west() { return col==0 ? null : new Sector(col-4, row); }
- public Cell cell() { return Fpslic.this.cell(col, row); }
+ public Cell cell() { return Fpslic.this.cell(col, row); }
}
public final class SectorWire {
return (connect & 0x2)!=0;
}
public SectorWire driverRight() {
- System.out.println("checking " + Integer.toString(code(true), 16) + " " + Integer.toString(_row(), 16) + " " + Integer.toString(_col(), 16));
+ //System.out.println("checking " + Integer.toString(code(true), 16) + " " +
+ //Integer.toString(_row(), 16) + " " + Integer.toString(_col(), 16));
int ret = mode4(z(code(true)), _row(), _col());
ret = (ret >> (global?3:0)) & 0x7;
switch(ret) {
default: throw new Error("multiple drivers on " + this + "!");
}
}
+
+ public boolean touches(Cell c) {
+ return
+ horizontal
+ ? (c.row==_row() && (_col()/4 == c.col/4))
+ : (c.col==_col() && (_row()/4 == c.row/4));
+ }
}
/*
public final class SwitchBox {
public boolean yo() { return (mode4(1, row, col) & 0x02) != 0; }
public void xo(boolean center) { mode4(1, row, col, 0, center); }
public void yo(boolean center) { mode4(1, row, col, 1, center); }
+
+ public void xo(Cell c) {
+ if (c.row==row || c.col==col) { // use the y-input
+ xlut(LUT_OTHER);
+ yi(c);
+ } else {
+ xlut(LUT_SELF);
+ xi(c);
+ }
+ xo(false);
+ }
+
+ public void yo(Cell c) {
+ if (!(c.row==row || c.col==col)) { // use the x-input
+ ylut(LUT_OTHER);
+ xi(c);
+ } else {
+ ylut(LUT_SELF);
+ yi(c);
+ }
+ yo(false);
+ }
+
public boolean b() { return (mode4(1, row, col) & (1 << 3)) == 0; }
public boolean f() { return (mode4(1, row, col) & (1 << 2)) == 0; }
public boolean x() { return (mode4(1, row, col) & (1 << 1)) != 0; }
}
}
+ public void xi(SectorWire sw) {
+ if (!sw.touches(this)) throw new RuntimeException("invalid argument");
+ xi(sw.plane);
+ }
+
+ public void xi(Cell c) {
+ if (c.row==row-1 && c.col==col-1) xi(SW);
+ else if (c.row==row+1 && c.col==col-1) xi(NW);
+ else if (c.row==row-1 && c.col==col+1) xi(SE);
+ else if (c.row==row+1 && c.col==col+1) xi(NE);
+ else throw new RuntimeException("invalid argument");
+ }
+
public int yi() {
if ((mode4(0x02, row, col) & (1<<6))!=0) return L4;
switch(mode4(0x04, row, col) & 0xff) {
}
}
+ public void yi(SectorWire sw) {
+ if (!sw.touches(this)) throw new RuntimeException("invalid argument");
+ yi(sw.plane);
+ }
+
+ public void yi(Cell c) {
+ if (c.row==row-1 && c.col==col) yi(SOUTH);
+ else if (c.row==row+1 && c.col==col) yi(NORTH);
+ else if (c.row==row && c.col==col-1) yi(WEST);
+ else if (c.row==row && c.col==col+1) yi(EAST);
+ else throw new RuntimeException("invalid argument");
+ }
+
+ public void wi(SectorWire sw) {
+ if (!sw.touches(this)) throw new RuntimeException("invalid argument");
+ wi(sw.plane);
+ }
+
public void wi(int source) {
switch(source) {
case L4: mode4(0x03, row, col, 1<<5, 0xEC); break;
}
+ public void zi(SectorWire sw) {
+ if (!sw.touches(this)) throw new RuntimeException("invalid argument");
+ zi(sw.plane);
+ }
+
public void zi(int source) {
switch(source) {
case L4: mode4(0x02, row, col, 1<<7, 0xDB); break;
byte b = in.readByte();
ByteCallback bc = (ByteCallback)callbacks.remove(0);
bc.call(b);
+ synchronized(lock) {
+ lock.notifyAll();
+ }
} catch (Exception e) {
e.printStackTrace();
}
private Vector callbacks = new Vector();
+ private Object lock = new Object();
+ private static final int limit = 40;
+
+ private void enqueue(ByteCallback bcb) {
+ synchronized(lock) {
+ try {
+ while (callbacks.size() >= limit) {
+ System.out.println("block");
+ lock.wait(100);
+ System.out.println("unblock => " + callbacks.size());
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ callbacks.add(bcb);
+ }
+
public static abstract class ByteCallback {
public int result;
public abstract void call(byte b) throws Exception;
}
};
synchronized(bc) {
- callbacks.add(bc);
+ enqueue(bc);
out.writeByte(3);
out.flush();
bc.wait();
}
public synchronized void readBus(ByteCallback bc) throws IOException {
- callbacks.add(bc);
+ enqueue(bc);
out.writeByte(2);
out.flush();
}
public synchronized void readInterrupts(ByteCallback bc) throws IOException {
- callbacks.add(bc);
+ enqueue(bc);
out.writeByte(3);
out.flush();
}
this.drone = drone;
for(int i=0; i<ca.length; i++)
ca[i] = new Cell[128];
- for(int x=7; x<17; x++)
- for(int y=7; y<17; y++)
- new Cell(x-7,y-7, at40k.cell(x, y));
+ for(int x=9; x<14; x++)
+ for(int y=19; y<at40k.getHeight(); y++)
+ new Cell(x,y, at40k.cell(x, y));
+
+
+ new Thread() {
+ public void run() {
+ while(true) scan();
+ }
+ }.start();
- scan();
/*
Fpslic.Cell c = at40k.cell(0,0);
for(int i=0; i<256; i++) {
public class Cell {
Fpslic.Cell cell;
boolean in = false;
+ public boolean scanme = false;
public boolean xon = false;
public boolean yon = false;
public boolean xknown = false;
cells.add(this);
}
public void clear() {
- gg.color(in ? selectedcell : nonselectedcell);
+ gg.color(in ? selectedcell : (scanme ? new Color(0xbb, 0xbb, 0xbb) : nonselectedcell));
g.fillRect(0, 0, SIZE, SIZE);
}
public void draw() {
}
public void scan() {
- System.out.println("scan");
- for(int x=2; x<6; x++)
- for(int y=2; y<6; y++)
+ for(int x=0; x<at40k.getWidth(); x++)
+ for(int y=0; y<at40k.getHeight(); y++)
if (ca[x][y] != null)
- scan(ca[x][y]);
+ if (ca[x][y].scanme)
+ scan(ca[x][y]);
}
public void scan(final Gui.Cell c) {
try {
public BCB(Gui.Cell c, int who) {
this.who = who; this.c = c;
made++;
- System.out.println("made="+made);
}
public void call(byte b) throws Exception {
- System.out.println("callback: " + b);
boolean on = (b & 0x80) != 0;
c.xknown = false;
c.yknown = false;
break;
}
made--;
- System.out.println("made="+made);
- if (made==0) scan();
}
}