Index: util/mergepatch.pl
===================================================================
--- /YC1308AC/branch/mouse_project/mouse_public_sdk/util/mergepatch.pl	(revision 3276)
+++ /YC1308AC/branch/mouse_project/mouse_public_sdk/util/mergepatch.pl	(working copy)
@@ -127,6 +127,17 @@
 }
 
 
+sub getdefs {
+	my($def) = @_;
+	my(@ifdefs) = split(/\s*\|\s*/, $def);
+	my $v = 0;
+	foreach (@ifdefs) {
+		s/\s//g;
+		$v = 1 if($defs =~ /(^|\s)$_(\s|$)/);
+	}
+	return $v;
+}
+
 sub parseif {
 	my($fname) = @_;
 	open file, $fname;
@@ -142,11 +153,12 @@
 			$comment = 0 if(/\*\//);
 			next;
 		}
-		$defs .= $1 . " " if(/^define\s+(\w+)\s*/);
-		if(/^\s*ifdef\s+(\w+)\s*/) {
-			push @valid, ($defs =~ /(^|\s)$1(\s|$)/ ? 1 : 0) & $valid[$#valid];
-		} elsif(/^\s*ifndef\s+(\w+)\s*/) {
-			push @valid, ($defs =~ /(^|\s)$1(\s|$)/ ? 0 : 1) & $valid[$#valid];
+		if(/^\s*ifdef\s+(.+)$/) {
+			$v = getdefs($1) ? 1 : 0;
+			push @valid, $v & $valid[$#valid];
+		} elsif(/^\s*ifndef\s+(.+)$/) {
+			$v = getdefs($1) ? 0 : 1;
+			push @valid, $v & $valid[$#valid];
 		} elsif(/^\s*else/) {
 			printf "%s\nelse without if at line %d\n", $f[$i - 3], $i if($#valid == 0);
 			if($#valid == 0) {
@@ -174,6 +186,9 @@
 				close file2;
 				splice(@f, $i + 1, 0, @f2);
 			} else {
+			if(/^define\s+(\w+)\s*/) {
+				$defs .= $1 . " " 
+			}
 				print file $_;
 			}
 		}
@@ -185,7 +200,7 @@
 {
 	print "genpatch\n";
 	$patched = 0;
-	open file,"program/patch.prog";
+	open file,"output/bt_program23.meta";
 	while(<file>) {
 		if(/^\s*beq\s+patch([0-9a-f]+)_([0-7]),/) {
 			$a = hex($1), $b = hex($2);
@@ -223,10 +238,11 @@
 	open file, "output/bt_program23.meta";
 	@f = <file>;
 	close file;
-	for($i = $label = $line = 0, $z = 1;$i < @f;$i++) {
+	for($i = $label = $line[0] = 0, $z = 1;$i < @f;$i++) {
 		$_ = $f[$i];
-		$line = $i - 1 if(/^org\s+0x[23]000/ && $line == 0);
+		$line[0] = $i - 1 if(/^org\s+0x([23]000|800)/ && $line[0] == 0);
 		if(/^org z\s*$/) {
+			$line[$z/0x10000 + 1] = $i - 1;
 			$z += 0x10000;
 			$f[$i] = sprintf("org 0x%x\n", $z);
 			$label = 1;
@@ -237,20 +253,28 @@
 		}
 	}
 	return if($z == 1);
+	$line[$z/0x10000 + 1] = $i - 1;
 	for($i = 0;$i < @f;$i++) {
 		$_ = $f[$i];
 		$label = "";
-		if(/^\s*(branch|nbranch|call|ncall)\s+(\w+)\s*$/ || /^\s*(branch|nbranch|call|ncall)\s+(\w+)\s*,\s*(\w+)\s*$/) {
+		if(/^\s*(branch|nbranch|call|ncall|setarg)\s+(\w+)\s*$/ || /^\s*(branch|nbranch|call|ncall|arg)\s+(\w+)\s*,\s*(\w+)\s*$/) {
 			$label = $2;
 		}
 		if(/^\s*(bmark|beq|bne|bbit[01])\s+(\w+)\s*,\s*(\w+)\s*$/) {
 			$label = $3;
 		}
+		$branch = /^\s+branch\s+$label\s*$/ ? 1 : 0;
 		if(exists($lab{$label})) {
 			$nlabel = "jmpz_" . $label;
 			$f[$i] =~ s/$label/eval "$nlabel"/e;
 			if($lab{$label} > 100) {
-				$f[$line] .= sprintf("%s:\n\tsetarg 0x%x\n\tbranch p_zcode_entrance_2Bytes_common\n\n", $nlabel, int($lab{$label}/0x1000));
+				$z = int($lab{$label}/0x1000);
+				$l = $i < $line[1] ? $line[0] : $line[$z/10 - 1];
+				if($branch && $i >= $line[1]) {
+					$f[$i] = sprintf("\tsetarg 0x%x\n\tbranch p_zcode_entrance_2Bytes_common\n\n", $z);
+				} else {
+					$f[$l] .= sprintf("%s:\n\tsetarg 0x%x\n\tbranch p_zcode_entrance_2Bytes_common\n\n", $nlabel, $z);
+				}
 				$lab{$label} = 1;
 			}
 		}
@@ -269,6 +293,41 @@
 	close file;
 }
 
+sub authrom {
+	$addr = 0x9000;
+	foreach $s (@ARGV) {
+		open f, "../sched/" . $s . ".dat" or die "cannot open dat file $s";
+		@ff = <f>;
+		close f;
+		foreach (@ff) { $_ =~ s/\s//g;push @auth, $_ . "\n"; }
+		printf "0x%x %s_ADDR\n", $addr, uc($s);
+		$addr += $#ff + 1;
+	}
+	open f,">auth.rom";
+	print f @auth;
+	close f;
+	open f,"romcode.rom" or return;
+	@rom = <f>;
+	close f;
+	for($i = 0, $j = $#rom - 0x1ff;$i < 0x200;$i++,$j++) {
+		for($k = 0, $l = "";$k < 4;$k++) {
+			$_ = $auth[$i*4 + $k];
+			s/\s//g;
+			$_ = "00" if(/^$/);
+			$l =  $_ . $l;
+		}
+		$rom[$j] = $l . "\n";
+	}
+	open f,">romcode.rom";
+	print f @rom;
+	close f;
+}
+
+if(@ARGV > 0) {
+	authrom();
+	exit;
+}
+
 parseif("output/bt_program23.meta");
 parseif("output/bt_format.meta");
 genpatch() if($defs !~ / SIM /);
