if statement

This commit is contained in:
Irmen de Jong 2018-08-14 14:33:36 +02:00
parent bd6a05df73
commit 397fdc61cd
11 changed files with 1320 additions and 1058 deletions

View File

@ -256,12 +256,11 @@ using a couple of instructions.
Loops Loops
----- -----
The *for*-loop is used to iterate over a range of values. Iteration steps by 1, The *for*-loop is used to iterate over a range of values. Iteration is done in steps of 1, but you can change this.
but you can set it to something else as well.
The *while*-loop is used to repeat a piece of code while a certain condition is still true. The *while*-loop is used to repeat a piece of code while a certain condition is still true.
The *repeat--until* loop is used to repeat a piece of code until a certain condition is true. The *repeat--until* loop is used to repeat a piece of code until a certain condition is true.
You can also create loops by using the ``goto`` statement, but this should be avoided. You can also create loops by using the ``goto`` statement, but this should usually be avoided.
Conditional Execution Conditional Execution

View File

@ -273,9 +273,9 @@ Reserved names
The following names are reserved, they have a special meaning:: The following names are reserved, they have a special meaning::
A X Y ; 6502 hardware registers A X Y ; 6502 hardware registers
AX AY XY ; 16-bit pseudo register pairs AX AY XY ; 16-bit pseudo register pairs
SC SI SZ ; bits of the 6502 hardware status register Pc Pi Pz Pn Pv ; bits of the 6502 hardware status register
Operators Operators
@ -414,7 +414,9 @@ Loops
for loop for loop
^^^^^^^^ ^^^^^^^^
@todo:: .. todo:: not implemented yet, for now you can use the if statement with gotos to implement a for-loop.
::
for <loopvar> in <range> [ step <amount> ] { for <loopvar> in <range> [ step <amount> ] {
; do something... ; do something...
@ -425,7 +427,9 @@ for loop
while loop while loop
^^^^^^^^^^ ^^^^^^^^^^
@todo:: .. todo:: not implemented yet, for now you can use the if statement with gotos to implement a while-loop.
::
while <condition> { while <condition> {
; do something... ; do something...
@ -434,9 +438,12 @@ while loop
} }
repeat--until loop repeat--until loop
^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
@todo:: .. todo:: not implemented yet, for now you can use the if statement with gotos to implement a repeat-loop.
::
repeat { repeat {
; do something... ; do something...
@ -465,26 +472,14 @@ to another piece of code that eventually returns).
conditional execution conditional execution
^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
@todo:: With the 'if' / 'else' statement you can execute code depending on the value of a condition::
if <condition> goto <location> if ( <expression> ) <statements> [else <statements> ]
if <condition> then <simple_stateument> [else <simple_statement> ]
if <condition> { where <statements> can be just a single statement, or a block, such as this::
if ( <expression> ) {
<statements> <statements>
} } else {
[ else {
<alternative statements> <alternative statements>
} ] }
condition = arithmetic expression
or logical expression
or comparison expression
or status_register_flags
single_statement = goto, assignment, ...
subblock = '{' statements (but no subroutine definition) '}'
if the single_statement or the subblock is just a single goto,
the efficient *conditional branching instructions* of the CPU will be used.

View File

@ -46,11 +46,7 @@ module : (modulestatement | EOL)* EOF ;
modulestatement: directive | block ; modulestatement: directive | block ;
block: block: '~' identifier integerliteral? statement_block EOL ;
'~' identifier integerliteral? '{' EOL
(statement | EOL)*
'}' EOL
;
statement : statement :
directive directive
@ -63,6 +59,7 @@ statement :
| unconditionaljump | unconditionaljump
| postincrdecr | postincrdecr
| functioncall_stmt | functioncall_stmt
| if_stmt
| subroutine | subroutine
| inlineasm | inlineasm
| labeldef | labeldef
@ -155,7 +152,7 @@ identifier : NAME ;
scoped_identifier : NAME ('.' NAME)+ ; scoped_identifier : NAME ('.' NAME)+ ;
register : 'A' | 'X' | 'Y' | 'AX' | 'AY' | 'XY' | 'SC' | 'SI' | 'SZ' ; register : 'A' | 'X' | 'Y' | 'AX' | 'AY' | 'XY' | 'Pc' | 'Pi' | 'Pz' | 'Pn' | 'Pv' ;
integerliteral : DEC_INTEGER | HEX_INTEGER | BIN_INTEGER ; integerliteral : DEC_INTEGER | HEX_INTEGER | BIN_INTEGER ;
@ -179,21 +176,26 @@ inlineasm : '%asm' INLINEASMBLOCK;
subroutine : subroutine :
'sub' identifier '(' sub_params? ')' '->' '(' sub_returns? ')' (sub_address | sub_body) 'sub' identifier '(' sub_params? ')' '->' '(' sub_returns? ')' (sub_address | (statement_block EOL))
; ;
sub_body : statement_block :
'{' EOL '{' EOL
(statement | EOL) * (statement | EOL) *
'}' EOL '}'
; ;
sub_address : '=' integerliteral ; sub_address : '=' integerliteral ;
sub_params : sub_param (',' sub_param)* ; sub_params : sub_param (',' sub_param)* ;
sub_param: identifier ':' register ; sub_param: identifier ':' register;
sub_returns : '?' | ( sub_return (',' sub_return)* ) ; sub_returns : '?' | ( sub_return (',' sub_return)* ) ;
sub_return: register '?'? ; sub_return: register '?'? ;
if_stmt : 'if' '(' expression ')' EOL? (statement | statement_block) EOL? else_part? EOL ; // statement is constrained later
else_part : 'else' EOL? (statement | statement_block) ; // statement is constrained later

View File

@ -5,8 +5,8 @@
~ main { ~ main {
str name = "?" * 80 str name = "?" * 80
str guess = "?" * 80 str guess = "?" * 80
byte secretnumber = 0 byte secretnumber = 0
byte attempts_left = 10 byte attempts_left = 10
memory word freadstr_arg = $22 ; argument for FREADSTR memory word freadstr_arg = $22 ; argument for FREADSTR
@ -39,55 +39,37 @@ start:
c64scr.print_string("I am thinking of a number from 1 to 100!You'll have to guess it!\n") c64scr.print_string("I am thinking of a number from 1 to 100!You'll have to guess it!\n")
printloop: ask_guess:
c64scr.print_string("\nYou have ") c64scr.print_string("\nYou have ")
c64scr.print_byte_decimal(attempts_left) c64scr.print_byte_decimal(attempts_left)
c64scr.print_string(" guess") c64scr.print_string(" guess")
if(attempts_left>0) c64scr.print_string("es")
; @todo comparison expression so we can do if attempts_left>0 ...
A = attempts_left
A--
; @todo (conditional): if_zero A goto ask_guess
c64scr.print_string("es")
ask_guess:
c64scr.print_string(" left.\nWhat is your next guess? ") c64scr.print_string(" left.\nWhat is your next guess? ")
Y = c64scr.input_chars(guess) Y = c64scr.input_chars(guess)
c64.CHROUT("\n") c64.CHROUT("\n")
freadstr_arg = guess freadstr_arg = guess
c64.FREADSTR(A) c64.FREADSTR(A)
AY = c64flt.GETADRAY() AY = c64flt.GETADRAY()
A -= secretnumber ; @todo condition so we can do if guess > secretnumber.... if(A==secretnumber) {
; @todo (conditional): if_zero goto correct_guess c64scr.print_string("\nThat's my number, impressive!\n")
; @todo (conditional): if_gt goto too_high goto goodbye
}
c64scr.print_string("That is too ") c64scr.print_string("That is too ")
c64scr.print_string("low!\n") if(A > secretnumber)
goto continue c64scr.print_string("low!\n")
else
c64scr.print_string("high!\n")
correct_guess:
c64scr.print_string("\nThat's my number, impressive!\n")
goodbye()
return
too_high:
c64scr.print_string("That is too ")
c64scr.print_string("high!\n")
continue:
attempts_left-- attempts_left--
; @todo (conditional): if_zero attempts_left goto game_over if(attempts_left>0) goto ask_guess
goto printloop
game_over: game_over:
c64scr.print_string("\nToo bad! It was: ") c64scr.print_string("\nToo bad! It was: ")
c64scr.print_byte_decimal(secretnumber) c64scr.print_byte_decimal(secretnumber)
c64.CHROUT("\n") c64.CHROUT("\n")
return goodbye()
goodbye() ; @todo fix subroutine usage tracking, it doesn't register this one
return
sub goodbye ()->() { goodbye:
c64scr.print_string("\nThanks for playing. Bye!\n") c64scr.print_string("\nThanks for playing. Bye!\n")
return return
} }
}

View File

@ -16,10 +16,34 @@
const float zwop = -1.7014118345e+38 const float zwop = -1.7014118345e+38
const float zwop2 = -1.7014118345e+38 const float zwop2 = -1.7014118345e+38
const float blerp2 = zwop / 2.22 const float blerp2 = zwop / 2.22
const byte equal = 4==4
const byte equal2 = (4+hopla)>0
XY = hopla*2+hopla1 XY = hopla*2+hopla1
A = "derp" * %000100 A = "derp" * %000100
if (1==1) goto hopla
if (1==2) return 44
if (2==2) A=4
if (3==3) X=5 else A=99
if (5==5) {
A=99
}
if(6==6) {
A=99
} else X=33
if(6==6) {
A=99
} else {
X=33
}
main.foo(1,2,3) main.foo(1,2,3)
mega: mega:

View File

@ -26,9 +26,11 @@ enum class Register {
AX, AX,
AY, AY,
XY, XY,
SI, PC,
SC, PI,
SZ PZ,
PN,
PV
} }
@ -91,6 +93,13 @@ interface IAstProcessor {
fun process(jump: Jump): IStatement { fun process(jump: Jump): IStatement {
return jump return jump
} }
fun process(ifStatement: IfStatement): IStatement {
ifStatement.condition = ifStatement.condition.process(this)
ifStatement.statements = ifStatement.statements.map { it.process(this) }
ifStatement.elsepart = ifStatement.elsepart?.map { it.process(this) }
return ifStatement
}
} }
@ -627,6 +636,22 @@ data class SubroutineReturnvalue(val register: Register, val clobbered: Boolean)
} }
data class IfStatement(var condition: IExpression,
var statements: List<IStatement>, var
elsepart: List<IStatement>) : IStatement {
override var position: Position? = null
override var parent: Node? = null
override fun linkParents(parent: Node) {
this.parent = parent
condition.linkParents(this)
statements.forEach { it.linkParents(this) }
elsepart.forEach { it.linkParents(this) }
}
override fun process(processor: IAstProcessor): IStatement = processor.process(this)
}
/***************** Antlr Extension methods to create AST ****************/ /***************** Antlr Extension methods to create AST ****************/
@ -663,12 +688,16 @@ private fun il65Parser.ModulestatementContext.toAst(withPosition: Boolean) : ISt
private fun il65Parser.BlockContext.toAst(withPosition: Boolean) : IStatement { private fun il65Parser.BlockContext.toAst(withPosition: Boolean) : IStatement {
val block= Block(identifier().text, val block= Block(identifier().text,
integerliteral()?.toAst(), integerliteral()?.toAst(),
statement().map { it.toAst(withPosition) }) statement_block().toAst(withPosition))
block.position = toPosition(withPosition) block.position = toPosition(withPosition)
return block return block
} }
private fun il65Parser.Statement_blockContext.toAst(withPosition: Boolean): List<IStatement>
= statement().map { it.toAst(withPosition) }
private fun il65Parser.StatementContext.toAst(withPosition: Boolean) : IStatement { private fun il65Parser.StatementContext.toAst(withPosition: Boolean) : IStatement {
val vardecl = vardecl() val vardecl = vardecl()
if(vardecl!=null) { if(vardecl!=null) {
@ -749,6 +778,12 @@ private fun il65Parser.StatementContext.toAst(withPosition: Boolean) : IStatemen
val jump = unconditionaljump()?.toAst(withPosition) val jump = unconditionaljump()?.toAst(withPosition)
if(jump!=null) return jump if(jump!=null) return jump
val fcall = functioncall_stmt()?.toAst(withPosition)
if(fcall!=null) return fcall
val ifstmt = if_stmt()?.toAst(withPosition)
if(ifstmt!=null) return ifstmt
val returnstmt = returnstmt()?.toAst(withPosition) val returnstmt = returnstmt()?.toAst(withPosition)
if(returnstmt!=null) return returnstmt if(returnstmt!=null) return returnstmt
@ -758,13 +793,9 @@ private fun il65Parser.StatementContext.toAst(withPosition: Boolean) : IStatemen
val asm = inlineasm()?.toAst(withPosition) val asm = inlineasm()?.toAst(withPosition)
if(asm!=null) return asm if(asm!=null) return asm
val fcall = functioncall_stmt()?.toAst(withPosition)
if(fcall!=null) return fcall
throw UnsupportedOperationException(text) throw UnsupportedOperationException(text)
} }
private fun il65Parser.Functioncall_stmtContext.toAst(withPosition: Boolean): IStatement { private fun il65Parser.Functioncall_stmtContext.toAst(withPosition: Boolean): IStatement {
val location = val location =
if(identifier()!=null) identifier()?.toAst(withPosition) if(identifier()!=null) identifier()?.toAst(withPosition)
@ -828,7 +859,7 @@ private fun il65Parser.SubroutineContext.toAst(withPosition: Boolean) : Subrouti
if(sub_params()==null) emptyList() else sub_params().toAst(), if(sub_params()==null) emptyList() else sub_params().toAst(),
if(sub_returns()==null) emptyList() else sub_returns().toAst(), if(sub_returns()==null) emptyList() else sub_returns().toAst(),
sub_address()?.integerliteral()?.toAst(), sub_address()?.integerliteral()?.toAst(),
if(sub_body()==null) emptyList() else sub_body().statement().map {it.toAst(withPosition)}) if(statement_block()==null) emptyList() else statement_block().toAst(withPosition))
sub.position = toPosition(withPosition) sub.position = toPosition(withPosition)
return sub return sub
} }
@ -989,3 +1020,16 @@ private fun il65Parser.BooleanliteralContext.toAst() = when(text) {
private fun il65Parser.ArrayliteralContext.toAst(withPosition: Boolean) = private fun il65Parser.ArrayliteralContext.toAst(withPosition: Boolean) =
expression().map { it.toAst(withPosition) } expression().map { it.toAst(withPosition) }
private fun il65Parser.If_stmtContext.toAst(withPosition: Boolean): IfStatement {
val condition = expression().toAst(withPosition)
val statements = statement_block()?.toAst(withPosition) ?: listOf(statement().toAst(withPosition))
val elsepart = else_part()?.toAst(withPosition) ?: emptyList()
val result = IfStatement(condition, statements, elsepart)
result.position = toPosition(withPosition)
return result
}
private fun il65Parser.Else_partContext.toAst(withPosition: Boolean): List<IStatement> {
return statement_block()?.toAst(withPosition) ?: listOf(statement().toAst(withPosition))
}

View File

@ -81,97 +81,105 @@ T__79=80
T__80=81 T__80=81
T__81=82 T__81=82
T__82=83 T__82=83
LINECOMMENT=84 T__83=84
COMMENT=85 T__84=85
WS=86 T__85=86
EOL=87 T__86=87
NAME=88 LINECOMMENT=88
DEC_INTEGER=89 COMMENT=89
HEX_INTEGER=90 WS=90
BIN_INTEGER=91 EOL=91
FLOAT_NUMBER=92 NAME=92
STRING=93 DEC_INTEGER=93
INLINEASMBLOCK=94 HEX_INTEGER=94
BIN_INTEGER=95
FLOAT_NUMBER=96
STRING=97
INLINEASMBLOCK=98
'~'=1 '~'=1
'{'=2 ':'=2
'}'=3 'goto'=3
':'=4 '%output'=4
'goto'=5 '%launcher'=5
'%output'=6 '%zp'=6
'%launcher'=7 '%address'=7
'%zp'=8 '%import'=8
'%address'=9 '%breakpoint'=9
'%import'=10 '%asminclude'=10
'%breakpoint'=11 '%asmbinary'=11
'%asminclude'=12 '%option'=12
'%asmbinary'=13 ','=13
'%option'=14 '='=14
','=15 'const'=15
'='=16 'memory'=16
'const'=17 'byte'=17
'memory'=18 'word'=18
'byte'=19 'float'=19
'word'=20 'str'=20
'float'=21 'str_p'=21
'str'=22 'str_s'=22
'str_p'=23 'str_ps'=23
'str_s'=24 '['=24
'str_ps'=25 ']'=25
'['=26 '+='=26
']'=27 '-='=27
'+='=28 '/='=28
'-='=29 '*='=29
'/='=30 '**='=30
'*='=31 '<<='=31
'**='=32 '>>='=32
'<<='=33 '<<@='=33
'>>='=34 '>>@='=34
'<<@='=35 '&='=35
'>>@='=36 '|='=36
'&='=37 '^='=37
'|='=38 '++'=38
'^='=39 '--'=39
'++'=40 '('=40
'--'=41 ')'=41
'('=42 '+'=42
')'=43 '-'=43
'+'=44 '**'=44
'-'=45 '*'=45
'**'=46 '/'=46
'*'=47 '<<'=47
'/'=48 '>>'=48
'<<'=49 '<<@'=49
'>>'=50 '>>@'=50
'<<@'=51 '<'=51
'>>@'=52 '>'=52
'<'=53 '<='=53
'>'=54 '>='=54
'<='=55 '=='=55
'>='=56 '!='=56
'=='=57 '&'=57
'!='=58 '^'=58
'&'=59 '|'=59
'^'=60 'and'=60
'|'=61 'or'=61
'and'=62 'xor'=62
'or'=63 'not'=63
'xor'=64 'to'=64
'not'=65 'return'=65
'to'=66 '.'=66
'return'=67 'A'=67
'.'=68 'X'=68
'A'=69 'Y'=69
'X'=70 'AX'=70
'Y'=71 'AY'=71
'AX'=72 'XY'=72
'AY'=73 'Pc'=73
'XY'=74 'Pi'=74
'SC'=75 'Pz'=75
'SI'=76 'Pn'=76
'SZ'=77 'Pv'=77
'true'=78 'true'=78
'false'=79 'false'=79
'%asm'=80 '%asm'=80
'sub'=81 'sub'=81
'->'=82 '->'=82
'?'=83 '{'=83
'}'=84
'?'=85
'if'=86
'else'=87

View File

@ -28,9 +28,9 @@ public class il65Lexer extends Lexer {
T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66, T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73, T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73,
T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80, T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80,
T__80=81, T__81=82, T__82=83, LINECOMMENT=84, COMMENT=85, WS=86, EOL=87, T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, T__86=87,
NAME=88, DEC_INTEGER=89, HEX_INTEGER=90, BIN_INTEGER=91, FLOAT_NUMBER=92, LINECOMMENT=88, COMMENT=89, WS=90, EOL=91, NAME=92, DEC_INTEGER=93, HEX_INTEGER=94,
STRING=93, INLINEASMBLOCK=94; BIN_INTEGER=95, FLOAT_NUMBER=96, STRING=97, INLINEASMBLOCK=98;
public static String[] channelNames = { public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN" "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
}; };
@ -50,23 +50,23 @@ public class il65Lexer extends Lexer {
"T__57", "T__58", "T__59", "T__60", "T__61", "T__62", "T__63", "T__64", "T__57", "T__58", "T__59", "T__60", "T__61", "T__62", "T__63", "T__64",
"T__65", "T__66", "T__67", "T__68", "T__69", "T__70", "T__71", "T__72", "T__65", "T__66", "T__67", "T__68", "T__69", "T__70", "T__71", "T__72",
"T__73", "T__74", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80", "T__73", "T__74", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80",
"T__81", "T__82", "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "T__81", "T__82", "T__83", "T__84", "T__85", "T__86", "LINECOMMENT", "COMMENT",
"HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "FNUMBER", "STRING_ESCAPE_SEQ", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER",
"STRING", "INLINEASMBLOCK" "FNUMBER", "STRING_ESCAPE_SEQ", "STRING", "INLINEASMBLOCK"
}; };
private static final String[] _LITERAL_NAMES = { private static final String[] _LITERAL_NAMES = {
null, "'~'", "'{'", "'}'", "':'", "'goto'", "'%output'", "'%launcher'", null, "'~'", "':'", "'goto'", "'%output'", "'%launcher'", "'%zp'", "'%address'",
"'%zp'", "'%address'", "'%import'", "'%breakpoint'", "'%asminclude'", "'%import'", "'%breakpoint'", "'%asminclude'", "'%asmbinary'", "'%option'",
"'%asmbinary'", "'%option'", "','", "'='", "'const'", "'memory'", "'byte'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'", "'float'", "'str'",
"'word'", "'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='", "'-='", "'/='",
"']'", "'+='", "'-='", "'/='", "'*='", "'**='", "'<<='", "'>>='", "'<<@='", "'*='", "'**='", "'<<='", "'>>='", "'<<@='", "'>>@='", "'&='", "'|='",
"'>>@='", "'&='", "'|='", "'^='", "'++'", "'--'", "'('", "')'", "'+'", "'^='", "'++'", "'--'", "'('", "')'", "'+'", "'-'", "'**'", "'*'", "'/'",
"'-'", "'**'", "'*'", "'/'", "'<<'", "'>>'", "'<<@'", "'>>@'", "'<'", "'<<'", "'>>'", "'<<@'", "'>>@'", "'<'", "'>'", "'<='", "'>='", "'=='",
"'>'", "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'and'", "'or'", "'!='", "'&'", "'^'", "'|'", "'and'", "'or'", "'xor'", "'not'", "'to'",
"'xor'", "'not'", "'to'", "'return'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'return'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'Pc'",
"'AY'", "'XY'", "'SC'", "'SI'", "'SZ'", "'true'", "'false'", "'%asm'", "'Pi'", "'Pz'", "'Pn'", "'Pv'", "'true'", "'false'", "'%asm'", "'sub'",
"'sub'", "'->'", "'?'" "'->'", "'{'", "'}'", "'?'", "'if'", "'else'"
}; };
private static final String[] _SYMBOLIC_NAMES = { private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
@ -76,8 +76,9 @@ public class il65Lexer extends Lexer {
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
"LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", null, null, null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME",
"BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK" "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING",
"INLINEASMBLOCK"
}; };
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -139,10 +140,10 @@ public class il65Lexer extends Lexer {
@Override @Override
public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { public void action(RuleContext _localctx, int ruleIndex, int actionIndex) {
switch (ruleIndex) { switch (ruleIndex) {
case 94: case 98:
STRING_action((RuleContext)_localctx, actionIndex); STRING_action((RuleContext)_localctx, actionIndex);
break; break;
case 95: case 99:
INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex); INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex);
break; break;
} }
@ -171,7 +172,7 @@ public class il65Lexer extends Lexer {
} }
public static final String _serializedATN = public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2`\u027a\b\1\4\2\t"+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2d\u0290\b\1\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@ -182,206 +183,213 @@ public class il65Lexer extends Lexer {
"\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+ "\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+
"\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+ "\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+
"\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+ "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+
"`\t`\4a\ta\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\7\3\7"+ "`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4\3\4"+
"\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3"+ "\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3"+
"\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13"+ "\6\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t"+
"\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3"+ "\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13"+
"\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3"+ "\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3"+
"\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3"+ "\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3"+
"\20\3\20\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3"+ "\16\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3"+
"\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\26\3"+ "\21\3\21\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3"+
"\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3"+ "\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3"+
"\30\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+ "\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3"+
"\33\3\33\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\36\3\37\3\37\3\37\3 \3 "+ "\31\3\32\3\32\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3"+
"\3 \3!\3!\3!\3!\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3%\3%\3%\3"+ "\36\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3"+
"%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3)\3*\3*\3*\3+\3+\3,\3,\3-\3"+ "#\3#\3#\3#\3#\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3"+
"-\3.\3.\3/\3/\3/\3\60\3\60\3\61\3\61\3\62\3\62\3\62\3\63\3\63\3\63\3\64"+ "*\3*\3+\3+\3,\3,\3-\3-\3-\3.\3.\3/\3/\3\60\3\60\3\60\3\61\3\61\3\61\3"+
"\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\66\3\66\3\67\3\67\38\38\38\39\3"+ "\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\64\3\64\3\65\3\65\3\66\3\66\3"+
"9\39\3:\3:\3:\3;\3;\3;\3<\3<\3=\3=\3>\3>\3?\3?\3?\3?\3@\3@\3@\3A\3A\3"+ "\66\3\67\3\67\3\67\38\38\38\39\39\39\3:\3:\3;\3;\3<\3<\3=\3=\3=\3=\3>"+
"A\3A\3B\3B\3B\3B\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3E\3F\3F\3G\3G\3H\3"+ "\3>\3>\3?\3?\3?\3?\3@\3@\3@\3@\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3C\3C\3D"+
"H\3I\3I\3I\3J\3J\3J\3K\3K\3K\3L\3L\3L\3M\3M\3M\3N\3N\3N\3O\3O\3O\3O\3"+ "\3D\3E\3E\3F\3F\3G\3G\3G\3H\3H\3H\3I\3I\3I\3J\3J\3J\3K\3K\3K\3L\3L\3L"+
"O\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3S\3S\3S\3T\3T\3U\3U\7"+ "\3M\3M\3M\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3R"+
"U\u0211\nU\fU\16U\u0214\13U\3U\3U\3U\3U\3V\3V\7V\u021c\nV\fV\16V\u021f"+ "\3R\3R\3R\3S\3S\3S\3T\3T\3U\3U\3V\3V\3W\3W\3W\3X\3X\3X\3X\3X\3Y\3Y\7Y"+
"\13V\3V\3V\3W\3W\3W\3W\3X\6X\u0228\nX\rX\16X\u0229\3Y\3Y\7Y\u022e\nY\f"+ "\u0227\nY\fY\16Y\u022a\13Y\3Y\3Y\3Y\3Y\3Z\3Z\7Z\u0232\nZ\fZ\16Z\u0235"+
"Y\16Y\u0231\13Y\3Z\3Z\3Z\6Z\u0236\nZ\rZ\16Z\u0237\5Z\u023a\nZ\3[\3[\6"+ "\13Z\3Z\3Z\3[\3[\3[\3[\3\\\6\\\u023e\n\\\r\\\16\\\u023f\3]\3]\7]\u0244"+
"[\u023e\n[\r[\16[\u023f\3\\\3\\\6\\\u0244\n\\\r\\\16\\\u0245\3]\3]\3]"+ "\n]\f]\16]\u0247\13]\3^\3^\3^\6^\u024c\n^\r^\16^\u024d\5^\u0250\n^\3_"+
"\5]\u024b\n]\3]\5]\u024e\n]\3^\6^\u0251\n^\r^\16^\u0252\3^\3^\6^\u0257"+ "\3_\6_\u0254\n_\r_\16_\u0255\3`\3`\6`\u025a\n`\r`\16`\u025b\3a\3a\3a\5"+
"\n^\r^\16^\u0258\5^\u025b\n^\3_\3_\3_\3_\5_\u0261\n_\3`\3`\3`\7`\u0266"+ "a\u0261\na\3a\5a\u0264\na\3b\6b\u0267\nb\rb\16b\u0268\3b\3b\6b\u026d\n"+
"\n`\f`\16`\u0269\13`\3`\3`\3`\3a\3a\3a\3a\6a\u0272\na\ra\16a\u0273\3a"+ "b\rb\16b\u026e\5b\u0271\nb\3c\3c\3c\3c\5c\u0277\nc\3d\3d\3d\7d\u027c\n"+
"\3a\3a\3a\3a\3\u0273\2b\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f"+ "d\fd\16d\u027f\13d\3d\3d\3d\3e\3e\3e\3e\6e\u0288\ne\re\16e\u0289\3e\3"+
"\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63"+ "e\3e\3e\3e\3\u0289\2f\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27"+
"\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62"+ "\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33"+
"c\63e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087"+ "\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63"+
"E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009b"+ "e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089"+
"O\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00af"+ "F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009d"+
"Y\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb\2\u00bd\2\u00bf_\u00c1`\3"+ "P\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1"+
"\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;C\\aac|\5\2\62;CHc"+ "Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3\2\u00c5"+
"h\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2\u0288\2\3\3\2\2\2\2\5\3\2\2\2\2"+ "\2\u00c7c\u00c9d\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;"+
"\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2"+ "C\\aac|\5\2\62;CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2\u029e\2\3\3\2"+
"\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2"+ "\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17"+
"\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2"+ "\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2"+
"\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2"+ "\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3"+
"\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2"+ "\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3"+
"\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2"+ "\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2"+
"M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3"+ "=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3"+
"\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2"+ "\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2"+
"\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2"+ "\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2"+
"s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177"+ "c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3"+
"\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2"+ "\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2"+
"\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091"+ "\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3"+
"\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2"+ "\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2"+
"\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3"+ "\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097"+
"\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2"+ "\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2"+
"\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5"+ "\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9"+
"\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2"+ "\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2"+
"\2\3\u00c3\3\2\2\2\5\u00c5\3\2\2\2\7\u00c7\3\2\2\2\t\u00c9\3\2\2\2\13"+ "\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb"+
"\u00cb\3\2\2\2\r\u00d0\3\2\2\2\17\u00d8\3\2\2\2\21\u00e2\3\2\2\2\23\u00e6"+ "\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c7\3\2\2"+
"\3\2\2\2\25\u00ef\3\2\2\2\27\u00f7\3\2\2\2\31\u0103\3\2\2\2\33\u010f\3"+ "\2\2\u00c9\3\2\2\2\3\u00cb\3\2\2\2\5\u00cd\3\2\2\2\7\u00cf\3\2\2\2\t\u00d4"+
"\2\2\2\35\u011a\3\2\2\2\37\u0122\3\2\2\2!\u0124\3\2\2\2#\u0126\3\2\2\2"+ "\3\2\2\2\13\u00dc\3\2\2\2\r\u00e6\3\2\2\2\17\u00ea\3\2\2\2\21\u00f3\3"+
"%\u012c\3\2\2\2\'\u0133\3\2\2\2)\u0138\3\2\2\2+\u013d\3\2\2\2-\u0143\3"+ "\2\2\2\23\u00fb\3\2\2\2\25\u0107\3\2\2\2\27\u0113\3\2\2\2\31\u011e\3\2"+
"\2\2\2/\u0147\3\2\2\2\61\u014d\3\2\2\2\63\u0153\3\2\2\2\65\u015a\3\2\2"+ "\2\2\33\u0126\3\2\2\2\35\u0128\3\2\2\2\37\u012a\3\2\2\2!\u0130\3\2\2\2"+
"\2\67\u015c\3\2\2\29\u015e\3\2\2\2;\u0161\3\2\2\2=\u0164\3\2\2\2?\u0167"+ "#\u0137\3\2\2\2%\u013c\3\2\2\2\'\u0141\3\2\2\2)\u0147\3\2\2\2+\u014b\3"+
"\3\2\2\2A\u016a\3\2\2\2C\u016e\3\2\2\2E\u0172\3\2\2\2G\u0176\3\2\2\2I"+ "\2\2\2-\u0151\3\2\2\2/\u0157\3\2\2\2\61\u015e\3\2\2\2\63\u0160\3\2\2\2"+
"\u017b\3\2\2\2K\u0180\3\2\2\2M\u0183\3\2\2\2O\u0186\3\2\2\2Q\u0189\3\2"+ "\65\u0162\3\2\2\2\67\u0165\3\2\2\29\u0168\3\2\2\2;\u016b\3\2\2\2=\u016e"+
"\2\2S\u018c\3\2\2\2U\u018f\3\2\2\2W\u0191\3\2\2\2Y\u0193\3\2\2\2[\u0195"+ "\3\2\2\2?\u0172\3\2\2\2A\u0176\3\2\2\2C\u017a\3\2\2\2E\u017f\3\2\2\2G"+
"\3\2\2\2]\u0197\3\2\2\2_\u019a\3\2\2\2a\u019c\3\2\2\2c\u019e\3\2\2\2e"+ "\u0184\3\2\2\2I\u0187\3\2\2\2K\u018a\3\2\2\2M\u018d\3\2\2\2O\u0190\3\2"+
"\u01a1\3\2\2\2g\u01a4\3\2\2\2i\u01a8\3\2\2\2k\u01ac\3\2\2\2m\u01ae\3\2"+ "\2\2Q\u0193\3\2\2\2S\u0195\3\2\2\2U\u0197\3\2\2\2W\u0199\3\2\2\2Y\u019b"+
"\2\2o\u01b0\3\2\2\2q\u01b3\3\2\2\2s\u01b6\3\2\2\2u\u01b9\3\2\2\2w\u01bc"+ "\3\2\2\2[\u019e\3\2\2\2]\u01a0\3\2\2\2_\u01a2\3\2\2\2a\u01a5\3\2\2\2c"+
"\3\2\2\2y\u01be\3\2\2\2{\u01c0\3\2\2\2}\u01c2\3\2\2\2\177\u01c6\3\2\2"+ "\u01a8\3\2\2\2e\u01ac\3\2\2\2g\u01b0\3\2\2\2i\u01b2\3\2\2\2k\u01b4\3\2"+
"\2\u0081\u01c9\3\2\2\2\u0083\u01cd\3\2\2\2\u0085\u01d1\3\2\2\2\u0087\u01d4"+ "\2\2m\u01b7\3\2\2\2o\u01ba\3\2\2\2q\u01bd\3\2\2\2s\u01c0\3\2\2\2u\u01c2"+
"\3\2\2\2\u0089\u01db\3\2\2\2\u008b\u01dd\3\2\2\2\u008d\u01df\3\2\2\2\u008f"+ "\3\2\2\2w\u01c4\3\2\2\2y\u01c6\3\2\2\2{\u01ca\3\2\2\2}\u01cd\3\2\2\2\177"+
"\u01e1\3\2\2\2\u0091\u01e3\3\2\2\2\u0093\u01e6\3\2\2\2\u0095\u01e9\3\2"+ "\u01d1\3\2\2\2\u0081\u01d5\3\2\2\2\u0083\u01d8\3\2\2\2\u0085\u01df\3\2"+
"\2\2\u0097\u01ec\3\2\2\2\u0099\u01ef\3\2\2\2\u009b\u01f2\3\2\2\2\u009d"+ "\2\2\u0087\u01e1\3\2\2\2\u0089\u01e3\3\2\2\2\u008b\u01e5\3\2\2\2\u008d"+
"\u01f5\3\2\2\2\u009f\u01fa\3\2\2\2\u00a1\u0200\3\2\2\2\u00a3\u0205\3\2"+ "\u01e7\3\2\2\2\u008f\u01ea\3\2\2\2\u0091\u01ed\3\2\2\2\u0093\u01f0\3\2"+
"\2\2\u00a5\u0209\3\2\2\2\u00a7\u020c\3\2\2\2\u00a9\u020e\3\2\2\2\u00ab"+ "\2\2\u0095\u01f3\3\2\2\2\u0097\u01f6\3\2\2\2\u0099\u01f9\3\2\2\2\u009b"+
"\u0219\3\2\2\2\u00ad\u0222\3\2\2\2\u00af\u0227\3\2\2\2\u00b1\u022b\3\2"+ "\u01fc\3\2\2\2\u009d\u01ff\3\2\2\2\u009f\u0204\3\2\2\2\u00a1\u020a\3\2"+
"\2\2\u00b3\u0239\3\2\2\2\u00b5\u023b\3\2\2\2\u00b7\u0241\3\2\2\2\u00b9"+ "\2\2\u00a3\u020f\3\2\2\2\u00a5\u0213\3\2\2\2\u00a7\u0216\3\2\2\2\u00a9"+
"\u0247\3\2\2\2\u00bb\u0250\3\2\2\2\u00bd\u0260\3\2\2\2\u00bf\u0262\3\2"+ "\u0218\3\2\2\2\u00ab\u021a\3\2\2\2\u00ad\u021c\3\2\2\2\u00af\u021f\3\2"+
"\2\2\u00c1\u026d\3\2\2\2\u00c3\u00c4\7\u0080\2\2\u00c4\4\3\2\2\2\u00c5"+ "\2\2\u00b1\u0224\3\2\2\2\u00b3\u022f\3\2\2\2\u00b5\u0238\3\2\2\2\u00b7"+
"\u00c6\7}\2\2\u00c6\6\3\2\2\2\u00c7\u00c8\7\177\2\2\u00c8\b\3\2\2\2\u00c9"+ "\u023d\3\2\2\2\u00b9\u0241\3\2\2\2\u00bb\u024f\3\2\2\2\u00bd\u0251\3\2"+
"\u00ca\7<\2\2\u00ca\n\3\2\2\2\u00cb\u00cc\7i\2\2\u00cc\u00cd\7q\2\2\u00cd"+ "\2\2\u00bf\u0257\3\2\2\2\u00c1\u025d\3\2\2\2\u00c3\u0266\3\2\2\2\u00c5"+
"\u00ce\7v\2\2\u00ce\u00cf\7q\2\2\u00cf\f\3\2\2\2\u00d0\u00d1\7\'\2\2\u00d1"+ "\u0276\3\2\2\2\u00c7\u0278\3\2\2\2\u00c9\u0283\3\2\2\2\u00cb\u00cc\7\u0080"+
"\u00d2\7q\2\2\u00d2\u00d3\7w\2\2\u00d3\u00d4\7v\2\2\u00d4\u00d5\7r\2\2"+ "\2\2\u00cc\4\3\2\2\2\u00cd\u00ce\7<\2\2\u00ce\6\3\2\2\2\u00cf\u00d0\7"+
"\u00d5\u00d6\7w\2\2\u00d6\u00d7\7v\2\2\u00d7\16\3\2\2\2\u00d8\u00d9\7"+ "i\2\2\u00d0\u00d1\7q\2\2\u00d1\u00d2\7v\2\2\u00d2\u00d3\7q\2\2\u00d3\b"+
"\'\2\2\u00d9\u00da\7n\2\2\u00da\u00db\7c\2\2\u00db\u00dc\7w\2\2\u00dc"+ "\3\2\2\2\u00d4\u00d5\7\'\2\2\u00d5\u00d6\7q\2\2\u00d6\u00d7\7w\2\2\u00d7"+
"\u00dd\7p\2\2\u00dd\u00de\7e\2\2\u00de\u00df\7j\2\2\u00df\u00e0\7g\2\2"+ "\u00d8\7v\2\2\u00d8\u00d9\7r\2\2\u00d9\u00da\7w\2\2\u00da\u00db\7v\2\2"+
"\u00e0\u00e1\7t\2\2\u00e1\20\3\2\2\2\u00e2\u00e3\7\'\2\2\u00e3\u00e4\7"+ "\u00db\n\3\2\2\2\u00dc\u00dd\7\'\2\2\u00dd\u00de\7n\2\2\u00de\u00df\7"+
"|\2\2\u00e4\u00e5\7r\2\2\u00e5\22\3\2\2\2\u00e6\u00e7\7\'\2\2\u00e7\u00e8"+ "c\2\2\u00df\u00e0\7w\2\2\u00e0\u00e1\7p\2\2\u00e1\u00e2\7e\2\2\u00e2\u00e3"+
"\7c\2\2\u00e8\u00e9\7f\2\2\u00e9\u00ea\7f\2\2\u00ea\u00eb\7t\2\2\u00eb"+ "\7j\2\2\u00e3\u00e4\7g\2\2\u00e4\u00e5\7t\2\2\u00e5\f\3\2\2\2\u00e6\u00e7"+
"\u00ec\7g\2\2\u00ec\u00ed\7u\2\2\u00ed\u00ee\7u\2\2\u00ee\24\3\2\2\2\u00ef"+ "\7\'\2\2\u00e7\u00e8\7|\2\2\u00e8\u00e9\7r\2\2\u00e9\16\3\2\2\2\u00ea"+
"\u00f0\7\'\2\2\u00f0\u00f1\7k\2\2\u00f1\u00f2\7o\2\2\u00f2\u00f3\7r\2"+ "\u00eb\7\'\2\2\u00eb\u00ec\7c\2\2\u00ec\u00ed\7f\2\2\u00ed\u00ee\7f\2"+
"\2\u00f3\u00f4\7q\2\2\u00f4\u00f5\7t\2\2\u00f5\u00f6\7v\2\2\u00f6\26\3"+ "\2\u00ee\u00ef\7t\2\2\u00ef\u00f0\7g\2\2\u00f0\u00f1\7u\2\2\u00f1\u00f2"+
"\2\2\2\u00f7\u00f8\7\'\2\2\u00f8\u00f9\7d\2\2\u00f9\u00fa\7t\2\2\u00fa"+ "\7u\2\2\u00f2\20\3\2\2\2\u00f3\u00f4\7\'\2\2\u00f4\u00f5\7k\2\2\u00f5"+
"\u00fb\7g\2\2\u00fb\u00fc\7c\2\2\u00fc\u00fd\7m\2\2\u00fd\u00fe\7r\2\2"+ "\u00f6\7o\2\2\u00f6\u00f7\7r\2\2\u00f7\u00f8\7q\2\2\u00f8\u00f9\7t\2\2"+
"\u00fe\u00ff\7q\2\2\u00ff\u0100\7k\2\2\u0100\u0101\7p\2\2\u0101\u0102"+ "\u00f9\u00fa\7v\2\2\u00fa\22\3\2\2\2\u00fb\u00fc\7\'\2\2\u00fc\u00fd\7"+
"\7v\2\2\u0102\30\3\2\2\2\u0103\u0104\7\'\2\2\u0104\u0105\7c\2\2\u0105"+ "d\2\2\u00fd\u00fe\7t\2\2\u00fe\u00ff\7g\2\2\u00ff\u0100\7c\2\2\u0100\u0101"+
"\u0106\7u\2\2\u0106\u0107\7o\2\2\u0107\u0108\7k\2\2\u0108\u0109\7p\2\2"+ "\7m\2\2\u0101\u0102\7r\2\2\u0102\u0103\7q\2\2\u0103\u0104\7k\2\2\u0104"+
"\u0109\u010a\7e\2\2\u010a\u010b\7n\2\2\u010b\u010c\7w\2\2\u010c\u010d"+ "\u0105\7p\2\2\u0105\u0106\7v\2\2\u0106\24\3\2\2\2\u0107\u0108\7\'\2\2"+
"\7f\2\2\u010d\u010e\7g\2\2\u010e\32\3\2\2\2\u010f\u0110\7\'\2\2\u0110"+ "\u0108\u0109\7c\2\2\u0109\u010a\7u\2\2\u010a\u010b\7o\2\2\u010b\u010c"+
"\u0111\7c\2\2\u0111\u0112\7u\2\2\u0112\u0113\7o\2\2\u0113\u0114\7d\2\2"+ "\7k\2\2\u010c\u010d\7p\2\2\u010d\u010e\7e\2\2\u010e\u010f\7n\2\2\u010f"+
"\u0114\u0115\7k\2\2\u0115\u0116\7p\2\2\u0116\u0117\7c\2\2\u0117\u0118"+ "\u0110\7w\2\2\u0110\u0111\7f\2\2\u0111\u0112\7g\2\2\u0112\26\3\2\2\2\u0113"+
"\7t\2\2\u0118\u0119\7{\2\2\u0119\34\3\2\2\2\u011a\u011b\7\'\2\2\u011b"+ "\u0114\7\'\2\2\u0114\u0115\7c\2\2\u0115\u0116\7u\2\2\u0116\u0117\7o\2"+
"\u011c\7q\2\2\u011c\u011d\7r\2\2\u011d\u011e\7v\2\2\u011e\u011f\7k\2\2"+ "\2\u0117\u0118\7d\2\2\u0118\u0119\7k\2\2\u0119\u011a\7p\2\2\u011a\u011b"+
"\u011f\u0120\7q\2\2\u0120\u0121\7p\2\2\u0121\36\3\2\2\2\u0122\u0123\7"+ "\7c\2\2\u011b\u011c\7t\2\2\u011c\u011d\7{\2\2\u011d\30\3\2\2\2\u011e\u011f"+
".\2\2\u0123 \3\2\2\2\u0124\u0125\7?\2\2\u0125\"\3\2\2\2\u0126\u0127\7"+ "\7\'\2\2\u011f\u0120\7q\2\2\u0120\u0121\7r\2\2\u0121\u0122\7v\2\2\u0122"+
"e\2\2\u0127\u0128\7q\2\2\u0128\u0129\7p\2\2\u0129\u012a\7u\2\2\u012a\u012b"+ "\u0123\7k\2\2\u0123\u0124\7q\2\2\u0124\u0125\7p\2\2\u0125\32\3\2\2\2\u0126"+
"\7v\2\2\u012b$\3\2\2\2\u012c\u012d\7o\2\2\u012d\u012e\7g\2\2\u012e\u012f"+ "\u0127\7.\2\2\u0127\34\3\2\2\2\u0128\u0129\7?\2\2\u0129\36\3\2\2\2\u012a"+
"\7o\2\2\u012f\u0130\7q\2\2\u0130\u0131\7t\2\2\u0131\u0132\7{\2\2\u0132"+ "\u012b\7e\2\2\u012b\u012c\7q\2\2\u012c\u012d\7p\2\2\u012d\u012e\7u\2\2"+
"&\3\2\2\2\u0133\u0134\7d\2\2\u0134\u0135\7{\2\2\u0135\u0136\7v\2\2\u0136"+ "\u012e\u012f\7v\2\2\u012f \3\2\2\2\u0130\u0131\7o\2\2\u0131\u0132\7g\2"+
"\u0137\7g\2\2\u0137(\3\2\2\2\u0138\u0139\7y\2\2\u0139\u013a\7q\2\2\u013a"+ "\2\u0132\u0133\7o\2\2\u0133\u0134\7q\2\2\u0134\u0135\7t\2\2\u0135\u0136"+
"\u013b\7t\2\2\u013b\u013c\7f\2\2\u013c*\3\2\2\2\u013d\u013e\7h\2\2\u013e"+ "\7{\2\2\u0136\"\3\2\2\2\u0137\u0138\7d\2\2\u0138\u0139\7{\2\2\u0139\u013a"+
"\u013f\7n\2\2\u013f\u0140\7q\2\2\u0140\u0141\7c\2\2\u0141\u0142\7v\2\2"+ "\7v\2\2\u013a\u013b\7g\2\2\u013b$\3\2\2\2\u013c\u013d\7y\2\2\u013d\u013e"+
"\u0142,\3\2\2\2\u0143\u0144\7u\2\2\u0144\u0145\7v\2\2\u0145\u0146\7t\2"+ "\7q\2\2\u013e\u013f\7t\2\2\u013f\u0140\7f\2\2\u0140&\3\2\2\2\u0141\u0142"+
"\2\u0146.\3\2\2\2\u0147\u0148\7u\2\2\u0148\u0149\7v\2\2\u0149\u014a\7"+ "\7h\2\2\u0142\u0143\7n\2\2\u0143\u0144\7q\2\2\u0144\u0145\7c\2\2\u0145"+
"t\2\2\u014a\u014b\7a\2\2\u014b\u014c\7r\2\2\u014c\60\3\2\2\2\u014d\u014e"+ "\u0146\7v\2\2\u0146(\3\2\2\2\u0147\u0148\7u\2\2\u0148\u0149\7v\2\2\u0149"+
"\7u\2\2\u014e\u014f\7v\2\2\u014f\u0150\7t\2\2\u0150\u0151\7a\2\2\u0151"+ "\u014a\7t\2\2\u014a*\3\2\2\2\u014b\u014c\7u\2\2\u014c\u014d\7v\2\2\u014d"+
"\u0152\7u\2\2\u0152\62\3\2\2\2\u0153\u0154\7u\2\2\u0154\u0155\7v\2\2\u0155"+ "\u014e\7t\2\2\u014e\u014f\7a\2\2\u014f\u0150\7r\2\2\u0150,\3\2\2\2\u0151"+
"\u0156\7t\2\2\u0156\u0157\7a\2\2\u0157\u0158\7r\2\2\u0158\u0159\7u\2\2"+ "\u0152\7u\2\2\u0152\u0153\7v\2\2\u0153\u0154\7t\2\2\u0154\u0155\7a\2\2"+
"\u0159\64\3\2\2\2\u015a\u015b\7]\2\2\u015b\66\3\2\2\2\u015c\u015d\7_\2"+ "\u0155\u0156\7u\2\2\u0156.\3\2\2\2\u0157\u0158\7u\2\2\u0158\u0159\7v\2"+
"\2\u015d8\3\2\2\2\u015e\u015f\7-\2\2\u015f\u0160\7?\2\2\u0160:\3\2\2\2"+ "\2\u0159\u015a\7t\2\2\u015a\u015b\7a\2\2\u015b\u015c\7r\2\2\u015c\u015d"+
"\u0161\u0162\7/\2\2\u0162\u0163\7?\2\2\u0163<\3\2\2\2\u0164\u0165\7\61"+ "\7u\2\2\u015d\60\3\2\2\2\u015e\u015f\7]\2\2\u015f\62\3\2\2\2\u0160\u0161"+
"\2\2\u0165\u0166\7?\2\2\u0166>\3\2\2\2\u0167\u0168\7,\2\2\u0168\u0169"+ "\7_\2\2\u0161\64\3\2\2\2\u0162\u0163\7-\2\2\u0163\u0164\7?\2\2\u0164\66"+
"\7?\2\2\u0169@\3\2\2\2\u016a\u016b\7,\2\2\u016b\u016c\7,\2\2\u016c\u016d"+ "\3\2\2\2\u0165\u0166\7/\2\2\u0166\u0167\7?\2\2\u01678\3\2\2\2\u0168\u0169"+
"\7?\2\2\u016dB\3\2\2\2\u016e\u016f\7>\2\2\u016f\u0170\7>\2\2\u0170\u0171"+ "\7\61\2\2\u0169\u016a\7?\2\2\u016a:\3\2\2\2\u016b\u016c\7,\2\2\u016c\u016d"+
"\7?\2\2\u0171D\3\2\2\2\u0172\u0173\7@\2\2\u0173\u0174\7@\2\2\u0174\u0175"+ "\7?\2\2\u016d<\3\2\2\2\u016e\u016f\7,\2\2\u016f\u0170\7,\2\2\u0170\u0171"+
"\7?\2\2\u0175F\3\2\2\2\u0176\u0177\7>\2\2\u0177\u0178\7>\2\2\u0178\u0179"+ "\7?\2\2\u0171>\3\2\2\2\u0172\u0173\7>\2\2\u0173\u0174\7>\2\2\u0174\u0175"+
"\7B\2\2\u0179\u017a\7?\2\2\u017aH\3\2\2\2\u017b\u017c\7@\2\2\u017c\u017d"+ "\7?\2\2\u0175@\3\2\2\2\u0176\u0177\7@\2\2\u0177\u0178\7@\2\2\u0178\u0179"+
"\7@\2\2\u017d\u017e\7B\2\2\u017e\u017f\7?\2\2\u017fJ\3\2\2\2\u0180\u0181"+ "\7?\2\2\u0179B\3\2\2\2\u017a\u017b\7>\2\2\u017b\u017c\7>\2\2\u017c\u017d"+
"\7(\2\2\u0181\u0182\7?\2\2\u0182L\3\2\2\2\u0183\u0184\7~\2\2\u0184\u0185"+ "\7B\2\2\u017d\u017e\7?\2\2\u017eD\3\2\2\2\u017f\u0180\7@\2\2\u0180\u0181"+
"\7?\2\2\u0185N\3\2\2\2\u0186\u0187\7`\2\2\u0187\u0188\7?\2\2\u0188P\3"+ "\7@\2\2\u0181\u0182\7B\2\2\u0182\u0183\7?\2\2\u0183F\3\2\2\2\u0184\u0185"+
"\2\2\2\u0189\u018a\7-\2\2\u018a\u018b\7-\2\2\u018bR\3\2\2\2\u018c\u018d"+ "\7(\2\2\u0185\u0186\7?\2\2\u0186H\3\2\2\2\u0187\u0188\7~\2\2\u0188\u0189"+
"\7/\2\2\u018d\u018e\7/\2\2\u018eT\3\2\2\2\u018f\u0190\7*\2\2\u0190V\3"+ "\7?\2\2\u0189J\3\2\2\2\u018a\u018b\7`\2\2\u018b\u018c\7?\2\2\u018cL\3"+
"\2\2\2\u0191\u0192\7+\2\2\u0192X\3\2\2\2\u0193\u0194\7-\2\2\u0194Z\3\2"+ "\2\2\2\u018d\u018e\7-\2\2\u018e\u018f\7-\2\2\u018fN\3\2\2\2\u0190\u0191"+
"\2\2\u0195\u0196\7/\2\2\u0196\\\3\2\2\2\u0197\u0198\7,\2\2\u0198\u0199"+ "\7/\2\2\u0191\u0192\7/\2\2\u0192P\3\2\2\2\u0193\u0194\7*\2\2\u0194R\3"+
"\7,\2\2\u0199^\3\2\2\2\u019a\u019b\7,\2\2\u019b`\3\2\2\2\u019c\u019d\7"+ "\2\2\2\u0195\u0196\7+\2\2\u0196T\3\2\2\2\u0197\u0198\7-\2\2\u0198V\3\2"+
"\61\2\2\u019db\3\2\2\2\u019e\u019f\7>\2\2\u019f\u01a0\7>\2\2\u01a0d\3"+ "\2\2\u0199\u019a\7/\2\2\u019aX\3\2\2\2\u019b\u019c\7,\2\2\u019c\u019d"+
"\2\2\2\u01a1\u01a2\7@\2\2\u01a2\u01a3\7@\2\2\u01a3f\3\2\2\2\u01a4\u01a5"+ "\7,\2\2\u019dZ\3\2\2\2\u019e\u019f\7,\2\2\u019f\\\3\2\2\2\u01a0\u01a1"+
"\7>\2\2\u01a5\u01a6\7>\2\2\u01a6\u01a7\7B\2\2\u01a7h\3\2\2\2\u01a8\u01a9"+ "\7\61\2\2\u01a1^\3\2\2\2\u01a2\u01a3\7>\2\2\u01a3\u01a4\7>\2\2\u01a4`"+
"\7@\2\2\u01a9\u01aa\7@\2\2\u01aa\u01ab\7B\2\2\u01abj\3\2\2\2\u01ac\u01ad"+ "\3\2\2\2\u01a5\u01a6\7@\2\2\u01a6\u01a7\7@\2\2\u01a7b\3\2\2\2\u01a8\u01a9"+
"\7>\2\2\u01adl\3\2\2\2\u01ae\u01af\7@\2\2\u01afn\3\2\2\2\u01b0\u01b1\7"+ "\7>\2\2\u01a9\u01aa\7>\2\2\u01aa\u01ab\7B\2\2\u01abd\3\2\2\2\u01ac\u01ad"+
">\2\2\u01b1\u01b2\7?\2\2\u01b2p\3\2\2\2\u01b3\u01b4\7@\2\2\u01b4\u01b5"+ "\7@\2\2\u01ad\u01ae\7@\2\2\u01ae\u01af\7B\2\2\u01aff\3\2\2\2\u01b0\u01b1"+
"\7?\2\2\u01b5r\3\2\2\2\u01b6\u01b7\7?\2\2\u01b7\u01b8\7?\2\2\u01b8t\3"+ "\7>\2\2\u01b1h\3\2\2\2\u01b2\u01b3\7@\2\2\u01b3j\3\2\2\2\u01b4\u01b5\7"+
"\2\2\2\u01b9\u01ba\7#\2\2\u01ba\u01bb\7?\2\2\u01bbv\3\2\2\2\u01bc\u01bd"+ ">\2\2\u01b5\u01b6\7?\2\2\u01b6l\3\2\2\2\u01b7\u01b8\7@\2\2\u01b8\u01b9"+
"\7(\2\2\u01bdx\3\2\2\2\u01be\u01bf\7`\2\2\u01bfz\3\2\2\2\u01c0\u01c1\7"+ "\7?\2\2\u01b9n\3\2\2\2\u01ba\u01bb\7?\2\2\u01bb\u01bc\7?\2\2\u01bcp\3"+
"~\2\2\u01c1|\3\2\2\2\u01c2\u01c3\7c\2\2\u01c3\u01c4\7p\2\2\u01c4\u01c5"+ "\2\2\2\u01bd\u01be\7#\2\2\u01be\u01bf\7?\2\2\u01bfr\3\2\2\2\u01c0\u01c1"+
"\7f\2\2\u01c5~\3\2\2\2\u01c6\u01c7\7q\2\2\u01c7\u01c8\7t\2\2\u01c8\u0080"+ "\7(\2\2\u01c1t\3\2\2\2\u01c2\u01c3\7`\2\2\u01c3v\3\2\2\2\u01c4\u01c5\7"+
"\3\2\2\2\u01c9\u01ca\7z\2\2\u01ca\u01cb\7q\2\2\u01cb\u01cc\7t\2\2\u01cc"+ "~\2\2\u01c5x\3\2\2\2\u01c6\u01c7\7c\2\2\u01c7\u01c8\7p\2\2\u01c8\u01c9"+
"\u0082\3\2\2\2\u01cd\u01ce\7p\2\2\u01ce\u01cf\7q\2\2\u01cf\u01d0\7v\2"+ "\7f\2\2\u01c9z\3\2\2\2\u01ca\u01cb\7q\2\2\u01cb\u01cc\7t\2\2\u01cc|\3"+
"\2\u01d0\u0084\3\2\2\2\u01d1\u01d2\7v\2\2\u01d2\u01d3\7q\2\2\u01d3\u0086"+ "\2\2\2\u01cd\u01ce\7z\2\2\u01ce\u01cf\7q\2\2\u01cf\u01d0\7t\2\2\u01d0"+
"\3\2\2\2\u01d4\u01d5\7t\2\2\u01d5\u01d6\7g\2\2\u01d6\u01d7\7v\2\2\u01d7"+ "~\3\2\2\2\u01d1\u01d2\7p\2\2\u01d2\u01d3\7q\2\2\u01d3\u01d4\7v\2\2\u01d4"+
"\u01d8\7w\2\2\u01d8\u01d9\7t\2\2\u01d9\u01da\7p\2\2\u01da\u0088\3\2\2"+ "\u0080\3\2\2\2\u01d5\u01d6\7v\2\2\u01d6\u01d7\7q\2\2\u01d7\u0082\3\2\2"+
"\2\u01db\u01dc\7\60\2\2\u01dc\u008a\3\2\2\2\u01dd\u01de\7C\2\2\u01de\u008c"+ "\2\u01d8\u01d9\7t\2\2\u01d9\u01da\7g\2\2\u01da\u01db\7v\2\2\u01db\u01dc"+
"\3\2\2\2\u01df\u01e0\7Z\2\2\u01e0\u008e\3\2\2\2\u01e1\u01e2\7[\2\2\u01e2"+ "\7w\2\2\u01dc\u01dd\7t\2\2\u01dd\u01de\7p\2\2\u01de\u0084\3\2\2\2\u01df"+
"\u0090\3\2\2\2\u01e3\u01e4\7C\2\2\u01e4\u01e5\7Z\2\2\u01e5\u0092\3\2\2"+ "\u01e0\7\60\2\2\u01e0\u0086\3\2\2\2\u01e1\u01e2\7C\2\2\u01e2\u0088\3\2"+
"\2\u01e6\u01e7\7C\2\2\u01e7\u01e8\7[\2\2\u01e8\u0094\3\2\2\2\u01e9\u01ea"+ "\2\2\u01e3\u01e4\7Z\2\2\u01e4\u008a\3\2\2\2\u01e5\u01e6\7[\2\2\u01e6\u008c"+
"\7Z\2\2\u01ea\u01eb\7[\2\2\u01eb\u0096\3\2\2\2\u01ec\u01ed\7U\2\2\u01ed"+ "\3\2\2\2\u01e7\u01e8\7C\2\2\u01e8\u01e9\7Z\2\2\u01e9\u008e\3\2\2\2\u01ea"+
"\u01ee\7E\2\2\u01ee\u0098\3\2\2\2\u01ef\u01f0\7U\2\2\u01f0\u01f1\7K\2"+ "\u01eb\7C\2\2\u01eb\u01ec\7[\2\2\u01ec\u0090\3\2\2\2\u01ed\u01ee\7Z\2"+
"\2\u01f1\u009a\3\2\2\2\u01f2\u01f3\7U\2\2\u01f3\u01f4\7\\\2\2\u01f4\u009c"+ "\2\u01ee\u01ef\7[\2\2\u01ef\u0092\3\2\2\2\u01f0\u01f1\7R\2\2\u01f1\u01f2"+
"\3\2\2\2\u01f5\u01f6\7v\2\2\u01f6\u01f7\7t\2\2\u01f7\u01f8\7w\2\2\u01f8"+ "\7e\2\2\u01f2\u0094\3\2\2\2\u01f3\u01f4\7R\2\2\u01f4\u01f5\7k\2\2\u01f5"+
"\u01f9\7g\2\2\u01f9\u009e\3\2\2\2\u01fa\u01fb\7h\2\2\u01fb\u01fc\7c\2"+ "\u0096\3\2\2\2\u01f6\u01f7\7R\2\2\u01f7\u01f8\7|\2\2\u01f8\u0098\3\2\2"+
"\2\u01fc\u01fd\7n\2\2\u01fd\u01fe\7u\2\2\u01fe\u01ff\7g\2\2\u01ff\u00a0"+ "\2\u01f9\u01fa\7R\2\2\u01fa\u01fb\7p\2\2\u01fb\u009a\3\2\2\2\u01fc\u01fd"+
"\3\2\2\2\u0200\u0201\7\'\2\2\u0201\u0202\7c\2\2\u0202\u0203\7u\2\2\u0203"+ "\7R\2\2\u01fd\u01fe\7x\2\2\u01fe\u009c\3\2\2\2\u01ff\u0200\7v\2\2\u0200"+
"\u0204\7o\2\2\u0204\u00a2\3\2\2\2\u0205\u0206\7u\2\2\u0206\u0207\7w\2"+ "\u0201\7t\2\2\u0201\u0202\7w\2\2\u0202\u0203\7g\2\2\u0203\u009e\3\2\2"+
"\2\u0207\u0208\7d\2\2\u0208\u00a4\3\2\2\2\u0209\u020a\7/\2\2\u020a\u020b"+ "\2\u0204\u0205\7h\2\2\u0205\u0206\7c\2\2\u0206\u0207\7n\2\2\u0207\u0208"+
"\7@\2\2\u020b\u00a6\3\2\2\2\u020c\u020d\7A\2\2\u020d\u00a8\3\2\2\2\u020e"+ "\7u\2\2\u0208\u0209\7g\2\2\u0209\u00a0\3\2\2\2\u020a\u020b\7\'\2\2\u020b"+
"\u0212\t\2\2\2\u020f\u0211\t\3\2\2\u0210\u020f\3\2\2\2\u0211\u0214\3\2"+ "\u020c\7c\2\2\u020c\u020d\7u\2\2\u020d\u020e\7o\2\2\u020e\u00a2\3\2\2"+
"\2\2\u0212\u0210\3\2\2\2\u0212\u0213\3\2\2\2\u0213\u0215\3\2\2\2\u0214"+ "\2\u020f\u0210\7u\2\2\u0210\u0211\7w\2\2\u0211\u0212\7d\2\2\u0212\u00a4"+
"\u0212\3\2\2\2\u0215\u0216\5\u00abV\2\u0216\u0217\3\2\2\2\u0217\u0218"+ "\3\2\2\2\u0213\u0214\7/\2\2\u0214\u0215\7@\2\2\u0215\u00a6\3\2\2\2\u0216"+
"\bU\2\2\u0218\u00aa\3\2\2\2\u0219\u021d\7=\2\2\u021a\u021c\n\2\2\2\u021b"+ "\u0217\7}\2\2\u0217\u00a8\3\2\2\2\u0218\u0219\7\177\2\2\u0219\u00aa\3"+
"\u021a\3\2\2\2\u021c\u021f\3\2\2\2\u021d\u021b\3\2\2\2\u021d\u021e\3\2"+ "\2\2\2\u021a\u021b\7A\2\2\u021b\u00ac\3\2\2\2\u021c\u021d\7k\2\2\u021d"+
"\2\2\u021e\u0220\3\2\2\2\u021f\u021d\3\2\2\2\u0220\u0221\bV\2\2\u0221"+ "\u021e\7h\2\2\u021e\u00ae\3\2\2\2\u021f\u0220\7g\2\2\u0220\u0221\7n\2"+
"\u00ac\3\2\2\2\u0222\u0223\t\3\2\2\u0223\u0224\3\2\2\2\u0224\u0225\bW"+ "\2\u0221\u0222\7u\2\2\u0222\u0223\7g\2\2\u0223\u00b0\3\2\2\2\u0224\u0228"+
"\3\2\u0225\u00ae\3\2\2\2\u0226\u0228\t\2\2\2\u0227\u0226\3\2\2\2\u0228"+ "\t\2\2\2\u0225\u0227\t\3\2\2\u0226\u0225\3\2\2\2\u0227\u022a\3\2\2\2\u0228"+
"\u0229\3\2\2\2\u0229\u0227\3\2\2\2\u0229\u022a\3\2\2\2\u022a\u00b0\3\2"+ "\u0226\3\2\2\2\u0228\u0229\3\2\2\2\u0229\u022b\3\2\2\2\u022a\u0228\3\2"+
"\2\2\u022b\u022f\t\4\2\2\u022c\u022e\t\5\2\2\u022d\u022c\3\2\2\2\u022e"+ "\2\2\u022b\u022c\5\u00b3Z\2\u022c\u022d\3\2\2\2\u022d\u022e\bY\2\2\u022e"+
"\u0231\3\2\2\2\u022f\u022d\3\2\2\2\u022f\u0230\3\2\2\2\u0230\u00b2\3\2"+ "\u00b2\3\2\2\2\u022f\u0233\7=\2\2\u0230\u0232\n\2\2\2\u0231\u0230\3\2"+
"\2\2\u0231\u022f\3\2\2\2\u0232\u023a\4\62;\2\u0233\u0235\4\63;\2\u0234"+ "\2\2\u0232\u0235\3\2\2\2\u0233\u0231\3\2\2\2\u0233\u0234\3\2\2\2\u0234"+
"\u0236\4\62;\2\u0235\u0234\3\2\2\2\u0236\u0237\3\2\2\2\u0237\u0235\3\2"+ "\u0236\3\2\2\2\u0235\u0233\3\2\2\2\u0236\u0237\bZ\2\2\u0237\u00b4\3\2"+
"\2\2\u0237\u0238\3\2\2\2\u0238\u023a\3\2\2\2\u0239\u0232\3\2\2\2\u0239"+ "\2\2\u0238\u0239\t\3\2\2\u0239\u023a\3\2\2\2\u023a\u023b\b[\3\2\u023b"+
"\u0233\3\2\2\2\u023a\u00b4\3\2\2\2\u023b\u023d\7&\2\2\u023c\u023e\t\6"+ "\u00b6\3\2\2\2\u023c\u023e\t\2\2\2\u023d\u023c\3\2\2\2\u023e\u023f\3\2"+
"\2\2\u023d\u023c\3\2\2\2\u023e\u023f\3\2\2\2\u023f\u023d\3\2\2\2\u023f"+ "\2\2\u023f\u023d\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u00b8\3\2\2\2\u0241"+
"\u0240\3\2\2\2\u0240\u00b6\3\2\2\2\u0241\u0243\7\'\2\2\u0242\u0244\4\62"+ "\u0245\t\4\2\2\u0242\u0244\t\5\2\2\u0243\u0242\3\2\2\2\u0244\u0247\3\2"+
"\63\2\u0243\u0242\3\2\2\2\u0244\u0245\3\2\2\2\u0245\u0243\3\2\2\2\u0245"+ "\2\2\u0245\u0243\3\2\2\2\u0245\u0246\3\2\2\2\u0246\u00ba\3\2\2\2\u0247"+
"\u0246\3\2\2\2\u0246\u00b8\3\2\2\2\u0247\u024d\5\u00bb^\2\u0248\u024a"+ "\u0245\3\2\2\2\u0248\u0250\4\62;\2\u0249\u024b\4\63;\2\u024a\u024c\4\62"+
"\t\7\2\2\u0249\u024b\t\b\2\2\u024a\u0249\3\2\2\2\u024a\u024b\3\2\2\2\u024b"+ ";\2\u024b\u024a\3\2\2\2\u024c\u024d\3\2\2\2\u024d\u024b\3\2\2\2\u024d"+
"\u024c\3\2\2\2\u024c\u024e\5\u00bb^\2\u024d\u0248\3\2\2\2\u024d\u024e"+ "\u024e\3\2\2\2\u024e\u0250\3\2\2\2\u024f\u0248\3\2\2\2\u024f\u0249\3\2"+
"\3\2\2\2\u024e\u00ba\3\2\2\2\u024f\u0251\4\62;\2\u0250\u024f\3\2\2\2\u0251"+ "\2\2\u0250\u00bc\3\2\2\2\u0251\u0253\7&\2\2\u0252\u0254\t\6\2\2\u0253"+
"\u0252\3\2\2\2\u0252\u0250\3\2\2\2\u0252\u0253\3\2\2\2\u0253\u025a\3\2"+ "\u0252\3\2\2\2\u0254\u0255\3\2\2\2\u0255\u0253\3\2\2\2\u0255\u0256\3\2"+
"\2\2\u0254\u0256\7\60\2\2\u0255\u0257\4\62;\2\u0256\u0255\3\2\2\2\u0257"+ "\2\2\u0256\u00be\3\2\2\2\u0257\u0259\7\'\2\2\u0258\u025a\4\62\63\2\u0259"+
"\u0258\3\2\2\2\u0258\u0256\3\2\2\2\u0258\u0259\3\2\2\2\u0259\u025b\3\2"+ "\u0258\3\2\2\2\u025a\u025b\3\2\2\2\u025b\u0259\3\2\2\2\u025b\u025c\3\2"+
"\2\2\u025a\u0254\3\2\2\2\u025a\u025b\3\2\2\2\u025b\u00bc\3\2\2\2\u025c"+ "\2\2\u025c\u00c0\3\2\2\2\u025d\u0263\5\u00c3b\2\u025e\u0260\t\7\2\2\u025f"+
"\u025d\7^\2\2\u025d\u0261\13\2\2\2\u025e\u025f\7^\2\2\u025f\u0261\5\u00af"+ "\u0261\t\b\2\2\u0260\u025f\3\2\2\2\u0260\u0261\3\2\2\2\u0261\u0262\3\2"+
"X\2\u0260\u025c\3\2\2\2\u0260\u025e\3\2\2\2\u0261\u00be\3\2\2\2\u0262"+ "\2\2\u0262\u0264\5\u00c3b\2\u0263\u025e\3\2\2\2\u0263\u0264\3\2\2\2\u0264"+
"\u0267\7$\2\2\u0263\u0266\5\u00bd_\2\u0264\u0266\n\t\2\2\u0265\u0263\3"+ "\u00c2\3\2\2\2\u0265\u0267\4\62;\2\u0266\u0265\3\2\2\2\u0267\u0268\3\2"+
"\2\2\2\u0265\u0264\3\2\2\2\u0266\u0269\3\2\2\2\u0267\u0265\3\2\2\2\u0267"+ "\2\2\u0268\u0266\3\2\2\2\u0268\u0269\3\2\2\2\u0269\u0270\3\2\2\2\u026a"+
"\u0268\3\2\2\2\u0268\u026a\3\2\2\2\u0269\u0267\3\2\2\2\u026a\u026b\7$"+ "\u026c\7\60\2\2\u026b\u026d\4\62;\2\u026c\u026b\3\2\2\2\u026d\u026e\3"+
"\2\2\u026b\u026c\b`\4\2\u026c\u00c0\3\2\2\2\u026d\u026e\7}\2\2\u026e\u026f"+ "\2\2\2\u026e\u026c\3\2\2\2\u026e\u026f\3\2\2\2\u026f\u0271\3\2\2\2\u0270"+
"\7}\2\2\u026f\u0271\3\2\2\2\u0270\u0272\13\2\2\2\u0271\u0270\3\2\2\2\u0272"+ "\u026a\3\2\2\2\u0270\u0271\3\2\2\2\u0271\u00c4\3\2\2\2\u0272\u0273\7^"+
"\u0273\3\2\2\2\u0273\u0274\3\2\2\2\u0273\u0271\3\2\2\2\u0274\u0275\3\2"+ "\2\2\u0273\u0277\13\2\2\2\u0274\u0275\7^\2\2\u0275\u0277\5\u00b7\\\2\u0276"+
"\2\2\u0275\u0276\7\177\2\2\u0276\u0277\7\177\2\2\u0277\u0278\3\2\2\2\u0278"+ "\u0272\3\2\2\2\u0276\u0274\3\2\2\2\u0277\u00c6\3\2\2\2\u0278\u027d\7$"+
"\u0279\ba\5\2\u0279\u00c2\3\2\2\2\25\2\u0212\u021d\u0229\u022f\u0237\u0239"+ "\2\2\u0279\u027c\5\u00c5c\2\u027a\u027c\n\t\2\2\u027b\u0279\3\2\2\2\u027b"+
"\u023d\u023f\u0245\u024a\u024d\u0252\u0258\u025a\u0260\u0265\u0267\u0273"+ "\u027a\3\2\2\2\u027c\u027f\3\2\2\2\u027d\u027b\3\2\2\2\u027d\u027e\3\2"+
"\6\2\3\2\b\2\2\3`\2\3a\3"; "\2\2\u027e\u0280\3\2\2\2\u027f\u027d\3\2\2\2\u0280\u0281\7$\2\2\u0281"+
"\u0282\bd\4\2\u0282\u00c8\3\2\2\2\u0283\u0284\7}\2\2\u0284\u0285\7}\2"+
"\2\u0285\u0287\3\2\2\2\u0286\u0288\13\2\2\2\u0287\u0286\3\2\2\2\u0288"+
"\u0289\3\2\2\2\u0289\u028a\3\2\2\2\u0289\u0287\3\2\2\2\u028a\u028b\3\2"+
"\2\2\u028b\u028c\7\177\2\2\u028c\u028d\7\177\2\2\u028d\u028e\3\2\2\2\u028e"+
"\u028f\be\5\2\u028f\u00ca\3\2\2\2\25\2\u0228\u0233\u023f\u0245\u024d\u024f"+
"\u0253\u0255\u025b\u0260\u0263\u0268\u026e\u0270\u0276\u027b\u027d\u0289"+
"\6\2\3\2\b\2\2\3d\2\3e\3";
public static final ATN _ATN = public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray()); new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static { static {

View File

@ -81,97 +81,105 @@ T__79=80
T__80=81 T__80=81
T__81=82 T__81=82
T__82=83 T__82=83
LINECOMMENT=84 T__83=84
COMMENT=85 T__84=85
WS=86 T__85=86
EOL=87 T__86=87
NAME=88 LINECOMMENT=88
DEC_INTEGER=89 COMMENT=89
HEX_INTEGER=90 WS=90
BIN_INTEGER=91 EOL=91
FLOAT_NUMBER=92 NAME=92
STRING=93 DEC_INTEGER=93
INLINEASMBLOCK=94 HEX_INTEGER=94
BIN_INTEGER=95
FLOAT_NUMBER=96
STRING=97
INLINEASMBLOCK=98
'~'=1 '~'=1
'{'=2 ':'=2
'}'=3 'goto'=3
':'=4 '%output'=4
'goto'=5 '%launcher'=5
'%output'=6 '%zp'=6
'%launcher'=7 '%address'=7
'%zp'=8 '%import'=8
'%address'=9 '%breakpoint'=9
'%import'=10 '%asminclude'=10
'%breakpoint'=11 '%asmbinary'=11
'%asminclude'=12 '%option'=12
'%asmbinary'=13 ','=13
'%option'=14 '='=14
','=15 'const'=15
'='=16 'memory'=16
'const'=17 'byte'=17
'memory'=18 'word'=18
'byte'=19 'float'=19
'word'=20 'str'=20
'float'=21 'str_p'=21
'str'=22 'str_s'=22
'str_p'=23 'str_ps'=23
'str_s'=24 '['=24
'str_ps'=25 ']'=25
'['=26 '+='=26
']'=27 '-='=27
'+='=28 '/='=28
'-='=29 '*='=29
'/='=30 '**='=30
'*='=31 '<<='=31
'**='=32 '>>='=32
'<<='=33 '<<@='=33
'>>='=34 '>>@='=34
'<<@='=35 '&='=35
'>>@='=36 '|='=36
'&='=37 '^='=37
'|='=38 '++'=38
'^='=39 '--'=39
'++'=40 '('=40
'--'=41 ')'=41
'('=42 '+'=42
')'=43 '-'=43
'+'=44 '**'=44
'-'=45 '*'=45
'**'=46 '/'=46
'*'=47 '<<'=47
'/'=48 '>>'=48
'<<'=49 '<<@'=49
'>>'=50 '>>@'=50
'<<@'=51 '<'=51
'>>@'=52 '>'=52
'<'=53 '<='=53
'>'=54 '>='=54
'<='=55 '=='=55
'>='=56 '!='=56
'=='=57 '&'=57
'!='=58 '^'=58
'&'=59 '|'=59
'^'=60 'and'=60
'|'=61 'or'=61
'and'=62 'xor'=62
'or'=63 'not'=63
'xor'=64 'to'=64
'not'=65 'return'=65
'to'=66 '.'=66
'return'=67 'A'=67
'.'=68 'X'=68
'A'=69 'Y'=69
'X'=70 'AX'=70
'Y'=71 'AY'=71
'AX'=72 'XY'=72
'AY'=73 'Pc'=73
'XY'=74 'Pi'=74
'SC'=75 'Pz'=75
'SI'=76 'Pn'=76
'SZ'=77 'Pv'=77
'true'=78 'true'=78
'false'=79 'false'=79
'%asm'=80 '%asm'=80
'sub'=81 'sub'=81
'->'=82 '->'=82
'?'=83 '{'=83
'}'=84
'?'=85
'if'=86
'else'=87

File diff suppressed because it is too large Load Diff

View File

@ -197,12 +197,12 @@ sub CINT () -> (?) = $FF81 ; (alias: SCINIT) initialize screen editor and
sub IOINIT () -> (A?, X?) = $FF84 ; initialize I/O devices (CIA, SID, IRQ) sub IOINIT () -> (A?, X?) = $FF84 ; initialize I/O devices (CIA, SID, IRQ)
sub RAMTAS () -> (?) = $FF87 ; initialize RAM, tape buffer, screen sub RAMTAS () -> (?) = $FF87 ; initialize RAM, tape buffer, screen
sub RESTOR () -> (?) = $FF8A ; restore default I/O vectors sub RESTOR () -> (?) = $FF8A ; restore default I/O vectors
sub VECTOR (dir: SC, userptr: XY) -> (A?, Y?) = $FF8D ; read/set I/O vector table sub VECTOR (dir: Pc, userptr: XY) -> (A?, Y?) = $FF8D ; read/set I/O vector table
sub SETMSG (value: A) -> () = $FF90 ; set Kernal message control flag sub SETMSG (value: A) -> () = $FF90 ; set Kernal message control flag
sub SECOND (address: A) -> (A?) = $FF93 ; (alias: LSTNSA) send secondary address after LISTEN sub SECOND (address: A) -> (A?) = $FF93 ; (alias: LSTNSA) send secondary address after LISTEN
sub TKSA (address: A) -> (A?) = $FF96 ; (alias: TALKSA) send secondary address after TALK sub TKSA (address: A) -> (A?) = $FF96 ; (alias: TALKSA) send secondary address after TALK
sub MEMTOP (dir: SC, address: XY) -> (XY) = $FF99 ; read/set top of memory pointer sub MEMTOP (dir: Pc, address: XY) -> (XY) = $FF99 ; read/set top of memory pointer
sub MEMBOT (dir: SC, address: XY) -> (XY) = $FF9C ; read/set bottom of memory pointer sub MEMBOT (dir: Pc, address: XY) -> (XY) = $FF9C ; read/set bottom of memory pointer
sub SCNKEY () -> (?) = $FF9F ; scan the keyboard sub SCNKEY () -> (?) = $FF9F ; scan the keyboard
sub SETTMO (timeout: A) -> () = $FFA2 ; set time-out flag for IEEE bus sub SETTMO (timeout: A) -> () = $FFA2 ; set time-out flag for IEEE bus
sub ACPTR () -> (A) = $FFA5 ; (alias: IECIN) input byte from serial bus sub ACPTR () -> (A) = $FFA5 ; (alias: IECIN) input byte from serial bus
@ -221,16 +221,16 @@ sub CHKOUT (logical: X) -> (A?, X?) = $FFC9 ; (via 800 ($320)) define an outp
sub CLRCHN () -> (A?, X?) = $FFCC ; (via 802 ($322)) restore default devices sub CLRCHN () -> (A?, X?) = $FFCC ; (via 802 ($322)) restore default devices
sub CHRIN () -> (A, Y?) = $FFCF ; (via 804 ($324)) input a character (for keyboard, read a whole line from the screen) A=byte read. sub CHRIN () -> (A, Y?) = $FFCF ; (via 804 ($324)) input a character (for keyboard, read a whole line from the screen) A=byte read.
sub CHROUT (char: A) -> () = $FFD2 ; (via 806 ($326)) output a character sub CHROUT (char: A) -> () = $FFD2 ; (via 806 ($326)) output a character
sub LOAD (verify: A, address: XY) -> (SC, A, X, Y) = $FFD5 ; (via 816 ($330)) load from device sub LOAD (verify: A, address: XY) -> (Pc, A, X, Y) = $FFD5 ; (via 816 ($330)) load from device
sub SAVE (zp_startaddr: A, endaddr: XY) -> (SC, A) = $FFD8 ; (via 818 ($332)) save to a device sub SAVE (zp_startaddr: A, endaddr: XY) -> (Pc, A) = $FFD8 ; (via 818 ($332)) save to a device
sub SETTIM (low: A, middle: X, high: Y) -> () = $FFDB ; set the software clock sub SETTIM (low: A, middle: X, high: Y) -> () = $FFDB ; set the software clock
sub RDTIM () -> (A, X, Y) = $FFDE ; read the software clock sub RDTIM () -> (A, X, Y) = $FFDE ; read the software clock
sub STOP () -> (SZ, SC, A?, X?) = $FFE1 ; (via 808 ($328)) check the STOP key sub STOP () -> (Pz, Pc, A?, X?) = $FFE1 ; (via 808 ($328)) check the STOP key
sub GETIN () -> (A, X?, Y?) = $FFE4 ; (via 810 ($32A)) get a character sub GETIN () -> (A, X?, Y?) = $FFE4 ; (via 810 ($32A)) get a character
sub CLALL () -> (A?, X?) = $FFE7 ; (via 812 ($32C)) close all files sub CLALL () -> (A?, X?) = $FFE7 ; (via 812 ($32C)) close all files
sub UDTIM () -> (A?, X?) = $FFEA ; update the software clock sub UDTIM () -> (A?, X?) = $FFEA ; update the software clock
sub SCREEN () -> (X, Y) = $FFED ; read number of screen rows and columns sub SCREEN () -> (X, Y) = $FFED ; read number of screen rows and columns
sub PLOT (dir: SC, col: Y, row: X) -> (X, Y) = $FFF0 ; read/set position of cursor on screen sub PLOT (dir: Pc, col: Y, row: X) -> (X, Y) = $FFF0 ; read/set position of cursor on screen
sub IOBASE () -> (X, Y) = $FFF3 ; read base address of I/O devices sub IOBASE () -> (X, Y) = $FFF3 ; read base address of I/O devices
; ---- end of C64 kernal routines ---- ; ---- end of C64 kernal routines ----
@ -489,7 +489,7 @@ _loop lda #0
} }
sub scroll_left_full (alsocolors: SC) -> (A?, X?, Y?) { sub scroll_left_full (alsocolors: Pc) -> (A?, X?, Y?) {
; ---- scroll the whole screen 1 character to the left ; ---- scroll the whole screen 1 character to the left
; contents of the rightmost column are unchanged, you should clear/refill this yourself ; contents of the rightmost column are unchanged, you should clear/refill this yourself
; Carry flag determines if screen color data must be scrolled too ; Carry flag determines if screen color data must be scrolled too
@ -548,7 +548,7 @@ _scroll_screen ; scroll the screen memory
} }
sub scroll_right_full (alsocolors: SC) -> (A?, X?) { sub scroll_right_full (alsocolors: Pc) -> (A?, X?) {
; ---- scroll the whole screen 1 character to the right ; ---- scroll the whole screen 1 character to the right
; contents of the leftmost column are unchanged, you should clear/refill this yourself ; contents of the leftmost column are unchanged, you should clear/refill this yourself
; Carry flag determines if screen color data must be scrolled too ; Carry flag determines if screen color data must be scrolled too
@ -599,7 +599,7 @@ _scroll_screen ; scroll the screen memory
} }
sub scroll_up_full (alsocolors: SC) -> (A?, X?) { sub scroll_up_full (alsocolors: Pc) -> (A?, X?) {
; ---- scroll the whole screen 1 character up ; ---- scroll the whole screen 1 character up
; contents of the bottom row are unchanged, you should refill/clear this yourself ; contents of the bottom row are unchanged, you should refill/clear this yourself
; Carry flag determines if screen color data must be scrolled too ; Carry flag determines if screen color data must be scrolled too
@ -650,7 +650,7 @@ _scroll_screen ; scroll the screen memory
} }
sub scroll_down_full (alsocolors: SC) -> (A?, X?) { sub scroll_down_full (alsocolors: Pc) -> (A?, X?) {
; ---- scroll the whole screen 1 character down ; ---- scroll the whole screen 1 character down
; contents of the top row are unchanged, you should refill/clear this yourself ; contents of the top row are unchanged, you should refill/clear this yourself
; Carry flag determines if screen color data must be scrolled too ; Carry flag determines if screen color data must be scrolled too
@ -934,7 +934,7 @@ _print_tens txa
} }
sub print_byte_hex (prefix: SC, ubyte: A) -> (?) { sub print_byte_hex (prefix: Pc, ubyte: A) -> (?) {
; ---- print the byte in A in hex form (if Carry is set, a radix prefix '$' is printed as well) ; ---- print the byte in A in hex form (if Carry is set, a radix prefix '$' is printed as well)
%asm {{ %asm {{
bcc + bcc +
@ -951,7 +951,7 @@ sub print_byte_hex (prefix: SC, ubyte: A) -> (?) {
} }
sub print_word_hex (prefix: SC, dataword: XY) -> (?) { sub print_word_hex (prefix: Pc, dataword: XY) -> (?) {
; ---- print the (unsigned) word in X/Y in hexadecimal form (4 digits) ; ---- print the (unsigned) word in X/Y in hexadecimal form (4 digits)
; (if Carry is set, a radix prefix '$' is printed as well) ; (if Carry is set, a radix prefix '$' is printed as well)
%asm {{ %asm {{