1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-09-29 18:54:55 +00:00

Renamed #pragma emulator. Added headers for Plus/4. Closes #436

This commit is contained in:
jespergravgaard 2020-05-09 11:44:29 +02:00
parent c3a9ced0f5
commit ab670df01f
13 changed files with 1568 additions and 1247 deletions

View File

@ -2,6 +2,7 @@
<dictionary name="jespergravgaard"> <dictionary name="jespergravgaard">
<words> <words>
<w>unversioned</w> <w>unversioned</w>
<w>xplus</w>
</words> </words>
</dictionary> </dictionary>
</component> </component>

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -26,29 +26,29 @@ public class KickCParser extends Parser {
SHIFT_LEFT=27, SHIFT_RIGHT=28, EQUAL=29, NOT_EQUAL=30, LESS_THAN=31, LESS_THAN_EQUAL=32, SHIFT_LEFT=27, SHIFT_RIGHT=28, EQUAL=29, NOT_EQUAL=30, LESS_THAN=31, LESS_THAN_EQUAL=32,
GREATER_THAN_EQUAL=33, GREATER_THAN=34, LOGIC_AND=35, LOGIC_OR=36, ASSIGN=37, GREATER_THAN_EQUAL=33, GREATER_THAN=34, LOGIC_AND=35, LOGIC_OR=36, ASSIGN=37,
ASSIGN_COMPOUND=38, TYPEDEF=39, RESERVE=40, PC=41, TARGET=42, LINK=43, ASSIGN_COMPOUND=38, TYPEDEF=39, RESERVE=40, PC=41, TARGET=42, LINK=43,
CPU=44, CODESEG=45, DATASEG=46, ENCODING=47, CONST=48, EXTERN=49, EXPORT=50, EMULATOR=44, CPU=45, CODESEG=46, DATASEG=47, ENCODING=48, CONST=49, EXTERN=50,
ALIGN=51, INLINE=52, VOLATILE=53, STATIC=54, INTERRUPT=55, REGISTER=56, EXPORT=51, ALIGN=52, INLINE=53, VOLATILE=54, STATIC=55, INTERRUPT=56,
ADDRESS=57, ADDRESS_ZEROPAGE=58, ADDRESS_MAINMEM=59, FORM_SSA=60, FORM_MA=61, REGISTER=57, ADDRESS=58, ADDRESS_ZEROPAGE=59, ADDRESS_MAINMEM=60, FORM_SSA=61,
INTRINSIC=62, CALLING=63, CALLINGCONVENTION=64, VARMODEL=65, IF=66, ELSE=67, FORM_MA=62, INTRINSIC=63, CALLING=64, CALLINGCONVENTION=65, VARMODEL=66,
WHILE=68, DO=69, FOR=70, SWITCH=71, RETURN=72, BREAK=73, CONTINUE=74, IF=67, ELSE=68, WHILE=69, DO=70, FOR=71, SWITCH=72, RETURN=73, BREAK=74,
ASM=75, DEFAULT=76, CASE=77, STRUCT=78, ENUM=79, SIZEOF=80, TYPEID=81, CONTINUE=75, ASM=76, DEFAULT=77, CASE=78, STRUCT=79, ENUM=80, SIZEOF=81,
DEFINED=82, KICKASM=83, RESOURCE=84, USES=85, CLOBBERS=86, BYTES=87, CYCLES=88, TYPEID=82, DEFINED=83, KICKASM=84, RESOURCE=85, USES=86, CLOBBERS=87,
LOGIC_NOT=89, SIGNEDNESS=90, SIMPLETYPE=91, BOOLEAN=92, KICKASM_BODY=93, BYTES=88, CYCLES=89, LOGIC_NOT=90, SIGNEDNESS=91, SIMPLETYPE=92, BOOLEAN=93,
IMPORT=94, INCLUDE=95, PRAGMA=96, DEFINE=97, DEFINE_CONTINUE=98, UNDEF=99, KICKASM_BODY=94, IMPORT=95, INCLUDE=96, PRAGMA=97, DEFINE=98, DEFINE_CONTINUE=99,
IFDEF=100, IFNDEF=101, IFIF=102, ELIF=103, IFELSE=104, ENDIF=105, NUMBER=106, UNDEF=100, IFDEF=101, IFNDEF=102, IFIF=103, ELIF=104, IFELSE=105, ENDIF=106,
NUMFLOAT=107, BINFLOAT=108, DECFLOAT=109, HEXFLOAT=110, NUMINT=111, BININTEGER=112, NUMBER=107, NUMFLOAT=108, BINFLOAT=109, DECFLOAT=110, HEXFLOAT=111, NUMINT=112,
DECINTEGER=113, HEXINTEGER=114, NAME=115, STRING=116, CHAR=117, WS=118, BININTEGER=113, DECINTEGER=114, HEXINTEGER=115, NAME=116, STRING=117,
COMMENT_LINE=119, COMMENT_BLOCK=120, ASM_BYTE=121, ASM_MNEMONIC=122, ASM_IMM=123, CHAR=118, WS=119, COMMENT_LINE=120, COMMENT_BLOCK=121, ASM_BYTE=122, ASM_MNEMONIC=123,
ASM_COLON=124, ASM_COMMA=125, ASM_PAR_BEGIN=126, ASM_PAR_END=127, ASM_BRACKET_BEGIN=128, ASM_IMM=124, ASM_COLON=125, ASM_COMMA=126, ASM_PAR_BEGIN=127, ASM_PAR_END=128,
ASM_BRACKET_END=129, ASM_DOT=130, ASM_SHIFT_LEFT=131, ASM_SHIFT_RIGHT=132, ASM_BRACKET_BEGIN=129, ASM_BRACKET_END=130, ASM_DOT=131, ASM_SHIFT_LEFT=132,
ASM_PLUS=133, ASM_MINUS=134, ASM_LESS_THAN=135, ASM_GREATER_THAN=136, ASM_SHIFT_RIGHT=133, ASM_PLUS=134, ASM_MINUS=135, ASM_LESS_THAN=136, ASM_GREATER_THAN=137,
ASM_MULTIPLY=137, ASM_DIVIDE=138, ASM_CURLY_BEGIN=139, ASM_CURLY_END=140, ASM_MULTIPLY=138, ASM_DIVIDE=139, ASM_CURLY_BEGIN=140, ASM_CURLY_END=141,
ASM_NUMBER=141, ASM_NUMFLOAT=142, ASM_BINFLOAT=143, ASM_DECFLOAT=144, ASM_NUMBER=142, ASM_NUMFLOAT=143, ASM_BINFLOAT=144, ASM_DECFLOAT=145,
ASM_HEXFLOAT=145, ASM_NUMINT=146, ASM_BININTEGER=147, ASM_DECINTEGER=148, ASM_HEXFLOAT=146, ASM_NUMINT=147, ASM_BININTEGER=148, ASM_DECINTEGER=149,
ASM_HEXINTEGER=149, ASM_CHAR=150, ASM_MULTI_REL=151, ASM_MULTI_NAME=152, ASM_HEXINTEGER=150, ASM_CHAR=151, ASM_MULTI_REL=152, ASM_MULTI_NAME=153,
ASM_NAME=153, ASM_WS=154, ASM_COMMENT_LINE=155, ASM_COMMENT_BLOCK=156, ASM_NAME=154, ASM_WS=155, ASM_COMMENT_LINE=156, ASM_COMMENT_BLOCK=157,
IMPORT_SYSTEMFILE=157, IMPORT_LOCALFILE=158, IMPORT_WS=159, IMPORT_COMMENT_LINE=160, IMPORT_SYSTEMFILE=158, IMPORT_LOCALFILE=159, IMPORT_WS=160, IMPORT_COMMENT_LINE=161,
IMPORT_COMMENT_BLOCK=161, EMULATOR=162; IMPORT_COMMENT_BLOCK=162;
public static final int public static final int
RULE_file = 0, RULE_asmFile = 1, RULE_declSeq = 2, RULE_declOrImport = 3, RULE_file = 0, RULE_asmFile = 1, RULE_declSeq = 2, RULE_declOrImport = 3,
RULE_importDecl = 4, RULE_decl = 5, RULE_declVariables = 6, RULE_declVariableList = 7, RULE_importDecl = 4, RULE_decl = 5, RULE_declVariables = 6, RULE_declVariableList = 7,
@ -84,18 +84,18 @@ public class KickCParser extends Parser {
"'...'", "'?'", null, "'->'", null, null, null, null, "'%'", "'++'", "'...'", "'?'", null, "'->'", null, null, null, null, "'%'", "'++'",
"'--'", "'&'", "'~'", "'^'", "'|'", null, null, "'=='", "'!='", null, "'--'", "'&'", "'~'", "'^'", "'|'", null, null, "'=='", "'!='", null,
"'<='", "'>='", null, "'&&'", "'||'", "'='", null, "'typedef'", "'reserve'", "'<='", "'>='", null, "'&&'", "'||'", "'='", null, "'typedef'", "'reserve'",
"'pc'", "'target'", "'link'", "'cpu'", "'code_seg'", "'data_seg'", "'encoding'", "'pc'", "'target'", "'link'", "'emulator'", "'cpu'", "'code_seg'", "'data_seg'",
"'const'", "'extern'", "'export'", "'align'", "'inline'", "'volatile'", "'encoding'", "'const'", "'extern'", "'export'", "'align'", "'inline'",
"'static'", "'interrupt'", "'register'", "'__address'", "'__zp'", "'__mem'", "'volatile'", "'static'", "'interrupt'", "'register'", "'__address'",
"'__ssa'", "'__ma'", "'__intrinsic'", "'calling'", null, "'var_model'", "'__zp'", "'__mem'", "'__ssa'", "'__ma'", "'__intrinsic'", "'calling'",
"'if'", "'else'", "'while'", "'do'", "'for'", "'switch'", "'return'", null, "'var_model'", "'if'", "'else'", "'while'", "'do'", "'for'", "'switch'",
"'break'", "'continue'", "'asm'", "'default'", "'case'", "'struct'", "'return'", "'break'", "'continue'", "'asm'", "'default'", "'case'",
"'enum'", "'sizeof'", "'typeid'", "'defined'", "'kickasm'", "'resource'", "'struct'", "'enum'", "'sizeof'", "'typeid'", "'defined'", "'kickasm'",
"'uses'", "'clobbers'", "'bytes'", "'cycles'", "'!'", null, null, null, "'resource'", "'uses'", "'clobbers'", "'bytes'", "'cycles'", "'!'", null,
null, "'#import'", "'#include'", "'#pragma'", "'#define'", null, "'#undef'", null, null, null, "'#import'", "'#include'", "'#pragma'", "'#define'",
"'#ifdef'", "'#ifndef'", "'#if'", "'#elif'", "'#else'", "'#endif'", null, null, "'#undef'", "'#ifdef'", "'#ifndef'", "'#if'", "'#elif'", "'#else'",
null, null, null, null, null, null, null, null, null, null, null, null, "'#endif'", null, null, null, null, null, null, null, null, null, null,
null, null, "'.byte'", null, "'#'" null, null, null, null, null, "'.byte'", null, "'#'"
}; };
} }
private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static final String[] _LITERAL_NAMES = makeLiteralNames();
@ -107,18 +107,18 @@ public class KickCParser extends Parser {
"INC", "DEC", "AND", "BIT_NOT", "BIT_XOR", "BIT_OR", "SHIFT_LEFT", "SHIFT_RIGHT", "INC", "DEC", "AND", "BIT_NOT", "BIT_XOR", "BIT_OR", "SHIFT_LEFT", "SHIFT_RIGHT",
"EQUAL", "NOT_EQUAL", "LESS_THAN", "LESS_THAN_EQUAL", "GREATER_THAN_EQUAL", "EQUAL", "NOT_EQUAL", "LESS_THAN", "LESS_THAN_EQUAL", "GREATER_THAN_EQUAL",
"GREATER_THAN", "LOGIC_AND", "LOGIC_OR", "ASSIGN", "ASSIGN_COMPOUND", "GREATER_THAN", "LOGIC_AND", "LOGIC_OR", "ASSIGN", "ASSIGN_COMPOUND",
"TYPEDEF", "RESERVE", "PC", "TARGET", "LINK", "CPU", "CODESEG", "DATASEG", "TYPEDEF", "RESERVE", "PC", "TARGET", "LINK", "EMULATOR", "CPU", "CODESEG",
"ENCODING", "CONST", "EXTERN", "EXPORT", "ALIGN", "INLINE", "VOLATILE", "DATASEG", "ENCODING", "CONST", "EXTERN", "EXPORT", "ALIGN", "INLINE",
"STATIC", "INTERRUPT", "REGISTER", "ADDRESS", "ADDRESS_ZEROPAGE", "ADDRESS_MAINMEM", "VOLATILE", "STATIC", "INTERRUPT", "REGISTER", "ADDRESS", "ADDRESS_ZEROPAGE",
"FORM_SSA", "FORM_MA", "INTRINSIC", "CALLING", "CALLINGCONVENTION", "VARMODEL", "ADDRESS_MAINMEM", "FORM_SSA", "FORM_MA", "INTRINSIC", "CALLING", "CALLINGCONVENTION",
"IF", "ELSE", "WHILE", "DO", "FOR", "SWITCH", "RETURN", "BREAK", "CONTINUE", "VARMODEL", "IF", "ELSE", "WHILE", "DO", "FOR", "SWITCH", "RETURN", "BREAK",
"ASM", "DEFAULT", "CASE", "STRUCT", "ENUM", "SIZEOF", "TYPEID", "DEFINED", "CONTINUE", "ASM", "DEFAULT", "CASE", "STRUCT", "ENUM", "SIZEOF", "TYPEID",
"KICKASM", "RESOURCE", "USES", "CLOBBERS", "BYTES", "CYCLES", "LOGIC_NOT", "DEFINED", "KICKASM", "RESOURCE", "USES", "CLOBBERS", "BYTES", "CYCLES",
"SIGNEDNESS", "SIMPLETYPE", "BOOLEAN", "KICKASM_BODY", "IMPORT", "INCLUDE", "LOGIC_NOT", "SIGNEDNESS", "SIMPLETYPE", "BOOLEAN", "KICKASM_BODY", "IMPORT",
"PRAGMA", "DEFINE", "DEFINE_CONTINUE", "UNDEF", "IFDEF", "IFNDEF", "IFIF", "INCLUDE", "PRAGMA", "DEFINE", "DEFINE_CONTINUE", "UNDEF", "IFDEF", "IFNDEF",
"ELIF", "IFELSE", "ENDIF", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "IFIF", "ELIF", "IFELSE", "ENDIF", "NUMBER", "NUMFLOAT", "BINFLOAT",
"HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "NAME", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER",
"STRING", "CHAR", "WS", "COMMENT_LINE", "COMMENT_BLOCK", "ASM_BYTE", "NAME", "STRING", "CHAR", "WS", "COMMENT_LINE", "COMMENT_BLOCK", "ASM_BYTE",
"ASM_MNEMONIC", "ASM_IMM", "ASM_COLON", "ASM_COMMA", "ASM_PAR_BEGIN", "ASM_MNEMONIC", "ASM_IMM", "ASM_COLON", "ASM_COMMA", "ASM_PAR_BEGIN",
"ASM_PAR_END", "ASM_BRACKET_BEGIN", "ASM_BRACKET_END", "ASM_DOT", "ASM_SHIFT_LEFT", "ASM_PAR_END", "ASM_BRACKET_BEGIN", "ASM_BRACKET_END", "ASM_DOT", "ASM_SHIFT_LEFT",
"ASM_SHIFT_RIGHT", "ASM_PLUS", "ASM_MINUS", "ASM_LESS_THAN", "ASM_GREATER_THAN", "ASM_SHIFT_RIGHT", "ASM_PLUS", "ASM_MINUS", "ASM_LESS_THAN", "ASM_GREATER_THAN",
@ -127,7 +127,7 @@ public class KickCParser extends Parser {
"ASM_BININTEGER", "ASM_DECINTEGER", "ASM_HEXINTEGER", "ASM_CHAR", "ASM_MULTI_REL", "ASM_BININTEGER", "ASM_DECINTEGER", "ASM_HEXINTEGER", "ASM_CHAR", "ASM_MULTI_REL",
"ASM_MULTI_NAME", "ASM_NAME", "ASM_WS", "ASM_COMMENT_LINE", "ASM_COMMENT_BLOCK", "ASM_MULTI_NAME", "ASM_NAME", "ASM_WS", "ASM_COMMENT_LINE", "ASM_COMMENT_BLOCK",
"IMPORT_SYSTEMFILE", "IMPORT_LOCALFILE", "IMPORT_WS", "IMPORT_COMMENT_LINE", "IMPORT_SYSTEMFILE", "IMPORT_LOCALFILE", "IMPORT_WS", "IMPORT_COMMENT_LINE",
"IMPORT_COMMENT_BLOCK", "EMULATOR" "IMPORT_COMMENT_BLOCK"
}; };
} }
private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@ -320,7 +320,7 @@ public class KickCParser extends Parser {
setState(103); setState(103);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << TYPEDEF) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (CALLINGCONVENTION - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (KICKASM - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)) | (1L << (IMPORT - 64)) | (1L << (INCLUDE - 64)) | (1L << (PRAGMA - 64)))) != 0)) { while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << TYPEDEF) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (KICKASM - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)) | (1L << (IMPORT - 65)) | (1L << (INCLUDE - 65)) | (1L << (PRAGMA - 65)))) != 0)) {
{ {
{ {
setState(100); setState(100);
@ -1257,7 +1257,7 @@ public class KickCParser extends Parser {
setState(222); setState(222);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (SIZEOF - 80)) | (1L << (TYPEID - 80)) | (1L << (DEFINED - 80)) | (1L << (LOGIC_NOT - 80)) | (1L << (BOOLEAN - 80)) | (1L << (NUMBER - 80)) | (1L << (NAME - 80)) | (1L << (STRING - 80)) | (1L << (CHAR - 80)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & ((1L << (SIZEOF - 81)) | (1L << (TYPEID - 81)) | (1L << (DEFINED - 81)) | (1L << (LOGIC_NOT - 81)) | (1L << (BOOLEAN - 81)) | (1L << (NUMBER - 81)) | (1L << (NAME - 81)) | (1L << (STRING - 81)) | (1L << (CHAR - 81)))) != 0)) {
{ {
setState(221); setState(221);
expr(0); expr(0);
@ -1411,7 +1411,7 @@ public class KickCParser extends Parser {
setState(234); setState(234);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (SIZEOF - 80)) | (1L << (TYPEID - 80)) | (1L << (DEFINED - 80)) | (1L << (LOGIC_NOT - 80)) | (1L << (BOOLEAN - 80)) | (1L << (NUMBER - 80)) | (1L << (NAME - 80)) | (1L << (STRING - 80)) | (1L << (CHAR - 80)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & ((1L << (SIZEOF - 81)) | (1L << (TYPEID - 81)) | (1L << (DEFINED - 81)) | (1L << (LOGIC_NOT - 81)) | (1L << (BOOLEAN - 81)) | (1L << (NUMBER - 81)) | (1L << (NAME - 81)) | (1L << (STRING - 81)) | (1L << (CHAR - 81)))) != 0)) {
{ {
setState(233); setState(233);
expr(0); expr(0);
@ -1778,7 +1778,7 @@ public class KickCParser extends Parser {
setState(262); setState(262);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (SIZEOF - 80)) | (1L << (TYPEID - 80)) | (1L << (DEFINED - 80)) | (1L << (LOGIC_NOT - 80)) | (1L << (BOOLEAN - 80)) | (1L << (NUMBER - 80)) | (1L << (NAME - 80)) | (1L << (STRING - 80)) | (1L << (CHAR - 80)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & ((1L << (SIZEOF - 81)) | (1L << (TYPEID - 81)) | (1L << (DEFINED - 81)) | (1L << (LOGIC_NOT - 81)) | (1L << (BOOLEAN - 81)) | (1L << (NUMBER - 81)) | (1L << (NAME - 81)) | (1L << (STRING - 81)) | (1L << (CHAR - 81)))) != 0)) {
{ {
setState(261); setState(261);
expr(0); expr(0);
@ -1930,7 +1930,7 @@ public class KickCParser extends Parser {
setState(284); setState(284);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (CALLINGCONVENTION - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)))) != 0) ); } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)))) != 0) );
setState(286); setState(286);
match(CURLY_END); match(CURLY_END);
} }
@ -2314,7 +2314,7 @@ public class KickCParser extends Parser {
setState(328); setState(328);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << PARAM_LIST) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (CALLINGCONVENTION - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << PARAM_LIST) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)))) != 0)) {
{ {
setState(327); setState(327);
parameterListDecl(); parameterListDecl();
@ -2391,7 +2391,7 @@ public class KickCParser extends Parser {
setState(337); setState(337);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (CALLINGCONVENTION - 64)) | (1L << (IF - 64)) | (1L << (WHILE - 64)) | (1L << (DO - 64)) | (1L << (FOR - 64)) | (1L << (SWITCH - 64)) | (1L << (RETURN - 64)) | (1L << (BREAK - 64)) | (1L << (CONTINUE - 64)) | (1L << (ASM - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIZEOF - 64)) | (1L << (TYPEID - 64)) | (1L << (DEFINED - 64)) | (1L << (KICKASM - 64)) | (1L << (LOGIC_NOT - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)) | (1L << (BOOLEAN - 64)) | (1L << (NUMBER - 64)) | (1L << (NAME - 64)) | (1L << (STRING - 64)) | (1L << (CHAR - 64)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (IF - 65)) | (1L << (WHILE - 65)) | (1L << (DO - 65)) | (1L << (FOR - 65)) | (1L << (SWITCH - 65)) | (1L << (RETURN - 65)) | (1L << (BREAK - 65)) | (1L << (CONTINUE - 65)) | (1L << (ASM - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIZEOF - 65)) | (1L << (TYPEID - 65)) | (1L << (DEFINED - 65)) | (1L << (KICKASM - 65)) | (1L << (LOGIC_NOT - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)) | (1L << (BOOLEAN - 65)) | (1L << (NUMBER - 65)) | (1L << (NAME - 65)) | (1L << (STRING - 65)) | (1L << (CHAR - 65)))) != 0)) {
{ {
setState(336); setState(336);
stmtSeq(); stmtSeq();
@ -3716,7 +3716,7 @@ public class KickCParser extends Parser {
setState(492); setState(492);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (CALLINGCONVENTION - 64)) | (1L << (IF - 64)) | (1L << (WHILE - 64)) | (1L << (DO - 64)) | (1L << (FOR - 64)) | (1L << (SWITCH - 64)) | (1L << (RETURN - 64)) | (1L << (BREAK - 64)) | (1L << (CONTINUE - 64)) | (1L << (ASM - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIZEOF - 64)) | (1L << (TYPEID - 64)) | (1L << (DEFINED - 64)) | (1L << (KICKASM - 64)) | (1L << (LOGIC_NOT - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)) | (1L << (BOOLEAN - 64)) | (1L << (NUMBER - 64)) | (1L << (NAME - 64)) | (1L << (STRING - 64)) | (1L << (CHAR - 64)))) != 0) ); } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (IF - 65)) | (1L << (WHILE - 65)) | (1L << (DO - 65)) | (1L << (FOR - 65)) | (1L << (SWITCH - 65)) | (1L << (RETURN - 65)) | (1L << (BREAK - 65)) | (1L << (CONTINUE - 65)) | (1L << (ASM - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIZEOF - 65)) | (1L << (TYPEID - 65)) | (1L << (DEFINED - 65)) | (1L << (KICKASM - 65)) | (1L << (LOGIC_NOT - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)) | (1L << (BOOLEAN - 65)) | (1L << (NUMBER - 65)) | (1L << (NAME - 65)) | (1L << (STRING - 65)) | (1L << (CHAR - 65)))) != 0) );
} }
} }
catch (RecognitionException re) { catch (RecognitionException re) {
@ -4082,7 +4082,7 @@ public class KickCParser extends Parser {
setState(499); setState(499);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (CALLINGCONVENTION - 64)) | (1L << (IF - 64)) | (1L << (WHILE - 64)) | (1L << (DO - 64)) | (1L << (FOR - 64)) | (1L << (SWITCH - 64)) | (1L << (RETURN - 64)) | (1L << (BREAK - 64)) | (1L << (CONTINUE - 64)) | (1L << (ASM - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIZEOF - 64)) | (1L << (TYPEID - 64)) | (1L << (DEFINED - 64)) | (1L << (KICKASM - 64)) | (1L << (LOGIC_NOT - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)) | (1L << (BOOLEAN - 64)) | (1L << (NUMBER - 64)) | (1L << (NAME - 64)) | (1L << (STRING - 64)) | (1L << (CHAR - 64)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (IF - 65)) | (1L << (WHILE - 65)) | (1L << (DO - 65)) | (1L << (FOR - 65)) | (1L << (SWITCH - 65)) | (1L << (RETURN - 65)) | (1L << (BREAK - 65)) | (1L << (CONTINUE - 65)) | (1L << (ASM - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIZEOF - 65)) | (1L << (TYPEID - 65)) | (1L << (DEFINED - 65)) | (1L << (KICKASM - 65)) | (1L << (LOGIC_NOT - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)) | (1L << (BOOLEAN - 65)) | (1L << (NUMBER - 65)) | (1L << (NAME - 65)) | (1L << (STRING - 65)) | (1L << (CHAR - 65)))) != 0)) {
{ {
setState(498); setState(498);
stmtSeq(); stmtSeq();
@ -4254,7 +4254,7 @@ public class KickCParser extends Parser {
setState(562); setState(562);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (SIZEOF - 80)) | (1L << (TYPEID - 80)) | (1L << (DEFINED - 80)) | (1L << (LOGIC_NOT - 80)) | (1L << (BOOLEAN - 80)) | (1L << (NUMBER - 80)) | (1L << (NAME - 80)) | (1L << (STRING - 80)) | (1L << (CHAR - 80)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & ((1L << (SIZEOF - 81)) | (1L << (TYPEID - 81)) | (1L << (DEFINED - 81)) | (1L << (LOGIC_NOT - 81)) | (1L << (BOOLEAN - 81)) | (1L << (NUMBER - 81)) | (1L << (NAME - 81)) | (1L << (STRING - 81)) | (1L << (CHAR - 81)))) != 0)) {
{ {
setState(561); setState(561);
commaExpr(0); commaExpr(0);
@ -4394,7 +4394,7 @@ public class KickCParser extends Parser {
setState(588); setState(588);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (CALLINGCONVENTION - 64)) | (1L << (IF - 64)) | (1L << (WHILE - 64)) | (1L << (DO - 64)) | (1L << (FOR - 64)) | (1L << (SWITCH - 64)) | (1L << (RETURN - 64)) | (1L << (BREAK - 64)) | (1L << (CONTINUE - 64)) | (1L << (ASM - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIZEOF - 64)) | (1L << (TYPEID - 64)) | (1L << (DEFINED - 64)) | (1L << (KICKASM - 64)) | (1L << (LOGIC_NOT - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)) | (1L << (BOOLEAN - 64)) | (1L << (NUMBER - 64)) | (1L << (NAME - 64)) | (1L << (STRING - 64)) | (1L << (CHAR - 64)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (IF - 65)) | (1L << (WHILE - 65)) | (1L << (DO - 65)) | (1L << (FOR - 65)) | (1L << (SWITCH - 65)) | (1L << (RETURN - 65)) | (1L << (BREAK - 65)) | (1L << (CONTINUE - 65)) | (1L << (ASM - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIZEOF - 65)) | (1L << (TYPEID - 65)) | (1L << (DEFINED - 65)) | (1L << (KICKASM - 65)) | (1L << (LOGIC_NOT - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)) | (1L << (BOOLEAN - 65)) | (1L << (NUMBER - 65)) | (1L << (NAME - 65)) | (1L << (STRING - 65)) | (1L << (CHAR - 65)))) != 0)) {
{ {
setState(587); setState(587);
stmtSeq(); stmtSeq();
@ -4461,7 +4461,7 @@ public class KickCParser extends Parser {
setState(596); setState(596);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (CALLINGCONVENTION - 64)) | (1L << (IF - 64)) | (1L << (WHILE - 64)) | (1L << (DO - 64)) | (1L << (FOR - 64)) | (1L << (SWITCH - 64)) | (1L << (RETURN - 64)) | (1L << (BREAK - 64)) | (1L << (CONTINUE - 64)) | (1L << (ASM - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIZEOF - 64)) | (1L << (TYPEID - 64)) | (1L << (DEFINED - 64)) | (1L << (KICKASM - 64)) | (1L << (LOGIC_NOT - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)) | (1L << (BOOLEAN - 64)) | (1L << (NUMBER - 64)) | (1L << (NAME - 64)) | (1L << (STRING - 64)) | (1L << (CHAR - 64)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (IF - 65)) | (1L << (WHILE - 65)) | (1L << (DO - 65)) | (1L << (FOR - 65)) | (1L << (SWITCH - 65)) | (1L << (RETURN - 65)) | (1L << (BREAK - 65)) | (1L << (CONTINUE - 65)) | (1L << (ASM - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIZEOF - 65)) | (1L << (TYPEID - 65)) | (1L << (DEFINED - 65)) | (1L << (KICKASM - 65)) | (1L << (LOGIC_NOT - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)) | (1L << (BOOLEAN - 65)) | (1L << (NUMBER - 65)) | (1L << (NAME - 65)) | (1L << (STRING - 65)) | (1L << (CHAR - 65)))) != 0)) {
{ {
setState(595); setState(595);
stmtSeq(); stmtSeq();
@ -4579,7 +4579,7 @@ public class KickCParser extends Parser {
setState(603); setState(603);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (SIZEOF - 80)) | (1L << (TYPEID - 80)) | (1L << (DEFINED - 80)) | (1L << (LOGIC_NOT - 80)) | (1L << (BOOLEAN - 80)) | (1L << (NUMBER - 80)) | (1L << (NAME - 80)) | (1L << (STRING - 80)) | (1L << (CHAR - 80)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & ((1L << (SIZEOF - 81)) | (1L << (TYPEID - 81)) | (1L << (DEFINED - 81)) | (1L << (LOGIC_NOT - 81)) | (1L << (BOOLEAN - 81)) | (1L << (NUMBER - 81)) | (1L << (NAME - 81)) | (1L << (STRING - 81)) | (1L << (CHAR - 81)))) != 0)) {
{ {
setState(602); setState(602);
commaExpr(0); commaExpr(0);
@ -4595,7 +4595,7 @@ public class KickCParser extends Parser {
setState(612); setState(612);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (CALLINGCONVENTION - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)))) != 0)) {
{ {
setState(605); setState(605);
declType(); declType();
@ -4706,7 +4706,7 @@ public class KickCParser extends Parser {
setState(623); setState(623);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (CALLINGCONVENTION - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)))) != 0)) {
{ {
setState(622); setState(622);
declVariables(); declVariables();
@ -5917,7 +5917,7 @@ public class KickCParser extends Parser {
setState(751); setState(751);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (SIZEOF - 80)) | (1L << (TYPEID - 80)) | (1L << (DEFINED - 80)) | (1L << (LOGIC_NOT - 80)) | (1L << (BOOLEAN - 80)) | (1L << (NUMBER - 80)) | (1L << (NAME - 80)) | (1L << (STRING - 80)) | (1L << (CHAR - 80)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & ((1L << (SIZEOF - 81)) | (1L << (TYPEID - 81)) | (1L << (DEFINED - 81)) | (1L << (LOGIC_NOT - 81)) | (1L << (BOOLEAN - 81)) | (1L << (NUMBER - 81)) | (1L << (NAME - 81)) | (1L << (STRING - 81)) | (1L << (CHAR - 81)))) != 0)) {
{ {
setState(750); setState(750);
parameterList(); parameterList();
@ -6461,7 +6461,7 @@ public class KickCParser extends Parser {
setState(811); setState(811);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
while (((((_la - 121)) & ~0x3f) == 0 && ((1L << (_la - 121)) & ((1L << (ASM_BYTE - 121)) | (1L << (ASM_MNEMONIC - 121)) | (1L << (ASM_MULTI_NAME - 121)) | (1L << (ASM_NAME - 121)))) != 0)) { while (((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (ASM_BYTE - 122)) | (1L << (ASM_MNEMONIC - 122)) | (1L << (ASM_MULTI_NAME - 122)) | (1L << (ASM_NAME - 122)))) != 0)) {
{ {
{ {
setState(808); setState(808);
@ -7222,7 +7222,7 @@ public class KickCParser extends Parser {
_prevctx = _localctx; _prevctx = _localctx;
setState(868); setState(868);
_la = _input.LA(1); _la = _input.LA(1);
if ( !(((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & ((1L << (ASM_PLUS - 133)) | (1L << (ASM_MINUS - 133)) | (1L << (ASM_LESS_THAN - 133)) | (1L << (ASM_GREATER_THAN - 133)))) != 0)) ) { if ( !(((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & ((1L << (ASM_PLUS - 134)) | (1L << (ASM_MINUS - 134)) | (1L << (ASM_LESS_THAN - 134)) | (1L << (ASM_GREATER_THAN - 134)))) != 0)) ) {
_errHandler.recoverInline(this); _errHandler.recoverInline(this);
} }
else { else {
@ -7571,9 +7571,9 @@ public class KickCParser extends Parser {
"\u0370\n\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60"+ "\u0370\n\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60"+
"\7\60\u037e\n\60\f\60\16\60\u0381\13\60\3\60\2\t\20\34\36*FH^\61\2\4\6"+ "\7\60\u037e\n\60\f\60\16\60\u0381\13\60\3\60\2\t\20\34\36*FH^\61\2\4\6"+
"\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRT"+ "\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRT"+
"VXZ\\^\2\r\3\2\27\30\5\2\22\23\31\32[[\4\2!!$$\3\2\35\36\3\2\24\26\3\2"+ "VXZ\\^\2\r\3\2\27\30\5\2\22\23\31\32\\\\\4\2!!$$\3\2\35\36\3\2\24\26\3"+
"\22\23\3\2\37$\3\2\u0087\u008a\3\2\u0085\u0086\3\2\u008b\u008c\3\2\u0087"+ "\2\22\23\3\2\37$\3\2\u0088\u008b\3\2\u0086\u0087\3\2\u008c\u008d\3\2\u0088"+
"\u0088\2\u0407\2`\3\2\2\2\4c\3\2\2\2\6i\3\2\2\2\bn\3\2\2\2\nv\3\2\2\2"+ "\u0089\2\u0407\2`\3\2\2\2\4c\3\2\2\2\6i\3\2\2\2\bn\3\2\2\2\nv\3\2\2\2"+
"\f\u0087\3\2\2\2\16\u0089\3\2\2\2\20\u008c\3\2\2\2\22\u00a3\3\2\2\2\24"+ "\f\u0087\3\2\2\2\16\u0089\3\2\2\2\20\u008c\3\2\2\2\22\u00a3\3\2\2\2\24"+
"\u00c8\3\2\2\2\26\u00cd\3\2\2\2\30\u00d7\3\2\2\2\32\u00de\3\2\2\2\34\u00e4"+ "\u00c8\3\2\2\2\26\u00cd\3\2\2\2\30\u00d7\3\2\2\2\32\u00de\3\2\2\2\34\u00e4"+
"\3\2\2\2\36\u0103\3\2\2\2 \u0113\3\2\2\2\"\u0116\3\2\2\2$\u0122\3\2\2"+ "\3\2\2\2\36\u0103\3\2\2\2 \u0113\3\2\2\2\"\u0116\3\2\2\2$\u0122\3\2\2"+
@ -7586,7 +7586,7 @@ public class KickCParser extends Parser {
"\3\2\2\2^\u036f\3\2\2\2`a\5\6\4\2ab\7\2\2\3b\3\3\2\2\2cd\5R*\2de\7\2\2"+ "\3\2\2\2^\u036f\3\2\2\2`a\5\6\4\2ab\7\2\2\3b\3\3\2\2\2cd\5R*\2de\7\2\2"+
"\3e\5\3\2\2\2fh\5\b\5\2gf\3\2\2\2hk\3\2\2\2ig\3\2\2\2ij\3\2\2\2j\7\3\2"+ "\3e\5\3\2\2\2fh\5\b\5\2gf\3\2\2\2hk\3\2\2\2ig\3\2\2\2ij\3\2\2\2j\7\3\2"+
"\2\2ki\3\2\2\2lo\5\f\7\2mo\5\n\6\2nl\3\2\2\2nm\3\2\2\2o\t\3\2\2\2pq\7"+ "\2\2ki\3\2\2\2lo\5\f\7\2mo\5\n\6\2nl\3\2\2\2nm\3\2\2\2o\t\3\2\2\2pq\7"+
"`\2\2qw\7\u00a0\2\2rs\7a\2\2sw\7\u00a0\2\2tu\7a\2\2uw\7\u009f\2\2vp\3"+ "a\2\2qw\7\u00a1\2\2rs\7b\2\2sw\7\u00a1\2\2tu\7b\2\2uw\7\u00a0\2\2vp\3"+
"\2\2\2vr\3\2\2\2vt\3\2\2\2w\13\3\2\2\2xy\5\16\b\2yz\7\n\2\2z\u0088\3\2"+ "\2\2\2vr\3\2\2\2vt\3\2\2\2w\13\3\2\2\2xy\5\16\b\2yz\7\n\2\2z\u0088\3\2"+
"\2\2{|\5\"\22\2|}\7\n\2\2}\u0088\3\2\2\2~\177\5(\25\2\177\u0080\7\n\2"+ "\2\2{|\5\"\22\2|}\7\n\2\2}\u0088\3\2\2\2~\177\5(\25\2\177\u0080\7\n\2"+
"\2\u0080\u0088\3\2\2\2\u0081\u0088\5.\30\2\u0082\u0088\5L\'\2\u0083\u0088"+ "\2\u0080\u0088\3\2\2\2\u0081\u0088\5.\30\2\u0082\u0088\5L\'\2\u0083\u0088"+
@ -7603,14 +7603,14 @@ public class KickCParser extends Parser {
"\2\2\2\u00a0\u009e\3\2\2\2\u00a0\u00a1\3\2\2\2\u00a1\21\3\2\2\2\u00a2"+ "\2\2\2\u00a0\u009e\3\2\2\2\u00a0\u00a1\3\2\2\2\u00a1\21\3\2\2\2\u00a2"+
"\u00a0\3\2\2\2\u00a3\u00a4\7)\2\2\u00a4\u00a8\5\26\f\2\u00a5\u00a7\5\30"+ "\u00a0\3\2\2\2\u00a3\u00a4\7)\2\2\u00a4\u00a8\5\26\f\2\u00a5\u00a7\5\30"+
"\r\2\u00a6\u00a5\3\2\2\2\u00a7\u00aa\3\2\2\2\u00a8\u00a6\3\2\2\2\u00a8"+ "\r\2\u00a6\u00a5\3\2\2\2\u00a7\u00aa\3\2\2\2\u00a8\u00a6\3\2\2\2\u00a8"+
"\u00a9\3\2\2\2\u00a9\u00ab\3\2\2\2\u00aa\u00a8\3\2\2\2\u00ab\u00af\7u"+ "\u00a9\3\2\2\2\u00a9\u00ab\3\2\2\2\u00aa\u00a8\3\2\2\2\u00ab\u00af\7v"+
"\2\2\u00ac\u00ae\5\32\16\2\u00ad\u00ac\3\2\2\2\u00ae\u00b1\3\2\2\2\u00af"+ "\2\2\u00ac\u00ae\5\32\16\2\u00ad\u00ac\3\2\2\2\u00ae\u00b1\3\2\2\2\u00af"+
"\u00ad\3\2\2\2\u00af\u00b0\3\2\2\2\u00b0\u00b2\3\2\2\2\u00b1\u00af\3\2"+ "\u00ad\3\2\2\2\u00af\u00b0\3\2\2\2\u00b0\u00b2\3\2\2\2\u00b1\u00af\3\2"+
"\2\2\u00b2\u00b3\b\n\1\2\u00b3\23\3\2\2\2\u00b4\u00b8\7u\2\2\u00b5\u00b7"+ "\2\2\u00b2\u00b3\b\n\1\2\u00b3\23\3\2\2\2\u00b4\u00b8\7v\2\2\u00b5\u00b7"+
"\5\32\16\2\u00b6\u00b5\3\2\2\2\u00b7\u00ba\3\2\2\2\u00b8\u00b6\3\2\2\2"+ "\5\32\16\2\u00b6\u00b5\3\2\2\2\u00b7\u00ba\3\2\2\2\u00b8\u00b6\3\2\2\2"+
"\u00b8\u00b9\3\2\2\2\u00b9\u00bd\3\2\2\2\u00ba\u00b8\3\2\2\2\u00bb\u00bc"+ "\u00b8\u00b9\3\2\2\2\u00b9\u00bd\3\2\2\2\u00ba\u00b8\3\2\2\2\u00bb\u00bc"+
"\7\'\2\2\u00bc\u00be\5H%\2\u00bd\u00bb\3\2\2\2\u00bd\u00be\3\2\2\2\u00be"+ "\7\'\2\2\u00bc\u00be\5H%\2\u00bd\u00bb\3\2\2\2\u00bd\u00be\3\2\2\2\u00be"+
"\u00c9\3\2\2\2\u00bf\u00c3\7u\2\2\u00c0\u00c2\5\32\16\2\u00c1\u00c0\3"+ "\u00c9\3\2\2\2\u00bf\u00c3\7v\2\2\u00c0\u00c2\5\32\16\2\u00c1\u00c0\3"+
"\2\2\2\u00c2\u00c5\3\2\2\2\u00c3\u00c1\3\2\2\2\u00c3\u00c4\3\2\2\2\u00c4"+ "\2\2\2\u00c2\u00c5\3\2\2\2\u00c3\u00c1\3\2\2\2\u00c3\u00c4\3\2\2\2\u00c4"+
"\u00c6\3\2\2\2\u00c5\u00c3\3\2\2\2\u00c6\u00c7\7\'\2\2\u00c7\u00c9\5L"+ "\u00c6\3\2\2\2\u00c5\u00c3\3\2\2\2\u00c6\u00c7\7\'\2\2\u00c7\u00c9\5L"+
"\'\2\u00c8\u00b4\3\2\2\2\u00c8\u00bf\3\2\2\2\u00c9\25\3\2\2\2\u00ca\u00cc"+ "\'\2\u00c8\u00b4\3\2\2\2\u00c8\u00bf\3\2\2\2\u00c9\25\3\2\2\2\u00ca\u00cc"+
@ -7629,7 +7629,7 @@ public class KickCParser extends Parser {
"\3\2\2\2\u00f0\u00f3\3\2\2\2\u00f1\u00ef\3\2\2\2\u00f1\u00f2\3\2\2\2\u00f2"+ "\3\2\2\2\u00f0\u00f3\3\2\2\2\u00f1\u00ef\3\2\2\2\u00f1\u00f2\3\2\2\2\u00f2"+
"\35\3\2\2\2\u00f3\u00f1\3\2\2\2\u00f4\u00f5\b\20\1\2\u00f5\u00f6\7\b\2"+ "\35\3\2\2\2\u00f3\u00f1\3\2\2\2\u00f4\u00f5\b\20\1\2\u00f5\u00f6\7\b\2"+
"\2\u00f6\u00f7\5\36\20\2\u00f7\u00f8\7\t\2\2\u00f8\u0104\3\2\2\2\u00f9"+ "\2\u00f6\u00f7\5\36\20\2\u00f7\u00f8\7\t\2\2\u00f8\u0104\3\2\2\2\u00f9"+
"\u0104\7]\2\2\u00fa\u00fc\7\\\2\2\u00fb\u00fd\7]\2\2\u00fc\u00fb\3\2\2"+ "\u0104\7^\2\2\u00fa\u00fc\7]\2\2\u00fb\u00fd\7^\2\2\u00fc\u00fb\3\2\2"+
"\2\u00fc\u00fd\3\2\2\2\u00fd\u0104\3\2\2\2\u00fe\u0104\5\"\22\2\u00ff"+ "\2\u00fc\u00fd\3\2\2\2\u00fd\u0104\3\2\2\2\u00fe\u0104\5\"\22\2\u00ff"+
"\u0104\5 \21\2\u0100\u0104\5(\25\2\u0101\u0104\5&\24\2\u0102\u0104\7\3"+ "\u0104\5 \21\2\u0100\u0104\5(\25\2\u0101\u0104\5&\24\2\u0102\u0104\7\3"+
"\2\2\u0103\u00f4\3\2\2\2\u0103\u00f9\3\2\2\2\u0103\u00fa\3\2\2\2\u0103"+ "\2\2\u0103\u00f4\3\2\2\2\u0103\u00f9\3\2\2\2\u0103\u00fa\3\2\2\2\u0103"+
@ -7639,23 +7639,23 @@ public class KickCParser extends Parser {
"\2\u0109\u010a\3\2\2\2\u010a\u010f\7\7\2\2\u010b\u010c\f\b\2\2\u010c\u010d"+ "\2\u0109\u010a\3\2\2\2\u010a\u010f\7\7\2\2\u010b\u010c\f\b\2\2\u010c\u010d"+
"\7\b\2\2\u010d\u010f\7\t\2\2\u010e\u0105\3\2\2\2\u010e\u010b\3\2\2\2\u010f"+ "\7\b\2\2\u010d\u010f\7\t\2\2\u010e\u0105\3\2\2\2\u010e\u010b\3\2\2\2\u010f"+
"\u0112\3\2\2\2\u0110\u010e\3\2\2\2\u0110\u0111\3\2\2\2\u0111\37\3\2\2"+ "\u0112\3\2\2\2\u0110\u010e\3\2\2\2\u0110\u0111\3\2\2\2\u0111\37\3\2\2"+
"\2\u0112\u0110\3\2\2\2\u0113\u0114\7P\2\2\u0114\u0115\7u\2\2\u0115!\3"+ "\2\u0112\u0110\3\2\2\2\u0113\u0114\7Q\2\2\u0114\u0115\7v\2\2\u0115!\3"+
"\2\2\2\u0116\u0118\7P\2\2\u0117\u0119\7u\2\2\u0118\u0117\3\2\2\2\u0118"+ "\2\2\2\u0116\u0118\7Q\2\2\u0117\u0119\7v\2\2\u0118\u0117\3\2\2\2\u0118"+
"\u0119\3\2\2\2\u0119\u011a\3\2\2\2\u011a\u011c\7\4\2\2\u011b\u011d\5$"+ "\u0119\3\2\2\2\u0119\u011a\3\2\2\2\u011a\u011c\7\4\2\2\u011b\u011d\5$"+
"\23\2\u011c\u011b\3\2\2\2\u011d\u011e\3\2\2\2\u011e\u011c\3\2\2\2\u011e"+ "\23\2\u011c\u011b\3\2\2\2\u011d\u011e\3\2\2\2\u011e\u011c\3\2\2\2\u011e"+
"\u011f\3\2\2\2\u011f\u0120\3\2\2\2\u0120\u0121\7\5\2\2\u0121#\3\2\2\2"+ "\u011f\3\2\2\2\u011f\u0120\3\2\2\2\u0120\u0121\7\5\2\2\u0121#\3\2\2\2"+
"\u0122\u0123\5\16\b\2\u0123\u0124\7\n\2\2\u0124%\3\2\2\2\u0125\u0126\7"+ "\u0122\u0123\5\16\b\2\u0123\u0124\7\n\2\2\u0124%\3\2\2\2\u0125\u0126\7"+
"Q\2\2\u0126\u0127\7u\2\2\u0127\'\3\2\2\2\u0128\u012a\7Q\2\2\u0129\u012b"+ "R\2\2\u0126\u0127\7v\2\2\u0127\'\3\2\2\2\u0128\u012a\7R\2\2\u0129\u012b"+
"\7u\2\2\u012a\u0129\3\2\2\2\u012a\u012b\3\2\2\2\u012b\u012c\3\2\2\2\u012c"+ "\7v\2\2\u012a\u0129\3\2\2\2\u012a\u012b\3\2\2\2\u012b\u012c\3\2\2\2\u012c"+
"\u012d\7\4\2\2\u012d\u012e\5*\26\2\u012e\u012f\7\5\2\2\u012f)\3\2\2\2"+ "\u012d\7\4\2\2\u012d\u012e\5*\26\2\u012e\u012f\7\5\2\2\u012f)\3\2\2\2"+
"\u0130\u0131\b\26\1\2\u0131\u0132\5,\27\2\u0132\u0138\3\2\2\2\u0133\u0134"+ "\u0130\u0131\b\26\1\2\u0131\u0132\5,\27\2\u0132\u0138\3\2\2\2\u0133\u0134"+
"\f\3\2\2\u0134\u0135\7\f\2\2\u0135\u0137\5,\27\2\u0136\u0133\3\2\2\2\u0137"+ "\f\3\2\2\u0134\u0135\7\f\2\2\u0135\u0137\5,\27\2\u0136\u0133\3\2\2\2\u0137"+
"\u013a\3\2\2\2\u0138\u0136\3\2\2\2\u0138\u0139\3\2\2\2\u0139+\3\2\2\2"+ "\u013a\3\2\2\2\u0138\u0136\3\2\2\2\u0138\u0139\3\2\2\2\u0139+\3\2\2\2"+
"\u013a\u0138\3\2\2\2\u013b\u013e\7u\2\2\u013c\u013d\7\'\2\2\u013d\u013f"+ "\u013a\u0138\3\2\2\2\u013b\u013e\7v\2\2\u013c\u013d\7\'\2\2\u013d\u013f"+
"\5H%\2\u013e\u013c\3\2\2\2\u013e\u013f\3\2\2\2\u013f-\3\2\2\2\u0140\u0144"+ "\5H%\2\u013e\u013c\3\2\2\2\u013e\u013f\3\2\2\2\u013f-\3\2\2\2\u0140\u0144"+
"\5\26\f\2\u0141\u0143\5\30\r\2\u0142\u0141\3\2\2\2\u0143\u0146\3\2\2\2"+ "\5\26\f\2\u0141\u0143\5\30\r\2\u0142\u0141\3\2\2\2\u0143\u0146\3\2\2\2"+
"\u0144\u0142\3\2\2\2\u0144\u0145\3\2\2\2\u0145\u0147\3\2\2\2\u0146\u0144"+ "\u0144\u0142\3\2\2\2\u0144\u0145\3\2\2\2\u0145\u0147\3\2\2\2\u0146\u0144"+
"\3\2\2\2\u0147\u0148\7u\2\2\u0148\u014a\7\b\2\2\u0149\u014b\5\62\32\2"+ "\3\2\2\2\u0147\u0148\7v\2\2\u0148\u014a\7\b\2\2\u0149\u014b\5\62\32\2"+
"\u014a\u0149\3\2\2\2\u014a\u014b\3\2\2\2\u014b\u014c\3\2\2\2\u014c\u014f"+ "\u014a\u0149\3\2\2\2\u014a\u014b\3\2\2\2\u014b\u014c\3\2\2\2\u014c\u014f"+
"\7\t\2\2\u014d\u0150\5\60\31\2\u014e\u0150\7\n\2\2\u014f\u014d\3\2\2\2"+ "\7\t\2\2\u014d\u0150\5\60\31\2\u014e\u0150\7\n\2\2\u014f\u014d\3\2\2\2"+
"\u014f\u014e\3\2\2\2\u0150/\3\2\2\2\u0151\u0153\7\4\2\2\u0152\u0154\5"+ "\u014f\u014e\3\2\2\2\u0150/\3\2\2\2\u0151\u0153\7\4\2\2\u0152\u0154\5"+
@ -7665,48 +7665,48 @@ public class KickCParser extends Parser {
"\u015a\3\2\2\2\u015c\u015d\3\2\2\2\u015d\63\3\2\2\2\u015e\u015c\3\2\2"+ "\u015a\3\2\2\2\u015c\u015d\3\2\2\2\u015d\63\3\2\2\2\u015e\u015c\3\2\2"+
"\2\u015f\u0163\5\26\f\2\u0160\u0162\5\30\r\2\u0161\u0160\3\2\2\2\u0162"+ "\2\u015f\u0163\5\26\f\2\u0160\u0162\5\30\r\2\u0161\u0160\3\2\2\2\u0162"+
"\u0165\3\2\2\2\u0163\u0161\3\2\2\2\u0163\u0164\3\2\2\2\u0164\u0166\3\2"+ "\u0165\3\2\2\2\u0163\u0161\3\2\2\2\u0163\u0164\3\2\2\2\u0164\u0166\3\2"+
"\2\2\u0165\u0163\3\2\2\2\u0166\u0167\7u\2\2\u0167\u016b\3\2\2\2\u0168"+ "\2\2\u0165\u0163\3\2\2\2\u0166\u0167\7v\2\2\u0167\u016b\3\2\2\2\u0168"+
"\u016b\7]\2\2\u0169\u016b\7\16\2\2\u016a\u015f\3\2\2\2\u016a\u0168\3\2"+ "\u016b\7^\2\2\u0169\u016b\7\16\2\2\u016a\u015f\3\2\2\2\u016a\u0168\3\2"+
"\2\2\u016a\u0169\3\2\2\2\u016b\65\3\2\2\2\u016c\u016d\7b\2\2\u016d\u016e"+ "\2\2\u016a\u0169\3\2\2\2\u016b\65\3\2\2\2\u016c\u016d\7c\2\2\u016d\u016e"+
"\7*\2\2\u016e\u016f\3\2\2\2\u016f\u0170\7\b\2\2\u0170\u0175\7l\2\2\u0171"+ "\7*\2\2\u016e\u016f\3\2\2\2\u016f\u0170\7\b\2\2\u0170\u0175\7m\2\2\u0171"+
"\u0172\7\f\2\2\u0172\u0174\7l\2\2\u0173\u0171\3\2\2\2\u0174\u0177\3\2"+ "\u0172\7\f\2\2\u0172\u0174\7m\2\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"+ "\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\u01bd\7\t\2\2\u0179\u017a\7b\2\2\u017a\u017b\7+\2"+ "\u0175\3\2\2\2\u0178\u01bd\7\t\2\2\u0179\u017a\7c\2\2\u017a\u017b\7+\2"+
"\2\u017b\u017c\3\2\2\2\u017c\u017d\7\b\2\2\u017d\u017e\7l\2\2\u017e\u01bd"+ "\2\u017b\u017c\3\2\2\2\u017c\u017d\7\b\2\2\u017d\u017e\7m\2\2\u017e\u01bd"+
"\7\t\2\2\u017f\u0180\7b\2\2\u0180\u0181\7,\2\2\u0181\u0182\3\2\2\2\u0182"+ "\7\t\2\2\u017f\u0180\7c\2\2\u0180\u0181\7,\2\2\u0181\u0182\3\2\2\2\u0182"+
"\u0183\7\b\2\2\u0183\u0184\7u\2\2\u0184\u01bd\7\t\2\2\u0185\u0186\7b\2"+ "\u0183\7\b\2\2\u0183\u0184\7v\2\2\u0184\u01bd\7\t\2\2\u0185\u0186\7c\2"+
"\2\u0186\u0187\7.\2\2\u0187\u0188\3\2\2\2\u0188\u0189\7\b\2\2\u0189\u018a"+ "\2\u0186\u0187\7/\2\2\u0187\u0188\3\2\2\2\u0188\u0189\7\b\2\2\u0189\u018a"+
"\7u\2\2\u018a\u01bd\7\t\2\2\u018b\u018c\7b\2\2\u018c\u018d\7-\2\2\u018d"+ "\7v\2\2\u018a\u01bd\7\t\2\2\u018b\u018c\7c\2\2\u018c\u018d\7-\2\2\u018d"+
"\u018e\3\2\2\2\u018e\u018f\7\b\2\2\u018f\u0190\7v\2\2\u0190\u01bd\7\t"+ "\u018e\3\2\2\2\u018e\u018f\7\b\2\2\u018f\u0190\7w\2\2\u0190\u01bd\7\t"+
"\2\2\u0191\u0192\7b\2\2\u0192\u0193\7\u00a4\2\2\u0193\u0194\3\2\2\2\u0194"+ "\2\2\u0191\u0192\7c\2\2\u0192\u0193\7.\2\2\u0193\u0194\3\2\2\2\u0194\u0195"+
"\u0195\7\b\2\2\u0195\u0196\7v\2\2\u0196\u01bd\7\t\2\2\u0197\u0198\7b\2"+ "\7\b\2\2\u0195\u0196\7w\2\2\u0196\u01bd\7\t\2\2\u0197\u0198\7c\2\2\u0198"+
"\2\u0198\u0199\7/\2\2\u0199\u019a\3\2\2\2\u019a\u019b\7\b\2\2\u019b\u019c"+ "\u0199\7\60\2\2\u0199\u019a\3\2\2\2\u019a\u019b\7\b\2\2\u019b\u019c\7"+
"\7u\2\2\u019c\u01bd\7\t\2\2\u019d\u019e\7b\2\2\u019e\u019f\7\60\2\2\u019f"+ "v\2\2\u019c\u01bd\7\t\2\2\u019d\u019e\7c\2\2\u019e\u019f\7\61\2\2\u019f"+
"\u01a0\3\2\2\2\u01a0\u01a1\7\b\2\2\u01a1\u01a2\7u\2\2\u01a2\u01bd\7\t"+ "\u01a0\3\2\2\2\u01a0\u01a1\7\b\2\2\u01a1\u01a2\7v\2\2\u01a2\u01bd\7\t"+
"\2\2\u01a3\u01a4\7b\2\2\u01a4\u01a5\7\61\2\2\u01a5\u01a6\3\2\2\2\u01a6"+ "\2\2\u01a3\u01a4\7c\2\2\u01a4\u01a5\7\62\2\2\u01a5\u01a6\3\2\2\2\u01a6"+
"\u01a7\7\b\2\2\u01a7\u01a8\7u\2\2\u01a8\u01bd\7\t\2\2\u01a9\u01aa\7b\2"+ "\u01a7\7\b\2\2\u01a7\u01a8\7v\2\2\u01a8\u01bd\7\t\2\2\u01a9\u01aa\7c\2"+
"\2\u01aa\u01ab\7A\2\2\u01ab\u01ac\3\2\2\2\u01ac\u01ad\7\b\2\2\u01ad\u01ae"+ "\2\u01aa\u01ab\7B\2\2\u01ab\u01ac\3\2\2\2\u01ac\u01ad\7\b\2\2\u01ad\u01ae"+
"\7B\2\2\u01ae\u01bd\7\t\2\2\u01af\u01b0\7b\2\2\u01b0\u01b1\7C\2\2\u01b1"+ "\7C\2\2\u01ae\u01bd\7\t\2\2\u01af\u01b0\7c\2\2\u01b0\u01b1\7D\2\2\u01b1"+
"\u01b2\3\2\2\2\u01b2\u01b3\7\b\2\2\u01b3\u01b8\7u\2\2\u01b4\u01b5\7\f"+ "\u01b2\3\2\2\2\u01b2\u01b3\7\b\2\2\u01b3\u01b8\7v\2\2\u01b4\u01b5\7\f"+
"\2\2\u01b5\u01b7\7u\2\2\u01b6\u01b4\3\2\2\2\u01b7\u01ba\3\2\2\2\u01b8"+ "\2\2\u01b5\u01b7\7v\2\2\u01b6\u01b4\3\2\2\2\u01b7\u01ba\3\2\2\2\u01b8"+
"\u01b6\3\2\2\2\u01b8\u01b9\3\2\2\2\u01b9\u01bb\3\2\2\2\u01ba\u01b8\3\2"+ "\u01b6\3\2\2\2\u01b8\u01b9\3\2\2\2\u01b9\u01bb\3\2\2\2\u01ba\u01b8\3\2"+
"\2\2\u01bb\u01bd\7\t\2\2\u01bc\u016c\3\2\2\2\u01bc\u0179\3\2\2\2\u01bc"+ "\2\2\u01bb\u01bd\7\t\2\2\u01bc\u016c\3\2\2\2\u01bc\u0179\3\2\2\2\u01bc"+
"\u017f\3\2\2\2\u01bc\u0185\3\2\2\2\u01bc\u018b\3\2\2\2\u01bc\u0191\3\2"+ "\u017f\3\2\2\2\u01bc\u0185\3\2\2\2\u01bc\u018b\3\2\2\2\u01bc\u0191\3\2"+
"\2\2\u01bc\u0197\3\2\2\2\u01bc\u019d\3\2\2\2\u01bc\u01a3\3\2\2\2\u01bc"+ "\2\2\u01bc\u0197\3\2\2\2\u01bc\u019d\3\2\2\2\u01bc\u01a3\3\2\2\2\u01bc"+
"\u01a9\3\2\2\2\u01bc\u01af\3\2\2\2\u01bd\67\3\2\2\2\u01be\u01ea\7\62\2"+ "\u01a9\3\2\2\2\u01bc\u01af\3\2\2\2\u01bd\67\3\2\2\2\u01be\u01ea\7\63\2"+
"\2\u01bf\u01c0\7\65\2\2\u01c0\u01c1\7\b\2\2\u01c1\u01c2\7l\2\2\u01c2\u01ea"+ "\2\u01bf\u01c0\7\66\2\2\u01c0\u01c1\7\b\2\2\u01c1\u01c2\7m\2\2\u01c2\u01ea"+
"\7\t\2\2\u01c3\u01c7\7:\2\2\u01c4\u01c5\7\b\2\2\u01c5\u01c6\7u\2\2\u01c6"+ "\7\t\2\2\u01c3\u01c7\7;\2\2\u01c4\u01c5\7\b\2\2\u01c5\u01c6\7v\2\2\u01c6"+
"\u01c8\7\t\2\2\u01c7\u01c4\3\2\2\2\u01c7\u01c8\3\2\2\2\u01c8\u01ea\3\2"+ "\u01c8\7\t\2\2\u01c7\u01c4\3\2\2\2\u01c7\u01c8\3\2\2\2\u01c8\u01ea\3\2"+
"\2\2\u01c9\u01ea\7<\2\2\u01ca\u01ea\7=\2\2\u01cb\u01cc\7;\2\2\u01cc\u01cd"+ "\2\2\u01c9\u01ea\7=\2\2\u01ca\u01ea\7>\2\2\u01cb\u01cc\7<\2\2\u01cc\u01cd"+
"\7\b\2\2\u01cd\u01ce\7l\2\2\u01ce\u01ea\7\t\2\2\u01cf\u01ea\7\67\2\2\u01d0"+ "\7\b\2\2\u01cd\u01ce\7m\2\2\u01ce\u01ea\7\t\2\2\u01cf\u01ea\78\2\2\u01d0"+
"\u01ea\78\2\2\u01d1\u01ea\7>\2\2\u01d2\u01ea\7?\2\2\u01d3\u01ea\7\63\2"+ "\u01ea\79\2\2\u01d1\u01ea\7?\2\2\u01d2\u01ea\7@\2\2\u01d3\u01ea\7\64\2"+
"\2\u01d4\u01ea\7\64\2\2\u01d5\u01ea\7\66\2\2\u01d6\u01ea\7@\2\2\u01d7"+ "\2\u01d4\u01ea\7\65\2\2\u01d5\u01ea\7\67\2\2\u01d6\u01ea\7A\2\2\u01d7"+
"\u01db\79\2\2\u01d8\u01d9\7\b\2\2\u01d9\u01da\7u\2\2\u01da\u01dc\7\t\2"+ "\u01db\7:\2\2\u01d8\u01d9\7\b\2\2\u01d9\u01da\7v\2\2\u01da\u01dc\7\t\2"+
"\2\u01db\u01d8\3\2\2\2\u01db\u01dc\3\2\2\2\u01dc\u01ea\3\2\2\2\u01dd\u01de"+ "\2\u01db\u01d8\3\2\2\2\u01db\u01dc\3\2\2\2\u01dc\u01ea\3\2\2\2\u01dd\u01de"+
"\7*\2\2\u01de\u01df\7\b\2\2\u01df\u01e4\7l\2\2\u01e0\u01e1\7\f\2\2\u01e1"+ "\7*\2\2\u01de\u01df\7\b\2\2\u01df\u01e4\7m\2\2\u01e0\u01e1\7\f\2\2\u01e1"+
"\u01e3\7l\2\2\u01e2\u01e0\3\2\2\2\u01e3\u01e6\3\2\2\2\u01e4\u01e2\3\2"+ "\u01e3\7m\2\2\u01e2\u01e0\3\2\2\2\u01e3\u01e6\3\2\2\2\u01e4\u01e2\3\2"+
"\2\2\u01e4\u01e5\3\2\2\2\u01e5\u01e7\3\2\2\2\u01e6\u01e4\3\2\2\2\u01e7"+ "\2\2\u01e4\u01e5\3\2\2\2\u01e5\u01e7\3\2\2\2\u01e6\u01e4\3\2\2\2\u01e7"+
"\u01ea\7\t\2\2\u01e8\u01ea\7B\2\2\u01e9\u01be\3\2\2\2\u01e9\u01bf\3\2"+ "\u01ea\7\t\2\2\u01e8\u01ea\7C\2\2\u01e9\u01be\3\2\2\2\u01e9\u01bf\3\2"+
"\2\2\u01e9\u01c3\3\2\2\2\u01e9\u01c9\3\2\2\2\u01e9\u01ca\3\2\2\2\u01e9"+ "\2\2\u01e9\u01c3\3\2\2\2\u01e9\u01c9\3\2\2\2\u01e9\u01ca\3\2\2\2\u01e9"+
"\u01cb\3\2\2\2\u01e9\u01cf\3\2\2\2\u01e9\u01d0\3\2\2\2\u01e9\u01d1\3\2"+ "\u01cb\3\2\2\2\u01e9\u01cf\3\2\2\2\u01e9\u01d0\3\2\2\2\u01e9\u01d1\3\2"+
"\2\2\u01e9\u01d2\3\2\2\2\u01e9\u01d3\3\2\2\2\u01e9\u01d4\3\2\2\2\u01e9"+ "\2\2\u01e9\u01d2\3\2\2\2\u01e9\u01d3\3\2\2\2\u01e9\u01d4\3\2\2\2\u01e9"+
@ -7716,44 +7716,44 @@ public class KickCParser extends Parser {
";\3\2\2\2\u01f0\u01f1\5\16\b\2\u01f1\u01f2\7\n\2\2\u01f2\u0245\3\2\2\2"+ ";\3\2\2\2\u01f0\u01f1\5\16\b\2\u01f1\u01f2\7\n\2\2\u01f2\u0245\3\2\2\2"+
"\u01f3\u01f5\7\4\2\2\u01f4\u01f6\5:\36\2\u01f5\u01f4\3\2\2\2\u01f5\u01f6"+ "\u01f3\u01f5\7\4\2\2\u01f4\u01f6\5:\36\2\u01f5\u01f4\3\2\2\2\u01f5\u01f6"+
"\3\2\2\2\u01f6\u01f7\3\2\2\2\u01f7\u0245\7\5\2\2\u01f8\u01f9\5F$\2\u01f9"+ "\3\2\2\2\u01f6\u01f7\3\2\2\2\u01f7\u0245\7\5\2\2\u01f8\u01f9\5F$\2\u01f9"+
"\u01fa\7\n\2\2\u01fa\u0245\3\2\2\2\u01fb\u01fc\7D\2\2\u01fc\u01fd\7\b"+ "\u01fa\7\n\2\2\u01fa\u0245\3\2\2\2\u01fb\u01fc\7E\2\2\u01fc\u01fd\7\b"+
"\2\2\u01fd\u01fe\5F$\2\u01fe\u01ff\7\t\2\2\u01ff\u0202\5<\37\2\u0200\u0201"+ "\2\2\u01fd\u01fe\5F$\2\u01fe\u01ff\7\t\2\2\u01ff\u0202\5<\37\2\u0200\u0201"+
"\7E\2\2\u0201\u0203\5<\37\2\u0202\u0200\3\2\2\2\u0202\u0203\3\2\2\2\u0203"+ "\7F\2\2\u0201\u0203\5<\37\2\u0202\u0200\3\2\2\2\u0202\u0203\3\2\2\2\u0203"+
"\u0245\3\2\2\2\u0204\u0206\58\35\2\u0205\u0204\3\2\2\2\u0206\u0209\3\2"+ "\u0245\3\2\2\2\u0204\u0206\58\35\2\u0205\u0204\3\2\2\2\u0206\u0209\3\2"+
"\2\2\u0207\u0205\3\2\2\2\u0207\u0208\3\2\2\2\u0208\u020a\3\2\2\2\u0209"+ "\2\2\u0207\u0205\3\2\2\2\u0207\u0208\3\2\2\2\u0208\u020a\3\2\2\2\u0209"+
"\u0207\3\2\2\2\u020a\u020b\7F\2\2\u020b\u020c\7\b\2\2\u020c\u020d\5F$"+ "\u0207\3\2\2\2\u020a\u020b\7G\2\2\u020b\u020c\7\b\2\2\u020c\u020d\5F$"+
"\2\u020d\u020e\7\t\2\2\u020e\u020f\5<\37\2\u020f\u0245\3\2\2\2\u0210\u0212"+ "\2\u020d\u020e\7\t\2\2\u020e\u020f\5<\37\2\u020f\u0245\3\2\2\2\u0210\u0212"+
"\58\35\2\u0211\u0210\3\2\2\2\u0212\u0215\3\2\2\2\u0213\u0211\3\2\2\2\u0213"+ "\58\35\2\u0211\u0210\3\2\2\2\u0212\u0215\3\2\2\2\u0213\u0211\3\2\2\2\u0213"+
"\u0214\3\2\2\2\u0214\u0216\3\2\2\2\u0215\u0213\3\2\2\2\u0216\u0217\7G"+ "\u0214\3\2\2\2\u0214\u0216\3\2\2\2\u0215\u0213\3\2\2\2\u0216\u0217\7H"+
"\2\2\u0217\u0218\5<\37\2\u0218\u0219\7F\2\2\u0219\u021a\7\b\2\2\u021a"+ "\2\2\u0217\u0218\5<\37\2\u0218\u0219\7G\2\2\u0219\u021a\7\b\2\2\u021a"+
"\u021b\5F$\2\u021b\u021c\7\t\2\2\u021c\u021d\7\n\2\2\u021d\u0245\3\2\2"+ "\u021b\5F$\2\u021b\u021c\7\t\2\2\u021c\u021d\7\n\2\2\u021d\u0245\3\2\2"+
"\2\u021e\u0220\58\35\2\u021f\u021e\3\2\2\2\u0220\u0223\3\2\2\2\u0221\u021f"+ "\2\u021e\u0220\58\35\2\u021f\u021e\3\2\2\2\u0220\u0223\3\2\2\2\u0221\u021f"+
"\3\2\2\2\u0221\u0222\3\2\2\2\u0222\u0224\3\2\2\2\u0223\u0221\3\2\2\2\u0224"+ "\3\2\2\2\u0221\u0222\3\2\2\2\u0222\u0224\3\2\2\2\u0223\u0221\3\2\2\2\u0224"+
"\u0225\7H\2\2\u0225\u0226\7\b\2\2\u0226\u0227\5B\"\2\u0227\u0228\7\t\2"+ "\u0225\7I\2\2\u0225\u0226\7\b\2\2\u0226\u0227\5B\"\2\u0227\u0228\7\t\2"+
"\2\u0228\u0229\5<\37\2\u0229\u0245\3\2\2\2\u022a\u022b\7I\2\2\u022b\u022c"+ "\2\u0228\u0229\5<\37\2\u0229\u0245\3\2\2\2\u022a\u022b\7J\2\2\u022b\u022c"+
"\7\b\2\2\u022c\u022d\5F$\2\u022d\u022e\7\t\2\2\u022e\u022f\7\4\2\2\u022f"+ "\7\b\2\2\u022c\u022d\5F$\2\u022d\u022e\7\t\2\2\u022e\u022f\7\4\2\2\u022f"+
"\u0230\5> \2\u0230\u0231\7\5\2\2\u0231\u0245\3\2\2\2\u0232\u0234\7J\2"+ "\u0230\5> \2\u0230\u0231\7\5\2\2\u0231\u0245\3\2\2\2\u0232\u0234\7K\2"+
"\2\u0233\u0235\5F$\2\u0234\u0233\3\2\2\2\u0234\u0235\3\2\2\2\u0235\u0236"+ "\2\u0233\u0235\5F$\2\u0234\u0233\3\2\2\2\u0234\u0235\3\2\2\2\u0235\u0236"+
"\3\2\2\2\u0236\u0245\7\n\2\2\u0237\u0238\7K\2\2\u0238\u0245\7\n\2\2\u0239"+ "\3\2\2\2\u0236\u0245\7\n\2\2\u0237\u0238\7L\2\2\u0238\u0245\7\n\2\2\u0239"+
"\u023a\7L\2\2\u023a\u0245\7\n\2\2\u023b\u023d\7M\2\2\u023c\u023e\5N(\2"+ "\u023a\7M\2\2\u023a\u0245\7\n\2\2\u023b\u023d\7N\2\2\u023c\u023e\5N(\2"+
"\u023d\u023c\3\2\2\2\u023d\u023e\3\2\2\2\u023e\u023f\3\2\2\2\u023f\u0240"+ "\u023d\u023c\3\2\2\2\u023d\u023e\3\2\2\2\u023e\u023f\3\2\2\2\u023f\u0240"+
"\7\4\2\2\u0240\u0241\5R*\2\u0241\u0242\7\u008e\2\2\u0242\u0245\3\2\2\2"+ "\7\4\2\2\u0240\u0241\5R*\2\u0241\u0242\7\u008f\2\2\u0242\u0245\3\2\2\2"+
"\u0243\u0245\5L\'\2\u0244\u01f0\3\2\2\2\u0244\u01f3\3\2\2\2\u0244\u01f8"+ "\u0243\u0245\5L\'\2\u0244\u01f0\3\2\2\2\u0244\u01f3\3\2\2\2\u0244\u01f8"+
"\3\2\2\2\u0244\u01fb\3\2\2\2\u0244\u0207\3\2\2\2\u0244\u0213\3\2\2\2\u0244"+ "\3\2\2\2\u0244\u01fb\3\2\2\2\u0244\u0207\3\2\2\2\u0244\u0213\3\2\2\2\u0244"+
"\u0221\3\2\2\2\u0244\u022a\3\2\2\2\u0244\u0232\3\2\2\2\u0244\u0237\3\2"+ "\u0221\3\2\2\2\u0244\u022a\3\2\2\2\u0244\u0232\3\2\2\2\u0244\u0237\3\2"+
"\2\2\u0244\u0239\3\2\2\2\u0244\u023b\3\2\2\2\u0244\u0243\3\2\2\2\u0245"+ "\2\2\u0244\u0239\3\2\2\2\u0244\u023b\3\2\2\2\u0244\u0243\3\2\2\2\u0245"+
"=\3\2\2\2\u0246\u0248\5@!\2\u0247\u0246\3\2\2\2\u0248\u0249\3\2\2\2\u0249"+ "=\3\2\2\2\u0246\u0248\5@!\2\u0247\u0246\3\2\2\2\u0248\u0249\3\2\2\2\u0249"+
"\u0247\3\2\2\2\u0249\u024a\3\2\2\2\u024a\u0250\3\2\2\2\u024b\u024c\7N"+ "\u0247\3\2\2\2\u0249\u024a\3\2\2\2\u024a\u0250\3\2\2\2\u024b\u024c\7O"+
"\2\2\u024c\u024e\7\13\2\2\u024d\u024f\5:\36\2\u024e\u024d\3\2\2\2\u024e"+ "\2\2\u024c\u024e\7\13\2\2\u024d\u024f\5:\36\2\u024e\u024d\3\2\2\2\u024e"+
"\u024f\3\2\2\2\u024f\u0251\3\2\2\2\u0250\u024b\3\2\2\2\u0250\u0251\3\2"+ "\u024f\3\2\2\2\u024f\u0251\3\2\2\2\u0250\u024b\3\2\2\2\u0250\u0251\3\2"+
"\2\2\u0251?\3\2\2\2\u0252\u0253\7O\2\2\u0253\u0254\5H%\2\u0254\u0256\7"+ "\2\2\u0251?\3\2\2\2\u0252\u0253\7P\2\2\u0253\u0254\5H%\2\u0254\u0256\7"+
"\13\2\2\u0255\u0257\5:\36\2\u0256\u0255\3\2\2\2\u0256\u0257\3\2\2\2\u0257"+ "\13\2\2\u0255\u0257\5:\36\2\u0256\u0255\3\2\2\2\u0256\u0257\3\2\2\2\u0257"+
"A\3\2\2\2\u0258\u0259\5D#\2\u0259\u025a\7\n\2\2\u025a\u025b\5F$\2\u025b"+ "A\3\2\2\2\u0258\u0259\5D#\2\u0259\u025a\7\n\2\2\u025a\u025b\5F$\2\u025b"+
"\u025d\7\n\2\2\u025c\u025e\5F$\2\u025d\u025c\3\2\2\2\u025d\u025e\3\2\2"+ "\u025d\7\n\2\2\u025c\u025e\5F$\2\u025d\u025c\3\2\2\2\u025d\u025e\3\2\2"+
"\2\u025e\u026f\3\2\2\2\u025f\u0263\5\26\f\2\u0260\u0262\5\30\r\2\u0261"+ "\2\u025e\u026f\3\2\2\2\u025f\u0263\5\26\f\2\u0260\u0262\5\30\r\2\u0261"+
"\u0260\3\2\2\2\u0262\u0265\3\2\2\2\u0263\u0261\3\2\2\2\u0263\u0264\3\2"+ "\u0260\3\2\2\2\u0262\u0265\3\2\2\2\u0263\u0261\3\2\2\2\u0263\u0264\3\2"+
"\2\2\u0264\u0267\3\2\2\2\u0265\u0263\3\2\2\2\u0266\u025f\3\2\2\2\u0266"+ "\2\2\u0264\u0267\3\2\2\2\u0265\u0263\3\2\2\2\u0266\u025f\3\2\2\2\u0266"+
"\u0267\3\2\2\2\u0267\u0268\3\2\2\2\u0268\u0269\7u\2\2\u0269\u026a\7\13"+ "\u0267\3\2\2\2\u0267\u0268\3\2\2\2\u0268\u0269\7v\2\2\u0269\u026a\7\13"+
"\2\2\u026a\u026b\5H%\2\u026b\u026c\7\r\2\2\u026c\u026d\5H%\2\u026d\u026f"+ "\2\2\u026a\u026b\5H%\2\u026b\u026c\7\r\2\2\u026c\u026d\5H%\2\u026d\u026f"+
"\3\2\2\2\u026e\u0258\3\2\2\2\u026e\u0266\3\2\2\2\u026fC\3\2\2\2\u0270"+ "\3\2\2\2\u026e\u0258\3\2\2\2\u026e\u0266\3\2\2\2\u026fC\3\2\2\2\u0270"+
"\u0272\5\16\b\2\u0271\u0270\3\2\2\2\u0271\u0272\3\2\2\2\u0272\u0275\3"+ "\u0272\5\16\b\2\u0271\u0270\3\2\2\2\u0271\u0272\3\2\2\2\u0272\u0275\3"+
@ -7762,14 +7762,14 @@ public class KickCParser extends Parser {
"\u027a\f\3\2\2\u027a\u027b\7\f\2\2\u027b\u027d\5H%\2\u027c\u0279\3\2\2"+ "\u027a\f\3\2\2\u027a\u027b\7\f\2\2\u027b\u027d\5H%\2\u027c\u0279\3\2\2"+
"\2\u027d\u0280\3\2\2\2\u027e\u027c\3\2\2\2\u027e\u027f\3\2\2\2\u027fG"+ "\2\u027d\u0280\3\2\2\2\u027e\u027c\3\2\2\2\u027e\u027f\3\2\2\2\u027fG"+
"\3\2\2\2\u0280\u027e\3\2\2\2\u0281\u0282\b%\1\2\u0282\u0283\7\b\2\2\u0283"+ "\3\2\2\2\u0280\u027e\3\2\2\2\u0281\u0282\b%\1\2\u0282\u0283\7\b\2\2\u0283"+
"\u0284\5F$\2\u0284\u0285\7\t\2\2\u0285\u02c0\3\2\2\2\u0286\u0287\7R\2"+ "\u0284\5F$\2\u0284\u0285\7\t\2\2\u0285\u02c0\3\2\2\2\u0286\u0287\7S\2"+
"\2\u0287\u028a\7\b\2\2\u0288\u028b\5H%\2\u0289\u028b\5\34\17\2\u028a\u0288"+ "\2\u0287\u028a\7\b\2\2\u0288\u028b\5H%\2\u0289\u028b\5\34\17\2\u028a\u0288"+
"\3\2\2\2\u028a\u0289\3\2\2\2\u028b\u028c\3\2\2\2\u028c\u028d\7\t\2\2\u028d"+ "\3\2\2\2\u028a\u0289\3\2\2\2\u028b\u028c\3\2\2\2\u028c\u028d\7\t\2\2\u028d"+
"\u02c0\3\2\2\2\u028e\u028f\7S\2\2\u028f\u0292\7\b\2\2\u0290\u0293\5H%"+ "\u02c0\3\2\2\2\u028e\u028f\7T\2\2\u028f\u0292\7\b\2\2\u0290\u0293\5H%"+
"\2\u0291\u0293\5\34\17\2\u0292\u0290\3\2\2\2\u0292\u0291\3\2\2\2\u0293"+ "\2\u0291\u0293\5\34\17\2\u0292\u0290\3\2\2\2\u0292\u0291\3\2\2\2\u0293"+
"\u0294\3\2\2\2\u0294\u0295\7\t\2\2\u0295\u02c0\3\2\2\2\u0296\u0298\7T"+ "\u0294\3\2\2\2\u0294\u0295\7\t\2\2\u0295\u02c0\3\2\2\2\u0296\u0298\7U"+
"\2\2\u0297\u0299\7\b\2\2\u0298\u0297\3\2\2\2\u0298\u0299\3\2\2\2\u0299"+ "\2\2\u0297\u0299\7\b\2\2\u0298\u0297\3\2\2\2\u0298\u0299\3\2\2\2\u0299"+
"\u029a\3\2\2\2\u029a\u029c\7u\2\2\u029b\u029d\7\t\2\2\u029c\u029b\3\2"+ "\u029a\3\2\2\2\u029a\u029c\7v\2\2\u029b\u029d\7\t\2\2\u029c\u029b\3\2"+
"\2\2\u029c\u029d\3\2\2\2\u029d\u02c0\3\2\2\2\u029e\u029f\7\b\2\2\u029f"+ "\2\2\u029c\u029d\3\2\2\2\u029d\u02c0\3\2\2\2\u029e\u029f\7\b\2\2\u029f"+
"\u02a0\5\34\17\2\u02a0\u02a1\7\t\2\2\u02a1\u02a2\5H%\32\u02a2\u02c0\3"+ "\u02a0\5\34\17\2\u02a0\u02a1\7\t\2\2\u02a1\u02a2\5H%\32\u02a2\u02c0\3"+
"\2\2\2\u02a3\u02a4\t\2\2\2\u02a4\u02c0\5H%\31\u02a5\u02a6\7\24\2\2\u02a6"+ "\2\2\2\u02a3\u02a4\t\2\2\2\u02a4\u02c0\5H%\31\u02a5\u02a6\7\24\2\2\u02a6"+
@ -7777,10 +7777,10 @@ public class KickCParser extends Parser {
"\2\u02aa\u02c0\5H%\22\u02ab\u02ac\7\4\2\2\u02ac\u02b1\5H%\2\u02ad\u02ae"+ "\2\u02aa\u02c0\5H%\22\u02ab\u02ac\7\4\2\2\u02ac\u02b1\5H%\2\u02ad\u02ae"+
"\7\f\2\2\u02ae\u02b0\5H%\2\u02af\u02ad\3\2\2\2\u02b0\u02b3\3\2\2\2\u02b1"+ "\7\f\2\2\u02ae\u02b0\5H%\2\u02af\u02ad\3\2\2\2\u02b0\u02b3\3\2\2\2\u02b1"+
"\u02af\3\2\2\2\u02b1\u02b2\3\2\2\2\u02b2\u02b4\3\2\2\2\u02b3\u02b1\3\2"+ "\u02af\3\2\2\2\u02b1\u02b2\3\2\2\2\u02b2\u02b4\3\2\2\2\u02b3\u02b1\3\2"+
"\2\2\u02b4\u02b5\7\5\2\2\u02b5\u02c0\3\2\2\2\u02b6\u02c0\7u\2\2\u02b7"+ "\2\2\u02b4\u02b5\7\5\2\2\u02b5\u02c0\3\2\2\2\u02b6\u02c0\7v\2\2\u02b7"+
"\u02c0\7l\2\2\u02b8\u02ba\7v\2\2\u02b9\u02b8\3\2\2\2\u02ba\u02bb\3\2\2"+ "\u02c0\7m\2\2\u02b8\u02ba\7w\2\2\u02b9\u02b8\3\2\2\2\u02ba\u02bb\3\2\2"+
"\2\u02bb\u02b9\3\2\2\2\u02bb\u02bc\3\2\2\2\u02bc\u02c0\3\2\2\2\u02bd\u02c0"+ "\2\u02bb\u02b9\3\2\2\2\u02bb\u02bc\3\2\2\2\u02bc\u02c0\3\2\2\2\u02bd\u02c0"+
"\7w\2\2\u02be\u02c0\7^\2\2\u02bf\u0281\3\2\2\2\u02bf\u0286\3\2\2\2\u02bf"+ "\7x\2\2\u02be\u02c0\7_\2\2\u02bf\u0281\3\2\2\2\u02bf\u0286\3\2\2\2\u02bf"+
"\u028e\3\2\2\2\u02bf\u0296\3\2\2\2\u02bf\u029e\3\2\2\2\u02bf\u02a3\3\2"+ "\u028e\3\2\2\2\u02bf\u0296\3\2\2\2\u02bf\u029e\3\2\2\2\u02bf\u02a3\3\2"+
"\2\2\u02bf\u02a5\3\2\2\2\u02bf\u02a7\3\2\2\2\u02bf\u02a9\3\2\2\2\u02bf"+ "\2\2\u02bf\u02a5\3\2\2\2\u02bf\u02a7\3\2\2\2\u02bf\u02a9\3\2\2\2\u02bf"+
"\u02ab\3\2\2\2\u02bf\u02b6\3\2\2\2\u02bf\u02b7\3\2\2\2\u02bf\u02b9\3\2"+ "\u02ab\3\2\2\2\u02bf\u02b6\3\2\2\2\u02bf\u02b7\3\2\2\2\u02bf\u02b9\3\2"+
@ -7796,8 +7796,8 @@ public class KickCParser extends Parser {
"\7\17\2\2\u02de\u02df\5H%\2\u02df\u02e0\7\13\2\2\u02e0\u02e1\5H%\f\u02e1"+ "\7\17\2\2\u02de\u02df\5H%\2\u02df\u02e0\7\13\2\2\u02e0\u02e1\5H%\f\u02e1"+
"\u02fc\3\2\2\2\u02e2\u02e3\f\n\2\2\u02e3\u02e4\7\'\2\2\u02e4\u02fc\5H"+ "\u02fc\3\2\2\2\u02e2\u02e3\f\n\2\2\u02e3\u02e4\7\'\2\2\u02e4\u02fc\5H"+
"%\n\u02e5\u02e6\f\t\2\2\u02e6\u02e7\7(\2\2\u02e7\u02fc\5H%\t\u02e8\u02e9"+ "%\n\u02e5\u02e6\f\t\2\2\u02e6\u02e7\7(\2\2\u02e7\u02fc\5H%\t\u02e8\u02e9"+
"\f!\2\2\u02e9\u02ea\7\20\2\2\u02ea\u02fc\7u\2\2\u02eb\u02ec\f \2\2\u02ec"+ "\f!\2\2\u02e9\u02ea\7\20\2\2\u02ea\u02fc\7v\2\2\u02eb\u02ec\f \2\2\u02ec"+
"\u02ed\7\21\2\2\u02ed\u02fc\7u\2\2\u02ee\u02ef\f\37\2\2\u02ef\u02f1\7"+ "\u02ed\7\21\2\2\u02ed\u02fc\7v\2\2\u02ee\u02ef\f\37\2\2\u02ef\u02f1\7"+
"\b\2\2\u02f0\u02f2\5J&\2\u02f1\u02f0\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2"+ "\b\2\2\u02f0\u02f2\5J&\2\u02f1\u02f0\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2"+
"\u02f3\3\2\2\2\u02f3\u02fc\7\t\2\2\u02f4\u02f5\f\33\2\2\u02f5\u02f6\7"+ "\u02f3\3\2\2\2\u02f3\u02fc\7\t\2\2\u02f4\u02f5\f\33\2\2\u02f5\u02f6\7"+
"\6\2\2\u02f6\u02f7\5F$\2\u02f7\u02f8\7\7\2\2\u02f8\u02fc\3\2\2\2\u02f9"+ "\6\2\2\u02f6\u02f7\5F$\2\u02f7\u02f8\7\7\2\2\u02f8\u02fc\3\2\2\2\u02f9"+
@ -7810,56 +7810,56 @@ public class KickCParser extends Parser {
"\u02fe\3\2\2\2\u02feI\3\2\2\2\u02ff\u02fd\3\2\2\2\u0300\u0305\5H%\2\u0301"+ "\u02fe\3\2\2\2\u02feI\3\2\2\2\u02ff\u02fd\3\2\2\2\u0300\u0305\5H%\2\u0301"+
"\u0302\7\f\2\2\u0302\u0304\5H%\2\u0303\u0301\3\2\2\2\u0304\u0307\3\2\2"+ "\u0302\7\f\2\2\u0302\u0304\5H%\2\u0303\u0301\3\2\2\2\u0304\u0307\3\2\2"+
"\2\u0305\u0303\3\2\2\2\u0305\u0306\3\2\2\2\u0306K\3\2\2\2\u0307\u0305"+ "\2\u0305\u0303\3\2\2\2\u0305\u0306\3\2\2\2\u0306K\3\2\2\2\u0307\u0305"+
"\3\2\2\2\u0308\u030a\7U\2\2\u0309\u030b\5N(\2\u030a\u0309\3\2\2\2\u030a"+ "\3\2\2\2\u0308\u030a\7V\2\2\u0309\u030b\5N(\2\u030a\u0309\3\2\2\2\u030a"+
"\u030b\3\2\2\2\u030b\u030c\3\2\2\2\u030c\u030d\7_\2\2\u030dM\3\2\2\2\u030e"+ "\u030b\3\2\2\2\u030b\u030c\3\2\2\2\u030c\u030d\7`\2\2\u030dM\3\2\2\2\u030e"+
"\u030f\7\b\2\2\u030f\u0314\5P)\2\u0310\u0311\7\f\2\2\u0311\u0313\5P)\2"+ "\u030f\7\b\2\2\u030f\u0314\5P)\2\u0310\u0311\7\f\2\2\u0311\u0313\5P)\2"+
"\u0312\u0310\3\2\2\2\u0313\u0316\3\2\2\2\u0314\u0312\3\2\2\2\u0314\u0315"+ "\u0312\u0310\3\2\2\2\u0313\u0316\3\2\2\2\u0314\u0312\3\2\2\2\u0314\u0315"+
"\3\2\2\2\u0315\u0317\3\2\2\2\u0316\u0314\3\2\2\2\u0317\u0318\7\t\2\2\u0318"+ "\3\2\2\2\u0315\u0317\3\2\2\2\u0316\u0314\3\2\2\2\u0317\u0318\7\t\2\2\u0318"+
"O\3\2\2\2\u0319\u031a\7V\2\2\u031a\u0329\7v\2\2\u031b\u031c\7W\2\2\u031c"+ "O\3\2\2\2\u0319\u031a\7W\2\2\u031a\u0329\7w\2\2\u031b\u031c\7X\2\2\u031c"+
"\u0329\7u\2\2\u031d\u031e\7X\2\2\u031e\u0329\7v\2\2\u031f\u0320\7Y\2\2"+ "\u0329\7v\2\2\u031d\u031e\7Y\2\2\u031e\u0329\7w\2\2\u031f\u0320\7Z\2\2"+
"\u0320\u0329\5H%\2\u0321\u0322\7Z\2\2\u0322\u0329\5H%\2\u0323\u0326\7"+ "\u0320\u0329\5H%\2\u0321\u0322\7[\2\2\u0322\u0329\5H%\2\u0323\u0326\7"+
"+\2\2\u0324\u0327\7\66\2\2\u0325\u0327\5H%\2\u0326\u0324\3\2\2\2\u0326"+ "+\2\2\u0324\u0327\7\67\2\2\u0325\u0327\5H%\2\u0326\u0324\3\2\2\2\u0326"+
"\u0325\3\2\2\2\u0327\u0329\3\2\2\2\u0328\u0319\3\2\2\2\u0328\u031b\3\2"+ "\u0325\3\2\2\2\u0327\u0329\3\2\2\2\u0328\u0319\3\2\2\2\u0328\u031b\3\2"+
"\2\2\u0328\u031d\3\2\2\2\u0328\u031f\3\2\2\2\u0328\u0321\3\2\2\2\u0328"+ "\2\2\u0328\u031d\3\2\2\2\u0328\u031f\3\2\2\2\u0328\u0321\3\2\2\2\u0328"+
"\u0323\3\2\2\2\u0329Q\3\2\2\2\u032a\u032c\5T+\2\u032b\u032a\3\2\2\2\u032c"+ "\u0323\3\2\2\2\u0329Q\3\2\2\2\u032a\u032c\5T+\2\u032b\u032a\3\2\2\2\u032c"+
"\u032f\3\2\2\2\u032d\u032b\3\2\2\2\u032d\u032e\3\2\2\2\u032eS\3\2\2\2"+ "\u032f\3\2\2\2\u032d\u032b\3\2\2\2\u032d\u032e\3\2\2\2\u032eS\3\2\2\2"+
"\u032f\u032d\3\2\2\2\u0330\u0334\5V,\2\u0331\u0334\5X-\2\u0332\u0334\5"+ "\u032f\u032d\3\2\2\2\u0330\u0334\5V,\2\u0331\u0334\5X-\2\u0332\u0334\5"+
"Z.\2\u0333\u0330\3\2\2\2\u0333\u0331\3\2\2\2\u0333\u0332\3\2\2\2\u0334"+ "Z.\2\u0333\u0330\3\2\2\2\u0333\u0331\3\2\2\2\u0333\u0332\3\2\2\2\u0334"+
"U\3\2\2\2\u0335\u0336\7\u009b\2\2\u0336\u033a\7~\2\2\u0337\u0338\7\u009a"+ "U\3\2\2\2\u0335\u0336\7\u009c\2\2\u0336\u033a\7\177\2\2\u0337\u0338\7"+
"\2\2\u0338\u033a\7~\2\2\u0339\u0335\3\2\2\2\u0339\u0337\3\2\2\2\u033a"+ "\u009b\2\2\u0338\u033a\7\177\2\2\u0339\u0335\3\2\2\2\u0339\u0337\3\2\2"+
"W\3\2\2\2\u033b\u033d\7|\2\2\u033c\u033e\5\\/\2\u033d\u033c\3\2\2\2\u033d"+ "\2\u033aW\3\2\2\2\u033b\u033d\7}\2\2\u033c\u033e\5\\/\2\u033d\u033c\3"+
"\u033e\3\2\2\2\u033eY\3\2\2\2\u033f\u0340\7{\2\2\u0340\u0345\5^\60\2\u0341"+ "\2\2\2\u033d\u033e\3\2\2\2\u033eY\3\2\2\2\u033f\u0340\7|\2\2\u0340\u0345"+
"\u0342\7\177\2\2\u0342\u0344\5^\60\2\u0343\u0341\3\2\2\2\u0344\u0347\3"+ "\5^\60\2\u0341\u0342\7\u0080\2\2\u0342\u0344\5^\60\2\u0343\u0341\3\2\2"+
"\2\2\2\u0345\u0343\3\2\2\2\u0345\u0346\3\2\2\2\u0346[\3\2\2\2\u0347\u0345"+ "\2\u0344\u0347\3\2\2\2\u0345\u0343\3\2\2\2\u0345\u0346\3\2\2\2\u0346["+
"\3\2\2\2\u0348\u0360\5^\60\2\u0349\u034a\7}\2\2\u034a\u0360\5^\60\2\u034b"+ "\3\2\2\2\u0347\u0345\3\2\2\2\u0348\u0360\5^\60\2\u0349\u034a\7~\2\2\u034a"+
"\u034c\5^\60\2\u034c\u034d\7\177\2\2\u034d\u034e\7\u009b\2\2\u034e\u0360"+ "\u0360\5^\60\2\u034b\u034c\5^\60\2\u034c\u034d\7\u0080\2\2\u034d\u034e"+
"\3\2\2\2\u034f\u0350\7\u0080\2\2\u0350\u0351\5^\60\2\u0351\u0352\7\u0081"+ "\7\u009c\2\2\u034e\u0360\3\2\2\2\u034f\u0350\7\u0081\2\2\u0350\u0351\5"+
"\2\2\u0352\u0353\7\177\2\2\u0353\u0354\7\u009b\2\2\u0354\u0360\3\2\2\2"+ "^\60\2\u0351\u0352\7\u0082\2\2\u0352\u0353\7\u0080\2\2\u0353\u0354\7\u009c"+
"\u0355\u0356\7\u0080\2\2\u0356\u0357\5^\60\2\u0357\u0358\7\177\2\2\u0358"+ "\2\2\u0354\u0360\3\2\2\2\u0355\u0356\7\u0081\2\2\u0356\u0357\5^\60\2\u0357"+
"\u0359\7\u009b\2\2\u0359\u035a\7\u0081\2\2\u035a\u0360\3\2\2\2\u035b\u035c"+ "\u0358\7\u0080\2\2\u0358\u0359\7\u009c\2\2\u0359\u035a\7\u0082\2\2\u035a"+
"\7\u0080\2\2\u035c\u035d\5^\60\2\u035d\u035e\7\u0081\2\2\u035e\u0360\3"+ "\u0360\3\2\2\2\u035b\u035c\7\u0081\2\2\u035c\u035d\5^\60\2\u035d\u035e"+
"\2\2\2\u035f\u0348\3\2\2\2\u035f\u0349\3\2\2\2\u035f\u034b\3\2\2\2\u035f"+ "\7\u0082\2\2\u035e\u0360\3\2\2\2\u035f\u0348\3\2\2\2\u035f\u0349\3\2\2"+
"\u034f\3\2\2\2\u035f\u0355\3\2\2\2\u035f\u035b\3\2\2\2\u0360]\3\2\2\2"+ "\2\u035f\u034b\3\2\2\2\u035f\u034f\3\2\2\2\u035f\u0355\3\2\2\2\u035f\u035b"+
"\u0361\u0362\b\60\1\2\u0362\u0363\7\u0082\2\2\u0363\u0364\5^\60\2\u0364"+ "\3\2\2\2\u0360]\3\2\2\2\u0361\u0362\b\60\1\2\u0362\u0363\7\u0083\2\2\u0363"+
"\u0365\7\u0083\2\2\u0365\u0370\3\2\2\2\u0366\u0367\t\t\2\2\u0367\u0370"+ "\u0364\5^\60\2\u0364\u0365\7\u0084\2\2\u0365\u0370\3\2\2\2\u0366\u0367"+
"\5^\60\n\u0368\u0370\7\u009b\2\2\u0369\u0370\7\u0099\2\2\u036a\u036b\7"+ "\t\t\2\2\u0367\u0370\5^\60\n\u0368\u0370\7\u009c\2\2\u0369\u0370\7\u009a"+
"\u008d\2\2\u036b\u036c\7\u009b\2\2\u036c\u0370\7\u008e\2\2\u036d\u0370"+ "\2\2\u036a\u036b\7\u008e\2\2\u036b\u036c\7\u009c\2\2\u036c\u0370\7\u008f"+
"\7\u008f\2\2\u036e\u0370\7\u0098\2\2\u036f\u0361\3\2\2\2\u036f\u0366\3"+ "\2\2\u036d\u0370\7\u0090\2\2\u036e\u0370\7\u0099\2\2\u036f\u0361\3\2\2"+
"\2\2\2\u036f\u0368\3\2\2\2\u036f\u0369\3\2\2\2\u036f\u036a\3\2\2\2\u036f"+ "\2\u036f\u0366\3\2\2\2\u036f\u0368\3\2\2\2\u036f\u0369\3\2\2\2\u036f\u036a"+
"\u036d\3\2\2\2\u036f\u036e\3\2\2\2\u0370\u037f\3\2\2\2\u0371\u0372\f\f"+ "\3\2\2\2\u036f\u036d\3\2\2\2\u036f\u036e\3\2\2\2\u0370\u037f\3\2\2\2\u0371"+
"\2\2\u0372\u0373\7\u0084\2\2\u0373\u037e\5^\60\r\u0374\u0375\f\13\2\2"+ "\u0372\f\f\2\2\u0372\u0373\7\u0085\2\2\u0373\u037e\5^\60\r\u0374\u0375"+
"\u0375\u0376\t\n\2\2\u0376\u037e\5^\60\f\u0377\u0378\f\t\2\2\u0378\u0379"+ "\f\13\2\2\u0375\u0376\t\n\2\2\u0376\u037e\5^\60\f\u0377\u0378\f\t\2\2"+
"\t\13\2\2\u0379\u037e\5^\60\n\u037a\u037b\f\b\2\2\u037b\u037c\t\f\2\2"+ "\u0378\u0379\t\13\2\2\u0379\u037e\5^\60\n\u037a\u037b\f\b\2\2\u037b\u037c"+
"\u037c\u037e\5^\60\t\u037d\u0371\3\2\2\2\u037d\u0374\3\2\2\2\u037d\u0377"+ "\t\f\2\2\u037c\u037e\5^\60\t\u037d\u0371\3\2\2\2\u037d\u0374\3\2\2\2\u037d"+
"\3\2\2\2\u037d\u037a\3\2\2\2\u037e\u0381\3\2\2\2\u037f\u037d\3\2\2\2\u037f"+ "\u0377\3\2\2\2\u037d\u037a\3\2\2\2\u037e\u0381\3\2\2\2\u037f\u037d\3\2"+
"\u0380\3\2\2\2\u0380_\3\2\2\2\u0381\u037f\3\2\2\2Zinv\u0087\u0090\u009a"+ "\2\2\u037f\u0380\3\2\2\2\u0380_\3\2\2\2\u0381\u037f\3\2\2\2Zinv\u0087"+
"\u00a0\u00a8\u00af\u00b8\u00bd\u00c3\u00c8\u00cd\u00d4\u00db\u00e0\u00ec"+ "\u0090\u009a\u00a0\u00a8\u00af\u00b8\u00bd\u00c3\u00c8\u00cd\u00d4\u00db"+
"\u00ef\u00f1\u00fc\u0103\u0108\u010e\u0110\u0118\u011e\u012a\u0138\u013e"+ "\u00e0\u00ec\u00ef\u00f1\u00fc\u0103\u0108\u010e\u0110\u0118\u011e\u012a"+
"\u0144\u014a\u014f\u0153\u015c\u0163\u016a\u0175\u01b8\u01bc\u01c7\u01db"+ "\u0138\u013e\u0144\u014a\u014f\u0153\u015c\u0163\u016a\u0175\u01b8\u01bc"+
"\u01e4\u01e9\u01ee\u01f5\u0202\u0207\u0213\u0221\u0234\u023d\u0244\u0249"+ "\u01c7\u01db\u01e4\u01e9\u01ee\u01f5\u0202\u0207\u0213\u0221\u0234\u023d"+
"\u024e\u0250\u0256\u025d\u0263\u0266\u026e\u0271\u0274\u027e\u028a\u0292"+ "\u0244\u0249\u024e\u0250\u0256\u025d\u0263\u0266\u026e\u0271\u0274\u027e"+
"\u0298\u029c\u02b1\u02bb\u02bf\u02f1\u02fb\u02fd\u0305\u030a\u0314\u0326"+ "\u028a\u0292\u0298\u029c\u02b1\u02bb\u02bf\u02f1\u02fb\u02fd\u0305\u030a"+
"\u0328\u032d\u0333\u0339\u033d\u0345\u035f\u036f\u037d\u037f"; "\u0314\u0326\u0328\u032d\u0333\u0339\u033d\u0345\u035f\u036f\u037d\u037f";
public static final ATN _ATN = public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray()); new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static { static {

View File

@ -41,125 +41,125 @@ RESERVE=40
PC=41 PC=41
TARGET=42 TARGET=42
LINK=43 LINK=43
CPU=44 EMULATOR=44
CODESEG=45 CPU=45
DATASEG=46 CODESEG=46
ENCODING=47 DATASEG=47
CONST=48 ENCODING=48
EXTERN=49 CONST=49
EXPORT=50 EXTERN=50
ALIGN=51 EXPORT=51
INLINE=52 ALIGN=52
VOLATILE=53 INLINE=53
STATIC=54 VOLATILE=54
INTERRUPT=55 STATIC=55
REGISTER=56 INTERRUPT=56
ADDRESS=57 REGISTER=57
ADDRESS_ZEROPAGE=58 ADDRESS=58
ADDRESS_MAINMEM=59 ADDRESS_ZEROPAGE=59
FORM_SSA=60 ADDRESS_MAINMEM=60
FORM_MA=61 FORM_SSA=61
INTRINSIC=62 FORM_MA=62
CALLING=63 INTRINSIC=63
CALLINGCONVENTION=64 CALLING=64
VARMODEL=65 CALLINGCONVENTION=65
IF=66 VARMODEL=66
ELSE=67 IF=67
WHILE=68 ELSE=68
DO=69 WHILE=69
FOR=70 DO=70
SWITCH=71 FOR=71
RETURN=72 SWITCH=72
BREAK=73 RETURN=73
CONTINUE=74 BREAK=74
ASM=75 CONTINUE=75
DEFAULT=76 ASM=76
CASE=77 DEFAULT=77
STRUCT=78 CASE=78
ENUM=79 STRUCT=79
SIZEOF=80 ENUM=80
TYPEID=81 SIZEOF=81
DEFINED=82 TYPEID=82
KICKASM=83 DEFINED=83
RESOURCE=84 KICKASM=84
USES=85 RESOURCE=85
CLOBBERS=86 USES=86
BYTES=87 CLOBBERS=87
CYCLES=88 BYTES=88
LOGIC_NOT=89 CYCLES=89
SIGNEDNESS=90 LOGIC_NOT=90
SIMPLETYPE=91 SIGNEDNESS=91
BOOLEAN=92 SIMPLETYPE=92
KICKASM_BODY=93 BOOLEAN=93
IMPORT=94 KICKASM_BODY=94
INCLUDE=95 IMPORT=95
PRAGMA=96 INCLUDE=96
DEFINE=97 PRAGMA=97
DEFINE_CONTINUE=98 DEFINE=98
UNDEF=99 DEFINE_CONTINUE=99
IFDEF=100 UNDEF=100
IFNDEF=101 IFDEF=101
IFIF=102 IFNDEF=102
ELIF=103 IFIF=103
IFELSE=104 ELIF=104
ENDIF=105 IFELSE=105
NUMBER=106 ENDIF=106
NUMFLOAT=107 NUMBER=107
BINFLOAT=108 NUMFLOAT=108
DECFLOAT=109 BINFLOAT=109
HEXFLOAT=110 DECFLOAT=110
NUMINT=111 HEXFLOAT=111
BININTEGER=112 NUMINT=112
DECINTEGER=113 BININTEGER=113
HEXINTEGER=114 DECINTEGER=114
NAME=115 HEXINTEGER=115
STRING=116 NAME=116
CHAR=117 STRING=117
WS=118 CHAR=118
COMMENT_LINE=119 WS=119
COMMENT_BLOCK=120 COMMENT_LINE=120
ASM_BYTE=121 COMMENT_BLOCK=121
ASM_MNEMONIC=122 ASM_BYTE=122
ASM_IMM=123 ASM_MNEMONIC=123
ASM_COLON=124 ASM_IMM=124
ASM_COMMA=125 ASM_COLON=125
ASM_PAR_BEGIN=126 ASM_COMMA=126
ASM_PAR_END=127 ASM_PAR_BEGIN=127
ASM_BRACKET_BEGIN=128 ASM_PAR_END=128
ASM_BRACKET_END=129 ASM_BRACKET_BEGIN=129
ASM_DOT=130 ASM_BRACKET_END=130
ASM_SHIFT_LEFT=131 ASM_DOT=131
ASM_SHIFT_RIGHT=132 ASM_SHIFT_LEFT=132
ASM_PLUS=133 ASM_SHIFT_RIGHT=133
ASM_MINUS=134 ASM_PLUS=134
ASM_LESS_THAN=135 ASM_MINUS=135
ASM_GREATER_THAN=136 ASM_LESS_THAN=136
ASM_MULTIPLY=137 ASM_GREATER_THAN=137
ASM_DIVIDE=138 ASM_MULTIPLY=138
ASM_CURLY_BEGIN=139 ASM_DIVIDE=139
ASM_CURLY_END=140 ASM_CURLY_BEGIN=140
ASM_NUMBER=141 ASM_CURLY_END=141
ASM_NUMFLOAT=142 ASM_NUMBER=142
ASM_BINFLOAT=143 ASM_NUMFLOAT=143
ASM_DECFLOAT=144 ASM_BINFLOAT=144
ASM_HEXFLOAT=145 ASM_DECFLOAT=145
ASM_NUMINT=146 ASM_HEXFLOAT=146
ASM_BININTEGER=147 ASM_NUMINT=147
ASM_DECINTEGER=148 ASM_BININTEGER=148
ASM_HEXINTEGER=149 ASM_DECINTEGER=149
ASM_CHAR=150 ASM_HEXINTEGER=150
ASM_MULTI_REL=151 ASM_CHAR=151
ASM_MULTI_NAME=152 ASM_MULTI_REL=152
ASM_NAME=153 ASM_MULTI_NAME=153
ASM_WS=154 ASM_NAME=154
ASM_COMMENT_LINE=155 ASM_WS=155
ASM_COMMENT_BLOCK=156 ASM_COMMENT_LINE=156
IMPORT_SYSTEMFILE=157 ASM_COMMENT_BLOCK=157
IMPORT_LOCALFILE=158 IMPORT_SYSTEMFILE=158
IMPORT_WS=159 IMPORT_LOCALFILE=159
IMPORT_COMMENT_LINE=160 IMPORT_WS=160
IMPORT_COMMENT_BLOCK=161 IMPORT_COMMENT_LINE=161
EMULATOR=162 IMPORT_COMMENT_BLOCK=162
';'=8 ';'=8
'..'=11 '..'=11
'...'=12 '...'=12
@ -184,61 +184,62 @@ EMULATOR=162
'pc'=41 'pc'=41
'target'=42 'target'=42
'link'=43 'link'=43
'cpu'=44 'emulator'=44
'code_seg'=45 'cpu'=45
'data_seg'=46 'code_seg'=46
'encoding'=47 'data_seg'=47
'const'=48 'encoding'=48
'extern'=49 'const'=49
'export'=50 'extern'=50
'align'=51 'export'=51
'inline'=52 'align'=52
'volatile'=53 'inline'=53
'static'=54 'volatile'=54
'interrupt'=55 'static'=55
'register'=56 'interrupt'=56
'__address'=57 'register'=57
'__zp'=58 '__address'=58
'__mem'=59 '__zp'=59
'__ssa'=60 '__mem'=60
'__ma'=61 '__ssa'=61
'__intrinsic'=62 '__ma'=62
'calling'=63 '__intrinsic'=63
'var_model'=65 'calling'=64
'if'=66 'var_model'=66
'else'=67 'if'=67
'while'=68 'else'=68
'do'=69 'while'=69
'for'=70 'do'=70
'switch'=71 'for'=71
'return'=72 'switch'=72
'break'=73 'return'=73
'continue'=74 'break'=74
'asm'=75 'continue'=75
'default'=76 'asm'=76
'case'=77 'default'=77
'struct'=78 'case'=78
'enum'=79 'struct'=79
'sizeof'=80 'enum'=80
'typeid'=81 'sizeof'=81
'defined'=82 'typeid'=82
'kickasm'=83 'defined'=83
'resource'=84 'kickasm'=84
'uses'=85 'resource'=85
'clobbers'=86 'uses'=86
'bytes'=87 'clobbers'=87
'cycles'=88 'bytes'=88
'!'=89 'cycles'=89
'#import'=94 '!'=90
'#include'=95 '#import'=95
'#pragma'=96 '#include'=96
'#define'=97 '#pragma'=97
'#undef'=99 '#define'=98
'#ifdef'=100 '#undef'=100
'#ifndef'=101 '#ifdef'=101
'#if'=102 '#ifndef'=102
'#elif'=103 '#if'=103
'#else'=104 '#elif'=104
'#endif'=105 '#else'=105
'.byte'=121 '#endif'=106
'#'=123 '.byte'=122
'#'=124

View File

@ -0,0 +1,138 @@
// The MOS 7360/8360 TED chip used for graphics and sound in Plus/4 and Commodore 16
// https://www.karlstechnology.com/commodore/TED7360-datasheet.pdf
// http://mclauchlan.site.net.au/scott/C=Hacking/C-Hacking12/gfx.html
struct MOS7360_TED {
// Counter #01. It always starts to decrement from the last written value into it.
unsigned int COUNTER1;
// Counter #02. It runs freely from $ffff.
unsigned int COUNTER2;
// Counter #03. Same as above.
unsigned int COUNTER3;
// Mostly the same as VIC's $d011.
// Bit 0,1,2 : Vertical smooth-scrolling
// Bit 3 : 24/25 rows screen
// Bit 4 : Blank screen
// Bit 5 : Bitplane mode
// Bit 6 : Enhanced color mode
// Bit 7 : TED's internal test, it should be 0.
unsigned char CONTROL1;
// Most similar VIC-reg is $d016.
// Bit 0,1,2 : Horizontal smooth-scrolling
// Bit 3 : 40/38 columns screen
// Bit 4 : Multicolor mode
// Bit 5 : TED stop. If set, the TED stops it's counters and screen-generating, only single clock and refresh
// cycles remain.
// Bit 6 : PAL/NTSC. 0:PAL, 1:NTSC
// Bit 7 : Disable reverse mode. If 0, we got 128 characters and higmost bit tells if the character should
// appear in inverse. If set, no inverse mode but 256 characters.
unsigned char CONTROL2;
// Keyboard input latch. Giving a strobe - writing to the register, the latch stores the values of the input-lines.
// Then, we can read them from this register.
unsigned char KEYBOARD_INPUT;
// Interrupt request register. When a counter sends want to send an IRQ, it's bit will appear as a 0; then, if the
// IRQ was caused then highmost bit is set.
// Bit 0 : Unused
// Bit 1 : Raster-counter
// Bit 2 : Lightpen. Not implemented.
// Bit 3 : Counter #1
// Bit 4 : Counter #2
// Bit 5 : Unused
// Bit 6 : Counter #3
// Bit 7 : Interrupt occured. This bit is set when an IRQ was enabled and therefore, the IRQ was sent to the
// processor. Physically, this is the negated level of the TED's IRQ output. The IRQ should be
// deleted with writing the register-value back after accepting an interrupt.
unsigned char IRQ_REQUEST;
// Interrupt mask register. These bits could be used to disable and enable interrupt-sources. When a place is set to
// 1, that will be able to cause an interrupt to the processor. If not, the sign of the interrupt request will only
// be appear in the above register.
// Bit 0 : 9th bit of RASTER_IRQ (see there)
// Bit 1 : Raster-counter
// Bit 2 : Lightpen. Not implemented.
// Bit 3 : Counter #1
// Bit 4 : Counter #2
// Bit 5 : Unused
// Bit 6 : Counter #3
// Bit 7 : Unused
unsigned char IRQ_MASK;
// Raster interrupt register. Same as $d012 when writing; it stores the position of occuring raster interrupt.
// Higmost bit is in IRQ_REQUEST's 0. bit.
unsigned char RASTER_IRQ;
// Hardware-cursor position (10 bits). Lower bits: CURSOR_LO, higher 2 bits in CURSOR_HI's 0. and 1. places.
// Beyond 1000 the cursor is not seeable.
unsigned char CURSOR_HI;
unsigned char CURSOR_LO;
// First sound-source's frq-value's lowmost 8 bit. More 2 bits are in $ff10's 0. and 1. places.
unsigned char CH1_FREQ_LO;
// Second sound-source, lowmost 8 bits. More 2 bits in $ff12, 0. and 1. places.
// The sound register-value can be calculated as
// reg=1024-(111860.781/frq[Hz]) (NTSC)
// reg=1024-(111840.45 /frq[Hz]) (PAL)
unsigned char CH2_FREQ_LO;
// First sound-source, higmost 2 bits. 2-7 bits are unused.
unsigned char CH1_FREQ_HI;
// Sound control register.
// Bit 0-3 : Volume. Maximum value is 8.
// Bit 4 : Sound #1 on/off. (implicit squarewave)
// Bit 5 : Sound #2 squarewave on/off.
// Bit 6 : Sound #2 noise on/off. If You set both, the square will sound.
// Bit 7 : D/A mode. See above for more.
unsigned char SOUND_CONTROL;
// Bitmap Address and Miscellaneous Control
// Bit 0,1 : 2nd sound-source, highmost bits.
// Bit 2 : Character generator in ROM or RAM. When set, TED will enable ROM when trying to get data from the
// charactergenerator to build screen. Else, it will give out control-signals to the DRAM's.
// Bit 3,4,5 : These bits tell, where to find bitplane in the memory when using bitplane-mode. TED assumes them
// as A15,A14 and A13 bits. So, the bitplanes can be switched as 8K pages, anywhere in the 64K.
// Bit 6-7 : Unused.
unsigned char MEMORY1;
// Character Description Map Address and Miscellaneous Control
// Bit 0 : A sign to having control about memory paging. This bit always sets to 1 when ROM is active over
// $8000. Else, it will be 0. READ ONLY.
// Bit 1 : Force single clock mode. Then, TED will disable to generate twice clock.
// Bit 2-7 : Charactergenerator. Bit 7 corresponds to A15, 6 to A14 and so on. This value shows and sets the
// start of the charactergenerator. It can be paged as $400 bytes. Use with addition of CONTROL3-2.bit.
unsigned char MEMORY2;
// Screen Matrix address
// Bit 0-2 : Unused
// Bit 3-7 : Start of the video-ram. Bit 7 also corresponds to the A15 line as above. So, video-ram is mappable
// as $800 bytes - 2K. The above $ff12-2.bit doesn't affect this, but the actual RAM/ROM mapping
// (see at $ff3e/$ff3f and $ff13/0) does.
unsigned char MEMORY3;
// Background Color. Lower bits contain color-code, higher 3 luminance and highmost is ignored.
unsigned char BG_COLOR;
// Color register 1. Used in ECM and MCM modes.
unsigned char BG_COLOR1;
// Color register 2. Used in ECM and MCM modes.
unsigned char BG_COLOR2;
// Color register 3. Used in ECM and MCM modes.
unsigned char BG_COLOR3;
// Border Color. Lower bits contain color-code, higher 3 luminance and higmost is ignored.
unsigned char BORDER_COLOR;
// Actual character-position. TED counts the characters that it had fetched and put out to the screen.
// Lower bits: CHARPOS_LO, higher 2 bits in CHARPOS_HI's 0. and 1. places.
// The number is increasing by 40 after every characterline (8 rasterline).
unsigned char CHARPOS_HI;
unsigned char CHARPOS_LO;
// Actual position of vertical scanning. Higmost bit is in $ff1c. Read/Writeable!
unsigned char RASTER_HI;
unsigned char RASTER_LO;
// Actual position of horizontal scanning. R/W!. Lowmost bit is unused. It contains the TED's internal counter's
// highmost 8 bits. So, it increases 4 with every character. When writing, it seems to put the value to a
// functionally different register (writing back a reading value in right time affects the screen).
unsigned char HSCAN_POS;
// Bit 0,1,2 : Actual vertical scanning-line in a character-row. R/W!.
// Bit 3-6 : Flashing counter. It's value increases with every frame, and TED fits it's flashing feature to this
// register's reaching to 15.
// Bit 7 : Unused
unsigned char VSCAN_POS;
// Unused address space
unsigned char UNUSED[0x1d];
// Switching to ROM. A writing statement to this address will cause to turn on the ROM between $8000-$ffff. It's an
// other matter, which one; this time, only sure thing that it'll give CS signals instead of RAS', CAS' and MUX.
// See $ff13/0 and $ff14
unsigned char ROM_SWITCH;
// Switching to RAM. The opposite of ROM_SWITCH.
unsigned char RAM_SWITCH;
};

View File

@ -0,0 +1,12 @@
// Plus/4 / Commodore 16 registers and memory layout
#include <mos7360.h>
// The TED chip controlling video and sound on the Plus/4 and Commodore 16
struct MOS7360_TED * const TED = 0xff00;
// Default address of screen luminance/color matrix
char * const DEFAULT_COLORRAM = 0x0800;
// Default address of screen character matrix
char * const DEFAULT_SCREEN = 0x0c00;

View File

@ -2,30 +2,27 @@
#pragma link("plus4.ld") #pragma link("plus4.ld")
#pragma emulator("xplus4") #pragma emulator("xplus4")
#include <plus4.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
char * const SCREEN = 0x0c00; // Colors to fade up/down when visiting a char multiple times
char * const COLORRAM = 0x0800;
char * const BGCOLOR = 0xff19;
char * const BORDERCOLOR = 0xff15;
char * const RASTER = 0xff1d;
char FADE[16] = { 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, 0x76, 0x66, 0x56, 0x46, 0x36, 0x26, 0x16, 0x06 }; char FADE[16] = { 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, 0x76, 0x66, 0x56, 0x46, 0x36, 0x26, 0x16, 0x06 };
char COUNT[1000];
// The number of times each character has been visited
char VISITS[1000];
void main() { void main() {
memset(SCREEN, 0xa0, 1000); memset(DEFAULT_SCREEN, 0xa0, 1000);
memset(COLORRAM, 0, 1000); memset(DEFAULT_COLORRAM, 0, 1000);
memset(COUNT, 0, 1000); memset(VISITS, 0, 1000);
*BORDERCOLOR = 0; TED->BG_COLOR = 0;
*BGCOLOR = 0; TED->BORDER_COLOR = 0;
char x=20, y=12; char x=20, y=12;
while(1) { while(1) {
unsigned int offset = (unsigned int)y*40+x; unsigned int offset = (unsigned int)y*40+x;
char cnt = ++*(COUNT+offset); char cnt = ++*(VISITS+offset);
*(COLORRAM+offset) = FADE[cnt&0xf]; *(DEFAULT_COLORRAM+offset) = FADE[cnt&0xf];
char rnd = >rand(); char rnd = >rand();
if(rnd & 0x80) { if(rnd & 0x80) {
if(rnd& 0x40) { if(rnd& 0x40) {
@ -44,6 +41,7 @@ void main() {
if(y==0xff) y=0; if(y==0xff) y=0;
} }
} }
while(*RASTER!=0xff) {} while(TED->RASTER_LO!=0xff) {}
} }
} }

View File

@ -9,11 +9,15 @@
.segment Code .segment Code
.label SCREEN = $c00 .const OFFSET_STRUCT_MOS7360_TED_BG_COLOR = $15
.label COLORRAM = $800 .const OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR = $19
.label BGCOLOR = $ff19 .const OFFSET_STRUCT_MOS7360_TED_RASTER_LO = $1d
.label BORDERCOLOR = $ff15 // The TED chip controlling video and sound on the Plus/4 and Commodore 16
.label RASTER = $ff1d .label TED = $ff00
// Default address of screen luminance/color matrix
.label DEFAULT_COLORRAM = $800
// Default address of screen character matrix
.label DEFAULT_SCREEN = $c00
// The random state variable // The random state variable
.label rand_state = 3 .label rand_state = 3
__bbegin: __bbegin:
@ -29,32 +33,32 @@ main: {
.label y = 2 .label y = 2
.label __29 = 7 .label __29 = 7
.label __30 = 5 .label __30 = 5
// memset(SCREEN, 0xa0, 1000) // memset(DEFAULT_SCREEN, 0xa0, 1000)
ldx #$a0 ldx #$a0
lda #<SCREEN lda #<DEFAULT_SCREEN
sta.z memset.str sta.z memset.str
lda #>SCREEN lda #>DEFAULT_SCREEN
sta.z memset.str+1 sta.z memset.str+1
jsr memset jsr memset
// memset(COLORRAM, 0, 1000) // memset(DEFAULT_COLORRAM, 0, 1000)
ldx #0 ldx #0
lda #<COLORRAM lda #<DEFAULT_COLORRAM
sta.z memset.str sta.z memset.str
lda #>COLORRAM lda #>DEFAULT_COLORRAM
sta.z memset.str+1 sta.z memset.str+1
jsr memset jsr memset
// memset(COUNT, 0, 1000) // memset(VISITS, 0, 1000)
ldx #0 ldx #0
lda #<COUNT lda #<VISITS
sta.z memset.str sta.z memset.str
lda #>COUNT lda #>VISITS
sta.z memset.str+1 sta.z memset.str+1
jsr memset jsr memset
// *BORDERCOLOR = 0 // TED->BG_COLOR = 0
lda #0 lda #0
sta BORDERCOLOR sta TED+OFFSET_STRUCT_MOS7360_TED_BG_COLOR
// *BGCOLOR = 0 // TED->BORDER_COLOR = 0
sta BGCOLOR sta TED+OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR
lda #<1 lda #<1
sta.z rand_state sta.z rand_state
lda #>1 lda #>1
@ -97,43 +101,43 @@ main: {
bcc !+ bcc !+
inc.z offset+1 inc.z offset+1
!: !:
// COUNT+offset // VISITS+offset
lda.z offset lda.z offset
clc clc
adc #<COUNT adc #<VISITS
sta.z __5 sta.z __5
lda.z offset+1 lda.z offset+1
adc #>COUNT adc #>VISITS
sta.z __5+1 sta.z __5+1
// cnt = ++*(COUNT+offset) // cnt = ++*(VISITS+offset)
ldy #0 ldy #0
lda (__5),y lda (__5),y
clc clc
adc #1 adc #1
sta (__5),y sta (__5),y
// COUNT+offset // VISITS+offset
lda.z offset lda.z offset
clc clc
adc #<COUNT adc #<VISITS
sta.z __6 sta.z __6
lda.z offset+1 lda.z offset+1
adc #>COUNT adc #>VISITS
sta.z __6+1 sta.z __6+1
// cnt = ++*(COUNT+offset) // cnt = ++*(VISITS+offset)
lda (__6),y lda (__6),y
tay tay
// COLORRAM+offset // DEFAULT_COLORRAM+offset
clc clc
lda.z __8 lda.z __8
adc #<COLORRAM adc #<DEFAULT_COLORRAM
sta.z __8 sta.z __8
lda.z __8+1 lda.z __8+1
adc #>COLORRAM adc #>DEFAULT_COLORRAM
sta.z __8+1 sta.z __8+1
// cnt&0xf // cnt&0xf
tya tya
and #$f and #$f
// *(COLORRAM+offset) = FADE[cnt&0xf] // *(DEFAULT_COLORRAM+offset) = FADE[cnt&0xf]
tay tay
lda FADE,y lda FADE,y
ldy #0 ldy #0
@ -163,9 +167,9 @@ main: {
lda #0 lda #0
sta.z y sta.z y
__b6: __b6:
// while(*RASTER!=0xff) // while(TED->RASTER_LO!=0xff)
lda #$ff lda #$ff
cmp RASTER cmp TED+OFFSET_STRUCT_MOS7360_TED_RASTER_LO
bne __b6 bne __b6
jmp __b2 jmp __b2
__b4: __b4:
@ -295,5 +299,7 @@ memset: {
jmp __b2 jmp __b2
} }
.segment Data .segment Data
// Colors to fade up/down when visiting a char multiple times
FADE: .byte 2, $12, $22, $32, $42, $52, $62, $72, $76, $66, $56, $46, $36, $26, $16, 6 FADE: .byte 2, $12, $22, $32, $42, $52, $62, $72, $76, $66, $56, $46, $36, $26, $16, 6
COUNT: .fill $3e8, 0 // The number of times each character has been visited
VISITS: .fill $3e8, 0

View File

@ -22,8 +22,8 @@ main::@11: scope:[main] from main::@10
[9] call memset [9] call memset
to:main::@12 to:main::@12
main::@12: scope:[main] from main::@11 main::@12: scope:[main] from main::@11
[10] *((const nomodify byte*) BORDERCOLOR) ← (byte) 0 [10] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR) ← (byte) 0
[11] *((const nomodify byte*) BGCOLOR) ← (byte) 0 [11] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR) ← (byte) 0
to:main::@1 to:main::@1
main::@1: scope:[main] from main::@12 main::@6 main::@1: scope:[main] from main::@12 main::@6
[12] (word) rand_state#11 ← phi( main::@12/(word) 1 main::@6/(word) rand_state#3 ) [12] (word) rand_state#11 ← phi( main::@12/(word) 1 main::@6/(word) rand_state#3 )
@ -36,11 +36,11 @@ main::@2: scope:[main] from main::@1
[15] (word~) main::$30 ← (word~) main::$29 + (word~) main::$24 [15] (word~) main::$30 ← (word~) main::$29 + (word~) main::$24
[16] (word~) main::$3 ← (word~) main::$30 << (byte) 3 [16] (word~) main::$3 ← (word~) main::$30 << (byte) 3
[17] (word) main::offset#0 ← (word~) main::$3 + (byte) main::x#11 [17] (word) main::offset#0 ← (word~) main::$3 + (byte) main::x#11
[18] (byte*~) main::$5 ← (const byte*) COUNT + (word) main::offset#0 [18] (byte*~) main::$5 ← (const byte*) VISITS + (word) main::offset#0
[19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5) [19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5)
[20] (byte*~) main::$6 ← (const byte*) COUNT + (word) main::offset#0 [20] (byte*~) main::$6 ← (const byte*) VISITS + (word) main::offset#0
[21] (byte) main::cnt#0 ← *((byte*~) main::$6) [21] (byte) main::cnt#0 ← *((byte*~) main::$6)
[22] (byte*~) main::$8 ← (const nomodify byte*) COLORRAM + (word) main::offset#0 [22] (byte*~) main::$8 ← (const nomodify byte*) DEFAULT_COLORRAM + (word) main::offset#0
[23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f [23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f
[24] *((byte*~) main::$8) ← *((const byte*) FADE + (byte~) main::$9) [24] *((byte*~) main::$8) ← *((const byte*) FADE + (byte~) main::$9)
[25] call rand [25] call rand
@ -66,7 +66,7 @@ main::@14: scope:[main] from main::@8
main::@6: scope:[main] from main::@14 main::@15 main::@16 main::@17 main::@4 main::@5 main::@6 main::@8 main::@9 main::@6: scope:[main] from main::@14 main::@15 main::@16 main::@17 main::@4 main::@5 main::@6 main::@8 main::@9
[36] (byte) main::x#10 ← phi( main::@14/(byte) main::x#11 main::@8/(byte) main::x#11 main::@15/(byte) main::x#2 main::@9/(byte) 0 main::@16/(byte) main::x#11 main::@4/(byte) main::x#11 main::@17/(byte) main::x#1 main::@5/(byte) $27 main::@6/(byte) main::x#10 ) [36] (byte) main::x#10 ← phi( main::@14/(byte) main::x#11 main::@8/(byte) main::x#11 main::@15/(byte) main::x#2 main::@9/(byte) 0 main::@16/(byte) main::x#11 main::@4/(byte) main::x#11 main::@17/(byte) main::x#1 main::@5/(byte) $27 main::@6/(byte) main::x#10 )
[36] (byte) main::y#10 ← phi( main::@14/(byte) main::y#2 main::@8/(byte) 0 main::@15/(byte) main::y#11 main::@9/(byte) main::y#11 main::@16/(byte) main::y#1 main::@4/(byte) $18 main::@17/(byte) main::y#11 main::@5/(byte) main::y#11 main::@6/(byte) main::y#10 ) [36] (byte) main::y#10 ← phi( main::@14/(byte) main::y#2 main::@8/(byte) 0 main::@15/(byte) main::y#11 main::@9/(byte) main::y#11 main::@16/(byte) main::y#1 main::@4/(byte) $18 main::@17/(byte) main::y#11 main::@5/(byte) main::y#11 main::@6/(byte) main::y#10 )
[37] if(*((const nomodify byte*) RASTER)!=(byte) $ff) goto main::@6 [37] if(*((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_RASTER_LO)!=(byte) $ff) goto main::@6
to:main::@1 to:main::@1
main::@4: scope:[main] from main::@7 main::@4: scope:[main] from main::@7
[38] (byte) main::y#1 ← ++ (byte) main::y#11 [38] (byte) main::y#1 ← ++ (byte) main::y#11
@ -111,7 +111,7 @@ rand::@return: scope:[rand] from rand
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) (void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
memset: scope:[memset] from main main::@10 main::@11 memset: scope:[memset] from main main::@10 main::@11
[57] (byte) memset::c#5 ← phi( main/(byte) $a0 main::@10/(byte) 0 main::@11/(byte) 0 ) [57] (byte) memset::c#5 ← phi( main/(byte) $a0 main::@10/(byte) 0 main::@11/(byte) 0 )
[57] (void*) memset::str#4 ← phi( main/(void*)(const nomodify byte*) SCREEN main::@10/(void*)(const nomodify byte*) COLORRAM main::@11/(void*)(const byte*) COUNT ) [57] (void*) memset::str#4 ← phi( main/(void*)(const nomodify byte*) DEFAULT_SCREEN main::@10/(void*)(const nomodify byte*) DEFAULT_COLORRAM main::@11/(void*)(const byte*) VISITS )
to:memset::@1 to:memset::@1
memset::@1: scope:[memset] from memset memset::@1: scope:[memset] from memset
[58] (byte*) memset::end#0 ← (byte*)(void*) memset::str#4 + (word) $3e8 [58] (byte*) memset::end#0 ← (byte*)(void*) memset::str#4 + (word) $3e8

View File

@ -1,4 +1,7 @@
Loading link script "plus4.ld" Loading link script "plus4.ld"
Fixing struct type size struct MOS7360_TED to 63
Fixing struct type SIZE_OF struct MOS7360_TED to 63
Fixing struct type SIZE_OF struct MOS7360_TED to 63
CONTROL FLOW GRAPH SSA CONTROL FLOW GRAPH SSA
@begin: scope:[] from @begin: scope:[] from
@ -73,7 +76,7 @@ rand::@return: scope:[rand] from rand
(void()) main() (void()) main()
main: scope:[main] from @2 main: scope:[main] from @2
(word) rand_state#30 ← phi( @2/(word) rand_state#15 ) (word) rand_state#30 ← phi( @2/(word) rand_state#15 )
(void*) memset::str#0 ← (void*)(const nomodify byte*) SCREEN (void*) memset::str#0 ← (void*)(const nomodify byte*) DEFAULT_SCREEN
(byte) memset::c#0 ← (number) $a0 (byte) memset::c#0 ← (number) $a0
(word) memset::num#0 ← (number) $3e8 (word) memset::num#0 ← (number) $3e8
call memset call memset
@ -81,7 +84,7 @@ main: scope:[main] from @2
to:main::@14 to:main::@14
main::@14: scope:[main] from main main::@14: scope:[main] from main
(word) rand_state#27 ← phi( main/(word) rand_state#30 ) (word) rand_state#27 ← phi( main/(word) rand_state#30 )
(void*) memset::str#1 ← (void*)(const nomodify byte*) COLORRAM (void*) memset::str#1 ← (void*)(const nomodify byte*) DEFAULT_COLORRAM
(byte) memset::c#1 ← (number) 0 (byte) memset::c#1 ← (number) 0
(word) memset::num#1 ← (number) $3e8 (word) memset::num#1 ← (number) $3e8
call memset call memset
@ -89,7 +92,7 @@ main::@14: scope:[main] from main
to:main::@15 to:main::@15
main::@15: scope:[main] from main::@14 main::@15: scope:[main] from main::@14
(word) rand_state#18 ← phi( main::@14/(word) rand_state#27 ) (word) rand_state#18 ← phi( main::@14/(word) rand_state#27 )
(void*) memset::str#2 ← (void*)(const byte*) COUNT (void*) memset::str#2 ← (void*)(const byte*) VISITS
(byte) memset::c#2 ← (number) 0 (byte) memset::c#2 ← (number) 0
(word) memset::num#2 ← (number) $3e8 (word) memset::num#2 ← (number) $3e8
call memset call memset
@ -97,8 +100,8 @@ main::@15: scope:[main] from main::@14
to:main::@16 to:main::@16
main::@16: scope:[main] from main::@15 main::@16: scope:[main] from main::@15
(word) rand_state#16 ← phi( main::@15/(word) rand_state#18 ) (word) rand_state#16 ← phi( main::@15/(word) rand_state#18 )
*((const nomodify byte*) BORDERCOLOR) ← (number) 0 *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR) ← (number) 0
*((const nomodify byte*) BGCOLOR) ← (number) 0 *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR) ← (number) 0
(byte) main::x#0 ← (byte) $14 (byte) main::x#0 ← (byte) $14
(byte) main::y#0 ← (byte) $c (byte) main::y#0 ← (byte) $c
to:main::@1 to:main::@1
@ -117,11 +120,11 @@ main::@2: scope:[main] from main::@1
(number~) main::$3 ← (word~) main::$24 * (number) $28 (number~) main::$3 ← (word~) main::$24 * (number) $28
(number~) main::$4 ← (number~) main::$3 + (byte) main::x#5 (number~) main::$4 ← (number~) main::$3 + (byte) main::x#5
(word) main::offset#0 ← (number~) main::$4 (word) main::offset#0 ← (number~) main::$4
(byte*~) main::$5 ← (const byte*) COUNT + (word) main::offset#0 (byte*~) main::$5 ← (const byte*) VISITS + (word) main::offset#0
*((byte*~) main::$5) ← ++ *((byte*~) main::$5) *((byte*~) main::$5) ← ++ *((byte*~) main::$5)
(byte*~) main::$6 ← (const byte*) COUNT + (word) main::offset#0 (byte*~) main::$6 ← (const byte*) VISITS + (word) main::offset#0
(byte) main::cnt#0 ← *((byte*~) main::$6) (byte) main::cnt#0 ← *((byte*~) main::$6)
(byte*~) main::$8 ← (const nomodify byte*) COLORRAM + (word) main::offset#0 (byte*~) main::$8 ← (const nomodify byte*) DEFAULT_COLORRAM + (word) main::offset#0
(number~) main::$9 ← (byte) main::cnt#0 & (number) $f (number~) main::$9 ← (byte) main::cnt#0 & (number) $f
*((byte*~) main::$8) ← *((const byte*) FADE + (number~) main::$9) *((byte*~) main::$8) ← *((const byte*) FADE + (number~) main::$9)
call rand call rand
@ -218,7 +221,7 @@ main::@8: scope:[main] from main::@10 main::@11 main::@12 main::@13 main::@4 ma
(word) rand_state#17 ← phi( main::@10/(word) rand_state#19 main::@11/(word) rand_state#20 main::@12/(word) rand_state#21 main::@13/(word) rand_state#22 main::@4/(word) rand_state#23 main::@5/(word) rand_state#24 main::@6/(word) rand_state#25 main::@7/(word) rand_state#26 main::@8/(word) rand_state#17 ) (word) rand_state#17 ← phi( main::@10/(word) rand_state#19 main::@11/(word) rand_state#20 main::@12/(word) rand_state#21 main::@13/(word) rand_state#22 main::@4/(word) rand_state#23 main::@5/(word) rand_state#24 main::@6/(word) rand_state#25 main::@7/(word) rand_state#26 main::@8/(word) rand_state#17 )
(byte) main::x#10 ← phi( main::@10/(byte) main::x#12 main::@11/(byte) main::x#13 main::@12/(byte) main::x#2 main::@13/(byte) main::x#3 main::@4/(byte) main::x#14 main::@5/(byte) main::x#15 main::@6/(byte) main::x#1 main::@7/(byte) main::x#4 main::@8/(byte) main::x#10 ) (byte) main::x#10 ← phi( main::@10/(byte) main::x#12 main::@11/(byte) main::x#13 main::@12/(byte) main::x#2 main::@13/(byte) main::x#3 main::@4/(byte) main::x#14 main::@5/(byte) main::x#15 main::@6/(byte) main::x#1 main::@7/(byte) main::x#4 main::@8/(byte) main::x#10 )
(byte) main::y#10 ← phi( main::@10/(byte) main::y#2 main::@11/(byte) main::y#3 main::@12/(byte) main::y#12 main::@13/(byte) main::y#13 main::@4/(byte) main::y#1 main::@5/(byte) main::y#4 main::@6/(byte) main::y#14 main::@7/(byte) main::y#15 main::@8/(byte) main::y#10 ) (byte) main::y#10 ← phi( main::@10/(byte) main::y#2 main::@11/(byte) main::y#3 main::@12/(byte) main::y#12 main::@13/(byte) main::y#13 main::@4/(byte) main::y#1 main::@5/(byte) main::y#4 main::@6/(byte) main::y#14 main::@7/(byte) main::y#15 main::@8/(byte) main::y#10 )
(bool~) main::$23 ← *((const nomodify byte*) RASTER) != (number) $ff (bool~) main::$23 ← *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_RASTER_LO) != (number) $ff
if((bool~) main::$23) goto main::@8 if((bool~) main::$23) goto main::@8
to:main::@1 to:main::@1
main::@return: scope:[main] from main::@1 main::@return: scope:[main] from main::@1
@ -242,17 +245,50 @@ SYMBOL TABLE SSA
(label) @3 (label) @3
(label) @begin (label) @begin
(label) @end (label) @end
(const nomodify byte*) BGCOLOR = (byte*)(number) $ff19 (const nomodify byte*) DEFAULT_COLORRAM = (byte*)(number) $800
(const nomodify byte*) BORDERCOLOR = (byte*)(number) $ff15 (const nomodify byte*) DEFAULT_SCREEN = (byte*)(number) $c00
(const nomodify byte*) COLORRAM = (byte*)(number) $800
(const byte*) COUNT[(number) $3e8] = { fill( $3e8, 0) }
(const byte*) FADE[(number) $10] = { (byte) 2, (byte) $12, (byte) $22, (byte) $32, (byte) $42, (byte) $52, (byte) $62, (byte) $72, (byte) $76, (byte) $66, (byte) $56, (byte) $46, (byte) $36, (byte) $26, (byte) $16, (byte) 6 } (const byte*) FADE[(number) $10] = { (byte) 2, (byte) $12, (byte) $22, (byte) $32, (byte) $42, (byte) $52, (byte) $62, (byte) $72, (byte) $76, (byte) $66, (byte) $56, (byte) $46, (byte) $36, (byte) $26, (byte) $16, (byte) 6 }
(byte) MOS7360_TED::BG_COLOR
(byte) MOS7360_TED::BG_COLOR1
(byte) MOS7360_TED::BG_COLOR2
(byte) MOS7360_TED::BG_COLOR3
(byte) MOS7360_TED::BORDER_COLOR
(byte) MOS7360_TED::CH1_FREQ_HI
(byte) MOS7360_TED::CH1_FREQ_LO
(byte) MOS7360_TED::CH2_FREQ_LO
(byte) MOS7360_TED::CHARPOS_HI
(byte) MOS7360_TED::CHARPOS_LO
(byte) MOS7360_TED::CONTROL1
(byte) MOS7360_TED::CONTROL2
(byte) MOS7360_TED::CONTROL5
(word) MOS7360_TED::COUNTER_1
(word) MOS7360_TED::COUNTER_2
(word) MOS7360_TED::COUNTER_3
(byte) MOS7360_TED::CURSOR_HI
(byte) MOS7360_TED::CURSOR_LO
(byte) MOS7360_TED::HSCAN_POS
(byte) MOS7360_TED::IRQ_MASK
(byte) MOS7360_TED::IRQ_REQUEST
(byte) MOS7360_TED::KEYBOARD_INPUT
(byte) MOS7360_TED::MEMORY1
(byte) MOS7360_TED::MEMORY2
(byte) MOS7360_TED::MEMORY3
(byte) MOS7360_TED::RAM_SWITCH
(byte) MOS7360_TED::RASTER_HI
(byte) MOS7360_TED::RASTER_IRQ
(byte) MOS7360_TED::RASTER_LO
(byte) MOS7360_TED::ROM_SWITCH
(byte) MOS7360_TED::SOUND_CONTROL
(const byte*) MOS7360_TED::UNUSED[(number) $1d] = { fill( $1d, 0) }
(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR = (byte) $15
(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR = (byte) $19
(const byte) OFFSET_STRUCT_MOS7360_TED_RASTER_LO = (byte) $1d
(const byte) RADIX::BINARY = (number) 2 (const byte) RADIX::BINARY = (number) 2
(const byte) RADIX::DECIMAL = (number) $a (const byte) RADIX::DECIMAL = (number) $a
(const byte) RADIX::HEXADECIMAL = (number) $10 (const byte) RADIX::HEXADECIMAL = (number) $10
(const byte) RADIX::OCTAL = (number) 8 (const byte) RADIX::OCTAL = (number) 8
(const nomodify byte*) RASTER = (byte*)(number) $ff1d (const nomodify struct MOS7360_TED*) TED = (struct MOS7360_TED*)(number) $ff00
(const nomodify byte*) SCREEN = (byte*)(number) $c00 (const byte*) VISITS[(number) $3e8] = { fill( $3e8, 0) }
(void()) main() (void()) main()
(word~) main::$10 (word~) main::$10
(byte~) main::$11 (byte~) main::$11
@ -445,8 +481,8 @@ Adding number conversion cast (unumber) 0 in (byte) memset::c#1 ← (number) 0
Adding number conversion cast (unumber) $3e8 in (word) memset::num#1 ← (number) $3e8 Adding number conversion cast (unumber) $3e8 in (word) memset::num#1 ← (number) $3e8
Adding number conversion cast (unumber) 0 in (byte) memset::c#2 ← (number) 0 Adding number conversion cast (unumber) 0 in (byte) memset::c#2 ← (number) 0
Adding number conversion cast (unumber) $3e8 in (word) memset::num#2 ← (number) $3e8 Adding number conversion cast (unumber) $3e8 in (word) memset::num#2 ← (number) $3e8
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) BORDERCOLOR) ← (number) 0 Adding number conversion cast (unumber) 0 in *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR) ← (number) 0
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) BGCOLOR) ← (number) 0 Adding number conversion cast (unumber) 0 in *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR) ← (number) 0
Adding number conversion cast (unumber) $28 in (number~) main::$3 ← (word~) main::$24 * (number) $28 Adding number conversion cast (unumber) $28 in (number~) main::$3 ← (word~) main::$24 * (number) $28
Adding number conversion cast (unumber) main::$3 in (number~) main::$3 ← (word~) main::$24 * (unumber)(number) $28 Adding number conversion cast (unumber) main::$3 in (number~) main::$3 ← (word~) main::$24 * (unumber)(number) $28
Adding number conversion cast (unumber) main::$4 in (number~) main::$4 ← (unumber~) main::$3 + (byte) main::x#5 Adding number conversion cast (unumber) main::$4 in (number~) main::$4 ← (unumber~) main::$3 + (byte) main::x#5
@ -469,7 +505,7 @@ Adding number conversion cast (unumber) $28 in (bool~) main::$21 ← (byte) main
Adding number conversion cast (unumber) $ff in (bool~) main::$19 ← (byte) main::x#2 == (number) $ff Adding number conversion cast (unumber) $ff in (bool~) main::$19 ← (byte) main::x#2 == (number) $ff
Adding number conversion cast (unumber) 0 in (byte) main::x#3 ← (number) 0 Adding number conversion cast (unumber) 0 in (byte) main::x#3 ← (number) 0
Adding number conversion cast (unumber) $27 in (byte) main::x#4 ← (number) $27 Adding number conversion cast (unumber) $27 in (byte) main::x#4 ← (number) $27
Adding number conversion cast (unumber) $ff in (bool~) main::$23 ← *((const nomodify byte*) RASTER) != (number) $ff Adding number conversion cast (unumber) $ff in (bool~) main::$23 ← *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_RASTER_LO) != (number) $ff
Successful SSA optimization PassNAddNumberTypeConversions Successful SSA optimization PassNAddNumberTypeConversions
Inlining cast (byte*) memset::dst#0 ← (byte*)(void*) memset::str#4 Inlining cast (byte*) memset::dst#0 ← (byte*)(void*) memset::str#4
Inlining cast (byte) memset::c#0 ← (unumber)(number) $a0 Inlining cast (byte) memset::c#0 ← (unumber)(number) $a0
@ -478,18 +514,16 @@ Inlining cast (byte) memset::c#1 ← (unumber)(number) 0
Inlining cast (word) memset::num#1 ← (unumber)(number) $3e8 Inlining cast (word) memset::num#1 ← (unumber)(number) $3e8
Inlining cast (byte) memset::c#2 ← (unumber)(number) 0 Inlining cast (byte) memset::c#2 ← (unumber)(number) 0
Inlining cast (word) memset::num#2 ← (unumber)(number) $3e8 Inlining cast (word) memset::num#2 ← (unumber)(number) $3e8
Inlining cast *((const nomodify byte*) BORDERCOLOR) ← (unumber)(number) 0 Inlining cast *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR) ← (unumber)(number) 0
Inlining cast *((const nomodify byte*) BGCOLOR) ← (unumber)(number) 0 Inlining cast *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR) ← (unumber)(number) 0
Inlining cast (byte) main::y#3 ← (unumber)(number) 0 Inlining cast (byte) main::y#3 ← (unumber)(number) 0
Inlining cast (byte) main::y#4 ← (unumber)(number) $18 Inlining cast (byte) main::y#4 ← (unumber)(number) $18
Inlining cast (byte) main::x#3 ← (unumber)(number) 0 Inlining cast (byte) main::x#3 ← (unumber)(number) 0
Inlining cast (byte) main::x#4 ← (unumber)(number) $27 Inlining cast (byte) main::x#4 ← (unumber)(number) $27
Successful SSA optimization Pass2InlineCast Successful SSA optimization Pass2InlineCast
Simplifying constant pointer cast (byte*) 3072 Simplifying constant pointer cast (struct MOS7360_TED*) 65280
Simplifying constant pointer cast (byte*) 2048 Simplifying constant pointer cast (byte*) 2048
Simplifying constant pointer cast (byte*) 65305 Simplifying constant pointer cast (byte*) 3072
Simplifying constant pointer cast (byte*) 65301
Simplifying constant pointer cast (byte*) 65309
Simplifying constant integer cast 0 Simplifying constant integer cast 0
Simplifying constant integer cast 7 Simplifying constant integer cast 7
Simplifying constant integer cast 9 Simplifying constant integer cast 9
@ -605,16 +639,16 @@ Simple Condition (bool~) main::$17 [72] if((byte) main::y#1!=(byte) $19) goto ma
Simple Condition (bool~) main::$15 [75] if((byte) main::y#2!=(byte) $ff) goto main::@8 Simple Condition (bool~) main::$15 [75] if((byte) main::y#2!=(byte) $ff) goto main::@8
Simple Condition (bool~) main::$22 [80] if((byte) main::x#1!=(byte) $28) goto main::@8 Simple Condition (bool~) main::$22 [80] if((byte) main::x#1!=(byte) $28) goto main::@8
Simple Condition (bool~) main::$20 [83] if((byte) main::x#2!=(byte) $ff) goto main::@8 Simple Condition (bool~) main::$20 [83] if((byte) main::x#2!=(byte) $ff) goto main::@8
Simple Condition (bool~) main::$23 [88] if(*((const nomodify byte*) RASTER)!=(byte) $ff) goto main::@8 Simple Condition (bool~) main::$23 [88] if(*((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_RASTER_LO)!=(byte) $ff) goto main::@8
Successful SSA optimization Pass2ConditionalJumpSimplification Successful SSA optimization Pass2ConditionalJumpSimplification
Constant (const word) rand_state#0 = 1 Constant (const word) rand_state#0 = 1
Constant (const void*) memset::str#0 = (void*)SCREEN Constant (const void*) memset::str#0 = (void*)DEFAULT_SCREEN
Constant (const byte) memset::c#0 = $a0 Constant (const byte) memset::c#0 = $a0
Constant (const word) memset::num#0 = $3e8 Constant (const word) memset::num#0 = $3e8
Constant (const void*) memset::str#1 = (void*)COLORRAM Constant (const void*) memset::str#1 = (void*)DEFAULT_COLORRAM
Constant (const byte) memset::c#1 = 0 Constant (const byte) memset::c#1 = 0
Constant (const word) memset::num#1 = $3e8 Constant (const word) memset::num#1 = $3e8
Constant (const void*) memset::str#2 = (void*)COUNT Constant (const void*) memset::str#2 = (void*)VISITS
Constant (const byte) memset::c#2 = 0 Constant (const byte) memset::c#2 = 0
Constant (const word) memset::num#2 = $3e8 Constant (const word) memset::num#2 = $3e8
Constant (const byte) main::x#0 = $14 Constant (const byte) main::x#0 = $14
@ -652,9 +686,9 @@ Inlining constant with var siblings (const byte) main::y#4
Inlining constant with var siblings (const byte) main::x#3 Inlining constant with var siblings (const byte) main::x#3
Inlining constant with var siblings (const byte) main::x#4 Inlining constant with var siblings (const byte) main::x#4
Inlining constant with var siblings (const word) rand_state#0 Inlining constant with var siblings (const word) rand_state#0
Constant inlined memset::str#2 = (void*)(const byte*) COUNT Constant inlined memset::str#2 = (void*)(const byte*) VISITS
Constant inlined memset::str#1 = (void*)(const nomodify byte*) COLORRAM Constant inlined memset::str#1 = (void*)(const nomodify byte*) DEFAULT_COLORRAM
Constant inlined memset::str#0 = (void*)(const nomodify byte*) SCREEN Constant inlined memset::str#0 = (void*)(const nomodify byte*) DEFAULT_SCREEN
Constant inlined memset::num#2 = (word) $3e8 Constant inlined memset::num#2 = (word) $3e8
Constant inlined main::x#3 = (byte) 0 Constant inlined main::x#3 = (byte) 0
Constant inlined memset::num#1 = (word) $3e8 Constant inlined memset::num#1 = (word) $3e8
@ -776,8 +810,8 @@ main::@11: scope:[main] from main::@10
[9] call memset [9] call memset
to:main::@12 to:main::@12
main::@12: scope:[main] from main::@11 main::@12: scope:[main] from main::@11
[10] *((const nomodify byte*) BORDERCOLOR) ← (byte) 0 [10] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR) ← (byte) 0
[11] *((const nomodify byte*) BGCOLOR) ← (byte) 0 [11] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR) ← (byte) 0
to:main::@1 to:main::@1
main::@1: scope:[main] from main::@12 main::@6 main::@1: scope:[main] from main::@12 main::@6
[12] (word) rand_state#11 ← phi( main::@12/(word) 1 main::@6/(word) rand_state#3 ) [12] (word) rand_state#11 ← phi( main::@12/(word) 1 main::@6/(word) rand_state#3 )
@ -790,11 +824,11 @@ main::@2: scope:[main] from main::@1
[15] (word~) main::$30 ← (word~) main::$29 + (word~) main::$24 [15] (word~) main::$30 ← (word~) main::$29 + (word~) main::$24
[16] (word~) main::$3 ← (word~) main::$30 << (byte) 3 [16] (word~) main::$3 ← (word~) main::$30 << (byte) 3
[17] (word) main::offset#0 ← (word~) main::$3 + (byte) main::x#11 [17] (word) main::offset#0 ← (word~) main::$3 + (byte) main::x#11
[18] (byte*~) main::$5 ← (const byte*) COUNT + (word) main::offset#0 [18] (byte*~) main::$5 ← (const byte*) VISITS + (word) main::offset#0
[19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5) [19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5)
[20] (byte*~) main::$6 ← (const byte*) COUNT + (word) main::offset#0 [20] (byte*~) main::$6 ← (const byte*) VISITS + (word) main::offset#0
[21] (byte) main::cnt#0 ← *((byte*~) main::$6) [21] (byte) main::cnt#0 ← *((byte*~) main::$6)
[22] (byte*~) main::$8 ← (const nomodify byte*) COLORRAM + (word) main::offset#0 [22] (byte*~) main::$8 ← (const nomodify byte*) DEFAULT_COLORRAM + (word) main::offset#0
[23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f [23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f
[24] *((byte*~) main::$8) ← *((const byte*) FADE + (byte~) main::$9) [24] *((byte*~) main::$8) ← *((const byte*) FADE + (byte~) main::$9)
[25] call rand [25] call rand
@ -820,7 +854,7 @@ main::@14: scope:[main] from main::@8
main::@6: scope:[main] from main::@14 main::@15 main::@16 main::@17 main::@4 main::@5 main::@6 main::@8 main::@9 main::@6: scope:[main] from main::@14 main::@15 main::@16 main::@17 main::@4 main::@5 main::@6 main::@8 main::@9
[36] (byte) main::x#10 ← phi( main::@14/(byte) main::x#11 main::@8/(byte) main::x#11 main::@15/(byte) main::x#2 main::@9/(byte) 0 main::@16/(byte) main::x#11 main::@4/(byte) main::x#11 main::@17/(byte) main::x#1 main::@5/(byte) $27 main::@6/(byte) main::x#10 ) [36] (byte) main::x#10 ← phi( main::@14/(byte) main::x#11 main::@8/(byte) main::x#11 main::@15/(byte) main::x#2 main::@9/(byte) 0 main::@16/(byte) main::x#11 main::@4/(byte) main::x#11 main::@17/(byte) main::x#1 main::@5/(byte) $27 main::@6/(byte) main::x#10 )
[36] (byte) main::y#10 ← phi( main::@14/(byte) main::y#2 main::@8/(byte) 0 main::@15/(byte) main::y#11 main::@9/(byte) main::y#11 main::@16/(byte) main::y#1 main::@4/(byte) $18 main::@17/(byte) main::y#11 main::@5/(byte) main::y#11 main::@6/(byte) main::y#10 ) [36] (byte) main::y#10 ← phi( main::@14/(byte) main::y#2 main::@8/(byte) 0 main::@15/(byte) main::y#11 main::@9/(byte) main::y#11 main::@16/(byte) main::y#1 main::@4/(byte) $18 main::@17/(byte) main::y#11 main::@5/(byte) main::y#11 main::@6/(byte) main::y#10 )
[37] if(*((const nomodify byte*) RASTER)!=(byte) $ff) goto main::@6 [37] if(*((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_RASTER_LO)!=(byte) $ff) goto main::@6
to:main::@1 to:main::@1
main::@4: scope:[main] from main::@7 main::@4: scope:[main] from main::@7
[38] (byte) main::y#1 ← ++ (byte) main::y#11 [38] (byte) main::y#1 ← ++ (byte) main::y#11
@ -865,7 +899,7 @@ rand::@return: scope:[rand] from rand
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) (void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
memset: scope:[memset] from main main::@10 main::@11 memset: scope:[memset] from main main::@10 main::@11
[57] (byte) memset::c#5 ← phi( main/(byte) $a0 main::@10/(byte) 0 main::@11/(byte) 0 ) [57] (byte) memset::c#5 ← phi( main/(byte) $a0 main::@10/(byte) 0 main::@11/(byte) 0 )
[57] (void*) memset::str#4 ← phi( main/(void*)(const nomodify byte*) SCREEN main::@10/(void*)(const nomodify byte*) COLORRAM main::@11/(void*)(const byte*) COUNT ) [57] (void*) memset::str#4 ← phi( main/(void*)(const nomodify byte*) DEFAULT_SCREEN main::@10/(void*)(const nomodify byte*) DEFAULT_COLORRAM main::@11/(void*)(const byte*) VISITS )
to:memset::@1 to:memset::@1
memset::@1: scope:[memset] from memset memset::@1: scope:[memset] from memset
[58] (byte*) memset::end#0 ← (byte*)(void*) memset::str#4 + (word) $3e8 [58] (byte*) memset::end#0 ← (byte*)(void*) memset::str#4 + (word) $3e8
@ -885,6 +919,37 @@ memset::@3: scope:[memset] from memset::@2
VARIABLE REGISTER WEIGHTS VARIABLE REGISTER WEIGHTS
(byte) MOS7360_TED::BG_COLOR
(byte) MOS7360_TED::BG_COLOR1
(byte) MOS7360_TED::BG_COLOR2
(byte) MOS7360_TED::BG_COLOR3
(byte) MOS7360_TED::BORDER_COLOR
(byte) MOS7360_TED::CH1_FREQ_HI
(byte) MOS7360_TED::CH1_FREQ_LO
(byte) MOS7360_TED::CH2_FREQ_LO
(byte) MOS7360_TED::CHARPOS_HI
(byte) MOS7360_TED::CHARPOS_LO
(byte) MOS7360_TED::CONTROL1
(byte) MOS7360_TED::CONTROL2
(byte) MOS7360_TED::CONTROL5
(word) MOS7360_TED::COUNTER_1
(word) MOS7360_TED::COUNTER_2
(word) MOS7360_TED::COUNTER_3
(byte) MOS7360_TED::CURSOR_HI
(byte) MOS7360_TED::CURSOR_LO
(byte) MOS7360_TED::HSCAN_POS
(byte) MOS7360_TED::IRQ_MASK
(byte) MOS7360_TED::IRQ_REQUEST
(byte) MOS7360_TED::KEYBOARD_INPUT
(byte) MOS7360_TED::MEMORY1
(byte) MOS7360_TED::MEMORY2
(byte) MOS7360_TED::MEMORY3
(byte) MOS7360_TED::RAM_SWITCH
(byte) MOS7360_TED::RASTER_HI
(byte) MOS7360_TED::RASTER_IRQ
(byte) MOS7360_TED::RASTER_LO
(byte) MOS7360_TED::ROM_SWITCH
(byte) MOS7360_TED::SOUND_CONTROL
(void()) main() (void()) main()
(word~) main::$10 202.0 (word~) main::$10 202.0
(byte~) main::$12 202.0 (byte~) main::$12 202.0
@ -1046,11 +1111,15 @@ Target platform is custom / MOS6502X
// Global Constants & labels // Global Constants & labels
.label SCREEN = $c00 .const OFFSET_STRUCT_MOS7360_TED_BG_COLOR = $15
.label COLORRAM = $800 .const OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR = $19
.label BGCOLOR = $ff19 .const OFFSET_STRUCT_MOS7360_TED_RASTER_LO = $1d
.label BORDERCOLOR = $ff15 // The TED chip controlling video and sound on the Plus/4 and Commodore 16
.label RASTER = $ff1d .label TED = $ff00
// Default address of screen luminance/color matrix
.label DEFAULT_COLORRAM = $800
// Default address of screen character matrix
.label DEFAULT_SCREEN = $c00
// The random state variable // The random state variable
.label rand_state = $27 .label rand_state = $27
// The random state variable // The random state variable
@ -1099,10 +1168,10 @@ main: {
// [57] phi (byte) memset::c#5 = (byte) $a0 [phi:main->memset#0] -- vbuz1=vbuc1 // [57] phi (byte) memset::c#5 = (byte) $a0 [phi:main->memset#0] -- vbuz1=vbuc1
lda #$a0 lda #$a0
sta.z memset.c sta.z memset.c
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) SCREEN [phi:main->memset#1] -- pvoz1=pvoc1 // [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) DEFAULT_SCREEN [phi:main->memset#1] -- pvoz1=pvoc1
lda #<SCREEN lda #<DEFAULT_SCREEN
sta.z memset.str sta.z memset.str
lda #>SCREEN lda #>DEFAULT_SCREEN
sta.z memset.str+1 sta.z memset.str+1
jsr memset jsr memset
// [6] phi from main to main::@10 [phi:main->main::@10] // [6] phi from main to main::@10 [phi:main->main::@10]
@ -1116,10 +1185,10 @@ main: {
// [57] phi (byte) memset::c#5 = (byte) 0 [phi:main::@10->memset#0] -- vbuz1=vbuc1 // [57] phi (byte) memset::c#5 = (byte) 0 [phi:main::@10->memset#0] -- vbuz1=vbuc1
lda #0 lda #0
sta.z memset.c sta.z memset.c
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) COLORRAM [phi:main::@10->memset#1] -- pvoz1=pvoc1 // [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) DEFAULT_COLORRAM [phi:main::@10->memset#1] -- pvoz1=pvoc1
lda #<COLORRAM lda #<DEFAULT_COLORRAM
sta.z memset.str sta.z memset.str
lda #>COLORRAM lda #>DEFAULT_COLORRAM
sta.z memset.str+1 sta.z memset.str+1
jsr memset jsr memset
// [8] phi from main::@10 to main::@11 [phi:main::@10->main::@11] // [8] phi from main::@10 to main::@11 [phi:main::@10->main::@11]
@ -1133,21 +1202,21 @@ main: {
// [57] phi (byte) memset::c#5 = (byte) 0 [phi:main::@11->memset#0] -- vbuz1=vbuc1 // [57] phi (byte) memset::c#5 = (byte) 0 [phi:main::@11->memset#0] -- vbuz1=vbuc1
lda #0 lda #0
sta.z memset.c sta.z memset.c
// [57] phi (void*) memset::str#4 = (void*)(const byte*) COUNT [phi:main::@11->memset#1] -- pvoz1=pvoc1 // [57] phi (void*) memset::str#4 = (void*)(const byte*) VISITS [phi:main::@11->memset#1] -- pvoz1=pvoc1
lda #<COUNT lda #<VISITS
sta.z memset.str sta.z memset.str
lda #>COUNT lda #>VISITS
sta.z memset.str+1 sta.z memset.str+1
jsr memset jsr memset
jmp __b12 jmp __b12
// main::@12 // main::@12
__b12: __b12:
// [10] *((const nomodify byte*) BORDERCOLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2 // [10] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0 lda #0
sta BORDERCOLOR sta TED+OFFSET_STRUCT_MOS7360_TED_BG_COLOR
// [11] *((const nomodify byte*) BGCOLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2 // [11] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0 lda #0
sta BGCOLOR sta TED+OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR
// [12] phi from main::@12 to main::@1 [phi:main::@12->main::@1] // [12] phi from main::@12 to main::@1 [phi:main::@12->main::@1]
__b1_from___b12: __b1_from___b12:
// [12] phi (word) rand_state#11 = (word) 1 [phi:main::@12->main::@1#0] -- vwuz1=vwuc1 // [12] phi (word) rand_state#11 = (word) 1 [phi:main::@12->main::@1#0] -- vwuz1=vwuc1
@ -1208,13 +1277,13 @@ main: {
lda #0 lda #0
adc.z __3+1 adc.z __3+1
sta.z offset+1 sta.z offset+1
// [18] (byte*~) main::$5 ← (const byte*) COUNT + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2 // [18] (byte*~) main::$5 ← (const byte*) VISITS + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2
lda.z offset lda.z offset
clc clc
adc #<COUNT adc #<VISITS
sta.z __5 sta.z __5
lda.z offset+1 lda.z offset+1
adc #>COUNT adc #>VISITS
sta.z __5+1 sta.z __5+1
// [19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5) -- _deref_pbuz1=_inc__deref_pbuz1 // [19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5) -- _deref_pbuz1=_inc__deref_pbuz1
ldy #0 ldy #0
@ -1223,25 +1292,25 @@ main: {
adc #1 adc #1
ldy #0 ldy #0
sta (__5),y sta (__5),y
// [20] (byte*~) main::$6 ← (const byte*) COUNT + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2 // [20] (byte*~) main::$6 ← (const byte*) VISITS + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2
lda.z offset lda.z offset
clc clc
adc #<COUNT adc #<VISITS
sta.z __6 sta.z __6
lda.z offset+1 lda.z offset+1
adc #>COUNT adc #>VISITS
sta.z __6+1 sta.z __6+1
// [21] (byte) main::cnt#0 ← *((byte*~) main::$6) -- vbuz1=_deref_pbuz2 // [21] (byte) main::cnt#0 ← *((byte*~) main::$6) -- vbuz1=_deref_pbuz2
ldy #0 ldy #0
lda (__6),y lda (__6),y
sta.z cnt sta.z cnt
// [22] (byte*~) main::$8 ← (const nomodify byte*) COLORRAM + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2 // [22] (byte*~) main::$8 ← (const nomodify byte*) DEFAULT_COLORRAM + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2
lda.z offset lda.z offset
clc clc
adc #<COLORRAM adc #<DEFAULT_COLORRAM
sta.z __8 sta.z __8
lda.z offset+1 lda.z offset+1
adc #>COLORRAM adc #>DEFAULT_COLORRAM
sta.z __8+1 sta.z __8+1
// [23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f -- vbuz1=vbuz2_band_vbuc1 // [23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f -- vbuz1=vbuz2_band_vbuc1
lda #$f lda #$f
@ -1321,9 +1390,9 @@ main: {
jmp __b6 jmp __b6
// main::@6 // main::@6
__b6: __b6:
// [37] if(*((const nomodify byte*) RASTER)!=(byte) $ff) goto main::@6 -- _deref_pbuc1_neq_vbuc2_then_la1 // [37] if(*((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_RASTER_LO)!=(byte) $ff) goto main::@6 -- _deref_pbuc1_neq_vbuc2_then_la1
lda #$ff lda #$ff
cmp RASTER cmp TED+OFFSET_STRUCT_MOS7360_TED_RASTER_LO
bne __b6_from___b6 bne __b6_from___b6
// [12] phi from main::@6 to main::@1 [phi:main::@6->main::@1] // [12] phi from main::@6 to main::@1 [phi:main::@6->main::@1]
__b1_from___b6: __b1_from___b6:
@ -1527,12 +1596,14 @@ memset: {
} }
// File Data // File Data
.segment Data .segment Data
// Colors to fade up/down when visiting a char multiple times
FADE: .byte 2, $12, $22, $32, $42, $52, $62, $72, $76, $66, $56, $46, $36, $26, $16, 6 FADE: .byte 2, $12, $22, $32, $42, $52, $62, $72, $76, $66, $56, $46, $36, $26, $16, 6
COUNT: .fill $3e8, 0 // The number of times each character has been visited
VISITS: .fill $3e8, 0
REGISTER UPLIFT POTENTIAL REGISTERS REGISTER UPLIFT POTENTIAL REGISTERS
Statement [10] *((const nomodify byte*) BORDERCOLOR) ← (byte) 0 [ ] ( main:2 [ ] { } ) always clobbers reg byte a Statement [10] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR) ← (byte) 0 [ ] ( main:2 [ ] { } ) always clobbers reg byte a
Statement [11] *((const nomodify byte*) BGCOLOR) ← (byte) 0 [ ] ( main:2 [ ] { } ) always clobbers reg byte a Statement [11] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR) ← (byte) 0 [ ] ( main:2 [ ] { } ) always clobbers reg byte a
Statement [13] (word~) main::$24 ← (word)(byte) main::y#11 [ main::y#11 main::x#11 rand_state#11 main::$24 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$24 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [13] (word~) main::$24 ← (word)(byte) main::y#11 [ main::y#11 main::x#11 rand_state#11 main::$24 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$24 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::y#11 main::y#10 main::y#2 main::y#1 ] Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::y#11 main::y#10 main::y#2 main::y#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::x#11 main::x#10 main::x#2 main::x#1 ] Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::x#11 main::x#10 main::x#2 main::x#1 ]
@ -1540,19 +1611,19 @@ Statement [14] (word~) main::$29 ← (word~) main::$24 << (byte) 2 [ main::y#11
Statement [15] (word~) main::$30 ← (word~) main::$29 + (word~) main::$24 [ main::y#11 main::x#11 rand_state#11 main::$30 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$30 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [15] (word~) main::$30 ← (word~) main::$29 + (word~) main::$24 [ main::y#11 main::x#11 rand_state#11 main::$30 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$30 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [16] (word~) main::$3 ← (word~) main::$30 << (byte) 3 [ main::y#11 main::x#11 rand_state#11 main::$3 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$3 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [16] (word~) main::$3 ← (word~) main::$30 << (byte) 3 [ main::y#11 main::x#11 rand_state#11 main::$3 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$3 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [17] (word) main::offset#0 ← (word~) main::$3 + (byte) main::x#11 [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [17] (word) main::offset#0 ← (word~) main::$3 + (byte) main::x#11 [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [18] (byte*~) main::$5 ← (const byte*) COUNT + (word) main::offset#0 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$5 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$5 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [18] (byte*~) main::$5 ← (const byte*) VISITS + (word) main::offset#0 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$5 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$5 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5) [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a reg byte y Statement [19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5) [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:2 [ main::y#11 main::y#10 main::y#2 main::y#1 ] Removing always clobbered register reg byte y as potential for zp[1]:2 [ main::y#11 main::y#10 main::y#2 main::y#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:3 [ main::x#11 main::x#10 main::x#2 main::x#1 ] Removing always clobbered register reg byte y as potential for zp[1]:3 [ main::x#11 main::x#10 main::x#2 main::x#1 ]
Statement [20] (byte*~) main::$6 ← (const byte*) COUNT + (word) main::offset#0 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$6 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$6 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [20] (byte*~) main::$6 ← (const byte*) VISITS + (word) main::offset#0 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$6 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$6 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [21] (byte) main::cnt#0 ← *((byte*~) main::$6) [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::cnt#0 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::cnt#0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a reg byte y Statement [21] (byte) main::cnt#0 ← *((byte*~) main::$6) [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::cnt#0 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::cnt#0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a reg byte y
Statement [22] (byte*~) main::$8 ← (const nomodify byte*) COLORRAM + (word) main::offset#0 [ main::y#11 main::x#11 rand_state#11 main::cnt#0 main::$8 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::cnt#0 main::$8 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [22] (byte*~) main::$8 ← (const nomodify byte*) DEFAULT_COLORRAM + (word) main::offset#0 [ main::y#11 main::x#11 rand_state#11 main::cnt#0 main::$8 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::cnt#0 main::$8 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:25 [ main::cnt#0 ] Removing always clobbered register reg byte a as potential for zp[1]:25 [ main::cnt#0 ]
Statement [23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f [ main::y#11 main::x#11 rand_state#11 main::$8 main::$9 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$8 main::$9 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f [ main::y#11 main::x#11 rand_state#11 main::$8 main::$9 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$8 main::$9 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [24] *((byte*~) main::$8) ← *((const byte*) FADE + (byte~) main::$9) [ main::y#11 main::x#11 rand_state#11 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a reg byte y Statement [24] *((byte*~) main::$8) ← *((const byte*) FADE + (byte~) main::$9) [ main::y#11 main::x#11 rand_state#11 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a reg byte y
Statement [26] (word) rand::return#2 ← (word) rand::return#0 [ main::y#11 main::x#11 rand_state#3 rand::return#2 ] ( main:2 [ main::y#11 main::x#11 rand_state#3 rand::return#2 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [26] (word) rand::return#2 ← (word) rand::return#0 [ main::y#11 main::x#11 rand_state#3 rand::return#2 ] ( main:2 [ main::y#11 main::x#11 rand_state#3 rand::return#2 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [27] (word~) main::$10 ← (word) rand::return#2 [ main::y#11 main::x#11 rand_state#3 main::$10 ] ( main:2 [ main::y#11 main::x#11 rand_state#3 main::$10 ] { } ) always clobbers reg byte a Statement [27] (word~) main::$10 ← (word) rand::return#2 [ main::y#11 main::x#11 rand_state#3 main::$10 ] ( main:2 [ main::y#11 main::x#11 rand_state#3 main::$10 ] { } ) always clobbers reg byte a
Statement [37] if(*((const nomodify byte*) RASTER)!=(byte) $ff) goto main::@6 [ main::y#10 main::x#10 rand_state#3 ] ( main:2 [ main::y#10 main::x#10 rand_state#3 ] { } ) always clobbers reg byte a Statement [37] if(*((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_RASTER_LO)!=(byte) $ff) goto main::@6 [ main::y#10 main::x#10 rand_state#3 ] ( main:2 [ main::y#10 main::x#10 rand_state#3 ] { } ) always clobbers reg byte a
Statement [49] (word~) rand::$0 ← (word) rand_state#11 << (byte) 7 [ rand_state#11 rand::$0 ] ( main:2::rand:25 [ main::y#11 main::x#11 rand_state#11 rand::$0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [49] (word~) rand::$0 ← (word) rand_state#11 << (byte) 7 [ rand_state#11 rand::$0 ] ( main:2::rand:25 [ main::y#11 main::x#11 rand_state#11 rand::$0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [50] (word) rand_state#1 ← (word) rand_state#11 ^ (word~) rand::$0 [ rand_state#1 ] ( main:2::rand:25 [ main::y#11 main::x#11 rand_state#1 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [50] (word) rand_state#1 ← (word) rand_state#11 ^ (word~) rand::$0 [ rand_state#1 ] ( main:2::rand:25 [ main::y#11 main::x#11 rand_state#1 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [51] (word~) rand::$1 ← (word) rand_state#1 >> (byte) 9 [ rand_state#1 rand::$1 ] ( main:2::rand:25 [ main::y#11 main::x#11 rand_state#1 rand::$1 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [51] (word~) rand::$1 ← (word) rand_state#1 >> (byte) 9 [ rand_state#1 rand::$1 ] ( main:2::rand:25 [ main::y#11 main::x#11 rand_state#1 rand::$1 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
@ -1566,23 +1637,23 @@ Statement [59] (byte*) memset::dst#4 ← (byte*)(void*) memset::str#4 [ memset::
Statement [61] if((byte*) memset::dst#2!=(byte*) memset::end#0) goto memset::@3 [ memset::c#5 memset::end#0 memset::dst#2 ] ( main:2::memset:5 [ memset::c#5 memset::end#0 memset::dst#2 ] { } main:2::memset:7 [ memset::c#5 memset::end#0 memset::dst#2 ] { } main:2::memset:9 [ memset::c#5 memset::end#0 memset::dst#2 ] { } ) always clobbers reg byte a Statement [61] if((byte*) memset::dst#2!=(byte*) memset::end#0) goto memset::@3 [ memset::c#5 memset::end#0 memset::dst#2 ] ( main:2::memset:5 [ memset::c#5 memset::end#0 memset::dst#2 ] { } main:2::memset:7 [ memset::c#5 memset::end#0 memset::dst#2 ] { } main:2::memset:9 [ memset::c#5 memset::end#0 memset::dst#2 ] { } ) always clobbers reg byte a
Statement [63] *((byte*) memset::dst#2) ← (byte) memset::c#5 [ memset::c#5 memset::end#0 memset::dst#2 ] ( main:2::memset:5 [ memset::c#5 memset::end#0 memset::dst#2 ] { } main:2::memset:7 [ memset::c#5 memset::end#0 memset::dst#2 ] { } main:2::memset:9 [ memset::c#5 memset::end#0 memset::dst#2 ] { } ) always clobbers reg byte a reg byte y Statement [63] *((byte*) memset::dst#2) ← (byte) memset::c#5 [ memset::c#5 memset::end#0 memset::dst#2 ] ( main:2::memset:5 [ memset::c#5 memset::end#0 memset::dst#2 ] { } main:2::memset:7 [ memset::c#5 memset::end#0 memset::dst#2 ] { } main:2::memset:9 [ memset::c#5 memset::end#0 memset::dst#2 ] { } ) always clobbers reg byte a reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:8 [ memset::c#5 ] Removing always clobbered register reg byte y as potential for zp[1]:8 [ memset::c#5 ]
Statement [10] *((const nomodify byte*) BORDERCOLOR) ← (byte) 0 [ ] ( main:2 [ ] { } ) always clobbers reg byte a Statement [10] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR) ← (byte) 0 [ ] ( main:2 [ ] { } ) always clobbers reg byte a
Statement [11] *((const nomodify byte*) BGCOLOR) ← (byte) 0 [ ] ( main:2 [ ] { } ) always clobbers reg byte a Statement [11] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR) ← (byte) 0 [ ] ( main:2 [ ] { } ) always clobbers reg byte a
Statement [13] (word~) main::$24 ← (word)(byte) main::y#11 [ main::y#11 main::x#11 rand_state#11 main::$24 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$24 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [13] (word~) main::$24 ← (word)(byte) main::y#11 [ main::y#11 main::x#11 rand_state#11 main::$24 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$24 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [14] (word~) main::$29 ← (word~) main::$24 << (byte) 2 [ main::y#11 main::x#11 rand_state#11 main::$24 main::$29 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$24 main::$29 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [14] (word~) main::$29 ← (word~) main::$24 << (byte) 2 [ main::y#11 main::x#11 rand_state#11 main::$24 main::$29 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$24 main::$29 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [15] (word~) main::$30 ← (word~) main::$29 + (word~) main::$24 [ main::y#11 main::x#11 rand_state#11 main::$30 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$30 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [15] (word~) main::$30 ← (word~) main::$29 + (word~) main::$24 [ main::y#11 main::x#11 rand_state#11 main::$30 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$30 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [16] (word~) main::$3 ← (word~) main::$30 << (byte) 3 [ main::y#11 main::x#11 rand_state#11 main::$3 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$3 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [16] (word~) main::$3 ← (word~) main::$30 << (byte) 3 [ main::y#11 main::x#11 rand_state#11 main::$3 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$3 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [17] (word) main::offset#0 ← (word~) main::$3 + (byte) main::x#11 [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [17] (word) main::offset#0 ← (word~) main::$3 + (byte) main::x#11 [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [18] (byte*~) main::$5 ← (const byte*) COUNT + (word) main::offset#0 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$5 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$5 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [18] (byte*~) main::$5 ← (const byte*) VISITS + (word) main::offset#0 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$5 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$5 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5) [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a reg byte y Statement [19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5) [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a reg byte y
Statement [20] (byte*~) main::$6 ← (const byte*) COUNT + (word) main::offset#0 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$6 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$6 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [20] (byte*~) main::$6 ← (const byte*) VISITS + (word) main::offset#0 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$6 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::$6 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [21] (byte) main::cnt#0 ← *((byte*~) main::$6) [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::cnt#0 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::cnt#0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a reg byte y Statement [21] (byte) main::cnt#0 ← *((byte*~) main::$6) [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::cnt#0 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::offset#0 main::cnt#0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a reg byte y
Statement [22] (byte*~) main::$8 ← (const nomodify byte*) COLORRAM + (word) main::offset#0 [ main::y#11 main::x#11 rand_state#11 main::cnt#0 main::$8 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::cnt#0 main::$8 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [22] (byte*~) main::$8 ← (const nomodify byte*) DEFAULT_COLORRAM + (word) main::offset#0 [ main::y#11 main::x#11 rand_state#11 main::cnt#0 main::$8 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::cnt#0 main::$8 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f [ main::y#11 main::x#11 rand_state#11 main::$8 main::$9 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$8 main::$9 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f [ main::y#11 main::x#11 rand_state#11 main::$8 main::$9 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 main::$8 main::$9 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [24] *((byte*~) main::$8) ← *((const byte*) FADE + (byte~) main::$9) [ main::y#11 main::x#11 rand_state#11 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a reg byte y Statement [24] *((byte*~) main::$8) ← *((const byte*) FADE + (byte~) main::$9) [ main::y#11 main::x#11 rand_state#11 ] ( main:2 [ main::y#11 main::x#11 rand_state#11 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a reg byte y
Statement [26] (word) rand::return#2 ← (word) rand::return#0 [ main::y#11 main::x#11 rand_state#3 rand::return#2 ] ( main:2 [ main::y#11 main::x#11 rand_state#3 rand::return#2 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [26] (word) rand::return#2 ← (word) rand::return#0 [ main::y#11 main::x#11 rand_state#3 rand::return#2 ] ( main:2 [ main::y#11 main::x#11 rand_state#3 rand::return#2 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [27] (word~) main::$10 ← (word) rand::return#2 [ main::y#11 main::x#11 rand_state#3 main::$10 ] ( main:2 [ main::y#11 main::x#11 rand_state#3 main::$10 ] { } ) always clobbers reg byte a Statement [27] (word~) main::$10 ← (word) rand::return#2 [ main::y#11 main::x#11 rand_state#3 main::$10 ] ( main:2 [ main::y#11 main::x#11 rand_state#3 main::$10 ] { } ) always clobbers reg byte a
Statement [37] if(*((const nomodify byte*) RASTER)!=(byte) $ff) goto main::@6 [ main::y#10 main::x#10 rand_state#3 ] ( main:2 [ main::y#10 main::x#10 rand_state#3 ] { } ) always clobbers reg byte a Statement [37] if(*((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_RASTER_LO)!=(byte) $ff) goto main::@6 [ main::y#10 main::x#10 rand_state#3 ] ( main:2 [ main::y#10 main::x#10 rand_state#3 ] { } ) always clobbers reg byte a
Statement [49] (word~) rand::$0 ← (word) rand_state#11 << (byte) 7 [ rand_state#11 rand::$0 ] ( main:2::rand:25 [ main::y#11 main::x#11 rand_state#11 rand::$0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [49] (word~) rand::$0 ← (word) rand_state#11 << (byte) 7 [ rand_state#11 rand::$0 ] ( main:2::rand:25 [ main::y#11 main::x#11 rand_state#11 rand::$0 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [50] (word) rand_state#1 ← (word) rand_state#11 ^ (word~) rand::$0 [ rand_state#1 ] ( main:2::rand:25 [ main::y#11 main::x#11 rand_state#1 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [50] (word) rand_state#1 ← (word) rand_state#11 ^ (word~) rand::$0 [ rand_state#1 ] ( main:2::rand:25 [ main::y#11 main::x#11 rand_state#1 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
Statement [51] (word~) rand::$1 ← (word) rand_state#1 >> (byte) 9 [ rand_state#1 rand::$1 ] ( main:2::rand:25 [ main::y#11 main::x#11 rand_state#1 rand::$1 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a Statement [51] (word~) rand::$1 ← (word) rand_state#1 >> (byte) 9 [ rand_state#1 rand::$1 ] ( main:2::rand:25 [ main::y#11 main::x#11 rand_state#1 rand::$1 ] { { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a
@ -1629,6 +1700,7 @@ Uplift Scope [main] 2,065.4: zp[1]:3 [ main::x#11 main::x#10 main::x#2 main::x#1
Uplift Scope [rand] 2,002: zp[2]:37 [ rand::$0 ] 2,002: zp[2]:41 [ rand::$1 ] 2,002: zp[2]:45 [ rand::$2 ] 367.33: zp[2]:47 [ rand::return#0 ] 202: zp[2]:29 [ rand::return#2 ] Uplift Scope [rand] 2,002: zp[2]:37 [ rand::$0 ] 2,002: zp[2]:41 [ rand::$1 ] 2,002: zp[2]:45 [ rand::$2 ] 367.33: zp[2]:47 [ rand::return#0 ] 202: zp[2]:29 [ rand::return#2 ]
Uplift Scope [memset] 3,572.33: zp[2]:9 [ memset::dst#2 memset::dst#4 memset::dst#1 ] 183.67: zp[2]:49 [ memset::end#0 ] 143: zp[1]:8 [ memset::c#5 ] 0: zp[2]:6 [ memset::str#4 ] Uplift Scope [memset] 3,572.33: zp[2]:9 [ memset::dst#2 memset::dst#4 memset::dst#1 ] 183.67: zp[2]:49 [ memset::end#0 ] 143: zp[1]:8 [ memset::c#5 ] 0: zp[2]:6 [ memset::str#4 ]
Uplift Scope [] 1,501.5: zp[2]:39 [ rand_state#1 ] 1,501.5: zp[2]:43 [ rand_state#2 ] 325.72: zp[2]:4 [ rand_state#11 rand_state#3 ] Uplift Scope [] 1,501.5: zp[2]:39 [ rand_state#1 ] 1,501.5: zp[2]:43 [ rand_state#2 ] 325.72: zp[2]:4 [ rand_state#11 rand_state#3 ]
Uplift Scope [MOS7360_TED]
Uplift Scope [RADIX] Uplift Scope [RADIX]
Uplifting [main] best 8346 combination reg byte x [ main::x#11 main::x#10 main::x#2 main::x#1 ] zp[1]:2 [ main::y#11 main::y#10 main::y#2 main::y#1 ] zp[2]:21 [ main::$5 ] zp[2]:13 [ main::$29 ] zp[2]:15 [ main::$30 ] zp[2]:17 [ main::$3 ] zp[2]:23 [ main::$6 ] reg byte a [ main::$9 ] zp[2]:31 [ main::$10 ] reg byte a [ main::$12 ] reg byte a [ main::$13 ] zp[1]:36 [ main::$18 ] zp[2]:11 [ main::$24 ] zp[1]:33 [ main::rnd#0 ] zp[1]:25 [ main::cnt#0 ] zp[2]:26 [ main::$8 ] zp[2]:19 [ main::offset#0 ] Uplifting [main] best 8346 combination reg byte x [ main::x#11 main::x#10 main::x#2 main::x#1 ] zp[1]:2 [ main::y#11 main::y#10 main::y#2 main::y#1 ] zp[2]:21 [ main::$5 ] zp[2]:13 [ main::$29 ] zp[2]:15 [ main::$30 ] zp[2]:17 [ main::$3 ] zp[2]:23 [ main::$6 ] reg byte a [ main::$9 ] zp[2]:31 [ main::$10 ] reg byte a [ main::$12 ] reg byte a [ main::$13 ] zp[1]:36 [ main::$18 ] zp[2]:11 [ main::$24 ] zp[1]:33 [ main::rnd#0 ] zp[1]:25 [ main::cnt#0 ] zp[2]:26 [ main::$8 ] zp[2]:19 [ main::offset#0 ]
@ -1636,6 +1708,7 @@ Limited combination testing to 100 combinations of 12288 possible.
Uplifting [rand] best 8346 combination zp[2]:37 [ rand::$0 ] zp[2]:41 [ rand::$1 ] zp[2]:45 [ rand::$2 ] zp[2]:47 [ rand::return#0 ] zp[2]:29 [ rand::return#2 ] Uplifting [rand] best 8346 combination zp[2]:37 [ rand::$0 ] zp[2]:41 [ rand::$1 ] zp[2]:45 [ rand::$2 ] zp[2]:47 [ rand::return#0 ] zp[2]:29 [ rand::return#2 ]
Uplifting [memset] best 8327 combination zp[2]:9 [ memset::dst#2 memset::dst#4 memset::dst#1 ] zp[2]:49 [ memset::end#0 ] reg byte x [ memset::c#5 ] zp[2]:6 [ memset::str#4 ] Uplifting [memset] best 8327 combination zp[2]:9 [ memset::dst#2 memset::dst#4 memset::dst#1 ] zp[2]:49 [ memset::end#0 ] reg byte x [ memset::c#5 ] zp[2]:6 [ memset::str#4 ]
Uplifting [] best 8327 combination zp[2]:39 [ rand_state#1 ] zp[2]:43 [ rand_state#2 ] zp[2]:4 [ rand_state#11 rand_state#3 ] Uplifting [] best 8327 combination zp[2]:39 [ rand_state#1 ] zp[2]:43 [ rand_state#2 ] zp[2]:4 [ rand_state#11 rand_state#3 ]
Uplifting [MOS7360_TED] best 8327 combination
Uplifting [RADIX] best 8327 combination Uplifting [RADIX] best 8327 combination
Attempting to uplift remaining variables inzp[1]:2 [ main::y#11 main::y#10 main::y#2 main::y#1 ] Attempting to uplift remaining variables inzp[1]:2 [ main::y#11 main::y#10 main::y#2 main::y#1 ]
Uplifting [main] best 8327 combination zp[1]:2 [ main::y#11 main::y#10 main::y#2 main::y#1 ] Uplifting [main] best 8327 combination zp[1]:2 [ main::y#11 main::y#10 main::y#2 main::y#1 ]
@ -1681,11 +1754,15 @@ ASSEMBLER BEFORE OPTIMIZATION
// Global Constants & labels // Global Constants & labels
.label SCREEN = $c00 .const OFFSET_STRUCT_MOS7360_TED_BG_COLOR = $15
.label COLORRAM = $800 .const OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR = $19
.label BGCOLOR = $ff19 .const OFFSET_STRUCT_MOS7360_TED_RASTER_LO = $1d
.label BORDERCOLOR = $ff15 // The TED chip controlling video and sound on the Plus/4 and Commodore 16
.label RASTER = $ff1d .label TED = $ff00
// Default address of screen luminance/color matrix
.label DEFAULT_COLORRAM = $800
// Default address of screen character matrix
.label DEFAULT_SCREEN = $c00
// The random state variable // The random state variable
.label rand_state = 3 .label rand_state = 3
// @begin // @begin
@ -1722,10 +1799,10 @@ main: {
memset_from_main: memset_from_main:
// [57] phi (byte) memset::c#5 = (byte) $a0 [phi:main->memset#0] -- vbuxx=vbuc1 // [57] phi (byte) memset::c#5 = (byte) $a0 [phi:main->memset#0] -- vbuxx=vbuc1
ldx #$a0 ldx #$a0
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) SCREEN [phi:main->memset#1] -- pvoz1=pvoc1 // [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) DEFAULT_SCREEN [phi:main->memset#1] -- pvoz1=pvoc1
lda #<SCREEN lda #<DEFAULT_SCREEN
sta.z memset.str sta.z memset.str
lda #>SCREEN lda #>DEFAULT_SCREEN
sta.z memset.str+1 sta.z memset.str+1
jsr memset jsr memset
// [6] phi from main to main::@10 [phi:main->main::@10] // [6] phi from main to main::@10 [phi:main->main::@10]
@ -1738,10 +1815,10 @@ main: {
memset_from___b10: memset_from___b10:
// [57] phi (byte) memset::c#5 = (byte) 0 [phi:main::@10->memset#0] -- vbuxx=vbuc1 // [57] phi (byte) memset::c#5 = (byte) 0 [phi:main::@10->memset#0] -- vbuxx=vbuc1
ldx #0 ldx #0
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) COLORRAM [phi:main::@10->memset#1] -- pvoz1=pvoc1 // [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) DEFAULT_COLORRAM [phi:main::@10->memset#1] -- pvoz1=pvoc1
lda #<COLORRAM lda #<DEFAULT_COLORRAM
sta.z memset.str sta.z memset.str
lda #>COLORRAM lda #>DEFAULT_COLORRAM
sta.z memset.str+1 sta.z memset.str+1
jsr memset jsr memset
// [8] phi from main::@10 to main::@11 [phi:main::@10->main::@11] // [8] phi from main::@10 to main::@11 [phi:main::@10->main::@11]
@ -1754,21 +1831,21 @@ main: {
memset_from___b11: memset_from___b11:
// [57] phi (byte) memset::c#5 = (byte) 0 [phi:main::@11->memset#0] -- vbuxx=vbuc1 // [57] phi (byte) memset::c#5 = (byte) 0 [phi:main::@11->memset#0] -- vbuxx=vbuc1
ldx #0 ldx #0
// [57] phi (void*) memset::str#4 = (void*)(const byte*) COUNT [phi:main::@11->memset#1] -- pvoz1=pvoc1 // [57] phi (void*) memset::str#4 = (void*)(const byte*) VISITS [phi:main::@11->memset#1] -- pvoz1=pvoc1
lda #<COUNT lda #<VISITS
sta.z memset.str sta.z memset.str
lda #>COUNT lda #>VISITS
sta.z memset.str+1 sta.z memset.str+1
jsr memset jsr memset
jmp __b12 jmp __b12
// main::@12 // main::@12
__b12: __b12:
// [10] *((const nomodify byte*) BORDERCOLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2 // [10] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0 lda #0
sta BORDERCOLOR sta TED+OFFSET_STRUCT_MOS7360_TED_BG_COLOR
// [11] *((const nomodify byte*) BGCOLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2 // [11] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0 lda #0
sta BGCOLOR sta TED+OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR
// [12] phi from main::@12 to main::@1 [phi:main::@12->main::@1] // [12] phi from main::@12 to main::@1 [phi:main::@12->main::@1]
__b1_from___b12: __b1_from___b12:
// [12] phi (word) rand_state#11 = (word) 1 [phi:main::@12->main::@1#0] -- vwuz1=vwuc1 // [12] phi (word) rand_state#11 = (word) 1 [phi:main::@12->main::@1#0] -- vwuz1=vwuc1
@ -1824,13 +1901,13 @@ main: {
bcc !+ bcc !+
inc.z offset+1 inc.z offset+1
!: !:
// [18] (byte*~) main::$5 ← (const byte*) COUNT + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2 // [18] (byte*~) main::$5 ← (const byte*) VISITS + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2
lda.z offset lda.z offset
clc clc
adc #<COUNT adc #<VISITS
sta.z __5 sta.z __5
lda.z offset+1 lda.z offset+1
adc #>COUNT adc #>VISITS
sta.z __5+1 sta.z __5+1
// [19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5) -- _deref_pbuz1=_inc__deref_pbuz1 // [19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5) -- _deref_pbuz1=_inc__deref_pbuz1
ldy #0 ldy #0
@ -1839,25 +1916,25 @@ main: {
adc #1 adc #1
ldy #0 ldy #0
sta (__5),y sta (__5),y
// [20] (byte*~) main::$6 ← (const byte*) COUNT + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2 // [20] (byte*~) main::$6 ← (const byte*) VISITS + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2
lda.z offset lda.z offset
clc clc
adc #<COUNT adc #<VISITS
sta.z __6 sta.z __6
lda.z offset+1 lda.z offset+1
adc #>COUNT adc #>VISITS
sta.z __6+1 sta.z __6+1
// [21] (byte) main::cnt#0 ← *((byte*~) main::$6) -- vbuyy=_deref_pbuz1 // [21] (byte) main::cnt#0 ← *((byte*~) main::$6) -- vbuyy=_deref_pbuz1
ldy #0 ldy #0
lda (__6),y lda (__6),y
tay tay
// [22] (byte*~) main::$8 ← (const nomodify byte*) COLORRAM + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz1 // [22] (byte*~) main::$8 ← (const nomodify byte*) DEFAULT_COLORRAM + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz1
clc clc
lda.z __8 lda.z __8
adc #<COLORRAM adc #<DEFAULT_COLORRAM
sta.z __8 sta.z __8
lda.z __8+1 lda.z __8+1
adc #>COLORRAM adc #>DEFAULT_COLORRAM
sta.z __8+1 sta.z __8+1
// [23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f -- vbuaa=vbuyy_band_vbuc1 // [23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f -- vbuaa=vbuyy_band_vbuc1
tya tya
@ -1923,9 +2000,9 @@ main: {
jmp __b6 jmp __b6
// main::@6 // main::@6
__b6: __b6:
// [37] if(*((const nomodify byte*) RASTER)!=(byte) $ff) goto main::@6 -- _deref_pbuc1_neq_vbuc2_then_la1 // [37] if(*((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_RASTER_LO)!=(byte) $ff) goto main::@6 -- _deref_pbuc1_neq_vbuc2_then_la1
lda #$ff lda #$ff
cmp RASTER cmp TED+OFFSET_STRUCT_MOS7360_TED_RASTER_LO
bne __b6_from___b6 bne __b6_from___b6
// [12] phi from main::@6 to main::@1 [phi:main::@6->main::@1] // [12] phi from main::@6 to main::@1 [phi:main::@6->main::@1]
__b1_from___b6: __b1_from___b6:
@ -2117,8 +2194,10 @@ memset: {
} }
// File Data // File Data
.segment Data .segment Data
// Colors to fade up/down when visiting a char multiple times
FADE: .byte 2, $12, $22, $32, $42, $52, $62, $72, $76, $66, $56, $46, $36, $26, $16, 6 FADE: .byte 2, $12, $22, $32, $42, $52, $62, $72, $76, $66, $56, $46, $36, $26, $16, 6
COUNT: .fill $3e8, 0 // The number of times each character has been visited
VISITS: .fill $3e8, 0
ASSEMBLER OPTIMIZATIONS ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __b1 Removing instruction jmp __b1
@ -2219,17 +2298,50 @@ FINAL SYMBOL TABLE
(label) @1 (label) @1
(label) @begin (label) @begin
(label) @end (label) @end
(const nomodify byte*) BGCOLOR = (byte*) 65305 (const nomodify byte*) DEFAULT_COLORRAM = (byte*) 2048
(const nomodify byte*) BORDERCOLOR = (byte*) 65301 (const nomodify byte*) DEFAULT_SCREEN = (byte*) 3072
(const nomodify byte*) COLORRAM = (byte*) 2048
(const byte*) COUNT[(number) $3e8] = { fill( $3e8, 0) }
(const byte*) FADE[(number) $10] = { (byte) 2, (byte) $12, (byte) $22, (byte) $32, (byte) $42, (byte) $52, (byte) $62, (byte) $72, (byte) $76, (byte) $66, (byte) $56, (byte) $46, (byte) $36, (byte) $26, (byte) $16, (byte) 6 } (const byte*) FADE[(number) $10] = { (byte) 2, (byte) $12, (byte) $22, (byte) $32, (byte) $42, (byte) $52, (byte) $62, (byte) $72, (byte) $76, (byte) $66, (byte) $56, (byte) $46, (byte) $36, (byte) $26, (byte) $16, (byte) 6 }
(byte) MOS7360_TED::BG_COLOR
(byte) MOS7360_TED::BG_COLOR1
(byte) MOS7360_TED::BG_COLOR2
(byte) MOS7360_TED::BG_COLOR3
(byte) MOS7360_TED::BORDER_COLOR
(byte) MOS7360_TED::CH1_FREQ_HI
(byte) MOS7360_TED::CH1_FREQ_LO
(byte) MOS7360_TED::CH2_FREQ_LO
(byte) MOS7360_TED::CHARPOS_HI
(byte) MOS7360_TED::CHARPOS_LO
(byte) MOS7360_TED::CONTROL1
(byte) MOS7360_TED::CONTROL2
(byte) MOS7360_TED::CONTROL5
(word) MOS7360_TED::COUNTER_1
(word) MOS7360_TED::COUNTER_2
(word) MOS7360_TED::COUNTER_3
(byte) MOS7360_TED::CURSOR_HI
(byte) MOS7360_TED::CURSOR_LO
(byte) MOS7360_TED::HSCAN_POS
(byte) MOS7360_TED::IRQ_MASK
(byte) MOS7360_TED::IRQ_REQUEST
(byte) MOS7360_TED::KEYBOARD_INPUT
(byte) MOS7360_TED::MEMORY1
(byte) MOS7360_TED::MEMORY2
(byte) MOS7360_TED::MEMORY3
(byte) MOS7360_TED::RAM_SWITCH
(byte) MOS7360_TED::RASTER_HI
(byte) MOS7360_TED::RASTER_IRQ
(byte) MOS7360_TED::RASTER_LO
(byte) MOS7360_TED::ROM_SWITCH
(byte) MOS7360_TED::SOUND_CONTROL
(const byte*) MOS7360_TED::UNUSED[(number) $1d] = { fill( $1d, 0) }
(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR = (byte) $15
(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR = (byte) $19
(const byte) OFFSET_STRUCT_MOS7360_TED_RASTER_LO = (byte) $1d
(const byte) RADIX::BINARY = (number) 2 (const byte) RADIX::BINARY = (number) 2
(const byte) RADIX::DECIMAL = (number) $a (const byte) RADIX::DECIMAL = (number) $a
(const byte) RADIX::HEXADECIMAL = (number) $10 (const byte) RADIX::HEXADECIMAL = (number) $10
(const byte) RADIX::OCTAL = (number) 8 (const byte) RADIX::OCTAL = (number) 8
(const nomodify byte*) RASTER = (byte*) 65309 (const nomodify struct MOS7360_TED*) TED = (struct MOS7360_TED*) 65280
(const nomodify byte*) SCREEN = (byte*) 3072 (const byte*) VISITS[(number) $3e8] = { fill( $3e8, 0) }
(void()) main() (void()) main()
(word~) main::$10 zp[2]:13 202.0 (word~) main::$10 zp[2]:13 202.0
(byte~) main::$12 reg byte a 202.0 (byte~) main::$12 reg byte a 202.0
@ -2344,11 +2456,15 @@ Score: 6721
// Global Constants & labels // Global Constants & labels
.label SCREEN = $c00 .const OFFSET_STRUCT_MOS7360_TED_BG_COLOR = $15
.label COLORRAM = $800 .const OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR = $19
.label BGCOLOR = $ff19 .const OFFSET_STRUCT_MOS7360_TED_RASTER_LO = $1d
.label BORDERCOLOR = $ff15 // The TED chip controlling video and sound on the Plus/4 and Commodore 16
.label RASTER = $ff1d .label TED = $ff00
// Default address of screen luminance/color matrix
.label DEFAULT_COLORRAM = $800
// Default address of screen character matrix
.label DEFAULT_SCREEN = $c00
// The random state variable // The random state variable
.label rand_state = 3 .label rand_state = 3
// @begin // @begin
@ -2372,51 +2488,51 @@ main: {
.label y = 2 .label y = 2
.label __29 = 7 .label __29 = 7
.label __30 = 5 .label __30 = 5
// memset(SCREEN, 0xa0, 1000) // memset(DEFAULT_SCREEN, 0xa0, 1000)
// [5] call memset // [5] call memset
// [57] phi from main to memset [phi:main->memset] // [57] phi from main to memset [phi:main->memset]
// [57] phi (byte) memset::c#5 = (byte) $a0 [phi:main->memset#0] -- vbuxx=vbuc1 // [57] phi (byte) memset::c#5 = (byte) $a0 [phi:main->memset#0] -- vbuxx=vbuc1
ldx #$a0 ldx #$a0
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) SCREEN [phi:main->memset#1] -- pvoz1=pvoc1 // [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) DEFAULT_SCREEN [phi:main->memset#1] -- pvoz1=pvoc1
lda #<SCREEN lda #<DEFAULT_SCREEN
sta.z memset.str sta.z memset.str
lda #>SCREEN lda #>DEFAULT_SCREEN
sta.z memset.str+1 sta.z memset.str+1
jsr memset jsr memset
// [6] phi from main to main::@10 [phi:main->main::@10] // [6] phi from main to main::@10 [phi:main->main::@10]
// main::@10 // main::@10
// memset(COLORRAM, 0, 1000) // memset(DEFAULT_COLORRAM, 0, 1000)
// [7] call memset // [7] call memset
// [57] phi from main::@10 to memset [phi:main::@10->memset] // [57] phi from main::@10 to memset [phi:main::@10->memset]
// [57] phi (byte) memset::c#5 = (byte) 0 [phi:main::@10->memset#0] -- vbuxx=vbuc1 // [57] phi (byte) memset::c#5 = (byte) 0 [phi:main::@10->memset#0] -- vbuxx=vbuc1
ldx #0 ldx #0
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) COLORRAM [phi:main::@10->memset#1] -- pvoz1=pvoc1 // [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) DEFAULT_COLORRAM [phi:main::@10->memset#1] -- pvoz1=pvoc1
lda #<COLORRAM lda #<DEFAULT_COLORRAM
sta.z memset.str sta.z memset.str
lda #>COLORRAM lda #>DEFAULT_COLORRAM
sta.z memset.str+1 sta.z memset.str+1
jsr memset jsr memset
// [8] phi from main::@10 to main::@11 [phi:main::@10->main::@11] // [8] phi from main::@10 to main::@11 [phi:main::@10->main::@11]
// main::@11 // main::@11
// memset(COUNT, 0, 1000) // memset(VISITS, 0, 1000)
// [9] call memset // [9] call memset
// [57] phi from main::@11 to memset [phi:main::@11->memset] // [57] phi from main::@11 to memset [phi:main::@11->memset]
// [57] phi (byte) memset::c#5 = (byte) 0 [phi:main::@11->memset#0] -- vbuxx=vbuc1 // [57] phi (byte) memset::c#5 = (byte) 0 [phi:main::@11->memset#0] -- vbuxx=vbuc1
ldx #0 ldx #0
// [57] phi (void*) memset::str#4 = (void*)(const byte*) COUNT [phi:main::@11->memset#1] -- pvoz1=pvoc1 // [57] phi (void*) memset::str#4 = (void*)(const byte*) VISITS [phi:main::@11->memset#1] -- pvoz1=pvoc1
lda #<COUNT lda #<VISITS
sta.z memset.str sta.z memset.str
lda #>COUNT lda #>VISITS
sta.z memset.str+1 sta.z memset.str+1
jsr memset jsr memset
// main::@12 // main::@12
// *BORDERCOLOR = 0 // TED->BG_COLOR = 0
// [10] *((const nomodify byte*) BORDERCOLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2 // [10] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0 lda #0
sta BORDERCOLOR sta TED+OFFSET_STRUCT_MOS7360_TED_BG_COLOR
// *BGCOLOR = 0 // TED->BORDER_COLOR = 0
// [11] *((const nomodify byte*) BGCOLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2 // [11] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2
sta BGCOLOR sta TED+OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR
// [12] phi from main::@12 to main::@1 [phi:main::@12->main::@1] // [12] phi from main::@12 to main::@1 [phi:main::@12->main::@1]
// [12] phi (word) rand_state#11 = (word) 1 [phi:main::@12->main::@1#0] -- vwuz1=vwuc1 // [12] phi (word) rand_state#11 = (word) 1 [phi:main::@12->main::@1#0] -- vwuz1=vwuc1
lda #<1 lda #<1
@ -2470,49 +2586,49 @@ main: {
bcc !+ bcc !+
inc.z offset+1 inc.z offset+1
!: !:
// COUNT+offset // VISITS+offset
// [18] (byte*~) main::$5 ← (const byte*) COUNT + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2 // [18] (byte*~) main::$5 ← (const byte*) VISITS + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2
lda.z offset lda.z offset
clc clc
adc #<COUNT adc #<VISITS
sta.z __5 sta.z __5
lda.z offset+1 lda.z offset+1
adc #>COUNT adc #>VISITS
sta.z __5+1 sta.z __5+1
// cnt = ++*(COUNT+offset) // cnt = ++*(VISITS+offset)
// [19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5) -- _deref_pbuz1=_inc__deref_pbuz1 // [19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5) -- _deref_pbuz1=_inc__deref_pbuz1
ldy #0 ldy #0
lda (__5),y lda (__5),y
clc clc
adc #1 adc #1
sta (__5),y sta (__5),y
// COUNT+offset // VISITS+offset
// [20] (byte*~) main::$6 ← (const byte*) COUNT + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2 // [20] (byte*~) main::$6 ← (const byte*) VISITS + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2
lda.z offset lda.z offset
clc clc
adc #<COUNT adc #<VISITS
sta.z __6 sta.z __6
lda.z offset+1 lda.z offset+1
adc #>COUNT adc #>VISITS
sta.z __6+1 sta.z __6+1
// cnt = ++*(COUNT+offset) // cnt = ++*(VISITS+offset)
// [21] (byte) main::cnt#0 ← *((byte*~) main::$6) -- vbuyy=_deref_pbuz1 // [21] (byte) main::cnt#0 ← *((byte*~) main::$6) -- vbuyy=_deref_pbuz1
lda (__6),y lda (__6),y
tay tay
// COLORRAM+offset // DEFAULT_COLORRAM+offset
// [22] (byte*~) main::$8 ← (const nomodify byte*) COLORRAM + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz1 // [22] (byte*~) main::$8 ← (const nomodify byte*) DEFAULT_COLORRAM + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz1
clc clc
lda.z __8 lda.z __8
adc #<COLORRAM adc #<DEFAULT_COLORRAM
sta.z __8 sta.z __8
lda.z __8+1 lda.z __8+1
adc #>COLORRAM adc #>DEFAULT_COLORRAM
sta.z __8+1 sta.z __8+1
// cnt&0xf // cnt&0xf
// [23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f -- vbuaa=vbuyy_band_vbuc1 // [23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f -- vbuaa=vbuyy_band_vbuc1
tya tya
and #$f and #$f
// *(COLORRAM+offset) = FADE[cnt&0xf] // *(DEFAULT_COLORRAM+offset) = FADE[cnt&0xf]
// [24] *((byte*~) main::$8) ← *((const byte*) FADE + (byte~) main::$9) -- _deref_pbuz1=pbuc1_derefidx_vbuaa // [24] *((byte*~) main::$8) ← *((const byte*) FADE + (byte~) main::$9) -- _deref_pbuz1=pbuc1_derefidx_vbuaa
tay tay
lda FADE,y lda FADE,y
@ -2565,10 +2681,10 @@ main: {
// [36] phi (byte) main::y#10 = (byte) main::y#2 [phi:main::@14/main::@15/main::@16/main::@17/main::@6->main::@6#1] -- register_copy // [36] phi (byte) main::y#10 = (byte) main::y#2 [phi:main::@14/main::@15/main::@16/main::@17/main::@6->main::@6#1] -- register_copy
// main::@6 // main::@6
__b6: __b6:
// while(*RASTER!=0xff) // while(TED->RASTER_LO!=0xff)
// [37] if(*((const nomodify byte*) RASTER)!=(byte) $ff) goto main::@6 -- _deref_pbuc1_neq_vbuc2_then_la1 // [37] if(*((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_RASTER_LO)!=(byte) $ff) goto main::@6 -- _deref_pbuc1_neq_vbuc2_then_la1
lda #$ff lda #$ff
cmp RASTER cmp TED+OFFSET_STRUCT_MOS7360_TED_RASTER_LO
bne __b6 bne __b6
// [12] phi from main::@6 to main::@1 [phi:main::@6->main::@1] // [12] phi from main::@6 to main::@1 [phi:main::@6->main::@1]
// [12] phi (word) rand_state#11 = (word) rand_state#3 [phi:main::@6->main::@1#0] -- register_copy // [12] phi (word) rand_state#11 = (word) rand_state#3 [phi:main::@6->main::@1#0] -- register_copy
@ -2753,6 +2869,8 @@ memset: {
} }
// File Data // File Data
.segment Data .segment Data
// Colors to fade up/down when visiting a char multiple times
FADE: .byte 2, $12, $22, $32, $42, $52, $62, $72, $76, $66, $56, $46, $36, $26, $16, 6 FADE: .byte 2, $12, $22, $32, $42, $52, $62, $72, $76, $66, $56, $46, $36, $26, $16, 6
COUNT: .fill $3e8, 0 // The number of times each character has been visited
VISITS: .fill $3e8, 0

View File

@ -1,17 +1,50 @@
(label) @1 (label) @1
(label) @begin (label) @begin
(label) @end (label) @end
(const nomodify byte*) BGCOLOR = (byte*) 65305 (const nomodify byte*) DEFAULT_COLORRAM = (byte*) 2048
(const nomodify byte*) BORDERCOLOR = (byte*) 65301 (const nomodify byte*) DEFAULT_SCREEN = (byte*) 3072
(const nomodify byte*) COLORRAM = (byte*) 2048
(const byte*) COUNT[(number) $3e8] = { fill( $3e8, 0) }
(const byte*) FADE[(number) $10] = { (byte) 2, (byte) $12, (byte) $22, (byte) $32, (byte) $42, (byte) $52, (byte) $62, (byte) $72, (byte) $76, (byte) $66, (byte) $56, (byte) $46, (byte) $36, (byte) $26, (byte) $16, (byte) 6 } (const byte*) FADE[(number) $10] = { (byte) 2, (byte) $12, (byte) $22, (byte) $32, (byte) $42, (byte) $52, (byte) $62, (byte) $72, (byte) $76, (byte) $66, (byte) $56, (byte) $46, (byte) $36, (byte) $26, (byte) $16, (byte) 6 }
(byte) MOS7360_TED::BG_COLOR
(byte) MOS7360_TED::BG_COLOR1
(byte) MOS7360_TED::BG_COLOR2
(byte) MOS7360_TED::BG_COLOR3
(byte) MOS7360_TED::BORDER_COLOR
(byte) MOS7360_TED::CH1_FREQ_HI
(byte) MOS7360_TED::CH1_FREQ_LO
(byte) MOS7360_TED::CH2_FREQ_LO
(byte) MOS7360_TED::CHARPOS_HI
(byte) MOS7360_TED::CHARPOS_LO
(byte) MOS7360_TED::CONTROL1
(byte) MOS7360_TED::CONTROL2
(byte) MOS7360_TED::CONTROL5
(word) MOS7360_TED::COUNTER_1
(word) MOS7360_TED::COUNTER_2
(word) MOS7360_TED::COUNTER_3
(byte) MOS7360_TED::CURSOR_HI
(byte) MOS7360_TED::CURSOR_LO
(byte) MOS7360_TED::HSCAN_POS
(byte) MOS7360_TED::IRQ_MASK
(byte) MOS7360_TED::IRQ_REQUEST
(byte) MOS7360_TED::KEYBOARD_INPUT
(byte) MOS7360_TED::MEMORY1
(byte) MOS7360_TED::MEMORY2
(byte) MOS7360_TED::MEMORY3
(byte) MOS7360_TED::RAM_SWITCH
(byte) MOS7360_TED::RASTER_HI
(byte) MOS7360_TED::RASTER_IRQ
(byte) MOS7360_TED::RASTER_LO
(byte) MOS7360_TED::ROM_SWITCH
(byte) MOS7360_TED::SOUND_CONTROL
(const byte*) MOS7360_TED::UNUSED[(number) $1d] = { fill( $1d, 0) }
(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR = (byte) $15
(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR = (byte) $19
(const byte) OFFSET_STRUCT_MOS7360_TED_RASTER_LO = (byte) $1d
(const byte) RADIX::BINARY = (number) 2 (const byte) RADIX::BINARY = (number) 2
(const byte) RADIX::DECIMAL = (number) $a (const byte) RADIX::DECIMAL = (number) $a
(const byte) RADIX::HEXADECIMAL = (number) $10 (const byte) RADIX::HEXADECIMAL = (number) $10
(const byte) RADIX::OCTAL = (number) 8 (const byte) RADIX::OCTAL = (number) 8
(const nomodify byte*) RASTER = (byte*) 65309 (const nomodify struct MOS7360_TED*) TED = (struct MOS7360_TED*) 65280
(const nomodify byte*) SCREEN = (byte*) 3072 (const byte*) VISITS[(number) $3e8] = { fill( $3e8, 0) }
(void()) main() (void()) main()
(word~) main::$10 zp[2]:13 202.0 (word~) main::$10 zp[2]:13 202.0
(byte~) main::$12 reg byte a 202.0 (byte~) main::$12 reg byte a 202.0