diff --git a/exec/load/graphic.js b/exec/load/graphic.js
index b0618cc2b2ca5647d174aba7bbe2670fac77d539..5495eb5a5fbd21f1c43c5b8711a55d0a8020948c 100644
--- a/exec/load/graphic.js
+++ b/exec/load/graphic.js
@@ -205,32 +205,118 @@ function Graphic_load(filename)
 
 	switch(file_type.toUpperCase()) {
 	case "ANS":
-		/*
 		if(!(f.open("r",true,4096)))
 			return(false);
 		var lines=f.readAll();
 		f.close();
 		
-		var cur_attr=this.attr;
-		var cur_ch=this.ch;
-		var ANSI=String.fromCharCode(27,91);
+		var attr = this.attr;
+		var bg = BG_BLACK;
+		var fg = LIGHTGRAY;
+		var i = 0;
+		var y = 0;
 		
-		for(y=0; y<this.height && y<lines.length; y++) {
-			var x=0;
-			var index=0;
-			index=lines[y].indexOf(ANSI,index);
-			while(index >= 0) {
+		while(lines.length > 0) {	
+			var x = 0;
+			var line = lines.shift();
 			
-			}
-			
-			txt=txt.toString().replace(/@(.*)@/g,
+			/* parse 'ATCODES'?? 
+			line = line.replace(/@(.*)@/g,
 				function (str, code, offset, s) {
 					return bbs.atcode(code);
 				}
-			)
-			this.data[x][y]=new Graphic_sector(cur_ch,cur_attr);
+			);
+			*/
+			
+			while(line.length > 0) {
+				/* parse an attribute sequence*/
+				var m = line.match(/^\x1b\[(\d+);?(\d*);?(\d*)m/);
+				if(m !== null) {
+					line = line.substr(m.shift().length);
+					if(m[0] == 0) {
+						bg = BG_BLACK;
+						fg = LIGHTGRAY;
+						i = 0;
+						m.shift();
+					}
+					if(m[0] == 1) {
+						i = HIGH;
+						m.shift();
+					}
+					if(m[0] >= 40) {
+						switch(Number(m.shift())) {
+						case 40:
+							bg = BG_BLACK;
+							break;
+						case 41:
+							bg = BG_RED;
+							break;
+						case 42: 
+							bg = BG_GREEN;
+							break;
+						case 43:
+							bg = BG_BROWN;
+							break;
+						case 44:
+							bg = BG_BLUE;
+							break;
+						case 45:
+							bg = BG_MAGENTA;
+							break;
+						case 46:
+							bg = BG_CYAN;
+							break;
+						case 47:
+							bg = BG_LIGHTGRAY;
+							break;
+						}
+					}
+					if(m[0] >= 30) {
+						switch(Number(m.shift())) {
+						case 30:
+							fg = BLACK;
+							break;
+						case 31:
+							fg = RED;
+							break;
+						case 32:
+							fg = GREEN;
+							break;
+						case 33:
+							fg = BROWN;
+							break;
+						case 34:
+							fg = BLUE;
+							break;
+						case 35:
+							fg = MAGENTA;
+							break;
+						case 36:
+							fg = CYAN;
+							break;
+						case 37:
+							fg = LIGHTGRAY;
+							break;
+						}
+					}
+					attr = bg + fg + i;
+					continue;
+				}
+				/* parse a positional sequence */
+				var n = line.match(/^\x1b\[(\d+)C/);
+				if(n !== null) {
+					line = line.substr(n.shift().length);
+					x+=Number(n.shift());
+					continue;
+				}
+				/* set character and attribute */
+				var ch = line[0];
+				line = line.substr(1);
+				this.data[x][y]=new Graphic_sector(ch,attr);
+				x++;
+			}
+			y++;
 		}
-		*/
 		break;
 	case "BIN":
 		if(!(f.open("rb",true,4096)))