1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-08-02 09:29:35 +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",
parameterListHeading = "%nParameters:%n",
optionListHeading = "%nOptions:%n",
version = "KickC 0.5 (master)"
version = "KickC 0.6 BETA (master)"
)
public class KickC implements Callable<Void> {

View File

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

View File

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

View File

@ -66,26 +66,27 @@ T__64=65
T__65=66
T__66=67
T__67=68
MNEMONIC=69
KICKASM=70
SIMPLETYPE=71
STRING=72
CHAR=73
BOOLEAN=74
NUMBER=75
NUMFLOAT=76
BINFLOAT=77
DECFLOAT=78
HEXFLOAT=79
NUMINT=80
BININTEGER=81
DECINTEGER=82
HEXINTEGER=83
NAME=84
ASMREL=85
WS=86
COMMENT_LINE=87
COMMENT_BLOCK=88
T__68=69
MNEMONIC=70
KICKASM=71
SIMPLETYPE=72
STRING=73
CHAR=74
BOOLEAN=75
NUMBER=76
NUMFLOAT=77
BINFLOAT=78
DECFLOAT=79
HEXFLOAT=80
NUMINT=81
BININTEGER=82
DECINTEGER=83
HEXINTEGER=84
NAME=85
ASMREL=86
WS=87
COMMENT_LINE=88
COMMENT_BLOCK=89
'import'=1
'='=2
';'=3
@ -154,3 +155,4 @@ COMMENT_BLOCK=88
'^='=66
'.byte'=67
'#'=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__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__66=67, T__67=68, MNEMONIC=69, KICKASM=70, SIMPLETYPE=71, STRING=72,
CHAR=73, BOOLEAN=74, NUMBER=75, NUMFLOAT=76, BINFLOAT=77, DECFLOAT=78,
HEXFLOAT=79, NUMINT=80, BININTEGER=81, DECINTEGER=82, HEXINTEGER=83, NAME=84,
ASMREL=85, WS=86, COMMENT_LINE=87, COMMENT_BLOCK=88;
T__66=67, T__67=68, T__68=69, MNEMONIC=70, KICKASM=71, SIMPLETYPE=72,
STRING=73, CHAR=74, BOOLEAN=75, NUMBER=76, NUMFLOAT=77, BINFLOAT=78, DECFLOAT=79,
HEXFLOAT=80, NUMINT=81, BININTEGER=82, DECINTEGER=83, HEXINTEGER=84, NAME=85,
ASMREL=86, WS=87, COMMENT_LINE=88, COMMENT_BLOCK=89;
public static final int
RULE_file = 0, RULE_asmFile = 1, RULE_importSeq = 2, RULE_importDecl = 3,
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 = {
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, "MNEMONIC", "KICKASM",
"SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT",
"DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER",
"NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
null, null, null, null, null, null, null, null, null, null, "MNEMONIC",
"KICKASM", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT",
"BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER",
"HEXINTEGER", "NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -644,7 +644,7 @@ public class KickCParser extends Parser {
setState(123);
_errHandler.sync(this);
_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);
stmtSeq();
@ -1456,7 +1456,7 @@ public class KickCParser extends Parser {
setState(209);
_errHandler.sync(this);
_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) {
@ -1733,7 +1733,7 @@ public class KickCParser extends Parser {
setState(214);
_errHandler.sync(this);
_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);
stmtSeq();
@ -1895,7 +1895,7 @@ public class KickCParser extends Parser {
setState(272);
_errHandler.sync(this);
_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);
expr(0);
@ -2380,7 +2380,7 @@ public class KickCParser extends Parser {
setState(330);
_errHandler.sync(this);
_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);
expr(0);
@ -2812,7 +2812,7 @@ public class KickCParser extends Parser {
setState(349);
_errHandler.sync(this);
_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);
parameterList();
@ -4132,7 +4132,7 @@ public class KickCParser extends Parser {
throw new NoViableAltException(this);
}
_ctx.stop = _input.LT(-1);
setState(521);
setState(524);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,52,_ctx);
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();
_prevctx = _localctx;
{
setState(519);
setState(522);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) {
case 1:
@ -4148,8 +4148,22 @@ public class KickCParser extends Parser {
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
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);
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);
if ( !(_la==T__42 || _la==T__43) ) {
_errHandler.recoverInline(this);
@ -4159,17 +4173,17 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
setState(512);
setState(515);
asmExpr(10);
}
break;
case 2:
case 3:
{
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
setState(513);
setState(516);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
setState(514);
setState(517);
_la = _input.LA(1);
if ( !(_la==T__32 || _la==T__44) ) {
_errHandler.recoverInline(this);
@ -4179,17 +4193,17 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
setState(515);
setState(518);
asmExpr(8);
}
break;
case 3:
case 4:
{
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
setState(516);
setState(519);
if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
setState(517);
setState(520);
_la = _input.LA(1);
if ( !(_la==T__37 || _la==T__38) ) {
_errHandler.recoverInline(this);
@ -4199,14 +4213,14 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
setState(518);
setState(521);
asmExpr(7);
}
break;
}
}
}
setState(523);
setState(526);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,52,_ctx);
}
@ -4279,17 +4293,19 @@ public class KickCParser extends Parser {
private boolean asmExpr_sempred(AsmExprContext _localctx, int predIndex) {
switch (predIndex) {
case 16:
return precpred(_ctx, 9);
return precpred(_ctx, 10);
case 17:
return precpred(_ctx, 7);
return precpred(_ctx, 9);
case 18:
return precpred(_ctx, 7);
case 19:
return precpred(_ctx, 6);
}
return true;
}
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"+
"\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"+
@ -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\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\7\35\u020a\n\35\f\35\16"+
"\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"+
" \"$&(*,.\60\62\64\668\2\f\3\2&\'\3\2(,\3\2\61\62\3\2-.\4\2##/\60\3\2"+
"()\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"+
"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"+
"\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"+
"\3\2\2\2\34\u00ce\3\2\2\2\36\u00d1\3\2\2\2 \u011b\3\2\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,\u01b9"+
"\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"+
"\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"+
"\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"+
"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"+
"\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"+
"\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"+
"\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"+
"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`^\3\2\2\2ad\7V\2\2bc\7\4\2\2ce\5(\25\2db\3\2\2\2de\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\2\2ki\3\2\2\2k"+
"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"+
"\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"+
"\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"+
"\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"+
"\7\n\2\2\u0082\u0084\5\24\13\2\u0083\u0082\3\2\2\2\u0083\u0084\3\2\2\2"+
"\u0084\u0085\3\2\2\2\u0085\u0086\7H\2\2\u0086\23\3\2\2\2\u0087\u0088\7"+
"\6\2\2\u0088\u008d\5\26\f\2\u0089\u008a\7\13\2\2\u008a\u008c\5\26\f\2"+
"\u008b\u0089\3\2\2\2\u008c\u008f\3\2\2\2\u008d\u008b\3\2\2\2\u008d\u008e"+
"\3\2\2\2\u008e\u0090\3\2\2\2\u008f\u008d\3\2\2\2\u0090\u0091\7\7\2\2\u0091"+
"\25\3\2\2\2\u0092\u0093\7\f\2\2\u0093\u00a4\7J\2\2\u0094\u0095\7\r\2\2"+
"\u0095\u00a4\7V\2\2\u0096\u0097\7\16\2\2\u0097\u0098\7V\2\2\u0098\u0099"+
"\7\17\2\2\u0099\u00a4\5(\25\2\u009a\u009b\7\20\2\2\u009b\u00a4\5(\25\2"+
"\u009c\u009d\7\21\2\2\u009d\u00a4\5(\25\2\u009e\u00a1\7\22\2\2\u009f\u00a2"+
"\7\23\2\2\u00a0\u00a2\5(\25\2\u00a1\u009f\3\2\2\2\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\u0096"+
"\3\2\2\2\u00a3\u009a\3\2\2\2\u00a3\u009c\3\2\2\2\u00a3\u009e\3\2\2\2\u00a4"+
"\27\3\2\2\2\u00a5\u00aa\5\32\16\2\u00a6\u00a7\7\13\2\2\u00a7\u00a9\5\32"+
"\16\2\u00a8\u00a6\3\2\2\2\u00a9\u00ac\3\2\2\2\u00aa\u00a8\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"+
"\2\u00ae\u00ad\3\2\2\2\u00af\u00b2\3\2\2\2\u00b0\u00ae\3\2\2\2\u00b0\u00b1"+
"\3\2\2\2\u00b1\u00b3\3\2\2\2\u00b2\u00b0\3\2\2\2\u00b3\u00b7\5&\24\2\u00b4"+
"\u00b6\5\34\17\2\u00b5\u00b4\3\2\2\2\u00b6\u00b9\3\2\2\2\u00b7\u00b5\3"+
"\2\2\2\u00b7\u00b8\3\2\2\2\u00b8\u00ba\3\2\2\2\u00b9\u00b7\3\2\2\2\u00ba"+
"\u00bb\7V\2\2\u00bb\33\3\2\2\2\u00bc\u00cf\7\24\2\2\u00bd\u00cf\7\25\2"+
"\2\u00be\u00bf\7\26\2\2\u00bf\u00c0\7\6\2\2\u00c0\u00c1\7M\2\2\u00c1\u00cf"+
"\7\7\2\2\u00c2\u00c3\7\27\2\2\u00c3\u00c4\7\6\2\2\u00c4\u00c5\7V\2\2\u00c5"+
"\u00cf\7\7\2\2\u00c6\u00cf\7\23\2\2\u00c7\u00cf\7\30\2\2\u00c8\u00cc\7"+
"\31\2\2\u00c9\u00ca\7\6\2\2\u00ca\u00cb\7V\2\2\u00cb\u00cd\7\7\2\2\u00cc"+
"\u00c9\3\2\2\2\u00cc\u00cd\3\2\2\2\u00cd\u00cf\3\2\2\2\u00ce\u00bc\3\2"+
"\2\2\u00ce\u00bd\3\2\2\2\u00ce\u00be\3\2\2\2\u00ce\u00c2\3\2\2\2\u00ce"+
"\u00c6\3\2\2\2\u00ce\u00c7\3\2\2\2\u00ce\u00c8\3\2\2\2\u00cf\35\3\2\2"+
"\2\u00d0\u00d2\5 \21\2\u00d1\u00d0\3\2\2\2\u00d2\u00d3\3\2\2\2\u00d3\u00d1"+
"\3\2\2\2\u00d3\u00d4\3\2\2\2\u00d4\37\3\2\2\2\u00d5\u011c\5\16\b\2\u00d6"+
"\u00d8\7\b\2\2\u00d7\u00d9\5\36\20\2\u00d8\u00d7\3\2\2\2\u00d8\u00d9\3"+
"\2\2\2\u00d9\u00da\3\2\2\2\u00da\u011c\7\t\2\2\u00db\u00dc\5(\25\2\u00dc"+
"\u00dd\7\5\2\2\u00dd\u011c\3\2\2\2\u00de\u00df\7\32\2\2\u00df\u00e0\7"+
"\6\2\2\u00e0\u00e1\5(\25\2\u00e1\u00e2\7\7\2\2\u00e2\u00e5\5 \21\2\u00e3"+
"\u00e4\7\33\2\2\u00e4\u00e6\5 \21\2\u00e5\u00e3\3\2\2\2\u00e5\u00e6\3"+
"\2\2\2\u00e6\u011c\3\2\2\2\u00e7\u00e9\5\34\17\2\u00e8\u00e7\3\2\2\2\u00e9"+
"\u00ec\3\2\2\2\u00ea\u00e8\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb\u00ed\3\2"+
"\2\2\u00ec\u00ea\3\2\2\2\u00ed\u00ee\7\34\2\2\u00ee\u00ef\7\6\2\2\u00ef"+
"\u00f0\5(\25\2\u00f0\u00f1\7\7\2\2\u00f1\u00f2\5 \21\2\u00f2\u011c\3\2"+
"\2\2\u00f3\u00f5\5\34\17\2\u00f4\u00f3\3\2\2\2\u00f5\u00f8\3\2\2\2\u00f6"+
"\u00f4\3\2\2\2\u00f6\u00f7\3\2\2\2\u00f7\u00f9\3\2\2\2\u00f8\u00f6\3\2"+
"\2\2\u00f9\u00fa\7\35\2\2\u00fa\u00fb\5 \21\2\u00fb\u00fc\7\34\2\2\u00fc"+
"\u00fd\7\6\2\2\u00fd\u00fe\5(\25\2\u00fe\u00ff\7\7\2\2\u00ff\u0100\7\5"+
"\2\2\u0100\u011c\3\2\2\2\u0101\u0103\5\34\17\2\u0102\u0101\3\2\2\2\u0103"+
"\u0106\3\2\2\2\u0104\u0102\3\2\2\2\u0104\u0105\3\2\2\2\u0105\u0107\3\2"+
"\2\2\u0106\u0104\3\2\2\2\u0107\u0108\7\36\2\2\u0108\u010a\7\6\2\2\u0109"+
"\u010b\5\"\22\2\u010a\u0109\3\2\2\2\u010a\u010b\3\2\2\2\u010b\u010c\3"+
"\2\2\2\u010c\u010d\5$\23\2\u010d\u010e\7\7\2\2\u010e\u010f\5 \21\2\u010f"+
"\u011c\3\2\2\2\u0110\u0112\7\37\2\2\u0111\u0113\5(\25\2\u0112\u0111\3"+
"\2\2\2\u0112\u0113\3\2\2\2\u0113\u0114\3\2\2\2\u0114\u011c\7\5\2\2\u0115"+
"\u0116\7 \2\2\u0116\u0117\7\b\2\2\u0117\u0118\5,\27\2\u0118\u0119\7\t"+
"\2\2\u0119\u011c\3\2\2\2\u011a\u011c\5\22\n\2\u011b\u00d5\3\2\2\2\u011b"+
"\u00d6\3\2\2\2\u011b\u00db\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\2\2\u011b\u0110\3\2\2\2\u011b"+
"\u0115\3\2\2\2\u011b\u011a\3\2\2\2\u011c!\3\2\2\2\u011d\u011f\5\34\17"+
"\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\u0121\u0124\3\2\2\2\u0122\u0120\3\2\2\2\u0123\u0125\5&\24\2\u0124"+
"\u0123\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u0129\3\2\2\2\u0126\u0128\5\34"+
"\17\2\u0127\u0126\3\2\2\2\u0128\u012b\3\2\2\2\u0129\u0127\3\2\2\2\u0129"+
"\u012a\3\2\2\2\u012a\u012c\3\2\2\2\u012b\u0129\3\2\2\2\u012c\u012f\7V"+
"\2\2\u012d\u012e\7\4\2\2\u012e\u0130\5(\25\2\u012f\u012d\3\2\2\2\u012f"+
"\u0130\3\2\2\2\u0130#\3\2\2\2\u0131\u0132\7\5\2\2\u0132\u0133\5(\25\2"+
"\u0133\u0134\7\5\2\2\u0134\u0135\5(\25\2\u0135\u013c\3\2\2\2\u0136\u0137"+
"\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\u013b\u0131\3\2\2\2\u013b\u0136\3\2\2\2\u013c%\3\2\2\2"+
"\u013d\u013e\b\24\1\2\u013e\u013f\7\6\2\2\u013f\u0140\5&\24\2\u0140\u0141"+
"\7\7\2\2\u0141\u0146\3\2\2\2\u0142\u0146\7I\2\2\u0143\u0144\7\"\2\2\u0144"+
"\u0146\7I\2\2\u0145\u013d\3\2\2\2\u0145\u0142\3\2\2\2\u0145\u0143\3\2"+
"\2\2\u0146\u0154\3\2\2\2\u0147\u0148\f\5\2\2\u0148\u0153\7#\2\2\u0149"+
"\u014a\f\4\2\2\u014a\u014c\7$\2\2\u014b\u014d\5(\25\2\u014c\u014b\3\2"+
"\2\2\u014c\u014d\3\2\2\2\u014d\u014e\3\2\2\2\u014e\u0153\7%\2\2\u014f"+
"\u0150\f\3\2\2\u0150\u0151\7\6\2\2\u0151\u0153\7\7\2\2\u0152\u0147\3\2"+
"\2\2\u0152\u0149\3\2\2\2\u0152\u014f\3\2\2\2\u0153\u0156\3\2\2\2\u0154"+
"\u0152\3\2\2\2\u0154\u0155\3\2\2\2\u0155\'\3\2\2\2\u0156\u0154\3\2\2\2"+
"\u0157\u0158\b\25\1\2\u0158\u0159\7\6\2\2\u0159\u015a\5(\25\2\u015a\u015b"+
"\7\7\2\2\u015b\u0180\3\2\2\2\u015c\u015d\7V\2\2\u015d\u015f\7\6\2\2\u015e"+
"\u0160\5*\26\2\u015f\u015e\3\2\2\2\u015f\u0160\3\2\2\2\u0160\u0161\3\2"+
"\2\2\u0161\u0180\7\7\2\2\u0162\u0163\7\6\2\2\u0163\u0164\5&\24\2\u0164"+
"\u0165\7\7\2\2\u0165\u0166\5(\25\31\u0166\u0180\3\2\2\2\u0167\u0168\t"+
"\2\2\2\u0168\u0180\5(\25\30\u0169\u016a\7#\2\2\u016a\u0180\5(\25\26\u016b"+
"\u016c\t\3\2\2\u016c\u0180\5(\25\25\u016d\u016e\t\4\2\2\u016e\u0180\5"+
"(\25\21\u016f\u0170\7\b\2\2\u0170\u0175\5(\25\2\u0171\u0172\7\13\2\2\u0172"+
"\u0174\5(\25\2\u0173\u0171\3\2\2\2\u0174\u0177\3\2\2\2\u0175\u0173\3\2"+
"\2\2\u0175\u0176\3\2\2\2\u0176\u0178\3\2\2\2\u0177\u0175\3\2\2\2\u0178"+
"\u0179\7\t\2\2\u0179\u0180\3\2\2\2\u017a\u0180\7V\2\2\u017b\u0180\7M\2"+
"\2\u017c\u0180\7J\2\2\u017d\u0180\7K\2\2\u017e\u0180\7L\2\2\u017f\u0157"+
"\3\2\2\2\u017f\u015c\3\2\2\2\u017f\u0162\3\2\2\2\u017f\u0167\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"+
"\2\2\u017f\u017a\3\2\2\2\u017f\u017b\3\2\2\2\u017f\u017c\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"+
"\2\2\u0182\u0183\t\5\2\2\u0183\u01aa\5(\25\25\u0184\u0185\f\23\2\2\u0185"+
"\u0186\t\6\2\2\u0186\u01aa\5(\25\24\u0187\u0188\f\22\2\2\u0188\u0189\t"+
"\7\2\2\u0189\u01aa\5(\25\23\u018a\u018b\f\20\2\2\u018b\u018c\t\b\2\2\u018c"+
"\u01aa\5(\25\21\u018d\u018e\f\17\2\2\u018e\u018f\7+\2\2\u018f\u01aa\5"+
"(\25\20\u0190\u0191\f\16\2\2\u0191\u0192\7\67\2\2\u0192\u01aa\5(\25\17"+
"\u0193\u0194\f\r\2\2\u0194\u0195\78\2\2\u0195\u01aa\5(\25\16\u0196\u0197"+
"\f\f\2\2\u0197\u0198\79\2\2\u0198\u01aa\5(\25\r\u0199\u019a\f\13\2\2\u019a"+
"\u019b\7:\2\2\u019b\u01aa\5(\25\f\u019c\u019d\f\n\2\2\u019d\u019e\7\4"+
"\2\2\u019e\u01aa\5(\25\n\u019f\u01a0\f\t\2\2\u01a0\u01a1\t\t\2\2\u01a1"+
"\u01aa\5(\25\t\u01a2\u01a3\f\32\2\2\u01a3\u01a4\7$\2\2\u01a4\u01a5\5("+
"\25\2\u01a5\u01a6\7%\2\2\u01a6\u01aa\3\2\2\2\u01a7\u01a8\f\27\2\2\u01a8"+
"\u01aa\t\2\2\2\u01a9\u0181\3\2\2\2\u01a9\u0184\3\2\2\2\u01a9\u0187\3\2"+
"\2\2\u01a9\u018a\3\2\2\2\u01a9\u018d\3\2\2\2\u01a9\u0190\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"+
"\2\2\u01a9\u019f\3\2\2\2\u01a9\u01a2\3\2\2\2\u01a9\u01a7\3\2\2\2\u01aa"+
"\u01ad\3\2\2\2\u01ab\u01a9\3\2\2\2\u01ab\u01ac\3\2\2\2\u01ac)\3\2\2\2"+
"\u01ad\u01ab\3\2\2\2\u01ae\u01b3\5(\25\2\u01af\u01b0\7\13\2\2\u01b0\u01b2"+
"\5(\25\2\u01b1\u01af\3\2\2\2\u01b2\u01b5\3\2\2\2\u01b3\u01b1\3\2\2\2\u01b3"+
"\u01b4\3\2\2\2\u01b4+\3\2\2\2\u01b5\u01b3\3\2\2\2\u01b6\u01b8\5.\30\2"+
"\u01b7\u01b6\3\2\2\2\u01b8\u01bb\3\2\2\2\u01b9\u01b7\3\2\2\2\u01b9\u01ba"+
"\3\2\2\2\u01ba-\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bc\u01c0\5\60\31\2\u01bd"+
"\u01c0\5\62\32\2\u01be\u01c0\5\64\33\2\u01bf\u01bc\3\2\2\2\u01bf\u01bd"+
"\3\2\2\2\u01bf\u01be\3\2\2\2\u01c0/\3\2\2\2\u01c1\u01c2\7V\2\2\u01c2\u01c9"+
"\7\17\2\2\u01c3\u01c5\7*\2\2\u01c4\u01c6\7V\2\2\u01c5\u01c4\3\2\2\2\u01c5"+
"\u01c6\3\2\2\2\u01c6\u01c7\3\2\2\2\u01c7\u01c9\7\17\2\2\u01c8\u01c1\3"+
"\2\2\2\u01c8\u01c3\3\2\2\2\u01c9\61\3\2\2\2\u01ca\u01cc\7G\2\2\u01cb\u01cd"+
"\5\66\34\2\u01cc\u01cb\3\2\2\2\u01cc\u01cd\3\2\2\2\u01cd\63\3\2\2\2\u01ce"+
"\u01cf\7E\2\2\u01cf\u01d4\58\35\2\u01d0\u01d1\7\13\2\2\u01d1\u01d3\58"+
"\35\2\u01d2\u01d0\3\2\2\2\u01d3\u01d6\3\2\2\2\u01d4\u01d2\3\2\2\2\u01d4"+
"\u01d5\3\2\2\2\u01d5\65\3\2\2\2\u01d6\u01d4\3\2\2\2\u01d7\u01ef\58\35"+
"\2\u01d8\u01d9\7F\2\2\u01d9\u01ef\58\35\2\u01da\u01db\58\35\2\u01db\u01dc"+
"\7\13\2\2\u01dc\u01dd\7V\2\2\u01dd\u01ef\3\2\2\2\u01de\u01df\7\6\2\2\u01df"+
"\u01e0\58\35\2\u01e0\u01e1\7\7\2\2\u01e1\u01e2\7\13\2\2\u01e2\u01e3\7"+
"V\2\2\u01e3\u01ef\3\2\2\2\u01e4\u01e5\7\6\2\2\u01e5\u01e6\58\35\2\u01e6"+
"\u01e7\7\13\2\2\u01e7\u01e8\7V\2\2\u01e8\u01e9\7\7\2\2\u01e9\u01ef\3\2"+
"\2\2\u01ea\u01eb\7\6\2\2\u01eb\u01ec\58\35\2\u01ec\u01ed\7\7\2\2\u01ed"+
"\u01ef\3\2\2\2\u01ee\u01d7\3\2\2\2\u01ee\u01d8\3\2\2\2\u01ee\u01da\3\2"+
"\2\2\u01ee\u01de\3\2\2\2\u01ee\u01e4\3\2\2\2\u01ee\u01ea\3\2\2\2\u01ef"+
"\67\3\2\2\2\u01f0\u01f1\b\35\1\2\u01f1\u01f2\7$\2\2\u01f2\u01f3\58\35"+
"\2\u01f3\u01f4\7%\2\2\u01f4\u01ff\3\2\2\2\u01f5\u01f6\t\n\2\2\u01f6\u01ff"+
"\58\35\n\u01f7\u01ff\7V\2\2\u01f8\u01ff\7W\2\2\u01f9\u01fa\7\b\2\2\u01fa"+
"\u01fb\7V\2\2\u01fb\u01ff\7\t\2\2\u01fc\u01ff\7M\2\2\u01fd\u01ff\7K\2"+
"\2\u01fe\u01f0\3\2\2\2\u01fe\u01f5\3\2\2\2\u01fe\u01f7\3\2\2\2\u01fe\u01f8"+
"\3\2\2\2\u01fe\u01f9\3\2\2\2\u01fe\u01fc\3\2\2\2\u01fe\u01fd\3\2\2\2\u01ff"+
"\u020b\3\2\2\2\u0200\u0201\f\13\2\2\u0201\u0202\t\5\2\2\u0202\u020a\5"+
"8\35\f\u0203\u0204\f\t\2\2\u0204\u0205\t\13\2\2\u0205\u020a\58\35\n\u0206"+
"\u0207\f\b\2\2\u0207\u0208\t\7\2\2\u0208\u020a\58\35\t\u0209\u0200\3\2"+
"\2\2\u0209\u0203\3\2\2\2\u0209\u0206\3\2\2\2\u020a\u020d\3\2\2\2\u020b"+
"\u0209\3\2\2\2\u020b\u020c\3\2\2\2\u020c9\3\2\2\2\u020d\u020b\3\2\2\2"+
"\67DMRW^dkrx}\u0083\u008d\u00a1\u00a3\u00aa\u00b0\u00b7\u00cc\u00ce\u00d3"+
"\u00d8\u00e5\u00ea\u00f6\u0104\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\u0209\u020b";
"\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"+
"\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"+
"\30\32\34\36 \"$&(*,.\60\62\64\668\2\f\3\2&\'\3\2(,\3\2\61\62\3\2-.\4"+
"\2##/\60\3\2()\3\2\61\66\3\2;D\4\2()\61\62\4\2##//\2\u0260\2:\3\2\2\2"+
"\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"+
"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\32\u00b0\3\2\2\2\34\u00ce\3\2\2\2\36\u00d1\3\2\2\2 \u011b\3\2"+
"\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,\u01b9\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\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\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\2DB\3\2\2\2DE\3\2\2\2E\7\3\2\2\2FD\3\2\2\2GH\7\3\2\2HI\7"+
"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"+
"\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"+
"\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"+
"\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"+
"^_\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"+
"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"+
"\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"+
"\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"+
"\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|~"+
"\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"+
"\3\2\2\2\u0081\u0083\7\n\2\2\u0082\u0084\5\24\13\2\u0083\u0082\3\2\2\2"+
"\u0083\u0084\3\2\2\2\u0084\u0085\3\2\2\2\u0085\u0086\7I\2\2\u0086\23\3"+
"\2\2\2\u0087\u0088\7\6\2\2\u0088\u008d\5\26\f\2\u0089\u008a\7\13\2\2\u008a"+
"\u008c\5\26\f\2\u008b\u0089\3\2\2\2\u008c\u008f\3\2\2\2\u008d\u008b\3"+
"\2\2\2\u008d\u008e\3\2\2\2\u008e\u0090\3\2\2\2\u008f\u008d\3\2\2\2\u0090"+
"\u0091\7\7\2\2\u0091\25\3\2\2\2\u0092\u0093\7\f\2\2\u0093\u00a4\7K\2\2"+
"\u0094\u0095\7\r\2\2\u0095\u00a4\7W\2\2\u0096\u0097\7\16\2\2\u0097\u0098"+
"\7W\2\2\u0098\u0099\7\17\2\2\u0099\u00a4\5(\25\2\u009a\u009b\7\20\2\2"+
"\u009b\u00a4\5(\25\2\u009c\u009d\7\21\2\2\u009d\u00a4\5(\25\2\u009e\u00a1"+
"\7\22\2\2\u009f\u00a2\7\23\2\2\u00a0\u00a2\5(\25\2\u00a1\u009f\3\2\2\2"+
"\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\u0096\3\2\2\2\u00a3\u009a\3\2\2\2\u00a3\u009c\3\2\2\2\u00a3"+
"\u009e\3\2\2\2\u00a4\27\3\2\2\2\u00a5\u00aa\5\32\16\2\u00a6\u00a7\7\13"+
"\2\2\u00a7\u00a9\5\32\16\2\u00a8\u00a6\3\2\2\2\u00a9\u00ac\3\2\2\2\u00aa"+
"\u00a8\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\2\u00ae\u00ad\3\2\2\2\u00af\u00b2\3\2\2\2\u00b0"+
"\u00ae\3\2\2\2\u00b0\u00b1\3\2\2\2\u00b1\u00b3\3\2\2\2\u00b2\u00b0\3\2"+
"\2\2\u00b3\u00b7\5&\24\2\u00b4\u00b6\5\34\17\2\u00b5\u00b4\3\2\2\2\u00b6"+
"\u00b9\3\2\2\2\u00b7\u00b5\3\2\2\2\u00b7\u00b8\3\2\2\2\u00b8\u00ba\3\2"+
"\2\2\u00b9\u00b7\3\2\2\2\u00ba\u00bb\7W\2\2\u00bb\33\3\2\2\2\u00bc\u00cf"+
"\7\24\2\2\u00bd\u00cf\7\25\2\2\u00be\u00bf\7\26\2\2\u00bf\u00c0\7\6\2"+
"\2\u00c0\u00c1\7N\2\2\u00c1\u00cf\7\7\2\2\u00c2\u00c3\7\27\2\2\u00c3\u00c4"+
"\7\6\2\2\u00c4\u00c5\7W\2\2\u00c5\u00cf\7\7\2\2\u00c6\u00cf\7\23\2\2\u00c7"+
"\u00cf\7\30\2\2\u00c8\u00cc\7\31\2\2\u00c9\u00ca\7\6\2\2\u00ca\u00cb\7"+
"W\2\2\u00cb\u00cd\7\7\2\2\u00cc\u00c9\3\2\2\2\u00cc\u00cd\3\2\2\2\u00cd"+
"\u00cf\3\2\2\2\u00ce\u00bc\3\2\2\2\u00ce\u00bd\3\2\2\2\u00ce\u00be\3\2"+
"\2\2\u00ce\u00c2\3\2\2\2\u00ce\u00c6\3\2\2\2\u00ce\u00c7\3\2\2\2\u00ce"+
"\u00c8\3\2\2\2\u00cf\35\3\2\2\2\u00d0\u00d2\5 \21\2\u00d1\u00d0\3\2\2"+
"\2\u00d2\u00d3\3\2\2\2\u00d3\u00d1\3\2\2\2\u00d3\u00d4\3\2\2\2\u00d4\37"+
"\3\2\2\2\u00d5\u011c\5\16\b\2\u00d6\u00d8\7\b\2\2\u00d7\u00d9\5\36\20"+
"\2\u00d8\u00d7\3\2\2\2\u00d8\u00d9\3\2\2\2\u00d9\u00da\3\2\2\2\u00da\u011c"+
"\7\t\2\2\u00db\u00dc\5(\25\2\u00dc\u00dd\7\5\2\2\u00dd\u011c\3\2\2\2\u00de"+
"\u00df\7\32\2\2\u00df\u00e0\7\6\2\2\u00e0\u00e1\5(\25\2\u00e1\u00e2\7"+
"\7\2\2\u00e2\u00e5\5 \21\2\u00e3\u00e4\7\33\2\2\u00e4\u00e6\5 \21\2\u00e5"+
"\u00e3\3\2\2\2\u00e5\u00e6\3\2\2\2\u00e6\u011c\3\2\2\2\u00e7\u00e9\5\34"+
"\17\2\u00e8\u00e7\3\2\2\2\u00e9\u00ec\3\2\2\2\u00ea\u00e8\3\2\2\2\u00ea"+
"\u00eb\3\2\2\2\u00eb\u00ed\3\2\2\2\u00ec\u00ea\3\2\2\2\u00ed\u00ee\7\34"+
"\2\2\u00ee\u00ef\7\6\2\2\u00ef\u00f0\5(\25\2\u00f0\u00f1\7\7\2\2\u00f1"+
"\u00f2\5 \21\2\u00f2\u011c\3\2\2\2\u00f3\u00f5\5\34\17\2\u00f4\u00f3\3"+
"\2\2\2\u00f5\u00f8\3\2\2\2\u00f6\u00f4\3\2\2\2\u00f6\u00f7\3\2\2\2\u00f7"+
"\u00f9\3\2\2\2\u00f8\u00f6\3\2\2\2\u00f9\u00fa\7\35\2\2\u00fa\u00fb\5"+
" \21\2\u00fb\u00fc\7\34\2\2\u00fc\u00fd\7\6\2\2\u00fd\u00fe\5(\25\2\u00fe"+
"\u00ff\7\7\2\2\u00ff\u0100\7\5\2\2\u0100\u011c\3\2\2\2\u0101\u0103\5\34"+
"\17\2\u0102\u0101\3\2\2\2\u0103\u0106\3\2\2\2\u0104\u0102\3\2\2\2\u0104"+
"\u0105\3\2\2\2\u0105\u0107\3\2\2\2\u0106\u0104\3\2\2\2\u0107\u0108\7\36"+
"\2\2\u0108\u010a\7\6\2\2\u0109\u010b\5\"\22\2\u010a\u0109\3\2\2\2\u010a"+
"\u010b\3\2\2\2\u010b\u010c\3\2\2\2\u010c\u010d\5$\23\2\u010d\u010e\7\7"+
"\2\2\u010e\u010f\5 \21\2\u010f\u011c\3\2\2\2\u0110\u0112\7\37\2\2\u0111"+
"\u0113\5(\25\2\u0112\u0111\3\2\2\2\u0112\u0113\3\2\2\2\u0113\u0114\3\2"+
"\2\2\u0114\u011c\7\5\2\2\u0115\u0116\7 \2\2\u0116\u0117\7\b\2\2\u0117"+
"\u0118\5,\27\2\u0118\u0119\7\t\2\2\u0119\u011c\3\2\2\2\u011a\u011c\5\22"+
"\n\2\u011b\u00d5\3\2\2\2\u011b\u00d6\3\2\2\2\u011b\u00db\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"+
"\2\2\u011b\u0110\3\2\2\2\u011b\u0115\3\2\2\2\u011b\u011a\3\2\2\2\u011c"+
"!\3\2\2\2\u011d\u011f\5\34\17\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\u0121\u0124\3\2\2\2\u0122\u0120"+
"\3\2\2\2\u0123\u0125\5&\24\2\u0124\u0123\3\2\2\2\u0124\u0125\3\2\2\2\u0125"+
"\u0129\3\2\2\2\u0126\u0128\5\34\17\2\u0127\u0126\3\2\2\2\u0128\u012b\3"+
"\2\2\2\u0129\u0127\3\2\2\2\u0129\u012a\3\2\2\2\u012a\u012c\3\2\2\2\u012b"+
"\u0129\3\2\2\2\u012c\u012f\7W\2\2\u012d\u012e\7\4\2\2\u012e\u0130\5(\25"+
"\2\u012f\u012d\3\2\2\2\u012f\u0130\3\2\2\2\u0130#\3\2\2\2\u0131\u0132"+
"\7\5\2\2\u0132\u0133\5(\25\2\u0133\u0134\7\5\2\2\u0134\u0135\5(\25\2\u0135"+
"\u013c\3\2\2\2\u0136\u0137\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\u013b\u0131\3\2\2\2\u013b"+
"\u0136\3\2\2\2\u013c%\3\2\2\2\u013d\u013e\b\24\1\2\u013e\u013f\7\6\2\2"+
"\u013f\u0140\5&\24\2\u0140\u0141\7\7\2\2\u0141\u0146\3\2\2\2\u0142\u0146"+
"\7J\2\2\u0143\u0144\7\"\2\2\u0144\u0146\7J\2\2\u0145\u013d\3\2\2\2\u0145"+
"\u0142\3\2\2\2\u0145\u0143\3\2\2\2\u0146\u0154\3\2\2\2\u0147\u0148\f\5"+
"\2\2\u0148\u0153\7#\2\2\u0149\u014a\f\4\2\2\u014a\u014c\7$\2\2\u014b\u014d"+
"\5(\25\2\u014c\u014b\3\2\2\2\u014c\u014d\3\2\2\2\u014d\u014e\3\2\2\2\u014e"+
"\u0153\7%\2\2\u014f\u0150\f\3\2\2\u0150\u0151\7\6\2\2\u0151\u0153\7\7"+
"\2\2\u0152\u0147\3\2\2\2\u0152\u0149\3\2\2\2\u0152\u014f\3\2\2\2\u0153"+
"\u0156\3\2\2\2\u0154\u0152\3\2\2\2\u0154\u0155\3\2\2\2\u0155\'\3\2\2\2"+
"\u0156\u0154\3\2\2\2\u0157\u0158\b\25\1\2\u0158\u0159\7\6\2\2\u0159\u015a"+
"\5(\25\2\u015a\u015b\7\7\2\2\u015b\u0180\3\2\2\2\u015c\u015d\7W\2\2\u015d"+
"\u015f\7\6\2\2\u015e\u0160\5*\26\2\u015f\u015e\3\2\2\2\u015f\u0160\3\2"+
"\2\2\u0160\u0161\3\2\2\2\u0161\u0180\7\7\2\2\u0162\u0163\7\6\2\2\u0163"+
"\u0164\5&\24\2\u0164\u0165\7\7\2\2\u0165\u0166\5(\25\31\u0166\u0180\3"+
"\2\2\2\u0167\u0168\t\2\2\2\u0168\u0180\5(\25\30\u0169\u016a\7#\2\2\u016a"+
"\u0180\5(\25\26\u016b\u016c\t\3\2\2\u016c\u0180\5(\25\25\u016d\u016e\t"+
"\4\2\2\u016e\u0180\5(\25\21\u016f\u0170\7\b\2\2\u0170\u0175\5(\25\2\u0171"+
"\u0172\7\13\2\2\u0172\u0174\5(\25\2\u0173\u0171\3\2\2\2\u0174\u0177\3"+
"\2\2\2\u0175\u0173\3\2\2\2\u0175\u0176\3\2\2\2\u0176\u0178\3\2\2\2\u0177"+
"\u0175\3\2\2\2\u0178\u0179\7\t\2\2\u0179\u0180\3\2\2\2\u017a\u0180\7W"+
"\2\2\u017b\u0180\7N\2\2\u017c\u0180\7K\2\2\u017d\u0180\7L\2\2\u017e\u0180"+
"\7M\2\2\u017f\u0157\3\2\2\2\u017f\u015c\3\2\2\2\u017f\u0162\3\2\2\2\u017f"+
"\u0167\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\2\2\u017f\u017a\3\2\2\2\u017f\u017b\3\2\2\2\u017f"+
"\u017c\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\2\2\u0182\u0183\t\5\2\2\u0183\u01aa\5(\25\25\u0184"+
"\u0185\f\23\2\2\u0185\u0186\t\6\2\2\u0186\u01aa\5(\25\24\u0187\u0188\f"+
"\22\2\2\u0188\u0189\t\7\2\2\u0189\u01aa\5(\25\23\u018a\u018b\f\20\2\2"+
"\u018b\u018c\t\b\2\2\u018c\u01aa\5(\25\21\u018d\u018e\f\17\2\2\u018e\u018f"+
"\7+\2\2\u018f\u01aa\5(\25\20\u0190\u0191\f\16\2\2\u0191\u0192\7\67\2\2"+
"\u0192\u01aa\5(\25\17\u0193\u0194\f\r\2\2\u0194\u0195\78\2\2\u0195\u01aa"+
"\5(\25\16\u0196\u0197\f\f\2\2\u0197\u0198\79\2\2\u0198\u01aa\5(\25\r\u0199"+
"\u019a\f\13\2\2\u019a\u019b\7:\2\2\u019b\u01aa\5(\25\f\u019c\u019d\f\n"+
"\2\2\u019d\u019e\7\4\2\2\u019e\u01aa\5(\25\n\u019f\u01a0\f\t\2\2\u01a0"+
"\u01a1\t\t\2\2\u01a1\u01aa\5(\25\t\u01a2\u01a3\f\32\2\2\u01a3\u01a4\7"+
"$\2\2\u01a4\u01a5\5(\25\2\u01a5\u01a6\7%\2\2\u01a6\u01aa\3\2\2\2\u01a7"+
"\u01a8\f\27\2\2\u01a8\u01aa\t\2\2\2\u01a9\u0181\3\2\2\2\u01a9\u0184\3"+
"\2\2\2\u01a9\u0187\3\2\2\2\u01a9\u018a\3\2\2\2\u01a9\u018d\3\2\2\2\u01a9"+
"\u0190\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\2\2\u01a9\u019f\3\2\2\2\u01a9\u01a2\3\2\2\2\u01a9"+
"\u01a7\3\2\2\2\u01aa\u01ad\3\2\2\2\u01ab\u01a9\3\2\2\2\u01ab\u01ac\3\2"+
"\2\2\u01ac)\3\2\2\2\u01ad\u01ab\3\2\2\2\u01ae\u01b3\5(\25\2\u01af\u01b0"+
"\7\13\2\2\u01b0\u01b2\5(\25\2\u01b1\u01af\3\2\2\2\u01b2\u01b5\3\2\2\2"+
"\u01b3\u01b1\3\2\2\2\u01b3\u01b4\3\2\2\2\u01b4+\3\2\2\2\u01b5\u01b3\3"+
"\2\2\2\u01b6\u01b8\5.\30\2\u01b7\u01b6\3\2\2\2\u01b8\u01bb\3\2\2\2\u01b9"+
"\u01b7\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba-\3\2\2\2\u01bb\u01b9\3\2\2\2"+
"\u01bc\u01c0\5\60\31\2\u01bd\u01c0\5\62\32\2\u01be\u01c0\5\64\33\2\u01bf"+
"\u01bc\3\2\2\2\u01bf\u01bd\3\2\2\2\u01bf\u01be\3\2\2\2\u01c0/\3\2\2\2"+
"\u01c1\u01c2\7W\2\2\u01c2\u01c9\7\17\2\2\u01c3\u01c5\7*\2\2\u01c4\u01c6"+
"\7W\2\2\u01c5\u01c4\3\2\2\2\u01c5\u01c6\3\2\2\2\u01c6\u01c7\3\2\2\2\u01c7"+
"\u01c9\7\17\2\2\u01c8\u01c1\3\2\2\2\u01c8\u01c3\3\2\2\2\u01c9\61\3\2\2"+
"\2\u01ca\u01cc\7H\2\2\u01cb\u01cd\5\66\34\2\u01cc\u01cb\3\2\2\2\u01cc"+
"\u01cd\3\2\2\2\u01cd\63\3\2\2\2\u01ce\u01cf\7E\2\2\u01cf\u01d4\58\35\2"+
"\u01d0\u01d1\7\13\2\2\u01d1\u01d3\58\35\2\u01d2\u01d0\3\2\2\2\u01d3\u01d6"+
"\3\2\2\2\u01d4\u01d2\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5\65\3\2\2\2\u01d6"+
"\u01d4\3\2\2\2\u01d7\u01ef\58\35\2\u01d8\u01d9\7F\2\2\u01d9\u01ef\58\35"+
"\2\u01da\u01db\58\35\2\u01db\u01dc\7\13\2\2\u01dc\u01dd\7W\2\2\u01dd\u01ef"+
"\3\2\2\2\u01de\u01df\7\6\2\2\u01df\u01e0\58\35\2\u01e0\u01e1\7\7\2\2\u01e1"+
"\u01e2\7\13\2\2\u01e2\u01e3\7W\2\2\u01e3\u01ef\3\2\2\2\u01e4\u01e5\7\6"+
"\2\2\u01e5\u01e6\58\35\2\u01e6\u01e7\7\13\2\2\u01e7\u01e8\7W\2\2\u01e8"+
"\u01e9\7\7\2\2\u01e9\u01ef\3\2\2\2\u01ea\u01eb\7\6\2\2\u01eb\u01ec\58"+
"\35\2\u01ec\u01ed\7\7\2\2\u01ed\u01ef\3\2\2\2\u01ee\u01d7\3\2\2\2\u01ee"+
"\u01d8\3\2\2\2\u01ee\u01da\3\2\2\2\u01ee\u01de\3\2\2\2\u01ee\u01e4\3\2"+
"\2\2\u01ee\u01ea\3\2\2\2\u01ef\67\3\2\2\2\u01f0\u01f1\b\35\1\2\u01f1\u01f2"+
"\7$\2\2\u01f2\u01f3\58\35\2\u01f3\u01f4\7%\2\2\u01f4\u01ff\3\2\2\2\u01f5"+
"\u01f6\t\n\2\2\u01f6\u01ff\58\35\n\u01f7\u01ff\7W\2\2\u01f8\u01ff\7X\2"+
"\2\u01f9\u01fa\7\b\2\2\u01fa\u01fb\7W\2\2\u01fb\u01ff\7\t\2\2\u01fc\u01ff"+
"\7N\2\2\u01fd\u01ff\7L\2\2\u01fe\u01f0\3\2\2\2\u01fe\u01f5\3\2\2\2\u01fe"+
"\u01f7\3\2\2\2\u01fe\u01f8\3\2\2\2\u01fe\u01f9\3\2\2\2\u01fe\u01fc\3\2"+
"\2\2\u01fe\u01fd\3\2\2\2\u01ff\u020e\3\2\2\2\u0200\u0201\f\f\2\2\u0201"+
"\u0202\7G\2\2\u0202\u020d\58\35\r\u0203\u0204\f\13\2\2\u0204\u0205\t\5"+
"\2\2\u0205\u020d\58\35\f\u0206\u0207\f\t\2\2\u0207\u0208\t\13\2\2\u0208"+
"\u020d\58\35\n\u0209\u020a\f\b\2\2\u020a\u020b\t\7\2\2\u020b\u020d\58"+
"\35\t\u020c\u0200\3\2\2\2\u020c\u0203\3\2\2\2\u020c\u0206\3\2\2\2\u020c"+
"\u0209\3\2\2\2\u020d\u0210\3\2\2\2\u020e\u020c\3\2\2\2\u020e\u020f\3\2"+
"\2\2\u020f9\3\2\2\2\u0210\u020e\3\2\2\2\67DMRW^dkrx}\u0083\u008d\u00a1"+
"\u00a3\u00aa\u00b0\u00b7\u00cc\u00ce\u00d3\u00d8\u00e5\u00ea\u00f6\u0104"+
"\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 =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -48,7 +48,7 @@ void mulf_init() {
// Fast multiply two unsigned bytes to a word result
// 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* memB = $ff;
*memA = a;
@ -76,9 +76,77 @@ word mulf8u(byte a, byte b) {
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
// 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);
if(a<0) {
>m = (>m)-(byte)b;

View File

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

View File

@ -8,10 +8,8 @@ import "fastmultiply"
byte* SCREEN = $0400;
byte* SPRITE = $3000;
byte* COS_LO = $2000;
byte* COS_HI = $2200;
byte* SIN_LO = COS_LO+$40; // sin(x) = cos(x+PI/2)
byte* SIN_HI = COS_HI+$40; // sin(x) = cos(x+PI/2)
byte* COS = $2000;
byte* SIN = COS+$40; // sin(x) = cos(x+PI/2)
void main() {
asm { sei }
@ -46,10 +44,17 @@ void anim() {
while(true) {
while(*RASTER!=$ff) {}
(*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 word xr = mulf8s(cos_a, x)<<1 - mulf8s(sin_a, y)<<1; // signed fixed[8.8]
signed word yr = mulf8s(cos_a, y)<<1 + mulf8s(sin_a, x)<<1; // signed fixed[8.8]
signed byte cos_a = (signed byte) COS[angle]; // signed fixed[0.7]
mulf8s_prepare(cos_a);
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 ypos = ((signed byte) >yr) + 89 + 51;
SPRITES_XPOS[0] = <xpos;
@ -60,19 +65,7 @@ void anim() {
}
}
kickasm(pc COS_LO) {{
{
.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) {{
kickasm(pc COS) {{
{
.var min = -$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
[0] phi() [ ] ( )
to:@31
@31: scope:[] from @begin
to:@37
@37: scope:[] from @begin
[1] phi() [ ] ( )
[2] call main [ ] ( )
to:@end
@end: scope:[] from @31
@end: scope:[] from @37
[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 [ ] )
[5] call print_cls [ ] ( main:2 [ ] )
to:main::@1

View File

@ -1,3 +1,4 @@
Inlined call call mulf8s_prepare (signed byte) mulf8s::a
CONTROL FLOW GRAPH SSA
@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_sqr2_lo#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
(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
@ -519,17 +520,17 @@ mulf16s::@return: scope:[mulf16s] from mulf16s::@2
(signed dword) mulf16s::return#1 ← (signed dword) mulf16s::return#3
return
to:@return
@24: scope:[] from @19
@30: scope:[] from @19
(byte*) print_screen#6 ← phi( @19/(byte*) print_screen#7 )
(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*) BGCOL#0 ← ((byte*)) (word/dword/signed dword) 53281
to:@31
main: scope:[main] from @31
(byte*) print_char_cursor#137 ← phi( @31/(byte*) print_char_cursor#147 )
(byte*) print_line_cursor#44 ← phi( @31/(byte*) print_line_cursor#54 )
(byte*) print_screen#4 ← phi( @31/(byte*) print_screen#5 )
(byte*) BGCOL#1 ← phi( @31/(byte*) BGCOL#4 )
to:@37
main: scope:[main] from @37
(byte*) print_char_cursor#137 ← phi( @37/(byte*) print_char_cursor#147 )
(byte*) print_line_cursor#44 ← phi( @37/(byte*) print_line_cursor#54 )
(byte*) print_screen#4 ← phi( @37/(byte*) print_screen#5 )
(byte*) BGCOL#1 ← phi( @37/(byte*) BGCOL#4 )
*((byte*) BGCOL#1) ← (byte/signed byte/word/signed word/dword/signed dword) 5
call print_cls
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
return
to:@return
@31: scope:[] from @24
(byte*) print_screen#5 ← phi( @24/(byte*) print_screen#6 )
(byte*) print_char_cursor#147 ← phi( @24/(byte*) print_char_cursor#157 )
(byte*) print_line_cursor#54 ← phi( @24/(byte*) print_line_cursor#61 )
(byte*) BGCOL#4 ← phi( @24/(byte*) BGCOL#0 )
@37: scope:[] from @30
(byte*) print_screen#5 ← phi( @30/(byte*) print_screen#6 )
(byte*) print_char_cursor#147 ← phi( @30/(byte*) print_char_cursor#157 )
(byte*) print_line_cursor#54 ← phi( @30/(byte*) print_line_cursor#61 )
(byte*) BGCOL#4 ← phi( @30/(byte*) BGCOL#0 )
call main
to:@32
@32: scope:[] from @31
(byte*) print_char_cursor#127 ← phi( @31/(byte*) print_char_cursor#27 )
(byte*) print_line_cursor#42 ← phi( @31/(byte*) print_line_cursor#8 )
to:@38
@38: scope:[] from @37
(byte*) print_char_cursor#127 ← phi( @37/(byte*) print_char_cursor#27 )
(byte*) print_line_cursor#42 ← phi( @37/(byte*) print_line_cursor#8 )
(byte*) print_line_cursor#21 ← (byte*) print_line_cursor#42
(byte*) print_char_cursor#64 ← (byte*) print_char_cursor#127
to:@end
@end: scope:[] from @32
@end: scope:[] from @38
SYMBOL TABLE SSA
(const string) $0 = (string) "0123456789abcdef"
(label) @10
(label) @19
(label) @24
(label) @31
(label) @32
(label) @30
(label) @37
(label) @38
(label) @begin
(label) @end
(byte*) BGCOL
@ -3112,7 +3113,7 @@ Culled Empty Block (label) print_cls::@2
Culled Empty Block (label) mul16u::@3
Culled Empty Block (label) @19
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) muls16u::@3
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::@19
Culled Empty Block (label) mul16s_error::@11
Culled Empty Block (label) @32
Culled Empty Block (label) @38
Successful SSA optimization Pass2CullEmptyBlocks
Self Phi Eliminated (byte*) BGCOL#21
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 print_cls::@3(between print_cls::@1 and print_cls::@1)
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 main::@1
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) print_cls::@3
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 main::@1
Adding NOP phi() at start of main::@2
@ -3495,14 +3496,14 @@ Adding NOP phi() at start of print_cls
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
[0] phi() [ ] ( )
to:@31
@31: scope:[] from @begin
to:@37
@37: scope:[] from @begin
[1] phi() [ ] ( )
[2] call main [ ] ( )
to:@end
@end: scope:[] from @31
@end: scope:[] from @37
[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 [ ] )
[5] call print_cls [ ] ( main:2 [ ] )
to:main::@1
@ -4696,15 +4697,15 @@ INITIAL ASM
.label print_line_cursor = 9
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @31 [phi:@begin->@31]
b31_from_bbegin:
jmp b31
//SEG4 @31
b31:
//SEG3 [1] phi from @begin to @37 [phi:@begin->@37]
b37_from_bbegin:
jmp b37
//SEG4 @37
b37:
//SEG5 [2] call main [ ] ( )
jsr main
//SEG6 [3] phi from @31 to @end [phi:@31->@end]
bend_from_b31:
//SEG6 [3] phi from @37 to @end [phi:@37->@end]
bend_from_b37:
jmp bend
//SEG7 @end
bend:
@ -7669,15 +7670,15 @@ ASSEMBLER BEFORE OPTIMIZATION
.label print_line_cursor = 7
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @31 [phi:@begin->@31]
b31_from_bbegin:
jmp b31
//SEG4 @31
b31:
//SEG3 [1] phi from @begin to @37 [phi:@begin->@37]
b37_from_bbegin:
jmp b37
//SEG4 @37
b37:
//SEG5 [2] call main [ ] ( )
jsr main
//SEG6 [3] phi from @31 to @end [phi:@31->@end]
bend_from_b31:
//SEG6 [3] phi from @37 to @end [phi:@37->@end]
bend_from_b37:
jmp bend
//SEG7 @end
bend:
@ -9823,7 +9824,7 @@ print_cls: {
mulf_sqr2_hi: .fill $200, 0
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b31
Removing instruction jmp b37
Removing instruction jmp bend
Removing instruction jmp b1
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
Removing instruction bbegin:
Removing instruction b31_from_bbegin:
Removing instruction bend_from_b31:
Removing instruction b37_from_bbegin:
Removing instruction bend_from_b37:
Removing instruction b1_from_main:
Removing instruction mulf_init_from_b1:
Removing instruction b2_from_b1:
@ -10077,7 +10078,7 @@ Removing instruction b12_from_b3:
Removing instruction b4_from_b12:
Removing instruction b1_from_b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b31:
Removing instruction b37:
Removing instruction bend:
Removing instruction print_cls_from_main:
Removing instruction b1:
@ -10235,7 +10236,7 @@ Fixing long branch [109] bne b1 to beq
Fixing long branch [811] bne b1 to beq
FINAL SYMBOL TABLE
(label) @31
(label) @37
(label) @begin
(label) @end
(byte*) BGCOL
@ -10708,11 +10709,11 @@ Score: 444925
.label print_char_cursor = $f
.label print_line_cursor = 7
//SEG2 @begin
//SEG3 [1] phi from @begin to @31 [phi:@begin->@31]
//SEG4 @31
//SEG3 [1] phi from @begin to @37 [phi:@begin->@37]
//SEG4 @37
//SEG5 [2] call 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
//SEG8 main
main: {

View File

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

View File

@ -30,7 +30,8 @@ mul8s_compare: {
b2:
ldx b
jsr muls8s
ldy a
lda a
ldx b
jsr mulf8s
ldy b
jsr mul8s
@ -309,13 +310,21 @@ mul8u: {
jmp b1
}
mulf8s: {
.label return = $e
jsr mulf8u_prepare
stx mulf8s_prepared.b
jsr mulf8s_prepared
rts
}
mulf8s_prepared: {
.label memA = $fd
.label m = $e
.label b = 3
.label return = $e
tya
ldx b
jsr mulf8u
cpy #0
jsr mulf8u_prepared
lda memA
cmp #0
bpl b1
lda m+1
sec
@ -326,41 +335,44 @@ mulf8s: {
cmp #0
bpl b2
lda m+1
sty $ff
sec
sbc $ff
sbc memA
sta m+1
b2:
rts
}
mulf8u: {
.label memA = $fe
mulf8u_prepared: {
.label resL = $fe
.label memB = $ff
.label return = $e
sta memA
stx memB
sta sm1+1
sta sm3+1
eor #$ff
sta sm2+1
sta sm4+1
sec
sm1:
lda mulf_sqr1_lo,x
sm2:
sbc mulf_sqr2_lo,x
sta memA
sta resL
sm3:
lda mulf_sqr1_hi,x
sm4:
sbc mulf_sqr2_hi,x
sta memB
lda memA
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
}
muls8s: {
.label m = 8
.label return = 8
@ -540,6 +552,12 @@ mul8u_error: {
str3: .text " / normal:@"
str4: .text " / fast:@"
}
mulf8u: {
.label return = $e
jsr mulf8u_prepare
jsr mulf8u_prepared
rts
}
muls8u: {
.label return = 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) @end
(byte*) BGCOL
@ -188,46 +188,75 @@
(byte[512]) mula_sqr2_lo
(const byte[512]) mula_sqr2_lo#0 mula_sqr2_lo = { fill( 512, 0) }
(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::@3
(label) mulf8s::@4
(label) mulf8s::@6
(label) mulf8s::@return
(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#0 b zp ZP_BYTE:3 9.363636363636363
(word) mulf8s::m
(word) mulf8s::m#0 m zp ZP_WORD:14 2.0
(word) mulf8s::m#1 m zp ZP_WORD:14 4.0
(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 byte) mulf8s::b#0 reg byte x 25.75
(label) mulf8s::mulf8s_prepare1
(byte~) mulf8s::mulf8s_prepare1_$0
(signed byte) mulf8s::mulf8s_prepare1_a
(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_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)
(label) mulf8u::@2
(label) mulf8u::@3
(label) mulf8u::@return
(byte) mulf8u::a
(byte) mulf8u::a#1 reg byte a 101.0
(byte) mulf8u::a#2 reg byte a 105.0
(byte~) mulf8u::a#4 reg byte a 2.0
(byte) mulf8u::a#0 reg byte a 51.5
(byte) mulf8u::b
(byte) mulf8u::b#1 reg byte x 202.0
(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
(byte) mulf8u::b#0 reg byte x 34.33333333333333
(word) mulf8u::return
(word) mulf8u::return#0 return zp ZP_WORD:14 26.25
(word) mulf8u::return#2 return zp ZP_WORD:14 4.0
(word) mulf8u::return#3 return zp ZP_WORD:14 202.0
(word) mulf8u::return#0 return zp ZP_WORD:14 34.33333333333333
(word) mulf8u::return#2 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()
(byte~) mulf_init::$2 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
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 ]
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 ]
@ -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 ]
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 ]
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 ]
reg byte a [ mulf8u::a#2 mulf8u::a#1 mulf8u::a#4 ]
reg byte x [ mulf8u::b#2 mulf8u::b#1 mulf8u::b#4 ]
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 x [ mulf8u_prepared::b#2 mulf8u_prepared::b#3 mulf8u_prepared::b#0 ]
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::i#2 muls8s::i#1 ]
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::x_255#2 mulf_init::x_255#1 ]
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 x [ mul8s_error::a#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::$17 ]
reg byte a [ mul8u::$1 ]
reg byte a [ mulf8s::$6 ]
reg byte a [ mulf8s::$16 ]
reg byte a [ mulf8s::$12 ]
reg byte a [ mulf8s::$17 ]
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 [ muls8u::b#0 ]
reg byte a [ mulf8u::a#0 ]
reg byte x [ mulf8u::b#0 ]
reg byte x [ mul8u_error::a#0 ]
reg byte a [ mulf_init::$2 ]
reg byte a [ mulf_init::$5 ]