1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-06-28 17:29:44 +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">
<words>
<w>unversioned</w>
<w>xplus</w>
</words>
</dictionary>
</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,
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,
CPU=44, CODESEG=45, DATASEG=46, ENCODING=47, CONST=48, EXTERN=49, EXPORT=50,
ALIGN=51, INLINE=52, VOLATILE=53, STATIC=54, INTERRUPT=55, REGISTER=56,
ADDRESS=57, ADDRESS_ZEROPAGE=58, ADDRESS_MAINMEM=59, FORM_SSA=60, FORM_MA=61,
INTRINSIC=62, CALLING=63, CALLINGCONVENTION=64, VARMODEL=65, IF=66, ELSE=67,
WHILE=68, DO=69, FOR=70, SWITCH=71, RETURN=72, BREAK=73, CONTINUE=74,
ASM=75, DEFAULT=76, CASE=77, STRUCT=78, ENUM=79, SIZEOF=80, TYPEID=81,
DEFINED=82, KICKASM=83, RESOURCE=84, USES=85, CLOBBERS=86, BYTES=87, CYCLES=88,
LOGIC_NOT=89, SIGNEDNESS=90, SIMPLETYPE=91, BOOLEAN=92, KICKASM_BODY=93,
IMPORT=94, INCLUDE=95, PRAGMA=96, DEFINE=97, DEFINE_CONTINUE=98, UNDEF=99,
IFDEF=100, IFNDEF=101, IFIF=102, ELIF=103, IFELSE=104, ENDIF=105, NUMBER=106,
NUMFLOAT=107, BINFLOAT=108, DECFLOAT=109, HEXFLOAT=110, NUMINT=111, BININTEGER=112,
DECINTEGER=113, HEXINTEGER=114, NAME=115, STRING=116, CHAR=117, WS=118,
COMMENT_LINE=119, COMMENT_BLOCK=120, ASM_BYTE=121, ASM_MNEMONIC=122, ASM_IMM=123,
ASM_COLON=124, ASM_COMMA=125, ASM_PAR_BEGIN=126, ASM_PAR_END=127, ASM_BRACKET_BEGIN=128,
ASM_BRACKET_END=129, ASM_DOT=130, ASM_SHIFT_LEFT=131, ASM_SHIFT_RIGHT=132,
ASM_PLUS=133, ASM_MINUS=134, ASM_LESS_THAN=135, ASM_GREATER_THAN=136,
ASM_MULTIPLY=137, ASM_DIVIDE=138, ASM_CURLY_BEGIN=139, ASM_CURLY_END=140,
ASM_NUMBER=141, ASM_NUMFLOAT=142, ASM_BINFLOAT=143, ASM_DECFLOAT=144,
ASM_HEXFLOAT=145, ASM_NUMINT=146, ASM_BININTEGER=147, ASM_DECINTEGER=148,
ASM_HEXINTEGER=149, ASM_CHAR=150, ASM_MULTI_REL=151, ASM_MULTI_NAME=152,
ASM_NAME=153, ASM_WS=154, ASM_COMMENT_LINE=155, ASM_COMMENT_BLOCK=156,
IMPORT_SYSTEMFILE=157, IMPORT_LOCALFILE=158, IMPORT_WS=159, IMPORT_COMMENT_LINE=160,
IMPORT_COMMENT_BLOCK=161, EMULATOR=162;
EMULATOR=44, CPU=45, CODESEG=46, DATASEG=47, ENCODING=48, CONST=49, EXTERN=50,
EXPORT=51, ALIGN=52, INLINE=53, VOLATILE=54, STATIC=55, INTERRUPT=56,
REGISTER=57, ADDRESS=58, ADDRESS_ZEROPAGE=59, ADDRESS_MAINMEM=60, FORM_SSA=61,
FORM_MA=62, INTRINSIC=63, CALLING=64, CALLINGCONVENTION=65, VARMODEL=66,
IF=67, ELSE=68, WHILE=69, DO=70, FOR=71, SWITCH=72, RETURN=73, BREAK=74,
CONTINUE=75, ASM=76, DEFAULT=77, CASE=78, STRUCT=79, ENUM=80, SIZEOF=81,
TYPEID=82, DEFINED=83, KICKASM=84, RESOURCE=85, USES=86, CLOBBERS=87,
BYTES=88, CYCLES=89, LOGIC_NOT=90, SIGNEDNESS=91, SIMPLETYPE=92, BOOLEAN=93,
KICKASM_BODY=94, IMPORT=95, INCLUDE=96, PRAGMA=97, DEFINE=98, DEFINE_CONTINUE=99,
UNDEF=100, IFDEF=101, IFNDEF=102, IFIF=103, ELIF=104, IFELSE=105, ENDIF=106,
NUMBER=107, NUMFLOAT=108, BINFLOAT=109, DECFLOAT=110, HEXFLOAT=111, NUMINT=112,
BININTEGER=113, DECINTEGER=114, HEXINTEGER=115, NAME=116, STRING=117,
CHAR=118, WS=119, COMMENT_LINE=120, COMMENT_BLOCK=121, ASM_BYTE=122, ASM_MNEMONIC=123,
ASM_IMM=124, ASM_COLON=125, ASM_COMMA=126, ASM_PAR_BEGIN=127, ASM_PAR_END=128,
ASM_BRACKET_BEGIN=129, ASM_BRACKET_END=130, ASM_DOT=131, ASM_SHIFT_LEFT=132,
ASM_SHIFT_RIGHT=133, ASM_PLUS=134, ASM_MINUS=135, ASM_LESS_THAN=136, ASM_GREATER_THAN=137,
ASM_MULTIPLY=138, ASM_DIVIDE=139, ASM_CURLY_BEGIN=140, ASM_CURLY_END=141,
ASM_NUMBER=142, ASM_NUMFLOAT=143, ASM_BINFLOAT=144, ASM_DECFLOAT=145,
ASM_HEXFLOAT=146, ASM_NUMINT=147, ASM_BININTEGER=148, ASM_DECINTEGER=149,
ASM_HEXINTEGER=150, ASM_CHAR=151, ASM_MULTI_REL=152, ASM_MULTI_NAME=153,
ASM_NAME=154, ASM_WS=155, ASM_COMMENT_LINE=156, ASM_COMMENT_BLOCK=157,
IMPORT_SYSTEMFILE=158, IMPORT_LOCALFILE=159, IMPORT_WS=160, IMPORT_COMMENT_LINE=161,
IMPORT_COMMENT_BLOCK=162;
public static final int
RULE_file = 0, RULE_asmFile = 1, RULE_declSeq = 2, RULE_declOrImport = 3,
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, "'typedef'", "'reserve'",
"'pc'", "'target'", "'link'", "'cpu'", "'code_seg'", "'data_seg'", "'encoding'",
"'const'", "'extern'", "'export'", "'align'", "'inline'", "'volatile'",
"'static'", "'interrupt'", "'register'", "'__address'", "'__zp'", "'__mem'",
"'__ssa'", "'__ma'", "'__intrinsic'", "'calling'", null, "'var_model'",
"'if'", "'else'", "'while'", "'do'", "'for'", "'switch'", "'return'",
"'break'", "'continue'", "'asm'", "'default'", "'case'", "'struct'",
"'enum'", "'sizeof'", "'typeid'", "'defined'", "'kickasm'", "'resource'",
"'uses'", "'clobbers'", "'bytes'", "'cycles'", "'!'", null, null, null,
null, "'#import'", "'#include'", "'#pragma'", "'#define'", null, "'#undef'",
"'#ifdef'", "'#ifndef'", "'#if'", "'#elif'", "'#else'", "'#endif'", null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, "'.byte'", null, "'#'"
"'pc'", "'target'", "'link'", "'emulator'", "'cpu'", "'code_seg'", "'data_seg'",
"'encoding'", "'const'", "'extern'", "'export'", "'align'", "'inline'",
"'volatile'", "'static'", "'interrupt'", "'register'", "'__address'",
"'__zp'", "'__mem'", "'__ssa'", "'__ma'", "'__intrinsic'", "'calling'",
null, "'var_model'", "'if'", "'else'", "'while'", "'do'", "'for'", "'switch'",
"'return'", "'break'", "'continue'", "'asm'", "'default'", "'case'",
"'struct'", "'enum'", "'sizeof'", "'typeid'", "'defined'", "'kickasm'",
"'resource'", "'uses'", "'clobbers'", "'bytes'", "'cycles'", "'!'", null,
null, null, null, "'#import'", "'#include'", "'#pragma'", "'#define'",
null, "'#undef'", "'#ifdef'", "'#ifndef'", "'#if'", "'#elif'", "'#else'",
"'#endif'", null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, "'.byte'", null, "'#'"
};
}
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",
"EQUAL", "NOT_EQUAL", "LESS_THAN", "LESS_THAN_EQUAL", "GREATER_THAN_EQUAL",
"GREATER_THAN", "LOGIC_AND", "LOGIC_OR", "ASSIGN", "ASSIGN_COMPOUND",
"TYPEDEF", "RESERVE", "PC", "TARGET", "LINK", "CPU", "CODESEG", "DATASEG",
"ENCODING", "CONST", "EXTERN", "EXPORT", "ALIGN", "INLINE", "VOLATILE",
"STATIC", "INTERRUPT", "REGISTER", "ADDRESS", "ADDRESS_ZEROPAGE", "ADDRESS_MAINMEM",
"FORM_SSA", "FORM_MA", "INTRINSIC", "CALLING", "CALLINGCONVENTION", "VARMODEL",
"IF", "ELSE", "WHILE", "DO", "FOR", "SWITCH", "RETURN", "BREAK", "CONTINUE",
"ASM", "DEFAULT", "CASE", "STRUCT", "ENUM", "SIZEOF", "TYPEID", "DEFINED",
"KICKASM", "RESOURCE", "USES", "CLOBBERS", "BYTES", "CYCLES", "LOGIC_NOT",
"SIGNEDNESS", "SIMPLETYPE", "BOOLEAN", "KICKASM_BODY", "IMPORT", "INCLUDE",
"PRAGMA", "DEFINE", "DEFINE_CONTINUE", "UNDEF", "IFDEF", "IFNDEF", "IFIF",
"ELIF", "IFELSE", "ENDIF", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT",
"HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "NAME",
"STRING", "CHAR", "WS", "COMMENT_LINE", "COMMENT_BLOCK", "ASM_BYTE",
"TYPEDEF", "RESERVE", "PC", "TARGET", "LINK", "EMULATOR", "CPU", "CODESEG",
"DATASEG", "ENCODING", "CONST", "EXTERN", "EXPORT", "ALIGN", "INLINE",
"VOLATILE", "STATIC", "INTERRUPT", "REGISTER", "ADDRESS", "ADDRESS_ZEROPAGE",
"ADDRESS_MAINMEM", "FORM_SSA", "FORM_MA", "INTRINSIC", "CALLING", "CALLINGCONVENTION",
"VARMODEL", "IF", "ELSE", "WHILE", "DO", "FOR", "SWITCH", "RETURN", "BREAK",
"CONTINUE", "ASM", "DEFAULT", "CASE", "STRUCT", "ENUM", "SIZEOF", "TYPEID",
"DEFINED", "KICKASM", "RESOURCE", "USES", "CLOBBERS", "BYTES", "CYCLES",
"LOGIC_NOT", "SIGNEDNESS", "SIMPLETYPE", "BOOLEAN", "KICKASM_BODY", "IMPORT",
"INCLUDE", "PRAGMA", "DEFINE", "DEFINE_CONTINUE", "UNDEF", "IFDEF", "IFNDEF",
"IFIF", "ELIF", "IFELSE", "ENDIF", "NUMBER", "NUMFLOAT", "BINFLOAT",
"DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER",
"NAME", "STRING", "CHAR", "WS", "COMMENT_LINE", "COMMENT_BLOCK", "ASM_BYTE",
"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_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_MULTI_NAME", "ASM_NAME", "ASM_WS", "ASM_COMMENT_LINE", "ASM_COMMENT_BLOCK",
"IMPORT_SYSTEMFILE", "IMPORT_LOCALFILE", "IMPORT_WS", "IMPORT_COMMENT_LINE",
"IMPORT_COMMENT_BLOCK", "EMULATOR"
"IMPORT_COMMENT_BLOCK"
};
}
private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@ -320,7 +320,7 @@ public class KickCParser extends Parser {
setState(103);
_errHandler.sync(this);
_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);
@ -1257,7 +1257,7 @@ public class KickCParser extends Parser {
setState(222);
_errHandler.sync(this);
_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);
expr(0);
@ -1411,7 +1411,7 @@ public class KickCParser extends Parser {
setState(234);
_errHandler.sync(this);
_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);
expr(0);
@ -1778,7 +1778,7 @@ public class KickCParser extends Parser {
setState(262);
_errHandler.sync(this);
_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);
expr(0);
@ -1930,7 +1930,7 @@ public class KickCParser extends Parser {
setState(284);
_errHandler.sync(this);
_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);
match(CURLY_END);
}
@ -2314,7 +2314,7 @@ public class KickCParser extends Parser {
setState(328);
_errHandler.sync(this);
_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);
parameterListDecl();
@ -2391,7 +2391,7 @@ public class KickCParser extends Parser {
setState(337);
_errHandler.sync(this);
_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);
stmtSeq();
@ -3716,7 +3716,7 @@ public class KickCParser extends Parser {
setState(492);
_errHandler.sync(this);
_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) {
@ -4082,7 +4082,7 @@ public class KickCParser extends Parser {
setState(499);
_errHandler.sync(this);
_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);
stmtSeq();
@ -4254,7 +4254,7 @@ public class KickCParser extends Parser {
setState(562);
_errHandler.sync(this);
_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);
commaExpr(0);
@ -4394,7 +4394,7 @@ public class KickCParser extends Parser {
setState(588);
_errHandler.sync(this);
_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);
stmtSeq();
@ -4461,7 +4461,7 @@ public class KickCParser extends Parser {
setState(596);
_errHandler.sync(this);
_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);
stmtSeq();
@ -4579,7 +4579,7 @@ public class KickCParser extends Parser {
setState(603);
_errHandler.sync(this);
_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);
commaExpr(0);
@ -4595,7 +4595,7 @@ public class KickCParser extends Parser {
setState(612);
_errHandler.sync(this);
_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);
declType();
@ -4706,7 +4706,7 @@ public class KickCParser extends Parser {
setState(623);
_errHandler.sync(this);
_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);
declVariables();
@ -5917,7 +5917,7 @@ public class KickCParser extends Parser {
setState(751);
_errHandler.sync(this);
_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);
parameterList();
@ -6461,7 +6461,7 @@ public class KickCParser extends Parser {
setState(811);
_errHandler.sync(this);
_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);
@ -7222,7 +7222,7 @@ public class KickCParser extends Parser {
_prevctx = _localctx;
setState(868);
_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);
}
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"+
"\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"+
"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"+
"\22\23\3\2\37$\3\2\u0087\u008a\3\2\u0085\u0086\3\2\u008b\u008c\3\2\u0087"+
"\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"+
"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\22\23\3\2\37$\3\2\u0088\u008b\3\2\u0086\u0087\3\2\u008c\u008d\3\2\u0088"+
"\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"+
"\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"+
@ -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"+
"\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\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{|\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"+
@ -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"+
"\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"+
"\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"+
"\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"+
"\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"+
"\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"+
"\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"+
@ -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"+
"\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"+
"\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"+
"\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"+
@ -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"+
"\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"+
"\2\u0112\u0110\3\2\2\2\u0113\u0114\7P\2\2\u0114\u0115\7u\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\u0112\u0110\3\2\2\2\u0113\u0114\7Q\2\2\u0114\u0115\7v\2\2\u0115!\3"+
"\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$"+
"\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"+
"\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"+
"\7u\2\2\u012a\u0129\3\2\2\2\u012a\u012b\3\2\2\2\u012b\u012c\3\2\2\2\u012c"+
"R\2\2\u0126\u0127\7v\2\2\u0127\'\3\2\2\2\u0128\u012a\7R\2\2\u0129\u012b"+
"\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"+
"\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"+
"\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"+
"\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"+
"\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"+
"\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"+
@ -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"+
"\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"+
"\2\2\u0165\u0163\3\2\2\2\u0166\u0167\7u\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"+
"\2\2\u016a\u0169\3\2\2\2\u016b\65\3\2\2\2\u016c\u016d\7b\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"+
"\u0172\7\f\2\2\u0172\u0174\7l\2\2\u0173\u0171\3\2\2\2\u0174\u0177\3\2"+
"\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"+
"\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\7m\2\2\u0171"+
"\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"+
"\u0175\3\2\2\2\u0178\u01bd\7\t\2\2\u0179\u017a\7b\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"+
"\7\t\2\2\u017f\u0180\7b\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"+
"\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"+
"\u018e\3\2\2\2\u018e\u018f\7\b\2\2\u018f\u0190\7v\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"+
"\u0195\7\b\2\2\u0195\u0196\7v\2\2\u0196\u01bd\7\t\2\2\u0197\u0198\7b\2"+
"\2\u0198\u0199\7/\2\2\u0199\u019a\3\2\2\2\u019a\u019b\7\b\2\2\u019b\u019c"+
"\7u\2\2\u019c\u01bd\7\t\2\2\u019d\u019e\7b\2\2\u019e\u019f\7\60\2\2\u019f"+
"\u01a0\3\2\2\2\u01a0\u01a1\7\b\2\2\u01a1\u01a2\7u\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"+
"\u01a7\7\b\2\2\u01a7\u01a8\7u\2\2\u01a8\u01bd\7\t\2\2\u01a9\u01aa\7b\2"+
"\2\u01aa\u01ab\7A\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"+
"\u01b2\3\2\2\2\u01b2\u01b3\7\b\2\2\u01b3\u01b8\7u\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"+
"\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\7m\2\2\u017e\u01bd"+
"\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\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"+
"\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\7w\2\2\u0190\u01bd\7\t"+
"\2\2\u0191\u0192\7c\2\2\u0192\u0193\7.\2\2\u0193\u0194\3\2\2\2\u0194\u0195"+
"\7\b\2\2\u0195\u0196\7w\2\2\u0196\u01bd\7\t\2\2\u0197\u0198\7c\2\2\u0198"+
"\u0199\7\60\2\2\u0199\u019a\3\2\2\2\u019a\u019b\7\b\2\2\u019b\u019c\7"+
"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\7v\2\2\u01a2\u01bd\7\t"+
"\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\7v\2\2\u01a8\u01bd\7\t\2\2\u01a9\u01aa\7c\2"+
"\2\u01aa\u01ab\7B\2\2\u01ab\u01ac\3\2\2\2\u01ac\u01ad\7\b\2\2\u01ad\u01ae"+
"\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\7v\2\2\u01b4\u01b5\7\f"+
"\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"+
"\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"+
"\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"+
"\2\u01bf\u01c0\7\65\2\2\u01c0\u01c1\7\b\2\2\u01c1\u01c2\7l\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"+
"\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\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\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"+
"\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"+
"\u01ea\78\2\2\u01d1\u01ea\7>\2\2\u01d2\u01ea\7?\2\2\u01d3\u01ea\7\63\2"+
"\2\u01d4\u01ea\7\64\2\2\u01d5\u01ea\7\66\2\2\u01d6\u01ea\7@\2\2\u01d7"+
"\u01db\79\2\2\u01d8\u01d9\7\b\2\2\u01d9\u01da\7u\2\2\u01da\u01dc\7\t\2"+
"\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\7m\2\2\u01ce\u01ea\7\t\2\2\u01cf\u01ea\78\2\2\u01d0"+
"\u01ea\79\2\2\u01d1\u01ea\7?\2\2\u01d2\u01ea\7@\2\2\u01d3\u01ea\7\64\2"+
"\2\u01d4\u01ea\7\65\2\2\u01d5\u01ea\7\67\2\2\u01d6\u01ea\7A\2\2\u01d7"+
"\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"+
"\7*\2\2\u01de\u01df\7\b\2\2\u01df\u01e4\7l\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"+
"\7*\2\2\u01de\u01df\7\b\2\2\u01df\u01e4\7m\2\2\u01e0\u01e1\7\f\2\2\u01e1"+
"\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"+
"\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"+
"\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"+
@ -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"+
"\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"+
"\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"+
"\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"+
"\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"+
"\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"+
"\2\2\u0217\u0218\5<\37\2\u0218\u0219\7F\2\2\u0219\u021a\7\b\2\2\u021a"+
"\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\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"+
"\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"+
"\u0225\7H\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"+
"\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\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"+
"\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"+
"\3\2\2\2\u0236\u0245\7\n\2\2\u0237\u0238\7K\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"+
"\3\2\2\2\u0236\u0245\7\n\2\2\u0237\u0238\7L\2\2\u0238\u0245\7\n\2\2\u0239"+
"\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"+
"\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"+
"\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"+
"\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"+
"\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"+
"\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"+
"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"+
"\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"+
"\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"+
"\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"+
@ -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"+
"\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"+
"\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"+
"\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"+
"\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"+
"\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"+
"\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"+
@ -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"+
"\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"+
"\2\2\u02b4\u02b5\7\5\2\2\u02b5\u02c0\3\2\2\2\u02b6\u02c0\7u\2\2\u02b7"+
"\u02c0\7l\2\2\u02b8\u02ba\7v\2\2\u02b9\u02b8\3\2\2\2\u02ba\u02bb\3\2\2"+
"\2\2\u02b4\u02b5\7\5\2\2\u02b5\u02c0\3\2\2\2\u02b6\u02c0\7v\2\2\u02b7"+
"\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"+
"\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"+
"\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"+
@ -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"+
"\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"+
"\f!\2\2\u02e9\u02ea\7\20\2\2\u02ea\u02fc\7u\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"+
"\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\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"+
"\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"+
@ -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"+
"\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"+
"\3\2\2\2\u0308\u030a\7U\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"+
"\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"+
"\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"+
"\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"+
"\u0329\7u\2\2\u031d\u031e\7X\2\2\u031e\u0329\7v\2\2\u031f\u0320\7Y\2\2"+
"\u0320\u0329\5H%\2\u0321\u0322\7Z\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"+
"O\3\2\2\2\u0319\u031a\7W\2\2\u031a\u0329\7w\2\2\u031b\u031c\7X\2\2\u031c"+
"\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\7[\2\2\u0322\u0329\5H%\2\u0323\u0326\7"+
"+\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"+
"\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"+
"\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"+
"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"+
"\2\2\u0338\u033a\7~\2\2\u0339\u0335\3\2\2\2\u0339\u0337\3\2\2\2\u033a"+
"W\3\2\2\2\u033b\u033d\7|\2\2\u033c\u033e\5\\/\2\u033d\u033c\3\2\2\2\u033d"+
"\u033e\3\2\2\2\u033eY\3\2\2\2\u033f\u0340\7{\2\2\u0340\u0345\5^\60\2\u0341"+
"\u0342\7\177\2\2\u0342\u0344\5^\60\2\u0343\u0341\3\2\2\2\u0344\u0347\3"+
"\2\2\2\u0345\u0343\3\2\2\2\u0345\u0346\3\2\2\2\u0346[\3\2\2\2\u0347\u0345"+
"\3\2\2\2\u0348\u0360\5^\60\2\u0349\u034a\7}\2\2\u034a\u0360\5^\60\2\u034b"+
"\u034c\5^\60\2\u034c\u034d\7\177\2\2\u034d\u034e\7\u009b\2\2\u034e\u0360"+
"\3\2\2\2\u034f\u0350\7\u0080\2\2\u0350\u0351\5^\60\2\u0351\u0352\7\u0081"+
"\2\2\u0352\u0353\7\177\2\2\u0353\u0354\7\u009b\2\2\u0354\u0360\3\2\2\2"+
"\u0355\u0356\7\u0080\2\2\u0356\u0357\5^\60\2\u0357\u0358\7\177\2\2\u0358"+
"\u0359\7\u009b\2\2\u0359\u035a\7\u0081\2\2\u035a\u0360\3\2\2\2\u035b\u035c"+
"\7\u0080\2\2\u035c\u035d\5^\60\2\u035d\u035e\7\u0081\2\2\u035e\u0360\3"+
"\2\2\2\u035f\u0348\3\2\2\2\u035f\u0349\3\2\2\2\u035f\u034b\3\2\2\2\u035f"+
"\u034f\3\2\2\2\u035f\u0355\3\2\2\2\u035f\u035b\3\2\2\2\u0360]\3\2\2\2"+
"\u0361\u0362\b\60\1\2\u0362\u0363\7\u0082\2\2\u0363\u0364\5^\60\2\u0364"+
"\u0365\7\u0083\2\2\u0365\u0370\3\2\2\2\u0366\u0367\t\t\2\2\u0367\u0370"+
"\5^\60\n\u0368\u0370\7\u009b\2\2\u0369\u0370\7\u0099\2\2\u036a\u036b\7"+
"\u008d\2\2\u036b\u036c\7\u009b\2\2\u036c\u0370\7\u008e\2\2\u036d\u0370"+
"\7\u008f\2\2\u036e\u0370\7\u0098\2\2\u036f\u0361\3\2\2\2\u036f\u0366\3"+
"\2\2\2\u036f\u0368\3\2\2\2\u036f\u0369\3\2\2\2\u036f\u036a\3\2\2\2\u036f"+
"\u036d\3\2\2\2\u036f\u036e\3\2\2\2\u0370\u037f\3\2\2\2\u0371\u0372\f\f"+
"\2\2\u0372\u0373\7\u0084\2\2\u0373\u037e\5^\60\r\u0374\u0375\f\13\2\2"+
"\u0375\u0376\t\n\2\2\u0376\u037e\5^\60\f\u0377\u0378\f\t\2\2\u0378\u0379"+
"\t\13\2\2\u0379\u037e\5^\60\n\u037a\u037b\f\b\2\2\u037b\u037c\t\f\2\2"+
"\u037c\u037e\5^\60\t\u037d\u0371\3\2\2\2\u037d\u0374\3\2\2\2\u037d\u0377"+
"\3\2\2\2\u037d\u037a\3\2\2\2\u037e\u0381\3\2\2\2\u037f\u037d\3\2\2\2\u037f"+
"\u0380\3\2\2\2\u0380_\3\2\2\2\u0381\u037f\3\2\2\2Zinv\u0087\u0090\u009a"+
"\u00a0\u00a8\u00af\u00b8\u00bd\u00c3\u00c8\u00cd\u00d4\u00db\u00e0\u00ec"+
"\u00ef\u00f1\u00fc\u0103\u0108\u010e\u0110\u0118\u011e\u012a\u0138\u013e"+
"\u0144\u014a\u014f\u0153\u015c\u0163\u016a\u0175\u01b8\u01bc\u01c7\u01db"+
"\u01e4\u01e9\u01ee\u01f5\u0202\u0207\u0213\u0221\u0234\u023d\u0244\u0249"+
"\u024e\u0250\u0256\u025d\u0263\u0266\u026e\u0271\u0274\u027e\u028a\u0292"+
"\u0298\u029c\u02b1\u02bb\u02bf\u02f1\u02fb\u02fd\u0305\u030a\u0314\u0326"+
"\u0328\u032d\u0333\u0339\u033d\u0345\u035f\u036f\u037d\u037f";
"U\3\2\2\2\u0335\u0336\7\u009c\2\2\u0336\u033a\7\177\2\2\u0337\u0338\7"+
"\u009b\2\2\u0338\u033a\7\177\2\2\u0339\u0335\3\2\2\2\u0339\u0337\3\2\2"+
"\2\u033aW\3\2\2\2\u033b\u033d\7}\2\2\u033c\u033e\5\\/\2\u033d\u033c\3"+
"\2\2\2\u033d\u033e\3\2\2\2\u033eY\3\2\2\2\u033f\u0340\7|\2\2\u0340\u0345"+
"\5^\60\2\u0341\u0342\7\u0080\2\2\u0342\u0344\5^\60\2\u0343\u0341\3\2\2"+
"\2\u0344\u0347\3\2\2\2\u0345\u0343\3\2\2\2\u0345\u0346\3\2\2\2\u0346["+
"\3\2\2\2\u0347\u0345\3\2\2\2\u0348\u0360\5^\60\2\u0349\u034a\7~\2\2\u034a"+
"\u0360\5^\60\2\u034b\u034c\5^\60\2\u034c\u034d\7\u0080\2\2\u034d\u034e"+
"\7\u009c\2\2\u034e\u0360\3\2\2\2\u034f\u0350\7\u0081\2\2\u0350\u0351\5"+
"^\60\2\u0351\u0352\7\u0082\2\2\u0352\u0353\7\u0080\2\2\u0353\u0354\7\u009c"+
"\2\2\u0354\u0360\3\2\2\2\u0355\u0356\7\u0081\2\2\u0356\u0357\5^\60\2\u0357"+
"\u0358\7\u0080\2\2\u0358\u0359\7\u009c\2\2\u0359\u035a\7\u0082\2\2\u035a"+
"\u0360\3\2\2\2\u035b\u035c\7\u0081\2\2\u035c\u035d\5^\60\2\u035d\u035e"+
"\7\u0082\2\2\u035e\u0360\3\2\2\2\u035f\u0348\3\2\2\2\u035f\u0349\3\2\2"+
"\2\u035f\u034b\3\2\2\2\u035f\u034f\3\2\2\2\u035f\u0355\3\2\2\2\u035f\u035b"+
"\3\2\2\2\u0360]\3\2\2\2\u0361\u0362\b\60\1\2\u0362\u0363\7\u0083\2\2\u0363"+
"\u0364\5^\60\2\u0364\u0365\7\u0084\2\2\u0365\u0370\3\2\2\2\u0366\u0367"+
"\t\t\2\2\u0367\u0370\5^\60\n\u0368\u0370\7\u009c\2\2\u0369\u0370\7\u009a"+
"\2\2\u036a\u036b\7\u008e\2\2\u036b\u036c\7\u009c\2\2\u036c\u0370\7\u008f"+
"\2\2\u036d\u0370\7\u0090\2\2\u036e\u0370\7\u0099\2\2\u036f\u0361\3\2\2"+
"\2\u036f\u0366\3\2\2\2\u036f\u0368\3\2\2\2\u036f\u0369\3\2\2\2\u036f\u036a"+
"\3\2\2\2\u036f\u036d\3\2\2\2\u036f\u036e\3\2\2\2\u0370\u037f\3\2\2\2\u0371"+
"\u0372\f\f\2\2\u0372\u0373\7\u0085\2\2\u0373\u037e\5^\60\r\u0374\u0375"+
"\f\13\2\2\u0375\u0376\t\n\2\2\u0376\u037e\5^\60\f\u0377\u0378\f\t\2\2"+
"\u0378\u0379\t\13\2\2\u0379\u037e\5^\60\n\u037a\u037b\f\b\2\2\u037b\u037c"+
"\t\f\2\2\u037c\u037e\5^\60\t\u037d\u0371\3\2\2\2\u037d\u0374\3\2\2\2\u037d"+
"\u0377\3\2\2\2\u037d\u037a\3\2\2\2\u037e\u0381\3\2\2\2\u037f\u037d\3\2"+
"\2\2\u037f\u0380\3\2\2\2\u0380_\3\2\2\2\u0381\u037f\3\2\2\2Zinv\u0087"+
"\u0090\u009a\u00a0\u00a8\u00af\u00b8\u00bd\u00c3\u00c8\u00cd\u00d4\u00db"+
"\u00e0\u00ec\u00ef\u00f1\u00fc\u0103\u0108\u010e\u0110\u0118\u011e\u012a"+
"\u0138\u013e\u0144\u014a\u014f\u0153\u015c\u0163\u016a\u0175\u01b8\u01bc"+
"\u01c7\u01db\u01e4\u01e9\u01ee\u01f5\u0202\u0207\u0213\u0221\u0234\u023d"+
"\u0244\u0249\u024e\u0250\u0256\u025d\u0263\u0266\u026e\u0271\u0274\u027e"+
"\u028a\u0292\u0298\u029c\u02b1\u02bb\u02bf\u02f1\u02fb\u02fd\u0305\u030a"+
"\u0314\u0326\u0328\u032d\u0333\u0339\u033d\u0345\u035f\u036f\u037d\u037f";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

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

View File

@ -9,11 +9,15 @@
.segment Code
.label SCREEN = $c00
.label COLORRAM = $800
.label BGCOLOR = $ff19
.label BORDERCOLOR = $ff15
.label RASTER = $ff1d
.const OFFSET_STRUCT_MOS7360_TED_BG_COLOR = $15
.const OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR = $19
.const OFFSET_STRUCT_MOS7360_TED_RASTER_LO = $1d
// The TED chip controlling video and sound on the Plus/4 and Commodore 16
.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
.label rand_state = 3
__bbegin:
@ -29,32 +33,32 @@ main: {
.label y = 2
.label __29 = 7
.label __30 = 5
// memset(SCREEN, 0xa0, 1000)
// memset(DEFAULT_SCREEN, 0xa0, 1000)
ldx #$a0
lda #<SCREEN
lda #<DEFAULT_SCREEN
sta.z memset.str
lda #>SCREEN
lda #>DEFAULT_SCREEN
sta.z memset.str+1
jsr memset
// memset(COLORRAM, 0, 1000)
// memset(DEFAULT_COLORRAM, 0, 1000)
ldx #0
lda #<COLORRAM
lda #<DEFAULT_COLORRAM
sta.z memset.str
lda #>COLORRAM
lda #>DEFAULT_COLORRAM
sta.z memset.str+1
jsr memset
// memset(COUNT, 0, 1000)
// memset(VISITS, 0, 1000)
ldx #0
lda #<COUNT
lda #<VISITS
sta.z memset.str
lda #>COUNT
lda #>VISITS
sta.z memset.str+1
jsr memset
// *BORDERCOLOR = 0
// TED->BG_COLOR = 0
lda #0
sta BORDERCOLOR
// *BGCOLOR = 0
sta BGCOLOR
sta TED+OFFSET_STRUCT_MOS7360_TED_BG_COLOR
// TED->BORDER_COLOR = 0
sta TED+OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR
lda #<1
sta.z rand_state
lda #>1
@ -97,43 +101,43 @@ main: {
bcc !+
inc.z offset+1
!:
// COUNT+offset
// VISITS+offset
lda.z offset
clc
adc #<COUNT
adc #<VISITS
sta.z __5
lda.z offset+1
adc #>COUNT
adc #>VISITS
sta.z __5+1
// cnt = ++*(COUNT+offset)
// cnt = ++*(VISITS+offset)
ldy #0
lda (__5),y
clc
adc #1
sta (__5),y
// COUNT+offset
// VISITS+offset
lda.z offset
clc
adc #<COUNT
adc #<VISITS
sta.z __6
lda.z offset+1
adc #>COUNT
adc #>VISITS
sta.z __6+1
// cnt = ++*(COUNT+offset)
// cnt = ++*(VISITS+offset)
lda (__6),y
tay
// COLORRAM+offset
// DEFAULT_COLORRAM+offset
clc
lda.z __8
adc #<COLORRAM
adc #<DEFAULT_COLORRAM
sta.z __8
lda.z __8+1
adc #>COLORRAM
adc #>DEFAULT_COLORRAM
sta.z __8+1
// cnt&0xf
tya
and #$f
// *(COLORRAM+offset) = FADE[cnt&0xf]
// *(DEFAULT_COLORRAM+offset) = FADE[cnt&0xf]
tay
lda FADE,y
ldy #0
@ -163,9 +167,9 @@ main: {
lda #0
sta.z y
__b6:
// while(*RASTER!=0xff)
// while(TED->RASTER_LO!=0xff)
lda #$ff
cmp RASTER
cmp TED+OFFSET_STRUCT_MOS7360_TED_RASTER_LO
bne __b6
jmp __b2
__b4:
@ -295,5 +299,7 @@ memset: {
jmp __b2
}
.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
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
to:main::@12
main::@12: scope:[main] from main::@11
[10] *((const nomodify byte*) BORDERCOLOR) ← (byte) 0
[11] *((const nomodify byte*) BGCOLOR) ← (byte) 0
[10] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR) ← (byte) 0
[11] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR) ← (byte) 0
to:main::@1
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 )
@ -36,11 +36,11 @@ main::@2: scope:[main] from main::@1
[15] (word~) main::$30 ← (word~) main::$29 + (word~) main::$24
[16] (word~) main::$3 ← (word~) main::$30 << (byte) 3
[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)
[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)
[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
[24] *((byte*~) main::$8) ← *((const byte*) FADE + (byte~) main::$9)
[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
[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 )
[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
main::@4: scope:[main] from main::@7
[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)
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] (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
memset::@1: scope:[memset] from memset
[58] (byte*) memset::end#0 ← (byte*)(void*) memset::str#4 + (word) $3e8

View File

@ -1,4 +1,7 @@
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
@begin: scope:[] from
@ -73,7 +76,7 @@ rand::@return: scope:[rand] from rand
(void()) main()
main: scope:[main] from @2
(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
(word) memset::num#0 ← (number) $3e8
call memset
@ -81,7 +84,7 @@ main: scope:[main] from @2
to:main::@14
main::@14: scope:[main] from main
(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
(word) memset::num#1 ← (number) $3e8
call memset
@ -89,7 +92,7 @@ main::@14: scope:[main] from main
to:main::@15
main::@15: scope:[main] from main::@14
(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
(word) memset::num#2 ← (number) $3e8
call memset
@ -97,8 +100,8 @@ main::@15: scope:[main] from main::@14
to:main::@16
main::@16: scope:[main] from main::@15
(word) rand_state#16 ← phi( main::@15/(word) rand_state#18 )
*((const nomodify byte*) BORDERCOLOR) ← (number) 0
*((const nomodify byte*) BGCOLOR) ← (number) 0
*((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR) ← (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::y#0 ← (byte) $c
to:main::@1
@ -117,11 +120,11 @@ main::@2: scope:[main] from main::@1
(number~) main::$3 ← (word~) main::$24 * (number) $28
(number~) main::$4 ← (number~) main::$3 + (byte) main::x#5
(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::$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::$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
*((byte*~) main::$8) ← *((const byte*) FADE + (number~) main::$9)
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 )
(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 )
(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
to:main::@1
main::@return: scope:[main] from main::@1
@ -242,17 +245,50 @@ SYMBOL TABLE SSA
(label) @3
(label) @begin
(label) @end
(const nomodify byte*) BGCOLOR = (byte*)(number) $ff19
(const nomodify byte*) BORDERCOLOR = (byte*)(number) $ff15
(const nomodify byte*) COLORRAM = (byte*)(number) $800
(const byte*) COUNT[(number) $3e8] = { fill( $3e8, 0) }
(const nomodify byte*) DEFAULT_COLORRAM = (byte*)(number) $800
(const nomodify byte*) DEFAULT_SCREEN = (byte*)(number) $c00
(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::DECIMAL = (number) $a
(const byte) RADIX::HEXADECIMAL = (number) $10
(const byte) RADIX::OCTAL = (number) 8
(const nomodify byte*) RASTER = (byte*)(number) $ff1d
(const nomodify byte*) SCREEN = (byte*)(number) $c00
(const nomodify struct MOS7360_TED*) TED = (struct MOS7360_TED*)(number) $ff00
(const byte*) VISITS[(number) $3e8] = { fill( $3e8, 0) }
(void()) main()
(word~) main::$10
(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) 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) 0 in *((const nomodify byte*) BORDERCOLOR) ← (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_BG_COLOR) ← (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) 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
@ -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) 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) $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
Inlining cast (byte*) memset::dst#0 ← (byte*)(void*) memset::str#4
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 (byte) memset::c#2 ← (unumber)(number) 0
Inlining cast (word) memset::num#2 ← (unumber)(number) $3e8
Inlining cast *((const nomodify byte*) BORDERCOLOR) ← (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_BG_COLOR) ← (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#4 ← (unumber)(number) $18
Inlining cast (byte) main::x#3 ← (unumber)(number) 0
Inlining cast (byte) main::x#4 ← (unumber)(number) $27
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*) 65305
Simplifying constant pointer cast (byte*) 65301
Simplifying constant pointer cast (byte*) 65309
Simplifying constant pointer cast (byte*) 3072
Simplifying constant integer cast 0
Simplifying constant integer cast 7
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::$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::$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
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 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 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 word) memset::num#2 = $3e8
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#4
Inlining constant with var siblings (const word) rand_state#0
Constant inlined memset::str#2 = (void*)(const byte*) COUNT
Constant inlined memset::str#1 = (void*)(const nomodify byte*) COLORRAM
Constant inlined memset::str#0 = (void*)(const nomodify byte*) SCREEN
Constant inlined memset::str#2 = (void*)(const byte*) VISITS
Constant inlined memset::str#1 = (void*)(const nomodify byte*) DEFAULT_COLORRAM
Constant inlined memset::str#0 = (void*)(const nomodify byte*) DEFAULT_SCREEN
Constant inlined memset::num#2 = (word) $3e8
Constant inlined main::x#3 = (byte) 0
Constant inlined memset::num#1 = (word) $3e8
@ -776,8 +810,8 @@ main::@11: scope:[main] from main::@10
[9] call memset
to:main::@12
main::@12: scope:[main] from main::@11
[10] *((const nomodify byte*) BORDERCOLOR) ← (byte) 0
[11] *((const nomodify byte*) BGCOLOR) ← (byte) 0
[10] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR) ← (byte) 0
[11] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR) ← (byte) 0
to:main::@1
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 )
@ -790,11 +824,11 @@ main::@2: scope:[main] from main::@1
[15] (word~) main::$30 ← (word~) main::$29 + (word~) main::$24
[16] (word~) main::$3 ← (word~) main::$30 << (byte) 3
[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)
[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)
[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
[24] *((byte*~) main::$8) ← *((const byte*) FADE + (byte~) main::$9)
[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
[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 )
[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
main::@4: scope:[main] from main::@7
[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)
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] (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
memset::@1: scope:[memset] from memset
[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
(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()
(word~) main::$10 202.0
(byte~) main::$12 202.0
@ -1046,11 +1111,15 @@ Target platform is custom / MOS6502X
// Global Constants & labels
.label SCREEN = $c00
.label COLORRAM = $800
.label BGCOLOR = $ff19
.label BORDERCOLOR = $ff15
.label RASTER = $ff1d
.const OFFSET_STRUCT_MOS7360_TED_BG_COLOR = $15
.const OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR = $19
.const OFFSET_STRUCT_MOS7360_TED_RASTER_LO = $1d
// The TED chip controlling video and sound on the Plus/4 and Commodore 16
.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
.label rand_state = $27
// The random state variable
@ -1099,10 +1168,10 @@ main: {
// [57] phi (byte) memset::c#5 = (byte) $a0 [phi:main->memset#0] -- vbuz1=vbuc1
lda #$a0
sta.z memset.c
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) SCREEN [phi:main->memset#1] -- pvoz1=pvoc1
lda #<SCREEN
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) DEFAULT_SCREEN [phi:main->memset#1] -- pvoz1=pvoc1
lda #<DEFAULT_SCREEN
sta.z memset.str
lda #>SCREEN
lda #>DEFAULT_SCREEN
sta.z memset.str+1
jsr memset
// [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
lda #0
sta.z memset.c
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) COLORRAM [phi:main::@10->memset#1] -- pvoz1=pvoc1
lda #<COLORRAM
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) DEFAULT_COLORRAM [phi:main::@10->memset#1] -- pvoz1=pvoc1
lda #<DEFAULT_COLORRAM
sta.z memset.str
lda #>COLORRAM
lda #>DEFAULT_COLORRAM
sta.z memset.str+1
jsr memset
// [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
lda #0
sta.z memset.c
// [57] phi (void*) memset::str#4 = (void*)(const byte*) COUNT [phi:main::@11->memset#1] -- pvoz1=pvoc1
lda #<COUNT
// [57] phi (void*) memset::str#4 = (void*)(const byte*) VISITS [phi:main::@11->memset#1] -- pvoz1=pvoc1
lda #<VISITS
sta.z memset.str
lda #>COUNT
lda #>VISITS
sta.z memset.str+1
jsr memset
jmp __b12
// main::@12
__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
sta BORDERCOLOR
// [11] *((const nomodify byte*) BGCOLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2
sta TED+OFFSET_STRUCT_MOS7360_TED_BG_COLOR
// [11] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2
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]
__b1_from___b12:
// [12] phi (word) rand_state#11 = (word) 1 [phi:main::@12->main::@1#0] -- vwuz1=vwuc1
@ -1208,13 +1277,13 @@ main: {
lda #0
adc.z __3+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
clc
adc #<COUNT
adc #<VISITS
sta.z __5
lda.z offset+1
adc #>COUNT
adc #>VISITS
sta.z __5+1
// [19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5) -- _deref_pbuz1=_inc__deref_pbuz1
ldy #0
@ -1223,25 +1292,25 @@ main: {
adc #1
ldy #0
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
clc
adc #<COUNT
adc #<VISITS
sta.z __6
lda.z offset+1
adc #>COUNT
adc #>VISITS
sta.z __6+1
// [21] (byte) main::cnt#0 ← *((byte*~) main::$6) -- vbuz1=_deref_pbuz2
ldy #0
lda (__6),y
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
clc
adc #<COLORRAM
adc #<DEFAULT_COLORRAM
sta.z __8
lda.z offset+1
adc #>COLORRAM
adc #>DEFAULT_COLORRAM
sta.z __8+1
// [23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f -- vbuz1=vbuz2_band_vbuc1
lda #$f
@ -1321,9 +1390,9 @@ main: {
jmp __b6
// main::@6
__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
cmp RASTER
cmp TED+OFFSET_STRUCT_MOS7360_TED_RASTER_LO
bne __b6_from___b6
// [12] phi from main::@6 to main::@1 [phi:main::@6->main::@1]
__b1_from___b6:
@ -1527,12 +1596,14 @@ memset: {
}
// File 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
COUNT: .fill $3e8, 0
// The number of times each character has been visited
VISITS: .fill $3e8, 0
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [10] *((const nomodify byte*) BORDERCOLOR) ← (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 [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] *((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
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 ]
@ -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 [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 [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
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 ]
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 [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 ]
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 [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 [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 [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
@ -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 [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 ]
Statement [10] *((const nomodify byte*) BORDERCOLOR) ← (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 [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] *((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 [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 [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 [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 [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 [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 [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 [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 [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
@ -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 [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 [MOS7360_TED]
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 ]
@ -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 [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 [MOS7360_TED] 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 ]
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
.label SCREEN = $c00
.label COLORRAM = $800
.label BGCOLOR = $ff19
.label BORDERCOLOR = $ff15
.label RASTER = $ff1d
.const OFFSET_STRUCT_MOS7360_TED_BG_COLOR = $15
.const OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR = $19
.const OFFSET_STRUCT_MOS7360_TED_RASTER_LO = $1d
// The TED chip controlling video and sound on the Plus/4 and Commodore 16
.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
.label rand_state = 3
// @begin
@ -1722,10 +1799,10 @@ main: {
memset_from_main:
// [57] phi (byte) memset::c#5 = (byte) $a0 [phi:main->memset#0] -- vbuxx=vbuc1
ldx #$a0
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) SCREEN [phi:main->memset#1] -- pvoz1=pvoc1
lda #<SCREEN
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) DEFAULT_SCREEN [phi:main->memset#1] -- pvoz1=pvoc1
lda #<DEFAULT_SCREEN
sta.z memset.str
lda #>SCREEN
lda #>DEFAULT_SCREEN
sta.z memset.str+1
jsr memset
// [6] phi from main to main::@10 [phi:main->main::@10]
@ -1738,10 +1815,10 @@ main: {
memset_from___b10:
// [57] phi (byte) memset::c#5 = (byte) 0 [phi:main::@10->memset#0] -- vbuxx=vbuc1
ldx #0
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) COLORRAM [phi:main::@10->memset#1] -- pvoz1=pvoc1
lda #<COLORRAM
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) DEFAULT_COLORRAM [phi:main::@10->memset#1] -- pvoz1=pvoc1
lda #<DEFAULT_COLORRAM
sta.z memset.str
lda #>COLORRAM
lda #>DEFAULT_COLORRAM
sta.z memset.str+1
jsr memset
// [8] phi from main::@10 to main::@11 [phi:main::@10->main::@11]
@ -1754,21 +1831,21 @@ main: {
memset_from___b11:
// [57] phi (byte) memset::c#5 = (byte) 0 [phi:main::@11->memset#0] -- vbuxx=vbuc1
ldx #0
// [57] phi (void*) memset::str#4 = (void*)(const byte*) COUNT [phi:main::@11->memset#1] -- pvoz1=pvoc1
lda #<COUNT
// [57] phi (void*) memset::str#4 = (void*)(const byte*) VISITS [phi:main::@11->memset#1] -- pvoz1=pvoc1
lda #<VISITS
sta.z memset.str
lda #>COUNT
lda #>VISITS
sta.z memset.str+1
jsr memset
jmp __b12
// main::@12
__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
sta BORDERCOLOR
// [11] *((const nomodify byte*) BGCOLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2
sta TED+OFFSET_STRUCT_MOS7360_TED_BG_COLOR
// [11] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2
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]
__b1_from___b12:
// [12] phi (word) rand_state#11 = (word) 1 [phi:main::@12->main::@1#0] -- vwuz1=vwuc1
@ -1824,13 +1901,13 @@ main: {
bcc !+
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
clc
adc #<COUNT
adc #<VISITS
sta.z __5
lda.z offset+1
adc #>COUNT
adc #>VISITS
sta.z __5+1
// [19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5) -- _deref_pbuz1=_inc__deref_pbuz1
ldy #0
@ -1839,25 +1916,25 @@ main: {
adc #1
ldy #0
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
clc
adc #<COUNT
adc #<VISITS
sta.z __6
lda.z offset+1
adc #>COUNT
adc #>VISITS
sta.z __6+1
// [21] (byte) main::cnt#0 ← *((byte*~) main::$6) -- vbuyy=_deref_pbuz1
ldy #0
lda (__6),y
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
lda.z __8
adc #<COLORRAM
adc #<DEFAULT_COLORRAM
sta.z __8
lda.z __8+1
adc #>COLORRAM
adc #>DEFAULT_COLORRAM
sta.z __8+1
// [23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f -- vbuaa=vbuyy_band_vbuc1
tya
@ -1923,9 +2000,9 @@ main: {
jmp __b6
// main::@6
__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
cmp RASTER
cmp TED+OFFSET_STRUCT_MOS7360_TED_RASTER_LO
bne __b6_from___b6
// [12] phi from main::@6 to main::@1 [phi:main::@6->main::@1]
__b1_from___b6:
@ -2117,8 +2194,10 @@ memset: {
}
// File 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
COUNT: .fill $3e8, 0
// The number of times each character has been visited
VISITS: .fill $3e8, 0
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __b1
@ -2219,17 +2298,50 @@ FINAL SYMBOL TABLE
(label) @1
(label) @begin
(label) @end
(const nomodify byte*) BGCOLOR = (byte*) 65305
(const nomodify byte*) BORDERCOLOR = (byte*) 65301
(const nomodify byte*) COLORRAM = (byte*) 2048
(const byte*) COUNT[(number) $3e8] = { fill( $3e8, 0) }
(const nomodify byte*) DEFAULT_COLORRAM = (byte*) 2048
(const nomodify byte*) DEFAULT_SCREEN = (byte*) 3072
(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::DECIMAL = (number) $a
(const byte) RADIX::HEXADECIMAL = (number) $10
(const byte) RADIX::OCTAL = (number) 8
(const nomodify byte*) RASTER = (byte*) 65309
(const nomodify byte*) SCREEN = (byte*) 3072
(const nomodify struct MOS7360_TED*) TED = (struct MOS7360_TED*) 65280
(const byte*) VISITS[(number) $3e8] = { fill( $3e8, 0) }
(void()) main()
(word~) main::$10 zp[2]:13 202.0
(byte~) main::$12 reg byte a 202.0
@ -2344,11 +2456,15 @@ Score: 6721
// Global Constants & labels
.label SCREEN = $c00
.label COLORRAM = $800
.label BGCOLOR = $ff19
.label BORDERCOLOR = $ff15
.label RASTER = $ff1d
.const OFFSET_STRUCT_MOS7360_TED_BG_COLOR = $15
.const OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR = $19
.const OFFSET_STRUCT_MOS7360_TED_RASTER_LO = $1d
// The TED chip controlling video and sound on the Plus/4 and Commodore 16
.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
.label rand_state = 3
// @begin
@ -2372,51 +2488,51 @@ main: {
.label y = 2
.label __29 = 7
.label __30 = 5
// memset(SCREEN, 0xa0, 1000)
// memset(DEFAULT_SCREEN, 0xa0, 1000)
// [5] call memset
// [57] phi from main to memset [phi:main->memset]
// [57] phi (byte) memset::c#5 = (byte) $a0 [phi:main->memset#0] -- vbuxx=vbuc1
ldx #$a0
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) SCREEN [phi:main->memset#1] -- pvoz1=pvoc1
lda #<SCREEN
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) DEFAULT_SCREEN [phi:main->memset#1] -- pvoz1=pvoc1
lda #<DEFAULT_SCREEN
sta.z memset.str
lda #>SCREEN
lda #>DEFAULT_SCREEN
sta.z memset.str+1
jsr memset
// [6] phi from main to main::@10 [phi:main->main::@10]
// main::@10
// memset(COLORRAM, 0, 1000)
// memset(DEFAULT_COLORRAM, 0, 1000)
// [7] call 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
ldx #0
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) COLORRAM [phi:main::@10->memset#1] -- pvoz1=pvoc1
lda #<COLORRAM
// [57] phi (void*) memset::str#4 = (void*)(const nomodify byte*) DEFAULT_COLORRAM [phi:main::@10->memset#1] -- pvoz1=pvoc1
lda #<DEFAULT_COLORRAM
sta.z memset.str
lda #>COLORRAM
lda #>DEFAULT_COLORRAM
sta.z memset.str+1
jsr memset
// [8] phi from main::@10 to main::@11 [phi:main::@10->main::@11]
// main::@11
// memset(COUNT, 0, 1000)
// memset(VISITS, 0, 1000)
// [9] call 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
ldx #0
// [57] phi (void*) memset::str#4 = (void*)(const byte*) COUNT [phi:main::@11->memset#1] -- pvoz1=pvoc1
lda #<COUNT
// [57] phi (void*) memset::str#4 = (void*)(const byte*) VISITS [phi:main::@11->memset#1] -- pvoz1=pvoc1
lda #<VISITS
sta.z memset.str
lda #>COUNT
lda #>VISITS
sta.z memset.str+1
jsr memset
// main::@12
// *BORDERCOLOR = 0
// [10] *((const nomodify byte*) BORDERCOLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2
// TED->BG_COLOR = 0
// [10] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BG_COLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0
sta BORDERCOLOR
// *BGCOLOR = 0
// [11] *((const nomodify byte*) BGCOLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2
sta BGCOLOR
sta TED+OFFSET_STRUCT_MOS7360_TED_BG_COLOR
// TED->BORDER_COLOR = 0
// [11] *((byte*)(const nomodify struct MOS7360_TED*) TED+(const byte) OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR) ← (byte) 0 -- _deref_pbuc1=vbuc2
sta TED+OFFSET_STRUCT_MOS7360_TED_BORDER_COLOR
// [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
lda #<1
@ -2470,49 +2586,49 @@ main: {
bcc !+
inc.z offset+1
!:
// COUNT+offset
// [18] (byte*~) main::$5 ← (const byte*) COUNT + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2
// VISITS+offset
// [18] (byte*~) main::$5 ← (const byte*) VISITS + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2
lda.z offset
clc
adc #<COUNT
adc #<VISITS
sta.z __5
lda.z offset+1
adc #>COUNT
adc #>VISITS
sta.z __5+1
// cnt = ++*(COUNT+offset)
// cnt = ++*(VISITS+offset)
// [19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5) -- _deref_pbuz1=_inc__deref_pbuz1
ldy #0
lda (__5),y
clc
adc #1
sta (__5),y
// COUNT+offset
// [20] (byte*~) main::$6 ← (const byte*) COUNT + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2
// VISITS+offset
// [20] (byte*~) main::$6 ← (const byte*) VISITS + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz2
lda.z offset
clc
adc #<COUNT
adc #<VISITS
sta.z __6
lda.z offset+1
adc #>COUNT
adc #>VISITS
sta.z __6+1
// cnt = ++*(COUNT+offset)
// cnt = ++*(VISITS+offset)
// [21] (byte) main::cnt#0 ← *((byte*~) main::$6) -- vbuyy=_deref_pbuz1
lda (__6),y
tay
// COLORRAM+offset
// [22] (byte*~) main::$8 ← (const nomodify byte*) COLORRAM + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz1
// DEFAULT_COLORRAM+offset
// [22] (byte*~) main::$8 ← (const nomodify byte*) DEFAULT_COLORRAM + (word) main::offset#0 -- pbuz1=pbuc1_plus_vwuz1
clc
lda.z __8
adc #<COLORRAM
adc #<DEFAULT_COLORRAM
sta.z __8
lda.z __8+1
adc #>COLORRAM
adc #>DEFAULT_COLORRAM
sta.z __8+1
// cnt&0xf
// [23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f -- vbuaa=vbuyy_band_vbuc1
tya
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
tay
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
// main::@6
__b6:
// while(*RASTER!=0xff)
// [37] if(*((const nomodify byte*) RASTER)!=(byte) $ff) goto main::@6 -- _deref_pbuc1_neq_vbuc2_then_la1
// while(TED->RASTER_LO!=0xff)
// [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
cmp RASTER
cmp TED+OFFSET_STRUCT_MOS7360_TED_RASTER_LO
bne __b6
// [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
@ -2753,6 +2869,8 @@ memset: {
}
// File 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
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) @begin
(label) @end
(const nomodify byte*) BGCOLOR = (byte*) 65305
(const nomodify byte*) BORDERCOLOR = (byte*) 65301
(const nomodify byte*) COLORRAM = (byte*) 2048
(const byte*) COUNT[(number) $3e8] = { fill( $3e8, 0) }
(const nomodify byte*) DEFAULT_COLORRAM = (byte*) 2048
(const nomodify byte*) DEFAULT_SCREEN = (byte*) 3072
(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::DECIMAL = (number) $a
(const byte) RADIX::HEXADECIMAL = (number) $10
(const byte) RADIX::OCTAL = (number) 8
(const nomodify byte*) RASTER = (byte*) 65309
(const nomodify byte*) SCREEN = (byte*) 3072
(const nomodify struct MOS7360_TED*) TED = (struct MOS7360_TED*) 65280
(const byte*) VISITS[(number) $3e8] = { fill( $3e8, 0) }
(void()) main()
(word~) main::$10 zp[2]:13 202.0
(byte~) main::$12 reg byte a 202.0