diff --git a/xtrn/chess/board.js b/xtrn/chess/board.js
index 31ccb9ea8b83a64053c48bfb5b129f50782c82fa..84a2aa2d6868372eeefacbd31afb18db2c3e91cc 100644
--- a/xtrn/chess/board.js
+++ b/xtrn/chess/board.js
@@ -123,3 +123,77 @@ Board.prototype.check=function(colour)
 Board.prototype.reason=function(str)
 {
 }
+Board.prototype.stateString= function()
+{
+	var ret='';
+	var x,y,p,p2,cx;
+
+	ret += this.moves.length%2;
+	for(y=1; y<=8; y++) {
+		for(x=1; x<=8; x++) {
+			p=this.getPiece({x:x,y:y});
+			if(p==null)
+				ret += '*';
+			else {
+				if(p.colour==COLOUR.white)
+					ret += 'W';
+				else
+					ret += 'B';
+				switch(p.constructor.name) {
+					case 'Pawn':
+						/*
+						 * If this pawn can be captured en passant,
+						 * capitalize it
+						 */
+						if(p.double_move_num==this.moves.length-1) {
+							p2=this.getPiece({x:x-1,y:y});
+							if(p2 != null && p2.constructor.name=='Pawn' && p2.colour != p.colour) {
+								ret += 'P';
+								break;
+							}
+							p2=this.getPiece({x:x+1,y:y});
+							if(p2 != null && p2.constructor.name=='Pawn' && p2.colour != p.colour) {
+								ret += 'P';
+								break;
+							}
+						}
+						ret += 'p';
+						break;
+					case 'Bishop':
+						ret += 'b';
+						break;
+					case 'Queen':
+						ret += 'q';
+						break;
+					case 'King':
+						ret += 'k';
+						break;
+					case 'Rook':
+						/*
+						 *  If the king can castle with this rook,
+						 * use a capital
+						 */
+						p2=this.king[p.colour];
+						if((!p.moved) && (!p2.moved)) {
+							if(p.x < p2.x)
+								cx=p2.x-1;
+							else
+								cx=p2.x+1;
+							if(p.emptyTo({x:cx, y:p.y})) {
+								if(this.getPiece({x:cx, y:p.y})==null) {
+									ret + 'R';
+									break;
+								}
+							}
+						}
+						ret += 'r';
+						break;
+					case 'Knight':
+						ret += 'k';
+						break;
+				}
+			}
+		}
+	}
+	return ret;
+}