1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-11-20 02:32:36 +00:00

Strings zer now zero-terminated by default. To avoid zero-termination use suffix z - eg. "qwe"z is not zero-terminiated. Closes #137

This commit is contained in:
jespergravgaard 2019-04-09 00:51:53 +02:00
parent c3849c78b0
commit 756d5c22d5
65 changed files with 1011 additions and 573 deletions

View File

@ -197,7 +197,7 @@ MNEMONIC:
KICKASM: '{{' .*? '}}';
SIMPLETYPE: 'byte' | 'word' | 'dword' | 'bool' | 'char' | 'short' | 'int' | 'long' | 'void' ;
STRING : '"' ('\\"' | ~'"')* '"';
STRING : '"' ('\\"' | ~'"')* '"' 'z'?;
CHAR : '\'' ('\\\'' | ~'\'' ) '\'';
BOOLEAN : 'true' | 'false';
NUMBER : NUMFLOAT | NUMINT ;

View File

@ -135,7 +135,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\2_\u03b9\b\1\4\2\t"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2_\u03bb\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"+
@ -176,308 +176,309 @@ public class KickCLexer extends Lexer {
"\3L\3L\3L\3L\7L\u02d0\nL\fL\16L\u02d3\13L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3"+
"M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3"+
"M\3M\3M\3M\3M\3M\3M\3M\5M\u02fd\nM\3N\3N\3N\3N\7N\u0303\nN\fN\16N\u0306"+
"\13N\3N\3N\3O\3O\3O\3O\5O\u030e\nO\3O\3O\3P\3P\3P\3P\3P\3P\3P\3P\3P\5"+
"P\u031b\nP\3Q\3Q\5Q\u031f\nQ\3R\3R\3R\5R\u0324\nR\3S\3S\3S\3S\3S\5S\u032b"+
"\nS\3S\7S\u032e\nS\fS\16S\u0331\13S\3S\3S\6S\u0335\nS\rS\16S\u0336\3T"+
"\7T\u033a\nT\fT\16T\u033d\13T\3T\3T\6T\u0341\nT\rT\16T\u0342\3U\3U\3U"+
"\3U\3U\5U\u034a\nU\3U\7U\u034d\nU\fU\16U\u0350\13U\3U\3U\6U\u0354\nU\r"+
"U\16U\u0355\3V\3V\3V\5V\u035b\nV\3W\3W\3W\6W\u0360\nW\rW\16W\u0361\3W"+
"\3W\6W\u0366\nW\rW\16W\u0367\5W\u036a\nW\3X\6X\u036d\nX\rX\16X\u036e\3"+
"Y\3Y\3Y\3Y\3Y\5Y\u0376\nY\3Y\6Y\u0379\nY\rY\16Y\u037a\3Z\3Z\3[\3[\3\\"+
"\3\\\3]\3]\7]\u0385\n]\f]\16]\u0388\13]\3^\3^\3_\3_\3`\3`\7`\u0390\n`"+
"\f`\16`\u0393\13`\3`\6`\u0396\n`\r`\16`\u0397\3a\6a\u039b\na\ra\16a\u039c"+
"\3a\3a\3b\3b\3b\3b\7b\u03a5\nb\fb\16b\u03a8\13b\3b\3b\3c\3c\3c\3c\7c\u03b0"+
"\nc\fc\16c\u03b3\13c\3c\3c\3c\3c\3c\4\u02d1\u03b1\2d\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>{?}@\177"+
"A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093"+
"K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7"+
"U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3\2\u00b5\2\u00b7\2\u00b9[\u00bb"+
"\2\u00bd\2\u00bf\\\u00c1]\u00c3^\u00c5_\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--//\6\2\13\f"+
"\17\17\"\"\u00a2\u00a2\4\2\f\f\17\17\2\u0425\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\2"+
"M\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\2"+
"s\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\u00ab\3\2\2"+
"\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b9\3\2\2\2\2\u00bf"+
"\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\3\u00c7\3\2\2"+
"\2\5\u00ce\3\2\2\2\7\u00d0\3\2\2\2\t\u00d2\3\2\2\2\13\u00d4\3\2\2\2\r"+
"\u00d6\3\2\2\2\17\u00d8\3\2\2\2\21\u00da\3\2\2\2\23\u00dc\3\2\2\2\25\u00e2"+
"\3\2\2\2\27\u00e9\3\2\2\2\31\u00ef\3\2\2\2\33\u00f8\3\2\2\2\35\u00ff\3"+
"\2\2\2\37\u0108\3\2\2\2!\u0112\3\2\2\2#\u0115\3\2\2\2%\u011a\3\2\2\2\'"+
"\u0120\3\2\2\2)\u0123\3\2\2\2+\u0127\3\2\2\2-\u012e\3\2\2\2/\u0134\3\2"+
"\2\2\61\u013d\3\2\2\2\63\u0141\3\2\2\2\65\u0143\3\2\2\2\67\u0146\3\2\2"+
"\29\u014d\3\2\2\2;\u0156\3\2\2\2=\u0158\3\2\2\2?\u015a\3\2\2\2A\u015c"+
"\3\2\2\2C\u015f\3\2\2\2E\u0162\3\2\2\2G\u0164\3\2\2\2I\u0166\3\2\2\2K"+
"\u0168\3\2\2\2M\u016a\3\2\2\2O\u016c\3\2\2\2Q\u016f\3\2\2\2S\u0172\3\2"+
"\2\2U\u0174\3\2\2\2W\u0176\3\2\2\2Y\u0178\3\2\2\2[\u017a\3\2\2\2]\u017d"+
"\3\2\2\2_\u0180\3\2\2\2a\u0183\3\2\2\2c\u0186\3\2\2\2e\u0188\3\2\2\2g"+
"\u018a\3\2\2\2i\u018d\3\2\2\2k\u0190\3\2\2\2m\u0192\3\2\2\2o\u0195\3\2"+
"\2\2q\u0198\3\2\2\2s\u019b\3\2\2\2u\u019e\3\2\2\2w\u01a1\3\2\2\2y\u01a5"+
"\3\2\2\2{\u01a9\3\2\2\2}\u01ac\3\2\2\2\177\u01af\3\2\2\2\u0081\u01b2\3"+
"\2\2\2\u0083\u01ba\3\2\2\2\u0085\u01c3\3\2\2\2\u0087\u01c8\3\2\2\2\u0089"+
"\u01d1\3\2\2\2\u008b\u01d7\3\2\2\2\u008d\u01de\3\2\2\2\u008f\u01e1\3\2"+
"\2\2\u0091\u01e7\3\2\2\2\u0093\u01e9\3\2\2\2\u0095\u02c9\3\2\2\2\u0097"+
"\u02cb\3\2\2\2\u0099\u02fc\3\2\2\2\u009b\u02fe\3\2\2\2\u009d\u0309\3\2"+
"\2\2\u009f\u031a\3\2\2\2\u00a1\u031e\3\2\2\2\u00a3\u0323\3\2\2\2\u00a5"+
"\u032a\3\2\2\2\u00a7\u033b\3\2\2\2\u00a9\u0349\3\2\2\2\u00ab\u035a\3\2"+
"\2\2\u00ad\u0369\3\2\2\2\u00af\u036c\3\2\2\2\u00b1\u0375\3\2\2\2\u00b3"+
"\u037c\3\2\2\2\u00b5\u037e\3\2\2\2\u00b7\u0380\3\2\2\2\u00b9\u0382\3\2"+
"\2\2\u00bb\u0389\3\2\2\2\u00bd\u038b\3\2\2\2\u00bf\u038d\3\2\2\2\u00c1"+
"\u039a\3\2\2\2\u00c3\u03a0\3\2\2\2\u00c5\u03ab\3\2\2\2\u00c7\u00c8\7k"+
"\2\2\u00c8\u00c9\7o\2\2\u00c9\u00ca\7r\2\2\u00ca\u00cb\7q\2\2\u00cb\u00cc"+
"\7t\2\2\u00cc\u00cd\7v\2\2\u00cd\4\3\2\2\2\u00ce\u00cf\7?\2\2\u00cf\6"+
"\3\2\2\2\u00d0\u00d1\7=\2\2\u00d1\b\3\2\2\2\u00d2\u00d3\7*\2\2\u00d3\n"+
"\3\2\2\2\u00d4\u00d5\7+\2\2\u00d5\f\3\2\2\2\u00d6\u00d7\7}\2\2\u00d7\16"+
"\3\2\2\2\u00d8\u00d9\7\177\2\2\u00d9\20\3\2\2\2\u00da\u00db\7.\2\2\u00db"+
"\22\3\2\2\2\u00dc\u00dd\7e\2\2\u00dd\u00de\7q\2\2\u00de\u00df\7p\2\2\u00df"+
"\u00e0\7u\2\2\u00e0\u00e1\7v\2\2\u00e1\24\3\2\2\2\u00e2\u00e3\7g\2\2\u00e3"+
"\u00e4\7z\2\2\u00e4\u00e5\7v\2\2\u00e5\u00e6\7g\2\2\u00e6\u00e7\7t\2\2"+
"\u00e7\u00e8\7p\2\2\u00e8\26\3\2\2\2\u00e9\u00ea\7c\2\2\u00ea\u00eb\7"+
"n\2\2\u00eb\u00ec\7k\2\2\u00ec\u00ed\7i\2\2\u00ed\u00ee\7p\2\2\u00ee\30"+
"\3\2\2\2\u00ef\u00f0\7t\2\2\u00f0\u00f1\7g\2\2\u00f1\u00f2\7i\2\2\u00f2"+
"\u00f3\7k\2\2\u00f3\u00f4\7u\2\2\u00f4\u00f5\7v\2\2\u00f5\u00f6\7g\2\2"+
"\u00f6\u00f7\7t\2\2\u00f7\32\3\2\2\2\u00f8\u00f9\7k\2\2\u00f9\u00fa\7"+
"p\2\2\u00fa\u00fb\7n\2\2\u00fb\u00fc\7k\2\2\u00fc\u00fd\7p\2\2\u00fd\u00fe"+
"\7g\2\2\u00fe\34\3\2\2\2\u00ff\u0100\7x\2\2\u0100\u0101\7q\2\2\u0101\u0102"+
"\7n\2\2\u0102\u0103\7c\2\2\u0103\u0104\7v\2\2\u0104\u0105\7k\2\2\u0105"+
"\u0106\7n\2\2\u0106\u0107\7g\2\2\u0107\36\3\2\2\2\u0108\u0109\7k\2\2\u0109"+
"\u010a\7p\2\2\u010a\u010b\7v\2\2\u010b\u010c\7g\2\2\u010c\u010d\7t\2\2"+
"\u010d\u010e\7t\2\2\u010e\u010f\7w\2\2\u010f\u0110\7r\2\2\u0110\u0111"+
"\7v\2\2\u0111 \3\2\2\2\u0112\u0113\7k\2\2\u0113\u0114\7h\2\2\u0114\"\3"+
"\2\2\2\u0115\u0116\7g\2\2\u0116\u0117\7n\2\2\u0117\u0118\7u\2\2\u0118"+
"\u0119\7g\2\2\u0119$\3\2\2\2\u011a\u011b\7y\2\2\u011b\u011c\7j\2\2\u011c"+
"\u011d\7k\2\2\u011d\u011e\7n\2\2\u011e\u011f\7g\2\2\u011f&\3\2\2\2\u0120"+
"\u0121\7f\2\2\u0121\u0122\7q\2\2\u0122(\3\2\2\2\u0123\u0124\7h\2\2\u0124"+
"\u0125\7q\2\2\u0125\u0126\7t\2\2\u0126*\3\2\2\2\u0127\u0128\7t\2\2\u0128"+
"\u0129\7g\2\2\u0129\u012a\7v\2\2\u012a\u012b\7w\2\2\u012b\u012c\7t\2\2"+
"\u012c\u012d\7p\2\2\u012d,\3\2\2\2\u012e\u012f\7d\2\2\u012f\u0130\7t\2"+
"\2\u0130\u0131\7g\2\2\u0131\u0132\7c\2\2\u0132\u0133\7m\2\2\u0133.\3\2"+
"\2\2\u0134\u0135\7e\2\2\u0135\u0136\7q\2\2\u0136\u0137\7p\2\2\u0137\u0138"+
"\7v\2\2\u0138\u0139\7k\2\2\u0139\u013a\7p\2\2\u013a\u013b\7w\2\2\u013b"+
"\u013c\7g\2\2\u013c\60\3\2\2\2\u013d\u013e\7c\2\2\u013e\u013f\7u\2\2\u013f"+
"\u0140\7o\2\2\u0140\62\3\2\2\2\u0141\u0142\7<\2\2\u0142\64\3\2\2\2\u0143"+
"\u0144\7\60\2\2\u0144\u0145\7\60\2\2\u0145\66\3\2\2\2\u0146\u0147\7u\2"+
"\2\u0147\u0148\7k\2\2\u0148\u0149\7i\2\2\u0149\u014a\7p\2\2\u014a\u014b"+
"\7g\2\2\u014b\u014c\7f\2\2\u014c8\3\2\2\2\u014d\u014e\7w\2\2\u014e\u014f"+
"\7p\2\2\u014f\u0150\7u\2\2\u0150\u0151\7k\2\2\u0151\u0152\7i\2\2\u0152"+
"\u0153\7p\2\2\u0153\u0154\7g\2\2\u0154\u0155\7f\2\2\u0155:\3\2\2\2\u0156"+
"\u0157\7,\2\2\u0157<\3\2\2\2\u0158\u0159\7]\2\2\u0159>\3\2\2\2\u015a\u015b"+
"\7_\2\2\u015b@\3\2\2\2\u015c\u015d\7/\2\2\u015d\u015e\7/\2\2\u015eB\3"+
"\2\2\2\u015f\u0160\7-\2\2\u0160\u0161\7-\2\2\u0161D\3\2\2\2\u0162\u0163"+
"\7-\2\2\u0163F\3\2\2\2\u0164\u0165\7/\2\2\u0165H\3\2\2\2\u0166\u0167\7"+
"#\2\2\u0167J\3\2\2\2\u0168\u0169\7(\2\2\u0169L\3\2\2\2\u016a\u016b\7\u0080"+
"\2\2\u016bN\3\2\2\2\u016c\u016d\7@\2\2\u016d\u016e\7@\2\2\u016eP\3\2\2"+
"\2\u016f\u0170\7>\2\2\u0170\u0171\7>\2\2\u0171R\3\2\2\2\u0172\u0173\7"+
"\61\2\2\u0173T\3\2\2\2\u0174\u0175\7\'\2\2\u0175V\3\2\2\2\u0176\u0177"+
"\7>\2\2\u0177X\3\2\2\2\u0178\u0179\7@\2\2\u0179Z\3\2\2\2\u017a\u017b\7"+
"?\2\2\u017b\u017c\7?\2\2\u017c\\\3\2\2\2\u017d\u017e\7#\2\2\u017e\u017f"+
"\7?\2\2\u017f^\3\2\2\2\u0180\u0181\7>\2\2\u0181\u0182\7?\2\2\u0182`\3"+
"\2\2\2\u0183\u0184\7@\2\2\u0184\u0185\7?\2\2\u0185b\3\2\2\2\u0186\u0187"+
"\7`\2\2\u0187d\3\2\2\2\u0188\u0189\7~\2\2\u0189f\3\2\2\2\u018a\u018b\7"+
"(\2\2\u018b\u018c\7(\2\2\u018ch\3\2\2\2\u018d\u018e\7~\2\2\u018e\u018f"+
"\7~\2\2\u018fj\3\2\2\2\u0190\u0191\7A\2\2\u0191l\3\2\2\2\u0192\u0193\7"+
"-\2\2\u0193\u0194\7?\2\2\u0194n\3\2\2\2\u0195\u0196\7/\2\2\u0196\u0197"+
"\7?\2\2\u0197p\3\2\2\2\u0198\u0199\7,\2\2\u0199\u019a\7?\2\2\u019ar\3"+
"\2\2\2\u019b\u019c\7\61\2\2\u019c\u019d\7?\2\2\u019dt\3\2\2\2\u019e\u019f"+
"\7\'\2\2\u019f\u01a0\7?\2\2\u01a0v\3\2\2\2\u01a1\u01a2\7>\2\2\u01a2\u01a3"+
"\7>\2\2\u01a3\u01a4\7?\2\2\u01a4x\3\2\2\2\u01a5\u01a6\7@\2\2\u01a6\u01a7"+
"\7@\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~\3"+
"\2\2\2\u01af\u01b0\7`\2\2\u01b0\u01b1\7?\2\2\u01b1\u0080\3\2\2\2\u01b2"+
"\u01b3\7m\2\2\u01b3\u01b4\7k\2\2\u01b4\u01b5\7e\2\2\u01b5\u01b6\7m\2\2"+
"\u01b6\u01b7\7c\2\2\u01b7\u01b8\7u\2\2\u01b8\u01b9\7o\2\2\u01b9\u0082"+
"\3\2\2\2\u01ba\u01bb\7t\2\2\u01bb\u01bc\7g\2\2\u01bc\u01bd\7u\2\2\u01bd"+
"\u01be\7q\2\2\u01be\u01bf\7w\2\2\u01bf\u01c0\7t\2\2\u01c0\u01c1\7e\2\2"+
"\u01c1\u01c2\7g\2\2\u01c2\u0084\3\2\2\2\u01c3\u01c4\7w\2\2\u01c4\u01c5"+
"\7u\2\2\u01c5\u01c6\7g\2\2\u01c6\u01c7\7u\2\2\u01c7\u0086\3\2\2\2\u01c8"+
"\u01c9\7e\2\2\u01c9\u01ca\7n\2\2\u01ca\u01cb\7q\2\2\u01cb\u01cc\7d\2\2"+
"\u01cc\u01cd\7d\2\2\u01cd\u01ce\7g\2\2\u01ce\u01cf\7t\2\2\u01cf\u01d0"+
"\7u\2\2\u01d0\u0088\3\2\2\2\u01d1\u01d2\7d\2\2\u01d2\u01d3\7{\2\2\u01d3"+
"\u01d4\7v\2\2\u01d4\u01d5\7g\2\2\u01d5\u01d6\7u\2\2\u01d6\u008a\3\2\2"+
"\2\u01d7\u01d8\7e\2\2\u01d8\u01d9\7{\2\2\u01d9\u01da\7e\2\2\u01da\u01db"+
"\7n\2\2\u01db\u01dc\7g\2\2\u01dc\u01dd\7u\2\2\u01dd\u008c\3\2\2\2\u01de"+
"\u01df\7r\2\2\u01df\u01e0\7e\2\2\u01e0\u008e\3\2\2\2\u01e1\u01e2\7\60"+
"\2\2\u01e2\u01e3\7d\2\2\u01e3\u01e4\7{\2\2\u01e4\u01e5\7v\2\2\u01e5\u01e6"+
"\7g\2\2\u01e6\u0090\3\2\2\2\u01e7\u01e8\7%\2\2\u01e8\u0092\3\2\2\2\u01e9"+
"\u01ea\7\60\2\2\u01ea\u0094\3\2\2\2\u01eb\u01ec\7d\2\2\u01ec\u01ed\7t"+
"\2\2\u01ed\u02ca\7m\2\2\u01ee\u01ef\7q\2\2\u01ef\u01f0\7t\2\2\u01f0\u02ca"+
"\7c\2\2\u01f1\u01f2\7m\2\2\u01f2\u01f3\7k\2\2\u01f3\u02ca\7n\2\2\u01f4"+
"\u01f5\7u\2\2\u01f5\u01f6\7n\2\2\u01f6\u02ca\7q\2\2\u01f7\u01f8\7p\2\2"+
"\u01f8\u01f9\7q\2\2\u01f9\u02ca\7r\2\2\u01fa\u01fb\7c\2\2\u01fb\u01fc"+
"\7u\2\2\u01fc\u02ca\7n\2\2\u01fd\u01fe\7r\2\2\u01fe\u01ff\7j\2\2\u01ff"+
"\u02ca\7r\2\2\u0200\u0201\7c\2\2\u0201\u0202\7p\2\2\u0202\u02ca\7e\2\2"+
"\u0203\u0204\7d\2\2\u0204\u0205\7r\2\2\u0205\u02ca\7n\2\2\u0206\u0207"+
"\7e\2\2\u0207\u0208\7n\2\2\u0208\u02ca\7e\2\2\u0209\u020a\7l\2\2\u020a"+
"\u020b\7u\2\2\u020b\u02ca\7t\2\2\u020c\u020d\7c\2\2\u020d\u020e\7p\2\2"+
"\u020e\u02ca\7f\2\2\u020f\u0210\7t\2\2\u0210\u0211\7n\2\2\u0211\u02ca"+
"\7c\2\2\u0212\u0213\7d\2\2\u0213\u0214\7k\2\2\u0214\u02ca\7v\2\2\u0215"+
"\u0216\7t\2\2\u0216\u0217\7q\2\2\u0217\u02ca\7n\2\2\u0218\u0219\7r\2\2"+
"\u0219\u021a\7n\2\2\u021a\u02ca\7c\2\2\u021b\u021c\7r\2\2\u021c\u021d"+
"\7n\2\2\u021d\u02ca\7r\2\2\u021e\u021f\7d\2\2\u021f\u0220\7o\2\2\u0220"+
"\u02ca\7k\2\2\u0221\u0222\7u\2\2\u0222\u0223\7g\2\2\u0223\u02ca\7e\2\2"+
"\u0224\u0225\7t\2\2\u0225\u0226\7v\2\2\u0226\u02ca\7k\2\2\u0227\u0228"+
"\7g\2\2\u0228\u0229\7q\2\2\u0229\u02ca\7t\2\2\u022a\u022b\7u\2\2\u022b"+
"\u022c\7t\2\2\u022c\u02ca\7g\2\2\u022d\u022e\7n\2\2\u022e\u022f\7u\2\2"+
"\u022f\u02ca\7t\2\2\u0230\u0231\7r\2\2\u0231\u0232\7j\2\2\u0232\u02ca"+
"\7c\2\2\u0233\u0234\7c\2\2\u0234\u0235\7n\2\2\u0235\u02ca\7t\2\2\u0236"+
"\u0237\7l\2\2\u0237\u0238\7o\2\2\u0238\u02ca\7r\2\2\u0239\u023a\7d\2\2"+
"\u023a\u023b\7x\2\2\u023b\u02ca\7e\2\2\u023c\u023d\7e\2\2\u023d\u023e"+
"\7n\2\2\u023e\u02ca\7k\2\2\u023f\u0240\7t\2\2\u0240\u0241\7v\2\2\u0241"+
"\u02ca\7u\2\2\u0242\u0243\7c\2\2\u0243\u0244\7f\2\2\u0244\u02ca\7e\2\2"+
"\u0245\u0246\7t\2\2\u0246\u0247\7t\2\2\u0247\u02ca\7c\2\2\u0248\u0249"+
"\7d\2\2\u0249\u024a\7x\2\2\u024a\u02ca\7u\2\2\u024b\u024c\7u\2\2\u024c"+
"\u024d\7g\2\2\u024d\u02ca\7k\2\2\u024e\u024f\7u\2\2\u024f\u0250\7c\2\2"+
"\u0250\u02ca\7z\2\2\u0251\u0252\7u\2\2\u0252\u0253\7v\2\2\u0253\u02ca"+
"\7{\2\2\u0254\u0255\7u\2\2\u0255\u0256\7v\2\2\u0256\u02ca\7c\2\2\u0257"+
"\u0258\7u\2\2\u0258\u0259\7v\2\2\u0259\u02ca\7z\2\2\u025a\u025b\7f\2\2"+
"\u025b\u025c\7g\2\2\u025c\u02ca\7{\2\2\u025d\u025e\7v\2\2\u025e\u025f"+
"\7z\2\2\u025f\u02ca\7c\2\2\u0260\u0261\7z\2\2\u0261\u0262\7c\2\2\u0262"+
"\u02ca\7c\2\2\u0263\u0264\7d\2\2\u0264\u0265\7e\2\2\u0265\u02ca\7e\2\2"+
"\u0266\u0267\7c\2\2\u0267\u0268\7j\2\2\u0268\u02ca\7z\2\2\u0269\u026a"+
"\7v\2\2\u026a\u026b\7{\2\2\u026b\u02ca\7c\2\2\u026c\u026d\7v\2\2\u026d"+
"\u026e\7z\2\2\u026e\u02ca\7u\2\2\u026f\u0270\7v\2\2\u0270\u0271\7c\2\2"+
"\u0271\u02ca\7u\2\2\u0272\u0273\7u\2\2\u0273\u0274\7j\2\2\u0274\u02ca"+
"\7{\2\2\u0275\u0276\7u\2\2\u0276\u0277\7j\2\2\u0277\u02ca\7z\2\2\u0278"+
"\u0279\7n\2\2\u0279\u027a\7f\2\2\u027a\u02ca\7{\2\2\u027b\u027c\7n\2\2"+
"\u027c\u027d\7f\2\2\u027d\u02ca\7c\2\2\u027e\u027f\7n\2\2\u027f\u0280"+
"\7f\2\2\u0280\u02ca\7z\2\2\u0281\u0282\7n\2\2\u0282\u0283\7c\2\2\u0283"+
"\u02ca\7z\2\2\u0284\u0285\7v\2\2\u0285\u0286\7c\2\2\u0286\u02ca\7{\2\2"+
"\u0287\u0288\7v\2\2\u0288\u0289\7c\2\2\u0289\u02ca\7z\2\2\u028a\u028b"+
"\7d\2\2\u028b\u028c\7e\2\2\u028c\u02ca\7u\2\2\u028d\u028e\7e\2\2\u028e"+
"\u028f\7n\2\2\u028f\u02ca\7x\2\2\u0290\u0291\7v\2\2\u0291\u0292\7u\2\2"+
"\u0292\u02ca\7z\2\2\u0293\u0294\7n\2\2\u0294\u0295\7c\2\2\u0295\u02ca"+
"\7u\2\2\u0296\u0297\7e\2\2\u0297\u0298\7r\2\2\u0298\u02ca\7{\2\2\u0299"+
"\u029a\7e\2\2\u029a\u029b\7o\2\2\u029b\u02ca\7r\2\2\u029c\u029d\7e\2\2"+
"\u029d\u029e\7r\2\2\u029e\u02ca\7z\2\2\u029f\u02a0\7f\2\2\u02a0\u02a1"+
"\7e\2\2\u02a1\u02ca\7r\2\2\u02a2\u02a3\7f\2\2\u02a3\u02a4\7g\2\2\u02a4"+
"\u02ca\7e\2\2\u02a5\u02a6\7k\2\2\u02a6\u02a7\7p\2\2\u02a7\u02ca\7e\2\2"+
"\u02a8\u02a9\7c\2\2\u02a9\u02aa\7z\2\2\u02aa\u02ca\7u\2\2\u02ab\u02ac"+
"\7d\2\2\u02ac\u02ad\7p\2\2\u02ad\u02ca\7g\2\2\u02ae\u02af\7e\2\2\u02af"+
"\u02b0\7n\2\2\u02b0\u02ca\7f\2\2\u02b1\u02b2\7u\2\2\u02b2\u02b3\7d\2\2"+
"\u02b3\u02ca\7e\2\2\u02b4\u02b5\7k\2\2\u02b5\u02b6\7u\2\2\u02b6\u02ca"+
"\7e\2\2\u02b7\u02b8\7k\2\2\u02b8\u02b9\7p\2\2\u02b9\u02ca\7z\2\2\u02ba"+
"\u02bb\7d\2\2\u02bb\u02bc\7g\2\2\u02bc\u02ca\7s\2\2\u02bd\u02be\7u\2\2"+
"\u02be\u02bf\7g\2\2\u02bf\u02ca\7f\2\2\u02c0\u02c1\7f\2\2\u02c1\u02c2"+
"\7g\2\2\u02c2\u02ca\7z\2\2\u02c3\u02c4\7k\2\2\u02c4\u02c5\7p\2\2\u02c5"+
"\u02ca\7{\2\2\u02c6\u02c7\7t\2\2\u02c7\u02c8\7q\2\2\u02c8\u02ca\7t\2\2"+
"\u02c9\u01eb\3\2\2\2\u02c9\u01ee\3\2\2\2\u02c9\u01f1\3\2\2\2\u02c9\u01f4"+
"\3\2\2\2\u02c9\u01f7\3\2\2\2\u02c9\u01fa\3\2\2\2\u02c9\u01fd\3\2\2\2\u02c9"+
"\u0200\3\2\2\2\u02c9\u0203\3\2\2\2\u02c9\u0206\3\2\2\2\u02c9\u0209\3\2"+
"\2\2\u02c9\u020c\3\2\2\2\u02c9\u020f\3\2\2\2\u02c9\u0212\3\2\2\2\u02c9"+
"\u0215\3\2\2\2\u02c9\u0218\3\2\2\2\u02c9\u021b\3\2\2\2\u02c9\u021e\3\2"+
"\2\2\u02c9\u0221\3\2\2\2\u02c9\u0224\3\2\2\2\u02c9\u0227\3\2\2\2\u02c9"+
"\u022a\3\2\2\2\u02c9\u022d\3\2\2\2\u02c9\u0230\3\2\2\2\u02c9\u0233\3\2"+
"\2\2\u02c9\u0236\3\2\2\2\u02c9\u0239\3\2\2\2\u02c9\u023c\3\2\2\2\u02c9"+
"\u023f\3\2\2\2\u02c9\u0242\3\2\2\2\u02c9\u0245\3\2\2\2\u02c9\u0248\3\2"+
"\2\2\u02c9\u024b\3\2\2\2\u02c9\u024e\3\2\2\2\u02c9\u0251\3\2\2\2\u02c9"+
"\u0254\3\2\2\2\u02c9\u0257\3\2\2\2\u02c9\u025a\3\2\2\2\u02c9\u025d\3\2"+
"\2\2\u02c9\u0260\3\2\2\2\u02c9\u0263\3\2\2\2\u02c9\u0266\3\2\2\2\u02c9"+
"\u0269\3\2\2\2\u02c9\u026c\3\2\2\2\u02c9\u026f\3\2\2\2\u02c9\u0272\3\2"+
"\2\2\u02c9\u0275\3\2\2\2\u02c9\u0278\3\2\2\2\u02c9\u027b\3\2\2\2\u02c9"+
"\u027e\3\2\2\2\u02c9\u0281\3\2\2\2\u02c9\u0284\3\2\2\2\u02c9\u0287\3\2"+
"\2\2\u02c9\u028a\3\2\2\2\u02c9\u028d\3\2\2\2\u02c9\u0290\3\2\2\2\u02c9"+
"\u0293\3\2\2\2\u02c9\u0296\3\2\2\2\u02c9\u0299\3\2\2\2\u02c9\u029c\3\2"+
"\2\2\u02c9\u029f\3\2\2\2\u02c9\u02a2\3\2\2\2\u02c9\u02a5\3\2\2\2\u02c9"+
"\u02a8\3\2\2\2\u02c9\u02ab\3\2\2\2\u02c9\u02ae\3\2\2\2\u02c9\u02b1\3\2"+
"\2\2\u02c9\u02b4\3\2\2\2\u02c9\u02b7\3\2\2\2\u02c9\u02ba\3\2\2\2\u02c9"+
"\u02bd\3\2\2\2\u02c9\u02c0\3\2\2\2\u02c9\u02c3\3\2\2\2\u02c9\u02c6\3\2"+
"\2\2\u02ca\u0096\3\2\2\2\u02cb\u02cc\7}\2\2\u02cc\u02cd\7}\2\2\u02cd\u02d1"+
"\3\2\2\2\u02ce\u02d0\13\2\2\2\u02cf\u02ce\3\2\2\2\u02d0\u02d3\3\2\2\2"+
"\u02d1\u02d2\3\2\2\2\u02d1\u02cf\3\2\2\2\u02d2\u02d4\3\2\2\2\u02d3\u02d1"+
"\3\2\2\2\u02d4\u02d5\7\177\2\2\u02d5\u02d6\7\177\2\2\u02d6\u0098\3\2\2"+
"\2\u02d7\u02d8\7d\2\2\u02d8\u02d9\7{\2\2\u02d9\u02da\7v\2\2\u02da\u02fd"+
"\7g\2\2\u02db\u02dc\7y\2\2\u02dc\u02dd\7q\2\2\u02dd\u02de\7t\2\2\u02de"+
"\u02fd\7f\2\2\u02df\u02e0\7f\2\2\u02e0\u02e1\7y\2\2\u02e1\u02e2\7q\2\2"+
"\u02e2\u02e3\7t\2\2\u02e3\u02fd\7f\2\2\u02e4\u02e5\7d\2\2\u02e5\u02e6"+
"\7q\2\2\u02e6\u02e7\7q\2\2\u02e7\u02fd\7n\2\2\u02e8\u02e9\7e\2\2\u02e9"+
"\u02ea\7j\2\2\u02ea\u02eb\7c\2\2\u02eb\u02fd\7t\2\2\u02ec\u02ed\7u\2\2"+
"\u02ed\u02ee\7j\2\2\u02ee\u02ef\7q\2\2\u02ef\u02f0\7t\2\2\u02f0\u02fd"+
"\7v\2\2\u02f1\u02f2\7k\2\2\u02f2\u02f3\7p\2\2\u02f3\u02fd\7v\2\2\u02f4"+
"\u02f5\7n\2\2\u02f5\u02f6\7q\2\2\u02f6\u02f7\7p\2\2\u02f7\u02fd\7i\2\2"+
"\u02f8\u02f9\7x\2\2\u02f9\u02fa\7q\2\2\u02fa\u02fb\7k\2\2\u02fb\u02fd"+
"\7f\2\2\u02fc\u02d7\3\2\2\2\u02fc\u02db\3\2\2\2\u02fc\u02df\3\2\2\2\u02fc"+
"\u02e4\3\2\2\2\u02fc\u02e8\3\2\2\2\u02fc\u02ec\3\2\2\2\u02fc\u02f1\3\2"+
"\2\2\u02fc\u02f4\3\2\2\2\u02fc\u02f8\3\2\2\2\u02fd\u009a\3\2\2\2\u02fe"+
"\u0304\7$\2\2\u02ff\u0300\7^\2\2\u0300\u0303\7$\2\2\u0301\u0303\n\2\2"+
"\2\u0302\u02ff\3\2\2\2\u0302\u0301\3\2\2\2\u0303\u0306\3\2\2\2\u0304\u0302"+
"\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0307\3\2\2\2\u0306\u0304\3\2\2\2\u0307"+
"\u0308\7$\2\2\u0308\u009c\3\2\2\2\u0309\u030d\7)\2\2\u030a\u030b\7^\2"+
"\2\u030b\u030e\7)\2\2\u030c\u030e\n\3\2\2\u030d\u030a\3\2\2\2\u030d\u030c"+
"\3\2\2\2\u030e\u030f\3\2\2\2\u030f\u0310\7)\2\2\u0310\u009e\3\2\2\2\u0311"+
"\u0312\7v\2\2\u0312\u0313\7t\2\2\u0313\u0314\7w\2\2\u0314\u031b\7g\2\2"+
"\u0315\u0316\7h\2\2\u0316\u0317\7c\2\2\u0317\u0318\7n\2\2\u0318\u0319"+
"\7u\2\2\u0319\u031b\7g\2\2\u031a\u0311\3\2\2\2\u031a\u0315\3\2\2\2\u031b"+
"\u00a0\3\2\2\2\u031c\u031f\5\u00a3R\2\u031d\u031f\5\u00abV\2\u031e\u031c"+
"\3\2\2\2\u031e\u031d\3\2\2\2\u031f\u00a2\3\2\2\2\u0320\u0324\5\u00a5S"+
"\2\u0321\u0324\5\u00a7T\2\u0322\u0324\5\u00a9U\2\u0323\u0320\3\2\2\2\u0323"+
"\u0321\3\2\2\2\u0323\u0322\3\2\2\2\u0324\u00a4\3\2\2\2\u0325\u032b\7\'"+
"\2\2\u0326\u0327\7\62\2\2\u0327\u032b\7d\2\2\u0328\u0329\7\62\2\2\u0329"+
"\u032b\7D\2\2\u032a\u0325\3\2\2\2\u032a\u0326\3\2\2\2\u032a\u0328\3\2"+
"\2\2\u032b\u032f\3\2\2\2\u032c\u032e\5\u00b3Z\2\u032d\u032c\3\2\2\2\u032e"+
"\u0331\3\2\2\2\u032f\u032d\3\2\2\2\u032f\u0330\3\2\2\2\u0330\u0332\3\2"+
"\2\2\u0331\u032f\3\2\2\2\u0332\u0334\7\60\2\2\u0333\u0335\5\u00b3Z\2\u0334"+
"\u0333\3\2\2\2\u0335\u0336\3\2\2\2\u0336\u0334\3\2\2\2\u0336\u0337\3\2"+
"\2\2\u0337\u00a6\3\2\2\2\u0338\u033a\5\u00b5[\2\u0339\u0338\3\2\2\2\u033a"+
"\u033d\3\2\2\2\u033b\u0339\3\2\2\2\u033b\u033c\3\2\2\2\u033c\u033e\3\2"+
"\2\2\u033d\u033b\3\2\2\2\u033e\u0340\7\60\2\2\u033f\u0341\5\u00b5[\2\u0340"+
"\u033f\3\2\2\2\u0341\u0342\3\2\2\2\u0342\u0340\3\2\2\2\u0342\u0343\3\2"+
"\2\2\u0343\u00a8\3\2\2\2\u0344\u034a\7&\2\2\u0345\u0346\7\62\2\2\u0346"+
"\u034a\7z\2\2\u0347\u0348\7\62\2\2\u0348\u034a\7Z\2\2\u0349\u0344\3\2"+
"\2\2\u0349\u0345\3\2\2\2\u0349\u0347\3\2\2\2\u034a\u034e\3\2\2\2\u034b"+
"\u034d\5\u00b7\\\2\u034c\u034b\3\2\2\2\u034d\u0350\3\2\2\2\u034e\u034c"+
"\3\2\2\2\u034e\u034f\3\2\2\2\u034f\u0351\3\2\2\2\u0350\u034e\3\2\2\2\u0351"+
"\u0353\7\60\2\2\u0352\u0354\5\u00b7\\\2\u0353\u0352\3\2\2\2\u0354\u0355"+
"\3\2\2\2\u0355\u0353\3\2\2\2\u0355\u0356\3\2\2\2\u0356\u00aa\3\2\2\2\u0357"+
"\u035b\5\u00afX\2\u0358\u035b\5\u00b1Y\2\u0359\u035b\5\u00adW\2\u035a"+
"\u0357\3\2\2\2\u035a\u0358\3\2\2\2\u035a\u0359\3\2\2\2\u035b\u00ac\3\2"+
"\2\2\u035c\u035d\7\62\2\2\u035d\u035f\t\4\2\2\u035e\u0360\5\u00b3Z\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\u036a\3\2\2\2\u0363\u0365\7\'\2\2\u0364\u0366\5\u00b3Z\2\u0365"+
"\u0364\3\2\2\2\u0366\u0367\3\2\2\2\u0367\u0365\3\2\2\2\u0367\u0368\3\2"+
"\2\2\u0368\u036a\3\2\2\2\u0369\u035c\3\2\2\2\u0369\u0363\3\2\2\2\u036a"+
"\u00ae\3\2\2\2\u036b\u036d\5\u00b5[\2\u036c\u036b\3\2\2\2\u036d\u036e"+
"\3\2\2\2\u036e\u036c\3\2\2\2\u036e\u036f\3\2\2\2\u036f\u00b0\3\2\2\2\u0370"+
"\u0376\7&\2\2\u0371\u0372\7\62\2\2\u0372\u0376\7z\2\2\u0373\u0374\7\62"+
"\2\2\u0374\u0376\7Z\2\2\u0375\u0370\3\2\2\2\u0375\u0371\3\2\2\2\u0375"+
"\u0373\3\2\2\2\u0376\u0378\3\2\2\2\u0377\u0379\5\u00b7\\\2\u0378\u0377"+
"\3\2\2\2\u0379\u037a\3\2\2\2\u037a\u0378\3\2\2\2\u037a\u037b\3\2\2\2\u037b"+
"\u00b2\3\2\2\2\u037c\u037d\t\5\2\2\u037d\u00b4\3\2\2\2\u037e\u037f\t\6"+
"\2\2\u037f\u00b6\3\2\2\2\u0380\u0381\t\7\2\2\u0381\u00b8\3\2\2\2\u0382"+
"\u0386\5\u00bb^\2\u0383\u0385\5\u00bd_\2\u0384\u0383\3\2\2\2\u0385\u0388"+
"\3\2\2\2\u0386\u0384\3\2\2\2\u0386\u0387\3\2\2\2\u0387\u00ba\3\2\2\2\u0388"+
"\u0386\3\2\2\2\u0389\u038a\t\b\2\2\u038a\u00bc\3\2\2\2\u038b\u038c\t\t"+
"\2\2\u038c\u00be\3\2\2\2\u038d\u0391\7#\2\2\u038e\u0390\5\u00bd_\2\u038f"+
"\u038e\3\2\2\2\u0390\u0393\3\2\2\2\u0391\u038f\3\2\2\2\u0391\u0392\3\2"+
"\2\2\u0392\u0395\3\2\2\2\u0393\u0391\3\2\2\2\u0394\u0396\t\n\2\2\u0395"+
"\u0394\3\2\2\2\u0396\u0397\3\2\2\2\u0397\u0395\3\2\2\2\u0397\u0398\3\2"+
"\2\2\u0398\u00c0\3\2\2\2\u0399\u039b\t\13\2\2\u039a\u0399\3\2\2\2\u039b"+
"\u039c\3\2\2\2\u039c\u039a\3\2\2\2\u039c\u039d\3\2\2\2\u039d\u039e\3\2"+
"\2\2\u039e\u039f\ba\2\2\u039f\u00c2\3\2\2\2\u03a0\u03a1\7\61\2\2\u03a1"+
"\u03a2\7\61\2\2\u03a2\u03a6\3\2\2\2\u03a3\u03a5\n\f\2\2\u03a4\u03a3\3"+
"\2\2\2\u03a5\u03a8\3\2\2\2\u03a6\u03a4\3\2\2\2\u03a6\u03a7\3\2\2\2\u03a7"+
"\u03a9\3\2\2\2\u03a8\u03a6\3\2\2\2\u03a9\u03aa\bb\3\2\u03aa\u00c4\3\2"+
"\2\2\u03ab\u03ac\7\61\2\2\u03ac\u03ad\7,\2\2\u03ad\u03b1\3\2\2\2\u03ae"+
"\u03b0\13\2\2\2\u03af\u03ae\3\2\2\2\u03b0\u03b3\3\2\2\2\u03b1\u03b2\3"+
"\2\2\2\u03b1\u03af\3\2\2\2\u03b2\u03b4\3\2\2\2\u03b3\u03b1\3\2\2\2\u03b4"+
"\u03b5\7,\2\2\u03b5\u03b6\7\61\2\2\u03b6\u03b7\3\2\2\2\u03b7\u03b8\bc"+
"\3\2\u03b8\u00c6\3\2\2\2!\2\u02c9\u02d1\u02fc\u0302\u0304\u030d\u031a"+
"\u031e\u0323\u032a\u032f\u0336\u033b\u0342\u0349\u034e\u0355\u035a\u0361"+
"\u0367\u0369\u036e\u0375\u037a\u0386\u0391\u0397\u039c\u03a6\u03b1\4\2"+
"\3\2\2\4\2";
"\13N\3N\3N\5N\u030a\nN\3O\3O\3O\3O\5O\u0310\nO\3O\3O\3P\3P\3P\3P\3P\3"+
"P\3P\3P\3P\5P\u031d\nP\3Q\3Q\5Q\u0321\nQ\3R\3R\3R\5R\u0326\nR\3S\3S\3"+
"S\3S\3S\5S\u032d\nS\3S\7S\u0330\nS\fS\16S\u0333\13S\3S\3S\6S\u0337\nS"+
"\rS\16S\u0338\3T\7T\u033c\nT\fT\16T\u033f\13T\3T\3T\6T\u0343\nT\rT\16"+
"T\u0344\3U\3U\3U\3U\3U\5U\u034c\nU\3U\7U\u034f\nU\fU\16U\u0352\13U\3U"+
"\3U\6U\u0356\nU\rU\16U\u0357\3V\3V\3V\5V\u035d\nV\3W\3W\3W\6W\u0362\n"+
"W\rW\16W\u0363\3W\3W\6W\u0368\nW\rW\16W\u0369\5W\u036c\nW\3X\6X\u036f"+
"\nX\rX\16X\u0370\3Y\3Y\3Y\3Y\3Y\5Y\u0378\nY\3Y\6Y\u037b\nY\rY\16Y\u037c"+
"\3Z\3Z\3[\3[\3\\\3\\\3]\3]\7]\u0387\n]\f]\16]\u038a\13]\3^\3^\3_\3_\3"+
"`\3`\7`\u0392\n`\f`\16`\u0395\13`\3`\6`\u0398\n`\r`\16`\u0399\3a\6a\u039d"+
"\na\ra\16a\u039e\3a\3a\3b\3b\3b\3b\7b\u03a7\nb\fb\16b\u03aa\13b\3b\3b"+
"\3c\3c\3c\3c\7c\u03b2\nc\fc\16c\u03b5\13c\3c\3c\3c\3c\3c\4\u02d1\u03b3"+
"\2d\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\67"+
"m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008d"+
"H\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1"+
"R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3\2\u00b5"+
"\2\u00b7\2\u00b9[\u00bb\2\u00bd\2\u00bf\\\u00c1]\u00c3^\u00c5_\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--//\6\2\13\f\17\17\"\"\u00a2\u00a2\4\2\f\f\17\17\2\u0428\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\2"+
"I\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\2"+
"o\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\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2"+
"\2\2\u00b9\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5"+
"\3\2\2\2\3\u00c7\3\2\2\2\5\u00ce\3\2\2\2\7\u00d0\3\2\2\2\t\u00d2\3\2\2"+
"\2\13\u00d4\3\2\2\2\r\u00d6\3\2\2\2\17\u00d8\3\2\2\2\21\u00da\3\2\2\2"+
"\23\u00dc\3\2\2\2\25\u00e2\3\2\2\2\27\u00e9\3\2\2\2\31\u00ef\3\2\2\2\33"+
"\u00f8\3\2\2\2\35\u00ff\3\2\2\2\37\u0108\3\2\2\2!\u0112\3\2\2\2#\u0115"+
"\3\2\2\2%\u011a\3\2\2\2\'\u0120\3\2\2\2)\u0123\3\2\2\2+\u0127\3\2\2\2"+
"-\u012e\3\2\2\2/\u0134\3\2\2\2\61\u013d\3\2\2\2\63\u0141\3\2\2\2\65\u0143"+
"\3\2\2\2\67\u0146\3\2\2\29\u014d\3\2\2\2;\u0156\3\2\2\2=\u0158\3\2\2\2"+
"?\u015a\3\2\2\2A\u015c\3\2\2\2C\u015f\3\2\2\2E\u0162\3\2\2\2G\u0164\3"+
"\2\2\2I\u0166\3\2\2\2K\u0168\3\2\2\2M\u016a\3\2\2\2O\u016c\3\2\2\2Q\u016f"+
"\3\2\2\2S\u0172\3\2\2\2U\u0174\3\2\2\2W\u0176\3\2\2\2Y\u0178\3\2\2\2["+
"\u017a\3\2\2\2]\u017d\3\2\2\2_\u0180\3\2\2\2a\u0183\3\2\2\2c\u0186\3\2"+
"\2\2e\u0188\3\2\2\2g\u018a\3\2\2\2i\u018d\3\2\2\2k\u0190\3\2\2\2m\u0192"+
"\3\2\2\2o\u0195\3\2\2\2q\u0198\3\2\2\2s\u019b\3\2\2\2u\u019e\3\2\2\2w"+
"\u01a1\3\2\2\2y\u01a5\3\2\2\2{\u01a9\3\2\2\2}\u01ac\3\2\2\2\177\u01af"+
"\3\2\2\2\u0081\u01b2\3\2\2\2\u0083\u01ba\3\2\2\2\u0085\u01c3\3\2\2\2\u0087"+
"\u01c8\3\2\2\2\u0089\u01d1\3\2\2\2\u008b\u01d7\3\2\2\2\u008d\u01de\3\2"+
"\2\2\u008f\u01e1\3\2\2\2\u0091\u01e7\3\2\2\2\u0093\u01e9\3\2\2\2\u0095"+
"\u02c9\3\2\2\2\u0097\u02cb\3\2\2\2\u0099\u02fc\3\2\2\2\u009b\u02fe\3\2"+
"\2\2\u009d\u030b\3\2\2\2\u009f\u031c\3\2\2\2\u00a1\u0320\3\2\2\2\u00a3"+
"\u0325\3\2\2\2\u00a5\u032c\3\2\2\2\u00a7\u033d\3\2\2\2\u00a9\u034b\3\2"+
"\2\2\u00ab\u035c\3\2\2\2\u00ad\u036b\3\2\2\2\u00af\u036e\3\2\2\2\u00b1"+
"\u0377\3\2\2\2\u00b3\u037e\3\2\2\2\u00b5\u0380\3\2\2\2\u00b7\u0382\3\2"+
"\2\2\u00b9\u0384\3\2\2\2\u00bb\u038b\3\2\2\2\u00bd\u038d\3\2\2\2\u00bf"+
"\u038f\3\2\2\2\u00c1\u039c\3\2\2\2\u00c3\u03a2\3\2\2\2\u00c5\u03ad\3\2"+
"\2\2\u00c7\u00c8\7k\2\2\u00c8\u00c9\7o\2\2\u00c9\u00ca\7r\2\2\u00ca\u00cb"+
"\7q\2\2\u00cb\u00cc\7t\2\2\u00cc\u00cd\7v\2\2\u00cd\4\3\2\2\2\u00ce\u00cf"+
"\7?\2\2\u00cf\6\3\2\2\2\u00d0\u00d1\7=\2\2\u00d1\b\3\2\2\2\u00d2\u00d3"+
"\7*\2\2\u00d3\n\3\2\2\2\u00d4\u00d5\7+\2\2\u00d5\f\3\2\2\2\u00d6\u00d7"+
"\7}\2\2\u00d7\16\3\2\2\2\u00d8\u00d9\7\177\2\2\u00d9\20\3\2\2\2\u00da"+
"\u00db\7.\2\2\u00db\22\3\2\2\2\u00dc\u00dd\7e\2\2\u00dd\u00de\7q\2\2\u00de"+
"\u00df\7p\2\2\u00df\u00e0\7u\2\2\u00e0\u00e1\7v\2\2\u00e1\24\3\2\2\2\u00e2"+
"\u00e3\7g\2\2\u00e3\u00e4\7z\2\2\u00e4\u00e5\7v\2\2\u00e5\u00e6\7g\2\2"+
"\u00e6\u00e7\7t\2\2\u00e7\u00e8\7p\2\2\u00e8\26\3\2\2\2\u00e9\u00ea\7"+
"c\2\2\u00ea\u00eb\7n\2\2\u00eb\u00ec\7k\2\2\u00ec\u00ed\7i\2\2\u00ed\u00ee"+
"\7p\2\2\u00ee\30\3\2\2\2\u00ef\u00f0\7t\2\2\u00f0\u00f1\7g\2\2\u00f1\u00f2"+
"\7i\2\2\u00f2\u00f3\7k\2\2\u00f3\u00f4\7u\2\2\u00f4\u00f5\7v\2\2\u00f5"+
"\u00f6\7g\2\2\u00f6\u00f7\7t\2\2\u00f7\32\3\2\2\2\u00f8\u00f9\7k\2\2\u00f9"+
"\u00fa\7p\2\2\u00fa\u00fb\7n\2\2\u00fb\u00fc\7k\2\2\u00fc\u00fd\7p\2\2"+
"\u00fd\u00fe\7g\2\2\u00fe\34\3\2\2\2\u00ff\u0100\7x\2\2\u0100\u0101\7"+
"q\2\2\u0101\u0102\7n\2\2\u0102\u0103\7c\2\2\u0103\u0104\7v\2\2\u0104\u0105"+
"\7k\2\2\u0105\u0106\7n\2\2\u0106\u0107\7g\2\2\u0107\36\3\2\2\2\u0108\u0109"+
"\7k\2\2\u0109\u010a\7p\2\2\u010a\u010b\7v\2\2\u010b\u010c\7g\2\2\u010c"+
"\u010d\7t\2\2\u010d\u010e\7t\2\2\u010e\u010f\7w\2\2\u010f\u0110\7r\2\2"+
"\u0110\u0111\7v\2\2\u0111 \3\2\2\2\u0112\u0113\7k\2\2\u0113\u0114\7h\2"+
"\2\u0114\"\3\2\2\2\u0115\u0116\7g\2\2\u0116\u0117\7n\2\2\u0117\u0118\7"+
"u\2\2\u0118\u0119\7g\2\2\u0119$\3\2\2\2\u011a\u011b\7y\2\2\u011b\u011c"+
"\7j\2\2\u011c\u011d\7k\2\2\u011d\u011e\7n\2\2\u011e\u011f\7g\2\2\u011f"+
"&\3\2\2\2\u0120\u0121\7f\2\2\u0121\u0122\7q\2\2\u0122(\3\2\2\2\u0123\u0124"+
"\7h\2\2\u0124\u0125\7q\2\2\u0125\u0126\7t\2\2\u0126*\3\2\2\2\u0127\u0128"+
"\7t\2\2\u0128\u0129\7g\2\2\u0129\u012a\7v\2\2\u012a\u012b\7w\2\2\u012b"+
"\u012c\7t\2\2\u012c\u012d\7p\2\2\u012d,\3\2\2\2\u012e\u012f\7d\2\2\u012f"+
"\u0130\7t\2\2\u0130\u0131\7g\2\2\u0131\u0132\7c\2\2\u0132\u0133\7m\2\2"+
"\u0133.\3\2\2\2\u0134\u0135\7e\2\2\u0135\u0136\7q\2\2\u0136\u0137\7p\2"+
"\2\u0137\u0138\7v\2\2\u0138\u0139\7k\2\2\u0139\u013a\7p\2\2\u013a\u013b"+
"\7w\2\2\u013b\u013c\7g\2\2\u013c\60\3\2\2\2\u013d\u013e\7c\2\2\u013e\u013f"+
"\7u\2\2\u013f\u0140\7o\2\2\u0140\62\3\2\2\2\u0141\u0142\7<\2\2\u0142\64"+
"\3\2\2\2\u0143\u0144\7\60\2\2\u0144\u0145\7\60\2\2\u0145\66\3\2\2\2\u0146"+
"\u0147\7u\2\2\u0147\u0148\7k\2\2\u0148\u0149\7i\2\2\u0149\u014a\7p\2\2"+
"\u014a\u014b\7g\2\2\u014b\u014c\7f\2\2\u014c8\3\2\2\2\u014d\u014e\7w\2"+
"\2\u014e\u014f\7p\2\2\u014f\u0150\7u\2\2\u0150\u0151\7k\2\2\u0151\u0152"+
"\7i\2\2\u0152\u0153\7p\2\2\u0153\u0154\7g\2\2\u0154\u0155\7f\2\2\u0155"+
":\3\2\2\2\u0156\u0157\7,\2\2\u0157<\3\2\2\2\u0158\u0159\7]\2\2\u0159>"+
"\3\2\2\2\u015a\u015b\7_\2\2\u015b@\3\2\2\2\u015c\u015d\7/\2\2\u015d\u015e"+
"\7/\2\2\u015eB\3\2\2\2\u015f\u0160\7-\2\2\u0160\u0161\7-\2\2\u0161D\3"+
"\2\2\2\u0162\u0163\7-\2\2\u0163F\3\2\2\2\u0164\u0165\7/\2\2\u0165H\3\2"+
"\2\2\u0166\u0167\7#\2\2\u0167J\3\2\2\2\u0168\u0169\7(\2\2\u0169L\3\2\2"+
"\2\u016a\u016b\7\u0080\2\2\u016bN\3\2\2\2\u016c\u016d\7@\2\2\u016d\u016e"+
"\7@\2\2\u016eP\3\2\2\2\u016f\u0170\7>\2\2\u0170\u0171\7>\2\2\u0171R\3"+
"\2\2\2\u0172\u0173\7\61\2\2\u0173T\3\2\2\2\u0174\u0175\7\'\2\2\u0175V"+
"\3\2\2\2\u0176\u0177\7>\2\2\u0177X\3\2\2\2\u0178\u0179\7@\2\2\u0179Z\3"+
"\2\2\2\u017a\u017b\7?\2\2\u017b\u017c\7?\2\2\u017c\\\3\2\2\2\u017d\u017e"+
"\7#\2\2\u017e\u017f\7?\2\2\u017f^\3\2\2\2\u0180\u0181\7>\2\2\u0181\u0182"+
"\7?\2\2\u0182`\3\2\2\2\u0183\u0184\7@\2\2\u0184\u0185\7?\2\2\u0185b\3"+
"\2\2\2\u0186\u0187\7`\2\2\u0187d\3\2\2\2\u0188\u0189\7~\2\2\u0189f\3\2"+
"\2\2\u018a\u018b\7(\2\2\u018b\u018c\7(\2\2\u018ch\3\2\2\2\u018d\u018e"+
"\7~\2\2\u018e\u018f\7~\2\2\u018fj\3\2\2\2\u0190\u0191\7A\2\2\u0191l\3"+
"\2\2\2\u0192\u0193\7-\2\2\u0193\u0194\7?\2\2\u0194n\3\2\2\2\u0195\u0196"+
"\7/\2\2\u0196\u0197\7?\2\2\u0197p\3\2\2\2\u0198\u0199\7,\2\2\u0199\u019a"+
"\7?\2\2\u019ar\3\2\2\2\u019b\u019c\7\61\2\2\u019c\u019d\7?\2\2\u019dt"+
"\3\2\2\2\u019e\u019f\7\'\2\2\u019f\u01a0\7?\2\2\u01a0v\3\2\2\2\u01a1\u01a2"+
"\7>\2\2\u01a2\u01a3\7>\2\2\u01a3\u01a4\7?\2\2\u01a4x\3\2\2\2\u01a5\u01a6"+
"\7@\2\2\u01a6\u01a7\7@\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~\3\2\2\2\u01af\u01b0\7`\2\2\u01b0\u01b1\7?\2\2\u01b1\u0080"+
"\3\2\2\2\u01b2\u01b3\7m\2\2\u01b3\u01b4\7k\2\2\u01b4\u01b5\7e\2\2\u01b5"+
"\u01b6\7m\2\2\u01b6\u01b7\7c\2\2\u01b7\u01b8\7u\2\2\u01b8\u01b9\7o\2\2"+
"\u01b9\u0082\3\2\2\2\u01ba\u01bb\7t\2\2\u01bb\u01bc\7g\2\2\u01bc\u01bd"+
"\7u\2\2\u01bd\u01be\7q\2\2\u01be\u01bf\7w\2\2\u01bf\u01c0\7t\2\2\u01c0"+
"\u01c1\7e\2\2\u01c1\u01c2\7g\2\2\u01c2\u0084\3\2\2\2\u01c3\u01c4\7w\2"+
"\2\u01c4\u01c5\7u\2\2\u01c5\u01c6\7g\2\2\u01c6\u01c7\7u\2\2\u01c7\u0086"+
"\3\2\2\2\u01c8\u01c9\7e\2\2\u01c9\u01ca\7n\2\2\u01ca\u01cb\7q\2\2\u01cb"+
"\u01cc\7d\2\2\u01cc\u01cd\7d\2\2\u01cd\u01ce\7g\2\2\u01ce\u01cf\7t\2\2"+
"\u01cf\u01d0\7u\2\2\u01d0\u0088\3\2\2\2\u01d1\u01d2\7d\2\2\u01d2\u01d3"+
"\7{\2\2\u01d3\u01d4\7v\2\2\u01d4\u01d5\7g\2\2\u01d5\u01d6\7u\2\2\u01d6"+
"\u008a\3\2\2\2\u01d7\u01d8\7e\2\2\u01d8\u01d9\7{\2\2\u01d9\u01da\7e\2"+
"\2\u01da\u01db\7n\2\2\u01db\u01dc\7g\2\2\u01dc\u01dd\7u\2\2\u01dd\u008c"+
"\3\2\2\2\u01de\u01df\7r\2\2\u01df\u01e0\7e\2\2\u01e0\u008e\3\2\2\2\u01e1"+
"\u01e2\7\60\2\2\u01e2\u01e3\7d\2\2\u01e3\u01e4\7{\2\2\u01e4\u01e5\7v\2"+
"\2\u01e5\u01e6\7g\2\2\u01e6\u0090\3\2\2\2\u01e7\u01e8\7%\2\2\u01e8\u0092"+
"\3\2\2\2\u01e9\u01ea\7\60\2\2\u01ea\u0094\3\2\2\2\u01eb\u01ec\7d\2\2\u01ec"+
"\u01ed\7t\2\2\u01ed\u02ca\7m\2\2\u01ee\u01ef\7q\2\2\u01ef\u01f0\7t\2\2"+
"\u01f0\u02ca\7c\2\2\u01f1\u01f2\7m\2\2\u01f2\u01f3\7k\2\2\u01f3\u02ca"+
"\7n\2\2\u01f4\u01f5\7u\2\2\u01f5\u01f6\7n\2\2\u01f6\u02ca\7q\2\2\u01f7"+
"\u01f8\7p\2\2\u01f8\u01f9\7q\2\2\u01f9\u02ca\7r\2\2\u01fa\u01fb\7c\2\2"+
"\u01fb\u01fc\7u\2\2\u01fc\u02ca\7n\2\2\u01fd\u01fe\7r\2\2\u01fe\u01ff"+
"\7j\2\2\u01ff\u02ca\7r\2\2\u0200\u0201\7c\2\2\u0201\u0202\7p\2\2\u0202"+
"\u02ca\7e\2\2\u0203\u0204\7d\2\2\u0204\u0205\7r\2\2\u0205\u02ca\7n\2\2"+
"\u0206\u0207\7e\2\2\u0207\u0208\7n\2\2\u0208\u02ca\7e\2\2\u0209\u020a"+
"\7l\2\2\u020a\u020b\7u\2\2\u020b\u02ca\7t\2\2\u020c\u020d\7c\2\2\u020d"+
"\u020e\7p\2\2\u020e\u02ca\7f\2\2\u020f\u0210\7t\2\2\u0210\u0211\7n\2\2"+
"\u0211\u02ca\7c\2\2\u0212\u0213\7d\2\2\u0213\u0214\7k\2\2\u0214\u02ca"+
"\7v\2\2\u0215\u0216\7t\2\2\u0216\u0217\7q\2\2\u0217\u02ca\7n\2\2\u0218"+
"\u0219\7r\2\2\u0219\u021a\7n\2\2\u021a\u02ca\7c\2\2\u021b\u021c\7r\2\2"+
"\u021c\u021d\7n\2\2\u021d\u02ca\7r\2\2\u021e\u021f\7d\2\2\u021f\u0220"+
"\7o\2\2\u0220\u02ca\7k\2\2\u0221\u0222\7u\2\2\u0222\u0223\7g\2\2\u0223"+
"\u02ca\7e\2\2\u0224\u0225\7t\2\2\u0225\u0226\7v\2\2\u0226\u02ca\7k\2\2"+
"\u0227\u0228\7g\2\2\u0228\u0229\7q\2\2\u0229\u02ca\7t\2\2\u022a\u022b"+
"\7u\2\2\u022b\u022c\7t\2\2\u022c\u02ca\7g\2\2\u022d\u022e\7n\2\2\u022e"+
"\u022f\7u\2\2\u022f\u02ca\7t\2\2\u0230\u0231\7r\2\2\u0231\u0232\7j\2\2"+
"\u0232\u02ca\7c\2\2\u0233\u0234\7c\2\2\u0234\u0235\7n\2\2\u0235\u02ca"+
"\7t\2\2\u0236\u0237\7l\2\2\u0237\u0238\7o\2\2\u0238\u02ca\7r\2\2\u0239"+
"\u023a\7d\2\2\u023a\u023b\7x\2\2\u023b\u02ca\7e\2\2\u023c\u023d\7e\2\2"+
"\u023d\u023e\7n\2\2\u023e\u02ca\7k\2\2\u023f\u0240\7t\2\2\u0240\u0241"+
"\7v\2\2\u0241\u02ca\7u\2\2\u0242\u0243\7c\2\2\u0243\u0244\7f\2\2\u0244"+
"\u02ca\7e\2\2\u0245\u0246\7t\2\2\u0246\u0247\7t\2\2\u0247\u02ca\7c\2\2"+
"\u0248\u0249\7d\2\2\u0249\u024a\7x\2\2\u024a\u02ca\7u\2\2\u024b\u024c"+
"\7u\2\2\u024c\u024d\7g\2\2\u024d\u02ca\7k\2\2\u024e\u024f\7u\2\2\u024f"+
"\u0250\7c\2\2\u0250\u02ca\7z\2\2\u0251\u0252\7u\2\2\u0252\u0253\7v\2\2"+
"\u0253\u02ca\7{\2\2\u0254\u0255\7u\2\2\u0255\u0256\7v\2\2\u0256\u02ca"+
"\7c\2\2\u0257\u0258\7u\2\2\u0258\u0259\7v\2\2\u0259\u02ca\7z\2\2\u025a"+
"\u025b\7f\2\2\u025b\u025c\7g\2\2\u025c\u02ca\7{\2\2\u025d\u025e\7v\2\2"+
"\u025e\u025f\7z\2\2\u025f\u02ca\7c\2\2\u0260\u0261\7z\2\2\u0261\u0262"+
"\7c\2\2\u0262\u02ca\7c\2\2\u0263\u0264\7d\2\2\u0264\u0265\7e\2\2\u0265"+
"\u02ca\7e\2\2\u0266\u0267\7c\2\2\u0267\u0268\7j\2\2\u0268\u02ca\7z\2\2"+
"\u0269\u026a\7v\2\2\u026a\u026b\7{\2\2\u026b\u02ca\7c\2\2\u026c\u026d"+
"\7v\2\2\u026d\u026e\7z\2\2\u026e\u02ca\7u\2\2\u026f\u0270\7v\2\2\u0270"+
"\u0271\7c\2\2\u0271\u02ca\7u\2\2\u0272\u0273\7u\2\2\u0273\u0274\7j\2\2"+
"\u0274\u02ca\7{\2\2\u0275\u0276\7u\2\2\u0276\u0277\7j\2\2\u0277\u02ca"+
"\7z\2\2\u0278\u0279\7n\2\2\u0279\u027a\7f\2\2\u027a\u02ca\7{\2\2\u027b"+
"\u027c\7n\2\2\u027c\u027d\7f\2\2\u027d\u02ca\7c\2\2\u027e\u027f\7n\2\2"+
"\u027f\u0280\7f\2\2\u0280\u02ca\7z\2\2\u0281\u0282\7n\2\2\u0282\u0283"+
"\7c\2\2\u0283\u02ca\7z\2\2\u0284\u0285\7v\2\2\u0285\u0286\7c\2\2\u0286"+
"\u02ca\7{\2\2\u0287\u0288\7v\2\2\u0288\u0289\7c\2\2\u0289\u02ca\7z\2\2"+
"\u028a\u028b\7d\2\2\u028b\u028c\7e\2\2\u028c\u02ca\7u\2\2\u028d\u028e"+
"\7e\2\2\u028e\u028f\7n\2\2\u028f\u02ca\7x\2\2\u0290\u0291\7v\2\2\u0291"+
"\u0292\7u\2\2\u0292\u02ca\7z\2\2\u0293\u0294\7n\2\2\u0294\u0295\7c\2\2"+
"\u0295\u02ca\7u\2\2\u0296\u0297\7e\2\2\u0297\u0298\7r\2\2\u0298\u02ca"+
"\7{\2\2\u0299\u029a\7e\2\2\u029a\u029b\7o\2\2\u029b\u02ca\7r\2\2\u029c"+
"\u029d\7e\2\2\u029d\u029e\7r\2\2\u029e\u02ca\7z\2\2\u029f\u02a0\7f\2\2"+
"\u02a0\u02a1\7e\2\2\u02a1\u02ca\7r\2\2\u02a2\u02a3\7f\2\2\u02a3\u02a4"+
"\7g\2\2\u02a4\u02ca\7e\2\2\u02a5\u02a6\7k\2\2\u02a6\u02a7\7p\2\2\u02a7"+
"\u02ca\7e\2\2\u02a8\u02a9\7c\2\2\u02a9\u02aa\7z\2\2\u02aa\u02ca\7u\2\2"+
"\u02ab\u02ac\7d\2\2\u02ac\u02ad\7p\2\2\u02ad\u02ca\7g\2\2\u02ae\u02af"+
"\7e\2\2\u02af\u02b0\7n\2\2\u02b0\u02ca\7f\2\2\u02b1\u02b2\7u\2\2\u02b2"+
"\u02b3\7d\2\2\u02b3\u02ca\7e\2\2\u02b4\u02b5\7k\2\2\u02b5\u02b6\7u\2\2"+
"\u02b6\u02ca\7e\2\2\u02b7\u02b8\7k\2\2\u02b8\u02b9\7p\2\2\u02b9\u02ca"+
"\7z\2\2\u02ba\u02bb\7d\2\2\u02bb\u02bc\7g\2\2\u02bc\u02ca\7s\2\2\u02bd"+
"\u02be\7u\2\2\u02be\u02bf\7g\2\2\u02bf\u02ca\7f\2\2\u02c0\u02c1\7f\2\2"+
"\u02c1\u02c2\7g\2\2\u02c2\u02ca\7z\2\2\u02c3\u02c4\7k\2\2\u02c4\u02c5"+
"\7p\2\2\u02c5\u02ca\7{\2\2\u02c6\u02c7\7t\2\2\u02c7\u02c8\7q\2\2\u02c8"+
"\u02ca\7t\2\2\u02c9\u01eb\3\2\2\2\u02c9\u01ee\3\2\2\2\u02c9\u01f1\3\2"+
"\2\2\u02c9\u01f4\3\2\2\2\u02c9\u01f7\3\2\2\2\u02c9\u01fa\3\2\2\2\u02c9"+
"\u01fd\3\2\2\2\u02c9\u0200\3\2\2\2\u02c9\u0203\3\2\2\2\u02c9\u0206\3\2"+
"\2\2\u02c9\u0209\3\2\2\2\u02c9\u020c\3\2\2\2\u02c9\u020f\3\2\2\2\u02c9"+
"\u0212\3\2\2\2\u02c9\u0215\3\2\2\2\u02c9\u0218\3\2\2\2\u02c9\u021b\3\2"+
"\2\2\u02c9\u021e\3\2\2\2\u02c9\u0221\3\2\2\2\u02c9\u0224\3\2\2\2\u02c9"+
"\u0227\3\2\2\2\u02c9\u022a\3\2\2\2\u02c9\u022d\3\2\2\2\u02c9\u0230\3\2"+
"\2\2\u02c9\u0233\3\2\2\2\u02c9\u0236\3\2\2\2\u02c9\u0239\3\2\2\2\u02c9"+
"\u023c\3\2\2\2\u02c9\u023f\3\2\2\2\u02c9\u0242\3\2\2\2\u02c9\u0245\3\2"+
"\2\2\u02c9\u0248\3\2\2\2\u02c9\u024b\3\2\2\2\u02c9\u024e\3\2\2\2\u02c9"+
"\u0251\3\2\2\2\u02c9\u0254\3\2\2\2\u02c9\u0257\3\2\2\2\u02c9\u025a\3\2"+
"\2\2\u02c9\u025d\3\2\2\2\u02c9\u0260\3\2\2\2\u02c9\u0263\3\2\2\2\u02c9"+
"\u0266\3\2\2\2\u02c9\u0269\3\2\2\2\u02c9\u026c\3\2\2\2\u02c9\u026f\3\2"+
"\2\2\u02c9\u0272\3\2\2\2\u02c9\u0275\3\2\2\2\u02c9\u0278\3\2\2\2\u02c9"+
"\u027b\3\2\2\2\u02c9\u027e\3\2\2\2\u02c9\u0281\3\2\2\2\u02c9\u0284\3\2"+
"\2\2\u02c9\u0287\3\2\2\2\u02c9\u028a\3\2\2\2\u02c9\u028d\3\2\2\2\u02c9"+
"\u0290\3\2\2\2\u02c9\u0293\3\2\2\2\u02c9\u0296\3\2\2\2\u02c9\u0299\3\2"+
"\2\2\u02c9\u029c\3\2\2\2\u02c9\u029f\3\2\2\2\u02c9\u02a2\3\2\2\2\u02c9"+
"\u02a5\3\2\2\2\u02c9\u02a8\3\2\2\2\u02c9\u02ab\3\2\2\2\u02c9\u02ae\3\2"+
"\2\2\u02c9\u02b1\3\2\2\2\u02c9\u02b4\3\2\2\2\u02c9\u02b7\3\2\2\2\u02c9"+
"\u02ba\3\2\2\2\u02c9\u02bd\3\2\2\2\u02c9\u02c0\3\2\2\2\u02c9\u02c3\3\2"+
"\2\2\u02c9\u02c6\3\2\2\2\u02ca\u0096\3\2\2\2\u02cb\u02cc\7}\2\2\u02cc"+
"\u02cd\7}\2\2\u02cd\u02d1\3\2\2\2\u02ce\u02d0\13\2\2\2\u02cf\u02ce\3\2"+
"\2\2\u02d0\u02d3\3\2\2\2\u02d1\u02d2\3\2\2\2\u02d1\u02cf\3\2\2\2\u02d2"+
"\u02d4\3\2\2\2\u02d3\u02d1\3\2\2\2\u02d4\u02d5\7\177\2\2\u02d5\u02d6\7"+
"\177\2\2\u02d6\u0098\3\2\2\2\u02d7\u02d8\7d\2\2\u02d8\u02d9\7{\2\2\u02d9"+
"\u02da\7v\2\2\u02da\u02fd\7g\2\2\u02db\u02dc\7y\2\2\u02dc\u02dd\7q\2\2"+
"\u02dd\u02de\7t\2\2\u02de\u02fd\7f\2\2\u02df\u02e0\7f\2\2\u02e0\u02e1"+
"\7y\2\2\u02e1\u02e2\7q\2\2\u02e2\u02e3\7t\2\2\u02e3\u02fd\7f\2\2\u02e4"+
"\u02e5\7d\2\2\u02e5\u02e6\7q\2\2\u02e6\u02e7\7q\2\2\u02e7\u02fd\7n\2\2"+
"\u02e8\u02e9\7e\2\2\u02e9\u02ea\7j\2\2\u02ea\u02eb\7c\2\2\u02eb\u02fd"+
"\7t\2\2\u02ec\u02ed\7u\2\2\u02ed\u02ee\7j\2\2\u02ee\u02ef\7q\2\2\u02ef"+
"\u02f0\7t\2\2\u02f0\u02fd\7v\2\2\u02f1\u02f2\7k\2\2\u02f2\u02f3\7p\2\2"+
"\u02f3\u02fd\7v\2\2\u02f4\u02f5\7n\2\2\u02f5\u02f6\7q\2\2\u02f6\u02f7"+
"\7p\2\2\u02f7\u02fd\7i\2\2\u02f8\u02f9\7x\2\2\u02f9\u02fa\7q\2\2\u02fa"+
"\u02fb\7k\2\2\u02fb\u02fd\7f\2\2\u02fc\u02d7\3\2\2\2\u02fc\u02db\3\2\2"+
"\2\u02fc\u02df\3\2\2\2\u02fc\u02e4\3\2\2\2\u02fc\u02e8\3\2\2\2\u02fc\u02ec"+
"\3\2\2\2\u02fc\u02f1\3\2\2\2\u02fc\u02f4\3\2\2\2\u02fc\u02f8\3\2\2\2\u02fd"+
"\u009a\3\2\2\2\u02fe\u0304\7$\2\2\u02ff\u0300\7^\2\2\u0300\u0303\7$\2"+
"\2\u0301\u0303\n\2\2\2\u0302\u02ff\3\2\2\2\u0302\u0301\3\2\2\2\u0303\u0306"+
"\3\2\2\2\u0304\u0302\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0307\3\2\2\2\u0306"+
"\u0304\3\2\2\2\u0307\u0309\7$\2\2\u0308\u030a\7|\2\2\u0309\u0308\3\2\2"+
"\2\u0309\u030a\3\2\2\2\u030a\u009c\3\2\2\2\u030b\u030f\7)\2\2\u030c\u030d"+
"\7^\2\2\u030d\u0310\7)\2\2\u030e\u0310\n\3\2\2\u030f\u030c\3\2\2\2\u030f"+
"\u030e\3\2\2\2\u0310\u0311\3\2\2\2\u0311\u0312\7)\2\2\u0312\u009e\3\2"+
"\2\2\u0313\u0314\7v\2\2\u0314\u0315\7t\2\2\u0315\u0316\7w\2\2\u0316\u031d"+
"\7g\2\2\u0317\u0318\7h\2\2\u0318\u0319\7c\2\2\u0319\u031a\7n\2\2\u031a"+
"\u031b\7u\2\2\u031b\u031d\7g\2\2\u031c\u0313\3\2\2\2\u031c\u0317\3\2\2"+
"\2\u031d\u00a0\3\2\2\2\u031e\u0321\5\u00a3R\2\u031f\u0321\5\u00abV\2\u0320"+
"\u031e\3\2\2\2\u0320\u031f\3\2\2\2\u0321\u00a2\3\2\2\2\u0322\u0326\5\u00a5"+
"S\2\u0323\u0326\5\u00a7T\2\u0324\u0326\5\u00a9U\2\u0325\u0322\3\2\2\2"+
"\u0325\u0323\3\2\2\2\u0325\u0324\3\2\2\2\u0326\u00a4\3\2\2\2\u0327\u032d"+
"\7\'\2\2\u0328\u0329\7\62\2\2\u0329\u032d\7d\2\2\u032a\u032b\7\62\2\2"+
"\u032b\u032d\7D\2\2\u032c\u0327\3\2\2\2\u032c\u0328\3\2\2\2\u032c\u032a"+
"\3\2\2\2\u032d\u0331\3\2\2\2\u032e\u0330\5\u00b3Z\2\u032f\u032e\3\2\2"+
"\2\u0330\u0333\3\2\2\2\u0331\u032f\3\2\2\2\u0331\u0332\3\2\2\2\u0332\u0334"+
"\3\2\2\2\u0333\u0331\3\2\2\2\u0334\u0336\7\60\2\2\u0335\u0337\5\u00b3"+
"Z\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\u033c\5\u00b5[\2\u033b\u033a"+
"\3\2\2\2\u033c\u033f\3\2\2\2\u033d\u033b\3\2\2\2\u033d\u033e\3\2\2\2\u033e"+
"\u0340\3\2\2\2\u033f\u033d\3\2\2\2\u0340\u0342\7\60\2\2\u0341\u0343\5"+
"\u00b5[\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\u034c\7&\2\2\u0347\u0348"+
"\7\62\2\2\u0348\u034c\7z\2\2\u0349\u034a\7\62\2\2\u034a\u034c\7Z\2\2\u034b"+
"\u0346\3\2\2\2\u034b\u0347\3\2\2\2\u034b\u0349\3\2\2\2\u034c\u0350\3\2"+
"\2\2\u034d\u034f\5\u00b7\\\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\u0353\3\2\2\2\u0352\u0350\3\2"+
"\2\2\u0353\u0355\7\60\2\2\u0354\u0356\5\u00b7\\\2\u0355\u0354\3\2\2\2"+
"\u0356\u0357\3\2\2\2\u0357\u0355\3\2\2\2\u0357\u0358\3\2\2\2\u0358\u00aa"+
"\3\2\2\2\u0359\u035d\5\u00afX\2\u035a\u035d\5\u00b1Y\2\u035b\u035d\5\u00ad"+
"W\2\u035c\u0359\3\2\2\2\u035c\u035a\3\2\2\2\u035c\u035b\3\2\2\2\u035d"+
"\u00ac\3\2\2\2\u035e\u035f\7\62\2\2\u035f\u0361\t\4\2\2\u0360\u0362\5"+
"\u00b3Z\2\u0361\u0360\3\2\2\2\u0362\u0363\3\2\2\2\u0363\u0361\3\2\2\2"+
"\u0363\u0364\3\2\2\2\u0364\u036c\3\2\2\2\u0365\u0367\7\'\2\2\u0366\u0368"+
"\5\u00b3Z\2\u0367\u0366\3\2\2\2\u0368\u0369\3\2\2\2\u0369\u0367\3\2\2"+
"\2\u0369\u036a\3\2\2\2\u036a\u036c\3\2\2\2\u036b\u035e\3\2\2\2\u036b\u0365"+
"\3\2\2\2\u036c\u00ae\3\2\2\2\u036d\u036f\5\u00b5[\2\u036e\u036d\3\2\2"+
"\2\u036f\u0370\3\2\2\2\u0370\u036e\3\2\2\2\u0370\u0371\3\2\2\2\u0371\u00b0"+
"\3\2\2\2\u0372\u0378\7&\2\2\u0373\u0374\7\62\2\2\u0374\u0378\7z\2\2\u0375"+
"\u0376\7\62\2\2\u0376\u0378\7Z\2\2\u0377\u0372\3\2\2\2\u0377\u0373\3\2"+
"\2\2\u0377\u0375\3\2\2\2\u0378\u037a\3\2\2\2\u0379\u037b\5\u00b7\\\2\u037a"+
"\u0379\3\2\2\2\u037b\u037c\3\2\2\2\u037c\u037a\3\2\2\2\u037c\u037d\3\2"+
"\2\2\u037d\u00b2\3\2\2\2\u037e\u037f\t\5\2\2\u037f\u00b4\3\2\2\2\u0380"+
"\u0381\t\6\2\2\u0381\u00b6\3\2\2\2\u0382\u0383\t\7\2\2\u0383\u00b8\3\2"+
"\2\2\u0384\u0388\5\u00bb^\2\u0385\u0387\5\u00bd_\2\u0386\u0385\3\2\2\2"+
"\u0387\u038a\3\2\2\2\u0388\u0386\3\2\2\2\u0388\u0389\3\2\2\2\u0389\u00ba"+
"\3\2\2\2\u038a\u0388\3\2\2\2\u038b\u038c\t\b\2\2\u038c\u00bc\3\2\2\2\u038d"+
"\u038e\t\t\2\2\u038e\u00be\3\2\2\2\u038f\u0393\7#\2\2\u0390\u0392\5\u00bd"+
"_\2\u0391\u0390\3\2\2\2\u0392\u0395\3\2\2\2\u0393\u0391\3\2\2\2\u0393"+
"\u0394\3\2\2\2\u0394\u0397\3\2\2\2\u0395\u0393\3\2\2\2\u0396\u0398\t\n"+
"\2\2\u0397\u0396\3\2\2\2\u0398\u0399\3\2\2\2\u0399\u0397\3\2\2\2\u0399"+
"\u039a\3\2\2\2\u039a\u00c0\3\2\2\2\u039b\u039d\t\13\2\2\u039c\u039b\3"+
"\2\2\2\u039d\u039e\3\2\2\2\u039e\u039c\3\2\2\2\u039e\u039f\3\2\2\2\u039f"+
"\u03a0\3\2\2\2\u03a0\u03a1\ba\2\2\u03a1\u00c2\3\2\2\2\u03a2\u03a3\7\61"+
"\2\2\u03a3\u03a4\7\61\2\2\u03a4\u03a8\3\2\2\2\u03a5\u03a7\n\f\2\2\u03a6"+
"\u03a5\3\2\2\2\u03a7\u03aa\3\2\2\2\u03a8\u03a6\3\2\2\2\u03a8\u03a9\3\2"+
"\2\2\u03a9\u03ab\3\2\2\2\u03aa\u03a8\3\2\2\2\u03ab\u03ac\bb\3\2\u03ac"+
"\u00c4\3\2\2\2\u03ad\u03ae\7\61\2\2\u03ae\u03af\7,\2\2\u03af\u03b3\3\2"+
"\2\2\u03b0\u03b2\13\2\2\2\u03b1\u03b0\3\2\2\2\u03b2\u03b5\3\2\2\2\u03b3"+
"\u03b4\3\2\2\2\u03b3\u03b1\3\2\2\2\u03b4\u03b6\3\2\2\2\u03b5\u03b3\3\2"+
"\2\2\u03b6\u03b7\7,\2\2\u03b7\u03b8\7\61\2\2\u03b8\u03b9\3\2\2\2\u03b9"+
"\u03ba\bc\3\2\u03ba\u00c6\3\2\2\2\"\2\u02c9\u02d1\u02fc\u0302\u0304\u0309"+
"\u030f\u031c\u0320\u0325\u032c\u0331\u0338\u033d\u0344\u034b\u0350\u0357"+
"\u035c\u0363\u0369\u036b\u0370\u0377\u037c\u0388\u0393\u0399\u039e\u03a8"+
"\u03b3\4\2\3\2\2\4\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -1189,7 +1189,13 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
@Override
public RValue visitExprString(KickCParser.ExprStringContext ctx) {
String text = ctx.getText();
return new ConstantString(text.substring(1, text.length() - 1));
String stringValue;
if(text.endsWith("z")) {
stringValue = text.substring(1, text.length() - 2);
} else {
stringValue = text.substring(1, text.length() - 1)+"@";
}
return new ConstantString(stringValue);
}
@Override

View File

@ -102,7 +102,7 @@ void print_sdword(signed dword dw) {
print_dword((dword)dw);
}
const byte[] print_hextab = "0123456789abcdef";
const byte[] print_hextab = "0123456789abcdef"z;
// Print a byte as HEX
void print_byte(byte b) {

View File

@ -32,6 +32,11 @@ public class TestPrograms {
public TestPrograms() {
}
@Test
public void testLiteralStrings() throws IOException, URISyntaxException {
compileAndCompare("literal-strings");
}
@Test
public void testIllegalVoidParameter() throws IOException, URISyntaxException {
assertError("illegal-void-parameter", "Illegal void parameter");

View File

@ -1,7 +1,7 @@
byte[3] b;
byte[] c = {'c', 'm', 'l'};
byte[] d = "cml";
byte[] d = "cml"z;
byte* SCREEN = $400;

View File

@ -15,7 +15,7 @@ void testChar() {
char n = -14;
signed char s = -14;
print_str("char: @");
print_str("char: ");
print_byte(u);
print_char(' ');
print_sbyte(n);
@ -30,7 +30,7 @@ void testShort() {
short n = -1400;
signed short s = -1400;
print_str("short: @");
print_str("short: ");
print_word(u);
print_char(' ');
print_sword(n);
@ -45,7 +45,7 @@ void testInt() {
int n = -1400;
signed int s = -1400;
print_str("int: @");
print_str("int: ");
print_word(u);
print_char(' ');
print_sword(n);
@ -60,7 +60,7 @@ void testLong() {
long n = -140000;
signed long s = -140000;
print_str("long: @");
print_str("long: ");
print_dword(u);
print_char(' ');
print_sdword(n);

View File

@ -115,40 +115,40 @@ const byte* FORM_SCREEN = $0400;
const byte* FORM_CHARSET = $1800; // Charset ROM
byte[] FORM_TEXT =
" C64 DTV Graphics Mode Explorer @" +
" @" +
" PRESET 0 Standard Charset @" +
" @" +
" CONTROL PLANE A VIC II @" +
" bmm 0 pattern p0 screen s0 @" +
" mcm 0 start 00 gfx g0 @" +
" ecm 0 step 00 colors c0 @" +
" hicolor 0 modulo 00 @" +
" linear 0 COLORS @" +
" color off 0 PLANE B palet 0 @" +
" chunky 0 pattern p0 bgcol0 00 @" +
" border off 0 start 00 bgcol1 00 @" +
" overscan 0 step 00 bgcol2 00 @" +
" modulo 00 bgcol3 00 @" +
"@" ;
" C64 DTV Graphics Mode Explorer @"z +
" @"z +
" PRESET 0 Standard Charset @"z +
" @"z +
" CONTROL PLANE A VIC II @"z +
" bmm 0 pattern p0 screen s0 @"z +
" mcm 0 start 00 gfx g0 @"z +
" ecm 0 step 00 colors c0 @"z +
" hicolor 0 modulo 00 @"z +
" linear 0 COLORS @"z +
" color off 0 PLANE B palet 0 @"z +
" chunky 0 pattern p0 bgcol0 00 @"z +
" border off 0 start 00 bgcol1 00 @"z +
" overscan 0 step 00 bgcol2 00 @"z +
" modulo 00 bgcol3 00 @"z +
"@"z ;
byte[] FORM_COLS =
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@" +
" @" +
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@" +
" @" +
" nnnnnnnnnnnn mmmmmmmmmm ooooooooo @" +
" nnnnnnnnnnnn mmmmmmmmmm ooooooooo @" +
" nnnnnnnnnnnn mmmmmmmmmm ooooooooo @" +
" nnnnnnnnnnnn mmmmmmmmmm ooooooooo @" +
" nnnnnnnnnnnn mmmmmmmmmm @" +
" nnnnnnnnnnnn jjjjjjjjj @" +
" nnnnnnnnnnnn mmmmmmmmmm jjjjjjjjj @" +
" nnnnnnnnnnnn mmmmmmmmmm jjjjjjjjj @" +
" nnnnnnnnnnnn mmmmmmmmmm jjjjjjjjj @" +
" nnnnnnnnnnnn mmmmmmmmmm jjjjjjjjj @" +
" nnnnnnnnnnnn mmmmmmmmmm jjjjjjjjj @" +
" nnnnnnnnnnnn mmmmmmmmmm jjjjjjjjj @" +
"@" ;
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@"z +
" @"z +
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@"z +
" @"z +
" nnnnnnnnnnnn mmmmmmmmmm ooooooooo @"z +
" nnnnnnnnnnnn mmmmmmmmmm ooooooooo @"z +
" nnnnnnnnnnnn mmmmmmmmmm ooooooooo @"z +
" nnnnnnnnnnnn mmmmmmmmmm ooooooooo @"z +
" nnnnnnnnnnnn mmmmmmmmmm @"z +
" nnnnnnnnnnnn jjjjjjjjj @"z +
" nnnnnnnnnnnn mmmmmmmmmm jjjjjjjjj @"z +
" nnnnnnnnnnnn mmmmmmmmmm jjjjjjjjj @"z +
" nnnnnnnnnnnn mmmmmmmmmm jjjjjjjjj @"z +
" nnnnnnnnnnnn mmmmmmmmmm jjjjjjjjj @"z +
" nnnnnnnnnnnn mmmmmmmmmm jjjjjjjjj @"z +
" nnnnnnnnnnnn mmmmmmmmmm jjjjjjjjj @"z +
"@"z ;
// Number of form fields
byte form_fields_cnt = 36;
@ -224,29 +224,29 @@ void apply_preset(byte idx) {
void render_preset_name(byte idx) {
byte* name;
if(idx==0) {
name = "Standard Charset @";
name = "Standard Charset ";
} else if(idx==1){
name = "Extended Color Charset @";
name = "Extended Color Charset ";
} else if(idx==2){
name = "Standard Bitmap @";
name = "Standard Bitmap ";
} else if(idx==3){
name = "Multicolor Bitmap @";
name = "Multicolor Bitmap ";
} else if(idx==4){
name = "Hicolor Charset @";
name = "Hicolor Charset ";
} else if(idx==5){
name = "Hicolor Extended Color Charset@";
name = "Hicolor Extended Color Charset";
} else if(idx==6){
name = "Twoplane Bitmap @";
name = "Twoplane Bitmap ";
} else if(idx==7){
name = "Chunky 8bpp @";
name = "Chunky 8bpp ";
} else if(idx==8){
name = "Sixs Fred @";
name = "Sixs Fred ";
} else if(idx==9){
name = "Sixs Fred 2 @";
name = "Sixs Fred 2 ";
} else if(idx==10){
name = "8bpp Pixel Cell @";
name = "8bpp Pixel Cell ";
} else {
name = "Standard Charset @";
name = "Standard Charset ";
}
// Render it
print_str_at(name, FORM_SCREEN+40*2+10);

View File

@ -18,27 +18,27 @@ void main() {
}
byte[] MENU_TEXT =
"C64DTV Graphics Modes CCLHBME@" +
" OHIIMCC@" +
" LUNCMMM@" +
"----------------------------------------@" +
"1. Standard Char (V) 0000000@" +
"2. Extended Color Char (V) 0000001@" +
"3. Multicolor Char (V) 0000010@" +
"4. Standard Bitmap (V) 0000100@" +
"5. Multicolor Bitmap (V) 0000110@" +
"6. High Color Standard Char (H) 0001000@" +
"7. High Extended Color Char (H) 0001001@" +
"8. High Multicolor Char (H) 0001010@" +
"9. High Multicolor Bitmap (H) 0001110@" +
"a. Sixs Fred 2 (D) 0010111@" +
"b. Two Plane Bitmap (D) 0011101@" +
"c. Sixs Fred (2 Plane MC BM) (D) 0011111@" +
"d. 8bpp Pixel Cell (D) 0111011@" +
"e. Chunky 8bpp Bitmap (D) 1111011@" +
"----------------------------------------@" +
" (V) vicII (H) vicII+hicol (D) c64dtv@" +
"@" ;
"C64DTV Graphics Modes CCLHBME@"z +
" OHIIMCC@"z +
" LUNCMMM@"z +
"----------------------------------------@"z +
"1. Standard Char (V) 0000000@"z +
"2. Extended Color Char (V) 0000001@"z +
"3. Multicolor Char (V) 0000010@"z +
"4. Standard Bitmap (V) 0000100@"z +
"5. Multicolor Bitmap (V) 0000110@"z +
"6. High Color Standard Char (H) 0001000@"z +
"7. High Extended Color Char (H) 0001001@"z +
"8. High Multicolor Char (H) 0001010@"z +
"9. High Multicolor Bitmap (H) 0001110@"z +
"a. Sixs Fred 2 (D) 0010111@"z +
"b. Two Plane Bitmap (D) 0011101@"z +
"c. Sixs Fred (2 Plane MC BM) (D) 0011111@"z +
"d. 8bpp Pixel Cell (D) 0111011@"z +
"e. Chunky 8bpp Bitmap (D) 1111011@"z +
"----------------------------------------@"z +
" (V) vicII (H) vicII+hicol (D) c64dtv@"z +
"@"z ;
void menu() {
const byte* SCREEN = $8000;

View File

@ -73,7 +73,7 @@ main_state = GAME_FADE_IN;
byte fade_in_game() {
fillscreen(SCREEN, $20);
print_str("lone archer -- game@");
print_str("lone archer -- game");
print_ln();
return 1;
}
@ -86,7 +86,7 @@ return 1;
byte game_weapon_plus() {
if (action_count == 0)
action_count = WEAPON_SWITCH_FRAMES;
print_str("weapon plus@");
print_str("weapon plus");
print_ln();
action_count--;
return (action_count==0);
@ -95,7 +95,7 @@ return (action_count==0);
byte game_weapon_minus() {
if (action_count == 0)
action_count = WEAPON_SWITCH_FRAMES;
print_str("weapon minus@");
print_str("weapon minus");
print_ln();
action_count--;
return (action_count==0);
@ -104,7 +104,7 @@ return (action_count==0);
byte game_path_plus() {
if (action_count == 0)
action_count = PATH_SWITCH_FRAMES;
print_str("path plus@");
print_str("path plus");
print_ln();
action_count--;
return (action_count==0);
@ -113,7 +113,7 @@ return (action_count==0);
byte game_path_minus() {
if (action_count == 0)
action_count = PATH_SWITCH_FRAMES;
print_str("path minus@");
print_str("path minus");
print_ln();
action_count--;
return (action_count==0);
@ -122,7 +122,7 @@ return (action_count==0);
byte game_ready() {
if (action_count == 0)
action_count = READY_FRAMES;
print_str("ready@");
print_str("ready");
print_ln();
action_count--;
return (action_count==0);
@ -143,7 +143,7 @@ print_str("d");
}
byte game_fire() {
print_str("fire!@");
print_str("fire!");
print_ln();
return 1;
}
@ -151,7 +151,7 @@ return 1;
byte game_dead_fall() {
if (action_count == 0)
action_count = DEAD_FALL_FRAMES;
print_str("dead fall...@");
print_str("dead fall...");
print_ln();
action_count--;
return (action_count==0);
@ -160,7 +160,7 @@ return (action_count==0);
byte game_dead_wait() {
if (action_count == 0)
action_count = DEAD_WAIT_FRAMES;
print_str("dead wait...@");
print_str("dead wait...");
print_ln();
action_count--;
return (action_count==0);

View File

@ -3,7 +3,7 @@
void main() {
byte* screen = $400;
byte l = 'l';
byte[] msg = "cm"+l;
byte[] msg = "cm"z+l;
for( byte i: 0..2 ) {
screen[i] = msg[i];
}

View File

@ -1,10 +1,10 @@
// Concatenates string constants in different ways
void main() {
byte[] s = "e"+"l";
byte[] s = "e"z+"l"z;
byte[] s2 = s+'o';
byte[] s3 = "cam"+s2;
byte[] s3 = "cam"z+s2;
byte e = '!';
byte[] s4 = ""+'t'+ e;
byte[] s4 = ""z+'t'+ e;
byte[] s5 = s3+s4;
byte* SCREEN = $400;
for( byte i: 0..7) {

View File

@ -13,21 +13,21 @@ void main() {
// Test different byte constants
void test_bytes() {
byte bb=0;
assert_byte("0=0@", bb, 0);
assert_byte("0=0", bb, 0);
byte bc=bb+2;
assert_byte("0+2=2@", bc, 2);
assert_byte("0+2=2", bc, 2);
byte bd=(byte)((signed byte)bc-4);
assert_byte("0+2-4=254@", bd, 254);
assert_byte("0+2-4=254", bd, 254);
}
void assert_byte(byte* msg, byte b, byte c) {
print_str(msg);
print_str(" @");
print_str(" ");
if(b!=c) {
*BGCOL = RED;
print_str("fail!@");
print_str("fail!");
} else {
print_str("ok@");
print_str("ok");
}
print_ln();
}
@ -35,25 +35,25 @@ void assert_byte(byte* msg, byte b, byte c) {
// Test different signed byte constants
void test_sbytes() {
signed byte bb=0;
assert_sbyte("0=0@", bb, 0);
assert_sbyte("0=0", bb, 0);
signed byte bc=bb+2;
assert_sbyte("0+2=2@", bc, 2);
assert_sbyte("0+2=2", bc, 2);
signed byte bd=bc-4;
assert_sbyte("0+2-4=-2@", bd, -2);
assert_sbyte("0+2-4=-2", bd, -2);
signed byte be=-bd;
assert_sbyte("-(0+2-4)=2@", be, 2);
assert_sbyte("-(0+2-4)=2", be, 2);
signed byte bf=(signed byte)(-127-127);
assert_sbyte("-127-127=2@", bf, 2);
assert_sbyte("-127-127=2", bf, 2);
}
void assert_sbyte(byte* msg, signed byte b, signed byte c) {
print_str(msg);
print_str(" @");
print_str(" ");
if(b!=c) {
*BGCOL = RED;
print_str("fail!@");
print_str("fail!");
} else {
print_str("ok@");
print_str("ok");
}
print_ln();
}

View File

@ -91,18 +91,18 @@ void anim() {
void debug_print_init() {
print_cls();
print_str_at("sx@", SCREEN+40*0+34);
print_str_at("sy@", SCREEN+40*1+34);
print_str_at("sz@", SCREEN+40*2+34);
print_str_at("x@", SCREEN+40*16);
print_str_at("y@", SCREEN+40*17);
print_str_at("z@", SCREEN+40*18);
print_str_at("xr@", SCREEN+40*19);
print_str_at("yr@", SCREEN+40*20);
print_str_at("zr@", SCREEN+40*21);
print_str_at("pp@", SCREEN+40*22);
print_str_at("xp@", SCREEN+40*23);
print_str_at("yp@", SCREEN+40*24);
print_str_at("sx", SCREEN+40*0+34);
print_str_at("sy", SCREEN+40*1+34);
print_str_at("sz", SCREEN+40*2+34);
print_str_at("x", SCREEN+40*16);
print_str_at("y", SCREEN+40*17);
print_str_at("z", SCREEN+40*18);
print_str_at("xr", SCREEN+40*19);
print_str_at("yr", SCREEN+40*20);
print_str_at("zr", SCREEN+40*21);
print_str_at("pp", SCREEN+40*22);
print_str_at("xp", SCREEN+40*23);
print_str_at("yp", SCREEN+40*24);
byte* at_line = SCREEN+16*40;
byte c = 4;

View File

@ -37,18 +37,18 @@ void main() {
void do_perspective(signed byte x, signed byte y, signed byte z) {
print_str("(@");
print_str("(");
print_sbyte(x);
print_str(",@");
print_str(",");
print_sbyte(y);
print_str(",@");
print_str(",");
print_sbyte(z);
print_str(") -> (@");
print_str(") -> (");
perspective(x, y, z);
print_byte((byte)*xr);
print_str(",@");
print_str(",");
print_byte((byte)*yr);
print_str(")@");
print_str(")");
print_ln();
}

View File

@ -10,10 +10,10 @@ void main() {
for( byte* sc=SCREEN;sc<SCREEN+1000;sc++) *sc = ' ';
// Plot 4 initial analysis chars
print_str_at("f1@", SCREEN+1);
print_str_at("f3@", SCREEN+1+10);
print_str_at("f5@", SCREEN+1+20);
print_str_at("f7@", SCREEN+1+30);
print_str_at("f1", SCREEN+1);
print_str_at("f3", SCREEN+1+10);
print_str_at("f5", SCREEN+1+20);
print_str_at("f7", SCREEN+1+30);
for(byte i : 0..3 ) {
plot_chargen(i, $20, 0);
}

View File

@ -1,5 +1,5 @@
import "print"
void main() {
print_str("hello world!@");
print_str("hello world!");
print_ln();
}

View File

@ -2,7 +2,7 @@ byte* SCREEN = $0400;
byte* RASTER = $d012;
byte* BGCOL = $d020;
byte* SCROLL = $d016;
byte* TEXT = "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @";
byte* TEXT = "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- ";
void main() {
fillscreen(SCREEN, $20);

View File

@ -6,7 +6,7 @@ byte* SCREEN = $0400;
byte* RASTER = $d012;
byte* BGCOL = $d020;
byte* SCROLL = $d016;
byte* TEXT = "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @";
byte* TEXT = "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- ";
void main() {
fillscreen(SCREEN, $20);

View File

@ -121,7 +121,7 @@ void place_sprites() {
}
void gen_sprites() {
byte[] cml = "camelot";
byte[] cml = "camelot"z;
byte* spr = sprites;
for( byte i : 0..6 ) {
gen_chargen_sprite(cml[i], spr);

View File

@ -11,11 +11,11 @@ void do10(void()* fn) {
}
void hello() {
print("hello @");
print("hello ");
}
void world() {
print("world @");
print("world ");
}
const byte* SCREEN = $0400;

View File

@ -12,7 +12,7 @@ void do10(void()* fn) {
}
const byte* SCREEN = $0400;
const byte[] msg = "hello @";
const byte[] msg = "hello ";
volatile byte idx = 0;

View File

@ -16,8 +16,8 @@ void do10(void()* fn) {
const byte* SCREEN = $0400;
const byte[] msg1 = "hello @";
const byte[] msg2 = "world @";
const byte[] msg1 = "hello ";
const byte[] msg2 = "world ";
volatile byte* msg;
volatile byte idx = 0;

View File

@ -1,6 +1,6 @@
byte* screen = $400;
void main() {
byte* hello = "hello world!@";
byte* hello = "hello world!";
print2(screen, hello);
print2(screen+80, hello);
}

View File

@ -1,6 +1,6 @@
byte* screen = $400;
void main() {
byte* hello = "hello world!@";
byte* hello = "hello world!";
print2(screen, hello);
print2(screen+80, hello);
}

View File

@ -1,6 +1,6 @@
import "print.kc"
byte[] txt = "camelot@";
byte[] txt = "camelot";
void main() {
print_cls();

View File

@ -1,7 +1,7 @@
// Illustrates how inline assembler use internal labels and external references
const byte* SCREEN = $400;
byte[] table = "cml!";
byte[] table = "cml!"z;
void main() {
asm {
ldx #0

View File

@ -1,7 +1,7 @@
// Illustrates how inline assembler can reference data from the outside program without the data being optimized away as unused
const byte* SCREEN = $400;
byte[] table = "cml!";
byte[] table = "cml!"z;
void main() {
asm {
ldx #0

View File

@ -1,6 +1,6 @@
// Illustrates how inline assembler can reference data from the outside program
byte[] table = "cml!";
byte[] table = "cml!"z;
void main() {
const byte* SCREEN = $400;

View File

@ -3,7 +3,7 @@
byte* screen = $400;
void main() {
byte* hello = "hello world!@";
byte* hello = "hello world!";
print(screen, hello);
print(screen+2*40, hello);
}

View File

@ -1,6 +1,6 @@
// Illustrates how inline kickassembler can reference data from the outside program
byte[] table = "cml!";
byte[] table = "cml!"z;
void main() {
const byte* SCREEN = $400;

View File

@ -8,9 +8,9 @@ void main() {
void print_msg(byte idx) {
byte* msg;
if(idx==1) {
msg = "Hello @";
msg = "Hello ";
} else {
msg = "World!@";
msg = "World!";
}
print(msg);
}

View File

@ -2,7 +2,7 @@
// The result should be an labelled .text in the ASM
// Erroneously tries to inline the string completely leading to a CompileError
void main() {
const byte[] STRING = "camelot";
const byte[] STRING = "camelot"z;
const byte* PTR = $9ffe;
*PTR = <STRING;
*(PTR+1)= >STRING;

View File

@ -1,11 +1,11 @@
// Inline Strings in method calls are automatically converted to local constant variables byte[] st = "..."; - generating an ASM .text).
byte[] msg1 = "message 1 @";
byte[] msg1 = "message 1 ";
void main() {
byte[] msg2 = "message 2 @";
byte[] msg2 = "message 2 ";
print(msg1);
print(msg2);
print("message 3 @");
print("message 3 ");
}
byte* screen = $0400;

View File

@ -4,7 +4,7 @@
byte* SCREEN = $0400;
byte* SCREEN2 = $0400+$28;
void main() {
byte[] txt = "qwe";
byte[] txt = "qwe"z;
byte[] data = { 1, 2, 3 };
for( byte i : 0..3) {
SCREEN[i] = txt[i];

View File

@ -1,6 +1,6 @@
byte* SCREEN = $0400;
byte[] TEXT = "camelot ";
byte[] TEXT = "camelot "z;
void main() {
byte* cursor = SCREEN;

View File

@ -11,28 +11,28 @@ void main() {
word[20] lintab3;
lin16u_gen(0, $6488, lintab3, 20);
print_cls();
print_str(" @");
print_str(" ");
print_word(557);
print_str(" @");
print_str(" ");
print_word(31179);
print_str(" @");
print_str(" ");
print_word(0);
print_ln();
for(byte i=0; i<20*2; i=i+2) {
print_byte(i);
print_str(" @");
print_str(" ");
print_word(lintab1[i]);
print_str(" @");
print_str(" ");
print_word(lintab2[i]);
print_str(" @");
print_str(" ");
print_word(lintab3[i]);
print_ln();
}
print_str(" @");
print_str(" ");
print_word(29793);
print_str(" @");
print_str(" ");
print_word(63361);
print_str(" @");
print_str(" ");
print_word($6488);
print_ln();
}

View File

@ -0,0 +1,14 @@
// Tests literal strings with and without zero-termination
const byte* SCREEN = $400;
byte[] msgz = "cml"z;
byte[] msg = "cml";
void main() {
for( byte i:0..3) {
SCREEN[i] = msg[i];
(SCREEN+40)[i] = msgz[i];
}
}

View File

@ -2,7 +2,7 @@ byte* SCREEN = $0400;
byte ch = 'a';
byte num = 1;
byte[] str = "bc"+"d"+'e';
byte[] str = "bc"z+"d"z+'e';
byte[] nums = { 2, 3, 4, 5};
void main() {

View File

@ -1,7 +1,7 @@
// Local constant strings are placed at the start of the method. This means the generated ASM jumps / calls straignt into the constant string
void main() {
byte* screen = $0400;
byte[] msg = "message 2 @";
byte[] msg = "message 2 ";
byte i=0;
while(msg[i]!='@') {
screen[i++] = msg[i];

View File

@ -2,7 +2,7 @@
// Prints a message ending at '@' skipping all spaces
void main() {
byte* screen = $400;
byte[] str = "hello brave new world@";
byte[] str = "hello brave new world";
for( byte i: 0..255) {
if(str[i]=='@') break;
if(str[i]==' ') continue;

View File

@ -14,8 +14,8 @@ void main() {
}
byte[] text1 = "camelot @";
byte[] text2 = "rex @";
byte[] text1 = "camelot ";
byte[] text2 = "rex ";
byte textid = 0;

View File

@ -1,8 +1,8 @@
import "print"
byte[] msg = "hello world! @";
byte[] msg2 = "hello c64! @";
byte[] msg3 = "hello 2017! @";
byte[] msg = "hello world! ";
byte[] msg2 = "hello c64! ";
byte[] msg3 = "hello 2017! ";
void main() {
print_str(msg);

View File

@ -1,6 +1,6 @@
byte* SCREEN = $0400;
byte* SCROLL = $d016;
byte[] TEXT = "01234567@";
byte[] TEXT = "01234567";
void main() {
byte* nxt = TEXT;

View File

@ -1,6 +1,6 @@
// Clobber problem in next_char return value
byte* TEXT = "cml @";
byte* TEXT = "cml ";
void main() {
byte* SCREEN = $400;

View File

@ -10,9 +10,9 @@ void main() {
for(signed word* st1 = sintab1; st1<sintab1+wavelength*2; st1 = st1+2 ) {
signed word sw = *st1;
if(sw>=0) {
print_str(" @");
print_str(" ");
}
print_sword(sw);
print_str(" @");
print_str(" ");
}
}

View File

@ -15,10 +15,10 @@ void main() {
for( byte i: 0..119) {
signed word sw = *st1 - *st2;
if(sw>=0) {
print_str(" @");
print_str(" ");
}
print_sword(sw);
print_str(" @");
print_str(" ");
st1 = st1+2;
st2 = st2+2;
}

View File

@ -24,9 +24,9 @@ void main() {
for(byte i: 0..191) {
signed byte sb = sintab2[i]-(signed byte)sintabref[i];
if(sb>=0) {
print_str(" @");
print_str(" ");
}
print_sbyte(sb);
print_str(" @");
print_str(" ");
}
}

View File

@ -13,9 +13,9 @@ void main() {
signed word sw = *(sintabw+(word)i<<1);
signed byte sd = sb-(signed byte)>sw;
if(sd>=0) {
print_str(" @");
print_str(" ");
}
print_sbyte(sd);
print_str(" @");
print_str(" ");
}
}

View File

@ -12,10 +12,10 @@ void main() {
for(byte i: 0..191) {
signed byte sb = sintab[i];
if(sb>=0) {
print_str(" @");
print_str(" ");
}
print_sbyte(sb);
print_str(" @");
print_str(" ");
}
*/
}
@ -32,15 +32,15 @@ void sin8u_table(byte* sintab, word tabsize, byte min, byte max) {
//if( sum & 1 > 0) mid++;
// u[4.28] step = PI*2/wavelength
word step = div16u(PI2_u4f12, tabsize); // u[4.12]
print_str("step:@");
print_str("step:");
print_word(step);
print_str(" min:@");
print_str(" min:");
print_byte(min);
print_str(" max:@");
print_str(" max:");
print_byte(max);
print_str(" ampl:@");
print_str(" ampl:");
print_byte(amplitude);
print_str(" mid:@");
print_str(" mid:");
print_byte(mid);
print_ln();
// Iterate over the table
@ -50,13 +50,13 @@ void sin8u_table(byte* sintab, word tabsize, byte min, byte max) {
signed word sinx_sc = mul8su(sinx, amplitude+1);
byte sinx_tr = mid+>sinx_sc;
*sintab++ = sinx_tr;
print_str("x: @");
print_str("x: ");
print_word(x);
print_str(" sin: @");
print_str(" sin: ");
print_sbyte(sinx);
print_str(" scaled: @");
print_str(" scaled: ");
print_sword(sinx_sc);
print_str(" trans: @");
print_str(" trans: ");
print_byte(sinx_tr);
print_ln();
x = x + step;

View File

@ -3,11 +3,11 @@
byte* screen = $400;
void main() {
byte[] rex1 = "rex@";
byte[] rex2 = "rex@";
byte[] rex1 = "rex";
byte[] rex2 = "rex";
print(rex1);
print(rex2);
print("rex@");
print("rex");
}
void print(byte* string) {

View File

@ -1,13 +1,13 @@
// Tests that identical strings are consolidated
byte[] rex1 = "rex@";
byte[] rex1 = "rex";
byte* screen = $400;
void main() {
byte[] rex2 = "rex@";
byte[] rex2 = "rex";
print(rex1);
print(rex2);
print("rex@");
print("rex");
}
void print(byte* string) {

View File

@ -45,27 +45,27 @@ void compare(signed word w1, signed word w2, byte op) {
if(op==LT) {
// LESS THAN
if(w1<w2) r = TT;
ops = "< @";
ops = "< ";
} else if(op==LE) {
// LESS THAN EQUAL
if(w1<=w2) r = TT;
ops = "<=@";
ops = "<=";
} else if(op==GT) {
// GREATER THAN
if(w1>w2) r = TT;
ops = "> @";
ops = "> ";
} else if(op==GE) {
// GREATER THAN EQUAL
if(w1>=w2) r = TT;
ops = ">=@";
ops = ">=";
} else if(op==EQ) {
// EQUAL
if(w1==w2) r = TT;
ops = "==@";
ops = "==";
} else if(op==NE) {
// NOT EQUAL
if(w1!=w2) r = TT;
ops = "!=@";
ops = "!=";
}
if(w1>=0) print_char(' ');
print_sword(w1);

View File

@ -43,27 +43,27 @@ void compare(word w1, word w2, byte op) {
if(op==0) {
// LESS THAN
if(w1<w2) r = TT;
ops = "< @";
ops = "< ";
} else if(op==1) {
// LESS THAN EQUAL
if(w1<=w2) r = TT;
ops = "<=@";
ops = "<=";
} else if(op==2) {
// GREATER THAN
if(w1>w2) r = TT;
ops = "> @";
ops = "> ";
} else if(op==3) {
// GREATER THAN EQUAL
if(w1>=w2) r = TT;
ops = ">=@";
ops = ">=";
} else if(op==4) {
// EQUAL
if(w1==w2) r = TT;
ops = "==@";
ops = "==";
} else if(op==5) {
// NOT EQUAL
if(w1!=w2) r = TT;
ops = "!=@";
ops = "!=";
}
print_word(w1);
print_str(ops);

View File

@ -7,30 +7,30 @@ void main() {
byte r;
byte b = $ce-a;
byte[5] cs = { $07, $c7, $37, $97, $67 };
r = '-'; if(a<b) r='+'; printu(a, "< @", b, r);
r = '-'; if(a<$37) r='+'; printu(a, "< @", $37, r);
r = '-'; if(a<cs[i]) r='+'; printu(a, "< @", cs[i], r);
r = '-'; if(a<a) r='+'; printu(a, "< @", a, r);
r = '-'; if(a<b) r='+'; printu(a, "< ", b, r);
r = '-'; if(a<$37) r='+'; printu(a, "< ", $37, r);
r = '-'; if(a<cs[i]) r='+'; printu(a, "< ", cs[i], r);
r = '-'; if(a<a) r='+'; printu(a, "< ", a, r);
print_ln();
r = '-'; if(a>b) r='+'; printu(a, "> @", b, r);
r = '-'; if(a>$37) r='+'; printu(a, "> @", $37, r);
r = '-'; if(a>cs[i]) r='+'; printu(a, "> @", cs[i], r);
r = '-'; if(a>a) r='+'; printu(a, "> @", a, r);
r = '-'; if(a>b) r='+'; printu(a, "> ", b, r);
r = '-'; if(a>$37) r='+'; printu(a, "> ", $37, r);
r = '-'; if(a>cs[i]) r='+'; printu(a, "> ", cs[i], r);
r = '-'; if(a>a) r='+'; printu(a, "> ", a, r);
print_ln();
r = '-'; if(a<=b) r='+'; printu(a, "<=@", b, r);
r = '-'; if(a<=$37) r='+'; printu(a, "<=@", $37, r);
r = '-'; if(a<=cs[i]) r='+'; printu(a, "<=@", cs[i], r);
r = '-'; if(a<=a) r='+'; printu(a, "<=@", a, r);
r = '-'; if(a<=b) r='+'; printu(a, "<=", b, r);
r = '-'; if(a<=$37) r='+'; printu(a, "<=", $37, r);
r = '-'; if(a<=cs[i]) r='+'; printu(a, "<=", cs[i], r);
r = '-'; if(a<=a) r='+'; printu(a, "<=", a, r);
print_ln();
r = '-'; if(a>=b) r='+'; printu(a, ">=@", b, r);
r = '-'; if(a>=$37) r='+'; printu(a, ">=@", $37, r);
r = '-'; if(a>=cs[i]) r='+'; printu(a, ">=@", cs[i], r);
r = '-'; if(a>=a) r='+'; printu(a, ">=@", a, r);
r = '-'; if(a>=b) r='+'; printu(a, ">=", b, r);
r = '-'; if(a>=$37) r='+'; printu(a, ">=", $37, r);
r = '-'; if(a>=cs[i]) r='+'; printu(a, ">=", cs[i], r);
r = '-'; if(a>=a) r='+'; printu(a, ">=", a, r);
print_ln();
r = '-'; if(a==b) r='+'; printu(a, "==@", b, r);
r = '-'; if(a==$37) r='+'; printu(a, "==@", $37, r);
r = '-'; if(a==cs[i]) r='+'; printu(a, "==@", cs[i], r);
r = '-'; if(a==a) r='+'; printu(a, "==@", a, r);
r = '-'; if(a==b) r='+'; printu(a, "==", b, r);
r = '-'; if(a==$37) r='+'; printu(a, "==", $37, r);
r = '-'; if(a==cs[i]) r='+'; printu(a, "==", cs[i], r);
r = '-'; if(a==a) r='+'; printu(a, "==", a, r);
print_ln();
a=a+$30;
}

View File

@ -19,11 +19,11 @@ void test_8u() {
byte divisor = divisors[i];
byte res = div8u(dividend, divisor);
print_byte(dividend);
print_str(" / @");
print_str(" / ");
print_byte(divisor);
print_str(" = @");
print_str(" = ");
print_byte(res);
print_str(" @");
print_str(" ");
print_byte(rem8u);
print_ln();
}
@ -37,11 +37,11 @@ void test_16u() {
word divisor = divisors[i];
word res = div16u(dividend, divisor);
print_word(dividend);
print_str(" / @");
print_str(" / ");
print_word(divisor);
print_str(" = @");
print_str(" = ");
print_word(res);
print_str(" @");
print_str(" ");
print_word(rem16u);
print_ln();
}
@ -55,11 +55,11 @@ void test_8s() {
signed byte divisor = divisors[i];
signed byte res = div8s(dividend, divisor);
print_sbyte(dividend);
print_str(" / @");
print_str(" / ");
print_sbyte(divisor);
print_str(" = @");
print_str(" = ");
print_sbyte(res);
print_str(" @");
print_str(" ");
print_sbyte(rem8s);
print_ln();
}
@ -73,11 +73,11 @@ void test_16s() {
signed word divisor = divisors[i];
signed word res = div16s(dividend, divisor);
print_sword(dividend);
print_str(" / @");
print_str(" / ");
print_sword(divisor);
print_str(" = @");
print_str(" = ");
print_sword(res);
print_str(" @");
print_str(" ");
print_sword(rem16s);
print_ln();
}

View File

@ -46,7 +46,7 @@ void mul16u_compare() {
word a = 0;
word b = 0;
for(byte i: 0..15) {
print_str(".@");
print_str(".");
for(byte j: 0..15) {
a=a+3371;
b=b+4093;
@ -68,20 +68,20 @@ void mul16u_compare() {
}
}
print_ln();
print_str("word multiply results match!@");
print_str("word multiply results match!");
print_ln();
}
void mul16u_error(word a, word b, dword ms, dword mn, dword mf) {
print_str("multiply mismatch @");
print_str("multiply mismatch ");
print_word(a);
print_str("*@");
print_str("*");
print_word(b);
print_str(" slow:@");
print_str(" slow:");
print_dword(ms);
print_str(" / normal:@");
print_str(" / normal:");
print_dword(mn);
print_str(" / fast:@");
print_str(" / fast:");
print_dword(mf);
print_ln();
}
@ -91,7 +91,7 @@ void mul16s_compare() {
signed word a = -$7fff;
signed word b = -$7fff;
for(byte i: 0..15) {
print_str(".@");
print_str(".");
for(byte j: 0..15) {
a=a+3371;
b=b+4093;
@ -113,20 +113,20 @@ void mul16s_compare() {
}
}
print_ln();
print_str("signed word multiply results match!@");
print_str("signed word multiply results match!");
print_ln();
}
void mul16s_error(signed word a, signed word b, signed dword ms, signed dword mn, signed dword mf) {
print_str("signed word multiply mismatch @");
print_str("signed word multiply mismatch ");
print_sword(a);
print_str("*@");
print_str("*");
print_sword(b);
print_str(" slow:@");
print_str(" slow:");
print_sdword(ms);
print_str(" / normal:@");
print_str(" / normal:");
print_sdword(mn);
print_str(" / fast:@");
print_str(" / fast:");
print_sdword(mf);
print_ln();
}

View File

@ -110,15 +110,15 @@ void mulf_tables_cmp() {
for( byte* kc_sqr=mulf_sqr1_lo; kc_sqr<mulf_sqr1_lo+512*4; kc_sqr++) {
if(*kc_sqr != *asm_sqr) {
*BGCOL = 2;
print_str("multiply table mismatch at @");
print_str("multiply table mismatch at ");
print_word((word)asm_sqr);
print_str(" / @");
print_str(" / ");
print_word((word)kc_sqr);
return;
}
asm_sqr++;
}
print_str("multiply tables match!@");
print_str("multiply tables match!");
print_ln();
}
@ -143,20 +143,20 @@ void mul8u_compare() {
}
}
}
print_str("multiply results match!@");
print_str("multiply results match!");
print_ln();
}
void mul8u_error(byte a, byte b, word ms, word mn, word mf) {
print_str("multiply mismatch @");
print_str("multiply mismatch ");
print_byte(a);
print_str("*@");
print_str("*");
print_byte(b);
print_str(" slow:@");
print_str(" slow:");
print_word(ms);
print_str(" / normal:@");
print_str(" / normal:");
print_word(mn);
print_str(" / fast:@");
print_str(" / fast:");
print_word(mf);
print_ln();
}
@ -182,20 +182,20 @@ void mul8s_compare() {
}
}
}
print_str("signed multiply results match!@");
print_str("signed multiply results match!");
print_ln();
}
void mul8s_error(signed byte a, signed byte b, signed word ms, signed word mn, signed word mf) {
print_str("signed multiply mismatch @");
print_str("signed multiply mismatch ");
print_sbyte(a);
print_str("*@");
print_str("*");
print_sbyte(b);
print_str(" slow:@");
print_str(" slow:");
print_sword(ms);
print_str(" / normal:@");
print_str(" / normal:");
print_sword(mn);
print_str(" / fast:@");
print_str(" / fast:");
print_sword(mf);
print_ln();
}

View File

@ -8,13 +8,13 @@ const byte READY_FRAMES = 5;
void main() {
for(byte i:0..5)
if(game_ready())
print_str_ln("ready!@");
print_str_ln("ready!");
}
bool game_ready() {
if (action_count == 0)
action_count = READY_FRAMES;
print_str_ln("ready@");
print_str_ln("ready");
action_count--;
return (action_count==0);
}

View File

@ -4,7 +4,7 @@ byte b=2>>1;
// unused vars
const byte* BGCOL = $d021;
byte[] msg = "hello world@";
byte[] msg = "hello world";
byte[] arr = { 7, 8, 9};
byte c=1;
const byte c2=1;
@ -18,7 +18,7 @@ void main() {
byte e=3+3+3+s(); // The call to s() should survive even when e is eliminated
word f=2000+2000+d+b++; // b++ should survive even when f is eliminated.
byte[] g = {4, 5, 6};
byte[] h = "goodbye sky ";
byte[] h = "goodbye sky "z;
for(byte i : 0..100) {
// the last unused var
signed byte x = -13;

View File

@ -21,7 +21,7 @@ bool move_enemy(byte obj_slot) {
bool game_ready() {
if (action_count == 0)
action_count = READY_FRAMES;
print_str_ln("ready@");
print_str_ln("ready");
action_count--;
return (action_count==0);
}

View File

@ -0,0 +1,19 @@
// Tests literal strings with and without zero-termination
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
.label SCREEN = $400
main: {
ldx #0
b1:
lda msg,x
sta SCREEN,x
lda msgz,x
sta SCREEN+$28,x
inx
cpx #4
bne b1
rts
}
msgz: .text "cml"
msg: .text "cml@"

View File

@ -0,0 +1,22 @@
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
[1] phi()
[2] call main
to:@end
@end: scope:[] from @1
[3] phi()
main: scope:[main] from @1
[4] phi()
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) main::i#1 )
[6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) msg#0 + (byte) main::i#2)
[7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28 + (byte) main::i#2) ← *((const byte[]) msgz#0 + (byte) main::i#2)
[8] (byte) main::i#1 ← ++ (byte) main::i#2
[9] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 4) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
[10] return
to:@return

View File

@ -0,0 +1,354 @@
CONTROL FLOW GRAPH SSA
@begin: scope:[] from
(byte*) SCREEN#0 ← ((byte*)) (word/signed word/dword/signed dword) $400
(byte[]) msgz#0 ← (const string) $0
(byte[]) msg#0 ← (const string) $1
to:@1
main: scope:[main] from @1
(byte) main::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
*((byte*) SCREEN#0 + (byte) main::i#2) ← *((byte[]) msg#0 + (byte) main::i#2)
(byte*~) main::$0 ← (byte*) SCREEN#0 + (byte/signed byte/word/signed word/dword/signed dword) $28
*((byte*~) main::$0 + (byte) main::i#2) ← *((byte[]) msgz#0 + (byte) main::i#2)
(byte) main::i#1 ← (byte) main::i#2 + rangenext(0,3)
(bool~) main::$1 ← (byte) main::i#1 != rangelast(0,3)
if((bool~) main::$1) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main
to:@2
@2: scope:[] from @1
to:@end
@end: scope:[] from @2
SYMBOL TABLE SSA
(const string) $0 = (string) "cml"
(const string) $1 = (string) "cml@"
(label) @1
(label) @2
(label) @begin
(label) @end
(byte*) SCREEN
(byte*) SCREEN#0
(void()) main()
(byte*~) main::$0
(bool~) main::$1
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#0
(byte) main::i#1
(byte) main::i#2
(byte[]) msg
(byte[]) msg#0
(byte[]) msgz
(byte[]) msgz#0
Culled Empty Block (label) @2
Successful SSA optimization Pass2CullEmptyBlocks
Simple Condition (bool~) main::$1 [10] if((byte) main::i#1!=rangelast(0,3)) goto main::@1
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte*) SCREEN#0 = ((byte*))$400
Constant (const byte[]) msgz#0 = $0
Constant (const byte[]) msg#0 = $1
Constant (const byte) main::i#0 = 0
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte*) main::$0 = SCREEN#0+$28
Successful SSA optimization Pass2ConstantIdentification
Resolved ranged next value main::i#1 ← ++ main::i#2 to ++
Resolved ranged comparison value if(main::i#1!=rangelast(0,3)) goto main::@1 to (byte/signed byte/word/signed word/dword/signed dword) 4
Inlining constant with var siblings (const byte) main::i#0
Constant inlined main::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined $0 = (const byte[]) msgz#0
Constant inlined $1 = (const byte[]) msg#0
Constant inlined main::$0 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28
Successful SSA optimization Pass2ConstantInlining
Added new block during phi lifting main::@3(between main::@1 and main::@1)
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
CALL GRAPH
Calls in [] to main:2
Created 1 initial phi equivalence classes
Coalesced [11] main::i#3 ← main::i#1
Coalesced down to 1 phi equivalence classes
Culled Empty Block (label) main::@3
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
[1] phi()
[2] call main
to:@end
@end: scope:[] from @1
[3] phi()
main: scope:[main] from @1
[4] phi()
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) main::i#1 )
[6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) msg#0 + (byte) main::i#2)
[7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28 + (byte) main::i#2) ← *((const byte[]) msgz#0 + (byte) main::i#2)
[8] (byte) main::i#1 ← ++ (byte) main::i#2
[9] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 4) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
[10] return
to:@return
VARIABLE REGISTER WEIGHTS
(byte*) SCREEN
(void()) main()
(byte) main::i
(byte) main::i#1 16.5
(byte) main::i#2 22.0
(byte[]) msg
(byte[]) msgz
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
INITIAL ASM
//SEG0 File Comments
// Tests literal strings with and without zero-termination
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
//SEG2 Global Constants & labels
.label SCREEN = $400
//SEG3 @begin
bbegin:
//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
//SEG5 @1
b1:
//SEG6 [2] call main
//SEG7 [4] phi from @1 to main [phi:@1->main]
main_from_b1:
jsr main
//SEG8 [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
//SEG9 @end
bend:
//SEG10 main
main: {
.label i = 2
//SEG11 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG12 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0
sta i
jmp b1
//SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
b1_from_b1:
//SEG14 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
jmp b1
//SEG15 main::@1
b1:
//SEG16 [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) msg#0 + (byte) main::i#2) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz1
ldy i
lda msg,y
sta SCREEN,y
//SEG17 [7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28 + (byte) main::i#2) ← *((const byte[]) msgz#0 + (byte) main::i#2) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz1
ldy i
lda msgz,y
sta SCREEN+$28,y
//SEG18 [8] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1
inc i
//SEG19 [9] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 4) goto main::@1 -- vbuz1_neq_vbuc1_then_la1
lda #4
cmp i
bne b1_from_b1
jmp breturn
//SEG20 main::@return
breturn:
//SEG21 [10] return
rts
}
msgz: .text "cml"
msg: .text "cml@"
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) msg#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Statement [7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28 + (byte) main::i#2) ← *((const byte[]) msgz#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) msg#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28 + (byte) main::i#2) ← *((const byte[]) msgz#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 38.5: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope []
Uplifting [main] best 383 combination reg byte x [ main::i#2 main::i#1 ]
Uplifting [] best 383 combination
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 File Comments
// Tests literal strings with and without zero-termination
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
//SEG2 Global Constants & labels
.label SCREEN = $400
//SEG3 @begin
bbegin:
//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
//SEG5 @1
b1:
//SEG6 [2] call main
//SEG7 [4] phi from @1 to main [phi:@1->main]
main_from_b1:
jsr main
//SEG8 [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
//SEG9 @end
bend:
//SEG10 main
main: {
//SEG11 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG12 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
ldx #0
jmp b1
//SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
b1_from_b1:
//SEG14 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
jmp b1
//SEG15 main::@1
b1:
//SEG16 [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) msg#0 + (byte) main::i#2) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda msg,x
sta SCREEN,x
//SEG17 [7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28 + (byte) main::i#2) ← *((const byte[]) msgz#0 + (byte) main::i#2) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda msgz,x
sta SCREEN+$28,x
//SEG18 [8] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuxx=_inc_vbuxx
inx
//SEG19 [9] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 4) goto main::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #4
bne b1_from_b1
jmp breturn
//SEG20 main::@return
breturn:
//SEG21 [10] return
rts
}
msgz: .text "cml"
msg: .text "cml@"
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b1
Removing instruction jmp bend
Removing instruction jmp b1
Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination
Replacing label b1_from_b1 with b1
Removing instruction b1_from_bbegin:
Removing instruction b1:
Removing instruction main_from_b1:
Removing instruction bend_from_b1:
Removing instruction b1_from_b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction bend:
Removing instruction b1_from_main:
Removing instruction breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Updating BasicUpstart to call main directly
Removing instruction jsr main
Succesful ASM optimization Pass5SkipBegin
Removing instruction jmp b1
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction bbegin:
Succesful ASM optimization Pass5UnusedLabelElimination
FINAL SYMBOL TABLE
(label) @1
(label) @begin
(label) @end
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) $400
(void()) main()
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 22.0
(byte[]) msg
(const byte[]) msg#0 msg = (string) "cml@"
(byte[]) msgz
(const byte[]) msgz#0 msgz = (string) "cml"
reg byte x [ main::i#2 main::i#1 ]
FINAL ASSEMBLER
Score: 281
//SEG0 File Comments
// Tests literal strings with and without zero-termination
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG2 Global Constants & labels
.label SCREEN = $400
//SEG3 @begin
//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
//SEG5 @1
//SEG6 [2] call main
//SEG7 [4] phi from @1 to main [phi:@1->main]
//SEG8 [3] phi from @1 to @end [phi:@1->@end]
//SEG9 @end
//SEG10 main
main: {
//SEG11 [5] phi from main to main::@1 [phi:main->main::@1]
//SEG12 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
ldx #0
//SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
//SEG14 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG15 main::@1
b1:
//SEG16 [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) msg#0 + (byte) main::i#2) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda msg,x
sta SCREEN,x
//SEG17 [7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28 + (byte) main::i#2) ← *((const byte[]) msgz#0 + (byte) main::i#2) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda msgz,x
sta SCREEN+$28,x
//SEG18 [8] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuxx=_inc_vbuxx
inx
//SEG19 [9] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 4) goto main::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #4
bne b1
//SEG20 main::@return
//SEG21 [10] return
rts
}
msgz: .text "cml"
msg: .text "cml@"

View File

@ -0,0 +1,17 @@
(label) @1
(label) @begin
(label) @end
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) $400
(void()) main()
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 22.0
(byte[]) msg
(const byte[]) msg#0 msg = (string) "cml@"
(byte[]) msgz
(const byte[]) msgz#0 msgz = (string) "cml"
reg byte x [ main::i#2 main::i#1 ]