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