diff --git a/sln/x65.vcxproj b/sln/x65.vcxproj
index 6825dba..7cced22 100644
--- a/sln/x65.vcxproj
+++ b/sln/x65.vcxproj
@@ -23,7 +23,7 @@
{2823019A-A423-4A40-BB9C-5CE242019BD0}
Win32Proj
x65
- 10.0.16299.0
+ 10.0.15063.0
diff --git a/test/AddrMode_65816.s b/test/AddrMode_65816.s
index cd97db3..78f6406 100644
--- a/test/AddrMode_65816.s
+++ b/test/AddrMode_65816.s
@@ -1,14 +1,17 @@
cpu 65816
Test65816_ForceAddrMode:
+ sep #$30
i8
- ldx #0
-i16
- ldx #0
+ ldx #$1234
a8
- lda #0
+ lda #$1234
+ lda.w #$1234
+
+i16
+ ldx #$1234
a16
- lda #0
- lda.b #0
+ lda #$1234
+ lda.b #$1234
{
jmp >$123456
diff --git a/test/compare/x65scope.prg b/test/compare/x65scope.prg
new file mode 100644
index 0000000..6d2dedf
Binary files /dev/null and b/test/compare/x65scope.prg differ
diff --git a/test/compare/x65scope.sym b/test/compare/x65scope.sym
new file mode 100644
index 0000000..f9d7321
--- /dev/null
+++ b/test/compare/x65scope.sym
@@ -0,0 +1,6 @@
+
+.label ClearVICPage = $1000
+.label LenStr = $1012
+.label GetSkip = $1019 {
+.label .addr = $1026
+}
diff --git a/test/unittest.bat b/test/unittest.bat
index 7ef9d4d..16ca409 100644
--- a/test/unittest.bat
+++ b/test/unittest.bat
@@ -73,6 +73,18 @@ echo x65macro.i test failed
goto exit
:x65macro_test_pass
+echo x65 Scope Test >>results\unittest.txt
+..\bin\x64\x65 x65scope.s results\x65scope.prg -lst -sym results\x65scope.sym
+if %errorlevel% GTR 0 goto x65scope_test_fail
+fc /B compare\x65scope.prg results\x65scope.prg >>results\unittest.txt
+if %errorlevel% GTR 0 goto x65scope_test_fail
+fc compare\x65scope.sym results\x65scope.sym >>results\unittest.txt
+if %errorlevel% EQU 0 goto x65scope_test_pass
+:x65scope_test_fail
+echo x65 Scope Test failed
+goto exit
+:x65scope_test_pass
+
echo Merlin LUP Test >>results\unittest.txt
echo --------------- >>results\unittest.txt
..\bin\x64\x65 merlin_lup.s results\merlin_lup.bin -bin -org=$1000 -merlin -lst >>results\unittest.txt
diff --git a/test/x65scope.s b/test/x65scope.s
new file mode 100644
index 0000000..e6465f4
--- /dev/null
+++ b/test/x65scope.s
@@ -0,0 +1,38 @@
+// Test various features of scoping.
+
+ClearVICPage:
+{
+ lda #0
+ tax
+ ldy #$40
+ {
+ sta $4000,x
+ inx
+ bne !
+ inc !+2
+ dey
+ bne !
+ }
+ rts
+}
+
+LenStr:
+{
+ dc.b %-! ; length of string plus this byte
+ TEXT "String"
+}
+
+GetSkip:
+{
+ clc
+ tya
+ adc .addr+1
+ sta .addr+1
+ {
+ bcc %
+ inc .addr+1
+ }
+.addr
+ lda $1234
+ rts
+}
diff --git a/x65.cpp b/x65.cpp
index bc7c2ca..824444c 100644
--- a/x65.cpp
+++ b/x65.cpp
@@ -5604,16 +5604,14 @@ StatusCode Asm::AddOpcode(strref line, int index, strref source_file) {
break;
case AMB_IMM: // 2 #$12
- if (op_param && (validModes&(AMM_IMM_DBL_A | AMM_IMM_DBL_XY)))
- codeArg = op_param == 2 ? CA_TWO_BYTES : CA_ONE_BYTE;
- else if ((validModes&(AMM_IMM_DBL_A | AMM_IMM_DBL_XY)) &&
- expression[0]=='$' && (expression+1).len_hex()==4)
- codeArg = CA_TWO_BYTES;
- else if (((validModes&AMM_IMM_DBL_A) && accumulator_16bit) ||
- ((validModes&AMM_IMM_DBL_XY) && index_reg_16bit))
- codeArg = CA_TWO_BYTES;
- else
- codeArg = CA_ONE_BYTE;
+ codeArg = CA_ONE_BYTE;
+ // check for double immediate
+ if( validModes & ( AMM_IMM_DBL_A | AMM_IMM_DBL_XY ) ) {
+ if( op_param ) { codeArg = op_param == 2 ? CA_TWO_BYTES : CA_ONE_BYTE; }
+ else if( ( ( validModes&AMM_IMM_DBL_A ) && accumulator_16bit ) ||
+ ( ( validModes&AMM_IMM_DBL_XY ) && index_reg_16bit ) ) { codeArg = CA_TWO_BYTES; }
+ else { codeArg = CA_ONE_BYTE; }
+ }
break;
case AMB_ACC: // 9 A