1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-11-27 19:50:10 +00:00

Changed fast multiply to a _prepare(a) & _prepared(b) sub-functions.

Added support for "." operator in ASM.
This commit is contained in:
jespergravgaard 2018-10-19 00:28:57 +02:00
parent 5d38d8c6ec
commit 908cb3ea8d
22 changed files with 9549 additions and 3850 deletions

View File

@ -0,0 +1 @@
lda {c1},x

View File

@ -0,0 +1 @@
lda {c1},y

View File

@ -23,7 +23,7 @@ import java.util.concurrent.Callable;
descriptionHeading = "%nDescription:%n%n", descriptionHeading = "%nDescription:%n%n",
parameterListHeading = "%nParameters:%n", parameterListHeading = "%nParameters:%n",
optionListHeading = "%nOptions:%n", optionListHeading = "%nOptions:%n",
version = "KickC 0.5 (master)" version = "KickC 0.6 BETA (master)"
) )
public class KickC implements Callable<Void> { public class KickC implements Callable<Void> {

View File

@ -170,6 +170,7 @@ asmParamMode
asmExpr asmExpr
: '[' asmExpr ']' #asmExprPar : '[' asmExpr ']' #asmExprPar
| asmExpr ( '.' ) asmExpr #asmExprBinary
| asmExpr ( '<<' | '>>' ) asmExpr #asmExprBinary | asmExpr ( '<<' | '>>' ) asmExpr #asmExprBinary
| ('+' | '-' | '<' | '>' ) asmExpr #asmExprUnary | ('+' | '-' | '<' | '>' ) asmExpr #asmExprUnary
| asmExpr ('*' | '/' ) asmExpr #asmExprBinary | asmExpr ('*' | '/' ) asmExpr #asmExprBinary

View File

@ -66,26 +66,27 @@ T__64=65
T__65=66 T__65=66
T__66=67 T__66=67
T__67=68 T__67=68
MNEMONIC=69 T__68=69
KICKASM=70 MNEMONIC=70
SIMPLETYPE=71 KICKASM=71
STRING=72 SIMPLETYPE=72
CHAR=73 STRING=73
BOOLEAN=74 CHAR=74
NUMBER=75 BOOLEAN=75
NUMFLOAT=76 NUMBER=76
BINFLOAT=77 NUMFLOAT=77
DECFLOAT=78 BINFLOAT=78
HEXFLOAT=79 DECFLOAT=79
NUMINT=80 HEXFLOAT=80
BININTEGER=81 NUMINT=81
DECINTEGER=82 BININTEGER=82
HEXINTEGER=83 DECINTEGER=83
NAME=84 HEXINTEGER=84
ASMREL=85 NAME=85
WS=86 ASMREL=86
COMMENT_LINE=87 WS=87
COMMENT_BLOCK=88 COMMENT_LINE=88
COMMENT_BLOCK=89
'import'=1 'import'=1
'='=2 '='=2
';'=3 ';'=3
@ -154,3 +155,4 @@ COMMENT_BLOCK=88
'^='=66 '^='=66
'.byte'=67 '.byte'=67
'#'=68 '#'=68
'.'=69

View File

@ -26,10 +26,10 @@ public class KickCLexer extends Lexer {
T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52, T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52,
T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59, T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66, T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
T__66=67, T__67=68, MNEMONIC=69, KICKASM=70, SIMPLETYPE=71, STRING=72, T__66=67, T__67=68, T__68=69, MNEMONIC=70, KICKASM=71, SIMPLETYPE=72,
CHAR=73, BOOLEAN=74, NUMBER=75, NUMFLOAT=76, BINFLOAT=77, DECFLOAT=78, STRING=73, CHAR=74, BOOLEAN=75, NUMBER=76, NUMFLOAT=77, BINFLOAT=78, DECFLOAT=79,
HEXFLOAT=79, NUMINT=80, BININTEGER=81, DECINTEGER=82, HEXINTEGER=83, NAME=84, HEXFLOAT=80, NUMINT=81, BININTEGER=82, DECINTEGER=83, HEXINTEGER=84, NAME=85,
ASMREL=85, WS=86, COMMENT_LINE=87, COMMENT_BLOCK=88; ASMREL=86, WS=87, COMMENT_LINE=88, COMMENT_BLOCK=89;
public static String[] channelNames = { public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN" "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
}; };
@ -47,11 +47,11 @@ public class KickCLexer extends Lexer {
"T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48", "T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48",
"T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56", "T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56",
"T__57", "T__58", "T__59", "T__60", "T__61", "T__62", "T__63", "T__64", "T__57", "T__58", "T__59", "T__60", "T__61", "T__62", "T__63", "T__64",
"T__65", "T__66", "T__67", "MNEMONIC", "KICKASM", "SIMPLETYPE", "STRING", "T__65", "T__66", "T__67", "T__68", "MNEMONIC", "KICKASM", "SIMPLETYPE",
"CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT",
"NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "BINDIGIT", "DECDIGIT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "BINDIGIT",
"HEXDIGIT", "NAME", "NAME_START", "NAME_CHAR", "ASMREL", "WS", "COMMENT_LINE", "DECDIGIT", "HEXDIGIT", "NAME", "NAME_START", "NAME_CHAR", "ASMREL", "WS",
"COMMENT_BLOCK" "COMMENT_LINE", "COMMENT_BLOCK"
}; };
private static final String[] _LITERAL_NAMES = { private static final String[] _LITERAL_NAMES = {
@ -63,7 +63,7 @@ public class KickCLexer extends Lexer {
"'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'", "'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'",
"'=='", "'!='", "'<='", "'>='", "'^'", "'|'", "'&&'", "'||'", "'+='", "'=='", "'!='", "'<='", "'>='", "'^'", "'|'", "'&&'", "'||'", "'+='",
"'-='", "'*='", "'/='", "'%='", "'<<='", "'>>='", "'&='", "'|='", "'^='", "'-='", "'*='", "'/='", "'%='", "'<<='", "'>>='", "'&='", "'|='", "'^='",
"'.byte'", "'#'" "'.byte'", "'#'", "'.'"
}; };
private static final String[] _SYMBOLIC_NAMES = { private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
@ -71,10 +71,10 @@ public class KickCLexer extends Lexer {
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, "MNEMONIC", "KICKASM", null, null, null, null, null, null, null, null, null, null, "MNEMONIC",
"SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT", "KICKASM", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT",
"DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER",
"NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK" "HEXINTEGER", "NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
}; };
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -134,7 +134,7 @@ public class KickCLexer extends Lexer {
public ATN getATN() { return _ATN; } public ATN getATN() { return _ATN; }
public static final String _serializedATN = public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2Z\u0383\b\1\4\2\t"+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2[\u0387\b\1\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@ -144,320 +144,322 @@ public class KickCLexer extends Lexer {
"\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+ "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+
"\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+ "\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+
"\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+ "\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+
"\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\3\2\3\2"+ "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\3"+
"\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3"+ "\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b"+
"\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3"+ "\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\13\3\13\3\13\3\13\3\13"+
"\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r"+ "\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3"+
"\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20"+ "\r\3\r\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20"+
"\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23"+ "\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23"+
"\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25"+ "\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25"+
"\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27"+ "\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27"+
"\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+ "\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+
"\3\30\3\30\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33"+ "\3\30\3\30\3\30\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33"+
"\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36"+ "\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36"+
"\3\36\3\36\3\37\3\37\3\37\3\37\3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3"+ "\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3\""+
"#\3#\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3(\3(\3)\3)\3*\3*\3+\3+\3,\3,\3,"+ "\3\"\3#\3#\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3(\3(\3)\3)\3*\3*\3+\3+\3,"+
"\3-\3-\3-\3.\3.\3/\3/\3\60\3\60\3\61\3\61\3\62\3\62\3\62\3\63\3\63\3\63"+ "\3,\3,\3-\3-\3-\3.\3.\3/\3/\3\60\3\60\3\61\3\61\3\62\3\62\3\62\3\63\3"+
"\3\64\3\64\3\64\3\65\3\65\3\65\3\66\3\66\3\67\3\67\38\38\38\39\39\39\3"+ "\63\3\63\3\64\3\64\3\64\3\65\3\65\3\65\3\66\3\66\3\67\3\67\38\38\38\3"+
":\3:\3:\3;\3;\3;\3<\3<\3<\3=\3=\3=\3>\3>\3>\3?\3?\3?\3?\3@\3@\3@\3@\3"+ "9\39\39\3:\3:\3:\3;\3;\3;\3<\3<\3<\3=\3=\3=\3>\3>\3>\3?\3?\3?\3?\3@\3"+
"A\3A\3A\3B\3B\3B\3C\3C\3C\3D\3D\3D\3D\3D\3D\3E\3E\3F\3F\3F\3F\3F\3F\3"+ "@\3@\3@\3A\3A\3A\3B\3B\3B\3C\3C\3C\3D\3D\3D\3D\3D\3D\3E\3E\3F\3F\3G\3"+
"F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3"+ "G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3"+
"F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3"+ "G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3"+
"F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3"+ "G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3"+
"F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3"+ "G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3"+
"F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3"+ "G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3"+
"F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3"+ "G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3"+
"F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3"+ "G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3"+
"F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3"+ "G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3"+
"F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3"+ "G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3"+
"F\3F\3F\3F\3F\3F\3F\3F\3F\5F\u02a4\nF\3G\3G\3G\3G\7G\u02aa\nG\fG\16G\u02ad"+ "G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\5G\u02a8\nG\3H\3H\3H\3H\7H\u02ae"+
"\13G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3"+ "\nH\fH\16H\u02b1\13H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3"+
"H\3H\3H\5H\u02c7\nH\3I\3I\3I\3I\7I\u02cd\nI\fI\16I\u02d0\13I\3I\3I\3J"+ "I\3I\3I\3I\3I\3I\3I\3I\5I\u02cb\nI\3J\3J\3J\3J\7J\u02d1\nJ\fJ\16J\u02d4"+
"\3J\3J\3J\5J\u02d8\nJ\3J\3J\3K\3K\3K\3K\3K\3K\3K\3K\3K\5K\u02e5\nK\3L"+ "\13J\3J\3J\3K\3K\3K\3K\5K\u02dc\nK\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\5"+
"\3L\5L\u02e9\nL\3M\3M\3M\5M\u02ee\nM\3N\3N\3N\3N\3N\5N\u02f5\nN\3N\7N"+ "L\u02e9\nL\3M\3M\5M\u02ed\nM\3N\3N\3N\5N\u02f2\nN\3O\3O\3O\3O\3O\5O\u02f9"+
"\u02f8\nN\fN\16N\u02fb\13N\3N\3N\6N\u02ff\nN\rN\16N\u0300\3O\7O\u0304"+ "\nO\3O\7O\u02fc\nO\fO\16O\u02ff\13O\3O\3O\6O\u0303\nO\rO\16O\u0304\3P"+
"\nO\fO\16O\u0307\13O\3O\3O\6O\u030b\nO\rO\16O\u030c\3P\3P\3P\3P\3P\5P"+ "\7P\u0308\nP\fP\16P\u030b\13P\3P\3P\6P\u030f\nP\rP\16P\u0310\3Q\3Q\3Q"+
"\u0314\nP\3P\7P\u0317\nP\fP\16P\u031a\13P\3P\3P\6P\u031e\nP\rP\16P\u031f"+ "\3Q\3Q\5Q\u0318\nQ\3Q\7Q\u031b\nQ\fQ\16Q\u031e\13Q\3Q\3Q\6Q\u0322\nQ\r"+
"\3Q\3Q\3Q\5Q\u0325\nQ\3R\3R\3R\6R\u032a\nR\rR\16R\u032b\3R\3R\6R\u0330"+ "Q\16Q\u0323\3R\3R\3R\5R\u0329\nR\3S\3S\3S\6S\u032e\nS\rS\16S\u032f\3S"+
"\nR\rR\16R\u0331\5R\u0334\nR\3S\6S\u0337\nS\rS\16S\u0338\3T\3T\3T\3T\3"+ "\3S\6S\u0334\nS\rS\16S\u0335\5S\u0338\nS\3T\6T\u033b\nT\rT\16T\u033c\3"+
"T\5T\u0340\nT\3T\6T\u0343\nT\rT\16T\u0344\3U\3U\3V\3V\3W\3W\3X\3X\7X\u034f"+ "U\3U\3U\3U\3U\5U\u0344\nU\3U\6U\u0347\nU\rU\16U\u0348\3V\3V\3W\3W\3X\3"+
"\nX\fX\16X\u0352\13X\3Y\3Y\3Z\3Z\3[\3[\7[\u035a\n[\f[\16[\u035d\13[\3"+ "X\3Y\3Y\7Y\u0353\nY\fY\16Y\u0356\13Y\3Z\3Z\3[\3[\3\\\3\\\7\\\u035e\n\\"+
"[\6[\u0360\n[\r[\16[\u0361\3\\\6\\\u0365\n\\\r\\\16\\\u0366\3\\\3\\\3"+ "\f\\\16\\\u0361\13\\\3\\\6\\\u0364\n\\\r\\\16\\\u0365\3]\6]\u0369\n]\r"+
"]\3]\3]\3]\7]\u036f\n]\f]\16]\u0372\13]\3]\3]\3^\3^\3^\3^\7^\u037a\n^"+ "]\16]\u036a\3]\3]\3^\3^\3^\3^\7^\u0373\n^\f^\16^\u0376\13^\3^\3^\3_\3"+
"\f^\16^\u037d\13^\3^\3^\3^\3^\3^\4\u02ab\u037b\2_\3\3\5\4\7\5\t\6\13\7"+ "_\3_\3_\7_\u037e\n_\f_\16_\u0381\13_\3_\3_\3_\3_\3_\4\u02af\u037f\2`\3"+
"\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25"+ "\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37"+
")\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O"+ "\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37="+
")Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081"+ " ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9"+
"B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095"+ "q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008f"+
"L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9"+ "I\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3"+
"\2\u00ab\2\u00ad\2\u00afV\u00b1\2\u00b3\2\u00b5W\u00b7X\u00b9Y\u00bbZ"+ "S\u00a5T\u00a7U\u00a9V\u00ab\2\u00ad\2\u00af\2\u00b1W\u00b3\2\u00b5\2"+
"\3\2\r\3\2$$\3\2))\4\2DDdd\3\2\62\63\3\2\62;\5\2\62;CHch\5\2C\\aac|\6"+ "\u00b7X\u00b9Y\u00bbZ\u00bd[\3\2\r\3\2$$\3\2))\4\2DDdd\3\2\62\63\3\2\62"+
"\2\62;C\\aac|\4\2--//\5\2\13\f\17\17\"\"\4\2\f\f\17\17\2\u03eb\2\3\3\2"+ ";\5\2\62;CHch\5\2C\\aac|\6\2\62;C\\aac|\4\2--//\5\2\13\f\17\17\"\"\4\2"+
"\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17"+ "\f\f\17\17\2\u03ef\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13"+
"\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2"+ "\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2"+
"\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3"+ "\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2"+
"\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3"+ "!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3"+
"\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2"+ "\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2"+
"=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3"+ "\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E"+
"\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2"+ "\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2"+
"\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2"+ "\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2"+
"c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3"+ "\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k"+
"\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2"+ "\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2"+
"\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3"+ "\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2"+
"\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2"+ "\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b"+
"\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097"+ "\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2"+
"\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2"+ "\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d"+
"\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00af"+ "\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2"+
"\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2"+ "\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00b1\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9"+
"\2\3\u00bd\3\2\2\2\5\u00c4\3\2\2\2\7\u00c6\3\2\2\2\t\u00c8\3\2\2\2\13"+ "\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\3\u00bf\3\2\2\2\5\u00c6\3\2\2"+
"\u00ca\3\2\2\2\r\u00cc\3\2\2\2\17\u00ce\3\2\2\2\21\u00d0\3\2\2\2\23\u00d8"+ "\2\7\u00c8\3\2\2\2\t\u00ca\3\2\2\2\13\u00cc\3\2\2\2\r\u00ce\3\2\2\2\17"+
"\3\2\2\2\25\u00da\3\2\2\2\27\u00e3\3\2\2\2\31\u00eb\3\2\2\2\33\u00f1\3"+ "\u00d0\3\2\2\2\21\u00d2\3\2\2\2\23\u00da\3\2\2\2\25\u00dc\3\2\2\2\27\u00e5"+
"\2\2\2\35\u00f3\3\2\2\2\37\u00f9\3\2\2\2!\u0100\3\2\2\2#\u0103\3\2\2\2"+ "\3\2\2\2\31\u00ed\3\2\2\2\33\u00f3\3\2\2\2\35\u00f5\3\2\2\2\37\u00fb\3"+
"%\u010a\3\2\2\2\'\u0110\3\2\2\2)\u0117\3\2\2\2+\u011d\3\2\2\2-\u0126\3"+ "\2\2\2!\u0102\3\2\2\2#\u0105\3\2\2\2%\u010c\3\2\2\2\'\u0112\3\2\2\2)\u0119"+
"\2\2\2/\u012f\3\2\2\2\61\u0139\3\2\2\2\63\u013c\3\2\2\2\65\u0141\3\2\2"+ "\3\2\2\2+\u011f\3\2\2\2-\u0128\3\2\2\2/\u0131\3\2\2\2\61\u013b\3\2\2\2"+
"\2\67\u0147\3\2\2\29\u014a\3\2\2\2;\u014e\3\2\2\2=\u0155\3\2\2\2?\u0159"+ "\63\u013e\3\2\2\2\65\u0143\3\2\2\2\67\u0149\3\2\2\29\u014c\3\2\2\2;\u0150"+
"\3\2\2\2A\u015c\3\2\2\2C\u0163\3\2\2\2E\u0165\3\2\2\2G\u0167\3\2\2\2I"+ "\3\2\2\2=\u0157\3\2\2\2?\u015b\3\2\2\2A\u015e\3\2\2\2C\u0165\3\2\2\2E"+
"\u0169\3\2\2\2K\u016c\3\2\2\2M\u016f\3\2\2\2O\u0171\3\2\2\2Q\u0173\3\2"+ "\u0167\3\2\2\2G\u0169\3\2\2\2I\u016b\3\2\2\2K\u016e\3\2\2\2M\u0171\3\2"+
"\2\2S\u0175\3\2\2\2U\u0177\3\2\2\2W\u0179\3\2\2\2Y\u017c\3\2\2\2[\u017f"+ "\2\2O\u0173\3\2\2\2Q\u0175\3\2\2\2S\u0177\3\2\2\2U\u0179\3\2\2\2W\u017b"+
"\3\2\2\2]\u0181\3\2\2\2_\u0183\3\2\2\2a\u0185\3\2\2\2c\u0187\3\2\2\2e"+ "\3\2\2\2Y\u017e\3\2\2\2[\u0181\3\2\2\2]\u0183\3\2\2\2_\u0185\3\2\2\2a"+
"\u018a\3\2\2\2g\u018d\3\2\2\2i\u0190\3\2\2\2k\u0193\3\2\2\2m\u0195\3\2"+ "\u0187\3\2\2\2c\u0189\3\2\2\2e\u018c\3\2\2\2g\u018f\3\2\2\2i\u0192\3\2"+
"\2\2o\u0197\3\2\2\2q\u019a\3\2\2\2s\u019d\3\2\2\2u\u01a0\3\2\2\2w\u01a3"+ "\2\2k\u0195\3\2\2\2m\u0197\3\2\2\2o\u0199\3\2\2\2q\u019c\3\2\2\2s\u019f"+
"\3\2\2\2y\u01a6\3\2\2\2{\u01a9\3\2\2\2}\u01ac\3\2\2\2\177\u01b0\3\2\2"+ "\3\2\2\2u\u01a2\3\2\2\2w\u01a5\3\2\2\2y\u01a8\3\2\2\2{\u01ab\3\2\2\2}"+
"\2\u0081\u01b4\3\2\2\2\u0083\u01b7\3\2\2\2\u0085\u01ba\3\2\2\2\u0087\u01bd"+ "\u01ae\3\2\2\2\177\u01b2\3\2\2\2\u0081\u01b6\3\2\2\2\u0083\u01b9\3\2\2"+
"\3\2\2\2\u0089\u01c3\3\2\2\2\u008b\u02a3\3\2\2\2\u008d\u02a5\3\2\2\2\u008f"+ "\2\u0085\u01bc\3\2\2\2\u0087\u01bf\3\2\2\2\u0089\u01c5\3\2\2\2\u008b\u01c7"+
"\u02c6\3\2\2\2\u0091\u02c8\3\2\2\2\u0093\u02d3\3\2\2\2\u0095\u02e4\3\2"+ "\3\2\2\2\u008d\u02a7\3\2\2\2\u008f\u02a9\3\2\2\2\u0091\u02ca\3\2\2\2\u0093"+
"\2\2\u0097\u02e8\3\2\2\2\u0099\u02ed\3\2\2\2\u009b\u02f4\3\2\2\2\u009d"+ "\u02cc\3\2\2\2\u0095\u02d7\3\2\2\2\u0097\u02e8\3\2\2\2\u0099\u02ec\3\2"+
"\u0305\3\2\2\2\u009f\u0313\3\2\2\2\u00a1\u0324\3\2\2\2\u00a3\u0333\3\2"+ "\2\2\u009b\u02f1\3\2\2\2\u009d\u02f8\3\2\2\2\u009f\u0309\3\2\2\2\u00a1"+
"\2\2\u00a5\u0336\3\2\2\2\u00a7\u033f\3\2\2\2\u00a9\u0346\3\2\2\2\u00ab"+ "\u0317\3\2\2\2\u00a3\u0328\3\2\2\2\u00a5\u0337\3\2\2\2\u00a7\u033a\3\2"+
"\u0348\3\2\2\2\u00ad\u034a\3\2\2\2\u00af\u034c\3\2\2\2\u00b1\u0353\3\2"+ "\2\2\u00a9\u0343\3\2\2\2\u00ab\u034a\3\2\2\2\u00ad\u034c\3\2\2\2\u00af"+
"\2\2\u00b3\u0355\3\2\2\2\u00b5\u0357\3\2\2\2\u00b7\u0364\3\2\2\2\u00b9"+ "\u034e\3\2\2\2\u00b1\u0350\3\2\2\2\u00b3\u0357\3\2\2\2\u00b5\u0359\3\2"+
"\u036a\3\2\2\2\u00bb\u0375\3\2\2\2\u00bd\u00be\7k\2\2\u00be\u00bf\7o\2"+ "\2\2\u00b7\u035b\3\2\2\2\u00b9\u0368\3\2\2\2\u00bb\u036e\3\2\2\2\u00bd"+
"\2\u00bf\u00c0\7r\2\2\u00c0\u00c1\7q\2\2\u00c1\u00c2\7t\2\2\u00c2\u00c3"+ "\u0379\3\2\2\2\u00bf\u00c0\7k\2\2\u00c0\u00c1\7o\2\2\u00c1\u00c2\7r\2"+
"\7v\2\2\u00c3\4\3\2\2\2\u00c4\u00c5\7?\2\2\u00c5\6\3\2\2\2\u00c6\u00c7"+ "\2\u00c2\u00c3\7q\2\2\u00c3\u00c4\7t\2\2\u00c4\u00c5\7v\2\2\u00c5\4\3"+
"\7=\2\2\u00c7\b\3\2\2\2\u00c8\u00c9\7*\2\2\u00c9\n\3\2\2\2\u00ca\u00cb"+ "\2\2\2\u00c6\u00c7\7?\2\2\u00c7\6\3\2\2\2\u00c8\u00c9\7=\2\2\u00c9\b\3"+
"\7+\2\2\u00cb\f\3\2\2\2\u00cc\u00cd\7}\2\2\u00cd\16\3\2\2\2\u00ce\u00cf"+ "\2\2\2\u00ca\u00cb\7*\2\2\u00cb\n\3\2\2\2\u00cc\u00cd\7+\2\2\u00cd\f\3"+
"\7\177\2\2\u00cf\20\3\2\2\2\u00d0\u00d1\7m\2\2\u00d1\u00d2\7k\2\2\u00d2"+ "\2\2\2\u00ce\u00cf\7}\2\2\u00cf\16\3\2\2\2\u00d0\u00d1\7\177\2\2\u00d1"+
"\u00d3\7e\2\2\u00d3\u00d4\7m\2\2\u00d4\u00d5\7c\2\2\u00d5\u00d6\7u\2\2"+ "\20\3\2\2\2\u00d2\u00d3\7m\2\2\u00d3\u00d4\7k\2\2\u00d4\u00d5\7e\2\2\u00d5"+
"\u00d6\u00d7\7o\2\2\u00d7\22\3\2\2\2\u00d8\u00d9\7.\2\2\u00d9\24\3\2\2"+ "\u00d6\7m\2\2\u00d6\u00d7\7c\2\2\u00d7\u00d8\7u\2\2\u00d8\u00d9\7o\2\2"+
"\2\u00da\u00db\7t\2\2\u00db\u00dc\7g\2\2\u00dc\u00dd\7u\2\2\u00dd\u00de"+ "\u00d9\22\3\2\2\2\u00da\u00db\7.\2\2\u00db\24\3\2\2\2\u00dc\u00dd\7t\2"+
"\7q\2\2\u00de\u00df\7w\2\2\u00df\u00e0\7t\2\2\u00e0\u00e1\7e\2\2\u00e1"+ "\2\u00dd\u00de\7g\2\2\u00de\u00df\7u\2\2\u00df\u00e0\7q\2\2\u00e0\u00e1"+
"\u00e2\7g\2\2\u00e2\26\3\2\2\2\u00e3\u00e4\7e\2\2\u00e4\u00e5\7n\2\2\u00e5"+ "\7w\2\2\u00e1\u00e2\7t\2\2\u00e2\u00e3\7e\2\2\u00e3\u00e4\7g\2\2\u00e4"+
"\u00e6\7q\2\2\u00e6\u00e7\7d\2\2\u00e7\u00e8\7d\2\2\u00e8\u00e9\7g\2\2"+ "\26\3\2\2\2\u00e5\u00e6\7e\2\2\u00e6\u00e7\7n\2\2\u00e7\u00e8\7q\2\2\u00e8"+
"\u00e9\u00ea\7t\2\2\u00ea\30\3\2\2\2\u00eb\u00ec\7r\2\2\u00ec\u00ed\7"+ "\u00e9\7d\2\2\u00e9\u00ea\7d\2\2\u00ea\u00eb\7g\2\2\u00eb\u00ec\7t\2\2"+
"c\2\2\u00ed\u00ee\7t\2\2\u00ee\u00ef\7c\2\2\u00ef\u00f0\7o\2\2\u00f0\32"+ "\u00ec\30\3\2\2\2\u00ed\u00ee\7r\2\2\u00ee\u00ef\7c\2\2\u00ef\u00f0\7"+
"\3\2\2\2\u00f1\u00f2\7<\2\2\u00f2\34\3\2\2\2\u00f3\u00f4\7d\2\2\u00f4"+ "t\2\2\u00f0\u00f1\7c\2\2\u00f1\u00f2\7o\2\2\u00f2\32\3\2\2\2\u00f3\u00f4"+
"\u00f5\7{\2\2\u00f5\u00f6\7v\2\2\u00f6\u00f7\7g\2\2\u00f7\u00f8\7u\2\2"+ "\7<\2\2\u00f4\34\3\2\2\2\u00f5\u00f6\7d\2\2\u00f6\u00f7\7{\2\2\u00f7\u00f8"+
"\u00f8\36\3\2\2\2\u00f9\u00fa\7e\2\2\u00fa\u00fb\7{\2\2\u00fb\u00fc\7"+ "\7v\2\2\u00f8\u00f9\7g\2\2\u00f9\u00fa\7u\2\2\u00fa\36\3\2\2\2\u00fb\u00fc"+
"e\2\2\u00fc\u00fd\7n\2\2\u00fd\u00fe\7g\2\2\u00fe\u00ff\7u\2\2\u00ff "+ "\7e\2\2\u00fc\u00fd\7{\2\2\u00fd\u00fe\7e\2\2\u00fe\u00ff\7n\2\2\u00ff"+
"\3\2\2\2\u0100\u0101\7r\2\2\u0101\u0102\7e\2\2\u0102\"\3\2\2\2\u0103\u0104"+ "\u0100\7g\2\2\u0100\u0101\7u\2\2\u0101 \3\2\2\2\u0102\u0103\7r\2\2\u0103"+
"\7k\2\2\u0104\u0105\7p\2\2\u0105\u0106\7n\2\2\u0106\u0107\7k\2\2\u0107"+ "\u0104\7e\2\2\u0104\"\3\2\2\2\u0105\u0106\7k\2\2\u0106\u0107\7p\2\2\u0107"+
"\u0108\7p\2\2\u0108\u0109\7g\2\2\u0109$\3\2\2\2\u010a\u010b\7e\2\2\u010b"+ "\u0108\7n\2\2\u0108\u0109\7k\2\2\u0109\u010a\7p\2\2\u010a\u010b\7g\2\2"+
"\u010c\7q\2\2\u010c\u010d\7p\2\2\u010d\u010e\7u\2\2\u010e\u010f\7v\2\2"+ "\u010b$\3\2\2\2\u010c\u010d\7e\2\2\u010d\u010e\7q\2\2\u010e\u010f\7p\2"+
"\u010f&\3\2\2\2\u0110\u0111\7g\2\2\u0111\u0112\7z\2\2\u0112\u0113\7v\2"+ "\2\u010f\u0110\7u\2\2\u0110\u0111\7v\2\2\u0111&\3\2\2\2\u0112\u0113\7"+
"\2\u0113\u0114\7g\2\2\u0114\u0115\7t\2\2\u0115\u0116\7p\2\2\u0116(\3\2"+ "g\2\2\u0113\u0114\7z\2\2\u0114\u0115\7v\2\2\u0115\u0116\7g\2\2\u0116\u0117"+
"\2\2\u0117\u0118\7c\2\2\u0118\u0119\7n\2\2\u0119\u011a\7k\2\2\u011a\u011b"+ "\7t\2\2\u0117\u0118\7p\2\2\u0118(\3\2\2\2\u0119\u011a\7c\2\2\u011a\u011b"+
"\7i\2\2\u011b\u011c\7p\2\2\u011c*\3\2\2\2\u011d\u011e\7t\2\2\u011e\u011f"+ "\7n\2\2\u011b\u011c\7k\2\2\u011c\u011d\7i\2\2\u011d\u011e\7p\2\2\u011e"+
"\7g\2\2\u011f\u0120\7i\2\2\u0120\u0121\7k\2\2\u0121\u0122\7u\2\2\u0122"+ "*\3\2\2\2\u011f\u0120\7t\2\2\u0120\u0121\7g\2\2\u0121\u0122\7i\2\2\u0122"+
"\u0123\7v\2\2\u0123\u0124\7g\2\2\u0124\u0125\7t\2\2\u0125,\3\2\2\2\u0126"+ "\u0123\7k\2\2\u0123\u0124\7u\2\2\u0124\u0125\7v\2\2\u0125\u0126\7g\2\2"+
"\u0127\7x\2\2\u0127\u0128\7q\2\2\u0128\u0129\7n\2\2\u0129\u012a\7c\2\2"+ "\u0126\u0127\7t\2\2\u0127,\3\2\2\2\u0128\u0129\7x\2\2\u0129\u012a\7q\2"+
"\u012a\u012b\7v\2\2\u012b\u012c\7k\2\2\u012c\u012d\7n\2\2\u012d\u012e"+ "\2\u012a\u012b\7n\2\2\u012b\u012c\7c\2\2\u012c\u012d\7v\2\2\u012d\u012e"+
"\7g\2\2\u012e.\3\2\2\2\u012f\u0130\7k\2\2\u0130\u0131\7p\2\2\u0131\u0132"+ "\7k\2\2\u012e\u012f\7n\2\2\u012f\u0130\7g\2\2\u0130.\3\2\2\2\u0131\u0132"+
"\7v\2\2\u0132\u0133\7g\2\2\u0133\u0134\7t\2\2\u0134\u0135\7t\2\2\u0135"+ "\7k\2\2\u0132\u0133\7p\2\2\u0133\u0134\7v\2\2\u0134\u0135\7g\2\2\u0135"+
"\u0136\7w\2\2\u0136\u0137\7r\2\2\u0137\u0138\7v\2\2\u0138\60\3\2\2\2\u0139"+ "\u0136\7t\2\2\u0136\u0137\7t\2\2\u0137\u0138\7w\2\2\u0138\u0139\7r\2\2"+
"\u013a\7k\2\2\u013a\u013b\7h\2\2\u013b\62\3\2\2\2\u013c\u013d\7g\2\2\u013d"+ "\u0139\u013a\7v\2\2\u013a\60\3\2\2\2\u013b\u013c\7k\2\2\u013c\u013d\7"+
"\u013e\7n\2\2\u013e\u013f\7u\2\2\u013f\u0140\7g\2\2\u0140\64\3\2\2\2\u0141"+ "h\2\2\u013d\62\3\2\2\2\u013e\u013f\7g\2\2\u013f\u0140\7n\2\2\u0140\u0141"+
"\u0142\7y\2\2\u0142\u0143\7j\2\2\u0143\u0144\7k\2\2\u0144\u0145\7n\2\2"+ "\7u\2\2\u0141\u0142\7g\2\2\u0142\64\3\2\2\2\u0143\u0144\7y\2\2\u0144\u0145"+
"\u0145\u0146\7g\2\2\u0146\66\3\2\2\2\u0147\u0148\7f\2\2\u0148\u0149\7"+ "\7j\2\2\u0145\u0146\7k\2\2\u0146\u0147\7n\2\2\u0147\u0148\7g\2\2\u0148"+
"q\2\2\u01498\3\2\2\2\u014a\u014b\7h\2\2\u014b\u014c\7q\2\2\u014c\u014d"+ "\66\3\2\2\2\u0149\u014a\7f\2\2\u014a\u014b\7q\2\2\u014b8\3\2\2\2\u014c"+
"\7t\2\2\u014d:\3\2\2\2\u014e\u014f\7t\2\2\u014f\u0150\7g\2\2\u0150\u0151"+ "\u014d\7h\2\2\u014d\u014e\7q\2\2\u014e\u014f\7t\2\2\u014f:\3\2\2\2\u0150"+
"\7v\2\2\u0151\u0152\7w\2\2\u0152\u0153\7t\2\2\u0153\u0154\7p\2\2\u0154"+ "\u0151\7t\2\2\u0151\u0152\7g\2\2\u0152\u0153\7v\2\2\u0153\u0154\7w\2\2"+
"<\3\2\2\2\u0155\u0156\7c\2\2\u0156\u0157\7u\2\2\u0157\u0158\7o\2\2\u0158"+ "\u0154\u0155\7t\2\2\u0155\u0156\7p\2\2\u0156<\3\2\2\2\u0157\u0158\7c\2"+
">\3\2\2\2\u0159\u015a\7\60\2\2\u015a\u015b\7\60\2\2\u015b@\3\2\2\2\u015c"+ "\2\u0158\u0159\7u\2\2\u0159\u015a\7o\2\2\u015a>\3\2\2\2\u015b\u015c\7"+
"\u015d\7u\2\2\u015d\u015e\7k\2\2\u015e\u015f\7i\2\2\u015f\u0160\7p\2\2"+ "\60\2\2\u015c\u015d\7\60\2\2\u015d@\3\2\2\2\u015e\u015f\7u\2\2\u015f\u0160"+
"\u0160\u0161\7g\2\2\u0161\u0162\7f\2\2\u0162B\3\2\2\2\u0163\u0164\7,\2"+ "\7k\2\2\u0160\u0161\7i\2\2\u0161\u0162\7p\2\2\u0162\u0163\7g\2\2\u0163"+
"\2\u0164D\3\2\2\2\u0165\u0166\7]\2\2\u0166F\3\2\2\2\u0167\u0168\7_\2\2"+ "\u0164\7f\2\2\u0164B\3\2\2\2\u0165\u0166\7,\2\2\u0166D\3\2\2\2\u0167\u0168"+
"\u0168H\3\2\2\2\u0169\u016a\7/\2\2\u016a\u016b\7/\2\2\u016bJ\3\2\2\2\u016c"+ "\7]\2\2\u0168F\3\2\2\2\u0169\u016a\7_\2\2\u016aH\3\2\2\2\u016b\u016c\7"+
"\u016d\7-\2\2\u016d\u016e\7-\2\2\u016eL\3\2\2\2\u016f\u0170\7-\2\2\u0170"+ "/\2\2\u016c\u016d\7/\2\2\u016dJ\3\2\2\2\u016e\u016f\7-\2\2\u016f\u0170"+
"N\3\2\2\2\u0171\u0172\7/\2\2\u0172P\3\2\2\2\u0173\u0174\7#\2\2\u0174R"+ "\7-\2\2\u0170L\3\2\2\2\u0171\u0172\7-\2\2\u0172N\3\2\2\2\u0173\u0174\7"+
"\3\2\2\2\u0175\u0176\7(\2\2\u0176T\3\2\2\2\u0177\u0178\7\u0080\2\2\u0178"+ "/\2\2\u0174P\3\2\2\2\u0175\u0176\7#\2\2\u0176R\3\2\2\2\u0177\u0178\7("+
"V\3\2\2\2\u0179\u017a\7@\2\2\u017a\u017b\7@\2\2\u017bX\3\2\2\2\u017c\u017d"+ "\2\2\u0178T\3\2\2\2\u0179\u017a\7\u0080\2\2\u017aV\3\2\2\2\u017b\u017c"+
"\7>\2\2\u017d\u017e\7>\2\2\u017eZ\3\2\2\2\u017f\u0180\7\61\2\2\u0180\\"+ "\7@\2\2\u017c\u017d\7@\2\2\u017dX\3\2\2\2\u017e\u017f\7>\2\2\u017f\u0180"+
"\3\2\2\2\u0181\u0182\7\'\2\2\u0182^\3\2\2\2\u0183\u0184\7>\2\2\u0184`"+ "\7>\2\2\u0180Z\3\2\2\2\u0181\u0182\7\61\2\2\u0182\\\3\2\2\2\u0183\u0184"+
"\3\2\2\2\u0185\u0186\7@\2\2\u0186b\3\2\2\2\u0187\u0188\7?\2\2\u0188\u0189"+ "\7\'\2\2\u0184^\3\2\2\2\u0185\u0186\7>\2\2\u0186`\3\2\2\2\u0187\u0188"+
"\7?\2\2\u0189d\3\2\2\2\u018a\u018b\7#\2\2\u018b\u018c\7?\2\2\u018cf\3"+ "\7@\2\2\u0188b\3\2\2\2\u0189\u018a\7?\2\2\u018a\u018b\7?\2\2\u018bd\3"+
"\2\2\2\u018d\u018e\7>\2\2\u018e\u018f\7?\2\2\u018fh\3\2\2\2\u0190\u0191"+ "\2\2\2\u018c\u018d\7#\2\2\u018d\u018e\7?\2\2\u018ef\3\2\2\2\u018f\u0190"+
"\7@\2\2\u0191\u0192\7?\2\2\u0192j\3\2\2\2\u0193\u0194\7`\2\2\u0194l\3"+ "\7>\2\2\u0190\u0191\7?\2\2\u0191h\3\2\2\2\u0192\u0193\7@\2\2\u0193\u0194"+
"\2\2\2\u0195\u0196\7~\2\2\u0196n\3\2\2\2\u0197\u0198\7(\2\2\u0198\u0199"+ "\7?\2\2\u0194j\3\2\2\2\u0195\u0196\7`\2\2\u0196l\3\2\2\2\u0197\u0198\7"+
"\7(\2\2\u0199p\3\2\2\2\u019a\u019b\7~\2\2\u019b\u019c\7~\2\2\u019cr\3"+ "~\2\2\u0198n\3\2\2\2\u0199\u019a\7(\2\2\u019a\u019b\7(\2\2\u019bp\3\2"+
"\2\2\2\u019d\u019e\7-\2\2\u019e\u019f\7?\2\2\u019ft\3\2\2\2\u01a0\u01a1"+ "\2\2\u019c\u019d\7~\2\2\u019d\u019e\7~\2\2\u019er\3\2\2\2\u019f\u01a0"+
"\7/\2\2\u01a1\u01a2\7?\2\2\u01a2v\3\2\2\2\u01a3\u01a4\7,\2\2\u01a4\u01a5"+ "\7-\2\2\u01a0\u01a1\7?\2\2\u01a1t\3\2\2\2\u01a2\u01a3\7/\2\2\u01a3\u01a4"+
"\7?\2\2\u01a5x\3\2\2\2\u01a6\u01a7\7\61\2\2\u01a7\u01a8\7?\2\2\u01a8z"+ "\7?\2\2\u01a4v\3\2\2\2\u01a5\u01a6\7,\2\2\u01a6\u01a7\7?\2\2\u01a7x\3"+
"\3\2\2\2\u01a9\u01aa\7\'\2\2\u01aa\u01ab\7?\2\2\u01ab|\3\2\2\2\u01ac\u01ad"+ "\2\2\2\u01a8\u01a9\7\61\2\2\u01a9\u01aa\7?\2\2\u01aaz\3\2\2\2\u01ab\u01ac"+
"\7>\2\2\u01ad\u01ae\7>\2\2\u01ae\u01af\7?\2\2\u01af~\3\2\2\2\u01b0\u01b1"+ "\7\'\2\2\u01ac\u01ad\7?\2\2\u01ad|\3\2\2\2\u01ae\u01af\7>\2\2\u01af\u01b0"+
"\7@\2\2\u01b1\u01b2\7@\2\2\u01b2\u01b3\7?\2\2\u01b3\u0080\3\2\2\2\u01b4"+ "\7>\2\2\u01b0\u01b1\7?\2\2\u01b1~\3\2\2\2\u01b2\u01b3\7@\2\2\u01b3\u01b4"+
"\u01b5\7(\2\2\u01b5\u01b6\7?\2\2\u01b6\u0082\3\2\2\2\u01b7\u01b8\7~\2"+ "\7@\2\2\u01b4\u01b5\7?\2\2\u01b5\u0080\3\2\2\2\u01b6\u01b7\7(\2\2\u01b7"+
"\2\u01b8\u01b9\7?\2\2\u01b9\u0084\3\2\2\2\u01ba\u01bb\7`\2\2\u01bb\u01bc"+ "\u01b8\7?\2\2\u01b8\u0082\3\2\2\2\u01b9\u01ba\7~\2\2\u01ba\u01bb\7?\2"+
"\7?\2\2\u01bc\u0086\3\2\2\2\u01bd\u01be\7\60\2\2\u01be\u01bf\7d\2\2\u01bf"+ "\2\u01bb\u0084\3\2\2\2\u01bc\u01bd\7`\2\2\u01bd\u01be\7?\2\2\u01be\u0086"+
"\u01c0\7{\2\2\u01c0\u01c1\7v\2\2\u01c1\u01c2\7g\2\2\u01c2\u0088\3\2\2"+ "\3\2\2\2\u01bf\u01c0\7\60\2\2\u01c0\u01c1\7d\2\2\u01c1\u01c2\7{\2\2\u01c2"+
"\2\u01c3\u01c4\7%\2\2\u01c4\u008a\3\2\2\2\u01c5\u01c6\7d\2\2\u01c6\u01c7"+ "\u01c3\7v\2\2\u01c3\u01c4\7g\2\2\u01c4\u0088\3\2\2\2\u01c5\u01c6\7%\2"+
"\7t\2\2\u01c7\u02a4\7m\2\2\u01c8\u01c9\7q\2\2\u01c9\u01ca\7t\2\2\u01ca"+ "\2\u01c6\u008a\3\2\2\2\u01c7\u01c8\7\60\2\2\u01c8\u008c\3\2\2\2\u01c9"+
"\u02a4\7c\2\2\u01cb\u01cc\7m\2\2\u01cc\u01cd\7k\2\2\u01cd\u02a4\7n\2\2"+ "\u01ca\7d\2\2\u01ca\u01cb\7t\2\2\u01cb\u02a8\7m\2\2\u01cc\u01cd\7q\2\2"+
"\u01ce\u01cf\7u\2\2\u01cf\u01d0\7n\2\2\u01d0\u02a4\7q\2\2\u01d1\u01d2"+ "\u01cd\u01ce\7t\2\2\u01ce\u02a8\7c\2\2\u01cf\u01d0\7m\2\2\u01d0\u01d1"+
"\7p\2\2\u01d2\u01d3\7q\2\2\u01d3\u02a4\7r\2\2\u01d4\u01d5\7c\2\2\u01d5"+ "\7k\2\2\u01d1\u02a8\7n\2\2\u01d2\u01d3\7u\2\2\u01d3\u01d4\7n\2\2\u01d4"+
"\u01d6\7u\2\2\u01d6\u02a4\7n\2\2\u01d7\u01d8\7r\2\2\u01d8\u01d9\7j\2\2"+ "\u02a8\7q\2\2\u01d5\u01d6\7p\2\2\u01d6\u01d7\7q\2\2\u01d7\u02a8\7r\2\2"+
"\u01d9\u02a4\7r\2\2\u01da\u01db\7c\2\2\u01db\u01dc\7p\2\2\u01dc\u02a4"+ "\u01d8\u01d9\7c\2\2\u01d9\u01da\7u\2\2\u01da\u02a8\7n\2\2\u01db\u01dc"+
"\7e\2\2\u01dd\u01de\7d\2\2\u01de\u01df\7r\2\2\u01df\u02a4\7n\2\2\u01e0"+ "\7r\2\2\u01dc\u01dd\7j\2\2\u01dd\u02a8\7r\2\2\u01de\u01df\7c\2\2\u01df"+
"\u01e1\7e\2\2\u01e1\u01e2\7n\2\2\u01e2\u02a4\7e\2\2\u01e3\u01e4\7l\2\2"+ "\u01e0\7p\2\2\u01e0\u02a8\7e\2\2\u01e1\u01e2\7d\2\2\u01e2\u01e3\7r\2\2"+
"\u01e4\u01e5\7u\2\2\u01e5\u02a4\7t\2\2\u01e6\u01e7\7c\2\2\u01e7\u01e8"+ "\u01e3\u02a8\7n\2\2\u01e4\u01e5\7e\2\2\u01e5\u01e6\7n\2\2\u01e6\u02a8"+
"\7p\2\2\u01e8\u02a4\7f\2\2\u01e9\u01ea\7t\2\2\u01ea\u01eb\7n\2\2\u01eb"+ "\7e\2\2\u01e7\u01e8\7l\2\2\u01e8\u01e9\7u\2\2\u01e9\u02a8\7t\2\2\u01ea"+
"\u02a4\7c\2\2\u01ec\u01ed\7d\2\2\u01ed\u01ee\7k\2\2\u01ee\u02a4\7v\2\2"+ "\u01eb\7c\2\2\u01eb\u01ec\7p\2\2\u01ec\u02a8\7f\2\2\u01ed\u01ee\7t\2\2"+
"\u01ef\u01f0\7t\2\2\u01f0\u01f1\7q\2\2\u01f1\u02a4\7n\2\2\u01f2\u01f3"+ "\u01ee\u01ef\7n\2\2\u01ef\u02a8\7c\2\2\u01f0\u01f1\7d\2\2\u01f1\u01f2"+
"\7r\2\2\u01f3\u01f4\7n\2\2\u01f4\u02a4\7c\2\2\u01f5\u01f6\7r\2\2\u01f6"+ "\7k\2\2\u01f2\u02a8\7v\2\2\u01f3\u01f4\7t\2\2\u01f4\u01f5\7q\2\2\u01f5"+
"\u01f7\7n\2\2\u01f7\u02a4\7r\2\2\u01f8\u01f9\7d\2\2\u01f9\u01fa\7o\2\2"+ "\u02a8\7n\2\2\u01f6\u01f7\7r\2\2\u01f7\u01f8\7n\2\2\u01f8\u02a8\7c\2\2"+
"\u01fa\u02a4\7k\2\2\u01fb\u01fc\7u\2\2\u01fc\u01fd\7g\2\2\u01fd\u02a4"+ "\u01f9\u01fa\7r\2\2\u01fa\u01fb\7n\2\2\u01fb\u02a8\7r\2\2\u01fc\u01fd"+
"\7e\2\2\u01fe\u01ff\7t\2\2\u01ff\u0200\7v\2\2\u0200\u02a4\7k\2\2\u0201"+ "\7d\2\2\u01fd\u01fe\7o\2\2\u01fe\u02a8\7k\2\2\u01ff\u0200\7u\2\2\u0200"+
"\u0202\7g\2\2\u0202\u0203\7q\2\2\u0203\u02a4\7t\2\2\u0204\u0205\7u\2\2"+ "\u0201\7g\2\2\u0201\u02a8\7e\2\2\u0202\u0203\7t\2\2\u0203\u0204\7v\2\2"+
"\u0205\u0206\7t\2\2\u0206\u02a4\7g\2\2\u0207\u0208\7n\2\2\u0208\u0209"+ "\u0204\u02a8\7k\2\2\u0205\u0206\7g\2\2\u0206\u0207\7q\2\2\u0207\u02a8"+
"\7u\2\2\u0209\u02a4\7t\2\2\u020a\u020b\7r\2\2\u020b\u020c\7j\2\2\u020c"+ "\7t\2\2\u0208\u0209\7u\2\2\u0209\u020a\7t\2\2\u020a\u02a8\7g\2\2\u020b"+
"\u02a4\7c\2\2\u020d\u020e\7c\2\2\u020e\u020f\7n\2\2\u020f\u02a4\7t\2\2"+ "\u020c\7n\2\2\u020c\u020d\7u\2\2\u020d\u02a8\7t\2\2\u020e\u020f\7r\2\2"+
"\u0210\u0211\7l\2\2\u0211\u0212\7o\2\2\u0212\u02a4\7r\2\2\u0213\u0214"+ "\u020f\u0210\7j\2\2\u0210\u02a8\7c\2\2\u0211\u0212\7c\2\2\u0212\u0213"+
"\7d\2\2\u0214\u0215\7x\2\2\u0215\u02a4\7e\2\2\u0216\u0217\7e\2\2\u0217"+ "\7n\2\2\u0213\u02a8\7t\2\2\u0214\u0215\7l\2\2\u0215\u0216\7o\2\2\u0216"+
"\u0218\7n\2\2\u0218\u02a4\7k\2\2\u0219\u021a\7t\2\2\u021a\u021b\7v\2\2"+ "\u02a8\7r\2\2\u0217\u0218\7d\2\2\u0218\u0219\7x\2\2\u0219\u02a8\7e\2\2"+
"\u021b\u02a4\7u\2\2\u021c\u021d\7c\2\2\u021d\u021e\7f\2\2\u021e\u02a4"+ "\u021a\u021b\7e\2\2\u021b\u021c\7n\2\2\u021c\u02a8\7k\2\2\u021d\u021e"+
"\7e\2\2\u021f\u0220\7t\2\2\u0220\u0221\7t\2\2\u0221\u02a4\7c\2\2\u0222"+ "\7t\2\2\u021e\u021f\7v\2\2\u021f\u02a8\7u\2\2\u0220\u0221\7c\2\2\u0221"+
"\u0223\7d\2\2\u0223\u0224\7x\2\2\u0224\u02a4\7u\2\2\u0225\u0226\7u\2\2"+ "\u0222\7f\2\2\u0222\u02a8\7e\2\2\u0223\u0224\7t\2\2\u0224\u0225\7t\2\2"+
"\u0226\u0227\7g\2\2\u0227\u02a4\7k\2\2\u0228\u0229\7u\2\2\u0229\u022a"+ "\u0225\u02a8\7c\2\2\u0226\u0227\7d\2\2\u0227\u0228\7x\2\2\u0228\u02a8"+
"\7c\2\2\u022a\u02a4\7z\2\2\u022b\u022c\7u\2\2\u022c\u022d\7v\2\2\u022d"+ "\7u\2\2\u0229\u022a\7u\2\2\u022a\u022b\7g\2\2\u022b\u02a8\7k\2\2\u022c"+
"\u02a4\7{\2\2\u022e\u022f\7u\2\2\u022f\u0230\7v\2\2\u0230\u02a4\7c\2\2"+ "\u022d\7u\2\2\u022d\u022e\7c\2\2\u022e\u02a8\7z\2\2\u022f\u0230\7u\2\2"+
"\u0231\u0232\7u\2\2\u0232\u0233\7v\2\2\u0233\u02a4\7z\2\2\u0234\u0235"+ "\u0230\u0231\7v\2\2\u0231\u02a8\7{\2\2\u0232\u0233\7u\2\2\u0233\u0234"+
"\7f\2\2\u0235\u0236\7g\2\2\u0236\u02a4\7{\2\2\u0237\u0238\7v\2\2\u0238"+ "\7v\2\2\u0234\u02a8\7c\2\2\u0235\u0236\7u\2\2\u0236\u0237\7v\2\2\u0237"+
"\u0239\7z\2\2\u0239\u02a4\7c\2\2\u023a\u023b\7z\2\2\u023b\u023c\7c\2\2"+ "\u02a8\7z\2\2\u0238\u0239\7f\2\2\u0239\u023a\7g\2\2\u023a\u02a8\7{\2\2"+
"\u023c\u02a4\7c\2\2\u023d\u023e\7d\2\2\u023e\u023f\7e\2\2\u023f\u02a4"+ "\u023b\u023c\7v\2\2\u023c\u023d\7z\2\2\u023d\u02a8\7c\2\2\u023e\u023f"+
"\7e\2\2\u0240\u0241\7c\2\2\u0241\u0242\7j\2\2\u0242\u02a4\7z\2\2\u0243"+ "\7z\2\2\u023f\u0240\7c\2\2\u0240\u02a8\7c\2\2\u0241\u0242\7d\2\2\u0242"+
"\u0244\7v\2\2\u0244\u0245\7{\2\2\u0245\u02a4\7c\2\2\u0246\u0247\7v\2\2"+ "\u0243\7e\2\2\u0243\u02a8\7e\2\2\u0244\u0245\7c\2\2\u0245\u0246\7j\2\2"+
"\u0247\u0248\7z\2\2\u0248\u02a4\7u\2\2\u0249\u024a\7v\2\2\u024a\u024b"+ "\u0246\u02a8\7z\2\2\u0247\u0248\7v\2\2\u0248\u0249\7{\2\2\u0249\u02a8"+
"\7c\2\2\u024b\u02a4\7u\2\2\u024c\u024d\7u\2\2\u024d\u024e\7j\2\2\u024e"+ "\7c\2\2\u024a\u024b\7v\2\2\u024b\u024c\7z\2\2\u024c\u02a8\7u\2\2\u024d"+
"\u02a4\7{\2\2\u024f\u0250\7u\2\2\u0250\u0251\7j\2\2\u0251\u02a4\7z\2\2"+ "\u024e\7v\2\2\u024e\u024f\7c\2\2\u024f\u02a8\7u\2\2\u0250\u0251\7u\2\2"+
"\u0252\u0253\7n\2\2\u0253\u0254\7f\2\2\u0254\u02a4\7{\2\2\u0255\u0256"+ "\u0251\u0252\7j\2\2\u0252\u02a8\7{\2\2\u0253\u0254\7u\2\2\u0254\u0255"+
"\7n\2\2\u0256\u0257\7f\2\2\u0257\u02a4\7c\2\2\u0258\u0259\7n\2\2\u0259"+ "\7j\2\2\u0255\u02a8\7z\2\2\u0256\u0257\7n\2\2\u0257\u0258\7f\2\2\u0258"+
"\u025a\7f\2\2\u025a\u02a4\7z\2\2\u025b\u025c\7n\2\2\u025c\u025d\7c\2\2"+ "\u02a8\7{\2\2\u0259\u025a\7n\2\2\u025a\u025b\7f\2\2\u025b\u02a8\7c\2\2"+
"\u025d\u02a4\7z\2\2\u025e\u025f\7v\2\2\u025f\u0260\7c\2\2\u0260\u02a4"+ "\u025c\u025d\7n\2\2\u025d\u025e\7f\2\2\u025e\u02a8\7z\2\2\u025f\u0260"+
"\7{\2\2\u0261\u0262\7v\2\2\u0262\u0263\7c\2\2\u0263\u02a4\7z\2\2\u0264"+ "\7n\2\2\u0260\u0261\7c\2\2\u0261\u02a8\7z\2\2\u0262\u0263\7v\2\2\u0263"+
"\u0265\7d\2\2\u0265\u0266\7e\2\2\u0266\u02a4\7u\2\2\u0267\u0268\7e\2\2"+ "\u0264\7c\2\2\u0264\u02a8\7{\2\2\u0265\u0266\7v\2\2\u0266\u0267\7c\2\2"+
"\u0268\u0269\7n\2\2\u0269\u02a4\7x\2\2\u026a\u026b\7v\2\2\u026b\u026c"+ "\u0267\u02a8\7z\2\2\u0268\u0269\7d\2\2\u0269\u026a\7e\2\2\u026a\u02a8"+
"\7u\2\2\u026c\u02a4\7z\2\2\u026d\u026e\7n\2\2\u026e\u026f\7c\2\2\u026f"+ "\7u\2\2\u026b\u026c\7e\2\2\u026c\u026d\7n\2\2\u026d\u02a8\7x\2\2\u026e"+
"\u02a4\7u\2\2\u0270\u0271\7e\2\2\u0271\u0272\7r\2\2\u0272\u02a4\7{\2\2"+ "\u026f\7v\2\2\u026f\u0270\7u\2\2\u0270\u02a8\7z\2\2\u0271\u0272\7n\2\2"+
"\u0273\u0274\7e\2\2\u0274\u0275\7o\2\2\u0275\u02a4\7r\2\2\u0276\u0277"+ "\u0272\u0273\7c\2\2\u0273\u02a8\7u\2\2\u0274\u0275\7e\2\2\u0275\u0276"+
"\7e\2\2\u0277\u0278\7r\2\2\u0278\u02a4\7z\2\2\u0279\u027a\7f\2\2\u027a"+ "\7r\2\2\u0276\u02a8\7{\2\2\u0277\u0278\7e\2\2\u0278\u0279\7o\2\2\u0279"+
"\u027b\7e\2\2\u027b\u02a4\7r\2\2\u027c\u027d\7f\2\2\u027d\u027e\7g\2\2"+ "\u02a8\7r\2\2\u027a\u027b\7e\2\2\u027b\u027c\7r\2\2\u027c\u02a8\7z\2\2"+
"\u027e\u02a4\7e\2\2\u027f\u0280\7k\2\2\u0280\u0281\7p\2\2\u0281\u02a4"+ "\u027d\u027e\7f\2\2\u027e\u027f\7e\2\2\u027f\u02a8\7r\2\2\u0280\u0281"+
"\7e\2\2\u0282\u0283\7c\2\2\u0283\u0284\7z\2\2\u0284\u02a4\7u\2\2\u0285"+ "\7f\2\2\u0281\u0282\7g\2\2\u0282\u02a8\7e\2\2\u0283\u0284\7k\2\2\u0284"+
"\u0286\7d\2\2\u0286\u0287\7p\2\2\u0287\u02a4\7g\2\2\u0288\u0289\7e\2\2"+ "\u0285\7p\2\2\u0285\u02a8\7e\2\2\u0286\u0287\7c\2\2\u0287\u0288\7z\2\2"+
"\u0289\u028a\7n\2\2\u028a\u02a4\7f\2\2\u028b\u028c\7u\2\2\u028c\u028d"+ "\u0288\u02a8\7u\2\2\u0289\u028a\7d\2\2\u028a\u028b\7p\2\2\u028b\u02a8"+
"\7d\2\2\u028d\u02a4\7e\2\2\u028e\u028f\7k\2\2\u028f\u0290\7u\2\2\u0290"+ "\7g\2\2\u028c\u028d\7e\2\2\u028d\u028e\7n\2\2\u028e\u02a8\7f\2\2\u028f"+
"\u02a4\7e\2\2\u0291\u0292\7k\2\2\u0292\u0293\7p\2\2\u0293\u02a4\7z\2\2"+ "\u0290\7u\2\2\u0290\u0291\7d\2\2\u0291\u02a8\7e\2\2\u0292\u0293\7k\2\2"+
"\u0294\u0295\7d\2\2\u0295\u0296\7g\2\2\u0296\u02a4\7s\2\2\u0297\u0298"+ "\u0293\u0294\7u\2\2\u0294\u02a8\7e\2\2\u0295\u0296\7k\2\2\u0296\u0297"+
"\7u\2\2\u0298\u0299\7g\2\2\u0299\u02a4\7f\2\2\u029a\u029b\7f\2\2\u029b"+ "\7p\2\2\u0297\u02a8\7z\2\2\u0298\u0299\7d\2\2\u0299\u029a\7g\2\2\u029a"+
"\u029c\7g\2\2\u029c\u02a4\7z\2\2\u029d\u029e\7k\2\2\u029e\u029f\7p\2\2"+ "\u02a8\7s\2\2\u029b\u029c\7u\2\2\u029c\u029d\7g\2\2\u029d\u02a8\7f\2\2"+
"\u029f\u02a4\7{\2\2\u02a0\u02a1\7t\2\2\u02a1\u02a2\7q\2\2\u02a2\u02a4"+ "\u029e\u029f\7f\2\2\u029f\u02a0\7g\2\2\u02a0\u02a8\7z\2\2\u02a1\u02a2"+
"\7t\2\2\u02a3\u01c5\3\2\2\2\u02a3\u01c8\3\2\2\2\u02a3\u01cb\3\2\2\2\u02a3"+ "\7k\2\2\u02a2\u02a3\7p\2\2\u02a3\u02a8\7{\2\2\u02a4\u02a5\7t\2\2\u02a5"+
"\u01ce\3\2\2\2\u02a3\u01d1\3\2\2\2\u02a3\u01d4\3\2\2\2\u02a3\u01d7\3\2"+ "\u02a6\7q\2\2\u02a6\u02a8\7t\2\2\u02a7\u01c9\3\2\2\2\u02a7\u01cc\3\2\2"+
"\2\2\u02a3\u01da\3\2\2\2\u02a3\u01dd\3\2\2\2\u02a3\u01e0\3\2\2\2\u02a3"+ "\2\u02a7\u01cf\3\2\2\2\u02a7\u01d2\3\2\2\2\u02a7\u01d5\3\2\2\2\u02a7\u01d8"+
"\u01e3\3\2\2\2\u02a3\u01e6\3\2\2\2\u02a3\u01e9\3\2\2\2\u02a3\u01ec\3\2"+ "\3\2\2\2\u02a7\u01db\3\2\2\2\u02a7\u01de\3\2\2\2\u02a7\u01e1\3\2\2\2\u02a7"+
"\2\2\u02a3\u01ef\3\2\2\2\u02a3\u01f2\3\2\2\2\u02a3\u01f5\3\2\2\2\u02a3"+ "\u01e4\3\2\2\2\u02a7\u01e7\3\2\2\2\u02a7\u01ea\3\2\2\2\u02a7\u01ed\3\2"+
"\u01f8\3\2\2\2\u02a3\u01fb\3\2\2\2\u02a3\u01fe\3\2\2\2\u02a3\u0201\3\2"+ "\2\2\u02a7\u01f0\3\2\2\2\u02a7\u01f3\3\2\2\2\u02a7\u01f6\3\2\2\2\u02a7"+
"\2\2\u02a3\u0204\3\2\2\2\u02a3\u0207\3\2\2\2\u02a3\u020a\3\2\2\2\u02a3"+ "\u01f9\3\2\2\2\u02a7\u01fc\3\2\2\2\u02a7\u01ff\3\2\2\2\u02a7\u0202\3\2"+
"\u020d\3\2\2\2\u02a3\u0210\3\2\2\2\u02a3\u0213\3\2\2\2\u02a3\u0216\3\2"+ "\2\2\u02a7\u0205\3\2\2\2\u02a7\u0208\3\2\2\2\u02a7\u020b\3\2\2\2\u02a7"+
"\2\2\u02a3\u0219\3\2\2\2\u02a3\u021c\3\2\2\2\u02a3\u021f\3\2\2\2\u02a3"+ "\u020e\3\2\2\2\u02a7\u0211\3\2\2\2\u02a7\u0214\3\2\2\2\u02a7\u0217\3\2"+
"\u0222\3\2\2\2\u02a3\u0225\3\2\2\2\u02a3\u0228\3\2\2\2\u02a3\u022b\3\2"+ "\2\2\u02a7\u021a\3\2\2\2\u02a7\u021d\3\2\2\2\u02a7\u0220\3\2\2\2\u02a7"+
"\2\2\u02a3\u022e\3\2\2\2\u02a3\u0231\3\2\2\2\u02a3\u0234\3\2\2\2\u02a3"+ "\u0223\3\2\2\2\u02a7\u0226\3\2\2\2\u02a7\u0229\3\2\2\2\u02a7\u022c\3\2"+
"\u0237\3\2\2\2\u02a3\u023a\3\2\2\2\u02a3\u023d\3\2\2\2\u02a3\u0240\3\2"+ "\2\2\u02a7\u022f\3\2\2\2\u02a7\u0232\3\2\2\2\u02a7\u0235\3\2\2\2\u02a7"+
"\2\2\u02a3\u0243\3\2\2\2\u02a3\u0246\3\2\2\2\u02a3\u0249\3\2\2\2\u02a3"+ "\u0238\3\2\2\2\u02a7\u023b\3\2\2\2\u02a7\u023e\3\2\2\2\u02a7\u0241\3\2"+
"\u024c\3\2\2\2\u02a3\u024f\3\2\2\2\u02a3\u0252\3\2\2\2\u02a3\u0255\3\2"+ "\2\2\u02a7\u0244\3\2\2\2\u02a7\u0247\3\2\2\2\u02a7\u024a\3\2\2\2\u02a7"+
"\2\2\u02a3\u0258\3\2\2\2\u02a3\u025b\3\2\2\2\u02a3\u025e\3\2\2\2\u02a3"+ "\u024d\3\2\2\2\u02a7\u0250\3\2\2\2\u02a7\u0253\3\2\2\2\u02a7\u0256\3\2"+
"\u0261\3\2\2\2\u02a3\u0264\3\2\2\2\u02a3\u0267\3\2\2\2\u02a3\u026a\3\2"+ "\2\2\u02a7\u0259\3\2\2\2\u02a7\u025c\3\2\2\2\u02a7\u025f\3\2\2\2\u02a7"+
"\2\2\u02a3\u026d\3\2\2\2\u02a3\u0270\3\2\2\2\u02a3\u0273\3\2\2\2\u02a3"+ "\u0262\3\2\2\2\u02a7\u0265\3\2\2\2\u02a7\u0268\3\2\2\2\u02a7\u026b\3\2"+
"\u0276\3\2\2\2\u02a3\u0279\3\2\2\2\u02a3\u027c\3\2\2\2\u02a3\u027f\3\2"+ "\2\2\u02a7\u026e\3\2\2\2\u02a7\u0271\3\2\2\2\u02a7\u0274\3\2\2\2\u02a7"+
"\2\2\u02a3\u0282\3\2\2\2\u02a3\u0285\3\2\2\2\u02a3\u0288\3\2\2\2\u02a3"+ "\u0277\3\2\2\2\u02a7\u027a\3\2\2\2\u02a7\u027d\3\2\2\2\u02a7\u0280\3\2"+
"\u028b\3\2\2\2\u02a3\u028e\3\2\2\2\u02a3\u0291\3\2\2\2\u02a3\u0294\3\2"+ "\2\2\u02a7\u0283\3\2\2\2\u02a7\u0286\3\2\2\2\u02a7\u0289\3\2\2\2\u02a7"+
"\2\2\u02a3\u0297\3\2\2\2\u02a3\u029a\3\2\2\2\u02a3\u029d\3\2\2\2\u02a3"+ "\u028c\3\2\2\2\u02a7\u028f\3\2\2\2\u02a7\u0292\3\2\2\2\u02a7\u0295\3\2"+
"\u02a0\3\2\2\2\u02a4\u008c\3\2\2\2\u02a5\u02a6\7}\2\2\u02a6\u02a7\7}\2"+ "\2\2\u02a7\u0298\3\2\2\2\u02a7\u029b\3\2\2\2\u02a7\u029e\3\2\2\2\u02a7"+
"\2\u02a7\u02ab\3\2\2\2\u02a8\u02aa\13\2\2\2\u02a9\u02a8\3\2\2\2\u02aa"+ "\u02a1\3\2\2\2\u02a7\u02a4\3\2\2\2\u02a8\u008e\3\2\2\2\u02a9\u02aa\7}"+
"\u02ad\3\2\2\2\u02ab\u02ac\3\2\2\2\u02ab\u02a9\3\2\2\2\u02ac\u02ae\3\2"+ "\2\2\u02aa\u02ab\7}\2\2\u02ab\u02af\3\2\2\2\u02ac\u02ae\13\2\2\2\u02ad"+
"\2\2\u02ad\u02ab\3\2\2\2\u02ae\u02af\7\177\2\2\u02af\u02b0\7\177\2\2\u02b0"+ "\u02ac\3\2\2\2\u02ae\u02b1\3\2\2\2\u02af\u02b0\3\2\2\2\u02af\u02ad\3\2"+
"\u008e\3\2\2\2\u02b1\u02b2\7d\2\2\u02b2\u02b3\7{\2\2\u02b3\u02b4\7v\2"+ "\2\2\u02b0\u02b2\3\2\2\2\u02b1\u02af\3\2\2\2\u02b2\u02b3\7\177\2\2\u02b3"+
"\2\u02b4\u02c7\7g\2\2\u02b5\u02b6\7y\2\2\u02b6\u02b7\7q\2\2\u02b7\u02b8"+ "\u02b4\7\177\2\2\u02b4\u0090\3\2\2\2\u02b5\u02b6\7d\2\2\u02b6\u02b7\7"+
"\7t\2\2\u02b8\u02c7\7f\2\2\u02b9\u02ba\7f\2\2\u02ba\u02bb\7y\2\2\u02bb"+ "{\2\2\u02b7\u02b8\7v\2\2\u02b8\u02cb\7g\2\2\u02b9\u02ba\7y\2\2\u02ba\u02bb"+
"\u02bc\7q\2\2\u02bc\u02bd\7t\2\2\u02bd\u02c7\7f\2\2\u02be\u02bf\7d\2\2"+ "\7q\2\2\u02bb\u02bc\7t\2\2\u02bc\u02cb\7f\2\2\u02bd\u02be\7f\2\2\u02be"+
"\u02bf\u02c0\7q\2\2\u02c0\u02c1\7q\2\2\u02c1\u02c7\7n\2\2\u02c2\u02c3"+ "\u02bf\7y\2\2\u02bf\u02c0\7q\2\2\u02c0\u02c1\7t\2\2\u02c1\u02cb\7f\2\2"+
"\7x\2\2\u02c3\u02c4\7q\2\2\u02c4\u02c5\7k\2\2\u02c5\u02c7\7f\2\2\u02c6"+ "\u02c2\u02c3\7d\2\2\u02c3\u02c4\7q\2\2\u02c4\u02c5\7q\2\2\u02c5\u02cb"+
"\u02b1\3\2\2\2\u02c6\u02b5\3\2\2\2\u02c6\u02b9\3\2\2\2\u02c6\u02be\3\2"+ "\7n\2\2\u02c6\u02c7\7x\2\2\u02c7\u02c8\7q\2\2\u02c8\u02c9\7k\2\2\u02c9"+
"\2\2\u02c6\u02c2\3\2\2\2\u02c7\u0090\3\2\2\2\u02c8\u02ce\7$\2\2\u02c9"+ "\u02cb\7f\2\2\u02ca\u02b5\3\2\2\2\u02ca\u02b9\3\2\2\2\u02ca\u02bd\3\2"+
"\u02ca\7^\2\2\u02ca\u02cd\7$\2\2\u02cb\u02cd\n\2\2\2\u02cc\u02c9\3\2\2"+ "\2\2\u02ca\u02c2\3\2\2\2\u02ca\u02c6\3\2\2\2\u02cb\u0092\3\2\2\2\u02cc"+
"\2\u02cc\u02cb\3\2\2\2\u02cd\u02d0\3\2\2\2\u02ce\u02cc\3\2\2\2\u02ce\u02cf"+ "\u02d2\7$\2\2\u02cd\u02ce\7^\2\2\u02ce\u02d1\7$\2\2\u02cf\u02d1\n\2\2"+
"\3\2\2\2\u02cf\u02d1\3\2\2\2\u02d0\u02ce\3\2\2\2\u02d1\u02d2\7$\2\2\u02d2"+ "\2\u02d0\u02cd\3\2\2\2\u02d0\u02cf\3\2\2\2\u02d1\u02d4\3\2\2\2\u02d2\u02d0"+
"\u0092\3\2\2\2\u02d3\u02d7\7)\2\2\u02d4\u02d5\7^\2\2\u02d5\u02d8\7)\2"+ "\3\2\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d5\3\2\2\2\u02d4\u02d2\3\2\2\2\u02d5"+
"\2\u02d6\u02d8\n\3\2\2\u02d7\u02d4\3\2\2\2\u02d7\u02d6\3\2\2\2\u02d8\u02d9"+ "\u02d6\7$\2\2\u02d6\u0094\3\2\2\2\u02d7\u02db\7)\2\2\u02d8\u02d9\7^\2"+
"\3\2\2\2\u02d9\u02da\7)\2\2\u02da\u0094\3\2\2\2\u02db\u02dc\7v\2\2\u02dc"+ "\2\u02d9\u02dc\7)\2\2\u02da\u02dc\n\3\2\2\u02db\u02d8\3\2\2\2\u02db\u02da"+
"\u02dd\7t\2\2\u02dd\u02de\7w\2\2\u02de\u02e5\7g\2\2\u02df\u02e0\7h\2\2"+ "\3\2\2\2\u02dc\u02dd\3\2\2\2\u02dd\u02de\7)\2\2\u02de\u0096\3\2\2\2\u02df"+
"\u02e0\u02e1\7c\2\2\u02e1\u02e2\7n\2\2\u02e2\u02e3\7u\2\2\u02e3\u02e5"+ "\u02e0\7v\2\2\u02e0\u02e1\7t\2\2\u02e1\u02e2\7w\2\2\u02e2\u02e9\7g\2\2"+
"\7g\2\2\u02e4\u02db\3\2\2\2\u02e4\u02df\3\2\2\2\u02e5\u0096\3\2\2\2\u02e6"+ "\u02e3\u02e4\7h\2\2\u02e4\u02e5\7c\2\2\u02e5\u02e6\7n\2\2\u02e6\u02e7"+
"\u02e9\5\u0099M\2\u02e7\u02e9\5\u00a1Q\2\u02e8\u02e6\3\2\2\2\u02e8\u02e7"+ "\7u\2\2\u02e7\u02e9\7g\2\2\u02e8\u02df\3\2\2\2\u02e8\u02e3\3\2\2\2\u02e9"+
"\3\2\2\2\u02e9\u0098\3\2\2\2\u02ea\u02ee\5\u009bN\2\u02eb\u02ee\5\u009d"+ "\u0098\3\2\2\2\u02ea\u02ed\5\u009bN\2\u02eb\u02ed\5\u00a3R\2\u02ec\u02ea"+
"O\2\u02ec\u02ee\5\u009fP\2\u02ed\u02ea\3\2\2\2\u02ed\u02eb\3\2\2\2\u02ed"+ "\3\2\2\2\u02ec\u02eb\3\2\2\2\u02ed\u009a\3\2\2\2\u02ee\u02f2\5\u009dO"+
"\u02ec\3\2\2\2\u02ee\u009a\3\2\2\2\u02ef\u02f5\7\'\2\2\u02f0\u02f1\7\62"+ "\2\u02ef\u02f2\5\u009fP\2\u02f0\u02f2\5\u00a1Q\2\u02f1\u02ee\3\2\2\2\u02f1"+
"\2\2\u02f1\u02f5\7d\2\2\u02f2\u02f3\7\62\2\2\u02f3\u02f5\7D\2\2\u02f4"+ "\u02ef\3\2\2\2\u02f1\u02f0\3\2\2\2\u02f2\u009c\3\2\2\2\u02f3\u02f9\7\'"+
"\u02ef\3\2\2\2\u02f4\u02f0\3\2\2\2\u02f4\u02f2\3\2\2\2\u02f5\u02f9\3\2"+ "\2\2\u02f4\u02f5\7\62\2\2\u02f5\u02f9\7d\2\2\u02f6\u02f7\7\62\2\2\u02f7"+
"\2\2\u02f6\u02f8\5\u00a9U\2\u02f7\u02f6\3\2\2\2\u02f8\u02fb\3\2\2\2\u02f9"+ "\u02f9\7D\2\2\u02f8\u02f3\3\2\2\2\u02f8\u02f4\3\2\2\2\u02f8\u02f6\3\2"+
"\u02f7\3\2\2\2\u02f9\u02fa\3\2\2\2\u02fa\u02fc\3\2\2\2\u02fb\u02f9\3\2"+ "\2\2\u02f9\u02fd\3\2\2\2\u02fa\u02fc\5\u00abV\2\u02fb\u02fa\3\2\2\2\u02fc"+
"\2\2\u02fc\u02fe\7\60\2\2\u02fd\u02ff\5\u00a9U\2\u02fe\u02fd\3\2\2\2\u02ff"+ "\u02ff\3\2\2\2\u02fd\u02fb\3\2\2\2\u02fd\u02fe\3\2\2\2\u02fe\u0300\3\2"+
"\u0300\3\2\2\2\u0300\u02fe\3\2\2\2\u0300\u0301\3\2\2\2\u0301\u009c\3\2"+ "\2\2\u02ff\u02fd\3\2\2\2\u0300\u0302\7\60\2\2\u0301\u0303\5\u00abV\2\u0302"+
"\2\2\u0302\u0304\5\u00abV\2\u0303\u0302\3\2\2\2\u0304\u0307\3\2\2\2\u0305"+ "\u0301\3\2\2\2\u0303\u0304\3\2\2\2\u0304\u0302\3\2\2\2\u0304\u0305\3\2"+
"\u0303\3\2\2\2\u0305\u0306\3\2\2\2\u0306\u0308\3\2\2\2\u0307\u0305\3\2"+ "\2\2\u0305\u009e\3\2\2\2\u0306\u0308\5\u00adW\2\u0307\u0306\3\2\2\2\u0308"+
"\2\2\u0308\u030a\7\60\2\2\u0309\u030b\5\u00abV\2\u030a\u0309\3\2\2\2\u030b"+ "\u030b\3\2\2\2\u0309\u0307\3\2\2\2\u0309\u030a\3\2\2\2\u030a\u030c\3\2"+
"\u030c\3\2\2\2\u030c\u030a\3\2\2\2\u030c\u030d\3\2\2\2\u030d\u009e\3\2"+ "\2\2\u030b\u0309\3\2\2\2\u030c\u030e\7\60\2\2\u030d\u030f\5\u00adW\2\u030e"+
"\2\2\u030e\u0314\7&\2\2\u030f\u0310\7\62\2\2\u0310\u0314\7z\2\2\u0311"+ "\u030d\3\2\2\2\u030f\u0310\3\2\2\2\u0310\u030e\3\2\2\2\u0310\u0311\3\2"+
"\u0312\7\62\2\2\u0312\u0314\7Z\2\2\u0313\u030e\3\2\2\2\u0313\u030f\3\2"+ "\2\2\u0311\u00a0\3\2\2\2\u0312\u0318\7&\2\2\u0313\u0314\7\62\2\2\u0314"+
"\2\2\u0313\u0311\3\2\2\2\u0314\u0318\3\2\2\2\u0315\u0317\5\u00adW\2\u0316"+ "\u0318\7z\2\2\u0315\u0316\7\62\2\2\u0316\u0318\7Z\2\2\u0317\u0312\3\2"+
"\u0315\3\2\2\2\u0317\u031a\3\2\2\2\u0318\u0316\3\2\2\2\u0318\u0319\3\2"+ "\2\2\u0317\u0313\3\2\2\2\u0317\u0315\3\2\2\2\u0318\u031c\3\2\2\2\u0319"+
"\2\2\u0319\u031b\3\2\2\2\u031a\u0318\3\2\2\2\u031b\u031d\7\60\2\2\u031c"+ "\u031b\5\u00afX\2\u031a\u0319\3\2\2\2\u031b\u031e\3\2\2\2\u031c\u031a"+
"\u031e\5\u00adW\2\u031d\u031c\3\2\2\2\u031e\u031f\3\2\2\2\u031f\u031d"+ "\3\2\2\2\u031c\u031d\3\2\2\2\u031d\u031f\3\2\2\2\u031e\u031c\3\2\2\2\u031f"+
"\3\2\2\2\u031f\u0320\3\2\2\2\u0320\u00a0\3\2\2\2\u0321\u0325\5\u00a5S"+ "\u0321\7\60\2\2\u0320\u0322\5\u00afX\2\u0321\u0320\3\2\2\2\u0322\u0323"+
"\2\u0322\u0325\5\u00a7T\2\u0323\u0325\5\u00a3R\2\u0324\u0321\3\2\2\2\u0324"+ "\3\2\2\2\u0323\u0321\3\2\2\2\u0323\u0324\3\2\2\2\u0324\u00a2\3\2\2\2\u0325"+
"\u0322\3\2\2\2\u0324\u0323\3\2\2\2\u0325\u00a2\3\2\2\2\u0326\u0327\7\62"+ "\u0329\5\u00a7T\2\u0326\u0329\5\u00a9U\2\u0327\u0329\5\u00a5S\2\u0328"+
"\2\2\u0327\u0329\t\4\2\2\u0328\u032a\5\u00a9U\2\u0329\u0328\3\2\2\2\u032a"+ "\u0325\3\2\2\2\u0328\u0326\3\2\2\2\u0328\u0327\3\2\2\2\u0329\u00a4\3\2"+
"\u032b\3\2\2\2\u032b\u0329\3\2\2\2\u032b\u032c\3\2\2\2\u032c\u0334\3\2"+ "\2\2\u032a\u032b\7\62\2\2\u032b\u032d\t\4\2\2\u032c\u032e\5\u00abV\2\u032d"+
"\2\2\u032d\u032f\7\'\2\2\u032e\u0330\5\u00a9U\2\u032f\u032e\3\2\2\2\u0330"+ "\u032c\3\2\2\2\u032e\u032f\3\2\2\2\u032f\u032d\3\2\2\2\u032f\u0330\3\2"+
"\u0331\3\2\2\2\u0331\u032f\3\2\2\2\u0331\u0332\3\2\2\2\u0332\u0334\3\2"+ "\2\2\u0330\u0338\3\2\2\2\u0331\u0333\7\'\2\2\u0332\u0334\5\u00abV\2\u0333"+
"\2\2\u0333\u0326\3\2\2\2\u0333\u032d\3\2\2\2\u0334\u00a4\3\2\2\2\u0335"+ "\u0332\3\2\2\2\u0334\u0335\3\2\2\2\u0335\u0333\3\2\2\2\u0335\u0336\3\2"+
"\u0337\5\u00abV\2\u0336\u0335\3\2\2\2\u0337\u0338\3\2\2\2\u0338\u0336"+ "\2\2\u0336\u0338\3\2\2\2\u0337\u032a\3\2\2\2\u0337\u0331\3\2\2\2\u0338"+
"\3\2\2\2\u0338\u0339\3\2\2\2\u0339\u00a6\3\2\2\2\u033a\u0340\7&\2\2\u033b"+ "\u00a6\3\2\2\2\u0339\u033b\5\u00adW\2\u033a\u0339\3\2\2\2\u033b\u033c"+
"\u033c\7\62\2\2\u033c\u0340\7z\2\2\u033d\u033e\7\62\2\2\u033e\u0340\7"+ "\3\2\2\2\u033c\u033a\3\2\2\2\u033c\u033d\3\2\2\2\u033d\u00a8\3\2\2\2\u033e"+
"Z\2\2\u033f\u033a\3\2\2\2\u033f\u033b\3\2\2\2\u033f\u033d\3\2\2\2\u0340"+ "\u0344\7&\2\2\u033f\u0340\7\62\2\2\u0340\u0344\7z\2\2\u0341\u0342\7\62"+
"\u0342\3\2\2\2\u0341\u0343\5\u00adW\2\u0342\u0341\3\2\2\2\u0343\u0344"+ "\2\2\u0342\u0344\7Z\2\2\u0343\u033e\3\2\2\2\u0343\u033f\3\2\2\2\u0343"+
"\3\2\2\2\u0344\u0342\3\2\2\2\u0344\u0345\3\2\2\2\u0345\u00a8\3\2\2\2\u0346"+ "\u0341\3\2\2\2\u0344\u0346\3\2\2\2\u0345\u0347\5\u00afX\2\u0346\u0345"+
"\u0347\t\5\2\2\u0347\u00aa\3\2\2\2\u0348\u0349\t\6\2\2\u0349\u00ac\3\2"+ "\3\2\2\2\u0347\u0348\3\2\2\2\u0348\u0346\3\2\2\2\u0348\u0349\3\2\2\2\u0349"+
"\2\2\u034a\u034b\t\7\2\2\u034b\u00ae\3\2\2\2\u034c\u0350\5\u00b1Y\2\u034d"+ "\u00aa\3\2\2\2\u034a\u034b\t\5\2\2\u034b\u00ac\3\2\2\2\u034c\u034d\t\6"+
"\u034f\5\u00b3Z\2\u034e\u034d\3\2\2\2\u034f\u0352\3\2\2\2\u0350\u034e"+ "\2\2\u034d\u00ae\3\2\2\2\u034e\u034f\t\7\2\2\u034f\u00b0\3\2\2\2\u0350"+
"\3\2\2\2\u0350\u0351\3\2\2\2\u0351\u00b0\3\2\2\2\u0352\u0350\3\2\2\2\u0353"+ "\u0354\5\u00b3Z\2\u0351\u0353\5\u00b5[\2\u0352\u0351\3\2\2\2\u0353\u0356"+
"\u0354\t\b\2\2\u0354\u00b2\3\2\2\2\u0355\u0356\t\t\2\2\u0356\u00b4\3\2"+ "\3\2\2\2\u0354\u0352\3\2\2\2\u0354\u0355\3\2\2\2\u0355\u00b2\3\2\2\2\u0356"+
"\2\2\u0357\u035b\7#\2\2\u0358\u035a\5\u00b3Z\2\u0359\u0358\3\2\2\2\u035a"+ "\u0354\3\2\2\2\u0357\u0358\t\b\2\2\u0358\u00b4\3\2\2\2\u0359\u035a\t\t"+
"\u035d\3\2\2\2\u035b\u0359\3\2\2\2\u035b\u035c\3\2\2\2\u035c\u035f\3\2"+ "\2\2\u035a\u00b6\3\2\2\2\u035b\u035f\7#\2\2\u035c\u035e\5\u00b5[\2\u035d"+
"\2\2\u035d\u035b\3\2\2\2\u035e\u0360\t\n\2\2\u035f\u035e\3\2\2\2\u0360"+ "\u035c\3\2\2\2\u035e\u0361\3\2\2\2\u035f\u035d\3\2\2\2\u035f\u0360\3\2"+
"\u0361\3\2\2\2\u0361\u035f\3\2\2\2\u0361\u0362\3\2\2\2\u0362\u00b6\3\2"+ "\2\2\u0360\u0363\3\2\2\2\u0361\u035f\3\2\2\2\u0362\u0364\t\n\2\2\u0363"+
"\2\2\u0363\u0365\t\13\2\2\u0364\u0363\3\2\2\2\u0365\u0366\3\2\2\2\u0366"+ "\u0362\3\2\2\2\u0364\u0365\3\2\2\2\u0365\u0363\3\2\2\2\u0365\u0366\3\2"+
"\u0364\3\2\2\2\u0366\u0367\3\2\2\2\u0367\u0368\3\2\2\2\u0368\u0369\b\\"+ "\2\2\u0366\u00b8\3\2\2\2\u0367\u0369\t\13\2\2\u0368\u0367\3\2\2\2\u0369"+
"\2\2\u0369\u00b8\3\2\2\2\u036a\u036b\7\61\2\2\u036b\u036c\7\61\2\2\u036c"+ "\u036a\3\2\2\2\u036a\u0368\3\2\2\2\u036a\u036b\3\2\2\2\u036b\u036c\3\2"+
"\u0370\3\2\2\2\u036d\u036f\n\f\2\2\u036e\u036d\3\2\2\2\u036f\u0372\3\2"+ "\2\2\u036c\u036d\b]\2\2\u036d\u00ba\3\2\2\2\u036e\u036f\7\61\2\2\u036f"+
"\2\2\u0370\u036e\3\2\2\2\u0370\u0371\3\2\2\2\u0371\u0373\3\2\2\2\u0372"+ "\u0370\7\61\2\2\u0370\u0374\3\2\2\2\u0371\u0373\n\f\2\2\u0372\u0371\3"+
"\u0370\3\2\2\2\u0373\u0374\b]\2\2\u0374\u00ba\3\2\2\2\u0375\u0376\7\61"+ "\2\2\2\u0373\u0376\3\2\2\2\u0374\u0372\3\2\2\2\u0374\u0375\3\2\2\2\u0375"+
"\2\2\u0376\u0377\7,\2\2\u0377\u037b\3\2\2\2\u0378\u037a\13\2\2\2\u0379"+ "\u0377\3\2\2\2\u0376\u0374\3\2\2\2\u0377\u0378\b^\2\2\u0378\u00bc\3\2"+
"\u0378\3\2\2\2\u037a\u037d\3\2\2\2\u037b\u037c\3\2\2\2\u037b\u0379\3\2"+ "\2\2\u0379\u037a\7\61\2\2\u037a\u037b\7,\2\2\u037b\u037f\3\2\2\2\u037c"+
"\2\2\u037c\u037e\3\2\2\2\u037d\u037b\3\2\2\2\u037e\u037f\7,\2\2\u037f"+ "\u037e\13\2\2\2\u037d\u037c\3\2\2\2\u037e\u0381\3\2\2\2\u037f\u0380\3"+
"\u0380\7\61\2\2\u0380\u0381\3\2\2\2\u0381\u0382\b^\2\2\u0382\u00bc\3\2"+ "\2\2\2\u037f\u037d\3\2\2\2\u0380\u0382\3\2\2\2\u0381\u037f\3\2\2\2\u0382"+
"\2\2!\2\u02a3\u02ab\u02c6\u02cc\u02ce\u02d7\u02e4\u02e8\u02ed\u02f4\u02f9"+ "\u0383\7,\2\2\u0383\u0384\7\61\2\2\u0384\u0385\3\2\2\2\u0385\u0386\b_"+
"\u0300\u0305\u030c\u0313\u0318\u031f\u0324\u032b\u0331\u0333\u0338\u033f"+ "\2\2\u0386\u00be\3\2\2\2!\2\u02a7\u02af\u02ca\u02d0\u02d2\u02db\u02e8"+
"\u0344\u0350\u035b\u0361\u0366\u0370\u037b\3\b\2\2"; "\u02ec\u02f1\u02f8\u02fd\u0304\u0309\u0310\u0317\u031c\u0323\u0328\u032f"+
"\u0335\u0337\u033c\u0343\u0348\u0354\u035f\u0365\u036a\u0374\u037f\3\b"+
"\2\2";
public static final ATN _ATN = public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray()); new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static { static {

View File

@ -66,26 +66,27 @@ T__64=65
T__65=66 T__65=66
T__66=67 T__66=67
T__67=68 T__67=68
MNEMONIC=69 T__68=69
KICKASM=70 MNEMONIC=70
SIMPLETYPE=71 KICKASM=71
STRING=72 SIMPLETYPE=72
CHAR=73 STRING=73
BOOLEAN=74 CHAR=74
NUMBER=75 BOOLEAN=75
NUMFLOAT=76 NUMBER=76
BINFLOAT=77 NUMFLOAT=77
DECFLOAT=78 BINFLOAT=78
HEXFLOAT=79 DECFLOAT=79
NUMINT=80 HEXFLOAT=80
BININTEGER=81 NUMINT=81
DECINTEGER=82 BININTEGER=82
HEXINTEGER=83 DECINTEGER=83
NAME=84 HEXINTEGER=84
ASMREL=85 NAME=85
WS=86 ASMREL=86
COMMENT_LINE=87 WS=87
COMMENT_BLOCK=88 COMMENT_LINE=88
COMMENT_BLOCK=89
'import'=1 'import'=1
'='=2 '='=2
';'=3 ';'=3
@ -154,3 +155,4 @@ COMMENT_BLOCK=88
'^='=66 '^='=66
'.byte'=67 '.byte'=67
'#'=68 '#'=68
'.'=69

View File

@ -26,10 +26,10 @@ public class KickCParser extends Parser {
T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52, T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52,
T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59, T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66, T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
T__66=67, T__67=68, MNEMONIC=69, KICKASM=70, SIMPLETYPE=71, STRING=72, T__66=67, T__67=68, T__68=69, MNEMONIC=70, KICKASM=71, SIMPLETYPE=72,
CHAR=73, BOOLEAN=74, NUMBER=75, NUMFLOAT=76, BINFLOAT=77, DECFLOAT=78, STRING=73, CHAR=74, BOOLEAN=75, NUMBER=76, NUMFLOAT=77, BINFLOAT=78, DECFLOAT=79,
HEXFLOAT=79, NUMINT=80, BININTEGER=81, DECINTEGER=82, HEXINTEGER=83, NAME=84, HEXFLOAT=80, NUMINT=81, BININTEGER=82, DECINTEGER=83, HEXINTEGER=84, NAME=85,
ASMREL=85, WS=86, COMMENT_LINE=87, COMMENT_BLOCK=88; ASMREL=86, WS=87, COMMENT_LINE=88, COMMENT_BLOCK=89;
public static final int public static final int
RULE_file = 0, RULE_asmFile = 1, RULE_importSeq = 2, RULE_importDecl = 3, RULE_file = 0, RULE_asmFile = 1, RULE_importSeq = 2, RULE_importDecl = 3,
RULE_declSeq = 4, RULE_decl = 5, RULE_declVariable = 6, RULE_declFunction = 7, RULE_declSeq = 4, RULE_decl = 5, RULE_declVariable = 6, RULE_declFunction = 7,
@ -56,7 +56,7 @@ public class KickCParser extends Parser {
"'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'", "'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'",
"'=='", "'!='", "'<='", "'>='", "'^'", "'|'", "'&&'", "'||'", "'+='", "'=='", "'!='", "'<='", "'>='", "'^'", "'|'", "'&&'", "'||'", "'+='",
"'-='", "'*='", "'/='", "'%='", "'<<='", "'>>='", "'&='", "'|='", "'^='", "'-='", "'*='", "'/='", "'%='", "'<<='", "'>>='", "'&='", "'|='", "'^='",
"'.byte'", "'#'" "'.byte'", "'#'", "'.'"
}; };
private static final String[] _SYMBOLIC_NAMES = { private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
@ -64,10 +64,10 @@ public class KickCParser extends Parser {
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, "MNEMONIC", "KICKASM", null, null, null, null, null, null, null, null, null, null, "MNEMONIC",
"SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT", "KICKASM", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT",
"DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER",
"NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK" "HEXINTEGER", "NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
}; };
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -644,7 +644,7 @@ public class KickCParser extends Parser {
setState(123); setState(123);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__31) | (1L << T__32) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__46) | (1L << T__47))) != 0) || ((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (SIMPLETYPE - 71)) | (1L << (STRING - 71)) | (1L << (CHAR - 71)) | (1L << (BOOLEAN - 71)) | (1L << (NUMBER - 71)) | (1L << (NAME - 71)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__31) | (1L << T__32) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__46) | (1L << T__47))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (SIMPLETYPE - 72)) | (1L << (STRING - 72)) | (1L << (CHAR - 72)) | (1L << (BOOLEAN - 72)) | (1L << (NUMBER - 72)) | (1L << (NAME - 72)))) != 0)) {
{ {
setState(122); setState(122);
stmtSeq(); stmtSeq();
@ -1456,7 +1456,7 @@ public class KickCParser extends Parser {
setState(209); setState(209);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__31) | (1L << T__32) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__46) | (1L << T__47))) != 0) || ((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (SIMPLETYPE - 71)) | (1L << (STRING - 71)) | (1L << (CHAR - 71)) | (1L << (BOOLEAN - 71)) | (1L << (NUMBER - 71)) | (1L << (NAME - 71)))) != 0) ); } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__31) | (1L << T__32) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__46) | (1L << T__47))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (SIMPLETYPE - 72)) | (1L << (STRING - 72)) | (1L << (CHAR - 72)) | (1L << (BOOLEAN - 72)) | (1L << (NUMBER - 72)) | (1L << (NAME - 72)))) != 0) );
} }
} }
catch (RecognitionException re) { catch (RecognitionException re) {
@ -1733,7 +1733,7 @@ public class KickCParser extends Parser {
setState(214); setState(214);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__31) | (1L << T__32) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__46) | (1L << T__47))) != 0) || ((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (SIMPLETYPE - 71)) | (1L << (STRING - 71)) | (1L << (CHAR - 71)) | (1L << (BOOLEAN - 71)) | (1L << (NUMBER - 71)) | (1L << (NAME - 71)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__31) | (1L << T__32) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__46) | (1L << T__47))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (SIMPLETYPE - 72)) | (1L << (STRING - 72)) | (1L << (CHAR - 72)) | (1L << (BOOLEAN - 72)) | (1L << (NUMBER - 72)) | (1L << (NAME - 72)))) != 0)) {
{ {
setState(213); setState(213);
stmtSeq(); stmtSeq();
@ -1895,7 +1895,7 @@ public class KickCParser extends Parser {
setState(272); setState(272);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__32) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__46) | (1L << T__47))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (STRING - 72)) | (1L << (CHAR - 72)) | (1L << (BOOLEAN - 72)) | (1L << (NUMBER - 72)) | (1L << (NAME - 72)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__32) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__46) | (1L << T__47))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (STRING - 73)) | (1L << (CHAR - 73)) | (1L << (BOOLEAN - 73)) | (1L << (NUMBER - 73)) | (1L << (NAME - 73)))) != 0)) {
{ {
setState(271); setState(271);
expr(0); expr(0);
@ -2380,7 +2380,7 @@ public class KickCParser extends Parser {
setState(330); setState(330);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__32) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__46) | (1L << T__47))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (STRING - 72)) | (1L << (CHAR - 72)) | (1L << (BOOLEAN - 72)) | (1L << (NUMBER - 72)) | (1L << (NAME - 72)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__32) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__46) | (1L << T__47))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (STRING - 73)) | (1L << (CHAR - 73)) | (1L << (BOOLEAN - 73)) | (1L << (NUMBER - 73)) | (1L << (NAME - 73)))) != 0)) {
{ {
setState(329); setState(329);
expr(0); expr(0);
@ -2812,7 +2812,7 @@ public class KickCParser extends Parser {
setState(349); setState(349);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__32) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__46) | (1L << T__47))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (STRING - 72)) | (1L << (CHAR - 72)) | (1L << (BOOLEAN - 72)) | (1L << (NUMBER - 72)) | (1L << (NAME - 72)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__32) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__46) | (1L << T__47))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (STRING - 73)) | (1L << (CHAR - 73)) | (1L << (BOOLEAN - 73)) | (1L << (NUMBER - 73)) | (1L << (NAME - 73)))) != 0)) {
{ {
setState(348); setState(348);
parameterList(); parameterList();
@ -4132,7 +4132,7 @@ public class KickCParser extends Parser {
throw new NoViableAltException(this); throw new NoViableAltException(this);
} }
_ctx.stop = _input.LT(-1); _ctx.stop = _input.LT(-1);
setState(521); setState(524);
_errHandler.sync(this); _errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,52,_ctx); _alt = getInterpreter().adaptivePredict(_input,52,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
@ -4140,7 +4140,7 @@ public class KickCParser extends Parser {
if ( _parseListeners!=null ) triggerExitRuleEvent(); if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx; _prevctx = _localctx;
{ {
setState(519); setState(522);
_errHandler.sync(this); _errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) {
case 1: case 1:
@ -4148,8 +4148,22 @@ public class KickCParser extends Parser {
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
setState(510); setState(510);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
{
setState(511); setState(511);
match(T__68);
}
setState(512);
asmExpr(11);
}
break;
case 2:
{
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
setState(513);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
setState(514);
_la = _input.LA(1); _la = _input.LA(1);
if ( !(_la==T__42 || _la==T__43) ) { if ( !(_la==T__42 || _la==T__43) ) {
_errHandler.recoverInline(this); _errHandler.recoverInline(this);
@ -4159,17 +4173,17 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this); _errHandler.reportMatch(this);
consume(); consume();
} }
setState(512); setState(515);
asmExpr(10); asmExpr(10);
} }
break; break;
case 2: case 3:
{ {
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
setState(513); setState(516);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
setState(514); setState(517);
_la = _input.LA(1); _la = _input.LA(1);
if ( !(_la==T__32 || _la==T__44) ) { if ( !(_la==T__32 || _la==T__44) ) {
_errHandler.recoverInline(this); _errHandler.recoverInline(this);
@ -4179,17 +4193,17 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this); _errHandler.reportMatch(this);
consume(); consume();
} }
setState(515); setState(518);
asmExpr(8); asmExpr(8);
} }
break; break;
case 3: case 4:
{ {
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
setState(516); setState(519);
if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
setState(517); setState(520);
_la = _input.LA(1); _la = _input.LA(1);
if ( !(_la==T__37 || _la==T__38) ) { if ( !(_la==T__37 || _la==T__38) ) {
_errHandler.recoverInline(this); _errHandler.recoverInline(this);
@ -4199,14 +4213,14 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this); _errHandler.reportMatch(this);
consume(); consume();
} }
setState(518); setState(521);
asmExpr(7); asmExpr(7);
} }
break; break;
} }
} }
} }
setState(523); setState(526);
_errHandler.sync(this); _errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,52,_ctx); _alt = getInterpreter().adaptivePredict(_input,52,_ctx);
} }
@ -4279,17 +4293,19 @@ public class KickCParser extends Parser {
private boolean asmExpr_sempred(AsmExprContext _localctx, int predIndex) { private boolean asmExpr_sempred(AsmExprContext _localctx, int predIndex) {
switch (predIndex) { switch (predIndex) {
case 16: case 16:
return precpred(_ctx, 9); return precpred(_ctx, 10);
case 17: case 17:
return precpred(_ctx, 7); return precpred(_ctx, 9);
case 18: case 18:
return precpred(_ctx, 7);
case 19:
return precpred(_ctx, 6); return precpred(_ctx, 6);
} }
return true; return true;
} }
public static final String _serializedATN = public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3Z\u020f\4\2\t\2\4"+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3[\u0212\4\2\t\2\4"+
"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+ "\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@ -4330,170 +4346,172 @@ public class KickCParser extends Parser {
"\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3"+ "\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3"+
"\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01ef\n\34\3\35\3\35\3\35"+ "\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01ef\n\34\3\35\3\35\3\35"+
"\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u01ff\n\35"+ "\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u01ff\n\35"+
"\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\7\35\u020a\n\35\f\35\16"+ "\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\7\35\u020d"+
"\35\u020d\13\35\3\35\2\5&(8\36\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36"+ "\n\35\f\35\16\35\u0210\13\35\3\35\2\5&(8\36\2\4\6\b\n\f\16\20\22\24\26"+
" \"$&(*,.\60\62\64\668\2\f\3\2&\'\3\2(,\3\2\61\62\3\2-.\4\2##/\60\3\2"+ "\30\32\34\36 \"$&(*,.\60\62\64\668\2\f\3\2&\'\3\2(,\3\2\61\62\3\2-.\4"+
"()\3\2\61\66\3\2;D\4\2()\61\62\4\2##//\2\u025c\2:\3\2\2\2\4>\3\2\2\2\6"+ "\2##/\60\3\2()\3\2\61\66\3\2;D\4\2()\61\62\4\2##//\2\u0260\2:\3\2\2\2"+
"D\3\2\2\2\bG\3\2\2\2\nK\3\2\2\2\fR\3\2\2\2\16W\3\2\2\2\20k\3\2\2\2\22"+ "\4>\3\2\2\2\6D\3\2\2\2\bG\3\2\2\2\nK\3\2\2\2\fR\3\2\2\2\16W\3\2\2\2\20"+
"\u0081\3\2\2\2\24\u0087\3\2\2\2\26\u00a3\3\2\2\2\30\u00a5\3\2\2\2\32\u00b0"+ "k\3\2\2\2\22\u0081\3\2\2\2\24\u0087\3\2\2\2\26\u00a3\3\2\2\2\30\u00a5"+
"\3\2\2\2\34\u00ce\3\2\2\2\36\u00d1\3\2\2\2 \u011b\3\2\2\2\"\u0120\3\2"+ "\3\2\2\2\32\u00b0\3\2\2\2\34\u00ce\3\2\2\2\36\u00d1\3\2\2\2 \u011b\3\2"+
"\2\2$\u013b\3\2\2\2&\u0145\3\2\2\2(\u017f\3\2\2\2*\u01ae\3\2\2\2,\u01b9"+ "\2\2\"\u0120\3\2\2\2$\u013b\3\2\2\2&\u0145\3\2\2\2(\u017f\3\2\2\2*\u01ae"+
"\3\2\2\2.\u01bf\3\2\2\2\60\u01c8\3\2\2\2\62\u01ca\3\2\2\2\64\u01ce\3\2"+ "\3\2\2\2,\u01b9\3\2\2\2.\u01bf\3\2\2\2\60\u01c8\3\2\2\2\62\u01ca\3\2\2"+
"\2\2\66\u01ee\3\2\2\28\u01fe\3\2\2\2:;\5\6\4\2;<\5\n\6\2<=\7\2\2\3=\3"+ "\2\64\u01ce\3\2\2\2\66\u01ee\3\2\2\28\u01fe\3\2\2\2:;\5\6\4\2;<\5\n\6"+
"\3\2\2\2>?\5,\27\2?@\7\2\2\3@\5\3\2\2\2AC\5\b\5\2BA\3\2\2\2CF\3\2\2\2"+ "\2<=\7\2\2\3=\3\3\2\2\2>?\5,\27\2?@\7\2\2\3@\5\3\2\2\2AC\5\b\5\2BA\3\2"+
"DB\3\2\2\2DE\3\2\2\2E\7\3\2\2\2FD\3\2\2\2GH\7\3\2\2HI\7J\2\2I\t\3\2\2"+ "\2\2CF\3\2\2\2DB\3\2\2\2DE\3\2\2\2E\7\3\2\2\2FD\3\2\2\2GH\7\3\2\2HI\7"+
"\2JL\5\f\7\2KJ\3\2\2\2LM\3\2\2\2MK\3\2\2\2MN\3\2\2\2N\13\3\2\2\2OS\5\16"+ "K\2\2I\t\3\2\2\2JL\5\f\7\2KJ\3\2\2\2LM\3\2\2\2MK\3\2\2\2MN\3\2\2\2N\13"+
"\b\2PS\5\20\t\2QS\5\22\n\2RO\3\2\2\2RP\3\2\2\2RQ\3\2\2\2S\r\3\2\2\2TV"+ "\3\2\2\2OS\5\16\b\2PS\5\20\t\2QS\5\22\n\2RO\3\2\2\2RP\3\2\2\2RQ\3\2\2"+
"\5\34\17\2UT\3\2\2\2VY\3\2\2\2WU\3\2\2\2WX\3\2\2\2XZ\3\2\2\2YW\3\2\2\2"+ "\2S\r\3\2\2\2TV\5\34\17\2UT\3\2\2\2VY\3\2\2\2WU\3\2\2\2WX\3\2\2\2XZ\3"+
"Z^\5&\24\2[]\5\34\17\2\\[\3\2\2\2]`\3\2\2\2^\\\3\2\2\2^_\3\2\2\2_a\3\2"+ "\2\2\2YW\3\2\2\2Z^\5&\24\2[]\5\34\17\2\\[\3\2\2\2]`\3\2\2\2^\\\3\2\2\2"+
"\2\2`^\3\2\2\2ad\7V\2\2bc\7\4\2\2ce\5(\25\2db\3\2\2\2de\3\2\2\2ef\3\2"+ "^_\3\2\2\2_a\3\2\2\2`^\3\2\2\2ad\7W\2\2bc\7\4\2\2ce\5(\25\2db\3\2\2\2"+
"\2\2fg\7\5\2\2g\17\3\2\2\2hj\5\34\17\2ih\3\2\2\2jm\3\2\2\2ki\3\2\2\2k"+ "de\3\2\2\2ef\3\2\2\2fg\7\5\2\2g\17\3\2\2\2hj\5\34\17\2ih\3\2\2\2jm\3\2"+
"l\3\2\2\2ln\3\2\2\2mk\3\2\2\2nr\5&\24\2oq\5\34\17\2po\3\2\2\2qt\3\2\2"+ "\2\2ki\3\2\2\2kl\3\2\2\2ln\3\2\2\2mk\3\2\2\2nr\5&\24\2oq\5\34\17\2po\3"+
"\2rp\3\2\2\2rs\3\2\2\2su\3\2\2\2tr\3\2\2\2uv\7V\2\2vx\7\6\2\2wy\5\30\r"+ "\2\2\2qt\3\2\2\2rp\3\2\2\2rs\3\2\2\2su\3\2\2\2tr\3\2\2\2uv\7W\2\2vx\7"+
"\2xw\3\2\2\2xy\3\2\2\2yz\3\2\2\2z{\7\7\2\2{}\7\b\2\2|~\5\36\20\2}|\3\2"+ "\6\2\2wy\5\30\r\2xw\3\2\2\2xy\3\2\2\2yz\3\2\2\2z{\7\7\2\2{}\7\b\2\2|~"+
"\2\2}~\3\2\2\2~\177\3\2\2\2\177\u0080\7\t\2\2\u0080\21\3\2\2\2\u0081\u0083"+ "\5\36\20\2}|\3\2\2\2}~\3\2\2\2~\177\3\2\2\2\177\u0080\7\t\2\2\u0080\21"+
"\7\n\2\2\u0082\u0084\5\24\13\2\u0083\u0082\3\2\2\2\u0083\u0084\3\2\2\2"+ "\3\2\2\2\u0081\u0083\7\n\2\2\u0082\u0084\5\24\13\2\u0083\u0082\3\2\2\2"+
"\u0084\u0085\3\2\2\2\u0085\u0086\7H\2\2\u0086\23\3\2\2\2\u0087\u0088\7"+ "\u0083\u0084\3\2\2\2\u0084\u0085\3\2\2\2\u0085\u0086\7I\2\2\u0086\23\3"+
"\6\2\2\u0088\u008d\5\26\f\2\u0089\u008a\7\13\2\2\u008a\u008c\5\26\f\2"+ "\2\2\2\u0087\u0088\7\6\2\2\u0088\u008d\5\26\f\2\u0089\u008a\7\13\2\2\u008a"+
"\u008b\u0089\3\2\2\2\u008c\u008f\3\2\2\2\u008d\u008b\3\2\2\2\u008d\u008e"+ "\u008c\5\26\f\2\u008b\u0089\3\2\2\2\u008c\u008f\3\2\2\2\u008d\u008b\3"+
"\3\2\2\2\u008e\u0090\3\2\2\2\u008f\u008d\3\2\2\2\u0090\u0091\7\7\2\2\u0091"+ "\2\2\2\u008d\u008e\3\2\2\2\u008e\u0090\3\2\2\2\u008f\u008d\3\2\2\2\u0090"+
"\25\3\2\2\2\u0092\u0093\7\f\2\2\u0093\u00a4\7J\2\2\u0094\u0095\7\r\2\2"+ "\u0091\7\7\2\2\u0091\25\3\2\2\2\u0092\u0093\7\f\2\2\u0093\u00a4\7K\2\2"+
"\u0095\u00a4\7V\2\2\u0096\u0097\7\16\2\2\u0097\u0098\7V\2\2\u0098\u0099"+ "\u0094\u0095\7\r\2\2\u0095\u00a4\7W\2\2\u0096\u0097\7\16\2\2\u0097\u0098"+
"\7\17\2\2\u0099\u00a4\5(\25\2\u009a\u009b\7\20\2\2\u009b\u00a4\5(\25\2"+ "\7W\2\2\u0098\u0099\7\17\2\2\u0099\u00a4\5(\25\2\u009a\u009b\7\20\2\2"+
"\u009c\u009d\7\21\2\2\u009d\u00a4\5(\25\2\u009e\u00a1\7\22\2\2\u009f\u00a2"+ "\u009b\u00a4\5(\25\2\u009c\u009d\7\21\2\2\u009d\u00a4\5(\25\2\u009e\u00a1"+
"\7\23\2\2\u00a0\u00a2\5(\25\2\u00a1\u009f\3\2\2\2\u00a1\u00a0\3\2\2\2"+ "\7\22\2\2\u009f\u00a2\7\23\2\2\u00a0\u00a2\5(\25\2\u00a1\u009f\3\2\2\2"+
"\u00a2\u00a4\3\2\2\2\u00a3\u0092\3\2\2\2\u00a3\u0094\3\2\2\2\u00a3\u0096"+ "\u00a1\u00a0\3\2\2\2\u00a2\u00a4\3\2\2\2\u00a3\u0092\3\2\2\2\u00a3\u0094"+
"\3\2\2\2\u00a3\u009a\3\2\2\2\u00a3\u009c\3\2\2\2\u00a3\u009e\3\2\2\2\u00a4"+ "\3\2\2\2\u00a3\u0096\3\2\2\2\u00a3\u009a\3\2\2\2\u00a3\u009c\3\2\2\2\u00a3"+
"\27\3\2\2\2\u00a5\u00aa\5\32\16\2\u00a6\u00a7\7\13\2\2\u00a7\u00a9\5\32"+ "\u009e\3\2\2\2\u00a4\27\3\2\2\2\u00a5\u00aa\5\32\16\2\u00a6\u00a7\7\13"+
"\16\2\u00a8\u00a6\3\2\2\2\u00a9\u00ac\3\2\2\2\u00aa\u00a8\3\2\2\2\u00aa"+ "\2\2\u00a7\u00a9\5\32\16\2\u00a8\u00a6\3\2\2\2\u00a9\u00ac\3\2\2\2\u00aa"+
"\u00ab\3\2\2\2\u00ab\31\3\2\2\2\u00ac\u00aa\3\2\2\2\u00ad\u00af\5\34\17"+ "\u00a8\3\2\2\2\u00aa\u00ab\3\2\2\2\u00ab\31\3\2\2\2\u00ac\u00aa\3\2\2"+
"\2\u00ae\u00ad\3\2\2\2\u00af\u00b2\3\2\2\2\u00b0\u00ae\3\2\2\2\u00b0\u00b1"+ "\2\u00ad\u00af\5\34\17\2\u00ae\u00ad\3\2\2\2\u00af\u00b2\3\2\2\2\u00b0"+
"\3\2\2\2\u00b1\u00b3\3\2\2\2\u00b2\u00b0\3\2\2\2\u00b3\u00b7\5&\24\2\u00b4"+ "\u00ae\3\2\2\2\u00b0\u00b1\3\2\2\2\u00b1\u00b3\3\2\2\2\u00b2\u00b0\3\2"+
"\u00b6\5\34\17\2\u00b5\u00b4\3\2\2\2\u00b6\u00b9\3\2\2\2\u00b7\u00b5\3"+ "\2\2\u00b3\u00b7\5&\24\2\u00b4\u00b6\5\34\17\2\u00b5\u00b4\3\2\2\2\u00b6"+
"\2\2\2\u00b7\u00b8\3\2\2\2\u00b8\u00ba\3\2\2\2\u00b9\u00b7\3\2\2\2\u00ba"+ "\u00b9\3\2\2\2\u00b7\u00b5\3\2\2\2\u00b7\u00b8\3\2\2\2\u00b8\u00ba\3\2"+
"\u00bb\7V\2\2\u00bb\33\3\2\2\2\u00bc\u00cf\7\24\2\2\u00bd\u00cf\7\25\2"+ "\2\2\u00b9\u00b7\3\2\2\2\u00ba\u00bb\7W\2\2\u00bb\33\3\2\2\2\u00bc\u00cf"+
"\2\u00be\u00bf\7\26\2\2\u00bf\u00c0\7\6\2\2\u00c0\u00c1\7M\2\2\u00c1\u00cf"+ "\7\24\2\2\u00bd\u00cf\7\25\2\2\u00be\u00bf\7\26\2\2\u00bf\u00c0\7\6\2"+
"\7\7\2\2\u00c2\u00c3\7\27\2\2\u00c3\u00c4\7\6\2\2\u00c4\u00c5\7V\2\2\u00c5"+ "\2\u00c0\u00c1\7N\2\2\u00c1\u00cf\7\7\2\2\u00c2\u00c3\7\27\2\2\u00c3\u00c4"+
"\u00cf\7\7\2\2\u00c6\u00cf\7\23\2\2\u00c7\u00cf\7\30\2\2\u00c8\u00cc\7"+ "\7\6\2\2\u00c4\u00c5\7W\2\2\u00c5\u00cf\7\7\2\2\u00c6\u00cf\7\23\2\2\u00c7"+
"\31\2\2\u00c9\u00ca\7\6\2\2\u00ca\u00cb\7V\2\2\u00cb\u00cd\7\7\2\2\u00cc"+ "\u00cf\7\30\2\2\u00c8\u00cc\7\31\2\2\u00c9\u00ca\7\6\2\2\u00ca\u00cb\7"+
"\u00c9\3\2\2\2\u00cc\u00cd\3\2\2\2\u00cd\u00cf\3\2\2\2\u00ce\u00bc\3\2"+ "W\2\2\u00cb\u00cd\7\7\2\2\u00cc\u00c9\3\2\2\2\u00cc\u00cd\3\2\2\2\u00cd"+
"\2\2\u00ce\u00bd\3\2\2\2\u00ce\u00be\3\2\2\2\u00ce\u00c2\3\2\2\2\u00ce"+ "\u00cf\3\2\2\2\u00ce\u00bc\3\2\2\2\u00ce\u00bd\3\2\2\2\u00ce\u00be\3\2"+
"\u00c6\3\2\2\2\u00ce\u00c7\3\2\2\2\u00ce\u00c8\3\2\2\2\u00cf\35\3\2\2"+ "\2\2\u00ce\u00c2\3\2\2\2\u00ce\u00c6\3\2\2\2\u00ce\u00c7\3\2\2\2\u00ce"+
"\2\u00d0\u00d2\5 \21\2\u00d1\u00d0\3\2\2\2\u00d2\u00d3\3\2\2\2\u00d3\u00d1"+ "\u00c8\3\2\2\2\u00cf\35\3\2\2\2\u00d0\u00d2\5 \21\2\u00d1\u00d0\3\2\2"+
"\3\2\2\2\u00d3\u00d4\3\2\2\2\u00d4\37\3\2\2\2\u00d5\u011c\5\16\b\2\u00d6"+ "\2\u00d2\u00d3\3\2\2\2\u00d3\u00d1\3\2\2\2\u00d3\u00d4\3\2\2\2\u00d4\37"+
"\u00d8\7\b\2\2\u00d7\u00d9\5\36\20\2\u00d8\u00d7\3\2\2\2\u00d8\u00d9\3"+ "\3\2\2\2\u00d5\u011c\5\16\b\2\u00d6\u00d8\7\b\2\2\u00d7\u00d9\5\36\20"+
"\2\2\2\u00d9\u00da\3\2\2\2\u00da\u011c\7\t\2\2\u00db\u00dc\5(\25\2\u00dc"+ "\2\u00d8\u00d7\3\2\2\2\u00d8\u00d9\3\2\2\2\u00d9\u00da\3\2\2\2\u00da\u011c"+
"\u00dd\7\5\2\2\u00dd\u011c\3\2\2\2\u00de\u00df\7\32\2\2\u00df\u00e0\7"+ "\7\t\2\2\u00db\u00dc\5(\25\2\u00dc\u00dd\7\5\2\2\u00dd\u011c\3\2\2\2\u00de"+
"\6\2\2\u00e0\u00e1\5(\25\2\u00e1\u00e2\7\7\2\2\u00e2\u00e5\5 \21\2\u00e3"+ "\u00df\7\32\2\2\u00df\u00e0\7\6\2\2\u00e0\u00e1\5(\25\2\u00e1\u00e2\7"+
"\u00e4\7\33\2\2\u00e4\u00e6\5 \21\2\u00e5\u00e3\3\2\2\2\u00e5\u00e6\3"+ "\7\2\2\u00e2\u00e5\5 \21\2\u00e3\u00e4\7\33\2\2\u00e4\u00e6\5 \21\2\u00e5"+
"\2\2\2\u00e6\u011c\3\2\2\2\u00e7\u00e9\5\34\17\2\u00e8\u00e7\3\2\2\2\u00e9"+ "\u00e3\3\2\2\2\u00e5\u00e6\3\2\2\2\u00e6\u011c\3\2\2\2\u00e7\u00e9\5\34"+
"\u00ec\3\2\2\2\u00ea\u00e8\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb\u00ed\3\2"+ "\17\2\u00e8\u00e7\3\2\2\2\u00e9\u00ec\3\2\2\2\u00ea\u00e8\3\2\2\2\u00ea"+
"\2\2\u00ec\u00ea\3\2\2\2\u00ed\u00ee\7\34\2\2\u00ee\u00ef\7\6\2\2\u00ef"+ "\u00eb\3\2\2\2\u00eb\u00ed\3\2\2\2\u00ec\u00ea\3\2\2\2\u00ed\u00ee\7\34"+
"\u00f0\5(\25\2\u00f0\u00f1\7\7\2\2\u00f1\u00f2\5 \21\2\u00f2\u011c\3\2"+ "\2\2\u00ee\u00ef\7\6\2\2\u00ef\u00f0\5(\25\2\u00f0\u00f1\7\7\2\2\u00f1"+
"\2\2\u00f3\u00f5\5\34\17\2\u00f4\u00f3\3\2\2\2\u00f5\u00f8\3\2\2\2\u00f6"+ "\u00f2\5 \21\2\u00f2\u011c\3\2\2\2\u00f3\u00f5\5\34\17\2\u00f4\u00f3\3"+
"\u00f4\3\2\2\2\u00f6\u00f7\3\2\2\2\u00f7\u00f9\3\2\2\2\u00f8\u00f6\3\2"+ "\2\2\2\u00f5\u00f8\3\2\2\2\u00f6\u00f4\3\2\2\2\u00f6\u00f7\3\2\2\2\u00f7"+
"\2\2\u00f9\u00fa\7\35\2\2\u00fa\u00fb\5 \21\2\u00fb\u00fc\7\34\2\2\u00fc"+ "\u00f9\3\2\2\2\u00f8\u00f6\3\2\2\2\u00f9\u00fa\7\35\2\2\u00fa\u00fb\5"+
"\u00fd\7\6\2\2\u00fd\u00fe\5(\25\2\u00fe\u00ff\7\7\2\2\u00ff\u0100\7\5"+ " \21\2\u00fb\u00fc\7\34\2\2\u00fc\u00fd\7\6\2\2\u00fd\u00fe\5(\25\2\u00fe"+
"\2\2\u0100\u011c\3\2\2\2\u0101\u0103\5\34\17\2\u0102\u0101\3\2\2\2\u0103"+ "\u00ff\7\7\2\2\u00ff\u0100\7\5\2\2\u0100\u011c\3\2\2\2\u0101\u0103\5\34"+
"\u0106\3\2\2\2\u0104\u0102\3\2\2\2\u0104\u0105\3\2\2\2\u0105\u0107\3\2"+ "\17\2\u0102\u0101\3\2\2\2\u0103\u0106\3\2\2\2\u0104\u0102\3\2\2\2\u0104"+
"\2\2\u0106\u0104\3\2\2\2\u0107\u0108\7\36\2\2\u0108\u010a\7\6\2\2\u0109"+ "\u0105\3\2\2\2\u0105\u0107\3\2\2\2\u0106\u0104\3\2\2\2\u0107\u0108\7\36"+
"\u010b\5\"\22\2\u010a\u0109\3\2\2\2\u010a\u010b\3\2\2\2\u010b\u010c\3"+ "\2\2\u0108\u010a\7\6\2\2\u0109\u010b\5\"\22\2\u010a\u0109\3\2\2\2\u010a"+
"\2\2\2\u010c\u010d\5$\23\2\u010d\u010e\7\7\2\2\u010e\u010f\5 \21\2\u010f"+ "\u010b\3\2\2\2\u010b\u010c\3\2\2\2\u010c\u010d\5$\23\2\u010d\u010e\7\7"+
"\u011c\3\2\2\2\u0110\u0112\7\37\2\2\u0111\u0113\5(\25\2\u0112\u0111\3"+ "\2\2\u010e\u010f\5 \21\2\u010f\u011c\3\2\2\2\u0110\u0112\7\37\2\2\u0111"+
"\2\2\2\u0112\u0113\3\2\2\2\u0113\u0114\3\2\2\2\u0114\u011c\7\5\2\2\u0115"+ "\u0113\5(\25\2\u0112\u0111\3\2\2\2\u0112\u0113\3\2\2\2\u0113\u0114\3\2"+
"\u0116\7 \2\2\u0116\u0117\7\b\2\2\u0117\u0118\5,\27\2\u0118\u0119\7\t"+ "\2\2\u0114\u011c\7\5\2\2\u0115\u0116\7 \2\2\u0116\u0117\7\b\2\2\u0117"+
"\2\2\u0119\u011c\3\2\2\2\u011a\u011c\5\22\n\2\u011b\u00d5\3\2\2\2\u011b"+ "\u0118\5,\27\2\u0118\u0119\7\t\2\2\u0119\u011c\3\2\2\2\u011a\u011c\5\22"+
"\u00d6\3\2\2\2\u011b\u00db\3\2\2\2\u011b\u00de\3\2\2\2\u011b\u00ea\3\2"+ "\n\2\u011b\u00d5\3\2\2\2\u011b\u00d6\3\2\2\2\u011b\u00db\3\2\2\2\u011b"+
"\2\2\u011b\u00f6\3\2\2\2\u011b\u0104\3\2\2\2\u011b\u0110\3\2\2\2\u011b"+ "\u00de\3\2\2\2\u011b\u00ea\3\2\2\2\u011b\u00f6\3\2\2\2\u011b\u0104\3\2"+
"\u0115\3\2\2\2\u011b\u011a\3\2\2\2\u011c!\3\2\2\2\u011d\u011f\5\34\17"+ "\2\2\u011b\u0110\3\2\2\2\u011b\u0115\3\2\2\2\u011b\u011a\3\2\2\2\u011c"+
"\2\u011e\u011d\3\2\2\2\u011f\u0122\3\2\2\2\u0120\u011e\3\2\2\2\u0120\u0121"+ "!\3\2\2\2\u011d\u011f\5\34\17\2\u011e\u011d\3\2\2\2\u011f\u0122\3\2\2"+
"\3\2\2\2\u0121\u0124\3\2\2\2\u0122\u0120\3\2\2\2\u0123\u0125\5&\24\2\u0124"+ "\2\u0120\u011e\3\2\2\2\u0120\u0121\3\2\2\2\u0121\u0124\3\2\2\2\u0122\u0120"+
"\u0123\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u0129\3\2\2\2\u0126\u0128\5\34"+ "\3\2\2\2\u0123\u0125\5&\24\2\u0124\u0123\3\2\2\2\u0124\u0125\3\2\2\2\u0125"+
"\17\2\u0127\u0126\3\2\2\2\u0128\u012b\3\2\2\2\u0129\u0127\3\2\2\2\u0129"+ "\u0129\3\2\2\2\u0126\u0128\5\34\17\2\u0127\u0126\3\2\2\2\u0128\u012b\3"+
"\u012a\3\2\2\2\u012a\u012c\3\2\2\2\u012b\u0129\3\2\2\2\u012c\u012f\7V"+ "\2\2\2\u0129\u0127\3\2\2\2\u0129\u012a\3\2\2\2\u012a\u012c\3\2\2\2\u012b"+
"\2\2\u012d\u012e\7\4\2\2\u012e\u0130\5(\25\2\u012f\u012d\3\2\2\2\u012f"+ "\u0129\3\2\2\2\u012c\u012f\7W\2\2\u012d\u012e\7\4\2\2\u012e\u0130\5(\25"+
"\u0130\3\2\2\2\u0130#\3\2\2\2\u0131\u0132\7\5\2\2\u0132\u0133\5(\25\2"+ "\2\u012f\u012d\3\2\2\2\u012f\u0130\3\2\2\2\u0130#\3\2\2\2\u0131\u0132"+
"\u0133\u0134\7\5\2\2\u0134\u0135\5(\25\2\u0135\u013c\3\2\2\2\u0136\u0137"+ "\7\5\2\2\u0132\u0133\5(\25\2\u0133\u0134\7\5\2\2\u0134\u0135\5(\25\2\u0135"+
"\7\17\2\2\u0137\u0138\5(\25\2\u0138\u0139\7!\2\2\u0139\u013a\5(\25\2\u013a"+ "\u013c\3\2\2\2\u0136\u0137\7\17\2\2\u0137\u0138\5(\25\2\u0138\u0139\7"+
"\u013c\3\2\2\2\u013b\u0131\3\2\2\2\u013b\u0136\3\2\2\2\u013c%\3\2\2\2"+ "!\2\2\u0139\u013a\5(\25\2\u013a\u013c\3\2\2\2\u013b\u0131\3\2\2\2\u013b"+
"\u013d\u013e\b\24\1\2\u013e\u013f\7\6\2\2\u013f\u0140\5&\24\2\u0140\u0141"+ "\u0136\3\2\2\2\u013c%\3\2\2\2\u013d\u013e\b\24\1\2\u013e\u013f\7\6\2\2"+
"\7\7\2\2\u0141\u0146\3\2\2\2\u0142\u0146\7I\2\2\u0143\u0144\7\"\2\2\u0144"+ "\u013f\u0140\5&\24\2\u0140\u0141\7\7\2\2\u0141\u0146\3\2\2\2\u0142\u0146"+
"\u0146\7I\2\2\u0145\u013d\3\2\2\2\u0145\u0142\3\2\2\2\u0145\u0143\3\2"+ "\7J\2\2\u0143\u0144\7\"\2\2\u0144\u0146\7J\2\2\u0145\u013d\3\2\2\2\u0145"+
"\2\2\u0146\u0154\3\2\2\2\u0147\u0148\f\5\2\2\u0148\u0153\7#\2\2\u0149"+ "\u0142\3\2\2\2\u0145\u0143\3\2\2\2\u0146\u0154\3\2\2\2\u0147\u0148\f\5"+
"\u014a\f\4\2\2\u014a\u014c\7$\2\2\u014b\u014d\5(\25\2\u014c\u014b\3\2"+ "\2\2\u0148\u0153\7#\2\2\u0149\u014a\f\4\2\2\u014a\u014c\7$\2\2\u014b\u014d"+
"\2\2\u014c\u014d\3\2\2\2\u014d\u014e\3\2\2\2\u014e\u0153\7%\2\2\u014f"+ "\5(\25\2\u014c\u014b\3\2\2\2\u014c\u014d\3\2\2\2\u014d\u014e\3\2\2\2\u014e"+
"\u0150\f\3\2\2\u0150\u0151\7\6\2\2\u0151\u0153\7\7\2\2\u0152\u0147\3\2"+ "\u0153\7%\2\2\u014f\u0150\f\3\2\2\u0150\u0151\7\6\2\2\u0151\u0153\7\7"+
"\2\2\u0152\u0149\3\2\2\2\u0152\u014f\3\2\2\2\u0153\u0156\3\2\2\2\u0154"+ "\2\2\u0152\u0147\3\2\2\2\u0152\u0149\3\2\2\2\u0152\u014f\3\2\2\2\u0153"+
"\u0152\3\2\2\2\u0154\u0155\3\2\2\2\u0155\'\3\2\2\2\u0156\u0154\3\2\2\2"+ "\u0156\3\2\2\2\u0154\u0152\3\2\2\2\u0154\u0155\3\2\2\2\u0155\'\3\2\2\2"+
"\u0157\u0158\b\25\1\2\u0158\u0159\7\6\2\2\u0159\u015a\5(\25\2\u015a\u015b"+ "\u0156\u0154\3\2\2\2\u0157\u0158\b\25\1\2\u0158\u0159\7\6\2\2\u0159\u015a"+
"\7\7\2\2\u015b\u0180\3\2\2\2\u015c\u015d\7V\2\2\u015d\u015f\7\6\2\2\u015e"+ "\5(\25\2\u015a\u015b\7\7\2\2\u015b\u0180\3\2\2\2\u015c\u015d\7W\2\2\u015d"+
"\u0160\5*\26\2\u015f\u015e\3\2\2\2\u015f\u0160\3\2\2\2\u0160\u0161\3\2"+ "\u015f\7\6\2\2\u015e\u0160\5*\26\2\u015f\u015e\3\2\2\2\u015f\u0160\3\2"+
"\2\2\u0161\u0180\7\7\2\2\u0162\u0163\7\6\2\2\u0163\u0164\5&\24\2\u0164"+ "\2\2\u0160\u0161\3\2\2\2\u0161\u0180\7\7\2\2\u0162\u0163\7\6\2\2\u0163"+
"\u0165\7\7\2\2\u0165\u0166\5(\25\31\u0166\u0180\3\2\2\2\u0167\u0168\t"+ "\u0164\5&\24\2\u0164\u0165\7\7\2\2\u0165\u0166\5(\25\31\u0166\u0180\3"+
"\2\2\2\u0168\u0180\5(\25\30\u0169\u016a\7#\2\2\u016a\u0180\5(\25\26\u016b"+ "\2\2\2\u0167\u0168\t\2\2\2\u0168\u0180\5(\25\30\u0169\u016a\7#\2\2\u016a"+
"\u016c\t\3\2\2\u016c\u0180\5(\25\25\u016d\u016e\t\4\2\2\u016e\u0180\5"+ "\u0180\5(\25\26\u016b\u016c\t\3\2\2\u016c\u0180\5(\25\25\u016d\u016e\t"+
"(\25\21\u016f\u0170\7\b\2\2\u0170\u0175\5(\25\2\u0171\u0172\7\13\2\2\u0172"+ "\4\2\2\u016e\u0180\5(\25\21\u016f\u0170\7\b\2\2\u0170\u0175\5(\25\2\u0171"+
"\u0174\5(\25\2\u0173\u0171\3\2\2\2\u0174\u0177\3\2\2\2\u0175\u0173\3\2"+ "\u0172\7\13\2\2\u0172\u0174\5(\25\2\u0173\u0171\3\2\2\2\u0174\u0177\3"+
"\2\2\u0175\u0176\3\2\2\2\u0176\u0178\3\2\2\2\u0177\u0175\3\2\2\2\u0178"+ "\2\2\2\u0175\u0173\3\2\2\2\u0175\u0176\3\2\2\2\u0176\u0178\3\2\2\2\u0177"+
"\u0179\7\t\2\2\u0179\u0180\3\2\2\2\u017a\u0180\7V\2\2\u017b\u0180\7M\2"+ "\u0175\3\2\2\2\u0178\u0179\7\t\2\2\u0179\u0180\3\2\2\2\u017a\u0180\7W"+
"\2\u017c\u0180\7J\2\2\u017d\u0180\7K\2\2\u017e\u0180\7L\2\2\u017f\u0157"+ "\2\2\u017b\u0180\7N\2\2\u017c\u0180\7K\2\2\u017d\u0180\7L\2\2\u017e\u0180"+
"\3\2\2\2\u017f\u015c\3\2\2\2\u017f\u0162\3\2\2\2\u017f\u0167\3\2\2\2\u017f"+ "\7M\2\2\u017f\u0157\3\2\2\2\u017f\u015c\3\2\2\2\u017f\u0162\3\2\2\2\u017f"+
"\u0169\3\2\2\2\u017f\u016b\3\2\2\2\u017f\u016d\3\2\2\2\u017f\u016f\3\2"+ "\u0167\3\2\2\2\u017f\u0169\3\2\2\2\u017f\u016b\3\2\2\2\u017f\u016d\3\2"+
"\2\2\u017f\u017a\3\2\2\2\u017f\u017b\3\2\2\2\u017f\u017c\3\2\2\2\u017f"+ "\2\2\u017f\u016f\3\2\2\2\u017f\u017a\3\2\2\2\u017f\u017b\3\2\2\2\u017f"+
"\u017d\3\2\2\2\u017f\u017e\3\2\2\2\u0180\u01ab\3\2\2\2\u0181\u0182\f\24"+ "\u017c\3\2\2\2\u017f\u017d\3\2\2\2\u017f\u017e\3\2\2\2\u0180\u01ab\3\2"+
"\2\2\u0182\u0183\t\5\2\2\u0183\u01aa\5(\25\25\u0184\u0185\f\23\2\2\u0185"+ "\2\2\u0181\u0182\f\24\2\2\u0182\u0183\t\5\2\2\u0183\u01aa\5(\25\25\u0184"+
"\u0186\t\6\2\2\u0186\u01aa\5(\25\24\u0187\u0188\f\22\2\2\u0188\u0189\t"+ "\u0185\f\23\2\2\u0185\u0186\t\6\2\2\u0186\u01aa\5(\25\24\u0187\u0188\f"+
"\7\2\2\u0189\u01aa\5(\25\23\u018a\u018b\f\20\2\2\u018b\u018c\t\b\2\2\u018c"+ "\22\2\2\u0188\u0189\t\7\2\2\u0189\u01aa\5(\25\23\u018a\u018b\f\20\2\2"+
"\u01aa\5(\25\21\u018d\u018e\f\17\2\2\u018e\u018f\7+\2\2\u018f\u01aa\5"+ "\u018b\u018c\t\b\2\2\u018c\u01aa\5(\25\21\u018d\u018e\f\17\2\2\u018e\u018f"+
"(\25\20\u0190\u0191\f\16\2\2\u0191\u0192\7\67\2\2\u0192\u01aa\5(\25\17"+ "\7+\2\2\u018f\u01aa\5(\25\20\u0190\u0191\f\16\2\2\u0191\u0192\7\67\2\2"+
"\u0193\u0194\f\r\2\2\u0194\u0195\78\2\2\u0195\u01aa\5(\25\16\u0196\u0197"+ "\u0192\u01aa\5(\25\17\u0193\u0194\f\r\2\2\u0194\u0195\78\2\2\u0195\u01aa"+
"\f\f\2\2\u0197\u0198\79\2\2\u0198\u01aa\5(\25\r\u0199\u019a\f\13\2\2\u019a"+ "\5(\25\16\u0196\u0197\f\f\2\2\u0197\u0198\79\2\2\u0198\u01aa\5(\25\r\u0199"+
"\u019b\7:\2\2\u019b\u01aa\5(\25\f\u019c\u019d\f\n\2\2\u019d\u019e\7\4"+ "\u019a\f\13\2\2\u019a\u019b\7:\2\2\u019b\u01aa\5(\25\f\u019c\u019d\f\n"+
"\2\2\u019e\u01aa\5(\25\n\u019f\u01a0\f\t\2\2\u01a0\u01a1\t\t\2\2\u01a1"+ "\2\2\u019d\u019e\7\4\2\2\u019e\u01aa\5(\25\n\u019f\u01a0\f\t\2\2\u01a0"+
"\u01aa\5(\25\t\u01a2\u01a3\f\32\2\2\u01a3\u01a4\7$\2\2\u01a4\u01a5\5("+ "\u01a1\t\t\2\2\u01a1\u01aa\5(\25\t\u01a2\u01a3\f\32\2\2\u01a3\u01a4\7"+
"\25\2\u01a5\u01a6\7%\2\2\u01a6\u01aa\3\2\2\2\u01a7\u01a8\f\27\2\2\u01a8"+ "$\2\2\u01a4\u01a5\5(\25\2\u01a5\u01a6\7%\2\2\u01a6\u01aa\3\2\2\2\u01a7"+
"\u01aa\t\2\2\2\u01a9\u0181\3\2\2\2\u01a9\u0184\3\2\2\2\u01a9\u0187\3\2"+ "\u01a8\f\27\2\2\u01a8\u01aa\t\2\2\2\u01a9\u0181\3\2\2\2\u01a9\u0184\3"+
"\2\2\u01a9\u018a\3\2\2\2\u01a9\u018d\3\2\2\2\u01a9\u0190\3\2\2\2\u01a9"+ "\2\2\2\u01a9\u0187\3\2\2\2\u01a9\u018a\3\2\2\2\u01a9\u018d\3\2\2\2\u01a9"+
"\u0193\3\2\2\2\u01a9\u0196\3\2\2\2\u01a9\u0199\3\2\2\2\u01a9\u019c\3\2"+ "\u0190\3\2\2\2\u01a9\u0193\3\2\2\2\u01a9\u0196\3\2\2\2\u01a9\u0199\3\2"+
"\2\2\u01a9\u019f\3\2\2\2\u01a9\u01a2\3\2\2\2\u01a9\u01a7\3\2\2\2\u01aa"+ "\2\2\u01a9\u019c\3\2\2\2\u01a9\u019f\3\2\2\2\u01a9\u01a2\3\2\2\2\u01a9"+
"\u01ad\3\2\2\2\u01ab\u01a9\3\2\2\2\u01ab\u01ac\3\2\2\2\u01ac)\3\2\2\2"+ "\u01a7\3\2\2\2\u01aa\u01ad\3\2\2\2\u01ab\u01a9\3\2\2\2\u01ab\u01ac\3\2"+
"\u01ad\u01ab\3\2\2\2\u01ae\u01b3\5(\25\2\u01af\u01b0\7\13\2\2\u01b0\u01b2"+ "\2\2\u01ac)\3\2\2\2\u01ad\u01ab\3\2\2\2\u01ae\u01b3\5(\25\2\u01af\u01b0"+
"\5(\25\2\u01b1\u01af\3\2\2\2\u01b2\u01b5\3\2\2\2\u01b3\u01b1\3\2\2\2\u01b3"+ "\7\13\2\2\u01b0\u01b2\5(\25\2\u01b1\u01af\3\2\2\2\u01b2\u01b5\3\2\2\2"+
"\u01b4\3\2\2\2\u01b4+\3\2\2\2\u01b5\u01b3\3\2\2\2\u01b6\u01b8\5.\30\2"+ "\u01b3\u01b1\3\2\2\2\u01b3\u01b4\3\2\2\2\u01b4+\3\2\2\2\u01b5\u01b3\3"+
"\u01b7\u01b6\3\2\2\2\u01b8\u01bb\3\2\2\2\u01b9\u01b7\3\2\2\2\u01b9\u01ba"+ "\2\2\2\u01b6\u01b8\5.\30\2\u01b7\u01b6\3\2\2\2\u01b8\u01bb\3\2\2\2\u01b9"+
"\3\2\2\2\u01ba-\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bc\u01c0\5\60\31\2\u01bd"+ "\u01b7\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba-\3\2\2\2\u01bb\u01b9\3\2\2\2"+
"\u01c0\5\62\32\2\u01be\u01c0\5\64\33\2\u01bf\u01bc\3\2\2\2\u01bf\u01bd"+ "\u01bc\u01c0\5\60\31\2\u01bd\u01c0\5\62\32\2\u01be\u01c0\5\64\33\2\u01bf"+
"\3\2\2\2\u01bf\u01be\3\2\2\2\u01c0/\3\2\2\2\u01c1\u01c2\7V\2\2\u01c2\u01c9"+ "\u01bc\3\2\2\2\u01bf\u01bd\3\2\2\2\u01bf\u01be\3\2\2\2\u01c0/\3\2\2\2"+
"\7\17\2\2\u01c3\u01c5\7*\2\2\u01c4\u01c6\7V\2\2\u01c5\u01c4\3\2\2\2\u01c5"+ "\u01c1\u01c2\7W\2\2\u01c2\u01c9\7\17\2\2\u01c3\u01c5\7*\2\2\u01c4\u01c6"+
"\u01c6\3\2\2\2\u01c6\u01c7\3\2\2\2\u01c7\u01c9\7\17\2\2\u01c8\u01c1\3"+ "\7W\2\2\u01c5\u01c4\3\2\2\2\u01c5\u01c6\3\2\2\2\u01c6\u01c7\3\2\2\2\u01c7"+
"\2\2\2\u01c8\u01c3\3\2\2\2\u01c9\61\3\2\2\2\u01ca\u01cc\7G\2\2\u01cb\u01cd"+ "\u01c9\7\17\2\2\u01c8\u01c1\3\2\2\2\u01c8\u01c3\3\2\2\2\u01c9\61\3\2\2"+
"\5\66\34\2\u01cc\u01cb\3\2\2\2\u01cc\u01cd\3\2\2\2\u01cd\63\3\2\2\2\u01ce"+ "\2\u01ca\u01cc\7H\2\2\u01cb\u01cd\5\66\34\2\u01cc\u01cb\3\2\2\2\u01cc"+
"\u01cf\7E\2\2\u01cf\u01d4\58\35\2\u01d0\u01d1\7\13\2\2\u01d1\u01d3\58"+ "\u01cd\3\2\2\2\u01cd\63\3\2\2\2\u01ce\u01cf\7E\2\2\u01cf\u01d4\58\35\2"+
"\35\2\u01d2\u01d0\3\2\2\2\u01d3\u01d6\3\2\2\2\u01d4\u01d2\3\2\2\2\u01d4"+ "\u01d0\u01d1\7\13\2\2\u01d1\u01d3\58\35\2\u01d2\u01d0\3\2\2\2\u01d3\u01d6"+
"\u01d5\3\2\2\2\u01d5\65\3\2\2\2\u01d6\u01d4\3\2\2\2\u01d7\u01ef\58\35"+ "\3\2\2\2\u01d4\u01d2\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5\65\3\2\2\2\u01d6"+
"\2\u01d8\u01d9\7F\2\2\u01d9\u01ef\58\35\2\u01da\u01db\58\35\2\u01db\u01dc"+ "\u01d4\3\2\2\2\u01d7\u01ef\58\35\2\u01d8\u01d9\7F\2\2\u01d9\u01ef\58\35"+
"\7\13\2\2\u01dc\u01dd\7V\2\2\u01dd\u01ef\3\2\2\2\u01de\u01df\7\6\2\2\u01df"+ "\2\u01da\u01db\58\35\2\u01db\u01dc\7\13\2\2\u01dc\u01dd\7W\2\2\u01dd\u01ef"+
"\u01e0\58\35\2\u01e0\u01e1\7\7\2\2\u01e1\u01e2\7\13\2\2\u01e2\u01e3\7"+ "\3\2\2\2\u01de\u01df\7\6\2\2\u01df\u01e0\58\35\2\u01e0\u01e1\7\7\2\2\u01e1"+
"V\2\2\u01e3\u01ef\3\2\2\2\u01e4\u01e5\7\6\2\2\u01e5\u01e6\58\35\2\u01e6"+ "\u01e2\7\13\2\2\u01e2\u01e3\7W\2\2\u01e3\u01ef\3\2\2\2\u01e4\u01e5\7\6"+
"\u01e7\7\13\2\2\u01e7\u01e8\7V\2\2\u01e8\u01e9\7\7\2\2\u01e9\u01ef\3\2"+ "\2\2\u01e5\u01e6\58\35\2\u01e6\u01e7\7\13\2\2\u01e7\u01e8\7W\2\2\u01e8"+
"\2\2\u01ea\u01eb\7\6\2\2\u01eb\u01ec\58\35\2\u01ec\u01ed\7\7\2\2\u01ed"+ "\u01e9\7\7\2\2\u01e9\u01ef\3\2\2\2\u01ea\u01eb\7\6\2\2\u01eb\u01ec\58"+
"\u01ef\3\2\2\2\u01ee\u01d7\3\2\2\2\u01ee\u01d8\3\2\2\2\u01ee\u01da\3\2"+ "\35\2\u01ec\u01ed\7\7\2\2\u01ed\u01ef\3\2\2\2\u01ee\u01d7\3\2\2\2\u01ee"+
"\2\2\u01ee\u01de\3\2\2\2\u01ee\u01e4\3\2\2\2\u01ee\u01ea\3\2\2\2\u01ef"+ "\u01d8\3\2\2\2\u01ee\u01da\3\2\2\2\u01ee\u01de\3\2\2\2\u01ee\u01e4\3\2"+
"\67\3\2\2\2\u01f0\u01f1\b\35\1\2\u01f1\u01f2\7$\2\2\u01f2\u01f3\58\35"+ "\2\2\u01ee\u01ea\3\2\2\2\u01ef\67\3\2\2\2\u01f0\u01f1\b\35\1\2\u01f1\u01f2"+
"\2\u01f3\u01f4\7%\2\2\u01f4\u01ff\3\2\2\2\u01f5\u01f6\t\n\2\2\u01f6\u01ff"+ "\7$\2\2\u01f2\u01f3\58\35\2\u01f3\u01f4\7%\2\2\u01f4\u01ff\3\2\2\2\u01f5"+
"\58\35\n\u01f7\u01ff\7V\2\2\u01f8\u01ff\7W\2\2\u01f9\u01fa\7\b\2\2\u01fa"+ "\u01f6\t\n\2\2\u01f6\u01ff\58\35\n\u01f7\u01ff\7W\2\2\u01f8\u01ff\7X\2"+
"\u01fb\7V\2\2\u01fb\u01ff\7\t\2\2\u01fc\u01ff\7M\2\2\u01fd\u01ff\7K\2"+ "\2\u01f9\u01fa\7\b\2\2\u01fa\u01fb\7W\2\2\u01fb\u01ff\7\t\2\2\u01fc\u01ff"+
"\2\u01fe\u01f0\3\2\2\2\u01fe\u01f5\3\2\2\2\u01fe\u01f7\3\2\2\2\u01fe\u01f8"+ "\7N\2\2\u01fd\u01ff\7L\2\2\u01fe\u01f0\3\2\2\2\u01fe\u01f5\3\2\2\2\u01fe"+
"\3\2\2\2\u01fe\u01f9\3\2\2\2\u01fe\u01fc\3\2\2\2\u01fe\u01fd\3\2\2\2\u01ff"+ "\u01f7\3\2\2\2\u01fe\u01f8\3\2\2\2\u01fe\u01f9\3\2\2\2\u01fe\u01fc\3\2"+
"\u020b\3\2\2\2\u0200\u0201\f\13\2\2\u0201\u0202\t\5\2\2\u0202\u020a\5"+ "\2\2\u01fe\u01fd\3\2\2\2\u01ff\u020e\3\2\2\2\u0200\u0201\f\f\2\2\u0201"+
"8\35\f\u0203\u0204\f\t\2\2\u0204\u0205\t\13\2\2\u0205\u020a\58\35\n\u0206"+ "\u0202\7G\2\2\u0202\u020d\58\35\r\u0203\u0204\f\13\2\2\u0204\u0205\t\5"+
"\u0207\f\b\2\2\u0207\u0208\t\7\2\2\u0208\u020a\58\35\t\u0209\u0200\3\2"+ "\2\2\u0205\u020d\58\35\f\u0206\u0207\f\t\2\2\u0207\u0208\t\13\2\2\u0208"+
"\2\2\u0209\u0203\3\2\2\2\u0209\u0206\3\2\2\2\u020a\u020d\3\2\2\2\u020b"+ "\u020d\58\35\n\u0209\u020a\f\b\2\2\u020a\u020b\t\7\2\2\u020b\u020d\58"+
"\u0209\3\2\2\2\u020b\u020c\3\2\2\2\u020c9\3\2\2\2\u020d\u020b\3\2\2\2"+ "\35\t\u020c\u0200\3\2\2\2\u020c\u0203\3\2\2\2\u020c\u0206\3\2\2\2\u020c"+
"\67DMRW^dkrx}\u0083\u008d\u00a1\u00a3\u00aa\u00b0\u00b7\u00cc\u00ce\u00d3"+ "\u0209\3\2\2\2\u020d\u0210\3\2\2\2\u020e\u020c\3\2\2\2\u020e\u020f\3\2"+
"\u00d8\u00e5\u00ea\u00f6\u0104\u010a\u0112\u011b\u0120\u0124\u0129\u012f"+ "\2\2\u020f9\3\2\2\2\u0210\u020e\3\2\2\2\67DMRW^dkrx}\u0083\u008d\u00a1"+
"\u013b\u0145\u014c\u0152\u0154\u015f\u0175\u017f\u01a9\u01ab\u01b3\u01b9"+ "\u00a3\u00aa\u00b0\u00b7\u00cc\u00ce\u00d3\u00d8\u00e5\u00ea\u00f6\u0104"+
"\u01bf\u01c5\u01c8\u01cc\u01d4\u01ee\u01fe\u0209\u020b"; "\u010a\u0112\u011b\u0120\u0124\u0129\u012f\u013b\u0145\u014c\u0152\u0154"+
"\u015f\u0175\u017f\u01a9\u01ab\u01b3\u01b9\u01bf\u01c5\u01c8\u01cc\u01d4"+
"\u01ee\u01fe\u020c\u020e";
public static final ATN _ATN = public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray()); new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static { static {

View File

@ -48,7 +48,7 @@ void mulf_init() {
// Fast multiply two unsigned bytes to a word result // Fast multiply two unsigned bytes to a word result
// Done in assembler to utilize fast addition A+X // Done in assembler to utilize fast addition A+X
word mulf8u(byte a, byte b) { word mulf8u_old(byte a, byte b) {
const byte* memA = $fe; const byte* memA = $fe;
const byte* memB = $ff; const byte* memB = $ff;
*memA = a; *memA = a;
@ -76,9 +76,77 @@ word mulf8u(byte a, byte b) {
return { *memB, *memA }; return { *memB, *memA };
} }
// Prepare for fast multiply with an unsigned byte to a word result
void mulf8u_prepare(byte a) {
const byte* memA = $fd;
*memA = a;
asm {
lda memA
sta mulf8u_prepared.sm1+1
sta mulf8u_prepared.sm3+1
eor #$ff
sta mulf8u_prepared.sm2+1
sta mulf8u_prepared.sm4+1
}
}
// Calculate fast multiply with a prepared unsigned byte to a word result
// The prepared number is set by calling mulf8u_prepare(byte a)
word mulf8u_prepared(byte b) {
const byte* resL = $fe;
const byte* memB = $ff;
*memB = b;
asm {
ldx memB
sec
sm1:
lda mulf_sqr1_lo,x
sm2:
sbc mulf_sqr2_lo,x
sta resL
sm3:
lda mulf_sqr1_hi,x
sm4:
sbc mulf_sqr2_hi,x
sta memB
}
return { *memB, *resL };
}
// Fast multiply two unsigned bytes to a word result
word mulf8u(byte a, byte b) {
mulf8u_prepare(a);
return mulf8u_prepared(b);
}
// Prepare for fast multiply with an signed byte to a word result
inline void mulf8s_prepare(signed byte a) {
mulf8u_prepare((byte)a);
}
// Calculate fast multiply with a prepared unsigned byte to a word result
// The prepared number is set by calling mulf8s_prepare(byte a)
signed word mulf8s_prepared(signed byte b) {
const signed byte* memA = $fd;
word m = mulf8u_prepared((byte) b);
if(*memA<0) {
>m = (>m)-(byte)b;
}
if(b<0) {
>m = (>m)-(byte)*memA;
}
return (signed word)m;
}
// Fast multiply two signed bytes to a word result
signed word mulf8s(signed byte a, signed byte b) {
mulf8s_prepare(a);
return mulf8s_prepared(b);
}
// Fast multiply of two signed bytes to a signed word // Fast multiply of two signed bytes to a signed word
// Fixes offsets introduced by using unsigned multiplication // Fixes offsets introduced by using unsigned multiplication
signed word mulf8s(signed byte a, signed byte b) { signed word mulf8s_old(signed byte a, signed byte b) {
word m = mulf8u((byte)a, (byte) b); word m = mulf8u((byte)a, (byte) b);
if(a<0) { if(a<0) {
>m = (>m)-(byte)b; >m = (>m)-(byte)b;

View File

@ -44,6 +44,11 @@ public class TestPrograms {
AsmFragmentTemplateUsages.logUsages(log, false, false, false, false, false, false); AsmFragmentTemplateUsages.logUsages(log, false, false, false, false, false, false);
} }
@Test
public void testRotate() throws IOException, URISyntaxException {
compileAndCompare("examples/rotate/rotate");
}
@Test @Test
public void testInfLoopError() throws IOException, URISyntaxException { public void testInfLoopError() throws IOException, URISyntaxException {
compileAndCompare("infloop-error"); compileAndCompare("infloop-error");

View File

@ -8,10 +8,8 @@ import "fastmultiply"
byte* SCREEN = $0400; byte* SCREEN = $0400;
byte* SPRITE = $3000; byte* SPRITE = $3000;
byte* COS_LO = $2000; byte* COS = $2000;
byte* COS_HI = $2200; byte* SIN = COS+$40; // sin(x) = cos(x+PI/2)
byte* SIN_LO = COS_LO+$40; // sin(x) = cos(x+PI/2)
byte* SIN_HI = COS_HI+$40; // sin(x) = cos(x+PI/2)
void main() { void main() {
asm { sei } asm { sei }
@ -46,10 +44,17 @@ void anim() {
while(true) { while(true) {
while(*RASTER!=$ff) {} while(*RASTER!=$ff) {}
(*BORDERCOL)++; (*BORDERCOL)++;
signed byte sin_a = (signed byte) SIN_HI[angle]; // signed fixed[0.7]
signed byte cos_a = (signed byte) COS_HI[angle]; // signed fixed[0.7] signed byte cos_a = (signed byte) COS[angle]; // signed fixed[0.7]
signed word xr = mulf8s(cos_a, x)<<1 - mulf8s(sin_a, y)<<1; // signed fixed[8.8] mulf8s_prepare(cos_a);
signed word yr = mulf8s(cos_a, y)<<1 + mulf8s(sin_a, x)<<1; // signed fixed[8.8] signed word xr = mulf8s_prepared(x)<<1; // signed fixed[8.8]
signed word yr = mulf8s_prepared(y)<<1; // signed fixed[8.8]
signed byte sin_a = (signed byte) SIN[angle]; // signed fixed[0.7]
mulf8s_prepare(sin_a);
xr -= mulf8s_prepared(y)<<1; // signed fixed[8.8]
yr += mulf8s_prepared(x)<<1; // signed fixed[8.8]
signed word xpos = ((signed byte) >xr) + 89 + 24 + 60; signed word xpos = ((signed byte) >xr) + 89 + 24 + 60;
signed word ypos = ((signed byte) >yr) + 89 + 51; signed word ypos = ((signed byte) >yr) + 89 + 51;
SPRITES_XPOS[0] = <xpos; SPRITES_XPOS[0] = <xpos;
@ -60,19 +65,7 @@ void anim() {
} }
} }
kickasm(pc COS_LO) {{ kickasm(pc COS) {{
{
.var min = -$7fff
.var max = $7fff
.var ampl = max-min;
.for(var i=0;i<$140;i++) {
.var rad = i*2*PI/256;
.byte <round(min+(ampl/2)+(ampl/2)*cos(rad))
}
}
}}
kickasm(pc COS_HI) {{
{ {
.var min = -$7fff .var min = -$7fff
.var max = $7fff .var max = $7fff

View File

@ -0,0 +1,343 @@
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
.label SPRITES_XPOS = $d000
.label SPRITES_YPOS = $d001
.label SPRITES_XMSB = $d010
.label RASTER = $d012
.label SPRITES_ENABLE = $d015
.label BORDERCOL = $d020
.label SPRITES_COLS = $d027
.const GREEN = 5
.label SCREEN = $400
.label SPRITE = $3000
.label COS = $2000
.label SIN = COS+$40
jsr main
main: {
sei
jsr init
jsr anim
rts
}
anim: {
.const x = $59
.const y = 0
.label _4 = 5
.label _6 = 7
.label _10 = 3
.label _11 = 3
.label _12 = 3
.label _13 = 3
.label xr = 5
.label yr = 7
.label xpos = 3
.label ypos = 5
ldy #0
b4:
lda RASTER
cmp #$ff
bne b4
inc BORDERCOL
lda COS,y
jsr mulf8u_prepare
lda #x
sta mulf8s_prepared.b
jsr mulf8s_prepared
lda mulf8s_prepared.return
sta _4
lda mulf8s_prepared.return+1
sta _4+1
asl xr
rol xr+1
lda #y
sta mulf8s_prepared.b
jsr mulf8s_prepared
lda mulf8s_prepared.return
sta _6
lda mulf8s_prepared.return+1
sta _6+1
asl yr
rol yr+1
lda SIN,y
jsr mulf8u_prepare
lda #y
sta mulf8s_prepared.b
jsr mulf8s_prepared
asl _11
rol _11+1
lda xr
sec
sbc _11
sta xr
lda xr+1
sbc _11+1
sta xr+1
lda #x
sta mulf8s_prepared.b
jsr mulf8s_prepared
asl _13
rol _13+1
lda yr
clc
adc _13
sta yr
lda yr+1
adc _13+1
sta yr+1
lda xr+1
sta xpos
ora #$7f
bmi !+
lda #0
!:
sta xpos+1
lda xpos
clc
adc #$59+$18+$3c
sta xpos
lda xpos+1
adc #0
sta xpos+1
lda yr+1
sta ypos
ora #$7f
bmi !+
lda #0
!:
sta ypos+1
lda ypos
clc
adc #$59+$33
sta ypos
lda ypos+1
adc #0
sta ypos+1
lda xpos
sta SPRITES_XPOS
lda xpos+1
sta SPRITES_XMSB
lda ypos
sta SPRITES_YPOS
iny
dec BORDERCOL
jmp b4
}
mulf8s_prepared: {
.label memA = $fd
.label m = 3
.label return = 3
.label b = 2
jsr mulf8u_prepared
lda memA
cmp #0
bpl b1
lda m+1
sec
sbc b
sta m+1
b1:
lda b
cmp #0
bpl b2
lda m+1
sec
sbc memA
sta m+1
b2:
rts
}
mulf8u_prepared: {
.label resL = $fe
.label memB = $ff
.label return = 3
lda mulf8s_prepared.b
sta memB
tax
sec
sm1:
lda mulf_sqr1_lo,x
sm2:
sbc mulf_sqr2_lo,x
sta resL
sm3:
lda mulf_sqr1_hi,x
sm4:
sbc mulf_sqr2_hi,x
sta memB
lda resL
sta return
lda memB
sta return+1
rts
}
mulf8u_prepare: {
.label memA = $fd
sta memA
sta mulf8u_prepared.sm1+1
sta mulf8u_prepared.sm3+1
eor #$ff
sta mulf8u_prepared.sm2+1
sta mulf8u_prepared.sm4+1
rts
}
init: {
.label sprites_ptr = SCREEN+$3f8
.label spr_x = 2
jsr mulf_init
lda #$ff
sta SPRITES_ENABLE
lda #$3c
sta spr_x
ldy #0
b1:
tya
asl
tax
lda #$ff&SPRITE/$40
sta sprites_ptr,y
lda spr_x
sta SPRITES_XPOS,x
sta SPRITES_YPOS,x
lda #GREEN
sta SPRITES_COLS,y
lda #$18
clc
adc spr_x
sta spr_x
iny
cpy #8
bne b1
rts
}
mulf_init: {
.label sqr1_hi = 5
.label sqr = 7
.label sqr1_lo = 3
.label x_2 = 2
.label sqr2_hi = 5
.label sqr2_lo = 3
.label dir = 2
lda #0
sta x_2
lda #<mulf_sqr1_hi+1
sta sqr1_hi
lda #>mulf_sqr1_hi+1
sta sqr1_hi+1
lda #<mulf_sqr1_lo+1
sta sqr1_lo
lda #>mulf_sqr1_lo+1
sta sqr1_lo+1
lda #<0
sta sqr
sta sqr+1
tax
b1:
inx
txa
and #1
cmp #0
bne b2
inc x_2
inc sqr
bne !+
inc sqr+1
!:
b2:
lda sqr
ldy #0
sta (sqr1_lo),y
lda sqr+1
sta (sqr1_hi),y
inc sqr1_hi
bne !+
inc sqr1_hi+1
!:
lda x_2
clc
adc sqr
sta sqr
lda #0
adc sqr+1
sta sqr+1
inc sqr1_lo
bne !+
inc sqr1_lo+1
!:
lda sqr1_lo+1
cmp #>mulf_sqr1_lo+$200
bne b1
lda sqr1_lo
cmp #<mulf_sqr1_lo+$200
bne b1
lda #$ff
sta dir
lda #<mulf_sqr2_hi
sta sqr2_hi
lda #>mulf_sqr2_hi
sta sqr2_hi+1
lda #<mulf_sqr2_lo
sta sqr2_lo
lda #>mulf_sqr2_lo
sta sqr2_lo+1
ldx #-1
b3:
lda mulf_sqr1_lo,x
ldy #0
sta (sqr2_lo),y
lda mulf_sqr1_hi,x
sta (sqr2_hi),y
inc sqr2_hi
bne !+
inc sqr2_hi+1
!:
txa
clc
adc dir
tax
cpx #0
bne b4
lda #1
sta dir
b4:
inc sqr2_lo
bne !+
inc sqr2_lo+1
!:
lda sqr2_lo+1
cmp #>mulf_sqr2_lo+$1ff
bne b3
lda sqr2_lo
cmp #<mulf_sqr2_lo+$1ff
bne b3
lda mulf_sqr1_lo+$100
sta mulf_sqr2_lo+$1ff
lda mulf_sqr1_hi+$100
sta mulf_sqr2_hi+$1ff
rts
}
.align $100
mulf_sqr1_lo: .fill $200, 0
.align $100
mulf_sqr1_hi: .fill $200, 0
.align $100
mulf_sqr2_lo: .fill $200, 0
.align $100
mulf_sqr2_hi: .fill $200, 0
.pc = COS "Inline"
{
.var min = -$7fff
.var max = $7fff
.var ampl = max-min;
.for(var i=0;i<$140;i++) {
.var rad = i*2*PI/256;
.byte >round(min+(ampl/2)+(ampl/2)*cos(rad))
}
}
.pc = SPRITE "Inline"
.var pic = LoadPicture("balloon.png", List().add($000000, $ffffff))
.for (var y=0; y<21; y++)
.for (var x=0;x<3; x++)
.byte pic.getSinglecolorByte(x,y)

View File

@ -0,0 +1,222 @@
@begin: scope:[] from
[0] phi() [ ] ( )
to:@17
@17: scope:[] from @begin
kickasm(location (const byte*) COS#0) {{ {
.var min = -$7fff
.var max = $7fff
.var ampl = max-min;
.for(var i=0;i<$140;i++) {
.var rad = i*2*PI/256;
.byte >round(min+(ampl/2)+(ampl/2)*cos(rad))
}
}
}}
kickasm(location (const byte*) SPRITE#0) {{ .var pic = LoadPicture("balloon.png", List().add($000000, $ffffff))
.for (var y=0; y<21; y++)
.for (var x=0;x<3; x++)
.byte pic.getSinglecolorByte(x,y)
}}
[3] call main [ ] ( )
to:@end
@end: scope:[] from @17
[4] phi() [ ] ( )
main: scope:[main] from @17
asm { sei }
[6] call init [ ] ( main:3 [ ] )
to:main::@1
main::@1: scope:[main] from main
[7] phi() [ ] ( main:3 [ ] )
[8] call anim [ ] ( main:3 [ ] )
to:main::@return
main::@return: scope:[main] from main::@1
[9] return [ ] ( main:3 [ ] )
to:@return
anim: scope:[anim] from main::@1
[10] phi() [ ] ( main:3::anim:8 [ ] )
to:anim::@1
anim::@1: scope:[anim] from anim anim::@20
[11] (byte) anim::angle#12 ← phi( anim/(byte/signed byte/word/signed word/dword/signed dword) 0 anim::@20/(byte) anim::angle#1 ) [ anim::angle#12 ] ( main:3::anim:8 [ anim::angle#12 ] )
to:anim::@4
anim::@4: scope:[anim] from anim::@1 anim::@4
[12] if(*((const byte*) RASTER#0)!=(byte/word/signed word/dword/signed dword) 255) goto anim::@4 [ anim::angle#12 ] ( main:3::anim:8 [ anim::angle#12 ] )
to:anim::@6
anim::@6: scope:[anim] from anim::@4
[13] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0) [ anim::angle#12 ] ( main:3::anim:8 [ anim::angle#12 ] )
to:anim::mulf8s_prepare1
anim::mulf8s_prepare1: scope:[anim] from anim::@6
[14] (byte~) mulf8u_prepare::a#3 ← (byte)(signed byte)*((const byte*) COS#0 + (byte) anim::angle#12) [ anim::angle#12 mulf8u_prepare::a#3 ] ( main:3::anim:8 [ anim::angle#12 mulf8u_prepare::a#3 ] )
[15] call mulf8u_prepare [ anim::angle#12 ] ( main:3::anim:8 [ anim::angle#12 ] )
to:anim::@13
anim::@13: scope:[anim] from anim::mulf8s_prepare1
[16] phi() [ anim::angle#12 ] ( main:3::anim:8 [ anim::angle#12 ] )
[17] call mulf8s_prepared [ anim::angle#12 mulf8s_prepared::m#4 ] ( main:3::anim:8 [ anim::angle#12 mulf8s_prepared::m#4 ] )
[18] (signed word) mulf8s_prepared::return#2 ← (signed word)(word) mulf8s_prepared::m#4 [ anim::angle#12 mulf8s_prepared::return#2 ] ( main:3::anim:8 [ anim::angle#12 mulf8s_prepared::return#2 ] )
to:anim::@16
anim::@16: scope:[anim] from anim::@13
[19] (signed word~) anim::$4 ← (signed word) mulf8s_prepared::return#2 [ anim::angle#12 anim::$4 ] ( main:3::anim:8 [ anim::angle#12 anim::$4 ] )
[20] (signed word) anim::xr#0 ← (signed word~) anim::$4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ anim::angle#12 anim::xr#0 ] ( main:3::anim:8 [ anim::angle#12 anim::xr#0 ] )
[21] call mulf8s_prepared [ anim::angle#12 mulf8s_prepared::m#4 anim::xr#0 ] ( main:3::anim:8 [ anim::angle#12 mulf8s_prepared::m#4 anim::xr#0 ] )
[22] (signed word) mulf8s_prepared::return#3 ← (signed word)(word) mulf8s_prepared::m#4 [ anim::angle#12 anim::xr#0 mulf8s_prepared::return#3 ] ( main:3::anim:8 [ anim::angle#12 anim::xr#0 mulf8s_prepared::return#3 ] )
to:anim::@17
anim::@17: scope:[anim] from anim::@16
[23] (signed word~) anim::$6 ← (signed word) mulf8s_prepared::return#3 [ anim::angle#12 anim::xr#0 anim::$6 ] ( main:3::anim:8 [ anim::angle#12 anim::xr#0 anim::$6 ] )
[24] (signed word) anim::yr#0 ← (signed word~) anim::$6 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ anim::angle#12 anim::xr#0 anim::yr#0 ] ( main:3::anim:8 [ anim::angle#12 anim::xr#0 anim::yr#0 ] )
to:anim::mulf8s_prepare2
anim::mulf8s_prepare2: scope:[anim] from anim::@17
[25] (byte~) mulf8u_prepare::a#4 ← (byte)(signed byte)*((const byte*) SIN#0 + (byte) anim::angle#12) [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8u_prepare::a#4 ] ( main:3::anim:8 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8u_prepare::a#4 ] )
[26] call mulf8u_prepare [ anim::angle#12 anim::xr#0 anim::yr#0 ] ( main:3::anim:8 [ anim::angle#12 anim::xr#0 anim::yr#0 ] )
to:anim::@14
anim::@14: scope:[anim] from anim::mulf8s_prepare2
[27] phi() [ anim::angle#12 anim::xr#0 anim::yr#0 ] ( main:3::anim:8 [ anim::angle#12 anim::xr#0 anim::yr#0 ] )
[28] call mulf8s_prepared [ anim::angle#12 mulf8s_prepared::m#4 anim::xr#0 anim::yr#0 ] ( main:3::anim:8 [ anim::angle#12 mulf8s_prepared::m#4 anim::xr#0 anim::yr#0 ] )
[29] (signed word) mulf8s_prepared::return#4 ← (signed word)(word) mulf8s_prepared::m#4 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::return#4 ] ( main:3::anim:8 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::return#4 ] )
to:anim::@19
anim::@19: scope:[anim] from anim::@14
[30] (signed word~) anim::$10 ← (signed word) mulf8s_prepared::return#4 [ anim::angle#12 anim::xr#0 anim::yr#0 anim::$10 ] ( main:3::anim:8 [ anim::angle#12 anim::xr#0 anim::yr#0 anim::$10 ] )
[31] (signed word~) anim::$11 ← (signed word~) anim::$10 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ anim::angle#12 anim::xr#0 anim::yr#0 anim::$11 ] ( main:3::anim:8 [ anim::angle#12 anim::xr#0 anim::yr#0 anim::$11 ] )
[32] (signed word) anim::xr#1 ← (signed word) anim::xr#0 - (signed word~) anim::$11 [ anim::angle#12 anim::yr#0 anim::xr#1 ] ( main:3::anim:8 [ anim::angle#12 anim::yr#0 anim::xr#1 ] )
[33] call mulf8s_prepared [ anim::angle#12 mulf8s_prepared::m#4 anim::yr#0 anim::xr#1 ] ( main:3::anim:8 [ anim::angle#12 mulf8s_prepared::m#4 anim::yr#0 anim::xr#1 ] )
[34] (signed word) mulf8s_prepared::return#10 ← (signed word)(word) mulf8s_prepared::m#4 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::return#10 ] ( main:3::anim:8 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::return#10 ] )
to:anim::@20
anim::@20: scope:[anim] from anim::@19
[35] (signed word~) anim::$12 ← (signed word) mulf8s_prepared::return#10 [ anim::angle#12 anim::yr#0 anim::xr#1 anim::$12 ] ( main:3::anim:8 [ anim::angle#12 anim::yr#0 anim::xr#1 anim::$12 ] )
[36] (signed word~) anim::$13 ← (signed word~) anim::$12 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ anim::angle#12 anim::yr#0 anim::xr#1 anim::$13 ] ( main:3::anim:8 [ anim::angle#12 anim::yr#0 anim::xr#1 anim::$13 ] )
[37] (signed word) anim::yr#1 ← (signed word) anim::yr#0 + (signed word~) anim::$13 [ anim::angle#12 anim::xr#1 anim::yr#1 ] ( main:3::anim:8 [ anim::angle#12 anim::xr#1 anim::yr#1 ] )
[38] (byte~) anim::$14 ← > (signed word) anim::xr#1 [ anim::angle#12 anim::yr#1 anim::$14 ] ( main:3::anim:8 [ anim::angle#12 anim::yr#1 anim::$14 ] )
[39] (signed byte~) anim::$17 ← (signed byte)(byte~) anim::$14 [ anim::angle#12 anim::yr#1 anim::$17 ] ( main:3::anim:8 [ anim::angle#12 anim::yr#1 anim::$17 ] )
[40] (signed word) anim::xpos#0 ← (signed byte~) anim::$17 + (byte/signed byte/word/signed word/dword/signed dword) 89+(byte/signed byte/word/signed word/dword/signed dword) 24+(byte/signed byte/word/signed word/dword/signed dword) 60 [ anim::angle#12 anim::yr#1 anim::xpos#0 ] ( main:3::anim:8 [ anim::angle#12 anim::yr#1 anim::xpos#0 ] )
[41] (byte~) anim::$19 ← > (signed word) anim::yr#1 [ anim::angle#12 anim::xpos#0 anim::$19 ] ( main:3::anim:8 [ anim::angle#12 anim::xpos#0 anim::$19 ] )
[42] (signed byte~) anim::$21 ← (signed byte)(byte~) anim::$19 [ anim::angle#12 anim::xpos#0 anim::$21 ] ( main:3::anim:8 [ anim::angle#12 anim::xpos#0 anim::$21 ] )
[43] (signed word) anim::ypos#0 ← (signed byte~) anim::$21 + (byte/signed byte/word/signed word/dword/signed dword) 89+(byte/signed byte/word/signed word/dword/signed dword) 51 [ anim::angle#12 anim::xpos#0 anim::ypos#0 ] ( main:3::anim:8 [ anim::angle#12 anim::xpos#0 anim::ypos#0 ] )
[44] (byte~) anim::$23 ← < (signed word) anim::xpos#0 [ anim::angle#12 anim::xpos#0 anim::ypos#0 anim::$23 ] ( main:3::anim:8 [ anim::angle#12 anim::xpos#0 anim::ypos#0 anim::$23 ] )
[45] *((const byte*) SPRITES_XPOS#0) ← (byte~) anim::$23 [ anim::angle#12 anim::xpos#0 anim::ypos#0 ] ( main:3::anim:8 [ anim::angle#12 anim::xpos#0 anim::ypos#0 ] )
[46] (byte~) anim::$24 ← > (signed word) anim::xpos#0 [ anim::angle#12 anim::ypos#0 anim::$24 ] ( main:3::anim:8 [ anim::angle#12 anim::ypos#0 anim::$24 ] )
[47] *((const byte*) SPRITES_XMSB#0) ← (byte~) anim::$24 [ anim::angle#12 anim::ypos#0 ] ( main:3::anim:8 [ anim::angle#12 anim::ypos#0 ] )
[48] (byte~) anim::$25 ← < (signed word) anim::ypos#0 [ anim::angle#12 anim::$25 ] ( main:3::anim:8 [ anim::angle#12 anim::$25 ] )
[49] *((const byte*) SPRITES_YPOS#0) ← (byte~) anim::$25 [ anim::angle#12 ] ( main:3::anim:8 [ anim::angle#12 ] )
[50] (byte) anim::angle#1 ← ++ (byte) anim::angle#12 [ anim::angle#1 ] ( main:3::anim:8 [ anim::angle#1 ] )
[51] *((const byte*) BORDERCOL#0) ← -- *((const byte*) BORDERCOL#0) [ anim::angle#1 ] ( main:3::anim:8 [ anim::angle#1 ] )
to:anim::@1
mulf8s_prepared: scope:[mulf8s_prepared] from anim::@13 anim::@14 anim::@16 anim::@19
[52] (signed byte) mulf8s_prepared::b#4 ← phi( anim::@13/(const signed byte) anim::x#0 anim::@14/(const signed byte) anim::y#0 anim::@16/(const signed byte) anim::y#0 anim::@19/(const signed byte) anim::x#0 ) [ mulf8s_prepared::b#4 ] ( main:3::anim:8::mulf8s_prepared:17 [ anim::angle#12 mulf8s_prepared::b#4 ] main:3::anim:8::mulf8s_prepared:21 [ anim::angle#12 anim::xr#0 mulf8s_prepared::b#4 ] main:3::anim:8::mulf8s_prepared:28 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::b#4 ] main:3::anim:8::mulf8s_prepared:33 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::b#4 ] )
[53] call mulf8u_prepared [ mulf8s_prepared::b#4 mulf8u_prepared::return#0 ] ( main:3::anim:8::mulf8s_prepared:17 [ anim::angle#12 mulf8s_prepared::b#4 mulf8u_prepared::return#0 ] main:3::anim:8::mulf8s_prepared:21 [ anim::angle#12 anim::xr#0 mulf8s_prepared::b#4 mulf8u_prepared::return#0 ] main:3::anim:8::mulf8s_prepared:28 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::b#4 mulf8u_prepared::return#0 ] main:3::anim:8::mulf8s_prepared:33 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::b#4 mulf8u_prepared::return#0 ] )
[54] (word) mulf8u_prepared::return#2 ← (word) mulf8u_prepared::return#0 [ mulf8s_prepared::b#4 mulf8u_prepared::return#2 ] ( main:3::anim:8::mulf8s_prepared:17 [ anim::angle#12 mulf8s_prepared::b#4 mulf8u_prepared::return#2 ] main:3::anim:8::mulf8s_prepared:21 [ anim::angle#12 anim::xr#0 mulf8s_prepared::b#4 mulf8u_prepared::return#2 ] main:3::anim:8::mulf8s_prepared:28 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::b#4 mulf8u_prepared::return#2 ] main:3::anim:8::mulf8s_prepared:33 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::b#4 mulf8u_prepared::return#2 ] )
to:mulf8s_prepared::@6
mulf8s_prepared::@6: scope:[mulf8s_prepared] from mulf8s_prepared
[55] (word) mulf8s_prepared::m#0 ← (word) mulf8u_prepared::return#2 [ mulf8s_prepared::b#4 mulf8s_prepared::m#0 ] ( main:3::anim:8::mulf8s_prepared:17 [ anim::angle#12 mulf8s_prepared::b#4 mulf8s_prepared::m#0 ] main:3::anim:8::mulf8s_prepared:21 [ anim::angle#12 anim::xr#0 mulf8s_prepared::b#4 mulf8s_prepared::m#0 ] main:3::anim:8::mulf8s_prepared:28 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::b#4 mulf8s_prepared::m#0 ] main:3::anim:8::mulf8s_prepared:33 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::b#4 mulf8s_prepared::m#0 ] )
[56] if(*((const signed byte*) mulf8s_prepared::memA#0)>=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mulf8s_prepared::@1 [ mulf8s_prepared::b#4 mulf8s_prepared::m#0 ] ( main:3::anim:8::mulf8s_prepared:17 [ anim::angle#12 mulf8s_prepared::b#4 mulf8s_prepared::m#0 ] main:3::anim:8::mulf8s_prepared:21 [ anim::angle#12 anim::xr#0 mulf8s_prepared::b#4 mulf8s_prepared::m#0 ] main:3::anim:8::mulf8s_prepared:28 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::b#4 mulf8s_prepared::m#0 ] main:3::anim:8::mulf8s_prepared:33 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::b#4 mulf8s_prepared::m#0 ] )
to:mulf8s_prepared::@3
mulf8s_prepared::@3: scope:[mulf8s_prepared] from mulf8s_prepared::@6
[57] (byte~) mulf8s_prepared::$5 ← > (word) mulf8s_prepared::m#0 [ mulf8s_prepared::b#4 mulf8s_prepared::m#0 mulf8s_prepared::$5 ] ( main:3::anim:8::mulf8s_prepared:17 [ anim::angle#12 mulf8s_prepared::b#4 mulf8s_prepared::m#0 mulf8s_prepared::$5 ] main:3::anim:8::mulf8s_prepared:21 [ anim::angle#12 anim::xr#0 mulf8s_prepared::b#4 mulf8s_prepared::m#0 mulf8s_prepared::$5 ] main:3::anim:8::mulf8s_prepared:28 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::b#4 mulf8s_prepared::m#0 mulf8s_prepared::$5 ] main:3::anim:8::mulf8s_prepared:33 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::b#4 mulf8s_prepared::m#0 mulf8s_prepared::$5 ] )
[58] (byte~) mulf8s_prepared::$15 ← (byte~) mulf8s_prepared::$5 - (byte)(signed byte) mulf8s_prepared::b#4 [ mulf8s_prepared::b#4 mulf8s_prepared::m#0 mulf8s_prepared::$15 ] ( main:3::anim:8::mulf8s_prepared:17 [ anim::angle#12 mulf8s_prepared::b#4 mulf8s_prepared::m#0 mulf8s_prepared::$15 ] main:3::anim:8::mulf8s_prepared:21 [ anim::angle#12 anim::xr#0 mulf8s_prepared::b#4 mulf8s_prepared::m#0 mulf8s_prepared::$15 ] main:3::anim:8::mulf8s_prepared:28 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::b#4 mulf8s_prepared::m#0 mulf8s_prepared::$15 ] main:3::anim:8::mulf8s_prepared:33 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::b#4 mulf8s_prepared::m#0 mulf8s_prepared::$15 ] )
[59] (word) mulf8s_prepared::m#1 ← (word) mulf8s_prepared::m#0 hi= (byte~) mulf8s_prepared::$15 [ mulf8s_prepared::b#4 mulf8s_prepared::m#1 ] ( main:3::anim:8::mulf8s_prepared:17 [ anim::angle#12 mulf8s_prepared::b#4 mulf8s_prepared::m#1 ] main:3::anim:8::mulf8s_prepared:21 [ anim::angle#12 anim::xr#0 mulf8s_prepared::b#4 mulf8s_prepared::m#1 ] main:3::anim:8::mulf8s_prepared:28 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::b#4 mulf8s_prepared::m#1 ] main:3::anim:8::mulf8s_prepared:33 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::b#4 mulf8s_prepared::m#1 ] )
to:mulf8s_prepared::@1
mulf8s_prepared::@1: scope:[mulf8s_prepared] from mulf8s_prepared::@3 mulf8s_prepared::@6
[60] (word) mulf8s_prepared::m#5 ← phi( mulf8s_prepared::@3/(word) mulf8s_prepared::m#1 mulf8s_prepared::@6/(word) mulf8s_prepared::m#0 ) [ mulf8s_prepared::b#4 mulf8s_prepared::m#5 ] ( main:3::anim:8::mulf8s_prepared:17 [ anim::angle#12 mulf8s_prepared::b#4 mulf8s_prepared::m#5 ] main:3::anim:8::mulf8s_prepared:21 [ anim::angle#12 anim::xr#0 mulf8s_prepared::b#4 mulf8s_prepared::m#5 ] main:3::anim:8::mulf8s_prepared:28 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::b#4 mulf8s_prepared::m#5 ] main:3::anim:8::mulf8s_prepared:33 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::b#4 mulf8s_prepared::m#5 ] )
[61] if((signed byte) mulf8s_prepared::b#4>=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mulf8s_prepared::@2 [ mulf8s_prepared::m#5 ] ( main:3::anim:8::mulf8s_prepared:17 [ anim::angle#12 mulf8s_prepared::m#5 ] main:3::anim:8::mulf8s_prepared:21 [ anim::angle#12 anim::xr#0 mulf8s_prepared::m#5 ] main:3::anim:8::mulf8s_prepared:28 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::m#5 ] main:3::anim:8::mulf8s_prepared:33 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::m#5 ] )
to:mulf8s_prepared::@4
mulf8s_prepared::@4: scope:[mulf8s_prepared] from mulf8s_prepared::@1
[62] (byte~) mulf8s_prepared::$11 ← > (word) mulf8s_prepared::m#5 [ mulf8s_prepared::m#5 mulf8s_prepared::$11 ] ( main:3::anim:8::mulf8s_prepared:17 [ anim::angle#12 mulf8s_prepared::m#5 mulf8s_prepared::$11 ] main:3::anim:8::mulf8s_prepared:21 [ anim::angle#12 anim::xr#0 mulf8s_prepared::m#5 mulf8s_prepared::$11 ] main:3::anim:8::mulf8s_prepared:28 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::m#5 mulf8s_prepared::$11 ] main:3::anim:8::mulf8s_prepared:33 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::m#5 mulf8s_prepared::$11 ] )
[63] (byte~) mulf8s_prepared::$16 ← (byte~) mulf8s_prepared::$11 - (byte)*((const signed byte*) mulf8s_prepared::memA#0) [ mulf8s_prepared::m#5 mulf8s_prepared::$16 ] ( main:3::anim:8::mulf8s_prepared:17 [ anim::angle#12 mulf8s_prepared::m#5 mulf8s_prepared::$16 ] main:3::anim:8::mulf8s_prepared:21 [ anim::angle#12 anim::xr#0 mulf8s_prepared::m#5 mulf8s_prepared::$16 ] main:3::anim:8::mulf8s_prepared:28 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::m#5 mulf8s_prepared::$16 ] main:3::anim:8::mulf8s_prepared:33 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::m#5 mulf8s_prepared::$16 ] )
[64] (word) mulf8s_prepared::m#2 ← (word) mulf8s_prepared::m#5 hi= (byte~) mulf8s_prepared::$16 [ mulf8s_prepared::m#2 ] ( main:3::anim:8::mulf8s_prepared:17 [ anim::angle#12 mulf8s_prepared::m#2 ] main:3::anim:8::mulf8s_prepared:21 [ anim::angle#12 anim::xr#0 mulf8s_prepared::m#2 ] main:3::anim:8::mulf8s_prepared:28 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::m#2 ] main:3::anim:8::mulf8s_prepared:33 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::m#2 ] )
to:mulf8s_prepared::@2
mulf8s_prepared::@2: scope:[mulf8s_prepared] from mulf8s_prepared::@1 mulf8s_prepared::@4
[65] (word) mulf8s_prepared::m#4 ← phi( mulf8s_prepared::@1/(word) mulf8s_prepared::m#5 mulf8s_prepared::@4/(word) mulf8s_prepared::m#2 ) [ mulf8s_prepared::m#4 ] ( main:3::anim:8::mulf8s_prepared:17 [ anim::angle#12 mulf8s_prepared::m#4 ] main:3::anim:8::mulf8s_prepared:21 [ anim::angle#12 anim::xr#0 mulf8s_prepared::m#4 ] main:3::anim:8::mulf8s_prepared:28 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::m#4 ] main:3::anim:8::mulf8s_prepared:33 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::m#4 ] )
to:mulf8s_prepared::@return
mulf8s_prepared::@return: scope:[mulf8s_prepared] from mulf8s_prepared::@2
[66] return [ mulf8s_prepared::m#4 ] ( main:3::anim:8::mulf8s_prepared:17 [ anim::angle#12 mulf8s_prepared::m#4 ] main:3::anim:8::mulf8s_prepared:21 [ anim::angle#12 anim::xr#0 mulf8s_prepared::m#4 ] main:3::anim:8::mulf8s_prepared:28 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::m#4 ] main:3::anim:8::mulf8s_prepared:33 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::m#4 ] )
to:@return
mulf8u_prepared: scope:[mulf8u_prepared] from mulf8s_prepared
[67] *((const byte*) mulf8u_prepared::memB#0) ← (byte)(signed byte) mulf8s_prepared::b#4 [ mulf8s_prepared::b#4 ] ( main:3::anim:8::mulf8s_prepared:17::mulf8u_prepared:53 [ anim::angle#12 mulf8s_prepared::b#4 ] main:3::anim:8::mulf8s_prepared:21::mulf8u_prepared:53 [ anim::angle#12 anim::xr#0 mulf8s_prepared::b#4 ] main:3::anim:8::mulf8s_prepared:28::mulf8u_prepared:53 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::b#4 ] main:3::anim:8::mulf8s_prepared:33::mulf8u_prepared:53 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::b#4 ] )
asm { ldxmemB sec sm1: ldamulf_sqr1_lo,x sm2: sbcmulf_sqr2_lo,x staresL sm3: ldamulf_sqr1_hi,x sm4: sbcmulf_sqr2_hi,x stamemB }
[69] (word) mulf8u_prepared::return#0 ← *((const byte*) mulf8u_prepared::memB#0) w= *((const byte*) mulf8u_prepared::resL#0) [ mulf8s_prepared::b#4 mulf8u_prepared::return#0 ] ( main:3::anim:8::mulf8s_prepared:17::mulf8u_prepared:53 [ anim::angle#12 mulf8s_prepared::b#4 mulf8u_prepared::return#0 ] main:3::anim:8::mulf8s_prepared:21::mulf8u_prepared:53 [ anim::angle#12 anim::xr#0 mulf8s_prepared::b#4 mulf8u_prepared::return#0 ] main:3::anim:8::mulf8s_prepared:28::mulf8u_prepared:53 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::b#4 mulf8u_prepared::return#0 ] main:3::anim:8::mulf8s_prepared:33::mulf8u_prepared:53 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::b#4 mulf8u_prepared::return#0 ] )
to:mulf8u_prepared::@return
mulf8u_prepared::@return: scope:[mulf8u_prepared] from mulf8u_prepared
[70] return [ mulf8s_prepared::b#4 mulf8u_prepared::return#0 ] ( main:3::anim:8::mulf8s_prepared:17::mulf8u_prepared:53 [ anim::angle#12 mulf8s_prepared::b#4 mulf8u_prepared::return#0 ] main:3::anim:8::mulf8s_prepared:21::mulf8u_prepared:53 [ anim::angle#12 anim::xr#0 mulf8s_prepared::b#4 mulf8u_prepared::return#0 ] main:3::anim:8::mulf8s_prepared:28::mulf8u_prepared:53 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8s_prepared::b#4 mulf8u_prepared::return#0 ] main:3::anim:8::mulf8s_prepared:33::mulf8u_prepared:53 [ anim::angle#12 anim::yr#0 anim::xr#1 mulf8s_prepared::b#4 mulf8u_prepared::return#0 ] )
to:@return
mulf8u_prepare: scope:[mulf8u_prepare] from anim::mulf8s_prepare1 anim::mulf8s_prepare2
[71] (byte) mulf8u_prepare::a#2 ← phi( anim::mulf8s_prepare1/(byte~) mulf8u_prepare::a#3 anim::mulf8s_prepare2/(byte~) mulf8u_prepare::a#4 ) [ mulf8u_prepare::a#2 ] ( main:3::anim:8::mulf8u_prepare:15 [ anim::angle#12 mulf8u_prepare::a#2 ] main:3::anim:8::mulf8u_prepare:26 [ anim::angle#12 anim::xr#0 anim::yr#0 mulf8u_prepare::a#2 ] )
[72] *((const byte*) mulf8u_prepare::memA#0) ← (byte) mulf8u_prepare::a#2 [ ] ( main:3::anim:8::mulf8u_prepare:15 [ anim::angle#12 ] main:3::anim:8::mulf8u_prepare:26 [ anim::angle#12 anim::xr#0 anim::yr#0 ] )
asm { ldamemA stamulf8u_prepared.sm1+1 stamulf8u_prepared.sm3+1 eor#$ff stamulf8u_prepared.sm2+1 stamulf8u_prepared.sm4+1 }
to:mulf8u_prepare::@return
mulf8u_prepare::@return: scope:[mulf8u_prepare] from mulf8u_prepare
[74] return [ ] ( main:3::anim:8::mulf8u_prepare:15 [ anim::angle#12 ] main:3::anim:8::mulf8u_prepare:26 [ anim::angle#12 anim::xr#0 anim::yr#0 ] )
to:@return
init: scope:[init] from main
[75] phi() [ ] ( main:3::init:6 [ ] )
[76] call mulf_init [ ] ( main:3::init:6 [ ] )
to:init::@3
init::@3: scope:[init] from init
[77] *((const byte*) SPRITES_ENABLE#0) ← (byte/word/signed word/dword/signed dword) 255 [ ] ( main:3::init:6 [ ] )
to:init::@1
init::@1: scope:[init] from init::@1 init::@3
[78] (byte) init::spr_x#2 ← phi( init::@1/(byte) init::spr_x#1 init::@3/(byte/signed byte/word/signed word/dword/signed dword) 60 ) [ init::i#2 init::spr_x#2 ] ( main:3::init:6 [ init::i#2 init::spr_x#2 ] )
[78] (byte) init::i#2 ← phi( init::@1/(byte) init::i#1 init::@3/(byte/signed byte/word/signed word/dword/signed dword) 0 ) [ init::i#2 init::spr_x#2 ] ( main:3::init:6 [ init::i#2 init::spr_x#2 ] )
[79] (byte) init::i2#0 ← (byte) init::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ init::i#2 init::spr_x#2 init::i2#0 ] ( main:3::init:6 [ init::i#2 init::spr_x#2 init::i2#0 ] )
[80] *((const byte*) init::sprites_ptr#0 + (byte) init::i#2) ← ((byte))(const byte*) SPRITE#0/(byte/signed byte/word/signed word/dword/signed dword) 64 [ init::i#2 init::spr_x#2 init::i2#0 ] ( main:3::init:6 [ init::i#2 init::spr_x#2 init::i2#0 ] )
[81] *((const byte*) SPRITES_XPOS#0 + (byte) init::i2#0) ← (byte) init::spr_x#2 [ init::i#2 init::spr_x#2 init::i2#0 ] ( main:3::init:6 [ init::i#2 init::spr_x#2 init::i2#0 ] )
[82] *((const byte*) SPRITES_YPOS#0 + (byte) init::i2#0) ← (byte) init::spr_x#2 [ init::i#2 init::spr_x#2 ] ( main:3::init:6 [ init::i#2 init::spr_x#2 ] )
[83] *((const byte*) SPRITES_COLS#0 + (byte) init::i#2) ← (const byte) GREEN#0 [ init::i#2 init::spr_x#2 ] ( main:3::init:6 [ init::i#2 init::spr_x#2 ] )
[84] (byte) init::spr_x#1 ← (byte) init::spr_x#2 + (byte/signed byte/word/signed word/dword/signed dword) 24 [ init::i#2 init::spr_x#1 ] ( main:3::init:6 [ init::i#2 init::spr_x#1 ] )
[85] (byte) init::i#1 ← ++ (byte) init::i#2 [ init::i#1 init::spr_x#1 ] ( main:3::init:6 [ init::i#1 init::spr_x#1 ] )
[86] if((byte) init::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto init::@1 [ init::i#1 init::spr_x#1 ] ( main:3::init:6 [ init::i#1 init::spr_x#1 ] )
to:init::@return
init::@return: scope:[init] from init::@1
[87] return [ ] ( main:3::init:6 [ ] )
to:@return
mulf_init: scope:[mulf_init] from init
[88] phi() [ ] ( main:3::init:6::mulf_init:76 [ ] )
to:mulf_init::@1
mulf_init::@1: scope:[mulf_init] from mulf_init mulf_init::@2
[89] (byte) mulf_init::x_2#3 ← phi( mulf_init/(byte/signed byte/word/signed word/dword/signed dword) 0 mulf_init::@2/(byte) mulf_init::x_2#2 ) [ mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ( main:3::init:6::mulf_init:76 [ mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] )
[89] (byte*) mulf_init::sqr1_hi#2 ← phi( mulf_init/(const byte[512]) mulf_sqr1_hi#0+(byte/signed byte/word/signed word/dword/signed dword) 1 mulf_init::@2/(byte*) mulf_init::sqr1_hi#1 ) [ mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ( main:3::init:6::mulf_init:76 [ mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] )
[89] (byte*) mulf_init::sqr1_lo#2 ← phi( mulf_init/(const byte[512]) mulf_sqr1_lo#0+(byte/signed byte/word/signed word/dword/signed dword) 1 mulf_init::@2/(byte*) mulf_init::sqr1_lo#1 ) [ mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ( main:3::init:6::mulf_init:76 [ mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] )
[89] (word) mulf_init::sqr#4 ← phi( mulf_init/(byte/signed byte/word/signed word/dword/signed dword) 0 mulf_init::@2/(word) mulf_init::sqr#1 ) [ mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ( main:3::init:6::mulf_init:76 [ mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] )
[89] (byte) mulf_init::c#2 ← phi( mulf_init/(byte/signed byte/word/signed word/dword/signed dword) 0 mulf_init::@2/(byte) mulf_init::c#1 ) [ mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ( main:3::init:6::mulf_init:76 [ mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] )
[90] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2 [ mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 ] )
[91] (byte~) mulf_init::$2 ← (byte) mulf_init::c#1 & (byte/signed byte/word/signed word/dword/signed dword) 1 [ mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$2 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$2 ] )
[92] if((byte~) mulf_init::$2!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mulf_init::@2 [ mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 ] )
to:mulf_init::@5
mulf_init::@5: scope:[mulf_init] from mulf_init::@1
[93] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3 [ mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#1 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#1 ] )
[94] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#1 mulf_init::sqr#2 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#1 mulf_init::sqr#2 ] )
to:mulf_init::@2
mulf_init::@2: scope:[mulf_init] from mulf_init::@1 mulf_init::@5
[95] (byte) mulf_init::x_2#2 ← phi( mulf_init::@1/(byte) mulf_init::x_2#3 mulf_init::@5/(byte) mulf_init::x_2#1 ) [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] )
[95] (word) mulf_init::sqr#3 ← phi( mulf_init::@1/(word) mulf_init::sqr#4 mulf_init::@5/(word) mulf_init::sqr#2 ) [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] )
[96] (byte~) mulf_init::$5 ← < (word) mulf_init::sqr#3 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$5 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$5 ] )
[97] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] )
[98] (byte~) mulf_init::$6 ← > (word) mulf_init::sqr#3 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$6 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$6 ] )
[99] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$6 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] )
[100] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 mulf_init::sqr#3 ] )
[101] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] )
[102] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2 [ mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_lo#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ( main:3::init:6::mulf_init:76 [ mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_lo#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] )
[103] if((byte*) mulf_init::sqr1_lo#1!=(const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 512) goto mulf_init::@1 [ mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_lo#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ( main:3::init:6::mulf_init:76 [ mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_lo#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] )
to:mulf_init::@3
mulf_init::@3: scope:[mulf_init] from mulf_init::@2 mulf_init::@4
[104] (byte) mulf_init::dir#2 ← phi( mulf_init::@4/(byte) mulf_init::dir#3 mulf_init::@2/(byte/word/signed word/dword/signed dword) 255 ) [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:3::init:6::mulf_init:76 [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] )
[104] (byte*) mulf_init::sqr2_hi#2 ← phi( mulf_init::@4/(byte*) mulf_init::sqr2_hi#1 mulf_init::@2/(const byte[512]) mulf_sqr2_hi#0 ) [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:3::init:6::mulf_init:76 [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] )
[104] (byte*) mulf_init::sqr2_lo#2 ← phi( mulf_init::@4/(byte*) mulf_init::sqr2_lo#1 mulf_init::@2/(const byte[512]) mulf_sqr2_lo#0 ) [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:3::init:6::mulf_init:76 [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] )
[104] (byte) mulf_init::x_255#2 ← phi( mulf_init::@4/(byte) mulf_init::x_255#1 mulf_init::@2/((byte))-(byte/signed byte/word/signed word/dword/signed dword) 1 ) [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:3::init:6::mulf_init:76 [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] )
[105] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[512]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2) [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:3::init:6::mulf_init:76 [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] )
[106] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[512]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2) [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:3::init:6::mulf_init:76 [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] )
[107] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2 [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::sqr2_hi#1 ] ( main:3::init:6::mulf_init:76 [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::sqr2_hi#1 ] )
[108] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] )
[109] if((byte) mulf_init::x_255#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mulf_init::@12 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] )
to:mulf_init::@4
mulf_init::@4: scope:[mulf_init] from mulf_init::@12 mulf_init::@3
[110] (byte) mulf_init::dir#3 ← phi( mulf_init::@12/(byte) mulf_init::dir#2 mulf_init::@3/(byte/signed byte/word/signed word/dword/signed dword) 1 ) [ mulf_init::sqr2_lo#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 mulf_init::dir#3 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr2_lo#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 mulf_init::dir#3 ] )
[111] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2 [ mulf_init::x_255#1 mulf_init::sqr2_lo#1 mulf_init::sqr2_hi#1 mulf_init::dir#3 ] ( main:3::init:6::mulf_init:76 [ mulf_init::x_255#1 mulf_init::sqr2_lo#1 mulf_init::sqr2_hi#1 mulf_init::dir#3 ] )
[112] if((byte*) mulf_init::sqr2_lo#1!=(const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511) goto mulf_init::@3 [ mulf_init::x_255#1 mulf_init::sqr2_lo#1 mulf_init::sqr2_hi#1 mulf_init::dir#3 ] ( main:3::init:6::mulf_init:76 [ mulf_init::x_255#1 mulf_init::sqr2_lo#1 mulf_init::sqr2_hi#1 mulf_init::dir#3 ] )
to:mulf_init::@8
mulf_init::@8: scope:[mulf_init] from mulf_init::@4
[113] *((const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511) ← *((const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 256) [ ] ( main:3::init:6::mulf_init:76 [ ] )
[114] *((const byte[512]) mulf_sqr2_hi#0+(word/signed word/dword/signed dword) 511) ← *((const byte[512]) mulf_sqr1_hi#0+(word/signed word/dword/signed dword) 256) [ ] ( main:3::init:6::mulf_init:76 [ ] )
to:mulf_init::@return
mulf_init::@return: scope:[mulf_init] from mulf_init::@8
[115] return [ ] ( main:3::init:6::mulf_init:76 [ ] )
to:@return
mulf_init::@12: scope:[mulf_init] from mulf_init::@3
[116] phi() [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] ( main:3::init:6::mulf_init:76 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] )
to:mulf_init::@4

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,211 @@
(label) @17
(label) @begin
(label) @end
(byte*) BORDERCOL
(const byte*) BORDERCOL#0 BORDERCOL = ((byte*))(word/dword/signed dword) 53280
(byte*) COS
(const byte*) COS#0 COS = ((byte*))(word/signed word/dword/signed dword) 8192
(byte) GREEN
(const byte) GREEN#0 GREEN = (byte/signed byte/word/signed word/dword/signed dword) 5
(byte*) RASTER
(const byte*) RASTER#0 RASTER = ((byte*))(word/dword/signed dword) 53266
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) 1024
(byte*) SIN
(const byte*) SIN#0 SIN = (const byte*) COS#0+(byte/signed byte/word/signed word/dword/signed dword) 64
(byte*) SPRITE
(const byte*) SPRITE#0 SPRITE = ((byte*))(word/signed word/dword/signed dword) 12288
(byte*) SPRITES_COLS
(const byte*) SPRITES_COLS#0 SPRITES_COLS = ((byte*))(word/dword/signed dword) 53287
(byte*) SPRITES_ENABLE
(const byte*) SPRITES_ENABLE#0 SPRITES_ENABLE = ((byte*))(word/dword/signed dword) 53269
(byte*) SPRITES_XMSB
(const byte*) SPRITES_XMSB#0 SPRITES_XMSB = ((byte*))(word/dword/signed dword) 53264
(byte*) SPRITES_XPOS
(const byte*) SPRITES_XPOS#0 SPRITES_XPOS = ((byte*))(word/dword/signed dword) 53248
(byte*) SPRITES_YPOS
(const byte*) SPRITES_YPOS#0 SPRITES_YPOS = ((byte*))(word/dword/signed dword) 53249
(void()) anim()
(signed word~) anim::$10 $10 zp ZP_WORD:3 22.0
(signed word~) anim::$11 $11 zp ZP_WORD:3 22.0
(signed word~) anim::$12 $12 zp ZP_WORD:3 22.0
(signed word~) anim::$13 $13 zp ZP_WORD:3 22.0
(byte~) anim::$14 reg byte a 11.0
(signed byte~) anim::$17 reg byte a 22.0
(byte~) anim::$19 reg byte a 11.0
(signed byte~) anim::$21 reg byte a 22.0
(byte~) anim::$23 reg byte a 22.0
(byte~) anim::$24 reg byte a 22.0
(byte~) anim::$25 reg byte a 22.0
(signed word~) anim::$4 $4 zp ZP_WORD:5 22.0
(signed word~) anim::$6 $6 zp ZP_WORD:7 22.0
(label) anim::@1
(label) anim::@13
(label) anim::@14
(label) anim::@16
(label) anim::@17
(label) anim::@19
(label) anim::@20
(label) anim::@4
(label) anim::@6
(byte) anim::angle
(byte) anim::angle#1 reg byte y 11.0
(byte) anim::angle#12 reg byte y 0.5641025641025641
(signed byte) anim::cos_a
(label) anim::mulf8s_prepare1
(byte~) anim::mulf8s_prepare1_$0
(signed byte) anim::mulf8s_prepare1_a
(label) anim::mulf8s_prepare2
(byte~) anim::mulf8s_prepare2_$0
(signed byte) anim::mulf8s_prepare2_a
(signed byte) anim::sin_a
(signed byte) anim::x
(const signed byte) anim::x#0 x = (byte/signed byte/word/signed word/dword/signed dword) 89
(signed word) anim::xpos
(signed word) anim::xpos#0 xpos zp ZP_WORD:3 5.5
(signed word) anim::xr
(signed word) anim::xr#0 xr zp ZP_WORD:5 1.8333333333333333
(signed word) anim::xr#1 xr zp ZP_WORD:5 3.6666666666666665
(signed byte) anim::y
(const signed byte) anim::y#0 y = (byte/signed byte/word/signed word/dword/signed dword) 0
(signed word) anim::ypos
(signed word) anim::ypos#0 ypos zp ZP_WORD:5 4.4
(signed word) anim::yr
(signed word) anim::yr#0 yr zp ZP_WORD:7 1.6923076923076923
(signed word) anim::yr#1 yr zp ZP_WORD:7 5.5
(void()) init()
(label) init::@1
(label) init::@3
(label) init::@return
(byte) init::i
(byte) init::i#1 reg byte y 16.5
(byte) init::i#2 reg byte y 7.857142857142857
(byte) init::i2
(byte) init::i2#0 reg byte x 11.0
(byte) init::spr_x
(byte) init::spr_x#1 spr_x zp ZP_BYTE:2 7.333333333333333
(byte) init::spr_x#2 spr_x zp ZP_BYTE:2 7.333333333333333
(byte*) init::sprites_ptr
(const byte*) init::sprites_ptr#0 sprites_ptr = (const byte*) SCREEN#0+(word/signed word/dword/signed dword) 1016
(void()) main()
(label) main::@1
(label) main::@return
(signed word()) mulf8s_prepared((signed byte) mulf8s_prepared::b)
(byte~) mulf8s_prepared::$11 reg byte a 4.0
(byte~) mulf8s_prepared::$15 reg byte a 4.0
(byte~) mulf8s_prepared::$16 reg byte a 4.0
(byte~) mulf8s_prepared::$5 reg byte a 4.0
(label) mulf8s_prepared::@1
(label) mulf8s_prepared::@2
(label) mulf8s_prepared::@3
(label) mulf8s_prepared::@4
(label) mulf8s_prepared::@6
(label) mulf8s_prepared::@return
(signed byte) mulf8s_prepared::b
(signed byte) mulf8s_prepared::b#4 b zp ZP_BYTE:2 0.15384615384615385
(word) mulf8s_prepared::m
(word) mulf8s_prepared::m#0 m zp ZP_WORD:3 2.0
(word) mulf8s_prepared::m#1 m zp ZP_WORD:3 4.0
(word) mulf8s_prepared::m#2 m zp ZP_WORD:3 4.0
(word) mulf8s_prepared::m#4 m zp ZP_WORD:3 0.6666666666666666
(word) mulf8s_prepared::m#5 m zp ZP_WORD:3 2.5
(signed byte*) mulf8s_prepared::memA
(const signed byte*) mulf8s_prepared::memA#0 memA = ((signed byte*))(byte/word/signed word/dword/signed dword) 253
(signed word) mulf8s_prepared::return
(signed word) mulf8s_prepared::return#10 return zp ZP_WORD:3 22.0
(signed word) mulf8s_prepared::return#2 return zp ZP_WORD:3 22.0
(signed word) mulf8s_prepared::return#3 return zp ZP_WORD:3 22.0
(signed word) mulf8s_prepared::return#4 return zp ZP_WORD:3 22.0
(void()) mulf8u_prepare((byte) mulf8u_prepare::a)
(label) mulf8u_prepare::@return
(byte) mulf8u_prepare::a
(byte) mulf8u_prepare::a#2 reg byte a 24.0
(byte~) mulf8u_prepare::a#3 reg byte a 22.0
(byte~) mulf8u_prepare::a#4 reg byte a 22.0
(byte*) mulf8u_prepare::memA
(const byte*) mulf8u_prepare::memA#0 memA = ((byte*))(byte/word/signed word/dword/signed dword) 253
(word()) mulf8u_prepared((byte) mulf8u_prepared::b)
(label) mulf8u_prepared::@return
(byte) mulf8u_prepared::b
(byte*) mulf8u_prepared::memB
(const byte*) mulf8u_prepared::memB#0 memB = ((byte*))(byte/word/signed word/dword/signed dword) 255
(byte*) mulf8u_prepared::resL
(const byte*) mulf8u_prepared::resL#0 resL = ((byte*))(byte/word/signed word/dword/signed dword) 254
(word) mulf8u_prepared::return
(word) mulf8u_prepared::return#0 return zp ZP_WORD:3 1.3333333333333333
(word) mulf8u_prepared::return#2 return zp ZP_WORD:3 4.0
(void()) mulf_init()
(byte~) mulf_init::$2 reg byte a 22.0
(byte~) mulf_init::$5 reg byte a 22.0
(byte~) mulf_init::$6 reg byte a 22.0
(label) mulf_init::@1
(label) mulf_init::@12
(label) mulf_init::@2
(label) mulf_init::@3
(label) mulf_init::@4
(label) mulf_init::@5
(label) mulf_init::@8
(label) mulf_init::@return
(byte) mulf_init::c
(byte) mulf_init::c#1 reg byte x 2.357142857142857
(byte) mulf_init::c#2 reg byte x 22.0
(byte) mulf_init::dir
(byte) mulf_init::dir#2 dir zp ZP_BYTE:2 4.714285714285714
(byte) mulf_init::dir#3 dir zp ZP_BYTE:2 7.333333333333333
(word) mulf_init::sqr
(word) mulf_init::sqr#1 sqr zp ZP_WORD:7 7.333333333333333
(word) mulf_init::sqr#2 sqr zp ZP_WORD:7 22.0
(word) mulf_init::sqr#3 sqr zp ZP_WORD:7 9.166666666666666
(word) mulf_init::sqr#4 sqr zp ZP_WORD:7 6.6000000000000005
(byte*) mulf_init::sqr1_hi
(byte*) mulf_init::sqr1_hi#1 sqr1_hi zp ZP_WORD:5 5.5
(byte*) mulf_init::sqr1_hi#2 sqr1_hi zp ZP_WORD:5 3.0
(byte*) mulf_init::sqr1_lo
(byte*) mulf_init::sqr1_lo#1 sqr1_lo zp ZP_WORD:3 16.5
(byte*) mulf_init::sqr1_lo#2 sqr1_lo zp ZP_WORD:3 2.5384615384615383
(byte*) mulf_init::sqr2_hi
(byte*) mulf_init::sqr2_hi#1 sqr2_hi zp ZP_WORD:5 3.142857142857143
(byte*) mulf_init::sqr2_hi#2 sqr2_hi zp ZP_WORD:5 11.0
(byte*) mulf_init::sqr2_lo
(byte*) mulf_init::sqr2_lo#1 sqr2_lo zp ZP_WORD:3 16.5
(byte*) mulf_init::sqr2_lo#2 sqr2_lo zp ZP_WORD:3 4.125
(byte) mulf_init::x_2
(byte) mulf_init::x_2#1 x_2 zp ZP_BYTE:2 11.0
(byte) mulf_init::x_2#2 x_2 zp ZP_BYTE:2 4.888888888888889
(byte) mulf_init::x_2#3 x_2 zp ZP_BYTE:2 8.25
(byte) mulf_init::x_255
(byte) mulf_init::x_255#1 reg byte x 5.5
(byte) mulf_init::x_255#2 reg byte x 11.0
(byte[512]) mulf_sqr1_hi
(const byte[512]) mulf_sqr1_hi#0 mulf_sqr1_hi = { fill( 512, 0) }
(byte[512]) mulf_sqr1_lo
(const byte[512]) mulf_sqr1_lo#0 mulf_sqr1_lo = { fill( 512, 0) }
(byte[512]) mulf_sqr2_hi
(const byte[512]) mulf_sqr2_hi#0 mulf_sqr2_hi = { fill( 512, 0) }
(byte[512]) mulf_sqr2_lo
(const byte[512]) mulf_sqr2_lo#0 mulf_sqr2_lo = { fill( 512, 0) }
reg byte y [ anim::angle#12 anim::angle#1 ]
zp ZP_BYTE:2 [ mulf8s_prepared::b#4 init::spr_x#2 init::spr_x#1 mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 mulf_init::dir#2 mulf_init::dir#3 ]
zp ZP_WORD:3 [ mulf8s_prepared::m#4 mulf8s_prepared::m#5 mulf8s_prepared::m#1 mulf8s_prepared::m#0 mulf8s_prepared::m#2 mulf8s_prepared::return#2 mulf8s_prepared::return#3 mulf8s_prepared::return#4 mulf8s_prepared::return#10 mulf8u_prepared::return#2 anim::$10 anim::$11 anim::$12 anim::$13 mulf8u_prepared::return#0 mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 anim::xpos#0 ]
reg byte a [ mulf8u_prepare::a#2 mulf8u_prepare::a#3 mulf8u_prepare::a#4 ]
reg byte y [ init::i#2 init::i#1 ]
reg byte x [ mulf_init::c#2 mulf_init::c#1 ]
zp ZP_WORD:5 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 anim::$4 anim::xr#0 anim::xr#1 anim::ypos#0 ]
zp ZP_WORD:7 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 anim::$6 anim::yr#0 anim::yr#1 ]
reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ]
reg byte a [ anim::$14 ]
reg byte a [ anim::$17 ]
reg byte a [ anim::$19 ]
reg byte a [ anim::$21 ]
reg byte a [ anim::$23 ]
reg byte a [ anim::$24 ]
reg byte a [ anim::$25 ]
reg byte a [ mulf8s_prepared::$5 ]
reg byte a [ mulf8s_prepared::$15 ]
reg byte a [ mulf8s_prepared::$11 ]
reg byte a [ mulf8s_prepared::$16 ]
reg byte x [ init::i2#0 ]
reg byte a [ mulf_init::$2 ]
reg byte a [ mulf_init::$5 ]
reg byte a [ mulf_init::$6 ]

View File

@ -1,13 +1,13 @@
@begin: scope:[] from @begin: scope:[] from
[0] phi() [ ] ( ) [0] phi() [ ] ( )
to:@31 to:@37
@31: scope:[] from @begin @37: scope:[] from @begin
[1] phi() [ ] ( ) [1] phi() [ ] ( )
[2] call main [ ] ( ) [2] call main [ ] ( )
to:@end to:@end
@end: scope:[] from @31 @end: scope:[] from @37
[3] phi() [ ] ( ) [3] phi() [ ] ( )
main: scope:[main] from @31 main: scope:[main] from @37
[4] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 5 [ ] ( main:2 [ ] ) [4] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 5 [ ] ( main:2 [ ] )
[5] call print_cls [ ] ( main:2 [ ] ) [5] call print_cls [ ] ( main:2 [ ] )
to:main::@1 to:main::@1

View File

@ -1,3 +1,4 @@
Inlined call call mulf8s_prepare (signed byte) mulf8s::a
CONTROL FLOW GRAPH SSA CONTROL FLOW GRAPH SSA
@begin: scope:[] from @begin: scope:[] from
@ -348,7 +349,7 @@ mul16s::@return: scope:[mul16s] from mul16s::@2
(byte[512]) mulf_sqr1_hi#0 ← { fill( 512, 0) } (byte[512]) mulf_sqr1_hi#0 ← { fill( 512, 0) }
(byte[512]) mulf_sqr2_lo#0 ← { fill( 512, 0) } (byte[512]) mulf_sqr2_lo#0 ← { fill( 512, 0) }
(byte[512]) mulf_sqr2_hi#0 ← { fill( 512, 0) } (byte[512]) mulf_sqr2_hi#0 ← { fill( 512, 0) }
to:@24 to:@30
mulf_init: scope:[mulf_init] from main::@1 mulf_init: scope:[mulf_init] from main::@1
(word) mulf_init::sqr#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0 (word) mulf_init::sqr#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte) mulf_init::x_2#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0 (byte) mulf_init::x_2#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
@ -519,17 +520,17 @@ mulf16s::@return: scope:[mulf16s] from mulf16s::@2
(signed dword) mulf16s::return#1 ← (signed dword) mulf16s::return#3 (signed dword) mulf16s::return#1 ← (signed dword) mulf16s::return#3
return return
to:@return to:@return
@24: scope:[] from @19 @30: scope:[] from @19
(byte*) print_screen#6 ← phi( @19/(byte*) print_screen#7 ) (byte*) print_screen#6 ← phi( @19/(byte*) print_screen#7 )
(byte*) print_char_cursor#157 ← phi( @19/(byte*) print_char_cursor#158 ) (byte*) print_char_cursor#157 ← phi( @19/(byte*) print_char_cursor#158 )
(byte*) print_line_cursor#61 ← phi( @19/(byte*) print_line_cursor#62 ) (byte*) print_line_cursor#61 ← phi( @19/(byte*) print_line_cursor#62 )
(byte*) BGCOL#0 ← ((byte*)) (word/dword/signed dword) 53281 (byte*) BGCOL#0 ← ((byte*)) (word/dword/signed dword) 53281
to:@31 to:@37
main: scope:[main] from @31 main: scope:[main] from @37
(byte*) print_char_cursor#137 ← phi( @31/(byte*) print_char_cursor#147 ) (byte*) print_char_cursor#137 ← phi( @37/(byte*) print_char_cursor#147 )
(byte*) print_line_cursor#44 ← phi( @31/(byte*) print_line_cursor#54 ) (byte*) print_line_cursor#44 ← phi( @37/(byte*) print_line_cursor#54 )
(byte*) print_screen#4 ← phi( @31/(byte*) print_screen#5 ) (byte*) print_screen#4 ← phi( @37/(byte*) print_screen#5 )
(byte*) BGCOL#1 ← phi( @31/(byte*) BGCOL#4 ) (byte*) BGCOL#1 ← phi( @37/(byte*) BGCOL#4 )
*((byte*) BGCOL#1) ← (byte/signed byte/word/signed word/dword/signed dword) 5 *((byte*) BGCOL#1) ← (byte/signed byte/word/signed word/dword/signed dword) 5
call print_cls call print_cls
to:main::@1 to:main::@1
@ -1365,28 +1366,28 @@ mul16s_error::@return: scope:[mul16s_error] from mul16s_error::@11
(byte*) print_line_cursor#20 ← (byte*) print_line_cursor#41 (byte*) print_line_cursor#20 ← (byte*) print_line_cursor#41
return return
to:@return to:@return
@31: scope:[] from @24 @37: scope:[] from @30
(byte*) print_screen#5 ← phi( @24/(byte*) print_screen#6 ) (byte*) print_screen#5 ← phi( @30/(byte*) print_screen#6 )
(byte*) print_char_cursor#147 ← phi( @24/(byte*) print_char_cursor#157 ) (byte*) print_char_cursor#147 ← phi( @30/(byte*) print_char_cursor#157 )
(byte*) print_line_cursor#54 ← phi( @24/(byte*) print_line_cursor#61 ) (byte*) print_line_cursor#54 ← phi( @30/(byte*) print_line_cursor#61 )
(byte*) BGCOL#4 ← phi( @24/(byte*) BGCOL#0 ) (byte*) BGCOL#4 ← phi( @30/(byte*) BGCOL#0 )
call main call main
to:@32 to:@38
@32: scope:[] from @31 @38: scope:[] from @37
(byte*) print_char_cursor#127 ← phi( @31/(byte*) print_char_cursor#27 ) (byte*) print_char_cursor#127 ← phi( @37/(byte*) print_char_cursor#27 )
(byte*) print_line_cursor#42 ← phi( @31/(byte*) print_line_cursor#8 ) (byte*) print_line_cursor#42 ← phi( @37/(byte*) print_line_cursor#8 )
(byte*) print_line_cursor#21 ← (byte*) print_line_cursor#42 (byte*) print_line_cursor#21 ← (byte*) print_line_cursor#42
(byte*) print_char_cursor#64 ← (byte*) print_char_cursor#127 (byte*) print_char_cursor#64 ← (byte*) print_char_cursor#127
to:@end to:@end
@end: scope:[] from @32 @end: scope:[] from @38
SYMBOL TABLE SSA SYMBOL TABLE SSA
(const string) $0 = (string) "0123456789abcdef" (const string) $0 = (string) "0123456789abcdef"
(label) @10 (label) @10
(label) @19 (label) @19
(label) @24 (label) @30
(label) @31 (label) @37
(label) @32 (label) @38
(label) @begin (label) @begin
(label) @end (label) @end
(byte*) BGCOL (byte*) BGCOL
@ -3112,7 +3113,7 @@ Culled Empty Block (label) print_cls::@2
Culled Empty Block (label) mul16u::@3 Culled Empty Block (label) mul16u::@3
Culled Empty Block (label) @19 Culled Empty Block (label) @19
Culled Empty Block (label) mulf_init::@6 Culled Empty Block (label) mulf_init::@6
Culled Empty Block (label) @24 Culled Empty Block (label) @30
Culled Empty Block (label) main::@4 Culled Empty Block (label) main::@4
Culled Empty Block (label) muls16u::@3 Culled Empty Block (label) muls16u::@3
Culled Empty Block (label) muls16s::@1 Culled Empty Block (label) muls16s::@1
@ -3126,7 +3127,7 @@ Culled Empty Block (label) mul16s_compare::@12
Culled Empty Block (label) mul16s_compare::@16 Culled Empty Block (label) mul16s_compare::@16
Culled Empty Block (label) mul16s_compare::@19 Culled Empty Block (label) mul16s_compare::@19
Culled Empty Block (label) mul16s_error::@11 Culled Empty Block (label) mul16s_error::@11
Culled Empty Block (label) @32 Culled Empty Block (label) @38
Successful SSA optimization Pass2CullEmptyBlocks Successful SSA optimization Pass2CullEmptyBlocks
Self Phi Eliminated (byte*) BGCOL#21 Self Phi Eliminated (byte*) BGCOL#21
Self Phi Eliminated (byte*) print_line_cursor#90 Self Phi Eliminated (byte*) print_line_cursor#90
@ -3270,7 +3271,7 @@ Added new block during phi lifting mulf_init::@11(between mulf_init::@4 and mulf
Added new block during phi lifting mulf_init::@12(between mulf_init::@3 and mulf_init::@4) Added new block during phi lifting mulf_init::@12(between mulf_init::@3 and mulf_init::@4)
Added new block during phi lifting print_cls::@3(between print_cls::@1 and print_cls::@1) Added new block during phi lifting print_cls::@3(between print_cls::@1 and print_cls::@1)
Adding NOP phi() at start of @begin Adding NOP phi() at start of @begin
Adding NOP phi() at start of @31 Adding NOP phi() at start of @37
Adding NOP phi() at start of @end Adding NOP phi() at start of @end
Adding NOP phi() at start of main::@1 Adding NOP phi() at start of main::@1
Adding NOP phi() at start of main::@2 Adding NOP phi() at start of main::@2
@ -3460,7 +3461,7 @@ Culled Empty Block (label) mulf_init::@9
Culled Empty Block (label) mulf_init::@10 Culled Empty Block (label) mulf_init::@10
Culled Empty Block (label) print_cls::@3 Culled Empty Block (label) print_cls::@3
Adding NOP phi() at start of @begin Adding NOP phi() at start of @begin
Adding NOP phi() at start of @31 Adding NOP phi() at start of @37
Adding NOP phi() at start of @end Adding NOP phi() at start of @end
Adding NOP phi() at start of main::@1 Adding NOP phi() at start of main::@1
Adding NOP phi() at start of main::@2 Adding NOP phi() at start of main::@2
@ -3495,14 +3496,14 @@ Adding NOP phi() at start of print_cls
FINAL CONTROL FLOW GRAPH FINAL CONTROL FLOW GRAPH
@begin: scope:[] from @begin: scope:[] from
[0] phi() [ ] ( ) [0] phi() [ ] ( )
to:@31 to:@37
@31: scope:[] from @begin @37: scope:[] from @begin
[1] phi() [ ] ( ) [1] phi() [ ] ( )
[2] call main [ ] ( ) [2] call main [ ] ( )
to:@end to:@end
@end: scope:[] from @31 @end: scope:[] from @37
[3] phi() [ ] ( ) [3] phi() [ ] ( )
main: scope:[main] from @31 main: scope:[main] from @37
[4] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 5 [ ] ( main:2 [ ] ) [4] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 5 [ ] ( main:2 [ ] )
[5] call print_cls [ ] ( main:2 [ ] ) [5] call print_cls [ ] ( main:2 [ ] )
to:main::@1 to:main::@1
@ -4696,15 +4697,15 @@ INITIAL ASM
.label print_line_cursor = 9 .label print_line_cursor = 9
//SEG2 @begin //SEG2 @begin
bbegin: bbegin:
//SEG3 [1] phi from @begin to @31 [phi:@begin->@31] //SEG3 [1] phi from @begin to @37 [phi:@begin->@37]
b31_from_bbegin: b37_from_bbegin:
jmp b31 jmp b37
//SEG4 @31 //SEG4 @37
b31: b37:
//SEG5 [2] call main [ ] ( ) //SEG5 [2] call main [ ] ( )
jsr main jsr main
//SEG6 [3] phi from @31 to @end [phi:@31->@end] //SEG6 [3] phi from @37 to @end [phi:@37->@end]
bend_from_b31: bend_from_b37:
jmp bend jmp bend
//SEG7 @end //SEG7 @end
bend: bend:
@ -7669,15 +7670,15 @@ ASSEMBLER BEFORE OPTIMIZATION
.label print_line_cursor = 7 .label print_line_cursor = 7
//SEG2 @begin //SEG2 @begin
bbegin: bbegin:
//SEG3 [1] phi from @begin to @31 [phi:@begin->@31] //SEG3 [1] phi from @begin to @37 [phi:@begin->@37]
b31_from_bbegin: b37_from_bbegin:
jmp b31 jmp b37
//SEG4 @31 //SEG4 @37
b31: b37:
//SEG5 [2] call main [ ] ( ) //SEG5 [2] call main [ ] ( )
jsr main jsr main
//SEG6 [3] phi from @31 to @end [phi:@31->@end] //SEG6 [3] phi from @37 to @end [phi:@37->@end]
bend_from_b31: bend_from_b37:
jmp bend jmp bend
//SEG7 @end //SEG7 @end
bend: bend:
@ -9823,7 +9824,7 @@ print_cls: {
mulf_sqr2_hi: .fill $200, 0 mulf_sqr2_hi: .fill $200, 0
ASSEMBLER OPTIMIZATIONS ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b31 Removing instruction jmp b37
Removing instruction jmp bend Removing instruction jmp bend
Removing instruction jmp b1 Removing instruction jmp b1
Removing instruction jmp b2 Removing instruction jmp b2
@ -9989,8 +9990,8 @@ Replacing label b3_from_b4 with b3
Replacing label b1_from_b1 with b1 Replacing label b1_from_b1 with b1
Replacing label b1_from_b1 with b1 Replacing label b1_from_b1 with b1
Removing instruction bbegin: Removing instruction bbegin:
Removing instruction b31_from_bbegin: Removing instruction b37_from_bbegin:
Removing instruction bend_from_b31: Removing instruction bend_from_b37:
Removing instruction b1_from_main: Removing instruction b1_from_main:
Removing instruction mulf_init_from_b1: Removing instruction mulf_init_from_b1:
Removing instruction b2_from_b1: Removing instruction b2_from_b1:
@ -10077,7 +10078,7 @@ Removing instruction b12_from_b3:
Removing instruction b4_from_b12: Removing instruction b4_from_b12:
Removing instruction b1_from_b1: Removing instruction b1_from_b1:
Succesful ASM optimization Pass5RedundantLabelElimination Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b31: Removing instruction b37:
Removing instruction bend: Removing instruction bend:
Removing instruction print_cls_from_main: Removing instruction print_cls_from_main:
Removing instruction b1: Removing instruction b1:
@ -10235,7 +10236,7 @@ Fixing long branch [109] bne b1 to beq
Fixing long branch [811] bne b1 to beq Fixing long branch [811] bne b1 to beq
FINAL SYMBOL TABLE FINAL SYMBOL TABLE
(label) @31 (label) @37
(label) @begin (label) @begin
(label) @end (label) @end
(byte*) BGCOL (byte*) BGCOL
@ -10708,11 +10709,11 @@ Score: 444925
.label print_char_cursor = $f .label print_char_cursor = $f
.label print_line_cursor = 7 .label print_line_cursor = 7
//SEG2 @begin //SEG2 @begin
//SEG3 [1] phi from @begin to @31 [phi:@begin->@31] //SEG3 [1] phi from @begin to @37 [phi:@begin->@37]
//SEG4 @31 //SEG4 @37
//SEG5 [2] call main [ ] ( ) //SEG5 [2] call main [ ] ( )
jsr main jsr main
//SEG6 [3] phi from @31 to @end [phi:@31->@end] //SEG6 [3] phi from @37 to @end [phi:@37->@end]
//SEG7 @end //SEG7 @end
//SEG8 main //SEG8 main
main: { main: {

View File

@ -1,4 +1,4 @@
(label) @31 (label) @37
(label) @begin (label) @begin
(label) @end (label) @end
(byte*) BGCOL (byte*) BGCOL

View File

@ -30,7 +30,8 @@ mul8s_compare: {
b2: b2:
ldx b ldx b
jsr muls8s jsr muls8s
ldy a lda a
ldx b
jsr mulf8s jsr mulf8s
ldy b ldy b
jsr mul8s jsr mul8s
@ -309,13 +310,21 @@ mul8u: {
jmp b1 jmp b1
} }
mulf8s: { mulf8s: {
.label return = $e
jsr mulf8u_prepare
stx mulf8s_prepared.b
jsr mulf8s_prepared
rts
}
mulf8s_prepared: {
.label memA = $fd
.label m = $e .label m = $e
.label b = 3 .label b = 3
.label return = $e .label return = $e
tya
ldx b ldx b
jsr mulf8u jsr mulf8u_prepared
cpy #0 lda memA
cmp #0
bpl b1 bpl b1
lda m+1 lda m+1
sec sec
@ -326,41 +335,44 @@ mulf8s: {
cmp #0 cmp #0
bpl b2 bpl b2
lda m+1 lda m+1
sty $ff
sec sec
sbc $ff sbc memA
sta m+1 sta m+1
b2: b2:
rts rts
} }
mulf8u: { mulf8u_prepared: {
.label memA = $fe .label resL = $fe
.label memB = $ff .label memB = $ff
.label return = $e .label return = $e
sta memA
stx memB stx memB
sta sm1+1
sta sm3+1
eor #$ff
sta sm2+1
sta sm4+1
sec sec
sm1: sm1:
lda mulf_sqr1_lo,x lda mulf_sqr1_lo,x
sm2: sm2:
sbc mulf_sqr2_lo,x sbc mulf_sqr2_lo,x
sta memA sta resL
sm3: sm3:
lda mulf_sqr1_hi,x lda mulf_sqr1_hi,x
sm4: sm4:
sbc mulf_sqr2_hi,x sbc mulf_sqr2_hi,x
sta memB sta memB
lda memA lda resL
sta return sta return
lda memB lda memB
sta return+1 sta return+1
rts rts
} }
mulf8u_prepare: {
.label memA = $fd
sta memA
sta mulf8u_prepared.sm1+1
sta mulf8u_prepared.sm3+1
eor #$ff
sta mulf8u_prepared.sm2+1
sta mulf8u_prepared.sm4+1
rts
}
muls8s: { muls8s: {
.label m = 8 .label m = 8
.label return = 8 .label return = 8
@ -540,6 +552,12 @@ mul8u_error: {
str3: .text " / normal:@" str3: .text " / normal:@"
str4: .text " / fast:@" str4: .text " / fast:@"
} }
mulf8u: {
.label return = $e
jsr mulf8u_prepare
jsr mulf8u_prepared
rts
}
muls8u: { muls8u: {
.label return = 8 .label return = 8
.label m = 8 .label m = 8

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
(label) @33 (label) @39
(label) @begin (label) @begin
(label) @end (label) @end
(byte*) BGCOL (byte*) BGCOL
@ -188,46 +188,75 @@
(byte[512]) mula_sqr2_lo (byte[512]) mula_sqr2_lo
(const byte[512]) mula_sqr2_lo#0 mula_sqr2_lo = { fill( 512, 0) } (const byte[512]) mula_sqr2_lo#0 mula_sqr2_lo = { fill( 512, 0) }
(signed word()) mulf8s((signed byte) mulf8s::a , (signed byte) mulf8s::b) (signed word()) mulf8s((signed byte) mulf8s::a , (signed byte) mulf8s::b)
(byte~) mulf8s::$12 reg byte a 4.0
(byte~) mulf8s::$16 reg byte a 4.0
(byte~) mulf8s::$17 reg byte a 4.0
(byte~) mulf8s::$6 reg byte a 4.0
(label) mulf8s::@1
(label) mulf8s::@2 (label) mulf8s::@2
(label) mulf8s::@3
(label) mulf8s::@4 (label) mulf8s::@4
(label) mulf8s::@6
(label) mulf8s::@return (label) mulf8s::@return
(signed byte) mulf8s::a (signed byte) mulf8s::a
(signed byte) mulf8s::a#0 reg byte y 7.357142857142858 (signed byte) mulf8s::a#0 reg byte a 33.666666666666664
(signed byte) mulf8s::b (signed byte) mulf8s::b
(signed byte) mulf8s::b#0 b zp ZP_BYTE:3 9.363636363636363 (signed byte) mulf8s::b#0 reg byte x 25.75
(word) mulf8s::m (label) mulf8s::mulf8s_prepare1
(word) mulf8s::m#0 m zp ZP_WORD:14 2.0 (byte~) mulf8s::mulf8s_prepare1_$0
(word) mulf8s::m#1 m zp ZP_WORD:14 4.0 (signed byte) mulf8s::mulf8s_prepare1_a
(word) mulf8s::m#2 m zp ZP_WORD:14 4.0
(word) mulf8s::m#4 m zp ZP_WORD:14 1.3333333333333333
(word) mulf8s::m#5 m zp ZP_WORD:14 2.5
(signed word) mulf8s::return (signed word) mulf8s::return
(signed word) mulf8s::return#0 return zp ZP_WORD:14 34.33333333333333
(signed word) mulf8s::return#2 return zp ZP_WORD:14 202.0 (signed word) mulf8s::return#2 return zp ZP_WORD:14 202.0
(signed word()) mulf8s_prepared((signed byte) mulf8s_prepared::b)
(byte~) mulf8s_prepared::$11 reg byte a 4.0
(byte~) mulf8s_prepared::$15 reg byte a 4.0
(byte~) mulf8s_prepared::$16 reg byte a 4.0
(byte~) mulf8s_prepared::$5 reg byte a 4.0
(label) mulf8s_prepared::@1
(label) mulf8s_prepared::@2
(label) mulf8s_prepared::@3
(label) mulf8s_prepared::@4
(label) mulf8s_prepared::@6
(label) mulf8s_prepared::@return
(signed byte) mulf8s_prepared::b
(signed byte) mulf8s_prepared::b#0 b zp ZP_BYTE:3 0.4
(word) mulf8s_prepared::m
(word) mulf8s_prepared::m#0 m zp ZP_WORD:14 2.0
(word) mulf8s_prepared::m#1 m zp ZP_WORD:14 4.0
(word) mulf8s_prepared::m#2 m zp ZP_WORD:14 4.0
(word) mulf8s_prepared::m#4 m zp ZP_WORD:14 1.3333333333333333
(word) mulf8s_prepared::m#5 m zp ZP_WORD:14 2.5
(signed byte*) mulf8s_prepared::memA
(const signed byte*) mulf8s_prepared::memA#0 memA = ((signed byte*))(byte/word/signed word/dword/signed dword) 253
(signed word) mulf8s_prepared::return
(signed word) mulf8s_prepared::return#2 return zp ZP_WORD:14 4.0
(word()) mulf8u((byte) mulf8u::a , (byte) mulf8u::b) (word()) mulf8u((byte) mulf8u::a , (byte) mulf8u::b)
(label) mulf8u::@2
(label) mulf8u::@3
(label) mulf8u::@return (label) mulf8u::@return
(byte) mulf8u::a (byte) mulf8u::a
(byte) mulf8u::a#1 reg byte a 101.0 (byte) mulf8u::a#0 reg byte a 51.5
(byte) mulf8u::a#2 reg byte a 105.0
(byte~) mulf8u::a#4 reg byte a 2.0
(byte) mulf8u::b (byte) mulf8u::b
(byte) mulf8u::b#1 reg byte x 202.0 (byte) mulf8u::b#0 reg byte x 34.33333333333333
(byte) mulf8u::b#2 reg byte x 52.5
(byte~) mulf8u::b#4 reg byte x 4.0
(byte*) mulf8u::memA
(const byte*) mulf8u::memA#0 memA = ((byte*))(byte/word/signed word/dword/signed dword) 254
(byte*) mulf8u::memB
(const byte*) mulf8u::memB#0 memB = ((byte*))(byte/word/signed word/dword/signed dword) 255
(word) mulf8u::return (word) mulf8u::return
(word) mulf8u::return#0 return zp ZP_WORD:14 26.25 (word) mulf8u::return#0 return zp ZP_WORD:14 34.33333333333333
(word) mulf8u::return#2 return zp ZP_WORD:14 4.0 (word) mulf8u::return#2 return zp ZP_WORD:14 202.0
(word) mulf8u::return#3 return zp ZP_WORD:14 202.0 (void()) mulf8u_prepare((byte) mulf8u_prepare::a)
(label) mulf8u_prepare::@return
(byte) mulf8u_prepare::a
(byte) mulf8u_prepare::a#0 reg byte a 4.0
(byte) mulf8u_prepare::a#2 reg byte a 6.0
(byte~) mulf8u_prepare::a#3 reg byte a 4.0
(byte*) mulf8u_prepare::memA
(const byte*) mulf8u_prepare::memA#0 memA = ((byte*))(byte/word/signed word/dword/signed dword) 253
(word()) mulf8u_prepared((byte) mulf8u_prepared::b)
(label) mulf8u_prepared::@return
(byte) mulf8u_prepared::b
(byte) mulf8u_prepared::b#0 reg byte x 4.0
(byte) mulf8u_prepared::b#2 reg byte x 6.0
(byte~) mulf8u_prepared::b#3 reg byte x 4.0
(byte*) mulf8u_prepared::memB
(const byte*) mulf8u_prepared::memB#0 memB = ((byte*))(byte/word/signed word/dword/signed dword) 255
(byte*) mulf8u_prepared::resL
(const byte*) mulf8u_prepared::resL#0 resL = ((byte*))(byte/word/signed word/dword/signed dword) 254
(word) mulf8u_prepared::return
(word) mulf8u_prepared::return#0 return zp ZP_WORD:14 1.5
(word) mulf8u_prepared::return#2 return zp ZP_WORD:14 4.0
(word) mulf8u_prepared::return#3 return zp ZP_WORD:14 4.0
(void()) mulf_init() (void()) mulf_init()
(byte~) mulf_init::$2 reg byte a 22.0 (byte~) mulf_init::$2 reg byte a 22.0
(byte~) mulf_init::$5 reg byte a 22.0 (byte~) mulf_init::$5 reg byte a 22.0
@ -436,7 +465,7 @@
(word) print_word::w#6 w zp ZP_WORD:8 5.333333333333333 (word) print_word::w#6 w zp ZP_WORD:8 5.333333333333333
zp ZP_BYTE:2 [ mul8s_compare::a#7 mul8s_compare::a#1 muls8s::a#0 mul8s::a#0 mul8u_compare::a#7 mul8u_compare::a#1 muls8u::a#0 mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 mulf_init::dir#2 mulf_init::dir#3 ] zp ZP_BYTE:2 [ mul8s_compare::a#7 mul8s_compare::a#1 muls8s::a#0 mul8s::a#0 mul8u_compare::a#7 mul8u_compare::a#1 muls8u::a#0 mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 mulf_init::dir#2 mulf_init::dir#3 ]
zp ZP_BYTE:3 [ mul8s_compare::b#10 mul8s_compare::b#1 mulf8s::b#0 mul8s_error::b#0 mul8u_compare::b#10 mul8u_compare::b#1 mul8u_error::b#0 ] zp ZP_BYTE:3 [ mul8s_compare::b#10 mul8s_compare::b#1 mul8s_error::b#0 mul8u_compare::b#10 mul8u_compare::b#1 mul8u_error::b#0 mulf8s_prepared::b#0 ]
reg byte x [ mul8s_compare::ok#3 mul8s_compare::ok#4 ] reg byte x [ mul8s_compare::ok#3 mul8s_compare::ok#4 ]
zp ZP_WORD:4 [ print_line_cursor#23 print_line_cursor#45 print_line_cursor#1 print_line_cursor#10 mulf_tables_cmp::kc_sqr#2 mulf_tables_cmp::kc_sqr#1 mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 print_cls::sc#2 print_cls::sc#1 ] zp ZP_WORD:4 [ print_line_cursor#23 print_line_cursor#45 print_line_cursor#1 print_line_cursor#10 mulf_tables_cmp::kc_sqr#2 mulf_tables_cmp::kc_sqr#1 mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 print_cls::sc#2 print_cls::sc#1 ]
zp ZP_WORD:6 [ print_str::str#16 print_str::str#18 print_str::str#0 mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] zp ZP_WORD:6 [ print_str::str#16 print_str::str#18 print_str::str#0 mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
@ -448,9 +477,9 @@ reg byte x [ print_sbyte::b#4 print_sbyte::b#3 print_sbyte::b#1 print_sbyte::b#2
zp ZP_WORD:12 [ mul8s::m#4 mul8s::m#5 mul8s::m#1 mul8s::m#0 mul8s::m#2 mul8s::return#2 mul8u::return#2 mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#3 mul8s_compare::mn#0 mul8s_error::mn#0 mul8u_compare::mn#0 mul8u_error::mn#0 ] zp ZP_WORD:12 [ mul8s::m#4 mul8s::m#5 mul8s::m#1 mul8s::m#0 mul8s::m#2 mul8s::return#2 mul8u::return#2 mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#3 mul8s_compare::mn#0 mul8s_error::mn#0 mul8u_compare::mn#0 mul8u_error::mn#0 ]
reg byte a [ mul8u::b#2 mul8u::b#3 mul8u::b#1 ] reg byte a [ mul8u::b#2 mul8u::b#3 mul8u::b#1 ]
reg byte x [ mul8u::a#3 mul8u::a#6 mul8u::a#8 mul8u::a#2 mul8u::a#0 ] reg byte x [ mul8u::a#3 mul8u::a#6 mul8u::a#8 mul8u::a#2 mul8u::a#0 ]
zp ZP_WORD:14 [ mulf8s::m#4 mulf8s::m#5 mulf8s::m#1 mulf8s::m#0 mulf8s::m#2 mulf8s::return#2 mulf8u::return#2 mul8s_compare::mf#0 mul8s_error::mf#0 mulf8u::return#0 mulf8u::return#3 mul8u_compare::mf#0 mul8u_error::mf#0 ] zp ZP_WORD:14 [ mulf8s_prepared::m#4 mulf8s_prepared::m#5 mulf8s_prepared::m#1 mulf8s_prepared::m#0 mulf8s_prepared::m#2 mulf8s_prepared::return#2 mulf8u_prepared::return#3 mulf8s::return#2 mul8s_compare::mf#0 mulf8s::return#0 mulf8u_prepared::return#0 mulf8u_prepared::return#2 mul8s_error::mf#0 mulf8u::return#2 mul8u_compare::mf#0 mulf8u::return#0 mul8u_error::mf#0 ]
reg byte a [ mulf8u::a#2 mulf8u::a#1 mulf8u::a#4 ] reg byte x [ mulf8u_prepared::b#2 mulf8u_prepared::b#3 mulf8u_prepared::b#0 ]
reg byte x [ mulf8u::b#2 mulf8u::b#1 mulf8u::b#4 ] reg byte a [ mulf8u_prepare::a#2 mulf8u_prepare::a#3 mulf8u_prepare::a#0 ]
reg byte y [ muls8s::j#2 muls8s::j#1 ] reg byte y [ muls8s::j#2 muls8s::j#1 ]
reg byte y [ muls8s::i#2 muls8s::i#1 ] reg byte y [ muls8s::i#2 muls8s::i#1 ]
reg byte x [ mul8u_compare::ok#3 mul8u_compare::ok#4 ] reg byte x [ mul8u_compare::ok#3 mul8u_compare::ok#4 ]
@ -458,7 +487,8 @@ reg byte y [ muls8u::i#2 muls8u::i#1 ]
reg byte x [ mulf_init::c#2 mulf_init::c#1 ] reg byte x [ mulf_init::c#2 mulf_init::c#1 ]
reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ] reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ]
reg byte x [ muls8s::b#0 ] reg byte x [ muls8s::b#0 ]
reg byte y [ mulf8s::a#0 ] reg byte a [ mulf8s::a#0 ]
reg byte x [ mulf8s::b#0 ]
reg byte y [ mul8s::b#0 ] reg byte y [ mul8s::b#0 ]
reg byte x [ mul8s_error::a#0 ] reg byte x [ mul8s_error::a#0 ]
reg byte a [ print_byte::$0 ] reg byte a [ print_byte::$0 ]
@ -468,11 +498,13 @@ reg byte a [ mul8s::$16 ]
reg byte a [ mul8s::$12 ] reg byte a [ mul8s::$12 ]
reg byte a [ mul8s::$17 ] reg byte a [ mul8s::$17 ]
reg byte a [ mul8u::$1 ] reg byte a [ mul8u::$1 ]
reg byte a [ mulf8s::$6 ] reg byte a [ mulf8s_prepared::$5 ]
reg byte a [ mulf8s::$16 ] reg byte a [ mulf8s_prepared::$15 ]
reg byte a [ mulf8s::$12 ] reg byte a [ mulf8s_prepared::$11 ]
reg byte a [ mulf8s::$17 ] reg byte a [ mulf8s_prepared::$16 ]
reg byte x [ muls8u::b#0 ] reg byte x [ muls8u::b#0 ]
reg byte a [ mulf8u::a#0 ]
reg byte x [ mulf8u::b#0 ]
reg byte x [ mul8u_error::a#0 ] reg byte x [ mul8u_error::a#0 ]
reg byte a [ mulf_init::$2 ] reg byte a [ mulf_init::$2 ]
reg byte a [ mulf_init::$5 ] reg byte a [ mulf_init::$5 ]