diff --git a/include/aeb_fate_opcodes.hrl b/include/aeb_fate_opcodes.hrl index b2c5da0..fbe0b27 100644 --- a/include/aeb_fate_opcodes.hrl +++ b/include/aeb_fate_opcodes.hrl @@ -111,6 +111,7 @@ -define('BITS_ALLA' , 16#70). -define('INCA' , 16#71). -define('DECA' , 16#72). +-define('POPA' , 16#73). -define('FUNCTION' , 16#fe). -define('EXTEND' , 16#ff). diff --git a/src/aeb_fate_asm.erl b/src/aeb_fate_asm.erl index da2b02d..40d235a 100644 --- a/src/aeb_fate_asm.erl +++ b/src/aeb_fate_asm.erl @@ -83,7 +83,7 @@ to_args(Tokens) -> {Arg, [{')', _} | Rest]} -> {[Arg], Rest} end. - + to_data([{int,_line, Int}|Rest]) -> {Int, Rest}; to_data([{boolean,_line, Bool}|Rest]) -> diff --git a/src/aeb_fate_asm_scan.xrl b/src/aeb_fate_asm_scan.xrl index 889ac2d..fce9f27 100644 --- a/src/aeb_fate_asm_scan.xrl +++ b/src/aeb_fate_asm_scan.xrl @@ -31,7 +31,6 @@ false : {token, {boolean, TokenLine, false}}. RETURN : {token, {mnemonic, TokenLine, 'RETURN'}}. RETURNR : {token, {mnemonic, TokenLine, 'RETURNR'}}. CALL : {token, {mnemonic, TokenLine, 'CALL'}}. -FUNCTION : {token, {function, TokenLine, 'FUNCTION' }}. NOP : {token, {mnemonic, TokenLine, 'NOP'}}. CALL_R : {token, {mnemonic, TokenLine, 'CALL_R'}}. @@ -46,6 +45,7 @@ SWITCH_V5 : {token, {mnemonic, TokenLine, 'SWITCH_V5'}}. PUSH : {token, {mnemonic, TokenLine, 'PUSH'}}. DUP : {token, {mnemonic, TokenLine, 'DUP'}}. +DUPA : {token, {mnemonic, TokenLine, 'DUPA'}}. POP : {token, {mnemonic, TokenLine, 'POP'}}. STORE : {token, {mnemonic, TokenLine, 'STORE'}}. @@ -138,6 +138,9 @@ ABORT : {token, {mnemonic, TokenLine, 'ABORT'}}. EXIT : {token, {mnemonic, TokenLine, 'EXIT'}}. DEACTIVATE : {token, {mnemonic, TokenLine, 'DEACTIVATE'}}. COMMENT : {token, {mnemonic, TokenLine, 'COMMENT'}}. + +FUNCTION : {token, {function, TokenLine, 'FUNCTION' }}. + {ID} : {token, {id, TokenLine, TokenChars}}. {HEX} : diff --git a/src/aeb_fate_code.erl b/src/aeb_fate_code.erl index 75e28b0..e6ad225 100644 --- a/src/aeb_fate_code.erl +++ b/src/aeb_fate_code.erl @@ -219,7 +219,10 @@ bits_diff(To, Bits, Bit) -> {'BITS_DIFF', To, Bits, Bit}. dup() -> - 'DUP'. + 'DUPA'. + +dup(N) when is_integer(N) -> + {'DUP', ?i(N)}. pop() -> 'POP'. diff --git a/src/aeb_fate_opcodes.erl b/src/aeb_fate_opcodes.erl index 584616e..9240793 100644 --- a/src/aeb_fate_opcodes.erl +++ b/src/aeb_fate_opcodes.erl @@ -34,6 +34,7 @@ mnemonic(?JUMP) -> 'JUMP' ; mnemonic(?JUMPIF) -> 'JUMPIF' ; mnemonic(?PUSH) -> 'PUSH' ; mnemonic(?DUP) -> 'DUP' ; +mnemonic(?DUPA) -> 'DUPA' ; mnemonic(?POP) -> 'POP' ; mnemonic(?STORE) -> 'STORE' ; mnemonic(?ADD) -> 'ADD' ; @@ -148,6 +149,7 @@ m_to_op('JUMP') -> ?JUMP ; m_to_op('JUMPIF') -> ?JUMPIF ; m_to_op('PUSH') -> ?PUSH ; m_to_op('DUP') -> ?DUP ; +m_to_op('DUPA') -> ?DUPA ; m_to_op('POP') -> ?POP ; m_to_op('STORE') -> ?STORE ; m_to_op('ADD') -> ?ADD ; @@ -256,6 +258,7 @@ args(?NOP) -> 0; args(?RETURN) -> 0; args(?INCA) -> 0; args(?DECA) -> 0; +args(?DUPA) -> 0; args(?BITS_NONEA) -> 0; args(?BITS_ALLA) -> 0;